The Quantum Exact Simulation Toolkit v4.1.0
Loading...
Searching...
No Matches
debug.cpp
1/** @file
2 * API definitions for debugging QuEST behaviour,
3 * controlling input validation, changing reporter
4 * parameters or seeding random generation.
5 *
6 * @author Tyson Jones
7 */
8
9#include "quest/include/types.h"
10
11#include "quest/src/core/validation.hpp"
12#include "quest/src/core/printer.hpp"
13#include "quest/src/core/utilities.hpp"
14#include "quest/src/core/randomiser.hpp"
15#include "quest/src/gpu/gpu_config.hpp"
16
17#include <vector>
18#include <limits>
19
20using std::vector;
21
22
23
24/*
25 * C AND C++ AGNOSTIC FUNCTIONS
26 */
27
28// enable invocation by both C and C++ binaries
29extern "C" {
30
31
32/*
33 * SEEDING
34 */
35
36
37void setSeeds(unsigned* seeds, int numSeeds) {
38 validate_envIsInit(__func__);
39 validate_randomSeeds(seeds, numSeeds, __func__);
40
41 // consults only root-node seeds
42 rand_setSeeds(vector<unsigned>(seeds, seeds+numSeeds));
43}
44
46 validate_envIsInit(__func__);
47
48 rand_setSeedsToDefault();
49}
50
51
53 validate_envIsInit(__func__);
54
55 return rand_getNumSeeds();
56}
57
58void getSeeds(unsigned* seeds) {
59 validate_envIsInit(__func__);
60
61 auto vec = rand_getSeeds();
62 auto num = rand_getNumSeeds();
63
64 for (int i=0; i<num; i++)
65 seeds[i] = vec[i];
66}
67
68
69
70/*
71 * VALIDATION
72 */
73
74void setInputErrorHandler(void (*callback)(const char*, const char*)) {
75 validate_envIsInit(__func__);
76
77 validateconfig_setErrorHandler(callback);
78}
79
81 validate_envIsInit(__func__);
82
83 validateconfig_enable();
84}
85
87 validate_envIsInit(__func__);
88
89 // disables all validation and computation
90 // of matrix properties like isUnitary. Also
91 // means pre-computed matrix properties are
92 // ignored. It does not however erase pre-
93 // computed properties; subsequently restoring
94 // validation will not necessitate re-eval.
95
96 validateconfig_disable();
97}
98
99
100void setValidationEpsilon(qreal eps) {
101 validate_envIsInit(__func__);
102 validate_newEpsilonValue(eps, __func__);
103
104 validateconfig_setEpsilon(eps);
105 util_setEpsilonSensitiveHeapFlagsToUnknown();
106}
107
109 validate_envIsInit(__func__);
110
111 validateconfig_setEpsilonToDefault();
112 util_setEpsilonSensitiveHeapFlagsToUnknown();
113}
114
116 validate_envIsInit(__func__);
117
118 return validateconfig_getEpsilon();
119}
120
121
122
123/*
124 * REPORTER CONFIGURATION
125 */
126
127
128void setMaxNumReportedItems(qindex numRows, qindex numCols) {
129 validate_envIsInit(__func__);
130 validate_newMaxNumReportedScalars(numRows, numCols, __func__);
131
132 // replace 0 values (indicating no truncation) with max-val,
133 // since there can never be max(qindex)-many amps
134 qindex max = std::numeric_limits<qindex>::max();
135 numRows = (numRows == 0)? max : numRows;
136 numCols = (numCols == 0)? max : numCols;
137
138 printer_setMaxNumPrintedScalars(numRows, numCols);
139}
140
141
142void setMaxNumReportedSigFigs(int numSigFigs) {
143 validate_envIsInit(__func__);
144 validate_newMaxNumReportedSigFigs(numSigFigs, __func__);
145
146 printer_setMaxNumPrintedSigFig(numSigFigs);
147}
148
149
150void setNumReportedNewlines(int numNewlines) {
151 validate_envIsInit(__func__);
152 validate_newNumReportedNewlines(numNewlines, __func__);
153
154 printer_setNumTrailingNewlines(numNewlines);
155}
156
157
158void setReportedPauliChars(const char* paulis) {
159 validate_envIsInit(__func__);
160 validate_numPauliChars(paulis, __func__);
161
162 printer_setPauliChars(paulis);
163}
164
165
167 validate_envIsInit(__func__);
168 validate_reportedPauliStrStyleFlag(flag, __func__);
169
170 printer_setPauliStrFormat(flag);
171}
172
173
174
175/*
176 * GPU CACHE
177 */
178
179
181 validate_envIsInit(__func__);
182
183 if (getQuESTEnv().isGpuAccelerated)
184 return gpu_getCacheMemoryInBytes();
185
186 // safely returns 0 if not GPU accelerated
187 return 0;
188}
189
190
192 validate_envIsInit(__func__);
193
194 // safely do nothing if not GPU accelerated
195 if (getQuESTEnv().isGpuAccelerated)
196 gpu_clearCache();
197}
198
199
200} // end de-name mangler
201
202
203
204/*
205 * C++ OVERLOADS
206 */
207
208
209void setSeeds(vector<unsigned> seeds) {
210 setSeeds(seeds.data(), seeds.size());
211}
212
213vector<unsigned> getSeeds() {
214 validate_envIsInit(__func__);
215
216 // allocate temp vector, and pedantically validate successful
217 vector<unsigned> out;
218 int numSeeds = getNumSeeds();
219 auto callback = [&]() { validate_tempAllocSucceeded(false, numSeeds, sizeof(unsigned), __func__); };
220 util_tryAllocVector(out, numSeeds, callback);
221
222 getSeeds(out.data());
223 return out;
224}
qindex getGpuCacheSize()
Definition debug.cpp:180
void clearGpuCache()
Definition debug.cpp:191
void setMaxNumReportedItems(qindex numRows, qindex numCols)
Definition debug.cpp:128
void setReportedPauliStrStyle(int flag)
Definition debug.cpp:166
void setMaxNumReportedSigFigs(int numSigFigs)
Definition debug.cpp:142
void setNumReportedNewlines(int numNewlines)
Definition debug.cpp:150
void setReportedPauliChars(const char *paulis)
Definition debug.cpp:158
vector< unsigned > getSeeds()
Definition debug.cpp:213
void setSeedsToDefault()
Definition debug.cpp:45
int getNumSeeds()
Definition debug.cpp:52
void setSeeds(unsigned *seeds, int numSeeds)
Definition debug.cpp:37
void setInputErrorHandler(void(*callback)(const char *, const char *))
Definition debug.cpp:74
void setValidationOff()
Definition debug.cpp:86
void setValidationEpsilonToDefault()
Definition debug.cpp:108
void setValidationOn()
Definition debug.cpp:80
qreal getValidationEpsilon()
Definition debug.cpp:115
void setValidationEpsilon(qreal eps)
Definition debug.cpp:100
QuESTEnv getQuESTEnv()