@@ -420,13 +420,14 @@ void Circuit::reset_metadata() {
420
420
void Circuit::add_op_metadata (const Op &op) {
421
421
has_conditional |= op.conditional ;
422
422
opset_.insert (op);
423
- if (!qubitset_.empty () &&
424
- (op.type == OpType::save_expval || op.type == OpType::save_expval_var)) {
423
+ if (op.type == OpType::save_expval || op.type == OpType::save_expval_var) {
425
424
for (int_t j = 0 ; j < op.expval_params .size (); j++) {
426
425
const std::string &pauli = std::get<0 >(op.expval_params [j]);
427
426
for (int_t i = 0 ; i < op.qubits .size (); i++) {
428
427
// add qubit with non-I operator
429
- if (pauli[pauli.size () - 1 - i] != ' I' ) {
428
+ // we also add one qubit if the qubitset is empty to prevent edge cases
429
+ // with empty circuits
430
+ if (qubitset_.empty () || pauli[pauli.size () - 1 - i] != ' I' ) {
430
431
qubitset_.insert (op.qubits [i]);
431
432
}
432
433
}
@@ -682,17 +683,23 @@ void Circuit::set_params(bool truncation) {
682
683
void Circuit::remap_qubits (Op &op) const {
683
684
// truncate save_expval
684
685
if (op.type == OpType::save_expval || op.type == OpType::save_expval_var) {
686
+ // map each qubit to its location in the pauli strings
687
+ std::unordered_map<uint_t , uint_t > ops_pauli_qubit_map;
688
+ for (size_t i = 0 ; i < op.qubits .size (); ++i) {
689
+ ops_pauli_qubit_map[op.qubits [i]] = op.qubits .size () - 1 - i;
690
+ }
685
691
int_t nparams = op.expval_params .size ();
686
692
for (int_t i = 0 ; i < nparams; i++) {
687
693
std::string &pauli = std::get<0 >(op.expval_params [i]);
688
694
std::string new_pauli;
689
695
new_pauli.resize (qubitmap_.size ());
690
696
for (auto q = qubitmap_.cbegin (); q != qubitmap_.cend (); q++) {
691
697
new_pauli[qubitmap_.size () - 1 - q->second ] =
692
- pauli[pauli. size () - 1 - q->first ];
698
+ pauli[ops_pauli_qubit_map[ q->first ] ];
693
699
}
694
700
pauli = new_pauli;
695
701
}
702
+ op.qubits .resize (qubitmap_.size ());
696
703
for (int_t i = 0 ; i < qubitmap_.size (); i++) {
697
704
op.qubits [i] = i;
698
705
}
0 commit comments