Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuTensorChainSimulator.h
Go to the documentation of this file.
1#pragma once
2#if defined(INCLUDED_BY_FACTORY) && defined(__linux__)
5
7{
8class GpuTensorChainSimulator : public TensorChainRouting<ImmediateGpuSimulator>
9{
10 protected:
11 explicit GpuTensorChainSimulator(bool isOperatorChain) : TensorChainRouting(isOperatorChain)
12 {
13 }
14
15 using MeetingPositionCallback = int64_t (*)(void *, const int64_t *);
16
17 virtual MeetingPositionCallback GetMeetingPositionCallback() const
18 {
19 return &FindBestMeetingPosition;
20 }
21
22 static int64_t FindBestMeetingPosition(void *thisPtr, const int64_t *bonds) noexcept
23 {
24 auto *self = static_cast<GpuTensorChainSimulator *>(thisPtr);
25 try
26 {
27 return self->PlanMeetingPosition(bonds, self->nrQubits ? self->nrQubits - 1 : 0);
28 }
29 catch (...)
30 {
31 self->InvalidateDummyHistory();
32 return -1;
33 }
34 }
35
36 static void BondDimCallback(void *thisPtr, const int64_t *bondDims)
37 {
38 GpuTensorChainSimulator *self = static_cast<GpuTensorChainSimulator *>(thisPtr);
39 return self->BondDimCallbackFunc(bondDims);
40 }
41
42 static void BondSummaryCallback(void *thisPtr, int64_t maximum)
43 {
44 auto *self = static_cast<GpuTensorChainSimulator *>(thisPtr);
45 if (maximum > 0)
46 self->curMaxBondDim = std::max(self->curMaxBondDim, static_cast<size_t>(maximum));
47 }
48
49 void BondDimCallbackFunc(const int64_t *bondDims)
50 {
51 if (bondDims)
52 {
53 const size_t nQ = GetNumberOfQubits();
54 for (int i = 0; i < static_cast<int>(nQ) - 1; ++i)
55 if (static_cast<size_t>(bondDims[i]) > curMaxBondDim)
56 curMaxBondDim = static_cast<size_t>(bondDims[i]);
57 }
58 }
59};
60} // namespace Simulators::Private
61#endif
unsigned long int GetNumberOfQubits(void *sim)