18 #include "TargetConditionals.h"
19 #elif ENABLE_INTRINSICS
20 #include "immintrin.h"
29 #define _bi_compare(left, right) \
39 #if (QBCAPPOW < 7) || ((QBCAPPOW < 8) && defined(__SIZEOF_INT128__)) || ((QBCAPPOW > 7) && defined(BOOST_AVAILABLE))
64 *quotient = left / right;
67 *rmndr = left % right;
70 #ifdef __SIZEOF_INT128__
74 *quotient = left / right;
77 *rmndr = (uint64_t)(left % right);
84 *quotient = left / right;
87 *rmndr = (uint32_t)(left % right);
99 return std::bit_width(n) - 1U;
100 #elif ENABLE_INTRINSICS && defined(_WIN32) && !defined(__CYGWIN__)
104 return (
bitLenInt)(
bitsInByte *
sizeof(
unsigned long long) - _lzcnt_u64((
unsigned long long)n) - 1U);
106 #elif ENABLE_INTRINSICS && !defined(__APPLE__)
108 return (
bitLenInt)(
bitsInByte *
sizeof(
unsigned int) - __builtin_clz((
unsigned int)n) - 1U);
110 return (
bitLenInt)(
bitsInByte *
sizeof(
unsigned long long) - __builtin_clzll((
unsigned long long)n) - 1U);
127 #elif (defined(__GNUC__) || defined(__clang__)) && !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
128 return __builtin_popcount(n);
131 for (popCount = 0
U; n; ++popCount) {
138 #if (QBCAPPOW < 7) || ((QBCAPPOW < 8) && defined(__SIZEOF_INT128__)) || ((QBCAPPOW > 7) && defined(BOOST_AVAILABLE))
179 return ((start + length) > qubitCount) || ((
bitLenInt)(start + length) < start);
183 return ((start + length) > maxQPowerOcl) || ((
bitCapIntOcl)(start + length) < start);
186 const std::vector<bitLenInt>& controls,
const bitLenInt& qubitCount, std::string message)
188 std::set<bitLenInt> dupes;
189 for (
const bitLenInt& control : controls) {
190 if (control >= qubitCount) {
191 throw std::invalid_argument(message);
194 if (dupes.find(control) == dupes.end()) {
195 dupes.insert(control);
197 throw std::invalid_argument(message +
" (Found duplicate qubit indices!)");
203 unsigned char*
cl_alloc(
size_t ucharCount);
224 ? (
real1_f)std::stof(std::string(getenv(
"QRACK_QUNIT_SEPARABILITY_THRESHOLD")))
227 ? (
real1_f)std::stof(std::string(getenv(
"QRACK_QBDT_SEPARABILITY_THRESHOLD")))
230 getenv(
"QRACK_MAX_CPU_QB") ? (
bitLenInt)std::stoi(std::string(getenv(
"QRACK_MAX_CPU_QB"))) : -1;
232 ? (
bitLenInt)std::stoi(std::string(getenv(
"QRACK_MAX_PAGE_QB")))
235 ? (
bitLenInt)std::stoi(std::string(getenv(
"QRACK_MAX_PAGING_QB")))
240 (
bitLenInt)(getenv(
"QRACK_PSTRIDEPOW") ? std::stoi(std::string(getenv(
"QRACK_PSTRIDEPOW"))) : PSTRIDEPOW);
242 (size_t)(getenv(
"QRACK_QBDT_MAX_ALLOC_MB") ? std::stoi(std::string(getenv(
"QRACK_QBDT_MAX_ALLOC_MB"))) : -1);
244 (size_t)(getenv(
"QRACK_SPARSE_MAX_ALLOC_MB") ? std::stoi(std::string(getenv(
"QRACK_SPARSE_MAX_ALLOC_MB"))) : -1);
246 ? (
real1_f)std::stof(std::string(getenv(
"QRACK_SPARSE_TRUNCATION_THRESHOLD")))
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:185
bitCapInt bitRegMask(const bitLenInt &start, const bitLenInt &length)
Definition: qrack_functions.hpp:157
void cl_free(void *toFree)
Definition: functions.cpp:49
void exp2x2(const complex *matrix2x2, complex *outMatrix2x2)
Definition: functions.cpp:200
bool isPowerOfTwo(const bitCapInt &x)
Definition: qrack_functions.hpp:169
const real1_f _qrack_qunit_sep_thresh
Definition: qrack_functions.hpp:249
const bitLenInt QRACK_MAX_PAGING_QB_DEFAULT
Definition: qrack_functions.hpp:253
int bi_log2(const bitCapInt &n)
Definition: qrack_functions.hpp:139
void mul2x2(const complex *left, const complex *right, complex *out)
Definition: functions.cpp:113
unsigned char * cl_alloc(size_t ucharCount)
Definition: functions.cpp:27
bitLenInt log2Ocl(bitCapIntOcl n)
Definition: qrack_functions.hpp:95
const size_t QRACK_SPARSE_MAX_KEYS
Definition: qrack_functions.hpp:262
const size_t QRACK_QBDT_MAX_ALLOC_BYTES_DEFAULT
Definition: qrack_functions.hpp:260
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:1199
std::istream & operator>>(std::istream &os, QCircuitGatePtr &g)
Definition: qcircuit.cpp:38
std::complex< real1 > complex
Definition: qrack_types.hpp:136
const real1_f _qrack_qbdt_sep_thresh
Definition: qrack_functions.hpp:250
const bitLenInt PSTRIDEPOW_DEFAULT
Definition: qrack_functions.hpp:255
void log2x2(const complex *matrix2x2, complex *outMatrix2x2)
Definition: functions.cpp:202
const real1_f _qrack_sparse_thresh
Definition: qrack_functions.hpp:258
const bitLenInt QRACK_MAX_PAGE_QB_DEFAULT
Definition: qrack_functions.hpp:252
QRACK_CONST real1 FP_NORM_EPSILON
Definition: qrack_types.hpp:268
const bitLenInt QRACK_MAX_CPU_QB_DEFAULT
Definition: qrack_functions.hpp:251
bitCapInt pushApartBits(const bitCapInt &perm, const std::vector< bitCapInt > &skipPowers)
Definition: functions.cpp:260
bitCapInt pow2(const bitLenInt &p)
Definition: qrack_functions.hpp:143
constexpr size_t SPARSE_KEY_BYTES
Definition: qrack_types.hpp:260
bitCapIntOcl bitRegMaskOcl(const bitLenInt &start, const bitLenInt &length)
Definition: qrack_functions.hpp:164
QRACK_CONST real1 REAL1_EPSILON
Definition: qrack_types.hpp:208
bitCapInt bitSlice(const bitLenInt &bit, const bitCapInt &source)
Definition: qrack_functions.hpp:152
void inv2x2(const complex *matrix2x2, complex *outMatrix2x2)
Definition: functions.cpp:204
bitLenInt popCountOcl(bitCapIntOcl n)
Definition: qrack_functions.hpp:123
bitCapInt pow2Mask(const bitLenInt &p)
Definition: qrack_functions.hpp:145
float real1_f
Definition: qrack_types.hpp:103
const bitLenInt QRACK_QRACK_QTENSORNETWORK_THRESHOLD_CPU_QB
Definition: qrack_functions.hpp:254
bitCapIntOcl intPowOcl(bitCapIntOcl base, bitCapIntOcl power)
Definition: functions.cpp:77
bool isPowerOfTwoOcl(const bitCapIntOcl &x)
Definition: qrack_functions.hpp:176
const size_t QRACK_SPARSE_MAX_ALLOC_MB_DEFAULT
Definition: qrack_functions.hpp:257
bool isOverflowSub(bitCapIntOcl inOutInt, bitCapIntOcl inInt, const bitCapIntOcl &signMask, const bitCapIntOcl &lengthPower)
Check if a subtraction with overflow sets the flag.
Definition: functions.cpp:237
const size_t QRACK_SPARSE_MAX_ALLOC_BYTES_DEFAULT
Definition: qrack_functions.hpp:261
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
const size_t QRACK_QBDT_MAX_ALLOC_MB_DEFAULT
Definition: qrack_functions.hpp:256
bitCapIntOcl pow2MaskOcl(const bitLenInt &p)
Definition: qrack_functions.hpp:151
bool isBadPermRange(const bitCapIntOcl &start, const bitCapIntOcl &length, const bitCapIntOcl &maxQPowerOcl)
Definition: qrack_functions.hpp:181
const bitCapInt ONE_BCI
Definition: qrack_types.hpp:137
bool isBadBitRange(const bitLenInt &start, const bitLenInt &length, const bitLenInt &qubitCount)
Definition: qrack_functions.hpp:177
bitCapIntOcl pow2Ocl(const bitLenInt &p)
Definition: qrack_functions.hpp:144
bitCapIntOcl bitSliceOcl(const bitLenInt &bit, const bitCapIntOcl &source)
Definition: qrack_functions.hpp:153
bitLenInt log2(bitCapInt n)
Definition: qrack_functions.hpp:141
bool isOverflowAdd(bitCapIntOcl inOutInt, bitCapIntOcl inInt, const bitCapIntOcl &signMask, const bitCapIntOcl &lengthPower)
Check if an addition with overflow sets the flag.
Definition: functions.cpp:214
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:41
int bi_compare_1(const bitCapInt &left)
Definition: qrack_functions.hpp:56
int bi_and_1(const bitCapInt &left)
Definition: qrack_functions.hpp:52
void bi_xor_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:43
void bi_not_ip(bitCapInt *left)
Definition: qrack_functions.hpp:40
int bi_compare_0(const bitCapInt &left)
Definition: qrack_functions.hpp:55
int bi_compare(const bitCapInt &left, const bitCapInt &right)
Definition: qrack_functions.hpp:54
void bi_increment(bitCapInt *pBigInt, const bitCapInt &value)
Definition: qrack_functions.hpp:46
void bi_div_mod_small(const bitCapInt &left, uint32_t right, bitCapInt *quotient, uint32_t *rmndr)
Definition: qrack_functions.hpp:81
double bi_to_double(const bitCapInt &in)
Definition: qrack_functions.hpp:44
void bi_div_mod(const bitCapInt &left, const bitCapInt &right, bitCapInt *quotient, bitCapInt *rmndr)
Definition: qrack_functions.hpp:61
void bi_rshift_ip(bitCapInt *left, const size_t &right)
Definition: qrack_functions.hpp:50
void bi_decrement(bitCapInt *pBigInt, const bitCapInt &value)
Definition: qrack_functions.hpp:47
void bi_add_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:58
void bi_or_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:42
#define _bi_compare(left, right)
Definition: qrack_functions.hpp:29
void bi_sub_ip(bitCapInt *left, const bitCapInt &right)
Definition: qrack_functions.hpp:59
void bi_lshift_ip(bitCapInt *left, const size_t &right)
Definition: qrack_functions.hpp:49
#define bitsInByte
Definition: qrack_types.hpp:162
#define bitLenInt
Definition: qrack_types.hpp:42
#define bitCapInt
Definition: qrack_types.hpp:66
#define bitCapIntOcl
Definition: qrack_types.hpp:54