Maestro 0.1.0
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuSimulator.h
Go to the documentation of this file.
1
13#pragma once
14
15#ifndef _GPUSIMULATOR_H
16#define _GPUSIMULATOR_H
17
18#ifdef INCLUDED_BY_FACTORY
19
20#ifdef __linux__
21
22#include "GpuState.h"
23
24namespace Simulators {
25// TODO: Maybe use the pimpl idiom
26// https://en.cppreference.com/w/cpp/language/pimpl to hide the implementation
27// for good but during development this should be good enough
28namespace Private {
29
41class GpuSimulator : public GpuState {
42 public:
43 GpuSimulator() = default;
44 // allow no copy or assignment
45 GpuSimulator(const GpuSimulator &) = delete;
46 GpuSimulator &operator=(const GpuSimulator &) = delete;
47
48 // but allow moving
49 GpuSimulator(GpuSimulator &&other) = default;
50 GpuSimulator &operator=(GpuSimulator &&other) = default;
51
59 void ApplyP(Types::qubit_t qubit, double lambda) override {
60 if (GetSimulationType() == SimulationType::kStatevector)
61 state->ApplyP(qubit, lambda);
62 else if (GetSimulationType() == SimulationType::kMatrixProductState)
63 mps->ApplyP(qubit, lambda);
64 else if (GetSimulationType() == SimulationType::kTensorNetwork)
65 tn->ApplyP(qubit, lambda);
66 else if (GetSimulationType() == SimulationType::kPauliPropagator)
67 pp->ApplyP(qubit, lambda);
68
69 NotifyObservers({qubit});
70 }
71
78 void ApplyX(Types::qubit_t qubit) override {
79 if (GetSimulationType() == SimulationType::kStatevector)
80 state->ApplyX(qubit);
81 else if (GetSimulationType() == SimulationType::kMatrixProductState)
82 mps->ApplyX(qubit);
83 else if (GetSimulationType() == SimulationType::kTensorNetwork)
84 tn->ApplyX(qubit);
85 else if (GetSimulationType() == SimulationType::kPauliPropagator)
86 pp->ApplyX(qubit);
87
88 NotifyObservers({qubit});
89 }
90
97 void ApplyY(Types::qubit_t qubit) override {
98 if (GetSimulationType() == SimulationType::kStatevector)
99 state->ApplyY(qubit);
100 else if (GetSimulationType() == SimulationType::kMatrixProductState)
101 mps->ApplyY(qubit);
102 else if (GetSimulationType() == SimulationType::kTensorNetwork)
103 tn->ApplyY(qubit);
104 else if (GetSimulationType() == SimulationType::kPauliPropagator)
105 pp->ApplyY(qubit);
106
107 NotifyObservers({qubit});
108 }
109
116 void ApplyZ(Types::qubit_t qubit) override {
117 if (GetSimulationType() == SimulationType::kStatevector)
118 state->ApplyZ(qubit);
119 else if (GetSimulationType() == SimulationType::kMatrixProductState)
120 mps->ApplyZ(qubit);
121 else if (GetSimulationType() == SimulationType::kTensorNetwork)
122 tn->ApplyZ(qubit);
123 else if (GetSimulationType() == SimulationType::kPauliPropagator)
124 pp->ApplyZ(qubit);
125
126 NotifyObservers({qubit});
127 }
128
135 void ApplyH(Types::qubit_t qubit) override {
136 if (GetSimulationType() == SimulationType::kStatevector)
137 state->ApplyH(qubit);
138 else if (GetSimulationType() == SimulationType::kMatrixProductState)
139 mps->ApplyH(qubit);
140 else if (GetSimulationType() == SimulationType::kTensorNetwork)
141 tn->ApplyH(qubit);
142 else if (GetSimulationType() == SimulationType::kPauliPropagator)
143 pp->ApplyH(qubit);
144
145 NotifyObservers({qubit});
146 }
147
154 void ApplyS(Types::qubit_t qubit) override {
155 if (GetSimulationType() == SimulationType::kStatevector)
156 state->ApplyS(qubit);
157 else if (GetSimulationType() == SimulationType::kMatrixProductState)
158 mps->ApplyS(qubit);
159 else if (GetSimulationType() == SimulationType::kTensorNetwork)
160 tn->ApplyS(qubit);
161 else if (GetSimulationType() == SimulationType::kPauliPropagator)
162 pp->ApplyS(qubit);
163
164 NotifyObservers({qubit});
165 }
166
173 void ApplySDG(Types::qubit_t qubit) override {
174 if (GetSimulationType() == SimulationType::kStatevector)
175 state->ApplySDG(qubit);
176 else if (GetSimulationType() == SimulationType::kMatrixProductState)
177 mps->ApplySDG(qubit);
178 else if (GetSimulationType() == SimulationType::kTensorNetwork)
179 tn->ApplySDG(qubit);
180 else if (GetSimulationType() == SimulationType::kPauliPropagator)
181 pp->ApplySDG(qubit);
182
183 NotifyObservers({qubit});
184 }
185
192 void ApplyT(Types::qubit_t qubit) override {
193 if (GetSimulationType() == SimulationType::kStatevector)
194 state->ApplyT(qubit);
195 else if (GetSimulationType() == SimulationType::kMatrixProductState)
196 mps->ApplyT(qubit);
197 else if (GetSimulationType() == SimulationType::kTensorNetwork)
198 tn->ApplyT(qubit);
199 else if (GetSimulationType() == SimulationType::kPauliPropagator)
200 pp->ApplyT(qubit);
201
202 NotifyObservers({qubit});
203 }
204
211 void ApplyTDG(Types::qubit_t qubit) override {
212 if (GetSimulationType() == SimulationType::kStatevector)
213 state->ApplyTDG(qubit);
214 else if (GetSimulationType() == SimulationType::kMatrixProductState)
215 mps->ApplyTDG(qubit);
216 else if (GetSimulationType() == SimulationType::kTensorNetwork)
217 tn->ApplyTDG(qubit);
218 else if (GetSimulationType() == SimulationType::kPauliPropagator)
219 pp->ApplyTDG(qubit);
220
221 NotifyObservers({qubit});
222 }
223
230 void ApplySx(Types::qubit_t qubit) override {
231 if (GetSimulationType() == SimulationType::kStatevector)
232 state->ApplySX(qubit);
233 else if (GetSimulationType() == SimulationType::kMatrixProductState)
234 mps->ApplySX(qubit);
235 else if (GetSimulationType() == SimulationType::kTensorNetwork)
236 tn->ApplySX(qubit);
237 else if (GetSimulationType() == SimulationType::kPauliPropagator)
238 pp->ApplySQRTX(qubit);
239
240 NotifyObservers({qubit});
241 }
242
249 void ApplySxDAG(Types::qubit_t qubit) override {
250 if (GetSimulationType() == SimulationType::kStatevector)
251 state->ApplySXDG(qubit);
252 else if (GetSimulationType() == SimulationType::kMatrixProductState)
253 mps->ApplySXDG(qubit);
254 else if (GetSimulationType() == SimulationType::kTensorNetwork)
255 tn->ApplySXDG(qubit);
256 else if (GetSimulationType() == SimulationType::kPauliPropagator)
257 pp->ApplySxDAG(qubit);
258
259 NotifyObservers({qubit});
260 }
261
268 void ApplyK(Types::qubit_t qubit) override {
269 if (GetSimulationType() == SimulationType::kStatevector)
270 state->ApplyK(qubit);
271 else if (GetSimulationType() == SimulationType::kMatrixProductState)
272 mps->ApplyK(qubit);
273 else if (GetSimulationType() == SimulationType::kTensorNetwork)
274 tn->ApplyK(qubit);
275 else if (GetSimulationType() == SimulationType::kPauliPropagator)
276 pp->ApplyK(qubit);
277
278 NotifyObservers({qubit});
279 }
280
288 void ApplyRx(Types::qubit_t qubit, double theta) override {
289 if (GetSimulationType() == SimulationType::kStatevector)
290 state->ApplyRx(qubit, theta);
291 else if (GetSimulationType() == SimulationType::kMatrixProductState)
292 mps->ApplyRx(qubit, theta);
293 else if (GetSimulationType() == SimulationType::kTensorNetwork)
294 tn->ApplyRx(qubit, theta);
295 else if (GetSimulationType() == SimulationType::kPauliPropagator)
296 pp->ApplyRX(qubit, theta);
297
298 NotifyObservers({qubit});
299 }
300
308 void ApplyRy(Types::qubit_t qubit, double theta) override {
309 if (GetSimulationType() == SimulationType::kStatevector)
310 state->ApplyRy(qubit, theta);
311 else if (GetSimulationType() == SimulationType::kMatrixProductState)
312 mps->ApplyRy(qubit, theta);
313 else if (GetSimulationType() == SimulationType::kTensorNetwork)
314 tn->ApplyRy(qubit, theta);
315 else if (GetSimulationType() == SimulationType::kPauliPropagator)
316 pp->ApplyRY(qubit, theta);
317
318 NotifyObservers({qubit});
319 }
320
328 void ApplyRz(Types::qubit_t qubit, double theta) override {
329 if (GetSimulationType() == SimulationType::kStatevector)
330 state->ApplyRz(qubit, theta);
331 else if (GetSimulationType() == SimulationType::kMatrixProductState)
332 mps->ApplyRz(qubit, theta);
333 else if (GetSimulationType() == SimulationType::kTensorNetwork)
334 tn->ApplyRz(qubit, theta);
335 else if (GetSimulationType() == SimulationType::kPauliPropagator)
336 pp->ApplyRZ(qubit, theta);
337
338 NotifyObservers({qubit});
339 }
340
348 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda,
349 double gamma) override {
350 if (GetSimulationType() == SimulationType::kStatevector)
351 state->ApplyU(qubit, theta, phi, lambda, gamma);
352 else if (GetSimulationType() == SimulationType::kMatrixProductState)
353 mps->ApplyU(qubit, theta, phi, lambda, gamma);
354 else if (GetSimulationType() == SimulationType::kTensorNetwork)
355 tn->ApplyU(qubit, theta, phi, lambda, gamma);
356 else if (GetSimulationType() == SimulationType::kPauliPropagator)
357 pp->ApplyU(qubit, theta, phi, lambda, gamma);
358
359 NotifyObservers({qubit});
360 }
361
369 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
370 if (GetSimulationType() == SimulationType::kStatevector)
371 state->ApplyCX(ctrl_qubit, tgt_qubit);
372 else if (GetSimulationType() == SimulationType::kMatrixProductState)
373 mps->ApplyCX(ctrl_qubit, tgt_qubit);
374 else if (GetSimulationType() == SimulationType::kTensorNetwork)
375 tn->ApplyCX(ctrl_qubit, tgt_qubit);
376 else if (GetSimulationType() == SimulationType::kPauliPropagator)
377 pp->ApplyCX(ctrl_qubit, tgt_qubit);
378
379 NotifyObservers({tgt_qubit, ctrl_qubit});
380 }
381
389 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
390 if (GetSimulationType() == SimulationType::kStatevector)
391 state->ApplyCY(ctrl_qubit, tgt_qubit);
392 else if (GetSimulationType() == SimulationType::kMatrixProductState)
393 mps->ApplyCY(ctrl_qubit, tgt_qubit);
394 else if (GetSimulationType() == SimulationType::kTensorNetwork)
395 tn->ApplyCY(ctrl_qubit, tgt_qubit);
396 else if (GetSimulationType() == SimulationType::kPauliPropagator)
397 pp->ApplyCY(ctrl_qubit, tgt_qubit);
398
399 NotifyObservers({tgt_qubit, ctrl_qubit});
400 }
401
409 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
410 if (GetSimulationType() == SimulationType::kStatevector)
411 state->ApplyCZ(ctrl_qubit, tgt_qubit);
412 else if (GetSimulationType() == SimulationType::kMatrixProductState)
413 mps->ApplyCZ(ctrl_qubit, tgt_qubit);
414 else if (GetSimulationType() == SimulationType::kTensorNetwork)
415 tn->ApplyCZ(ctrl_qubit, tgt_qubit);
416 else if (GetSimulationType() == SimulationType::kPauliPropagator)
417 pp->ApplyCZ(ctrl_qubit, tgt_qubit);
418
419 NotifyObservers({tgt_qubit, ctrl_qubit});
420 }
421
430 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
431 double lambda) override {
432 if (GetSimulationType() == SimulationType::kStatevector)
433 state->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
434 else if (GetSimulationType() == SimulationType::kMatrixProductState)
435 mps->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
436 else if (GetSimulationType() == SimulationType::kTensorNetwork)
437 tn->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
438 else if (GetSimulationType() == SimulationType::kPauliPropagator)
439 pp->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
440
441 NotifyObservers({tgt_qubit, ctrl_qubit});
442 }
443
452 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
453 double theta) override {
454 if (GetSimulationType() == SimulationType::kStatevector)
455 state->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
456 else if (GetSimulationType() == SimulationType::kMatrixProductState)
457 mps->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
458 else if (GetSimulationType() == SimulationType::kTensorNetwork)
459 tn->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
460 else if (GetSimulationType() == SimulationType::kPauliPropagator)
461 pp->ApplyCRX(ctrl_qubit, tgt_qubit, theta);
462
463 NotifyObservers({tgt_qubit, ctrl_qubit});
464 }
465
474 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
475 double theta) override {
476 if (GetSimulationType() == SimulationType::kStatevector)
477 state->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
478 else if (GetSimulationType() == SimulationType::kMatrixProductState)
479 mps->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
480 else if (GetSimulationType() == SimulationType::kTensorNetwork)
481 tn->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
482 else if (GetSimulationType() == SimulationType::kPauliPropagator)
483 pp->ApplyCRY(ctrl_qubit, tgt_qubit, theta);
484
485 NotifyObservers({tgt_qubit, ctrl_qubit});
486 }
487
496 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
497 double theta) override {
498 if (GetSimulationType() == SimulationType::kStatevector)
499 state->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
500 else if (GetSimulationType() == SimulationType::kMatrixProductState)
501 mps->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
502 else if (GetSimulationType() == SimulationType::kTensorNetwork)
503 tn->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
504 else if (GetSimulationType() == SimulationType::kPauliPropagator)
505 pp->ApplyCRZ(ctrl_qubit, tgt_qubit, theta);
506
507 NotifyObservers({tgt_qubit, ctrl_qubit});
508 }
509
517 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
518 if (GetSimulationType() == SimulationType::kStatevector)
519 state->ApplyCH(ctrl_qubit, tgt_qubit);
520 else if (GetSimulationType() == SimulationType::kMatrixProductState)
521 mps->ApplyCH(ctrl_qubit, tgt_qubit);
522 else if (GetSimulationType() == SimulationType::kTensorNetwork)
523 tn->ApplyCH(ctrl_qubit, tgt_qubit);
524 else if (GetSimulationType() == SimulationType::kPauliPropagator)
525 pp->ApplyCH(ctrl_qubit, tgt_qubit);
526
527 NotifyObservers({tgt_qubit, ctrl_qubit});
528 }
529
537 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
538 if (GetSimulationType() == SimulationType::kStatevector)
539 state->ApplyCSX(ctrl_qubit, tgt_qubit);
540 else if (GetSimulationType() == SimulationType::kMatrixProductState)
541 mps->ApplyCSX(ctrl_qubit, tgt_qubit);
542 else if (GetSimulationType() == SimulationType::kTensorNetwork)
543 tn->ApplyCSX(ctrl_qubit, tgt_qubit);
544 else if (GetSimulationType() == SimulationType::kPauliPropagator)
545 pp->ApplyCSX(ctrl_qubit, tgt_qubit);
546
547 NotifyObservers({tgt_qubit, ctrl_qubit});
548 }
549
557 void ApplyCSxDAG(Types::qubit_t ctrl_qubit,
558 Types::qubit_t tgt_qubit) override {
559 if (GetSimulationType() == SimulationType::kStatevector)
560 state->ApplyCSXDG(ctrl_qubit, tgt_qubit);
561 else if (GetSimulationType() == SimulationType::kMatrixProductState)
562 mps->ApplyCSXDG(ctrl_qubit, tgt_qubit);
563 else if (GetSimulationType() == SimulationType::kTensorNetwork)
564 tn->ApplyCSXDG(ctrl_qubit, tgt_qubit);
565 else if (GetSimulationType() == SimulationType::kPauliPropagator)
566 pp->ApplyCSXDAG(ctrl_qubit, tgt_qubit);
567
568 NotifyObservers({tgt_qubit, ctrl_qubit});
569 }
570
578 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override {
579 if (GetSimulationType() == SimulationType::kStatevector)
580 state->ApplySwap(qubit0, qubit1);
581 else if (GetSimulationType() == SimulationType::kMatrixProductState)
582 mps->ApplySwap(qubit0, qubit1);
583 else if (GetSimulationType() == SimulationType::kTensorNetwork)
584 tn->ApplySwap(qubit0, qubit1);
585 else if (GetSimulationType() == SimulationType::kPauliPropagator)
586 pp->ApplySWAP(qubit0, qubit1);
587
588 NotifyObservers({qubit1, qubit0});
589 }
590
599 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1,
600 Types::qubit_t qubit2) override {
601 if (GetSimulationType() == SimulationType::kStatevector)
602 state->ApplyCCX(qubit0, qubit1, qubit2);
603 else if (GetSimulationType() == SimulationType::kMatrixProductState) {
604 const size_t q1 = qubit0; // control 1
605 const size_t q2 = qubit1; // control 2
606 const size_t q3 = qubit2; // target
607
608 // Sleator-Weinfurter decomposition
609 mps->ApplyCSX(static_cast<unsigned int>(q2),
610 static_cast<unsigned int>(q3));
611 mps->ApplyCX(static_cast<unsigned int>(q1),
612 static_cast<unsigned int>(q2));
613 mps->ApplyCSXDG(static_cast<unsigned int>(q2),
614 static_cast<unsigned int>(q3));
615 mps->ApplyCX(static_cast<unsigned int>(q1),
616 static_cast<unsigned int>(q2));
617 mps->ApplyCSX(static_cast<unsigned int>(q1),
618 static_cast<unsigned int>(q3));
619 } else if (GetSimulationType() == SimulationType::kTensorNetwork) {
620 tn->ApplyCCX(qubit0, qubit1, qubit2);
621 } else if (GetSimulationType() == SimulationType::kPauliPropagator)
622 pp->ApplyCCX(qubit0, qubit1, qubit2);
623
624 NotifyObservers({qubit0, qubit1, qubit2});
625 }
626
635 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0,
636 Types::qubit_t qubit1) override {
637 if (GetSimulationType() == SimulationType::kStatevector)
638 state->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
639 else if (GetSimulationType() == SimulationType::kMatrixProductState) {
640 const size_t q1 = ctrl_qubit; // control
641 const size_t q2 = qubit0;
642 const size_t q3 = qubit1;
643
644 // TODO: find a better decomposition
645 // this one I've got with the qiskit transpiler
646 mps->ApplyCX(static_cast<unsigned int>(q3),
647 static_cast<unsigned int>(q2));
648 mps->ApplyCSX(static_cast<unsigned int>(q2),
649 static_cast<unsigned int>(q3));
650 mps->ApplyCX(static_cast<unsigned int>(q1),
651 static_cast<unsigned int>(q2));
652
653 mps->ApplyP(static_cast<unsigned int>(q3), M_PI);
654 mps->ApplyP(static_cast<unsigned int>(q2), -M_PI_2);
655
656 mps->ApplyCSX(static_cast<unsigned int>(q2),
657 static_cast<unsigned int>(q3));
658 mps->ApplyCX(static_cast<unsigned int>(q1),
659 static_cast<unsigned int>(q2));
660
661 mps->ApplyP(static_cast<unsigned int>(q3), M_PI);
662
663 mps->ApplyCSX(static_cast<unsigned int>(q1),
664 static_cast<unsigned int>(q3));
665 mps->ApplyCX(static_cast<unsigned int>(q3),
666 static_cast<unsigned int>(q2));
667 } else if (GetSimulationType() == SimulationType::kTensorNetwork) {
668 tn->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
669 } else if (GetSimulationType() == SimulationType::kPauliPropagator)
670 pp->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
671
672 NotifyObservers({qubit1, qubit0, ctrl_qubit});
673 }
674
686 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
687 double theta, double phi, double lambda, double gamma) override {
688 if (GetSimulationType() == SimulationType::kStatevector)
689 state->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
690 else if (GetSimulationType() == SimulationType::kMatrixProductState)
691 mps->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
692 else if (GetSimulationType() == SimulationType::kTensorNetwork)
693 tn->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
694 else if (GetSimulationType() == SimulationType::kPauliPropagator)
695 pp->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
696
697 NotifyObservers({tgt_qubit, ctrl_qubit});
698 }
699
707 void ApplyNop() override {
708 // do nothing
709 }
710
721 std::unique_ptr<ISimulator> Clone() override {
722 if (GetSimulationType() == SimulationType::kTensorNetwork || GetSimulationType() == SimulationType::kPauliPropagator) {
723 throw std::runtime_error(
724 "GpuSimulator::Clone: Cloning Tensor Network or Pauli Propagator simulation is not "
725 "supported.");
726 }
727
728 auto cloned = std::make_unique<GpuSimulator>();
729
730 cloned->simulationType = simulationType;
731 cloned->nrQubits = nrQubits;
732
733 cloned->limitSize = limitSize;
734 cloned->limitEntanglement = limitEntanglement;
735 cloned->chi = chi;
736 cloned->singularValueThreshold = singularValueThreshold;
737
738 if (state)
739 cloned->state = state->Clone();
740 else if (mps)
741 cloned->mps = mps->Clone();
742
743 return cloned;
744 }
745};
746
747} // namespace Private
748} // namespace Simulators
749
750#endif
751#endif
752#endif
int ApplyK(void *sim, int qubit)
int ApplyRx(void *sim, int qubit, double theta)
int ApplyX(void *sim, int qubit)
int ApplyU(void *sim, int qubit, double theta, double phi, double lambda, double gamma)
int ApplyCRy(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyTDG(void *sim, int qubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplyCRz(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySDG(void *sim, int qubit)
int ApplyCSwap(void *sim, int controlQubit, int qubit1, int qubit2)
int ApplyCCX(void *sim, int controlQubit1, int controlQubit2, int targetQubit)
int ApplyY(void *sim, int qubit)
int ApplyZ(void *sim, int qubit)
int ApplyH(void *sim, int qubit)
int ApplyCY(void *sim, int controlQubit, int targetQubit)
int ApplyCU(void *sim, int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma)
int ApplySwap(void *sim, int qubit1, int qubit2)
int ApplyRy(void *sim, int qubit, double theta)
int ApplyP(void *sim, int qubit, double theta)
int ApplyCH(void *sim, int controlQubit, int targetQubit)
int GetSimulationType(void *sim)
int ApplyCZ(void *sim, int controlQubit, int targetQubit)
int ApplyRz(void *sim, int qubit, double theta)
int ApplyT(void *sim, int qubit)
int ApplyCRx(void *sim, int controlQubit, int targetQubit, double theta)