| 135 | } |
| 136 | |
| 137 | static 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))) { |
no test coverage detected