flow_gate_core/transform/
logicle.rs1#[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}