Coverage for pybeepop/beepop/mitetreatments.py: 71%
42 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-19 20:58 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-19 20:58 +0000
1"""BeePop+ Mite Treatment Management Module.
3This module contains classes for managing Varroa mite treatment schedules and
4efficacy parameters. Mite treatments are critical interventions that reduce
5mite populations to prevent colony collapse from mite-induced mortality.
7Classes:
8 MiteTreatmentItem: Individual treatment schedule with efficacy parameters
9 MiteTreatments: Collection manager for treatment schedules and active treatment lookup
10"""
12from dataclasses import dataclass
13from datetime import datetime
14from datetime import timedelta
15from typing import List, Optional
18@dataclass
19class MiteTreatmentItem:
20 """Individual mite treatment schedule with timing and efficacy.
22 Represents a single miticide application with specified timing, duration, and
23 efficacy. The treatment kills susceptible (non-resistant) mites at pct_mortality;
24 resistant mites survive it. What share of the population is resistant is a property
25 of the mite population, set by InitMitePctResistant and PctImmMitesResistant, not of
26 the treatment.
28 Attributes:
29 start_time (datetime): Treatment application start date
30 duration (int): Treatment duration in weeks
31 pct_mortality (float): Mortality rate for susceptible mites (0-100%)
32 """
34 start_time: datetime
35 duration: int # in weeks
36 pct_mortality: float # percent mortality (0-100)
37 # TODO: Need to change logic in rest of program to treat pct_mortality like a float (percentage)
39 def is_valid(self) -> bool:
40 return isinstance(self.start_time, datetime)
43class MiteTreatments:
44 """Collection manager for mite treatment schedules and active treatment lookup.
46 Manages multiple mite treatment schedules and provides functionality to
47 determine active treatments for any given date.
49 Attributes:
50 items (List[MiteTreatmentItem]): Collection of scheduled mite treatments
51 """
53 def __init__(self):
54 self.items: List[MiteTreatmentItem] = []
56 def add_item(self, item: MiteTreatmentItem):
57 self.items.append(item)
59 def add_item_by_values(
60 self,
61 start_time: datetime,
62 duration: int,
63 pct_mortality: float,
64 ):
65 item = MiteTreatmentItem(start_time, duration, pct_mortality)
66 self.add_item(item)
68 def get_item(self, index: int) -> Optional[MiteTreatmentItem]:
69 if 0 <= index < len(self.items):
70 return self.items[index]
71 return None
73 def get_item_by_date(self, date: datetime) -> Optional[MiteTreatmentItem]:
74 for item in self.items:
75 if item.start_time.date() == date.date():
76 return item
77 return None
79 def get_active_item(self, date: datetime) -> Optional[MiteTreatmentItem]:
80 for item in self.items:
81 if (
82 item.start_time
83 <= date
84 < item.start_time + timedelta(days=item.duration * 7)
85 ):
86 return item
87 return None
89 def is_new_treatment_starting(self, date: datetime) -> bool:
90 return any(item.start_time.date() == date.date() for item in self.items)
92 def delete_item(self, index: int):
93 if 0 <= index < len(self.items):
94 del self.items[index]
96 def get_count(self) -> int:
97 return len(self.items)
99 def clear_all(self):
100 self.items.clear()