MCPcopy Create free account
hub / github.com/OriginQ/QPanda-2 / run_with_optimizing

Method run_with_optimizing

Core/QuantumMachine/OriginQVM.cpp:131–212  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

129}
130
131std::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 }

Callers

nothing calls this directly

Calls 15

random_generator19937Function · 0.85
sortFunction · 0.85
integerToBinaryFunction · 0.85
get_max_qubit_addrMethod · 0.80
sizeMethod · 0.45
initStateMethod · 0.45
executeMethod · 0.45
getImplementationPtrMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
pMeasureMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected