From 0bc45722360eb63e0c3573999efce39310cbd433 Mon Sep 17 00:00:00 2001 From: shohamjac <51854221+shohamjac@users.noreply.github.com> Date: Fri, 13 Jun 2025 17:51:53 +0300 Subject: [PATCH 1/5] added reverse --- glue/crumble/circuit/circuit.js | 1 + glue/crumble/circuit/propagated_pauli_frames.js | 10 +++++++--- glue/crumble/draw/main_draw.js | 6 +++++- glue/crumble/gates/gateset_markers.js | 10 ++++++++++ glue/crumble/main.js | 1 + 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/glue/crumble/circuit/circuit.js b/glue/crumble/circuit/circuit.js index a0fb3d0b2..a76245ae7 100644 --- a/glue/crumble/circuit/circuit.js +++ b/glue/crumble/circuit/circuit.js @@ -164,6 +164,7 @@ class Circuit { replaceAll('#!pragma ERR', 'ERR'). replaceAll('#!pragma MARK', 'MARK'). replaceAll('#!pragma POLYGON', 'POLYGON'). + replaceAll('#!pragma REVERSE', 'REVERSE'). replaceAll('_', ' '). replaceAll('Q(', 'QUBIT_COORDS('). replaceAll('DT', 'DETECTOR'). diff --git a/glue/crumble/circuit/propagated_pauli_frames.js b/glue/crumble/circuit/propagated_pauli_frames.js index 2a65df42f..90453d1c6 100644 --- a/glue/crumble/circuit/propagated_pauli_frames.js +++ b/glue/crumble/circuit/propagated_pauli_frames.js @@ -122,11 +122,15 @@ class PropagatedPauliFrames { * @param {!int} marker_index * @returns {!PropagatedPauliFrames} */ - static fromCircuit(circuit, marker_index) { + static fromCircuit(circuit, marker_index, reverse = true) { let result = new PropagatedPauliFrames(new Map()); let bases = /** @type {!Map} */ new Map(); - for (let k = 0; k < circuit.layers.length; k++) { + const start = reverse ? circuit.layers.length - 1 : 0; + const end = reverse ? -1 : circuit.layers.length; + const step = reverse ? -1 : 1; + + for (let k = start; reverse ? k > end : k < end; k += step) { let layer = circuit.layers[k]; let prevBases = bases; bases = layer.id_pauliFrameAfter(bases, marker_index); @@ -171,7 +175,7 @@ class PropagatedPauliFrames { } if (bases.size > 0) { - result.id_layers.set(k + 0.5, new PropagatedPauliFrameLayer(bases, new Set(), [])); + result.id_layers.set(reverse ? k - 0.5 : k + 0.5, new PropagatedPauliFrameLayer(bases, new Set(), [])); } if (errors.size > 0 || crossings.length > 0) { result.id_layers.set(k, new PropagatedPauliFrameLayer(new Map(), errors, crossings)); diff --git a/glue/crumble/draw/main_draw.js b/glue/crumble/draw/main_draw.js index 4636133e2..b919b3e35 100644 --- a/glue/crumble/draw/main_draw.js +++ b/glue/crumble/draw/main_draw.js @@ -200,12 +200,16 @@ function draw(ctx, snap) { let circuit = snap.circuit; let numPropagatedLayers = 0; + let reverseLayers = new Set(); for (let layer of circuit.layers) { for (let op of layer.markers) { let gate = op.gate; if (gate.name === "MARKX" || gate.name === "MARKY" || gate.name === "MARKZ") { numPropagatedLayers = Math.max(numPropagatedLayers, op.args[0] + 1); } + if (gate.name === "REVERSE") { + reverseLayers.add(op.args[0]); + } } } @@ -217,7 +221,7 @@ function draw(ctx, snap) { }; let propagatedMarkerLayers = /** @type {!Map} */ new Map(); for (let mi = 0; mi < numPropagatedLayers; mi++) { - propagatedMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi)); + propagatedMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi, reverseLayers.has(mi))); } let {dets: dets, obs: obs} = circuit.collectDetectorsAndObservables(false); let batch_input = []; diff --git a/glue/crumble/gates/gateset_markers.js b/glue/crumble/gates/gateset_markers.js index aad80749d..805d09212 100644 --- a/glue/crumble/gates/gateset_markers.js +++ b/glue/crumble/gates/gateset_markers.js @@ -180,6 +180,16 @@ function *iter_gates_markers() { ctx.fillRect(x1 - rad, y1 - rad, rad, rad); } ); + yield new Gate( + 'REVERSE', + undefined, + false, + true, // not exactly a marker, but behaves like one + undefined, + () => {}, + () => {}, + (op, coordFunc, ctx) => {} + ); } export {iter_gates_markers, marker_placement}; diff --git a/glue/crumble/main.js b/glue/crumble/main.js index 1d16f559d..cfff36935 100644 --- a/glue/crumble/main.js +++ b/glue/crumble/main.js @@ -136,6 +136,7 @@ function exportCurrentState() { let validStimCircuit = editorState.copyOfCurCircuit().toStimCircuit(). replaceAll('\nPOLYGON', '\n#!pragma POLYGON'). replaceAll('\nERR', '\n#!pragma ERR'). + replaceAll('\nREVERSE', '\n#!pragma REVERSE'). replaceAll('\nMARK', '\n#!pragma MARK'); let txt = txtStimCircuit; txt.value = validStimCircuit + '\n'; From 5f9838210928ac99117914dacec1e2bddcc861f4 Mon Sep 17 00:00:00 2001 From: shohamjac <51854221+shohamjac@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:04:18 +0300 Subject: [PATCH 2/5] finished with global instruction --- glue/crumble/draw/main_draw.js | 8 +++---- glue/crumble/draw/timeline_viewer.js | 33 ++++++++++------------------ 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/glue/crumble/draw/main_draw.js b/glue/crumble/draw/main_draw.js index b919b3e35..58b53f22d 100644 --- a/glue/crumble/draw/main_draw.js +++ b/glue/crumble/draw/main_draw.js @@ -200,7 +200,7 @@ function draw(ctx, snap) { let circuit = snap.circuit; let numPropagatedLayers = 0; - let reverseLayers = new Set(); + let reversedMarkers = new Set(); for (let layer of circuit.layers) { for (let op of layer.markers) { let gate = op.gate; @@ -208,7 +208,7 @@ function draw(ctx, snap) { numPropagatedLayers = Math.max(numPropagatedLayers, op.args[0] + 1); } if (gate.name === "REVERSE") { - reverseLayers.add(op.args[0]); + reversedMarkers.add(op.args[0]); } } } @@ -221,7 +221,7 @@ function draw(ctx, snap) { }; let propagatedMarkerLayers = /** @type {!Map} */ new Map(); for (let mi = 0; mi < numPropagatedLayers; mi++) { - propagatedMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi, reverseLayers.has(mi))); + propagatedMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi, reversedMarkers.has(mi))); } let {dets: dets, obs: obs} = circuit.collectDetectorsAndObservables(false); let batch_input = []; @@ -388,7 +388,7 @@ function draw(ctx, snap) { }); }); - drawTimeline(ctx, snap, propagatedMarkerLayers, qubitDrawCoords, circuit.layers.length); + drawTimeline(ctx, snap, propagatedMarkerLayers, qubitDrawCoords, circuit.layers.length, reversedMarkers); // Draw scrubber. ctx.save(); diff --git a/glue/crumble/draw/timeline_viewer.js b/glue/crumble/draw/timeline_viewer.js index 2bab08cfb..41ca92eb8 100644 --- a/glue/crumble/draw/timeline_viewer.js +++ b/glue/crumble/draw/timeline_viewer.js @@ -14,8 +14,12 @@ let TIMELINE_PITCH = 32; * @param {!int} max_t * @param {!number} x_pitch * @param {!Map} hitCounts + * @param {!boolean} reversed */ -function drawTimelineMarkers(ctx, ds, qubitTimeCoordFunc, propagatedMarkers, mi, min_t, max_t, x_pitch, hitCounts) { +function drawTimelineMarkers(ctx, ds, qubitTimeCoordFunc, propagatedMarkers, mi, min_t, max_t, x_pitch, hitCounts, reversed) { + const colors = {'X': 'red', 'Y': 'green', 'Z': 'blue'}; + const lightColors = {'X': '#ff7777', 'Y': '#77ff77', 'Z': '#7777ff'}; + for (let t = min_t - 1; t <= max_t; t++) { if (!hitCounts.has(t)) { hitCounts.set(t, new Map()); @@ -45,16 +49,10 @@ function drawTimelineMarkers(ctx, ds, qubitTimeCoordFunc, propagatedMarkers, mi, if (x === undefined || y === undefined) { continue; } - if (b === 'X') { - ctx.fillStyle = 'red' - } else if (b === 'Y') { - ctx.fillStyle = 'green' - } else if (b === 'Z') { - ctx.fillStyle = 'blue' - } else { - throw new Error('Not a pauli: ' + b); - } + ctx.fillStyle = reversed ? lightColors[b] : colors[b]; ctx.fillRect(x - dx, y - dy, wx, wy); + ctx.shadowColor = ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; + ctx.filter = "none"; } for (let q of p0.errors) { let {dx, dy, wx, wy} = marker_placement(mi, q, hitCount); @@ -74,15 +72,7 @@ function drawTimelineMarkers(ctx, ds, qubitTimeCoordFunc, propagatedMarkers, mi, for (let {q1, q2, color} of p0.crossings) { let [x1, y1] = qubitTimeCoordFunc(q1, t); let [x2, y2] = qubitTimeCoordFunc(q2, t); - if (color === 'X') { - ctx.strokeStyle = 'red'; - } else if (color === 'Y') { - ctx.strokeStyle = 'green'; - } else if (color === 'Z') { - ctx.strokeStyle = 'blue'; - } else { - ctx.strokeStyle = 'purple' - } + ctx.strokeStyle = reversed ? lightColors[color] : colors[color]; ctx.lineWidth = 8; stroke_connector_to(ctx, x1, y1, x2, y2); ctx.lineWidth = 1; @@ -96,8 +86,9 @@ function drawTimelineMarkers(ctx, ds, qubitTimeCoordFunc, propagatedMarkers, mi, * @param {!Map} propagatedMarkerLayers * @param {!function(!int): ![!number, !number]} timesliceQubitCoordsFunc * @param {!int} numLayers + * @param {!Set} reversedMarkers */ -function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFunc, numLayers) { +function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFunc, numLayers, reversedMarkers = new Set()) { let w = Math.floor(ctx.canvas.width / 2); let qubits = snap.timelineQubits(); @@ -162,7 +153,7 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun // Draw colored indicators showing Pauli propagation. let hitCounts = new Map(); for (let [mi, p] of propagatedMarkerLayers.entries()) { - drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, min_t_clamp, max_t, x_pitch, hitCounts); + drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, min_t_clamp, max_t, x_pitch, hitCounts, reversedMarkers.has(mi)); } // Draw highlight of current layer. From b606450a485ff02407a214408fcf6971832afabc Mon Sep 17 00:00:00 2001 From: shohamjac <51854221+shohamjac@users.noreply.github.com> Date: Sat, 21 Jun 2025 18:20:28 +0300 Subject: [PATCH 3/5] REVMARK instruction --- glue/crumble/circuit/circuit.js | 2 +- glue/crumble/circuit/layer.js | 17 +++++++---- .../circuit/propagated_pauli_frames.js | 4 +-- glue/crumble/draw/main_draw.js | 12 ++++++-- glue/crumble/draw/timeline_viewer.js | 9 ++++-- glue/crumble/gates/gateset_markers.js | 28 ++++++++++++++++--- glue/crumble/main.js | 2 +- 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/glue/crumble/circuit/circuit.js b/glue/crumble/circuit/circuit.js index a76245ae7..048b80dd9 100644 --- a/glue/crumble/circuit/circuit.js +++ b/glue/crumble/circuit/circuit.js @@ -164,7 +164,7 @@ class Circuit { replaceAll('#!pragma ERR', 'ERR'). replaceAll('#!pragma MARK', 'MARK'). replaceAll('#!pragma POLYGON', 'POLYGON'). - replaceAll('#!pragma REVERSE', 'REVERSE'). + replaceAll('#!pragma REVMARK', 'REVMARK'). replaceAll('_', ' '). replaceAll('Q(', 'QUBIT_COORDS('). replaceAll('DT', 'DETECTOR'). diff --git a/glue/crumble/circuit/layer.js b/glue/crumble/circuit/layer.js index 256e48f3f..b6f4e94ab 100644 --- a/glue/crumble/circuit/layer.js +++ b/glue/crumble/circuit/layer.js @@ -2,6 +2,8 @@ import {Operation} from "./operation.js" import {GATE_MAP} from "../gates/gateset.js"; import {groupBy} from "../base/seq.js"; +const MARKER_NAMES = ['MARKX', 'MARKY', 'MARKZ', 'REVMARKX', 'REVMARKY', 'REVMARKZ']; + class Layer { constructor() { this.id_ops = /** @type {!Map} */ new Map(); @@ -216,9 +218,12 @@ class Layer { * @param {!int} marker_index * @returns {!Map} */ - id_pauliFrameAfter(before, marker_index) { + id_pauliFrameAfter(before, marker_index, reverse=false) { let after = new Map(); let handled = new Set(); + const MARKX_NAME = reverse ? 'REVMARKX' : 'MARKX'; + const MARKY_NAME = reverse ? 'REVMARKY' : 'MARKY'; + const MARKZ_NAME = reverse ? 'REVMARKZ' : 'MARKZ'; for (let k of before.keys()) { let v = before.get(k); @@ -253,7 +258,7 @@ class Layer { } for (let op of this.markers) { - if (op.gate.name === 'MARKX' && op.args[0] === marker_index) { + if (op.gate.name === MARKX_NAME && op.args[0] === marker_index) { let key = op.id_targets[0]; let pauli = after.get(key); if (pauli === undefined || pauli === 'I') { @@ -266,7 +271,7 @@ class Layer { pauli = 'Y'; } after.set(key, pauli); - } else if (op.gate.name === 'MARKY' && op.args[0] === marker_index) { + } else if (op.gate.name === MARKY_NAME && op.args[0] === marker_index) { let key = op.id_targets[0]; let pauli = after.get(key); if (pauli === undefined || pauli === 'I') { @@ -279,7 +284,7 @@ class Layer { pauli = 'X'; } after.set(key, pauli); - } else if (op.gate.name === 'MARKZ' && op.args[0] === marker_index) { + } else if (op.gate.name === MARKZ_NAME && op.args[0] === marker_index) { let key = op.id_targets[0]; let pauli = after.get(key); if (pauli === undefined || pauli === 'I') { @@ -330,7 +335,7 @@ class Layer { if (index !== undefined && op.args[0] !== index) { return true; } - if (op.gate.name !== 'MARKX' && op.gate.name !== 'MARKY' && op.gate.name !== 'MARKZ') { + if (!(MARKER_NAMES.includes(op.gate.name))) { return true; } return op.id_targets[0] !== q; @@ -343,7 +348,7 @@ class Layer { */ put(op, allow_overwrite=true) { if (op.gate.is_marker) { - if (op.gate.name === 'MARKX' || op.gate.name === 'MARKY' || op.gate.name === 'MARKZ') { + if (MARKER_NAMES.includes(op.gate.name)) { this.id_dropMarkersAt(op.id_targets[0], op.args[0]); } this.markers.push(op); diff --git a/glue/crumble/circuit/propagated_pauli_frames.js b/glue/crumble/circuit/propagated_pauli_frames.js index 90453d1c6..356c2a169 100644 --- a/glue/crumble/circuit/propagated_pauli_frames.js +++ b/glue/crumble/circuit/propagated_pauli_frames.js @@ -122,7 +122,7 @@ class PropagatedPauliFrames { * @param {!int} marker_index * @returns {!PropagatedPauliFrames} */ - static fromCircuit(circuit, marker_index, reverse = true) { + static fromCircuit(circuit, marker_index, reverse = false) { let result = new PropagatedPauliFrames(new Map()); let bases = /** @type {!Map} */ new Map(); @@ -133,7 +133,7 @@ class PropagatedPauliFrames { for (let k = start; reverse ? k > end : k < end; k += step) { let layer = circuit.layers[k]; let prevBases = bases; - bases = layer.id_pauliFrameAfter(bases, marker_index); + bases = layer.id_pauliFrameAfter(bases, marker_index, reverse); let errors = new Set(); for (let key of [...bases.keys()]) { diff --git a/glue/crumble/draw/main_draw.js b/glue/crumble/draw/main_draw.js index 58b53f22d..b7b6141ec 100644 --- a/glue/crumble/draw/main_draw.js +++ b/glue/crumble/draw/main_draw.js @@ -207,7 +207,7 @@ function draw(ctx, snap) { if (gate.name === "MARKX" || gate.name === "MARKY" || gate.name === "MARKZ") { numPropagatedLayers = Math.max(numPropagatedLayers, op.args[0] + 1); } - if (gate.name === "REVERSE") { + if (gate.name === "REVMARKX" || gate.name === "REVMARKY" || gate.name === "REVMARKZ") { reversedMarkers.add(op.args[0]); } } @@ -221,8 +221,13 @@ function draw(ctx, snap) { }; let propagatedMarkerLayers = /** @type {!Map} */ new Map(); for (let mi = 0; mi < numPropagatedLayers; mi++) { - propagatedMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi, reversedMarkers.has(mi))); + propagatedMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi, false)); } + let propagatedRevMarkerLayers = /** @type {!Map} */ new Map(); + for (let mi of reversedMarkers) { + propagatedRevMarkerLayers.set(mi, PropagatedPauliFrames.fromCircuit(circuit, mi, true)); + } + let {dets: dets, obs: obs} = circuit.collectDetectorsAndObservables(false); let batch_input = []; for (let mi = 0; mi < dets.length; mi++) { @@ -353,6 +358,7 @@ function draw(ctx, snap) { }); drawMarkers(ctx, snap, qubitDrawCoords, propagatedMarkerLayers); + drawMarkers(ctx, snap, qubitDrawCoords, propagatedRevMarkerLayers); if (focusX !== undefined) { ctx.save(); @@ -388,7 +394,7 @@ function draw(ctx, snap) { }); }); - drawTimeline(ctx, snap, propagatedMarkerLayers, qubitDrawCoords, circuit.layers.length, reversedMarkers); + drawTimeline(ctx, snap, propagatedMarkerLayers, qubitDrawCoords, circuit.layers.length, propagatedRevMarkerLayers); // Draw scrubber. ctx.save(); diff --git a/glue/crumble/draw/timeline_viewer.js b/glue/crumble/draw/timeline_viewer.js index 41ca92eb8..780b3ddc8 100644 --- a/glue/crumble/draw/timeline_viewer.js +++ b/glue/crumble/draw/timeline_viewer.js @@ -88,7 +88,7 @@ function drawTimelineMarkers(ctx, ds, qubitTimeCoordFunc, propagatedMarkers, mi, * @param {!int} numLayers * @param {!Set} reversedMarkers */ -function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFunc, numLayers, reversedMarkers = new Set()) { +function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFunc, numLayers, propagatedRevMarkerLayers = new Map()) { let w = Math.floor(ctx.canvas.width / 2); let qubits = snap.timelineQubits(); @@ -152,10 +152,15 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun // Draw colored indicators showing Pauli propagation. let hitCounts = new Map(); + for (let [mi, p] of propagatedRevMarkerLayers.entries()) { + drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, min_t_clamp, max_t, x_pitch, hitCounts, true); + } + for (let [mi, p] of propagatedMarkerLayers.entries()) { - drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, min_t_clamp, max_t, x_pitch, hitCounts, reversedMarkers.has(mi)); + drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, min_t_clamp, max_t, x_pitch, hitCounts, false); } + // Draw highlight of current layer. ctx.globalAlpha *= 0.5; ctx.fillStyle = 'black'; diff --git a/glue/crumble/gates/gateset_markers.js b/glue/crumble/gates/gateset_markers.js index 805d09212..ddcfc533c 100644 --- a/glue/crumble/gates/gateset_markers.js +++ b/glue/crumble/gates/gateset_markers.js @@ -179,16 +179,36 @@ function *iter_gates_markers() { ctx.fillStyle = 'magenta' ctx.fillRect(x1 - rad, y1 - rad, rad, rad); } + ); + yield new Gate( + 'REVMARKX', + 1, + true, + true, + undefined, + () => {}, + () => {}, + make_marker_drawer('#ff7777'), ); yield new Gate( - 'REVERSE', + 'REVMARKY', + 1, + true, + true, undefined, - false, - true, // not exactly a marker, but behaves like one + () => {}, + () => {}, + make_marker_drawer('#77ff77'), + ); + yield new Gate( + 'REVMARKZ', + 1, + true, + true, undefined, () => {}, () => {}, - (op, coordFunc, ctx) => {} + make_marker_drawer('#7777ff'), ); } diff --git a/glue/crumble/main.js b/glue/crumble/main.js index cfff36935..eb5cf293b 100644 --- a/glue/crumble/main.js +++ b/glue/crumble/main.js @@ -136,7 +136,7 @@ function exportCurrentState() { let validStimCircuit = editorState.copyOfCurCircuit().toStimCircuit(). replaceAll('\nPOLYGON', '\n#!pragma POLYGON'). replaceAll('\nERR', '\n#!pragma ERR'). - replaceAll('\nREVERSE', '\n#!pragma REVERSE'). + replaceAll('\nREVMARK', '\n#!pragma REVMARK'). replaceAll('\nMARK', '\n#!pragma MARK'); let txt = txtStimCircuit; txt.value = validStimCircuit + '\n'; From 2bf8970f36eab00ce7d305066d04790379fbf646 Mon Sep 17 00:00:00 2001 From: shohamjac <51854221+shohamjac@users.noreply.github.com> Date: Sat, 27 Sep 2025 20:28:17 +0300 Subject: [PATCH 4/5] GUI for REVMARK and passing crumble tests --- glue/crumble/circuit/layer.test.js | 6 ++++- glue/crumble/circuit/pauli_frame.test.js | 4 ++++ glue/crumble/crumble.html | 2 +- glue/crumble/gates/gateset.test.js | 3 +++ glue/crumble/keyboard/toolbox.js | 28 ++++++++++++++++++------ glue/crumble/main.js | 10 +++++++++ 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/glue/crumble/circuit/layer.test.js b/glue/crumble/circuit/layer.test.js index 5c4c3c557..42a70b6e9 100644 --- a/glue/crumble/circuit/layer.test.js +++ b/glue/crumble/circuit/layer.test.js @@ -20,13 +20,17 @@ test("layer.put_get", () => { let marker1 = new Operation(GATE_MAP.get("MARKX"), '', new Float32Array([0]), new Uint32Array([4])); let marker2 = new Operation(GATE_MAP.get("MARKZ"), '', new Float32Array([1]), new Uint32Array([5])); + let marker3 = new Operation(GATE_MAP.get("REVMARKX"), '', new Float32Array([2]), new Uint32Array([4])); + let marker4 = new Operation(GATE_MAP.get("REVMARKZ"), '', new Float32Array([3]), new Uint32Array([5])); layer.put(marker1); layer.put(marker2); + layer.put(marker3); + layer.put(marker4); assertThat(layer.id_ops).isEqualTo(new Map([ [2, op], [3, op], ])); - assertThat(layer.markers).isEqualTo([marker1, marker2]); + assertThat(layer.markers).isEqualTo([marker1, marker2, marker3, marker4]); }); test("layer.filtered", () => { diff --git a/glue/crumble/circuit/pauli_frame.test.js b/glue/crumble/circuit/pauli_frame.test.js index 16e35aae7..f3988826c 100644 --- a/glue/crumble/circuit/pauli_frame.test.js +++ b/glue/crumble/circuit/pauli_frame.test.js @@ -36,6 +36,10 @@ test("pauli_frame.do_gate_vs_old_frame_updates", () => { if (g.name === 'DETECTOR' || g.name === 'OBSERVABLE_INCLUDE') { continue; } + if (g.name.startsWith('REVMARK')) { + // skipping REVMARKs since they are not supported by legacy implementation + continue; + } let before, after, returned; if (g.num_qubits === 1) { before = new PauliFrame(4, g.num_qubits); diff --git a/glue/crumble/crumble.html b/glue/crumble/crumble.html index 4dff02ecc..b0b08bc83 100644 --- a/glue/crumble/crumble.html +++ b/glue/crumble/crumble.html @@ -33,7 +33,7 @@
- +