Qrack  9.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 
27 struct HamiltonianOp {
29  bool anti;
30  bool uniform;
32  std::vector<bitLenInt> controls;
33  std::vector<bool> toggles;
34 
36  : targetBit(0U)
37  , anti(false)
38  , uniform(false)
39  , matrix(NULL)
40  , controls()
41  , toggles()
42  {
43  }
44 
46  : targetBit(target)
47  , anti(false)
48  , uniform(false)
49  , matrix(mtrx)
50  , controls()
51  , toggles()
52  {
53  }
54 
55  HamiltonianOp(const std::vector<bitLenInt>& ctrls, bitLenInt target, BitOp mtrx, bool antiCtrled = false,
56  const std::vector<bool>& ctrlToggles = std::vector<bool>())
57  : targetBit(target)
58  , anti(antiCtrled)
59  , uniform(false)
60  , matrix(mtrx)
61  , controls(ctrls)
62  , toggles(ctrlToggles)
63  {
64  }
65 };
66 
68  UniformHamiltonianOp(const std::vector<bitLenInt>& ctrls, bitLenInt target, BitOp mtrx)
69  : HamiltonianOp(ctrls, target, mtrx)
70  {
71  uniform = true;
72  }
73 
75  : HamiltonianOp()
76  {
77  targetBit = (bitLenInt)(teoh.target);
78 
79  const bitLenInt controlLen = (bitLenInt)teoh.controlLen;
80  controls = std::vector<bitLenInt>(controlLen);
81  std::copy(teoh.controls, teoh.controls + controlLen, controls.begin());
82 
83  uniform = true;
84 
85  bitCapIntOcl mtrxTermCount = ((bitCapIntOcl)ONE_BCI << controlLen) * 4U;
86  BitOp m(new complex[mtrxTermCount], std::default_delete<complex[]>());
87  matrix = std::move(m);
88  for (bitCapIntOcl i = 0U; i < mtrxTermCount; ++i) {
89  matrix.get()[i] = complex((real1)mtrx[i * 2U], (real1)mtrx[(i * 2U) + 1U]);
90  }
91  }
92 };
93 
120 typedef std::shared_ptr<HamiltonianOp> HamiltonianOpPtr;
121 typedef std::vector<HamiltonianOpPtr> Hamiltonian;
122 } // namespace Qrack
Half-precision floating-point type.
Definition: half.hpp:2222
Definition: complex16x2simd.hpp:25
constexpr uint8_t ONE_BCI
Definition: qrack_types.hpp:90
std::complex< half_float::half > complex
Definition: qrack_types.hpp:62
std::shared_ptr< HamiltonianOp > HamiltonianOpPtr
To define a Hamiltonian, give a vector of controlled single bit gates ("HamiltonianOp" instances) tha...
Definition: hamiltonian.hpp:120
std::shared_ptr< complex > BitOp
Definition: qrack_types.hpp:123
std::vector< HamiltonianOpPtr > Hamiltonian
Definition: hamiltonian.hpp:121
MICROSOFT_QUANTUM_DECL void U(_In_ uintq sid, _In_ uintq q, _In_ double theta, _In_ double phi, _In_ double lambda)
(External API) 3-parameter unitary gate
Definition: pinvoke_api.cpp:1362
#define bitLenInt
Definition: qrack_types.hpp:44
#define bitCapIntOcl
Definition: qrack_types.hpp:91
A Hamiltonian can be specified in terms of arbitrary controlled single bit gates, each one an "Hamilt...
Definition: hamiltonian.hpp:27
bool uniform
Definition: hamiltonian.hpp:30
std::vector< bool > toggles
Definition: hamiltonian.hpp:33
HamiltonianOp(bitLenInt target, BitOp mtrx)
Definition: hamiltonian.hpp:45
HamiltonianOp()
Definition: hamiltonian.hpp:35
std::vector< bitLenInt > controls
Definition: hamiltonian.hpp:32
bitLenInt targetBit
Definition: hamiltonian.hpp:28
BitOp matrix
Definition: hamiltonian.hpp:31
bool anti
Definition: hamiltonian.hpp:29
HamiltonianOp(const std::vector< bitLenInt > &ctrls, bitLenInt target, BitOp mtrx, bool antiCtrled=false, const std::vector< bool > &ctrlToggles=std::vector< bool >())
Definition: hamiltonian.hpp:55
Definition: hamiltonian.hpp:67
UniformHamiltonianOp(const _QrackTimeEvolveOpHeader &teoh, double *mtrx)
Definition: hamiltonian.hpp:74
UniformHamiltonianOp(const std::vector< bitLenInt > &ctrls, bitLenInt target, BitOp mtrx)
Definition: hamiltonian.hpp:68
Definition: hamiltonian.hpp:16
unsigned controlLen
Definition: hamiltonian.hpp:18
unsigned controls[32U]
Definition: hamiltonian.hpp:19
unsigned target
Definition: hamiltonian.hpp:17