use super::parameter::Parameter;
#[derive(Debug, Clone)]
pub enum CircuitParam {
Index(u32),
Fixed(f64),
}
impl PartialEq for CircuitParam {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Index(lhs), Self::Index(rhs)) => lhs == rhs,
(Self::Fixed(lhs), Self::Fixed(rhs)) => lhs == rhs,
_ => false,
}
}
}
impl From<f64> for CircuitParam {
fn from(v: f64) -> Self {
Self::Fixed(v)
}
}
#[derive(Debug, Clone)]
pub enum ParameterValue {
Param(Parameter),
Fixed(f64),
}
impl ParameterValue {
pub fn scaled(&self, factor: f64) -> Self {
assert!(factor.is_finite(), "parameter scale factor must be finite");
match self {
Self::Fixed(value) => Self::Fixed(value * factor),
Self::Param(parameter) => Self::Param(parameter.clone() * factor),
}
}
}
impl PartialEq for ParameterValue {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Param(lhs), Self::Param(rhs)) => lhs == rhs,
(Self::Fixed(lhs), Self::Fixed(rhs)) => lhs == rhs,
_ => false,
}
}
}
impl From<f64> for ParameterValue {
fn from(v: f64) -> Self {
Self::Fixed(v)
}
}
impl From<i64> for ParameterValue {
fn from(v: i64) -> Self {
Self::Fixed(v as f64)
}
}
impl From<Parameter> for ParameterValue {
fn from(para: Parameter) -> Self {
if let Ok(p) = para.evaluate(&None) {
Self::Fixed(p)
} else {
Self::Param(para)
}
}
}
impl From<&Parameter> for ParameterValue {
fn from(para: &Parameter) -> Self {
if let Ok(p) = para.evaluate(&None) {
Self::Fixed(p)
} else {
Self::Param(para.clone())
}
}
}
impl From<ParameterValue> for Parameter {
fn from(para: ParameterValue) -> Parameter {
match para {
ParameterValue::Param(p) => p,
ParameterValue::Fixed(f) => Parameter::from(f),
}
}
}
impl From<&ParameterValue> for Parameter {
fn from(para: &ParameterValue) -> Parameter {
match para {
ParameterValue::Param(p) => p.clone(),
ParameterValue::Fixed(f) => Parameter::from(*f),
}
}
}
impl From<&str> for ParameterValue {
fn from(para: &str) -> Self {
Parameter::symbol(para).into()
}
}
#[cfg(test)]
#[path = "circuit_param_test.rs"]
mod circuit_param_test;