use super::*;
use crate::algebra::FloatT;
#[derive(Debug, Clone, Copy)]
pub enum SupportedConeT<T> {
ZeroConeT(usize),
NonnegativeConeT(usize),
SecondOrderConeT(usize),
ExponentialConeT(),
PowerConeT(T),
}
impl<T> SupportedConeT<T> {
pub(crate) fn nvars(&self) -> usize {
match self {
SupportedConeT::ZeroConeT(dim) => *dim,
SupportedConeT::NonnegativeConeT(dim) => *dim,
SupportedConeT::SecondOrderConeT(dim) => *dim,
SupportedConeT::ExponentialConeT() => 3,
SupportedConeT::PowerConeT(_) => 3,
}
}
}
impl<T> std::fmt::Display for SupportedConeT<T>
where
T: FloatT,
{
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", &self.as_tag().as_str())
}
}
pub fn make_cone<T: FloatT>(cone: SupportedConeT<T>) -> SupportedCone<T> {
match cone {
SupportedConeT::NonnegativeConeT(dim) => NonnegativeCone::<T>::new(dim).into(),
SupportedConeT::ZeroConeT(dim) => ZeroCone::<T>::new(dim).into(),
SupportedConeT::SecondOrderConeT(dim) => SecondOrderCone::<T>::new(dim).into(),
SupportedConeT::ExponentialConeT() => ExponentialCone::<T>::new().into(),
SupportedConeT::PowerConeT(α) => PowerCone::<T>::new(α).into(),
}
}
#[allow(clippy::enum_variant_names)]
#[enum_dispatch(Cone<T>)]
pub enum SupportedCone<T>
where
T: FloatT,
{
ZeroCone(ZeroCone<T>),
NonnegativeCone(NonnegativeCone<T>),
SecondOrderCone(SecondOrderCone<T>),
ExponentialCone(ExponentialCone<T>),
PowerCone(PowerCone<T>),
}
#[allow(clippy::enum_variant_names)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub(crate) enum SupportedConeTag {
ZeroCone = 0,
NonnegativeCone,
SecondOrderCone,
ExponentialCone,
PowerCone,
}
pub(crate) trait SupportedConeAsTag {
fn as_tag(&self) -> SupportedConeTag;
}
impl<T> SupportedConeAsTag for SupportedConeT<T> {
fn as_tag(&self) -> SupportedConeTag {
match self {
SupportedConeT::NonnegativeConeT(_) => SupportedConeTag::NonnegativeCone,
SupportedConeT::ZeroConeT(_) => SupportedConeTag::ZeroCone,
SupportedConeT::SecondOrderConeT(_) => SupportedConeTag::SecondOrderCone,
SupportedConeT::ExponentialConeT() => SupportedConeTag::ExponentialCone,
SupportedConeT::PowerConeT(_) => SupportedConeTag::PowerCone,
}
}
}
impl<T: FloatT> SupportedConeAsTag for SupportedCone<T> {
fn as_tag(&self) -> SupportedConeTag {
match self {
SupportedCone::NonnegativeCone(_) => SupportedConeTag::NonnegativeCone,
SupportedCone::ZeroCone(_) => SupportedConeTag::ZeroCone,
SupportedCone::SecondOrderCone(_) => SupportedConeTag::SecondOrderCone,
SupportedCone::ExponentialCone(_) => SupportedConeTag::ExponentialCone,
SupportedCone::PowerCone(_) => SupportedConeTag::PowerCone,
}
}
}
impl SupportedConeTag {
pub fn as_str(&self) -> &'static str {
match self {
SupportedConeTag::ZeroCone => "ZeroCone",
SupportedConeTag::NonnegativeCone => "NonnegativeCone",
SupportedConeTag::SecondOrderCone => "SecondOrderCone",
SupportedConeTag::ExponentialCone => "ExponentialCone",
SupportedConeTag::PowerCone => "PowerCone",
}
}
}