From 9115cc56bf7c0362a6d1b9750e6a7a548f429600 Mon Sep 17 00:00:00 2001 From: Niko <70217952+ew3361zh@users.noreply.github.com> Date: Tue, 15 Sep 2026 10:12:33 -0400 Subject: [PATCH 1/4] adds milk by parity output --- .../animal/animal_module_reporter.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/RUFAS/biophysical/animal/animal_module_reporter.py b/RUFAS/biophysical/animal/animal_module_reporter.py index 474fd6f8ab..6d178ad7c7 100644 --- a/RUFAS/biophysical/animal/animal_module_reporter.py +++ b/RUFAS/biophysical/animal/animal_module_reporter.py @@ -112,7 +112,23 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da ), } + milk_by_parity_group: dict[str, list[float]] = { + "parity_1": [], + "parity_2": [], + "parity_3_and_above": [], + } + for milk_stats in milk_reports: + if milk_stats.parity == 1: + parity_group = "parity_1" + elif milk_stats.parity == 2: + parity_group = "parity_2" + else: + parity_group = "parity_3_and_above" + + milk_by_parity_group[parity_group].append( + milk_stats.estimated_daily_milk_produced + ) updated_milk_data: dict[str, int | float | str] = { "cow_id": milk_stats.cow_id, "pen_id": milk_stats.pen_id, @@ -143,6 +159,19 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da om.add_variable("milk_data_at_milk_update", updated_milk_data, info_map) + for parity_group, milk_values in milk_by_parity_group.items(): + average_milk = ( + sum(milk_values) / len(milk_values) + if milk_values + else 0.0 + ) + + om.add_variable( + f"average_estimated_daily_milk_produced_{parity_group}", + average_milk, + info_map, + ) + @classmethod def report_average_genetics( cls, average_genetics: dict[str, float | None], variable_name_prefix: str, simulation_day: int From 87cfc33c0cc3dc5e04c396a4771bc070d66c5b6c Mon Sep 17 00:00:00 2001 From: Niko <70217952+ew3361zh@users.noreply.github.com> Date: Tue, 15 Sep 2026 15:26:50 -0400 Subject: [PATCH 2/4] adds more vars to outputs --- .../animal/animal_module_reporter.py | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/RUFAS/biophysical/animal/animal_module_reporter.py b/RUFAS/biophysical/animal/animal_module_reporter.py index 6d178ad7c7..3810923048 100644 --- a/RUFAS/biophysical/animal/animal_module_reporter.py +++ b/RUFAS/biophysical/animal/animal_module_reporter.py @@ -112,11 +112,13 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da ), } - milk_by_parity_group: dict[str, list[float]] = { - "parity_1": [], - "parity_2": [], - "parity_3_and_above": [], + parity_data: dict[str, dict[str, list[int | float]]] = { + "parity_1": {"milk": [], "days_in_milk": []}, + "parity_2": {"milk": [], "days_in_milk": []}, + "parity_3_and_above": {"milk": [], "days_in_milk": []}, } + fresh_cows: int = 0 + cows_at_or_above_50_dim: int = 0 for milk_stats in milk_reports: if milk_stats.parity == 1: @@ -126,9 +128,16 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da else: parity_group = "parity_3_and_above" - milk_by_parity_group[parity_group].append( + parity_data[parity_group]["milk"].append( milk_stats.estimated_daily_milk_produced ) + parity_data[parity_group]["days_in_milk"].append( + milk_stats.days_in_milk + ) + if milk_stats.days_in_milk < 50: + fresh_cows += 1 + else: + cows_at_or_above_50_dim += 1 updated_milk_data: dict[str, int | float | str] = { "cow_id": milk_stats.cow_id, "pen_id": milk_stats.pen_id, @@ -159,10 +168,18 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da om.add_variable("milk_data_at_milk_update", updated_milk_data, info_map) - for parity_group, milk_values in milk_by_parity_group.items(): + om.add_variable("fresh_cow_num", fresh_cows, info_map) + om.add_variable("cows_at_or_above_50_dim", cows_at_or_above_50_dim, info_map) + + for parity_group, data in parity_data.items(): average_milk = ( - sum(milk_values) / len(milk_values) - if milk_values + sum(data["milk"]) / len(data["milk"]) + if data["milk"] + else 0.0 + ) + average_days_in_milk = ( + sum(data["days_in_milk"]) / len(data["days_in_milk"]) + if data["days_in_milk"] else 0.0 ) @@ -171,6 +188,11 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da average_milk, info_map, ) + om.add_variable( + f"average_days_in_milk_{parity_group}", + average_days_in_milk, + info_map, + ) @classmethod def report_average_genetics( @@ -1006,6 +1028,11 @@ def report_sold_animal_information(cls, herd_statistics: HerdStatistics) -> None "class": AnimalModuleReporter.__name__, "function": AnimalModuleReporter.report_sold_animal_information.__name__, } + milk_by_parity_group: dict[str, list[float]] = { + animal_constants.HEIFER_REPRO_CULL: 0, + "parity_2": [], + "parity_3_and_above": [], + } for animal in sold_animals: om.add_variable("animal_id", animal["id"], dict(info_map, **{"units": MeasurementUnits.UNITLESS})) om.add_variable( From eb05e8081502eb5eb9ef3be24cd403d2ecb6043c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 15 Sep 2026 19:29:51 +0000 Subject: [PATCH 3/4] Apply Black Formatting --- .../animal/animal_module_reporter.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/RUFAS/biophysical/animal/animal_module_reporter.py b/RUFAS/biophysical/animal/animal_module_reporter.py index 3810923048..d651489aa2 100644 --- a/RUFAS/biophysical/animal/animal_module_reporter.py +++ b/RUFAS/biophysical/animal/animal_module_reporter.py @@ -128,12 +128,8 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da else: parity_group = "parity_3_and_above" - parity_data[parity_group]["milk"].append( - milk_stats.estimated_daily_milk_produced - ) - parity_data[parity_group]["days_in_milk"].append( - milk_stats.days_in_milk - ) + parity_data[parity_group]["milk"].append(milk_stats.estimated_daily_milk_produced) + parity_data[parity_group]["days_in_milk"].append(milk_stats.days_in_milk) if milk_stats.days_in_milk < 50: fresh_cows += 1 else: @@ -172,15 +168,9 @@ def report_milk(cls, milk_reports: list[MilkProductionStatistics], simulation_da om.add_variable("cows_at_or_above_50_dim", cows_at_or_above_50_dim, info_map) for parity_group, data in parity_data.items(): - average_milk = ( - sum(data["milk"]) / len(data["milk"]) - if data["milk"] - else 0.0 - ) + average_milk = sum(data["milk"]) / len(data["milk"]) if data["milk"] else 0.0 average_days_in_milk = ( - sum(data["days_in_milk"]) / len(data["days_in_milk"]) - if data["days_in_milk"] - else 0.0 + sum(data["days_in_milk"]) / len(data["days_in_milk"]) if data["days_in_milk"] else 0.0 ) om.add_variable( From 9e22bed28a943cf6f9c07922b11ba938da52d3ec Mon Sep 17 00:00:00 2001 From: ew3361zh Date: Tue, 15 Sep 2026 19:34:32 +0000 Subject: [PATCH 4/4] Update badges on README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ed66b0c6ba..fe2d789755 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -[![Flake8](https://img.shields.io/badge/Flake8-passed-brightgreen)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) -[![Pytest](https://img.shields.io/badge/Pytest-passed-brightgreen)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) -[![Coverage](https://img.shields.io/badge/Coverage-99%25-brightgreen)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) -[![Mypy](https://img.shields.io/badge/Mypy-1164%20errors-red)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) +[![Flake8](https://img.shields.io/badge/Flake8-failed-red)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) +[![Pytest](https://img.shields.io/badge/Pytest-failed-red)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) +[![Coverage](https://img.shields.io/badge/Coverage-%25-red)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) +[![Mypy](https://img.shields.io/badge/Mypy-1165%20errors-red)](https://github.com/RuminantFarmSystems/MASM/actions/workflows/combined_format_lint_test_mypy.yml) # RuFaS: Ruminant Farm Systems