29#include "quest/include/types.h"
30#include "quest/include/paulis.h"
104 int* isApproxUnitary;
105 int* isApproxHermitian;
168 int* isApproxUnitary;
169 int* isApproxHermitian;
202 int isGpuAccelerated;
205 qindex numElemsPerNode;
212 int* isApproxUnitary;
213 int* isApproxHermitian;
214 int* isApproxNonZero;
215 int* isStrictlyNonNegative;
303extern void _validateNewNestedElemsPtrNotNull(qcomp** ptrs,
int numQubits,
const char* caller);
306extern void _validateNewElemsPtrNotNull(qcomp* ptr,
const char* caller);
326 _validateNewNestedElemsPtrNotNull(in, 1, __func__);
332 for (
int r=0; r<2; r++)
333 for (
int c=0; c<2; c++)
334 out.elems[r][c] = in[r][c];
352 _validateNewNestedElemsPtrNotNull(in, 2, __func__);
358 for (
int r=0; r<4; r++)
359 for (
int c=0; c<4; c++)
360 out.elems[r][c] = in[r][c];
379 _validateNewElemsPtrNotNull(in, __func__);
385 for (
int i=0; i<2; i++)
386 out.elems[i] = in[i];
404 _validateNewElemsPtrNotNull(in, __func__);
410 for (
int i=0; i<4; i++)
411 out.elems[i] = in[i];
437static inline CompMatr1 _getCompMatr1FromArr(qcomp in[2][2]) {
439 qcomp* rowPtrs[] = {in[0], in[1]};
444static inline CompMatr2 _getCompMatr2FromArr(qcomp in[4][4]) {
446 qcomp* rowPtrs[] = {in[0], in[1], in[2], in[3]};
562 #define getCompMatr1(...) \
563 _Generic((__VA_ARGS__), \
564 qcomp** : getCompMatr1, \
565 default : _getCompMatr1FromArr \
570 #define getCompMatr2(...) \
571 _Generic((__VA_ARGS__), \
572 qcomp** : getCompMatr2, \
573 default : _getCompMatr2FromArr \
602 #define getInlineCompMatr1(...) \
603 getCompMatr1(__VA_ARGS__)
606 #define getInlineCompMatr2(...) \
607 getCompMatr2(__VA_ARGS__)
610 #define getInlineDiagMatr1(...) \
611 getDiagMatr1(__VA_ARGS__)
614 #define getInlineDiagMatr2(...) \
615 getDiagMatr2(__VA_ARGS__)
623 #define getInlineCompMatr1(...) \
624 _getCompMatr1FromArr((qcomp[2][2]) __VA_ARGS__)
627 #define getInlineCompMatr2(...) \
628 _getCompMatr2FromArr((qcomp[4][4]) __VA_ARGS__)
631 #define getInlineDiagMatr1(...) \
632 getDiagMatr1((qcomp[2]) __VA_ARGS__)
635 #define getInlineDiagMatr2(...) \
636 getDiagMatr2((qcomp[4]) __VA_ARGS__)
884#if defined(__cplusplus)
929#elif !defined(_MSC_VER)
938 extern void _validateParamsToSetCompMatrFromArr(
CompMatr matr);
943 static inline void _setCompMatrFromArr(
CompMatr matr, qcomp arr[matr.numRows][matr.numRows]) {
944 _validateParamsToSetCompMatrFromArr(matr);
947 qcomp* ptrs[matr.numRows];
950 for (qindex r=0; r<matr.numRows; r++)
963 #define setCompMatr(matr, ...) \
964 _Generic((__VA_ARGS__), \
965 qcomp** : setCompMatr, \
966 default : _setCompMatrFromArr \
967 )((matr), (__VA_ARGS__))
1011#if defined(__cplusplus)
1054#elif !defined(_MSC_VER)
1067 extern void _validateParamsToSetInlineCompMatr(
CompMatr matr,
int numQb);
1069 extern void _validateParamsToSetInlineDiagMatr(
DiagMatr matr,
int numQb);
1071 extern void _validateParamsToSetInlineFullStateDiagMatr(
FullStateDiagMatr matr, qindex startInd, qindex numElems);
1075 static inline void _setInlineCompMatr(
CompMatr matr,
int numQb, qcomp elems[1<<numQb][1<<numQb]) {
1076 _validateParamsToSetInlineCompMatr(matr, numQb);
1077 _setCompMatrFromArr(matr, elems);
1081 static inline void _setInlineDiagMatr(
DiagMatr matr,
int numQb, qcomp elems[1<<numQb]) {
1082 _validateParamsToSetInlineDiagMatr(matr, numQb);
1087 static inline void _setInlineFullStateDiagMatr(
FullStateDiagMatr matr, qindex startInd, qindex numElems, qcomp elems[numElems]) {
1088 _validateParamsToSetInlineFullStateDiagMatr(matr, startInd, numElems);
1098 #define setInlineCompMatr(matr, numQb, ...) \
1099 _setInlineCompMatr((matr), (numQb), (qcomp[1<<(numQb)][1<<(numQb)]) __VA_ARGS__)
1102 #define setInlineDiagMatr(matr, numQb, ...) \
1103 _setInlineDiagMatr((matr), (numQb), (qcomp[1<<(numQb)]) __VA_ARGS__)
1106 #define setInlineFullStateDiagMatr(matr, startInd, numElems, ...) \
1107 _setInlineFullStateDiagMatr((matr), (startInd), (numElems), (qcomp[(numElems)]) __VA_ARGS__)
1168 extern void _validateParamsToSetInlineDiagMatr(
DiagMatr matr,
int numQb);
1170 extern void _validateParamsToSetInlineFullStateDiagMatr(
FullStateDiagMatr matr, qindex startInd, qindex numElems);
1174 #define setInlineDiagMatr(matr, numQb, ...) \
1176 _validateParamsToSetInlineDiagMatr((matr), (numQb)); \
1177 setDiagMatr((matr), (numQb), (qcomp[1<<(numQb)]) __VA_ARGS__); \
1182 #define setInlineFullStateDiagMatr(matr, startInd, numElems, ...) \
1184 _validateParamsToSetInlineFullStateDiagMatr((matr), (startInd), (numElems)); \
1185 setFullStateDiagMatr((matr), (startInd), (elems), (numElems)); \
1210#if defined(__cplusplus)
1237#elif !defined(_MSC_VER)
1248 extern void _validateParamsToCreateInlineCompMatr(
int numQb);
1250 extern void _validateParamsToCreateInlineDiagMatr(
int numQb);
1254 static inline CompMatr _createInlineCompMatr(
int numQb, qcomp elems[1<<numQb][1<<numQb]) {
1255 _validateParamsToCreateInlineCompMatr(numQb);
1257 _setCompMatrFromArr(out, elems);
1262 static inline DiagMatr _createInlineDiagMatr(
int numQb, qcomp elems[1<<numQb]) {
1263 _validateParamsToCreateInlineDiagMatr(numQb);
1271 #define createInlineCompMatr(numQb, ...) \
1272 _createInlineCompMatr((numQb), (qcomp[1<<(numQb)][1<<(numQb)]) __VA_ARGS__)
1275 #define createInlineDiagMatr(numQb, ...) \
1276 _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