@libraz/coverwise 1.0.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.
Files changed (110) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +119 -0
  3. package/README.npm.md +119 -0
  4. package/dist/coverwise.js +2 -0
  5. package/dist/coverwise.wasm +0 -0
  6. package/dist/js/constraint.d.ts +78 -0
  7. package/dist/js/constraint.d.ts.map +1 -0
  8. package/dist/js/constraint.js +213 -0
  9. package/dist/js/constraint.js.map +1 -0
  10. package/dist/js/index.d.ts +94 -0
  11. package/dist/js/index.d.ts.map +1 -0
  12. package/dist/js/index.js +164 -0
  13. package/dist/js/index.js.map +1 -0
  14. package/dist/js/pure/adapter.d.ts +40 -0
  15. package/dist/js/pure/adapter.d.ts.map +1 -0
  16. package/dist/js/pure/adapter.js +207 -0
  17. package/dist/js/pure/adapter.js.map +1 -0
  18. package/dist/js/pure/index.d.ts +83 -0
  19. package/dist/js/pure/index.d.ts.map +1 -0
  20. package/dist/js/pure/index.js +132 -0
  21. package/dist/js/pure/index.js.map +1 -0
  22. package/dist/js/types.d.ts +132 -0
  23. package/dist/js/types.d.ts.map +1 -0
  24. package/dist/js/types.js +3 -0
  25. package/dist/js/types.js.map +1 -0
  26. package/dist/src/ts/algo/greedy.d.ts +9 -0
  27. package/dist/src/ts/algo/greedy.d.ts.map +1 -0
  28. package/dist/src/ts/algo/greedy.js +137 -0
  29. package/dist/src/ts/algo/greedy.js.map +1 -0
  30. package/dist/src/ts/algo/index.d.ts +2 -0
  31. package/dist/src/ts/algo/index.d.ts.map +1 -0
  32. package/dist/src/ts/algo/index.js +2 -0
  33. package/dist/src/ts/algo/index.js.map +1 -0
  34. package/dist/src/ts/core/coverage-engine.d.ts +40 -0
  35. package/dist/src/ts/core/coverage-engine.d.ts.map +1 -0
  36. package/dist/src/ts/core/coverage-engine.js +366 -0
  37. package/dist/src/ts/core/coverage-engine.js.map +1 -0
  38. package/dist/src/ts/core/generator.d.ts +6 -0
  39. package/dist/src/ts/core/generator.d.ts.map +1 -0
  40. package/dist/src/ts/core/generator.js +394 -0
  41. package/dist/src/ts/core/generator.js.map +1 -0
  42. package/dist/src/ts/core/index.d.ts +3 -0
  43. package/dist/src/ts/core/index.d.ts.map +1 -0
  44. package/dist/src/ts/core/index.js +3 -0
  45. package/dist/src/ts/core/index.js.map +1 -0
  46. package/dist/src/ts/model/boundary.d.ts +29 -0
  47. package/dist/src/ts/model/boundary.d.ts.map +1 -0
  48. package/dist/src/ts/model/boundary.js +102 -0
  49. package/dist/src/ts/model/boundary.js.map +1 -0
  50. package/dist/src/ts/model/constraint-ast.d.ts +152 -0
  51. package/dist/src/ts/model/constraint-ast.d.ts.map +1 -0
  52. package/dist/src/ts/model/constraint-ast.js +384 -0
  53. package/dist/src/ts/model/constraint-ast.js.map +1 -0
  54. package/dist/src/ts/model/constraint-parser.d.ts +49 -0
  55. package/dist/src/ts/model/constraint-parser.d.ts.map +1 -0
  56. package/dist/src/ts/model/constraint-parser.js +831 -0
  57. package/dist/src/ts/model/constraint-parser.js.map +1 -0
  58. package/dist/src/ts/model/error.d.ts +19 -0
  59. package/dist/src/ts/model/error.d.ts.map +1 -0
  60. package/dist/src/ts/model/error.js +19 -0
  61. package/dist/src/ts/model/error.js.map +1 -0
  62. package/dist/src/ts/model/generate-options.d.ts +82 -0
  63. package/dist/src/ts/model/generate-options.d.ts.map +1 -0
  64. package/dist/src/ts/model/generate-options.js +52 -0
  65. package/dist/src/ts/model/generate-options.js.map +1 -0
  66. package/dist/src/ts/model/index.d.ts +6 -0
  67. package/dist/src/ts/model/index.d.ts.map +1 -0
  68. package/dist/src/ts/model/index.js +6 -0
  69. package/dist/src/ts/model/index.js.map +1 -0
  70. package/dist/src/ts/model/parameter.d.ts +65 -0
  71. package/dist/src/ts/model/parameter.d.ts.map +1 -0
  72. package/dist/src/ts/model/parameter.js +157 -0
  73. package/dist/src/ts/model/parameter.js.map +1 -0
  74. package/dist/src/ts/model/test-case.d.ts +67 -0
  75. package/dist/src/ts/model/test-case.d.ts.map +1 -0
  76. package/dist/src/ts/model/test-case.js +28 -0
  77. package/dist/src/ts/model/test-case.js.map +1 -0
  78. package/dist/src/ts/util/bitset.d.ts +14 -0
  79. package/dist/src/ts/util/bitset.d.ts.map +1 -0
  80. package/dist/src/ts/util/bitset.js +66 -0
  81. package/dist/src/ts/util/bitset.js.map +1 -0
  82. package/dist/src/ts/util/combinatorics.d.ts +4 -0
  83. package/dist/src/ts/util/combinatorics.d.ts.map +1 -0
  84. package/dist/src/ts/util/combinatorics.js +60 -0
  85. package/dist/src/ts/util/combinatorics.js.map +1 -0
  86. package/dist/src/ts/util/index.d.ts +5 -0
  87. package/dist/src/ts/util/index.d.ts.map +1 -0
  88. package/dist/src/ts/util/index.js +7 -0
  89. package/dist/src/ts/util/index.js.map +1 -0
  90. package/dist/src/ts/util/rng.d.ts +13 -0
  91. package/dist/src/ts/util/rng.d.ts.map +1 -0
  92. package/dist/src/ts/util/rng.js +112 -0
  93. package/dist/src/ts/util/rng.js.map +1 -0
  94. package/dist/src/ts/util/string_util.d.ts +3 -0
  95. package/dist/src/ts/util/string_util.d.ts.map +1 -0
  96. package/dist/src/ts/util/string_util.js +25 -0
  97. package/dist/src/ts/util/string_util.js.map +1 -0
  98. package/dist/src/ts/validator/constraint-validator.d.ts +34 -0
  99. package/dist/src/ts/validator/constraint-validator.d.ts.map +1 -0
  100. package/dist/src/ts/validator/constraint-validator.js +51 -0
  101. package/dist/src/ts/validator/constraint-validator.js.map +1 -0
  102. package/dist/src/ts/validator/coverage-validator.d.ts +42 -0
  103. package/dist/src/ts/validator/coverage-validator.d.ts.map +1 -0
  104. package/dist/src/ts/validator/coverage-validator.js +230 -0
  105. package/dist/src/ts/validator/coverage-validator.js.map +1 -0
  106. package/dist/src/ts/validator/index.d.ts +3 -0
  107. package/dist/src/ts/validator/index.d.ts.map +1 -0
  108. package/dist/src/ts/validator/index.js +3 -0
  109. package/dist/src/ts/validator/index.js.map +1 -0
  110. package/package.json +82 -0
@@ -0,0 +1,137 @@
1
+ /// @file greedy.ts
2
+ /// @brief Constructive greedy algorithm for covering array construction.
3
+ ///
4
+ /// Builds test cases parameter-by-parameter, choosing the value that
5
+ /// maximizes coverage gain at each step. This is O(n * max_values)
6
+ /// per test case instead of O(product of values).
7
+ import { ConstraintResult } from '../model/constraint-ast.js';
8
+ import { UNASSIGNED } from '../model/parameter.js';
9
+ /// Break ties among bestValues using weights, then RNG for remaining ties.
10
+ ///
11
+ /// Uses weighted random selection: each tied value's probability is proportional
12
+ /// to its weight. This biases toward higher-weighted values while maintaining
13
+ /// enough randomness for the greedy algorithm to explore diverse test cases.
14
+ function breakTieWithWeights(bestValues, weights, pi, rng) {
15
+ if (bestValues.length === 1) {
16
+ return bestValues[0];
17
+ }
18
+ if (weights.length > 0) {
19
+ // Weighted random selection: probability proportional to weight.
20
+ let totalWeight = 0.0;
21
+ for (const vi of bestValues) {
22
+ totalWeight += weights[pi][vi];
23
+ }
24
+ if (totalWeight > 0.0) {
25
+ // Generate a random value in [0, totalWeight).
26
+ const r = (rng.nextUint32(1000000) / 1000000.0) * totalWeight;
27
+ let cumulative = 0.0;
28
+ for (const vi of bestValues) {
29
+ cumulative += weights[pi][vi];
30
+ if (r < cumulative) {
31
+ return vi;
32
+ }
33
+ }
34
+ // Fallback to last value (floating point edge case).
35
+ return bestValues[bestValues.length - 1];
36
+ }
37
+ }
38
+ // No weights or zero total: random tie-break.
39
+ const idx = rng.nextUint32(bestValues.length);
40
+ return bestValues[idx];
41
+ }
42
+ /// Build a test case parameter-by-parameter using greedy value selection.
43
+ ///
44
+ /// For each parameter (in shuffled order), evaluate all possible values and pick
45
+ /// the one that would cover the most uncovered tuples. Ties broken by weights then RNG.
46
+ ///
47
+ /// Constraints are evaluated at each step using three-valued logic:
48
+ /// - true: continue
49
+ /// - false: skip this value (prune)
50
+ /// - unknown: continue (not all params assigned yet)
51
+ ///
52
+ /// @param params Parameter definitions (only .size is used).
53
+ /// @param scoreFn Scoring function that returns the coverage gain for assigning
54
+ /// value vi to parameter pi given the current partial test case.
55
+ /// @param constraints Active constraints (empty if none).
56
+ /// @param rng Random number generator for tie-breaking and parameter ordering.
57
+ /// @param allowedValues Optional per-parameter mask of allowed values.
58
+ /// If non-empty, allowedValues[pi][vi] must be true for value vi of param pi
59
+ /// to be considered. If empty, all values are allowed.
60
+ /// @param weights Optional per-parameter per-value weights for tie-breaking.
61
+ /// If non-empty, weights[pi][vi] is the weight for value vi of param pi.
62
+ export function greedyConstruct(params, scoreFn, constraints, rng, allowedValues = [], weights = []) {
63
+ const numParams = params.length;
64
+ const values = new Array(numParams);
65
+ for (let i = 0; i < numParams; i++) {
66
+ values[i] = UNASSIGNED;
67
+ }
68
+ const tc = { values };
69
+ // Fisher-Yates shuffle for parameter order.
70
+ const order = new Array(numParams);
71
+ for (let i = 0; i < numParams; i++) {
72
+ order[i] = i;
73
+ }
74
+ for (let i = numParams; i > 1; --i) {
75
+ const j = rng.nextUint32(i);
76
+ const tmp = order[i - 1];
77
+ order[i - 1] = order[j];
78
+ order[j] = tmp;
79
+ }
80
+ for (const pi of order) {
81
+ let bestScore = 0;
82
+ const bestValues = [];
83
+ for (let vi = 0; vi < params[pi].size; ++vi) {
84
+ if (allowedValues.length > 0 && !allowedValues[pi][vi]) {
85
+ continue;
86
+ }
87
+ // Temporarily assign value for constraint evaluation.
88
+ tc.values[pi] = vi;
89
+ // Evaluate constraints using three-valued logic.
90
+ let pruned = false;
91
+ for (const constraint of constraints) {
92
+ const result = constraint.evaluate(tc.values);
93
+ if (result === ConstraintResult.False) {
94
+ pruned = true;
95
+ break;
96
+ }
97
+ // True and Unknown: continue.
98
+ }
99
+ // Reset before deciding.
100
+ tc.values[pi] = UNASSIGNED;
101
+ if (pruned) {
102
+ continue;
103
+ }
104
+ const score = scoreFn(tc, pi, vi);
105
+ if (bestValues.length === 0 || score > bestScore) {
106
+ bestScore = score;
107
+ bestValues.length = 0;
108
+ bestValues.push(vi);
109
+ }
110
+ else if (score === bestScore) {
111
+ bestValues.push(vi);
112
+ }
113
+ }
114
+ if (bestValues.length === 0) {
115
+ // Fallback: pick the first allowed value, or 0 if no mask.
116
+ if (allowedValues.length > 0) {
117
+ for (let vi = 0; vi < params[pi].size; ++vi) {
118
+ if (allowedValues[pi][vi]) {
119
+ tc.values[pi] = vi;
120
+ break;
121
+ }
122
+ }
123
+ if (tc.values[pi] === UNASSIGNED) {
124
+ tc.values[pi] = 0;
125
+ }
126
+ }
127
+ else {
128
+ tc.values[pi] = 0;
129
+ }
130
+ }
131
+ else {
132
+ tc.values[pi] = breakTieWithWeights(bestValues, weights, pi, rng);
133
+ }
134
+ }
135
+ return tc;
136
+ }
137
+ //# sourceMappingURL=greedy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"greedy.js","sourceRoot":"","sources":["../../../../src/ts/algo/greedy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { type GreedyParam, greedyConstruct, type ScoreFn } from './greedy.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ts/algo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { greedyConstruct } from './greedy.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ts/algo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAgB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { type ConstraintNode } from '../model/constraint-ast.js';
2
+ import { type ErrorInfo } from '../model/error.js';
3
+ import { type Parameter } from '../model/parameter.js';
4
+ import type { TestCase, UncoveredTuple } from '../model/test-case.js';
5
+ export interface CreateResult {
6
+ engine: CoverageEngine;
7
+ error: ErrorInfo;
8
+ }
9
+ export declare class CoverageEngine {
10
+ static readonly MAX_TUPLES = 16000000;
11
+ private params_;
12
+ private strength_;
13
+ private totalTuples_;
14
+ private invalidTuples_;
15
+ private covered_;
16
+ private paramSubset_;
17
+ private paramCombinations_;
18
+ private combinationOffsets_;
19
+ private paramToCombos_;
20
+ private paramPositionInCombo_;
21
+ private comboMultipliers_;
22
+ private constructor();
23
+ static create(params: Parameter[], strength: number): CreateResult;
24
+ static createFromSubset(allParams: Parameter[], paramSubset: number[], strength: number): CreateResult;
25
+ addTestCase(testCase: TestCase): void;
26
+ scoreValue(partial: TestCase, paramIndex: number, valueIndex: number): number;
27
+ scoreCandidate(candidate: TestCase): number;
28
+ excludeInvalidTuples(constraints: readonly ConstraintNode[]): void;
29
+ excludeInvalidValues(): void;
30
+ get totalTuples(): number;
31
+ get coveredCount(): number;
32
+ get coverageRatio(): number;
33
+ get isComplete(): boolean;
34
+ getUncoveredTuples(params: Parameter[]): UncoveredTuple[];
35
+ private initCombinations;
36
+ private initCombinationsFromSubset;
37
+ private buildLookupTables;
38
+ private computeTotalTuples;
39
+ }
40
+ //# sourceMappingURL=coverage-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-engine.d.ts","sourceRoot":"","sources":["../../../../src/ts/core/coverage-engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAa,KAAK,SAAS,EAAW,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAoB,KAAK,SAAS,EAAc,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKtE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;CAClB;AAKD,qBAAa,cAAc;IAGzB,MAAM,CAAC,QAAQ,CAAC,UAAU,YAAc;IAExC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAuC;IAIvD,OAAO,CAAC,YAAY,CAAgB;IAIpC,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,mBAAmB,CAAgB;IAG3C,OAAO,CAAC,cAAc,CAAkB;IAIxC,OAAO,CAAC,qBAAqB,CAAkB;IAG/C,OAAO,CAAC,iBAAiB,CAAkB;IAE3C,OAAO;IAMP,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY;IA2BlE,MAAM,CAAC,gBAAgB,CACrB,SAAS,EAAE,SAAS,EAAE,EACtB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,EAAE,MAAM,GACf,YAAY;IAqBf,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAkBrC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAuC7E,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM;IAyB3C,oBAAoB,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI;IA6DlE,oBAAoB,IAAI,IAAI;IA8C5B,IAAI,WAAW,IAAI,MAAM,CAExB;IAGD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAGD,IAAI,aAAa,IAAI,MAAM,CAK1B;IAGD,IAAI,UAAU,IAAI,OAAO,CAExB;IAID,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE;IA2CzD,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,0BAA0B;IAelC,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,kBAAkB;CAc3B"}
@@ -0,0 +1,366 @@
1
+ /// @file coverage-engine.ts
2
+ /// @brief Coverage tracking engine for t-wise tuple coverage.
3
+ import { ConstraintResult } from '../model/constraint-ast.js';
4
+ import { ErrorCode, okError } from '../model/error.js';
5
+ import { hasInvalidValues, UNASSIGNED } from '../model/parameter.js';
6
+ import { DynamicBitset } from '../util/bitset.js';
7
+ import { decodeMixedRadix, generateCombinations } from '../util/combinatorics.js';
8
+ /// Tracks which t-wise tuples are covered by the current test suite.
9
+ ///
10
+ /// Hard limit on total tuple count to prevent t-wise explosion.
11
+ export class CoverageEngine {
12
+ constructor() {
13
+ this.params_ = [];
14
+ this.strength_ = 0;
15
+ this.totalTuples_ = 0;
16
+ this.invalidTuples_ = 0;
17
+ this.covered_ = new DynamicBitset(0);
18
+ /// Mapping from local param index to global param index.
19
+ /// Empty means identity mapping (all params, no subset).
20
+ this.paramSubset_ = [];
21
+ /// Pre-computed C(n, t) parameter index combinations.
22
+ /// When paramSubset_ is set, these contain GLOBAL param indices.
23
+ this.paramCombinations_ = [];
24
+ this.combinationOffsets_ = [];
25
+ /// paramToCombos_[p] = list of combination indices that include param p.
26
+ this.paramToCombos_ = [];
27
+ /// paramPositionInCombo_[p][k] = position of p within
28
+ /// paramCombinations_[paramToCombos_[p][k]].
29
+ this.paramPositionInCombo_ = [];
30
+ /// comboMultipliers_[ci][j] = product of value counts for positions j+1..t-1.
31
+ this.comboMultipliers_ = [];
32
+ }
33
+ /// Initialize coverage tracking for the given parameters and strength.
34
+ /// @param params The parameter definitions.
35
+ /// @param strength The interaction strength (t). 2 = pairwise.
36
+ /// @returns Object with engine and error. Check error.code before using engine.
37
+ static create(params, strength) {
38
+ const engine = new CoverageEngine();
39
+ engine.params_ = params.slice();
40
+ engine.strength_ = strength;
41
+ engine.initCombinations();
42
+ engine.totalTuples_ = engine.computeTotalTuples();
43
+ engine.buildLookupTables();
44
+ if (engine.totalTuples_ > CoverageEngine.MAX_TUPLES) {
45
+ return {
46
+ engine: new CoverageEngine(),
47
+ error: makeTupleExplosionError(engine.totalTuples_, CoverageEngine.MAX_TUPLES),
48
+ };
49
+ }
50
+ engine.covered_ = new DynamicBitset(engine.totalTuples_);
51
+ return { engine, error: okError() };
52
+ }
53
+ /// Initialize coverage tracking for a subset of parameters.
54
+ ///
55
+ /// Only the parameters at the given indices are considered for tuple
56
+ /// generation. Test cases still use global parameter indices.
57
+ /// @param allParams All parameter definitions.
58
+ /// @param paramSubset Indices of parameters to cover (must be sorted).
59
+ /// @param strength The interaction strength (t).
60
+ /// @returns Object with engine and error. Check error.code before using engine.
61
+ static createFromSubset(allParams, paramSubset, strength) {
62
+ const engine = new CoverageEngine();
63
+ engine.params_ = allParams.slice();
64
+ engine.strength_ = strength;
65
+ engine.paramSubset_ = paramSubset.slice();
66
+ engine.initCombinationsFromSubset();
67
+ engine.totalTuples_ = engine.computeTotalTuples();
68
+ engine.buildLookupTables();
69
+ if (engine.totalTuples_ > CoverageEngine.MAX_TUPLES) {
70
+ return {
71
+ engine: new CoverageEngine(),
72
+ error: makeTupleExplosionError(engine.totalTuples_, CoverageEngine.MAX_TUPLES),
73
+ };
74
+ }
75
+ engine.covered_ = new DynamicBitset(engine.totalTuples_);
76
+ return { engine, error: okError() };
77
+ }
78
+ /// Mark all tuples covered by the given test case.
79
+ addTestCase(testCase) {
80
+ for (let ci = 0; ci < this.paramCombinations_.length; ++ci) {
81
+ const combo = this.paramCombinations_[ci];
82
+ const mults = this.comboMultipliers_[ci];
83
+ let localIndex = 0;
84
+ for (let j = 0; j < this.strength_; ++j) {
85
+ localIndex += testCase.values[combo[j]] * mults[j];
86
+ }
87
+ this.covered_.set(this.combinationOffsets_[ci] + localIndex);
88
+ }
89
+ }
90
+ /// Score a candidate value for a single parameter position.
91
+ ///
92
+ /// Used by constructive greedy: given a partial assignment, how many new
93
+ /// tuples would be covered by setting paramIndex to valueIndex?
94
+ scoreValue(partial, paramIndex, valueIndex) {
95
+ let score = 0;
96
+ const relevantCombos = this.paramToCombos_[paramIndex];
97
+ const positions = this.paramPositionInCombo_[paramIndex];
98
+ const numRelevant = relevantCombos.length;
99
+ for (let k = 0; k < numRelevant; ++k) {
100
+ const ci = relevantCombos[k];
101
+ const pos = positions[k];
102
+ const combo = this.paramCombinations_[ci];
103
+ const mults = this.comboMultipliers_[ci];
104
+ // Check all other params are assigned and compute mixed-radix index.
105
+ let allAssigned = true;
106
+ let localIndex = valueIndex * mults[pos];
107
+ for (let j = 0; j < this.strength_; ++j) {
108
+ if (j === pos) {
109
+ continue;
110
+ }
111
+ const v = partial.values[combo[j]];
112
+ if (v === UNASSIGNED) {
113
+ allAssigned = false;
114
+ break;
115
+ }
116
+ localIndex += v * mults[j];
117
+ }
118
+ if (!allAssigned) {
119
+ continue;
120
+ }
121
+ if (!this.covered_.test(this.combinationOffsets_[ci] + localIndex)) {
122
+ ++score;
123
+ }
124
+ }
125
+ return score;
126
+ }
127
+ /// Score a complete candidate test case.
128
+ scoreCandidate(candidate) {
129
+ let score = 0;
130
+ for (let ci = 0; ci < this.paramCombinations_.length; ++ci) {
131
+ const combo = this.paramCombinations_[ci];
132
+ const mults = this.comboMultipliers_[ci];
133
+ let localIndex = 0;
134
+ for (let j = 0; j < this.strength_; ++j) {
135
+ localIndex += candidate.values[combo[j]] * mults[j];
136
+ }
137
+ if (!this.covered_.test(this.combinationOffsets_[ci] + localIndex)) {
138
+ ++score;
139
+ }
140
+ }
141
+ return score;
142
+ }
143
+ /// Exclude tuples that are invalid due to constraints.
144
+ ///
145
+ /// For each t-tuple, builds a partial assignment and evaluates all
146
+ /// constraints. If any constraint returns False, the tuple is marked
147
+ /// as covered (excluded) and does not count toward coverage goals.
148
+ excludeInvalidTuples(constraints) {
149
+ if (constraints.length === 0) {
150
+ return;
151
+ }
152
+ const numParams = this.params_.length;
153
+ for (let ci = 0; ci < this.paramCombinations_.length; ++ci) {
154
+ const combo = this.paramCombinations_[ci];
155
+ // Compute product for this combination.
156
+ let product = 1;
157
+ for (const pi of combo) {
158
+ product *= this.params_[pi].size;
159
+ }
160
+ // Enumerate all value tuples.
161
+ for (let vi = 0; vi < product; ++vi) {
162
+ const globalIndex = this.combinationOffsets_[ci] + vi;
163
+ if (this.covered_.test(globalIndex)) {
164
+ continue; // Already marked.
165
+ }
166
+ // Decode mixed-radix index into value indices.
167
+ const radixes = new Array(combo.length);
168
+ for (let j = 0; j < combo.length; ++j) {
169
+ radixes[j] = this.params_[combo[j]].size;
170
+ }
171
+ const valueIndices = decodeMixedRadix(vi, radixes);
172
+ // Build partial assignment with only this tuple's parameters set.
173
+ const assignment = new Array(numParams);
174
+ for (let i = 0; i < numParams; i++) {
175
+ assignment[i] = UNASSIGNED;
176
+ }
177
+ for (let j = 0; j < combo.length; ++j) {
178
+ assignment[combo[j]] = valueIndices[j];
179
+ }
180
+ // Evaluate all constraints against this partial assignment.
181
+ let invalid = false;
182
+ for (const constraint of constraints) {
183
+ const result = constraint.evaluate(assignment);
184
+ if (result === ConstraintResult.False) {
185
+ invalid = true;
186
+ break;
187
+ }
188
+ }
189
+ if (invalid) {
190
+ this.covered_.set(globalIndex);
191
+ ++this.invalidTuples_;
192
+ }
193
+ }
194
+ }
195
+ }
196
+ /// Exclude tuples that contain values marked as invalid in parameters.
197
+ ///
198
+ /// Any tuple containing at least one value where Parameter.isInvalid()
199
+ /// returns true is marked as excluded. Used for positive-only generation.
200
+ excludeInvalidValues() {
201
+ if (!hasInvalidValues(this.params_)) {
202
+ return;
203
+ }
204
+ for (let ci = 0; ci < this.paramCombinations_.length; ++ci) {
205
+ const combo = this.paramCombinations_[ci];
206
+ // Compute product for this combination.
207
+ let product = 1;
208
+ for (const pi of combo) {
209
+ product *= this.params_[pi].size;
210
+ }
211
+ // Enumerate all value tuples.
212
+ for (let vi = 0; vi < product; ++vi) {
213
+ const globalIndex = this.combinationOffsets_[ci] + vi;
214
+ if (this.covered_.test(globalIndex)) {
215
+ continue;
216
+ }
217
+ // Decode mixed-radix index into value indices.
218
+ const radixes = new Array(combo.length);
219
+ for (let j = 0; j < combo.length; ++j) {
220
+ radixes[j] = this.params_[combo[j]].size;
221
+ }
222
+ const valueIndices = decodeMixedRadix(vi, radixes);
223
+ // Check if any decoded value is invalid.
224
+ let containsInvalid = false;
225
+ for (let j = 0; j < combo.length; ++j) {
226
+ if (this.params_[combo[j]].isInvalid(valueIndices[j])) {
227
+ containsInvalid = true;
228
+ break;
229
+ }
230
+ }
231
+ if (containsInvalid) {
232
+ this.covered_.set(globalIndex);
233
+ ++this.invalidTuples_;
234
+ }
235
+ }
236
+ }
237
+ }
238
+ /// Return the total number of valid t-wise tuples.
239
+ get totalTuples() {
240
+ return this.totalTuples_ - this.invalidTuples_;
241
+ }
242
+ /// Return the number of covered valid tuples.
243
+ get coveredCount() {
244
+ return this.covered_.count() - this.invalidTuples_;
245
+ }
246
+ /// Return coverage ratio [0.0, 1.0].
247
+ get coverageRatio() {
248
+ if (this.totalTuples === 0) {
249
+ return 1.0;
250
+ }
251
+ return this.coveredCount / this.totalTuples;
252
+ }
253
+ /// Check if all valid tuples are covered.
254
+ get isComplete() {
255
+ return this.coveredCount === this.totalTuples;
256
+ }
257
+ /// Collect all uncovered tuples as human-readable objects.
258
+ /// @param params Parameter definitions (for resolving names and values).
259
+ getUncoveredTuples(params) {
260
+ const result = [];
261
+ for (let ci = 0; ci < this.paramCombinations_.length; ++ci) {
262
+ const combo = this.paramCombinations_[ci];
263
+ // Compute the number of value tuples for this combination.
264
+ let product = 1;
265
+ for (const pi of combo) {
266
+ product *= params[pi].size;
267
+ }
268
+ // Enumerate all value tuples using mixed-radix decoding.
269
+ for (let vi = 0; vi < product; ++vi) {
270
+ const globalIndex = this.combinationOffsets_[ci] + vi;
271
+ if (this.covered_.test(globalIndex)) {
272
+ continue;
273
+ }
274
+ // Decode the mixed-radix index into value indices.
275
+ const radixes = new Array(combo.length);
276
+ for (let j = 0; j < combo.length; ++j) {
277
+ radixes[j] = params[combo[j]].size;
278
+ }
279
+ const valueIndices = decodeMixedRadix(vi, radixes);
280
+ const tuple = [];
281
+ const paramNames = [];
282
+ for (let j = 0; j < combo.length; ++j) {
283
+ const pi = combo[j];
284
+ paramNames.push(params[pi].name);
285
+ tuple.push(`${params[pi].name}=${params[pi].values[valueIndices[j]]}`);
286
+ }
287
+ result.push({ tuple, params: paramNames, reason: 'never covered' });
288
+ }
289
+ }
290
+ return result;
291
+ }
292
+ // --- Private methods ---
293
+ initCombinations() {
294
+ const n = this.params_.length;
295
+ this.paramCombinations_ = generateCombinations(n, this.strength_);
296
+ }
297
+ initCombinationsFromSubset() {
298
+ const n = this.paramSubset_.length;
299
+ const localCombos = generateCombinations(n, this.strength_);
300
+ // Map local indices to global param indices.
301
+ this.paramCombinations_ = [];
302
+ for (const local of localCombos) {
303
+ const globalCombo = new Array(this.strength_);
304
+ for (let i = 0; i < this.strength_; ++i) {
305
+ globalCombo[i] = this.paramSubset_[local[i]];
306
+ }
307
+ this.paramCombinations_.push(globalCombo);
308
+ }
309
+ }
310
+ buildLookupTables() {
311
+ const numParams = this.params_.length;
312
+ const numCombos = this.paramCombinations_.length;
313
+ // Build param-to-combinations index and position-in-combo lookup.
314
+ this.paramToCombos_ = new Array(numParams);
315
+ this.paramPositionInCombo_ = new Array(numParams);
316
+ for (let i = 0; i < numParams; i++) {
317
+ this.paramToCombos_[i] = [];
318
+ this.paramPositionInCombo_[i] = [];
319
+ }
320
+ for (let ci = 0; ci < numCombos; ++ci) {
321
+ const combo = this.paramCombinations_[ci];
322
+ for (let j = 0; j < this.strength_; ++j) {
323
+ const pi = combo[j];
324
+ this.paramToCombos_[pi].push(ci);
325
+ this.paramPositionInCombo_[pi].push(j);
326
+ }
327
+ }
328
+ // Build mixed-radix multipliers for each combination.
329
+ // comboMultipliers_[ci][j] = product of value counts for positions j+1..t-1.
330
+ this.comboMultipliers_ = new Array(numCombos);
331
+ for (let ci = 0; ci < numCombos; ++ci) {
332
+ const combo = this.paramCombinations_[ci];
333
+ const mults = new Array(this.strength_);
334
+ mults[this.strength_ - 1] = 1;
335
+ for (let j = this.strength_ - 2; j >= 0; --j) {
336
+ mults[j] = mults[j + 1] * this.params_[combo[j + 1]].size;
337
+ }
338
+ this.comboMultipliers_[ci] = mults;
339
+ }
340
+ }
341
+ computeTotalTuples() {
342
+ let total = 0;
343
+ this.combinationOffsets_ = [];
344
+ for (const combo of this.paramCombinations_) {
345
+ this.combinationOffsets_.push(total);
346
+ let product = 1;
347
+ for (const pi of combo) {
348
+ product *= this.params_[pi].size;
349
+ }
350
+ total += product;
351
+ }
352
+ return total;
353
+ }
354
+ }
355
+ /// Maximum number of tuples before refusing to proceed.
356
+ /// ~16M tuples. Beyond this, performance degrades.
357
+ CoverageEngine.MAX_TUPLES = 16000000;
358
+ /// Build an error for when tuple count exceeds the safety limit.
359
+ function makeTupleExplosionError(totalTuples, maxTuples) {
360
+ return {
361
+ code: ErrorCode.TupleExplosion,
362
+ message: 't-wise tuple count exceeds safety limit',
363
+ detail: `Total tuples: ${totalTuples}, limit: ${maxTuples}. Reduce strength or parameter count.`,
364
+ };
365
+ }
366
+ //# sourceMappingURL=coverage-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-engine.js","sourceRoot":"","sources":["../../../../src/ts/core/coverage-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ExtendMode, type GenerateOptions, type ModelStats } from '../model/generate-options.js';
2
+ import { type GenerateResult, type TestCase } from '../model/test-case.js';
3
+ export declare function generate(options: GenerateOptions): GenerateResult;
4
+ export declare function extend(existing: TestCase[], options: GenerateOptions, _mode?: ExtendMode): GenerateResult;
5
+ export declare function estimateModel(options: GenerateOptions): ModelStats;
6
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../src/ts/core/generator.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,UAAU,EACV,KAAK,eAAe,EAGpB,KAAK,UAAU,EAEhB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,QAAQ,EAEd,MAAM,uBAAuB,CAAC;AAkM/B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAuKjE;AAGD,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAAE,EACpB,OAAO,EAAE,eAAe,EACxB,KAAK,GAAE,UAA8B,GACpC,cAAc,CAMhB;AAKD,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CA4DlE"}