Skip to content

Commit 6191c9c

Browse files
committed
- Modified state-prep to avoid-y-measure
- Updated docstring - Renamed variable name
1 parent f663816 commit 6191c9c

File tree

9 files changed

+35
-54
lines changed

9 files changed

+35
-54
lines changed

frontend/catalyst/passes/builtin_passes.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ def circuit():
501501
return PassPipelineWrapper(qnode, "merge_ppr_ppm")
502502

503503

504-
def ppr_to_ppm(qnode=None, decompose_method="auto-corrected", prepare_state="zero"):
504+
def ppr_to_ppm(qnode=None, decompose_method="auto-corrected", avoid_y_measure=False):
505505
R"""Specify that the MLIR compiler passes for decomposing Pauli Product rotations (PPR)
506506
into Pauli Pauli measurements (PPM) will be applied.
507507
@@ -568,7 +568,7 @@ def circuit():
568568
"""
569569
passes = {
570570
"decompose_non_clifford_ppr": {"decompose-method": decompose_method},
571-
"decompose_clifford_ppr": {"prep-state": prepare_state},
571+
"decompose_clifford_ppr": {"avoid-y-measure": avoid_y_measure},
572572
}
573573

574574
def decorator(qnode_func):

frontend/test/pytest/test_peephole_optimizations.py

+2-18
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,6 @@ def test_chained_apply_passes_workflow(x: float):
196196
assert "merge-rotations" in test_chained_apply_passes_workflow.mlir
197197

198198

199-
test_chained_passes()
200-
201199
#
202200
# to_ppr
203201
#
@@ -227,9 +225,6 @@ def f():
227225
assert 'transform.apply_registered_pass "to_ppr"' not in optimized_ir
228226
assert "qec.ppr" in optimized_ir
229227

230-
231-
test_convert_clifford_to_ppr()
232-
233228
#
234229
# commute_ppr
235230
#
@@ -262,9 +257,6 @@ def f():
262257
assert "qec.ppr" in optimized_ir
263258
assert "qec.ppm" in optimized_ir
264259

265-
266-
test_commute_ppr()
267-
268260
#
269261
# merge_ppr_ppm
270262
#
@@ -280,13 +272,11 @@ def test_merge_ppr_ppm():
280272
def test_merge_ppr_ppm_workflow():
281273

282274
@to_ppr
283-
@commute_ppr
284275
@merge_ppr_ppm
285276
@qml.qnode(qml.device("lightning.qubit", wires=2))
286277
def f():
287278
qml.H(0)
288279
qml.S(1)
289-
qml.T(0)
290280
qml.CNOT([0, 1])
291281
return measure(0), measure(1)
292282

@@ -316,8 +306,6 @@ def test_ppr_to_ppm():
316306
def test_ppr_to_ppm_workflow():
317307

318308
@to_ppr
319-
@commute_ppr
320-
@merge_ppr_ppm
321309
@ppr_to_ppm
322310
@qml.qnode(qml.device("lightning.qubit", wires=2))
323311
def f():
@@ -348,7 +336,7 @@ def f():
348336
test_ppr_to_ppm()
349337

350338
#
351-
# ppr_to_ppm with inject-magic-state
339+
# ppr_to_ppm with clifford-corrected
352340
#
353341

354342

@@ -362,9 +350,7 @@ def test_ppr_to_ppm_inject_magic_state():
362350
def test_ppr_to_ppm_workflow():
363351

364352
@to_ppr
365-
@commute_ppr
366-
@merge_ppr_ppm
367-
@ppr_to_ppm(decompose_method="inject-magic-state", prepare_state="plus_i")
353+
@ppr_to_ppm(decompose_method="clifford-corrected", avoid_y_measure=True)
368354
@qml.qnode(qml.device("lightning.qubit", wires=2))
369355
def f():
370356
qml.H(0)
@@ -391,7 +377,5 @@ def f():
391377
assert 'qec.ppr ["X"]' in optimized_ir
392378

393379

394-
test_ppr_to_ppm_inject_magic_state()
395-
396380
if __name__ == "__main__":
397381
pytest.main(["-x", __file__])

mlir/include/QEC/IR/QECDialect.td

+1-3
Original file line numberDiff line numberDiff line change
@@ -404,11 +404,9 @@ def PPMeasurementOp : QEC_Op<"ppm", [QECOpInterface, AttrSizedOperandSegments]>
404404
}
405405

406406
def SelectPPMeasurementOp : QEC_Op<"select.ppm"> {
407-
let summary = "Conditional Pauli product measurement based on a boolean control.";
407+
let summary = "Multiplexed Pauli product measurement.";
408408

409409
let description = [{
410-
Conditionally applies and Pauli Product Measurement on qubits.
411-
412410
Based on the boolean `condition` (type `i1`), this op selects between two Pauli product strings:
413411
- If `condition` is 1, applies and measures using `pauli_product`.
414412
- If `condition` is 0, uses `else_pauli_product`.

mlir/include/QEC/Transforms/Passes.td

+14-20
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ def CommuteCliffordTPPRPass : Pass<"commute_ppr"> {
3838
let constructor = "catalyst::createCommuteCliffordTPPRPass()";
3939
}
4040

41-
def DecompositionMethod : I32EnumAttr<"DecompositionMethod", "Decomposition method",
41+
def DecomposeMethod : I32EnumAttr<"DecomposeMethod", "Decomposition method",
4242
[
4343
I32EnumAttrCase<"AutoCorrected", 0, "auto-corrected">,
44-
I32EnumAttrCase<"InjectMagicState", 1, "inject-magic-state">
44+
I32EnumAttrCase<"CliffordCorrected", 1, "clifford-corrected">
4545
]> {
4646
let cppNamespace = "catalyst::qec";
4747
let genSpecializedAttr = 0;
@@ -50,29 +50,23 @@ def DecompositionMethod : I32EnumAttr<"DecompositionMethod", "Decomposition meth
5050
def DecomposeMethodOption : Option<
5151
/*C++ var name=*/"decomposeMethod",
5252
/*CLI arg name=*/"decompose-method",
53-
/*type=*/"::catalyst::qec::DecompositionMethod",
54-
/*default=*/"::catalyst::qec::DecompositionMethod::AutoCorrected",
53+
/*type=*/"::catalyst::qec::DecomposeMethod",
54+
/*default=*/"::catalyst::qec::DecomposeMethod::AutoCorrected",
5555
"Decomposition method to use",
5656
[{::llvm::cl::values(
57-
clEnumValN(::catalyst::qec::DecompositionMethod::AutoCorrected,
57+
clEnumValN(::catalyst::qec::DecomposeMethod::AutoCorrected,
5858
"auto-corrected", "Decompose using auto-corrected method."),
59-
clEnumValN(::catalyst::qec::DecompositionMethod::InjectMagicState,
60-
"inject-magic-state",
59+
clEnumValN(::catalyst::qec::DecomposeMethod::CliffordCorrected,
60+
"clifford-corrected",
6161
"Decompose by injecting magic states method.")
6262
)}]>;
6363

64-
def PrepareStateOption : Option<
65-
/*C++ var name=*/"prepareState",
66-
/*CLI arg name=*/"prep-state",
67-
/*type=*/"::catalyst::qec::LogicalInitKind",
68-
/*default=*/"::catalyst::qec::LogicalInitKind::zero",
69-
"Initial state of logical qubit",
70-
[{::llvm::cl::values(
71-
clEnumValN(::catalyst::qec::LogicalInitKind::zero,
72-
"zero", "Initial state is |0⟩."),
73-
clEnumValN(::catalyst::qec::LogicalInitKind::plus_i,
74-
"plus_i", "Initial state is |+i⟩.")
75-
)}]>;
64+
def AvoidYMeasureOption : Option<
65+
/*C++ var name=*/"avoidYMeasure",
66+
/*CLI arg name=*/"avoid-y-measure",
67+
/*type=*/"bool",
68+
/*default=*/"false",
69+
"Avoid Pauli-Y measurements for Clifford rotations. Rather than performing a Pauli-Y measurement for Clifford rotations (sometimes more costly), a Y state is used instead (requires Y state preparation).">;
7670

7771
def CommuteCliffordPastPPMPass : Pass<"merge_ppr_ppm"> {
7872
let summary = "Absorb Clifford operations into Pauli Product Measurement operations.";
@@ -103,7 +97,7 @@ def DecomposeCliffordPPRPass : Pass<"decompose_clifford_ppr"> {
10397
"catalyst::qec::QECDialect",
10498
];
10599

106-
let options = [PrepareStateOption];
100+
let options = [AvoidYMeasureOption];
107101

108102
let constructor = "catalyst::createDecomposeCliffordPPRPass()";
109103
}

mlir/include/QEC/Transforms/Patterns.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@
1414

1515
#pragma once
1616

17-
#include "QEC/Transforms/Passes.h" // need for DecompositionMethod
1817
#include "mlir/Conversion/LLVMCommon/TypeConverter.h"
1918
#include "mlir/IR/PatternMatch.h"
2019
#include "mlir/Transforms/DialectConversion.h"
2120

2221
#include "QEC/IR/QECDialect.h"
22+
#include "QEC/Transforms/Passes.h" // need for DecomposeMethod
2323

2424
namespace catalyst {
2525
namespace qec {
2626

2727
void populateCliffordTToPPRPatterns(mlir::RewritePatternSet &);
2828
void populateCommuteCliffordTPPRPatterns(mlir::RewritePatternSet &);
2929
void populateCommuteCliffordPastPPMPatterns(mlir::RewritePatternSet &);
30-
void populateDecomposeNonCliffordPPRPatterns(mlir::RewritePatternSet &, DecompositionMethod);
30+
void populateDecomposeNonCliffordPPRPatterns(mlir::RewritePatternSet &, DecomposeMethod);
3131
void populateDecomposeCliffordPPRPatterns(mlir::RewritePatternSet &, LogicalInitKind);
3232

3333
} // namespace qec

mlir/lib/QEC/Transforms/DecomposeNonCliffordPPR.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@ void decompose_inject_magic_state_pi_over_eight(PPRotationOp op, PatternRewriter
172172
struct DecomposeNonCliffordPPR : public OpRewritePattern<PPRotationOp> {
173173
using OpRewritePattern::OpRewritePattern;
174174

175-
DecompositionMethod method;
175+
DecomposeMethod method;
176176

177-
DecomposeNonCliffordPPR(MLIRContext *context, DecompositionMethod method,
177+
DecomposeNonCliffordPPR(MLIRContext *context, DecomposeMethod method,
178178
PatternBenefit benefit = 1)
179179
: OpRewritePattern(context, benefit), method(method)
180180
{
@@ -184,10 +184,10 @@ struct DecomposeNonCliffordPPR : public OpRewritePattern<PPRotationOp> {
184184
{
185185
if (op.isNonClifford() && !op.getCondition()) {
186186
switch (method) {
187-
case DecompositionMethod::AutoCorrected:
187+
case DecomposeMethod::AutoCorrected:
188188
decompose_auto_corrected_pi_over_eight(op, rewriter);
189189
break;
190-
case DecompositionMethod::InjectMagicState:
190+
case DecomposeMethod::CliffordCorrected:
191191
decompose_inject_magic_state_pi_over_eight(op, rewriter);
192192
break;
193193
}
@@ -202,7 +202,7 @@ namespace catalyst {
202202
namespace qec {
203203

204204
void populateDecomposeNonCliffordPPRPatterns(RewritePatternSet &patterns,
205-
DecompositionMethod decomposeMethod)
205+
DecomposeMethod decomposeMethod)
206206
{
207207
patterns.add<DecomposeNonCliffordPPR>(patterns.getContext(), decomposeMethod, 1);
208208
}

mlir/lib/QEC/Transforms/decompose_clifford_ppr.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ struct DecomposeCliffordPPRPass
4141
{
4242
RewritePatternSet patterns(&getContext());
4343

44-
populateDecomposeCliffordPPRPatterns(patterns, prepareState);
44+
LogicalInitKind ancillaType = LogicalInitKind::zero;
45+
if (avoidYMeasure) {
46+
ancillaType = LogicalInitKind::plus_i;
47+
}
48+
49+
populateDecomposeCliffordPPRPatterns(patterns, ancillaType);
4550

4651
if (failed(applyPatternsAndFoldGreedily(getOperation(), std::move(patterns)))) {
4752
return signalPassFailure();

mlir/test/QEC/DecomposeCliffordPPR.mlir

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_clifford_ppr{prep-state=zero})" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-Z
16-
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_clifford_ppr{prep-state=plus_i})" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-Y
15+
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_clifford_ppr)" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-Z
16+
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_clifford_ppr{avoid-y-measure=true})" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-Y
1717

1818
func.func @test_ppr_to_ppm(%q1 : !quantum.bit) {
1919
%0 = qec.ppr ["Z"](4) %q1 : !quantum.bit

mlir/test/QEC/DecomposeNonCliffordPPR.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_non_clifford_ppr{decompose-method=inject-magic-state})" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-INJECT
15+
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_non_clifford_ppr{decompose-method=clifford-corrected})" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-INJECT
1616
// RUN: quantum-opt --pass-pipeline="builtin.module(decompose_non_clifford_ppr{decompose-method=auto-corrected})" --split-input-file -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-AUTO
1717

1818
func.func @test_ppr_to_ppm(%q1 : !quantum.bit) {

0 commit comments

Comments
 (0)