#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub(crate) struct Generator<const N: usize>([f64; N]);
impl<const N: usize> Generator<N> {
pub(crate) const fn new(input: [f64; N]) -> Self {
Self(input)
}
pub(crate) const fn generator(&self) -> &[f64; N] {
&self.0
}
pub(crate) const fn point(&self, centre: &[f64; N], half_widths: &[f64; N]) -> [f64; N] {
let mut point = [0.0; N];
let mut i = 0;
while i < N {
point[i] = centre[i] + self.0[i] * half_widths[i];
i += 1;
}
point
}
#[cfg(test)]
pub(crate) const fn permutations(&self) -> Permutations<N> {
Permutations::new(self.generator())
}
pub(crate) const fn point_permutations(
&self,
centre: &[f64; N],
half_widths: &[f64; N],
) -> Permutations<N> {
Permutations::new(self.generator())
.with_centre(centre)
.with_half_widths(half_widths)
}
}
pub(crate) struct Permutations<const N: usize> {
initial: bool,
current: [f64; N],
j_exchange: usize,
i_exchange: usize,
centre: [f64; N],
half_widths: [f64; N],
}
impl<const N: usize> Permutations<N> {
pub(crate) const fn new(first: &[f64; N]) -> Self {
Self {
initial: true,
current: *first,
j_exchange: 0,
i_exchange: 0,
centre: [0.0; N],
half_widths: [1.0; N],
}
}
pub(crate) const fn with_centre(mut self, centre: &[f64; N]) -> Self {
self.centre = *centre;
self
}
pub(crate) const fn with_half_widths(mut self, half_widths: &[f64; N]) -> Self {
self.half_widths = *half_widths;
self
}
const fn point(&self) -> [f64; N] {
let mut output = [0.0; N];
let mut i = 0;
while i < N {
output[i] = self.centre[i] + self.current[i] * self.half_widths[i];
i += 1;
}
output
}
}
impl<const N: usize> Iterator for Permutations<N> {
type Item = [f64; N];
fn next(&mut self) -> Option<Self::Item> {
if self.initial {
self.initial = false;
return Some(self.point());
}
for i in 0..N {
self.current[i] = -self.current[i];
if self.current[i] < 0.0 {
return Some(self.point());
}
}
for i in 1..N {
if self.current[i - 1] > self.current[i] {
let value_i = self.current[i];
self.i_exchange = i - 1;
for j in 1..=(i / 2) {
let value_j = self.current[j - 1];
self.current.swap(j - 1, i - j);
if value_j <= value_i {
self.i_exchange -= 1;
}
if self.current[j - 1] > value_i {
self.j_exchange = j - 1;
}
}
if self.current[self.i_exchange] <= value_i {
self.i_exchange = self.j_exchange;
}
self.current[i] = self.current[self.i_exchange];
self.current[self.i_exchange] = value_i;
return Some(self.point());
}
}
None
}
}
#[cfg(test)]
#[allow(clippy::too_many_lines)]
mod tests_no_centre_or_half_widths {
use super::*;
#[test]
fn check_ndim_2_generators() {
let ndim = 2;
{
let vv = Generator::new([0.75f64, 0.75]);
let should_be = [[0.75, 0.75], [-0.75, 0.75], [0.75, -0.75], [-0.75, -0.75]].iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
}
assert_eq!(count, 2usize.pow(ndim));
}
{
let vv = Generator::new([0.75f64, 0.5]);
let should_be = [
[0.75, 0.5],
[-0.75, 0.5],
[0.75, -0.5],
[-0.75, -0.5],
[0.5, 0.75],
[-0.5, 0.75],
[0.5, -0.75],
[-0.5, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.0]);
let should_be = [
[0.75f64, 0.0],
[-0.75f64, 0.0],
[0.0, 0.75f64],
[0.0, -0.75f64],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim);
}
}
#[test]
fn check_ndim_3_generators() {
let ndim = 3;
{
let vv = Generator::new([0.75f64, 0.75, 0.75]);
let should_be = [
[0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75],
[0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75],
[0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75],
[0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75],
[0.75, 0.75, 0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 2usize.pow(ndim));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.5]);
let should_be = [
[0.75, 0.75, 0.5],
[-0.75, 0.75, 0.5],
[0.75, -0.75, 0.5],
[-0.75, -0.75, 0.5],
[0.75, 0.75, -0.5],
[-0.75, 0.75, -0.5],
[0.75, -0.75, -0.5],
[-0.75, -0.75, -0.5],
[0.75, 0.5, 0.75],
[-0.75, 0.5, 0.75],
[0.75, -0.5, 0.75],
[-0.75, -0.5, 0.75],
[0.75, 0.5, -0.75],
[-0.75, 0.5, -0.75],
[0.75, -0.5, -0.75],
[-0.75, -0.5, -0.75],
[0.5, 0.75, 0.75],
[-0.5, 0.75, 0.75],
[0.5, -0.75, 0.75],
[-0.5, -0.75, 0.75],
[0.5, 0.75, -0.75],
[-0.5, 0.75, -0.75],
[0.5, -0.75, -0.75],
[-0.5, -0.75, -0.75],
[0.75, 0.75, 0.5],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2));
}
{
let vv = Generator::new([0.75f64, 0.5, 0.0]);
let should_be = [
[0.75f64, 0.5, 0.0],
[-0.75f64, 0.5, 0.0],
[0.75f64, -0.5, 0.0],
[-0.75f64, -0.5, 0.0],
[0.5, 0.75f64, 0.0],
[-0.5, 0.75f64, 0.0],
[0.5, -0.75f64, 0.0],
[-0.5, -0.75f64, 0.0],
[0.75f64, 0.0, 0.5],
[-0.75f64, 0.0, 0.5],
[0.75f64, 0.0, -0.5],
[-0.75f64, 0.0, -0.5],
[0.0, 0.75f64, 0.5],
[0.0, -0.75f64, 0.5],
[0.0, 0.75f64, -0.5],
[0.0, -0.75f64, -0.5],
[0.5, 0.0, 0.75f64],
[-0.5, 0.0, 0.75f64],
[0.5, 0.0, -0.75f64],
[-0.5, 0.0, -0.75f64],
[0.0, 0.5, 0.75f64],
[0.0, -0.5, 0.75f64],
[0.0, 0.5, -0.75f64],
[0.0, -0.5, -0.75f64],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.0]);
let should_be = [
[0.75f64, 0.75, 0.0],
[-0.75f64, 0.75, 0.0],
[0.75f64, -0.75, 0.0],
[-0.75f64, -0.75, 0.0],
[0.75f64, 0.0, 0.75],
[-0.75f64, 0.0, 0.75],
[0.75f64, 0.0, -0.75],
[-0.75f64, 0.0, -0.75],
[0.0, 0.75f64, 0.75],
[0.0, -0.75f64, 0.75],
[0.0, 0.75f64, -0.75],
[0.0, -0.75f64, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.0, 0.0]);
let should_be = [
[0.75f64, 0.0, 0.0],
[-0.75f64, 0.0, 0.0],
[0.0, 0.75f64, 0.0],
[0.0, -0.75f64, 0.0],
[0.0, 0.0, 0.75],
[0.0, -0.0, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim);
}
}
#[test]
fn check_ndim_4_generators() {
let ndim = 4;
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.75]);
let should_be = [
[0.75, 0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75, 0.75],
[0.75, -0.75, 0.75, 0.75],
[-0.75, -0.75, 0.75, 0.75],
[0.75, 0.75, -0.75, 0.75],
[-0.75, 0.75, -0.75, 0.75],
[0.75, -0.75, -0.75, 0.75],
[-0.75, -0.75, -0.75, 0.75],
[0.75, 0.75, 0.75, -0.75],
[-0.75, 0.75, 0.75, -0.75],
[0.75, -0.75, 0.75, -0.75],
[-0.75, -0.75, 0.75, -0.75],
[0.75, 0.75, -0.75, -0.75],
[-0.75, 0.75, -0.75, -0.75],
[0.75, -0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
}
assert_eq!(count, 2usize.pow(ndim));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.0]);
let should_be = [
[0.75, 0.75, 0.75, 0.0],
[-0.75, 0.75, 0.75, 0.0],
[0.75, -0.75, 0.75, 0.0],
[-0.75, -0.75, 0.75, 0.0],
[0.75, 0.75, -0.75, 0.0],
[-0.75, 0.75, -0.75, 0.0],
[0.75, -0.75, -0.75, 0.0],
[-0.75, -0.75, -0.75, 0.0],
[0.75, 0.75, -0.0, 0.75],
[-0.75, 0.75, -0.0, 0.75],
[0.75, -0.75, -0.0, 0.75],
[-0.75, -0.75, -0.0, 0.75],
[0.75, 0.75, 0.0, -0.75],
[-0.75, 0.75, 0.0, -0.75],
[0.75, -0.75, 0.0, -0.75],
[-0.75, -0.75, 0.0, -0.75],
[0.75, -0.0, 0.75, 0.75],
[-0.75, -0.0, 0.75, 0.75],
[0.75, 0.0, -0.75, 0.75],
[-0.75, 0.0, -0.75, 0.75],
[0.75, -0.0, 0.75, -0.75],
[-0.75, -0.0, 0.75, -0.75],
[0.75, 0.0, -0.75, -0.75],
[-0.75, 0.0, -0.75, -0.75],
[-0.0, 0.75, 0.75, 0.75],
[0.0, -0.75, 0.75, 0.75],
[-0.0, 0.75, -0.75, 0.75],
[0.0, -0.75, -0.75, 0.75],
[-0.0, 0.75, 0.75, -0.75],
[0.0, -0.75, 0.75, -0.75],
[-0.0, 0.75, -0.75, -0.75],
[0.0, -0.75, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2) / 3);
}
{
let vv = Generator::new([0.75f64, 0.75, 0.5, 0.0]);
let should_be = [
[0.75, 0.75, 0.50, 0.0],
[-0.75, 0.75, 0.50, 0.0],
[0.75, -0.75, 0.50, 0.0],
[-0.75, -0.75, 0.50, 0.0],
[0.75, 0.75, -0.50, 0.0],
[-0.75, 0.75, -0.50, 0.0],
[0.75, -0.75, -0.50, 0.0],
[-0.75, -0.75, -0.50, 0.0],
[0.75, 0.50, 0.75, -0.0],
[-0.75, 0.50, 0.75, -0.0],
[0.75, -0.50, 0.75, -0.0],
[-0.75, -0.50, 0.75, -0.0],
[0.75, 0.50, -0.75, -0.0],
[-0.75, 0.50, -0.75, -0.0],
[0.75, -0.50, -0.75, -0.0],
[-0.75, -0.50, -0.75, -0.0],
[0.50, 0.75, 0.75, 0.0],
[-0.50, 0.75, 0.75, 0.0],
[0.50, -0.75, 0.75, 0.0],
[-0.50, -0.75, 0.75, 0.0],
[0.50, 0.75, -0.75, 0.0],
[-0.50, 0.75, -0.75, 0.0],
[0.50, -0.75, -0.75, 0.0],
[-0.50, -0.75, -0.75, 0.0],
[0.75, 0.75, -0.0, 0.50],
[-0.75, 0.75, -0.0, 0.50],
[0.75, -0.75, -0.0, 0.50],
[-0.75, -0.75, -0.0, 0.50],
[0.75, 0.75, 0.0, -0.50],
[-0.75, 0.75, 0.0, -0.50],
[0.75, -0.75, 0.0, -0.50],
[-0.75, -0.75, 0.0, -0.50],
[0.75, -0.0, 0.75, 0.50],
[-0.75, -0.0, 0.75, 0.50],
[0.75, 0.0, -0.75, 0.50],
[-0.75, 0.0, -0.75, 0.50],
[0.75, -0.0, 0.75, -0.50],
[-0.75, -0.0, 0.75, -0.50],
[0.75, 0.0, -0.75, -0.50],
[-0.75, 0.0, -0.75, -0.50],
[-0.0, 0.75, 0.75, 0.50],
[0.0, -0.75, 0.75, 0.50],
[-0.0, 0.75, -0.75, 0.50],
[0.0, -0.75, -0.75, 0.50],
[-0.0, 0.75, 0.75, -0.50],
[0.0, -0.75, 0.75, -0.50],
[-0.0, 0.75, -0.75, -0.50],
[0.0, -0.75, -0.75, -0.50],
[0.75, 0.50, -0.0, 0.75],
[-0.75, 0.50, -0.0, 0.75],
[0.75, -0.50, -0.0, 0.75],
[-0.75, -0.50, -0.0, 0.75],
[0.75, 0.50, 0.0, -0.75],
[-0.75, 0.50, 0.0, -0.75],
[0.75, -0.50, 0.0, -0.75],
[-0.75, -0.50, 0.0, -0.75],
[0.50, 0.75, -0.0, 0.75],
[-0.50, 0.75, -0.0, 0.75],
[0.50, -0.75, -0.0, 0.75],
[-0.50, -0.75, -0.0, 0.75],
[0.50, 0.75, 0.0, -0.75],
[-0.50, 0.75, 0.0, -0.75],
[0.50, -0.75, 0.0, -0.75],
[-0.50, -0.75, 0.0, -0.75],
[0.75, -0.0, 0.50, 0.75],
[-0.75, -0.0, 0.50, 0.75],
[0.75, 0.0, -0.50, 0.75],
[-0.75, 0.0, -0.50, 0.75],
[0.75, -0.0, 0.50, -0.75],
[-0.75, -0.0, 0.50, -0.75],
[0.75, 0.0, -0.50, -0.75],
[-0.75, 0.0, -0.50, -0.75],
[-0.0, 0.75, 0.50, 0.75],
[0.0, -0.75, 0.50, 0.75],
[-0.0, 0.75, -0.50, 0.75],
[0.0, -0.75, -0.50, 0.75],
[-0.0, 0.75, 0.50, -0.75],
[0.0, -0.75, 0.50, -0.75],
[-0.0, 0.75, -0.50, -0.75],
[0.0, -0.75, -0.50, -0.75],
[0.50, -0.0, 0.75, 0.75],
[-0.50, -0.0, 0.75, 0.75],
[0.50, 0.0, -0.75, 0.75],
[-0.50, 0.0, -0.75, 0.75],
[0.50, -0.0, 0.75, -0.75],
[-0.50, -0.0, 0.75, -0.75],
[0.50, 0.0, -0.75, -0.75],
[-0.50, 0.0, -0.75, -0.75],
[-0.0, 0.50, 0.75, 0.75],
[0.0, -0.50, 0.75, 0.75],
[-0.0, 0.50, -0.75, 0.75],
[0.0, -0.50, -0.75, 0.75],
[-0.0, 0.50, 0.75, -0.75],
[0.0, -0.50, 0.75, -0.75],
[-0.0, 0.50, -0.75, -0.75],
[0.0, -0.50, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2));
}
{
let vv = Generator::new([0.75f64, 0.5, 0.0, 0.0]);
let should_be = [
[0.75, 0.50, 0.0, 0.0],
[-0.75, 0.50, 0.0, 0.0],
[0.75, -0.50, 0.0, 0.0],
[-0.75, -0.50, 0.0, 0.0],
[0.50, 0.75, -0.0, -0.0],
[-0.50, 0.75, -0.0, -0.0],
[0.50, -0.75, -0.0, -0.0],
[-0.50, -0.75, -0.0, -0.0],
[0.75, 0.0, 0.50, 0.0],
[-0.75, 0.0, 0.50, 0.0],
[0.75, -0.0, -0.50, 0.0],
[-0.75, -0.0, -0.50, 0.0],
[0.0, 0.75, 0.50, -0.0],
[-0.0, -0.75, 0.50, -0.0],
[0.0, 0.75, -0.50, -0.0],
[-0.0, -0.75, -0.50, -0.0],
[0.50, 0.0, 0.75, 0.0],
[-0.50, 0.0, 0.75, 0.0],
[0.50, -0.0, -0.75, 0.0],
[-0.50, -0.0, -0.75, 0.0],
[0.0, 0.50, 0.75, -0.0],
[-0.0, -0.50, 0.75, -0.0],
[0.0, 0.50, -0.75, -0.0],
[-0.0, -0.50, -0.75, -0.0],
[0.75, 0.0, 0.0, 0.50],
[-0.75, 0.0, 0.0, 0.50],
[0.75, -0.0, -0.0, -0.50],
[-0.75, -0.0, -0.0, -0.50],
[0.0, 0.75, 0.0, 0.50],
[-0.0, -0.75, 0.0, 0.50],
[0.0, 0.75, -0.0, -0.50],
[-0.0, -0.75, -0.0, -0.50],
[0.0, 0.0, 0.75, 0.50],
[-0.0, -0.0, -0.75, 0.50],
[0.0, 0.0, 0.75, -0.50],
[-0.0, -0.0, -0.75, -0.50],
[0.50, 0.0, 0.0, 0.75],
[-0.50, 0.0, 0.0, 0.75],
[0.50, -0.0, -0.0, -0.75],
[-0.50, -0.0, -0.0, -0.75],
[0.0, 0.50, 0.0, 0.75],
[-0.0, -0.50, 0.0, 0.75],
[0.0, 0.50, -0.0, -0.75],
[-0.0, -0.50, -0.0, -0.75],
[0.0, 0.0, 0.50, 0.75],
[-0.0, -0.0, -0.50, 0.75],
[0.0, 0.0, 0.50, -0.75],
[-0.0, -0.0, -0.50, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.0, 0.0],
[-0.75, 0.75, 0.0, 0.0],
[0.75, -0.75, 0.0, 0.0],
[-0.75, -0.75, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.0],
[-0.75, -0.0, 0.75, -0.0],
[0.75, 0.0, -0.75, -0.0],
[-0.75, 0.0, -0.75, -0.0],
[-0.0, 0.75, 0.75, 0.0],
[0.0, -0.75, 0.75, 0.0],
[-0.0, 0.75, -0.75, 0.0],
[0.0, -0.75, -0.75, 0.0],
[0.75, -0.0, -0.0, 0.75],
[-0.75, -0.0, -0.0, 0.75],
[0.75, 0.0, 0.0, -0.75],
[-0.75, 0.0, 0.0, -0.75],
[-0.0, 0.75, -0.0, 0.75],
[0.0, -0.75, -0.0, 0.75],
[-0.0, 0.75, 0.0, -0.75],
[0.0, -0.75, 0.0, -0.75],
[-0.0, -0.0, 0.75, 0.75],
[0.0, 0.0, -0.75, 0.75],
[-0.0, -0.0, 0.75, -0.75],
[0.0, 0.0, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.0, 0.0, 0.0],
[-0.75, 0.0, 0.0, 0.0],
[-0.0, 0.75, -0.0, -0.0],
[0.0, -0.75, -0.0, -0.0],
[0.0, -0.0, 0.75, 0.0],
[-0.0, 0.0, -0.75, 0.0],
[-0.0, -0.0, 0.0, 0.75],
[0.0, 0.0, -0.0, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim);
}
}
#[test]
fn check_ndim_5_generators() {
let ndim = 5;
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.75, 0.75]);
let should_be = [
[0.75, 0.75, 0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75, 0.75, 0.75],
[0.75, -0.75, 0.75, 0.75, 0.75],
[-0.75, -0.75, 0.75, 0.75, 0.75],
[0.75, 0.75, -0.75, 0.75, 0.75],
[-0.75, 0.75, -0.75, 0.75, 0.75],
[0.75, -0.75, -0.75, 0.75, 0.75],
[-0.75, -0.75, -0.75, 0.75, 0.75],
[0.75, 0.75, 0.75, -0.75, 0.75],
[-0.75, 0.75, 0.75, -0.75, 0.75],
[0.75, -0.75, 0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75, -0.75, 0.75],
[0.75, 0.75, -0.75, -0.75, 0.75],
[-0.75, 0.75, -0.75, -0.75, 0.75],
[0.75, -0.75, -0.75, -0.75, 0.75],
[-0.75, -0.75, -0.75, -0.75, 0.75],
[0.75, 0.75, 0.75, 0.75, -0.75],
[-0.75, 0.75, 0.75, 0.75, -0.75],
[0.75, -0.75, 0.75, 0.75, -0.75],
[-0.75, -0.75, 0.75, 0.75, -0.75],
[0.75, 0.75, -0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75, 0.75, -0.75],
[0.75, -0.75, -0.75, 0.75, -0.75],
[-0.75, -0.75, -0.75, 0.75, -0.75],
[0.75, 0.75, 0.75, -0.75, -0.75],
[-0.75, 0.75, 0.75, -0.75, -0.75],
[0.75, -0.75, 0.75, -0.75, -0.75],
[-0.75, -0.75, 0.75, -0.75, -0.75],
[0.75, 0.75, -0.75, -0.75, -0.75],
[-0.75, 0.75, -0.75, -0.75, -0.75],
[0.75, -0.75, -0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
}
assert_eq!(count, 2usize.pow(ndim));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.75, 0.0, 0.0],
[-0.75, 0.75, 0.75, 0.0, 0.0],
[0.75, -0.75, 0.75, 0.0, 0.0],
[-0.75, -0.75, 0.75, 0.0, 0.0],
[0.75, 0.75, -0.75, 0.0, 0.0],
[-0.75, 0.75, -0.75, 0.0, 0.0],
[0.75, -0.75, -0.75, 0.0, 0.0],
[-0.75, -0.75, -0.75, 0.0, 0.0],
[0.75, 0.75, -0.0, 0.75, -0.0],
[-0.75, 0.75, -0.0, 0.75, -0.0],
[0.75, -0.75, -0.0, 0.75, -0.0],
[-0.75, -0.75, -0.0, 0.75, -0.0],
[0.75, 0.75, 0.0, -0.75, -0.0],
[-0.75, 0.75, 0.0, -0.75, -0.0],
[0.75, -0.75, 0.0, -0.75, -0.0],
[-0.75, -0.75, 0.0, -0.75, -0.0],
[0.75, -0.0, 0.75, 0.75, 0.0],
[-0.75, -0.0, 0.75, 0.75, 0.0],
[0.75, 0.0, -0.75, 0.75, 0.0],
[-0.75, 0.0, -0.75, 0.75, 0.0],
[0.75, -0.0, 0.75, -0.75, 0.0],
[-0.75, -0.0, 0.75, -0.75, 0.0],
[0.75, 0.0, -0.75, -0.75, 0.0],
[-0.75, 0.0, -0.75, -0.75, 0.0],
[-0.0, 0.75, 0.75, 0.75, -0.0],
[0.0, -0.75, 0.75, 0.75, -0.0],
[-0.0, 0.75, -0.75, 0.75, -0.0],
[0.0, -0.75, -0.75, 0.75, -0.0],
[-0.0, 0.75, 0.75, -0.75, -0.0],
[0.0, -0.75, 0.75, -0.75, -0.0],
[-0.0, 0.75, -0.75, -0.75, -0.0],
[0.0, -0.75, -0.75, -0.75, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.75],
[-0.75, 0.75, 0.0, -0.0, 0.75],
[0.75, -0.75, 0.0, -0.0, 0.75],
[-0.75, -0.75, 0.0, -0.0, 0.75],
[0.75, 0.75, -0.0, 0.0, -0.75],
[-0.75, 0.75, -0.0, 0.0, -0.75],
[0.75, -0.75, -0.0, 0.0, -0.75],
[-0.75, -0.75, -0.0, 0.0, -0.75],
[0.75, 0.0, 0.75, -0.0, 0.75],
[-0.75, 0.0, 0.75, -0.0, 0.75],
[0.75, -0.0, -0.75, -0.0, 0.75],
[-0.75, -0.0, -0.75, -0.0, 0.75],
[0.75, 0.0, 0.75, 0.0, -0.75],
[-0.75, 0.0, 0.75, 0.0, -0.75],
[0.75, -0.0, -0.75, 0.0, -0.75],
[-0.75, -0.0, -0.75, 0.0, -0.75],
[0.0, 0.75, 0.75, -0.0, 0.75],
[-0.0, -0.75, 0.75, -0.0, 0.75],
[0.0, 0.75, -0.75, -0.0, 0.75],
[-0.0, -0.75, -0.75, -0.0, 0.75],
[0.0, 0.75, 0.75, 0.0, -0.75],
[-0.0, -0.75, 0.75, 0.0, -0.75],
[0.0, 0.75, -0.75, 0.0, -0.75],
[-0.0, -0.75, -0.75, 0.0, -0.75],
[0.75, -0.0, 0.0, 0.75, 0.75],
[-0.75, -0.0, 0.0, 0.75, 0.75],
[0.75, 0.0, -0.0, -0.75, 0.75],
[-0.75, 0.0, -0.0, -0.75, 0.75],
[0.75, -0.0, 0.0, 0.75, -0.75],
[-0.75, -0.0, 0.0, 0.75, -0.75],
[0.75, 0.0, -0.0, -0.75, -0.75],
[-0.75, 0.0, -0.0, -0.75, -0.75],
[-0.0, 0.75, 0.0, 0.75, 0.75],
[0.0, -0.75, 0.0, 0.75, 0.75],
[-0.0, 0.75, -0.0, -0.75, 0.75],
[0.0, -0.75, -0.0, -0.75, 0.75],
[-0.0, 0.75, 0.0, 0.75, -0.75],
[0.0, -0.75, 0.0, 0.75, -0.75],
[-0.0, 0.75, -0.0, -0.75, -0.75],
[0.0, -0.75, -0.0, -0.75, -0.75],
[0.0, -0.0, 0.75, 0.75, 0.75],
[-0.0, 0.0, -0.75, 0.75, 0.75],
[0.0, -0.0, 0.75, -0.75, 0.75],
[-0.0, 0.0, -0.75, -0.75, 0.75],
[0.0, -0.0, 0.75, 0.75, -0.75],
[-0.0, 0.0, -0.75, 0.75, -0.75],
[0.0, -0.0, 0.75, -0.75, -0.75],
[-0.0, 0.0, -0.75, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2) / 3);
}
{
let vv = Generator::new([0.75f64, 0.75, 0.5, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.50, 0.0, 0.0],
[-0.75, 0.75, 0.50, 0.0, 0.0],
[0.75, -0.75, 0.50, 0.0, 0.0],
[-0.75, -0.75, 0.50, 0.0, 0.0],
[0.75, 0.75, -0.50, 0.0, 0.0],
[-0.75, 0.75, -0.50, 0.0, 0.0],
[0.75, -0.75, -0.50, 0.0, 0.0],
[-0.75, -0.75, -0.50, 0.0, 0.0],
[0.75, 0.50, 0.75, -0.0, -0.0],
[-0.75, 0.50, 0.75, -0.0, -0.0],
[0.75, -0.50, 0.75, -0.0, -0.0],
[-0.75, -0.50, 0.75, -0.0, -0.0],
[0.75, 0.50, -0.75, -0.0, -0.0],
[-0.75, 0.50, -0.75, -0.0, -0.0],
[0.75, -0.50, -0.75, -0.0, -0.0],
[-0.75, -0.50, -0.75, -0.0, -0.0],
[0.50, 0.75, 0.75, 0.0, 0.0],
[-0.50, 0.75, 0.75, 0.0, 0.0],
[0.50, -0.75, 0.75, 0.0, 0.0],
[-0.50, -0.75, 0.75, 0.0, 0.0],
[0.50, 0.75, -0.75, 0.0, 0.0],
[-0.50, 0.75, -0.75, 0.0, 0.0],
[0.50, -0.75, -0.75, 0.0, 0.0],
[-0.50, -0.75, -0.75, 0.0, 0.0],
[0.75, 0.75, -0.0, 0.50, -0.0],
[-0.75, 0.75, -0.0, 0.50, -0.0],
[0.75, -0.75, -0.0, 0.50, -0.0],
[-0.75, -0.75, -0.0, 0.50, -0.0],
[0.75, 0.75, 0.0, -0.50, -0.0],
[-0.75, 0.75, 0.0, -0.50, -0.0],
[0.75, -0.75, 0.0, -0.50, -0.0],
[-0.75, -0.75, 0.0, -0.50, -0.0],
[0.75, -0.0, 0.75, 0.50, 0.0],
[-0.75, -0.0, 0.75, 0.50, 0.0],
[0.75, 0.0, -0.75, 0.50, 0.0],
[-0.75, 0.0, -0.75, 0.50, 0.0],
[0.75, -0.0, 0.75, -0.50, 0.0],
[-0.75, -0.0, 0.75, -0.50, 0.0],
[0.75, 0.0, -0.75, -0.50, 0.0],
[-0.75, 0.0, -0.75, -0.50, 0.0],
[-0.0, 0.75, 0.75, 0.50, -0.0],
[0.0, -0.75, 0.75, 0.50, -0.0],
[-0.0, 0.75, -0.75, 0.50, -0.0],
[0.0, -0.75, -0.75, 0.50, -0.0],
[-0.0, 0.75, 0.75, -0.50, -0.0],
[0.0, -0.75, 0.75, -0.50, -0.0],
[-0.0, 0.75, -0.75, -0.50, -0.0],
[0.0, -0.75, -0.75, -0.50, -0.0],
[0.75, 0.50, -0.0, 0.75, 0.0],
[-0.75, 0.50, -0.0, 0.75, 0.0],
[0.75, -0.50, -0.0, 0.75, 0.0],
[-0.75, -0.50, -0.0, 0.75, 0.0],
[0.75, 0.50, 0.0, -0.75, 0.0],
[-0.75, 0.50, 0.0, -0.75, 0.0],
[0.75, -0.50, 0.0, -0.75, 0.0],
[-0.75, -0.50, 0.0, -0.75, 0.0],
[0.50, 0.75, -0.0, 0.75, -0.0],
[-0.50, 0.75, -0.0, 0.75, -0.0],
[0.50, -0.75, -0.0, 0.75, -0.0],
[-0.50, -0.75, -0.0, 0.75, -0.0],
[0.50, 0.75, 0.0, -0.75, -0.0],
[-0.50, 0.75, 0.0, -0.75, -0.0],
[0.50, -0.75, 0.0, -0.75, -0.0],
[-0.50, -0.75, 0.0, -0.75, -0.0],
[0.75, -0.0, 0.50, 0.75, 0.0],
[-0.75, -0.0, 0.50, 0.75, 0.0],
[0.75, 0.0, -0.50, 0.75, 0.0],
[-0.75, 0.0, -0.50, 0.75, 0.0],
[0.75, -0.0, 0.50, -0.75, 0.0],
[-0.75, -0.0, 0.50, -0.75, 0.0],
[0.75, 0.0, -0.50, -0.75, 0.0],
[-0.75, 0.0, -0.50, -0.75, 0.0],
[-0.0, 0.75, 0.50, 0.75, -0.0],
[0.0, -0.75, 0.50, 0.75, -0.0],
[-0.0, 0.75, -0.50, 0.75, -0.0],
[0.0, -0.75, -0.50, 0.75, -0.0],
[-0.0, 0.75, 0.50, -0.75, -0.0],
[0.0, -0.75, 0.50, -0.75, -0.0],
[-0.0, 0.75, -0.50, -0.75, -0.0],
[0.0, -0.75, -0.50, -0.75, -0.0],
[0.50, -0.0, 0.75, 0.75, 0.0],
[-0.50, -0.0, 0.75, 0.75, 0.0],
[0.50, 0.0, -0.75, 0.75, 0.0],
[-0.50, 0.0, -0.75, 0.75, 0.0],
[0.50, -0.0, 0.75, -0.75, 0.0],
[-0.50, -0.0, 0.75, -0.75, 0.0],
[0.50, 0.0, -0.75, -0.75, 0.0],
[-0.50, 0.0, -0.75, -0.75, 0.0],
[-0.0, 0.50, 0.75, 0.75, -0.0],
[0.0, -0.50, 0.75, 0.75, -0.0],
[-0.0, 0.50, -0.75, 0.75, -0.0],
[0.0, -0.50, -0.75, 0.75, -0.0],
[-0.0, 0.50, 0.75, -0.75, -0.0],
[0.0, -0.50, 0.75, -0.75, -0.0],
[-0.0, 0.50, -0.75, -0.75, -0.0],
[0.0, -0.50, -0.75, -0.75, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.50],
[-0.75, 0.75, 0.0, -0.0, 0.50],
[0.75, -0.75, 0.0, -0.0, 0.50],
[-0.75, -0.75, 0.0, -0.0, 0.50],
[0.75, 0.75, -0.0, 0.0, -0.50],
[-0.75, 0.75, -0.0, 0.0, -0.50],
[0.75, -0.75, -0.0, 0.0, -0.50],
[-0.75, -0.75, -0.0, 0.0, -0.50],
[0.75, 0.0, 0.75, -0.0, 0.50],
[-0.75, 0.0, 0.75, -0.0, 0.50],
[0.75, -0.0, -0.75, -0.0, 0.50],
[-0.75, -0.0, -0.75, -0.0, 0.50],
[0.75, 0.0, 0.75, 0.0, -0.50],
[-0.75, 0.0, 0.75, 0.0, -0.50],
[0.75, -0.0, -0.75, 0.0, -0.50],
[-0.75, -0.0, -0.75, 0.0, -0.50],
[0.0, 0.75, 0.75, -0.0, 0.50],
[-0.0, -0.75, 0.75, -0.0, 0.50],
[0.0, 0.75, -0.75, -0.0, 0.50],
[-0.0, -0.75, -0.75, -0.0, 0.50],
[0.0, 0.75, 0.75, 0.0, -0.50],
[-0.0, -0.75, 0.75, 0.0, -0.50],
[0.0, 0.75, -0.75, 0.0, -0.50],
[-0.0, -0.75, -0.75, 0.0, -0.50],
[0.75, -0.0, 0.0, 0.75, 0.50],
[-0.75, -0.0, 0.0, 0.75, 0.50],
[0.75, 0.0, -0.0, -0.75, 0.50],
[-0.75, 0.0, -0.0, -0.75, 0.50],
[0.75, -0.0, 0.0, 0.75, -0.50],
[-0.75, -0.0, 0.0, 0.75, -0.50],
[0.75, 0.0, -0.0, -0.75, -0.50],
[-0.75, 0.0, -0.0, -0.75, -0.50],
[-0.0, 0.75, 0.0, 0.75, 0.50],
[0.0, -0.75, 0.0, 0.75, 0.50],
[-0.0, 0.75, -0.0, -0.75, 0.50],
[0.0, -0.75, -0.0, -0.75, 0.50],
[-0.0, 0.75, 0.0, 0.75, -0.50],
[0.0, -0.75, 0.0, 0.75, -0.50],
[-0.0, 0.75, -0.0, -0.75, -0.50],
[0.0, -0.75, -0.0, -0.75, -0.50],
[0.0, -0.0, 0.75, 0.75, 0.50],
[-0.0, 0.0, -0.75, 0.75, 0.50],
[0.0, -0.0, 0.75, -0.75, 0.50],
[-0.0, 0.0, -0.75, -0.75, 0.50],
[0.0, -0.0, 0.75, 0.75, -0.50],
[-0.0, 0.0, -0.75, 0.75, -0.50],
[0.0, -0.0, 0.75, -0.75, -0.50],
[-0.0, 0.0, -0.75, -0.75, -0.50],
[0.75, 0.50, -0.0, 0.0, 0.75],
[-0.75, 0.50, -0.0, 0.0, 0.75],
[0.75, -0.50, -0.0, 0.0, 0.75],
[-0.75, -0.50, -0.0, 0.0, 0.75],
[0.75, 0.50, 0.0, -0.0, -0.75],
[-0.75, 0.50, 0.0, -0.0, -0.75],
[0.75, -0.50, 0.0, -0.0, -0.75],
[-0.75, -0.50, 0.0, -0.0, -0.75],
[0.50, 0.75, -0.0, 0.0, 0.75],
[-0.50, 0.75, -0.0, 0.0, 0.75],
[0.50, -0.75, -0.0, 0.0, 0.75],
[-0.50, -0.75, -0.0, 0.0, 0.75],
[0.50, 0.75, 0.0, -0.0, -0.75],
[-0.50, 0.75, 0.0, -0.0, -0.75],
[0.50, -0.75, 0.0, -0.0, -0.75],
[-0.50, -0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, 0.50, 0.0, 0.75],
[-0.75, -0.0, 0.50, 0.0, 0.75],
[0.75, 0.0, -0.50, 0.0, 0.75],
[-0.75, 0.0, -0.50, 0.0, 0.75],
[0.75, -0.0, 0.50, -0.0, -0.75],
[-0.75, -0.0, 0.50, -0.0, -0.75],
[0.75, 0.0, -0.50, -0.0, -0.75],
[-0.75, 0.0, -0.50, -0.0, -0.75],
[-0.0, 0.75, 0.50, 0.0, 0.75],
[0.0, -0.75, 0.50, 0.0, 0.75],
[-0.0, 0.75, -0.50, 0.0, 0.75],
[0.0, -0.75, -0.50, 0.0, 0.75],
[-0.0, 0.75, 0.50, -0.0, -0.75],
[0.0, -0.75, 0.50, -0.0, -0.75],
[-0.0, 0.75, -0.50, -0.0, -0.75],
[0.0, -0.75, -0.50, -0.0, -0.75],
[0.50, -0.0, 0.75, 0.0, 0.75],
[-0.50, -0.0, 0.75, 0.0, 0.75],
[0.50, 0.0, -0.75, 0.0, 0.75],
[-0.50, 0.0, -0.75, 0.0, 0.75],
[0.50, -0.0, 0.75, -0.0, -0.75],
[-0.50, -0.0, 0.75, -0.0, -0.75],
[0.50, 0.0, -0.75, -0.0, -0.75],
[-0.50, 0.0, -0.75, -0.0, -0.75],
[-0.0, 0.50, 0.75, 0.0, 0.75],
[0.0, -0.50, 0.75, 0.0, 0.75],
[-0.0, 0.50, -0.75, 0.0, 0.75],
[0.0, -0.50, -0.75, 0.0, 0.75],
[-0.0, 0.50, 0.75, -0.0, -0.75],
[0.0, -0.50, 0.75, -0.0, -0.75],
[-0.0, 0.50, -0.75, -0.0, -0.75],
[0.0, -0.50, -0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, 0.50, 0.75],
[-0.75, 0.0, -0.0, 0.50, 0.75],
[0.75, -0.0, 0.0, -0.50, 0.75],
[-0.75, -0.0, 0.0, -0.50, 0.75],
[0.75, 0.0, -0.0, 0.50, -0.75],
[-0.75, 0.0, -0.0, 0.50, -0.75],
[0.75, -0.0, 0.0, -0.50, -0.75],
[-0.75, -0.0, 0.0, -0.50, -0.75],
[0.0, 0.75, -0.0, 0.50, 0.75],
[-0.0, -0.75, -0.0, 0.50, 0.75],
[0.0, 0.75, 0.0, -0.50, 0.75],
[-0.0, -0.75, 0.0, -0.50, 0.75],
[0.0, 0.75, -0.0, 0.50, -0.75],
[-0.0, -0.75, -0.0, 0.50, -0.75],
[0.0, 0.75, 0.0, -0.50, -0.75],
[-0.0, -0.75, 0.0, -0.50, -0.75],
[-0.0, 0.0, 0.75, 0.50, 0.75],
[0.0, -0.0, -0.75, 0.50, 0.75],
[-0.0, 0.0, 0.75, -0.50, 0.75],
[0.0, -0.0, -0.75, -0.50, 0.75],
[-0.0, 0.0, 0.75, 0.50, -0.75],
[0.0, -0.0, -0.75, 0.50, -0.75],
[-0.0, 0.0, 0.75, -0.50, -0.75],
[0.0, -0.0, -0.75, -0.50, -0.75],
[0.50, 0.0, -0.0, 0.75, 0.75],
[-0.50, 0.0, -0.0, 0.75, 0.75],
[0.50, -0.0, 0.0, -0.75, 0.75],
[-0.50, -0.0, 0.0, -0.75, 0.75],
[0.50, 0.0, -0.0, 0.75, -0.75],
[-0.50, 0.0, -0.0, 0.75, -0.75],
[0.50, -0.0, 0.0, -0.75, -0.75],
[-0.50, -0.0, 0.0, -0.75, -0.75],
[0.0, 0.50, -0.0, 0.75, 0.75],
[-0.0, -0.50, -0.0, 0.75, 0.75],
[0.0, 0.50, 0.0, -0.75, 0.75],
[-0.0, -0.50, 0.0, -0.75, 0.75],
[0.0, 0.50, -0.0, 0.75, -0.75],
[-0.0, -0.50, -0.0, 0.75, -0.75],
[0.0, 0.50, 0.0, -0.75, -0.75],
[-0.0, -0.50, 0.0, -0.75, -0.75],
[-0.0, 0.0, 0.50, 0.75, 0.75],
[0.0, -0.0, -0.50, 0.75, 0.75],
[-0.0, 0.0, 0.50, -0.75, 0.75],
[0.0, -0.0, -0.50, -0.75, 0.75],
[-0.0, 0.0, 0.50, 0.75, -0.75],
[0.0, -0.0, -0.50, 0.75, -0.75],
[-0.0, 0.0, 0.50, -0.75, -0.75],
[0.0, -0.0, -0.50, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2));
}
{
let vv = Generator::new([0.75f64, 0.5, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.50, 0.0, 0.0, 0.0],
[-0.75, 0.50, 0.0, 0.0, 0.0],
[0.75, -0.50, 0.0, 0.0, 0.0],
[-0.75, -0.50, 0.0, 0.0, 0.0],
[0.50, 0.75, -0.0, -0.0, -0.0],
[-0.50, 0.75, -0.0, -0.0, -0.0],
[0.50, -0.75, -0.0, -0.0, -0.0],
[-0.50, -0.75, -0.0, -0.0, -0.0],
[0.75, 0.0, 0.50, 0.0, 0.0],
[-0.75, 0.0, 0.50, 0.0, 0.0],
[0.75, -0.0, -0.50, 0.0, 0.0],
[-0.75, -0.0, -0.50, 0.0, 0.0],
[0.0, 0.75, 0.50, -0.0, -0.0],
[-0.0, -0.75, 0.50, -0.0, -0.0],
[0.0, 0.75, -0.50, -0.0, -0.0],
[-0.0, -0.75, -0.50, -0.0, -0.0],
[0.50, 0.0, 0.75, 0.0, 0.0],
[-0.50, 0.0, 0.75, 0.0, 0.0],
[0.50, -0.0, -0.75, 0.0, 0.0],
[-0.50, -0.0, -0.75, 0.0, 0.0],
[0.0, 0.50, 0.75, -0.0, -0.0],
[-0.0, -0.50, 0.75, -0.0, -0.0],
[0.0, 0.50, -0.75, -0.0, -0.0],
[-0.0, -0.50, -0.75, -0.0, -0.0],
[0.75, 0.0, 0.0, 0.50, 0.0],
[-0.75, 0.0, 0.0, 0.50, 0.0],
[0.75, -0.0, -0.0, -0.50, 0.0],
[-0.75, -0.0, -0.0, -0.50, 0.0],
[0.0, 0.75, 0.0, 0.50, -0.0],
[-0.0, -0.75, 0.0, 0.50, -0.0],
[0.0, 0.75, -0.0, -0.50, -0.0],
[-0.0, -0.75, -0.0, -0.50, -0.0],
[0.0, 0.0, 0.75, 0.50, 0.0],
[-0.0, -0.0, -0.75, 0.50, 0.0],
[0.0, 0.0, 0.75, -0.50, 0.0],
[-0.0, -0.0, -0.75, -0.50, 0.0],
[0.50, 0.0, 0.0, 0.75, -0.0],
[-0.50, 0.0, 0.0, 0.75, -0.0],
[0.50, -0.0, -0.0, -0.75, -0.0],
[-0.50, -0.0, -0.0, -0.75, -0.0],
[0.0, 0.50, 0.0, 0.75, 0.0],
[-0.0, -0.50, 0.0, 0.75, 0.0],
[0.0, 0.50, -0.0, -0.75, 0.0],
[-0.0, -0.50, -0.0, -0.75, 0.0],
[0.0, 0.0, 0.50, 0.75, -0.0],
[-0.0, -0.0, -0.50, 0.75, -0.0],
[0.0, 0.0, 0.50, -0.75, -0.0],
[-0.0, -0.0, -0.50, -0.75, -0.0],
[0.75, 0.0, 0.0, 0.0, 0.50],
[-0.75, 0.0, 0.0, 0.0, 0.50],
[0.75, -0.0, -0.0, -0.0, -0.50],
[-0.75, -0.0, -0.0, -0.0, -0.50],
[0.0, 0.75, 0.0, 0.0, 0.50],
[-0.0, -0.75, 0.0, 0.0, 0.50],
[0.0, 0.75, -0.0, -0.0, -0.50],
[-0.0, -0.75, -0.0, -0.0, -0.50],
[0.0, 0.0, 0.75, 0.0, 0.50],
[-0.0, -0.0, -0.75, 0.0, 0.50],
[0.0, 0.0, 0.75, -0.0, -0.50],
[-0.0, -0.0, -0.75, -0.0, -0.50],
[0.0, 0.0, 0.0, 0.75, 0.50],
[-0.0, -0.0, -0.0, -0.75, 0.50],
[0.0, 0.0, 0.0, 0.75, -0.50],
[-0.0, -0.0, -0.0, -0.75, -0.50],
[0.50, 0.0, 0.0, 0.0, 0.75],
[-0.50, 0.0, 0.0, 0.0, 0.75],
[0.50, -0.0, -0.0, -0.0, -0.75],
[-0.50, -0.0, -0.0, -0.0, -0.75],
[0.0, 0.50, 0.0, 0.0, 0.75],
[-0.0, -0.50, 0.0, 0.0, 0.75],
[0.0, 0.50, -0.0, -0.0, -0.75],
[-0.0, -0.50, -0.0, -0.0, -0.75],
[0.0, 0.0, 0.50, 0.0, 0.75],
[-0.0, -0.0, -0.50, 0.0, 0.75],
[0.0, 0.0, 0.50, -0.0, -0.75],
[-0.0, -0.0, -0.50, -0.0, -0.75],
[0.0, 0.0, 0.0, 0.50, 0.75],
[-0.0, -0.0, -0.0, -0.50, 0.75],
[0.0, 0.0, 0.0, 0.50, -0.75],
[-0.0, -0.0, -0.0, -0.50, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.0, -0.0],
[-0.75, -0.0, 0.75, -0.0, -0.0],
[0.75, 0.0, -0.75, -0.0, -0.0],
[-0.75, 0.0, -0.75, -0.0, -0.0],
[-0.0, 0.75, 0.75, 0.0, 0.0],
[0.0, -0.75, 0.75, 0.0, 0.0],
[-0.0, 0.75, -0.75, 0.0, 0.0],
[0.0, -0.75, -0.75, 0.0, 0.0],
[0.75, -0.0, -0.0, 0.75, -0.0],
[-0.75, -0.0, -0.0, 0.75, -0.0],
[0.75, 0.0, 0.0, -0.75, -0.0],
[-0.75, 0.0, 0.0, -0.75, -0.0],
[-0.0, 0.75, -0.0, 0.75, 0.0],
[0.0, -0.75, -0.0, 0.75, 0.0],
[-0.0, 0.75, 0.0, -0.75, 0.0],
[0.0, -0.75, 0.0, -0.75, 0.0],
[-0.0, -0.0, 0.75, 0.75, -0.0],
[0.0, 0.0, -0.75, 0.75, -0.0],
[-0.0, -0.0, 0.75, -0.75, -0.0],
[0.0, 0.0, -0.75, -0.75, -0.0],
[0.75, 0.0, -0.0, -0.0, 0.75],
[-0.75, 0.0, -0.0, -0.0, 0.75],
[0.75, -0.0, 0.0, 0.0, -0.75],
[-0.75, -0.0, 0.0, 0.0, -0.75],
[0.0, 0.75, -0.0, -0.0, 0.75],
[-0.0, -0.75, -0.0, -0.0, 0.75],
[0.0, 0.75, 0.0, 0.0, -0.75],
[-0.0, -0.75, 0.0, 0.0, -0.75],
[-0.0, 0.0, 0.75, -0.0, 0.75],
[0.0, -0.0, -0.75, -0.0, 0.75],
[-0.0, 0.0, 0.75, 0.0, -0.75],
[0.0, -0.0, -0.75, 0.0, -0.75],
[-0.0, 0.0, -0.0, 0.75, 0.75],
[0.0, -0.0, 0.0, -0.75, 0.75],
[-0.0, 0.0, -0.0, 0.75, -0.75],
[0.0, -0.0, 0.0, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.0, 0.0, 0.0, 0.0],
[-0.0, 0.75, -0.0, -0.0, -0.0],
[0.0, -0.75, -0.0, -0.0, -0.0],
[0.0, -0.0, 0.75, 0.0, 0.0],
[-0.0, 0.0, -0.75, 0.0, 0.0],
[-0.0, -0.0, 0.0, 0.75, -0.0],
[0.0, 0.0, -0.0, -0.75, -0.0],
[0.0, 0.0, -0.0, -0.0, 0.75],
[-0.0, -0.0, 0.0, 0.0, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim);
}
}
#[test]
fn check_ndim_6_generators() {
let ndim = 6;
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.75, 0.75, 0.75]);
let should_be = [
[0.75, 0.75, 0.75, 0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75, 0.75, 0.75, 0.75],
[0.75, -0.75, 0.75, 0.75, 0.75, 0.75],
[-0.75, -0.75, 0.75, 0.75, 0.75, 0.75],
[0.75, 0.75, -0.75, 0.75, 0.75, 0.75],
[-0.75, 0.75, -0.75, 0.75, 0.75, 0.75],
[0.75, -0.75, -0.75, 0.75, 0.75, 0.75],
[-0.75, -0.75, -0.75, 0.75, 0.75, 0.75],
[0.75, 0.75, 0.75, -0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75, -0.75, 0.75, 0.75],
[0.75, -0.75, 0.75, -0.75, 0.75, 0.75],
[-0.75, -0.75, 0.75, -0.75, 0.75, 0.75],
[0.75, 0.75, -0.75, -0.75, 0.75, 0.75],
[-0.75, 0.75, -0.75, -0.75, 0.75, 0.75],
[0.75, -0.75, -0.75, -0.75, 0.75, 0.75],
[-0.75, -0.75, -0.75, -0.75, 0.75, 0.75],
[0.75, 0.75, 0.75, 0.75, -0.75, 0.75],
[-0.75, 0.75, 0.75, 0.75, -0.75, 0.75],
[0.75, -0.75, 0.75, 0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75, 0.75, -0.75, 0.75],
[0.75, 0.75, -0.75, 0.75, -0.75, 0.75],
[-0.75, 0.75, -0.75, 0.75, -0.75, 0.75],
[0.75, -0.75, -0.75, 0.75, -0.75, 0.75],
[-0.75, -0.75, -0.75, 0.75, -0.75, 0.75],
[0.75, 0.75, 0.75, -0.75, -0.75, 0.75],
[-0.75, 0.75, 0.75, -0.75, -0.75, 0.75],
[0.75, -0.75, 0.75, -0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75, -0.75, -0.75, 0.75],
[0.75, 0.75, -0.75, -0.75, -0.75, 0.75],
[-0.75, 0.75, -0.75, -0.75, -0.75, 0.75],
[0.75, -0.75, -0.75, -0.75, -0.75, 0.75],
[-0.75, -0.75, -0.75, -0.75, -0.75, 0.75],
[0.75, 0.75, 0.75, 0.75, 0.75, -0.75],
[-0.75, 0.75, 0.75, 0.75, 0.75, -0.75],
[0.75, -0.75, 0.75, 0.75, 0.75, -0.75],
[-0.75, -0.75, 0.75, 0.75, 0.75, -0.75],
[0.75, 0.75, -0.75, 0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75, 0.75, 0.75, -0.75],
[0.75, -0.75, -0.75, 0.75, 0.75, -0.75],
[-0.75, -0.75, -0.75, 0.75, 0.75, -0.75],
[0.75, 0.75, 0.75, -0.75, 0.75, -0.75],
[-0.75, 0.75, 0.75, -0.75, 0.75, -0.75],
[0.75, -0.75, 0.75, -0.75, 0.75, -0.75],
[-0.75, -0.75, 0.75, -0.75, 0.75, -0.75],
[0.75, 0.75, -0.75, -0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75, -0.75, 0.75, -0.75],
[0.75, -0.75, -0.75, -0.75, 0.75, -0.75],
[-0.75, -0.75, -0.75, -0.75, 0.75, -0.75],
[0.75, 0.75, 0.75, 0.75, -0.75, -0.75],
[-0.75, 0.75, 0.75, 0.75, -0.75, -0.75],
[0.75, -0.75, 0.75, 0.75, -0.75, -0.75],
[-0.75, -0.75, 0.75, 0.75, -0.75, -0.75],
[0.75, 0.75, -0.75, 0.75, -0.75, -0.75],
[-0.75, 0.75, -0.75, 0.75, -0.75, -0.75],
[0.75, -0.75, -0.75, 0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75, 0.75, -0.75, -0.75],
[0.75, 0.75, 0.75, -0.75, -0.75, -0.75],
[-0.75, 0.75, 0.75, -0.75, -0.75, -0.75],
[0.75, -0.75, 0.75, -0.75, -0.75, -0.75],
[-0.75, -0.75, 0.75, -0.75, -0.75, -0.75],
[0.75, 0.75, -0.75, -0.75, -0.75, -0.75],
[-0.75, 0.75, -0.75, -0.75, -0.75, -0.75],
[0.75, -0.75, -0.75, -0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75, -0.75, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 2usize.pow(ndim));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.75, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.75, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.75, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.75, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.75, 0.0, 0.0, 0.0],
[-0.75, 0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, -0.75, -0.75, 0.0, 0.0, 0.0],
[-0.75, -0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.0, 0.75, -0.0, -0.0],
[-0.75, 0.75, -0.0, 0.75, -0.0, -0.0],
[0.75, -0.75, -0.0, 0.75, -0.0, -0.0],
[-0.75, -0.75, -0.0, 0.75, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.75, -0.0, -0.0],
[-0.75, 0.75, 0.0, -0.75, -0.0, -0.0],
[0.75, -0.75, 0.0, -0.75, -0.0, -0.0],
[-0.75, -0.75, 0.0, -0.75, -0.0, -0.0],
[0.75, -0.0, 0.75, 0.75, 0.0, 0.0],
[-0.75, -0.0, 0.75, 0.75, 0.0, 0.0],
[0.75, 0.0, -0.75, 0.75, 0.0, 0.0],
[-0.75, 0.0, -0.75, 0.75, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.75, 0.0, 0.0],
[-0.75, -0.0, 0.75, -0.75, 0.0, 0.0],
[0.75, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.75, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.0, 0.75, 0.75, 0.75, -0.0, -0.0],
[0.0, -0.75, 0.75, 0.75, -0.0, -0.0],
[-0.0, 0.75, -0.75, 0.75, -0.0, -0.0],
[0.0, -0.75, -0.75, 0.75, -0.0, -0.0],
[-0.0, 0.75, 0.75, -0.75, -0.0, -0.0],
[0.0, -0.75, 0.75, -0.75, -0.0, -0.0],
[-0.0, 0.75, -0.75, -0.75, -0.0, -0.0],
[0.0, -0.75, -0.75, -0.75, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.75, 0.0],
[-0.75, 0.75, 0.0, -0.0, 0.75, 0.0],
[0.75, -0.75, 0.0, -0.0, 0.75, 0.0],
[-0.75, -0.75, 0.0, -0.0, 0.75, 0.0],
[0.75, 0.75, -0.0, 0.0, -0.75, 0.0],
[-0.75, 0.75, -0.0, 0.0, -0.75, 0.0],
[0.75, -0.75, -0.0, 0.0, -0.75, 0.0],
[-0.75, -0.75, -0.0, 0.0, -0.75, 0.0],
[0.75, 0.0, 0.75, -0.0, 0.75, -0.0],
[-0.75, 0.0, 0.75, -0.0, 0.75, -0.0],
[0.75, -0.0, -0.75, -0.0, 0.75, -0.0],
[-0.75, -0.0, -0.75, -0.0, 0.75, -0.0],
[0.75, 0.0, 0.75, 0.0, -0.75, -0.0],
[-0.75, 0.0, 0.75, 0.0, -0.75, -0.0],
[0.75, -0.0, -0.75, 0.0, -0.75, -0.0],
[-0.75, -0.0, -0.75, 0.0, -0.75, -0.0],
[0.0, 0.75, 0.75, -0.0, 0.75, 0.0],
[-0.0, -0.75, 0.75, -0.0, 0.75, 0.0],
[0.0, 0.75, -0.75, -0.0, 0.75, 0.0],
[-0.0, -0.75, -0.75, -0.0, 0.75, 0.0],
[0.0, 0.75, 0.75, 0.0, -0.75, 0.0],
[-0.0, -0.75, 0.75, 0.0, -0.75, 0.0],
[0.0, 0.75, -0.75, 0.0, -0.75, 0.0],
[-0.0, -0.75, -0.75, 0.0, -0.75, 0.0],
[0.75, -0.0, 0.0, 0.75, 0.75, -0.0],
[-0.75, -0.0, 0.0, 0.75, 0.75, -0.0],
[0.75, 0.0, -0.0, -0.75, 0.75, -0.0],
[-0.75, 0.0, -0.0, -0.75, 0.75, -0.0],
[0.75, -0.0, 0.0, 0.75, -0.75, -0.0],
[-0.75, -0.0, 0.0, 0.75, -0.75, -0.0],
[0.75, 0.0, -0.0, -0.75, -0.75, -0.0],
[-0.75, 0.0, -0.0, -0.75, -0.75, -0.0],
[-0.0, 0.75, 0.0, 0.75, 0.75, 0.0],
[0.0, -0.75, 0.0, 0.75, 0.75, 0.0],
[-0.0, 0.75, -0.0, -0.75, 0.75, 0.0],
[0.0, -0.75, -0.0, -0.75, 0.75, 0.0],
[-0.0, 0.75, 0.0, 0.75, -0.75, 0.0],
[0.0, -0.75, 0.0, 0.75, -0.75, 0.0],
[-0.0, 0.75, -0.0, -0.75, -0.75, 0.0],
[0.0, -0.75, -0.0, -0.75, -0.75, 0.0],
[0.0, -0.0, 0.75, 0.75, 0.75, -0.0],
[-0.0, 0.0, -0.75, 0.75, 0.75, -0.0],
[0.0, -0.0, 0.75, -0.75, 0.75, -0.0],
[-0.0, 0.0, -0.75, -0.75, 0.75, -0.0],
[0.0, -0.0, 0.75, 0.75, -0.75, -0.0],
[-0.0, 0.0, -0.75, 0.75, -0.75, -0.0],
[0.0, -0.0, 0.75, -0.75, -0.75, -0.0],
[-0.0, 0.0, -0.75, -0.75, -0.75, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.0, 0.75],
[-0.75, 0.75, 0.0, -0.0, 0.0, 0.75],
[0.75, -0.75, 0.0, -0.0, 0.0, 0.75],
[-0.75, -0.75, 0.0, -0.0, 0.0, 0.75],
[0.75, 0.75, -0.0, 0.0, -0.0, -0.75],
[-0.75, 0.75, -0.0, 0.0, -0.0, -0.75],
[0.75, -0.75, -0.0, 0.0, -0.0, -0.75],
[-0.75, -0.75, -0.0, 0.0, -0.0, -0.75],
[0.75, 0.0, 0.75, -0.0, 0.0, 0.75],
[-0.75, 0.0, 0.75, -0.0, 0.0, 0.75],
[0.75, -0.0, -0.75, -0.0, 0.0, 0.75],
[-0.75, -0.0, -0.75, -0.0, 0.0, 0.75],
[0.75, 0.0, 0.75, 0.0, -0.0, -0.75],
[-0.75, 0.0, 0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, -0.75, 0.0, -0.0, -0.75],
[-0.75, -0.0, -0.75, 0.0, -0.0, -0.75],
[0.0, 0.75, 0.75, -0.0, 0.0, 0.75],
[-0.0, -0.75, 0.75, -0.0, 0.0, 0.75],
[0.0, 0.75, -0.75, -0.0, 0.0, 0.75],
[-0.0, -0.75, -0.75, -0.0, 0.0, 0.75],
[0.0, 0.75, 0.75, 0.0, -0.0, -0.75],
[-0.0, -0.75, 0.75, 0.0, -0.0, -0.75],
[0.0, 0.75, -0.75, 0.0, -0.0, -0.75],
[-0.0, -0.75, -0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, 0.0, 0.75, 0.0, 0.75],
[-0.75, -0.0, 0.0, 0.75, 0.0, 0.75],
[0.75, 0.0, -0.0, -0.75, 0.0, 0.75],
[-0.75, 0.0, -0.0, -0.75, 0.0, 0.75],
[0.75, -0.0, 0.0, 0.75, -0.0, -0.75],
[-0.75, -0.0, 0.0, 0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.75, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.0, 0.75, 0.0, 0.75, 0.0, 0.75],
[0.0, -0.75, 0.0, 0.75, 0.0, 0.75],
[-0.0, 0.75, -0.0, -0.75, 0.0, 0.75],
[0.0, -0.75, -0.0, -0.75, 0.0, 0.75],
[-0.0, 0.75, 0.0, 0.75, -0.0, -0.75],
[0.0, -0.75, 0.0, 0.75, -0.0, -0.75],
[-0.0, 0.75, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.75, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.0, 0.75, 0.75, 0.0, 0.75],
[-0.0, 0.0, -0.75, 0.75, 0.0, 0.75],
[0.0, -0.0, 0.75, -0.75, 0.0, 0.75],
[-0.0, 0.0, -0.75, -0.75, 0.0, 0.75],
[0.0, -0.0, 0.75, 0.75, -0.0, -0.75],
[-0.0, 0.0, -0.75, 0.75, -0.0, -0.75],
[0.0, -0.0, 0.75, -0.75, -0.0, -0.75],
[-0.0, 0.0, -0.75, -0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, 0.0, 0.75, 0.75],
[-0.75, 0.0, -0.0, 0.0, 0.75, 0.75],
[0.75, -0.0, 0.0, -0.0, -0.75, 0.75],
[-0.75, -0.0, 0.0, -0.0, -0.75, 0.75],
[0.75, 0.0, -0.0, 0.0, 0.75, -0.75],
[-0.75, 0.0, -0.0, 0.0, 0.75, -0.75],
[0.75, -0.0, 0.0, -0.0, -0.75, -0.75],
[-0.75, -0.0, 0.0, -0.0, -0.75, -0.75],
[0.0, 0.75, -0.0, 0.0, 0.75, 0.75],
[-0.0, -0.75, -0.0, 0.0, 0.75, 0.75],
[0.0, 0.75, 0.0, -0.0, -0.75, 0.75],
[-0.0, -0.75, 0.0, -0.0, -0.75, 0.75],
[0.0, 0.75, -0.0, 0.0, 0.75, -0.75],
[-0.0, -0.75, -0.0, 0.0, 0.75, -0.75],
[0.0, 0.75, 0.0, -0.0, -0.75, -0.75],
[-0.0, -0.75, 0.0, -0.0, -0.75, -0.75],
[-0.0, 0.0, 0.75, 0.0, 0.75, 0.75],
[0.0, -0.0, -0.75, 0.0, 0.75, 0.75],
[-0.0, 0.0, 0.75, -0.0, -0.75, 0.75],
[0.0, -0.0, -0.75, -0.0, -0.75, 0.75],
[-0.0, 0.0, 0.75, 0.0, 0.75, -0.75],
[0.0, -0.0, -0.75, 0.0, 0.75, -0.75],
[-0.0, 0.0, 0.75, -0.0, -0.75, -0.75],
[0.0, -0.0, -0.75, -0.0, -0.75, -0.75],
[0.0, 0.0, -0.0, 0.75, 0.75, 0.75],
[-0.0, -0.0, 0.0, -0.75, 0.75, 0.75],
[0.0, 0.0, -0.0, 0.75, -0.75, 0.75],
[-0.0, -0.0, 0.0, -0.75, -0.75, 0.75],
[0.0, 0.0, -0.0, 0.75, 0.75, -0.75],
[-0.0, -0.0, 0.0, -0.75, 0.75, -0.75],
[0.0, 0.0, -0.0, 0.75, -0.75, -0.75],
[-0.0, -0.0, 0.0, -0.75, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2) / 3);
}
{
let vv = Generator::new([0.75f64, 0.75, 0.5, 0.0, 0.0, 0.0]);
let should_be = vec![
[0.75, 0.75, 0.50, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.50, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.50, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.50, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.50, 0.0, 0.0, 0.0],
[-0.75, 0.75, -0.50, 0.0, 0.0, 0.0],
[0.75, -0.75, -0.50, 0.0, 0.0, 0.0],
[-0.75, -0.75, -0.50, 0.0, 0.0, 0.0],
[0.75, 0.50, 0.75, -0.0, -0.0, -0.0],
[-0.75, 0.50, 0.75, -0.0, -0.0, -0.0],
[0.75, -0.50, 0.75, -0.0, -0.0, -0.0],
[-0.75, -0.50, 0.75, -0.0, -0.0, -0.0],
[0.75, 0.50, -0.75, -0.0, -0.0, -0.0],
[-0.75, 0.50, -0.75, -0.0, -0.0, -0.0],
[0.75, -0.50, -0.75, -0.0, -0.0, -0.0],
[-0.75, -0.50, -0.75, -0.0, -0.0, -0.0],
[0.50, 0.75, 0.75, 0.0, 0.0, 0.0],
[-0.50, 0.75, 0.75, 0.0, 0.0, 0.0],
[0.50, -0.75, 0.75, 0.0, 0.0, 0.0],
[-0.50, -0.75, 0.75, 0.0, 0.0, 0.0],
[0.50, 0.75, -0.75, 0.0, 0.0, 0.0],
[-0.50, 0.75, -0.75, 0.0, 0.0, 0.0],
[0.50, -0.75, -0.75, 0.0, 0.0, 0.0],
[-0.50, -0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.0, 0.50, -0.0, -0.0],
[-0.75, 0.75, -0.0, 0.50, -0.0, -0.0],
[0.75, -0.75, -0.0, 0.50, -0.0, -0.0],
[-0.75, -0.75, -0.0, 0.50, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.50, -0.0, -0.0],
[-0.75, 0.75, 0.0, -0.50, -0.0, -0.0],
[0.75, -0.75, 0.0, -0.50, -0.0, -0.0],
[-0.75, -0.75, 0.0, -0.50, -0.0, -0.0],
[0.75, -0.0, 0.75, 0.50, 0.0, 0.0],
[-0.75, -0.0, 0.75, 0.50, 0.0, 0.0],
[0.75, 0.0, -0.75, 0.50, 0.0, 0.0],
[-0.75, 0.0, -0.75, 0.50, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.50, 0.0, 0.0],
[-0.75, -0.0, 0.75, -0.50, 0.0, 0.0],
[0.75, 0.0, -0.75, -0.50, 0.0, 0.0],
[-0.75, 0.0, -0.75, -0.50, 0.0, 0.0],
[-0.0, 0.75, 0.75, 0.50, -0.0, -0.0],
[0.0, -0.75, 0.75, 0.50, -0.0, -0.0],
[-0.0, 0.75, -0.75, 0.50, -0.0, -0.0],
[0.0, -0.75, -0.75, 0.50, -0.0, -0.0],
[-0.0, 0.75, 0.75, -0.50, -0.0, -0.0],
[0.0, -0.75, 0.75, -0.50, -0.0, -0.0],
[-0.0, 0.75, -0.75, -0.50, -0.0, -0.0],
[0.0, -0.75, -0.75, -0.50, -0.0, -0.0],
[0.75, 0.50, -0.0, 0.75, 0.0, 0.0],
[-0.75, 0.50, -0.0, 0.75, 0.0, 0.0],
[0.75, -0.50, -0.0, 0.75, 0.0, 0.0],
[-0.75, -0.50, -0.0, 0.75, 0.0, 0.0],
[0.75, 0.50, 0.0, -0.75, 0.0, 0.0],
[-0.75, 0.50, 0.0, -0.75, 0.0, 0.0],
[0.75, -0.50, 0.0, -0.75, 0.0, 0.0],
[-0.75, -0.50, 0.0, -0.75, 0.0, 0.0],
[0.50, 0.75, -0.0, 0.75, -0.0, -0.0],
[-0.50, 0.75, -0.0, 0.75, -0.0, -0.0],
[0.50, -0.75, -0.0, 0.75, -0.0, -0.0],
[-0.50, -0.75, -0.0, 0.75, -0.0, -0.0],
[0.50, 0.75, 0.0, -0.75, -0.0, -0.0],
[-0.50, 0.75, 0.0, -0.75, -0.0, -0.0],
[0.50, -0.75, 0.0, -0.75, -0.0, -0.0],
[-0.50, -0.75, 0.0, -0.75, -0.0, -0.0],
[0.75, -0.0, 0.50, 0.75, 0.0, 0.0],
[-0.75, -0.0, 0.50, 0.75, 0.0, 0.0],
[0.75, 0.0, -0.50, 0.75, 0.0, 0.0],
[-0.75, 0.0, -0.50, 0.75, 0.0, 0.0],
[0.75, -0.0, 0.50, -0.75, 0.0, 0.0],
[-0.75, -0.0, 0.50, -0.75, 0.0, 0.0],
[0.75, 0.0, -0.50, -0.75, 0.0, 0.0],
[-0.75, 0.0, -0.50, -0.75, 0.0, 0.0],
[-0.0, 0.75, 0.50, 0.75, -0.0, -0.0],
[0.0, -0.75, 0.50, 0.75, -0.0, -0.0],
[-0.0, 0.75, -0.50, 0.75, -0.0, -0.0],
[0.0, -0.75, -0.50, 0.75, -0.0, -0.0],
[-0.0, 0.75, 0.50, -0.75, -0.0, -0.0],
[0.0, -0.75, 0.50, -0.75, -0.0, -0.0],
[-0.0, 0.75, -0.50, -0.75, -0.0, -0.0],
[0.0, -0.75, -0.50, -0.75, -0.0, -0.0],
[0.50, -0.0, 0.75, 0.75, 0.0, 0.0],
[-0.50, -0.0, 0.75, 0.75, 0.0, 0.0],
[0.50, 0.0, -0.75, 0.75, 0.0, 0.0],
[-0.50, 0.0, -0.75, 0.75, 0.0, 0.0],
[0.50, -0.0, 0.75, -0.75, 0.0, 0.0],
[-0.50, -0.0, 0.75, -0.75, 0.0, 0.0],
[0.50, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.50, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.0, 0.50, 0.75, 0.75, -0.0, -0.0],
[0.0, -0.50, 0.75, 0.75, -0.0, -0.0],
[-0.0, 0.50, -0.75, 0.75, -0.0, -0.0],
[0.0, -0.50, -0.75, 0.75, -0.0, -0.0],
[-0.0, 0.50, 0.75, -0.75, -0.0, -0.0],
[0.0, -0.50, 0.75, -0.75, -0.0, -0.0],
[-0.0, 0.50, -0.75, -0.75, -0.0, -0.0],
[0.0, -0.50, -0.75, -0.75, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.50, 0.0],
[-0.75, 0.75, 0.0, -0.0, 0.50, 0.0],
[0.75, -0.75, 0.0, -0.0, 0.50, 0.0],
[-0.75, -0.75, 0.0, -0.0, 0.50, 0.0],
[0.75, 0.75, -0.0, 0.0, -0.50, 0.0],
[-0.75, 0.75, -0.0, 0.0, -0.50, 0.0],
[0.75, -0.75, -0.0, 0.0, -0.50, 0.0],
[-0.75, -0.75, -0.0, 0.0, -0.50, 0.0],
[0.75, 0.0, 0.75, -0.0, 0.50, -0.0],
[-0.75, 0.0, 0.75, -0.0, 0.50, -0.0],
[0.75, -0.0, -0.75, -0.0, 0.50, -0.0],
[-0.75, -0.0, -0.75, -0.0, 0.50, -0.0],
[0.75, 0.0, 0.75, 0.0, -0.50, -0.0],
[-0.75, 0.0, 0.75, 0.0, -0.50, -0.0],
[0.75, -0.0, -0.75, 0.0, -0.50, -0.0],
[-0.75, -0.0, -0.75, 0.0, -0.50, -0.0],
[0.0, 0.75, 0.75, -0.0, 0.50, 0.0],
[-0.0, -0.75, 0.75, -0.0, 0.50, 0.0],
[0.0, 0.75, -0.75, -0.0, 0.50, 0.0],
[-0.0, -0.75, -0.75, -0.0, 0.50, 0.0],
[0.0, 0.75, 0.75, 0.0, -0.50, 0.0],
[-0.0, -0.75, 0.75, 0.0, -0.50, 0.0],
[0.0, 0.75, -0.75, 0.0, -0.50, 0.0],
[-0.0, -0.75, -0.75, 0.0, -0.50, 0.0],
[0.75, -0.0, 0.0, 0.75, 0.50, -0.0],
[-0.75, -0.0, 0.0, 0.75, 0.50, -0.0],
[0.75, 0.0, -0.0, -0.75, 0.50, -0.0],
[-0.75, 0.0, -0.0, -0.75, 0.50, -0.0],
[0.75, -0.0, 0.0, 0.75, -0.50, -0.0],
[-0.75, -0.0, 0.0, 0.75, -0.50, -0.0],
[0.75, 0.0, -0.0, -0.75, -0.50, -0.0],
[-0.75, 0.0, -0.0, -0.75, -0.50, -0.0],
[-0.0, 0.75, 0.0, 0.75, 0.50, 0.0],
[0.0, -0.75, 0.0, 0.75, 0.50, 0.0],
[-0.0, 0.75, -0.0, -0.75, 0.50, 0.0],
[0.0, -0.75, -0.0, -0.75, 0.50, 0.0],
[-0.0, 0.75, 0.0, 0.75, -0.50, 0.0],
[0.0, -0.75, 0.0, 0.75, -0.50, 0.0],
[-0.0, 0.75, -0.0, -0.75, -0.50, 0.0],
[0.0, -0.75, -0.0, -0.75, -0.50, 0.0],
[0.0, -0.0, 0.75, 0.75, 0.50, -0.0],
[-0.0, 0.0, -0.75, 0.75, 0.50, -0.0],
[0.0, -0.0, 0.75, -0.75, 0.50, -0.0],
[-0.0, 0.0, -0.75, -0.75, 0.50, -0.0],
[0.0, -0.0, 0.75, 0.75, -0.50, -0.0],
[-0.0, 0.0, -0.75, 0.75, -0.50, -0.0],
[0.0, -0.0, 0.75, -0.75, -0.50, -0.0],
[-0.0, 0.0, -0.75, -0.75, -0.50, -0.0],
[0.75, 0.50, -0.0, 0.0, 0.75, 0.0],
[-0.75, 0.50, -0.0, 0.0, 0.75, 0.0],
[0.75, -0.50, -0.0, 0.0, 0.75, 0.0],
[-0.75, -0.50, -0.0, 0.0, 0.75, 0.0],
[0.75, 0.50, 0.0, -0.0, -0.75, 0.0],
[-0.75, 0.50, 0.0, -0.0, -0.75, 0.0],
[0.75, -0.50, 0.0, -0.0, -0.75, 0.0],
[-0.75, -0.50, 0.0, -0.0, -0.75, 0.0],
[0.50, 0.75, -0.0, 0.0, 0.75, -0.0],
[-0.50, 0.75, -0.0, 0.0, 0.75, -0.0],
[0.50, -0.75, -0.0, 0.0, 0.75, -0.0],
[-0.50, -0.75, -0.0, 0.0, 0.75, -0.0],
[0.50, 0.75, 0.0, -0.0, -0.75, -0.0],
[-0.50, 0.75, 0.0, -0.0, -0.75, -0.0],
[0.50, -0.75, 0.0, -0.0, -0.75, -0.0],
[-0.50, -0.75, 0.0, -0.0, -0.75, -0.0],
[0.75, -0.0, 0.50, 0.0, 0.75, 0.0],
[-0.75, -0.0, 0.50, 0.0, 0.75, 0.0],
[0.75, 0.0, -0.50, 0.0, 0.75, 0.0],
[-0.75, 0.0, -0.50, 0.0, 0.75, 0.0],
[0.75, -0.0, 0.50, -0.0, -0.75, 0.0],
[-0.75, -0.0, 0.50, -0.0, -0.75, 0.0],
[0.75, 0.0, -0.50, -0.0, -0.75, 0.0],
[-0.75, 0.0, -0.50, -0.0, -0.75, 0.0],
[-0.0, 0.75, 0.50, 0.0, 0.75, -0.0],
[0.0, -0.75, 0.50, 0.0, 0.75, -0.0],
[-0.0, 0.75, -0.50, 0.0, 0.75, -0.0],
[0.0, -0.75, -0.50, 0.0, 0.75, -0.0],
[-0.0, 0.75, 0.50, -0.0, -0.75, -0.0],
[0.0, -0.75, 0.50, -0.0, -0.75, -0.0],
[-0.0, 0.75, -0.50, -0.0, -0.75, -0.0],
[0.0, -0.75, -0.50, -0.0, -0.75, -0.0],
[0.50, -0.0, 0.75, 0.0, 0.75, 0.0],
[-0.50, -0.0, 0.75, 0.0, 0.75, 0.0],
[0.50, 0.0, -0.75, 0.0, 0.75, 0.0],
[-0.50, 0.0, -0.75, 0.0, 0.75, 0.0],
[0.50, -0.0, 0.75, -0.0, -0.75, 0.0],
[-0.50, -0.0, 0.75, -0.0, -0.75, 0.0],
[0.50, 0.0, -0.75, -0.0, -0.75, 0.0],
[-0.50, 0.0, -0.75, -0.0, -0.75, 0.0],
[-0.0, 0.50, 0.75, 0.0, 0.75, -0.0],
[0.0, -0.50, 0.75, 0.0, 0.75, -0.0],
[-0.0, 0.50, -0.75, 0.0, 0.75, -0.0],
[0.0, -0.50, -0.75, 0.0, 0.75, -0.0],
[-0.0, 0.50, 0.75, -0.0, -0.75, -0.0],
[0.0, -0.50, 0.75, -0.0, -0.75, -0.0],
[-0.0, 0.50, -0.75, -0.0, -0.75, -0.0],
[0.0, -0.50, -0.75, -0.0, -0.75, -0.0],
[0.75, 0.0, -0.0, 0.50, 0.75, 0.0],
[-0.75, 0.0, -0.0, 0.50, 0.75, 0.0],
[0.75, -0.0, 0.0, -0.50, 0.75, 0.0],
[-0.75, -0.0, 0.0, -0.50, 0.75, 0.0],
[0.75, 0.0, -0.0, 0.50, -0.75, 0.0],
[-0.75, 0.0, -0.0, 0.50, -0.75, 0.0],
[0.75, -0.0, 0.0, -0.50, -0.75, 0.0],
[-0.75, -0.0, 0.0, -0.50, -0.75, 0.0],
[0.0, 0.75, -0.0, 0.50, 0.75, -0.0],
[-0.0, -0.75, -0.0, 0.50, 0.75, -0.0],
[0.0, 0.75, 0.0, -0.50, 0.75, -0.0],
[-0.0, -0.75, 0.0, -0.50, 0.75, -0.0],
[0.0, 0.75, -0.0, 0.50, -0.75, -0.0],
[-0.0, -0.75, -0.0, 0.50, -0.75, -0.0],
[0.0, 0.75, 0.0, -0.50, -0.75, -0.0],
[-0.0, -0.75, 0.0, -0.50, -0.75, -0.0],
[-0.0, 0.0, 0.75, 0.50, 0.75, 0.0],
[0.0, -0.0, -0.75, 0.50, 0.75, 0.0],
[-0.0, 0.0, 0.75, -0.50, 0.75, 0.0],
[0.0, -0.0, -0.75, -0.50, 0.75, 0.0],
[-0.0, 0.0, 0.75, 0.50, -0.75, 0.0],
[0.0, -0.0, -0.75, 0.50, -0.75, 0.0],
[-0.0, 0.0, 0.75, -0.50, -0.75, 0.0],
[0.0, -0.0, -0.75, -0.50, -0.75, 0.0],
[0.50, 0.0, -0.0, 0.75, 0.75, -0.0],
[-0.50, 0.0, -0.0, 0.75, 0.75, -0.0],
[0.50, -0.0, 0.0, -0.75, 0.75, -0.0],
[-0.50, -0.0, 0.0, -0.75, 0.75, -0.0],
[0.50, 0.0, -0.0, 0.75, -0.75, -0.0],
[-0.50, 0.0, -0.0, 0.75, -0.75, -0.0],
[0.50, -0.0, 0.0, -0.75, -0.75, -0.0],
[-0.50, -0.0, 0.0, -0.75, -0.75, -0.0],
[0.0, 0.50, -0.0, 0.75, 0.75, 0.0],
[-0.0, -0.50, -0.0, 0.75, 0.75, 0.0],
[0.0, 0.50, 0.0, -0.75, 0.75, 0.0],
[-0.0, -0.50, 0.0, -0.75, 0.75, 0.0],
[0.0, 0.50, -0.0, 0.75, -0.75, 0.0],
[-0.0, -0.50, -0.0, 0.75, -0.75, 0.0],
[0.0, 0.50, 0.0, -0.75, -0.75, 0.0],
[-0.0, -0.50, 0.0, -0.75, -0.75, 0.0],
[-0.0, 0.0, 0.50, 0.75, 0.75, -0.0],
[0.0, -0.0, -0.50, 0.75, 0.75, -0.0],
[-0.0, 0.0, 0.50, -0.75, 0.75, -0.0],
[0.0, -0.0, -0.50, -0.75, 0.75, -0.0],
[-0.0, 0.0, 0.50, 0.75, -0.75, -0.0],
[0.0, -0.0, -0.50, 0.75, -0.75, -0.0],
[-0.0, 0.0, 0.50, -0.75, -0.75, -0.0],
[0.0, -0.0, -0.50, -0.75, -0.75, -0.0],
[0.75, 0.75, 0.0, 0.0, -0.0, 0.50],
[-0.75, 0.75, 0.0, 0.0, -0.0, 0.50],
[0.75, -0.75, 0.0, 0.0, -0.0, 0.50],
[-0.75, -0.75, 0.0, 0.0, -0.0, 0.50],
[0.75, 0.75, -0.0, -0.0, 0.0, -0.50],
[-0.75, 0.75, -0.0, -0.0, 0.0, -0.50],
[0.75, -0.75, -0.0, -0.0, 0.0, -0.50],
[-0.75, -0.75, -0.0, -0.0, 0.0, -0.50],
[0.75, 0.0, 0.75, 0.0, -0.0, 0.50],
[-0.75, 0.0, 0.75, 0.0, -0.0, 0.50],
[0.75, -0.0, -0.75, 0.0, -0.0, 0.50],
[-0.75, -0.0, -0.75, 0.0, -0.0, 0.50],
[0.75, 0.0, 0.75, -0.0, 0.0, -0.50],
[-0.75, 0.0, 0.75, -0.0, 0.0, -0.50],
[0.75, -0.0, -0.75, -0.0, 0.0, -0.50],
[-0.75, -0.0, -0.75, -0.0, 0.0, -0.50],
[0.0, 0.75, 0.75, 0.0, -0.0, 0.50],
[-0.0, -0.75, 0.75, 0.0, -0.0, 0.50],
[0.0, 0.75, -0.75, 0.0, -0.0, 0.50],
[-0.0, -0.75, -0.75, 0.0, -0.0, 0.50],
[0.0, 0.75, 0.75, -0.0, 0.0, -0.50],
[-0.0, -0.75, 0.75, -0.0, 0.0, -0.50],
[0.0, 0.75, -0.75, -0.0, 0.0, -0.50],
[-0.0, -0.75, -0.75, -0.0, 0.0, -0.50],
[0.75, 0.0, 0.0, 0.75, -0.0, 0.50],
[-0.75, 0.0, 0.0, 0.75, -0.0, 0.50],
[0.75, -0.0, -0.0, -0.75, -0.0, 0.50],
[-0.75, -0.0, -0.0, -0.75, -0.0, 0.50],
[0.75, 0.0, 0.0, 0.75, 0.0, -0.50],
[-0.75, 0.0, 0.0, 0.75, 0.0, -0.50],
[0.75, -0.0, -0.0, -0.75, 0.0, -0.50],
[-0.75, -0.0, -0.0, -0.75, 0.0, -0.50],
[0.0, 0.75, 0.0, 0.75, -0.0, 0.50],
[-0.0, -0.75, 0.0, 0.75, -0.0, 0.50],
[0.0, 0.75, -0.0, -0.75, -0.0, 0.50],
[-0.0, -0.75, -0.0, -0.75, -0.0, 0.50],
[0.0, 0.75, 0.0, 0.75, 0.0, -0.50],
[-0.0, -0.75, 0.0, 0.75, 0.0, -0.50],
[0.0, 0.75, -0.0, -0.75, 0.0, -0.50],
[-0.0, -0.75, -0.0, -0.75, 0.0, -0.50],
[0.0, 0.0, 0.75, 0.75, -0.0, 0.50],
[-0.0, -0.0, -0.75, 0.75, -0.0, 0.50],
[0.0, 0.0, 0.75, -0.75, -0.0, 0.50],
[-0.0, -0.0, -0.75, -0.75, -0.0, 0.50],
[0.0, 0.0, 0.75, 0.75, 0.0, -0.50],
[-0.0, -0.0, -0.75, 0.75, 0.0, -0.50],
[0.0, 0.0, 0.75, -0.75, 0.0, -0.50],
[-0.0, -0.0, -0.75, -0.75, 0.0, -0.50],
[0.75, -0.0, 0.0, 0.0, 0.75, 0.50],
[-0.75, -0.0, 0.0, 0.0, 0.75, 0.50],
[0.75, 0.0, -0.0, -0.0, -0.75, 0.50],
[-0.75, 0.0, -0.0, -0.0, -0.75, 0.50],
[0.75, -0.0, 0.0, 0.0, 0.75, -0.50],
[-0.75, -0.0, 0.0, 0.0, 0.75, -0.50],
[0.75, 0.0, -0.0, -0.0, -0.75, -0.50],
[-0.75, 0.0, -0.0, -0.0, -0.75, -0.50],
[-0.0, 0.75, 0.0, 0.0, 0.75, 0.50],
[0.0, -0.75, 0.0, 0.0, 0.75, 0.50],
[-0.0, 0.75, -0.0, -0.0, -0.75, 0.50],
[0.0, -0.75, -0.0, -0.0, -0.75, 0.50],
[-0.0, 0.75, 0.0, 0.0, 0.75, -0.50],
[0.0, -0.75, 0.0, 0.0, 0.75, -0.50],
[-0.0, 0.75, -0.0, -0.0, -0.75, -0.50],
[0.0, -0.75, -0.0, -0.0, -0.75, -0.50],
[0.0, -0.0, 0.75, 0.0, 0.75, 0.50],
[-0.0, 0.0, -0.75, 0.0, 0.75, 0.50],
[0.0, -0.0, 0.75, -0.0, -0.75, 0.50],
[-0.0, 0.0, -0.75, -0.0, -0.75, 0.50],
[0.0, -0.0, 0.75, 0.0, 0.75, -0.50],
[-0.0, 0.0, -0.75, 0.0, 0.75, -0.50],
[0.0, -0.0, 0.75, -0.0, -0.75, -0.50],
[-0.0, 0.0, -0.75, -0.0, -0.75, -0.50],
[0.0, -0.0, 0.0, 0.75, 0.75, 0.50],
[-0.0, 0.0, -0.0, -0.75, 0.75, 0.50],
[0.0, -0.0, 0.0, 0.75, -0.75, 0.50],
[-0.0, 0.0, -0.0, -0.75, -0.75, 0.50],
[0.0, -0.0, 0.0, 0.75, 0.75, -0.50],
[-0.0, 0.0, -0.0, -0.75, 0.75, -0.50],
[0.0, -0.0, 0.0, 0.75, -0.75, -0.50],
[-0.0, 0.0, -0.0, -0.75, -0.75, -0.50],
[0.75, 0.50, 0.0, -0.0, 0.0, 0.75],
[-0.75, 0.50, 0.0, -0.0, 0.0, 0.75],
[0.75, -0.50, 0.0, -0.0, 0.0, 0.75],
[-0.75, -0.50, 0.0, -0.0, 0.0, 0.75],
[0.75, 0.50, -0.0, 0.0, -0.0, -0.75],
[-0.75, 0.50, -0.0, 0.0, -0.0, -0.75],
[0.75, -0.50, -0.0, 0.0, -0.0, -0.75],
[-0.75, -0.50, -0.0, 0.0, -0.0, -0.75],
[0.50, 0.75, 0.0, -0.0, 0.0, 0.75],
[-0.50, 0.75, 0.0, -0.0, 0.0, 0.75],
[0.50, -0.75, 0.0, -0.0, 0.0, 0.75],
[-0.50, -0.75, 0.0, -0.0, 0.0, 0.75],
[0.50, 0.75, -0.0, 0.0, -0.0, -0.75],
[-0.50, 0.75, -0.0, 0.0, -0.0, -0.75],
[0.50, -0.75, -0.0, 0.0, -0.0, -0.75],
[-0.50, -0.75, -0.0, 0.0, -0.0, -0.75],
[0.75, 0.0, 0.50, -0.0, 0.0, 0.75],
[-0.75, 0.0, 0.50, -0.0, 0.0, 0.75],
[0.75, -0.0, -0.50, -0.0, 0.0, 0.75],
[-0.75, -0.0, -0.50, -0.0, 0.0, 0.75],
[0.75, 0.0, 0.50, 0.0, -0.0, -0.75],
[-0.75, 0.0, 0.50, 0.0, -0.0, -0.75],
[0.75, -0.0, -0.50, 0.0, -0.0, -0.75],
[-0.75, -0.0, -0.50, 0.0, -0.0, -0.75],
[0.0, 0.75, 0.50, -0.0, 0.0, 0.75],
[-0.0, -0.75, 0.50, -0.0, 0.0, 0.75],
[0.0, 0.75, -0.50, -0.0, 0.0, 0.75],
[-0.0, -0.75, -0.50, -0.0, 0.0, 0.75],
[0.0, 0.75, 0.50, 0.0, -0.0, -0.75],
[-0.0, -0.75, 0.50, 0.0, -0.0, -0.75],
[0.0, 0.75, -0.50, 0.0, -0.0, -0.75],
[-0.0, -0.75, -0.50, 0.0, -0.0, -0.75],
[0.50, 0.0, 0.75, -0.0, 0.0, 0.75],
[-0.50, 0.0, 0.75, -0.0, 0.0, 0.75],
[0.50, -0.0, -0.75, -0.0, 0.0, 0.75],
[-0.50, -0.0, -0.75, -0.0, 0.0, 0.75],
[0.50, 0.0, 0.75, 0.0, -0.0, -0.75],
[-0.50, 0.0, 0.75, 0.0, -0.0, -0.75],
[0.50, -0.0, -0.75, 0.0, -0.0, -0.75],
[-0.50, -0.0, -0.75, 0.0, -0.0, -0.75],
[0.0, 0.50, 0.75, -0.0, 0.0, 0.75],
[-0.0, -0.50, 0.75, -0.0, 0.0, 0.75],
[0.0, 0.50, -0.75, -0.0, 0.0, 0.75],
[-0.0, -0.50, -0.75, -0.0, 0.0, 0.75],
[0.0, 0.50, 0.75, 0.0, -0.0, -0.75],
[-0.0, -0.50, 0.75, 0.0, -0.0, -0.75],
[0.0, 0.50, -0.75, 0.0, -0.0, -0.75],
[-0.0, -0.50, -0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, 0.0, 0.50, 0.0, 0.75],
[-0.75, -0.0, 0.0, 0.50, 0.0, 0.75],
[0.75, 0.0, -0.0, -0.50, 0.0, 0.75],
[-0.75, 0.0, -0.0, -0.50, 0.0, 0.75],
[0.75, -0.0, 0.0, 0.50, -0.0, -0.75],
[-0.75, -0.0, 0.0, 0.50, -0.0, -0.75],
[0.75, 0.0, -0.0, -0.50, -0.0, -0.75],
[-0.75, 0.0, -0.0, -0.50, -0.0, -0.75],
[-0.0, 0.75, 0.0, 0.50, 0.0, 0.75],
[0.0, -0.75, 0.0, 0.50, 0.0, 0.75],
[-0.0, 0.75, -0.0, -0.50, 0.0, 0.75],
[0.0, -0.75, -0.0, -0.50, 0.0, 0.75],
[-0.0, 0.75, 0.0, 0.50, -0.0, -0.75],
[0.0, -0.75, 0.0, 0.50, -0.0, -0.75],
[-0.0, 0.75, -0.0, -0.50, -0.0, -0.75],
[0.0, -0.75, -0.0, -0.50, -0.0, -0.75],
[0.0, -0.0, 0.75, 0.50, 0.0, 0.75],
[-0.0, 0.0, -0.75, 0.50, 0.0, 0.75],
[0.0, -0.0, 0.75, -0.50, 0.0, 0.75],
[-0.0, 0.0, -0.75, -0.50, 0.0, 0.75],
[0.0, -0.0, 0.75, 0.50, -0.0, -0.75],
[-0.0, 0.0, -0.75, 0.50, -0.0, -0.75],
[0.0, -0.0, 0.75, -0.50, -0.0, -0.75],
[-0.0, 0.0, -0.75, -0.50, -0.0, -0.75],
[0.50, -0.0, 0.0, 0.75, 0.0, 0.75],
[-0.50, -0.0, 0.0, 0.75, 0.0, 0.75],
[0.50, 0.0, -0.0, -0.75, 0.0, 0.75],
[-0.50, 0.0, -0.0, -0.75, 0.0, 0.75],
[0.50, -0.0, 0.0, 0.75, -0.0, -0.75],
[-0.50, -0.0, 0.0, 0.75, -0.0, -0.75],
[0.50, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.50, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.0, 0.50, 0.0, 0.75, 0.0, 0.75],
[0.0, -0.50, 0.0, 0.75, 0.0, 0.75],
[-0.0, 0.50, -0.0, -0.75, 0.0, 0.75],
[0.0, -0.50, -0.0, -0.75, 0.0, 0.75],
[-0.0, 0.50, 0.0, 0.75, -0.0, -0.75],
[0.0, -0.50, 0.0, 0.75, -0.0, -0.75],
[-0.0, 0.50, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.50, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.0, 0.50, 0.75, 0.0, 0.75],
[-0.0, 0.0, -0.50, 0.75, 0.0, 0.75],
[0.0, -0.0, 0.50, -0.75, 0.0, 0.75],
[-0.0, 0.0, -0.50, -0.75, 0.0, 0.75],
[0.0, -0.0, 0.50, 0.75, -0.0, -0.75],
[-0.0, 0.0, -0.50, 0.75, -0.0, -0.75],
[0.0, -0.0, 0.50, -0.75, -0.0, -0.75],
[-0.0, 0.0, -0.50, -0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, 0.0, 0.50, 0.75],
[-0.75, 0.0, -0.0, 0.0, 0.50, 0.75],
[0.75, -0.0, 0.0, -0.0, -0.50, 0.75],
[-0.75, -0.0, 0.0, -0.0, -0.50, 0.75],
[0.75, 0.0, -0.0, 0.0, 0.50, -0.75],
[-0.75, 0.0, -0.0, 0.0, 0.50, -0.75],
[0.75, -0.0, 0.0, -0.0, -0.50, -0.75],
[-0.75, -0.0, 0.0, -0.0, -0.50, -0.75],
[0.0, 0.75, -0.0, 0.0, 0.50, 0.75],
[-0.0, -0.75, -0.0, 0.0, 0.50, 0.75],
[0.0, 0.75, 0.0, -0.0, -0.50, 0.75],
[-0.0, -0.75, 0.0, -0.0, -0.50, 0.75],
[0.0, 0.75, -0.0, 0.0, 0.50, -0.75],
[-0.0, -0.75, -0.0, 0.0, 0.50, -0.75],
[0.0, 0.75, 0.0, -0.0, -0.50, -0.75],
[-0.0, -0.75, 0.0, -0.0, -0.50, -0.75],
[-0.0, 0.0, 0.75, 0.0, 0.50, 0.75],
[0.0, -0.0, -0.75, 0.0, 0.50, 0.75],
[-0.0, 0.0, 0.75, -0.0, -0.50, 0.75],
[0.0, -0.0, -0.75, -0.0, -0.50, 0.75],
[-0.0, 0.0, 0.75, 0.0, 0.50, -0.75],
[0.0, -0.0, -0.75, 0.0, 0.50, -0.75],
[-0.0, 0.0, 0.75, -0.0, -0.50, -0.75],
[0.0, -0.0, -0.75, -0.0, -0.50, -0.75],
[0.0, 0.0, -0.0, 0.75, 0.50, 0.75],
[-0.0, -0.0, 0.0, -0.75, 0.50, 0.75],
[0.0, 0.0, -0.0, 0.75, -0.50, 0.75],
[-0.0, -0.0, 0.0, -0.75, -0.50, 0.75],
[0.0, 0.0, -0.0, 0.75, 0.50, -0.75],
[-0.0, -0.0, 0.0, -0.75, 0.50, -0.75],
[0.0, 0.0, -0.0, 0.75, -0.50, -0.75],
[-0.0, -0.0, 0.0, -0.75, -0.50, -0.75],
[0.50, -0.0, 0.0, 0.0, 0.75, 0.75],
[-0.50, -0.0, 0.0, 0.0, 0.75, 0.75],
[0.50, 0.0, -0.0, -0.0, -0.75, 0.75],
[-0.50, 0.0, -0.0, -0.0, -0.75, 0.75],
[0.50, -0.0, 0.0, 0.0, 0.75, -0.75],
[-0.50, -0.0, 0.0, 0.0, 0.75, -0.75],
[0.50, 0.0, -0.0, -0.0, -0.75, -0.75],
[-0.50, 0.0, -0.0, -0.0, -0.75, -0.75],
[-0.0, 0.50, 0.0, 0.0, 0.75, 0.75],
[0.0, -0.50, 0.0, 0.0, 0.75, 0.75],
[-0.0, 0.50, -0.0, -0.0, -0.75, 0.75],
[0.0, -0.50, -0.0, -0.0, -0.75, 0.75],
[-0.0, 0.50, 0.0, 0.0, 0.75, -0.75],
[0.0, -0.50, 0.0, 0.0, 0.75, -0.75],
[-0.0, 0.50, -0.0, -0.0, -0.75, -0.75],
[0.0, -0.50, -0.0, -0.0, -0.75, -0.75],
[0.0, -0.0, 0.50, 0.0, 0.75, 0.75],
[-0.0, 0.0, -0.50, 0.0, 0.75, 0.75],
[0.0, -0.0, 0.50, -0.0, -0.75, 0.75],
[-0.0, 0.0, -0.50, -0.0, -0.75, 0.75],
[0.0, -0.0, 0.50, 0.0, 0.75, -0.75],
[-0.0, 0.0, -0.50, 0.0, 0.75, -0.75],
[0.0, -0.0, 0.50, -0.0, -0.75, -0.75],
[-0.0, 0.0, -0.50, -0.0, -0.75, -0.75],
[0.0, -0.0, 0.0, 0.50, 0.75, 0.75],
[-0.0, 0.0, -0.0, -0.50, 0.75, 0.75],
[0.0, -0.0, 0.0, 0.50, -0.75, 0.75],
[-0.0, 0.0, -0.0, -0.50, -0.75, 0.75],
[0.0, -0.0, 0.0, 0.50, 0.75, -0.75],
[-0.0, 0.0, -0.0, -0.50, 0.75, -0.75],
[0.0, -0.0, 0.0, 0.50, -0.75, -0.75],
[-0.0, 0.0, -0.0, -0.50, -0.75, -0.75],
];
let should_be = should_be.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1) * (ndim - 2));
}
{
let vv = Generator::new([0.75f64, 0.5, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.50, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.50, 0.0, 0.0, 0.0, 0.0],
[0.75, -0.50, 0.0, 0.0, 0.0, 0.0],
[-0.75, -0.50, 0.0, 0.0, 0.0, 0.0],
[0.50, 0.75, -0.0, -0.0, -0.0, -0.0],
[-0.50, 0.75, -0.0, -0.0, -0.0, -0.0],
[0.50, -0.75, -0.0, -0.0, -0.0, -0.0],
[-0.50, -0.75, -0.0, -0.0, -0.0, -0.0],
[0.75, 0.0, 0.50, 0.0, 0.0, 0.0],
[-0.75, 0.0, 0.50, 0.0, 0.0, 0.0],
[0.75, -0.0, -0.50, 0.0, 0.0, 0.0],
[-0.75, -0.0, -0.50, 0.0, 0.0, 0.0],
[0.0, 0.75, 0.50, -0.0, -0.0, -0.0],
[-0.0, -0.75, 0.50, -0.0, -0.0, -0.0],
[0.0, 0.75, -0.50, -0.0, -0.0, -0.0],
[-0.0, -0.75, -0.50, -0.0, -0.0, -0.0],
[0.50, 0.0, 0.75, 0.0, 0.0, 0.0],
[-0.50, 0.0, 0.75, 0.0, 0.0, 0.0],
[0.50, -0.0, -0.75, 0.0, 0.0, 0.0],
[-0.50, -0.0, -0.75, 0.0, 0.0, 0.0],
[0.0, 0.50, 0.75, -0.0, -0.0, -0.0],
[-0.0, -0.50, 0.75, -0.0, -0.0, -0.0],
[0.0, 0.50, -0.75, -0.0, -0.0, -0.0],
[-0.0, -0.50, -0.75, -0.0, -0.0, -0.0],
[0.75, 0.0, 0.0, 0.50, 0.0, 0.0],
[-0.75, 0.0, 0.0, 0.50, 0.0, 0.0],
[0.75, -0.0, -0.0, -0.50, 0.0, 0.0],
[-0.75, -0.0, -0.0, -0.50, 0.0, 0.0],
[0.0, 0.75, 0.0, 0.50, -0.0, -0.0],
[-0.0, -0.75, 0.0, 0.50, -0.0, -0.0],
[0.0, 0.75, -0.0, -0.50, -0.0, -0.0],
[-0.0, -0.75, -0.0, -0.50, -0.0, -0.0],
[0.0, 0.0, 0.75, 0.50, 0.0, 0.0],
[-0.0, -0.0, -0.75, 0.50, 0.0, 0.0],
[0.0, 0.0, 0.75, -0.50, 0.0, 0.0],
[-0.0, -0.0, -0.75, -0.50, 0.0, 0.0],
[0.50, 0.0, 0.0, 0.75, -0.0, -0.0],
[-0.50, 0.0, 0.0, 0.75, -0.0, -0.0],
[0.50, -0.0, -0.0, -0.75, -0.0, -0.0],
[-0.50, -0.0, -0.0, -0.75, -0.0, -0.0],
[0.0, 0.50, 0.0, 0.75, 0.0, 0.0],
[-0.0, -0.50, 0.0, 0.75, 0.0, 0.0],
[0.0, 0.50, -0.0, -0.75, 0.0, 0.0],
[-0.0, -0.50, -0.0, -0.75, 0.0, 0.0],
[0.0, 0.0, 0.50, 0.75, -0.0, -0.0],
[-0.0, -0.0, -0.50, 0.75, -0.0, -0.0],
[0.0, 0.0, 0.50, -0.75, -0.0, -0.0],
[-0.0, -0.0, -0.50, -0.75, -0.0, -0.0],
[0.75, 0.0, 0.0, 0.0, 0.50, 0.0],
[-0.75, 0.0, 0.0, 0.0, 0.50, 0.0],
[0.75, -0.0, -0.0, -0.0, -0.50, 0.0],
[-0.75, -0.0, -0.0, -0.0, -0.50, 0.0],
[0.0, 0.75, 0.0, 0.0, 0.50, -0.0],
[-0.0, -0.75, 0.0, 0.0, 0.50, -0.0],
[0.0, 0.75, -0.0, -0.0, -0.50, -0.0],
[-0.0, -0.75, -0.0, -0.0, -0.50, -0.0],
[0.0, 0.0, 0.75, 0.0, 0.50, 0.0],
[-0.0, -0.0, -0.75, 0.0, 0.50, 0.0],
[0.0, 0.0, 0.75, -0.0, -0.50, 0.0],
[-0.0, -0.0, -0.75, -0.0, -0.50, 0.0],
[0.0, 0.0, 0.0, 0.75, 0.50, -0.0],
[-0.0, -0.0, -0.0, -0.75, 0.50, -0.0],
[0.0, 0.0, 0.0, 0.75, -0.50, -0.0],
[-0.0, -0.0, -0.0, -0.75, -0.50, -0.0],
[0.50, 0.0, 0.0, 0.0, 0.75, 0.0],
[-0.50, 0.0, 0.0, 0.0, 0.75, 0.0],
[0.50, -0.0, -0.0, -0.0, -0.75, 0.0],
[-0.50, -0.0, -0.0, -0.0, -0.75, 0.0],
[0.0, 0.50, 0.0, 0.0, 0.75, -0.0],
[-0.0, -0.50, 0.0, 0.0, 0.75, -0.0],
[0.0, 0.50, -0.0, -0.0, -0.75, -0.0],
[-0.0, -0.50, -0.0, -0.0, -0.75, -0.0],
[0.0, 0.0, 0.50, 0.0, 0.75, 0.0],
[-0.0, -0.0, -0.50, 0.0, 0.75, 0.0],
[0.0, 0.0, 0.50, -0.0, -0.75, 0.0],
[-0.0, -0.0, -0.50, -0.0, -0.75, 0.0],
[0.0, 0.0, 0.0, 0.50, 0.75, -0.0],
[-0.0, -0.0, -0.0, -0.50, 0.75, -0.0],
[0.0, 0.0, 0.0, 0.50, -0.75, -0.0],
[-0.0, -0.0, -0.0, -0.50, -0.75, -0.0],
[0.75, 0.0, 0.0, 0.0, 0.0, 0.50],
[-0.75, 0.0, 0.0, 0.0, 0.0, 0.50],
[0.75, -0.0, -0.0, -0.0, -0.0, -0.50],
[-0.75, -0.0, -0.0, -0.0, -0.0, -0.50],
[0.0, 0.75, 0.0, 0.0, 0.0, 0.50],
[-0.0, -0.75, 0.0, 0.0, 0.0, 0.50],
[0.0, 0.75, -0.0, -0.0, -0.0, -0.50],
[-0.0, -0.75, -0.0, -0.0, -0.0, -0.50],
[0.0, 0.0, 0.75, 0.0, 0.0, 0.50],
[-0.0, -0.0, -0.75, 0.0, 0.0, 0.50],
[0.0, 0.0, 0.75, -0.0, -0.0, -0.50],
[-0.0, -0.0, -0.75, -0.0, -0.0, -0.50],
[0.0, 0.0, 0.0, 0.75, 0.0, 0.50],
[-0.0, -0.0, -0.0, -0.75, 0.0, 0.50],
[0.0, 0.0, 0.0, 0.75, -0.0, -0.50],
[-0.0, -0.0, -0.0, -0.75, -0.0, -0.50],
[0.0, 0.0, 0.0, 0.0, 0.75, 0.50],
[-0.0, -0.0, -0.0, -0.0, -0.75, 0.50],
[0.0, 0.0, 0.0, 0.0, 0.75, -0.50],
[-0.0, -0.0, -0.0, -0.0, -0.75, -0.50],
[0.50, 0.0, 0.0, 0.0, 0.0, 0.75],
[-0.50, 0.0, 0.0, 0.0, 0.0, 0.75],
[0.50, -0.0, -0.0, -0.0, -0.0, -0.75],
[-0.50, -0.0, -0.0, -0.0, -0.0, -0.75],
[0.0, 0.50, 0.0, 0.0, 0.0, 0.75],
[-0.0, -0.50, 0.0, 0.0, 0.0, 0.75],
[0.0, 0.50, -0.0, -0.0, -0.0, -0.75],
[-0.0, -0.50, -0.0, -0.0, -0.0, -0.75],
[0.0, 0.0, 0.50, 0.0, 0.0, 0.75],
[-0.0, -0.0, -0.50, 0.0, 0.0, 0.75],
[0.0, 0.0, 0.50, -0.0, -0.0, -0.75],
[-0.0, -0.0, -0.50, -0.0, -0.0, -0.75],
[0.0, 0.0, 0.0, 0.50, 0.0, 0.75],
[-0.0, -0.0, -0.0, -0.50, 0.0, 0.75],
[0.0, 0.0, 0.0, 0.50, -0.0, -0.75],
[-0.0, -0.0, -0.0, -0.50, -0.0, -0.75],
[0.0, 0.0, 0.0, 0.0, 0.50, 0.75],
[-0.0, -0.0, -0.0, -0.0, -0.50, 0.75],
[0.0, 0.0, 0.0, 0.0, 0.50, -0.75],
[-0.0, -0.0, -0.0, -0.0, -0.50, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.0, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.0, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.0, 0.0, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.0, -0.0, -0.0],
[-0.75, -0.0, 0.75, -0.0, -0.0, -0.0],
[0.75, 0.0, -0.75, -0.0, -0.0, -0.0],
[-0.75, 0.0, -0.75, -0.0, -0.0, -0.0],
[-0.0, 0.75, 0.75, 0.0, 0.0, 0.0],
[0.0, -0.75, 0.75, 0.0, 0.0, 0.0],
[-0.0, 0.75, -0.75, 0.0, 0.0, 0.0],
[0.0, -0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, -0.0, -0.0, 0.75, -0.0, -0.0],
[-0.75, -0.0, -0.0, 0.75, -0.0, -0.0],
[0.75, 0.0, 0.0, -0.75, -0.0, -0.0],
[-0.75, 0.0, 0.0, -0.75, -0.0, -0.0],
[-0.0, 0.75, -0.0, 0.75, 0.0, 0.0],
[0.0, -0.75, -0.0, 0.75, 0.0, 0.0],
[-0.0, 0.75, 0.0, -0.75, 0.0, 0.0],
[0.0, -0.75, 0.0, -0.75, 0.0, 0.0],
[-0.0, -0.0, 0.75, 0.75, -0.0, -0.0],
[0.0, 0.0, -0.75, 0.75, -0.0, -0.0],
[-0.0, -0.0, 0.75, -0.75, -0.0, -0.0],
[0.0, 0.0, -0.75, -0.75, -0.0, -0.0],
[0.75, 0.0, -0.0, -0.0, 0.75, 0.0],
[-0.75, 0.0, -0.0, -0.0, 0.75, 0.0],
[0.75, -0.0, 0.0, 0.0, -0.75, 0.0],
[-0.75, -0.0, 0.0, 0.0, -0.75, 0.0],
[0.0, 0.75, -0.0, -0.0, 0.75, -0.0],
[-0.0, -0.75, -0.0, -0.0, 0.75, -0.0],
[0.0, 0.75, 0.0, 0.0, -0.75, -0.0],
[-0.0, -0.75, 0.0, 0.0, -0.75, -0.0],
[-0.0, 0.0, 0.75, -0.0, 0.75, 0.0],
[0.0, -0.0, -0.75, -0.0, 0.75, 0.0],
[-0.0, 0.0, 0.75, 0.0, -0.75, 0.0],
[0.0, -0.0, -0.75, 0.0, -0.75, 0.0],
[-0.0, 0.0, -0.0, 0.75, 0.75, -0.0],
[0.0, -0.0, 0.0, -0.75, 0.75, -0.0],
[-0.0, 0.0, -0.0, 0.75, -0.75, -0.0],
[0.0, -0.0, 0.0, -0.75, -0.75, -0.0],
[0.75, 0.0, -0.0, 0.0, -0.0, 0.75],
[-0.75, 0.0, -0.0, 0.0, -0.0, 0.75],
[0.75, -0.0, 0.0, -0.0, 0.0, -0.75],
[-0.75, -0.0, 0.0, -0.0, 0.0, -0.75],
[0.0, 0.75, -0.0, 0.0, -0.0, 0.75],
[-0.0, -0.75, -0.0, 0.0, -0.0, 0.75],
[0.0, 0.75, 0.0, -0.0, 0.0, -0.75],
[-0.0, -0.75, 0.0, -0.0, 0.0, -0.75],
[-0.0, 0.0, 0.75, 0.0, -0.0, 0.75],
[0.0, -0.0, -0.75, 0.0, -0.0, 0.75],
[-0.0, 0.0, 0.75, -0.0, 0.0, -0.75],
[0.0, -0.0, -0.75, -0.0, 0.0, -0.75],
[0.0, 0.0, -0.0, 0.75, -0.0, 0.75],
[-0.0, -0.0, 0.0, -0.75, -0.0, 0.75],
[0.0, 0.0, -0.0, 0.75, 0.0, -0.75],
[-0.0, -0.0, 0.0, -0.75, 0.0, -0.75],
[-0.0, -0.0, 0.0, 0.0, 0.75, 0.75],
[0.0, 0.0, -0.0, -0.0, -0.75, 0.75],
[-0.0, -0.0, 0.0, 0.0, 0.75, -0.75],
[0.0, 0.0, -0.0, -0.0, -0.75, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim * (ndim - 1));
}
{
let vv = Generator::new([0.75f64, 0.0, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.0, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.0, 0.0, 0.0, 0.0, 0.0],
[-0.0, 0.75, -0.0, -0.0, -0.0, -0.0],
[0.0, -0.75, -0.0, -0.0, -0.0, -0.0],
[0.0, -0.0, 0.75, 0.0, 0.0, 0.0],
[-0.0, 0.0, -0.75, 0.0, 0.0, 0.0],
[-0.0, -0.0, 0.0, 0.75, -0.0, -0.0],
[0.0, 0.0, -0.0, -0.75, -0.0, -0.0],
[0.0, 0.0, -0.0, -0.0, 0.75, 0.0],
[-0.0, -0.0, 0.0, 0.0, -0.75, 0.0],
[-0.0, -0.0, -0.0, 0.0, 0.0, 0.75],
[0.0, 0.0, 0.0, -0.0, -0.0, -0.75],
]
.iter();
let mut count = 0;
for (a, b) in vv.permutations().zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * ndim);
}
}
}
#[cfg(test)]
#[allow(clippy::too_many_lines)]
mod tests_with_centre_and_half_widths {
use super::*;
use crate::multi::two_pow_n;
const CV: f64 = 1.44e-4;
const HWV: f64 = 2.2e-4;
#[test]
fn with_centre_hw_check_ndim_2_generators() {
const N: usize = 2;
let centre = [CV; N];
let half_widths = [HWV; N];
{
let vv = Generator::new([0.75f64, 0.75]);
let should_be = [[0.75, 0.75], [-0.75, 0.75], [0.75, -0.75], [-0.75, -0.75]]
.map(|[a, b]| [CV + a * HWV, CV + b * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
}
assert_eq!(count, two_pow_n(N));
}
{
let vv = Generator::new([0.75f64, 0.5]);
let should_be = [
[0.75, 0.5],
[-0.75, 0.5],
[0.75, -0.5],
[-0.75, -0.5],
[0.5, 0.75],
[-0.5, 0.75],
[0.5, -0.75],
[-0.5, -0.75],
]
.map(|[a, b]| [CV + a * HWV, CV + b * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * N * (N - 1));
}
{
let vv = Generator::new([0.75f64, 0.0]);
let should_be = [
[0.75f64, 0.0],
[-0.75f64, 0.0],
[0.0, 0.75f64],
[0.0, -0.75f64],
]
.map(|[a, b]| [CV + a * HWV, CV + b * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * N);
}
}
#[test]
fn with_centre_hw_check_ndim_3_generators() {
const N: usize = 3;
let centre = [CV; N];
let half_widths = [HWV; N];
{
let vv = Generator::new([0.75f64, 0.75, 0.75]);
let should_be = [
[0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75],
[0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75],
[0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75],
[0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75],
[0.75, 0.75, 0.75],
]
.map(|[a, b, c]| [CV + a * HWV, CV + b * HWV, CV + c * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, two_pow_n(N));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.5]);
let should_be = [
[0.75, 0.75, 0.5],
[-0.75, 0.75, 0.5],
[0.75, -0.75, 0.5],
[-0.75, -0.75, 0.5],
[0.75, 0.75, -0.5],
[-0.75, 0.75, -0.5],
[0.75, -0.75, -0.5],
[-0.75, -0.75, -0.5],
[0.75, 0.5, 0.75],
[-0.75, 0.5, 0.75],
[0.75, -0.5, 0.75],
[-0.75, -0.5, 0.75],
[0.75, 0.5, -0.75],
[-0.75, 0.5, -0.75],
[0.75, -0.5, -0.75],
[-0.75, -0.5, -0.75],
[0.5, 0.75, 0.75],
[-0.5, 0.75, 0.75],
[0.5, -0.75, 0.75],
[-0.5, -0.75, 0.75],
[0.5, 0.75, -0.75],
[-0.5, 0.75, -0.75],
[0.5, -0.75, -0.75],
[-0.5, -0.75, -0.75],
[0.75, 0.75, 0.5],
]
.map(|[a, b, c]| [CV + a * HWV, CV + b * HWV, CV + c * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * N * (N - 1) * (N - 2));
}
{
let vv = Generator::new([0.75f64, 0.5, 0.0]);
let should_be = [
[0.75f64, 0.5, 0.0],
[-0.75f64, 0.5, 0.0],
[0.75f64, -0.5, 0.0],
[-0.75f64, -0.5, 0.0],
[0.5, 0.75f64, 0.0],
[-0.5, 0.75f64, 0.0],
[0.5, -0.75f64, 0.0],
[-0.5, -0.75f64, 0.0],
[0.75f64, 0.0, 0.5],
[-0.75f64, 0.0, 0.5],
[0.75f64, 0.0, -0.5],
[-0.75f64, 0.0, -0.5],
[0.0, 0.75f64, 0.5],
[0.0, -0.75f64, 0.5],
[0.0, 0.75f64, -0.5],
[0.0, -0.75f64, -0.5],
[0.5, 0.0, 0.75f64],
[-0.5, 0.0, 0.75f64],
[0.5, 0.0, -0.75f64],
[-0.5, 0.0, -0.75f64],
[0.0, 0.5, 0.75f64],
[0.0, -0.5, 0.75f64],
[0.0, 0.5, -0.75f64],
[0.0, -0.5, -0.75f64],
]
.map(|[a, b, c]| [CV + a * HWV, CV + b * HWV, CV + c * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * N * (N - 1));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.0]);
let should_be = [
[0.75f64, 0.75, 0.0],
[-0.75f64, 0.75, 0.0],
[0.75f64, -0.75, 0.0],
[-0.75f64, -0.75, 0.0],
[0.75f64, 0.0, 0.75],
[-0.75f64, 0.0, 0.75],
[0.75f64, 0.0, -0.75],
[-0.75f64, 0.0, -0.75],
[0.0, 0.75f64, 0.75],
[0.0, -0.75f64, 0.75],
[0.0, 0.75f64, -0.75],
[0.0, -0.75f64, -0.75],
]
.map(|[a, b, c]| [CV + a * HWV, CV + b * HWV, CV + c * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * N * (N - 1));
}
{
let vv = Generator::new([0.75f64, 0.0, 0.0]);
let should_be = [
[0.75f64, 0.0, 0.0],
[-0.75f64, 0.0, 0.0],
[0.0, 0.75f64, 0.0],
[0.0, -0.75f64, 0.0],
[0.0, 0.0, 0.75],
[0.0, -0.0, -0.75],
]
.map(|[a, b, c]| [CV + a * HWV, CV + b * HWV, CV + c * HWV]);
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
println!("{a:?}");
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * N);
}
}
#[test]
fn with_centre_hw_check_ndim_6_generators() {
const N: usize = 6;
let centre = [CV; N];
let half_widths = [HWV; N];
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.75, 0.75, 0.75]);
let should_be = [
[0.75, 0.75, 0.75, 0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75, 0.75, 0.75, 0.75],
[0.75, -0.75, 0.75, 0.75, 0.75, 0.75],
[-0.75, -0.75, 0.75, 0.75, 0.75, 0.75],
[0.75, 0.75, -0.75, 0.75, 0.75, 0.75],
[-0.75, 0.75, -0.75, 0.75, 0.75, 0.75],
[0.75, -0.75, -0.75, 0.75, 0.75, 0.75],
[-0.75, -0.75, -0.75, 0.75, 0.75, 0.75],
[0.75, 0.75, 0.75, -0.75, 0.75, 0.75],
[-0.75, 0.75, 0.75, -0.75, 0.75, 0.75],
[0.75, -0.75, 0.75, -0.75, 0.75, 0.75],
[-0.75, -0.75, 0.75, -0.75, 0.75, 0.75],
[0.75, 0.75, -0.75, -0.75, 0.75, 0.75],
[-0.75, 0.75, -0.75, -0.75, 0.75, 0.75],
[0.75, -0.75, -0.75, -0.75, 0.75, 0.75],
[-0.75, -0.75, -0.75, -0.75, 0.75, 0.75],
[0.75, 0.75, 0.75, 0.75, -0.75, 0.75],
[-0.75, 0.75, 0.75, 0.75, -0.75, 0.75],
[0.75, -0.75, 0.75, 0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75, 0.75, -0.75, 0.75],
[0.75, 0.75, -0.75, 0.75, -0.75, 0.75],
[-0.75, 0.75, -0.75, 0.75, -0.75, 0.75],
[0.75, -0.75, -0.75, 0.75, -0.75, 0.75],
[-0.75, -0.75, -0.75, 0.75, -0.75, 0.75],
[0.75, 0.75, 0.75, -0.75, -0.75, 0.75],
[-0.75, 0.75, 0.75, -0.75, -0.75, 0.75],
[0.75, -0.75, 0.75, -0.75, -0.75, 0.75],
[-0.75, -0.75, 0.75, -0.75, -0.75, 0.75],
[0.75, 0.75, -0.75, -0.75, -0.75, 0.75],
[-0.75, 0.75, -0.75, -0.75, -0.75, 0.75],
[0.75, -0.75, -0.75, -0.75, -0.75, 0.75],
[-0.75, -0.75, -0.75, -0.75, -0.75, 0.75],
[0.75, 0.75, 0.75, 0.75, 0.75, -0.75],
[-0.75, 0.75, 0.75, 0.75, 0.75, -0.75],
[0.75, -0.75, 0.75, 0.75, 0.75, -0.75],
[-0.75, -0.75, 0.75, 0.75, 0.75, -0.75],
[0.75, 0.75, -0.75, 0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75, 0.75, 0.75, -0.75],
[0.75, -0.75, -0.75, 0.75, 0.75, -0.75],
[-0.75, -0.75, -0.75, 0.75, 0.75, -0.75],
[0.75, 0.75, 0.75, -0.75, 0.75, -0.75],
[-0.75, 0.75, 0.75, -0.75, 0.75, -0.75],
[0.75, -0.75, 0.75, -0.75, 0.75, -0.75],
[-0.75, -0.75, 0.75, -0.75, 0.75, -0.75],
[0.75, 0.75, -0.75, -0.75, 0.75, -0.75],
[-0.75, 0.75, -0.75, -0.75, 0.75, -0.75],
[0.75, -0.75, -0.75, -0.75, 0.75, -0.75],
[-0.75, -0.75, -0.75, -0.75, 0.75, -0.75],
[0.75, 0.75, 0.75, 0.75, -0.75, -0.75],
[-0.75, 0.75, 0.75, 0.75, -0.75, -0.75],
[0.75, -0.75, 0.75, 0.75, -0.75, -0.75],
[-0.75, -0.75, 0.75, 0.75, -0.75, -0.75],
[0.75, 0.75, -0.75, 0.75, -0.75, -0.75],
[-0.75, 0.75, -0.75, 0.75, -0.75, -0.75],
[0.75, -0.75, -0.75, 0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75, 0.75, -0.75, -0.75],
[0.75, 0.75, 0.75, -0.75, -0.75, -0.75],
[-0.75, 0.75, 0.75, -0.75, -0.75, -0.75],
[0.75, -0.75, 0.75, -0.75, -0.75, -0.75],
[-0.75, -0.75, 0.75, -0.75, -0.75, -0.75],
[0.75, 0.75, -0.75, -0.75, -0.75, -0.75],
[-0.75, 0.75, -0.75, -0.75, -0.75, -0.75],
[0.75, -0.75, -0.75, -0.75, -0.75, -0.75],
[-0.75, -0.75, -0.75, -0.75, -0.75, -0.75],
]
.map(|[a, b, c, d, e, f]| {
[
CV + a * HWV,
CV + b * HWV,
CV + c * HWV,
CV + d * HWV,
CV + e * HWV,
CV + f * HWV,
]
});
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, two_pow_n(N));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.75, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.75, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.75, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.75, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.75, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.75, 0.0, 0.0, 0.0],
[-0.75, 0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, -0.75, -0.75, 0.0, 0.0, 0.0],
[-0.75, -0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.0, 0.75, -0.0, -0.0],
[-0.75, 0.75, -0.0, 0.75, -0.0, -0.0],
[0.75, -0.75, -0.0, 0.75, -0.0, -0.0],
[-0.75, -0.75, -0.0, 0.75, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.75, -0.0, -0.0],
[-0.75, 0.75, 0.0, -0.75, -0.0, -0.0],
[0.75, -0.75, 0.0, -0.75, -0.0, -0.0],
[-0.75, -0.75, 0.0, -0.75, -0.0, -0.0],
[0.75, -0.0, 0.75, 0.75, 0.0, 0.0],
[-0.75, -0.0, 0.75, 0.75, 0.0, 0.0],
[0.75, 0.0, -0.75, 0.75, 0.0, 0.0],
[-0.75, 0.0, -0.75, 0.75, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.75, 0.0, 0.0],
[-0.75, -0.0, 0.75, -0.75, 0.0, 0.0],
[0.75, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.75, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.0, 0.75, 0.75, 0.75, -0.0, -0.0],
[0.0, -0.75, 0.75, 0.75, -0.0, -0.0],
[-0.0, 0.75, -0.75, 0.75, -0.0, -0.0],
[0.0, -0.75, -0.75, 0.75, -0.0, -0.0],
[-0.0, 0.75, 0.75, -0.75, -0.0, -0.0],
[0.0, -0.75, 0.75, -0.75, -0.0, -0.0],
[-0.0, 0.75, -0.75, -0.75, -0.0, -0.0],
[0.0, -0.75, -0.75, -0.75, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.75, 0.0],
[-0.75, 0.75, 0.0, -0.0, 0.75, 0.0],
[0.75, -0.75, 0.0, -0.0, 0.75, 0.0],
[-0.75, -0.75, 0.0, -0.0, 0.75, 0.0],
[0.75, 0.75, -0.0, 0.0, -0.75, 0.0],
[-0.75, 0.75, -0.0, 0.0, -0.75, 0.0],
[0.75, -0.75, -0.0, 0.0, -0.75, 0.0],
[-0.75, -0.75, -0.0, 0.0, -0.75, 0.0],
[0.75, 0.0, 0.75, -0.0, 0.75, -0.0],
[-0.75, 0.0, 0.75, -0.0, 0.75, -0.0],
[0.75, -0.0, -0.75, -0.0, 0.75, -0.0],
[-0.75, -0.0, -0.75, -0.0, 0.75, -0.0],
[0.75, 0.0, 0.75, 0.0, -0.75, -0.0],
[-0.75, 0.0, 0.75, 0.0, -0.75, -0.0],
[0.75, -0.0, -0.75, 0.0, -0.75, -0.0],
[-0.75, -0.0, -0.75, 0.0, -0.75, -0.0],
[0.0, 0.75, 0.75, -0.0, 0.75, 0.0],
[-0.0, -0.75, 0.75, -0.0, 0.75, 0.0],
[0.0, 0.75, -0.75, -0.0, 0.75, 0.0],
[-0.0, -0.75, -0.75, -0.0, 0.75, 0.0],
[0.0, 0.75, 0.75, 0.0, -0.75, 0.0],
[-0.0, -0.75, 0.75, 0.0, -0.75, 0.0],
[0.0, 0.75, -0.75, 0.0, -0.75, 0.0],
[-0.0, -0.75, -0.75, 0.0, -0.75, 0.0],
[0.75, -0.0, 0.0, 0.75, 0.75, -0.0],
[-0.75, -0.0, 0.0, 0.75, 0.75, -0.0],
[0.75, 0.0, -0.0, -0.75, 0.75, -0.0],
[-0.75, 0.0, -0.0, -0.75, 0.75, -0.0],
[0.75, -0.0, 0.0, 0.75, -0.75, -0.0],
[-0.75, -0.0, 0.0, 0.75, -0.75, -0.0],
[0.75, 0.0, -0.0, -0.75, -0.75, -0.0],
[-0.75, 0.0, -0.0, -0.75, -0.75, -0.0],
[-0.0, 0.75, 0.0, 0.75, 0.75, 0.0],
[0.0, -0.75, 0.0, 0.75, 0.75, 0.0],
[-0.0, 0.75, -0.0, -0.75, 0.75, 0.0],
[0.0, -0.75, -0.0, -0.75, 0.75, 0.0],
[-0.0, 0.75, 0.0, 0.75, -0.75, 0.0],
[0.0, -0.75, 0.0, 0.75, -0.75, 0.0],
[-0.0, 0.75, -0.0, -0.75, -0.75, 0.0],
[0.0, -0.75, -0.0, -0.75, -0.75, 0.0],
[0.0, -0.0, 0.75, 0.75, 0.75, -0.0],
[-0.0, 0.0, -0.75, 0.75, 0.75, -0.0],
[0.0, -0.0, 0.75, -0.75, 0.75, -0.0],
[-0.0, 0.0, -0.75, -0.75, 0.75, -0.0],
[0.0, -0.0, 0.75, 0.75, -0.75, -0.0],
[-0.0, 0.0, -0.75, 0.75, -0.75, -0.0],
[0.0, -0.0, 0.75, -0.75, -0.75, -0.0],
[-0.0, 0.0, -0.75, -0.75, -0.75, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.0, 0.75],
[-0.75, 0.75, 0.0, -0.0, 0.0, 0.75],
[0.75, -0.75, 0.0, -0.0, 0.0, 0.75],
[-0.75, -0.75, 0.0, -0.0, 0.0, 0.75],
[0.75, 0.75, -0.0, 0.0, -0.0, -0.75],
[-0.75, 0.75, -0.0, 0.0, -0.0, -0.75],
[0.75, -0.75, -0.0, 0.0, -0.0, -0.75],
[-0.75, -0.75, -0.0, 0.0, -0.0, -0.75],
[0.75, 0.0, 0.75, -0.0, 0.0, 0.75],
[-0.75, 0.0, 0.75, -0.0, 0.0, 0.75],
[0.75, -0.0, -0.75, -0.0, 0.0, 0.75],
[-0.75, -0.0, -0.75, -0.0, 0.0, 0.75],
[0.75, 0.0, 0.75, 0.0, -0.0, -0.75],
[-0.75, 0.0, 0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, -0.75, 0.0, -0.0, -0.75],
[-0.75, -0.0, -0.75, 0.0, -0.0, -0.75],
[0.0, 0.75, 0.75, -0.0, 0.0, 0.75],
[-0.0, -0.75, 0.75, -0.0, 0.0, 0.75],
[0.0, 0.75, -0.75, -0.0, 0.0, 0.75],
[-0.0, -0.75, -0.75, -0.0, 0.0, 0.75],
[0.0, 0.75, 0.75, 0.0, -0.0, -0.75],
[-0.0, -0.75, 0.75, 0.0, -0.0, -0.75],
[0.0, 0.75, -0.75, 0.0, -0.0, -0.75],
[-0.0, -0.75, -0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, 0.0, 0.75, 0.0, 0.75],
[-0.75, -0.0, 0.0, 0.75, 0.0, 0.75],
[0.75, 0.0, -0.0, -0.75, 0.0, 0.75],
[-0.75, 0.0, -0.0, -0.75, 0.0, 0.75],
[0.75, -0.0, 0.0, 0.75, -0.0, -0.75],
[-0.75, -0.0, 0.0, 0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.75, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.0, 0.75, 0.0, 0.75, 0.0, 0.75],
[0.0, -0.75, 0.0, 0.75, 0.0, 0.75],
[-0.0, 0.75, -0.0, -0.75, 0.0, 0.75],
[0.0, -0.75, -0.0, -0.75, 0.0, 0.75],
[-0.0, 0.75, 0.0, 0.75, -0.0, -0.75],
[0.0, -0.75, 0.0, 0.75, -0.0, -0.75],
[-0.0, 0.75, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.75, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.0, 0.75, 0.75, 0.0, 0.75],
[-0.0, 0.0, -0.75, 0.75, 0.0, 0.75],
[0.0, -0.0, 0.75, -0.75, 0.0, 0.75],
[-0.0, 0.0, -0.75, -0.75, 0.0, 0.75],
[0.0, -0.0, 0.75, 0.75, -0.0, -0.75],
[-0.0, 0.0, -0.75, 0.75, -0.0, -0.75],
[0.0, -0.0, 0.75, -0.75, -0.0, -0.75],
[-0.0, 0.0, -0.75, -0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, 0.0, 0.75, 0.75],
[-0.75, 0.0, -0.0, 0.0, 0.75, 0.75],
[0.75, -0.0, 0.0, -0.0, -0.75, 0.75],
[-0.75, -0.0, 0.0, -0.0, -0.75, 0.75],
[0.75, 0.0, -0.0, 0.0, 0.75, -0.75],
[-0.75, 0.0, -0.0, 0.0, 0.75, -0.75],
[0.75, -0.0, 0.0, -0.0, -0.75, -0.75],
[-0.75, -0.0, 0.0, -0.0, -0.75, -0.75],
[0.0, 0.75, -0.0, 0.0, 0.75, 0.75],
[-0.0, -0.75, -0.0, 0.0, 0.75, 0.75],
[0.0, 0.75, 0.0, -0.0, -0.75, 0.75],
[-0.0, -0.75, 0.0, -0.0, -0.75, 0.75],
[0.0, 0.75, -0.0, 0.0, 0.75, -0.75],
[-0.0, -0.75, -0.0, 0.0, 0.75, -0.75],
[0.0, 0.75, 0.0, -0.0, -0.75, -0.75],
[-0.0, -0.75, 0.0, -0.0, -0.75, -0.75],
[-0.0, 0.0, 0.75, 0.0, 0.75, 0.75],
[0.0, -0.0, -0.75, 0.0, 0.75, 0.75],
[-0.0, 0.0, 0.75, -0.0, -0.75, 0.75],
[0.0, -0.0, -0.75, -0.0, -0.75, 0.75],
[-0.0, 0.0, 0.75, 0.0, 0.75, -0.75],
[0.0, -0.0, -0.75, 0.0, 0.75, -0.75],
[-0.0, 0.0, 0.75, -0.0, -0.75, -0.75],
[0.0, -0.0, -0.75, -0.0, -0.75, -0.75],
[0.0, 0.0, -0.0, 0.75, 0.75, 0.75],
[-0.0, -0.0, 0.0, -0.75, 0.75, 0.75],
[0.0, 0.0, -0.0, 0.75, -0.75, 0.75],
[-0.0, -0.0, 0.0, -0.75, -0.75, 0.75],
[0.0, 0.0, -0.0, 0.75, 0.75, -0.75],
[-0.0, -0.0, 0.0, -0.75, 0.75, -0.75],
[0.0, 0.0, -0.0, 0.75, -0.75, -0.75],
[-0.0, -0.0, 0.0, -0.75, -0.75, -0.75],
]
.map(|[a, b, c, d, e, f]| {
[
CV + a * HWV,
CV + b * HWV,
CV + c * HWV,
CV + d * HWV,
CV + e * HWV,
CV + f * HWV,
]
});
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * N * (N - 1) * (N - 2) / 3);
}
{
let vv = Generator::new([0.75f64, 0.75, 0.5, 0.0, 0.0, 0.0]);
let should_be = vec![
[0.75, 0.75, 0.50, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.50, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.50, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.50, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.50, 0.0, 0.0, 0.0],
[-0.75, 0.75, -0.50, 0.0, 0.0, 0.0],
[0.75, -0.75, -0.50, 0.0, 0.0, 0.0],
[-0.75, -0.75, -0.50, 0.0, 0.0, 0.0],
[0.75, 0.50, 0.75, -0.0, -0.0, -0.0],
[-0.75, 0.50, 0.75, -0.0, -0.0, -0.0],
[0.75, -0.50, 0.75, -0.0, -0.0, -0.0],
[-0.75, -0.50, 0.75, -0.0, -0.0, -0.0],
[0.75, 0.50, -0.75, -0.0, -0.0, -0.0],
[-0.75, 0.50, -0.75, -0.0, -0.0, -0.0],
[0.75, -0.50, -0.75, -0.0, -0.0, -0.0],
[-0.75, -0.50, -0.75, -0.0, -0.0, -0.0],
[0.50, 0.75, 0.75, 0.0, 0.0, 0.0],
[-0.50, 0.75, 0.75, 0.0, 0.0, 0.0],
[0.50, -0.75, 0.75, 0.0, 0.0, 0.0],
[-0.50, -0.75, 0.75, 0.0, 0.0, 0.0],
[0.50, 0.75, -0.75, 0.0, 0.0, 0.0],
[-0.50, 0.75, -0.75, 0.0, 0.0, 0.0],
[0.50, -0.75, -0.75, 0.0, 0.0, 0.0],
[-0.50, -0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, 0.75, -0.0, 0.50, -0.0, -0.0],
[-0.75, 0.75, -0.0, 0.50, -0.0, -0.0],
[0.75, -0.75, -0.0, 0.50, -0.0, -0.0],
[-0.75, -0.75, -0.0, 0.50, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.50, -0.0, -0.0],
[-0.75, 0.75, 0.0, -0.50, -0.0, -0.0],
[0.75, -0.75, 0.0, -0.50, -0.0, -0.0],
[-0.75, -0.75, 0.0, -0.50, -0.0, -0.0],
[0.75, -0.0, 0.75, 0.50, 0.0, 0.0],
[-0.75, -0.0, 0.75, 0.50, 0.0, 0.0],
[0.75, 0.0, -0.75, 0.50, 0.0, 0.0],
[-0.75, 0.0, -0.75, 0.50, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.50, 0.0, 0.0],
[-0.75, -0.0, 0.75, -0.50, 0.0, 0.0],
[0.75, 0.0, -0.75, -0.50, 0.0, 0.0],
[-0.75, 0.0, -0.75, -0.50, 0.0, 0.0],
[-0.0, 0.75, 0.75, 0.50, -0.0, -0.0],
[0.0, -0.75, 0.75, 0.50, -0.0, -0.0],
[-0.0, 0.75, -0.75, 0.50, -0.0, -0.0],
[0.0, -0.75, -0.75, 0.50, -0.0, -0.0],
[-0.0, 0.75, 0.75, -0.50, -0.0, -0.0],
[0.0, -0.75, 0.75, -0.50, -0.0, -0.0],
[-0.0, 0.75, -0.75, -0.50, -0.0, -0.0],
[0.0, -0.75, -0.75, -0.50, -0.0, -0.0],
[0.75, 0.50, -0.0, 0.75, 0.0, 0.0],
[-0.75, 0.50, -0.0, 0.75, 0.0, 0.0],
[0.75, -0.50, -0.0, 0.75, 0.0, 0.0],
[-0.75, -0.50, -0.0, 0.75, 0.0, 0.0],
[0.75, 0.50, 0.0, -0.75, 0.0, 0.0],
[-0.75, 0.50, 0.0, -0.75, 0.0, 0.0],
[0.75, -0.50, 0.0, -0.75, 0.0, 0.0],
[-0.75, -0.50, 0.0, -0.75, 0.0, 0.0],
[0.50, 0.75, -0.0, 0.75, -0.0, -0.0],
[-0.50, 0.75, -0.0, 0.75, -0.0, -0.0],
[0.50, -0.75, -0.0, 0.75, -0.0, -0.0],
[-0.50, -0.75, -0.0, 0.75, -0.0, -0.0],
[0.50, 0.75, 0.0, -0.75, -0.0, -0.0],
[-0.50, 0.75, 0.0, -0.75, -0.0, -0.0],
[0.50, -0.75, 0.0, -0.75, -0.0, -0.0],
[-0.50, -0.75, 0.0, -0.75, -0.0, -0.0],
[0.75, -0.0, 0.50, 0.75, 0.0, 0.0],
[-0.75, -0.0, 0.50, 0.75, 0.0, 0.0],
[0.75, 0.0, -0.50, 0.75, 0.0, 0.0],
[-0.75, 0.0, -0.50, 0.75, 0.0, 0.0],
[0.75, -0.0, 0.50, -0.75, 0.0, 0.0],
[-0.75, -0.0, 0.50, -0.75, 0.0, 0.0],
[0.75, 0.0, -0.50, -0.75, 0.0, 0.0],
[-0.75, 0.0, -0.50, -0.75, 0.0, 0.0],
[-0.0, 0.75, 0.50, 0.75, -0.0, -0.0],
[0.0, -0.75, 0.50, 0.75, -0.0, -0.0],
[-0.0, 0.75, -0.50, 0.75, -0.0, -0.0],
[0.0, -0.75, -0.50, 0.75, -0.0, -0.0],
[-0.0, 0.75, 0.50, -0.75, -0.0, -0.0],
[0.0, -0.75, 0.50, -0.75, -0.0, -0.0],
[-0.0, 0.75, -0.50, -0.75, -0.0, -0.0],
[0.0, -0.75, -0.50, -0.75, -0.0, -0.0],
[0.50, -0.0, 0.75, 0.75, 0.0, 0.0],
[-0.50, -0.0, 0.75, 0.75, 0.0, 0.0],
[0.50, 0.0, -0.75, 0.75, 0.0, 0.0],
[-0.50, 0.0, -0.75, 0.75, 0.0, 0.0],
[0.50, -0.0, 0.75, -0.75, 0.0, 0.0],
[-0.50, -0.0, 0.75, -0.75, 0.0, 0.0],
[0.50, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.50, 0.0, -0.75, -0.75, 0.0, 0.0],
[-0.0, 0.50, 0.75, 0.75, -0.0, -0.0],
[0.0, -0.50, 0.75, 0.75, -0.0, -0.0],
[-0.0, 0.50, -0.75, 0.75, -0.0, -0.0],
[0.0, -0.50, -0.75, 0.75, -0.0, -0.0],
[-0.0, 0.50, 0.75, -0.75, -0.0, -0.0],
[0.0, -0.50, 0.75, -0.75, -0.0, -0.0],
[-0.0, 0.50, -0.75, -0.75, -0.0, -0.0],
[0.0, -0.50, -0.75, -0.75, -0.0, -0.0],
[0.75, 0.75, 0.0, -0.0, 0.50, 0.0],
[-0.75, 0.75, 0.0, -0.0, 0.50, 0.0],
[0.75, -0.75, 0.0, -0.0, 0.50, 0.0],
[-0.75, -0.75, 0.0, -0.0, 0.50, 0.0],
[0.75, 0.75, -0.0, 0.0, -0.50, 0.0],
[-0.75, 0.75, -0.0, 0.0, -0.50, 0.0],
[0.75, -0.75, -0.0, 0.0, -0.50, 0.0],
[-0.75, -0.75, -0.0, 0.0, -0.50, 0.0],
[0.75, 0.0, 0.75, -0.0, 0.50, -0.0],
[-0.75, 0.0, 0.75, -0.0, 0.50, -0.0],
[0.75, -0.0, -0.75, -0.0, 0.50, -0.0],
[-0.75, -0.0, -0.75, -0.0, 0.50, -0.0],
[0.75, 0.0, 0.75, 0.0, -0.50, -0.0],
[-0.75, 0.0, 0.75, 0.0, -0.50, -0.0],
[0.75, -0.0, -0.75, 0.0, -0.50, -0.0],
[-0.75, -0.0, -0.75, 0.0, -0.50, -0.0],
[0.0, 0.75, 0.75, -0.0, 0.50, 0.0],
[-0.0, -0.75, 0.75, -0.0, 0.50, 0.0],
[0.0, 0.75, -0.75, -0.0, 0.50, 0.0],
[-0.0, -0.75, -0.75, -0.0, 0.50, 0.0],
[0.0, 0.75, 0.75, 0.0, -0.50, 0.0],
[-0.0, -0.75, 0.75, 0.0, -0.50, 0.0],
[0.0, 0.75, -0.75, 0.0, -0.50, 0.0],
[-0.0, -0.75, -0.75, 0.0, -0.50, 0.0],
[0.75, -0.0, 0.0, 0.75, 0.50, -0.0],
[-0.75, -0.0, 0.0, 0.75, 0.50, -0.0],
[0.75, 0.0, -0.0, -0.75, 0.50, -0.0],
[-0.75, 0.0, -0.0, -0.75, 0.50, -0.0],
[0.75, -0.0, 0.0, 0.75, -0.50, -0.0],
[-0.75, -0.0, 0.0, 0.75, -0.50, -0.0],
[0.75, 0.0, -0.0, -0.75, -0.50, -0.0],
[-0.75, 0.0, -0.0, -0.75, -0.50, -0.0],
[-0.0, 0.75, 0.0, 0.75, 0.50, 0.0],
[0.0, -0.75, 0.0, 0.75, 0.50, 0.0],
[-0.0, 0.75, -0.0, -0.75, 0.50, 0.0],
[0.0, -0.75, -0.0, -0.75, 0.50, 0.0],
[-0.0, 0.75, 0.0, 0.75, -0.50, 0.0],
[0.0, -0.75, 0.0, 0.75, -0.50, 0.0],
[-0.0, 0.75, -0.0, -0.75, -0.50, 0.0],
[0.0, -0.75, -0.0, -0.75, -0.50, 0.0],
[0.0, -0.0, 0.75, 0.75, 0.50, -0.0],
[-0.0, 0.0, -0.75, 0.75, 0.50, -0.0],
[0.0, -0.0, 0.75, -0.75, 0.50, -0.0],
[-0.0, 0.0, -0.75, -0.75, 0.50, -0.0],
[0.0, -0.0, 0.75, 0.75, -0.50, -0.0],
[-0.0, 0.0, -0.75, 0.75, -0.50, -0.0],
[0.0, -0.0, 0.75, -0.75, -0.50, -0.0],
[-0.0, 0.0, -0.75, -0.75, -0.50, -0.0],
[0.75, 0.50, -0.0, 0.0, 0.75, 0.0],
[-0.75, 0.50, -0.0, 0.0, 0.75, 0.0],
[0.75, -0.50, -0.0, 0.0, 0.75, 0.0],
[-0.75, -0.50, -0.0, 0.0, 0.75, 0.0],
[0.75, 0.50, 0.0, -0.0, -0.75, 0.0],
[-0.75, 0.50, 0.0, -0.0, -0.75, 0.0],
[0.75, -0.50, 0.0, -0.0, -0.75, 0.0],
[-0.75, -0.50, 0.0, -0.0, -0.75, 0.0],
[0.50, 0.75, -0.0, 0.0, 0.75, -0.0],
[-0.50, 0.75, -0.0, 0.0, 0.75, -0.0],
[0.50, -0.75, -0.0, 0.0, 0.75, -0.0],
[-0.50, -0.75, -0.0, 0.0, 0.75, -0.0],
[0.50, 0.75, 0.0, -0.0, -0.75, -0.0],
[-0.50, 0.75, 0.0, -0.0, -0.75, -0.0],
[0.50, -0.75, 0.0, -0.0, -0.75, -0.0],
[-0.50, -0.75, 0.0, -0.0, -0.75, -0.0],
[0.75, -0.0, 0.50, 0.0, 0.75, 0.0],
[-0.75, -0.0, 0.50, 0.0, 0.75, 0.0],
[0.75, 0.0, -0.50, 0.0, 0.75, 0.0],
[-0.75, 0.0, -0.50, 0.0, 0.75, 0.0],
[0.75, -0.0, 0.50, -0.0, -0.75, 0.0],
[-0.75, -0.0, 0.50, -0.0, -0.75, 0.0],
[0.75, 0.0, -0.50, -0.0, -0.75, 0.0],
[-0.75, 0.0, -0.50, -0.0, -0.75, 0.0],
[-0.0, 0.75, 0.50, 0.0, 0.75, -0.0],
[0.0, -0.75, 0.50, 0.0, 0.75, -0.0],
[-0.0, 0.75, -0.50, 0.0, 0.75, -0.0],
[0.0, -0.75, -0.50, 0.0, 0.75, -0.0],
[-0.0, 0.75, 0.50, -0.0, -0.75, -0.0],
[0.0, -0.75, 0.50, -0.0, -0.75, -0.0],
[-0.0, 0.75, -0.50, -0.0, -0.75, -0.0],
[0.0, -0.75, -0.50, -0.0, -0.75, -0.0],
[0.50, -0.0, 0.75, 0.0, 0.75, 0.0],
[-0.50, -0.0, 0.75, 0.0, 0.75, 0.0],
[0.50, 0.0, -0.75, 0.0, 0.75, 0.0],
[-0.50, 0.0, -0.75, 0.0, 0.75, 0.0],
[0.50, -0.0, 0.75, -0.0, -0.75, 0.0],
[-0.50, -0.0, 0.75, -0.0, -0.75, 0.0],
[0.50, 0.0, -0.75, -0.0, -0.75, 0.0],
[-0.50, 0.0, -0.75, -0.0, -0.75, 0.0],
[-0.0, 0.50, 0.75, 0.0, 0.75, -0.0],
[0.0, -0.50, 0.75, 0.0, 0.75, -0.0],
[-0.0, 0.50, -0.75, 0.0, 0.75, -0.0],
[0.0, -0.50, -0.75, 0.0, 0.75, -0.0],
[-0.0, 0.50, 0.75, -0.0, -0.75, -0.0],
[0.0, -0.50, 0.75, -0.0, -0.75, -0.0],
[-0.0, 0.50, -0.75, -0.0, -0.75, -0.0],
[0.0, -0.50, -0.75, -0.0, -0.75, -0.0],
[0.75, 0.0, -0.0, 0.50, 0.75, 0.0],
[-0.75, 0.0, -0.0, 0.50, 0.75, 0.0],
[0.75, -0.0, 0.0, -0.50, 0.75, 0.0],
[-0.75, -0.0, 0.0, -0.50, 0.75, 0.0],
[0.75, 0.0, -0.0, 0.50, -0.75, 0.0],
[-0.75, 0.0, -0.0, 0.50, -0.75, 0.0],
[0.75, -0.0, 0.0, -0.50, -0.75, 0.0],
[-0.75, -0.0, 0.0, -0.50, -0.75, 0.0],
[0.0, 0.75, -0.0, 0.50, 0.75, -0.0],
[-0.0, -0.75, -0.0, 0.50, 0.75, -0.0],
[0.0, 0.75, 0.0, -0.50, 0.75, -0.0],
[-0.0, -0.75, 0.0, -0.50, 0.75, -0.0],
[0.0, 0.75, -0.0, 0.50, -0.75, -0.0],
[-0.0, -0.75, -0.0, 0.50, -0.75, -0.0],
[0.0, 0.75, 0.0, -0.50, -0.75, -0.0],
[-0.0, -0.75, 0.0, -0.50, -0.75, -0.0],
[-0.0, 0.0, 0.75, 0.50, 0.75, 0.0],
[0.0, -0.0, -0.75, 0.50, 0.75, 0.0],
[-0.0, 0.0, 0.75, -0.50, 0.75, 0.0],
[0.0, -0.0, -0.75, -0.50, 0.75, 0.0],
[-0.0, 0.0, 0.75, 0.50, -0.75, 0.0],
[0.0, -0.0, -0.75, 0.50, -0.75, 0.0],
[-0.0, 0.0, 0.75, -0.50, -0.75, 0.0],
[0.0, -0.0, -0.75, -0.50, -0.75, 0.0],
[0.50, 0.0, -0.0, 0.75, 0.75, -0.0],
[-0.50, 0.0, -0.0, 0.75, 0.75, -0.0],
[0.50, -0.0, 0.0, -0.75, 0.75, -0.0],
[-0.50, -0.0, 0.0, -0.75, 0.75, -0.0],
[0.50, 0.0, -0.0, 0.75, -0.75, -0.0],
[-0.50, 0.0, -0.0, 0.75, -0.75, -0.0],
[0.50, -0.0, 0.0, -0.75, -0.75, -0.0],
[-0.50, -0.0, 0.0, -0.75, -0.75, -0.0],
[0.0, 0.50, -0.0, 0.75, 0.75, 0.0],
[-0.0, -0.50, -0.0, 0.75, 0.75, 0.0],
[0.0, 0.50, 0.0, -0.75, 0.75, 0.0],
[-0.0, -0.50, 0.0, -0.75, 0.75, 0.0],
[0.0, 0.50, -0.0, 0.75, -0.75, 0.0],
[-0.0, -0.50, -0.0, 0.75, -0.75, 0.0],
[0.0, 0.50, 0.0, -0.75, -0.75, 0.0],
[-0.0, -0.50, 0.0, -0.75, -0.75, 0.0],
[-0.0, 0.0, 0.50, 0.75, 0.75, -0.0],
[0.0, -0.0, -0.50, 0.75, 0.75, -0.0],
[-0.0, 0.0, 0.50, -0.75, 0.75, -0.0],
[0.0, -0.0, -0.50, -0.75, 0.75, -0.0],
[-0.0, 0.0, 0.50, 0.75, -0.75, -0.0],
[0.0, -0.0, -0.50, 0.75, -0.75, -0.0],
[-0.0, 0.0, 0.50, -0.75, -0.75, -0.0],
[0.0, -0.0, -0.50, -0.75, -0.75, -0.0],
[0.75, 0.75, 0.0, 0.0, -0.0, 0.50],
[-0.75, 0.75, 0.0, 0.0, -0.0, 0.50],
[0.75, -0.75, 0.0, 0.0, -0.0, 0.50],
[-0.75, -0.75, 0.0, 0.0, -0.0, 0.50],
[0.75, 0.75, -0.0, -0.0, 0.0, -0.50],
[-0.75, 0.75, -0.0, -0.0, 0.0, -0.50],
[0.75, -0.75, -0.0, -0.0, 0.0, -0.50],
[-0.75, -0.75, -0.0, -0.0, 0.0, -0.50],
[0.75, 0.0, 0.75, 0.0, -0.0, 0.50],
[-0.75, 0.0, 0.75, 0.0, -0.0, 0.50],
[0.75, -0.0, -0.75, 0.0, -0.0, 0.50],
[-0.75, -0.0, -0.75, 0.0, -0.0, 0.50],
[0.75, 0.0, 0.75, -0.0, 0.0, -0.50],
[-0.75, 0.0, 0.75, -0.0, 0.0, -0.50],
[0.75, -0.0, -0.75, -0.0, 0.0, -0.50],
[-0.75, -0.0, -0.75, -0.0, 0.0, -0.50],
[0.0, 0.75, 0.75, 0.0, -0.0, 0.50],
[-0.0, -0.75, 0.75, 0.0, -0.0, 0.50],
[0.0, 0.75, -0.75, 0.0, -0.0, 0.50],
[-0.0, -0.75, -0.75, 0.0, -0.0, 0.50],
[0.0, 0.75, 0.75, -0.0, 0.0, -0.50],
[-0.0, -0.75, 0.75, -0.0, 0.0, -0.50],
[0.0, 0.75, -0.75, -0.0, 0.0, -0.50],
[-0.0, -0.75, -0.75, -0.0, 0.0, -0.50],
[0.75, 0.0, 0.0, 0.75, -0.0, 0.50],
[-0.75, 0.0, 0.0, 0.75, -0.0, 0.50],
[0.75, -0.0, -0.0, -0.75, -0.0, 0.50],
[-0.75, -0.0, -0.0, -0.75, -0.0, 0.50],
[0.75, 0.0, 0.0, 0.75, 0.0, -0.50],
[-0.75, 0.0, 0.0, 0.75, 0.0, -0.50],
[0.75, -0.0, -0.0, -0.75, 0.0, -0.50],
[-0.75, -0.0, -0.0, -0.75, 0.0, -0.50],
[0.0, 0.75, 0.0, 0.75, -0.0, 0.50],
[-0.0, -0.75, 0.0, 0.75, -0.0, 0.50],
[0.0, 0.75, -0.0, -0.75, -0.0, 0.50],
[-0.0, -0.75, -0.0, -0.75, -0.0, 0.50],
[0.0, 0.75, 0.0, 0.75, 0.0, -0.50],
[-0.0, -0.75, 0.0, 0.75, 0.0, -0.50],
[0.0, 0.75, -0.0, -0.75, 0.0, -0.50],
[-0.0, -0.75, -0.0, -0.75, 0.0, -0.50],
[0.0, 0.0, 0.75, 0.75, -0.0, 0.50],
[-0.0, -0.0, -0.75, 0.75, -0.0, 0.50],
[0.0, 0.0, 0.75, -0.75, -0.0, 0.50],
[-0.0, -0.0, -0.75, -0.75, -0.0, 0.50],
[0.0, 0.0, 0.75, 0.75, 0.0, -0.50],
[-0.0, -0.0, -0.75, 0.75, 0.0, -0.50],
[0.0, 0.0, 0.75, -0.75, 0.0, -0.50],
[-0.0, -0.0, -0.75, -0.75, 0.0, -0.50],
[0.75, -0.0, 0.0, 0.0, 0.75, 0.50],
[-0.75, -0.0, 0.0, 0.0, 0.75, 0.50],
[0.75, 0.0, -0.0, -0.0, -0.75, 0.50],
[-0.75, 0.0, -0.0, -0.0, -0.75, 0.50],
[0.75, -0.0, 0.0, 0.0, 0.75, -0.50],
[-0.75, -0.0, 0.0, 0.0, 0.75, -0.50],
[0.75, 0.0, -0.0, -0.0, -0.75, -0.50],
[-0.75, 0.0, -0.0, -0.0, -0.75, -0.50],
[-0.0, 0.75, 0.0, 0.0, 0.75, 0.50],
[0.0, -0.75, 0.0, 0.0, 0.75, 0.50],
[-0.0, 0.75, -0.0, -0.0, -0.75, 0.50],
[0.0, -0.75, -0.0, -0.0, -0.75, 0.50],
[-0.0, 0.75, 0.0, 0.0, 0.75, -0.50],
[0.0, -0.75, 0.0, 0.0, 0.75, -0.50],
[-0.0, 0.75, -0.0, -0.0, -0.75, -0.50],
[0.0, -0.75, -0.0, -0.0, -0.75, -0.50],
[0.0, -0.0, 0.75, 0.0, 0.75, 0.50],
[-0.0, 0.0, -0.75, 0.0, 0.75, 0.50],
[0.0, -0.0, 0.75, -0.0, -0.75, 0.50],
[-0.0, 0.0, -0.75, -0.0, -0.75, 0.50],
[0.0, -0.0, 0.75, 0.0, 0.75, -0.50],
[-0.0, 0.0, -0.75, 0.0, 0.75, -0.50],
[0.0, -0.0, 0.75, -0.0, -0.75, -0.50],
[-0.0, 0.0, -0.75, -0.0, -0.75, -0.50],
[0.0, -0.0, 0.0, 0.75, 0.75, 0.50],
[-0.0, 0.0, -0.0, -0.75, 0.75, 0.50],
[0.0, -0.0, 0.0, 0.75, -0.75, 0.50],
[-0.0, 0.0, -0.0, -0.75, -0.75, 0.50],
[0.0, -0.0, 0.0, 0.75, 0.75, -0.50],
[-0.0, 0.0, -0.0, -0.75, 0.75, -0.50],
[0.0, -0.0, 0.0, 0.75, -0.75, -0.50],
[-0.0, 0.0, -0.0, -0.75, -0.75, -0.50],
[0.75, 0.50, 0.0, -0.0, 0.0, 0.75],
[-0.75, 0.50, 0.0, -0.0, 0.0, 0.75],
[0.75, -0.50, 0.0, -0.0, 0.0, 0.75],
[-0.75, -0.50, 0.0, -0.0, 0.0, 0.75],
[0.75, 0.50, -0.0, 0.0, -0.0, -0.75],
[-0.75, 0.50, -0.0, 0.0, -0.0, -0.75],
[0.75, -0.50, -0.0, 0.0, -0.0, -0.75],
[-0.75, -0.50, -0.0, 0.0, -0.0, -0.75],
[0.50, 0.75, 0.0, -0.0, 0.0, 0.75],
[-0.50, 0.75, 0.0, -0.0, 0.0, 0.75],
[0.50, -0.75, 0.0, -0.0, 0.0, 0.75],
[-0.50, -0.75, 0.0, -0.0, 0.0, 0.75],
[0.50, 0.75, -0.0, 0.0, -0.0, -0.75],
[-0.50, 0.75, -0.0, 0.0, -0.0, -0.75],
[0.50, -0.75, -0.0, 0.0, -0.0, -0.75],
[-0.50, -0.75, -0.0, 0.0, -0.0, -0.75],
[0.75, 0.0, 0.50, -0.0, 0.0, 0.75],
[-0.75, 0.0, 0.50, -0.0, 0.0, 0.75],
[0.75, -0.0, -0.50, -0.0, 0.0, 0.75],
[-0.75, -0.0, -0.50, -0.0, 0.0, 0.75],
[0.75, 0.0, 0.50, 0.0, -0.0, -0.75],
[-0.75, 0.0, 0.50, 0.0, -0.0, -0.75],
[0.75, -0.0, -0.50, 0.0, -0.0, -0.75],
[-0.75, -0.0, -0.50, 0.0, -0.0, -0.75],
[0.0, 0.75, 0.50, -0.0, 0.0, 0.75],
[-0.0, -0.75, 0.50, -0.0, 0.0, 0.75],
[0.0, 0.75, -0.50, -0.0, 0.0, 0.75],
[-0.0, -0.75, -0.50, -0.0, 0.0, 0.75],
[0.0, 0.75, 0.50, 0.0, -0.0, -0.75],
[-0.0, -0.75, 0.50, 0.0, -0.0, -0.75],
[0.0, 0.75, -0.50, 0.0, -0.0, -0.75],
[-0.0, -0.75, -0.50, 0.0, -0.0, -0.75],
[0.50, 0.0, 0.75, -0.0, 0.0, 0.75],
[-0.50, 0.0, 0.75, -0.0, 0.0, 0.75],
[0.50, -0.0, -0.75, -0.0, 0.0, 0.75],
[-0.50, -0.0, -0.75, -0.0, 0.0, 0.75],
[0.50, 0.0, 0.75, 0.0, -0.0, -0.75],
[-0.50, 0.0, 0.75, 0.0, -0.0, -0.75],
[0.50, -0.0, -0.75, 0.0, -0.0, -0.75],
[-0.50, -0.0, -0.75, 0.0, -0.0, -0.75],
[0.0, 0.50, 0.75, -0.0, 0.0, 0.75],
[-0.0, -0.50, 0.75, -0.0, 0.0, 0.75],
[0.0, 0.50, -0.75, -0.0, 0.0, 0.75],
[-0.0, -0.50, -0.75, -0.0, 0.0, 0.75],
[0.0, 0.50, 0.75, 0.0, -0.0, -0.75],
[-0.0, -0.50, 0.75, 0.0, -0.0, -0.75],
[0.0, 0.50, -0.75, 0.0, -0.0, -0.75],
[-0.0, -0.50, -0.75, 0.0, -0.0, -0.75],
[0.75, -0.0, 0.0, 0.50, 0.0, 0.75],
[-0.75, -0.0, 0.0, 0.50, 0.0, 0.75],
[0.75, 0.0, -0.0, -0.50, 0.0, 0.75],
[-0.75, 0.0, -0.0, -0.50, 0.0, 0.75],
[0.75, -0.0, 0.0, 0.50, -0.0, -0.75],
[-0.75, -0.0, 0.0, 0.50, -0.0, -0.75],
[0.75, 0.0, -0.0, -0.50, -0.0, -0.75],
[-0.75, 0.0, -0.0, -0.50, -0.0, -0.75],
[-0.0, 0.75, 0.0, 0.50, 0.0, 0.75],
[0.0, -0.75, 0.0, 0.50, 0.0, 0.75],
[-0.0, 0.75, -0.0, -0.50, 0.0, 0.75],
[0.0, -0.75, -0.0, -0.50, 0.0, 0.75],
[-0.0, 0.75, 0.0, 0.50, -0.0, -0.75],
[0.0, -0.75, 0.0, 0.50, -0.0, -0.75],
[-0.0, 0.75, -0.0, -0.50, -0.0, -0.75],
[0.0, -0.75, -0.0, -0.50, -0.0, -0.75],
[0.0, -0.0, 0.75, 0.50, 0.0, 0.75],
[-0.0, 0.0, -0.75, 0.50, 0.0, 0.75],
[0.0, -0.0, 0.75, -0.50, 0.0, 0.75],
[-0.0, 0.0, -0.75, -0.50, 0.0, 0.75],
[0.0, -0.0, 0.75, 0.50, -0.0, -0.75],
[-0.0, 0.0, -0.75, 0.50, -0.0, -0.75],
[0.0, -0.0, 0.75, -0.50, -0.0, -0.75],
[-0.0, 0.0, -0.75, -0.50, -0.0, -0.75],
[0.50, -0.0, 0.0, 0.75, 0.0, 0.75],
[-0.50, -0.0, 0.0, 0.75, 0.0, 0.75],
[0.50, 0.0, -0.0, -0.75, 0.0, 0.75],
[-0.50, 0.0, -0.0, -0.75, 0.0, 0.75],
[0.50, -0.0, 0.0, 0.75, -0.0, -0.75],
[-0.50, -0.0, 0.0, 0.75, -0.0, -0.75],
[0.50, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.50, 0.0, -0.0, -0.75, -0.0, -0.75],
[-0.0, 0.50, 0.0, 0.75, 0.0, 0.75],
[0.0, -0.50, 0.0, 0.75, 0.0, 0.75],
[-0.0, 0.50, -0.0, -0.75, 0.0, 0.75],
[0.0, -0.50, -0.0, -0.75, 0.0, 0.75],
[-0.0, 0.50, 0.0, 0.75, -0.0, -0.75],
[0.0, -0.50, 0.0, 0.75, -0.0, -0.75],
[-0.0, 0.50, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.50, -0.0, -0.75, -0.0, -0.75],
[0.0, -0.0, 0.50, 0.75, 0.0, 0.75],
[-0.0, 0.0, -0.50, 0.75, 0.0, 0.75],
[0.0, -0.0, 0.50, -0.75, 0.0, 0.75],
[-0.0, 0.0, -0.50, -0.75, 0.0, 0.75],
[0.0, -0.0, 0.50, 0.75, -0.0, -0.75],
[-0.0, 0.0, -0.50, 0.75, -0.0, -0.75],
[0.0, -0.0, 0.50, -0.75, -0.0, -0.75],
[-0.0, 0.0, -0.50, -0.75, -0.0, -0.75],
[0.75, 0.0, -0.0, 0.0, 0.50, 0.75],
[-0.75, 0.0, -0.0, 0.0, 0.50, 0.75],
[0.75, -0.0, 0.0, -0.0, -0.50, 0.75],
[-0.75, -0.0, 0.0, -0.0, -0.50, 0.75],
[0.75, 0.0, -0.0, 0.0, 0.50, -0.75],
[-0.75, 0.0, -0.0, 0.0, 0.50, -0.75],
[0.75, -0.0, 0.0, -0.0, -0.50, -0.75],
[-0.75, -0.0, 0.0, -0.0, -0.50, -0.75],
[0.0, 0.75, -0.0, 0.0, 0.50, 0.75],
[-0.0, -0.75, -0.0, 0.0, 0.50, 0.75],
[0.0, 0.75, 0.0, -0.0, -0.50, 0.75],
[-0.0, -0.75, 0.0, -0.0, -0.50, 0.75],
[0.0, 0.75, -0.0, 0.0, 0.50, -0.75],
[-0.0, -0.75, -0.0, 0.0, 0.50, -0.75],
[0.0, 0.75, 0.0, -0.0, -0.50, -0.75],
[-0.0, -0.75, 0.0, -0.0, -0.50, -0.75],
[-0.0, 0.0, 0.75, 0.0, 0.50, 0.75],
[0.0, -0.0, -0.75, 0.0, 0.50, 0.75],
[-0.0, 0.0, 0.75, -0.0, -0.50, 0.75],
[0.0, -0.0, -0.75, -0.0, -0.50, 0.75],
[-0.0, 0.0, 0.75, 0.0, 0.50, -0.75],
[0.0, -0.0, -0.75, 0.0, 0.50, -0.75],
[-0.0, 0.0, 0.75, -0.0, -0.50, -0.75],
[0.0, -0.0, -0.75, -0.0, -0.50, -0.75],
[0.0, 0.0, -0.0, 0.75, 0.50, 0.75],
[-0.0, -0.0, 0.0, -0.75, 0.50, 0.75],
[0.0, 0.0, -0.0, 0.75, -0.50, 0.75],
[-0.0, -0.0, 0.0, -0.75, -0.50, 0.75],
[0.0, 0.0, -0.0, 0.75, 0.50, -0.75],
[-0.0, -0.0, 0.0, -0.75, 0.50, -0.75],
[0.0, 0.0, -0.0, 0.75, -0.50, -0.75],
[-0.0, -0.0, 0.0, -0.75, -0.50, -0.75],
[0.50, -0.0, 0.0, 0.0, 0.75, 0.75],
[-0.50, -0.0, 0.0, 0.0, 0.75, 0.75],
[0.50, 0.0, -0.0, -0.0, -0.75, 0.75],
[-0.50, 0.0, -0.0, -0.0, -0.75, 0.75],
[0.50, -0.0, 0.0, 0.0, 0.75, -0.75],
[-0.50, -0.0, 0.0, 0.0, 0.75, -0.75],
[0.50, 0.0, -0.0, -0.0, -0.75, -0.75],
[-0.50, 0.0, -0.0, -0.0, -0.75, -0.75],
[-0.0, 0.50, 0.0, 0.0, 0.75, 0.75],
[0.0, -0.50, 0.0, 0.0, 0.75, 0.75],
[-0.0, 0.50, -0.0, -0.0, -0.75, 0.75],
[0.0, -0.50, -0.0, -0.0, -0.75, 0.75],
[-0.0, 0.50, 0.0, 0.0, 0.75, -0.75],
[0.0, -0.50, 0.0, 0.0, 0.75, -0.75],
[-0.0, 0.50, -0.0, -0.0, -0.75, -0.75],
[0.0, -0.50, -0.0, -0.0, -0.75, -0.75],
[0.0, -0.0, 0.50, 0.0, 0.75, 0.75],
[-0.0, 0.0, -0.50, 0.0, 0.75, 0.75],
[0.0, -0.0, 0.50, -0.0, -0.75, 0.75],
[-0.0, 0.0, -0.50, -0.0, -0.75, 0.75],
[0.0, -0.0, 0.50, 0.0, 0.75, -0.75],
[-0.0, 0.0, -0.50, 0.0, 0.75, -0.75],
[0.0, -0.0, 0.50, -0.0, -0.75, -0.75],
[-0.0, 0.0, -0.50, -0.0, -0.75, -0.75],
[0.0, -0.0, 0.0, 0.50, 0.75, 0.75],
[-0.0, 0.0, -0.0, -0.50, 0.75, 0.75],
[0.0, -0.0, 0.0, 0.50, -0.75, 0.75],
[-0.0, 0.0, -0.0, -0.50, -0.75, 0.75],
[0.0, -0.0, 0.0, 0.50, 0.75, -0.75],
[-0.0, 0.0, -0.0, -0.50, 0.75, -0.75],
[0.0, -0.0, 0.0, 0.50, -0.75, -0.75],
[-0.0, 0.0, -0.0, -0.50, -0.75, -0.75],
];
let should_be = should_be.iter().map(|[a, b, c, d, e, f]| {
[
CV + a * HWV,
CV + b * HWV,
CV + c * HWV,
CV + d * HWV,
CV + e * HWV,
CV + f * HWV,
]
});
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * N * (N - 1) * (N - 2));
}
{
let vv = Generator::new([0.75f64, 0.5, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.50, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.50, 0.0, 0.0, 0.0, 0.0],
[0.75, -0.50, 0.0, 0.0, 0.0, 0.0],
[-0.75, -0.50, 0.0, 0.0, 0.0, 0.0],
[0.50, 0.75, -0.0, -0.0, -0.0, -0.0],
[-0.50, 0.75, -0.0, -0.0, -0.0, -0.0],
[0.50, -0.75, -0.0, -0.0, -0.0, -0.0],
[-0.50, -0.75, -0.0, -0.0, -0.0, -0.0],
[0.75, 0.0, 0.50, 0.0, 0.0, 0.0],
[-0.75, 0.0, 0.50, 0.0, 0.0, 0.0],
[0.75, -0.0, -0.50, 0.0, 0.0, 0.0],
[-0.75, -0.0, -0.50, 0.0, 0.0, 0.0],
[0.0, 0.75, 0.50, -0.0, -0.0, -0.0],
[-0.0, -0.75, 0.50, -0.0, -0.0, -0.0],
[0.0, 0.75, -0.50, -0.0, -0.0, -0.0],
[-0.0, -0.75, -0.50, -0.0, -0.0, -0.0],
[0.50, 0.0, 0.75, 0.0, 0.0, 0.0],
[-0.50, 0.0, 0.75, 0.0, 0.0, 0.0],
[0.50, -0.0, -0.75, 0.0, 0.0, 0.0],
[-0.50, -0.0, -0.75, 0.0, 0.0, 0.0],
[0.0, 0.50, 0.75, -0.0, -0.0, -0.0],
[-0.0, -0.50, 0.75, -0.0, -0.0, -0.0],
[0.0, 0.50, -0.75, -0.0, -0.0, -0.0],
[-0.0, -0.50, -0.75, -0.0, -0.0, -0.0],
[0.75, 0.0, 0.0, 0.50, 0.0, 0.0],
[-0.75, 0.0, 0.0, 0.50, 0.0, 0.0],
[0.75, -0.0, -0.0, -0.50, 0.0, 0.0],
[-0.75, -0.0, -0.0, -0.50, 0.0, 0.0],
[0.0, 0.75, 0.0, 0.50, -0.0, -0.0],
[-0.0, -0.75, 0.0, 0.50, -0.0, -0.0],
[0.0, 0.75, -0.0, -0.50, -0.0, -0.0],
[-0.0, -0.75, -0.0, -0.50, -0.0, -0.0],
[0.0, 0.0, 0.75, 0.50, 0.0, 0.0],
[-0.0, -0.0, -0.75, 0.50, 0.0, 0.0],
[0.0, 0.0, 0.75, -0.50, 0.0, 0.0],
[-0.0, -0.0, -0.75, -0.50, 0.0, 0.0],
[0.50, 0.0, 0.0, 0.75, -0.0, -0.0],
[-0.50, 0.0, 0.0, 0.75, -0.0, -0.0],
[0.50, -0.0, -0.0, -0.75, -0.0, -0.0],
[-0.50, -0.0, -0.0, -0.75, -0.0, -0.0],
[0.0, 0.50, 0.0, 0.75, 0.0, 0.0],
[-0.0, -0.50, 0.0, 0.75, 0.0, 0.0],
[0.0, 0.50, -0.0, -0.75, 0.0, 0.0],
[-0.0, -0.50, -0.0, -0.75, 0.0, 0.0],
[0.0, 0.0, 0.50, 0.75, -0.0, -0.0],
[-0.0, -0.0, -0.50, 0.75, -0.0, -0.0],
[0.0, 0.0, 0.50, -0.75, -0.0, -0.0],
[-0.0, -0.0, -0.50, -0.75, -0.0, -0.0],
[0.75, 0.0, 0.0, 0.0, 0.50, 0.0],
[-0.75, 0.0, 0.0, 0.0, 0.50, 0.0],
[0.75, -0.0, -0.0, -0.0, -0.50, 0.0],
[-0.75, -0.0, -0.0, -0.0, -0.50, 0.0],
[0.0, 0.75, 0.0, 0.0, 0.50, -0.0],
[-0.0, -0.75, 0.0, 0.0, 0.50, -0.0],
[0.0, 0.75, -0.0, -0.0, -0.50, -0.0],
[-0.0, -0.75, -0.0, -0.0, -0.50, -0.0],
[0.0, 0.0, 0.75, 0.0, 0.50, 0.0],
[-0.0, -0.0, -0.75, 0.0, 0.50, 0.0],
[0.0, 0.0, 0.75, -0.0, -0.50, 0.0],
[-0.0, -0.0, -0.75, -0.0, -0.50, 0.0],
[0.0, 0.0, 0.0, 0.75, 0.50, -0.0],
[-0.0, -0.0, -0.0, -0.75, 0.50, -0.0],
[0.0, 0.0, 0.0, 0.75, -0.50, -0.0],
[-0.0, -0.0, -0.0, -0.75, -0.50, -0.0],
[0.50, 0.0, 0.0, 0.0, 0.75, 0.0],
[-0.50, 0.0, 0.0, 0.0, 0.75, 0.0],
[0.50, -0.0, -0.0, -0.0, -0.75, 0.0],
[-0.50, -0.0, -0.0, -0.0, -0.75, 0.0],
[0.0, 0.50, 0.0, 0.0, 0.75, -0.0],
[-0.0, -0.50, 0.0, 0.0, 0.75, -0.0],
[0.0, 0.50, -0.0, -0.0, -0.75, -0.0],
[-0.0, -0.50, -0.0, -0.0, -0.75, -0.0],
[0.0, 0.0, 0.50, 0.0, 0.75, 0.0],
[-0.0, -0.0, -0.50, 0.0, 0.75, 0.0],
[0.0, 0.0, 0.50, -0.0, -0.75, 0.0],
[-0.0, -0.0, -0.50, -0.0, -0.75, 0.0],
[0.0, 0.0, 0.0, 0.50, 0.75, -0.0],
[-0.0, -0.0, -0.0, -0.50, 0.75, -0.0],
[0.0, 0.0, 0.0, 0.50, -0.75, -0.0],
[-0.0, -0.0, -0.0, -0.50, -0.75, -0.0],
[0.75, 0.0, 0.0, 0.0, 0.0, 0.50],
[-0.75, 0.0, 0.0, 0.0, 0.0, 0.50],
[0.75, -0.0, -0.0, -0.0, -0.0, -0.50],
[-0.75, -0.0, -0.0, -0.0, -0.0, -0.50],
[0.0, 0.75, 0.0, 0.0, 0.0, 0.50],
[-0.0, -0.75, 0.0, 0.0, 0.0, 0.50],
[0.0, 0.75, -0.0, -0.0, -0.0, -0.50],
[-0.0, -0.75, -0.0, -0.0, -0.0, -0.50],
[0.0, 0.0, 0.75, 0.0, 0.0, 0.50],
[-0.0, -0.0, -0.75, 0.0, 0.0, 0.50],
[0.0, 0.0, 0.75, -0.0, -0.0, -0.50],
[-0.0, -0.0, -0.75, -0.0, -0.0, -0.50],
[0.0, 0.0, 0.0, 0.75, 0.0, 0.50],
[-0.0, -0.0, -0.0, -0.75, 0.0, 0.50],
[0.0, 0.0, 0.0, 0.75, -0.0, -0.50],
[-0.0, -0.0, -0.0, -0.75, -0.0, -0.50],
[0.0, 0.0, 0.0, 0.0, 0.75, 0.50],
[-0.0, -0.0, -0.0, -0.0, -0.75, 0.50],
[0.0, 0.0, 0.0, 0.0, 0.75, -0.50],
[-0.0, -0.0, -0.0, -0.0, -0.75, -0.50],
[0.50, 0.0, 0.0, 0.0, 0.0, 0.75],
[-0.50, 0.0, 0.0, 0.0, 0.0, 0.75],
[0.50, -0.0, -0.0, -0.0, -0.0, -0.75],
[-0.50, -0.0, -0.0, -0.0, -0.0, -0.75],
[0.0, 0.50, 0.0, 0.0, 0.0, 0.75],
[-0.0, -0.50, 0.0, 0.0, 0.0, 0.75],
[0.0, 0.50, -0.0, -0.0, -0.0, -0.75],
[-0.0, -0.50, -0.0, -0.0, -0.0, -0.75],
[0.0, 0.0, 0.50, 0.0, 0.0, 0.75],
[-0.0, -0.0, -0.50, 0.0, 0.0, 0.75],
[0.0, 0.0, 0.50, -0.0, -0.0, -0.75],
[-0.0, -0.0, -0.50, -0.0, -0.0, -0.75],
[0.0, 0.0, 0.0, 0.50, 0.0, 0.75],
[-0.0, -0.0, -0.0, -0.50, 0.0, 0.75],
[0.0, 0.0, 0.0, 0.50, -0.0, -0.75],
[-0.0, -0.0, -0.0, -0.50, -0.0, -0.75],
[0.0, 0.0, 0.0, 0.0, 0.50, 0.75],
[-0.0, -0.0, -0.0, -0.0, -0.50, 0.75],
[0.0, 0.0, 0.0, 0.0, 0.50, -0.75],
[-0.0, -0.0, -0.0, -0.0, -0.50, -0.75],
]
.map(|[a, b, c, d, e, f]| {
[
CV + a * HWV,
CV + b * HWV,
CV + c * HWV,
CV + d * HWV,
CV + e * HWV,
CV + f * HWV,
]
});
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 4 * N * (N - 1));
}
{
let vv = Generator::new([0.75f64, 0.75, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.75, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.75, 0.0, 0.0, 0.0, 0.0],
[0.75, -0.75, 0.0, 0.0, 0.0, 0.0],
[-0.75, -0.75, 0.0, 0.0, 0.0, 0.0],
[0.75, -0.0, 0.75, -0.0, -0.0, -0.0],
[-0.75, -0.0, 0.75, -0.0, -0.0, -0.0],
[0.75, 0.0, -0.75, -0.0, -0.0, -0.0],
[-0.75, 0.0, -0.75, -0.0, -0.0, -0.0],
[-0.0, 0.75, 0.75, 0.0, 0.0, 0.0],
[0.0, -0.75, 0.75, 0.0, 0.0, 0.0],
[-0.0, 0.75, -0.75, 0.0, 0.0, 0.0],
[0.0, -0.75, -0.75, 0.0, 0.0, 0.0],
[0.75, -0.0, -0.0, 0.75, -0.0, -0.0],
[-0.75, -0.0, -0.0, 0.75, -0.0, -0.0],
[0.75, 0.0, 0.0, -0.75, -0.0, -0.0],
[-0.75, 0.0, 0.0, -0.75, -0.0, -0.0],
[-0.0, 0.75, -0.0, 0.75, 0.0, 0.0],
[0.0, -0.75, -0.0, 0.75, 0.0, 0.0],
[-0.0, 0.75, 0.0, -0.75, 0.0, 0.0],
[0.0, -0.75, 0.0, -0.75, 0.0, 0.0],
[-0.0, -0.0, 0.75, 0.75, -0.0, -0.0],
[0.0, 0.0, -0.75, 0.75, -0.0, -0.0],
[-0.0, -0.0, 0.75, -0.75, -0.0, -0.0],
[0.0, 0.0, -0.75, -0.75, -0.0, -0.0],
[0.75, 0.0, -0.0, -0.0, 0.75, 0.0],
[-0.75, 0.0, -0.0, -0.0, 0.75, 0.0],
[0.75, -0.0, 0.0, 0.0, -0.75, 0.0],
[-0.75, -0.0, 0.0, 0.0, -0.75, 0.0],
[0.0, 0.75, -0.0, -0.0, 0.75, -0.0],
[-0.0, -0.75, -0.0, -0.0, 0.75, -0.0],
[0.0, 0.75, 0.0, 0.0, -0.75, -0.0],
[-0.0, -0.75, 0.0, 0.0, -0.75, -0.0],
[-0.0, 0.0, 0.75, -0.0, 0.75, 0.0],
[0.0, -0.0, -0.75, -0.0, 0.75, 0.0],
[-0.0, 0.0, 0.75, 0.0, -0.75, 0.0],
[0.0, -0.0, -0.75, 0.0, -0.75, 0.0],
[-0.0, 0.0, -0.0, 0.75, 0.75, -0.0],
[0.0, -0.0, 0.0, -0.75, 0.75, -0.0],
[-0.0, 0.0, -0.0, 0.75, -0.75, -0.0],
[0.0, -0.0, 0.0, -0.75, -0.75, -0.0],
[0.75, 0.0, -0.0, 0.0, -0.0, 0.75],
[-0.75, 0.0, -0.0, 0.0, -0.0, 0.75],
[0.75, -0.0, 0.0, -0.0, 0.0, -0.75],
[-0.75, -0.0, 0.0, -0.0, 0.0, -0.75],
[0.0, 0.75, -0.0, 0.0, -0.0, 0.75],
[-0.0, -0.75, -0.0, 0.0, -0.0, 0.75],
[0.0, 0.75, 0.0, -0.0, 0.0, -0.75],
[-0.0, -0.75, 0.0, -0.0, 0.0, -0.75],
[-0.0, 0.0, 0.75, 0.0, -0.0, 0.75],
[0.0, -0.0, -0.75, 0.0, -0.0, 0.75],
[-0.0, 0.0, 0.75, -0.0, 0.0, -0.75],
[0.0, -0.0, -0.75, -0.0, 0.0, -0.75],
[0.0, 0.0, -0.0, 0.75, -0.0, 0.75],
[-0.0, -0.0, 0.0, -0.75, -0.0, 0.75],
[0.0, 0.0, -0.0, 0.75, 0.0, -0.75],
[-0.0, -0.0, 0.0, -0.75, 0.0, -0.75],
[-0.0, -0.0, 0.0, 0.0, 0.75, 0.75],
[0.0, 0.0, -0.0, -0.0, -0.75, 0.75],
[-0.0, -0.0, 0.0, 0.0, 0.75, -0.75],
[0.0, 0.0, -0.0, -0.0, -0.75, -0.75],
]
.map(|[a, b, c, d, e, f]| {
[
CV + a * HWV,
CV + b * HWV,
CV + c * HWV,
CV + d * HWV,
CV + e * HWV,
CV + f * HWV,
]
});
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * N * (N - 1));
}
{
let vv = Generator::new([0.75f64, 0.0, 0.0, 0.0, 0.0, 0.0]);
let should_be = [
[0.75, 0.0, 0.0, 0.0, 0.0, 0.0],
[-0.75, 0.0, 0.0, 0.0, 0.0, 0.0],
[-0.0, 0.75, -0.0, -0.0, -0.0, -0.0],
[0.0, -0.75, -0.0, -0.0, -0.0, -0.0],
[0.0, -0.0, 0.75, 0.0, 0.0, 0.0],
[-0.0, 0.0, -0.75, 0.0, 0.0, 0.0],
[-0.0, -0.0, 0.0, 0.75, -0.0, -0.0],
[0.0, 0.0, -0.0, -0.75, -0.0, -0.0],
[0.0, 0.0, -0.0, -0.0, 0.75, 0.0],
[-0.0, -0.0, 0.0, 0.0, -0.75, 0.0],
[-0.0, -0.0, -0.0, 0.0, 0.0, 0.75],
[0.0, 0.0, 0.0, -0.0, -0.0, -0.75],
]
.map(|[a, b, c, d, e, f]| {
[
CV + a * HWV,
CV + b * HWV,
CV + c * HWV,
CV + d * HWV,
CV + e * HWV,
CV + f * HWV,
]
});
let mut count = 0;
for (a, b) in vv.point_permutations(¢re, &half_widths).zip(should_be) {
count += 1;
assert!((a[0] - b[0]).abs() < f64::EPSILON);
assert!((a[1] - b[1]).abs() < f64::EPSILON);
assert!((a[2] - b[2]).abs() < f64::EPSILON);
assert!((a[3] - b[3]).abs() < f64::EPSILON);
assert!((a[4] - b[4]).abs() < f64::EPSILON);
assert!((a[5] - b[5]).abs() < f64::EPSILON);
}
assert_eq!(count, 2 * N);
}
}
}