tla-ts 0.0.1 → 0.0.3-dev.763cc71

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.
Files changed (71) hide show
  1. package/README.md +81 -42
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.cts +215 -30
  4. package/dist/index.d.ts +215 -30
  5. package/dist/index.js +1 -1
  6. package/dist/parallel-worker.cjs +2 -2
  7. package/dist/parallel-worker.js +2 -2
  8. package/dist/parallel.cjs +1 -1
  9. package/dist/parallel.js +2 -2
  10. package/dist/run-cli.cjs +20 -1
  11. package/dist/run-cli.js +20 -1
  12. package/dist/transfer.cjs +388 -39
  13. package/dist/transfer.js +388 -39
  14. package/package.json +6 -2
  15. package/src/ast.ts +122 -5
  16. package/src/bags.ts +161 -71
  17. package/src/builtins.ts +203 -23
  18. package/src/bundled-modules.ts +63 -32
  19. package/src/check.ts +945 -238
  20. package/src/cli-options.ts +58 -0
  21. package/src/codegen.ts +52 -18
  22. package/src/config.ts +39 -11
  23. package/src/environment.ts +485 -140
  24. package/src/errors.ts +59 -1
  25. package/src/evaluate.ts +489 -137
  26. package/src/exit-codes.ts +75 -0
  27. package/src/fingerprints.ts +2 -2
  28. package/src/index.ts +9 -4
  29. package/src/instances.ts +221 -66
  30. package/src/java-overrides.ts +241 -0
  31. package/src/json.ts +153 -72
  32. package/src/levels.ts +850 -0
  33. package/src/lexer.ts +103 -28
  34. package/src/liveness.ts +47 -91
  35. package/src/obligation-action.ts +384 -0
  36. package/src/obligation-anon.ts +575 -0
  37. package/src/obligation-deref.ts +637 -0
  38. package/src/obligation-expression.ts +1060 -0
  39. package/src/obligation-format.ts +406 -0
  40. package/src/obligation-generate.ts +1074 -0
  41. package/src/obligation-levels.ts +329 -0
  42. package/src/obligation-module.ts +1042 -0
  43. package/src/obligation-printer.ts +889 -0
  44. package/src/obligation-proof.ts +76 -0
  45. package/src/obligation-source.ts +1084 -0
  46. package/src/obligation-tuples.ts +184 -0
  47. package/src/obligations.ts +316 -0
  48. package/src/parallel-worker.ts +78 -30
  49. package/src/parallel.ts +116 -62
  50. package/src/parser.ts +958 -205
  51. package/src/pretty-print.ts +259 -0
  52. package/src/randomization.ts +24 -113
  53. package/src/resolve.ts +472 -41
  54. package/src/run-cli.ts +427 -61
  55. package/src/runtime.ts +63 -28
  56. package/src/spec-description.ts +509 -0
  57. package/src/standard-levels.ts +105 -0
  58. package/src/standard-modules.ts +223 -92
  59. package/src/subexpressions.ts +21 -35
  60. package/src/substitution-levels.ts +184 -0
  61. package/src/successors.ts +261 -46
  62. package/src/symmetry.ts +65 -21
  63. package/src/tableau.ts +43 -37
  64. package/src/tlc-ext.ts +120 -33
  65. package/src/tlc-module.ts +71 -47
  66. package/src/tlc-modules.ts +1022 -0
  67. package/src/tlc-order.ts +497 -0
  68. package/src/tlc-random.ts +411 -0
  69. package/src/tlc-summary.ts +109 -0
  70. package/src/transfer.ts +26 -5
  71. package/src/values.ts +1231 -176
package/dist/index.d.ts CHANGED
@@ -12,10 +12,22 @@ interface LocalResolution {
12
12
  interface SourceLocation {
13
13
  line: number;
14
14
  column: number;
15
+ range?: SourceRange;
16
+ }
17
+ interface SourceRange {
18
+ module: string;
19
+ start: SourceLocation;
20
+ end: SourceLocation;
15
21
  }
16
22
  interface NumberExpression {
17
23
  kind: "Number";
18
24
  value: number;
25
+ text?: string;
26
+ location: SourceLocation;
27
+ }
28
+ interface DecimalExpression {
29
+ kind: "Decimal";
30
+ text: string;
19
31
  location: SourceLocation;
20
32
  }
21
33
  interface StringExpression {
@@ -33,6 +45,7 @@ interface ApplyExpression {
33
45
  kind: "Apply";
34
46
  operator: string;
35
47
  args: Expression[];
48
+ argumentCounts?: number[];
36
49
  location: SourceLocation;
37
50
  resolution?: LocalResolution;
38
51
  }
@@ -50,6 +63,7 @@ interface LambdaExpression {
50
63
  interface JunctionExpression {
51
64
  kind: "And" | "Or";
52
65
  operands: Expression[];
66
+ isBulleted?: boolean;
53
67
  location: SourceLocation;
54
68
  }
55
69
  interface PrimeExpression {
@@ -110,6 +124,7 @@ interface QuantifierExpression {
110
124
  }
111
125
  interface UnboundedQuantifierExpression {
112
126
  kind: "UnboundedQuantifier";
127
+ quantifier: "Forall" | "Exists";
113
128
  names: string[];
114
129
  isTemporal?: boolean;
115
130
  body: Expression;
@@ -249,16 +264,18 @@ interface SubexpressionExpression {
249
264
  selectors: Selector[];
250
265
  location: SourceLocation;
251
266
  }
252
- type Expression = NumberExpression | StringExpression | IdentifierExpression | ApplyExpression | OperatorReferenceExpression | LambdaExpression | JunctionExpression | PrimeExpression | UnchangedExpression | EnabledExpression | IfExpression | CaseExpression | LetExpression | QuantifierExpression | UnboundedQuantifierExpression | ChooseExpression | SetEnumerationExpression | SetFilterExpression | SetMapExpression | TupleExpression | FunctionConstructionExpression | FunctionSetExpression | RecordExpression | ExceptExpression | ExceptAtExpression | FunctionApplicationExpression | FieldAccessExpression | ProductExpression | TemporalExpression | ActionExpression | FairnessExpression | LabelExpression | SubexpressionExpression;
267
+ type Expression = NumberExpression | DecimalExpression | StringExpression | IdentifierExpression | ApplyExpression | OperatorReferenceExpression | LambdaExpression | JunctionExpression | PrimeExpression | UnchangedExpression | EnabledExpression | IfExpression | CaseExpression | LetExpression | QuantifierExpression | UnboundedQuantifierExpression | ChooseExpression | SetEnumerationExpression | SetFilterExpression | SetMapExpression | TupleExpression | FunctionConstructionExpression | FunctionSetExpression | RecordExpression | ExceptExpression | ExceptAtExpression | FunctionApplicationExpression | FieldAccessExpression | ProductExpression | TemporalExpression | ActionExpression | FairnessExpression | LabelExpression | SubexpressionExpression;
253
268
  interface OperatorParam {
254
269
  name: string;
255
270
  arity: number;
271
+ location?: SourceLocation;
256
272
  }
257
273
  interface OperatorDefinition {
258
274
  kind: "Operator";
259
275
  name: string;
260
276
  params: OperatorParam[];
261
277
  body: Expression;
278
+ bodyRange?: SourceRange;
262
279
  isLocal: boolean;
263
280
  isRecursive: boolean;
264
281
  location: SourceLocation;
@@ -276,6 +293,7 @@ type Definition = OperatorDefinition | FunctionDefinition;
276
293
  interface Declaration {
277
294
  name: string;
278
295
  arity: number;
296
+ location: SourceLocation;
279
297
  }
280
298
  interface Assumption {
281
299
  name: string | undefined;
@@ -295,21 +313,139 @@ interface Instance {
295
313
  substitutions: InstanceSubstitution[];
296
314
  isLocal: boolean;
297
315
  location: SourceLocation;
316
+ instanceRange: SourceRange;
317
+ definitionRange?: SourceRange;
298
318
  }
299
- interface OuterScope {
300
- extends: string[];
301
- symbols: Declaration[];
319
+ interface NewSymbol {
320
+ kind: "NewSymbol";
321
+ name: string;
322
+ arity: number;
323
+ level: "Constant" | "Variable" | "State" | "Action" | "Temporal";
324
+ set: Expression | undefined;
325
+ location: SourceLocation;
326
+ }
327
+ interface AssumeProve {
328
+ kind: "AssumeProve";
329
+ assumptions: (Expression | NewSymbol | AssumeProve)[];
330
+ conclusion: Expression;
331
+ location: SourceLocation;
332
+ }
333
+ type Fact = Expression | {
334
+ kind: "ModuleFact";
335
+ name: string;
336
+ location: SourceLocation;
337
+ };
338
+ interface UseOrHide {
339
+ kind: "Use" | "Hide";
340
+ isOnly: boolean;
341
+ facts: Fact[];
342
+ defs: Fact[];
343
+ keyword: SourceRange;
344
+ location: SourceLocation;
302
345
  }
346
+ type Proof = {
347
+ kind: "Obvious" | "Omitted";
348
+ keyword: SourceRange;
349
+ location: SourceLocation;
350
+ } | {
351
+ kind: "By";
352
+ isOnly: boolean;
353
+ facts: Fact[];
354
+ defs: Fact[];
355
+ keyword: SourceRange;
356
+ location: SourceLocation;
357
+ } | {
358
+ kind: "Steps";
359
+ level: number;
360
+ steps: ProofStep[];
361
+ location: SourceLocation;
362
+ };
363
+ interface DefineStep {
364
+ kind: "Define";
365
+ definitions: (Definition | Instance)[];
366
+ location: SourceLocation;
367
+ }
368
+ type StepBody = UseOrHide | Instance | DefineStep | {
369
+ kind: "Have";
370
+ expression: Expression;
371
+ } | {
372
+ kind: "Take";
373
+ names: string[];
374
+ bounds: Bound[];
375
+ } | {
376
+ kind: "Witness";
377
+ expressions: Expression[];
378
+ } | {
379
+ kind: "Pick";
380
+ names: string[];
381
+ bounds: Bound[];
382
+ body: Expression;
383
+ } | {
384
+ kind: "Case";
385
+ expression: Expression;
386
+ } | {
387
+ kind: "Assert";
388
+ isSuffices: boolean;
389
+ statement: Expression | AssumeProve;
390
+ } | {
391
+ kind: "Qed";
392
+ };
393
+ interface ProofStep {
394
+ name: string | undefined;
395
+ token: string;
396
+ body: StepBody;
397
+ head: SourceRange;
398
+ proof: Proof | undefined;
399
+ location: SourceLocation;
400
+ }
401
+ interface Theorem {
402
+ name: string | undefined;
403
+ statement: Expression | AssumeProve;
404
+ proof: Proof | undefined;
405
+ location: SourceLocation;
406
+ }
407
+ type ModuleUnit = {
408
+ kind: "Constants";
409
+ declarations: Declaration[];
410
+ } | {
411
+ kind: "Variables";
412
+ declarations: Declaration[];
413
+ } | {
414
+ kind: "Recursive";
415
+ declarations: Declaration[];
416
+ } | {
417
+ kind: "Definition";
418
+ definition: Definition;
419
+ } | {
420
+ kind: "Instance";
421
+ instance: Instance;
422
+ } | {
423
+ kind: "Assumption";
424
+ assumption: Assumption;
425
+ } | {
426
+ kind: "Theorem";
427
+ theorem: Theorem;
428
+ } | {
429
+ kind: "Use";
430
+ use: UseOrHide;
431
+ } | {
432
+ kind: "Module";
433
+ module: Module;
434
+ };
303
435
  interface Module {
304
436
  name: string;
305
- outer: OuterScope | undefined;
306
437
  modules: Module[];
307
438
  extends: string[];
439
+ extendsRanges: SourceRange[];
308
440
  constants: Declaration[];
309
- variables: string[];
441
+ variables: Declaration[];
310
442
  definitions: Definition[];
311
443
  instances: Instance[];
312
444
  assumptions: Assumption[];
445
+ location: SourceLocation;
446
+ theorems: Theorem[];
447
+ uses: UseOrHide[];
448
+ units: ModuleUnit[];
313
449
  }
314
450
  type ConfigValue = {
315
451
  kind: "Number";
@@ -351,13 +487,39 @@ interface ModelConfig {
351
487
  checkDeadlock: boolean;
352
488
  symmetry: string | undefined;
353
489
  view: string | undefined;
490
+ alias: string | undefined;
354
491
  postconditions: string[];
355
492
  possible: string[];
493
+ periodic: string | undefined;
494
+ rlReward: string | undefined;
356
495
  }
357
496
  export declare const parseConfig: (source: string) => ModelConfig;
497
+ export declare class TlaError extends Error {
498
+ constructor(message: string, cause?: unknown);
499
+ }
500
+ interface SyntaxFailure {
501
+ reason: string;
502
+ line: number;
503
+ column: number;
504
+ isEnd: boolean;
505
+ }
506
+ export declare class TlaSyntaxError extends TlaError {
507
+ failure: SyntaxFailure | undefined;
508
+ constructor(message: string, cause?: unknown, failure?: SyntaxFailure);
509
+ }
510
+ export declare class TlaConfigError extends TlaError {
511
+ constructor(message: string, cause?: unknown);
512
+ }
513
+ export declare class TlaEvaluationError extends TlaError {
514
+ constructor(message: string, cause?: unknown);
515
+ }
516
+ export declare class TlaUnsupportedError extends TlaError {
517
+ constructor(message: string, cause?: unknown);
518
+ }
358
519
  interface ModelValue {
359
520
  kind: "ModelValue";
360
521
  name: string;
522
+ type: string | undefined;
361
523
  }
362
524
  interface SetValue {
363
525
  kind: "Set";
@@ -365,12 +527,17 @@ interface SetValue {
365
527
  hash: number;
366
528
  fingerprint: number;
367
529
  }
530
+ interface MixedSetValue {
531
+ kind: "MixedSet";
532
+ elements: Value[];
533
+ }
368
534
  interface FunctionValue {
369
535
  kind: "Function";
370
536
  domain: Value[];
371
537
  range: Value[];
372
538
  hash: number;
373
539
  fingerprint: number;
540
+ writtenKeys: Value[] | undefined;
374
541
  }
375
542
  interface IntervalValue {
376
543
  kind: "Interval";
@@ -414,58 +581,76 @@ interface FilteredSetValue {
414
581
  base: Value;
415
582
  test: (element: Value) => boolean;
416
583
  }
584
+ interface UnionValue {
585
+ kind: "Union";
586
+ base: Value;
587
+ }
588
+ interface LazyFunctionParameter {
589
+ name: string;
590
+ domain: Value;
591
+ }
592
+ interface LazyFunctionSource {
593
+ parameters: LazyFunctionParameter[];
594
+ body: string;
595
+ }
417
596
  interface LazyFunctionValue {
418
597
  kind: "LazyFunction";
419
598
  domain: Value;
420
599
  apply: (argument: Value) => Value;
600
+ source?: LazyFunctionSource;
421
601
  }
422
- type Value = boolean | number | string | ModelValue | SetValue | FunctionValue | IntervalValue | InfiniteSetValue | SubsetValue | FunctionSetValue | RecordSetValue | ProductSetValue | SequenceSetValue | SetOperationValue | FilteredSetValue | LazyFunctionValue;
423
- export declare const formatValue: (value: Value, isExpanded?: boolean) => string;
602
+ type Value = boolean | number | string | ModelValue | SetValue | MixedSetValue | FunctionValue | IntervalValue | InfiniteSetValue | SubsetValue | FunctionSetValue | RecordSetValue | ProductSetValue | SequenceSetValue | SetOperationValue | FilteredSetValue | UnionValue | LazyFunctionValue;
603
+ export declare const formatValue: (value: Value, isStrict?: boolean, isNormalized?: boolean) => string;
424
604
  interface CheckOptions {
425
605
  source: string;
426
606
  config: string | ModelConfig;
427
607
  loadModule?: (name: string) => string | undefined;
608
+ loadClass?: (name: string) => Uint8Array | undefined;
428
609
  onPrint?: (text: string) => void;
610
+ onPause?: () => void;
429
611
  readFile?: (path: string) => string | undefined;
430
612
  writeFile?: (path: string, content: string) => void;
613
+ seed?: bigint;
614
+ workers?: number;
615
+ livenessCheck?: "default" | "final";
431
616
  }
432
- type CheckStatus = "success" | "assumption-violation" | "invariant-violation" | "property-violation" | "liveness-violation" | "postcondition-violation" | "deadlock";
617
+ type CheckStatus = "success" | "assumption-violation" | "invariant-violation" | "property-violation" | "liveness-violation" | "postcondition-violation" | "deadlock" | "error";
433
618
  interface TraceStep {
434
619
  action: string | undefined;
620
+ label: string | undefined;
435
621
  state: Record<string, Value>;
436
622
  }
437
623
  interface Violation {
438
624
  name: string;
439
625
  trace: TraceStep[];
440
626
  loopStart: number | undefined;
627
+ loopLabel?: string;
441
628
  message?: string;
629
+ counts?: string;
630
+ unwitnessed?: Postcondition;
631
+ }
632
+ interface Postcondition {
633
+ name: string;
634
+ message: string;
635
+ counts?: string;
636
+ }
637
+ interface EvaluationFailure {
638
+ message: string;
639
+ trace: TraceStep[];
640
+ initialState: Record<string, Value> | undefined;
641
+ exitCode: number;
442
642
  }
443
643
  interface CheckResult {
444
644
  status: CheckStatus;
445
645
  violation: Violation | undefined;
646
+ failure: EvaluationFailure | undefined;
446
647
  generatedStates: number;
447
648
  distinctStates: number;
649
+ queuedStates: number;
448
650
  depth: number;
651
+ outDegrees: number[] | undefined;
652
+ fingerprintDistance: bigint | undefined;
449
653
  }
450
- export declare const check: (options: CheckOptions) => CheckResult;
451
- export declare class TlaError extends Error {
452
- constructor(message: string, cause?: unknown);
453
- }
454
- export declare class TlaSyntaxError extends TlaError {
455
- constructor(message: string, cause?: unknown);
456
- }
457
- export declare class TlaConfigError extends TlaError {
458
- constructor(message: string, cause?: unknown);
459
- }
460
- export declare class TlaEvaluationError extends TlaError {
461
- constructor(message: string, cause?: unknown);
462
- }
463
- export declare class TlaUnsupportedError extends TlaError {
464
- constructor(message: string, cause?: unknown);
465
- }
466
- interface ParallelCheckOptions extends CheckOptions {
467
- workers: number;
468
- }
469
- export declare const checkInParallel: (options: ParallelCheckOptions) => Promise<CheckResult>;
654
+ export declare const check: (options: CheckOptions) => Promise<CheckResult>;
470
655
  export declare const parseModule: (source: string) => Module;
471
- export type { CheckOptions, CheckResult, CheckStatus, ConfigValue, ConstantAssignment, ModelConfig, Module, ParallelCheckOptions, Substitution, TraceStep, Value, Violation };
656
+ export type { CheckOptions, CheckResult, CheckStatus, ConfigValue, ConstantAssignment, EvaluationFailure, ModelConfig, Module, Substitution, TraceStep, Value, Violation };
package/dist/index.js CHANGED
@@ -6,4 +6,4 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- import{S as e,_ as t,b as n,d as r,g as i,o as a,v as o,x as s,y as c}from"./transfer.js";import{t as l}from"./parallel.js";export{o as TlaConfigError,c as TlaError,n as TlaEvaluationError,s as TlaSyntaxError,e as TlaUnsupportedError,a as check,l as checkInParallel,i as formatValue,t as parseConfig,r as parseModule};
9
+ import{A as e,C as t,D as n,N as r,P as i,_ as a,j as o,k as s}from"./transfer.js";import{t as c}from"./parallel.js";export{s as TlaConfigError,e as TlaError,o as TlaEvaluationError,r as TlaSyntaxError,i as TlaUnsupportedError,c as check,t as formatValue,n as parseConfig,a as parseModule};
@@ -6,7 +6,7 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- const e=require("./transfer.cjs"),t=e=>{let t=e.reduce((e,t)=>e+t,0),n=t/e.length;if(Math.max(...e)-Math.min(...e)<=Math.max(64,n/4))return[];let r=e.map((n,r)=>Math.floor(t/e.length)+ +(r<t%e.length)),i=e.flatMap((e,t)=>e>r[t]?[{index:t,amount:e-r[t]}]:[]),a=e.flatMap((e,t)=>e<r[t]?[{index:t,amount:r[t]-e}]:[]),o=[];for(let e of i)for(let t of a){let n=Math.min(e.amount,t.amount);n!==0&&(o.push({from:e.index,to:t.index,count:n}),e.amount-=n,t.amount-=n)}return o},n=async()=>typeof globalThis.postMessage==`function`?globalThis:(await import(
9
+ const e=require("./transfer.cjs"),t=e=>{let t=e.reduce((e,t)=>e+t,0),n=t/e.length;if(Math.max(...e)-Math.min(...e)<=Math.max(64,n/4))return[];let r=e.map((r,i)=>Math.floor(n)+ +(i<t%e.length)),i=e.flatMap((e,t)=>e>r[t]?[{index:t,amount:e-r[t]}]:[]),a=e.flatMap((e,t)=>e<r[t]?[{index:t,amount:r[t]-e}]:[]),o=[];for(let e of i)for(let t of a){let n=Math.min(e.amount,t.amount);n!==0&&(o.push({from:e.index,to:t.index,count:n}),e.amount-=n,t.amount-=n)}return o},n=async()=>typeof globalThis.postMessage==`function`?globalThis:(await import(
10
10
  /* @vite-ignore */
11
11
  /* webpackIgnore: true */
12
- `node:worker_threads`)).parentPort,r=()=>{let e=/* @__PURE__ */ new Map,t=/* @__PURE__ */ new Map,n=(e,t)=>`${e}:${t}`,r=n=>{let r=t.get(n),i=e.get(n)??[];!r||i.length<r.count||(t.delete(n),e.delete(n),r.resolve(i))};return{deliver:t=>{let i=n(t.phase,t.level);e.set(i,[...e.get(i)??[],t]),r(i)},receive:(e,i,a)=>new Promise(o=>{let s=n(e,i);t.set(s,{count:a,resolve:o}),r(s)})}},i=(n,i)=>{let a=new Map(n.modules),o=e.u(e.d(n.source),n.config,{loadModule:e=>a.get(e),print:()=>{},files:{readFile:void 0,writeFile:void 0}}).environment,s=e.s(n.config,o);if(!s)return i.postMessage({type:`abort`});let c=o.variables.length,l=n.count,u=n.index,d=e.l(),f=e.t(c),p=e.r(),m=e.r(),h=/* @__PURE__ */ new Int32Array(2),g=r(),_=n.ports.flatMap((e,t)=>e?[{port:e,index:t}]:[]);_.forEach(e=>{e.port.addEventListener(`message`,e=>g.deliver(e.data)),e.port.start?.()});for(let e=0;e<n.seedFingerprints.length;e+=2)p.insert(n.seedFingerprints[e],n.seedFingerprints[e+1]);let v={states:f(n.seed).map(d)},y=(e,t,r)=>n.ports[e]?.postMessage(t,r),b=(t,r)=>{let i=Array.from({length:l},()=>({states:[],parents:[],fingerprints:[]})),a={generated:0};for(let c of t){let t=e.h(s.spec.next,c,o);if(a.generated+=t.length,t.length===0&&n.config.checkDeadlock)return;for(let n of t){if(s.findViolatedActionProperty(c,n.state))return;if(!s.satisfiesActionConstraints(c,n.state))continue;d(n.state),e.a(s.getFingerprintState(n.state),h);let t=e.i(h[1],l);if(t===u){if(!p.insert(h[0],h[1]))continue;if(s.findViolatedInvariant(n.state,c))return;s.satisfiesConstraints(n.state,c)?r.push(n.state):p.remove(h[0],h[1])}else m.insert(h[0],h[1])&&(i[t].states.push(n.state),i[t].parents.push(c),i[t].fingerprints.push(h[0],h[1]))}}return{pending:i,generated:a.generated}},x=e=>{let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=+!!p.insert(e[n*2],e[n*2+1]);return t},S=(e,t,n)=>{let r=[];for(let i=0;i<t.length;i++){if(t[i]===0)continue;let a=e.states[i],o=e.parents[i];if(s.findViolatedInvariant(a,o))return;s.satisfiesConstraints(a,o)?n.push(a):(m.remove(e.fingerprints[i*2],e.fingerprints[i*2+1]),r.push(e.fingerprints[i*2],e.fingerprints[i*2+1]))}return Int32Array.from(r)},C=e=>{for(let t=0;t<e.length;t+=2)p.remove(e[t],e[t+1])},w=async(n,r,i)=>{let a=t(i);if(a.length===0)return!0;let o=new Map(_.map(t=>[t.index,e.n()]));for(let e of a.filter(e=>e.from===u)){let t=o.get(e.to),n=r.splice(r.length-e.count,e.count);if(!t||!n.every(t.encode))return!1}return o.forEach((e,t)=>{let r=e.finish();y(t,{phase:`balance`,level:n,from:u,states:r},[r.words.buffer])}),(await g.receive(`balance`,n,_.length)).forEach(e=>{e.states&&r.push(...f(e.states).map(d))}),!0},T=async e=>{let t=[],n=b(v.states,t);if(!n)return;_.forEach(t=>{let r=Int32Array.from(n.pending[t.index].fingerprints);y(t.index,{phase:`query`,level:e,from:u,fingerprints:r},[r.buffer])}),(await g.receive(`query`,e,_.length)).forEach(t=>{let n=x(t.fingerprints??[]);y(t.from,{phase:`answer`,level:e,from:u,bits:n},[n.buffer])});let r=await g.receive(`answer`,e,_.length);for(let i of r){let r=S(n.pending[i.from],i.bits??/* @__PURE__ */ new Uint8Array,t);if(!r)return;y(i.from,{phase:`sizes`,level:e,from:u,unmarks:r,size:0},[r.buffer])}let i=t.length,a=Array.from({length:l},()=>0);if(a[u]=i,_.forEach(t=>y(t.index,{phase:`sizes`,level:e,from:u,size:i},[])),(await g.receive(`sizes`,e,_.length*2)).forEach(e=>{e.unmarks?C(e.unmarks):a[e.from]=e.size??0}),await w(e,t,a))return v.states=t,{type:`level`,level:e,generated:n.generated,added:i}},E=e=>i.postMessage(e),D=e=>{T(e).then(e=>E(e??{type:`abort`}),()=>E({type:`abort`}))};i.addEventListener(`message`,e=>{let t=e.data;t.type===`level`&&D(t.level)}),E({type:`ready`})};n().then(e=>{let t=n=>{let r=n.data;if(r.type===`start`){e.removeEventListener?.(`message`,t);try{i(r,e)}catch{e.postMessage({type:`abort`})}}};e.addEventListener(`message`,t),e.start?.()});
12
+ `node:worker_threads`)).parentPort,r=()=>{let e=/* @__PURE__ */ new Map,t=/* @__PURE__ */ new Map,n=(e,t)=>`${e}:${t}`,r=n=>{let r=t.get(n),i=e.get(n)??[];!r||i.length<r.count||(t.delete(n),e.delete(n),r.resolve(i))};return{deliver:t=>{let i=n(t.phase,t.level);e.set(i,[...e.get(i)??[],t]),r(i)},receive:(e,i,a)=>new Promise(o=>{let s=n(e,i);t.set(s,{count:a,resolve:o}),r(s)})}},i=(n,i)=>{let a=new Map(n.modules),o=e=>a.get(e),s=new Map(n.classes);e.T(e.m(n.source,n.config,o));let c=e.w(),l=e.g(n.config,{source:n.source,loadModule:o,loadClass:e=>s.get(e),print:()=>{},files:{readFile:void 0,writeFile:void 0}}).environment,u=e.s(n.config,l,()=>e.h(n.source,o)),d=u?.spec.next;if(!u||d===void 0)return i.postMessage({type:`abort`});let f=n.count,p=n.index,m=e.S(),h=e.t(l.variables.length),g=e.r(),_=e.r(),v=u.isSymmetric?e.r():void 0,y=/* @__PURE__ */ new Int32Array(2),b=r(),x=n.ports.flatMap((e,t)=>e?[{port:e,index:t}]:[]);x.forEach(e=>{e.port.addEventListener(`message`,e=>b.deliver(e.data)),e.port.start?.()});for(let e=0;e<n.seedFingerprints.length;e+=2)g.insert(n.seedFingerprints[e],n.seedFingerprints[e+1]);let S={states:h(n.seed).map(m)},C=(e,t,r)=>n.ports[e]?.postMessage(t,r),w=(t,r,i)=>{let a=Array.from({length:f},()=>({states:[],origins:[],fingerprints:[],fingerprintStates:[]})),o={generated:0},s=new Int32Array(t.length);for(let c=0;c<t.length;c++){let h=t[c],b=e.x(d,h,l,u.spec.scope);if(o.generated+=b.length,b.length===0&&n.config.checkDeadlock)return;for(let t of b){if(u.findViolatedActionProperty(h,t.state))return;if(!u.satisfiesActionConstraints(h,t.state)||v&&(e.a(t.state,y),!v.insert(y[0],y[1])))continue;m(t.state);let n=u.getFingerprintState(t.state);e.a(n,y);let o=e.i(y[1],f);if(o===p){if(!g.insert(y[0],y[1]))continue;if(u.findViolatedInvariant(t.state,h))return;if(!u.satisfiesConstraints(t.state,h)){g.remove(y[0],y[1]);continue}r.push(t.state),i.push(n),s[c]++}else _.insert(y[0],y[1])&&(a[o].states.push(t.state),a[o].origins.push(c),a[o].fingerprints.push(y[0],y[1]),a[o].fingerprintStates.push(n))}}return{pending:a,generated:o.generated,newStates:s}},T=e=>{let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=+!!g.insert(e[n*2],e[n*2+1]);return t},E=(e,t,n,r,i)=>{let a=[];for(let o=0;o<t.length;o++){if(t[o]===0)continue;let s=e.states[o],c=S.states[e.origins[o]];if(u.findViolatedInvariant(s,c))return;u.satisfiesConstraints(s,c)?(n.push(s),r.push(e.fingerprintStates[o]),i[e.origins[o]]++):(_.remove(e.fingerprints[o*2],e.fingerprints[o*2+1]),a.push(e.fingerprints[o*2],e.fingerprints[o*2+1]))}return Int32Array.from(a)},D=e=>{for(let t=0;t<e.length;t+=2)g.remove(e[t],e[t+1])},O=async(n,r,i)=>{let a=t(i);if(a.length===0)return!0;let o=new Map(x.map(t=>[t.index,e.n()]));for(let e of a.filter(e=>e.from===p)){let t=o.get(e.to),n=r.splice(r.length-e.count,e.count);if(!t||!n.every(t.encode))return!1}return o.forEach((e,t)=>{let r=e.finish();C(t,{phase:`balance`,level:n,from:p,states:r},[r.words.buffer])}),(await b.receive(`balance`,n,x.length)).forEach(e=>{e.states&&r.push(...h(e.states).map(m))}),!0},k=async t=>{let n=[],r=[],i=w(S.states,n,r);if(!i||e.w()!==c)return;x.forEach(e=>{let n=Int32Array.from(i.pending[e.index].fingerprints);C(e.index,{phase:`query`,level:t,from:p,fingerprints:n},[n.buffer])}),(await b.receive(`query`,t,x.length)).forEach(e=>{let n=T(e.fingerprints??[]);C(e.from,{phase:`answer`,level:t,from:p,bits:n},[n.buffer])});let a=await b.receive(`answer`,t,x.length);for(let e of a){let a=E(i.pending[e.from],e.bits??/* @__PURE__ */ new Uint8Array,n,r,i.newStates);if(!a)return;C(e.from,{phase:`sizes`,level:t,from:p,unmarks:a},[a.buffer])}let o=n.length,s=Array.from({length:32},()=>0);i.newStates.forEach(e=>s[Math.min(e,31)]++);let l=u.getStoredFingerprints(n,r),d=Array.from({length:f},()=>0);if(d[p]=o,x.forEach(e=>C(e.index,{phase:`sizes`,level:t,from:p,size:o},[])),(await b.receive(`sizes`,t,x.length*2)).forEach(e=>{e.unmarks?D(e.unmarks):d[e.from]=e.size??0}),e.w()===c&&await O(t,n,d))return S.states=n,{type:`level`,level:t,generated:i.generated,added:o,outDegrees:s,fingerprints:l}},A=e=>i.postMessage(e,e.type===`level`?[e.fingerprints.buffer]:[]),j=e=>{k(e).then(e=>A(e??{type:`abort`}),()=>A({type:`abort`}))};i.addEventListener(`message`,e=>{let t=e.data;t.type===`level`&&j(t.level)}),A({type:`ready`})};n().then(e=>{let t=n=>{let r=n.data;if(r.type===`start`){e.removeEventListener?.(`message`,t);try{i(r,e)}catch{e.postMessage({type:`abort`})}}};e.addEventListener(`message`,t),e.start?.()});
@@ -6,7 +6,7 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- import{a as e,d as t,h as n,i as r,l as i,n as a,r as o,s,t as c,u as l}from"./transfer.js";const u=e=>{let t=e.reduce((e,t)=>e+t,0),n=t/e.length;if(Math.max(...e)-Math.min(...e)<=Math.max(64,n/4))return[];let r=e.map((n,r)=>Math.floor(t/e.length)+ +(r<t%e.length)),i=e.flatMap((e,t)=>e>r[t]?[{index:t,amount:e-r[t]}]:[]),a=e.flatMap((e,t)=>e<r[t]?[{index:t,amount:r[t]-e}]:[]),o=[];for(let e of i)for(let t of a){let n=Math.min(e.amount,t.amount);n!==0&&(o.push({from:e.index,to:t.index,count:n}),e.amount-=n,t.amount-=n)}return o},d=async()=>typeof globalThis.postMessage==`function`?globalThis:(await import(
9
+ import{S as e,T as t,a as n,g as r,h as i,i as a,m as o,n as s,r as c,s as l,t as u,w as d,x as f}from"./transfer.js";const p=e=>{let t=e.reduce((e,t)=>e+t,0),n=t/e.length;if(Math.max(...e)-Math.min(...e)<=Math.max(64,n/4))return[];let r=e.map((r,i)=>Math.floor(n)+ +(i<t%e.length)),i=e.flatMap((e,t)=>e>r[t]?[{index:t,amount:e-r[t]}]:[]),a=e.flatMap((e,t)=>e<r[t]?[{index:t,amount:r[t]-e}]:[]),o=[];for(let e of i)for(let t of a){let n=Math.min(e.amount,t.amount);n!==0&&(o.push({from:e.index,to:t.index,count:n}),e.amount-=n,t.amount-=n)}return o},m=async()=>typeof globalThis.postMessage==`function`?globalThis:(await import(
10
10
  /* @vite-ignore */
11
11
  /* webpackIgnore: true */
12
- `node:worker_threads`)).parentPort,f=()=>{let e=/* @__PURE__ */ new Map,t=/* @__PURE__ */ new Map,n=(e,t)=>`${e}:${t}`,r=n=>{let r=t.get(n),i=e.get(n)??[];!r||i.length<r.count||(t.delete(n),e.delete(n),r.resolve(i))};return{deliver:t=>{let i=n(t.phase,t.level);e.set(i,[...e.get(i)??[],t]),r(i)},receive:(e,i,a)=>new Promise(o=>{let s=n(e,i);t.set(s,{count:a,resolve:o}),r(s)})}},p=(d,p)=>{let m=new Map(d.modules),h=l(t(d.source),d.config,{loadModule:e=>m.get(e),print:()=>{},files:{readFile:void 0,writeFile:void 0}}).environment,g=s(d.config,h);if(!g)return p.postMessage({type:`abort`});let _=h.variables.length,v=d.count,y=d.index,b=i(),x=c(_),S=o(),C=o(),w=/* @__PURE__ */ new Int32Array(2),T=f(),E=d.ports.flatMap((e,t)=>e?[{port:e,index:t}]:[]);E.forEach(e=>{e.port.addEventListener(`message`,e=>T.deliver(e.data)),e.port.start?.()});for(let e=0;e<d.seedFingerprints.length;e+=2)S.insert(d.seedFingerprints[e],d.seedFingerprints[e+1]);let D={states:x(d.seed).map(b)},O=(e,t,n)=>d.ports[e]?.postMessage(t,n),k=(t,i)=>{let a=Array.from({length:v},()=>({states:[],parents:[],fingerprints:[]})),o={generated:0};for(let s of t){let t=n(g.spec.next,s,h);if(o.generated+=t.length,t.length===0&&d.config.checkDeadlock)return;for(let n of t){if(g.findViolatedActionProperty(s,n.state))return;if(!g.satisfiesActionConstraints(s,n.state))continue;b(n.state),e(g.getFingerprintState(n.state),w);let t=r(w[1],v);if(t===y){if(!S.insert(w[0],w[1]))continue;if(g.findViolatedInvariant(n.state,s))return;g.satisfiesConstraints(n.state,s)?i.push(n.state):S.remove(w[0],w[1])}else C.insert(w[0],w[1])&&(a[t].states.push(n.state),a[t].parents.push(s),a[t].fingerprints.push(w[0],w[1]))}}return{pending:a,generated:o.generated}},A=e=>{let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=+!!S.insert(e[n*2],e[n*2+1]);return t},j=(e,t,n)=>{let r=[];for(let i=0;i<t.length;i++){if(t[i]===0)continue;let a=e.states[i],o=e.parents[i];if(g.findViolatedInvariant(a,o))return;g.satisfiesConstraints(a,o)?n.push(a):(C.remove(e.fingerprints[i*2],e.fingerprints[i*2+1]),r.push(e.fingerprints[i*2],e.fingerprints[i*2+1]))}return Int32Array.from(r)},M=e=>{for(let t=0;t<e.length;t+=2)S.remove(e[t],e[t+1])},N=async(e,t,n)=>{let r=u(n);if(r.length===0)return!0;let i=new Map(E.map(e=>[e.index,a()]));for(let e of r.filter(e=>e.from===y)){let n=i.get(e.to),r=t.splice(t.length-e.count,e.count);if(!n||!r.every(n.encode))return!1}return i.forEach((t,n)=>{let r=t.finish();O(n,{phase:`balance`,level:e,from:y,states:r},[r.words.buffer])}),(await T.receive(`balance`,e,E.length)).forEach(e=>{e.states&&t.push(...x(e.states).map(b))}),!0},P=async e=>{let t=[],n=k(D.states,t);if(!n)return;E.forEach(t=>{let r=Int32Array.from(n.pending[t.index].fingerprints);O(t.index,{phase:`query`,level:e,from:y,fingerprints:r},[r.buffer])}),(await T.receive(`query`,e,E.length)).forEach(t=>{let n=A(t.fingerprints??[]);O(t.from,{phase:`answer`,level:e,from:y,bits:n},[n.buffer])});let r=await T.receive(`answer`,e,E.length);for(let i of r){let r=j(n.pending[i.from],i.bits??/* @__PURE__ */ new Uint8Array,t);if(!r)return;O(i.from,{phase:`sizes`,level:e,from:y,unmarks:r,size:0},[r.buffer])}let i=t.length,a=Array.from({length:v},()=>0);if(a[y]=i,E.forEach(t=>O(t.index,{phase:`sizes`,level:e,from:y,size:i},[])),(await T.receive(`sizes`,e,E.length*2)).forEach(e=>{e.unmarks?M(e.unmarks):a[e.from]=e.size??0}),await N(e,t,a))return D.states=t,{type:`level`,level:e,generated:n.generated,added:i}},F=e=>p.postMessage(e),I=e=>{P(e).then(e=>F(e??{type:`abort`}),()=>F({type:`abort`}))};p.addEventListener(`message`,e=>{let t=e.data;t.type===`level`&&I(t.level)}),F({type:`ready`})};d().then(e=>{let t=n=>{let r=n.data;if(r.type===`start`){e.removeEventListener?.(`message`,t);try{p(r,e)}catch{e.postMessage({type:`abort`})}}};e.addEventListener(`message`,t),e.start?.()});
12
+ `node:worker_threads`)).parentPort,h=()=>{let e=/* @__PURE__ */ new Map,t=/* @__PURE__ */ new Map,n=(e,t)=>`${e}:${t}`,r=n=>{let r=t.get(n),i=e.get(n)??[];!r||i.length<r.count||(t.delete(n),e.delete(n),r.resolve(i))};return{deliver:t=>{let i=n(t.phase,t.level);e.set(i,[...e.get(i)??[],t]),r(i)},receive:(e,i,a)=>new Promise(o=>{let s=n(e,i);t.set(s,{count:a,resolve:o}),r(s)})}},g=(m,g)=>{let _=new Map(m.modules),v=e=>_.get(e),y=new Map(m.classes);t(o(m.source,m.config,v));let b=d(),x=r(m.config,{source:m.source,loadModule:v,loadClass:e=>y.get(e),print:()=>{},files:{readFile:void 0,writeFile:void 0}}).environment,S=l(m.config,x,()=>i(m.source,v)),C=S?.spec.next;if(!S||C===void 0)return g.postMessage({type:`abort`});let w=m.count,T=m.index,E=e(),D=u(x.variables.length),O=c(),k=c(),A=S.isSymmetric?c():void 0,j=/* @__PURE__ */ new Int32Array(2),M=h(),N=m.ports.flatMap((e,t)=>e?[{port:e,index:t}]:[]);N.forEach(e=>{e.port.addEventListener(`message`,e=>M.deliver(e.data)),e.port.start?.()});for(let e=0;e<m.seedFingerprints.length;e+=2)O.insert(m.seedFingerprints[e],m.seedFingerprints[e+1]);let P={states:D(m.seed).map(E)},F=(e,t,n)=>m.ports[e]?.postMessage(t,n),I=(e,t,r)=>{let i=Array.from({length:w},()=>({states:[],origins:[],fingerprints:[],fingerprintStates:[]})),o={generated:0},s=new Int32Array(e.length);for(let c=0;c<e.length;c++){let l=e[c],u=f(C,l,x,S.spec.scope);if(o.generated+=u.length,u.length===0&&m.config.checkDeadlock)return;for(let e of u){if(S.findViolatedActionProperty(l,e.state))return;if(!S.satisfiesActionConstraints(l,e.state)||A&&(n(e.state,j),!A.insert(j[0],j[1])))continue;E(e.state);let o=S.getFingerprintState(e.state);n(o,j);let u=a(j[1],w);if(u===T){if(!O.insert(j[0],j[1]))continue;if(S.findViolatedInvariant(e.state,l))return;if(!S.satisfiesConstraints(e.state,l)){O.remove(j[0],j[1]);continue}t.push(e.state),r.push(o),s[c]++}else k.insert(j[0],j[1])&&(i[u].states.push(e.state),i[u].origins.push(c),i[u].fingerprints.push(j[0],j[1]),i[u].fingerprintStates.push(o))}}return{pending:i,generated:o.generated,newStates:s}},L=e=>{let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=+!!O.insert(e[n*2],e[n*2+1]);return t},R=(e,t,n,r,i)=>{let a=[];for(let o=0;o<t.length;o++){if(t[o]===0)continue;let s=e.states[o],c=P.states[e.origins[o]];if(S.findViolatedInvariant(s,c))return;S.satisfiesConstraints(s,c)?(n.push(s),r.push(e.fingerprintStates[o]),i[e.origins[o]]++):(k.remove(e.fingerprints[o*2],e.fingerprints[o*2+1]),a.push(e.fingerprints[o*2],e.fingerprints[o*2+1]))}return Int32Array.from(a)},z=e=>{for(let t=0;t<e.length;t+=2)O.remove(e[t],e[t+1])},B=async(e,t,n)=>{let r=p(n);if(r.length===0)return!0;let i=new Map(N.map(e=>[e.index,s()]));for(let e of r.filter(e=>e.from===T)){let n=i.get(e.to),r=t.splice(t.length-e.count,e.count);if(!n||!r.every(n.encode))return!1}return i.forEach((t,n)=>{let r=t.finish();F(n,{phase:`balance`,level:e,from:T,states:r},[r.words.buffer])}),(await M.receive(`balance`,e,N.length)).forEach(e=>{e.states&&t.push(...D(e.states).map(E))}),!0},V=async e=>{let t=[],n=[],r=I(P.states,t,n);if(!r||d()!==b)return;N.forEach(t=>{let n=Int32Array.from(r.pending[t.index].fingerprints);F(t.index,{phase:`query`,level:e,from:T,fingerprints:n},[n.buffer])}),(await M.receive(`query`,e,N.length)).forEach(t=>{let n=L(t.fingerprints??[]);F(t.from,{phase:`answer`,level:e,from:T,bits:n},[n.buffer])});let i=await M.receive(`answer`,e,N.length);for(let a of i){let i=R(r.pending[a.from],a.bits??/* @__PURE__ */ new Uint8Array,t,n,r.newStates);if(!i)return;F(a.from,{phase:`sizes`,level:e,from:T,unmarks:i},[i.buffer])}let a=t.length,o=Array.from({length:32},()=>0);r.newStates.forEach(e=>o[Math.min(e,31)]++);let s=S.getStoredFingerprints(t,n),c=Array.from({length:w},()=>0);if(c[T]=a,N.forEach(t=>F(t.index,{phase:`sizes`,level:e,from:T,size:a},[])),(await M.receive(`sizes`,e,N.length*2)).forEach(e=>{e.unmarks?z(e.unmarks):c[e.from]=e.size??0}),d()===b&&await B(e,t,c))return P.states=t,{type:`level`,level:e,generated:r.generated,added:a,outDegrees:o,fingerprints:s}},H=e=>g.postMessage(e,e.type===`level`?[e.fingerprints.buffer]:[]),U=e=>{V(e).then(e=>H(e??{type:`abort`}),()=>H({type:`abort`}))};g.addEventListener(`message`,e=>{let t=e.data;t.type===`level`&&U(t.level)}),H({type:`ready`})};m().then(e=>{let t=n=>{let r=n.data;if(r.type===`start`){e.removeEventListener?.(`message`,t);try{g(r,e)}catch{e.postMessage({type:`abort`})}}};e.addEventListener(`message`,t),e.start?.()});
package/dist/parallel.cjs CHANGED
@@ -9,4 +9,4 @@
9
9
  const e=require("./transfer.cjs"),t=async e=>{if(typeof Worker==`function`){let t=new Worker(new URL(`./parallel-worker.js`,require("url").pathToFileURL(__filename).href),{type:`module`});return t.addEventListener(`message`,t=>e(t.data)),t.addEventListener(`error`,()=>e({type:`abort`})),t}let t=new(await(import(
10
10
  /* @vite-ignore */
11
11
  /* webpackIgnore: true */
12
- `node:worker_threads`))).Worker(new URL(`./parallel-worker.js`,require("url").pathToFileURL(__filename).href));return t.on(`message`,t=>e(t)),t.on(`error`,()=>e({type:`abort`})),{postMessage:(e,n)=>t.postMessage(e,n),terminate:()=>void t.terminate()}},n=(t,r)=>(t.kind===`Apply`||t.kind===`OperatorReference`)&&e.p(t.operator,r)||t.kind===`Identifier`&&e.p(t.name,r)||e.f(t).some(e=>n(e,r)),r=e=>[...e.definitions.values()].some(t=>n(t.body,e)||t.kind===`Function`&&t.bounds.some(t=>n(t.set,e))),i=async n=>{let i=typeof n.config==`string`?e._(n.config):n.config,a=()=>e.o({...n,config:i});if(n.workers<2||i.view!==void 0||i.postconditions.length>0||i.possible.length>0)return a();let o=/* @__PURE__ */ new Map,s=e.u(e.d(n.source),i,{loadModule:e=>{let t=n.loadModule?.(e);return o.set(e,t),t},print:n.onPrint??console.log,files:{readFile:n.readFile,writeFile:n.writeFile}}),c=s.environment;if(e.c(s.assumptions,c))return a();let l=e.s(i,c);if(!l||l.properties.liveness.length>0||r(c))return a();let u=n.workers,d=e.l(),f=e.r(),p=/* @__PURE__ */ new Int32Array(2),m=Array.from({length:u},()=>({encoder:e.n(),fingerprints:[]})),h={generatedStates:0,distinctStates:0,depth:0};for(let t of e.m(l.spec.init,c)){if(d(t),h.generatedStates++,e.a(l.getFingerprintState(t),p),!f.insert(p[0],p[1]))continue;if(l.findViolatedInvariant(t)||l.findFailedInitialPredicate(t))return a();if(!l.satisfiesConstraints(t)){f.remove(p[0],p[1]);continue}let n=m[e.i(p[1],u)];if(!n.encoder.encode(t))return a();n.fingerprints.push(p[0],p[1]),h.distinctStates++}if(h.distinctStates===0)return{status:`success`,violation:void 0,...h};h.depth=1;let g=[],_={resolve:e=>{}},v=e=>{g.push(e),(e.type===`abort`||g.length===u)&&_.resolve(g.splice(0))},y=()=>new Promise(e=>{_.resolve=e}),b=y(),x=await Promise.all(Array.from({length:u},()=>t(v))),S=()=>x.forEach(e=>e.terminate()),C=/* @__PURE__ */ new Map,w=(e,t)=>{let n=e<t?`${e}:${t}`:`${t}:${e}`,r=C.get(n)??new MessageChannel;return C.set(n,r),e<t?r.port1:r.port2};x.forEach((e,t)=>{let r=Array.from({length:u},(e,n)=>n===t?void 0:w(t,n)),a=m[t].encoder.finish(),s=Int32Array.from(m[t].fingerprints),c={type:`start`,source:n.source,config:i,modules:[...o],index:t,count:u,ports:r,seed:a,seedFingerprints:s};e.postMessage(c,[...r.filter(e=>e!==void 0),a.words.buffer,s.buffer])});let T=e=>e.some(e=>e.type===`abort`);if(T(await b))return S(),a();for(let e=1;;e++){let t=y();x.forEach(t=>t.postMessage({type:`level`,level:e}));let n=await t;if(T(n))return S(),a();let r=n.flatMap(e=>e.type===`level`?[e]:[]),i=r.reduce((e,t)=>e+t.added,0);if(h.generatedStates+=r.reduce((e,t)=>e+t.generated,0),h.distinctStates+=i,i===0)return S(),{status:`success`,violation:void 0,...h};h.depth++}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
12
+ `node:worker_threads`))).Worker(new URL(`./parallel-worker.js`,require("url").pathToFileURL(__filename).href));return t.on(`message`,e),t.on(`error`,()=>e({type:`abort`})),{postMessage:(e,n)=>t.postMessage(e,n),terminate:()=>void t.terminate()}},n=async n=>{let r=typeof n.config==`string`?e.D(n.config):n.config,i=()=>e.o({...n,config:r}),a=n.workers??1;if(a<2||r.view!==void 0||r.postconditions.length>0||r.possible.length>0)return i();let o=/* @__PURE__ */ new Map,s=e=>{let t=n.loadModule?.(e);return o.set(e,t),t},c=/* @__PURE__ */ new Map,l=e=>{let t=n.loadClass?.(e);return c.set(e,t),t};e.T(e.m(n.source,r,s));let u=e.w(),d=e.g(r,{source:n.source,loadModule:s,loadClass:l,print:n.onPrint??console.log,files:{readFile:n.readFile,writeFile:n.writeFile}}),f=d.environment,p=e.s(r,f,()=>e.h(n.source,s));if(e.c(d.assumptions,f)||!p||p.spec.init===void 0||p.spec.next===void 0||p.properties.liveness.length>0||e.y(f))return i();let m=e.S(),h=e.r(),g=/* @__PURE__ */ new Int32Array(2),_=Array.from({length:a},()=>({encoder:e.n(),fingerprints:[]})),v={generatedStates:0,distinctStates:0,queuedStates:0,depth:0,outDegrees:Array.from({length:32},()=>0)},y=[],b=()=>({status:`success`,violation:void 0,failure:void 0,...v,fingerprintDistance:e.d(v.distinctStates,v.generatedStates,()=>{let e=new BigInt64Array(v.distinctStates);return y.reduce((t,n)=>(e.set(n,t),t+n.length),0),e})}),x=t=>{let n=[];for(let r of e.b(t,f,p.spec.scope)){if(m(r),v.generatedStates++,e.a(p.getFingerprintState(r),g),!h.insert(g[0],g[1]))continue;if(p.findViolatedInvariant(r)||p.findFailedInitialPredicate(r))return!1;if(!p.satisfiesConstraints(r)){h.remove(g[0],g[1]);continue}let t=_[e.i(g[1],a)];if(!t.encoder.encode(r))return!1;t.fingerprints.push(g[0],g[1]),n.push(r),v.distinctStates++}return y.push(BigInt64Array.from(n,e=>f.runtime.getFingerprint(e))),!0};try{if(!x(p.spec.init))return i()}catch(t){if(!(t instanceof e.j))throw t;return i()}if(e.w()!==u)return i();if(v.depth=v.generatedStates===0?0:1,v.distinctStates===0)return b();let S=[],C={resolve:e=>{}},w=e=>{S.push(e),(e.type===`abort`||S.length===a)&&C.resolve(S.splice(0))},T=()=>new Promise(e=>{C.resolve=e}),E=T(),D=await Promise.all(Array.from({length:a},()=>t(w))),O=()=>D.forEach(e=>e.terminate()),k=/* @__PURE__ */ new Map,A=(e,t)=>{let n=e<t?`${e}:${t}`:`${t}:${e}`,r=k.get(n)??new MessageChannel;return k.set(n,r),e<t?r.port1:r.port2};D.forEach((e,t)=>{let i=Array.from({length:a},(e,n)=>n===t?void 0:A(t,n)),s=_[t].encoder.finish(),l=Int32Array.from(_[t].fingerprints),u={type:`start`,source:n.source,config:r,modules:[...o],classes:[...c],index:t,count:a,ports:i,seed:s,seedFingerprints:l};e.postMessage(u,[...i.filter(e=>e!==void 0),s.words.buffer,l.buffer])});let j=e=>e.some(e=>e.type===`abort`);if(j(await E))return O(),i();for(let e=1;;e++){let t=T();D.forEach(t=>t.postMessage({type:`level`,level:e}));let n=await t;if(j(n))return O(),i();let r=n.flatMap(e=>e.type===`level`?[e]:[]),a=r.reduce((e,t)=>e+t.added,0);if(v.generatedStates+=r.reduce((e,t)=>e+t.generated,0),v.distinctStates+=a,r.forEach(e=>{e.outDegrees.forEach((e,t)=>v.outDegrees[t]+=e),y.push(e.fingerprints)}),a===0)return O(),b();v.depth++}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
package/dist/parallel.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- import{_ as e,a as t,c as n,d as r,f as i,i as a,l as o,m as s,n as c,o as l,p as u,r as d,s as f,u as p}from"./transfer.js";const m=async e=>{if(typeof Worker==`function`){let t=new Worker(new URL(`./parallel-worker.js`,import.meta.url),{type:`module`});return t.addEventListener(`message`,t=>e(t.data)),t.addEventListener(`error`,()=>e({type:`abort`})),t}let t=new(await(import(
9
+ import{D as e,S as t,T as n,a as r,b as i,c as a,d as o,g as s,h as c,i as l,j as u,m as d,n as f,o as p,r as m,s as h,w as g,y as _}from"./transfer.js";const v=async e=>{if(typeof Worker==`function`){let t=new Worker(new URL(`./parallel-worker.js`,import.meta.url),{type:`module`});return t.addEventListener(`message`,t=>e(t.data)),t.addEventListener(`error`,()=>e({type:`abort`})),t}let t=new(await(import(
10
10
  /* @vite-ignore */
11
11
  /* webpackIgnore: true */
12
- `node:worker_threads`))).Worker(new URL(`./parallel-worker.js`,import.meta.url));return t.on(`message`,t=>e(t)),t.on(`error`,()=>e({type:`abort`})),{postMessage:(e,n)=>t.postMessage(e,n),terminate:()=>void t.terminate()}},h=(e,t)=>(e.kind===`Apply`||e.kind===`OperatorReference`)&&u(e.operator,t)||e.kind===`Identifier`&&u(e.name,t)||i(e).some(e=>h(e,t)),g=e=>[...e.definitions.values()].some(t=>h(t.body,e)||t.kind===`Function`&&t.bounds.some(t=>h(t.set,e))),_=async i=>{let u=typeof i.config==`string`?e(i.config):i.config,h=()=>l({...i,config:u});if(i.workers<2||u.view!==void 0||u.postconditions.length>0||u.possible.length>0)return h();let _=/* @__PURE__ */ new Map,v=p(r(i.source),u,{loadModule:e=>{let t=i.loadModule?.(e);return _.set(e,t),t},print:i.onPrint??console.log,files:{readFile:i.readFile,writeFile:i.writeFile}}),y=v.environment;if(n(v.assumptions,y))return h();let b=f(u,y);if(!b||b.properties.liveness.length>0||g(y))return h();let x=i.workers,S=o(),C=d(),w=/* @__PURE__ */ new Int32Array(2),T=Array.from({length:x},()=>({encoder:c(),fingerprints:[]})),E={generatedStates:0,distinctStates:0,depth:0};for(let e of s(b.spec.init,y)){if(S(e),E.generatedStates++,t(b.getFingerprintState(e),w),!C.insert(w[0],w[1]))continue;if(b.findViolatedInvariant(e)||b.findFailedInitialPredicate(e))return h();if(!b.satisfiesConstraints(e)){C.remove(w[0],w[1]);continue}let n=T[a(w[1],x)];if(!n.encoder.encode(e))return h();n.fingerprints.push(w[0],w[1]),E.distinctStates++}if(E.distinctStates===0)return{status:`success`,violation:void 0,...E};E.depth=1;let D=[],O={resolve:e=>{}},k=e=>{D.push(e),(e.type===`abort`||D.length===x)&&O.resolve(D.splice(0))},A=()=>new Promise(e=>{O.resolve=e}),j=A(),M=await Promise.all(Array.from({length:x},()=>m(k))),N=()=>M.forEach(e=>e.terminate()),P=/* @__PURE__ */ new Map,F=(e,t)=>{let n=e<t?`${e}:${t}`:`${t}:${e}`,r=P.get(n)??new MessageChannel;return P.set(n,r),e<t?r.port1:r.port2};M.forEach((e,t)=>{let n=Array.from({length:x},(e,n)=>n===t?void 0:F(t,n)),r=T[t].encoder.finish(),a=Int32Array.from(T[t].fingerprints),o={type:`start`,source:i.source,config:u,modules:[..._],index:t,count:x,ports:n,seed:r,seedFingerprints:a};e.postMessage(o,[...n.filter(e=>e!==void 0),r.words.buffer,a.buffer])});let I=e=>e.some(e=>e.type===`abort`);if(I(await j))return N(),h();for(let e=1;;e++){let t=A();M.forEach(t=>t.postMessage({type:`level`,level:e}));let n=await t;if(I(n))return N(),h();let r=n.flatMap(e=>e.type===`level`?[e]:[]),i=r.reduce((e,t)=>e+t.added,0);if(E.generatedStates+=r.reduce((e,t)=>e+t.generated,0),E.distinctStates+=i,i===0)return N(),{status:`success`,violation:void 0,...E};E.depth++}};export{_ as t};
12
+ `node:worker_threads`))).Worker(new URL(`./parallel-worker.js`,import.meta.url));return t.on(`message`,e),t.on(`error`,()=>e({type:`abort`})),{postMessage:(e,n)=>t.postMessage(e,n),terminate:()=>void t.terminate()}},y=async y=>{let b=typeof y.config==`string`?e(y.config):y.config,x=()=>p({...y,config:b}),S=y.workers??1;if(S<2||b.view!==void 0||b.postconditions.length>0||b.possible.length>0)return x();let C=/* @__PURE__ */ new Map,w=e=>{let t=y.loadModule?.(e);return C.set(e,t),t},T=/* @__PURE__ */ new Map,E=e=>{let t=y.loadClass?.(e);return T.set(e,t),t};n(d(y.source,b,w));let D=g(),O=s(b,{source:y.source,loadModule:w,loadClass:E,print:y.onPrint??console.log,files:{readFile:y.readFile,writeFile:y.writeFile}}),k=O.environment,A=h(b,k,()=>c(y.source,w));if(a(O.assumptions,k)||!A||A.spec.init===void 0||A.spec.next===void 0||A.properties.liveness.length>0||_(k))return x();let j=t(),M=m(),N=/* @__PURE__ */ new Int32Array(2),P=Array.from({length:S},()=>({encoder:f(),fingerprints:[]})),F={generatedStates:0,distinctStates:0,queuedStates:0,depth:0,outDegrees:Array.from({length:32},()=>0)},I=[],L=()=>({status:`success`,violation:void 0,failure:void 0,...F,fingerprintDistance:o(F.distinctStates,F.generatedStates,()=>{let e=new BigInt64Array(F.distinctStates);return I.reduce((t,n)=>(e.set(n,t),t+n.length),0),e})}),R=e=>{let t=[];for(let n of i(e,k,A.spec.scope)){if(j(n),F.generatedStates++,r(A.getFingerprintState(n),N),!M.insert(N[0],N[1]))continue;if(A.findViolatedInvariant(n)||A.findFailedInitialPredicate(n))return!1;if(!A.satisfiesConstraints(n)){M.remove(N[0],N[1]);continue}let e=P[l(N[1],S)];if(!e.encoder.encode(n))return!1;e.fingerprints.push(N[0],N[1]),t.push(n),F.distinctStates++}return I.push(BigInt64Array.from(t,e=>k.runtime.getFingerprint(e))),!0};try{if(!R(A.spec.init))return x()}catch(e){if(!(e instanceof u))throw e;return x()}if(g()!==D)return x();if(F.depth=F.generatedStates===0?0:1,F.distinctStates===0)return L();let z=[],B={resolve:e=>{}},V=e=>{z.push(e),(e.type===`abort`||z.length===S)&&B.resolve(z.splice(0))},H=()=>new Promise(e=>{B.resolve=e}),U=H(),W=await Promise.all(Array.from({length:S},()=>v(V))),G=()=>W.forEach(e=>e.terminate()),K=/* @__PURE__ */ new Map,q=(e,t)=>{let n=e<t?`${e}:${t}`:`${t}:${e}`,r=K.get(n)??new MessageChannel;return K.set(n,r),e<t?r.port1:r.port2};W.forEach((e,t)=>{let n=Array.from({length:S},(e,n)=>n===t?void 0:q(t,n)),r=P[t].encoder.finish(),i=Int32Array.from(P[t].fingerprints),a={type:`start`,source:y.source,config:b,modules:[...C],classes:[...T],index:t,count:S,ports:n,seed:r,seedFingerprints:i};e.postMessage(a,[...n.filter(e=>e!==void 0),r.words.buffer,i.buffer])});let J=e=>e.some(e=>e.type===`abort`);if(J(await U))return G(),x();for(let e=1;;e++){let t=H();W.forEach(t=>t.postMessage({type:`level`,level:e}));let n=await t;if(J(n))return G(),x();let r=n.flatMap(e=>e.type===`level`?[e]:[]),i=r.reduce((e,t)=>e+t.added,0);if(F.generatedStates+=r.reduce((e,t)=>e+t.generated,0),F.distinctStates+=i,r.forEach(e=>{e.outDegrees.forEach((e,t)=>F.outDegrees[t]+=e),I.push(e.fingerprints)}),i===0)return G(),L();F.depth++}};export{y as t};