-
Notifications
You must be signed in to change notification settings - Fork 201
Expand file tree
/
Copy pathcircuit.h
More file actions
79 lines (64 loc) · 1.75 KB
/
circuit.h
File metadata and controls
79 lines (64 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright 2019 Google LLC. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef CIRCUIT_H_
#define CIRCUIT_H_
#include <vector>
namespace qsim {
/**
* A collection of gates. This object is consumed by `QSim[h]Runner.Run()`.
*/
template <typename Gate>
struct Circuit {
unsigned num_qubits;
/**
* The set of gates to be run. Gate times should be ordered.
*/
std::vector<Gate> gates;
};
namespace detail {
/**
* An adapter for vectors of gates.
*/
template <typename Circuit>
struct Gates;
template <typename Gate>
struct Gates<qsim::Circuit<Gate>> {
static const std::vector<Gate>& get(const qsim::Circuit<Gate>& circuit) {
return circuit.gates;
}
static const Gate& gate(const Gate& g) {
return g;
}
};
template <typename Gate>
struct Gates<std::vector<Gate>> {
static const std::vector<Gate>& get(const std::vector<Gate>& gates) {
return gates;
}
static const Gate& gate(const Gate& g) {
return g;
}
};
template <typename Gate>
struct Gates<std::vector<Gate*>> {
static const std::vector<Gate*>& get(const std::vector<Gate*>& gates) {
return gates;
}
static const Gate& gate(const Gate* g) {
return *g;
}
};
} // namespace detail
} // namespace qsim
#endif // CIRCUIT_H_