@@ -67,7 +67,7 @@ bool Verifier::equivalent(Context *ctx, const CircuitSeq *circuit1,
67
67
std::unordered_set<CircuitGate *> leftover_gates_start2;
68
68
// (Partial) topological sort on circuit1
69
69
while (!wires_to_search.empty ()) {
70
- auto wire1 = wires_to_search.front ();
70
+ CircuitWire * wire1 = wires_to_search.front ();
71
71
assert (wires_mapping.count (wire1) > 0 );
72
72
auto wire2 = wires_mapping[wire1];
73
73
wires_to_search.pop ();
@@ -79,19 +79,31 @@ bool Verifier::equivalent(Context *ctx, const CircuitSeq *circuit1,
79
79
[&qubit_blocked](CircuitWire *output_wire) {
80
80
return qubit_blocked[output_wire->index ];
81
81
})) {
82
- // Block qubits of potential unmatched gates
83
- for (auto &gate : wire1->output_gates ) {
84
- for (auto &output_wire : gate->output_wires ) {
85
- qubit_blocked[output_wire->index ] = true ;
82
+ // Block qubits of potential unmatched gates.
83
+ for (auto &gate1 : wire1->output_gates ) {
84
+ // Use a for loop because |wire1->output_gates| can be empty.
85
+ for (auto &input_wire : gate1->input_wires ) {
86
+ qubit_blocked[input_wire->index ] = true ;
87
+ // If |wires_mapping| does not have |input_wire|, this means that
88
+ // the qubit is already blocked before, and |leftover_gates_start2|
89
+ // already had an earlier gate at this qubit.
90
+ if (wires_mapping.count (input_wire) > 0 ) {
91
+ // Note that this input wire might be not in the search queue now.
92
+ // We need to manually add the gate in circuit2 to the frontier.
93
+ for (auto &gate : wires_mapping[input_wire]->output_gates ) {
94
+ leftover_gates_start2.insert (gate);
95
+ }
96
+ }
86
97
}
87
98
// Use std::unordered_set to deduplicate, similarly hereinafter
88
- leftover_gates_start1.insert (gate );
99
+ leftover_gates_start1.insert (gate1 );
89
100
}
90
- for (auto &gate : wire2->output_gates ) {
91
- for (auto &output_wire : gate->output_wires ) {
101
+ for (auto &gate2 : wire2->output_gates ) {
102
+ // Use a for loop because |wire2->output_gates| can be empty.
103
+ for (auto &output_wire : gate2->output_wires ) {
92
104
qubit_blocked[output_wire->index ] = true ;
93
105
}
94
- leftover_gates_start2.insert (gate );
106
+ leftover_gates_start2.insert (gate2 );
95
107
}
96
108
continue ;
97
109
}
@@ -141,6 +153,20 @@ bool Verifier::equivalent(Context *ctx, const CircuitSeq *circuit1,
141
153
// We should have removed the same number of gates
142
154
assert (circuit1->get_num_gates () - c1->get_num_gates () ==
143
155
circuit2->get_num_gates () - c2->get_num_gates ());
156
+ if (verbose) {
157
+ std::cout << " Removed " << circuit1->get_num_gates () - c1->get_num_gates ()
158
+ << " prefix gates from circuit1 and "
159
+ << circuit2->get_num_gates () - c2->get_num_gates ()
160
+ << " prefix gates from circuit2." << std::endl;
161
+ std::cout << " Leftover gates from circuit1:" << std::endl;
162
+ for (auto &gate : leftover_gates_start1) {
163
+ std::cout << gate->to_string () << std::endl;
164
+ }
165
+ std::cout << " Leftover gates from circuit2:" << std::endl;
166
+ for (auto &gate : leftover_gates_start2) {
167
+ std::cout << gate->to_string () << std::endl;
168
+ }
169
+ }
144
170
145
171
// Remove common last gates
146
172
while (true ) {
0 commit comments