use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize)]
pub struct NeuralBinaryNetwork {
pub w_h1: Vec<Vec<f32>>,
pub b_h1: Vec<f32>,
pub w_h2: Vec<Vec<f32>>,
pub b_h2: Vec<f32>,
pub w_out: Vec<Vec<f32>>,
pub b_out: Vec<f32>,
pub learning_rate: f32,
pub dropout_rate: f32,
}
impl NeuralBinaryNetwork {
pub fn forward_eval(&self, embedding: &[f32]) -> f32 {
let mut h1 = vec![0.0; 256];
for (i, h1_val) in h1.iter_mut().enumerate() {
*h1_val = self.b_h1[i];
for (j, emb_val) in embedding.iter().enumerate().take(384) {
*h1_val += self.w_h1[i][j] * emb_val;
}
*h1_val = h1_val.max(0.0); }
let mut h2 = vec![0.0; 128];
for (i, h2_val) in h2.iter_mut().enumerate() {
*h2_val = self.b_h2[i];
for (j, h1_val) in h1.iter().enumerate() {
*h2_val += self.w_h2[i][j] * h1_val;
}
*h2_val = h2_val.max(0.0); }
let mut logit = self.b_out[0];
for (j, h2_val) in h2.iter().enumerate() {
logit += self.w_out[0][j] * h2_val;
}
sigmoid(logit)
}
}
fn sigmoid(x: f32) -> f32 {
1.0 / (1.0 + (-x).exp())
}