pub enum Expression {
Address(MemoryReference),
FunctionCall(FunctionCallExpression),
Infix(InfixExpression),
Number(Complex64),
PiConstant(),
Prefix(PrefixExpression),
Variable(String),
}Expand description
The type of Quil expressions.
Quil expressions take advantage of structural sharing; if a Quil expression contains the same
subexpression twice, such as x + y in (x + y) * (x + y), the two children of the * node
will be the same pointer. This is implemented through interning, also known as
hash-consing; the recursive references to child nodes are done via ArcIntern<Expression>s.
Creating an ArcIntern from an Expression will always return the same pointer for the same
expression.
The structural sharing means that equality, cloning, and hashing on Quil expressions are all
very cheap, as they do not need to be recursive: equality of ArcInterns is a single-pointer
comparison, cloning of ArcInterns is a pointer copy and an atomic increment, and hashing of
ArcInterns hashes a single pointer. It is also very cheap to key HashMaps by an
ArcIntern<Expression>, which can allow for cheap memoization of operations on Expressions.
The structural sharing also means that Quil expressions are fundamentally immutable; it is
impossible to get an owned or &mut reference to the child Expressions of any Expression,
as the use of interning means there may be multiple references to that Expression at any time.
Note that when comparing Quil expressions, any embedded NaNs are treated as equal to other NaNs, not unequal, in contravention of the IEEE 754 spec.
Variants§
Address(MemoryReference)
FunctionCall(FunctionCallExpression)
Infix(InfixExpression)
Number(Complex64)
PiConstant()
Prefix(PrefixExpression)
Variable(String)
Implementations§
Source§impl Expression
impl Expression
Sourcepub fn simplify(&mut self)
pub fn simplify(&mut self)
Simplify the expression as much as possible, in-place.
§Example
use quil_rs::expression::Expression;
use std::str::FromStr;
use num_complex::Complex64;
let mut expression = Expression::from_str("cos(2 * pi) + 2").unwrap();
expression.simplify();
assert_eq!(expression, Expression::Number(Complex64::from(3.0)));Sourcepub fn into_simplified(self) -> Self
pub fn into_simplified(self) -> Self
Consume the expression, simplifying it as much as possible.
§Example
use quil_rs::expression::Expression;
use std::str::FromStr;
use num_complex::Complex64;
let simplified = Expression::from_str("cos(2 * pi) + 2").unwrap().into_simplified();
assert_eq!(simplified, Expression::Number(Complex64::from(3.0)));Sourcepub fn evaluate<K1, K2>(
&self,
variables: &HashMap<K1, Complex64>,
memory_references: &HashMap<K2, Vec<f64>>,
) -> Result<Complex64, EvaluationError>
pub fn evaluate<K1, K2>( &self, variables: &HashMap<K1, Complex64>, memory_references: &HashMap<K2, Vec<f64>>, ) -> Result<Complex64, EvaluationError>
Evaluate an expression, expecting that it may be fully reduced to a single complex number. If it cannot be reduced to a complex number, return an error.
§Example
use quil_rs::expression::Expression;
use std::str::FromStr;
use std::collections::HashMap;
use num_complex::Complex64;
let expression = Expression::from_str("%beta + theta[0]").unwrap();
let mut variables = HashMap::with_capacity(1);
variables.insert(String::from("beta"), Complex64::from(1.0));
let mut memory_references = HashMap::with_capacity(1);
memory_references.insert("theta", vec![2.0]);
let evaluated = expression.evaluate(&variables, &memory_references).unwrap();
assert_eq!(evaluated, Complex64::from(3.0))Sourcepub fn substitute_variables<K>(
&self,
variable_values: &HashMap<K, Expression>,
) -> Self
pub fn substitute_variables<K>( &self, variable_values: &HashMap<K, Expression>, ) -> Self
Substitute an expression in the place of each matching variable.
§Example
use quil_rs::expression::Expression;
use std::str::FromStr;
use std::collections::HashMap;
use num_complex::Complex64;
let expression = Expression::from_str("%x + %y").unwrap();
let mut variables = HashMap::with_capacity(1);
variables.insert(String::from("x"), Expression::Number(Complex64::from(1.0)));
let evaluated = expression.substitute_variables(&variables);
assert_eq!(evaluated, Expression::from_str("1.0 + %y").unwrap())Source§impl Expression
impl Expression
Sourcepub fn to_real(&self) -> Result<f64, EvaluationError>
pub fn to_real(&self) -> Result<f64, EvaluationError>
If this is a number with imaginary part “equal to” zero (of small absolute value), return that number. Otherwise, error with an evaluation error of a descriptive type.
Source§impl Expression
impl Expression
Sourcepub fn get_memory_references(&self) -> Vec<&MemoryReference>
pub fn get_memory_references(&self) -> Vec<&MemoryReference>
Return, if any, the memory references contained within this Expression.
Trait Implementations§
Source§impl Add<ArcIntern<Expression>> for Expression
impl Add<ArcIntern<Expression>> for Expression
Source§type Output = Expression
type Output = Expression
+ operator.Source§impl Add<Expression> for ArcIntern<Expression>
impl Add<Expression> for ArcIntern<Expression>
Source§type Output = Expression
type Output = Expression
+ operator.Source§fn add(self, other: Expression) -> Expression
fn add(self, other: Expression) -> Expression
+ operation. Read moreSource§impl Add for Expression
impl Add for Expression
Source§impl AddAssign<ArcIntern<Expression>> for Expression
impl AddAssign<ArcIntern<Expression>> for Expression
Source§fn add_assign(&mut self, other: ArcIntern<Expression>)
fn add_assign(&mut self, other: ArcIntern<Expression>)
+= operation. Read moreSource§impl AddAssign for Expression
impl AddAssign for Expression
Source§fn add_assign(&mut self, other: Self)
fn add_assign(&mut self, other: Self)
+= operation. Read moreSource§impl BitXor<ArcIntern<Expression>> for Expression
impl BitXor<ArcIntern<Expression>> for Expression
Source§type Output = Expression
type Output = Expression
^ operator.Source§impl BitXor<Expression> for ArcIntern<Expression>
impl BitXor<Expression> for ArcIntern<Expression>
Source§type Output = Expression
type Output = Expression
^ operator.Source§fn bitxor(self, other: Expression) -> Expression
fn bitxor(self, other: Expression) -> Expression
^ operation. Read moreSource§impl BitXor for Expression
impl BitXor for Expression
Source§impl BitXorAssign<ArcIntern<Expression>> for Expression
impl BitXorAssign<ArcIntern<Expression>> for Expression
Source§fn bitxor_assign(&mut self, other: ArcIntern<Expression>)
fn bitxor_assign(&mut self, other: ArcIntern<Expression>)
^= operation. Read moreSource§impl BitXorAssign for Expression
impl BitXorAssign for Expression
Source§fn bitxor_assign(&mut self, other: Self)
fn bitxor_assign(&mut self, other: Self)
^= operation. Read moreSource§impl Clone for Expression
impl Clone for Expression
Source§fn clone(&self) -> Expression
fn clone(&self) -> Expression
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Expression
impl Debug for Expression
Source§impl Div<ArcIntern<Expression>> for Expression
impl Div<ArcIntern<Expression>> for Expression
Source§type Output = Expression
type Output = Expression
/ operator.Source§impl Div<Expression> for ArcIntern<Expression>
impl Div<Expression> for ArcIntern<Expression>
Source§type Output = Expression
type Output = Expression
/ operator.Source§fn div(self, other: Expression) -> Expression
fn div(self, other: Expression) -> Expression
/ operation. Read moreSource§impl Div for Expression
impl Div for Expression
Source§impl DivAssign<ArcIntern<Expression>> for Expression
impl DivAssign<ArcIntern<Expression>> for Expression
Source§fn div_assign(&mut self, other: ArcIntern<Expression>)
fn div_assign(&mut self, other: ArcIntern<Expression>)
/= operation. Read moreSource§impl DivAssign for Expression
impl DivAssign for Expression
Source§fn div_assign(&mut self, other: Self)
fn div_assign(&mut self, other: Self)
/= operation. Read moreSource§impl FromStr for Expression
impl FromStr for Expression
Source§impl Hash for Expression
impl Hash for Expression
Source§impl Mul<ArcIntern<Expression>> for Expression
impl Mul<ArcIntern<Expression>> for Expression
Source§type Output = Expression
type Output = Expression
* operator.Source§impl Mul<Expression> for ArcIntern<Expression>
impl Mul<Expression> for ArcIntern<Expression>
Source§type Output = Expression
type Output = Expression
* operator.Source§fn mul(self, other: Expression) -> Expression
fn mul(self, other: Expression) -> Expression
* operation. Read moreSource§impl Mul for Expression
impl Mul for Expression
Source§impl MulAssign<ArcIntern<Expression>> for Expression
impl MulAssign<ArcIntern<Expression>> for Expression
Source§fn mul_assign(&mut self, other: ArcIntern<Expression>)
fn mul_assign(&mut self, other: ArcIntern<Expression>)
*= operation. Read moreSource§impl MulAssign for Expression
impl MulAssign for Expression
Source§fn mul_assign(&mut self, other: Self)
fn mul_assign(&mut self, other: Self)
*= operation. Read moreSource§impl Neg for Expression
impl Neg for Expression
Source§impl PartialEq for Expression
impl PartialEq for Expression
Source§impl Quil for Expression
impl Quil for Expression
Source§fn write(
&self,
f: &mut impl Write,
fall_back_to_debug: bool,
) -> Result<(), ToQuilError>
fn write( &self, f: &mut impl Write, fall_back_to_debug: bool, ) -> Result<(), ToQuilError>
fall_back_to_debug
is true, then it must not return an error.Source§fn to_quil(&self) -> Result<String, ToQuilError>
fn to_quil(&self) -> Result<String, ToQuilError>
Source§fn to_quil_or_debug(&self) -> String
fn to_quil_or_debug(&self) -> String
Debug representation of that
component.Source§impl Sub<ArcIntern<Expression>> for Expression
impl Sub<ArcIntern<Expression>> for Expression
Source§type Output = Expression
type Output = Expression
- operator.Source§impl Sub<Expression> for ArcIntern<Expression>
impl Sub<Expression> for ArcIntern<Expression>
Source§type Output = Expression
type Output = Expression
- operator.Source§fn sub(self, other: Expression) -> Expression
fn sub(self, other: Expression) -> Expression
- operation. Read moreSource§impl Sub for Expression
impl Sub for Expression
Source§impl SubAssign<ArcIntern<Expression>> for Expression
impl SubAssign<ArcIntern<Expression>> for Expression
Source§fn sub_assign(&mut self, other: ArcIntern<Expression>)
fn sub_assign(&mut self, other: ArcIntern<Expression>)
-= operation. Read moreSource§impl SubAssign for Expression
impl SubAssign for Expression
Source§fn sub_assign(&mut self, other: Self)
fn sub_assign(&mut self, other: Self)
-= operation. Read moreimpl Eq for Expression
Auto Trait Implementations§
impl Freeze for Expression
impl RefUnwindSafe for Expression
impl Send for Expression
impl Sync for Expression
impl Unpin for Expression
impl UnwindSafe for Expression
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.