use std::iter::Iterator;
use crate::math::tensor::{AsMutTensor, AsRefSlice, AsRefTensor, Tensor};
use crate::numeric::UnsignedInteger;
use crate::{ck_dim_div, tensor_traits};
use super::*;
#[derive(PartialEq)]
pub struct PolynomialList<Cont> {
pub(crate) tensor: Tensor<Cont>,
pub(crate) poly_size: PolynomialSize,
}
tensor_traits!(PolynomialList);
impl<Coef> PolynomialList<Vec<Coef>>
where
Coef: Copy,
{
pub fn allocate(value: Coef, number: PolynomialCount, size: PolynomialSize) -> Self {
PolynomialList {
tensor: Tensor::from_container(vec![value; number.0 * size.0]),
poly_size: size,
}
}
}
impl<Cont> PolynomialList<Cont> {
pub fn from_container(cont: Cont, poly_size: PolynomialSize) -> PolynomialList<Cont>
where
Cont: AsRefSlice,
{
ck_dim_div!(cont.as_slice().len() => poly_size.0);
PolynomialList {
tensor: Tensor::from_container(cont),
poly_size,
}
}
pub fn polynomial_count(&self) -> PolynomialCount
where
Self: AsRefTensor,
{
PolynomialCount(self.as_tensor().len() / self.poly_size.0)
}
pub fn polynomial_size(&self) -> PolynomialSize {
self.poly_size
}
pub fn get_polynomial(&self, n: usize) -> Polynomial<&[<Self as AsRefTensor>::Element]>
where
Self: AsRefTensor,
{
Polynomial {
tensor: self
.as_tensor()
.get_sub((n * self.poly_size.0)..(n + 1) * self.poly_size.0),
}
}
pub fn get_mut_polynomial(
&mut self,
n: usize,
) -> Polynomial<&mut [<Self as AsRefTensor>::Element]>
where
Self: AsMutTensor,
{
let index = (n * self.poly_size.0)..((n + 1) * self.poly_size.0);
Polynomial {
tensor: self.as_mut_tensor().get_sub_mut(index),
}
}
pub fn polynomial_iter(
&self,
) -> impl Iterator<Item = Polynomial<&[<Self as AsRefTensor>::Element]>>
where
Self: AsRefTensor,
{
self.as_tensor()
.subtensor_iter(self.poly_size.0)
.map(|sub| Polynomial::from_container(sub.into_container()))
}
pub fn polynomial_iter_mut(
&mut self,
) -> impl Iterator<Item = Polynomial<&mut [<Self as AsMutTensor>::Element]>>
where
Self: AsMutTensor,
{
let chunks_size = self.poly_size.0;
self.as_mut_tensor()
.subtensor_iter_mut(chunks_size)
.map(|sub| Polynomial::from_container(sub.into_container()))
}
pub fn update_with_wrapping_monic_monomial_mul<Coef>(&mut self, monomial_degree: MonomialDegree)
where
Self: AsMutTensor<Element = Coef>,
Coef: UnsignedInteger,
{
for mut poly in self.polynomial_iter_mut() {
poly.update_with_wrapping_monic_monomial_mul(monomial_degree);
}
}
pub fn update_with_wrapping_monic_monomial_div<Coef>(&mut self, monomial_degree: MonomialDegree)
where
Self: AsMutTensor<Element = Coef>,
Coef: UnsignedInteger,
{
for mut poly in self.polynomial_iter_mut() {
poly.update_with_wrapping_unit_monomial_div(monomial_degree);
}
}
}