Source code for chap_core.database.model_template_seed

import logging

from chap_core.model_spec import PeriodType
from chap_core.models.external_chapkit_model import ExternalChapkitModelTemplate
from chap_core.models.local_configuration import parse_local_model_config_from_directory

from .database import SessionWrapper
from .model_templates_and_config_tables import ModelTemplateDB, ModelConfiguration
from ..file_io.file_paths import get_config_path
from ..models.model_template import ExternalModelTemplate

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


[docs] def add_model_template(model_template: ModelTemplateDB, session_wrapper: SessionWrapper) -> int: template_id = session_wrapper.add_model_template(model_template) return template_id
[docs] def add_model_template_from_url(url: str, session_wrapper: SessionWrapper, version: str) -> int: model_template_config = ExternalModelTemplate.fetch_config_from_github_url(url) model_template_config.version = version template_id = session_wrapper.add_model_template_from_yaml_config(model_template_config) return template_id
[docs] def add_configured_model( model_template_id, configuration: ModelConfiguration, configuration_name: str, session_wrapper: SessionWrapper, uses_chapkit: bool = False, ) -> int: """ Add a configured model to the database. Parameters ---------- model_template_id : int The ID of the model template. configuration : dict The configuration for the model. session_wrapper : SessionWrapper The session wrapper for database operations. Returns ------- int The ID of the added model. """ return session_wrapper.add_configured_model( model_template_id, configuration, configuration_name, uses_chapkit=uses_chapkit )
[docs] def get_naive_model_template(): model_template = ModelTemplateDB( name="naive_model", display_name="Naive model used for testing", required_covariates=["rainfall", "mean_temperature"], description="A simple naive model only to be used for testing purposes.", supported_period_type=PeriodType.any, author="CHAP team", author_assessed_status="gray", organization="HISP Centre, University of Oslo", organization_logo_url="https://landportal.org/sites/default/files/2024-03/university_of_oslo_logo.png", source_url="NA", contact_email="chap@dhis2.org", citation_info='Climate Health Analytics Platform. 2025. "Naive model used for testing". HISP Centre, University of Oslo. https://dhis2-chap.github.io/chap-core/external_models/overview_of_supported_models.html', ) return model_template
[docs] def seed_configured_models_from_config_dir( session, dir=get_config_path() / "configured_models", skip_chapkit_models=False ): wrapper = SessionWrapper(session=session) configured_models = parse_local_model_config_from_directory(dir) for config in configured_models: if config.uses_chapkit: if skip_chapkit_models: continue # local model via rest api (chapkit) # todo: ignoring versions for now, find out if we want to support or care about versions for chapkit models template = ExternalChapkitModelTemplate(config.url) try: template.wait_for_healthy(timeout=60) model_template_config = template.get_model_template_config() logger.info(f"Model template config from chapkit model at {config.url}: {model_template_config}") template_id = wrapper.add_model_template_from_yaml_config(model_template_config) logger.info(f"Model has {len(config.configurations)} configured models") assert len(config.configurations) > 0, "No configured models found for chapkit model" for config_name, configured_model_configuration in config.configurations.items(): logger.info(f"Adding configured model {config_name} for chapkit model {config.url}") add_configured_model( template_id, configured_model_configuration, config_name, wrapper, uses_chapkit=True ) except TimeoutError: logger.error( f"Chapkit model at {config.url} did not respond as healthy. Skipping this model when seeding the database." ) continue else: # for every version, add one for each configured model configuration # find latest version in yaml, add that as a model template before for loop version, version_commit_or_branch = list(config.versions.items())[-1] version_commit_or_branch = version_commit_or_branch.strip("@") version_url = f"{config.url}@{version_commit_or_branch}" template_id = add_model_template_from_url(version_url, wrapper, version) for config_name, configured_model_configuration in config.configurations.items(): add_configured_model(template_id, configured_model_configuration, config_name, wrapper) # add naive model template naive_template = get_naive_model_template() naive_template_id = add_model_template(naive_template, wrapper) # and naive configured model add_configured_model( naive_template_id, ModelConfiguration(additional_continuous_covariates=[], user_option_values={}), "default", wrapper, ) session.commit()