10#include "quest/include/channels.h"
11#include "quest/include/types.h"
13#include "quest/src/core/bitwise.hpp"
14#include "quest/src/core/memory.hpp"
15#include "quest/src/core/printer.hpp"
16#include "quest/src/core/utilities.hpp"
17#include "quest/src/core/validation.hpp"
18#include "quest/src/comm/comm_config.hpp"
19#include "quest/src/comm/comm_routines.hpp"
20#include "quest/src/cpu/cpu_config.hpp"
21#include "quest/src/gpu/gpu_config.hpp"
39 cpu_deallocMatrixWrapper(op.
cpuElems);
45 auto gpuPtr = util_getGpuMemPtr(op);
46 if (mem_isAllocated(gpuPtr))
47 gpu_deallocArray(gpuPtr);
76bool didAnyLocalAllocsFail(
SuperOp op) {
80 if (!mem_isOuterAllocated(op.
cpuElems))
return true;
89bool didAnyLocalAllocsFail(
KrausMap map) {
97 if (didAnyLocalAllocsFail(map.
superop))
106void freeAllMemoryIfAnyAllocsFailed(T& obj) {
109 bool anyFail = didAnyLocalAllocsFail(obj);
111 anyFail = comm_isTrueOnAllNodes(anyFail);
125SuperOp allocSuperOp(
int numQubits) {
131 qindex numRows = powerOf2(2 * numQubits);
132 qindex numElems = numRows * numRows;
135 qcomp* cpuMem = cpu_allocArray(numElems);
136 qcomp* gpuMem =
nullptr;
138 gpuMem = gpu_allocArray(numElems);
146 out.
cpuElems = cpu_allocAndInitMatrixWrapper(cpuMem, numRows);
163 validate_envIsInit(__func__);
164 validate_newSuperOpParams(numQubits, __func__);
166 SuperOp out = allocSuperOp(numQubits);
169 freeAllMemoryIfAnyAllocsFailed(out);
170 validate_newSuperOpAllocs(out, __func__);
177 validate_envIsInit(__func__);
178 validate_newKrausMapParams(numQubits, numOperators, __func__);
181 qindex numRows = powerOf2(numQubits);
188 out.
matrices = cpu_allocMatrixList(numRows, numOperators);
189 out.
superop = allocSuperOp(numQubits);
190 out.
isApproxCPTP = util_allocEpsilonSensitiveHeapFlag();
193 freeAllMemoryIfAnyAllocsFailed(out);
194 validate_newKrausMapAllocs(out, __func__);
204 validate_superOpFields(op, __func__);
211 validate_krausMapFields(map, __func__);
224 validate_superOpFields(op, __func__);
227 if (mem_isAllocated(util_getGpuMemPtr(op)))
228 gpu_copyCpuToGpu(op);
237 validate_krausMapFields(map, __func__);
261void setAndSyncSuperOpElems(
SuperOp op, T matrix) {
272 validate_superOpFields(op, __func__);
273 validate_matrixNewElemsPtrNotNull(matrix, op.
numRows, __func__);
275 setAndSyncSuperOpElems(op, matrix);
279 validate_superOpFields(op, __func__);
280 validate_superOpNewMatrixDims(op, matrix, __func__);
282 setAndSyncSuperOpElems(op, matrix);
298void setAndSyncKrausMapElems(
KrausMap map, T matrices) {
310 validate_krausMapFields(map, __func__);
312 setAndSyncKrausMapElems(map, matrices);
317 validate_krausMapFields(map, __func__);
318 validate_krausMapNewMatrixDims(map, matrices, __func__);
320 setAndSyncKrausMapElems(map, matrices);
336void setInlineKrausMap(
KrausMap map,
int numQb,
int numOps, vector<vector<vector<qcomp>>> matrices) {
337 validate_krausMapFields(map, __func__);
338 validate_krausMapFieldsMatchPassedParams(map, numQb, numOps, __func__);
339 validate_krausMapNewMatrixDims(map, matrices, __func__);
341 setAndSyncKrausMapElems(map, matrices);
345void setInlineSuperOp(
SuperOp op,
int numQb, vector<vector<qcomp>> matrix) {
346 validate_superOpFields(op, __func__);
347 validate_superOpFieldsMatchPassedParams(op, numQb, __func__);
348 validate_superOpNewMatrixDims(op, matrix, __func__);
350 setAndSyncSuperOpElems(op, matrix);
362KrausMap createInlineKrausMap(
int numQubits,
int numOperators, vector<vector<vector<qcomp>>> matrices) {
363 validate_envIsInit(__func__);
364 validate_newKrausMapParams(numQubits, numOperators, __func__);
365 validate_newInlineKrausMapDimMatchesVectors(numQubits, numOperators, matrices, __func__);
370 setAndSyncKrausMapElems(map, matrices);
375SuperOp createInlineSuperOp(
int numQubits, vector<vector<qcomp>> matrix) {
376 validate_envIsInit(__func__);
377 validate_newSuperOpParams(numQubits, __func__);
378 validate_newInlineSuperOpDimMatchesVectors(numQubits, matrix, __func__);
383 setAndSyncSuperOpElems(op, matrix);
402 void _validateParamsToSetKrausMapFromArr(
KrausMap map) {
403 validate_krausMapFields(map,
"setKrausMap");
406 void _validateParamsToSetSuperOpFromArr(
SuperOp op) {
407 validate_superOpFields(op,
"setSuperOp");
410 void _validateParamsToSetInlineKrausMap(
KrausMap map,
int numQb,
int numOps) {
412 const char* caller =
"setInlineKrausMap";
413 validate_krausMapFields(map, caller);
414 validate_krausMapFieldsMatchPassedParams(map, numQb, numOps, caller);
417 void _validateParamsToSetInlineSuperOp(
SuperOp op,
int numQb) {
419 const char* caller =
"setInlineSuperOp";
420 validate_superOpFields(op, caller);
421 validate_superOpFieldsMatchPassedParams(op, numQb, caller);
424 void _validateParamsToCreateInlineKrausMap(
int numQb,
int numOps) {
426 const char* caller =
"createInlineKrausMap";
427 validate_envIsInit(caller);
428 validate_newKrausMapParams(numQb, numOps, caller);
431 void _validateParamsToCreateInlineSuperOp(
int numQb) {
433 const char* caller =
"createInlineSuperOp";
434 validate_envIsInit(caller);
435 validate_newSuperOpParams(numQb, caller);
448 validate_superOpFields(op, __func__);
449 validate_numReportedNewlinesAboveZero(__func__);
453 validate_superOpIsSynced(op, __func__);
456 size_t elemMem = mem_getLocalSuperOpMemoryRequired(op.
numQubits);
457 size_t structMem =
sizeof(op);
461 print_header(op, elemMem + structMem);
465 print_oneFewerNewlines();
472 validate_krausMapFields(map, __func__);
473 validate_numReportedNewlinesAboveZero(__func__);
477 validate_krausMapIsSynced(map, __func__);
482 size_t krausMem = mem_getLocalMatrixMemoryRequired(map.
numQubits, isDense, numNodes) * map.
numMatrices;
484 size_t strucMem =
sizeof(map);
489 size_t totalMem = krausMem + superMem + strucMem;
490 print_header(map, totalMem);
494 print_oneFewerNewlines();
KrausMap createKrausMap(int numQubits, int numOperators)
SuperOp createSuperOp(int numQubits)
void destroySuperOp(SuperOp op)
void destroyKrausMap(KrausMap map)
void reportKrausMap(KrausMap map)
void reportSuperOp(SuperOp op)
void setSuperOp(SuperOp op, qcomp **matrix)
void setKrausMap(KrausMap map, qcomp ***matrices)
void syncSuperOp(SuperOp op)
void syncKrausMap(KrausMap map)