Qrack  10.0
General classical-emulating-quantum development framework
hamiltonian.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017-2023. All rights reserved.
4 //
5 // This is a multithreaded, universal quantum register simulation, allowing
6 // (nonphysical) register cloning and direct measurement of probability and
7 // phase, to leverage what advantages classical emulation of qubits can have.
8 //
9 // Licensed under the GNU Lesser General Public License V3.
10 // See LICENSE.md in the project root or https://www.gnu.org/licenses/lgpl-3.0.en.html
11 // for details.
12 #pragma once
13 
14 #include "common/qrack_types.hpp"
15 
17  unsigned target;
18  unsigned controlLen;
19  unsigned controls[32U];
20 };
21 
22 namespace Qrack {
23 
24 typedef std::shared_ptr<complex> BitOp;
25 
29 struct HamiltonianOp {
31  bool anti;
32  bool uniform;
34  std::vector<bitLenInt> controls;
35  std::vector<bool> toggles;
36 
38  : targetBit(0U)
39  , anti(false)
40  , uniform(false)
41  , matrix{ nullptr }
42  , controls()
43  , toggles()
44  {
45  }
46 
48  : targetBit(target)
49  , anti(false)
50  , uniform(false)
51  , matrix(mtrx)
52  , controls()
53  , toggles()
54  {
55  }
56 
57  HamiltonianOp(const std::vector<bitLenInt>& ctrls, bitLenInt target, BitOp mtrx, bool antiCtrled = false,
58  const std::vector<bool>& ctrlToggles = std::vector<bool>())
59  : targetBit(target)
60  , anti(antiCtrled)
61  , uniform(false)
62  , matrix(mtrx)
63  , controls(ctrls)
64  , toggles(ctrlToggles)
65  {
66  }
67 };
68 
70  UniformHamiltonianOp(const std::vector<bitLenInt>& ctrls, bitLenInt target, BitOp mtrx)
71  : HamiltonianOp(ctrls, target, mtrx)
72  {
73  uniform = true;
74  }
75 
77  : HamiltonianOp()
78  {
79  targetBit = (bitLenInt)(teoh.target);
80 
81  const bitLenInt controlLen = (bitLenInt)teoh.controlLen;
82  controls = std::vector<bitLenInt>(teoh.controls, teoh.controls + controlLen);
83 
84  uniform = true;
85 
86  bitCapIntOcl mtrxTermCount = ((bitCapIntOcl)1U << controlLen) * 4U;
87  BitOp m(new complex[mtrxTermCount], std::default_delete<complex[]>());
88  matrix = std::move(m);
89  for (bitCapIntOcl i = 0U; i < mtrxTermCount; ++i) {
90  matrix.get()[i] = complex((real1)mtrx[i * 2U], (real1)mtrx[(i * 2U) + 1U]);
91  }
92  }
93 };
94 
121 typedef std::shared_ptr<HamiltonianOp> HamiltonianOpPtr;
122 typedef std::vector<HamiltonianOpPtr> Hamiltonian;
123 } // namespace Qrack
Half-precision floating-point type.
Definition: half.hpp:2206
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
std::shared_ptr< HamiltonianOp > HamiltonianOpPtr
To define a Hamiltonian, give a vector of controlled single bit gates ("HamiltonianOp" instances) tha...
Definition: hamiltonian.hpp:121
std::shared_ptr< complex > BitOp
Definition: hamiltonian.hpp:24
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::complex< real1 > complex
Definition: qrack_types.hpp:140
std::vector< HamiltonianOpPtr > Hamiltonian
Definition: hamiltonian.hpp:122
#define bitLenInt
Definition: qrack_types.hpp:41
#define bitCapIntOcl
Definition: qrack_types.hpp:53
A Hamiltonian can be specified in terms of arbitrary controlled single bit gates, each one an "Hamilt...
Definition: hamiltonian.hpp:29
bool uniform
Definition: hamiltonian.hpp:32
std::vector< bool > toggles
Definition: hamiltonian.hpp:35
HamiltonianOp(bitLenInt target, BitOp mtrx)
Definition: hamiltonian.hpp:47
HamiltonianOp()
Definition: hamiltonian.hpp:37
std::vector< bitLenInt > controls
Definition: hamiltonian.hpp:34
bitLenInt targetBit
Definition: hamiltonian.hpp:30
BitOp matrix
Definition: hamiltonian.hpp:33
bool anti
Definition: hamiltonian.hpp:31
HamiltonianOp(const std::vector< bitLenInt > &ctrls, bitLenInt target, BitOp mtrx, bool antiCtrled=false, const std::vector< bool > &ctrlToggles=std::vector< bool >())
Definition: hamiltonian.hpp:57
Definition: hamiltonian.hpp:69
UniformHamiltonianOp(const _QrackTimeEvolveOpHeader &teoh, double *mtrx)
Definition: hamiltonian.hpp:76
UniformHamiltonianOp(const std::vector< bitLenInt > &ctrls, bitLenInt target, BitOp mtrx)
Definition: hamiltonian.hpp:70
Definition: hamiltonian.hpp:16
unsigned controlLen
Definition: hamiltonian.hpp:18
unsigned controls[32U]
Definition: hamiltonian.hpp:19
unsigned target
Definition: hamiltonian.hpp:17