High-level description
This file contains unit tests for theIIDExponentialMLE class, which is a branch length estimator in the Cassiopeia package. The tests cover various scenarios, including degenerate cases (no mutations or saturation), hand-solvable problems, regression tests, and simulations.
Code Structure
The code consists of a single classTestIIDExponentialMLE which inherits from unittest.TestCase. This class contains multiple test methods, each testing a specific aspect of the IIDExponentialMLE class. The test methods are decorated with parameterized.expand to run the same test with different solvers (“ECOS” and “SCS”).
References
The tests reference the following classes:cassiopeia.data.CassiopeiaTree: Represents a phylogenetic tree with character states.cassiopeia.simulator.Cas9LineageTracingDataSimulator: Simulates Cas9-based lineage tracing data.cassiopeia.tools.IIDExponentialMLE: The branch length estimator being tested.
Symbols
TestIIDExponentialMLE
Description
This class contains unit tests for theIIDExponentialMLE class.
Inputs
NoneOutputs
NoneInternal Logic
The class defines several test methods, each testing a specific aspect of theIIDExponentialMLE class. The test methods use assertions to verify the expected behavior of the estimator.
Side Effects
The tests modify theCassiopeiaTree objects passed to the IIDExponentialMLE estimator.
Performance Considerations
Nonetest_no_mutations
Description
Tests the behavior of the estimator when there are no mutations in the character matrix.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a simple tree with two nodes and no mutations.
- Initializes an
IIDExponentialMLEobject. - Asserts that a
ValueErroris raised when callingestimate_branch_lengths.
test_saturation
Description
Tests the behavior of the estimator when the character matrix is saturated (all characters are mutated).Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a simple tree with two nodes and a single mutated character.
- Initializes an
IIDExponentialMLEobject. - Asserts that a
ValueErroris raised when callingestimate_branch_lengths.
test_hand_solvable_problem_1, test_hand_solvable_problem_2, test_hand_solvable_problem_3
Description
These tests verify the estimator’s results against hand-solvable problems with simple tree topologies and a small number of characters.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a simple tree with two nodes and a specified character matrix.
- Initializes an
IIDExponentialMLEobject. - Calls
estimate_branch_lengthsand asserts that the estimated branch lengths, mutation rate, and log-likelihood match the expected values calculated by hand.
test_small_tree_with_one_mutation
Description
Tests the estimator on a small perfect binary tree with a single mutation.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a perfect binary tree with one mutation at a specific node.
- Initializes an
IIDExponentialMLEobject. - Calls
estimate_branch_lengthsand asserts that the estimated branch lengths, mutation rate, and log-likelihood match the expected values calculated by hand.
test_small_tree_regression
Description
This is a regression test on a small perfect binary tree with a “normal” amount of mutations.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a perfect binary tree with a predefined character matrix.
- Initializes an
IIDExponentialMLEobject. - Calls
estimate_branch_lengthsand asserts that the estimated branch lengths, mutation rate, and log-likelihood match the expected values from a previous run.
test_on_simulated_data
Description
Tests the estimator on data simulated using theCas9LineageTracingDataSimulator.
Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a perfect binary tree and sets predefined node times.
- Simulates Cas9-based lineage tracing data using the
Cas9LineageTracingDataSimulator. - Initializes an
IIDExponentialMLEobject. - Calls
estimate_branch_lengthsand asserts that the estimated node times and mutation rate are close to the ground truth values used for simulation.
test_subtree_collapses_when_no_mutations
Description
Tests the behavior of the estimator when a subtree has no mutations, ensuring it collapses to 0 length.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a tree with a subtree containing no mutations.
- Initializes an
IIDExponentialMLEobject. - Calls
estimate_branch_lengthsand asserts that the branch lengths of the mutationless subtree are 0 and the remaining branch lengths, mutation rate, and log-likelihood match the expected values.
test_minimum_branch_length
Description
Tests the functionality of theminimum_branch_length parameter.
Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver | str | Solver to use (“ECOS” or “SCS”) |
Outputs
NoneInternal Logic
- Creates a perfect binary tree with a single mutation.
- Initializes an
IIDExponentialMLEobject with a specifiedminimum_branch_length. - Calls
estimate_branch_lengthsand asserts that the estimated branch lengths, mutation rate, and log-likelihood match the expected values, taking into account the minimum branch length constraint.
test_hand_solvable_problem_with_site_rates, test_larger_hand_solvable_problem_with_site_rates
Description
These tests verify the estimator’s results against hand-solvable problems with specified site-specific mutation rates.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| solver_rates | List[float] | Site-specific mutation rates used by the solver |
| math_rates | List[float] | Site-specific mutation rates used for hand calculations |
Outputs
NoneInternal Logic
- Creates a tree with a specified character matrix.
- Initializes an
IIDExponentialMLEobject with therelative_mutation_ratesparameter set tosolver_rates. - Calls
estimate_branch_lengthsand asserts that the estimated branch lengths, node times, and mutation rates match the expected values calculated by hand usingmath_rates.
test_invalid_site_rates
Description
Tests the behavior of the estimator when invalid site-specific mutation rates are provided.Inputs
| Name | Type | Description |
|---|---|---|
| name | str | Name of the test case |
| rates | List[float] | Invalid site-specific mutation rates |
Outputs
NoneInternal Logic
- Creates a tree with a specified character matrix.
- Initializes an
IIDExponentialMLEobject with therelative_mutation_ratesparameter set torates. - Asserts that a
ValueErroris raised when callingestimate_branch_lengths.
Dependencies
networkx: For working with graph structures.numpy: For numerical operations.parameterized: For parameterized testing.cvxpy: For convex optimization.
Error Handling
The tests check forValueError and IIDExponentialMLEError exceptions in various scenarios.
