@quantumplayed/quantum-game-engine 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 (55) hide show
  1. package/README.md +314 -0
  2. package/dist/CircuitLog.d.ts +54 -0
  3. package/dist/CircuitLog.js +80 -0
  4. package/dist/CircuitLog.js.map +1 -0
  5. package/dist/Complex.d.ts +13 -0
  6. package/dist/Complex.js +49 -0
  7. package/dist/Complex.js.map +1 -0
  8. package/dist/EntanglementEngine.d.ts +48 -0
  9. package/dist/EntanglementEngine.js +456 -0
  10. package/dist/EntanglementEngine.js.map +1 -0
  11. package/dist/Operations.d.ts +18 -0
  12. package/dist/Operations.js +107 -0
  13. package/dist/Operations.js.map +1 -0
  14. package/dist/QuantumEntity.d.ts +26 -0
  15. package/dist/QuantumEntity.js +142 -0
  16. package/dist/QuantumEntity.js.map +1 -0
  17. package/dist/index.d.ts +5 -0
  18. package/dist/index.js +6 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/src/CircuitLog.d.ts +54 -0
  21. package/dist/src/CircuitLog.js +80 -0
  22. package/dist/src/CircuitLog.js.map +1 -0
  23. package/dist/src/Complex.d.ts +13 -0
  24. package/dist/src/Complex.d.ts.map +1 -0
  25. package/dist/src/Complex.js +49 -0
  26. package/dist/src/Complex.js.map +1 -0
  27. package/dist/src/EntanglementEngine.d.ts +48 -0
  28. package/dist/src/EntanglementEngine.d.ts.map +1 -0
  29. package/dist/src/EntanglementEngine.js +456 -0
  30. package/dist/src/EntanglementEngine.js.map +1 -0
  31. package/dist/src/Operations.d.ts +18 -0
  32. package/dist/src/Operations.d.ts.map +1 -0
  33. package/dist/src/Operations.js +107 -0
  34. package/dist/src/Operations.js.map +1 -0
  35. package/dist/src/QuantumEntity.d.ts +26 -0
  36. package/dist/src/QuantumEntity.d.ts.map +1 -0
  37. package/dist/src/QuantumEntity.js +142 -0
  38. package/dist/src/QuantumEntity.js.map +1 -0
  39. package/dist/src/index.d.ts +5 -0
  40. package/dist/src/index.d.ts.map +1 -0
  41. package/dist/src/index.js +6 -0
  42. package/dist/src/index.js.map +1 -0
  43. package/dist/tests/DensityMatrix.test.d.ts +1 -0
  44. package/dist/tests/DensityMatrix.test.d.ts.map +1 -0
  45. package/dist/tests/DensityMatrix.test.js +41 -0
  46. package/dist/tests/DensityMatrix.test.js.map +1 -0
  47. package/dist/tests/EntanglementEngine.test.d.ts +1 -0
  48. package/dist/tests/EntanglementEngine.test.d.ts.map +1 -0
  49. package/dist/tests/EntanglementEngine.test.js +72 -0
  50. package/dist/tests/EntanglementEngine.test.js.map +1 -0
  51. package/dist/tests/QuantumEntity.test.d.ts +1 -0
  52. package/dist/tests/QuantumEntity.test.d.ts.map +1 -0
  53. package/dist/tests/QuantumEntity.test.js +60 -0
  54. package/dist/tests/QuantumEntity.test.js.map +1 -0
  55. package/package.json +19 -0
@@ -0,0 +1,142 @@
1
+ import { ComplexMath } from './Complex';
2
+ import { EntanglementEngine } from './EntanglementEngine';
3
+ import { CircuitLogger } from './CircuitLog';
4
+ export class QuantumEntity {
5
+ static _nextId = 0;
6
+ id;
7
+ dimension;
8
+ amplitudes;
9
+ entangledSystem; // Will be typed properly, using any to avoid circular deps for now
10
+ constructor(options) {
11
+ this.id = QuantumEntity._nextId++;
12
+ this.dimension = options.dimension;
13
+ this.amplitudes = {};
14
+ this.amplitudes[options.initialState] = { re: 1.0, im: 0.0 };
15
+ }
16
+ /** Reset the auto-increment counter (useful in tests). */
17
+ static resetIdCounter() {
18
+ QuantumEntity._nextId = 0;
19
+ }
20
+ // Return a Predicate for conditional interactions
21
+ is(state) {
22
+ return { entity: this, state };
23
+ }
24
+ // Apply an operation directly to this entity, optionally conditionally
25
+ apply(operation, controls) {
26
+ if (controls && controls.length > 0) {
27
+ // conditionalInteract will handle its own logging
28
+ EntanglementEngine.conditionalInteract({
29
+ controls: controls,
30
+ targets: [{ entity: this, operation }]
31
+ });
32
+ return;
33
+ }
34
+ if (this.entangledSystem) {
35
+ const index = this.entangledSystem.entities.indexOf(this);
36
+ this.entangledSystem.applyLocal(index, operation);
37
+ }
38
+ else {
39
+ this.amplitudes = operation.apply(this.amplitudes, this.dimension);
40
+ }
41
+ // Log single-entity gate (non-conditional path)
42
+ if (CircuitLogger.isRecording()) {
43
+ CircuitLogger.addGate(operation.constructor?.name ?? 'UnknownOp', [this.id], [this.dimension]);
44
+ }
45
+ }
46
+ // Measure the entity, collapsing its state.
47
+ // If forcedOutcome is provided (0..dimension-1), collapse directly to that state.
48
+ measure(forcedOutcome) {
49
+ if (this.entangledSystem) {
50
+ // measureTarget handles its own logging
51
+ return this.entangledSystem.measureTarget(this, forcedOutcome);
52
+ }
53
+ // Forced outcome — collapse directly
54
+ if (forcedOutcome !== undefined) {
55
+ this.amplitudes = { [forcedOutcome]: { re: 1.0, im: 0.0 } };
56
+ if (CircuitLogger.isRecording()) {
57
+ CircuitLogger.addMeasurement(this.id, this.dimension, forcedOutcome);
58
+ }
59
+ return forcedOutcome;
60
+ }
61
+ const rand = Math.random();
62
+ let cumulativeProb = 0;
63
+ for (const key in this.amplitudes) {
64
+ const k = parseInt(key);
65
+ const amp = this.amplitudes[k];
66
+ const prob = amp.re * amp.re + amp.im * amp.im;
67
+ cumulativeProb += prob;
68
+ if (rand <= cumulativeProb) {
69
+ // Collapse!
70
+ this.amplitudes = { [k]: { re: 1.0, im: 0.0 } };
71
+ if (CircuitLogger.isRecording()) {
72
+ CircuitLogger.addMeasurement(this.id, this.dimension, k);
73
+ }
74
+ return k;
75
+ }
76
+ }
77
+ // Fallback for floating point error
78
+ const keys = Object.keys(this.amplitudes);
79
+ if (keys.length === 0) {
80
+ throw new Error("Cannot measure an entity with 0 probability mass (Decoherence error)");
81
+ }
82
+ const k = parseInt(keys[keys.length - 1]);
83
+ this.amplitudes = { [k]: { re: 1.0, im: 0.0 } };
84
+ if (CircuitLogger.isRecording()) {
85
+ CircuitLogger.addMeasurement(this.id, this.dimension, k);
86
+ }
87
+ return k;
88
+ }
89
+ // Extract the raw probability map for UIs
90
+ getProbabilities() {
91
+ if (this.entangledSystem) {
92
+ return this.entangledSystem.getTargetProbabilities(this);
93
+ }
94
+ const probs = {};
95
+ for (const key in this.amplitudes) {
96
+ const k = parseInt(key);
97
+ const amp = this.amplitudes[k];
98
+ probs[k] = amp.re * amp.re + amp.im * amp.im;
99
+ }
100
+ return probs;
101
+ }
102
+ // Extract raw complex amplitudes (Useful for phase interference logic in games)
103
+ getAmplitudes() {
104
+ if (this.entangledSystem) {
105
+ return this.entangledSystem.getTargetAmplitudes(this);
106
+ }
107
+ const amps = {};
108
+ for (const key in this.amplitudes) {
109
+ const k = parseInt(key);
110
+ amps[k] = { ...this.amplitudes[k] };
111
+ }
112
+ return amps;
113
+ }
114
+ // Get the One-Body Reduced Density Matrix
115
+ // Diagonal elements = classical probability. Off-diagonal elements = coherence.
116
+ getReducedDensityMatrix() {
117
+ if (this.entangledSystem) {
118
+ return this.entangledSystem.getReducedDensityMatrix(this);
119
+ }
120
+ // Pure state density matrix: rho_{j,k} = c_j * c_k^*
121
+ const rho = {};
122
+ for (const [jStr, ampJ] of Object.entries(this.amplitudes)) {
123
+ const j = parseInt(jStr);
124
+ if (!rho[j])
125
+ rho[j] = {};
126
+ for (const [kStr, ampK] of Object.entries(this.amplitudes)) {
127
+ const k = parseInt(kStr);
128
+ const ampKStar = ComplexMath.conjugate(ampK);
129
+ rho[j][k] = ComplexMath.multiply(ampJ, ampKStar);
130
+ }
131
+ }
132
+ return rho;
133
+ }
134
+ // Manually set the state (Use with caution, primarily for state restoration/cloning)
135
+ setState(amplitudes) {
136
+ if (this.entangledSystem) {
137
+ throw new Error("Cannot manually set state of an entangled entity. Set the state on the JointQuantumSystem instead.");
138
+ }
139
+ this.amplitudes = { ...amplitudes };
140
+ }
141
+ }
142
+ //# sourceMappingURL=QuantumEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuantumEntity.js","sourceRoot":"","sources":["../../src/QuantumEntity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { type Complex, ComplexMath } from './Complex';
2
+ export { QuantumEntity } from './QuantumEntity';
3
+ export { Operations, type QuantumOperation, type SparseAmplitudes, cleanAmplitudes } from './Operations';
4
+ export { EntanglementEngine, JointQuantumSystem } from './EntanglementEngine';
5
+ export { CircuitLogger, type CircuitEntry, type GateEntry, type MeasurementEntry } from './CircuitLog';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { ComplexMath } from './Complex';
2
+ export { QuantumEntity } from './QuantumEntity';
3
+ export { Operations, cleanAmplitudes } from './Operations';
4
+ export { EntanglementEngine, JointQuantumSystem } from './EntanglementEngine';
5
+ export { CircuitLogger } from './CircuitLog';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAgD,eAAe,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAA4D,MAAM,cAAc,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DensityMatrix.test.d.ts","sourceRoot":"","sources":["../../tests/DensityMatrix.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const QuantumEntity_1 = require("../src/QuantumEntity");
5
+ const Operations_1 = require("../src/Operations");
6
+ const EntanglementEngine_1 = require("../src/EntanglementEngine");
7
+ (0, vitest_1.describe)('Reduced Density Matrices', () => {
8
+ (0, vitest_1.it)('calculates proper RDM for pure state', () => {
9
+ const sq1 = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 0 });
10
+ sq1.apply(Operations_1.Operations.Hadamard());
11
+ // State is 1/sqrt(2) |0> + 1/sqrt(2) |1>
12
+ const rho = sq1.getReducedDensityMatrix();
13
+ // Diagonal
14
+ (0, vitest_1.expect)(rho[0][0].re).toBeCloseTo(0.5);
15
+ (0, vitest_1.expect)(rho[1][1].re).toBeCloseTo(0.5);
16
+ // Coherence (off-diagonal)
17
+ (0, vitest_1.expect)(rho[0][1].re).toBeCloseTo(0.5);
18
+ (0, vitest_1.expect)(rho[1][0].re).toBeCloseTo(0.5);
19
+ });
20
+ (0, vitest_1.it)('calculates proper RDM via partial trace for entangled Bell pair', () => {
21
+ const sq1 = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 0 });
22
+ const sq2 = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 0 });
23
+ sq1.apply(Operations_1.Operations.Hadamard());
24
+ // CNOT (conditional interact)
25
+ EntanglementEngine_1.EntanglementEngine.conditionalInteract({
26
+ controlEntities: [{ entity: sq1, state: 1 }],
27
+ targets: [{ entity: sq2, operation: Operations_1.Operations.Shift(1) }]
28
+ });
29
+ // System is 1/sqrt(2) (|00> + |11>)
30
+ // We trace out sq2.
31
+ // We expect a completely mixed state, no coherence.
32
+ const rho = sq1.getReducedDensityMatrix();
33
+ // Diagonal = 0.5
34
+ (0, vitest_1.expect)(rho[0][0].re).toBeCloseTo(0.5);
35
+ (0, vitest_1.expect)(rho[1][1].re).toBeCloseTo(0.5);
36
+ // Off-diagonal = 0 (Decohered from the perspective of sq1 alone)
37
+ (0, vitest_1.expect)(rho[0][1]?.re || 0).toBeCloseTo(0);
38
+ (0, vitest_1.expect)(rho[1][0]?.re || 0).toBeCloseTo(0);
39
+ });
40
+ });
41
+ //# sourceMappingURL=DensityMatrix.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DensityMatrix.test.js","sourceRoot":"","sources":["../../tests/DensityMatrix.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,wDAAqD;AACrD,kDAA+C;AAC/C,kEAA+D;AAE/D,IAAA,iBAAQ,EAAC,0BAA0B,EAAE,GAAG,EAAE;IACtC,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,IAAI,6BAAa,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,KAAK,CAAC,uBAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC,yCAAyC;QAEzC,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;QAC1C,WAAW;QACX,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEtC,2BAA2B;QAC3B,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,IAAI,6BAAa,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,6BAAa,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAEjE,GAAG,CAAC,KAAK,CAAC,uBAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEjC,8BAA8B;QAC9B,uCAAkB,CAAC,mBAAmB,CAAC;YACnC,eAAe,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,uBAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;QAEH,oCAAoC;QACpC,oBAAoB;QACpB,oDAAoD;QACpD,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC;QAE1C,iBAAiB;QACjB,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEtC,iEAAiE;QACjE,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntanglementEngine.test.d.ts","sourceRoot":"","sources":["../../tests/EntanglementEngine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const QuantumEntity_1 = require("../src/QuantumEntity");
5
+ const Operations_1 = require("../src/Operations");
6
+ const EntanglementEngine_1 = require("../src/EntanglementEngine");
7
+ (0, vitest_1.describe)('EntanglementEngine and JointQuantumSystem', () => {
8
+ (0, vitest_1.it)('interacts many standalone entities into a joint system', () => {
9
+ const sq1 = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 1 });
10
+ const sq2 = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 0 });
11
+ // sq1 is 1, sq2 is 0.
12
+ // We apply a completely empty operation just to force entanglement linking.
13
+ EntanglementEngine_1.EntanglementEngine.interactMany([sq1, sq2], Operations_1.Operations.Shift(0));
14
+ // They are dimension 2 x 2. So Joint k should be (1 * 2) + 0 = 2.
15
+ (0, vitest_1.expect)(sq1.entangledSystem).toBeDefined();
16
+ (0, vitest_1.expect)(sq2.entangledSystem).toBeDefined();
17
+ (0, vitest_1.expect)(sq1.entangledSystem.totalDimension).toBe(4);
18
+ (0, vitest_1.expect)(sq1.entangledSystem.jointAmplitudes[2].re).toBe(1.0);
19
+ });
20
+ (0, vitest_1.it)('handles conditional interaction correctly', () => {
21
+ // Player at pos 5
22
+ const p1 = new QuantumEntity_1.QuantumEntity({ dimension: 10, initialState: 5 });
23
+ // Door is closed (0)
24
+ const door = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 0 });
25
+ // Put player in superposition 5 and 6
26
+ p1.apply(Operations_1.Operations.SparseTransition([
27
+ { from: 5, to: 5, amplitude: { re: 0.7071, im: 0 } },
28
+ { from: 5, to: 6, amplitude: { re: 0.7071, im: 0 } }
29
+ ]));
30
+ // Conditionally open the door if player is at 6 (Shift door by +1)
31
+ EntanglementEngine_1.EntanglementEngine.conditionalInteract({
32
+ controlEntities: [{ entity: p1, state: 6 }],
33
+ targets: [{ entity: door, operation: Operations_1.Operations.Shift(1) }]
34
+ });
35
+ // The joint system should have two states:
36
+ // Branch 1: Player at 5, Door at 0 => joint config [5, 0] = (5*2)+0 = 10
37
+ // Branch 2: Player at 6, Door at 1 => joint config [6, 1] = (6*2)+1 = 13
38
+ const sys = p1.entangledSystem;
39
+ (0, vitest_1.expect)(sys).toBeDefined();
40
+ (0, vitest_1.expect)(sys.totalDimension).toBe(20);
41
+ (0, vitest_1.expect)(sys.jointAmplitudes[10].re).toBeCloseTo(0.7071);
42
+ (0, vitest_1.expect)(sys.jointAmplitudes[13].re).toBeCloseTo(0.7071);
43
+ // Check marginal probabilities directly
44
+ (0, vitest_1.expect)(p1.getProbabilities()[5]).toBeCloseTo(0.5);
45
+ (0, vitest_1.expect)(p1.getProbabilities()[6]).toBeCloseTo(0.5);
46
+ (0, vitest_1.expect)(door.getProbabilities()[0]).toBeCloseTo(0.5);
47
+ (0, vitest_1.expect)(door.getProbabilities()[1]).toBeCloseTo(0.5);
48
+ });
49
+ (0, vitest_1.it)('collapses entangled systems appropriately', () => {
50
+ const p1 = new QuantumEntity_1.QuantumEntity({ dimension: 10, initialState: 5 });
51
+ const door = new QuantumEntity_1.QuantumEntity({ dimension: 2, initialState: 0 });
52
+ p1.apply(Operations_1.Operations.SparseTransition([
53
+ { from: 5, to: 5, amplitude: { re: 0.7071, im: 0 } },
54
+ { from: 5, to: 6, amplitude: { re: 0.7071, im: 0 } }
55
+ ]));
56
+ EntanglementEngine_1.EntanglementEngine.conditionalInteract({
57
+ controlEntities: [{ entity: p1, state: 6 }],
58
+ targets: [{ entity: door, operation: Operations_1.Operations.Shift(1) }]
59
+ });
60
+ // Mock Math.random to always pick the > 0.5 branch
61
+ // In this case, say it picks the "6" branch.
62
+ const originalRandom = Math.random;
63
+ Math.random = () => 0.6; // Will pick the second outcome (prob 0.5)
64
+ const p1Measured = p1.measure();
65
+ (0, vitest_1.expect)(p1Measured).toBe(6);
66
+ // Because they're entangled, measuring p1 COLLAPSES the door too!
67
+ (0, vitest_1.expect)(door.getProbabilities()[1]).toBeCloseTo(1.0);
68
+ (0, vitest_1.expect)(door.getProbabilities()[0]).toBeUndefined();
69
+ Math.random = originalRandom;
70
+ });
71
+ });
72
+ //# sourceMappingURL=EntanglementEngine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntanglementEngine.test.js","sourceRoot":"","sources":["../../tests/EntanglementEngine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuantumEntity.test.d.ts","sourceRoot":"","sources":["../../tests/QuantumEntity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const QuantumEntity_1 = require("../src/QuantumEntity");
5
+ const Operations_1 = require("../src/Operations");
6
+ (0, vitest_1.describe)('QuantumEntity and Operations', () => {
7
+ (0, vitest_1.it)('initializes purely classically', () => {
8
+ const entity = new QuantumEntity_1.QuantumEntity({ dimension: 4, initialState: 2 });
9
+ (0, vitest_1.expect)(entity.amplitudes[2]).toBeDefined();
10
+ (0, vitest_1.expect)(entity.amplitudes[2].re).toBe(1.0);
11
+ (0, vitest_1.expect)(entity.amplitudes[2].im).toBe(0.0);
12
+ (0, vitest_1.expect)(entity.getProbabilities()[2]).toBe(1.0);
13
+ });
14
+ (0, vitest_1.it)('applies a Shift operation (Pauli X generalization)', () => {
15
+ const entity = new QuantumEntity_1.QuantumEntity({ dimension: 4, initialState: 2 });
16
+ entity.apply(Operations_1.Operations.Shift(1));
17
+ const probs = entity.getProbabilities();
18
+ (0, vitest_1.expect)(probs[3]).toBe(1.0);
19
+ (0, vitest_1.expect)(probs[2]).toBeUndefined();
20
+ });
21
+ (0, vitest_1.it)('wraps the Shift operation correctly', () => {
22
+ const entity = new QuantumEntity_1.QuantumEntity({ dimension: 4, initialState: 3 });
23
+ entity.apply(Operations_1.Operations.Shift(1));
24
+ const probs = entity.getProbabilities();
25
+ (0, vitest_1.expect)(probs[0]).toBe(1.0);
26
+ });
27
+ (0, vitest_1.it)('applies a Phase operation (Pauli Z generalization)', () => {
28
+ const entity = new QuantumEntity_1.QuantumEntity({ dimension: 4, initialState: 1 });
29
+ entity.apply(Operations_1.Operations.Phase(1)); // omega_4 = i, so phase for state 1 is i
30
+ (0, vitest_1.expect)(entity.amplitudes[1].re).toBeCloseTo(0.0);
31
+ (0, vitest_1.expect)(entity.amplitudes[1].im).toBeCloseTo(1.0);
32
+ // Probability should still be 1 (magnitude squared of i is 1)
33
+ (0, vitest_1.expect)(entity.getProbabilities()[1]).toBeCloseTo(1.0);
34
+ });
35
+ (0, vitest_1.it)('applies a SparseTransition (Custom Matrix)', () => {
36
+ const entity = new QuantumEntity_1.QuantumEntity({ dimension: 4, initialState: 1 });
37
+ // A custom split giving 50/50 probability to states 2 and 3
38
+ entity.apply(Operations_1.Operations.SparseTransition([
39
+ { from: 1, to: 2, amplitude: { re: 0.707106, im: 0 } },
40
+ { from: 1, to: 3, amplitude: { re: 0.707106, im: 0 } }
41
+ ]));
42
+ const probs = entity.getProbabilities();
43
+ (0, vitest_1.expect)(probs[2]).toBeCloseTo(0.5, 2);
44
+ (0, vitest_1.expect)(probs[3]).toBeCloseTo(0.5, 2);
45
+ (0, vitest_1.expect)(probs[1]).toBeUndefined();
46
+ });
47
+ (0, vitest_1.it)('collapses on measure', () => {
48
+ const entity = new QuantumEntity_1.QuantumEntity({ dimension: 4, initialState: 1 });
49
+ entity.apply(Operations_1.Operations.SparseTransition([
50
+ { from: 1, to: 2, amplitude: { re: 0.707106, im: 0 } },
51
+ { from: 1, to: 3, amplitude: { re: 0.707106, im: 0 } }
52
+ ]));
53
+ const measurement = entity.measure(); // Forces collapse
54
+ (0, vitest_1.expect)(measurement === 2 || measurement === 3).toBe(true);
55
+ const currentProbs = entity.getProbabilities();
56
+ (0, vitest_1.expect)(currentProbs[measurement]).toBe(1.0);
57
+ (0, vitest_1.expect)(Object.keys(currentProbs).length).toBe(1);
58
+ });
59
+ });
60
+ //# sourceMappingURL=QuantumEntity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuantumEntity.test.js","sourceRoot":"","sources":["../../tests/QuantumEntity.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@quantumplayed/quantum-game-engine",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc"
15
+ },
16
+ "dependencies": {
17
+ "typescript": "^6.0.3"
18
+ }
19
+ }