Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -856,31 +856,44 @@ class NutrientCalculator:
|
|
| 856 |
return round(self.total_ec, 2)
|
| 857 |
|
| 858 |
def _compensate_element(self, element: str, needed_ppm: float):
|
| 859 |
-
"""
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
if element in fert_data
|
| 864 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 865 |
|
| 866 |
if not suitable_ferts:
|
| 867 |
raise ValueError(f"Нет удобрений для элемента {element}")
|
| 868 |
|
| 869 |
-
# Сортир
|
| 870 |
-
suitable_ferts.sort(
|
| 871 |
-
key=lambda x: self.compensation_weights.get(x[0], {}).get('weight', 0.1),
|
| 872 |
-
reverse=True
|
| 873 |
-
)
|
| 874 |
|
|
|
|
|
|
|
|
|
|
| 875 |
remaining_ppm = needed_ppm
|
| 876 |
-
for
|
| 877 |
if remaining_ppm <= 0:
|
| 878 |
break
|
| 879 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 880 |
remaining_ppm = self.target_profile[element] - self.actual_profile[element]
|
| 881 |
|
| 882 |
-
def calculate(self)
|
| 883 |
-
"""Основной расчет
|
| 884 |
try:
|
| 885 |
# 1. Вносим магний (сульфат магния)
|
| 886 |
self._apply_fertilizer("Сульфат магния", "Mg", self.target_profile['Mg'])
|
|
@@ -888,15 +901,20 @@ class NutrientCalculator:
|
|
| 888 |
# 2. Вносим аммонийный азот
|
| 889 |
self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
| 890 |
|
| 891 |
-
# 3. Компенсируем нитратный азот
|
| 892 |
self._compensate_element("N (NO3-)", self.target_profile['N (NO3-)'])
|
| 893 |
|
| 894 |
# 4. Вносим фосфор
|
| 895 |
self._apply_fertilizer("Монофосфат калия", "P", self.target_profile['P'])
|
| 896 |
|
| 897 |
-
# 5. Компенсируем калий
|
| 898 |
self._compensate_element("K", self.target_profile['K'])
|
| 899 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 900 |
return self._prepare_results()
|
| 901 |
|
| 902 |
except Exception as e:
|
|
|
|
| 856 |
return round(self.total_ec, 2)
|
| 857 |
|
| 858 |
def _compensate_element(self, element: str, needed_ppm: float):
|
| 859 |
+
"""Исправленная компенсация с правильным учетом весов"""
|
| 860 |
+
# Находим все подходящие удобрения
|
| 861 |
+
suitable_ferts = []
|
| 862 |
+
for fert_name, fert_data in self.fertilizers.items():
|
| 863 |
+
if element in fert_data:
|
| 864 |
+
weight = self.compensation_weights.get(fert_name, {}).get('weight', 0.1)
|
| 865 |
+
suitable_ferts.append({
|
| 866 |
+
'name': fert_name,
|
| 867 |
+
'weight': weight,
|
| 868 |
+
'content': fert_data[element]
|
| 869 |
+
})
|
| 870 |
|
| 871 |
if not suitable_ferts:
|
| 872 |
raise ValueError(f"Нет удобрений для элемента {element}")
|
| 873 |
|
| 874 |
+
# Сортируем по весу (убывание)
|
| 875 |
+
suitable_ferts.sort(key=lambda x: x['weight'], reverse=True)
|
|
|
|
|
|
|
|
|
|
| 876 |
|
| 877 |
+
# Рассчитываем общий вес для нормализации
|
| 878 |
+
total_weight = sum(f['weight'] for f in suitable_ferts)
|
| 879 |
+
|
| 880 |
remaining_ppm = needed_ppm
|
| 881 |
+
for fert in suitable_ferts:
|
| 882 |
if remaining_ppm <= 0:
|
| 883 |
break
|
| 884 |
+
|
| 885 |
+
# Рассчитываем долю этого удобрения
|
| 886 |
+
share = fert['weight'] / total_weight
|
| 887 |
+
ppm_to_apply = remaining_ppm * share
|
| 888 |
+
|
| 889 |
+
# Вносим рассчитанную долю
|
| 890 |
+
self._apply_fertilizer(fert['name'], element, ppm_to_apply)
|
| 891 |
+
|
| 892 |
+
# Обновляем оставшийся дефицит
|
| 893 |
remaining_ppm = self.target_profile[element] - self.actual_profile[element]
|
| 894 |
|
| 895 |
+
def calculate(self):
|
| 896 |
+
"""Основной расчет с исправленной компенсацией"""
|
| 897 |
try:
|
| 898 |
# 1. Вносим магний (сульфат магния)
|
| 899 |
self._apply_fertilizer("Сульфат магния", "Mg", self.target_profile['Mg'])
|
|
|
|
| 901 |
# 2. Вносим аммонийный азот
|
| 902 |
self._apply_fertilizer("Аммоний азотнокислый", "N (NH4+)", self.target_profile['N (NH4+)'])
|
| 903 |
|
| 904 |
+
# 3. Компенсируем нитратный азот с учетом весов
|
| 905 |
self._compensate_element("N (NO3-)", self.target_profile['N (NO3-)'])
|
| 906 |
|
| 907 |
# 4. Вносим фосфор
|
| 908 |
self._apply_fertilizer("Монофосфат калия", "P", self.target_profile['P'])
|
| 909 |
|
| 910 |
+
# 5. Компенсируем калий с учетом весов
|
| 911 |
self._compensate_element("K", self.target_profile['K'])
|
| 912 |
|
| 913 |
+
# 6. Компенсируем кальций (если нужно)
|
| 914 |
+
ca_needed = self.target_profile['Ca'] - self.actual_profile['Ca']
|
| 915 |
+
if ca_needed > 0:
|
| 916 |
+
self._compensate_element("Ca", ca_needed)
|
| 917 |
+
|
| 918 |
return self._prepare_results()
|
| 919 |
|
| 920 |
except Exception as e:
|