This version includes all of the 2020-2022 work on Tiebreaking and various updates to develop since the last version.
Adds a separate array of RNG streams on each LP that aren't
to be utilized by developed models. These separate RNG streams can be
utilized to leverage the deterministic RNG nature that ROSS can manage
toward other goals of the ROSS engine itself.
Notable example use for this: Deterministic Tiebreaking
Deterministic Tiebreaking can be implemented by creating a random value
at the creation of an event, this value is encoded into the ROSS event
struct and is utilized to break any event ties (same destination LP at
same time). Because this separate RNG is only accessed by ROSS, it can
be rolled back if the event becomes RC'd or cancelled. Because of
determinism, any ordering as a result of this tiebreaker will be
consistent across simulation runs regardless of event delivery order
or stragglers. If a regular model-accessed LP RNG was used for this
purpose, the tiebreaking sequence would be subject to interference.
Also included:
Capability for zero-offset event unbiased tiebreaking
User defined event priorities for tiebreaking (primary tie-breaker, then random tiebreaker used to break subsequent ties)
Given two events, their ordering in the simulation (regardless of execution mode) is dependent on the following cascading ruleset, subsequent rules are only triggered if a given rule is inconclusive (a tie):
- Virtual time timestamp
- User Defined Priority (lower value is "better")
- The 'i'th random tiebreaker value
- 'i'th+1 random tiebreaker value (and so on -- tiebreaker value indices greater than 0 are only used in case of comparing two -- related -- zero-offset events)
Seeds for both the model level and core RNG streams are individually specifiable at runtime via CLA.