commit
b3dd9133af
@ -0,0 +1,3 @@ |
||||
/target |
||||
Cargo.lock |
||||
.vscode |
@ -0,0 +1,4 @@ |
||||
[submodule "reCTBN"] |
||||
path = deps/reCTBN |
||||
url = ../reCTBN.git |
||||
branch = dev |
@ -0,0 +1,8 @@ |
||||
[package] |
||||
name = "exporter" |
||||
version = "0.1.0" |
||||
edition = "2021" |
||||
|
||||
[dependencies] |
||||
reCTBN = { path = "deps/reCTBN/reCTBN", package = "reCTBN", version="0.1.0" } |
||||
json = "0.12.*" |
@ -0,0 +1 @@ |
||||
Subproject commit 49c2c55f613996574e4f901cc53a3d06ebac6311 |
@ -0,0 +1,7 @@ |
||||
# This file defines the Rust toolchain to use when a command is executed. |
||||
# See also https://rust-lang.github.io/rustup/overrides.html |
||||
|
||||
[toolchain] |
||||
channel = "stable" |
||||
components = [ "clippy", "rustfmt" ] |
||||
profile = "minimal" |
@ -0,0 +1,39 @@ |
||||
# This file defines the Rust style for automatic reformatting. |
||||
# See also https://rust-lang.github.io/rustfmt |
||||
|
||||
# NOTE: the unstable options will be uncommented when stabilized. |
||||
|
||||
# Version of the formatting rules to use. |
||||
#version = "One" |
||||
|
||||
# Number of spaces per tab. |
||||
tab_spaces = 4 |
||||
|
||||
max_width = 100 |
||||
#comment_width = 80 |
||||
|
||||
# Prevent carriage returns, admitted only \n. |
||||
newline_style = "Unix" |
||||
|
||||
# The "Default" setting has a heuristic which can split lines too aggresively. |
||||
#use_small_heuristics = "Max" |
||||
|
||||
# How imports should be grouped into `use` statements. |
||||
#imports_granularity = "Module" |
||||
|
||||
# How consecutive imports are grouped together. |
||||
#group_imports = "StdExternalCrate" |
||||
|
||||
# Error if unable to get all lines within max_width, except for comments and |
||||
# string literals. |
||||
#error_on_line_overflow = true |
||||
|
||||
# Error if unable to get comments or string literals within max_width, or they |
||||
# are left with trailing whitespaces. |
||||
#error_on_unformatted = true |
||||
|
||||
# Files to ignore like third party code which is formatted upstream. |
||||
# Ignoring tests is a temporary measure due some issues regarding rank-3 tensors |
||||
ignore = [ |
||||
"tests/" |
||||
] |
@ -0,0 +1,96 @@ |
||||
use reCTBN; |
||||
|
||||
use json::*; |
||||
use reCTBN::params; |
||||
use reCTBN::params::Params::DiscreteStatesContinousTime; |
||||
use reCTBN::params::ParamsTrait; |
||||
use reCTBN::process::ctbn::CtbnNetwork; |
||||
use reCTBN::process::NetworkProcess; |
||||
use reCTBN::tools::trajectory_generator; |
||||
use reCTBN::tools::Dataset; |
||||
use reCTBN::tools::RandomGraphGenerator; |
||||
use reCTBN::tools::RandomParametersGenerator; |
||||
use reCTBN::tools::UniformGraphGenerator; |
||||
use reCTBN::tools::UniformParametersGenerator; |
||||
use std::collections::BTreeSet; |
||||
|
||||
fn uniform_parameters_generator_right_densities_ctmp() -> (CtbnNetwork, Dataset) { |
||||
let mut net = CtbnNetwork::new(); |
||||
let nodes_cardinality = 3; |
||||
let domain_cardinality = 2; |
||||
for node in 0..nodes_cardinality { |
||||
// Create the domain for a discrete node
|
||||
let mut domain = BTreeSet::new(); |
||||
for dvalue in 0..domain_cardinality { |
||||
domain.insert(dvalue.to_string()); |
||||
} |
||||
// Create the parameters for a discrete node using the domain
|
||||
let param = params::DiscreteStatesContinousTimeParams::new(node.to_string(), domain); |
||||
//Create the node using the parameters
|
||||
let node = DiscreteStatesContinousTime(param); |
||||
// Add the node to the network
|
||||
net.add_node(node).unwrap(); |
||||
} |
||||
|
||||
// Initialize the Graph Generator using the one with an
|
||||
// uniform distribution
|
||||
let mut structure_generator = UniformGraphGenerator::new(1.0 / 3.0, Some(7641630759785120)); |
||||
|
||||
// Generate the graph directly on the network
|
||||
structure_generator.generate_graph(&mut net); |
||||
|
||||
// Initialize the parameters generator with uniform distributin
|
||||
let mut cim_generator = UniformParametersGenerator::new(3.0..7.0, Some(7641630759785120)); |
||||
|
||||
// Generate CIMs with uniformly distributed parameters.
|
||||
cim_generator.generate_parameters(&mut net); |
||||
|
||||
let dataset = trajectory_generator(&net, 3, 20.0, Some(30230423)); |
||||
|
||||
return (net, dataset); |
||||
} |
||||
|
||||
fn main() { |
||||
println!("Hello, world!"); |
||||
let mut data = json::JsonValue::new_array(); |
||||
data.push(json::JsonValue::new_object()).unwrap(); |
||||
data[0]["dyn.str"] = json::JsonValue::new_array(); |
||||
data[0]["variables"] = json::JsonValue::new_array(); |
||||
data[0]["dyn.cims"] = object! {}; |
||||
data[0]["samples"] = json::JsonValue::new_array(); |
||||
let (net, dataset) = uniform_parameters_generator_right_densities_ctmp(); |
||||
|
||||
for node_idx in net.get_node_indices() { |
||||
let mut variable = json::JsonValue::new_object(); |
||||
variable["Name"] = json::JsonValue::String(net.get_node(node_idx).get_label().to_string()); |
||||
variable["Value"] = |
||||
json::JsonValue::Number(net.get_node(node_idx).get_reserved_space_as_parent().into()); |
||||
data[0]["variables"].push(variable).unwrap(); |
||||
for parent_idx in net.get_parent_set(node_idx) { |
||||
let mut edge = json::JsonValue::new_object(); |
||||
edge["From"] = |
||||
json::JsonValue::String(net.get_node(parent_idx).get_label().to_string()); |
||||
edge["To"] = json::JsonValue::String(net.get_node(node_idx).get_label().to_string()); |
||||
data[0]["dyn.str"].push(edge).unwrap(); |
||||
} |
||||
} |
||||
let nodes: Vec<String> = net |
||||
.get_node_indices() |
||||
.into_iter() |
||||
.map(|x| net.get_node(x).get_label().to_string()) |
||||
.collect(); |
||||
for sample in dataset.get_trajectories() { |
||||
let mut trajectory = json::JsonValue::new_array(); |
||||
for event_idx in 0..sample.get_time().shape()[0] { |
||||
let mut event = json::JsonValue::new_object(); |
||||
event["Time"] = json::JsonValue::Number(sample.get_time()[event_idx].into()); |
||||
for (node_idx, node_label) in nodes.iter().enumerate() { |
||||
event[node_label] = |
||||
json::JsonValue::Number(sample.get_events()[[event_idx, node_idx]].into()); |
||||
} |
||||
trajectory.push(event).unwrap(); |
||||
} |
||||
data[0]["samples"].push(trajectory).unwrap(); |
||||
} |
||||
println!("{}", data.dump()); |
||||
} |
Loading…
Reference in new issue