1use gate::Gate;
4use registers::ClassicalRegister;
5use registers::QuantumRegister;
6
7#[derive(Debug, Eq, PartialEq)]
8enum State {
9 Initializing,
11
12 Running,
14
15 Collapsed,
17}
18
19#[derive(Debug)]
25pub struct QuantumComputer {
26 state: State,
27 width: usize,
28
29 register: QuantumRegister,
31
32 classical: ClassicalRegister,
34}
35
36impl QuantumComputer {
37 pub fn new(width: usize) -> QuantumComputer {
39 QuantumComputer {
40 state: State::Initializing,
41 width: width,
42 register: QuantumRegister::new(width, &ClassicalRegister::zeroed(width)),
43 classical: ClassicalRegister::zeroed(width),
44 }
45 }
46
47 pub fn initialize(&mut self, value: u32) {
53 assert_eq!(State::Initializing, self.state);
54
55 let classical = ClassicalRegister::from_int(self.width, value);
56 self.register = QuantumRegister::new(self.width, &classical);
57
58 self.state = State::Running;
59 }
60
61 pub fn apply(&mut self, gate: Gate) {
67 assert_eq!(State::Running, self.state);
68
69 self.register.apply(gate);
70 }
71
72 pub fn collapse(&mut self) {
78 assert_eq!(State::Running, self.state);
79
80 self.classical = self.register.collapse();
81
82 self.state = State::Collapsed;
83 }
84
85 pub fn reset(&mut self) {
91 self.state = State::Initializing;
92 }
93
94 pub fn value(&self) -> u32 {
100 assert_eq!(State::Collapsed, self.state);
101
102 self.classical.to_int()
103 }
104}
105
106#[test]
107fn state_test() {
108 let mut c = QuantumComputer::new(3);
109 assert_eq!(State::Initializing, c.state);
110
111 c.initialize(5);
112 assert_eq!(State::Running, c.state);
113
114 c.collapse();
115 assert_eq!(State::Collapsed, c.state);
116
117 c.value();
118
119 c.reset();
120 assert_eq!(State::Initializing, c.state);
121}
122
123#[test]
124fn compute_test() {
125 use gates;
126
127 let mut c = QuantumComputer::new(3);
128
129 c.initialize(5);
130
131 c.apply(gates::identity(3));
132
133 c.collapse();
134
135 assert_eq!(5, c.value());
136}