use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
use gmatlib::col_vec;
use crate::Matrix;
use crate::modelling::element::GenericElement;
#[derive(Clone, Debug)]
pub struct GenericNode
{
pub (in crate) potential: Matrix<f64>,
pub (in crate) inputs: Vec<Rc<GenericElement>>,
pub (in crate) outputs: Vec<Rc<GenericElement>>,
pub (in crate) is_locked: bool,
pub (in crate) _metadata: Option<HashMap<String, f64>>,
}
impl GenericNode
{
pub fn new() -> Rc<RefCell<GenericNode>>
{
Rc::new(RefCell::new(GenericNode
{
potential: col_vec![1f64],
inputs: vec![],
outputs: vec![],
is_locked: false,
_metadata: None,
}))
}
pub fn get_flux_discrepancy(&self) -> anyhow::Result<Matrix<f64>>
{
let mut inputs = Matrix::new(
self.potential.get_rows(),
self.potential.get_cols(),
);
let mut outputs = inputs.clone();
for elem in &self.inputs
{
inputs += elem.get_flux()?;
}
for elem in &self.outputs
{
outputs += elem.get_flux()?;
}
let discrepancy = inputs - outputs;
Ok(discrepancy)
}
}