demes 0.7.0

rust implementation of demes specification
Documentation
use demes::GraphBuilder;
use demes::GraphDefaults;
use demes::InputDemeSize;
use demes::InputGenerationTime;
use demes::InputProportion;
use demes::InputTime;
use demes::TimeUnits;
use demes::TopLevelDemeDefaults;
use demes::UnresolvedDemeHistory;
use demes::UnresolvedEpoch;
use demes::UnresolvedMigration;
use demes::UnresolvedPulse;

#[test]
fn builder_toplevel_pulse_defaults() {
    let yaml = "
time_units: years
generation_time: 25
defaults:
  pulse: {sources: [A], dest: B, proportions: [0.25], time: 100}
demes:
  - name: A
    epochs: 
     - start_size: 100
  - name: B
    epochs:
     - start_size: 250 
";
    let graph_from_yaml = demes::loads(yaml).unwrap();

    let toplevel_defaults = GraphDefaults {
        pulse: UnresolvedPulse {
            sources: Some(vec!["A".to_string()]),
            dest: Some("B".to_string()),
            proportions: Some(vec![InputProportion::from(0.25)]),
            time: Some(InputTime::from(100.)),
        },
        ..Default::default()
    };

    let epochs_a = UnresolvedEpoch {
        start_size: Some(InputDemeSize::from(100.0)),
        ..Default::default()
    };
    let epochs_b = UnresolvedEpoch {
        start_size: Some(InputDemeSize::from(250.0)),
        ..Default::default()
    };

    let mut builder = GraphBuilder::new(
        TimeUnits::Years,
        Some(InputGenerationTime::from(25.0)),
        Some(toplevel_defaults),
    );
    builder.add_deme("A", vec![epochs_a], UnresolvedDemeHistory::default(), None);
    builder.add_deme("B", vec![epochs_b], UnresolvedDemeHistory::default(), None);
    let graph_from_builder = builder.resolve().unwrap();
    assert_eq!(graph_from_yaml, graph_from_builder);
}

#[test]
fn builder_toplevel_epoch_defaults() {
    let _ = GraphDefaults {
        epoch: UnresolvedEpoch {
            end_time: Some(InputTime::from(100.0)),
            ..Default::default()
        },
        ..Default::default()
    };
}

#[test]
fn builder_toplevel_migration_defaults() {
    let _ = GraphDefaults {
        migration: UnresolvedMigration {
            source: Some("A".to_string()),
            ..Default::default()
        },
        ..Default::default()
    };
}

#[test]
fn builder_toplevel_deme_defaults() {
    {
        let _ = GraphDefaults {
            deme: TopLevelDemeDefaults {
                description: Some("bananas".to_string()),
                ..Default::default()
            },
            ..Default::default()
        };
    }

    {
        let _ = GraphDefaults {
            deme: TopLevelDemeDefaults {
                start_time: Some(InputTime::from(100.0)),
                ..Default::default()
            },
            ..Default::default()
        };
    }

    {
        let _ = GraphDefaults {
            deme: TopLevelDemeDefaults {
                ancestors: Some(vec!["A".to_string()]),
                ..Default::default()
            },
            ..Default::default()
        };
    }

    {
        let _ = GraphDefaults {
            deme: TopLevelDemeDefaults {
                proportions: Some(vec![InputProportion::from(1.0)]),
                ..Default::default()
            },
            ..Default::default()
        };
    }
}

#[test]
fn test_metadata_round_trip_through_builder() {
    #[derive(serde::Serialize, Debug, serde::Deserialize, Eq, PartialEq)]
    struct MyMetaData {
        foo: i32,
        bar: String,
    }
    let edata = demes::UnresolvedEpoch {
        start_size: Some(demes::InputDemeSize::from(100.0)),
        ..Default::default()
    };
    let mut builder = demes::GraphBuilder::new_generations(None);
    builder.add_deme(
        "CEU",
        vec![edata],
        demes::UnresolvedDemeHistory::default(),
        None,
    );
    let md = MyMetaData {
        foo: 3,
        bar: "string".to_owned(),
    };
    builder.set_toplevel_metadata(&md).unwrap();
    let graph = builder.resolve().unwrap();
    let metadata = graph.metadata().unwrap();
    let x: MyMetaData = serde_yaml::from_str(&metadata.as_yaml_string().unwrap()).unwrap();
    assert_eq!(x, md);
}