use super::point_group::{iter_trans_mat_basis, iter_unimodular_trans_mat};
use super::rotation_type::identify_rotation_type;
use super::space_group::match_origin_shift;
use crate::base::{Operations, UnimodularTransformation, project_rotations};
pub fn integral_normalizer(
prim_operations: &Operations,
prim_generators: &Operations,
epsilon: f64,
) -> Vec<UnimodularTransformation> {
let prim_rotations = project_rotations(prim_operations);
let prim_rotation_generators = project_rotations(prim_generators);
let rotation_types = prim_rotations
.iter()
.map(identify_rotation_type)
.collect::<Vec<_>>();
let mut conjugators = vec![];
for trans_mat_basis in
iter_trans_mat_basis(prim_rotations, rotation_types, prim_rotation_generators)
{
for prim_trans_mat in iter_unimodular_trans_mat(trans_mat_basis) {
if let Some(origin_shift) =
match_origin_shift(prim_operations, &prim_trans_mat, prim_generators, epsilon)
{
conjugators.push(UnimodularTransformation::new(prim_trans_mat, origin_shift));
break;
}
}
}
conjugators
}