libpetri 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/verification/marking-state.ts","../../src/verification/encoding/flat-transition.ts","../../src/verification/encoding/flat-net.ts","../../src/verification/encoding/incidence-matrix.ts","../../src/verification/encoding/net-flattener.ts","../../src/verification/invariant/p-invariant.ts","../../src/verification/invariant/p-invariant-computer.ts","../../src/verification/invariant/structural-check.ts","../../src/verification/smt-property.ts","../../src/verification/smt-verification-result.ts","../../src/verification/z3/spacer-runner.ts","../../src/verification/z3/smt-encoder.ts","../../src/verification/z3/counterexample-decoder.ts","../../src/verification/smt-verifier.ts"],"sourcesContent":["import type { Place } from '../core/place.js';\n\n/** @internal Symbol key restricting construction to the builder and factory methods. */\nconst MARKING_STATE_KEY = Symbol('MarkingState.internal');\n\n/**\n * Immutable snapshot of a Petri net marking for state space analysis.\n *\n * Maps places (by name) to integer token counts. Only stores places with count > 0.\n * Used for invariant computation and structural verification, not runtime execution.\n */\nexport class MarkingState {\n private readonly tokenCounts: ReadonlyMap<string, number>;\n private readonly placesByName: ReadonlyMap<string, Place<any>>;\n\n /** @internal Use {@link MarkingState.builder} or {@link MarkingState.empty} to create instances. */\n constructor(key: symbol, tokenCounts: Map<string, number>, placesByName: Map<string, Place<any>>) {\n if (key !== MARKING_STATE_KEY) throw new Error('Use MarkingState.builder() to create instances');\n this.tokenCounts = tokenCounts;\n this.placesByName = placesByName;\n }\n\n /** Returns the token count for a place (0 if absent). */\n tokens(place: Place<any>): number {\n return this.tokenCounts.get(place.name) ?? 0;\n }\n\n /** Checks if a place has at least one token. */\n hasTokens(place: Place<any>): boolean {\n return this.tokens(place) > 0;\n }\n\n /** Checks if any of the given places has tokens. */\n hasTokensInAny(places: Iterable<Place<any>>): boolean {\n for (const p of places) {\n if (this.hasTokens(p)) return true;\n }\n return false;\n }\n\n /** Returns all places with tokens > 0. */\n placesWithTokens(): Place<any>[] {\n return [...this.placesByName.values()];\n }\n\n /** Returns the total number of tokens. */\n totalTokens(): number {\n let sum = 0;\n for (const count of this.tokenCounts.values()) sum += count;\n return sum;\n }\n\n /** Checks if no tokens exist anywhere. */\n isEmpty(): boolean {\n return this.tokenCounts.size === 0;\n }\n\n toString(): string {\n if (this.tokenCounts.size === 0) return '{}';\n const entries = [...this.tokenCounts.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, count]) => `${name}:${count}`);\n return `{${entries.join(', ')}}`;\n }\n\n static empty(): MarkingState {\n return new MarkingState(MARKING_STATE_KEY, new Map(), new Map());\n }\n\n static builder(): MarkingStateBuilder {\n return new MarkingStateBuilder();\n }\n}\n\nexport class MarkingStateBuilder {\n private readonly tokenCounts = new Map<string, number>();\n private readonly placesByName = new Map<string, Place<any>>();\n\n /** Sets the token count for a place. */\n tokens(place: Place<any>, count: number): this {\n if (count < 0) throw new Error(`Token count cannot be negative: ${count}`);\n if (count > 0) {\n this.tokenCounts.set(place.name, count);\n this.placesByName.set(place.name, place);\n } else {\n this.tokenCounts.delete(place.name);\n this.placesByName.delete(place.name);\n }\n return this;\n }\n\n /** Adds tokens to a place. */\n addTokens(place: Place<any>, count: number): this {\n if (count < 0) throw new Error(`Token count cannot be negative: ${count}`);\n if (count > 0) {\n const current = this.tokenCounts.get(place.name) ?? 0;\n this.tokenCounts.set(place.name, current + count);\n this.placesByName.set(place.name, place);\n }\n return this;\n }\n\n build(): MarkingState {\n return new MarkingState(MARKING_STATE_KEY, new Map(this.tokenCounts), new Map(this.placesByName));\n }\n}\n","import type { Transition } from '../../core/transition.js';\n\n/**\n * A flattened transition with pre/post vectors for SMT encoding.\n *\n * Each Transition with XOR outputs is expanded into multiple FlatTransitions\n * (one per branch). Non-XOR transitions map 1:1.\n */\nexport interface FlatTransition {\n /** Display name (e.g. \"Search_b0\", \"Search_b1\"). */\n readonly name: string;\n /** The original transition. */\n readonly source: Transition;\n /** Which XOR branch (-1 if no XOR). */\n readonly branchIndex: number;\n /** Tokens consumed per place (indexed by place index). */\n readonly preVector: readonly number[];\n /** Tokens produced per place (indexed by place index). */\n readonly postVector: readonly number[];\n /** Place indices where inhibitor arcs block firing. */\n readonly inhibitorPlaces: readonly number[];\n /** Place indices requiring a token without consuming. */\n readonly readPlaces: readonly number[];\n /** Place indices set to 0 on firing. */\n readonly resetPlaces: readonly number[];\n /** True at index i means place i uses All/AtLeast semantics. */\n readonly consumeAll: readonly boolean[];\n}\n\nexport function flatTransition(\n name: string,\n source: Transition,\n branchIndex: number,\n preVector: number[],\n postVector: number[],\n inhibitorPlaces: number[],\n readPlaces: number[],\n resetPlaces: number[],\n consumeAll: boolean[],\n): FlatTransition {\n return {\n name,\n source,\n branchIndex,\n preVector,\n postVector,\n inhibitorPlaces,\n readPlaces,\n resetPlaces,\n consumeAll,\n };\n}\n","import type { Place } from '../../core/place.js';\nimport type { FlatTransition } from './flat-transition.js';\n\n/**\n * A flattened Petri net with indexed places and XOR-expanded transitions.\n *\n * Intermediate representation between the high-level PetriNet and Z3 CHC encoding.\n */\nexport interface FlatNet {\n /** Ordered list of places (index = position). */\n readonly places: readonly Place<any>[];\n /** Reverse lookup: place name -> index. */\n readonly placeIndex: ReadonlyMap<string, number>;\n /** XOR-expanded flat transitions. */\n readonly transitions: readonly FlatTransition[];\n /** For bounded environment places: place name -> max tokens. */\n readonly environmentBounds: ReadonlyMap<string, number>;\n}\n\nexport function flatNetPlaceCount(net: FlatNet): number {\n return net.places.length;\n}\n\nexport function flatNetTransitionCount(net: FlatNet): number {\n return net.transitions.length;\n}\n\nexport function flatNetIndexOf(net: FlatNet, place: Place<any>): number {\n return net.placeIndex.get(place.name) ?? -1;\n}\n","import type { FlatNet } from './flat-net.js';\n\n/**\n * Incidence matrix for a flattened Petri net.\n *\n * The incidence matrix C is defined as C[t][p] = post[t][p] - pre[t][p].\n * It captures the net effect of each transition on each place.\n *\n * P-invariants are solutions to y^T * C = 0, found via null space\n * computation on C^T.\n */\nexport class IncidenceMatrix {\n private readonly _pre: readonly (readonly number[])[];\n private readonly _post: readonly (readonly number[])[];\n private readonly _incidence: readonly (readonly number[])[];\n private readonly _numTransitions: number;\n private readonly _numPlaces: number;\n\n private constructor(\n pre: number[][],\n post: number[][],\n incidence: number[][],\n numTransitions: number,\n numPlaces: number,\n ) {\n this._pre = pre;\n this._post = post;\n this._incidence = incidence;\n this._numTransitions = numTransitions;\n this._numPlaces = numPlaces;\n }\n\n /**\n * Computes the incidence matrix from a FlatNet.\n */\n static from(flatNet: FlatNet): IncidenceMatrix {\n const T = flatNet.transitions.length;\n const P = flatNet.places.length;\n\n const pre: number[][] = [];\n const post: number[][] = [];\n const incidence: number[][] = [];\n\n for (let t = 0; t < T; t++) {\n const ft = flatNet.transitions[t]!;\n const preRow = new Array<number>(P);\n const postRow = new Array<number>(P);\n const incRow = new Array<number>(P);\n\n for (let p = 0; p < P; p++) {\n preRow[p] = ft.preVector[p]!;\n postRow[p] = ft.postVector[p]!;\n incRow[p] = postRow[p]! - preRow[p]!;\n }\n\n pre.push(preRow);\n post.push(postRow);\n incidence.push(incRow);\n }\n\n return new IncidenceMatrix(pre, post, incidence, T, P);\n }\n\n /**\n * Returns C^T (transpose of incidence matrix), dimensions [P][T].\n * Used for P-invariant computation: null space of C^T gives P-invariants.\n */\n transposedIncidence(): number[][] {\n const ct: number[][] = [];\n for (let p = 0; p < this._numPlaces; p++) {\n const row = new Array<number>(this._numTransitions);\n for (let t = 0; t < this._numTransitions; t++) {\n row[t] = this._incidence[t]![p]!;\n }\n ct.push(row);\n }\n return ct;\n }\n\n /** Returns the pre-matrix (tokens consumed). T×P. */\n pre(): readonly (readonly number[])[] { return this._pre; }\n\n /** Returns the post-matrix (tokens produced). T×P. */\n post(): readonly (readonly number[])[] { return this._post; }\n\n /** Returns the incidence matrix C[t][p] = post - pre. T×P. */\n incidence(): readonly (readonly number[])[] { return this._incidence; }\n\n numTransitions(): number { return this._numTransitions; }\n numPlaces(): number { return this._numPlaces; }\n}\n","/**\n * @module net-flattener\n *\n * Flattens a PetriNet into integer-indexed pre/post vectors for SMT encoding.\n *\n * **XOR expansion**: Transitions with XOR output specs are expanded into multiple\n * flat transitions — one per deterministic branch. Each branch produces tokens to\n * exactly one XOR child's places. This converts non-deterministic output routing\n * into separate transitions that the SMT solver can reason about independently.\n *\n * **Vector construction**: For each flat transition, builds:\n * - `preVector[p]`: tokens consumed from place p (input cardinality)\n * - `postVector[p]`: tokens produced to place p (from the selected branch)\n * - `consumeAll[p]`: true for `all`/`at-least` inputs (consume everything)\n * - Index arrays for inhibitor, read, and reset arcs\n *\n * Places are sorted by name for stable, deterministic indexing across runs.\n */\nimport type { PetriNet } from '../../core/petri-net.js';\nimport type { Place, EnvironmentPlace } from '../../core/place.js';\nimport type { Out } from '../../core/out.js';\nimport type { FlatNet } from './flat-net.js';\nimport { flatTransition } from './flat-transition.js';\nimport { enumerateBranches, allPlaces as outAllPlaces } from '../../core/out.js';\n\n/**\n * How to treat environment places during analysis.\n */\nexport type EnvironmentAnalysisMode =\n | { readonly type: 'unbounded' }\n | { readonly type: 'bounded'; readonly maxTokens: number };\n\nexport function unbounded(): EnvironmentAnalysisMode {\n return { type: 'unbounded' };\n}\n\nexport function bounded(maxTokens: number): EnvironmentAnalysisMode {\n return { type: 'bounded', maxTokens };\n}\n\n/**\n * Flattens a PetriNet into a FlatNet suitable for SMT encoding.\n *\n * Flattening involves:\n * 1. Assigning each place a stable integer index (sorted by name)\n * 2. Expanding XOR outputs into separate flat transitions (one per branch)\n * 3. Building pre/post vectors from input/output specs\n * 4. Recording inhibitor, read, and reset arcs\n * 5. Setting environment bounds for bounded analysis mode\n */\nexport function flatten(\n net: PetriNet,\n environmentPlaces: Set<EnvironmentPlace<any>> = new Set(),\n environmentMode: EnvironmentAnalysisMode = unbounded(),\n): FlatNet {\n // 1. Collect ALL places\n const allPlacesSet = new Map<string, Place<any>>();\n for (const p of net.places) {\n allPlacesSet.set(p.name, p);\n }\n for (const t of net.transitions) {\n for (const inSpec of t.inputSpecs) {\n allPlacesSet.set(inSpec.place.name, inSpec.place);\n }\n if (t.outputSpec !== null) {\n for (const p of outAllPlaces(t.outputSpec)) {\n allPlacesSet.set(p.name, p);\n }\n }\n for (const arc of t.inhibitors) allPlacesSet.set(arc.place.name, arc.place);\n for (const arc of t.reads) allPlacesSet.set(arc.place.name, arc.place);\n for (const arc of t.resets) allPlacesSet.set(arc.place.name, arc.place);\n }\n\n // Sort by name for stable indexing\n const places = [...allPlacesSet.values()].sort((a, b) => a.name.localeCompare(b.name));\n\n const placeIndex = new Map<string, number>();\n for (let i = 0; i < places.length; i++) {\n placeIndex.set(places[i]!.name, i);\n }\n\n // 2. Compute environment bounds\n const environmentBounds = new Map<string, number>();\n if (environmentMode.type === 'bounded') {\n for (const ep of environmentPlaces) {\n environmentBounds.set(ep.place.name, environmentMode.maxTokens);\n }\n }\n\n // 3. Expand transitions\n const n = places.length;\n const flatTransitions = [];\n\n for (const transition of net.transitions) {\n const branches = enumerateOutputBranches(transition);\n\n for (let branchIdx = 0; branchIdx < branches.length; branchIdx++) {\n const branchPlaces = branches[branchIdx]!;\n const name = branches.length > 1\n ? `${transition.name}_b${branchIdx}`\n : transition.name;\n\n // Build pre-vector and consumeAll flags\n const preVector = new Array<number>(n).fill(0);\n const consumeAll = new Array<boolean>(n).fill(false);\n\n for (const inSpec of transition.inputSpecs) {\n const idx = placeIndex.get(inSpec.place.name);\n if (idx === undefined) continue;\n\n switch (inSpec.type) {\n case 'one':\n preVector[idx] = 1;\n break;\n case 'exactly':\n preVector[idx] = inSpec.count;\n break;\n case 'all':\n preVector[idx] = 1;\n consumeAll[idx] = true;\n break;\n case 'at-least':\n preVector[idx] = inSpec.minimum;\n consumeAll[idx] = true;\n break;\n }\n }\n\n // Build post-vector from branch output places\n const postVector = new Array<number>(n).fill(0);\n for (const p of branchPlaces) {\n const idx = placeIndex.get(p.name);\n if (idx !== undefined) {\n postVector[idx] = 1;\n }\n }\n\n // Inhibitor places\n const inhibitorPlaces = transition.inhibitors\n .map(arc => placeIndex.get(arc.place.name))\n .filter((idx): idx is number => idx !== undefined);\n\n // Read places\n const readPlaces = transition.reads\n .map(arc => placeIndex.get(arc.place.name))\n .filter((idx): idx is number => idx !== undefined);\n\n // Reset places\n const resetPlaces = transition.resets\n .map(arc => placeIndex.get(arc.place.name))\n .filter((idx): idx is number => idx !== undefined);\n\n flatTransitions.push(flatTransition(\n name,\n transition,\n branches.length > 1 ? branchIdx : -1,\n preVector,\n postVector,\n inhibitorPlaces,\n readPlaces,\n resetPlaces,\n consumeAll,\n ));\n }\n }\n\n return {\n places,\n placeIndex,\n transitions: flatTransitions,\n environmentBounds,\n };\n}\n\nfunction enumerateOutputBranches(t: { outputSpec: Out | null }): ReadonlySet<Place<any>>[] {\n if (t.outputSpec !== null) {\n return enumerateBranches(t.outputSpec) as ReadonlySet<Place<any>>[];\n }\n // No outputs (sink transition)\n return [new Set()];\n}\n","/**\n * A P-invariant (place invariant) of a Petri net.\n *\n * A P-invariant is a vector y such that y^T * C = 0, where C is the\n * incidence matrix. This means that for any reachable marking M:\n * sum(y_i * M_i) = constant, where constant = sum(y_i * M0_i).\n *\n * P-invariants provide structural bounds on places and are used as\n * strengthening lemmas for the IC3/PDR engine.\n */\nexport interface PInvariant {\n /** Weight vector (one entry per place index). */\n readonly weights: readonly number[];\n /** The invariant value sum(y_i * M0_i). */\n readonly constant: number;\n /** Set of place indices where weight != 0. */\n readonly support: ReadonlySet<number>;\n}\n\nexport function pInvariant(weights: number[], constant: number, support: Set<number>): PInvariant {\n return { weights, constant, support };\n}\n\nexport function pInvariantToString(inv: PInvariant): string {\n const parts: string[] = [];\n for (const i of inv.support) {\n if (inv.weights[i] !== 1) {\n parts.push(`${inv.weights[i]}*p${i}`);\n } else {\n parts.push(`p${i}`);\n }\n }\n return `PInvariant[${parts.join(' + ')} = ${inv.constant}]`;\n}\n","/**\n * @module p-invariant-computer\n *\n * Computes P-invariants of a Petri net via integer Gaussian elimination (Farkas' algorithm).\n *\n * **Algorithm**: A P-invariant is a non-negative integer vector y such that y^T · C = 0\n * (where C is the incidence matrix). This expresses a conservation law: the weighted\n * token sum Σ(y_i · M[i]) is constant across all reachable markings.\n *\n * **Farkas variant**: Constructs the augmented matrix [C^T | I_P] and row-reduces\n * the C^T portion to zero using integer elimination (no floating point). Rows where\n * the C^T part becomes all-zero yield invariant vectors from the identity part.\n * Row normalization by GCD keeps values small during elimination.\n *\n * **Integer Gaussian elimination**: Each elimination step multiplies rows by pivot\n * coefficients (a·row - b·pivotRow) to avoid fractions. This preserves integer\n * arithmetic throughout, critical for exact invariant computation.\n *\n * Invariants are used to strengthen SMT queries (added as constraints on M').\n */\nimport type { FlatNet } from '../encoding/flat-net.js';\nimport type { IncidenceMatrix } from '../encoding/incidence-matrix.js';\nimport type { MarkingState } from '../marking-state.js';\nimport type { PInvariant } from './p-invariant.js';\nimport { pInvariant } from './p-invariant.js';\n\n/**\n * Computes P-invariants of a Petri net via integer Gaussian elimination.\n *\n * P-invariants are non-negative integer vectors y where y^T * C = 0.\n * They express conservation laws: the weighted token sum is constant\n * across all reachable markings.\n *\n * Algorithm: compute the null space of C^T using integer row reduction\n * with an augmented identity matrix (Farkas' algorithm variant).\n */\nexport function computePInvariants(\n matrix: IncidenceMatrix,\n flatNet: FlatNet,\n initialMarking: MarkingState,\n): PInvariant[] {\n const P = matrix.numPlaces();\n const T = matrix.numTransitions();\n\n if (P === 0 || T === 0) return [];\n\n // We want to find y such that y^T * C = 0, i.e., C^T * y = 0\n // Start with augmented matrix [C^T | I_P]\n // Row-reduce C^T part to zero; the I_P part gives the invariant vectors.\n const ct = matrix.transposedIncidence(); // P × T\n\n // Augmented matrix: P rows, T + P columns\n // Use regular numbers (safe for nets with < ~50 places/transitions)\n const cols = T + P;\n const augmented: number[][] = [];\n for (let i = 0; i < P; i++) {\n const row = new Array<number>(cols).fill(0);\n for (let j = 0; j < T; j++) {\n row[j] = ct[i]![j]!;\n }\n row[T + i] = 1; // identity part\n augmented.push(row);\n }\n\n // Integer Gaussian elimination on the C^T part (columns 0..T-1)\n let pivotRow = 0;\n for (let col = 0; col < T && pivotRow < P; col++) {\n // Find pivot (non-zero entry in this column)\n let pivot = -1;\n for (let row = pivotRow; row < P; row++) {\n if (augmented[row]![col] !== 0) {\n pivot = row;\n break;\n }\n }\n if (pivot === -1) continue; // free variable\n\n // Swap pivot row\n if (pivot !== pivotRow) {\n const tmp = augmented[pivotRow]!;\n augmented[pivotRow] = augmented[pivot]!;\n augmented[pivot] = tmp;\n }\n\n // Eliminate this column in all other rows\n for (let row = 0; row < P; row++) {\n if (row === pivotRow || augmented[row]![col] === 0) continue;\n\n const a = augmented[pivotRow]![col]!;\n const b = augmented[row]![col]!;\n\n // row = a*row - b*pivotRow (keeps integers, eliminates col)\n for (let c = 0; c < cols; c++) {\n augmented[row]![c] = a * augmented[row]![c]! - b * augmented[pivotRow]![c]!;\n }\n\n // Normalize by GCD to keep values small\n normalizeRow(augmented[row]!, cols);\n }\n\n pivotRow++;\n }\n\n // Extract invariants: rows where C^T part is all zeros\n const invariants: PInvariant[] = [];\n for (let row = 0; row < P; row++) {\n let isZero = true;\n for (let col = 0; col < T; col++) {\n if (augmented[row]![col] !== 0) {\n isZero = false;\n break;\n }\n }\n if (!isZero) continue;\n\n // Extract the weight vector from the identity part\n const weights = new Array<number>(P);\n let allNonNegative = true;\n let hasPositive = false;\n\n for (let i = 0; i < P; i++) {\n weights[i] = augmented[row]![T + i]!;\n if (weights[i]! < 0) {\n allNonNegative = false;\n break;\n }\n if (weights[i]! > 0) hasPositive = true;\n }\n\n // We want semi-positive invariants (all weights >= 0, at least one > 0)\n if (!allNonNegative) {\n // Try negating\n let allNonPositive = true;\n for (let i = 0; i < P; i++) {\n if (augmented[row]![T + i]! > 0) {\n allNonPositive = false;\n break;\n }\n }\n if (allNonPositive) {\n for (let i = 0; i < P; i++) {\n weights[i] = -augmented[row]![T + i]!;\n }\n hasPositive = true;\n allNonNegative = true;\n }\n }\n\n if (!allNonNegative || !hasPositive) continue;\n\n // Normalize: divide by GCD of weights\n let g = 0;\n for (const w of weights) {\n if (w > 0) g = gcd(g, w);\n }\n if (g > 1) {\n for (let i = 0; i < P; i++) {\n weights[i] = weights[i]! / g;\n }\n }\n\n // Compute support and constant\n const support = new Set<number>();\n let constant = 0;\n for (let i = 0; i < P; i++) {\n if (weights[i] !== 0) {\n support.add(i);\n const place = flatNet.places[i]!;\n constant += weights[i]! * initialMarking.tokens(place);\n }\n }\n\n invariants.push(pInvariant(weights, constant, support));\n }\n\n return invariants;\n}\n\n/**\n * Checks if every place is covered by at least one P-invariant.\n * If true, the net is structurally bounded.\n */\nexport function isCoveredByInvariants(invariants: readonly PInvariant[], numPlaces: number): boolean {\n const covered = new Array<boolean>(numPlaces).fill(false);\n for (const inv of invariants) {\n for (const idx of inv.support) {\n if (idx < numPlaces) covered[idx] = true;\n }\n }\n return covered.every(c => c);\n}\n\nfunction normalizeRow(row: number[], cols: number): void {\n let g = 0;\n for (let c = 0; c < cols; c++) {\n if (row[c] !== 0) {\n g = gcd(g, Math.abs(row[c]!));\n }\n }\n if (g > 1) {\n for (let c = 0; c < cols; c++) {\n row[c] = row[c]! / g;\n }\n }\n}\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) {\n const t = b;\n b = a % b;\n a = t;\n }\n return a;\n}\n","/**\n * @module structural-check\n *\n * Structural deadlock pre-check using siphon/trap analysis (Commoner's theorem).\n *\n * **Commoner's theorem**: A Petri net is deadlock-free if every siphon contains\n * an initially marked trap.\n *\n * **Siphon**: A set of places S where every transition that outputs to S also\n * inputs from S. Key property: once all places in a siphon become empty,\n * they can never be re-marked. An empty siphon can cause deadlock.\n *\n * **Trap**: A set of places S where every transition that inputs from S also\n * outputs to S. Key property: once any place in a trap is marked,\n * the trap remains marked forever.\n *\n * **Algorithm**: For each place, compute the minimal siphon containing it via\n * fixed-point expansion. For each siphon, find the maximal trap within it\n * (fixed-point contraction). If every siphon contains an initially-marked\n * trap, deadlock-freedom is proven structurally — no SMT query needed.\n *\n * Limited to nets with ≤50 places to bound enumeration cost.\n */\nimport type { FlatNet } from '../encoding/flat-net.js';\nimport type { MarkingState } from '../marking-state.js';\n\nconst MAX_PLACES_FOR_SIPHON_ANALYSIS = 50;\n\n/**\n * Result of structural deadlock check using siphon/trap analysis.\n */\nexport type StructuralCheckResult =\n | { readonly type: 'no-potential-deadlock' }\n | { readonly type: 'potential-deadlock'; readonly siphon: ReadonlySet<number> }\n | { readonly type: 'inconclusive'; readonly reason: string };\n\n/**\n * Structural deadlock pre-check using siphon/trap analysis.\n *\n * Commoner's theorem: a Petri net is deadlock-free if every siphon\n * contains a marked trap.\n *\n * A siphon is a set of places S such that every transition with\n * an output in S also has an input in S. Once empty, a siphon stays empty.\n *\n * A trap is a set of places S such that every transition with\n * an input in S also has an output in S. Once marked, a trap stays marked.\n */\nexport function structuralCheck(flatNet: FlatNet, initialMarking: MarkingState): StructuralCheckResult {\n const P = flatNet.places.length;\n\n if (P === 0) {\n return { type: 'no-potential-deadlock' };\n }\n\n if (P > MAX_PLACES_FOR_SIPHON_ANALYSIS) {\n return { type: 'inconclusive', reason: `Net has ${P} places, siphon enumeration skipped` };\n }\n\n const siphons = findMinimalSiphons(flatNet);\n\n if (siphons.length === 0) {\n return { type: 'no-potential-deadlock' };\n }\n\n for (const siphon of siphons) {\n const trap = findMaximalTrapIn(flatNet, siphon);\n\n if (trap.size === 0 || !isMarked(trap, flatNet, initialMarking)) {\n return { type: 'potential-deadlock', siphon };\n }\n }\n\n return { type: 'no-potential-deadlock' };\n}\n\n/**\n * Finds minimal siphons by checking all non-empty subsets of deadlock-enabling places.\n * Uses a fixed-point approach: start from each place and grow the siphon.\n */\nexport function findMinimalSiphons(flatNet: FlatNet): ReadonlySet<number>[] {\n const P = flatNet.places.length;\n const siphons: Set<number>[] = [];\n\n // Pre-compute: for each place, which transitions have it as output?\n const placeAsOutput: number[][] = [];\n for (let p = 0; p < P; p++) {\n placeAsOutput.push([]);\n }\n\n for (let t = 0; t < flatNet.transitions.length; t++) {\n const ft = flatNet.transitions[t]!;\n for (let p = 0; p < P; p++) {\n if (ft.postVector[p]! > 0) {\n placeAsOutput[p]!.push(t);\n }\n }\n }\n\n for (let startPlace = 0; startPlace < P; startPlace++) {\n const siphon = computeSiphonContaining(startPlace, flatNet, placeAsOutput);\n if (siphon !== null && siphon.size > 0) {\n let isMinimal = true;\n const toRemove: number[] = [];\n for (let i = 0; i < siphons.length; i++) {\n const existing = siphons[i]!;\n if (setsEqual(existing, siphon)) {\n isMinimal = false;\n break;\n }\n if (isSubsetOf(existing, siphon)) {\n isMinimal = false;\n break;\n }\n if (isSubsetOf(siphon, existing)) {\n toRemove.push(i);\n }\n }\n for (let i = toRemove.length - 1; i >= 0; i--) {\n siphons.splice(toRemove[i]!, 1);\n }\n if (isMinimal) {\n siphons.push(siphon);\n }\n }\n }\n\n return siphons;\n}\n\nfunction computeSiphonContaining(\n startPlace: number,\n flatNet: FlatNet,\n placeAsOutput: number[][],\n): Set<number> | null {\n const siphon = new Set<number>();\n siphon.add(startPlace);\n\n let changed = true;\n while (changed) {\n changed = false;\n const snapshot = [...siphon];\n\n for (const p of snapshot) {\n for (const t of placeAsOutput[p]!) {\n const ft = flatNet.transitions[t]!;\n\n let hasInputInSiphon = false;\n for (let q = 0; q < flatNet.places.length; q++) {\n if (ft.preVector[q]! > 0 && siphon.has(q)) {\n hasInputInSiphon = true;\n break;\n }\n }\n\n if (!hasInputInSiphon) {\n let added = false;\n for (let q = 0; q < flatNet.places.length; q++) {\n if (ft.preVector[q]! > 0) {\n if (!siphon.has(q)) {\n siphon.add(q);\n changed = true;\n }\n added = true;\n break;\n }\n }\n if (!added) {\n return null;\n }\n }\n }\n }\n }\n\n return siphon;\n}\n\n/**\n * Finds the maximal trap within a given set of places.\n * Uses fixed-point: start with the full set and remove places that violate the trap condition.\n */\nexport function findMaximalTrapIn(flatNet: FlatNet, places: ReadonlySet<number>): ReadonlySet<number> {\n const trap = new Set(places);\n\n let changed = true;\n while (changed) {\n changed = false;\n const toRemove: number[] = [];\n\n for (const p of trap) {\n let satisfies = true;\n for (let t = 0; t < flatNet.transitions.length; t++) {\n const ft = flatNet.transitions[t]!;\n if (ft.preVector[p]! > 0) {\n let outputsToTrap = false;\n for (const q of trap) {\n if (ft.postVector[q]! > 0) {\n outputsToTrap = true;\n break;\n }\n }\n if (!outputsToTrap) {\n satisfies = false;\n break;\n }\n }\n }\n if (!satisfies) {\n toRemove.push(p);\n }\n }\n\n if (toRemove.length > 0) {\n for (const p of toRemove) trap.delete(p);\n changed = true;\n }\n }\n\n return trap;\n}\n\nfunction isMarked(placeIndices: ReadonlySet<number>, flatNet: FlatNet, marking: MarkingState): boolean {\n for (const idx of placeIndices) {\n const place = flatNet.places[idx]!;\n if (marking.tokens(place) > 0) return true;\n }\n return false;\n}\n\nfunction setsEqual(a: ReadonlySet<number>, b: ReadonlySet<number>): boolean {\n if (a.size !== b.size) return false;\n for (const v of a) {\n if (!b.has(v)) return false;\n }\n return true;\n}\n\nfunction isSubsetOf(sub: ReadonlySet<number>, sup: ReadonlySet<number>): boolean {\n if (sub.size > sup.size) return false;\n for (const v of sub) {\n if (!sup.has(v)) return false;\n }\n return true;\n}\n","import type { Place } from '../core/place.js';\n\n/**\n * Safety properties that can be verified via IC3/PDR.\n *\n * Each property is encoded as an error condition: if a reachable state\n * violates the property, Spacer finds a counterexample. If no violation\n * is reachable, the property is proven.\n */\nexport type SmtProperty = DeadlockFree | MutualExclusion | PlaceBound | Unreachable;\n\n/** Deadlock-freedom: no reachable marking has all transitions disabled. */\nexport interface DeadlockFree {\n readonly type: 'deadlock-free';\n}\n\n/** Mutual exclusion: two places never have tokens simultaneously. */\nexport interface MutualExclusion {\n readonly type: 'mutual-exclusion';\n readonly p1: Place<any>;\n readonly p2: Place<any>;\n}\n\n/** Place bound: a place never exceeds a given token count. */\nexport interface PlaceBound {\n readonly type: 'place-bound';\n readonly place: Place<any>;\n readonly bound: number;\n}\n\n/** Unreachability: the given places never all have tokens simultaneously. */\nexport interface Unreachable {\n readonly type: 'unreachable';\n readonly places: ReadonlySet<Place<any>>;\n}\n\n// Factory functions\n\nexport function deadlockFree(): DeadlockFree {\n return { type: 'deadlock-free' };\n}\n\nexport function mutualExclusion(p1: Place<any>, p2: Place<any>): MutualExclusion {\n return { type: 'mutual-exclusion', p1, p2 };\n}\n\nexport function placeBound(place: Place<any>, bound: number): PlaceBound {\n return { type: 'place-bound', place, bound };\n}\n\nexport function unreachable(places: ReadonlySet<Place<any>>): Unreachable {\n return { type: 'unreachable', places: new Set(places) };\n}\n\n/** Human-readable description of a property. */\nexport function propertyDescription(prop: SmtProperty): string {\n switch (prop.type) {\n case 'deadlock-free':\n return 'Deadlock-freedom';\n case 'mutual-exclusion':\n return `Mutual exclusion of ${prop.p1.name} and ${prop.p2.name}`;\n case 'place-bound':\n return `Place ${prop.place.name} bounded by ${prop.bound}`;\n case 'unreachable':\n return `Unreachability of marking with tokens in {${[...prop.places].map(p => p.name).join(', ')}}`;\n }\n}\n","import type { MarkingState } from './marking-state.js';\nimport type { PInvariant } from './invariant/p-invariant.js';\n\n/**\n * Verification verdict.\n */\nexport type Verdict = Proven | Violated | Unknown;\n\n/** Property proven safe. No reachable state violates it. */\nexport interface Proven {\n readonly type: 'proven';\n readonly method: string;\n readonly inductiveInvariant: string | null;\n}\n\n/** Property violated. A counterexample trace is available. */\nexport interface Violated {\n readonly type: 'violated';\n}\n\n/** Could not determine. */\nexport interface Unknown {\n readonly type: 'unknown';\n readonly reason: string;\n}\n\n/**\n * Solver statistics.\n */\nexport interface SmtStatistics {\n readonly places: number;\n readonly transitions: number;\n readonly invariantsFound: number;\n readonly structuralResult: string;\n}\n\n/**\n * Result of SMT-based verification.\n */\nexport interface SmtVerificationResult {\n readonly verdict: Verdict;\n readonly report: string;\n readonly invariants: readonly PInvariant[];\n readonly discoveredInvariants: readonly string[];\n readonly counterexampleTrace: readonly MarkingState[];\n readonly counterexampleTransitions: readonly string[];\n readonly elapsedMs: number;\n readonly statistics: SmtStatistics;\n}\n\nexport function isProven(result: SmtVerificationResult): boolean {\n return result.verdict.type === 'proven';\n}\n\nexport function isViolated(result: SmtVerificationResult): boolean {\n return result.verdict.type === 'violated';\n}\n","import { init } from 'z3-solver';\nimport type { Bool, Expr, FuncDecl } from 'z3-solver';\n\n/**\n * Result of a Spacer query.\n */\nexport type QueryResult = QueryProven | QueryViolated | QueryUnknown;\n\n/** Property proven: no reachable error state (UNSAT). */\nexport interface QueryProven {\n readonly type: 'proven';\n readonly invariantFormula: string | null;\n readonly levelInvariants: readonly string[];\n}\n\n/** Counterexample found (SAT). The answer is the derivation tree. */\nexport interface QueryViolated {\n readonly type: 'violated';\n readonly answer: Expr | null;\n}\n\n/** Solver could not determine (timeout, resource limit). */\nexport interface QueryUnknown {\n readonly type: 'unknown';\n readonly reason: string;\n}\n\n/**\n * The Z3 context and helpers returned by SpacerRunner.create().\n * Exposes the context object for building expressions.\n */\nexport interface SpacerContext {\n /** The Z3 high-level context for building expressions. */\n readonly ctx: ReturnType<Awaited<ReturnType<typeof init>>['Context']>;\n /** The Z3 Fixedpoint solver instance (Spacer engine). Z3 types are complex; using any. */\n readonly fp: any;\n\n /** Queries whether the error state is reachable. */\n query(errorExpr: Bool, reachableDecl?: FuncDecl): Promise<QueryResult>;\n\n /** Releases Z3 resources. */\n dispose(): void;\n}\n\n// Use a type alias for the Z3 context to avoid the deep inference\ntype Z3Context = ReturnType<Awaited<ReturnType<typeof init>>['Context']>;\n\n/**\n * Creates a Spacer runner with the given timeout.\n *\n * Uses Z3's Spacer engine (CHC solver based on IC3/PDR) to prove or\n * disprove safety properties.\n */\nexport async function createSpacerRunner(timeoutMs: number): Promise<SpacerContext> {\n const { Context } = await init();\n const ctx = new Context('main') as Z3Context;\n const fp = new (ctx as any).Fixedpoint() as any;\n\n // Configure Spacer engine\n fp.set('engine', 'spacer');\n fp.set('spacer.global', true);\n fp.set('spacer.use_bg_invs', true);\n if (timeoutMs > 0) {\n fp.set('timeout', Math.min(timeoutMs, 2147483647));\n }\n\n async function query(errorExpr: Bool, reachableDecl?: FuncDecl): Promise<QueryResult> {\n try {\n const status = await fp.query(errorExpr);\n\n if (status === 'unsat') {\n let invariantFormula: string | null = null;\n const levelInvariants: string[] = [];\n\n try {\n const answer = fp.getAnswer();\n if (answer != null) {\n invariantFormula = answer.toString();\n }\n } catch {\n // Some configurations don't produce answers\n }\n\n if (reachableDecl != null) {\n try {\n const levels = fp.getNumLevels(reachableDecl);\n for (let i = 0; i < levels; i++) {\n const cover = fp.getCoverDelta(i, reachableDecl);\n if (cover != null && !(ctx as any).isTrue(cover)) {\n levelInvariants.push(`Level ${i}: ${cover.toString()}`);\n }\n }\n } catch {\n // Level queries may not be available\n }\n }\n\n return { type: 'proven', invariantFormula, levelInvariants };\n }\n\n if (status === 'sat') {\n let answer: Expr | null = null;\n try {\n answer = fp.getAnswer();\n } catch {\n // Some configurations don't produce answers\n }\n return { type: 'violated', answer };\n }\n\n // unknown\n return { type: 'unknown', reason: fp.getReasonUnknown() };\n } catch (e: any) {\n return { type: 'unknown', reason: `Z3 exception: ${e.message ?? e}` };\n }\n }\n\n function dispose(): void {\n try {\n fp.release();\n } catch {\n // ignore\n }\n }\n\n return {\n ctx,\n fp,\n query,\n dispose,\n } as SpacerContext;\n}\n","/**\n * @module smt-encoder\n *\n * Encodes a flattened Petri net as Constrained Horn Clauses (CHC) for Z3's Spacer engine.\n *\n * **CHC encoding strategy**: The net's state space is modeled as integer vectors\n * (one variable per place = token count). Three rule types:\n *\n * 1. **Init**: `Reachable(M0)` — the initial marking is reachable\n * 2. **Transition**: `Reachable(M') :- Reachable(M) ∧ enabled(M,t) ∧ fire(M,M',t)` —\n * one rule per flat transition (XOR branches are separate transitions)\n * 3. **Error**: `Error() :- Reachable(M) ∧ violation(M)` — safety property violation\n *\n * Transition rules include: non-negativity constraints on M', P-invariant strengthening\n * clauses, and environment bounds for bounded analysis.\n *\n * Z3 types are complex and partially untyped; the ctx/fp parameters use `any`.\n */\nimport type { Arith, Bool, FuncDecl } from 'z3-solver';\nimport type { FlatNet } from '../encoding/flat-net.js';\nimport type { FlatTransition } from '../encoding/flat-transition.js';\nimport type { MarkingState } from '../marking-state.js';\nimport type { SmtProperty } from '../smt-property.js';\nimport type { PInvariant } from '../invariant/p-invariant.js';\nimport type { Place } from '../../core/place.js';\nimport { flatNetIndexOf } from '../encoding/flat-net.js';\n\n/** Z3 high-level context. Typed as `any` because z3-solver's TS types are incomplete. */\ntype Z3Context = any;\n/** Z3 Fixedpoint solver instance. Typed as `any` because z3-solver's TS types are incomplete. */\ntype Z3Fixedpoint = any;\n\n/**\n * Result of CHC encoding.\n */\nexport interface EncodingResult {\n readonly errorExpr: Bool;\n readonly reachableDecl: FuncDecl;\n}\n\n/**\n * Encodes a flattened Petri net as Constrained Horn Clauses (CHC) for Z3's Spacer engine.\n *\n * CHC rules:\n * - Reachable(M0) — initial state is reachable\n * - Reachable(M') :- Reachable(M) AND enabled(M,t) AND fire(M,M',t) — transition rules\n * - Error() :- Reachable(M) AND property_violation(M) — safety property\n */\nexport function encode(\n ctx: Z3Context,\n fp: Z3Fixedpoint,\n flatNet: FlatNet,\n initialMarking: MarkingState,\n property: SmtProperty,\n invariants: readonly PInvariant[],\n sinkPlaces: ReadonlySet<Place<any>> = new Set(),\n): EncodingResult {\n const P = flatNet.places.length;\n const Int = ctx.Int;\n const Bool_ = ctx.Bool;\n\n // Create sorts array for function declaration\n const intSort = Int.sort();\n const boolSort = Bool_.sort();\n const markingSorts: any[] = new Array(P).fill(intSort);\n\n // Create the Reachable relation: (Int, Int, ...) -> Bool\n const reachable: FuncDecl = ctx.Function.declare('Reachable', ...markingSorts, boolSort);\n fp.registerRelation(reachable);\n\n // Create the Error relation: () -> Bool\n const error: FuncDecl = ctx.Function.declare('Error', boolSort);\n fp.registerRelation(error);\n\n // === Rule 1: Initial state ===\n // Reachable(m0_0, m0_1, ..., m0_{P-1})\n const m0Args: Arith[] = [];\n for (let i = 0; i < P; i++) {\n const tokens = initialMarking.tokens(flatNet.places[i]!);\n m0Args.push(Int.val(tokens));\n }\n const initFact = (reachable as any).call(...m0Args) as Bool;\n fp.addRule(initFact, 'init');\n\n // === Rule 2: Transition rules ===\n for (let t = 0; t < flatNet.transitions.length; t++) {\n const ft = flatNet.transitions[t]!;\n encodeTransitionRule(ctx, fp, reachable, ft, flatNet, invariants, P);\n }\n\n // === Rule 3: Error rule (property violation) ===\n encodeErrorRule(ctx, fp, reachable, error, flatNet, property, sinkPlaces, P);\n\n return {\n errorExpr: (error as any).call() as Bool,\n reachableDecl: reachable,\n };\n}\n\nfunction encodeTransitionRule(\n ctx: Z3Context,\n fp: Z3Fixedpoint,\n reachable: FuncDecl,\n ft: FlatTransition,\n flatNet: FlatNet,\n invariants: readonly PInvariant[],\n P: number,\n): void {\n const Int = ctx.Int;\n\n // Create named variables for current and next marking\n const mVars: Arith[] = [];\n const mPrimeVars: Arith[] = [];\n for (let i = 0; i < P; i++) {\n mVars.push(Int.const(`m${i}`));\n mPrimeVars.push(Int.const(`mp${i}`));\n }\n\n // Body: Reachable(M) AND enabled(M,t) AND fire(M,M',t) AND non-negativity(M') AND invariants(M') AND env bounds(M')\n const reachBody = (reachable as any).call(...mVars) as Bool;\n const enabled = encodeEnabled(ctx, ft, flatNet, mVars, P);\n const fireRelation = encodeFire(ctx, ft, flatNet, mVars, mPrimeVars, P);\n\n // Non-negativity of M'\n let nonNeg: Bool = ctx.Bool.val(true);\n for (let i = 0; i < P; i++) {\n nonNeg = ctx.And(nonNeg, mPrimeVars[i]!.ge(0));\n }\n\n // P-invariant constraints on M'\n const invConstraints = encodeInvariantConstraints(ctx, invariants, mPrimeVars, P);\n\n // Environment bounds on M'\n let envBounds: Bool = ctx.Bool.val(true);\n for (const [name, bound] of flatNet.environmentBounds) {\n const idx = flatNet.placeIndex.get(name);\n if (idx != null) {\n envBounds = ctx.And(envBounds, mPrimeVars[idx]!.le(bound));\n }\n }\n\n // Body conjunction\n const body = ctx.And(reachBody, enabled, fireRelation, nonNeg, invConstraints, envBounds);\n\n // Head: Reachable(M')\n const head = (reachable as any).call(...mPrimeVars) as Bool;\n\n // Rule: forall M, M'. body => head\n const allVars = [...mVars, ...mPrimeVars];\n const rule = ctx.Implies(body, head);\n const qRule = ctx.ForAll(allVars, rule);\n\n fp.addRule(qRule, `t_${ft.name}`);\n}\n\nfunction encodeEnabled(\n ctx: Z3Context,\n ft: FlatTransition,\n _flatNet: FlatNet,\n mVars: Arith[],\n P: number,\n): Bool {\n let result: Bool = ctx.Bool.val(true);\n\n // Input requirements: M[p] >= pre[p]\n for (let p = 0; p < P; p++) {\n if (ft.preVector[p]! > 0) {\n result = ctx.And(result, mVars[p]!.ge(ft.preVector[p]!));\n }\n }\n\n // Read arcs: M[p] >= 1\n for (const p of ft.readPlaces) {\n result = ctx.And(result, mVars[p]!.ge(1));\n }\n\n // Inhibitor arcs: M[p] == 0\n for (const p of ft.inhibitorPlaces) {\n result = ctx.And(result, mVars[p]!.eq(0));\n }\n\n // Non-negativity of current marking\n for (let p = 0; p < P; p++) {\n result = ctx.And(result, mVars[p]!.ge(0));\n }\n\n return result;\n}\n\nfunction encodeFire(\n ctx: Z3Context,\n ft: FlatTransition,\n _flatNet: FlatNet,\n mVars: Arith[],\n mPrimeVars: Arith[],\n P: number,\n): Bool {\n let result: Bool = ctx.Bool.val(true);\n\n for (let p = 0; p < P; p++) {\n const isReset = ft.resetPlaces.includes(p);\n\n if (isReset || ft.consumeAll[p]) {\n // Reset/consumeAll: M'[p] = post[p]\n result = ctx.And(result, mPrimeVars[p]!.eq(ft.postVector[p]!));\n } else {\n // Standard: M'[p] = M[p] - pre[p] + post[p]\n const delta = ft.postVector[p]! - ft.preVector[p]!;\n if (delta === 0) {\n result = ctx.And(result, mPrimeVars[p]!.eq(mVars[p]!));\n } else {\n result = ctx.And(result, mPrimeVars[p]!.eq(mVars[p]!.add(delta)));\n }\n }\n }\n\n return result;\n}\n\nfunction encodeErrorRule(\n ctx: Z3Context,\n fp: Z3Fixedpoint,\n reachable: FuncDecl,\n error: FuncDecl,\n flatNet: FlatNet,\n property: SmtProperty,\n sinkPlaces: ReadonlySet<Place<any>>,\n P: number,\n): void {\n const Int = ctx.Int;\n\n // Create variables for the error rule\n const mVars: Arith[] = [];\n for (let i = 0; i < P; i++) {\n mVars.push(Int.const(`em${i}`));\n }\n\n const reachBody = (reachable as any).call(...mVars) as Bool;\n const violation = encodePropertyViolation(ctx, flatNet, property, sinkPlaces, mVars, P);\n\n const head = (error as any).call() as Bool;\n const body = ctx.And(reachBody, violation);\n const rule = ctx.Implies(body, head);\n const qRule = ctx.ForAll(mVars, rule);\n\n fp.addRule(qRule, `error_${property.type}`);\n}\n\nfunction encodePropertyViolation(\n ctx: Z3Context,\n flatNet: FlatNet,\n property: SmtProperty,\n sinkPlaces: ReadonlySet<Place<any>>,\n mVars: Arith[],\n P: number,\n): Bool {\n switch (property.type) {\n case 'deadlock-free': {\n const deadlock = encodeDeadlock(ctx, flatNet, mVars, P);\n if (sinkPlaces.size > 0) {\n // Deadlock is only a violation if NOT at any expected sink place\n let notAtSink: Bool = ctx.Bool.val(true);\n for (const sink of sinkPlaces) {\n const idx = flatNetIndexOf(flatNet, sink);\n if (idx >= 0) {\n notAtSink = ctx.And(notAtSink, mVars[idx]!.eq(0));\n }\n }\n return ctx.And(deadlock, notAtSink);\n }\n return deadlock;\n }\n\n case 'mutual-exclusion': {\n const idx1 = flatNetIndexOf(flatNet, property.p1);\n const idx2 = flatNetIndexOf(flatNet, property.p2);\n if (idx1 < 0) throw new Error(`MutualExclusion references unknown place: ${property.p1.name}`);\n if (idx2 < 0) throw new Error(`MutualExclusion references unknown place: ${property.p2.name}`);\n return ctx.And(mVars[idx1]!.ge(1), mVars[idx2]!.ge(1));\n }\n\n case 'place-bound': {\n const idx = flatNetIndexOf(flatNet, property.place);\n if (idx < 0) throw new Error(`PlaceBound references unknown place: ${property.place.name}`);\n return mVars[idx]!.gt(property.bound);\n }\n\n case 'unreachable': {\n let allMarked: Bool = ctx.Bool.val(true);\n for (const place of property.places) {\n const idx = flatNetIndexOf(flatNet, place);\n if (idx >= 0) {\n allMarked = ctx.And(allMarked, mVars[idx]!.ge(1));\n }\n }\n return allMarked;\n }\n }\n}\n\n/** Encodes the deadlock condition: no transition is enabled. */\nfunction encodeDeadlock(\n ctx: Z3Context,\n flatNet: FlatNet,\n mVars: Arith[],\n P: number,\n): Bool {\n let deadlock: Bool = ctx.Bool.val(true);\n\n for (const ft of flatNet.transitions) {\n const enabled = encodeEnabled(ctx, ft, flatNet, mVars, P);\n deadlock = ctx.And(deadlock, ctx.Not(enabled));\n }\n\n return deadlock;\n}\n\nfunction encodeInvariantConstraints(\n ctx: Z3Context,\n invariants: readonly PInvariant[],\n mVars: Arith[],\n P: number,\n): Bool {\n let result: Bool = ctx.Bool.val(true);\n\n for (const inv of invariants) {\n // sum(y_i * M[i]) == constant\n let sum: Arith = ctx.Int.val(0);\n for (const idx of inv.support) {\n if (idx < P) {\n sum = sum.add(mVars[idx]!.mul(inv.weights[idx]!));\n }\n }\n result = ctx.And(result, sum.eq(inv.constant));\n }\n\n return result;\n}\n","import type { Expr } from 'z3-solver';\nimport { MarkingState } from '../marking-state.js';\nimport type { FlatNet } from '../encoding/flat-net.js';\n\n/**\n * Result of counterexample decoding.\n */\nexport interface DecodedTrace {\n readonly trace: readonly MarkingState[];\n readonly transitions: readonly string[];\n}\n\n/**\n * Decodes Z3 Spacer counterexample answers into Petri net marking traces.\n *\n * When Spacer finds a counterexample (property violation), it produces\n * a derivation tree showing how the error state is reachable. This function\n * extracts the marking at each step to produce a human-readable trace.\n */\nexport function decode(ctx: any, answer: Expr | null, flatNet: FlatNet): DecodedTrace {\n const trace: MarkingState[] = [];\n const transitions: string[] = [];\n\n if (answer == null) {\n return { trace, transitions };\n }\n\n try {\n extractTrace(ctx, answer, flatNet, trace, transitions);\n } catch {\n // Z3 answer format varies; gracefully degrade\n }\n\n return { trace, transitions };\n}\n\n/**\n * Recursively traverses the Z3 proof tree to extract marking states.\n */\nfunction extractTrace(\n ctx: any,\n expr: any,\n flatNet: FlatNet,\n trace: MarkingState[],\n transitions: string[],\n): void {\n if (expr == null) return;\n\n // Check if this is a function application\n if (!ctx.isApp(expr)) return;\n\n let name: string;\n try {\n const decl = expr.decl();\n name = String(decl.name());\n } catch {\n return;\n }\n\n // Check if this is a Reachable application with integer arguments\n const P = flatNet.places.length;\n if (name === 'Reachable') {\n const numArgs = expr.numArgs();\n if (numArgs === P) {\n const marking = extractMarking(ctx, expr, flatNet);\n if (marking != null) {\n trace.push(marking);\n }\n }\n }\n\n // Recurse into children to find the derivation chain\n try {\n const numArgs = expr.numArgs();\n for (let i = 0; i < numArgs; i++) {\n const child = expr.arg(i);\n extractTrace(ctx, child, flatNet, trace, transitions);\n }\n } catch {\n // Not all expressions support arg()\n }\n\n // Try to extract transition name from rule application\n if (name.startsWith('t_')) {\n transitions.push(name.substring(2));\n }\n}\n\n/**\n * Extracts a MarkingState from a Reachable(...) application.\n */\nfunction extractMarking(ctx: any, reachableApp: any, flatNet: FlatNet): MarkingState | null {\n const P = flatNet.places.length;\n if (reachableApp.numArgs() !== P) return null;\n\n const builder = MarkingState.builder();\n for (let i = 0; i < P; i++) {\n const arg = reachableApp.arg(i);\n if (ctx.isIntVal(arg)) {\n const tokens = Number(arg.value());\n if (tokens > 0) {\n builder.tokens(flatNet.places[i]!, tokens);\n }\n } else {\n // Non-concrete value in counterexample\n return null;\n }\n }\n return builder.build();\n}\n","import type { PetriNet } from '../core/petri-net.js';\nimport type { EnvironmentPlace, Place } from '../core/place.js';\nimport { MarkingState, MarkingStateBuilder } from './marking-state.js';\nimport type { SmtProperty } from './smt-property.js';\nimport { deadlockFree, propertyDescription } from './smt-property.js';\nimport type { SmtVerificationResult, SmtStatistics, Verdict } from './smt-verification-result.js';\nimport type { PInvariant } from './invariant/p-invariant.js';\nimport type { FlatNet } from './encoding/flat-net.js';\nimport { flatten, type EnvironmentAnalysisMode, unbounded } from './encoding/net-flattener.js';\nimport { IncidenceMatrix } from './encoding/incidence-matrix.js';\nimport { computePInvariants, isCoveredByInvariants } from './invariant/p-invariant-computer.js';\nimport { structuralCheck } from './invariant/structural-check.js';\nimport { createSpacerRunner } from './z3/spacer-runner.js';\nimport { encode } from './z3/smt-encoder.js';\nimport { decode } from './z3/counterexample-decoder.js';\n\n/**\n * IC3/PDR-based safety verifier for Petri nets using Z3's Spacer engine.\n *\n * Proves safety properties (especially deadlock-freedom) without\n * enumerating all reachable states. IC3 constructs inductive invariants\n * incrementally, which works well for bounded nets.\n *\n * Key design decisions:\n * - Operates on the marking projection (integer vectors) — no timing\n * - An untimed deadlock-freedom proof is stronger than needed\n * (timing can only restrict behavior)\n * - Guards are ignored — over-approximation is sound for safety properties\n * - If a counterexample is found, it may be spurious in timed/guarded\n * semantics — the report notes this\n *\n * Verification Pipeline:\n * 1. Flatten — expand XOR, index places, build pre/post vectors\n * 2. Structural pre-check — siphon/trap analysis (may prove early)\n * 3. P-invariants — compute conservation laws for strengthening\n * 4. SMT encode + query — IC3/PDR via Z3 Spacer\n * 5. Decode result — proof or counterexample trace\n */\nexport class SmtVerifier {\n private _initialMarking: MarkingState = MarkingState.empty();\n private _property: SmtProperty = deadlockFree();\n private readonly _environmentPlaces = new Set<EnvironmentPlace<any>>();\n private readonly _sinkPlaces = new Set<Place<any>>();\n private _environmentMode: EnvironmentAnalysisMode = unbounded();\n private _timeoutMs: number = 60_000;\n\n private constructor(private readonly net: PetriNet) {}\n\n static forNet(net: PetriNet): SmtVerifier {\n return new SmtVerifier(net);\n }\n\n initialMarking(marking: MarkingState): this;\n initialMarking(configurator: (builder: MarkingStateBuilder) => void): this;\n initialMarking(arg: MarkingState | ((builder: MarkingStateBuilder) => void)): this {\n if (arg instanceof MarkingState) {\n this._initialMarking = arg;\n } else {\n const builder = MarkingState.builder();\n arg(builder);\n this._initialMarking = builder.build();\n }\n return this;\n }\n\n property(property: SmtProperty): this {\n this._property = property;\n return this;\n }\n\n environmentPlaces(...places: EnvironmentPlace<any>[]): this {\n for (const p of places) this._environmentPlaces.add(p);\n return this;\n }\n\n environmentMode(mode: EnvironmentAnalysisMode): this {\n this._environmentMode = mode;\n return this;\n }\n\n /**\n * Declares expected sink (terminal) places for deadlock-freedom analysis.\n * Markings where any sink place has a token are not considered deadlocks.\n */\n sinkPlaces(...places: Place<any>[]): this {\n for (const p of places) this._sinkPlaces.add(p);\n return this;\n }\n\n timeout(ms: number): this {\n this._timeoutMs = ms;\n return this;\n }\n\n /**\n * Runs the verification pipeline.\n */\n async verify(): Promise<SmtVerificationResult> {\n const start = performance.now();\n const report: string[] = [];\n report.push('=== IC3/PDR SAFETY VERIFICATION ===\\n');\n report.push(`Net: ${this.net.name}`);\n const propDesc = this._sinkPlaces.size === 0\n ? propertyDescription(this._property)\n : `${propertyDescription(this._property)} (sinks: ${[...this._sinkPlaces].map(p => p.name).join(', ')})`;\n report.push(`Property: ${propDesc}`);\n report.push(`Timeout: ${(this._timeoutMs / 1000).toFixed(0)}s\\n`);\n\n // Phase 1: Flatten\n report.push('Phase 1: Flattening net...');\n const flatNet = flatten(this.net, this._environmentPlaces, this._environmentMode);\n report.push(` Places: ${flatNet.places.length}`);\n report.push(` Transitions (expanded): ${flatNet.transitions.length}`);\n if (flatNet.environmentBounds.size > 0) {\n report.push(` Environment bounds: ${flatNet.environmentBounds.size} places`);\n }\n report.push('');\n\n // Phase 2: Structural pre-check\n report.push('Phase 2: Structural pre-check (siphon/trap)...');\n const structResult = structuralCheck(flatNet, this._initialMarking);\n let structResultStr: string;\n switch (structResult.type) {\n case 'no-potential-deadlock':\n structResultStr = 'no potential deadlock';\n break;\n case 'potential-deadlock':\n structResultStr = `potential deadlock (siphon: {${[...structResult.siphon].join(',')}})`;\n break;\n case 'inconclusive':\n structResultStr = `inconclusive (${structResult.reason})`;\n break;\n }\n report.push(` Result: ${structResultStr}\\n`);\n\n // If structural check proves deadlock-freedom for DeadlockFree property\n // (only valid when no sink places — structural check doesn't account for sinks)\n if (\n this._property.type === 'deadlock-free' &&\n this._sinkPlaces.size === 0 &&\n structResult.type === 'no-potential-deadlock'\n ) {\n report.push('=== RESULT ===\\n');\n report.push('PROVEN (structural): Deadlock-freedom verified by Commoner\\'s theorem.');\n report.push(' All siphons contain initially marked traps.');\n return buildResult(\n { type: 'proven', method: 'structural', inductiveInvariant: null },\n report.join('\\n'), [], [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: 0, structuralResult: structResultStr },\n );\n }\n\n // Phase 3: P-invariants\n report.push('Phase 3: Computing P-invariants...');\n const matrix = IncidenceMatrix.from(flatNet);\n const invariants = computePInvariants(matrix, flatNet, this._initialMarking);\n report.push(` Found: ${invariants.length} P-invariant(s)`);\n const structurallyBounded = isCoveredByInvariants(invariants, flatNet.places.length);\n report.push(` Structurally bounded: ${structurallyBounded ? 'YES' : 'NO'}`);\n for (const inv of invariants) {\n report.push(` ${formatInvariant(inv, flatNet)}`);\n }\n report.push('');\n\n // Phase 4: SMT encode + query via Spacer\n report.push('Phase 4: IC3/PDR verification via Z3 Spacer...');\n\n let runner;\n try {\n runner = await createSpacerRunner(this._timeoutMs);\n } catch (e: any) {\n report.push(` ERROR: ${e.message ?? e}\\n`);\n report.push('=== RESULT ===\\n');\n report.push(`UNKNOWN: Z3 initialization error: ${e.message ?? e}`);\n return buildResult(\n { type: 'unknown', reason: `Z3 init error: ${e.message ?? e}` },\n report.join('\\n'), invariants, [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n\n try {\n const encoding = encode(runner.ctx, runner.fp, flatNet, this._initialMarking, this._property, invariants, this._sinkPlaces);\n const queryResult = await runner.query(encoding.errorExpr, encoding.reachableDecl);\n\n switch (queryResult.type) {\n case 'proven': {\n report.push(' Status: UNSAT (property holds)\\n');\n\n // Decode IC3-synthesized invariants with place name substitution\n const discoveredInvariants: string[] = [];\n if (queryResult.invariantFormula != null) {\n discoveredInvariants.push(substituteNames(queryResult.invariantFormula, flatNet));\n }\n for (const level of queryResult.levelInvariants) {\n discoveredInvariants.push(substituteNames(level, flatNet));\n }\n\n // Phase 5: Inductive invariant\n if (discoveredInvariants.length > 0) {\n report.push('Phase 5: Inductive invariant (discovered by IC3)');\n report.push(` Spacer synthesized: ${discoveredInvariants[0]}`);\n report.push(' This formula is INDUCTIVE: preserved by all transitions.');\n if (discoveredInvariants.length > 1) {\n report.push(' Per-level clauses:');\n for (let i = 1; i < discoveredInvariants.length; i++) {\n report.push(` ${discoveredInvariants[i]}`);\n }\n }\n report.push('');\n }\n\n report.push('=== RESULT ===\\n');\n report.push(`PROVEN (IC3/PDR): ${propDesc}`);\n report.push(' Z3 Spacer proved no reachable state violates the property.');\n report.push(' NOTE: Verification ignores timing constraints and JS guards.');\n report.push(' An untimed proof is STRONGER than a timed one (timing only restricts behavior).');\n\n return buildResult(\n {\n type: 'proven',\n method: 'IC3/PDR',\n inductiveInvariant: queryResult.invariantFormula != null\n ? substituteNames(queryResult.invariantFormula, flatNet)\n : null,\n },\n report.join('\\n'), invariants, discoveredInvariants, [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n\n case 'violated': {\n report.push(' Status: SAT (counterexample found)\\n');\n\n const decoded = decode(runner.ctx, queryResult.answer, flatNet);\n\n report.push('=== RESULT ===\\n');\n report.push(`VIOLATED: ${propDesc}`);\n if (decoded.trace.length > 0) {\n report.push(` Counterexample trace (${decoded.trace.length} states):`);\n for (let i = 0; i < decoded.trace.length; i++) {\n report.push(` ${i}: ${decoded.trace[i]}`);\n }\n }\n if (decoded.transitions.length > 0) {\n report.push(` Firing sequence: ${decoded.transitions.join(' -> ')}`);\n }\n report.push('\\n WARNING: This counterexample is in UNTIMED semantics.');\n report.push(' It may be spurious if timing constraints prevent this sequence.');\n report.push(' JS guards are also ignored in this analysis.');\n\n return buildResult(\n { type: 'violated' },\n report.join('\\n'), invariants, [], decoded.trace as MarkingState[], decoded.transitions as string[],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n\n case 'unknown': {\n report.push(` Status: UNKNOWN (${queryResult.reason})\\n`);\n report.push('=== RESULT ===\\n');\n report.push(`UNKNOWN: Could not determine ${propDesc}`);\n report.push(` Reason: ${queryResult.reason}`);\n\n return buildResult(\n { type: 'unknown', reason: queryResult.reason },\n report.join('\\n'), invariants, [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n }\n } catch (e: any) {\n report.push(` ERROR: ${e.message ?? e}\\n`);\n report.push('=== RESULT ===\\n');\n report.push(`UNKNOWN: Z3 solver error: ${e.message ?? e}`);\n\n return buildResult(\n { type: 'unknown', reason: `Z3 error: ${e.message ?? e}` },\n report.join('\\n'), invariants, [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n } finally {\n runner.dispose();\n }\n }\n}\n\n/**\n * Substitutes Z3 variable names (m0, m1, ...) with place names in a formula string.\n */\nfunction substituteNames(formula: string, flatNet: FlatNet): string {\n // Replace from highest index first to avoid m1 matching inside m10\n for (let i = flatNet.places.length - 1; i >= 0; i--) {\n formula = formula.replace(new RegExp(`\\\\bm${i}\\\\b`, 'g'), flatNet.places[i]!.name);\n }\n return formula;\n}\n\nfunction formatInvariant(inv: PInvariant, flatNet: FlatNet): string {\n const parts: string[] = [];\n for (const idx of inv.support) {\n if (inv.weights[idx] !== 1) {\n parts.push(`${inv.weights[idx]}*${flatNet.places[idx]!.name}`);\n } else {\n parts.push(flatNet.places[idx]!.name);\n }\n }\n return `${parts.join(' + ')} = ${inv.constant}`;\n}\n\nfunction buildResult(\n verdict: Verdict,\n report: string,\n invariants: readonly PInvariant[],\n discoveredInvariants: readonly string[],\n trace: readonly MarkingState[],\n transitions: readonly string[],\n elapsedMs: number,\n statistics: SmtStatistics,\n): SmtVerificationResult {\n return { verdict, report, invariants, discoveredInvariants, counterexampleTrace: trace, counterexampleTransitions: transitions, elapsedMs, statistics };\n}\n"],"mappings":";;;;;;AAGA,IAAM,oBAAoB,uBAAO,uBAAuB;AAQjD,IAAM,eAAN,MAAM,cAAa;AAAA,EACP;AAAA,EACA;AAAA;AAAA,EAGjB,YAAY,KAAa,aAAkC,cAAuC;AAChG,QAAI,QAAQ,kBAAmB,OAAM,IAAI,MAAM,gDAAgD;AAC/F,SAAK,cAAc;AACnB,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA,EAGA,OAAO,OAA2B;AAChC,WAAO,KAAK,YAAY,IAAI,MAAM,IAAI,KAAK;AAAA,EAC7C;AAAA;AAAA,EAGA,UAAU,OAA4B;AACpC,WAAO,KAAK,OAAO,KAAK,IAAI;AAAA,EAC9B;AAAA;AAAA,EAGA,eAAe,QAAuC;AACpD,eAAW,KAAK,QAAQ;AACtB,UAAI,KAAK,UAAU,CAAC,EAAG,QAAO;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,mBAAiC;AAC/B,WAAO,CAAC,GAAG,KAAK,aAAa,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA,EAGA,cAAsB;AACpB,QAAI,MAAM;AACV,eAAW,SAAS,KAAK,YAAY,OAAO,EAAG,QAAO;AACtD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAmB;AACjB,WAAO,KAAK,YAAY,SAAS;AAAA,EACnC;AAAA,EAEA,WAAmB;AACjB,QAAI,KAAK,YAAY,SAAS,EAAG,QAAO;AACxC,UAAM,UAAU,CAAC,GAAG,KAAK,YAAY,QAAQ,CAAC,EAC3C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EACrC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE;AAC5C,WAAO,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC/B;AAAA,EAEA,OAAO,QAAsB;AAC3B,WAAO,IAAI,cAAa,mBAAmB,oBAAI,IAAI,GAAG,oBAAI,IAAI,CAAC;AAAA,EACjE;AAAA,EAEA,OAAO,UAA+B;AACpC,WAAO,IAAI,oBAAoB;AAAA,EACjC;AACF;AAEO,IAAM,sBAAN,MAA0B;AAAA,EACd,cAAc,oBAAI,IAAoB;AAAA,EACtC,eAAe,oBAAI,IAAwB;AAAA;AAAA,EAG5D,OAAO,OAAmB,OAAqB;AAC7C,QAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,mCAAmC,KAAK,EAAE;AACzE,QAAI,QAAQ,GAAG;AACb,WAAK,YAAY,IAAI,MAAM,MAAM,KAAK;AACtC,WAAK,aAAa,IAAI,MAAM,MAAM,KAAK;AAAA,IACzC,OAAO;AACL,WAAK,YAAY,OAAO,MAAM,IAAI;AAClC,WAAK,aAAa,OAAO,MAAM,IAAI;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,OAAmB,OAAqB;AAChD,QAAI,QAAQ,EAAG,OAAM,IAAI,MAAM,mCAAmC,KAAK,EAAE;AACzE,QAAI,QAAQ,GAAG;AACb,YAAM,UAAU,KAAK,YAAY,IAAI,MAAM,IAAI,KAAK;AACpD,WAAK,YAAY,IAAI,MAAM,MAAM,UAAU,KAAK;AAChD,WAAK,aAAa,IAAI,MAAM,MAAM,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAsB;AACpB,WAAO,IAAI,aAAa,mBAAmB,IAAI,IAAI,KAAK,WAAW,GAAG,IAAI,IAAI,KAAK,YAAY,CAAC;AAAA,EAClG;AACF;;;AC5EO,SAAS,eACd,MACA,QACA,aACA,WACA,YACA,iBACA,YACA,aACA,YACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChCO,SAAS,kBAAkB,KAAsB;AACtD,SAAO,IAAI,OAAO;AACpB;AAEO,SAAS,uBAAuB,KAAsB;AAC3D,SAAO,IAAI,YAAY;AACzB;AAEO,SAAS,eAAe,KAAc,OAA2B;AACtE,SAAO,IAAI,WAAW,IAAI,MAAM,IAAI,KAAK;AAC3C;;;AClBO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACN,KACA,MACA,WACA,gBACA,WACA;AACA,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAK,SAAmC;AAC7C,UAAM,IAAI,QAAQ,YAAY;AAC9B,UAAM,IAAI,QAAQ,OAAO;AAEzB,UAAM,MAAkB,CAAC;AACzB,UAAM,OAAmB,CAAC;AAC1B,UAAM,YAAwB,CAAC;AAE/B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,QAAQ,YAAY,CAAC;AAChC,YAAM,SAAS,IAAI,MAAc,CAAC;AAClC,YAAM,UAAU,IAAI,MAAc,CAAC;AACnC,YAAM,SAAS,IAAI,MAAc,CAAC;AAElC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAO,CAAC,IAAI,GAAG,UAAU,CAAC;AAC1B,gBAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;AAC5B,eAAO,CAAC,IAAI,QAAQ,CAAC,IAAK,OAAO,CAAC;AAAA,MACpC;AAEA,UAAI,KAAK,MAAM;AACf,WAAK,KAAK,OAAO;AACjB,gBAAU,KAAK,MAAM;AAAA,IACvB;AAEA,WAAO,IAAI,iBAAgB,KAAK,MAAM,WAAW,GAAG,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAkC;AAChC,UAAM,KAAiB,CAAC;AACxB,aAAS,IAAI,GAAG,IAAI,KAAK,YAAY,KAAK;AACxC,YAAM,MAAM,IAAI,MAAc,KAAK,eAAe;AAClD,eAAS,IAAI,GAAG,IAAI,KAAK,iBAAiB,KAAK;AAC7C,YAAI,CAAC,IAAI,KAAK,WAAW,CAAC,EAAG,CAAC;AAAA,MAChC;AACA,SAAG,KAAK,GAAG;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAsC;AAAE,WAAO,KAAK;AAAA,EAAM;AAAA;AAAA,EAG1D,OAAuC;AAAE,WAAO,KAAK;AAAA,EAAO;AAAA;AAAA,EAG5D,YAA4C;AAAE,WAAO,KAAK;AAAA,EAAY;AAAA,EAEtE,iBAAyB;AAAE,WAAO,KAAK;AAAA,EAAiB;AAAA,EACxD,YAAoB;AAAE,WAAO,KAAK;AAAA,EAAY;AAChD;;;AC1DO,SAAS,YAAqC;AACnD,SAAO,EAAE,MAAM,YAAY;AAC7B;AAEO,SAAS,QAAQ,WAA4C;AAClE,SAAO,EAAE,MAAM,WAAW,UAAU;AACtC;AAYO,SAAS,QACd,KACA,oBAAgD,oBAAI,IAAI,GACxD,kBAA2C,UAAU,GAC5C;AAET,QAAM,eAAe,oBAAI,IAAwB;AACjD,aAAW,KAAK,IAAI,QAAQ;AAC1B,iBAAa,IAAI,EAAE,MAAM,CAAC;AAAA,EAC5B;AACA,aAAW,KAAK,IAAI,aAAa;AAC/B,eAAW,UAAU,EAAE,YAAY;AACjC,mBAAa,IAAI,OAAO,MAAM,MAAM,OAAO,KAAK;AAAA,IAClD;AACA,QAAI,EAAE,eAAe,MAAM;AACzB,iBAAW,KAAK,UAAa,EAAE,UAAU,GAAG;AAC1C,qBAAa,IAAI,EAAE,MAAM,CAAC;AAAA,MAC5B;AAAA,IACF;AACA,eAAW,OAAO,EAAE,WAAY,cAAa,IAAI,IAAI,MAAM,MAAM,IAAI,KAAK;AAC1E,eAAW,OAAO,EAAE,MAAO,cAAa,IAAI,IAAI,MAAM,MAAM,IAAI,KAAK;AACrE,eAAW,OAAO,EAAE,OAAQ,cAAa,IAAI,IAAI,MAAM,MAAM,IAAI,KAAK;AAAA,EACxE;AAGA,QAAM,SAAS,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAErF,QAAM,aAAa,oBAAI,IAAoB;AAC3C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAW,IAAI,OAAO,CAAC,EAAG,MAAM,CAAC;AAAA,EACnC;AAGA,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,MAAI,gBAAgB,SAAS,WAAW;AACtC,eAAW,MAAM,mBAAmB;AAClC,wBAAkB,IAAI,GAAG,MAAM,MAAM,gBAAgB,SAAS;AAAA,IAChE;AAAA,EACF;AAGA,QAAM,IAAI,OAAO;AACjB,QAAM,kBAAkB,CAAC;AAEzB,aAAW,cAAc,IAAI,aAAa;AACxC,UAAM,WAAW,wBAAwB,UAAU;AAEnD,aAAS,YAAY,GAAG,YAAY,SAAS,QAAQ,aAAa;AAChE,YAAM,eAAe,SAAS,SAAS;AACvC,YAAM,OAAO,SAAS,SAAS,IAC3B,GAAG,WAAW,IAAI,KAAK,SAAS,KAChC,WAAW;AAGf,YAAM,YAAY,IAAI,MAAc,CAAC,EAAE,KAAK,CAAC;AAC7C,YAAM,aAAa,IAAI,MAAe,CAAC,EAAE,KAAK,KAAK;AAEnD,iBAAW,UAAU,WAAW,YAAY;AAC1C,cAAM,MAAM,WAAW,IAAI,OAAO,MAAM,IAAI;AAC5C,YAAI,QAAQ,OAAW;AAEvB,gBAAQ,OAAO,MAAM;AAAA,UACnB,KAAK;AACH,sBAAU,GAAG,IAAI;AACjB;AAAA,UACF,KAAK;AACH,sBAAU,GAAG,IAAI,OAAO;AACxB;AAAA,UACF,KAAK;AACH,sBAAU,GAAG,IAAI;AACjB,uBAAW,GAAG,IAAI;AAClB;AAAA,UACF,KAAK;AACH,sBAAU,GAAG,IAAI,OAAO;AACxB,uBAAW,GAAG,IAAI;AAClB;AAAA,QACJ;AAAA,MACF;AAGA,YAAM,aAAa,IAAI,MAAc,CAAC,EAAE,KAAK,CAAC;AAC9C,iBAAW,KAAK,cAAc;AAC5B,cAAM,MAAM,WAAW,IAAI,EAAE,IAAI;AACjC,YAAI,QAAQ,QAAW;AACrB,qBAAW,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAGA,YAAM,kBAAkB,WAAW,WAChC,IAAI,SAAO,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,EACzC,OAAO,CAAC,QAAuB,QAAQ,MAAS;AAGnD,YAAM,aAAa,WAAW,MAC3B,IAAI,SAAO,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,EACzC,OAAO,CAAC,QAAuB,QAAQ,MAAS;AAGnD,YAAM,cAAc,WAAW,OAC5B,IAAI,SAAO,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,EACzC,OAAO,CAAC,QAAuB,QAAQ,MAAS;AAEnD,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA,SAAS,SAAS,IAAI,YAAY;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,GAA0D;AACzF,MAAI,EAAE,eAAe,MAAM;AACzB,WAAO,kBAAkB,EAAE,UAAU;AAAA,EACvC;AAEA,SAAO,CAAC,oBAAI,IAAI,CAAC;AACnB;;;AClKO,SAAS,WAAW,SAAmB,UAAkB,SAAkC;AAChG,SAAO,EAAE,SAAS,UAAU,QAAQ;AACtC;AAEO,SAAS,mBAAmB,KAAyB;AAC1D,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,IAAI,SAAS;AAC3B,QAAI,IAAI,QAAQ,CAAC,MAAM,GAAG;AACxB,YAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE;AAAA,IACtC,OAAO;AACL,YAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACpB;AAAA,EACF;AACA,SAAO,cAAc,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,QAAQ;AAC1D;;;ACGO,SAAS,mBACd,QACA,SACA,gBACc;AACd,QAAM,IAAI,OAAO,UAAU;AAC3B,QAAM,IAAI,OAAO,eAAe;AAEhC,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO,CAAC;AAKhC,QAAM,KAAK,OAAO,oBAAoB;AAItC,QAAM,OAAO,IAAI;AACjB,QAAM,YAAwB,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,IAAI,MAAc,IAAI,EAAE,KAAK,CAAC;AAC1C,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,CAAC,IAAI,GAAG,CAAC,EAAG,CAAC;AAAA,IACnB;AACA,QAAI,IAAI,CAAC,IAAI;AACb,cAAU,KAAK,GAAG;AAAA,EACpB;AAGA,MAAI,WAAW;AACf,WAAS,MAAM,GAAG,MAAM,KAAK,WAAW,GAAG,OAAO;AAEhD,QAAI,QAAQ;AACZ,aAAS,MAAM,UAAU,MAAM,GAAG,OAAO;AACvC,UAAI,UAAU,GAAG,EAAG,GAAG,MAAM,GAAG;AAC9B,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,GAAI;AAGlB,QAAI,UAAU,UAAU;AACtB,YAAM,MAAM,UAAU,QAAQ;AAC9B,gBAAU,QAAQ,IAAI,UAAU,KAAK;AACrC,gBAAU,KAAK,IAAI;AAAA,IACrB;AAGA,aAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,UAAI,QAAQ,YAAY,UAAU,GAAG,EAAG,GAAG,MAAM,EAAG;AAEpD,YAAM,IAAI,UAAU,QAAQ,EAAG,GAAG;AAClC,YAAM,IAAI,UAAU,GAAG,EAAG,GAAG;AAG7B,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,kBAAU,GAAG,EAAG,CAAC,IAAI,IAAI,UAAU,GAAG,EAAG,CAAC,IAAK,IAAI,UAAU,QAAQ,EAAG,CAAC;AAAA,MAC3E;AAGA,mBAAa,UAAU,GAAG,GAAI,IAAI;AAAA,IACpC;AAEA;AAAA,EACF;AAGA,QAAM,aAA2B,CAAC;AAClC,WAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,QAAI,SAAS;AACb,aAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,UAAI,UAAU,GAAG,EAAG,GAAG,MAAM,GAAG;AAC9B,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,OAAQ;AAGb,UAAM,UAAU,IAAI,MAAc,CAAC;AACnC,QAAI,iBAAiB;AACrB,QAAI,cAAc;AAElB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAQ,CAAC,IAAI,UAAU,GAAG,EAAG,IAAI,CAAC;AAClC,UAAI,QAAQ,CAAC,IAAK,GAAG;AACnB,yBAAiB;AACjB;AAAA,MACF;AACA,UAAI,QAAQ,CAAC,IAAK,EAAG,eAAc;AAAA,IACrC;AAGA,QAAI,CAAC,gBAAgB;AAEnB,UAAI,iBAAiB;AACrB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAI,UAAU,GAAG,EAAG,IAAI,CAAC,IAAK,GAAG;AAC/B,2BAAiB;AACjB;AAAA,QACF;AAAA,MACF;AACA,UAAI,gBAAgB;AAClB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,kBAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,EAAG,IAAI,CAAC;AAAA,QACrC;AACA,sBAAc;AACd,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB,CAAC,YAAa;AAGrC,QAAI,IAAI;AACR,eAAW,KAAK,SAAS;AACvB,UAAI,IAAI,EAAG,KAAI,IAAI,GAAG,CAAC;AAAA,IACzB;AACA,QAAI,IAAI,GAAG;AACT,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,gBAAQ,CAAC,IAAI,QAAQ,CAAC,IAAK;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,QAAQ,CAAC,MAAM,GAAG;AACpB,gBAAQ,IAAI,CAAC;AACb,cAAM,QAAQ,QAAQ,OAAO,CAAC;AAC9B,oBAAY,QAAQ,CAAC,IAAK,eAAe,OAAO,KAAK;AAAA,MACvD;AAAA,IACF;AAEA,eAAW,KAAK,WAAW,SAAS,UAAU,OAAO,CAAC;AAAA,EACxD;AAEA,SAAO;AACT;AAMO,SAAS,sBAAsB,YAAmC,WAA4B;AACnG,QAAM,UAAU,IAAI,MAAe,SAAS,EAAE,KAAK,KAAK;AACxD,aAAW,OAAO,YAAY;AAC5B,eAAW,OAAO,IAAI,SAAS;AAC7B,UAAI,MAAM,UAAW,SAAQ,GAAG,IAAI;AAAA,IACtC;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,OAAK,CAAC;AAC7B;AAEA,SAAS,aAAa,KAAe,MAAoB;AACvD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,QAAI,IAAI,CAAC,MAAM,GAAG;AAChB,UAAI,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,CAAE,CAAC;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,IAAI,GAAG;AACT,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAI,CAAC,IAAI,IAAI,CAAC,IAAK;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,IAAI,GAAW,GAAmB;AACzC,SAAO,MAAM,GAAG;AACd,UAAM,IAAI;AACV,QAAI,IAAI;AACR,QAAI;AAAA,EACN;AACA,SAAO;AACT;;;AC3LA,IAAM,iCAAiC;AAsBhC,SAAS,gBAAgB,SAAkB,gBAAqD;AACrG,QAAM,IAAI,QAAQ,OAAO;AAEzB,MAAI,MAAM,GAAG;AACX,WAAO,EAAE,MAAM,wBAAwB;AAAA,EACzC;AAEA,MAAI,IAAI,gCAAgC;AACtC,WAAO,EAAE,MAAM,gBAAgB,QAAQ,WAAW,CAAC,sCAAsC;AAAA,EAC3F;AAEA,QAAM,UAAU,mBAAmB,OAAO;AAE1C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,MAAM,wBAAwB;AAAA,EACzC;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,kBAAkB,SAAS,MAAM;AAE9C,QAAI,KAAK,SAAS,KAAK,CAAC,SAAS,MAAM,SAAS,cAAc,GAAG;AAC/D,aAAO,EAAE,MAAM,sBAAsB,OAAO;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,wBAAwB;AACzC;AAMO,SAAS,mBAAmB,SAAyC;AAC1E,QAAM,IAAI,QAAQ,OAAO;AACzB,QAAM,UAAyB,CAAC;AAGhC,QAAM,gBAA4B,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,kBAAc,KAAK,CAAC,CAAC;AAAA,EACvB;AAEA,WAAS,IAAI,GAAG,IAAI,QAAQ,YAAY,QAAQ,KAAK;AACnD,UAAM,KAAK,QAAQ,YAAY,CAAC;AAChC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,GAAG,WAAW,CAAC,IAAK,GAAG;AACzB,sBAAc,CAAC,EAAG,KAAK,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,WAAS,aAAa,GAAG,aAAa,GAAG,cAAc;AACrD,UAAM,SAAS,wBAAwB,YAAY,SAAS,aAAa;AACzE,QAAI,WAAW,QAAQ,OAAO,OAAO,GAAG;AACtC,UAAI,YAAY;AAChB,YAAM,WAAqB,CAAC;AAC5B,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAM,WAAW,QAAQ,CAAC;AAC1B,YAAI,UAAU,UAAU,MAAM,GAAG;AAC/B,sBAAY;AACZ;AAAA,QACF;AACA,YAAI,WAAW,UAAU,MAAM,GAAG;AAChC,sBAAY;AACZ;AAAA,QACF;AACA,YAAI,WAAW,QAAQ,QAAQ,GAAG;AAChC,mBAAS,KAAK,CAAC;AAAA,QACjB;AAAA,MACF;AACA,eAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,gBAAQ,OAAO,SAAS,CAAC,GAAI,CAAC;AAAA,MAChC;AACA,UAAI,WAAW;AACb,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,YACA,SACA,eACoB;AACpB,QAAM,SAAS,oBAAI,IAAY;AAC/B,SAAO,IAAI,UAAU;AAErB,MAAI,UAAU;AACd,SAAO,SAAS;AACd,cAAU;AACV,UAAM,WAAW,CAAC,GAAG,MAAM;AAE3B,eAAW,KAAK,UAAU;AACxB,iBAAW,KAAK,cAAc,CAAC,GAAI;AACjC,cAAM,KAAK,QAAQ,YAAY,CAAC;AAEhC,YAAI,mBAAmB;AACvB,iBAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,QAAQ,KAAK;AAC9C,cAAI,GAAG,UAAU,CAAC,IAAK,KAAK,OAAO,IAAI,CAAC,GAAG;AACzC,+BAAmB;AACnB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,kBAAkB;AACrB,cAAI,QAAQ;AACZ,mBAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,QAAQ,KAAK;AAC9C,gBAAI,GAAG,UAAU,CAAC,IAAK,GAAG;AACxB,kBAAI,CAAC,OAAO,IAAI,CAAC,GAAG;AAClB,uBAAO,IAAI,CAAC;AACZ,0BAAU;AAAA,cACZ;AACA,sBAAQ;AACR;AAAA,YACF;AAAA,UACF;AACA,cAAI,CAAC,OAAO;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,kBAAkB,SAAkB,QAAkD;AACpG,QAAM,OAAO,IAAI,IAAI,MAAM;AAE3B,MAAI,UAAU;AACd,SAAO,SAAS;AACd,cAAU;AACV,UAAM,WAAqB,CAAC;AAE5B,eAAW,KAAK,MAAM;AACpB,UAAI,YAAY;AAChB,eAAS,IAAI,GAAG,IAAI,QAAQ,YAAY,QAAQ,KAAK;AACnD,cAAM,KAAK,QAAQ,YAAY,CAAC;AAChC,YAAI,GAAG,UAAU,CAAC,IAAK,GAAG;AACxB,cAAI,gBAAgB;AACpB,qBAAW,KAAK,MAAM;AACpB,gBAAI,GAAG,WAAW,CAAC,IAAK,GAAG;AACzB,8BAAgB;AAChB;AAAA,YACF;AAAA,UACF;AACA,cAAI,CAAC,eAAe;AAClB,wBAAY;AACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,WAAW;AACd,iBAAS,KAAK,CAAC;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,iBAAW,KAAK,SAAU,MAAK,OAAO,CAAC;AACvC,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,cAAmC,SAAkB,SAAgC;AACrG,aAAW,OAAO,cAAc;AAC9B,UAAM,QAAQ,QAAQ,OAAO,GAAG;AAChC,QAAI,QAAQ,OAAO,KAAK,IAAI,EAAG,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,UAAU,GAAwB,GAAiC;AAC1E,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,aAAW,KAAK,GAAG;AACjB,QAAI,CAAC,EAAE,IAAI,CAAC,EAAG,QAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAA0B,KAAmC;AAC/E,MAAI,IAAI,OAAO,IAAI,KAAM,QAAO;AAChC,aAAW,KAAK,KAAK;AACnB,QAAI,CAAC,IAAI,IAAI,CAAC,EAAG,QAAO;AAAA,EAC1B;AACA,SAAO;AACT;;;AC9MO,SAAS,eAA6B;AAC3C,SAAO,EAAE,MAAM,gBAAgB;AACjC;AAEO,SAAS,gBAAgB,IAAgB,IAAiC;AAC/E,SAAO,EAAE,MAAM,oBAAoB,IAAI,GAAG;AAC5C;AAEO,SAAS,WAAW,OAAmB,OAA2B;AACvE,SAAO,EAAE,MAAM,eAAe,OAAO,MAAM;AAC7C;AAEO,SAAS,YAAY,QAA8C;AACxE,SAAO,EAAE,MAAM,eAAe,QAAQ,IAAI,IAAI,MAAM,EAAE;AACxD;AAGO,SAAS,oBAAoB,MAA2B;AAC7D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,uBAAuB,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,IAAI;AAAA,IAChE,KAAK;AACH,aAAO,SAAS,KAAK,MAAM,IAAI,eAAe,KAAK,KAAK;AAAA,IAC1D,KAAK;AACH,aAAO,6CAA6C,CAAC,GAAG,KAAK,MAAM,EAAE,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,EACpG;AACF;;;AChBO,SAAS,SAAS,QAAwC;AAC/D,SAAO,OAAO,QAAQ,SAAS;AACjC;AAEO,SAAS,WAAW,QAAwC;AACjE,SAAO,OAAO,QAAQ,SAAS;AACjC;;;ACxDA,SAAS,YAAY;AAqDrB,eAAsB,mBAAmB,WAA2C;AAClF,QAAM,EAAE,QAAQ,IAAI,MAAM,KAAK;AAC/B,QAAM,MAAM,IAAI,QAAQ,MAAM;AAC9B,QAAM,KAAK,IAAK,IAAY,WAAW;AAGvC,KAAG,IAAI,UAAU,QAAQ;AACzB,KAAG,IAAI,iBAAiB,IAAI;AAC5B,KAAG,IAAI,sBAAsB,IAAI;AACjC,MAAI,YAAY,GAAG;AACjB,OAAG,IAAI,WAAW,KAAK,IAAI,WAAW,UAAU,CAAC;AAAA,EACnD;AAEA,iBAAe,MAAM,WAAiB,eAAgD;AACpF,QAAI;AACF,YAAM,SAAS,MAAM,GAAG,MAAM,SAAS;AAEvC,UAAI,WAAW,SAAS;AACtB,YAAI,mBAAkC;AACtC,cAAM,kBAA4B,CAAC;AAEnC,YAAI;AACF,gBAAM,SAAS,GAAG,UAAU;AAC5B,cAAI,UAAU,MAAM;AAClB,+BAAmB,OAAO,SAAS;AAAA,UACrC;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,YAAI,iBAAiB,MAAM;AACzB,cAAI;AACF,kBAAM,SAAS,GAAG,aAAa,aAAa;AAC5C,qBAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,oBAAM,QAAQ,GAAG,cAAc,GAAG,aAAa;AAC/C,kBAAI,SAAS,QAAQ,CAAE,IAAY,OAAO,KAAK,GAAG;AAChD,gCAAgB,KAAK,SAAS,CAAC,KAAK,MAAM,SAAS,CAAC,EAAE;AAAA,cACxD;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,UAAU,kBAAkB,gBAAgB;AAAA,MAC7D;AAEA,UAAI,WAAW,OAAO;AACpB,YAAI,SAAsB;AAC1B,YAAI;AACF,mBAAS,GAAG,UAAU;AAAA,QACxB,QAAQ;AAAA,QAER;AACA,eAAO,EAAE,MAAM,YAAY,OAAO;AAAA,MACpC;AAGA,aAAO,EAAE,MAAM,WAAW,QAAQ,GAAG,iBAAiB,EAAE;AAAA,IAC1D,SAAS,GAAQ;AACf,aAAO,EAAE,MAAM,WAAW,QAAQ,iBAAiB,EAAE,WAAW,CAAC,GAAG;AAAA,IACtE;AAAA,EACF;AAEA,WAAS,UAAgB;AACvB,QAAI;AACF,SAAG,QAAQ;AAAA,IACb,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnFO,SAAS,OACd,KACA,IACA,SACA,gBACA,UACA,YACA,aAAsC,oBAAI,IAAI,GAC9B;AAChB,QAAM,IAAI,QAAQ,OAAO;AACzB,QAAM,MAAM,IAAI;AAChB,QAAM,QAAQ,IAAI;AAGlB,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,WAAW,MAAM,KAAK;AAC5B,QAAM,eAAsB,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO;AAGrD,QAAM,YAAsB,IAAI,SAAS,QAAQ,aAAa,GAAG,cAAc,QAAQ;AACvF,KAAG,iBAAiB,SAAS;AAG7B,QAAM,QAAkB,IAAI,SAAS,QAAQ,SAAS,QAAQ;AAC9D,KAAG,iBAAiB,KAAK;AAIzB,QAAM,SAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,SAAS,eAAe,OAAO,QAAQ,OAAO,CAAC,CAAE;AACvD,WAAO,KAAK,IAAI,IAAI,MAAM,CAAC;AAAA,EAC7B;AACA,QAAM,WAAY,UAAkB,KAAK,GAAG,MAAM;AAClD,KAAG,QAAQ,UAAU,MAAM;AAG3B,WAAS,IAAI,GAAG,IAAI,QAAQ,YAAY,QAAQ,KAAK;AACnD,UAAM,KAAK,QAAQ,YAAY,CAAC;AAChC,yBAAqB,KAAK,IAAI,WAAW,IAAI,SAAS,YAAY,CAAC;AAAA,EACrE;AAGA,kBAAgB,KAAK,IAAI,WAAW,OAAO,SAAS,UAAU,YAAY,CAAC;AAE3E,SAAO;AAAA,IACL,WAAY,MAAc,KAAK;AAAA,IAC/B,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,qBACP,KACA,IACA,WACA,IACA,SACA,YACA,GACM;AACN,QAAM,MAAM,IAAI;AAGhB,QAAM,QAAiB,CAAC;AACxB,QAAM,aAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;AAC7B,eAAW,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,EACrC;AAGA,QAAM,YAAa,UAAkB,KAAK,GAAG,KAAK;AAClD,QAAM,UAAU,cAAc,KAAK,IAAI,SAAS,OAAO,CAAC;AACxD,QAAM,eAAe,WAAW,KAAK,IAAI,SAAS,OAAO,YAAY,CAAC;AAGtE,MAAI,SAAe,IAAI,KAAK,IAAI,IAAI;AACpC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,IAAI,QAAQ,WAAW,CAAC,EAAG,GAAG,CAAC,CAAC;AAAA,EAC/C;AAGA,QAAM,iBAAiB,2BAA2B,KAAK,YAAY,YAAY,CAAC;AAGhF,MAAI,YAAkB,IAAI,KAAK,IAAI,IAAI;AACvC,aAAW,CAAC,MAAM,KAAK,KAAK,QAAQ,mBAAmB;AACrD,UAAM,MAAM,QAAQ,WAAW,IAAI,IAAI;AACvC,QAAI,OAAO,MAAM;AACf,kBAAY,IAAI,IAAI,WAAW,WAAW,GAAG,EAAG,GAAG,KAAK,CAAC;AAAA,IAC3D;AAAA,EACF;AAGA,QAAM,OAAO,IAAI,IAAI,WAAW,SAAS,cAAc,QAAQ,gBAAgB,SAAS;AAGxF,QAAM,OAAQ,UAAkB,KAAK,GAAG,UAAU;AAGlD,QAAM,UAAU,CAAC,GAAG,OAAO,GAAG,UAAU;AACxC,QAAM,OAAO,IAAI,QAAQ,MAAM,IAAI;AACnC,QAAM,QAAQ,IAAI,OAAO,SAAS,IAAI;AAEtC,KAAG,QAAQ,OAAO,KAAK,GAAG,IAAI,EAAE;AAClC;AAEA,SAAS,cACP,KACA,IACA,UACA,OACA,GACM;AACN,MAAI,SAAe,IAAI,KAAK,IAAI,IAAI;AAGpC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,GAAG,UAAU,CAAC,IAAK,GAAG;AACxB,eAAS,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAG,GAAG,GAAG,UAAU,CAAC,CAAE,CAAC;AAAA,IACzD;AAAA,EACF;AAGA,aAAW,KAAK,GAAG,YAAY;AAC7B,aAAS,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAG,GAAG,CAAC,CAAC;AAAA,EAC1C;AAGA,aAAW,KAAK,GAAG,iBAAiB;AAClC,aAAS,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAG,GAAG,CAAC,CAAC;AAAA,EAC1C;AAGA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAG,GAAG,CAAC,CAAC;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,SAAS,WACP,KACA,IACA,UACA,OACA,YACA,GACM;AACN,MAAI,SAAe,IAAI,KAAK,IAAI,IAAI;AAEpC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,UAAU,GAAG,YAAY,SAAS,CAAC;AAEzC,QAAI,WAAW,GAAG,WAAW,CAAC,GAAG;AAE/B,eAAS,IAAI,IAAI,QAAQ,WAAW,CAAC,EAAG,GAAG,GAAG,WAAW,CAAC,CAAE,CAAC;AAAA,IAC/D,OAAO;AAEL,YAAM,QAAQ,GAAG,WAAW,CAAC,IAAK,GAAG,UAAU,CAAC;AAChD,UAAI,UAAU,GAAG;AACf,iBAAS,IAAI,IAAI,QAAQ,WAAW,CAAC,EAAG,GAAG,MAAM,CAAC,CAAE,CAAC;AAAA,MACvD,OAAO;AACL,iBAAS,IAAI,IAAI,QAAQ,WAAW,CAAC,EAAG,GAAG,MAAM,CAAC,EAAG,IAAI,KAAK,CAAC,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,KACA,IACA,WACA,OACA,SACA,UACA,YACA,GACM;AACN,QAAM,MAAM,IAAI;AAGhB,QAAM,QAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,EAChC;AAEA,QAAM,YAAa,UAAkB,KAAK,GAAG,KAAK;AAClD,QAAM,YAAY,wBAAwB,KAAK,SAAS,UAAU,YAAY,OAAO,CAAC;AAEtF,QAAM,OAAQ,MAAc,KAAK;AACjC,QAAM,OAAO,IAAI,IAAI,WAAW,SAAS;AACzC,QAAM,OAAO,IAAI,QAAQ,MAAM,IAAI;AACnC,QAAM,QAAQ,IAAI,OAAO,OAAO,IAAI;AAEpC,KAAG,QAAQ,OAAO,SAAS,SAAS,IAAI,EAAE;AAC5C;AAEA,SAAS,wBACP,KACA,SACA,UACA,YACA,OACA,GACM;AACN,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,iBAAiB;AACpB,YAAM,WAAW,eAAe,KAAK,SAAS,OAAO,CAAC;AACtD,UAAI,WAAW,OAAO,GAAG;AAEvB,YAAI,YAAkB,IAAI,KAAK,IAAI,IAAI;AACvC,mBAAW,QAAQ,YAAY;AAC7B,gBAAM,MAAM,eAAe,SAAS,IAAI;AACxC,cAAI,OAAO,GAAG;AACZ,wBAAY,IAAI,IAAI,WAAW,MAAM,GAAG,EAAG,GAAG,CAAC,CAAC;AAAA,UAClD;AAAA,QACF;AACA,eAAO,IAAI,IAAI,UAAU,SAAS;AAAA,MACpC;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,oBAAoB;AACvB,YAAM,OAAO,eAAe,SAAS,SAAS,EAAE;AAChD,YAAM,OAAO,eAAe,SAAS,SAAS,EAAE;AAChD,UAAI,OAAO,EAAG,OAAM,IAAI,MAAM,6CAA6C,SAAS,GAAG,IAAI,EAAE;AAC7F,UAAI,OAAO,EAAG,OAAM,IAAI,MAAM,6CAA6C,SAAS,GAAG,IAAI,EAAE;AAC7F,aAAO,IAAI,IAAI,MAAM,IAAI,EAAG,GAAG,CAAC,GAAG,MAAM,IAAI,EAAG,GAAG,CAAC,CAAC;AAAA,IACvD;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,MAAM,eAAe,SAAS,SAAS,KAAK;AAClD,UAAI,MAAM,EAAG,OAAM,IAAI,MAAM,wCAAwC,SAAS,MAAM,IAAI,EAAE;AAC1F,aAAO,MAAM,GAAG,EAAG,GAAG,SAAS,KAAK;AAAA,IACtC;AAAA,IAEA,KAAK,eAAe;AAClB,UAAI,YAAkB,IAAI,KAAK,IAAI,IAAI;AACvC,iBAAW,SAAS,SAAS,QAAQ;AACnC,cAAM,MAAM,eAAe,SAAS,KAAK;AACzC,YAAI,OAAO,GAAG;AACZ,sBAAY,IAAI,IAAI,WAAW,MAAM,GAAG,EAAG,GAAG,CAAC,CAAC;AAAA,QAClD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,SAAS,eACP,KACA,SACA,OACA,GACM;AACN,MAAI,WAAiB,IAAI,KAAK,IAAI,IAAI;AAEtC,aAAW,MAAM,QAAQ,aAAa;AACpC,UAAM,UAAU,cAAc,KAAK,IAAI,SAAS,OAAO,CAAC;AACxD,eAAW,IAAI,IAAI,UAAU,IAAI,IAAI,OAAO,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,KACA,YACA,OACA,GACM;AACN,MAAI,SAAe,IAAI,KAAK,IAAI,IAAI;AAEpC,aAAW,OAAO,YAAY;AAE5B,QAAI,MAAa,IAAI,IAAI,IAAI,CAAC;AAC9B,eAAW,OAAO,IAAI,SAAS;AAC7B,UAAI,MAAM,GAAG;AACX,cAAM,IAAI,IAAI,MAAM,GAAG,EAAG,IAAI,IAAI,QAAQ,GAAG,CAAE,CAAC;AAAA,MAClD;AAAA,IACF;AACA,aAAS,IAAI,IAAI,QAAQ,IAAI,GAAG,IAAI,QAAQ,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;;;AC9TO,SAAS,OAAO,KAAU,QAAqB,SAAgC;AACpF,QAAM,QAAwB,CAAC;AAC/B,QAAM,cAAwB,CAAC;AAE/B,MAAI,UAAU,MAAM;AAClB,WAAO,EAAE,OAAO,YAAY;AAAA,EAC9B;AAEA,MAAI;AACF,iBAAa,KAAK,QAAQ,SAAS,OAAO,WAAW;AAAA,EACvD,QAAQ;AAAA,EAER;AAEA,SAAO,EAAE,OAAO,YAAY;AAC9B;AAKA,SAAS,aACP,KACA,MACA,SACA,OACA,aACM;AACN,MAAI,QAAQ,KAAM;AAGlB,MAAI,CAAC,IAAI,MAAM,IAAI,EAAG;AAEtB,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO,OAAO,KAAK,KAAK,CAAC;AAAA,EAC3B,QAAQ;AACN;AAAA,EACF;AAGA,QAAM,IAAI,QAAQ,OAAO;AACzB,MAAI,SAAS,aAAa;AACxB,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,YAAY,GAAG;AACjB,YAAM,UAAU,eAAe,KAAK,MAAM,OAAO;AACjD,UAAI,WAAW,MAAM;AACnB,cAAM,KAAK,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,UAAU,KAAK,QAAQ;AAC7B,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,mBAAa,KAAK,OAAO,SAAS,OAAO,WAAW;AAAA,IACtD;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI,KAAK,WAAW,IAAI,GAAG;AACzB,gBAAY,KAAK,KAAK,UAAU,CAAC,CAAC;AAAA,EACpC;AACF;AAKA,SAAS,eAAe,KAAU,cAAmB,SAAuC;AAC1F,QAAM,IAAI,QAAQ,OAAO;AACzB,MAAI,aAAa,QAAQ,MAAM,EAAG,QAAO;AAEzC,QAAM,UAAU,aAAa,QAAQ;AACrC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,aAAa,IAAI,CAAC;AAC9B,QAAI,IAAI,SAAS,GAAG,GAAG;AACrB,YAAM,SAAS,OAAO,IAAI,MAAM,CAAC;AACjC,UAAI,SAAS,GAAG;AACd,gBAAQ,OAAO,QAAQ,OAAO,CAAC,GAAI,MAAM;AAAA,MAC3C;AAAA,IACF,OAAO;AAEL,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,QAAQ,MAAM;AACvB;;;ACvEO,IAAM,cAAN,MAAM,aAAY;AAAA,EAQf,YAA6B,KAAe;AAAf;AAAA,EAAgB;AAAA,EAP7C,kBAAgC,aAAa,MAAM;AAAA,EACnD,YAAyB,aAAa;AAAA,EAC7B,qBAAqB,oBAAI,IAA2B;AAAA,EACpD,cAAc,oBAAI,IAAgB;AAAA,EAC3C,mBAA4C,UAAU;AAAA,EACtD,aAAqB;AAAA,EAI7B,OAAO,OAAO,KAA4B;AACxC,WAAO,IAAI,aAAY,GAAG;AAAA,EAC5B;AAAA,EAIA,eAAe,KAAoE;AACjF,QAAI,eAAe,cAAc;AAC/B,WAAK,kBAAkB;AAAA,IACzB,OAAO;AACL,YAAM,UAAU,aAAa,QAAQ;AACrC,UAAI,OAAO;AACX,WAAK,kBAAkB,QAAQ,MAAM;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,UAA6B;AACpC,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,QAAuC;AAC1D,eAAW,KAAK,OAAQ,MAAK,mBAAmB,IAAI,CAAC;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,MAAqC;AACnD,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,QAA4B;AACxC,eAAW,KAAK,OAAQ,MAAK,YAAY,IAAI,CAAC;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,IAAkB;AACxB,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAyC;AAC7C,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,SAAmB,CAAC;AAC1B,WAAO,KAAK,uCAAuC;AACnD,WAAO,KAAK,QAAQ,KAAK,IAAI,IAAI,EAAE;AACnC,UAAM,WAAW,KAAK,YAAY,SAAS,IACvC,oBAAoB,KAAK,SAAS,IAClC,GAAG,oBAAoB,KAAK,SAAS,CAAC,YAAY,CAAC,GAAG,KAAK,WAAW,EAAE,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AACvG,WAAO,KAAK,aAAa,QAAQ,EAAE;AACnC,WAAO,KAAK,aAAa,KAAK,aAAa,KAAM,QAAQ,CAAC,CAAC;AAAA,CAAK;AAGhE,WAAO,KAAK,4BAA4B;AACxC,UAAM,UAAU,QAAQ,KAAK,KAAK,KAAK,oBAAoB,KAAK,gBAAgB;AAChF,WAAO,KAAK,aAAa,QAAQ,OAAO,MAAM,EAAE;AAChD,WAAO,KAAK,6BAA6B,QAAQ,YAAY,MAAM,EAAE;AACrE,QAAI,QAAQ,kBAAkB,OAAO,GAAG;AACtC,aAAO,KAAK,yBAAyB,QAAQ,kBAAkB,IAAI,SAAS;AAAA,IAC9E;AACA,WAAO,KAAK,EAAE;AAGd,WAAO,KAAK,gDAAgD;AAC5D,UAAM,eAAe,gBAAgB,SAAS,KAAK,eAAe;AAClE,QAAI;AACJ,YAAQ,aAAa,MAAM;AAAA,MACzB,KAAK;AACH,0BAAkB;AAClB;AAAA,MACF,KAAK;AACH,0BAAkB,gCAAgC,CAAC,GAAG,aAAa,MAAM,EAAE,KAAK,GAAG,CAAC;AACpF;AAAA,MACF,KAAK;AACH,0BAAkB,iBAAiB,aAAa,MAAM;AACtD;AAAA,IACJ;AACA,WAAO,KAAK,aAAa,eAAe;AAAA,CAAI;AAI5C,QACE,KAAK,UAAU,SAAS,mBACxB,KAAK,YAAY,SAAS,KAC1B,aAAa,SAAS,yBACtB;AACA,aAAO,KAAK,kBAAkB;AAC9B,aAAO,KAAK,uEAAwE;AACpF,aAAO,KAAK,+CAA+C;AAC3D,aAAO;AAAA,QACL,EAAE,MAAM,UAAU,QAAQ,cAAc,oBAAoB,KAAK;AAAA,QACjE,OAAO,KAAK,IAAI;AAAA,QAAG,CAAC;AAAA,QAAG,CAAC;AAAA,QAAG,CAAC;AAAA,QAAG,CAAC;AAAA,QAChC,YAAY,IAAI,IAAI;AAAA,QACpB,EAAE,QAAQ,QAAQ,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,iBAAiB,GAAG,kBAAkB,gBAAgB;AAAA,MAClI;AAAA,IACF;AAGA,WAAO,KAAK,oCAAoC;AAChD,UAAM,SAAS,gBAAgB,KAAK,OAAO;AAC3C,UAAM,aAAa,mBAAmB,QAAQ,SAAS,KAAK,eAAe;AAC3E,WAAO,KAAK,YAAY,WAAW,MAAM,iBAAiB;AAC1D,UAAM,sBAAsB,sBAAsB,YAAY,QAAQ,OAAO,MAAM;AACnF,WAAO,KAAK,2BAA2B,sBAAsB,QAAQ,IAAI,EAAE;AAC3E,eAAW,OAAO,YAAY;AAC5B,aAAO,KAAK,KAAK,gBAAgB,KAAK,OAAO,CAAC,EAAE;AAAA,IAClD;AACA,WAAO,KAAK,EAAE;AAGd,WAAO,KAAK,gDAAgD;AAE5D,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,mBAAmB,KAAK,UAAU;AAAA,IACnD,SAAS,GAAQ;AACf,aAAO,KAAK,YAAY,EAAE,WAAW,CAAC;AAAA,CAAI;AAC1C,aAAO,KAAK,kBAAkB;AAC9B,aAAO,KAAK,qCAAqC,EAAE,WAAW,CAAC,EAAE;AACjE,aAAO;AAAA,QACL,EAAE,MAAM,WAAW,QAAQ,kBAAkB,EAAE,WAAW,CAAC,GAAG;AAAA,QAC9D,OAAO,KAAK,IAAI;AAAA,QAAG;AAAA,QAAY,CAAC;AAAA,QAAG,CAAC;AAAA,QAAG,CAAC;AAAA,QACxC,YAAY,IAAI,IAAI;AAAA,QACpB,EAAE,QAAQ,QAAQ,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,iBAAiB,WAAW,QAAQ,kBAAkB,gBAAgB;AAAA,MAClJ;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,OAAO,OAAO,KAAK,OAAO,IAAI,SAAS,KAAK,iBAAiB,KAAK,WAAW,YAAY,KAAK,WAAW;AAC1H,YAAM,cAAc,MAAM,OAAO,MAAM,SAAS,WAAW,SAAS,aAAa;AAEjF,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK,UAAU;AACb,iBAAO,KAAK,oCAAoC;AAGhD,gBAAM,uBAAiC,CAAC;AACxC,cAAI,YAAY,oBAAoB,MAAM;AACxC,iCAAqB,KAAK,gBAAgB,YAAY,kBAAkB,OAAO,CAAC;AAAA,UAClF;AACA,qBAAW,SAAS,YAAY,iBAAiB;AAC/C,iCAAqB,KAAK,gBAAgB,OAAO,OAAO,CAAC;AAAA,UAC3D;AAGA,cAAI,qBAAqB,SAAS,GAAG;AACnC,mBAAO,KAAK,kDAAkD;AAC9D,mBAAO,KAAK,yBAAyB,qBAAqB,CAAC,CAAC,EAAE;AAC9D,mBAAO,KAAK,4DAA4D;AACxE,gBAAI,qBAAqB,SAAS,GAAG;AACnC,qBAAO,KAAK,sBAAsB;AAClC,uBAAS,IAAI,GAAG,IAAI,qBAAqB,QAAQ,KAAK;AACpD,uBAAO,KAAK,OAAO,qBAAqB,CAAC,CAAC,EAAE;AAAA,cAC9C;AAAA,YACF;AACA,mBAAO,KAAK,EAAE;AAAA,UAChB;AAEA,iBAAO,KAAK,kBAAkB;AAC9B,iBAAO,KAAK,qBAAqB,QAAQ,EAAE;AAC3C,iBAAO,KAAK,8DAA8D;AAC1E,iBAAO,KAAK,gEAAgE;AAC5E,iBAAO,KAAK,mFAAmF;AAE/F,iBAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,oBAAoB,YAAY,oBAAoB,OAChD,gBAAgB,YAAY,kBAAkB,OAAO,IACrD;AAAA,YACN;AAAA,YACA,OAAO,KAAK,IAAI;AAAA,YAAG;AAAA,YAAY;AAAA,YAAsB,CAAC;AAAA,YAAG,CAAC;AAAA,YAC1D,YAAY,IAAI,IAAI;AAAA,YACpB,EAAE,QAAQ,QAAQ,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,iBAAiB,WAAW,QAAQ,kBAAkB,gBAAgB;AAAA,UAClJ;AAAA,QACF;AAAA,QAEA,KAAK,YAAY;AACf,iBAAO,KAAK,wCAAwC;AAEpD,gBAAM,UAAU,OAAO,OAAO,KAAK,YAAY,QAAQ,OAAO;AAE9D,iBAAO,KAAK,kBAAkB;AAC9B,iBAAO,KAAK,aAAa,QAAQ,EAAE;AACnC,cAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,mBAAO,KAAK,2BAA2B,QAAQ,MAAM,MAAM,WAAW;AACtE,qBAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,QAAQ,KAAK;AAC7C,qBAAO,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAC,EAAE;AAAA,YAC7C;AAAA,UACF;AACA,cAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,mBAAO,KAAK,sBAAsB,QAAQ,YAAY,KAAK,MAAM,CAAC,EAAE;AAAA,UACtE;AACA,iBAAO,KAAK,2DAA2D;AACvE,iBAAO,KAAK,mEAAmE;AAC/E,iBAAO,KAAK,gDAAgD;AAE5D,iBAAO;AAAA,YACL,EAAE,MAAM,WAAW;AAAA,YACnB,OAAO,KAAK,IAAI;AAAA,YAAG;AAAA,YAAY,CAAC;AAAA,YAAG,QAAQ;AAAA,YAAyB,QAAQ;AAAA,YAC5E,YAAY,IAAI,IAAI;AAAA,YACpB,EAAE,QAAQ,QAAQ,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,iBAAiB,WAAW,QAAQ,kBAAkB,gBAAgB;AAAA,UAClJ;AAAA,QACF;AAAA,QAEA,KAAK,WAAW;AACd,iBAAO,KAAK,sBAAsB,YAAY,MAAM;AAAA,CAAK;AACzD,iBAAO,KAAK,kBAAkB;AAC9B,iBAAO,KAAK,gCAAgC,QAAQ,EAAE;AACtD,iBAAO,KAAK,aAAa,YAAY,MAAM,EAAE;AAE7C,iBAAO;AAAA,YACL,EAAE,MAAM,WAAW,QAAQ,YAAY,OAAO;AAAA,YAC9C,OAAO,KAAK,IAAI;AAAA,YAAG;AAAA,YAAY,CAAC;AAAA,YAAG,CAAC;AAAA,YAAG,CAAC;AAAA,YACxC,YAAY,IAAI,IAAI;AAAA,YACpB,EAAE,QAAQ,QAAQ,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,iBAAiB,WAAW,QAAQ,kBAAkB,gBAAgB;AAAA,UAClJ;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,GAAQ;AACf,aAAO,KAAK,YAAY,EAAE,WAAW,CAAC;AAAA,CAAI;AAC1C,aAAO,KAAK,kBAAkB;AAC9B,aAAO,KAAK,6BAA6B,EAAE,WAAW,CAAC,EAAE;AAEzD,aAAO;AAAA,QACL,EAAE,MAAM,WAAW,QAAQ,aAAa,EAAE,WAAW,CAAC,GAAG;AAAA,QACzD,OAAO,KAAK,IAAI;AAAA,QAAG;AAAA,QAAY,CAAC;AAAA,QAAG,CAAC;AAAA,QAAG,CAAC;AAAA,QACxC,YAAY,IAAI,IAAI;AAAA,QACpB,EAAE,QAAQ,QAAQ,OAAO,QAAQ,aAAa,QAAQ,YAAY,QAAQ,iBAAiB,WAAW,QAAQ,kBAAkB,gBAAgB;AAAA,MAClJ;AAAA,IACF,UAAE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;AAKA,SAAS,gBAAgB,SAAiB,SAA0B;AAElE,WAAS,IAAI,QAAQ,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAU,QAAQ,QAAQ,IAAI,OAAO,OAAO,CAAC,OAAO,GAAG,GAAG,QAAQ,OAAO,CAAC,EAAG,IAAI;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAiB,SAA0B;AAClE,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,IAAI,SAAS;AAC7B,QAAI,IAAI,QAAQ,GAAG,MAAM,GAAG;AAC1B,YAAM,KAAK,GAAG,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,OAAO,GAAG,EAAG,IAAI,EAAE;AAAA,IAC/D,OAAO;AACL,YAAM,KAAK,QAAQ,OAAO,GAAG,EAAG,IAAI;AAAA,IACtC;AAAA,EACF;AACA,SAAO,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,QAAQ;AAC/C;AAEA,SAAS,YACP,SACA,QACA,YACA,sBACA,OACA,aACA,WACA,YACuB;AACvB,SAAO,EAAE,SAAS,QAAQ,YAAY,sBAAsB,qBAAqB,OAAO,2BAA2B,aAAa,WAAW,WAAW;AACxJ;","names":[]}
1
+ {"version":3,"sources":["../../src/verification/marking-state.ts","../../src/verification/encoding/flat-transition.ts","../../src/verification/encoding/flat-net.ts","../../src/verification/encoding/incidence-matrix.ts","../../src/verification/encoding/net-flattener.ts","../../src/verification/invariant/p-invariant.ts","../../src/verification/invariant/p-invariant-computer.ts","../../src/verification/invariant/structural-check.ts","../../src/verification/smt-property.ts","../../src/verification/smt-verification-result.ts","../../src/verification/z3/spacer-runner.ts","../../src/verification/z3/smt-encoder.ts","../../src/verification/z3/counterexample-decoder.ts","../../src/verification/smt-verifier.ts","../../src/verification/analysis/dbm.ts","../../src/verification/analysis/state-class.ts","../../src/verification/analysis/scc-analyzer.ts","../../src/verification/analysis/environment-analysis-mode.ts","../../src/verification/analysis/state-class-graph.ts","../../src/verification/analysis/time-petri-net-analyzer.ts"],"sourcesContent":["import type { Place } from '../core/place.js';\n\n/** @internal Symbol key restricting construction to the builder and factory methods. */\nconst MARKING_STATE_KEY = Symbol('MarkingState.internal');\n\n/**\n * Immutable snapshot of a Petri net marking for state space analysis.\n *\n * Maps places (by name) to integer token counts. Only stores places with count > 0.\n * Used for invariant computation and structural verification, not runtime execution.\n */\nexport class MarkingState {\n private readonly tokenCounts: ReadonlyMap<string, number>;\n private readonly placesByName: ReadonlyMap<string, Place<any>>;\n\n /** @internal Use {@link MarkingState.builder} or {@link MarkingState.empty} to create instances. */\n constructor(key: symbol, tokenCounts: Map<string, number>, placesByName: Map<string, Place<any>>) {\n if (key !== MARKING_STATE_KEY) throw new Error('Use MarkingState.builder() to create instances');\n this.tokenCounts = tokenCounts;\n this.placesByName = placesByName;\n }\n\n /** Returns the token count for a place (0 if absent). */\n tokens(place: Place<any>): number {\n return this.tokenCounts.get(place.name) ?? 0;\n }\n\n /** Checks if a place has at least one token. */\n hasTokens(place: Place<any>): boolean {\n return this.tokens(place) > 0;\n }\n\n /** Checks if any of the given places has tokens. */\n hasTokensInAny(places: Iterable<Place<any>>): boolean {\n for (const p of places) {\n if (this.hasTokens(p)) return true;\n }\n return false;\n }\n\n /** Returns all places with tokens > 0. */\n placesWithTokens(): Place<any>[] {\n return [...this.placesByName.values()];\n }\n\n /** Returns the total number of tokens. */\n totalTokens(): number {\n let sum = 0;\n for (const count of this.tokenCounts.values()) sum += count;\n return sum;\n }\n\n /** Checks if no tokens exist anywhere. */\n isEmpty(): boolean {\n return this.tokenCounts.size === 0;\n }\n\n toString(): string {\n if (this.tokenCounts.size === 0) return '{}';\n const entries = [...this.tokenCounts.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, count]) => `${name}:${count}`);\n return `{${entries.join(', ')}}`;\n }\n\n static empty(): MarkingState {\n return new MarkingState(MARKING_STATE_KEY, new Map(), new Map());\n }\n\n static builder(): MarkingStateBuilder {\n return new MarkingStateBuilder();\n }\n}\n\nexport class MarkingStateBuilder {\n private readonly tokenCounts = new Map<string, number>();\n private readonly placesByName = new Map<string, Place<any>>();\n\n /** Sets the token count for a place. */\n tokens(place: Place<any>, count: number): this {\n if (count < 0) throw new Error(`Token count cannot be negative: ${count}`);\n if (count > 0) {\n this.tokenCounts.set(place.name, count);\n this.placesByName.set(place.name, place);\n } else {\n this.tokenCounts.delete(place.name);\n this.placesByName.delete(place.name);\n }\n return this;\n }\n\n /** Adds tokens to a place. */\n addTokens(place: Place<any>, count: number): this {\n if (count < 0) throw new Error(`Token count cannot be negative: ${count}`);\n if (count > 0) {\n const current = this.tokenCounts.get(place.name) ?? 0;\n this.tokenCounts.set(place.name, current + count);\n this.placesByName.set(place.name, place);\n }\n return this;\n }\n\n /** Removes tokens from a place. Throws if insufficient. */\n removeTokens(place: Place<any>, count: number): this {\n const current = this.tokenCounts.get(place.name) ?? 0;\n const newCount = current - count;\n if (newCount < 0) {\n throw new Error(\n `Cannot remove ${count} tokens from ${place.name} (has ${current})`,\n );\n }\n if (newCount === 0) {\n this.tokenCounts.delete(place.name);\n this.placesByName.delete(place.name);\n } else {\n this.tokenCounts.set(place.name, newCount);\n }\n return this;\n }\n\n /** Copies all token counts from another marking state. */\n copyFrom(other: MarkingState): this {\n for (const p of other.placesWithTokens()) {\n this.tokenCounts.set(p.name, other.tokens(p));\n this.placesByName.set(p.name, p);\n }\n return this;\n }\n\n build(): MarkingState {\n return new MarkingState(MARKING_STATE_KEY, new Map(this.tokenCounts), new Map(this.placesByName));\n }\n}\n","import type { Transition } from '../../core/transition.js';\n\n/**\n * A flattened transition with pre/post vectors for SMT encoding.\n *\n * Each Transition with XOR outputs is expanded into multiple FlatTransitions\n * (one per branch). Non-XOR transitions map 1:1.\n */\nexport interface FlatTransition {\n /** Display name (e.g. \"Search_b0\", \"Search_b1\"). */\n readonly name: string;\n /** The original transition. */\n readonly source: Transition;\n /** Which XOR branch (-1 if no XOR). */\n readonly branchIndex: number;\n /** Tokens consumed per place (indexed by place index). */\n readonly preVector: readonly number[];\n /** Tokens produced per place (indexed by place index). */\n readonly postVector: readonly number[];\n /** Place indices where inhibitor arcs block firing. */\n readonly inhibitorPlaces: readonly number[];\n /** Place indices requiring a token without consuming. */\n readonly readPlaces: readonly number[];\n /** Place indices set to 0 on firing. */\n readonly resetPlaces: readonly number[];\n /** True at index i means place i uses All/AtLeast semantics. */\n readonly consumeAll: readonly boolean[];\n}\n\nexport function flatTransition(\n name: string,\n source: Transition,\n branchIndex: number,\n preVector: number[],\n postVector: number[],\n inhibitorPlaces: number[],\n readPlaces: number[],\n resetPlaces: number[],\n consumeAll: boolean[],\n): FlatTransition {\n return {\n name,\n source,\n branchIndex,\n preVector,\n postVector,\n inhibitorPlaces,\n readPlaces,\n resetPlaces,\n consumeAll,\n };\n}\n","import type { Place } from '../../core/place.js';\nimport type { FlatTransition } from './flat-transition.js';\n\n/**\n * A flattened Petri net with indexed places and XOR-expanded transitions.\n *\n * Intermediate representation between the high-level PetriNet and Z3 CHC encoding.\n */\nexport interface FlatNet {\n /** Ordered list of places (index = position). */\n readonly places: readonly Place<any>[];\n /** Reverse lookup: place name -> index. */\n readonly placeIndex: ReadonlyMap<string, number>;\n /** XOR-expanded flat transitions. */\n readonly transitions: readonly FlatTransition[];\n /** For bounded environment places: place name -> max tokens. */\n readonly environmentBounds: ReadonlyMap<string, number>;\n}\n\nexport function flatNetPlaceCount(net: FlatNet): number {\n return net.places.length;\n}\n\nexport function flatNetTransitionCount(net: FlatNet): number {\n return net.transitions.length;\n}\n\nexport function flatNetIndexOf(net: FlatNet, place: Place<any>): number {\n return net.placeIndex.get(place.name) ?? -1;\n}\n","import type { FlatNet } from './flat-net.js';\n\n/**\n * Incidence matrix for a flattened Petri net.\n *\n * The incidence matrix C is defined as C[t][p] = post[t][p] - pre[t][p].\n * It captures the net effect of each transition on each place.\n *\n * P-invariants are solutions to y^T * C = 0, found via null space\n * computation on C^T.\n */\nexport class IncidenceMatrix {\n private readonly _pre: readonly (readonly number[])[];\n private readonly _post: readonly (readonly number[])[];\n private readonly _incidence: readonly (readonly number[])[];\n private readonly _numTransitions: number;\n private readonly _numPlaces: number;\n\n private constructor(\n pre: number[][],\n post: number[][],\n incidence: number[][],\n numTransitions: number,\n numPlaces: number,\n ) {\n this._pre = pre;\n this._post = post;\n this._incidence = incidence;\n this._numTransitions = numTransitions;\n this._numPlaces = numPlaces;\n }\n\n /**\n * Computes the incidence matrix from a FlatNet.\n */\n static from(flatNet: FlatNet): IncidenceMatrix {\n const T = flatNet.transitions.length;\n const P = flatNet.places.length;\n\n const pre: number[][] = [];\n const post: number[][] = [];\n const incidence: number[][] = [];\n\n for (let t = 0; t < T; t++) {\n const ft = flatNet.transitions[t]!;\n const preRow = new Array<number>(P);\n const postRow = new Array<number>(P);\n const incRow = new Array<number>(P);\n\n for (let p = 0; p < P; p++) {\n preRow[p] = ft.preVector[p]!;\n postRow[p] = ft.postVector[p]!;\n incRow[p] = postRow[p]! - preRow[p]!;\n }\n\n pre.push(preRow);\n post.push(postRow);\n incidence.push(incRow);\n }\n\n return new IncidenceMatrix(pre, post, incidence, T, P);\n }\n\n /**\n * Returns C^T (transpose of incidence matrix), dimensions [P][T].\n * Used for P-invariant computation: null space of C^T gives P-invariants.\n */\n transposedIncidence(): number[][] {\n const ct: number[][] = [];\n for (let p = 0; p < this._numPlaces; p++) {\n const row = new Array<number>(this._numTransitions);\n for (let t = 0; t < this._numTransitions; t++) {\n row[t] = this._incidence[t]![p]!;\n }\n ct.push(row);\n }\n return ct;\n }\n\n /** Returns the pre-matrix (tokens consumed). T×P. */\n pre(): readonly (readonly number[])[] { return this._pre; }\n\n /** Returns the post-matrix (tokens produced). T×P. */\n post(): readonly (readonly number[])[] { return this._post; }\n\n /** Returns the incidence matrix C[t][p] = post - pre. T×P. */\n incidence(): readonly (readonly number[])[] { return this._incidence; }\n\n numTransitions(): number { return this._numTransitions; }\n numPlaces(): number { return this._numPlaces; }\n}\n","/**\n * @module net-flattener\n *\n * Flattens a PetriNet into integer-indexed pre/post vectors for SMT encoding.\n *\n * **XOR expansion**: Transitions with XOR output specs are expanded into multiple\n * flat transitions — one per deterministic branch. Each branch produces tokens to\n * exactly one XOR child's places. This converts non-deterministic output routing\n * into separate transitions that the SMT solver can reason about independently.\n *\n * **Vector construction**: For each flat transition, builds:\n * - `preVector[p]`: tokens consumed from place p (input cardinality)\n * - `postVector[p]`: tokens produced to place p (from the selected branch)\n * - `consumeAll[p]`: true for `all`/`at-least` inputs (consume everything)\n * - Index arrays for inhibitor, read, and reset arcs\n *\n * Places are sorted by name for stable, deterministic indexing across runs.\n */\nimport type { PetriNet } from '../../core/petri-net.js';\nimport type { Place, EnvironmentPlace } from '../../core/place.js';\nimport type { Out } from '../../core/out.js';\nimport type { FlatNet } from './flat-net.js';\nimport { flatTransition } from './flat-transition.js';\nimport { enumerateBranches, allPlaces as outAllPlaces } from '../../core/out.js';\n\n/**\n * How to treat environment places during analysis.\n */\nexport type EnvironmentAnalysisMode =\n | { readonly type: 'unbounded' }\n | { readonly type: 'bounded'; readonly maxTokens: number };\n\nexport function unbounded(): EnvironmentAnalysisMode {\n return { type: 'unbounded' };\n}\n\nexport function bounded(maxTokens: number): EnvironmentAnalysisMode {\n return { type: 'bounded', maxTokens };\n}\n\n/**\n * Flattens a PetriNet into a FlatNet suitable for SMT encoding.\n *\n * Flattening involves:\n * 1. Assigning each place a stable integer index (sorted by name)\n * 2. Expanding XOR outputs into separate flat transitions (one per branch)\n * 3. Building pre/post vectors from input/output specs\n * 4. Recording inhibitor, read, and reset arcs\n * 5. Setting environment bounds for bounded analysis mode\n */\nexport function flatten(\n net: PetriNet,\n environmentPlaces: Set<EnvironmentPlace<any>> = new Set(),\n environmentMode: EnvironmentAnalysisMode = unbounded(),\n): FlatNet {\n // 1. Collect ALL places\n const allPlacesSet = new Map<string, Place<any>>();\n for (const p of net.places) {\n allPlacesSet.set(p.name, p);\n }\n for (const t of net.transitions) {\n for (const inSpec of t.inputSpecs) {\n allPlacesSet.set(inSpec.place.name, inSpec.place);\n }\n if (t.outputSpec !== null) {\n for (const p of outAllPlaces(t.outputSpec)) {\n allPlacesSet.set(p.name, p);\n }\n }\n for (const arc of t.inhibitors) allPlacesSet.set(arc.place.name, arc.place);\n for (const arc of t.reads) allPlacesSet.set(arc.place.name, arc.place);\n for (const arc of t.resets) allPlacesSet.set(arc.place.name, arc.place);\n }\n\n // Sort by name for stable indexing\n const places = [...allPlacesSet.values()].sort((a, b) => a.name.localeCompare(b.name));\n\n const placeIndex = new Map<string, number>();\n for (let i = 0; i < places.length; i++) {\n placeIndex.set(places[i]!.name, i);\n }\n\n // 2. Compute environment bounds\n const environmentBounds = new Map<string, number>();\n if (environmentMode.type === 'bounded') {\n for (const ep of environmentPlaces) {\n environmentBounds.set(ep.place.name, environmentMode.maxTokens);\n }\n }\n\n // 3. Expand transitions\n const n = places.length;\n const flatTransitions = [];\n\n for (const transition of net.transitions) {\n const branches = enumerateOutputBranches(transition);\n\n for (let branchIdx = 0; branchIdx < branches.length; branchIdx++) {\n const branchPlaces = branches[branchIdx]!;\n const name = branches.length > 1\n ? `${transition.name}_b${branchIdx}`\n : transition.name;\n\n // Build pre-vector and consumeAll flags\n const preVector = new Array<number>(n).fill(0);\n const consumeAll = new Array<boolean>(n).fill(false);\n\n for (const inSpec of transition.inputSpecs) {\n const idx = placeIndex.get(inSpec.place.name);\n if (idx === undefined) continue;\n\n switch (inSpec.type) {\n case 'one':\n preVector[idx] = 1;\n break;\n case 'exactly':\n preVector[idx] = inSpec.count;\n break;\n case 'all':\n preVector[idx] = 1;\n consumeAll[idx] = true;\n break;\n case 'at-least':\n preVector[idx] = inSpec.minimum;\n consumeAll[idx] = true;\n break;\n }\n }\n\n // Build post-vector from branch output places\n const postVector = new Array<number>(n).fill(0);\n for (const p of branchPlaces) {\n const idx = placeIndex.get(p.name);\n if (idx !== undefined) {\n postVector[idx] = 1;\n }\n }\n\n // Inhibitor places\n const inhibitorPlaces = transition.inhibitors\n .map(arc => placeIndex.get(arc.place.name))\n .filter((idx): idx is number => idx !== undefined);\n\n // Read places\n const readPlaces = transition.reads\n .map(arc => placeIndex.get(arc.place.name))\n .filter((idx): idx is number => idx !== undefined);\n\n // Reset places\n const resetPlaces = transition.resets\n .map(arc => placeIndex.get(arc.place.name))\n .filter((idx): idx is number => idx !== undefined);\n\n flatTransitions.push(flatTransition(\n name,\n transition,\n branches.length > 1 ? branchIdx : -1,\n preVector,\n postVector,\n inhibitorPlaces,\n readPlaces,\n resetPlaces,\n consumeAll,\n ));\n }\n }\n\n return {\n places,\n placeIndex,\n transitions: flatTransitions,\n environmentBounds,\n };\n}\n\nfunction enumerateOutputBranches(t: { outputSpec: Out | null }): ReadonlySet<Place<any>>[] {\n if (t.outputSpec !== null) {\n return enumerateBranches(t.outputSpec) as ReadonlySet<Place<any>>[];\n }\n // No outputs (sink transition)\n return [new Set()];\n}\n","/**\n * A P-invariant (place invariant) of a Petri net.\n *\n * A P-invariant is a vector y such that y^T * C = 0, where C is the\n * incidence matrix. This means that for any reachable marking M:\n * sum(y_i * M_i) = constant, where constant = sum(y_i * M0_i).\n *\n * P-invariants provide structural bounds on places and are used as\n * strengthening lemmas for the IC3/PDR engine.\n */\nexport interface PInvariant {\n /** Weight vector (one entry per place index). */\n readonly weights: readonly number[];\n /** The invariant value sum(y_i * M0_i). */\n readonly constant: number;\n /** Set of place indices where weight != 0. */\n readonly support: ReadonlySet<number>;\n}\n\nexport function pInvariant(weights: number[], constant: number, support: Set<number>): PInvariant {\n return { weights, constant, support };\n}\n\nexport function pInvariantToString(inv: PInvariant): string {\n const parts: string[] = [];\n for (const i of inv.support) {\n if (inv.weights[i] !== 1) {\n parts.push(`${inv.weights[i]}*p${i}`);\n } else {\n parts.push(`p${i}`);\n }\n }\n return `PInvariant[${parts.join(' + ')} = ${inv.constant}]`;\n}\n","/**\n * @module p-invariant-computer\n *\n * Computes P-invariants of a Petri net via integer Gaussian elimination (Farkas' algorithm).\n *\n * **Algorithm**: A P-invariant is a non-negative integer vector y such that y^T · C = 0\n * (where C is the incidence matrix). This expresses a conservation law: the weighted\n * token sum Σ(y_i · M[i]) is constant across all reachable markings.\n *\n * **Farkas variant**: Constructs the augmented matrix [C^T | I_P] and row-reduces\n * the C^T portion to zero using integer elimination (no floating point). Rows where\n * the C^T part becomes all-zero yield invariant vectors from the identity part.\n * Row normalization by GCD keeps values small during elimination.\n *\n * **Integer Gaussian elimination**: Each elimination step multiplies rows by pivot\n * coefficients (a·row - b·pivotRow) to avoid fractions. This preserves integer\n * arithmetic throughout, critical for exact invariant computation.\n *\n * Invariants are used to strengthen SMT queries (added as constraints on M').\n */\nimport type { FlatNet } from '../encoding/flat-net.js';\nimport type { IncidenceMatrix } from '../encoding/incidence-matrix.js';\nimport type { MarkingState } from '../marking-state.js';\nimport type { PInvariant } from './p-invariant.js';\nimport { pInvariant } from './p-invariant.js';\n\n/**\n * Computes P-invariants of a Petri net via integer Gaussian elimination.\n *\n * P-invariants are non-negative integer vectors y where y^T * C = 0.\n * They express conservation laws: the weighted token sum is constant\n * across all reachable markings.\n *\n * Algorithm: compute the null space of C^T using integer row reduction\n * with an augmented identity matrix (Farkas' algorithm variant).\n */\nexport function computePInvariants(\n matrix: IncidenceMatrix,\n flatNet: FlatNet,\n initialMarking: MarkingState,\n): PInvariant[] {\n const P = matrix.numPlaces();\n const T = matrix.numTransitions();\n\n if (P === 0 || T === 0) return [];\n\n // We want to find y such that y^T * C = 0, i.e., C^T * y = 0\n // Start with augmented matrix [C^T | I_P]\n // Row-reduce C^T part to zero; the I_P part gives the invariant vectors.\n const ct = matrix.transposedIncidence(); // P × T\n\n // Augmented matrix: P rows, T + P columns\n // Use regular numbers (safe for nets with < ~50 places/transitions)\n const cols = T + P;\n const augmented: number[][] = [];\n for (let i = 0; i < P; i++) {\n const row = new Array<number>(cols).fill(0);\n for (let j = 0; j < T; j++) {\n row[j] = ct[i]![j]!;\n }\n row[T + i] = 1; // identity part\n augmented.push(row);\n }\n\n // Integer Gaussian elimination on the C^T part (columns 0..T-1)\n let pivotRow = 0;\n for (let col = 0; col < T && pivotRow < P; col++) {\n // Find pivot (non-zero entry in this column)\n let pivot = -1;\n for (let row = pivotRow; row < P; row++) {\n if (augmented[row]![col] !== 0) {\n pivot = row;\n break;\n }\n }\n if (pivot === -1) continue; // free variable\n\n // Swap pivot row\n if (pivot !== pivotRow) {\n const tmp = augmented[pivotRow]!;\n augmented[pivotRow] = augmented[pivot]!;\n augmented[pivot] = tmp;\n }\n\n // Eliminate this column in all other rows\n for (let row = 0; row < P; row++) {\n if (row === pivotRow || augmented[row]![col] === 0) continue;\n\n const a = augmented[pivotRow]![col]!;\n const b = augmented[row]![col]!;\n\n // row = a*row - b*pivotRow (keeps integers, eliminates col)\n for (let c = 0; c < cols; c++) {\n augmented[row]![c] = a * augmented[row]![c]! - b * augmented[pivotRow]![c]!;\n }\n\n // Normalize by GCD to keep values small\n normalizeRow(augmented[row]!, cols);\n }\n\n pivotRow++;\n }\n\n // Extract invariants: rows where C^T part is all zeros\n const invariants: PInvariant[] = [];\n for (let row = 0; row < P; row++) {\n let isZero = true;\n for (let col = 0; col < T; col++) {\n if (augmented[row]![col] !== 0) {\n isZero = false;\n break;\n }\n }\n if (!isZero) continue;\n\n // Extract the weight vector from the identity part\n const weights = new Array<number>(P);\n let allNonNegative = true;\n let hasPositive = false;\n\n for (let i = 0; i < P; i++) {\n weights[i] = augmented[row]![T + i]!;\n if (weights[i]! < 0) {\n allNonNegative = false;\n break;\n }\n if (weights[i]! > 0) hasPositive = true;\n }\n\n // We want semi-positive invariants (all weights >= 0, at least one > 0)\n if (!allNonNegative) {\n // Try negating\n let allNonPositive = true;\n for (let i = 0; i < P; i++) {\n if (augmented[row]![T + i]! > 0) {\n allNonPositive = false;\n break;\n }\n }\n if (allNonPositive) {\n for (let i = 0; i < P; i++) {\n weights[i] = -augmented[row]![T + i]!;\n }\n hasPositive = true;\n allNonNegative = true;\n }\n }\n\n if (!allNonNegative || !hasPositive) continue;\n\n // Normalize: divide by GCD of weights\n let g = 0;\n for (const w of weights) {\n if (w > 0) g = gcd(g, w);\n }\n if (g > 1) {\n for (let i = 0; i < P; i++) {\n weights[i] = weights[i]! / g;\n }\n }\n\n // Compute support and constant\n const support = new Set<number>();\n let constant = 0;\n for (let i = 0; i < P; i++) {\n if (weights[i] !== 0) {\n support.add(i);\n const place = flatNet.places[i]!;\n constant += weights[i]! * initialMarking.tokens(place);\n }\n }\n\n invariants.push(pInvariant(weights, constant, support));\n }\n\n return invariants;\n}\n\n/**\n * Checks if every place is covered by at least one P-invariant.\n * If true, the net is structurally bounded.\n */\nexport function isCoveredByInvariants(invariants: readonly PInvariant[], numPlaces: number): boolean {\n const covered = new Array<boolean>(numPlaces).fill(false);\n for (const inv of invariants) {\n for (const idx of inv.support) {\n if (idx < numPlaces) covered[idx] = true;\n }\n }\n return covered.every(c => c);\n}\n\nfunction normalizeRow(row: number[], cols: number): void {\n let g = 0;\n for (let c = 0; c < cols; c++) {\n if (row[c] !== 0) {\n g = gcd(g, Math.abs(row[c]!));\n }\n }\n if (g > 1) {\n for (let c = 0; c < cols; c++) {\n row[c] = row[c]! / g;\n }\n }\n}\n\nfunction gcd(a: number, b: number): number {\n while (b !== 0) {\n const t = b;\n b = a % b;\n a = t;\n }\n return a;\n}\n","/**\n * @module structural-check\n *\n * Structural deadlock pre-check using siphon/trap analysis (Commoner's theorem).\n *\n * **Commoner's theorem**: A Petri net is deadlock-free if every siphon contains\n * an initially marked trap.\n *\n * **Siphon**: A set of places S where every transition that outputs to S also\n * inputs from S. Key property: once all places in a siphon become empty,\n * they can never be re-marked. An empty siphon can cause deadlock.\n *\n * **Trap**: A set of places S where every transition that inputs from S also\n * outputs to S. Key property: once any place in a trap is marked,\n * the trap remains marked forever.\n *\n * **Algorithm**: For each place, compute the minimal siphon containing it via\n * fixed-point expansion. For each siphon, find the maximal trap within it\n * (fixed-point contraction). If every siphon contains an initially-marked\n * trap, deadlock-freedom is proven structurally — no SMT query needed.\n *\n * Limited to nets with ≤50 places to bound enumeration cost.\n */\nimport type { FlatNet } from '../encoding/flat-net.js';\nimport type { MarkingState } from '../marking-state.js';\n\nconst MAX_PLACES_FOR_SIPHON_ANALYSIS = 50;\n\n/**\n * Result of structural deadlock check using siphon/trap analysis.\n */\nexport type StructuralCheckResult =\n | { readonly type: 'no-potential-deadlock' }\n | { readonly type: 'potential-deadlock'; readonly siphon: ReadonlySet<number> }\n | { readonly type: 'inconclusive'; readonly reason: string };\n\n/**\n * Structural deadlock pre-check using siphon/trap analysis.\n *\n * Commoner's theorem: a Petri net is deadlock-free if every siphon\n * contains a marked trap.\n *\n * A siphon is a set of places S such that every transition with\n * an output in S also has an input in S. Once empty, a siphon stays empty.\n *\n * A trap is a set of places S such that every transition with\n * an input in S also has an output in S. Once marked, a trap stays marked.\n */\nexport function structuralCheck(flatNet: FlatNet, initialMarking: MarkingState): StructuralCheckResult {\n const P = flatNet.places.length;\n\n if (P === 0) {\n return { type: 'no-potential-deadlock' };\n }\n\n if (P > MAX_PLACES_FOR_SIPHON_ANALYSIS) {\n return { type: 'inconclusive', reason: `Net has ${P} places, siphon enumeration skipped` };\n }\n\n const siphons = findMinimalSiphons(flatNet);\n\n if (siphons.length === 0) {\n return { type: 'no-potential-deadlock' };\n }\n\n for (const siphon of siphons) {\n const trap = findMaximalTrapIn(flatNet, siphon);\n\n if (trap.size === 0 || !isMarked(trap, flatNet, initialMarking)) {\n return { type: 'potential-deadlock', siphon };\n }\n }\n\n return { type: 'no-potential-deadlock' };\n}\n\n/**\n * Finds minimal siphons by checking all non-empty subsets of deadlock-enabling places.\n * Uses a fixed-point approach: start from each place and grow the siphon.\n */\nexport function findMinimalSiphons(flatNet: FlatNet): ReadonlySet<number>[] {\n const P = flatNet.places.length;\n const siphons: Set<number>[] = [];\n\n // Pre-compute: for each place, which transitions have it as output?\n const placeAsOutput: number[][] = [];\n for (let p = 0; p < P; p++) {\n placeAsOutput.push([]);\n }\n\n for (let t = 0; t < flatNet.transitions.length; t++) {\n const ft = flatNet.transitions[t]!;\n for (let p = 0; p < P; p++) {\n if (ft.postVector[p]! > 0) {\n placeAsOutput[p]!.push(t);\n }\n }\n }\n\n for (let startPlace = 0; startPlace < P; startPlace++) {\n const siphon = computeSiphonContaining(startPlace, flatNet, placeAsOutput);\n if (siphon !== null && siphon.size > 0) {\n let isMinimal = true;\n const toRemove: number[] = [];\n for (let i = 0; i < siphons.length; i++) {\n const existing = siphons[i]!;\n if (setsEqual(existing, siphon)) {\n isMinimal = false;\n break;\n }\n if (isSubsetOf(existing, siphon)) {\n isMinimal = false;\n break;\n }\n if (isSubsetOf(siphon, existing)) {\n toRemove.push(i);\n }\n }\n for (let i = toRemove.length - 1; i >= 0; i--) {\n siphons.splice(toRemove[i]!, 1);\n }\n if (isMinimal) {\n siphons.push(siphon);\n }\n }\n }\n\n return siphons;\n}\n\nfunction computeSiphonContaining(\n startPlace: number,\n flatNet: FlatNet,\n placeAsOutput: number[][],\n): Set<number> | null {\n const siphon = new Set<number>();\n siphon.add(startPlace);\n\n let changed = true;\n while (changed) {\n changed = false;\n const snapshot = [...siphon];\n\n for (const p of snapshot) {\n for (const t of placeAsOutput[p]!) {\n const ft = flatNet.transitions[t]!;\n\n let hasInputInSiphon = false;\n for (let q = 0; q < flatNet.places.length; q++) {\n if (ft.preVector[q]! > 0 && siphon.has(q)) {\n hasInputInSiphon = true;\n break;\n }\n }\n\n if (!hasInputInSiphon) {\n let added = false;\n for (let q = 0; q < flatNet.places.length; q++) {\n if (ft.preVector[q]! > 0) {\n if (!siphon.has(q)) {\n siphon.add(q);\n changed = true;\n }\n added = true;\n break;\n }\n }\n if (!added) {\n return null;\n }\n }\n }\n }\n }\n\n return siphon;\n}\n\n/**\n * Finds the maximal trap within a given set of places.\n * Uses fixed-point: start with the full set and remove places that violate the trap condition.\n */\nexport function findMaximalTrapIn(flatNet: FlatNet, places: ReadonlySet<number>): ReadonlySet<number> {\n const trap = new Set(places);\n\n let changed = true;\n while (changed) {\n changed = false;\n const toRemove: number[] = [];\n\n for (const p of trap) {\n let satisfies = true;\n for (let t = 0; t < flatNet.transitions.length; t++) {\n const ft = flatNet.transitions[t]!;\n if (ft.preVector[p]! > 0) {\n let outputsToTrap = false;\n for (const q of trap) {\n if (ft.postVector[q]! > 0) {\n outputsToTrap = true;\n break;\n }\n }\n if (!outputsToTrap) {\n satisfies = false;\n break;\n }\n }\n }\n if (!satisfies) {\n toRemove.push(p);\n }\n }\n\n if (toRemove.length > 0) {\n for (const p of toRemove) trap.delete(p);\n changed = true;\n }\n }\n\n return trap;\n}\n\nfunction isMarked(placeIndices: ReadonlySet<number>, flatNet: FlatNet, marking: MarkingState): boolean {\n for (const idx of placeIndices) {\n const place = flatNet.places[idx]!;\n if (marking.tokens(place) > 0) return true;\n }\n return false;\n}\n\nfunction setsEqual(a: ReadonlySet<number>, b: ReadonlySet<number>): boolean {\n if (a.size !== b.size) return false;\n for (const v of a) {\n if (!b.has(v)) return false;\n }\n return true;\n}\n\nfunction isSubsetOf(sub: ReadonlySet<number>, sup: ReadonlySet<number>): boolean {\n if (sub.size > sup.size) return false;\n for (const v of sub) {\n if (!sup.has(v)) return false;\n }\n return true;\n}\n","import type { Place } from '../core/place.js';\n\n/**\n * Safety properties that can be verified via IC3/PDR.\n *\n * Each property is encoded as an error condition: if a reachable state\n * violates the property, Spacer finds a counterexample. If no violation\n * is reachable, the property is proven.\n */\nexport type SmtProperty = DeadlockFree | MutualExclusion | PlaceBound | Unreachable;\n\n/** Deadlock-freedom: no reachable marking has all transitions disabled. */\nexport interface DeadlockFree {\n readonly type: 'deadlock-free';\n}\n\n/** Mutual exclusion: two places never have tokens simultaneously. */\nexport interface MutualExclusion {\n readonly type: 'mutual-exclusion';\n readonly p1: Place<any>;\n readonly p2: Place<any>;\n}\n\n/** Place bound: a place never exceeds a given token count. */\nexport interface PlaceBound {\n readonly type: 'place-bound';\n readonly place: Place<any>;\n readonly bound: number;\n}\n\n/** Unreachability: the given places never all have tokens simultaneously. */\nexport interface Unreachable {\n readonly type: 'unreachable';\n readonly places: ReadonlySet<Place<any>>;\n}\n\n// Factory functions\n\nexport function deadlockFree(): DeadlockFree {\n return { type: 'deadlock-free' };\n}\n\nexport function mutualExclusion(p1: Place<any>, p2: Place<any>): MutualExclusion {\n return { type: 'mutual-exclusion', p1, p2 };\n}\n\nexport function placeBound(place: Place<any>, bound: number): PlaceBound {\n return { type: 'place-bound', place, bound };\n}\n\nexport function unreachable(places: ReadonlySet<Place<any>>): Unreachable {\n return { type: 'unreachable', places: new Set(places) };\n}\n\n/** Human-readable description of a property. */\nexport function propertyDescription(prop: SmtProperty): string {\n switch (prop.type) {\n case 'deadlock-free':\n return 'Deadlock-freedom';\n case 'mutual-exclusion':\n return `Mutual exclusion of ${prop.p1.name} and ${prop.p2.name}`;\n case 'place-bound':\n return `Place ${prop.place.name} bounded by ${prop.bound}`;\n case 'unreachable':\n return `Unreachability of marking with tokens in {${[...prop.places].map(p => p.name).join(', ')}}`;\n }\n}\n","import type { MarkingState } from './marking-state.js';\nimport type { PInvariant } from './invariant/p-invariant.js';\n\n/**\n * Verification verdict.\n */\nexport type Verdict = Proven | Violated | Unknown;\n\n/** Property proven safe. No reachable state violates it. */\nexport interface Proven {\n readonly type: 'proven';\n readonly method: string;\n readonly inductiveInvariant: string | null;\n}\n\n/** Property violated. A counterexample trace is available. */\nexport interface Violated {\n readonly type: 'violated';\n}\n\n/** Could not determine. */\nexport interface Unknown {\n readonly type: 'unknown';\n readonly reason: string;\n}\n\n/**\n * Solver statistics.\n */\nexport interface SmtStatistics {\n readonly places: number;\n readonly transitions: number;\n readonly invariantsFound: number;\n readonly structuralResult: string;\n}\n\n/**\n * Result of SMT-based verification.\n */\nexport interface SmtVerificationResult {\n readonly verdict: Verdict;\n readonly report: string;\n readonly invariants: readonly PInvariant[];\n readonly discoveredInvariants: readonly string[];\n readonly counterexampleTrace: readonly MarkingState[];\n readonly counterexampleTransitions: readonly string[];\n readonly elapsedMs: number;\n readonly statistics: SmtStatistics;\n}\n\nexport function isProven(result: SmtVerificationResult): boolean {\n return result.verdict.type === 'proven';\n}\n\nexport function isViolated(result: SmtVerificationResult): boolean {\n return result.verdict.type === 'violated';\n}\n","import { init } from 'z3-solver';\nimport type { Bool, Expr, FuncDecl } from 'z3-solver';\n\n/**\n * Result of a Spacer query.\n */\nexport type QueryResult = QueryProven | QueryViolated | QueryUnknown;\n\n/** Property proven: no reachable error state (UNSAT). */\nexport interface QueryProven {\n readonly type: 'proven';\n readonly invariantFormula: string | null;\n readonly levelInvariants: readonly string[];\n}\n\n/** Counterexample found (SAT). The answer is the derivation tree. */\nexport interface QueryViolated {\n readonly type: 'violated';\n readonly answer: Expr | null;\n}\n\n/** Solver could not determine (timeout, resource limit). */\nexport interface QueryUnknown {\n readonly type: 'unknown';\n readonly reason: string;\n}\n\n/**\n * The Z3 context and helpers returned by SpacerRunner.create().\n * Exposes the context object for building expressions.\n */\nexport interface SpacerContext {\n /** The Z3 high-level context for building expressions. */\n readonly ctx: ReturnType<Awaited<ReturnType<typeof init>>['Context']>;\n /** The Z3 Fixedpoint solver instance (Spacer engine). Z3 types are complex; using any. */\n readonly fp: any;\n\n /** Queries whether the error state is reachable. */\n query(errorExpr: Bool, reachableDecl?: FuncDecl): Promise<QueryResult>;\n\n /** Releases Z3 resources. */\n dispose(): void;\n}\n\n// Use a type alias for the Z3 context to avoid the deep inference\ntype Z3Context = ReturnType<Awaited<ReturnType<typeof init>>['Context']>;\n\n/**\n * Creates a Spacer runner with the given timeout.\n *\n * Uses Z3's Spacer engine (CHC solver based on IC3/PDR) to prove or\n * disprove safety properties.\n */\nexport async function createSpacerRunner(timeoutMs: number): Promise<SpacerContext> {\n const { Context } = await init();\n const ctx = new Context('main') as Z3Context;\n const fp = new (ctx as any).Fixedpoint() as any;\n\n // Configure Spacer engine\n fp.set('engine', 'spacer');\n fp.set('spacer.global', true);\n fp.set('spacer.use_bg_invs', true);\n if (timeoutMs > 0) {\n fp.set('timeout', Math.min(timeoutMs, 2147483647));\n }\n\n async function query(errorExpr: Bool, reachableDecl?: FuncDecl): Promise<QueryResult> {\n try {\n const status = await fp.query(errorExpr);\n\n if (status === 'unsat') {\n let invariantFormula: string | null = null;\n const levelInvariants: string[] = [];\n\n try {\n const answer = fp.getAnswer();\n if (answer != null) {\n invariantFormula = answer.toString();\n }\n } catch {\n // Some configurations don't produce answers\n }\n\n if (reachableDecl != null) {\n try {\n const levels = fp.getNumLevels(reachableDecl);\n for (let i = 0; i < levels; i++) {\n const cover = fp.getCoverDelta(i, reachableDecl);\n if (cover != null && !(ctx as any).isTrue(cover)) {\n levelInvariants.push(`Level ${i}: ${cover.toString()}`);\n }\n }\n } catch {\n // Level queries may not be available\n }\n }\n\n return { type: 'proven', invariantFormula, levelInvariants };\n }\n\n if (status === 'sat') {\n let answer: Expr | null = null;\n try {\n answer = fp.getAnswer();\n } catch {\n // Some configurations don't produce answers\n }\n return { type: 'violated', answer };\n }\n\n // unknown\n return { type: 'unknown', reason: fp.getReasonUnknown() };\n } catch (e: any) {\n return { type: 'unknown', reason: `Z3 exception: ${e.message ?? e}` };\n }\n }\n\n function dispose(): void {\n try {\n fp.release();\n } catch {\n // ignore\n }\n }\n\n return {\n ctx,\n fp,\n query,\n dispose,\n } as SpacerContext;\n}\n","/**\n * @module smt-encoder\n *\n * Encodes a flattened Petri net as Constrained Horn Clauses (CHC) for Z3's Spacer engine.\n *\n * **CHC encoding strategy**: The net's state space is modeled as integer vectors\n * (one variable per place = token count). Three rule types:\n *\n * 1. **Init**: `Reachable(M0)` — the initial marking is reachable\n * 2. **Transition**: `Reachable(M') :- Reachable(M) ∧ enabled(M,t) ∧ fire(M,M',t)` —\n * one rule per flat transition (XOR branches are separate transitions)\n * 3. **Error**: `Error() :- Reachable(M) ∧ violation(M)` — safety property violation\n *\n * Transition rules include: non-negativity constraints on M', P-invariant strengthening\n * clauses, and environment bounds for bounded analysis.\n *\n * Z3 types are complex and partially untyped; the ctx/fp parameters use `any`.\n */\nimport type { Arith, Bool, FuncDecl } from 'z3-solver';\nimport type { FlatNet } from '../encoding/flat-net.js';\nimport type { FlatTransition } from '../encoding/flat-transition.js';\nimport type { MarkingState } from '../marking-state.js';\nimport type { SmtProperty } from '../smt-property.js';\nimport type { PInvariant } from '../invariant/p-invariant.js';\nimport type { Place } from '../../core/place.js';\nimport { flatNetIndexOf } from '../encoding/flat-net.js';\n\n/** Z3 high-level context. Typed as `any` because z3-solver's TS types are incomplete. */\ntype Z3Context = any;\n/** Z3 Fixedpoint solver instance. Typed as `any` because z3-solver's TS types are incomplete. */\ntype Z3Fixedpoint = any;\n\n/**\n * Result of CHC encoding.\n */\nexport interface EncodingResult {\n readonly errorExpr: Bool;\n readonly reachableDecl: FuncDecl;\n}\n\n/**\n * Encodes a flattened Petri net as Constrained Horn Clauses (CHC) for Z3's Spacer engine.\n *\n * CHC rules:\n * - Reachable(M0) — initial state is reachable\n * - Reachable(M') :- Reachable(M) AND enabled(M,t) AND fire(M,M',t) — transition rules\n * - Error() :- Reachable(M) AND property_violation(M) — safety property\n */\nexport function encode(\n ctx: Z3Context,\n fp: Z3Fixedpoint,\n flatNet: FlatNet,\n initialMarking: MarkingState,\n property: SmtProperty,\n invariants: readonly PInvariant[],\n sinkPlaces: ReadonlySet<Place<any>> = new Set(),\n): EncodingResult {\n const P = flatNet.places.length;\n const Int = ctx.Int;\n const Bool_ = ctx.Bool;\n\n // Create sorts array for function declaration\n const intSort = Int.sort();\n const boolSort = Bool_.sort();\n const markingSorts: any[] = new Array(P).fill(intSort);\n\n // Create the Reachable relation: (Int, Int, ...) -> Bool\n const reachable: FuncDecl = ctx.Function.declare('Reachable', ...markingSorts, boolSort);\n fp.registerRelation(reachable);\n\n // Create the Error relation: () -> Bool\n const error: FuncDecl = ctx.Function.declare('Error', boolSort);\n fp.registerRelation(error);\n\n // === Rule 1: Initial state ===\n // Reachable(m0_0, m0_1, ..., m0_{P-1})\n const m0Args: Arith[] = [];\n for (let i = 0; i < P; i++) {\n const tokens = initialMarking.tokens(flatNet.places[i]!);\n m0Args.push(Int.val(tokens));\n }\n const initFact = (reachable as any).call(...m0Args) as Bool;\n fp.addRule(initFact, 'init');\n\n // === Rule 2: Transition rules ===\n for (let t = 0; t < flatNet.transitions.length; t++) {\n const ft = flatNet.transitions[t]!;\n encodeTransitionRule(ctx, fp, reachable, ft, flatNet, invariants, P);\n }\n\n // === Rule 3: Error rule (property violation) ===\n encodeErrorRule(ctx, fp, reachable, error, flatNet, property, sinkPlaces, P);\n\n return {\n errorExpr: (error as any).call() as Bool,\n reachableDecl: reachable,\n };\n}\n\nfunction encodeTransitionRule(\n ctx: Z3Context,\n fp: Z3Fixedpoint,\n reachable: FuncDecl,\n ft: FlatTransition,\n flatNet: FlatNet,\n invariants: readonly PInvariant[],\n P: number,\n): void {\n const Int = ctx.Int;\n\n // Create named variables for current and next marking\n const mVars: Arith[] = [];\n const mPrimeVars: Arith[] = [];\n for (let i = 0; i < P; i++) {\n mVars.push(Int.const(`m${i}`));\n mPrimeVars.push(Int.const(`mp${i}`));\n }\n\n // Body: Reachable(M) AND enabled(M,t) AND fire(M,M',t) AND non-negativity(M') AND invariants(M') AND env bounds(M')\n const reachBody = (reachable as any).call(...mVars) as Bool;\n const enabled = encodeEnabled(ctx, ft, flatNet, mVars, P);\n const fireRelation = encodeFire(ctx, ft, flatNet, mVars, mPrimeVars, P);\n\n // Non-negativity of M'\n let nonNeg: Bool = ctx.Bool.val(true);\n for (let i = 0; i < P; i++) {\n nonNeg = ctx.And(nonNeg, mPrimeVars[i]!.ge(0));\n }\n\n // P-invariant constraints on M'\n const invConstraints = encodeInvariantConstraints(ctx, invariants, mPrimeVars, P);\n\n // Environment bounds on M'\n let envBounds: Bool = ctx.Bool.val(true);\n for (const [name, bound] of flatNet.environmentBounds) {\n const idx = flatNet.placeIndex.get(name);\n if (idx != null) {\n envBounds = ctx.And(envBounds, mPrimeVars[idx]!.le(bound));\n }\n }\n\n // Body conjunction\n const body = ctx.And(reachBody, enabled, fireRelation, nonNeg, invConstraints, envBounds);\n\n // Head: Reachable(M')\n const head = (reachable as any).call(...mPrimeVars) as Bool;\n\n // Rule: forall M, M'. body => head\n const allVars = [...mVars, ...mPrimeVars];\n const rule = ctx.Implies(body, head);\n const qRule = ctx.ForAll(allVars, rule);\n\n fp.addRule(qRule, `t_${ft.name}`);\n}\n\nfunction encodeEnabled(\n ctx: Z3Context,\n ft: FlatTransition,\n _flatNet: FlatNet,\n mVars: Arith[],\n P: number,\n): Bool {\n let result: Bool = ctx.Bool.val(true);\n\n // Input requirements: M[p] >= pre[p]\n for (let p = 0; p < P; p++) {\n if (ft.preVector[p]! > 0) {\n result = ctx.And(result, mVars[p]!.ge(ft.preVector[p]!));\n }\n }\n\n // Read arcs: M[p] >= 1\n for (const p of ft.readPlaces) {\n result = ctx.And(result, mVars[p]!.ge(1));\n }\n\n // Inhibitor arcs: M[p] == 0\n for (const p of ft.inhibitorPlaces) {\n result = ctx.And(result, mVars[p]!.eq(0));\n }\n\n // Non-negativity of current marking\n for (let p = 0; p < P; p++) {\n result = ctx.And(result, mVars[p]!.ge(0));\n }\n\n return result;\n}\n\nfunction encodeFire(\n ctx: Z3Context,\n ft: FlatTransition,\n _flatNet: FlatNet,\n mVars: Arith[],\n mPrimeVars: Arith[],\n P: number,\n): Bool {\n let result: Bool = ctx.Bool.val(true);\n\n for (let p = 0; p < P; p++) {\n const isReset = ft.resetPlaces.includes(p);\n\n if (isReset || ft.consumeAll[p]) {\n // Reset/consumeAll: M'[p] = post[p]\n result = ctx.And(result, mPrimeVars[p]!.eq(ft.postVector[p]!));\n } else {\n // Standard: M'[p] = M[p] - pre[p] + post[p]\n const delta = ft.postVector[p]! - ft.preVector[p]!;\n if (delta === 0) {\n result = ctx.And(result, mPrimeVars[p]!.eq(mVars[p]!));\n } else {\n result = ctx.And(result, mPrimeVars[p]!.eq(mVars[p]!.add(delta)));\n }\n }\n }\n\n return result;\n}\n\nfunction encodeErrorRule(\n ctx: Z3Context,\n fp: Z3Fixedpoint,\n reachable: FuncDecl,\n error: FuncDecl,\n flatNet: FlatNet,\n property: SmtProperty,\n sinkPlaces: ReadonlySet<Place<any>>,\n P: number,\n): void {\n const Int = ctx.Int;\n\n // Create variables for the error rule\n const mVars: Arith[] = [];\n for (let i = 0; i < P; i++) {\n mVars.push(Int.const(`em${i}`));\n }\n\n const reachBody = (reachable as any).call(...mVars) as Bool;\n const violation = encodePropertyViolation(ctx, flatNet, property, sinkPlaces, mVars, P);\n\n const head = (error as any).call() as Bool;\n const body = ctx.And(reachBody, violation);\n const rule = ctx.Implies(body, head);\n const qRule = ctx.ForAll(mVars, rule);\n\n fp.addRule(qRule, `error_${property.type}`);\n}\n\nfunction encodePropertyViolation(\n ctx: Z3Context,\n flatNet: FlatNet,\n property: SmtProperty,\n sinkPlaces: ReadonlySet<Place<any>>,\n mVars: Arith[],\n P: number,\n): Bool {\n switch (property.type) {\n case 'deadlock-free': {\n const deadlock = encodeDeadlock(ctx, flatNet, mVars, P);\n if (sinkPlaces.size > 0) {\n // Deadlock is only a violation if NOT at any expected sink place\n let notAtSink: Bool = ctx.Bool.val(true);\n for (const sink of sinkPlaces) {\n const idx = flatNetIndexOf(flatNet, sink);\n if (idx >= 0) {\n notAtSink = ctx.And(notAtSink, mVars[idx]!.eq(0));\n }\n }\n return ctx.And(deadlock, notAtSink);\n }\n return deadlock;\n }\n\n case 'mutual-exclusion': {\n const idx1 = flatNetIndexOf(flatNet, property.p1);\n const idx2 = flatNetIndexOf(flatNet, property.p2);\n if (idx1 < 0) throw new Error(`MutualExclusion references unknown place: ${property.p1.name}`);\n if (idx2 < 0) throw new Error(`MutualExclusion references unknown place: ${property.p2.name}`);\n return ctx.And(mVars[idx1]!.ge(1), mVars[idx2]!.ge(1));\n }\n\n case 'place-bound': {\n const idx = flatNetIndexOf(flatNet, property.place);\n if (idx < 0) throw new Error(`PlaceBound references unknown place: ${property.place.name}`);\n return mVars[idx]!.gt(property.bound);\n }\n\n case 'unreachable': {\n let allMarked: Bool = ctx.Bool.val(true);\n for (const place of property.places) {\n const idx = flatNetIndexOf(flatNet, place);\n if (idx >= 0) {\n allMarked = ctx.And(allMarked, mVars[idx]!.ge(1));\n }\n }\n return allMarked;\n }\n }\n}\n\n/** Encodes the deadlock condition: no transition is enabled. */\nfunction encodeDeadlock(\n ctx: Z3Context,\n flatNet: FlatNet,\n mVars: Arith[],\n P: number,\n): Bool {\n let deadlock: Bool = ctx.Bool.val(true);\n\n for (const ft of flatNet.transitions) {\n const enabled = encodeEnabled(ctx, ft, flatNet, mVars, P);\n deadlock = ctx.And(deadlock, ctx.Not(enabled));\n }\n\n return deadlock;\n}\n\nfunction encodeInvariantConstraints(\n ctx: Z3Context,\n invariants: readonly PInvariant[],\n mVars: Arith[],\n P: number,\n): Bool {\n let result: Bool = ctx.Bool.val(true);\n\n for (const inv of invariants) {\n // sum(y_i * M[i]) == constant\n let sum: Arith = ctx.Int.val(0);\n for (const idx of inv.support) {\n if (idx < P) {\n sum = sum.add(mVars[idx]!.mul(inv.weights[idx]!));\n }\n }\n result = ctx.And(result, sum.eq(inv.constant));\n }\n\n return result;\n}\n","import type { Expr } from 'z3-solver';\nimport { MarkingState } from '../marking-state.js';\nimport type { FlatNet } from '../encoding/flat-net.js';\n\n/**\n * Result of counterexample decoding.\n */\nexport interface DecodedTrace {\n readonly trace: readonly MarkingState[];\n readonly transitions: readonly string[];\n}\n\n/**\n * Decodes Z3 Spacer counterexample answers into Petri net marking traces.\n *\n * When Spacer finds a counterexample (property violation), it produces\n * a derivation tree showing how the error state is reachable. This function\n * extracts the marking at each step to produce a human-readable trace.\n */\nexport function decode(ctx: any, answer: Expr | null, flatNet: FlatNet): DecodedTrace {\n const trace: MarkingState[] = [];\n const transitions: string[] = [];\n\n if (answer == null) {\n return { trace, transitions };\n }\n\n try {\n extractTrace(ctx, answer, flatNet, trace, transitions);\n } catch {\n // Z3 answer format varies; gracefully degrade\n }\n\n return { trace, transitions };\n}\n\n/**\n * Recursively traverses the Z3 proof tree to extract marking states.\n */\nfunction extractTrace(\n ctx: any,\n expr: any,\n flatNet: FlatNet,\n trace: MarkingState[],\n transitions: string[],\n): void {\n if (expr == null) return;\n\n // Check if this is a function application\n if (!ctx.isApp(expr)) return;\n\n let name: string;\n try {\n const decl = expr.decl();\n name = String(decl.name());\n } catch {\n return;\n }\n\n // Check if this is a Reachable application with integer arguments\n const P = flatNet.places.length;\n if (name === 'Reachable') {\n const numArgs = expr.numArgs();\n if (numArgs === P) {\n const marking = extractMarking(ctx, expr, flatNet);\n if (marking != null) {\n trace.push(marking);\n }\n }\n }\n\n // Recurse into children to find the derivation chain\n try {\n const numArgs = expr.numArgs();\n for (let i = 0; i < numArgs; i++) {\n const child = expr.arg(i);\n extractTrace(ctx, child, flatNet, trace, transitions);\n }\n } catch {\n // Not all expressions support arg()\n }\n\n // Try to extract transition name from rule application\n if (name.startsWith('t_')) {\n transitions.push(name.substring(2));\n }\n}\n\n/**\n * Extracts a MarkingState from a Reachable(...) application.\n */\nfunction extractMarking(ctx: any, reachableApp: any, flatNet: FlatNet): MarkingState | null {\n const P = flatNet.places.length;\n if (reachableApp.numArgs() !== P) return null;\n\n const builder = MarkingState.builder();\n for (let i = 0; i < P; i++) {\n const arg = reachableApp.arg(i);\n if (ctx.isIntVal(arg)) {\n const tokens = Number(arg.value());\n if (tokens > 0) {\n builder.tokens(flatNet.places[i]!, tokens);\n }\n } else {\n // Non-concrete value in counterexample\n return null;\n }\n }\n return builder.build();\n}\n","import type { PetriNet } from '../core/petri-net.js';\nimport type { EnvironmentPlace, Place } from '../core/place.js';\nimport { MarkingState, MarkingStateBuilder } from './marking-state.js';\nimport type { SmtProperty } from './smt-property.js';\nimport { deadlockFree, propertyDescription } from './smt-property.js';\nimport type { SmtVerificationResult, SmtStatistics, Verdict } from './smt-verification-result.js';\nimport type { PInvariant } from './invariant/p-invariant.js';\nimport type { FlatNet } from './encoding/flat-net.js';\nimport { flatten, type EnvironmentAnalysisMode, unbounded } from './encoding/net-flattener.js';\nimport { IncidenceMatrix } from './encoding/incidence-matrix.js';\nimport { computePInvariants, isCoveredByInvariants } from './invariant/p-invariant-computer.js';\nimport { structuralCheck } from './invariant/structural-check.js';\nimport { createSpacerRunner } from './z3/spacer-runner.js';\nimport { encode } from './z3/smt-encoder.js';\nimport { decode } from './z3/counterexample-decoder.js';\n\n/**\n * IC3/PDR-based safety verifier for Petri nets using Z3's Spacer engine.\n *\n * Proves safety properties (especially deadlock-freedom) without\n * enumerating all reachable states. IC3 constructs inductive invariants\n * incrementally, which works well for bounded nets.\n *\n * Key design decisions:\n * - Operates on the marking projection (integer vectors) — no timing\n * - An untimed deadlock-freedom proof is stronger than needed\n * (timing can only restrict behavior)\n * - Guards are ignored — over-approximation is sound for safety properties\n * - If a counterexample is found, it may be spurious in timed/guarded\n * semantics — the report notes this\n *\n * Verification Pipeline:\n * 1. Flatten — expand XOR, index places, build pre/post vectors\n * 2. Structural pre-check — siphon/trap analysis (may prove early)\n * 3. P-invariants — compute conservation laws for strengthening\n * 4. SMT encode + query — IC3/PDR via Z3 Spacer\n * 5. Decode result — proof or counterexample trace\n */\nexport class SmtVerifier {\n private _initialMarking: MarkingState = MarkingState.empty();\n private _property: SmtProperty = deadlockFree();\n private readonly _environmentPlaces = new Set<EnvironmentPlace<any>>();\n private readonly _sinkPlaces = new Set<Place<any>>();\n private _environmentMode: EnvironmentAnalysisMode = unbounded();\n private _timeoutMs: number = 60_000;\n\n private constructor(private readonly net: PetriNet) {}\n\n static forNet(net: PetriNet): SmtVerifier {\n return new SmtVerifier(net);\n }\n\n initialMarking(marking: MarkingState): this;\n initialMarking(configurator: (builder: MarkingStateBuilder) => void): this;\n initialMarking(arg: MarkingState | ((builder: MarkingStateBuilder) => void)): this {\n if (arg instanceof MarkingState) {\n this._initialMarking = arg;\n } else {\n const builder = MarkingState.builder();\n arg(builder);\n this._initialMarking = builder.build();\n }\n return this;\n }\n\n property(property: SmtProperty): this {\n this._property = property;\n return this;\n }\n\n environmentPlaces(...places: EnvironmentPlace<any>[]): this {\n for (const p of places) this._environmentPlaces.add(p);\n return this;\n }\n\n environmentMode(mode: EnvironmentAnalysisMode): this {\n this._environmentMode = mode;\n return this;\n }\n\n /**\n * Declares expected sink (terminal) places for deadlock-freedom analysis.\n * Markings where any sink place has a token are not considered deadlocks.\n */\n sinkPlaces(...places: Place<any>[]): this {\n for (const p of places) this._sinkPlaces.add(p);\n return this;\n }\n\n timeout(ms: number): this {\n this._timeoutMs = ms;\n return this;\n }\n\n /**\n * Runs the verification pipeline.\n */\n async verify(): Promise<SmtVerificationResult> {\n const start = performance.now();\n const report: string[] = [];\n report.push('=== IC3/PDR SAFETY VERIFICATION ===\\n');\n report.push(`Net: ${this.net.name}`);\n const propDesc = this._sinkPlaces.size === 0\n ? propertyDescription(this._property)\n : `${propertyDescription(this._property)} (sinks: ${[...this._sinkPlaces].map(p => p.name).join(', ')})`;\n report.push(`Property: ${propDesc}`);\n report.push(`Timeout: ${(this._timeoutMs / 1000).toFixed(0)}s\\n`);\n\n // Phase 1: Flatten\n report.push('Phase 1: Flattening net...');\n const flatNet = flatten(this.net, this._environmentPlaces, this._environmentMode);\n report.push(` Places: ${flatNet.places.length}`);\n report.push(` Transitions (expanded): ${flatNet.transitions.length}`);\n if (flatNet.environmentBounds.size > 0) {\n report.push(` Environment bounds: ${flatNet.environmentBounds.size} places`);\n }\n report.push('');\n\n // Phase 2: Structural pre-check\n report.push('Phase 2: Structural pre-check (siphon/trap)...');\n const structResult = structuralCheck(flatNet, this._initialMarking);\n let structResultStr: string;\n switch (structResult.type) {\n case 'no-potential-deadlock':\n structResultStr = 'no potential deadlock';\n break;\n case 'potential-deadlock':\n structResultStr = `potential deadlock (siphon: {${[...structResult.siphon].join(',')}})`;\n break;\n case 'inconclusive':\n structResultStr = `inconclusive (${structResult.reason})`;\n break;\n }\n report.push(` Result: ${structResultStr}\\n`);\n\n // If structural check proves deadlock-freedom for DeadlockFree property\n // (only valid when no sink places — structural check doesn't account for sinks)\n if (\n this._property.type === 'deadlock-free' &&\n this._sinkPlaces.size === 0 &&\n structResult.type === 'no-potential-deadlock'\n ) {\n report.push('=== RESULT ===\\n');\n report.push('PROVEN (structural): Deadlock-freedom verified by Commoner\\'s theorem.');\n report.push(' All siphons contain initially marked traps.');\n return buildResult(\n { type: 'proven', method: 'structural', inductiveInvariant: null },\n report.join('\\n'), [], [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: 0, structuralResult: structResultStr },\n );\n }\n\n // Phase 3: P-invariants\n report.push('Phase 3: Computing P-invariants...');\n const matrix = IncidenceMatrix.from(flatNet);\n const invariants = computePInvariants(matrix, flatNet, this._initialMarking);\n report.push(` Found: ${invariants.length} P-invariant(s)`);\n const structurallyBounded = isCoveredByInvariants(invariants, flatNet.places.length);\n report.push(` Structurally bounded: ${structurallyBounded ? 'YES' : 'NO'}`);\n for (const inv of invariants) {\n report.push(` ${formatInvariant(inv, flatNet)}`);\n }\n report.push('');\n\n // Phase 4: SMT encode + query via Spacer\n report.push('Phase 4: IC3/PDR verification via Z3 Spacer...');\n\n let runner;\n try {\n runner = await createSpacerRunner(this._timeoutMs);\n } catch (e: any) {\n report.push(` ERROR: ${e.message ?? e}\\n`);\n report.push('=== RESULT ===\\n');\n report.push(`UNKNOWN: Z3 initialization error: ${e.message ?? e}`);\n return buildResult(\n { type: 'unknown', reason: `Z3 init error: ${e.message ?? e}` },\n report.join('\\n'), invariants, [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n\n try {\n const encoding = encode(runner.ctx, runner.fp, flatNet, this._initialMarking, this._property, invariants, this._sinkPlaces);\n const queryResult = await runner.query(encoding.errorExpr, encoding.reachableDecl);\n\n switch (queryResult.type) {\n case 'proven': {\n report.push(' Status: UNSAT (property holds)\\n');\n\n // Decode IC3-synthesized invariants with place name substitution\n const discoveredInvariants: string[] = [];\n if (queryResult.invariantFormula != null) {\n discoveredInvariants.push(substituteNames(queryResult.invariantFormula, flatNet));\n }\n for (const level of queryResult.levelInvariants) {\n discoveredInvariants.push(substituteNames(level, flatNet));\n }\n\n // Phase 5: Inductive invariant\n if (discoveredInvariants.length > 0) {\n report.push('Phase 5: Inductive invariant (discovered by IC3)');\n report.push(` Spacer synthesized: ${discoveredInvariants[0]}`);\n report.push(' This formula is INDUCTIVE: preserved by all transitions.');\n if (discoveredInvariants.length > 1) {\n report.push(' Per-level clauses:');\n for (let i = 1; i < discoveredInvariants.length; i++) {\n report.push(` ${discoveredInvariants[i]}`);\n }\n }\n report.push('');\n }\n\n report.push('=== RESULT ===\\n');\n report.push(`PROVEN (IC3/PDR): ${propDesc}`);\n report.push(' Z3 Spacer proved no reachable state violates the property.');\n report.push(' NOTE: Verification ignores timing constraints and JS guards.');\n report.push(' An untimed proof is STRONGER than a timed one (timing only restricts behavior).');\n\n return buildResult(\n {\n type: 'proven',\n method: 'IC3/PDR',\n inductiveInvariant: queryResult.invariantFormula != null\n ? substituteNames(queryResult.invariantFormula, flatNet)\n : null,\n },\n report.join('\\n'), invariants, discoveredInvariants, [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n\n case 'violated': {\n report.push(' Status: SAT (counterexample found)\\n');\n\n const decoded = decode(runner.ctx, queryResult.answer, flatNet);\n\n report.push('=== RESULT ===\\n');\n report.push(`VIOLATED: ${propDesc}`);\n if (decoded.trace.length > 0) {\n report.push(` Counterexample trace (${decoded.trace.length} states):`);\n for (let i = 0; i < decoded.trace.length; i++) {\n report.push(` ${i}: ${decoded.trace[i]}`);\n }\n }\n if (decoded.transitions.length > 0) {\n report.push(` Firing sequence: ${decoded.transitions.join(' -> ')}`);\n }\n report.push('\\n WARNING: This counterexample is in UNTIMED semantics.');\n report.push(' It may be spurious if timing constraints prevent this sequence.');\n report.push(' JS guards are also ignored in this analysis.');\n\n return buildResult(\n { type: 'violated' },\n report.join('\\n'), invariants, [], decoded.trace as MarkingState[], decoded.transitions as string[],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n\n case 'unknown': {\n report.push(` Status: UNKNOWN (${queryResult.reason})\\n`);\n report.push('=== RESULT ===\\n');\n report.push(`UNKNOWN: Could not determine ${propDesc}`);\n report.push(` Reason: ${queryResult.reason}`);\n\n return buildResult(\n { type: 'unknown', reason: queryResult.reason },\n report.join('\\n'), invariants, [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n }\n }\n } catch (e: any) {\n report.push(` ERROR: ${e.message ?? e}\\n`);\n report.push('=== RESULT ===\\n');\n report.push(`UNKNOWN: Z3 solver error: ${e.message ?? e}`);\n\n return buildResult(\n { type: 'unknown', reason: `Z3 error: ${e.message ?? e}` },\n report.join('\\n'), invariants, [], [], [],\n performance.now() - start,\n { places: flatNet.places.length, transitions: flatNet.transitions.length, invariantsFound: invariants.length, structuralResult: structResultStr },\n );\n } finally {\n runner.dispose();\n }\n }\n}\n\n/**\n * Substitutes Z3 variable names (m0, m1, ...) with place names in a formula string.\n */\nfunction substituteNames(formula: string, flatNet: FlatNet): string {\n // Replace from highest index first to avoid m1 matching inside m10\n for (let i = flatNet.places.length - 1; i >= 0; i--) {\n formula = formula.replace(new RegExp(`\\\\bm${i}\\\\b`, 'g'), flatNet.places[i]!.name);\n }\n return formula;\n}\n\nfunction formatInvariant(inv: PInvariant, flatNet: FlatNet): string {\n const parts: string[] = [];\n for (const idx of inv.support) {\n if (inv.weights[idx] !== 1) {\n parts.push(`${inv.weights[idx]}*${flatNet.places[idx]!.name}`);\n } else {\n parts.push(flatNet.places[idx]!.name);\n }\n }\n return `${parts.join(' + ')} = ${inv.constant}`;\n}\n\nfunction buildResult(\n verdict: Verdict,\n report: string,\n invariants: readonly PInvariant[],\n discoveredInvariants: readonly string[],\n trace: readonly MarkingState[],\n transitions: readonly string[],\n elapsedMs: number,\n statistics: SmtStatistics,\n): SmtVerificationResult {\n return { verdict, report, invariants, discoveredInvariants, counterexampleTrace: trace, counterexampleTransitions: transitions, elapsedMs, statistics };\n}\n","const EPSILON = 1e-9;\n\n/**\n * Difference Bound Matrix (DBM) for Time Petri Net state class analysis.\n *\n * Implements the Berthomieu-Diaz (1991) algorithm for computing firing domains\n * and their successors. Matrix bounds[i][j] = upper bound on (xi - xj).\n * Index 0 is the reference clock; index i+1 is the clock for transition i.\n */\nexport class DBM {\n private readonly bounds: Float64Array;\n private readonly dim: number;\n readonly clockNames: readonly string[];\n private readonly _empty: boolean;\n\n private constructor(bounds: Float64Array, dim: number, clockNames: readonly string[], empty: boolean) {\n this.bounds = bounds;\n this.dim = dim;\n this.clockNames = clockNames;\n this._empty = empty;\n }\n\n /** Creates an initial firing domain for enabled transitions. */\n static create(clockNames: readonly string[], lowerBounds: number[], upperBounds: number[]): DBM {\n const n = clockNames.length;\n const dim = n + 1;\n const bounds = makeMatrix(dim, Infinity);\n\n for (let i = 0; i < n; i++) {\n bounds[(0) * dim + (i + 1)] = -lowerBounds[i]!;\n bounds[(i + 1) * dim + (0)] = upperBounds[i]!;\n }\n\n return new DBM(bounds, dim, clockNames, false).canonicalize();\n }\n\n /** Creates an empty (unsatisfiable) zone. */\n static empty(clockNames: readonly string[]): DBM {\n const b = new Float64Array(1);\n b[0] = 0;\n return new DBM(b, 1, clockNames, true);\n }\n\n isEmpty(): boolean {\n return this._empty;\n }\n\n clockCount(): number {\n return this.clockNames.length;\n }\n\n private get(i: number, j: number): number {\n return this.bounds[i * this.dim + j]!;\n }\n\n /** Gets the lower bound (earliest firing time) for clock i. */\n getLowerBound(clockIndex: number): number {\n if (this._empty || clockIndex < 0 || clockIndex >= this.clockNames.length) return 0;\n const val = -this.get(0, clockIndex + 1);\n return val === 0 ? 0 : val; // normalize -0 to 0\n }\n\n /** Gets the upper bound (latest firing time / deadline) for clock i. */\n getUpperBound(clockIndex: number): number {\n if (this._empty || clockIndex < 0 || clockIndex >= this.clockNames.length) return Infinity;\n return this.get(clockIndex + 1, 0);\n }\n\n /** Checks if transition can fire (lower bound <= 0 after time passage). */\n canFire(clockIndex: number): boolean {\n return !this._empty && this.getLowerBound(clockIndex) <= EPSILON;\n }\n\n /**\n * Computes the successor firing domain after firing transition t_f.\n * Implements the 5-step Berthomieu-Diaz successor formula.\n */\n fireTransition(\n firedClock: number,\n newClockNames: readonly string[],\n newLowerBounds: number[],\n newUpperBounds: number[],\n persistentClocks: number[],\n ): DBM {\n if (this._empty) return this;\n\n const n = this.clockNames.length;\n if (firedClock < 0 || firedClock >= n) {\n throw new Error(`Invalid fired clock index: ${firedClock}`);\n }\n\n // Step 1: Intersect with \"t_f fires first\" constraint\n const constrained = new Float64Array(this.bounds);\n const dim = this.dim;\n const f = firedClock + 1;\n\n for (let i = 0; i < n; i++) {\n if (i !== firedClock) {\n const idx = i + 1;\n const pos = f * dim + idx;\n constrained[pos] = Math.min(constrained[pos]!, 0);\n }\n }\n\n // Step 2: Canonicalize\n if (!canonicalizeInPlace(constrained, dim)) {\n return DBM.empty([]);\n }\n\n // Steps 3 & 4: Substitution and Elimination\n const newN = persistentClocks.length + newClockNames.length;\n const newDim = newN + 1;\n const newBounds = makeMatrix(newDim, Infinity);\n\n // Copy persistent clocks with transformed bounds\n for (let pi = 0; pi < persistentClocks.length; pi++) {\n const oldIdx = persistentClocks[pi]! + 1;\n const newIdx = pi + 1;\n\n const upper = constrained[oldIdx * dim + f]!;\n const lower = Math.max(0, -constrained[f * dim + oldIdx]!);\n\n newBounds[0 * newDim + newIdx] = -lower;\n newBounds[newIdx * newDim + 0] = upper;\n\n // Inter-clock constraints between persistent transitions (preserved)\n for (let pj = 0; pj < persistentClocks.length; pj++) {\n const oldJ = persistentClocks[pj]! + 1;\n const newJ = pj + 1;\n newBounds[newIdx * newDim + newJ] = constrained[oldIdx * dim + oldJ]!;\n }\n }\n\n // Step 5: Add fresh intervals for newly enabled transitions\n const offset = persistentClocks.length;\n for (let k = 0; k < newClockNames.length; k++) {\n const idx = offset + k + 1;\n newBounds[0 * newDim + idx] = -newLowerBounds[k]!;\n newBounds[idx * newDim + 0] = newUpperBounds[k]!;\n }\n\n // Build new clock names\n const allNames: string[] = [];\n for (const idx of persistentClocks) {\n allNames.push(this.clockNames[idx]!);\n }\n allNames.push(...newClockNames);\n\n // Step 6: Final canonicalization\n return new DBM(newBounds, newDim, allNames, false).canonicalize();\n }\n\n /** Lets time pass: set all lower bounds to 0. */\n letTimePass(): DBM {\n if (this._empty) return this;\n\n const newBounds = new Float64Array(this.bounds);\n for (let i = 1; i < this.dim; i++) {\n newBounds[0 * this.dim + i] = 0;\n }\n\n return new DBM(newBounds, this.dim, this.clockNames, false).canonicalize();\n }\n\n private canonicalize(): DBM {\n if (this._empty) return this;\n\n const canon = new Float64Array(this.bounds);\n if (!canonicalizeInPlace(canon, this.dim)) {\n return DBM.empty(this.clockNames);\n }\n return new DBM(canon, this.dim, this.clockNames, false);\n }\n\n equals(other: DBM): boolean {\n if (this === other) return true;\n if (this._empty && other._empty) return true;\n if (this._empty || other._empty) return false;\n if (this.clockNames.length !== other.clockNames.length) return false;\n for (let i = 0; i < this.clockNames.length; i++) {\n if (this.clockNames[i] !== other.clockNames[i]) return false;\n }\n if (this.bounds.length !== other.bounds.length) return false;\n for (let i = 0; i < this.bounds.length; i++) {\n if (Math.abs(this.bounds[i]! - other.bounds[i]!) > EPSILON) return false;\n }\n return true;\n }\n\n toString(): string {\n if (this._empty) return 'DBM[empty]';\n const parts: string[] = [];\n for (let i = 0; i < this.clockNames.length; i++) {\n const lo = formatBound(this.getLowerBound(i));\n const hi = formatBound(this.getUpperBound(i));\n parts.push(`${this.clockNames[i]}:[${lo},${hi}]`);\n }\n return `DBM{${parts.join(', ')}}`;\n }\n}\n\nfunction makeMatrix(dim: number, fill: number): Float64Array {\n const m = new Float64Array(dim * dim).fill(fill);\n for (let i = 0; i < dim; i++) {\n m[i * dim + i] = 0;\n }\n return m;\n}\n\nfunction canonicalizeInPlace(dbm: Float64Array, dim: number): boolean {\n for (let k = 0; k < dim; k++) {\n for (let i = 0; i < dim; i++) {\n for (let j = 0; j < dim; j++) {\n const ik = dbm[i * dim + k]!;\n const kj = dbm[k * dim + j]!;\n if (ik < Infinity && kj < Infinity) {\n const via = ik + kj;\n if (via < dbm[i * dim + j]!) {\n dbm[i * dim + j] = via;\n }\n }\n }\n }\n }\n for (let i = 0; i < dim; i++) {\n if (dbm[i * dim + i]! < -EPSILON) return false;\n }\n return true;\n}\n\nfunction formatBound(b: number): string {\n if (b >= Infinity / 2) return '\\u221e';\n if (b === Math.trunc(b)) return String(b);\n return b.toFixed(3);\n}\n","import type { Transition } from '../../core/transition.js';\nimport type { MarkingState } from '../marking-state.js';\nimport type { DBM } from './dbm.js';\n\n/**\n * A State Class in Time Petri Net analysis.\n *\n * A state class is a pair (M, D) where M is a marking and D is a firing domain (DBM).\n * State classes provide a finite abstraction of the infinite state space of Time Petri Nets.\n */\nexport class StateClass {\n readonly marking: MarkingState;\n readonly firingDomain: DBM;\n readonly enabledTransitions: readonly Transition[];\n\n constructor(marking: MarkingState, firingDomain: DBM, enabledTransitions: readonly Transition[]) {\n this.marking = marking;\n this.firingDomain = firingDomain;\n this.enabledTransitions = [...enabledTransitions];\n }\n\n isEmpty(): boolean {\n return this.firingDomain.isEmpty();\n }\n\n canFire(transition: Transition): boolean {\n const idx = this.enabledTransitions.indexOf(transition);\n if (idx < 0) return false;\n return this.firingDomain.getUpperBound(idx) >= 0;\n }\n\n transitionIndex(transition: Transition): number {\n return this.enabledTransitions.indexOf(transition);\n }\n\n equals(other: StateClass): boolean {\n if (this === other) return true;\n return this.marking.toString() === other.marking.toString()\n && this.firingDomain.equals(other.firingDomain);\n }\n\n toString(): string {\n return `StateClass{${this.marking}, ${this.firingDomain}}`;\n }\n}\n","/**\n * Strongly Connected Component analysis using Tarjan's algorithm.\n * Generic over node type T. Uses a key function for Map-based lookups.\n */\n\n/** Computes all SCCs in a graph. O(V + E) via Tarjan's algorithm. */\nexport function computeSCCs<T>(\n nodes: Iterable<T>,\n successors: (node: T) => Iterable<T>,\n): Set<T>[] {\n const nodeArray = [...nodes];\n const indexMap = new Map<T, number>();\n const lowlink = new Map<T, number>();\n const onStack = new Set<T>();\n const stack: T[] = [];\n const sccs: Set<T>[] = [];\n let index = 0;\n\n function strongConnect(v: T): void {\n indexMap.set(v, index);\n lowlink.set(v, index);\n index++;\n stack.push(v);\n onStack.add(v);\n\n for (const w of successors(v)) {\n if (!indexMap.has(w)) {\n strongConnect(w);\n lowlink.set(v, Math.min(lowlink.get(v)!, lowlink.get(w)!));\n } else if (onStack.has(w)) {\n lowlink.set(v, Math.min(lowlink.get(v)!, indexMap.get(w)!));\n }\n }\n\n if (lowlink.get(v) === indexMap.get(v)) {\n const scc = new Set<T>();\n let w: T;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n scc.add(w);\n } while (w !== v);\n sccs.push(scc);\n }\n }\n\n for (const node of nodeArray) {\n if (!indexMap.has(node)) {\n strongConnect(node);\n }\n }\n\n return sccs;\n}\n\n/** Finds terminal (bottom) SCCs — SCCs with no outgoing edges to other SCCs. */\nexport function findTerminalSCCs<T>(\n nodes: Iterable<T>,\n successors: (node: T) => Iterable<T>,\n): Set<T>[] {\n const allSCCs = computeSCCs(nodes, successors);\n\n const terminal: Set<T>[] = [];\n for (const scc of allSCCs) {\n let isTerminal = true;\n for (const node of scc) {\n for (const succ of successors(node)) {\n if (!scc.has(succ)) {\n isTerminal = false;\n break;\n }\n }\n if (!isTerminal) break;\n }\n if (isTerminal) {\n terminal.push(scc);\n }\n }\n\n return terminal;\n}\n","/**\n * Analysis mode for environment places in state class graph construction.\n */\nexport type EnvironmentAnalysisMode =\n | { readonly type: 'always-available' }\n | { readonly type: 'bounded'; readonly maxTokens: number }\n | { readonly type: 'ignore' };\n\n/** Assumes environment places always have sufficient tokens. */\nexport function alwaysAvailable(): EnvironmentAnalysisMode {\n return { type: 'always-available' };\n}\n\n/** Analyzes with a bounded number of tokens in environment places. */\nexport function bounded(maxTokens: number): EnvironmentAnalysisMode {\n if (maxTokens < 0) throw new Error('maxTokens must be non-negative');\n return { type: 'bounded', maxTokens };\n}\n\n/** Treats environment places as regular places (default). */\nexport function ignore(): EnvironmentAnalysisMode {\n return { type: 'ignore' };\n}\n","import type { Place } from '../../core/place.js';\nimport type { EnvironmentPlace } from '../../core/place.js';\nimport type { In } from '../../core/in.js';\nimport type { Transition } from '../../core/transition.js';\nimport type { PetriNet } from '../../core/petri-net.js';\nimport { earliest, latest } from '../../core/timing.js';\nimport { enumerateBranches } from '../../core/out.js';\nimport { MarkingState } from '../marking-state.js';\nimport { DBM } from './dbm.js';\nimport { StateClass } from './state-class.js';\nimport type { EnvironmentAnalysisMode } from './environment-analysis-mode.js';\nimport { ignore } from './environment-analysis-mode.js';\n\n/** Edge that tracks which XOR branch was taken. */\nexport interface BranchEdge {\n readonly branchIndex: number;\n readonly target: StateClass;\n}\n\ninterface VirtualTransition {\n readonly transition: Transition;\n readonly branchIndex: number;\n readonly outputPlaces: ReadonlySet<Place<any>>;\n}\n\n/**\n * State Class Graph for Time Petri Net analysis.\n *\n * Implements the Berthomieu-Diaz (1991) algorithm for computing the state class\n * graph of a bounded Time Petri Net.\n */\nexport class StateClassGraph {\n readonly net: PetriNet;\n readonly initialClass: StateClass;\n private readonly _stateClasses: StateClass[];\n private readonly _transitions: Map<StateClass, Map<Transition, BranchEdge[]>>;\n private readonly _successors: Map<StateClass, Set<StateClass>>;\n private readonly _predecessors: Map<StateClass, Set<StateClass>>;\n private readonly _complete: boolean;\n\n private constructor(\n net: PetriNet,\n initialClass: StateClass,\n stateClasses: StateClass[],\n transitions: Map<StateClass, Map<Transition, BranchEdge[]>>,\n complete: boolean,\n ) {\n this.net = net;\n this.initialClass = initialClass;\n this._stateClasses = stateClasses;\n this._transitions = transitions;\n this._complete = complete;\n\n // Build successor/predecessor maps\n this._successors = new Map();\n this._predecessors = new Map();\n for (const sc of stateClasses) {\n this._successors.set(sc, new Set());\n this._predecessors.set(sc, new Set());\n }\n for (const [from, tMap] of transitions) {\n for (const edges of tMap.values()) {\n for (const edge of edges) {\n this._successors.get(from)!.add(edge.target);\n this._predecessors.get(edge.target)!.add(from);\n }\n }\n }\n }\n\n /** Builds the state class graph for a Time Petri Net. */\n static build(\n net: PetriNet,\n initialMarking: MarkingState,\n maxClasses: number,\n environmentPlaces?: Set<EnvironmentPlace<any>>,\n environmentMode?: EnvironmentAnalysisMode,\n ): StateClassGraph {\n const envMode = environmentMode ?? ignore();\n const envPlaces = new Set<Place<any>>();\n if (environmentPlaces) {\n for (const ep of environmentPlaces) {\n envPlaces.add(ep.place);\n }\n }\n\n const enabledTransitions = findEnabledTransitions(net, initialMarking, envPlaces, envMode);\n const clockNames = enabledTransitions.map(t => t.name);\n const lowerBounds = enabledTransitions.map(t => earliest(t.timing) / 1000);\n const upperBounds = enabledTransitions.map(t => latest(t.timing) / 1000);\n\n let initialDBM = DBM.create(clockNames, lowerBounds, upperBounds);\n initialDBM = initialDBM.letTimePass();\n const initialClass = new StateClass(initialMarking, initialDBM, enabledTransitions);\n\n // BFS exploration\n const stateClasses: StateClass[] = [initialClass];\n const stateClassSet = new Set<string>([classKey(initialClass)]);\n const classMap = new Map<string, StateClass>([[classKey(initialClass), initialClass]]);\n const transitionMap = new Map<StateClass, Map<Transition, BranchEdge[]>>();\n transitionMap.set(initialClass, new Map());\n const queue: StateClass[] = [initialClass];\n let complete = true;\n\n while (queue.length > 0) {\n if (stateClasses.length >= maxClasses) {\n complete = false;\n break;\n }\n\n const current = queue.shift()!;\n\n for (const transition of current.enabledTransitions) {\n const virtualTransitions = expandTransition(transition);\n\n for (const vt of virtualTransitions) {\n const successor = computeSuccessor(net, current, vt, envPlaces, envMode);\n if (successor === null || successor.isEmpty()) continue;\n\n // Add edge with branch index\n const tEdges = transitionMap.get(current)!;\n if (!tEdges.has(transition)) tEdges.set(transition, []);\n tEdges.get(transition)!.push({ branchIndex: vt.branchIndex, target: successor });\n\n // Dedup state classes by key\n const key = classKey(successor);\n if (!stateClassSet.has(key)) {\n stateClassSet.add(key);\n classMap.set(key, successor);\n stateClasses.push(successor);\n transitionMap.set(successor, new Map());\n queue.push(successor);\n } else {\n // Rewrite edge target to existing canonical instance\n const canonical = classMap.get(key)!;\n if (canonical !== successor) {\n const edges = tEdges.get(transition)!;\n edges[edges.length - 1] = { branchIndex: vt.branchIndex, target: canonical };\n }\n }\n }\n }\n }\n\n return new StateClassGraph(net, initialClass, stateClasses, transitionMap, complete);\n }\n\n stateClasses(): readonly StateClass[] {\n return this._stateClasses;\n }\n\n size(): number {\n return this._stateClasses.length;\n }\n\n isComplete(): boolean {\n return this._complete;\n }\n\n successors(sc: StateClass): Set<StateClass> {\n return this._successors.get(sc) ?? new Set();\n }\n\n predecessors(sc: StateClass): Set<StateClass> {\n return this._predecessors.get(sc) ?? new Set();\n }\n\n /** Returns all outgoing transitions with their branch edges. */\n outgoingBranchEdges(sc: StateClass): Map<Transition, BranchEdge[]> {\n return this._transitions.get(sc) ?? new Map();\n }\n\n /** Returns the branch edges for a specific transition from a state class. */\n branchEdges(sc: StateClass, transition: Transition): BranchEdge[] {\n const map = this._transitions.get(sc);\n if (!map) return [];\n return map.get(transition) ?? [];\n }\n\n /** Returns all transitions that are enabled from a state class. */\n enabledTransitions(sc: StateClass): Set<Transition> {\n const map = this._transitions.get(sc);\n if (!map) return new Set();\n return new Set(map.keys());\n }\n\n /** Finds all state classes with a given marking. */\n classesWithMarking(marking: MarkingState): StateClass[] {\n const key = marking.toString();\n return this._stateClasses.filter(sc => sc.marking.toString() === key);\n }\n\n /** Checks if a marking is reachable. */\n isReachable(marking: MarkingState): boolean {\n const key = marking.toString();\n return this._stateClasses.some(sc => sc.marking.toString() === key);\n }\n\n /** Gets all reachable markings. */\n reachableMarkings(): Set<string> {\n const markings = new Set<string>();\n for (const sc of this._stateClasses) {\n markings.add(sc.marking.toString());\n }\n return markings;\n }\n\n /** Counts edges in the graph (each branch edge counts separately). */\n edgeCount(): number {\n let count = 0;\n for (const map of this._transitions.values()) {\n for (const edges of map.values()) {\n count += edges.length;\n }\n }\n return count;\n }\n\n toString(): string {\n return `StateClassGraph[classes=${this.size()}, edges=${this.edgeCount()}, complete=${this._complete}]`;\n }\n}\n\nfunction classKey(sc: StateClass): string {\n return `${sc.marking.toString()}|${sc.firingDomain.toString()}`;\n}\n\nfunction expandTransition(t: Transition): VirtualTransition[] {\n let branches: ReadonlyArray<ReadonlySet<Place<any>>>;\n\n if (t.outputSpec !== null) {\n branches = enumerateBranches(t.outputSpec);\n } else {\n branches = [new Set()];\n }\n\n return branches.map((outputPlaces, i) => ({\n transition: t,\n branchIndex: i,\n outputPlaces: outputPlaces as ReadonlySet<Place<any>>,\n }));\n}\n\nfunction computeSuccessor(\n net: PetriNet,\n current: StateClass,\n fired: VirtualTransition,\n environmentPlaces: Set<Place<any>>,\n environmentMode: EnvironmentAnalysisMode,\n): StateClass | null {\n const transition = fired.transition;\n\n // 1. Compute new marking\n const newMarking = fireTransition(current.marking, transition, fired.outputPlaces, environmentPlaces, environmentMode);\n\n // 2. Determine persistent and newly enabled transitions\n const newEnabledAll = findEnabledTransitions(net, newMarking, environmentPlaces, environmentMode);\n\n const persistent: Transition[] = [];\n const persistentIndices: number[] = [];\n for (let i = 0; i < current.enabledTransitions.length; i++) {\n const t = current.enabledTransitions[i]!;\n if (t !== transition && newEnabledAll.includes(t)) {\n persistent.push(t);\n persistentIndices.push(i);\n }\n }\n\n const newlyEnabled: Transition[] = [];\n for (const t of newEnabledAll) {\n if (!persistent.includes(t)) {\n newlyEnabled.push(t);\n }\n }\n\n // 3. Compute successor DBM\n const firedIdx = current.transitionIndex(transition);\n const newClockNames = newlyEnabled.map(t => t.name);\n const newLowerBounds = newlyEnabled.map(t => earliest(t.timing) / 1000);\n const newUpperBounds = newlyEnabled.map(t => latest(t.timing) / 1000);\n\n let newDBM = current.firingDomain.fireTransition(\n firedIdx,\n newClockNames,\n newLowerBounds,\n newUpperBounds,\n persistentIndices,\n );\n\n newDBM = newDBM.letTimePass();\n\n const allEnabled = [...persistent, ...newlyEnabled];\n return new StateClass(newMarking, newDBM, allEnabled);\n}\n\nfunction findEnabledTransitions(\n net: PetriNet,\n marking: MarkingState,\n environmentPlaces: Set<Place<any>>,\n environmentMode: EnvironmentAnalysisMode,\n): Transition[] {\n const enabled: Transition[] = [];\n for (const transition of net.transitions) {\n if (isEnabled(transition, marking, environmentPlaces, environmentMode)) {\n enabled.push(transition);\n }\n }\n return enabled;\n}\n\nfunction isEnabled(\n transition: Transition,\n marking: MarkingState,\n environmentPlaces: Set<Place<any>>,\n environmentMode: EnvironmentAnalysisMode,\n): boolean {\n for (const spec of transition.inputSpecs) {\n const required = inputRequiredCount(spec);\n if (!checkPlaceEnabled(spec.place, required, marking, environmentPlaces, environmentMode)) {\n return false;\n }\n }\n\n for (const arc of transition.reads) {\n if (!checkPlaceEnabled(arc.place, 1, marking, environmentPlaces, environmentMode)) {\n return false;\n }\n }\n\n for (const arc of transition.inhibitors) {\n if (marking.hasTokens(arc.place)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction inputRequiredCount(spec: In): number {\n switch (spec.type) {\n case 'one': return 1;\n case 'exactly': return spec.count;\n case 'all': return 1;\n case 'at-least': return spec.minimum;\n }\n}\n\nfunction inputConsumeCount(spec: In): number {\n switch (spec.type) {\n case 'one': return 1;\n case 'exactly': return spec.count;\n case 'all': return 1; // Analysis: consume minimum (1 token)\n case 'at-least': return spec.minimum;\n }\n}\n\nfunction checkPlaceEnabled(\n place: Place<any>,\n required: number,\n marking: MarkingState,\n environmentPlaces: Set<Place<any>>,\n environmentMode: EnvironmentAnalysisMode,\n): boolean {\n if (!environmentPlaces.has(place)) {\n return marking.tokens(place) >= required;\n }\n\n switch (environmentMode.type) {\n case 'always-available': return true;\n case 'bounded': return required <= environmentMode.maxTokens;\n case 'ignore': return marking.tokens(place) >= required;\n }\n}\n\nfunction fireTransition(\n marking: MarkingState,\n transition: Transition,\n outputPlaces: ReadonlySet<Place<any>>,\n environmentPlaces: Set<Place<any>>,\n environmentMode: EnvironmentAnalysisMode,\n): MarkingState {\n const builder = MarkingState.builder().copyFrom(marking);\n\n // Consume from inputs\n for (const spec of transition.inputSpecs) {\n const toConsume = inputConsumeCount(spec);\n consumeFromPlace(builder, spec.place, toConsume, environmentPlaces, environmentMode);\n }\n\n // Reset places\n for (const arc of transition.resets) {\n const current = marking.tokens(arc.place);\n if (current > 0) {\n builder.removeTokens(arc.place, current);\n }\n }\n\n // Produce to outputs\n for (const place of outputPlaces) {\n builder.addTokens(place, 1);\n }\n\n return builder.build();\n}\n\nfunction consumeFromPlace(\n builder: ReturnType<typeof MarkingState.builder>,\n place: Place<any>,\n count: number,\n environmentPlaces: Set<Place<any>>,\n environmentMode: EnvironmentAnalysisMode,\n): void {\n if (!environmentPlaces.has(place)) {\n builder.removeTokens(place, count);\n return;\n }\n if (environmentMode.type === 'ignore') {\n builder.removeTokens(place, count);\n }\n}\n","import type { Place } from '../../core/place.js';\nimport type { EnvironmentPlace } from '../../core/place.js';\nimport type { Transition } from '../../core/transition.js';\nimport type { PetriNet } from '../../core/petri-net.js';\nimport { enumerateBranches } from '../../core/out.js';\nimport { MarkingState } from '../marking-state.js';\nimport { StateClassGraph } from './state-class-graph.js';\nimport type { StateClass } from './state-class.js';\nimport { computeSCCs, findTerminalSCCs } from './scc-analyzer.js';\nimport type { EnvironmentAnalysisMode } from './environment-analysis-mode.js';\nimport { ignore } from './environment-analysis-mode.js';\n\n/** Result of liveness analysis. */\nexport interface LivenessResult {\n readonly stateClassGraph: StateClassGraph;\n readonly allSCCs: Set<StateClass>[];\n readonly terminalSCCs: Set<StateClass>[];\n readonly goalClasses: Set<StateClass>;\n readonly canReachGoal: Set<StateClass>;\n readonly isGoalLive: boolean;\n readonly isL4Live: boolean;\n readonly isComplete: boolean;\n readonly report: string;\n}\n\n/** Information about XOR branch coverage for a single transition. */\nexport interface XorBranchInfo {\n readonly totalBranches: number;\n readonly takenBranches: Set<number>;\n readonly untakenBranches: Set<number>;\n readonly branchOutputs: ReadonlyArray<ReadonlySet<Place<any>>>;\n}\n\n/** Result of XOR branch analysis. */\nexport interface XorBranchAnalysis {\n readonly transitionBranches: Map<Transition, XorBranchInfo>;\n unreachableBranches(): Map<Transition, Set<number>>;\n isXorComplete(): boolean;\n report(): string;\n}\n\n/**\n * Formal analyzer for Time Petri Nets using the State Class Graph method.\n * Implements Berthomieu-Diaz (1991) analysis.\n */\nexport class TimePetriNetAnalyzer {\n private readonly net: PetriNet;\n private readonly initialMarking: MarkingState;\n private readonly goalPlaces: Set<Place<any>>;\n private readonly maxClasses: number;\n private readonly environmentPlaces: Set<EnvironmentPlace<any>>;\n private readonly environmentMode: EnvironmentAnalysisMode;\n\n /** @internal Called by builder — use `TimePetriNetAnalyzer.forNet()` instead. */\n static create(\n net: PetriNet,\n initialMarking: MarkingState,\n goalPlaces: Set<Place<any>>,\n maxClasses: number,\n environmentPlaces: Set<EnvironmentPlace<any>>,\n environmentMode: EnvironmentAnalysisMode,\n ): TimePetriNetAnalyzer {\n return new TimePetriNetAnalyzer(net, initialMarking, goalPlaces, maxClasses, environmentPlaces, environmentMode);\n }\n\n private constructor(\n net: PetriNet,\n initialMarking: MarkingState,\n goalPlaces: Set<Place<any>>,\n maxClasses: number,\n environmentPlaces: Set<EnvironmentPlace<any>>,\n environmentMode: EnvironmentAnalysisMode,\n ) {\n this.net = net;\n this.initialMarking = initialMarking;\n this.goalPlaces = goalPlaces;\n this.maxClasses = maxClasses;\n this.environmentPlaces = environmentPlaces;\n this.environmentMode = environmentMode;\n }\n\n static forNet(net: PetriNet): TimePetriNetAnalyzerBuilder {\n return new TimePetriNetAnalyzerBuilder(net);\n }\n\n /** Performs formal liveness analysis. */\n analyze(): LivenessResult {\n const report: string[] = [];\n report.push('=== TIME PETRI NET FORMAL ANALYSIS ===\\n');\n report.push(`Method: State Class Graph (Berthomieu-Diaz 1991)`);\n report.push(`Net: ${this.net.name}`);\n report.push(`Places: ${this.net.places.size}`);\n report.push(`Transitions: ${this.net.transitions.size}`);\n report.push(`Goal places: [${[...this.goalPlaces].map(p => p.name).join(', ')}]\\n`);\n\n // Phase 1: Build State Class Graph\n report.push('Phase 1: Building State Class Graph...');\n if (this.environmentPlaces.size > 0) {\n report.push(` Environment places: ${this.environmentPlaces.size}`);\n report.push(` Environment mode: ${this.environmentMode.type}`);\n }\n const scg = StateClassGraph.build(this.net, this.initialMarking, this.maxClasses, this.environmentPlaces, this.environmentMode);\n report.push(` State classes: ${scg.size()}`);\n report.push(` Edges: ${scg.edgeCount()}`);\n report.push(` Complete: ${scg.isComplete() ? 'YES' : 'NO (truncated)'}`);\n\n if (!scg.isComplete()) {\n report.push(` WARNING: State class graph truncated at ${this.maxClasses} classes. Analysis may be incomplete.`);\n }\n report.push('');\n\n // Phase 2: Identify goal state classes\n report.push('Phase 2: Identifying goal state classes...');\n const goalClasses = new Set<StateClass>();\n for (const sc of scg.stateClasses()) {\n if (sc.marking.hasTokensInAny(this.goalPlaces)) {\n goalClasses.add(sc);\n }\n }\n report.push(` Goal state classes: ${goalClasses.size}\\n`);\n\n // Phase 3: Compute SCCs\n report.push('Phase 3: Computing Strongly Connected Components...');\n const successorFn = (sc: StateClass) => scg.successors(sc);\n const allSCCs = computeSCCs(scg.stateClasses(), successorFn);\n const terminalSCCs = findTerminalSCCs(scg.stateClasses(), successorFn);\n\n report.push(` Total SCCs: ${allSCCs.length}`);\n report.push(` Terminal SCCs: ${terminalSCCs.length}\\n`);\n\n // Phase 4: Check goal liveness\n report.push('Phase 4: Verifying Goal Liveness...');\n report.push(' Property: From every reachable state, a goal state is reachable');\n\n const terminalSCCsWithGoal: Set<StateClass>[] = [];\n const terminalSCCsWithoutGoal: Set<StateClass>[] = [];\n\n for (const scc of terminalSCCs) {\n let hasGoal = false;\n for (const sc of scc) {\n if (goalClasses.has(sc)) { hasGoal = true; break; }\n }\n (hasGoal ? terminalSCCsWithGoal : terminalSCCsWithoutGoal).push(scc);\n }\n\n report.push(` Terminal SCCs with goal: ${terminalSCCsWithGoal.length}`);\n report.push(` Terminal SCCs without goal: ${terminalSCCsWithoutGoal.length}`);\n\n const canReachGoal = computeBackwardReachability(scg, goalClasses);\n const statesNotReachingGoal = scg.size() - canReachGoal.size;\n\n report.push(` States that can reach goal: ${canReachGoal.size}/${scg.size()}\\n`);\n\n const isGoalLive = terminalSCCsWithoutGoal.length === 0 && statesNotReachingGoal === 0;\n\n // Phase 5: Check classical liveness (L4)\n report.push('Phase 5: Verifying Classical Liveness (L4)...');\n report.push(' Property: Every transition can fire from every reachable marking');\n\n const allTransitions = new Set(this.net.transitions);\n const terminalSCCsMissingTransitions: Set<StateClass>[] = [];\n\n for (const scc of terminalSCCs) {\n const transitionsInSCC = new Set<Transition>();\n for (const sc of scc) {\n for (const t of scg.enabledTransitions(sc)) {\n const edges = scg.branchEdges(sc, t);\n for (const edge of edges) {\n if (scc.has(edge.target)) {\n transitionsInSCC.add(t);\n }\n }\n }\n }\n let missingAny = false;\n for (const t of allTransitions) {\n if (!transitionsInSCC.has(t)) { missingAny = true; break; }\n }\n if (missingAny) {\n terminalSCCsMissingTransitions.push(scc);\n const missing = [...allTransitions].filter(t => !transitionsInSCC.has(t));\n report.push(` Terminal SCC missing transitions: [${missing.map(t => t.name).join(', ')}]`);\n }\n }\n\n const isL4Live = terminalSCCsMissingTransitions.length === 0 && scg.isComplete();\n\n // Summary\n report.push('\\n=== ANALYSIS RESULT ===\\n');\n\n if (isGoalLive && scg.isComplete()) {\n report.push('GOAL LIVENESS VERIFIED');\n report.push(' From every reachable state class, a goal marking is reachable.');\n } else if (isGoalLive && !scg.isComplete()) {\n report.push('GOAL LIVENESS LIKELY (incomplete proof)');\n } else {\n report.push('GOAL LIVENESS VIOLATION');\n if (terminalSCCsWithoutGoal.length > 0) {\n report.push(` ${terminalSCCsWithoutGoal.length} terminal SCC(s) have no goal state.`);\n }\n if (statesNotReachingGoal > 0) {\n report.push(` ${statesNotReachingGoal} state class(es) cannot reach goal.`);\n }\n }\n\n report.push('');\n\n if (isL4Live) {\n report.push('CLASSICAL LIVENESS (L4) VERIFIED');\n } else {\n report.push('CLASSICAL LIVENESS (L4) NOT VERIFIED');\n if (terminalSCCsMissingTransitions.length > 0) {\n report.push(\" Some terminal SCCs don't contain all transitions.\");\n }\n if (!scg.isComplete()) {\n report.push(' (State class graph incomplete - cannot prove L4)');\n }\n }\n\n return {\n stateClassGraph: scg,\n allSCCs,\n terminalSCCs,\n goalClasses,\n canReachGoal,\n isGoalLive,\n isL4Live,\n isComplete: scg.isComplete(),\n report: report.join('\\n'),\n };\n }\n\n /** Analyzes XOR branch coverage for a built state class graph. */\n static analyzeXorBranches(scg: StateClassGraph): XorBranchAnalysis {\n const result = new Map<Transition, XorBranchInfo>();\n\n for (const transition of scg.net.transitions) {\n if (transition.outputSpec === null) continue;\n\n const allBranches = enumerateBranches(transition.outputSpec);\n if (allBranches.length <= 1) continue;\n\n const takenBranches = new Set<number>();\n for (const sc of scg.stateClasses()) {\n const edges = scg.branchEdges(sc, transition);\n for (const edge of edges) {\n takenBranches.add(edge.branchIndex);\n }\n }\n\n const untakenBranches = new Set<number>();\n for (let i = 0; i < allBranches.length; i++) {\n if (!takenBranches.has(i)) untakenBranches.add(i);\n }\n\n result.set(transition, {\n totalBranches: allBranches.length,\n takenBranches,\n untakenBranches,\n branchOutputs: allBranches,\n });\n }\n\n return createXorBranchAnalysis(result);\n }\n}\n\nfunction createXorBranchAnalysis(transitionBranches: Map<Transition, XorBranchInfo>): XorBranchAnalysis {\n return {\n transitionBranches,\n unreachableBranches(): Map<Transition, Set<number>> {\n const result = new Map<Transition, Set<number>>();\n for (const [t, info] of transitionBranches) {\n if (info.untakenBranches.size > 0) {\n result.set(t, info.untakenBranches);\n }\n }\n return result;\n },\n isXorComplete(): boolean {\n for (const info of transitionBranches.values()) {\n if (info.untakenBranches.size > 0) return false;\n }\n return true;\n },\n report(): string {\n if (transitionBranches.size === 0) return 'No XOR transitions in net.';\n\n const lines: string[] = [];\n lines.push('XOR Branch Coverage Analysis');\n lines.push('============================\\n');\n\n for (const [t, info] of transitionBranches) {\n lines.push(`Transition: ${t.name}`);\n lines.push(` Branches: ${info.totalBranches}`);\n lines.push(` Taken: [${[...info.takenBranches].join(', ')}]`);\n\n if (info.untakenBranches.size > 0) {\n lines.push(` UNREACHABLE: [${[...info.untakenBranches].join(', ')}]`);\n for (const idx of info.untakenBranches) {\n const places = [...info.branchOutputs[idx]!].map(p => p.name).join(', ');\n lines.push(` Branch ${idx} outputs: [${places}]`);\n }\n } else {\n lines.push(' All branches reachable');\n }\n lines.push('');\n }\n\n if (this.isXorComplete()) {\n lines.push('RESULT: All XOR branches are reachable.');\n } else {\n lines.push('RESULT: Some XOR branches are unreachable!');\n }\n\n return lines.join('\\n');\n },\n };\n}\n\nfunction computeBackwardReachability(scg: StateClassGraph, goals: Set<StateClass>): Set<StateClass> {\n const reachable = new Set(goals);\n const queue = [...goals];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const pred of scg.predecessors(current)) {\n if (!reachable.has(pred)) {\n reachable.add(pred);\n queue.push(pred);\n }\n }\n }\n\n return reachable;\n}\n\n/** Builder for TimePetriNetAnalyzer. */\nexport class TimePetriNetAnalyzerBuilder {\n private readonly net: PetriNet;\n private _initialMarking: MarkingState = MarkingState.empty();\n private readonly _goalPlaces = new Set<Place<any>>();\n private _maxClasses = 100_000;\n private readonly _environmentPlaces = new Set<EnvironmentPlace<any>>();\n private _environmentMode: EnvironmentAnalysisMode = ignore();\n\n constructor(net: PetriNet) {\n this.net = net;\n }\n\n initialMarking(marking: MarkingState): this {\n this._initialMarking = marking;\n return this;\n }\n\n goalPlaces(...places: Place<any>[]): this {\n for (const p of places) this._goalPlaces.add(p);\n return this;\n }\n\n maxClasses(max: number): this {\n this._maxClasses = max;\n return this;\n }\n\n environmentPlaces(...places: EnvironmentPlace<any>[]): this {\n for (const ep of places) this._environmentPlaces.add(ep);\n return this;\n }\n\n environmentMode(mode: EnvironmentAnalysisMode): this {\n this._environmentMode = mode;\n return this;\n }\n\n build(): TimePetriNetAnalyzer {\n if (this._goalPlaces.size === 0) {\n throw new Error('At least one goal place must be specified');\n }\n return TimePetriNetAnalyzer.create(\n this.net,\n this._initialMarking,\n this._goalPlaces,\n this._maxClasses,\n this._environmentPlaces,\n this._environmentMode,\n );\n }\n}\n"],"mappings":"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","names":["bounded"]}