cottax.relational.programme module

A condition node’s relations sorted into a Programme: objective, equalities, inequalities and bounds, by place alone.

class Programme[V: Place](objectives: tuple[Objective[V], ...], equalities: tuple[Relation[V], ...], inequalities: tuple[Relation[V], ...], lower: OrderedMap[V, tuple[Optional[V], ...]], upper: OrderedMap[V, tuple[Optional[V], ...]])[source]

Bases: Frozen, Generic[V]

A condition as min objectives subject to equalities, inequalities and a box: places only.

objectives: tuple[Objective[V], ...]

Each a place and its sense, as written.

equalities: tuple[Relation[V], ...]

lhs = rhs, a side of None zero.

inequalities: tuple[Relation[V], ...]

lhs <= rhs, the bounds taken out.

lower: OrderedMap[V, tuple[Optional[V], ...]]

Per unknown, in unknowns order, the sides bounding it from below as met; None is zero.

upper: OrderedMap[V, tuple[Optional[V], ...]]

Per unknown, the sides bounding it from above, likewise.

check_programmable(condition: RelationalCondition)[source]

Every relation an Eq or a Le: a programme has no other group.

Return type:

Iterator[Violation]

programme[V: Place](condition: RelationalCondition[V])[source]

Each relation in its group, in condition.relations order; a bound to its unknown’s side of the box.

Return type:

Programme[V]

class NotProgrammable(relation: object)[source]

Bases: Violation

relation: object
template: AbstractClassVar[str] = '{relation!r}: a nonlinear programme reads `Eq` and `Le` alone, so another `Rel` has no group'

e.g. ‘output {place!r} is owned by both {other!r} and {node!r}’

Type:

Wording