Skip to main content

flow_gate_core/transform/
logicle.rs

1#[path = "logicle_impl.rs"]
2mod logicle_impl;
3pub use logicle_impl::{
4    apply_transform_logicle, logicle_forward, logicle_inverse, LogicleLut, LogicleParams,
5};
6
7use crate::traits::Transform;
8
9#[derive(Debug, Clone, Copy, PartialEq)]
10pub struct LogicleTransform {
11    pub params: LogicleParams,
12}
13
14impl Transform for LogicleTransform {
15    fn apply(&self, value: f64) -> f64 {
16        logicle_forward(value, self.params)
17    }
18
19    fn invert(&self, scaled: f64) -> f64 {
20        logicle_inverse(scaled, self.params)
21    }
22
23    fn apply_batch(&self, values: &[f64], out: &mut [f64]) {
24        debug_assert_eq!(values.len(), out.len());
25        if values.len() < 1024 {
26            for (&value, dst) in values.iter().zip(out.iter_mut()) {
27                *dst = self.apply(value);
28            }
29            return;
30        }
31
32        let input_f32: Vec<f32> = values.iter().map(|&v| v as f32).collect();
33        let mut output_f32 = vec![0.0_f32; values.len()];
34        apply_transform_logicle(&input_f32, self.params, &mut output_f32);
35        for (dst, src) in out.iter_mut().zip(output_f32.iter()) {
36            *dst = *src as f64;
37        }
38    }
39
40    fn transform_id(&self) -> &str {
41        "logicle"
42    }
43}