18 #include "TargetConditionals.h"
19 #elif ENABLE_INTRINSICS
20 #include "immintrin.h"
29 #define _bi_div_mod(left, right, quotient, rmndr) \
31 *quotient = left / right; \
34 *rmndr = left % right; \
37 #define _bi_compare(left, right) \
47 #if (QBCAPPOW < 7) || ((QBCAPPOW < 8) && defined(__SIZEOF_INT128__))
73 #ifdef __SIZEOF_INT128__
92 return std::bit_width(n) - 1U;
93 #elif ENABLE_INTRINSICS && defined(_WIN32) && !defined(__CYGWIN__)
97 return (
bitLenInt)(
bitsInByte *
sizeof(
unsigned long long) - _lzcnt_u64((
unsigned long long)n) - 1U);
99 #elif ENABLE_INTRINSICS && !defined(__APPLE__)
101 return (
bitLenInt)(
bitsInByte *
sizeof(
unsigned int) - __builtin_clz((
unsigned int)n) - 1U);
103 return (
bitLenInt)(
bitsInByte *
sizeof(
unsigned long long) - __builtin_clzll((
unsigned long long)n) - 1U);
120 #elif (defined(__GNUC__) || defined(__clang__)) && !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
121 return __builtin_popcount(n);
124 for (popCount = 0
U; n; ++popCount) {
131 #if (QBCAPPOW < 7) || ((QBCAPPOW < 8) && defined(__SIZEOF_INT128__))
172 return ((start + length) > qubitCount) || ((
bitLenInt)(start + length) < start);
176 return ((start + length) > maxQPowerOcl) || ((
bitCapIntOcl)(start + length) < start);
179 const std::vector<bitLenInt>& controls,
const bitLenInt& qubitCount, std::string message)
181 std::set<bitLenInt> dupes;
182 for (
size_t i = 0
U; i < controls.size(); ++i) {
183 if (controls[i] >= qubitCount) {
184 throw std::invalid_argument(message);
187 if (dupes.find(controls[i]) == dupes.end()) {
188 dupes.insert(controls[i]);
190 throw std::invalid_argument(message +
" (Found duplicate qubit indices!)");
196 unsigned char*
cl_alloc(
size_t ucharCount);
217 ? (
real1_f)std::stof(std::string(getenv(
"QRACK_QUNIT_SEPARABILITY_THRESHOLD")))
220 ? (
real1_f)std::stof(std::string(getenv(
"QRACK_QBDT_SEPARABILITY_THRESHOLD")))
223 getenv(
"QRACK_MAX_CPU_QB") ? (
bitLenInt)std::stoi(std::string(getenv(
"QRACK_MAX_CPU_QB"))) : -1;
225 ? (
bitLenInt)std::stoi(std::string(getenv(
"QRACK_MAX_PAGE_QB")))
228 ? (
bitLenInt)std::stoi(std::string(getenv(
"QRACK_MAX_PAGING_QB")))
233 (
bitLenInt)(getenv(
"QRACK_PSTRIDEPOW") ? std::stoi(std::string(getenv(
"QRACK_PSTRIDEPOW"))) : PSTRIDEPOW);
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
void ThrowIfQbIdArrayIsBad(const std::vector< bitLenInt > &controls, const bitLenInt &qubitCount, std::string message)
Definition: qrack_functions.hpp:178
bitCapInt bitRegMask(const bitLenInt &start, const bitLenInt &length)
Definition: qrack_functions.hpp:150
void cl_free(void *toFree)
Definition: functions.cpp:49
void exp2x2(const complex *matrix2x2, complex *outMatrix2x2)
Definition: functions.cpp:198
bool isPowerOfTwo(const bitCapInt &x)
Definition: qrack_functions.hpp:162
const real1_f _qrack_qunit_sep_thresh
Definition: qrack_functions.hpp:235
const bitLenInt QRACK_MAX_PAGING_QB_DEFAULT
Definition: qrack_functions.hpp:239
int bi_log2(const bitCapInt &n)
Definition: qrack_functions.hpp:132
void mul2x2(const complex *left, const complex *right, complex *out)
Definition: functions.cpp:111
unsigned char * cl_alloc(size_t ucharCount)
Definition: functions.cpp:27
bitLenInt log2Ocl(bitCapIntOcl n)
Definition: qrack_functions.hpp:88
void U(quid sid, bitLenInt q, real1_f theta, real1_f phi, real1_f lambda)
(External API) 3-parameter unitary gate
Definition: wasm_api.cpp:1143
std::istream & operator>>(std::istream &os, QCircuitGatePtr &g)
Definition: qcircuit.cpp:38
std::complex< real1 > complex
Definition: qrack_types.hpp:128
const real1_f _qrack_qbdt_sep_thresh
Definition: qrack_functions.hpp:236
const bitLenInt PSTRIDEPOW_DEFAULT
Definition: qrack_functions.hpp:241
void log2x2(const complex *matrix2x2, complex *outMatrix2x2)
Definition: functions.cpp:200
const bitLenInt QRACK_MAX_PAGE_QB_DEFAULT
Definition: qrack_functions.hpp:238
QRACK_CONST real1 FP_NORM_EPSILON
Definition: qrack_types.hpp:258
const bitLenInt QRACK_MAX_CPU_QB_DEFAULT
Definition: qrack_functions.hpp:237
bitCapInt pushApartBits(const bitCapInt &perm, const std::vector< bitCapInt > &skipPowers)
Definition: functions.cpp:253
bitCapInt pow2(const bitLenInt &p)
Definition: qrack_functions.hpp:136
bitCapIntOcl bitRegMaskOcl(const bitLenInt &start, const bitLenInt &length)
Definition: qrack_functions.hpp:157
bitCapInt bitSlice(const bitLenInt &bit, const bitCapInt &source)
Definition: qrack_functions.hpp:145
void inv2x2(const complex *matrix2x2, complex *outMatrix2x2)
Definition: functions.cpp:202
bitLenInt popCountOcl(bitCapIntOcl n)
Definition: qrack_functions.hpp:116
bitCapInt pow2Mask(const bitLenInt &p)
Definition: qrack_functions.hpp:138
float real1_f
Definition: qrack_types.hpp:95
const bitLenInt QRACK_QRACK_QTENSORNETWORK_THRESHOLD_CPU_QB
Definition: qrack_functions.hpp:240
bitCapIntOcl intPowOcl(bitCapIntOcl base, bitCapIntOcl power)
Definition: functions.cpp:76
bool isPowerOfTwoOcl(const bitCapIntOcl &x)
Definition: qrack_functions.hpp:169
bool isOverflowSub(bitCapIntOcl inOutInt, bitCapIntOcl inInt, const bitCapIntOcl &signMask, const bitCapIntOcl &lengthPower)
Check if a subtraction with overflow sets the flag.
Definition: functions.cpp:234
bitCapInt intPow(const bitCapInt &base, const bitCapInt &power)
Definition: functions.cpp:59
std::ostream & operator<<(std::ostream &os, const QCircuitGatePtr g)
Definition: qcircuit.cpp:17
bitCapIntOcl pow2MaskOcl(const bitLenInt &p)
Definition: qrack_functions.hpp:144
bool isBadPermRange(const bitCapIntOcl &start, const bitCapIntOcl &length, const bitCapIntOcl &maxQPowerOcl)
Definition: qrack_functions.hpp:174
const bitCapInt ONE_BCI
Definition: qrack_types.hpp:129
bool isBadBitRange(const bitLenInt &start, const bitLenInt &length, const bitLenInt &qubitCount)
Definition: qrack_functions.hpp:170
bitCapIntOcl pow2Ocl(const bitLenInt &p)
Definition: qrack_functions.hpp:137
bitCapIntOcl bitSliceOcl(const bitLenInt &bit, const bitCapIntOcl &source)
Definition: qrack_functions.hpp:146
bitLenInt log2(bitCapInt n)
Definition: qrack_functions.hpp:134
bool isOverflowAdd(bitCapIntOcl inOutInt, bitCapIntOcl inInt, const bitCapIntOcl &signMask, const bitCapIntOcl &lengthPower)
Check if an addition with overflow sets the flag.
Definition: functions.cpp:212
half pow(half x, half y)
Power function.
Definition: half.hpp:3738
void bi_and_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:49
int bi_compare_1(const bitCapInt &left)
Definition: qrack_functions.hpp:64
int bi_and_1(const bitCapInt &left)
Definition: qrack_functions.hpp:60
#define _bi_div_mod(left, right, quotient, rmndr)
Definition: qrack_functions.hpp:29
void bi_xor_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:51
void bi_not_ip(bitCapInt *left)
Definition: qrack_functions.hpp:48
int bi_compare_0(const bitCapInt &left)
Definition: qrack_functions.hpp:63
int bi_compare(const bitCapInt &left, const bitCapInt &right)
Definition: qrack_functions.hpp:62
void bi_increment(bitCapInt *pBigInt, const bitCapInt &value)
Definition: qrack_functions.hpp:54
void bi_div_mod_small(const bitCapInt &left, uint32_t right, bitCapInt *quotient, uint32_t *rmndr)
Definition: qrack_functions.hpp:79
void bi_rshift_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:58
double bi_to_double(const bitCapInt &in)
Definition: qrack_functions.hpp:52
void bi_div_mod(const bitCapInt &left, const bitCapInt &right, bitCapInt *quotient, bitCapInt *rmndr)
Definition: qrack_functions.hpp:69
void bi_lshift_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:57
void bi_decrement(bitCapInt *pBigInt, const bitCapInt &value)
Definition: qrack_functions.hpp:55
void bi_add_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:66
void bi_or_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:50
#define _bi_compare(left, right)
Definition: qrack_functions.hpp:37
void bi_sub_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:67
#define bitsInByte
Definition: qrack_types.hpp:154
#define bitLenInt
Definition: qrack_types.hpp:38
#define bitCapInt
Definition: qrack_types.hpp:62
#define bitCapIntOcl
Definition: qrack_types.hpp:50