lib.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. extern crate failure;
  2. extern crate num_complex;
  3. extern crate ocl;
  4. extern crate rand;
  5. #[macro_use]
  6. extern crate failure_derive;
  7. pub mod backends;
  8. pub mod error;
  9. pub mod gate;
  10. pub mod traits;
  11. use backends::OpenCL;
  12. pub use gate::{h, x, y, z, Gate};
  13. use failure::Error;
  14. use std::fmt;
  15. #[derive(Debug)]
  16. pub struct Simulator {
  17. backend: Box<traits::Backend>,
  18. num_qubits: u8,
  19. }
  20. impl Simulator {
  21. pub fn new_opencl(num_qubits: u8) -> Result<Simulator, Error> {
  22. let backend = OpenCL::new(num_qubits)?;
  23. Ok(Simulator {
  24. backend: Box::new(backend),
  25. num_qubits,
  26. })
  27. }
  28. pub fn apply_gate(&mut self, gate: Gate, target: u8) -> Result<(), Error> {
  29. self.backend.apply_gate(gate, target)
  30. }
  31. pub fn apply_all(&mut self, gate: Gate) -> Result<(), Error> {
  32. for i in 0..self.num_qubits {
  33. self.backend.apply_gate(gate, i)?
  34. }
  35. Ok(())
  36. }
  37. pub fn x(&mut self, target: u8) -> Result<(), Error> {
  38. self.backend.apply_gate(x(), target)
  39. }
  40. pub fn y(&mut self, target: u8) -> Result<(), Error> {
  41. self.backend.apply_gate(y(), target)
  42. }
  43. pub fn z(&mut self, target: u8) -> Result<(), Error> {
  44. self.backend.apply_gate(z(), target)
  45. }
  46. pub fn h(&mut self, target: u8) -> Result<(), Error> {
  47. self.backend.apply_gate(h(), target)
  48. }
  49. pub fn cx(&mut self, control: u8, target: u8) -> Result<(), Error> {
  50. self.backend.apply_controlled_gate(x(), control, target)
  51. }
  52. pub fn measure(&mut self) -> Result<u64, Error> {
  53. self.backend.measure()
  54. }
  55. pub fn num_qubits(&mut self) -> u8 {
  56. self.backend.num_qubits()
  57. }
  58. }
  59. impl fmt::Display for Simulator {
  60. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  61. write!(f, "{}", self.backend)
  62. }
  63. }