Struct demes::GraphBuilder

source ·
pub struct GraphBuilder { /* private fields */ }
Expand description

This type allows building a Graph using code rather then using text input.

§Notes

  • A “builder” in rust will never be as convenient as one in, say, Python or Juilia. The lack of a rust REPL and the strong type checking are the primary reasons.
  • All error checks are delayed until resolution.

Implementations§

source§

impl GraphBuilder

source

pub fn new( time_units: TimeUnits, generation_time: Option<InputGenerationTime>, defaults: Option<GraphDefaults> ) -> Self

Constructor

§Returns

This function returns an “builder” containing an unresolved Graph.

source

pub fn new_generations(defaults: Option<GraphDefaults>) -> Self

Construct a builder with time units in generations.

This function works by calling GraphBuilder::new.

source

pub fn add_deme<I: IntoIterator<Item = UnresolvedEpoch>>( &mut self, name: &str, epochs: I, history: UnresolvedDemeHistory, description: Option<&str> )

Add a Deme to the graph.

§Examples
let start_size = demes::InputDemeSize::from(100.);
let epoch = demes::UnresolvedEpoch{start_size: Some(start_size), ..Default::default()};
let history = demes::UnresolvedDemeHistory::default();
let mut b = demes::GraphBuilder::new_generations(None);
b.add_deme("A", vec![epoch], history, Some("this is deme A"));
b.resolve().unwrap();
§Notes
source

pub fn add_migration(&mut self, migration: UnresolvedMigration)

Add a migration to the graph.

§Examples
§Adding an asymmetric migration

See UnresolvedMigration.

let start_size = demes::InputDemeSize::from(100.);
let epoch = demes::UnresolvedEpoch{start_size: Some(start_size), ..Default::default()};
let history = demes::UnresolvedDemeHistory::default();
let mut b = demes::GraphBuilder::new_generations(None);
b.add_deme("A", vec![epoch], history.clone(), Some("this is deme A"));
b.add_deme("B", vec![epoch], history, Some("this is deme B"));
let migration = demes::UnresolvedMigration::default().set_source("A").set_dest("B").set_rate(1e-4);
b.add_migration(migration);
b.resolve().unwrap();
§Adding a symmetric migration

See UnresolvedMigration.

let start_size = demes::InputDemeSize::from(100.);
let epoch = demes::UnresolvedEpoch{start_size: Some(start_size), ..Default::default()};
let history = demes::UnresolvedDemeHistory::default();
let mut b = demes::GraphBuilder::new_generations(None);
b.add_deme("A", vec![epoch], history.clone(), Some("this is deme A"));
b.add_deme("B", vec![epoch], history, Some("this is deme B"));
let migration = demes::UnresolvedMigration::default().set_demes(["A","B"].as_slice()).set_rate(1e-4);
b.add_migration(migration);
b.resolve().unwrap();

We can also use a Vec instead of an array:

let migration = demes::UnresolvedMigration::default().set_demes(vec!["A","B"]).set_rate(1e-4);
b.add_migration(migration);
source

pub fn add_pulse<T: Into<InputTime>, P: Into<InputProportion>, I: IntoIterator<Item = P>>( &mut self, sources: Option<&[&str]>, dest: Option<&str>, time: Option<T>, proportions: Option<I> )

Add an UnresolvedPulse to the graph.

§Examples
let start_size = demes::InputDemeSize::from(100.);
let epoch = demes::UnresolvedEpoch{start_size: Some(start_size), ..Default::default()};
let history = demes::UnresolvedDemeHistory::default();
let mut b = demes::GraphBuilder::new_generations(None);
b.add_deme("A", vec![epoch], history.clone(), Some("this is deme A"));
b.add_deme("B", vec![epoch], history, Some("this is deme B"));
b.add_pulse(Some(&["A"]),
            Some("B"),
            Some(50.0),
            Some([0.5].as_slice()));
b.resolve().unwrap();
source

pub fn resolve(self) -> Result<Graph, DemesError>

Generate and return a resolved Graph.

§Errors

Returns `DemesError’ if any of the data are invalid.

source

pub fn set_toplevel_metadata<T: Serialize>( &mut self, metadata: &T ) -> Result<(), BuilderError>

Set top-level metadata

§Parameters
  • metadata: the metadata type
§Note

Repeated calls will overwrite existing metadata.

§Errors
§Example
#[derive(serde::Serialize, serde::Deserialize)]
struct MyMetaData {
   foo: i32,
   bar: String
}
builder.set_toplevel_metadata(&MyMetaData{foo: 3, bar: "string".to_owned()}).unwrap();

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.