state.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from qcgpu.backend import Backend
  2. import pyopencl as cl
  3. import numpy as np
  4. class State:
  5. """ Creates a new quantum register.
  6. Args:
  7. num_qubits (int): The number of qubits to create in the register
  8. Returns:
  9. State: A representation of the quantum register
  10. """
  11. def __init__(self, num_qubits):
  12. if not isinstance(num_qubits, int):
  13. raise ValueError("num_qubits must be an int")
  14. if num_qubits <= 0:
  15. raise ValueError("num_qubits must be a positive integer")
  16. self.num_qubits = num_qubits
  17. self.backend = Backend(num_qubits)
  18. def apply_gate(self, gate, target):
  19. if not isinstance(target, int) or target < 0:
  20. raise ValueError("target must be an int > 0")
  21. # TODO: Check that gate is correct
  22. self.backend.apply_gate(gate, target)
  23. def apply_all(self, gate):
  24. # TODO: Check that gate is correct
  25. for i in range(self.num_qubits):
  26. self.apply_gate(gate, i)
  27. def apply_controlled_gate(self, gate, control, target):
  28. if not isinstance(target, int) or target < 0:
  29. raise ValueError("target must be an int > 0")
  30. if not isinstance(control, int) or control < 0:
  31. raise ValueError("control must be an int > 0")
  32. # TODO: Check that gate is correct
  33. self.backend.apply_controlled_gate(gate, control, target)
  34. def measure_qubit(self, target, samples=1):
  35. return self.backend.measure_qubit(target, samples)
  36. def measure(self, samples=1):
  37. return self.backend.measure(samples)
  38. def amplitudes(self):
  39. return self.backend.amplitudes()
  40. def probabilities(self):
  41. return self.backend.probabilities()
  42. def flush(self):
  43. self.backend.release()
  44. def __repr__(self):
  45. """A string representation of the state"""
  46. # TODO: Finish this method
  47. return np.array_str(self.backend.buffer)