diff --git a/restructuring/analysis/basic_facts/task_arrivals.v b/restructuring/analysis/basic_facts/task_arrivals.v new file mode 100644 index 0000000000000000000000000000000000000000..ac264c7d6a39db10c90cf916529a3ba3748abbfa --- /dev/null +++ b/restructuring/analysis/basic_facts/task_arrivals.v @@ -0,0 +1,30 @@ +From rt.restructuring.model Require Export arrival.task_arrivals. + +(* In this file we provide basic properties related to tasks on arrival sequences. *) +Section TaskArrivals. + + (* Consider any type of job associated with any type of tasks. *) + Context {Job : JobType}. + Context {Task : TaskType}. + Context `{JobTask Job Task}. + + (* Consider any job arrival sequence. *) + Variable arr_seq : arrival_sequence Job. + + (* Let tsk be any task. *) + Variable tsk : Task. + + (* We show that the number of arrivals of task can be split into disjoint intervals. *) + Lemma num_arrivals_of_task_cat: + forall t t1 t2, + t1 <= t <= t2 -> + number_of_task_arrivals arr_seq tsk t1 t2 = + number_of_task_arrivals arr_seq tsk t1 t + number_of_task_arrivals arr_seq tsk t t2. + Proof. + move => t t1 t2 /andP [GE LE]. + rewrite /number_of_task_arrivals /task_arrivals_between /arrivals_between. + rewrite (@big_cat_nat _ _ _ t) //=. + by rewrite filter_cat size_cat. + Qed. + +End TaskArrivals. \ No newline at end of file diff --git a/restructuring/model/schedule/task_schedule.v b/restructuring/analysis/task_schedule.v similarity index 96% rename from restructuring/model/schedule/task_schedule.v rename to restructuring/analysis/task_schedule.v index 0a5ef66ec6862d1cdcce23b7fee0bc1e3a4dbe8f..8bc83c0f00f96e58d8d09171c0874a0248fdcf2a 100644 --- a/restructuring/model/schedule/task_schedule.v +++ b/restructuring/analysis/task_schedule.v @@ -37,7 +37,7 @@ Section ScheduleOfTask. else false. (* ...which also corresponds to the instantaneous service it receives. *) - Definition task_service_at (t: instant) := task_scheduled_at t. + Definition task_service_at (t : instant) := task_scheduled_at t. (* Based on the notion of instantaneous service, we define the cumulative service received by tsk during any interval [t1, t2)... *) diff --git a/restructuring/model/arrival/arrival_curves.v b/restructuring/model/arrival/arrival_curves.v index ea918a5b745712e785d131df1ae717c6f656ed30..e33d68c96fc4d8ef3b7a4cfa7cf1e0942a208a0b 100644 --- a/restructuring/model/arrival/arrival_curves.v +++ b/restructuring/model/arrival/arrival_curves.v @@ -1,40 +1,43 @@ From rt.util Require Import all. From rt.restructuring.behavior Require Export arrival_sequence. -From rt.restructuring.model Require Export task_arrivals. +From rt.restructuring.model Require Import task_arrivals. (* In this section, we define the notion of arrival curves, which can be used to reason about the frequency of job arrivals. *) Section ArrivalCurves. - Context {Task: TaskType}. - Context {Job: JobType}. + (* Consider any type of tasks ... *) + Context {Task : TaskType}. + + (* ... and any type of jobs associated with these tasks. *) + Context {Job : JobType}. Context `{JobTask Job Task}. - (* Consider any job arrival sequence. *) - Variable arr_seq: arrival_sequence Job. + (* Consider any job arrival sequence. *) + Variable arr_seq : arrival_sequence Job. (* First, we define what constitutes an arrival bound for a task. *) Section ArrivalCurves. - (* We say that num_arrivals is a valid arrival curve for task tsk iff *) - (* [num_arrivals] is a monotonic function that equals 0 for the empty *) - (* interval delta = 0. *) - Definition valid_arrival_curve (tsk: Task) (num_arrivals: duration -> nat) := + (* We say that num_arrivals is a valid arrival curve for task tsk iff + [num_arrivals] is a monotonic function that equals 0 for the empty + interval delta = 0. *) + Definition valid_arrival_curve (tsk : Task) (num_arrivals : duration -> nat) := num_arrivals 0 = 0 /\ monotone num_arrivals leq. (* We say that max_arrivals is an upper arrival bound for tsk iff, for any interval [t1, t2), - [max_arrivals (t2 - t1)] bounds the number of jobs of tsk that arrive in that interval. *) - Definition respects_max_arrivals (tsk: Task) (max_arrivals: duration -> nat) := - forall (t1 t2: instant), + [max_arrivals (t2 - t1)] bounds the number of jobs of tsk that arrive in that interval. *) + Definition respects_max_arrivals (tsk : Task) (max_arrivals : duration -> nat) := + forall (t1 t2 : instant), t1 <= t2 -> - size (task_arrivals_between arr_seq tsk t1 t2) <= max_arrivals (t2 - t1). + number_of_task_arrivals arr_seq tsk t1 t2 <= max_arrivals (t2 - t1). - (* We define in the same way lower arrival bounds *) - Definition respects_min_arrivals (tsk: Task) (min_arrivals: duration -> nat) := - forall (t1 t2: instant), + (* We define in the same way lower arrival bounds. *) + Definition respects_min_arrivals (tsk : Task) (min_arrivals : duration -> nat) := + forall (t1 t2 : instant), t1 <= t2 -> - min_arrivals (t2 - t1) <= size (task_arrivals_between arr_seq tsk t1 t2). + min_arrivals (t2 - t1) <= number_of_task_arrivals arr_seq tsk t1 t2. End ArrivalCurves. @@ -43,60 +46,68 @@ Section ArrivalCurves. (* Then, we say that min_separation is a lower separation bound iff, for any number of jobs of tsk, min_separation lower-bounds the minimum interval length in which that number of jobs can be spawned. *) - Definition respects_min_separation tsk (min_separation: nat -> duration) := + Definition respects_min_separation (tsk : Task) (min_separation: nat -> duration) := forall t1 t2, t1 <= t2 -> - min_separation (size (task_arrivals_between arr_seq tsk t1 t2)) <= t2 - t1. + min_separation (number_of_task_arrivals arr_seq tsk t1 t2) <= t2 - t1. (* We define in the same way upper separation bounds *) - Definition respects_max_separation tsk (max_separation: nat -> duration):= + Definition respects_max_separation (tsk : Task) (max_separation: nat -> duration):= forall t1 t2, t1 <= t2 -> - t2 - t1 <= max_separation (size (task_arrivals_between arr_seq tsk t1 t2)). + t2 - t1 <= max_separation (number_of_task_arrivals arr_seq tsk t1 t2). End SeparationBound. End ArrivalCurves. (* We define generic classes for arrival curves *) -Class MaxArrivals (Task: TaskType) := max_arrivals: Task -> duration -> nat. +Class MaxArrivals (Task : TaskType) := max_arrivals : Task -> duration -> nat. -Class MinArrivals (Task: TaskType) := min_arrivals: Task -> duration -> nat. +Class MinArrivals (Task : TaskType) := min_arrivals : Task -> duration -> nat. -Class MaxSeparation (Task: TaskType) := max_separation: Task -> nat -> duration. +Class MaxSeparation (Task : TaskType) := max_separation : Task -> nat -> duration. -Class MinSeparation (Task: TaskType) := min_separation: Task -> nat -> duration. +Class MinSeparation (Task : TaskType) := min_separation : Task -> nat -> duration. Section ArrivalCurvesModel. - Context {Task: TaskType} {Job: JobType}. + (* Consider any type of tasks ... *) + Context {Task : TaskType}. + + (* ... and any type of jobs associated with these tasks. *) + Context {Job : JobType}. Context `{JobTask Job Task}. - Context `{MaxArrivals Task} `{MinArrivals Task} `{MaxSeparation Task} `{MinSeparation Task}. + (* Consider any job arrival sequence... *) + Variable arr_seq : arrival_sequence Job. - Variable ts: seq Task. + (* ..and all the classes of arrival curves. *) + Context `{MaxArrivals Task} + `{MinArrivals Task} + `{MaxSeparation Task} + `{MinSeparation Task}. + + (* Let ts be an arbitrary task set. *) + Variable ts : seq Task. (* We say that arrivals is a valid arrival curve for a taskset if it is valid for any task in the taskset *) Definition valid_taskset_arrival_curve (arrivals : Task -> duration -> nat) := - forall tsk, - tsk \in ts -> - valid_arrival_curve tsk (arrivals tsk). - - Variable arr_seq: arrival_sequence Job. + forall (tsk : Task), tsk \in ts -> valid_arrival_curve tsk (arrivals tsk). (* We say that max_arrivals is an arrival bound for taskset ts *) (* iff max_arrival is an arrival bound for any task from ts. *) Definition taskset_respects_max_arrivals := - forall (tsk: Task), tsk \in ts -> respects_max_arrivals arr_seq tsk (max_arrivals tsk). + forall (tsk : Task), tsk \in ts -> respects_max_arrivals arr_seq tsk (max_arrivals tsk). Definition taskset_respects_min_arrivals := - forall (tsk: Task), tsk \in ts -> respects_min_arrivals arr_seq tsk (min_arrivals tsk). + forall (tsk : Task), tsk \in ts -> respects_min_arrivals arr_seq tsk (min_arrivals tsk). Definition taskset_respects_max_separation := - forall (tsk: Task), tsk \in ts -> respects_max_separation arr_seq tsk (max_separation tsk). + forall (tsk : Task), tsk \in ts -> respects_max_separation arr_seq tsk (max_separation tsk). Definition taskset_respects_min_separation := - forall (tsk: Task), tsk \in ts -> respects_min_separation arr_seq tsk (min_separation tsk). + forall (tsk : Task), tsk \in ts -> respects_min_separation arr_seq tsk (min_separation tsk). End ArrivalCurvesModel. \ No newline at end of file diff --git a/restructuring/model/task_arrivals.v b/restructuring/model/arrival/task_arrivals.v similarity index 74% rename from restructuring/model/task_arrivals.v rename to restructuring/model/arrival/task_arrivals.v index 1f5905db06d4278c59b6258b42f4485377ec5424..428f2ede03e36a9f7668f1d01113cb9074c2e240 100644 --- a/restructuring/model/task_arrivals.v +++ b/restructuring/model/arrival/task_arrivals.v @@ -1,39 +1,43 @@ -From rt.restructuring.behavior Require Export arrival_sequence. From rt.restructuring.model Require Export task. -(* In this file we provide basic definitions related to tasks on arrival sequences *) +(* In this file we provide basic definitions related to tasks on arrival sequences. *) Section TaskArrivals. (* Consider any type of job associated with any type of tasks. *) - Context {Job: JobType}. - Context {Task: TaskType}. + Context {Job : JobType}. + Context {Task : TaskType}. Context `{JobTask Job Task}. (* Consider any job arrival sequence. *) - Variable arr_seq: arrival_sequence Job. + Variable arr_seq : arrival_sequence Job. Section Definitions. (* Let tsk be any task. *) Variable tsk : Task. - (* We define the sequence of jobs of tsk arriving at time t *) + (* We define the sequence of jobs of tsk arriving at time t. *) Definition task_arrivals_at (t : instant) : seq Job := [seq j <- arrivals_at arr_seq t | job_task j == tsk]. (* By concatenation, we construct the list of jobs of tsk that arrived in the - interval [t1, t2). *) + interval [t1, t2). *) Definition task_arrivals_between (t1 t2 : instant) := [seq j <- arrivals_between arr_seq t1 t2 | job_task j == tsk]. (* Based on that, we define the list of jobs of tsk that arrived up to time t, ...*) Definition task_arrivals_up_to (t : instant) := task_arrivals_between 0 t.+1. - (* ...and the list of jobs of tsk that arrived strictly before time t. *) + (* ...and the list of jobs of tsk that arrived strictly before time t ... *) Definition task_arrivals_before (t : instant) := task_arrivals_between 0 t. + + (* ... and also count the number of job arrivals. *) + Definition number_of_task_arrivals (t1 t2 : instant) := + size (task_arrivals_between t1 t2). + End Definitions. - (* We define a predicate for arrival sequences for which jobs come from a taskset *) + (* We define a predicate for arrival sequences for which jobs come from a taskset. *) Definition arrivals_come_from_taskset (ts : seq Task) := forall j, arrives_in arr_seq j -> job_task j \in ts.