8#include "quest/include/precision.h"
9#include "quest/include/paulis.h"
11#include "quest/src/core/paulilogic.hpp"
12#include "quest/src/core/validation.hpp"
13#include "quest/src/core/utilities.hpp"
14#include "quest/src/core/parser.hpp"
15#include "quest/src/core/printer.hpp"
16#include "quest/src/core/memory.hpp"
17#include "quest/src/comm/comm_config.hpp"
18#include "quest/src/comm/comm_routines.hpp"
19#include "quest/src/cpu/cpu_config.hpp"
37 ! mem_isAllocated(sum.strings) ||
38 ! mem_isAllocated(sum.coeffs) ||
39 ! mem_isAllocated(sum.isApproxHermitian) );
42 anyFail = comm_isTrueOnAllNodes(anyFail);
51 cpu_deallocPauliStrings(sum.strings);
52 cpu_deallocArray(sum.coeffs);
53 util_deallocEpsilonSensitiveHeapFlag(sum.isApproxHermitian);
57void freeAllMemoryIfAnyAllocsFailed(
PauliStrSum sum) {
60 if (!didAnyAllocsFailOnAnyNode(sum))
77 validate_newPauliStrParams(paulis, indices, numPaulis, MAX_NUM_PAULIS_PER_STR, __func__);
84 for (
int i=0; i<numPaulis; i++) {
90 if (indices[i] < MAX_NUM_PAULIS_PER_MASK)
91 lowPaulis |= pauli << (2*indices[i]);
93 highPaulis |= pauli << (2*(indices[i] - MAX_NUM_PAULIS_PER_MASK));
98 out.lowPaulis = lowPaulis;
99 out.highPaulis = highPaulis;
105 validate_newPauliStrParams(paulis, indices, numPaulis, MAX_NUM_PAULIS_PER_STR, __func__);
108 char pauliChars[MAX_NUM_PAULIS_PER_STR + 1];
112 for (
int i=0; i<numPaulis; i++)
113 pauliChars[i] =
"IXYZ"[paulis[i]];
116 pauliChars[numPaulis] =
'\0';
118 return getPauliStr(pauliChars, indices, numPaulis);
122extern "C" PauliStr _getPauliStrFromInts(
int* paulis,
int* indices,
int numPaulis) {
131 validate_newPauliStrNumChars(paulis.length(), numPaulis, __func__);
133 return getPauliStr(paulis.data(), indices, numPaulis);
139 validate_newPauliStrNumChars(paulis.length(), indices.size(), __func__);
141 return getPauliStr(paulis.data(), indices.data(), indices.size());
147 validate_newPauliStrNumPaulis(paulis.size(), MAX_NUM_PAULIS_PER_STR, __func__);
150 vector<int> indices(paulis.size());
151 for (
size_t i=0; i<paulis.size(); i++)
152 indices[i] = paulis.size() - 1 - i;
169 validate_newPauliStrSumParams(numTerms, __func__);
173 out.numTerms = numTerms;
174 out.strings = cpu_allocPauliStrings(numTerms);
175 out.coeffs = cpu_allocArray(numTerms);
176 out.isApproxHermitian = util_allocEpsilonSensitiveHeapFlag();
179 freeAllMemoryIfAnyAllocsFailed(out);
180 validate_newPauliStrSumAllocs(out, numTerms*
sizeof(
PauliStr), numTerms*
sizeof(qcomp), __func__);
183 cpu_copyPauliStrSum(out, strings, coeffs);
184 util_setFlagToUnknown(out.isApproxHermitian);
192 validate_newPauliStrSumMatchingListLens(strings.size(), coeffs.size(), __func__);
206 bool rightIsLeastSig =
true;
207 return parser_validateAndParsePauliStrSum(str, rightIsLeastSig, __func__);
218 validate_canReadFile(fn, __func__);
221 string str = parser_loadFile(fn);
223 bool rightIsLeastSig =
true;
224 return parser_validateAndParsePauliStrSum(str, rightIsLeastSig, __func__);
235 validate_canReadFile(fn, __func__);
238 string str = parser_loadFile(fn);
240 bool rightIsLeastSig =
false;
241 return parser_validateAndParsePauliStrSum(str, rightIsLeastSig, __func__);
252 validate_pauliStrSumFields(sum, __func__);
254 freePauliStrSum(sum);
268 print_elemsWithoutNewline(str, indent);
276 validate_pauliStrSumFields(sum, __func__);
277 validate_numReportedNewlinesAboveZero(__func__);
280 qindex numStrBytes = sum.numTerms *
sizeof *sum.strings;
281 qindex numCoeffBytes = sum.numTerms *
sizeof *sum.coeffs;
282 qindex numStrucBytes =
sizeof(sum);
286 qindex numTotalBytes = numStrBytes + numCoeffBytes + numStrucBytes;
288 print_header(sum, numTotalBytes);
292 print_oneFewerNewlines();
PauliStrSum createPauliStrSumFromFile(const char *fn)
PauliStrSum createPauliStrSum(PauliStr *strings, qcomp *coeffs, qindex numTerms)
PauliStrSum createInlinePauliStrSum(const char *str)
PauliStrSum createPauliStrSumFromReversedFile(const char *fn)
PauliStr getPauliStr(const char *paulis, int *indices, int numPaulis)
void destroyPauliStrSum(PauliStrSum sum)
void reportPauliStrSum(PauliStrSum sum)
void reportPauliStr(PauliStr str)
long long unsigned int PAULI_MASK_TYPE