| 246 | |
| 247 | |
| 248 | extern "C" DiagMatr createDiagMatr(int numQubits) { |
| 249 | validate_envIsInit(__func__); |
| 250 | validate_newDiagMatrParams(numQubits, __func__); |
| 251 | |
| 252 | // validation ensures this never overflows |
| 253 | qindex numElems = powerOf2(numQubits); |
| 254 | |
| 255 | // prepare output DiagMatr (avoiding C++20 designated initialiser) |
| 256 | DiagMatr out; |
| 257 | out.numQubits = numQubits, |
| 258 | out.numElems = numElems, |
| 259 | |
| 260 | // attempt to allocate (uninitialised) flags in the heap so that struct copies are mutable |
| 261 | out.isApproxUnitary = util_allocEpsilonSensitiveHeapFlag(); // nullptr if failed |
| 262 | out.isApproxHermitian = util_allocEpsilonSensitiveHeapFlag(); |
| 263 | out.isApproxNonZero = util_allocEpsilonSensitiveHeapFlag(); |
| 264 | out.isStrictlyNonNegative = cpu_allocHeapFlag(); // nullptr if failed |
| 265 | out.wasGpuSynced = cpu_allocHeapFlag(); |
| 266 | |
| 267 | // attempt to allocate 1D memory (nullptr if failed or not allocated) |
| 268 | out.cpuElems = cpu_allocArray(numElems); |
| 269 | out.gpuElems = (getQuESTEnv().isGpuAccelerated)? gpu_allocArray(numElems) : nullptr; |
| 270 | |
| 271 | validateMatrixAllocs(out, __func__); |
| 272 | setInitialHeapFlags(out); |
| 273 | return out; |
| 274 | } |
| 275 | |
| 276 | |
| 277 | FullStateDiagMatr validateAndCreateCustomFullStateDiagMatr(int numQubits, int useDistrib, int useGpuAccel, int useMultithread, const char* caller) { |
no test coverage detected