Skip to content

Entities and attributes

Entities

An entity is the thing flowing through the model: a customer, a job, a part. Every entity has:

Field Meaning
id Auto-assigned identity counter, unique within a replication.
e_type Its entity type, upper-cased automatically. Names its row in entities and can drive an entity type's holding_cost (see Costing).
creation_time / deletion_time / throughput_time Set by CREATE / DISPOSE; None until set.
arbitrary attributes Anything an ASSIGN block sets, e.g. entity.priority = 3. Not declared anywhere, not type-checked.

CREATE's e_type parameter sets the type for everything that block creates; a model can have several CREATE blocks producing different types feeding into the same downstream blocks.

Attributes

An attribute is any name you assign with ASSIGN: entity.<name> = <expression>. There is no attribute schema to declare up front -- the first ASSIGN that sets entity.priority is what makes priority exist on that entity from then on. Reading an attribute that was never assigned raises an expression error at run time (fails loud rather than silently returning None or 0).

{"type": "ASSIGN", "params": {"assignments": [
  {"target": "entity.priority", "expr": "DISC(1, 0.2, 2, 0.5, 3, 0.3)"},
  {"target": "entity.cost_class", "expr": "'premium' if entity.priority == 3 else 'standard'"}
]}}

Assignments in one ASSIGN block run in order, so a later one can read what an earlier one just wrote (as cost_class does above, reading priority).

Reading attributes elsewhere

Any expression -- a DECIDE condition, a distribution parameter, a RECORD's expr, a resource's ranking_expr -- can read entity.<name> the same way. See Expressions and variables for the full grammar.

Batch and duplicate entities

BATCH/MATCH wrap several entities into one batch entity (batch_elems); the members leave live_entities and carry in_batch until SEPARATE splits the batch again. DUPLICATE makes shallow copies of an entity, each with its own id. See Batching and matching.