Trait roqoqo::measurements::MeasureExpectationValues [−][src]
pub trait MeasureExpectationValues: PartialEq + Clone + Measure {
fn evaluate(
&self,
bit_registers: HashMap<String, BitOutputRegister>,
float_registers: HashMap<String, FloatOutputRegister>,
complex_registers: HashMap<String, ComplexOutputRegister>
) -> Result<Option<HashMap<String, f64>>, RoqoqoError>;
}
Expand description
Allows generic interfacing with roqoqo measurements that evaluate expectation values.
Example
// We want to run a measurement for the following expectation value: 3 + 4.0 * < Z0 >.
use roqoqo::{measurements::{BasisRotation, BasisRotationInput, MeasureExpectationValues}, registers::BitOutputRegister, Circuit};
use std::collections::HashMap;
// 1) Create and fill BasisRotationInput for the BasisRotation measurement
let mut bri = BasisRotationInput::new(3, false);
let _a = bri.add_pauli_product("ro".to_string(), vec![]);
let _b = bri.add_pauli_product("ro".to_string(), vec![0]);
let mut linear_map_0: HashMap<usize, f64> = HashMap::new();
linear_map_0.insert(0, 3.0);
bri.add_linear_exp_val("constant".to_string(), linear_map_0).unwrap();
let mut linear_map_1: HashMap<usize, f64> = HashMap::new();
linear_map_1.insert(1, 4.0);
bri.add_linear_exp_val("single_qubit_exp_val".to_string(), linear_map_1).unwrap();
// 2) Create and fill BasisRotation measurement
let mut circs: Vec<Circuit> = Vec::new();
circs.push(Circuit::new());
let br = BasisRotation {
constant_circuit: None,
circuits: circs.clone(),
input: bri,
};
// 3) Construct measured registers
let register = vec![
vec![true, true, false],
vec![true, true, false],
vec![false, false, true],
vec![false, false, true],
];
let mut measured_registers: HashMap<String, BitOutputRegister> = HashMap::new();
let new_output_register: BitOutputRegister = register;
let _ = measured_registers.insert("ro".to_string(), new_output_register);
// 4) Evaluate BasisRotation measurement
let result = br
.evaluate(measured_registers, HashMap::new(), HashMap::new())
.unwrap()
.unwrap();
assert_eq!(result.get("constant").unwrap(), &3.0);
assert_eq!(
result.get("single_qubit_exp_val").unwrap(),
&0.0
);
// 5) Check that all values are correct
assert_eq!(result.get("constant").unwrap(), &3.0);
assert_eq!(result.get("single_qubit_exp_val").unwrap(), &0.0);
Required methods
fn evaluate(
&self,
bit_registers: HashMap<String, BitOutputRegister>,
float_registers: HashMap<String, FloatOutputRegister>,
complex_registers: HashMap<String, ComplexOutputRegister>
) -> Result<Option<HashMap<String, f64>>, RoqoqoError>
fn evaluate(
&self,
bit_registers: HashMap<String, BitOutputRegister>,
float_registers: HashMap<String, FloatOutputRegister>,
complex_registers: HashMap<String, ComplexOutputRegister>
) -> Result<Option<HashMap<String, f64>>, RoqoqoError>
Evaluates measurement results based on classical registers.
Arguments:
bit_registers
- The classical bit registers as a HashMap with the register name as key.float_registers
- The classical float registers as a HashMap with the register name as key.complex_registers
- The classical complex registers as a HashMap with the register name as key.
Returns
Ok(Some(HashMap<String, f64>))
- The measurement has been evaluated successfully. The HashMap contains the measured expectation values.Ok(None)
- The measurement did not fail but is incomplete. A new round of measurements is needed.Err(RoqoqoError)
- The measurement evaluation failed.