use anchor_lang::prelude::*;
use crate::errors::LucieneError;
use crate::models::linear;
use crate::ModelInference;
pub fn run_inference(ctx: Context<ModelInference>) -> Result<()> {
let model_params = &ctx.accounts.model_params;
let model_results = &mut ctx.accounts.model_results;
let model_features = &mut ctx.accounts.model_features;
if !model_params.is_active {
return Err(LucieneError::ModelInactive.into());
}
let raw_features = model_features.computed_features;
let (prediction, confidence) = linear::LinearRegression::classify(
&model_params.weights,
model_params.bias,
&raw_features
);
let price_at_pred = model_results.price_at_prediction.clone();
model_results.update_prediction(
prediction,
price_at_pred,
);
let direction = if prediction == 1 { "UP" } else { "DOWN" };
msg!("ML Prediction: {} (confidence: {:.3}) at price {:.6}",
direction, confidence, model_results.price_at_prediction);
Ok(())
}