Ver código fonte

Added collapsed measurement and seed functions

Adam Kelly 5 anos atrás
pai
commit
0125a8a026
2 arquivos alterados com 49 adições e 1 exclusões
  1. 46 0
      qcgpu/backend.py
  2. 3 1
      qcgpu/state.py

+ 46 - 0
qcgpu/backend.py

@@ -202,6 +202,26 @@ __kernel void initialize_register(
         amplitudes[state] = cfloat_new(0, 0);
     }
 }
+
+/**
+ * Collapses a qubit in the register
+ */
+__kernel void collapse(
+    __global cfloat_t *amplitudes, 
+    int const target,
+    int const outcome, 
+    float const norm)
+{
+    int const state = get_global_id(0);
+
+    if (((state >> target) & 1) == outcome) {
+        amplitudes[state] = cfloat_mul(amplitudes[state], cfloat_new(norm, 0.0));
+    }
+    else
+    {
+        amplitudes[state] = cfloat_new(0.0, 0.0);
+    }
+}
 """
 
 
@@ -265,6 +285,9 @@ class Backend:
             self.dtype(gate.d)
         )
     
+    def seed(self, val):
+        random.seed(val)
+        
     def measure(self, samples=1):
         """Measure the state of a register"""
         # This is a really horrible method that needs a rewrite - the memory
@@ -315,6 +338,29 @@ class Backend:
 
         return kernel(self.buffer, target).get()
 
+    def measure_collapse(self, target):
+        probability_of_0 = self.qubit_probability(target)
+        random_number = random.random()
+
+        if random_number <= probability_of_0:
+            outcome = '0'
+            norm = 1 / np.sqrt(probability_of_0)
+        else:
+            outcome = '1'
+            norm = 1 / np.sqrt(1 - probability_of_0)
+
+        self.program.collapse(
+            self.queue,
+            [int(self.buffer.shape[1])],
+            # self.buffer.shape,
+            None,
+            self.buffer.data,
+            np.int32(target),
+            np.int32(outcome),
+            np.float32(norm)
+        )
+        return outcome
+
     def measure_qubit(self, target, samples):
         probability_of_0 = self.qubit_probability(target)
 

+ 3 - 1
qcgpu/state.py

@@ -73,7 +73,6 @@ class State:
 
         self.backend.apply_gate(gate, target)
 
-
     def apply_all(self, gate):
         # TODO: Check that gate is correct
         for i in range(self.num_qubits):
@@ -93,6 +92,9 @@ class State:
     def measure_qubit(self, target, samples=1):
         return self.backend.measure_qubit(target, samples)
 
+    def measure_collapse(self, target):
+        return self.backend.measure_collapse(target)
+
     def measure(self, samples=1):
         return self.backend.measure(samples)