@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';
package/dist/index.js ADDED
@@ -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,54 @@
1
+ /**
2
+ * CircuitLog — toggleable, append-only log of quantum operations.
3
+ *
4
+ * When recording is active, every state-mutating call (gate or measurement)
5
+ * appends an entry. The log is designed for future incremental OpenQASM export:
6
+ * each new entry maps to one circuit instruction, so the export never rebuilds.
7
+ */
8
+ export interface GateEntry {
9
+ type: 'gate';
10
+ name: string;
11
+ entityIds: number[];
12
+ dimensions: number[];
13
+ controls?: {
14
+ entityId: number;
15
+ state: number;
16
+ }[];
17
+ params?: Record<string, any>;
18
+ timestamp: number;
19
+ }
20
+ export interface MeasurementEntry {
21
+ type: 'measurement';
22
+ entityId: number;
23
+ dimension: number;
24
+ outcome: number;
25
+ timestamp: number;
26
+ }
27
+ export type CircuitEntry = GateEntry | MeasurementEntry;
28
+ declare class CircuitLoggerImpl {
29
+ private _recording;
30
+ private _log;
31
+ private _counter;
32
+ /** Begin recording. Resets the existing log. */
33
+ startRecording(): void;
34
+ /** Stop recording and return the captured log. */
35
+ stopRecording(): CircuitEntry[];
36
+ /** Fast guard — check before constructing entry objects on the hot path. */
37
+ isRecording(): boolean;
38
+ /** Append an entry (auto-assigns timestamp). */
39
+ addGate(name: string, entityIds: number[], dimensions: number[], params?: Record<string, any>, controls?: {
40
+ entityId: number;
41
+ state: number;
42
+ }[]): void;
43
+ /** Append a measurement entry. */
44
+ addMeasurement(entityId: number, dimension: number, outcome: number): void;
45
+ /** Get a copy of the current log. */
46
+ getLog(): CircuitEntry[];
47
+ /** Filter log to entries involving any of the given entity IDs. */
48
+ getLogForEntities(entityIds: number[]): CircuitEntry[];
49
+ /** Clear the log and reset the counter. */
50
+ reset(): void;
51
+ }
52
+ /** Global singleton circuit logger. */
53
+ export declare const CircuitLogger: CircuitLoggerImpl;
54
+ export {};
@@ -0,0 +1,80 @@
1
+ /**
2
+ * CircuitLog — toggleable, append-only log of quantum operations.
3
+ *
4
+ * When recording is active, every state-mutating call (gate or measurement)
5
+ * appends an entry. The log is designed for future incremental OpenQASM export:
6
+ * each new entry maps to one circuit instruction, so the export never rebuilds.
7
+ */
8
+ // ── Logger ───────────────────────────────────────────────────────────
9
+ class CircuitLoggerImpl {
10
+ _recording = false;
11
+ _log = [];
12
+ _counter = 0;
13
+ /** Begin recording. Resets the existing log. */
14
+ startRecording() {
15
+ this._recording = true;
16
+ this._log = [];
17
+ this._counter = 0;
18
+ }
19
+ /** Stop recording and return the captured log. */
20
+ stopRecording() {
21
+ this._recording = false;
22
+ return [...this._log];
23
+ }
24
+ /** Fast guard — check before constructing entry objects on the hot path. */
25
+ isRecording() {
26
+ return this._recording;
27
+ }
28
+ /** Append an entry (auto-assigns timestamp). */
29
+ addGate(name, entityIds, dimensions, params, controls) {
30
+ const entry = {
31
+ type: 'gate',
32
+ name,
33
+ entityIds,
34
+ dimensions,
35
+ timestamp: this._counter++,
36
+ };
37
+ if (params)
38
+ entry.params = params;
39
+ if (controls)
40
+ entry.controls = controls;
41
+ this._log.push(entry);
42
+ }
43
+ /** Append a measurement entry. */
44
+ addMeasurement(entityId, dimension, outcome) {
45
+ this._log.push({
46
+ type: 'measurement',
47
+ entityId,
48
+ dimension,
49
+ outcome,
50
+ timestamp: this._counter++,
51
+ });
52
+ }
53
+ /** Get a copy of the current log. */
54
+ getLog() {
55
+ return [...this._log];
56
+ }
57
+ /** Filter log to entries involving any of the given entity IDs. */
58
+ getLogForEntities(entityIds) {
59
+ const idSet = new Set(entityIds);
60
+ return this._log.filter(entry => {
61
+ if (entry.type === 'measurement') {
62
+ return idSet.has(entry.entityId);
63
+ }
64
+ // Gate — check targets and controls
65
+ if (entry.entityIds.some(id => idSet.has(id)))
66
+ return true;
67
+ if (entry.controls?.some(c => idSet.has(c.entityId)))
68
+ return true;
69
+ return false;
70
+ });
71
+ }
72
+ /** Clear the log and reset the counter. */
73
+ reset() {
74
+ this._log = [];
75
+ this._counter = 0;
76
+ }
77
+ }
78
+ /** Global singleton circuit logger. */
79
+ export const CircuitLogger = new CircuitLoggerImpl();
80
+ //# sourceMappingURL=CircuitLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitLog.js","sourceRoot":"","sources":["../../src/CircuitLog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,wEAAwE;AAExE,MAAM,iBAAiB;IACX,UAAU,GAAG,KAAK,CAAC;IACnB,IAAI,GAAmB,EAAE,CAAC;IAC1B,QAAQ,GAAG,CAAC,CAAC;IAErB,gDAAgD;IAChD,cAAc;QACV,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,kDAAkD;IAClD,aAAa;QACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,4EAA4E;IAC5E,WAAW;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,gDAAgD;IAChD,OAAO,CACH,IAAY,EACZ,SAAmB,EACnB,UAAoB,EACpB,MAA4B,EAC5B,QAAgD;QAEhD,MAAM,KAAK,GAAc;YACrB,IAAI,EAAE,MAAM;YACZ,IAAI;YACJ,SAAS;YACT,UAAU;YACV,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC7B,CAAC;QACF,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,kCAAkC;IAClC,cAAc,CAAC,QAAgB,EAAE,SAAiB,EAAE,OAAe;QAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,aAAa;YACnB,QAAQ;YACR,SAAS;YACT,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC7B,CAAC,CAAC;IACP,CAAC;IAED,qCAAqC;IACrC,MAAM;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,mEAAmE;IACnE,iBAAiB,CAAC,SAAmB;QACjC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YACD,oCAAoC;YACpC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3D,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClE,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACD,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;CACJ;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface Complex {
2
+ re: number;
3
+ im: number;
4
+ }
5
+ export declare const ComplexMath: {
6
+ add(a: Complex, b: Complex): Complex;
7
+ subtract(a: Complex, b: Complex): Complex;
8
+ multiply(a: Complex, b: Complex): Complex;
9
+ conjugate(a: Complex): Complex;
10
+ scale(a: Complex, scalar: number): Complex;
11
+ magnitudeSquared(a: Complex): number;
12
+ phase(angle: number): Complex;
13
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Complex.d.ts","sourceRoot":"","sources":["../../src/Complex.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,WAAW;WAEb,OAAO,KAAK,OAAO,GAAG,OAAO;gBAQxB,OAAO,KAAK,OAAO,GAAG,OAAO;gBAQ7B,OAAO,KAAK,OAAO,GAAG,OAAO;iBAQ5B,OAAO,GAAG,OAAO;aAQrB,OAAO,UAAU,MAAM,GAAG,OAAO;wBAQtB,OAAO,GAAG,MAAM;iBAKvB,MAAM,GAAG,OAAO;CAMhC,CAAC"}
@@ -0,0 +1,49 @@
1
+ export const ComplexMath = {
2
+ // Add two complex numbers
3
+ add(a, b) {
4
+ return {
5
+ re: a.re + b.re,
6
+ im: a.im + b.im
7
+ };
8
+ },
9
+ // Subtract b from a
10
+ subtract(a, b) {
11
+ return {
12
+ re: a.re - b.re,
13
+ im: a.im - b.im
14
+ };
15
+ },
16
+ // Multiply two complex numbers
17
+ multiply(a, b) {
18
+ return {
19
+ re: a.re * b.re - a.im * b.im,
20
+ im: a.im * b.re + a.re * b.im
21
+ };
22
+ },
23
+ // Complex conjugate
24
+ conjugate(a) {
25
+ return {
26
+ re: a.re,
27
+ im: -a.im
28
+ };
29
+ },
30
+ // Multiply a complex number by a scalar
31
+ scale(a, scalar) {
32
+ return {
33
+ re: a.re * scalar,
34
+ im: a.im * scalar
35
+ };
36
+ },
37
+ // Calculate magnitude squared (probability)
38
+ magnitudeSquared(a) {
39
+ return a.re * a.re + a.im * a.im;
40
+ },
41
+ // Calculate the complex phase e^(i * angle)
42
+ phase(angle) {
43
+ return {
44
+ re: Math.cos(angle),
45
+ im: Math.sin(angle)
46
+ };
47
+ }
48
+ };
49
+ //# sourceMappingURL=Complex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Complex.js","sourceRoot":"","sources":["../../src/Complex.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,0BAA0B;IAC1B,GAAG,CAAC,CAAU,EAAE,CAAU;QACtB,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YACf,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;SAClB,CAAC;IACN,CAAC;IAED,oBAAoB;IACpB,QAAQ,CAAC,CAAU,EAAE,CAAU;QAC3B,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YACf,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;SAClB,CAAC;IACN,CAAC;IAED,+BAA+B;IAC/B,QAAQ,CAAC,CAAU,EAAE,CAAU;QAC3B,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YAC7B,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;SAChC,CAAC;IACN,CAAC;IAED,oBAAoB;IACpB,SAAS,CAAC,CAAU;QAChB,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;SACZ,CAAC;IACN,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,CAAU,EAAE,MAAc;QAC5B,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM;YACjB,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM;SACpB,CAAC;IACN,CAAC;IAED,4CAA4C;IAC5C,gBAAgB,CAAC,CAAU;QACvB,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,KAAa;QACf,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACnB,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;SACtB,CAAC;IACN,CAAC;CACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { QuantumEntity, type Predicate } from './QuantumEntity';
2
+ import { type QuantumOperation, type SparseAmplitudes } from './Operations';
3
+ import { type Complex } from './Complex';
4
+ export declare class JointQuantumSystem {
5
+ entities: QuantumEntity[];
6
+ dimensions: number[];
7
+ totalDimension: number;
8
+ jointAmplitudes: SparseAmplitudes;
9
+ private constructor();
10
+ static create(entities: QuantumEntity[]): JointQuantumSystem;
11
+ static merge(involvedEntities: QuantumEntity[]): JointQuantumSystem;
12
+ private _calculateTensorProduct;
13
+ decomposeState(jointState: number): number[];
14
+ composeState(states: number[]): number;
15
+ applyLocal(entityIndex: number, operation: QuantumOperation): void;
16
+ applyToSubspace(targetEntities: QuantumEntity[], operation: QuantumOperation): void;
17
+ getTargetProbabilities(targetEntity: QuantumEntity): Record<number, number>;
18
+ getTargetAmplitudes(targetEntity: QuantumEntity): Record<number, Complex>;
19
+ measureTarget(targetEntity: QuantumEntity, forcedOutcome?: number): number;
20
+ getProjectedAmplitudes(conditions: {
21
+ entity: QuantumEntity;
22
+ state: number;
23
+ }[]): SparseAmplitudes;
24
+ getJointProbability(conditions: {
25
+ entity: QuantumEntity;
26
+ state: number;
27
+ }[]): number;
28
+ areMutuallyExclusive(conditions: {
29
+ entity: QuantumEntity;
30
+ state: number;
31
+ }[]): boolean;
32
+ getReducedDensityMatrix(targetEntity: QuantumEntity): Record<number, Record<number, Complex>>;
33
+ /**
34
+ * Create a joint system from existing amplitudes and entities (Bit-Perfect Restoration/Cloning).
35
+ */
36
+ static inject(entities: QuantumEntity[], jointAmplitudes: SparseAmplitudes): JointQuantumSystem;
37
+ }
38
+ export interface TargetOperation {
39
+ entity: QuantumEntity;
40
+ operation: QuantumOperation;
41
+ }
42
+ export declare const EntanglementEngine: {
43
+ interactMany(entities: QuantumEntity[], operation: QuantumOperation): void;
44
+ conditionalInteract(args: {
45
+ controls: Predicate[];
46
+ targets: TargetOperation[];
47
+ }): void;
48
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntanglementEngine.d.ts","sourceRoot":"","sources":["../../src/EntanglementEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAmB,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,KAAK,OAAO,EAAe,MAAM,WAAW,CAAC;AAEtD,qBAAa,kBAAkB;IACpB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,gBAAgB,CAAC;gBAE7B,QAAQ,EAAE,aAAa,EAAE;IAoBrC,OAAO,CAAC,uBAAuB;IA8BxB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAa5C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAStC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB;IAqC3D,sBAAsB,CAAC,YAAY,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAgB3E,aAAa,CAAC,YAAY,EAAE,aAAa,GAAG,MAAM;IA6ClD,uBAAuB,CAAC,YAAY,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAqDvG;AAED,eAAO,MAAM,kBAAkB;iCAGE,aAAa,EAAE,GAAG,kBAAkB;2BAgD1C,aAAa,EAAE,aAAa,gBAAgB;8BAUzC;QACtB,eAAe,EAAE;YAAE,MAAM,EAAE,aAAa,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC5D,OAAO,EAAE;YAAE,MAAM,EAAE,aAAa,CAAC;YAAC,SAAS,EAAE,gBAAgB,CAAA;SAAE,EAAE,CAAA;KACpE;CA+EJ,CAAC"}