| 129 | } |
| 130 | |
| 131 | std::map<string, size_t> QVM::run_with_optimizing(QProg& prog, std::vector<ClassicalCondition>& cbits, int shots, TraversalConfig& traver_param) |
| 132 | { |
| 133 | if (0 == traver_param.m_measure_qubits.size()) |
| 134 | { |
| 135 | return map<string, size_t>(); |
| 136 | } |
| 137 | |
| 138 | map<string, size_t> result_map; |
| 139 | //_pGates->initState(0, 1, _Qubit_Pool->get_max_usedqubit_addr() + 1); |
| 140 | _pGates->initState(0, 1, prog.get_max_qubit_addr() +1); |
| 141 | |
| 142 | QProgExecution prog_exec; |
| 143 | prog_exec.execute(prog.getImplementationPtr(), nullptr, traver_param, _pGates); |
| 144 | map<size_t, size_t> result; |
| 145 | |
| 146 | vector<double> random_nums(shots, 0); |
| 147 | for (size_t i = 0; i < shots; i++) |
| 148 | { |
| 149 | random_nums[i] = random_generator19937(); |
| 150 | } |
| 151 | |
| 152 | std::sort(random_nums.begin(), random_nums.end(), [](double& a, double b) { return a > b; }); |
| 153 | prob_vec probs; |
| 154 | |
| 155 | Qnum qubits_nums = traver_param.m_measure_qubits; |
| 156 | _pGates->pMeasure(qubits_nums, probs); |
| 157 | std::unordered_multimap<size_t, CBit*> qubit_cbit_map; |
| 158 | for (size_t i = 0; i < traver_param.m_measure_cc.size(); i++) |
| 159 | { |
| 160 | qubit_cbit_map.insert({ traver_param.m_measure_qubits[i], traver_param.m_measure_cc[i] }); |
| 161 | } |
| 162 | |
| 163 | double p_sum = 0; |
| 164 | for (size_t i = 0; i < probs.size(); i++) |
| 165 | { |
| 166 | if (probs[i] < DBL_EPSILON && probs[i] > -DBL_EPSILON) |
| 167 | { |
| 168 | continue; |
| 169 | } |
| 170 | |
| 171 | p_sum += probs[i]; |
| 172 | auto iter = random_nums.rbegin(); |
| 173 | while (iter != random_nums.rend() && *iter < p_sum) |
| 174 | { |
| 175 | size_t measure_num = traver_param.m_measure_cc.size(); |
| 176 | auto bin_str_index = integerToBinary(i, measure_num); |
| 177 | for (size_t j = 0; j < measure_num; j++) |
| 178 | { |
| 179 | auto qubit_idx = qubits_nums[j]; |
| 180 | auto mulit_iter = qubit_cbit_map.equal_range(qubit_idx); |
| 181 | while (mulit_iter.first != mulit_iter.second) |
| 182 | { |
| 183 | auto cbit = mulit_iter.first->second; |
| 184 | cbit->set_val(bin_str_index[measure_num - j - 1] - 0x30); |
| 185 | _QResult->append({ cbit->getName(), cbit->getValue() }); |
| 186 | ++mulit_iter.first; |
| 187 | } |
| 188 | } |
nothing calls this directly
no test coverage detected