Library prosa.implementation.definitions.task

From HB Require Import structures.
Require Export prosa.implementation.definitions.arrival_bound.
Require Export prosa.model.task.arrival.curves.
Require Export prosa.model.priority.numeric_fixed_priority.

Implementation of Tasks and Jobs

This file provides reference implementations of the notions of "tasks" and "jobs" that can be used to meet the hypotheses on which many of the analyses in Prosa are based.
Note that their use is entirely optional: clients of Prosa may choose to use these types or implement their own notions of "tasks" and "jobs".

Implementation of a Concrete Task

A task comprises of an ID, a cost, an arrival bound, a deadline and a priority. The ID is required to ensure uniqueness.
To make it compatible with ssreflect, we define a decidable equality for concrete tasks.
Next, we prove that task_eqdef is indeed an equality, ...
..., which allows instantiating the canonical structure for concrete_task : eqType.

Implementation of a Concrete Job

A job comprises of an id, an arrival time, a cost, a deadline and the task it belongs to.
For convenience, we define a function that converts each possible arrival bound (periodic, sporadic, and arrival-curve prefix) into an arrival-curve prefix...
Definition get_arrival_curve_prefix tsk :=
  match concrete_task_arrival tsk with
  | Periodic pinter_arrival_to_prefix p
  | Sporadic minter_arrival_to_prefix m
  | ArrivalPrefix stepssteps
  end.

... and define the "arrival bound" concept for concrete tasks.
To make it compatible with ssreflect, we define a decidable equality for concrete jobs.
Next, we prove that job_eqdef is indeed an equality, ...
... which allows instantiating the canonical structure for concrete_job : eqType.

Instances for Concrete Jobs and Tasks.

In the following, we connect the concrete task and job types defined above to the generic Prosa interfaces for task and job parameters.
Section Parameters.

First, we connect the above definition of tasks with the generic Prosa task-parameter interfaces.
  Let Task := concrete_task : eqType.
  #[global,program] Instance concrete_task_cost_instance : TaskCost Task :=
  {
    task_cost := concrete_task_cost
  }.
  #[global,program] Instance concrete_task_priority_instance : TaskPriority Task :=
  {
    task_priority := concrete_task_priority
  }.
  #[global,program] Instance concrete_task_deadline_instance : TaskDeadline Task :=
  {
    task_deadline := concrete_task_deadline
  }.
  #[global,program] Instance concrete_max_arrivals_instance : MaxArrivals Task :=
  {
    max_arrivals := concrete_max_arrivals
  }.

Second, we do the same for the above definition of job.
  Let Job := concrete_job : eqType.
  #[global,program] Instance concrete_job_task_instance : JobTask Job Task :=
  {
    job_task := concrete_job_task
  }.
  #[global,program] Instance concrete_job_arrival_instance : JobArrival Job :=
  {
    job_arrival := concrete_job_arrival
  }.
  #[global,program] Instance concrete_job_cost_instance : JobCost Job :=
  {
    job_cost := concrete_job_cost
  }.

End Parameters.