Source code for buildcompiler.inventory.compatibility
"""Deterministic compatibility route models and score ordering."""
from __future__ import annotations
from dataclasses import dataclass
from buildcompiler.domain import IndexedBackbone, IndexedPlasmid
[docs]
@dataclass(frozen=True)
class RouteScore:
missing_required_products: int = 0
missing_domestications: int = 0
missing_lvl1_plasmids: int = 0
generated_or_planned_materials: int = 0
lower_material_state_penalty: int = 0
constraint_violations: int = 0
total_assemblies: int = 0
identity_tiebreak: tuple[str, ...] = ()
[docs]
def sort_key(self) -> tuple[int, int, int, int, int, int, int, tuple[str, ...]]:
"""Lower sort key is a better route."""
return (
self.constraint_violations,
self.missing_required_products,
self.missing_domestications,
self.missing_lvl1_plasmids,
self.generated_or_planned_materials,
self.lower_material_state_penalty,
self.total_assemblies,
self.identity_tiebreak,
)
[docs]
@dataclass(frozen=True)
class Lvl1Route:
request_id: str
part_identities: tuple[str, ...]
selected_part_plasmids: tuple[IndexedPlasmid, ...]
missing_part_identities: tuple[str, ...]
backbone: IndexedBackbone | None
score: RouteScore
[docs]
@dataclass(frozen=True)
class Lvl2Route:
request_id: str
region_order: tuple[str, ...]
selected_lvl1_plasmids: tuple[IndexedPlasmid, ...]
missing_region_identities: tuple[str, ...]
backbone: IndexedBackbone | None
score: RouteScore
[docs]
@dataclass(frozen=True)
class RouteSelection:
selected: Lvl1Route | Lvl2Route | None
rejected: tuple[Lvl1Route | Lvl2Route, ...] = ()