Constraint Reformulation
Each VM manager supports a limited set of constraints and a user may expressed some constraints that are not available on the VM manager that will host its VMs.
Using the semantic of each constraint, it is possible to establish an inheritance relationship between constraints. These relations allow to reformulate some constraints that are missing using a peculiar utilization of more generic constraints while preserving their semantics. It has however to be noticed that the semantical equivalence between a constraint and its reformulation does not ensure the two implementations will have an equivalent practical efficiency. Only an analysis of the constraints model and internals may reveal their relative performances.
This chapter summarizes the inheritance relationship between the constraints presented in the catalog. First, we present the inheritance graph between all the constraints to indicate the available reformulations We then present the associated rewriting rules.
Inheritance Graph
Figure 1 depicts the global inheritance graph between the constraints.
An arrow between two constraints indicates a possible reformulation.
As an example, a gather
constraint can be reformulated using a among
constraint.
It is then possible to express the restriction provided by a gather
constraint using a
peculiar specialization of a among
constraint.
The inheritance relationship is also transitive. A gather
constraint can then
be expressed using a splitAmong
constraint.
A "+" vertex indicates a composition of constraints. As an example, the quarantine
constraint can be reformulated using a peculiar composition of root
and ban
constraints.
Rewriting rules
In this section, we present the rewriting rules associated to each constraint reformulation.
SplitAmong
Specialization(s)
To
lazySpread
:splitAmong(s/|s|,N/|N|)
↔lazySpread(s1)
To
among
:splitAmong({vs1},ns1)
↔among(vs1, ns1)
Lonely
Reformulation(s)
Using
split
:lonely(vs1)
↔split({vs1,vs1})
MostlySpread
Specialization(s)
To
lazySpread
:mostlySpread(s,|s|)
↔lazySpread(s)
Quarantine
Reformulation(s)
Split
Specialization(s)
To
lonely
:split({vs1,vs1})
↔lonely(vs1)
To
lazySpread
:split(s/|s|)
↔lazySpread(s)
LazySpread
Reformulation(s)
Using
mostlySpread
:lazySpread(s)
↔mostlySpread(s,|s|)
Using
splitAmong
:lazySpread(s1)
↔splitAmong(s/|s|,N/|N|)
Using
split
:lazySpread(s)
↔split(s/|s|)
Ban
Reformulation(s)
Specialization(s)
To
fence
:ban(vs1,ns1)
↔fence(vs1, ns1)
SingleCapacity
Reformulation(s)
Using
cumulatedCapacity
:singleCapacity(ns, nb, r)
↔∀n ∈ ns, cumulatedCapacity({n}, nb, r)
Fence
Reformulation(s)
Using
ban
:fence(vs1, ns1)
↔ban(vs1,ns1)
Specialization(s)
To
ban
:fence(vs1,ns1)
↔ban(vs1, ns1)
Among
Reformulation(s)
Using
splitAmong
:among(vs1, ns1)
↔splitAmong({vs1},ns1)
Specialization(s)
Gather
Reformulation(s)
Using
among
:gather(s)
↔among(s,N/|N|)
CumulatedCapacity
Specialization(s)
To
singleCapacity
:∀n ∈ ns, cumulatedCapacity({n}, nb, r)
↔singleCapacity(ns, nb, r)