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

Method qubitMeasure

Core/VirtualQuantumProcessor/CPUImplQPU.cpp:141–195  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

139
140template <typename data_t >
141bool CPUImplQPU<data_t>::qubitMeasure(size_t qn)
142{
143 int64_t size = 1ll << (m_qubit_num - 1);
144 int64_t offset = 1ll << qn;
145 double dprob = 0;
146
147 if (size > m_threshold)
148 {
149#pragma omp parallel for reduction (+:dprob)
150 for (int64_t i = 0; i < size; i++)
151 {
152 int64_t real00_idx = _insert(i, qn);
153 dprob += std::norm(m_state[real00_idx]);
154 }
155 }
156 else
157 {
158 for (int64_t i = 0; i < size; i++)
159 {
160 int64_t real00_idx = _insert(i, qn);
161 dprob += std::norm(m_state[real00_idx]);
162 }
163 }
164
165
166 bool measure_out = random_generator19937() > dprob?true:false;
167
168 if (!measure_out)
169 {
170 dprob = 1 / sqrt(dprob);
171
172#pragma omp parallel for num_threads(_omp_thread_num(size))
173 for (int64_t i = 0; i < size; i++)
174 {
175 int64_t real00_idx = _insert(i, qn);
176 m_state[real00_idx] *= dprob;
177 m_state[real00_idx | offset] = 0;
178 }
179
180 }
181 else
182 {
183 dprob = 1 / sqrt(1 - dprob);
184
185#pragma omp parallel for num_threads(_omp_thread_num(size))
186 for (int64_t i = 0; i < size; i++)
187 {
188 int64_t real00_idx = _insert(i, qn);
189 m_state[real00_idx] = 0;
190 m_state[real00_idx | offset] *= dprob;
191 }
192
193 }
194 return measure_out;
195}
196
197template <typename data_t>
198std::vector<std::complex<data_t>> CPUImplQPU<data_t>::convert(const QStat& v) const

Callers 1

executeMethod · 0.45

Calls 4

normFunction · 0.85
random_generator19937Function · 0.85
_insertFunction · 0.70
sqrtFunction · 0.50

Tested by

no test coverage detected