use std::collections::HashSet;
use std::fmt::{Debug, Display};
use std::fmt;
use std::iter::FromIterator;
use std::ops::{AddAssign, Deref, Index, IndexMut, Mul};
use std::slice::{Iter, IterMut};
use std::vec::IntoIter;
use index_utils::remove_indices;
use num_traits::Zero;
use crate::algorithm::two_phase::matrix_provider::column::ColumnIterator;
use crate::data::linear_algebra::vector::Vector;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Dense<F> {
#[allow(missing_docs)]
data: Vec<F>,
}
impl<F> Dense<F> {
pub fn constant(value: F, len: usize) -> Self
where
F: Clone,
{
debug_assert_ne!(len, 0);
Self { data: vec![value; len], }
}
pub fn extend_with_values(&mut self, new_values: Vec<F>) {
self.data.extend(new_values);
}
pub fn inner(&self) -> &[F] {
&self.data
}
pub fn inner_mut(&mut self) -> &mut [F] {
&mut self.data
}
}
impl<F: PartialEq + Display + Debug> Index<usize> for Dense<F> {
type Output = F;
fn index(&self, index: usize) -> &Self::Output {
debug_assert!(index < self.len());
&self.data[index]
}
}
impl<F: PartialEq + Display + Debug> IndexMut<usize> for Dense<F> {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
debug_assert!(index < self.len());
&mut self.data[index]
}
}
impl<F> Deref for Dense<F> {
type Target = [F];
fn deref(&self) -> &Self::Target {
self.data.deref()
}
}
impl<F: PartialEq + Display + Debug> Vector<F> for Dense<F> {
type Inner = F;
fn new(data: Vec<Self::Inner>, len: usize) -> Self {
debug_assert_eq!(data.len(), len);
Self { data, }
}
fn sparse_inner_product<'a, 'b, I: ColumnIterator<'b>, O>(&'a self, column: I) -> O
where
&'a F: Mul<&'b I::F, Output=O>,
O: Zero + AddAssign,
{
let mut total = O::zero();
for (i, v) in column {
total += &self.data[i] * v;
}
total
}
fn push_value(&mut self, value: F) {
self.data.push(value);
}
fn set(&mut self, i: usize, value: F) {
debug_assert!(i < self.len());
self.data[i] = value;
}
fn get(&self, i: usize) -> Option<&F> {
debug_assert!(i < self.len());
Some(&self.data[i])
}
fn remove_indices(&mut self, indices: &[usize]) {
debug_assert!(indices.len() <= self.len());
debug_assert!(indices.is_sorted());
debug_assert!(indices.iter().collect::<HashSet<_>>().len() == indices.len());
debug_assert!(indices.iter().all(|&i| i < self.len()));
remove_indices(&mut self.data, indices);
}
fn iter(&self) -> Iter<Self::Inner> {
self.data.iter()
}
fn iter_mut(&mut self) -> IterMut<Self::Inner> {
self.data.iter_mut()
}
fn len(&self) -> usize {
self.data.len()
}
fn is_empty(&self) -> bool {
self.len() == 0
}
fn size(&self) -> usize {
self.data.len()
}
}
impl<T> FromIterator<T> for Dense<T> {
fn from_iter<I: IntoIterator<Item=T>>(iter: I) -> Self {
Self {
data: iter.into_iter().collect()
}
}
}
impl<T> IntoIterator for Dense<T> {
type Item = T;
type IntoIter = IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.data.into_iter()
}
}
impl<F: Display> Display for Dense<F> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for value in &self.data {
writeln!(f, "{}", value)?;
}
writeln!(f)
}
}