MCPcopy Create free account
hub / github.com/QuEST-Kit/QuEST / getNonTracedQubitOrder

Function getNonTracedQubitOrder

quest/src/core/localiser.cpp:1721–1758  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1719
1720
1721auto getNonTracedQubitOrder(Qureg qureg, vector<int> originalTargs, vector<int> revisedTargs) {
1722
1723 // prepare a list of all the qureg's qubits when treated as a statevector
1724 vector<int> allQubits(2*qureg.numQubits);
1725 for (size_t q=0; q<allQubits.size(); q++)
1726 allQubits[q] = q;
1727
1728 // determine the ordering of all the Qureg's qubits after swaps
1729 for (size_t i=0; i<originalTargs.size(); i++) {
1730 int qb1 = originalTargs[i];
1731 int qb2 = revisedTargs[i];
1732 if (qb1 != qb2)
1733 std::swap(allQubits[qb1], allQubits[qb2]);
1734 }
1735
1736 // use a mask to avoid quadratic nested iteration below
1737 qindex revisedMask = util_getBitMask(revisedTargs);
1738
1739 // retain only non-targeted qubits
1740 vector<int> remainingQubits;
1741 remainingQubits.reserve(allQubits.size() - originalTargs.size());
1742 for (size_t q=0; q<allQubits.size(); q++)
1743 if (!getBit(revisedMask, q))
1744 remainingQubits.push_back(allQubits[q]);
1745
1746 // shift down remaining qubits to be contiguous...
1747 qindex remainingMask = util_getBitMask(remainingQubits);
1748 for (int &qubit : remainingQubits) {
1749 int bound = qubit;
1750
1751 // by subtracting the number of smaller un-targeted qubits from each qubit index
1752 for (int i=0; i<bound; i++)
1753 qubit -= ! getBit(remainingMask, i);
1754 }
1755
1756 // return the ordering, i.e. a list [0, #final-qubits)
1757 return remainingQubits;
1758}
1759
1760
1761void reorderReducedQureg(Qureg inQureg, Qureg outQureg, vector<int> allTargs, vector<int> suffixTargs) {

Callers 1

reorderReducedQuregFunction · 0.85

Calls 2

util_getBitMaskFunction · 0.85
getBitFunction · 0.85

Tested by

no test coverage detected