commit
fd3b1ecfea
@ -0,0 +1,118 @@ |
|||||||
|
use std::collections::BTreeSet; |
||||||
|
|
||||||
|
use crate::{ |
||||||
|
params::{Params, StateType}, |
||||||
|
process, |
||||||
|
}; |
||||||
|
|
||||||
|
use super::NetworkProcess; |
||||||
|
|
||||||
|
pub struct CtmpProcess { |
||||||
|
param: Option<Params>, |
||||||
|
} |
||||||
|
|
||||||
|
impl CtmpProcess { |
||||||
|
pub fn new() -> CtmpProcess { |
||||||
|
CtmpProcess { param: None } |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl NetworkProcess for CtmpProcess { |
||||||
|
fn initialize_adj_matrix(&mut self) { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
|
||||||
|
fn add_node(&mut self, n: crate::params::Params) -> Result<usize, process::NetworkError> { |
||||||
|
match self.param { |
||||||
|
None => { |
||||||
|
self.param = Some(n); |
||||||
|
Ok(0) |
||||||
|
} |
||||||
|
Some(_) => Err(process::NetworkError::NodeInsertionError( |
||||||
|
"CtmpProcess has only one node".to_string(), |
||||||
|
)), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn add_edge(&mut self, _parent: usize, _child: usize) { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
|
||||||
|
fn get_node_indices(&self) -> std::ops::Range<usize> { |
||||||
|
match self.param { |
||||||
|
None => 0..0, |
||||||
|
Some(_) => 0..1, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn get_number_of_nodes(&self) -> usize { |
||||||
|
match self.param { |
||||||
|
None => 0, |
||||||
|
Some(_) => 1, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn get_node(&self, node_idx: usize) -> &crate::params::Params { |
||||||
|
if node_idx == 0 { |
||||||
|
self.param.as_ref().unwrap() |
||||||
|
} else { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn get_node_mut(&mut self, node_idx: usize) -> &mut crate::params::Params { |
||||||
|
if node_idx == 0 { |
||||||
|
self.param.as_mut().unwrap() |
||||||
|
} else { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn get_param_index_network( |
||||||
|
&self, |
||||||
|
node: usize, |
||||||
|
current_state: &Vec<crate::params::StateType>, |
||||||
|
) -> usize { |
||||||
|
if node == 0 { |
||||||
|
match current_state[0] { |
||||||
|
StateType::Discrete(x) => x, |
||||||
|
} |
||||||
|
} else { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn get_param_index_from_custom_parent_set( |
||||||
|
&self, |
||||||
|
_current_state: &Vec<crate::params::StateType>, |
||||||
|
_parent_set: &std::collections::BTreeSet<usize>, |
||||||
|
) -> usize { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
|
||||||
|
fn get_parent_set(&self, node: usize) -> std::collections::BTreeSet<usize> { |
||||||
|
match self.param { |
||||||
|
Some(_) => { |
||||||
|
if node == 0 { |
||||||
|
BTreeSet::new() |
||||||
|
} else { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
} |
||||||
|
None => panic!("Uninitialized CtmpProcess"), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn get_children_set(&self, node: usize) -> std::collections::BTreeSet<usize> { |
||||||
|
match self.param { |
||||||
|
Some(_) => { |
||||||
|
if node == 0 { |
||||||
|
BTreeSet::new() |
||||||
|
} else { |
||||||
|
unimplemented!("CtmpProcess has only one node") |
||||||
|
} |
||||||
|
} |
||||||
|
None => panic!("Uninitialized CtmpProcess"), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,127 @@ |
|||||||
|
mod utils; |
||||||
|
|
||||||
|
use std::collections::BTreeSet; |
||||||
|
|
||||||
|
use reCTBN::{ |
||||||
|
params, |
||||||
|
params::ParamsTrait, |
||||||
|
process::{ctmp::*, NetworkProcess}, |
||||||
|
}; |
||||||
|
use utils::generate_discrete_time_continous_node; |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn define_simple_ctmp() { |
||||||
|
let _ = CtmpProcess::new(); |
||||||
|
assert!(true); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn add_node_to_ctmp() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)) |
||||||
|
.unwrap(); |
||||||
|
assert_eq!(&String::from("n1"), net.get_node(n1).get_label()); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn add_two_nodes_to_ctmp() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let _n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)) |
||||||
|
.unwrap(); |
||||||
|
let n2 = net.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)); |
||||||
|
|
||||||
|
match n2 { |
||||||
|
Ok(_) => assert!(false), |
||||||
|
Err(_) => assert!(true), |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
#[should_panic] |
||||||
|
fn add_edge_to_ctmp() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let _n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)) |
||||||
|
.unwrap(); |
||||||
|
let _n2 = net.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)); |
||||||
|
|
||||||
|
net.add_edge(0, 1) |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn childen_and_parents() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let _n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
assert_eq!(0, net.get_parent_set(0).len()); |
||||||
|
assert_eq!(0, net.get_children_set(0).len()); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
#[should_panic] |
||||||
|
fn get_childen_panic() { |
||||||
|
let net = CtmpProcess::new(); |
||||||
|
net.get_children_set(0); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
#[should_panic] |
||||||
|
fn get_childen_panic2() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let _n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)) |
||||||
|
.unwrap(); |
||||||
|
net.get_children_set(1); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
#[should_panic] |
||||||
|
fn get_parent_panic() { |
||||||
|
let net = CtmpProcess::new(); |
||||||
|
net.get_parent_set(0); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
#[should_panic] |
||||||
|
fn get_parent_panic2() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let _n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node(String::from("n1"), 2)) |
||||||
|
.unwrap(); |
||||||
|
net.get_parent_set(1); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn compute_index_ctmp() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node( |
||||||
|
String::from("n1"), |
||||||
|
10, |
||||||
|
)) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
let idx = net.get_param_index_network(n1, &vec![params::StateType::Discrete(6)]); |
||||||
|
assert_eq!(6, idx); |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
#[should_panic] |
||||||
|
fn compute_index_from_custom_parent_set_ctmp() { |
||||||
|
let mut net = CtmpProcess::new(); |
||||||
|
let _n1 = net |
||||||
|
.add_node(generate_discrete_time_continous_node( |
||||||
|
String::from("n1"), |
||||||
|
10, |
||||||
|
)) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
let _idx = net.get_param_index_from_custom_parent_set( |
||||||
|
&vec![params::StateType::Discrete(6)], |
||||||
|
&BTreeSet::from([0]) |
||||||
|
); |
||||||
|
} |
Loading…
Reference in new issue