Coverage for pybeepop/beepop/mitetreatments.py: 53%
43 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-30 13:34 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-30 13:34 +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 efficacy and resistance parameters.
22 Represents a single miticide application with specified timing, duration,
23 and efficacy characteristics. Treatments target Varroa mites with defined
24 mortality rates while accounting for resistant mite populations that
25 survive treatment.
27 Attributes:
28 start_time (datetime): Treatment application start date
29 duration (int): Treatment duration in days
30 pct_mortality (float): Mortality rate for susceptible mites (0-100%)
31 pct_resistant (float): Proportion of mites resistant to treatment (0-100%)
32 """
34 start_time: datetime
35 duration: int # in days
36 pct_mortality: float # percent mortality (0-100)
37 pct_resistant: float # percent resistant (0-100)
38 # TODO: Need to change logic in rest of program to treat pct_mortality like a float (percentage)
40 def is_valid(self) -> bool:
41 return isinstance(self.start_time, datetime)
44class MiteTreatments:
45 """Collection manager for mite treatment schedules and active treatment lookup.
47 Manages multiple mite treatment schedules and provides functionality to
48 determine active treatments for any given date.
50 Attributes:
51 items (List[MiteTreatmentItem]): Collection of scheduled mite treatments
52 """
54 def __init__(self):
55 self.items: List[MiteTreatmentItem] = []
57 def add_item(self, item: MiteTreatmentItem):
58 self.items.append(item)
60 def add_item_by_values(
61 self,
62 start_time: datetime,
63 duration: int,
64 pct_mortality: float,
65 pct_resistant: float,
66 ):
67 item = MiteTreatmentItem(start_time, duration, pct_mortality, pct_resistant)
68 self.add_item(item)
70 def get_item(self, index: int) -> Optional[MiteTreatmentItem]:
71 if 0 <= index < len(self.items):
72 return self.items[index]
73 return None
75 def get_item_by_date(self, date: datetime) -> Optional[MiteTreatmentItem]:
76 for item in self.items:
77 if item.start_time.date() == date.date():
78 return item
79 return None
81 def get_active_item(self, date: datetime) -> Optional[MiteTreatmentItem]:
82 for item in self.items:
83 if (
84 item.start_time
85 <= date
86 < item.start_time + timedelta(days=item.duration)
87 ):
88 return item
89 return None
91 def is_new_treatment_starting(self, date: datetime) -> bool:
92 return any(item.start_time.date() == date.date() for item in self.items)
94 def delete_item(self, index: int):
95 if 0 <= index < len(self.items):
96 del self.items[index]
98 def get_count(self) -> int:
99 return len(self.items)
101 def clear_all(self):
102 self.items.clear()