| 174 | |
| 175 | |
| 176 | extern "C" KrausMap createKrausMap(int numQubits, int numOperators) { |
| 177 | validate_envIsInit(__func__); |
| 178 | validate_newKrausMapParams(numQubits, numOperators, __func__); |
| 179 | |
| 180 | // validation ensures this never overflows |
| 181 | qindex numRows = powerOf2(numQubits); |
| 182 | |
| 183 | // attempt to allocate output KrausMap fields (avoiding C++20 designated initialiser) |
| 184 | KrausMap out; |
| 185 | out.numQubits = numQubits, |
| 186 | out.numMatrices = numOperators, |
| 187 | out.numRows = numRows, |
| 188 | out.matrices = cpu_allocMatrixList(numRows, numOperators); // is or contains nullptr if failed |
| 189 | out.superop = allocSuperOp(numQubits); // heap fields are or contain nullptr if failed |
| 190 | out.isApproxCPTP = util_allocEpsilonSensitiveHeapFlag(); // nullptr if failed |
| 191 | |
| 192 | // free memory before throwing validation error to avoid memory leaks |
| 193 | freeAllMemoryIfAnyAllocsFailed(out); // sets out.matrices=nullptr if failed |
| 194 | validate_newKrausMapAllocs(out, __func__); |
| 195 | |
| 196 | // mark CPTP as unknown; it will be lazily evaluated whene a function asserts CPTP-ness |
| 197 | util_setFlagToUnknown(out.isApproxCPTP); |
| 198 | |
| 199 | return out; |
| 200 | } |
| 201 | |
| 202 | |
| 203 | extern "C" void destroySuperOp(SuperOp op) { |
no test coverage detected