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

Function quantum_walk_search

Applications/Grover_Algorithm/Grover_Algorithm.cpp:137–222  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

135}
136
137static uint32_t quantum_walk_search(const std::vector<uint32_t>& search_space, const std::vector<uint32_t>& search_data,
138 std::vector<size_t>& search_result)
139{
140 search_result.clear();
141 uint32_t search_times = 0;
142 uint32_t repeat_times = 1;
143 auto machine = initQuantumMachine(CPU);
144 machine->setConfigure({ 64,64 });
145 auto x = machine->allocateCBit();
146
147 std::vector<size_t> search_result_for_check;
148 for (size_t i = 0; i < search_space.size(); ++i)
149 {
150 if (search_space[i] == search_data[0]) {
151 search_result_for_check.emplace_back(i);
152 }
153 }
154
155 cout << "quantum-walk-alg will search through " << search_space.size() << " data." << endl;
156 cout << "Start quantum-walk search algorithm:" << endl;
157
158 QProg quantum_walk_prog;
159 QVec measure_qubits;
160 uint32_t qubit_size = 0;
161 vector<ClassicalCondition> c;
162// const double max_repeat = 3.1415926 * sqrt(((double)search_space.size()) / ((double)search_result_for_check.size())) / 4.0;
163 while (true)
164 {
165 measure_qubits.clear();
166 quantum_walk_prog = build_quantum_walk_search_prog(search_space,
167 x == search_data[0], machine, measure_qubits, ++repeat_times);
168
169 search_times += repeat_times;
170
171 if (0 == qubit_size) {
172 QVec _qv;
173 qubit_size = quantum_walk_prog.get_used_qubits(_qv);
174 printf("Number of used-qubits: %u.\n", qubit_size);
175 }
176
177 if (0 == c.size()) {
178 c = machine->allocateCBits(measure_qubits.size());
179 }
180
181 //measure
182 printf("Strat measure.\n");
183 //auto result = probRunDict(quantum_walk_prog, measure_qubits);
184 quantum_walk_prog << MeasureAll(measure_qubits, c);
185 auto result = runWithConfiguration(quantum_walk_prog, c, g_shot);
186
187 //get result
188 std::map<string, double> normal_result;
189 for (const auto& _r : result) {
190 normal_result.insert(std::make_pair(_r.first, (double)_r.second / (double)g_shot));
191 }
192 search_result = search_target_from_measure_result(normal_result, measure_qubits.size());
193 if ((search_result.size() > 0)
194 || ((search_result.size() == 0) && (4 < repeat_times))) {

Callers 1

mainFunction · 0.85

Calls 9

setConfigureMethod · 0.80
allocateCBitMethod · 0.80
allocateCBitsMethod · 0.80
clearMethod · 0.45
sizeMethod · 0.45
emplace_backMethod · 0.45
get_used_qubitsMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected