The Quantum Exact Simulation Toolkit v4.0.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
158
159/*
160 * GPU CACHE
161 */
162
163
165 validate_envIsInit(__func__);
166
167 if (getQuESTEnv().isGpuAccelerated)
168 return gpu_getCacheMemoryInBytes();
169
170 // safely returns 0 if not GPU accelerated
171 return 0;
172}
173
174
176 validate_envIsInit(__func__);
177
178 // safely do nothing if not GPU accelerated
179 if (getQuESTEnv().isGpuAccelerated)
180 gpu_clearCache();
181}
182
183
184} // end de-name mangler
185
186
187
188/*
189 * C++ OVERLOADS
190 */
191
192
193void setSeeds(vector<unsigned> seeds) {
194 setSeeds(seeds.data(), seeds.size());
195}
196
197vector<unsigned> getSeeds() {
198 validate_envIsInit(__func__);
199
200 // allocate temp vector, and pedantically validate successful
201 vector<unsigned> out;
202 int numSeeds = getNumSeeds();
203 auto callback = [&]() { validate_tempAllocSucceeded(false, numSeeds, sizeof(unsigned), __func__); };
204 util_tryAllocVector(out, numSeeds, callback);
205
206 getSeeds(out.data());
207 return out;
208}
qindex getGpuCacheSize()
Definition debug.cpp:164
void clearGpuCache()
Definition debug.cpp:175
void setMaxNumReportedItems(qindex numRows, qindex numCols)
Definition debug.cpp:128
void setMaxNumReportedSigFigs(int numSigFigs)
Definition debug.cpp:142
void setNumReportedNewlines(int numNewlines)
Definition debug.cpp:150
vector< unsigned > getSeeds()
Definition debug.cpp:197
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()