25#include "quest/include/types.h"
26#include "quest/include/paulis.h"
100 int* isApproxUnitary;
101 int* isApproxHermitian;
164 int* isApproxUnitary;
165 int* isApproxHermitian;
198 int isGpuAccelerated;
201 qindex numElemsPerNode;
208 int* isApproxUnitary;
209 int* isApproxHermitian;
210 int* isApproxNonZero;
211 int* isStrictlyNonNegative;
299extern void _validateNewNestedElemsPtrNotNull(qcomp** ptrs,
int numQubits,
const char* caller);
302extern void _validateNewElemsPtrNotNull(qcomp* ptr,
const char* caller);
312 _validateNewNestedElemsPtrNotNull(in, 1, __func__);
318 {in[0][0], in[0][1]},
319 {in[1][0], in[1][1]}}
328 _validateNewNestedElemsPtrNotNull(in, 2, __func__);
334 {in[0][0], in[0][1], in[0][2], in[0][3]},
335 {in[1][0], in[1][1], in[1][2], in[1][3]},
336 {in[2][0], in[2][1], in[2][2], in[2][3]},
337 {in[3][0], in[3][1], in[3][2], in[3][3]}}
346 _validateNewElemsPtrNotNull(in, __func__);
351 .elems = {in[0], in[1]}
360 _validateNewElemsPtrNotNull(in, __func__);
365 .elems = {in[0], in[1], in[2], in[3]}
391static inline CompMatr1 _getCompMatr1FromArr(qcomp in[2][2]) {
393 qcomp* rowPtrs[] = {in[0], in[1]};
398static inline CompMatr2 _getCompMatr2FromArr(qcomp in[4][4]) {
400 qcomp* rowPtrs[] = {in[0], in[1], in[2], in[3]};
482 #define getCompMatr1(...) \
483 _Generic((__VA_ARGS__), \
484 qcomp** : getCompMatr1, \
485 default : _getCompMatr1FromArr \
490 #define getCompMatr2(...) \
491 _Generic((__VA_ARGS__), \
492 qcomp** : getCompMatr2, \
493 default : _getCompMatr2FromArr \
522 #define getInlineCompMatr1(...) \
523 getCompMatr1(__VA_ARGS__)
526 #define getInlineCompMatr2(...) \
527 getCompMatr2(__VA_ARGS__)
530 #define getInlineDiagMatr1(...) \
531 getDiagMatr1(__VA_ARGS__)
534 #define getInlineDiagMatr2(...) \
535 getDiagMatr2(__VA_ARGS__)
543 #define getInlineCompMatr1(...) \
544 _getCompMatr1FromArr((qcomp[2][2]) __VA_ARGS__)
547 #define getInlineCompMatr2(...) \
548 _getCompMatr2FromArr((qcomp[4][4]) __VA_ARGS__)
551 #define getInlineDiagMatr1(...) \
552 getDiagMatr1((qcomp[2]) __VA_ARGS__)
555 #define getInlineDiagMatr2(...) \
556 getDiagMatr2((qcomp[4]) __VA_ARGS__)
709#if defined(__cplusplus)
736#elif !defined(_MSC_VER)
745 extern void _validateParamsToSetCompMatrFromArr(
CompMatr matr);
750 static inline void _setCompMatrFromArr(
CompMatr matr, qcomp arr[matr.numRows][matr.numRows]) {
751 _validateParamsToSetCompMatrFromArr(matr);
754 qcomp* ptrs[matr.numRows];
757 for (qindex r=0; r<matr.numRows; r++)
770 #define setCompMatr(matr, ...) \
771 _Generic((__VA_ARGS__), \
772 qcomp** : setCompMatr, \
773 default : _setCompMatrFromArr \
774 )((matr), (__VA_ARGS__))
812#if defined(__cplusplus)
838#elif !defined(_MSC_VER)
851 extern void _validateParamsToSetInlineCompMatr(
CompMatr matr,
int numQb);
853 extern void _validateParamsToSetInlineDiagMatr(
DiagMatr matr,
int numQb);
855 extern void _validateParamsToSetInlineFullStateDiagMatr(
FullStateDiagMatr matr, qindex startInd, qindex numElems);
859 static inline void _setInlineCompMatr(
CompMatr matr,
int numQb, qcomp elems[1<<numQb][1<<numQb]) {
860 _validateParamsToSetInlineCompMatr(matr, numQb);
861 _setCompMatrFromArr(matr, elems);
865 static inline void _setInlineDiagMatr(
DiagMatr matr,
int numQb, qcomp elems[1<<numQb]) {
866 _validateParamsToSetInlineDiagMatr(matr, numQb);
871 static inline void _setInlineFullStateDiagMatr(
FullStateDiagMatr matr, qindex startInd, qindex numElems, qcomp elems[numElems]) {
872 _validateParamsToSetInlineFullStateDiagMatr(matr, startInd, numElems);
882 #define setInlineCompMatr(matr, numQb, ...) \
883 _setInlineCompMatr((matr), (numQb), (qcomp[1<<(numQb)][1<<(numQb)]) __VA_ARGS__)
886 #define setInlineDiagMatr(matr, numQb, ...) \
887 _setInlineDiagMatr((matr), (numQb), (qcomp[1<<(numQb)]) __VA_ARGS__)
890 #define setInlineFullStateDiagMatr(matr, startInd, numElems, ...) \
891 _setInlineFullStateDiagMatr((matr), (startInd), (numElems), (qcomp[(numElems)]) __VA_ARGS__)
931 extern void _validateParamsToSetInlineDiagMatr(
DiagMatr matr,
int numQb);
933 extern void _validateParamsToSetInlineFullStateDiagMatr(
FullStateDiagMatr matr, qindex startInd, qindex numElems);
937 #define setInlineDiagMatr(matr, numQb, ...) \
939 _validateParamsToSetInlineDiagMatr((matr), (numQb)); \
940 setDiagMatr((matr), (numQb), (qcomp[1<<(numQb)]) __VA_ARGS__); \
945 #define setInlineFullStateDiagMatr(matr, startInd, numElems, ...) \
947 _validateParamsToSetInlineFullStateDiagMatr((matr), (startInd), (numElems)); \
948 setFullStateDiagMatr((matr), (startInd), (elems), (numElems)); \
973#if defined(__cplusplus)
990#elif !defined(_MSC_VER)
1001 extern void _validateParamsToCreateInlineCompMatr(
int numQb);
1003 extern void _validateParamsToCreateInlineDiagMatr(
int numQb);
1007 static inline CompMatr _createInlineCompMatr(
int numQb, qcomp elems[1<<numQb][1<<numQb]) {
1008 _validateParamsToCreateInlineCompMatr(numQb);
1010 _setCompMatrFromArr(out, elems);
1015 static inline DiagMatr _createInlineDiagMatr(
int numQb, qcomp elems[1<<numQb]) {
1016 _validateParamsToCreateInlineDiagMatr(numQb);
1024 #define createInlineCompMatr(numQb, ...) \
1025 _createInlineCompMatr((numQb), (qcomp[1<<(numQb)][1<<(numQb)]) __VA_ARGS__)
1028 #define createInlineDiagMatr(numQb, ...) \
1029 _createInlineDiagMatr((numQb), (qcomp[1<<(numQb)]) __VA_ARGS__)
FullStateDiagMatr createCustomFullStateDiagMatr(int numQubits, int useDistrib, int useGpuAccel, int useMultithread)
DiagMatr createInlineDiagMatr(int numQb, std::vector< qcomp > elems)
FullStateDiagMatr createFullStateDiagMatr(int numQubits)
CompMatr createInlineCompMatr(int numQb, std::vector< std::vector< qcomp > > elems)
CompMatr createCompMatr(int numQubits)
DiagMatr createDiagMatr(int numQubits)
FullStateDiagMatr createFullStateDiagMatrFromPauliStrSum(PauliStrSum in)
void destroyDiagMatr(DiagMatr matrix)
void destroyFullStateDiagMatr(FullStateDiagMatr matrix)
void destroyCompMatr(CompMatr matrix)
static CompMatr2 getCompMatr2(qcomp **in)
static CompMatr1 getCompMatr1(qcomp **in)
static DiagMatr2 getDiagMatr2(qcomp *in)
CompMatr1 getInlineCompMatr1({{ matrix }})
CompMatr2 getInlineCompMatr2({{ matrix }})
DiagMatr2 getInlineDiagMatr2({ list })
static DiagMatr1 getDiagMatr1(qcomp *in)
DiagMatr1 getInlineDiagMatr1({ list })
void reportCompMatr2(CompMatr2 matrix)
void reportDiagMatr1(DiagMatr1 matrix)
void reportCompMatr(CompMatr matrix)
void reportDiagMatr2(DiagMatr2 matrix)
void reportCompMatr1(CompMatr1 matrix)
void reportDiagMatr(DiagMatr matrix)
void reportFullStateDiagMatr(FullStateDiagMatr matr)
void setInlineDiagMatr(DiagMatr matr, int numQb, std::vector< qcomp > in)
void setFullStateDiagMatrFromMultiDimLists(FullStateDiagMatr out, void *lists, int *numQubitsPerDim, int numDims)
void setDiagMatrFromMultiDimLists(DiagMatr out, void *lists, int *numQubitsPerDim, int numDims)
void setFullStateDiagMatrFromMultiVarFunc(FullStateDiagMatr out, qcomp(*func)(qindex *), int *numQubitsPerVar, int numVars, int areSigned)
void setInlineCompMatr(CompMatr matr, int numQb, std::vector< std::vector< qcomp > > in)
void setDiagMatr(DiagMatr out, qcomp *in)
void setCompMatr(CompMatr matr, qcomp **vals)
void setFullStateDiagMatr(FullStateDiagMatr out, qindex startInd, qcomp *in, qindex numElems)
void setDiagMatrFromMultiVarFunc(DiagMatr out, qcomp(*func)(qindex *), int *numQubitsPerVar, int numVars, int areSigned)
void setFullStateDiagMatrFromPauliStrSum(FullStateDiagMatr out, PauliStrSum in)
void setInlineFullStateDiagMatr(FullStateDiagMatr matr, qindex startInd, qindex numElems, std::vector< qcomp > in)
void syncFullStateDiagMatr(FullStateDiagMatr matr)
void syncDiagMatr(DiagMatr matr)
void syncCompMatr(CompMatr matr)
int * isStrictlyNonNegative