use crate::interbar_types::TradeSnapshot;
pub fn accumulate_buy_sell_branchless(trades: &[&TradeSnapshot]) -> (f64, f64) {
let n = trades.len();
let mut buy_vol = 0.0;
let mut sell_vol = 0.0;
let pairs = n / 2;
for i in 0..pairs {
let t1 = &trades[i * 2];
let t2 = &trades[i * 2 + 1];
let vol1 = t1.volume.to_f64();
let vol2 = t2.volume.to_f64();
let is_buyer_mask1 = t1.is_buyer_maker as u32 as f64;
let is_buyer_mask2 = t2.is_buyer_maker as u32 as f64;
sell_vol += vol1 * is_buyer_mask1;
buy_vol += vol1 * (1.0 - is_buyer_mask1);
sell_vol += vol2 * is_buyer_mask2;
buy_vol += vol2 * (1.0 - is_buyer_mask2);
}
if n % 2 == 1 {
let t = &trades[n - 1];
let vol = t.volume.to_f64();
let is_buyer_mask = t.is_buyer_maker as u32 as f64;
sell_vol += vol * is_buyer_mask;
buy_vol += vol * (1.0 - is_buyer_mask);
}
(buy_vol, sell_vol)
}
#[inline]
pub fn compute_ofi_branchless(trades: &[&TradeSnapshot]) -> f64 {
let (buy_vol, sell_vol) = accumulate_buy_sell_branchless(trades);
let total_vol = buy_vol + sell_vol;
if total_vol > f64::EPSILON {
(buy_vol - sell_vol) / total_vol
} else {
0.0
}
}