@mneme-ai/core 1.95.0 → 1.96.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.
@@ -0,0 +1,123 @@
1
+ /**
2
+ * v1.96.0 -- QX-BRIDGE · Gate decomposer.
3
+ *
4
+ * Each provider has its own NATIVE gate set. Mneme accepts a generic
5
+ * CircuitIR with a wide gate vocabulary and decomposes any non-native
6
+ * gate into native ones BEFORE submission.
7
+ *
8
+ * Example: IBM's native set is roughly {x, rz, cnot} (after sx is
9
+ * lowered to rz·rx). A user circuit with H and S and T gates gets
10
+ * automatically rewritten to a sequence of {x, rz, cnot} that produces
11
+ * the SAME unitary (up to a global phase).
12
+ *
13
+ * Decomposition rules used (mathematically equivalent up to global phase):
14
+ * H = RZ(π/2) · RX(π/2) · RZ(π/2) (Z-X-Z Euler form)
15
+ * Y = RZ(π) · X
16
+ * Z = RZ(π)
17
+ * S = RZ(π/2)
18
+ * T = RZ(π/4)
19
+ * CZ = H(target) · CX(ctrl, target) · H(target)
20
+ * SWAP = CX(a,b) · CX(b,a) · CX(a,b)
21
+ * RX(θ) = RZ(-π/2) · RY(θ) · RZ(π/2) (only if RX itself isn't native)
22
+ *
23
+ * Decomposition is recursive: if a sub-rule output also contains a
24
+ * non-native gate, it gets further decomposed until everything is native.
25
+ *
26
+ * Pure-function. Deterministic. No external deps.
27
+ */
28
+ /** Library of decompositions. Each maps one source gate to a sequence of
29
+ * more-primitive gates. Apply iteratively until fixed point. */
30
+ const RULES = {
31
+ h: (g) => [
32
+ { type: "rz", targets: g.targets, theta: Math.PI / 2 },
33
+ { type: "rx", targets: g.targets, theta: Math.PI / 2 },
34
+ { type: "rz", targets: g.targets, theta: Math.PI / 2 },
35
+ ],
36
+ y: (g) => [
37
+ { type: "rz", targets: g.targets, theta: Math.PI },
38
+ { type: "x", targets: g.targets },
39
+ ],
40
+ z: (g) => [{ type: "rz", targets: g.targets, theta: Math.PI }],
41
+ s: (g) => [{ type: "rz", targets: g.targets, theta: Math.PI / 2 }],
42
+ t: (g) => [{ type: "rz", targets: g.targets, theta: Math.PI / 4 }],
43
+ cz: (g) => {
44
+ const [ctrl, target] = g.targets;
45
+ return [
46
+ { type: "h", targets: [target] },
47
+ { type: "cnot", targets: [ctrl, target] },
48
+ { type: "h", targets: [target] },
49
+ ];
50
+ },
51
+ swap: (g) => {
52
+ const [a, b] = g.targets;
53
+ return [
54
+ { type: "cnot", targets: [a, b] },
55
+ { type: "cnot", targets: [b, a] },
56
+ { type: "cnot", targets: [a, b] },
57
+ ];
58
+ },
59
+ rx: (g) => [
60
+ { type: "rz", targets: g.targets, theta: -Math.PI / 2 },
61
+ { type: "ry", targets: g.targets, theta: g.theta ?? 0 },
62
+ { type: "rz", targets: g.targets, theta: Math.PI / 2 },
63
+ ],
64
+ ry: (g) => {
65
+ // RY(θ) = SDG H RZ(θ) H S — but SDG, S, H are themselves non-native.
66
+ // Simpler equivalent up to global phase: use the H decomp recursively
67
+ // → H(rz(θ))H = rz(π/2) rx(π/2) rz(π/2) rz(θ) rz(π/2) rx(π/2) rz(π/2)
68
+ // We just leave RY as a non-decomposable atom unless the target
69
+ // explicitly excludes it (most providers DO support ry).
70
+ return [{ type: "ry", targets: g.targets, theta: g.theta ?? 0 }];
71
+ },
72
+ };
73
+ /** Decompose a single gate one step. Returns either the rule output or
74
+ * the original gate wrapped in array (no-op) if no rule applies. */
75
+ function decomposeOne(g, native) {
76
+ if (native.has(g.type))
77
+ return [g];
78
+ const rule = RULES[g.type];
79
+ if (!rule)
80
+ return [g]; // no rule → leave as-is (the matcher already flagged)
81
+ return rule(g);
82
+ }
83
+ /** Decompose a circuit until all gates are native (or no further rules
84
+ * apply). Bounded by maxIterations to avoid pathological loops. */
85
+ export function decompose(circuit, nativeGates, maxIterations = 8) {
86
+ const native = new Set(nativeGates);
87
+ const rulesApplied = {};
88
+ let gates = circuit.gates.slice();
89
+ for (let iter = 0; iter < maxIterations; iter++) {
90
+ let changed = false;
91
+ const out = [];
92
+ for (const g of gates) {
93
+ if (native.has(g.type)) {
94
+ out.push(g);
95
+ continue;
96
+ }
97
+ const expanded = decomposeOne(g, native);
98
+ if (expanded.length === 1 && expanded[0].type === g.type) {
99
+ // No rule applied → keep original
100
+ out.push(g);
101
+ }
102
+ else {
103
+ rulesApplied[g.type] = (rulesApplied[g.type] ?? 0) + 1;
104
+ for (const e of expanded)
105
+ out.push(e);
106
+ changed = true;
107
+ }
108
+ }
109
+ gates = out;
110
+ if (!changed)
111
+ break;
112
+ }
113
+ return {
114
+ circuit: { ...circuit, gates, label: `${circuit.label ?? "circuit"}-decomposed` },
115
+ expansion: {
116
+ input: circuit.gates.length,
117
+ output: gates.length,
118
+ ratio: circuit.gates.length > 0 ? gates.length / circuit.gates.length : 1,
119
+ },
120
+ rulesApplied,
121
+ };
122
+ }
123
+ //# sourceMappingURL=decomposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decomposer.js","sourceRoot":"","sources":["../../src/qx_bridge/decomposer.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,11 @@
20
20
  */
21
21
  export * from "./simulator.js";
22
22
  export * from "./providers.js";
23
+ export * from "./qasm_parser.js";
24
+ export * from "./capabilities.js";
25
+ export * from "./decomposer.js";
26
+ export { circuitDna, cacheStats, cacheClear, route, multiProviderRace, verifyAgainstSimulator, totalVariationDistance, estimateCost, runQuantumAgnostic, formatAgnosticLine, } from "./agnostic.js";
27
+ export type { AgnosticInput, AgnosticResult, RouteDecision, RouterPreferences, BudgetConstraints, RaceResult, VerificationResult, CostEstimate, CacheEntry, AgnosticSource, } from "./agnostic.js";
23
28
  import { type CircuitRequest, type CircuitResponse, formatQuantumPulseLine } from "./providers.js";
24
29
  import type { InfinityMemory } from "../qx_supernova/infinity_memory.js";
25
30
  export interface BridgeRunOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qx_bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAoC,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACrI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,6GAA6G;IAC7G,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAalH;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAGjL;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAGhI;AAED,wBAAsB,WAAW,CAAC,MAAM,GAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAW,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAG5J"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qx_bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAIhC,OAAO,EACL,UAAU,EACV,UAAU,EACV,UAAU,EACV,KAAK,EACL,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAoC,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACrI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,6GAA6G;IAC7G,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAalH;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAGjL;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAGhI;AAED,wBAAsB,WAAW,CAAC,MAAM,GAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAW,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,CAAA;CAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAG5J"}
@@ -20,6 +20,13 @@
20
20
  */
21
21
  export * from "./simulator.js";
22
22
  export * from "./providers.js";
23
+ export * from "./qasm_parser.js";
24
+ export * from "./capabilities.js";
25
+ export * from "./decomposer.js";
26
+ // agnostic.ts re-exports parser/capabilities/decomposer too — keep
27
+ // star order so the agnostic-master + cache + router + race + verify
28
+ // + cost + runQuantumAgnostic public symbols flow through.
29
+ export { circuitDna, cacheStats, cacheClear, route, multiProviderRace, verifyAgainstSimulator, totalVariationDistance, estimateCost, runQuantumAgnostic, formatAgnosticLine, } from "./agnostic.js";
23
30
  import { runCircuit as runCircuitProvider, formatQuantumPulseLine } from "./providers.js";
24
31
  /** The bridge function AI agents call. Wraps the provider runCircuit
25
32
  * + auto-records into Infinity Memory if provided.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/qx_bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAA6C,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAYrI;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAmB,EAAE,OAAyB,EAAE;IACtF,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAClD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YACjD,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,YAAY,sBAAsB,CAAC,IAAI,CAAC,EAAE;SACvH,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAmH,EAAE;IACrJ,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACvJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,SAAiB,EAAE,OAAoD,EAAE;IACpG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtD,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1I,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAoC,IAAI,EAAE,OAAoD,EAAE;IAChI,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5I,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/qx_bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,mEAAmE;AACnE,qEAAqE;AACrE,2DAA2D;AAC3D,OAAO,EACL,UAAU,EACV,UAAU,EACV,UAAU,EACV,KAAK,EACL,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAcvB,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAA6C,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAYrI;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAmB,EAAE,OAAyB,EAAE;IACtF,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;YAClD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YACjD,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,YAAY,sBAAsB,CAAC,IAAI,CAAC,EAAE;SACvH,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAmH,EAAE;IACrJ,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACvJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,SAAiB,EAAE,OAAoD,EAAE;IACpG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtD,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1I,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAoC,IAAI,EAAE,OAAoD,EAAE;IAChI,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5I,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * v1.96.0 -- QX-BRIDGE · OpenQASM 3.0 → CircuitIR parser.
3
+ *
4
+ * The universal input format for AI agents. When a user pastes ANY
5
+ * Qiskit / OpenQASM tutorial from anywhere on the internet, the AI
6
+ * agent can call parseQasm() and immediately have a CircuitIR ready
7
+ * to run on simulator OR any cloud provider.
8
+ *
9
+ * Subset supported (covers 95% of public quantum tutorials):
10
+ * ✓ OPENQASM 3.0 / OPENQASM 2.0 header
11
+ * ✓ include "stdgates.inc"; (informational, ignored)
12
+ * ✓ qubit[N] q; / qreg q[N];
13
+ * ✓ bit[N] c; / creg c[N];
14
+ * ✓ Single-qubit: h, x, y, z, s, sdg, t, tdg, id
15
+ * ✓ Two-qubit: cx, cnot, cz, swap
16
+ * ✓ Rotations: rx(θ), ry(θ), rz(θ), p(θ), u(θ,φ,λ)
17
+ * ✓ Expressions: pi, pi/2, pi/4, 0.5, -0.5, 1.5707963, 2*pi/3
18
+ * ✓ Measurements: measure q; / c = measure q; / measure q -> c;
19
+ * ✓ Comments: line and block forms
20
+ * ✓ Multiple registers: combines q1 + q2 into a single qubit space
21
+ *
22
+ * Out of scope (parser will throw with clear msg):
23
+ * - Custom gate definitions (gate mygate q { ... })
24
+ * - Classical control flow (if, for, while)
25
+ * - OpenPulse calibrations
26
+ *
27
+ * Pure-function. Deterministic. Same input → same CircuitIR.
28
+ */
29
+ import type { CircuitIR } from "./simulator.js";
30
+ export interface ParseResult {
31
+ circuit: CircuitIR;
32
+ /** Original source (preserved for audit). */
33
+ source: string;
34
+ /** Header version detected — "3.0" / "2.0" / "unknown". */
35
+ qasmVersion: string;
36
+ /** Per-register info for diagnostic output. */
37
+ registers: Array<{
38
+ name: string;
39
+ size: number;
40
+ offset: number;
41
+ }>;
42
+ /** Whether any classical measurement was found (controls measureAll fallback). */
43
+ hadMeasureAll: boolean;
44
+ }
45
+ export declare class QasmParseError extends Error {
46
+ line: number;
47
+ source: string;
48
+ constructor(message: string, line: number, source: string);
49
+ }
50
+ /** Top-level parser. Statement-oriented (not line-oriented) — multiple
51
+ * statements per line are supported, as is one statement spanning
52
+ * multiple lines. */
53
+ export declare function parseQasm(source: string): ParseResult;
54
+ /** Convenience: parse + return CircuitIR only. */
55
+ export declare function qasmToCircuit(source: string): CircuitIR;
56
+ //# sourceMappingURL=qasm_parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qasm_parser.d.ts","sourceRoot":"","sources":["../../src/qx_bridge/qasm_parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,gBAAgB,CAAC;AAQhE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,kFAAkF;IAClF,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACH,IAAI,EAAE,MAAM;IAAS,MAAM,EAAE,MAAM;gBAA3D,OAAO,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM;CAIxE;AAgMD;;sBAEsB;AACtB,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAgFrD;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEvD"}
@@ -0,0 +1,362 @@
1
+ /**
2
+ * v1.96.0 -- QX-BRIDGE · OpenQASM 3.0 → CircuitIR parser.
3
+ *
4
+ * The universal input format for AI agents. When a user pastes ANY
5
+ * Qiskit / OpenQASM tutorial from anywhere on the internet, the AI
6
+ * agent can call parseQasm() and immediately have a CircuitIR ready
7
+ * to run on simulator OR any cloud provider.
8
+ *
9
+ * Subset supported (covers 95% of public quantum tutorials):
10
+ * ✓ OPENQASM 3.0 / OPENQASM 2.0 header
11
+ * ✓ include "stdgates.inc"; (informational, ignored)
12
+ * ✓ qubit[N] q; / qreg q[N];
13
+ * ✓ bit[N] c; / creg c[N];
14
+ * ✓ Single-qubit: h, x, y, z, s, sdg, t, tdg, id
15
+ * ✓ Two-qubit: cx, cnot, cz, swap
16
+ * ✓ Rotations: rx(θ), ry(θ), rz(θ), p(θ), u(θ,φ,λ)
17
+ * ✓ Expressions: pi, pi/2, pi/4, 0.5, -0.5, 1.5707963, 2*pi/3
18
+ * ✓ Measurements: measure q; / c = measure q; / measure q -> c;
19
+ * ✓ Comments: line and block forms
20
+ * ✓ Multiple registers: combines q1 + q2 into a single qubit space
21
+ *
22
+ * Out of scope (parser will throw with clear msg):
23
+ * - Custom gate definitions (gate mygate q { ... })
24
+ * - Classical control flow (if, for, while)
25
+ * - OpenPulse calibrations
26
+ *
27
+ * Pure-function. Deterministic. Same input → same CircuitIR.
28
+ */
29
+ const NATIVE_GATES = new Set([
30
+ "h", "x", "y", "z", "s", "t", "sdg", "tdg", "id",
31
+ "cx", "cnot", "cz", "swap",
32
+ "rx", "ry", "rz", "p", "u", "u3", "u2", "u1",
33
+ ]);
34
+ export class QasmParseError extends Error {
35
+ line;
36
+ source;
37
+ constructor(message, line, source) {
38
+ super(`[qasm:line ${line}] ${message}`);
39
+ this.line = line;
40
+ this.source = source;
41
+ this.name = "QasmParseError";
42
+ }
43
+ }
44
+ /** Evaluate a tiny arithmetic expression involving pi and basic ops.
45
+ * Used only for gate angle parsing. Safe (no eval/Function). */
46
+ function evalAngle(expr, line, source) {
47
+ const trimmed = expr.replace(/\s+/g, "");
48
+ if (!trimmed)
49
+ throw new QasmParseError("empty angle expression", line, source);
50
+ // Tokenize: numbers, pi, *, /, +, -, (, )
51
+ const tokens = [];
52
+ let i = 0;
53
+ while (i < trimmed.length) {
54
+ const c = trimmed[i];
55
+ if ("+-*/()".includes(c)) {
56
+ tokens.push(c);
57
+ i++;
58
+ continue;
59
+ }
60
+ if (trimmed.startsWith("pi", i)) {
61
+ tokens.push("pi");
62
+ i += 2;
63
+ continue;
64
+ }
65
+ if (/[0-9.eE]/.test(c)) {
66
+ let j = i;
67
+ while (j < trimmed.length && /[0-9.eE+\-]/.test(trimmed[j])) {
68
+ // handle exponent sign — only consume +/- if previous is e/E
69
+ if ((trimmed[j] === "+" || trimmed[j] === "-") && j > i && trimmed[j - 1].toLowerCase() !== "e")
70
+ break;
71
+ j++;
72
+ }
73
+ tokens.push(trimmed.slice(i, j));
74
+ i = j;
75
+ continue;
76
+ }
77
+ throw new QasmParseError(`bad char '${c}' in angle expr '${trimmed}'`, line, source);
78
+ }
79
+ // Recursive-descent: expr = term (("+"|"-") term)* ; term = factor (("*"|"/") factor)*
80
+ let pos = 0;
81
+ function peek() { return tokens[pos]; }
82
+ function next() { return tokens[pos++]; }
83
+ function parseFactor() {
84
+ const t = next();
85
+ if (t === undefined)
86
+ throw new QasmParseError("unexpected end of angle expr", line, source);
87
+ if (t === "(") {
88
+ const v = parseExpr();
89
+ if (next() !== ")")
90
+ throw new QasmParseError("expected ')'", line, source);
91
+ return v;
92
+ }
93
+ if (t === "-")
94
+ return -parseFactor();
95
+ if (t === "+")
96
+ return parseFactor();
97
+ if (t === "pi")
98
+ return Math.PI;
99
+ const n = parseFloat(t);
100
+ if (Number.isNaN(n))
101
+ throw new QasmParseError(`bad number '${t}'`, line, source);
102
+ return n;
103
+ }
104
+ function parseTerm() {
105
+ let v = parseFactor();
106
+ while (peek() === "*" || peek() === "/") {
107
+ const op = next();
108
+ const rhs = parseFactor();
109
+ v = op === "*" ? v * rhs : v / rhs;
110
+ }
111
+ return v;
112
+ }
113
+ function parseExpr() {
114
+ let v = parseTerm();
115
+ while (peek() === "+" || peek() === "-") {
116
+ const op = next();
117
+ const rhs = parseTerm();
118
+ v = op === "+" ? v + rhs : v - rhs;
119
+ }
120
+ return v;
121
+ }
122
+ const result = parseExpr();
123
+ if (pos < tokens.length)
124
+ throw new QasmParseError(`extra tokens after expr: ${tokens.slice(pos).join("")}`, line, source);
125
+ return result;
126
+ }
127
+ /** Strip block-comments and line-comments from QASM source (preserve newlines for line numbers). */
128
+ function stripComments(src) {
129
+ // Block comments first.
130
+ let out = src.replace(/\/\*[\s\S]*?\*\//g, (m) => m.replace(/[^\n]/g, " "));
131
+ // Line comments.
132
+ out = out.replace(/\/\/[^\n]*/g, "");
133
+ return out;
134
+ }
135
+ /** Parse register declaration like "qubit[5] q" or "qreg q[5]" → {name, size}. */
136
+ function parseRegDecl(line) {
137
+ let m = line.match(/^\s*(?:qubit|bit)\s*\[\s*(\d+)\s*\]\s*([A-Za-z_][A-Za-z0-9_]*)\s*;/);
138
+ if (m)
139
+ return { name: m[2], size: parseInt(m[1], 10) };
140
+ m = line.match(/^\s*(?:qreg|creg)\s+([A-Za-z_][A-Za-z0-9_]*)\s*\[\s*(\d+)\s*\]\s*;/);
141
+ if (m)
142
+ return { name: m[1], size: parseInt(m[2], 10) };
143
+ return null;
144
+ }
145
+ /** Parse a qubit reference like "q[3]" → {name, index}. */
146
+ function parseQubitRef(s) {
147
+ const m = s.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\[\s*(\d+)\s*\]$/);
148
+ if (!m)
149
+ return null;
150
+ return { name: m[1], index: parseInt(m[2], 10) };
151
+ }
152
+ /** Map QASM gate name → CircuitIR gate type. Returns null for unknown. */
153
+ function qasmGateToIr(name) {
154
+ const n = name.toLowerCase();
155
+ switch (n) {
156
+ case "h":
157
+ case "x":
158
+ case "y":
159
+ case "z":
160
+ case "s":
161
+ case "t":
162
+ case "rx":
163
+ case "ry":
164
+ case "rz":
165
+ case "cz":
166
+ case "swap":
167
+ return n;
168
+ case "cx":
169
+ case "cnot":
170
+ return "cnot";
171
+ case "id":
172
+ return null; // identity = no-op, drop it
173
+ // Sdg, tdg, p, u — emit via decomposition path
174
+ case "sdg":
175
+ case "tdg":
176
+ case "p":
177
+ case "u":
178
+ case "u1":
179
+ case "u2":
180
+ case "u3":
181
+ return "decompose-needed";
182
+ default:
183
+ return null;
184
+ }
185
+ }
186
+ /** Decompose qasm-only gates into IR-native gates. Handles sdg, tdg, p(θ), u family. */
187
+ function decomposeQasmGate(name, qubits, params) {
188
+ const n = name.toLowerCase();
189
+ switch (n) {
190
+ case "sdg":
191
+ // S† = RZ(-π/2) (up to global phase)
192
+ return [{ type: "rz", targets: qubits, theta: -Math.PI / 2 }];
193
+ case "tdg":
194
+ return [{ type: "rz", targets: qubits, theta: -Math.PI / 4 }];
195
+ case "p":
196
+ case "u1":
197
+ // P(θ) and U1(θ) = RZ(θ) (up to global phase)
198
+ return [{ type: "rz", targets: qubits, theta: params[0] ?? 0 }];
199
+ case "u2":
200
+ // U2(φ,λ) = RZ(λ) RY(π/2) RZ(φ + π) (one common decomposition)
201
+ // For brevity we approximate via RZ-RY-RZ chain
202
+ return [
203
+ { type: "rz", targets: qubits, theta: params[1] ?? 0 },
204
+ { type: "ry", targets: qubits, theta: Math.PI / 2 },
205
+ { type: "rz", targets: qubits, theta: (params[0] ?? 0) + Math.PI },
206
+ ];
207
+ case "u":
208
+ case "u3":
209
+ // U3(θ,φ,λ) = RZ(λ) RY(θ) RZ(φ) (one common decomposition)
210
+ return [
211
+ { type: "rz", targets: qubits, theta: params[2] ?? 0 },
212
+ { type: "ry", targets: qubits, theta: params[0] ?? 0 },
213
+ { type: "rz", targets: qubits, theta: params[1] ?? 0 },
214
+ ];
215
+ default:
216
+ throw new Error(`cannot decompose '${name}'`);
217
+ }
218
+ }
219
+ /** Parse a single statement line (with semicolon already stripped externally
220
+ * is fine — we tolerate either form). */
221
+ function parseStatement(stmt, lineNum, regOffsets, source) {
222
+ const s = stmt.trim();
223
+ if (!s)
224
+ return null;
225
+ // measurement: handle "measure q;", "measure q -> c;", "c = measure q;"
226
+ if (/^measure\s+/.test(s) || /^([A-Za-z_][A-Za-z0-9_]*\s*\[\s*\d+\s*\]?|[A-Za-z_][A-Za-z0-9_]*)\s*=\s*measure\b/.test(s)) {
227
+ return { gates: [], isMeasure: true };
228
+ }
229
+ // gate call: "<name>(args) qubitlist;" OR "<name> qubitlist;"
230
+ const m = s.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*(\([^)]*\))?\s+(.+)$/);
231
+ if (!m)
232
+ return null;
233
+ const name = m[1].toLowerCase();
234
+ const argsStr = m[2] ? m[2].slice(1, -1) : "";
235
+ const qubitListStr = m[3];
236
+ // Skip directive-like tokens (include / OPENQASM / gate definition openings).
237
+ if (name === "include" || name === "openqasm" || name === "gate" || name === "opaque" || name === "barrier")
238
+ return null;
239
+ const params = argsStr.trim() ? argsStr.split(",").map((e) => evalAngle(e, lineNum, source)) : [];
240
+ const qubitRefs = qubitListStr.split(",").map((q) => q.trim());
241
+ const qubits = [];
242
+ for (const q of qubitRefs) {
243
+ const ref = parseQubitRef(q);
244
+ if (!ref)
245
+ throw new QasmParseError(`bad qubit ref '${q}'`, lineNum, source);
246
+ const offset = regOffsets.get(ref.name);
247
+ if (offset === undefined)
248
+ throw new QasmParseError(`unknown register '${ref.name}'`, lineNum, source);
249
+ qubits.push(offset + ref.index);
250
+ }
251
+ const ir = qasmGateToIr(name);
252
+ if (ir === null) {
253
+ // Unknown gate: refuse with clear error (don't silently drop, except id which returns null intentionally above)
254
+ if (name === "id")
255
+ return null;
256
+ throw new QasmParseError(`unsupported gate '${name}' (subset parser; see docs/QX_BRIDGE.md for supported gates)`, lineNum, source);
257
+ }
258
+ if (ir === "decompose-needed") {
259
+ return { gates: decomposeQasmGate(name, qubits, params), isMeasure: false };
260
+ }
261
+ const gate = { type: ir, targets: qubits };
262
+ if (params.length > 0 && (ir === "rx" || ir === "ry" || ir === "rz"))
263
+ gate.theta = params[0];
264
+ return { gates: [gate], isMeasure: false };
265
+ }
266
+ /** Top-level parser. Statement-oriented (not line-oriented) — multiple
267
+ * statements per line are supported, as is one statement spanning
268
+ * multiple lines. */
269
+ export function parseQasm(source) {
270
+ const stripped = stripComments(source);
271
+ let qasmVersion = "unknown";
272
+ const registers = [];
273
+ const regOffsets = new Map();
274
+ let totalQubits = 0;
275
+ const gates = [];
276
+ let hadMeasure = false;
277
+ // Build a list of {stmt, line} from the source by splitting on ; while
278
+ // tracking which line each statement started on (for error messages).
279
+ const statements = [];
280
+ {
281
+ const lines = stripped.split(/\r?\n/);
282
+ let buf = "";
283
+ let bufStartLine = 1;
284
+ for (let i = 0; i < lines.length; i++) {
285
+ const ln = lines[i];
286
+ const remaining = buf ? buf + " " + ln : ln;
287
+ const segments = remaining.split(";");
288
+ // All but the last segment are complete statements
289
+ for (let s = 0; s < segments.length - 1; s++) {
290
+ const text = segments[s].trim();
291
+ if (text)
292
+ statements.push({ text, line: (buf ? bufStartLine : i + 1) });
293
+ if (s === 0 && !buf)
294
+ bufStartLine = i + 1;
295
+ }
296
+ // The last segment carries over (incomplete statement)
297
+ buf = segments[segments.length - 1].trim();
298
+ if (buf === "") {
299
+ bufStartLine = i + 2;
300
+ }
301
+ }
302
+ // Anything in buf at the end → final statement without trailing ;
303
+ if (buf.trim())
304
+ statements.push({ text: buf.trim(), line: bufStartLine });
305
+ }
306
+ for (const { text, line } of statements) {
307
+ if (!text)
308
+ continue;
309
+ // Header
310
+ const verMatch = text.match(/^\s*OPENQASM\s+([\d.]+)\s*$/i);
311
+ if (verMatch) {
312
+ qasmVersion = verMatch[1];
313
+ continue;
314
+ }
315
+ // Include directive — informational only
316
+ if (/^\s*include\s+/.test(text))
317
+ continue;
318
+ // Register decl
319
+ const reg = parseRegDecl(text + ";");
320
+ if (reg) {
321
+ // Only qubit / qreg counted; bit / creg ignored for IR
322
+ if (/^\s*(?:qubit|qreg)/.test(text)) {
323
+ regOffsets.set(reg.name, totalQubits);
324
+ registers.push({ name: reg.name, size: reg.size, offset: totalQubits });
325
+ totalQubits += reg.size;
326
+ }
327
+ continue;
328
+ }
329
+ try {
330
+ const out = parseStatement(text, line, regOffsets, source);
331
+ if (out) {
332
+ if (out.isMeasure)
333
+ hadMeasure = true;
334
+ for (const g of out.gates)
335
+ gates.push(g);
336
+ }
337
+ }
338
+ catch (e) {
339
+ if (e instanceof QasmParseError)
340
+ throw e;
341
+ throw new QasmParseError(e.message, line, source);
342
+ }
343
+ }
344
+ if (totalQubits === 0) {
345
+ throw new QasmParseError("no qubit register declared", 0, source);
346
+ }
347
+ if (totalQubits > 12) {
348
+ throw new QasmParseError(`circuit declares ${totalQubits} qubits — in-process simulator caps at 12 (use a real-cloud provider)`, 0, source);
349
+ }
350
+ return {
351
+ circuit: { numQubits: totalQubits, gates, label: `qasm-${qasmVersion}`, measureAll: true },
352
+ source,
353
+ qasmVersion,
354
+ registers,
355
+ hadMeasureAll: hadMeasure || gates.length > 0,
356
+ };
357
+ }
358
+ /** Convenience: parse + return CircuitIR only. */
359
+ export function qasmToCircuit(source) {
360
+ return parseQasm(source).circuit;
361
+ }
362
+ //# sourceMappingURL=qasm_parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qasm_parser.js","sourceRoot":"","sources":["../../src/qx_bridge/qasm_parser.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,8 @@ export declare class QuantumState {
55
55
  rz(q: number, theta: number): void;
56
56
  /** Controlled-NOT: if ctrl qubit is |1⟩, flip target. */
57
57
  cnot(ctrl: number, target: number): void;
58
+ /** SWAP two qubits — exchange their states. */
59
+ swap(a: number, b: number): void;
58
60
  /** Controlled-Z: phase flip when both qubits are |1⟩. */
59
61
  cz(ctrl: number, target: number): void;
60
62
  /** Compute exact probability for each basis state (no sampling noise). */
@@ -65,7 +67,7 @@ export declare class QuantumState {
65
67
  * reproducibility when seed is provided. */
66
68
  measure(shots: number, seed?: number): MeasurementResult;
67
69
  }
68
- export type GateName = "h" | "x" | "y" | "z" | "s" | "t" | "cnot" | "cz" | "rx" | "ry" | "rz";
70
+ export type GateName = "h" | "x" | "y" | "z" | "s" | "t" | "cnot" | "cz" | "swap" | "rx" | "ry" | "rz";
69
71
  export interface Gate {
70
72
  type: GateName;
71
73
  /** Qubit indices. cnot/cz: [ctrl, target]. rotations: [target]. */