use rand::Rng;
use std::collections::HashSet;
use rand::RngExt;
use streaming_iterator::StreamingIterator;
use crate::Ldd;
use crate::Storage;
use crate::Value;
use crate::iterators::*;
use crate::operations::*;
pub fn random_vector<R: Rng>(rng: &mut R, length: usize, max_value: Value) -> Vec<Value> {
let mut vector: Vec<Value> = Vec::new();
for _ in 0..length {
vector.push(rng.random_range(0..max_value));
}
vector
}
pub fn random_sorted_vector<R: Rng>(rng: &mut R, length: usize, max_value: Value) -> Vec<Value> {
use rand::prelude::IteratorRandom;
let mut result = (0..max_value).sample(rng, length);
result.sort();
result
}
pub fn random_vector_set<R: Rng>(rng: &mut R, amount: usize, length: usize, max_value: Value) -> HashSet<Vec<Value>> {
let mut result: HashSet<Vec<Value>> = HashSet::new();
for _ in 0..amount {
result.insert(random_vector(rng, length, max_value));
}
result
}
pub fn from_iter<'a, I>(storage: &mut Storage, iter: I) -> Ldd
where
I: Iterator<Item = &'a Vec<Value>>,
{
let mut result = storage.empty_set().clone();
for vector in iter {
let single = singleton(storage, vector);
result = union(storage, &result, &single);
}
result
}
pub fn print_left(storage: &Storage, left: &Ldd, right: &Ldd) -> bool {
let mut result = true;
let mut iter = iter(storage, left);
while let Some(element) = iter.next() {
if !element_of(storage, element, right) {
result = false;
eprintln!("{:?}", element);
}
}
result
}
pub fn print_differences(storage: &Storage, left: &Ldd, right: &Ldd) {
print_left(storage, left, right);
print_left(storage, right, left);
}
pub fn project_vector(vector: &[Value], proj: &[Value]) -> Vec<Value> {
let mut result = Vec::<Value>::new();
for i in proj {
result.push(vector[*i as usize]);
}
result
}