Skip to content
2 changes: 2 additions & 0 deletions docs/source/_toc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ subtrees:
title: The animal_cohorts submodule
- file: api/models/animal/animal_model
title: The animal_model submodule
- file: api/models/animal/model_config
title: The model_config submodule
- file: api/models/animal/animal_traits
title: The animal_traits submodule
- file: api/models/animal/constants
Expand Down
34 changes: 34 additions & 0 deletions docs/source/api/models/animal/model_config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
jupytext:
cell_metadata_filter: -all
formats: md:myst
main_language: python
text_representation:
extension: .md
format_name: myst
format_version: 0.13
jupytext_version: 1.18.1
kernelspec:
display_name: Python 3 (ipykernel)
language: python
name: python3
language_info:
codemirror_mode:
name: ipython
version: 3
file_extension: .py
mimetype: text/x-python
name: python
nbconvert_exporter: python
pygments_lexer: ipython3
version: 3.11.9
---

# API documentation for the {mod}`~virtual_ecosystem.models.animal.model_config` module

```{eval-rst}
.. automodule:: virtual_ecosystem.models.animal.model_config
:autosummary:
:members:
:exclude-members: model_config
```
5 changes: 5 additions & 0 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,11 @@ class MyReferenceStyle(AuthorYearReferenceStyle):
# when both do actually appear in the API docs? It's right there.
("py:class", "DIRPATH_PLACEHOLDER"),
("py:class", "PyrealmConst"),
# Typing on animal.model_config
("py:class", "virtual_ecosystem.models.animal.animal_traits.Annotated"),
("py:class", "virtual_ecosystem.models.animal.model_config.serialise_diet_type"),
("py:class", "virtual_ecosystem.models.animal.model_config.deserialise_diet_type"),
("py:class", "always"),
]

intersphinx_mapping = {
Expand Down
15 changes: 3 additions & 12 deletions docs/source/using_the_ve/virtual_ecosystem_in_static_mode.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
---
execution:
timeout: 210
jupytext:
formats: md:myst
main_language: python
Expand All @@ -13,16 +11,9 @@ kernelspec:
display_name: Python 3 (ipykernel)
language: python
name: python3
language_info:
codemirror_mode:
name: ipython
version: 3
file_extension: .py
mimetype: text/x-python
name: python
nbconvert_exporter: python
pygments_lexer: ipython3
version: 3.11.14
mystnb:
execution_timeout: 60
execution_mode: 'off'
---

# Running the Virtual Ecosystem in Static Mode
Expand Down
10 changes: 6 additions & 4 deletions tests/models/animals/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,9 +388,9 @@ def animal_data_for_cohorts_instance(fixture_core_components):
@pytest.fixture
def constants_instance():
"""Fixture for an instance of animal constants."""
from virtual_ecosystem.models.animal.constants import AnimalConsts
from virtual_ecosystem.models.animal.model_config import AnimalConstants

return AnimalConsts(density_scaling_method="madingley")
return AnimalConstants(density_scaling_method="madingley")


@pytest.fixture
Expand Down Expand Up @@ -425,14 +425,15 @@ def animal_model_instance(
from copy import deepcopy

from virtual_ecosystem.models.animal.animal_model import AnimalModel
from virtual_ecosystem.models.animal.model_config import AnimalConstants

# Make sure each call gets a fresh copy
clean_data = deepcopy(dummy_animal_data)

return AnimalModel(
data=clean_data,
core_components=fixture_core_components,
density_scaling_method="madingley",
model_constants=AnimalConstants(density_scaling_method="madingley"),
functional_groups=functional_group_list_instance,
microbial_c_n_p_ratios=microbial_c_n_p_ratios,
)
Expand All @@ -449,14 +450,15 @@ def animal_model_damuth_instance(
from copy import deepcopy

from virtual_ecosystem.models.animal.animal_model import AnimalModel
from virtual_ecosystem.models.animal.model_config import AnimalConstants

# Make sure each call gets a fresh copy
clean_data = deepcopy(dummy_animal_data)

return AnimalModel(
data=clean_data,
core_components=fixture_core_components,
density_scaling_method="damuth",
model_constants=AnimalConstants(density_scaling_method="damuth"),
functional_groups=functional_group_list_instance,
microbial_c_n_p_ratios=microbial_c_n_p_ratios,
)
Expand Down
4 changes: 2 additions & 2 deletions tests/models/animals/test_animal_cohorts.py
Original file line number Diff line number Diff line change
Expand Up @@ -990,7 +990,7 @@ def test_calculate_alpha(
"""Testing for calculate alpha."""
# Assuming necessary imports and setup based on previous examples
from virtual_ecosystem.models.animal.animal_cohorts import AnimalCohort
from virtual_ecosystem.models.animal.constants import AnimalConsts
from virtual_ecosystem.models.animal.model_config import AnimalConstants

# Mock the scaling function to control its return value
mocker.patch(
Expand All @@ -999,7 +999,7 @@ def test_calculate_alpha(
)

# Setup constants and functional group mock
constants = AnimalConsts()
constants = AnimalConstants()
functional_group_mock = herbivore_functional_group_instance

# Initialize the AnimalCohort instance with test parameters
Expand Down
22 changes: 9 additions & 13 deletions tests/models/animals/test_animal_constants.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
"""Test module for animal_traits.py."""

import pytest
from pydantic import ValidationError

from virtual_ecosystem.models.animal.animal_traits import DietType, TaxaType
from virtual_ecosystem.models.animal.constants import AnimalConsts
from virtual_ecosystem.models.animal.model_config import AnimalConstants


class TestAnimalConsts:
"""Tests for the AnimalConsts dataclass methods."""
class TestAnimalConstants:
"""Tests for the AnimalConstants dataclass methods."""

def test_get_population_density_terms_damuth(self):
"""Test Damuth method returns correct terms."""

# Create instance with damuth method
animal_consts = AnimalConsts(density_scaling_method="damuth")
animal_consts = AnimalConstants(density_scaling_method="damuth")

# Get terms for Mammal Herbivore
result = animal_consts.get_population_density_terms(
Expand All @@ -30,7 +31,7 @@ def test_get_population_density_terms_madingley(self):
"""Test Madingley method returns correct terms."""

# Create instance with madingley method
animal_consts = AnimalConsts(density_scaling_method="madingley")
animal_consts = AnimalConstants(density_scaling_method="madingley")

# Get terms (taxa/diet ignored in madingley)
result = animal_consts.get_population_density_terms(
Expand All @@ -43,11 +44,6 @@ def test_get_population_density_terms_madingley(self):
def test_get_population_density_terms_invalid_method(self):
"""Test invalid scaling method raises ValueError."""

# Create instance with invalid method
animal_consts = AnimalConsts(density_scaling_method="invalid_method")

# Ensure ValueError is raised
with pytest.raises(ValueError):
animal_consts.get_population_density_terms(
TaxaType.MAMMAL, DietType.HERBIVORE
)
# Ensure ValidationError is raised
with pytest.raises(ValidationError):
AnimalConstants(density_scaling_method="invalid_method")
23 changes: 11 additions & 12 deletions tests/models/animals/test_animal_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,14 @@ def test_animal_model_initialization(
"""Test `AnimalModel` initialization with both scaling methods."""
from virtual_ecosystem.core.base_model import BaseModel
from virtual_ecosystem.models.animal.animal_model import AnimalModel
from virtual_ecosystem.models.animal.model_config import AnimalConstants

# Initialize the model
model = AnimalModel(
data=dummy_animal_data,
core_components=fixture_core_components,
functional_groups=functional_group_list_instance,
density_scaling_method=scaling_method,
model_constants=AnimalConstants(density_scaling_method=scaling_method),
microbial_c_n_p_ratios=microbial_c_n_p_ratios,
)

Expand All @@ -74,7 +75,6 @@ def test_animal_model_initialization(
pytest.param(
does_not_raise(),
(
(INFO, "Initialised animal.AnimalConsts from config"),
(
INFO,
"Information required to initialise the animal model"
Expand Down Expand Up @@ -207,25 +207,24 @@ def test_from_config(
self,
scaling_method,
dummy_animal_data,
animal_fixture_config,
animal_fixture_configuration,
fixture_core_components,
):
"""Test that AnimalModel.from_config correctly sets density_scaling_method."""
from virtual_ecosystem.models.animal.animal_model import AnimalModel

# Update the config to include the scaling method
animal_fixture_config["animal"]["density_scaling_method"] = scaling_method

# Update the constants to set the scaling method
# Configuration classes are frozen so update via the __dict__ entries
animal_fixture_configuration.animal.__dict__["density_scaling_method"]
animal_fixture_configuration.animal.constants.__dict__[
"density_scaling_method"
] = scaling_method

# Create the model using from_config
model = AnimalModel.from_config(
data=dummy_animal_data,
configuration=animal_fixture_configuration,
core_components=fixture_core_components,
config=animal_fixture_config,
config=dict(),
)

# Check that the model has the correct scaling method set
Expand Down Expand Up @@ -638,6 +637,7 @@ def test_calculate_total_soil_consumption(
self,
litter_soil_data_instance,
fixture_core_components,
fixture_core_constants,
functional_group_list_instance,
constants_instance,
microbial_c_n_p_ratios,
Expand All @@ -647,7 +647,6 @@ def test_calculate_total_soil_consumption(

import numpy as np

from virtual_ecosystem.core.constants import CoreConsts
from virtual_ecosystem.models.animal.animal_model import AnimalModel
from virtual_ecosystem.models.animal.decay import SoilPool

Expand Down Expand Up @@ -724,7 +723,7 @@ def test_calculate_total_soil_consumption(
cell_id=cid,
data=new_data,
cell_area=cell_area,
max_depth_microbial_activity=CoreConsts.max_depth_of_microbial_activity,
max_depth_microbial_activity=fixture_core_constants.max_depth_of_microbial_activity,
c_n_p_ratios=microbial_c_n_p_ratios,
)
for pool_name in pool_names
Expand Down Expand Up @@ -982,8 +981,8 @@ def test_estimate_total_individuals(

from math import ceil

from virtual_ecosystem.models.animal.constants import AnimalConsts
from virtual_ecosystem.models.animal.functional_group import FunctionalGroup
from virtual_ecosystem.models.animal.model_config import AnimalConstants

# Always patch damuths_law to return predictable 42.0
mock_damuth = mocker.patch(
Expand Down Expand Up @@ -1016,7 +1015,7 @@ def test_estimate_total_individuals(
vertical_occupancy="ground",
birth_mass=0.1,
adult_mass=10.0,
constants=AnimalConsts(density_scaling_method=scaling_method),
constants=AnimalConstants(density_scaling_method=scaling_method),
density_individuals_m2=density,
)

Expand Down
Loading