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 @@