summaryrefslogtreecommitdiff
path: root/modeling/frensch_procedures.py
diff options
context:
space:
mode:
authorDobbertin, Niclas <niclas.dobbertin@mailbox.org>2024-07-31 00:00:03 +0200
committerDobbertin, Niclas <niclas.dobbertin@mailbox.org>2024-07-31 00:00:03 +0200
commitd3a81759c311a9ccfc4d17d2cb9347b9367cb7d1 (patch)
tree90bec1acb3f48dc06fb1e2a198cd24f0e9c5a8af /modeling/frensch_procedures.py
parent3fba69ca12dc01157c66383d3bd77ee28828bc04 (diff)
env progr
Diffstat (limited to 'modeling/frensch_procedures.py')
-rw-r--r--modeling/frensch_procedures.py155
1 files changed, 155 insertions, 0 deletions
diff --git a/modeling/frensch_procedures.py b/modeling/frensch_procedures.py
new file mode 100644
index 0000000..9dcbf36
--- /dev/null
+++ b/modeling/frensch_procedures.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python3
+
+from __future__ import annotations
+import random
+
+
+class WaterSample:
+ def __init__(
+ self,
+ solid: int,
+ algae: int,
+ lime: tuple[int, int, int, int],
+ toxin: tuple[int, int, int, int],
+ ):
+ self.solid = solid
+ self.algae = algae
+ self.lime = lime
+ self.toxin = toxin
+
+ def procedure_dict(self):
+ procedures = {
+ "1": (self.index1(), self.index1_str()),
+ "2": (self.index2(), self.index2_str()),
+ "3": (self.index3(), self.index3_str()),
+ "4": (self.index4(), self.index4_str()),
+ "5": (self.index5(), self.index5_str()),
+ "6": (self.index6(), self.index6_str()),
+ "overall": (self.overall(), self.overall_str()),
+ }
+
+ return procedures
+
+ def water_sample_dict(self):
+ sample = {
+ "1": (self.index1(), self.index1_str()),
+ "2": (self.index2(), self.index2_str()),
+ "3": (self.index3(), self.index3_str()),
+ "4": (self.index4(), self.index4_str()),
+ "5": (self.index5(), self.index5_str()),
+ "6": (self.index6(), self.index6_str()),
+ "overall": (self.overall(), self.overall_str()),
+ "solid": self.solid,
+ "algae": self.algae,
+ "lime": self.lime,
+ "toxin": self.toxin,
+ }
+ return sample
+
+ def select_procedures(self):
+ procedures = [
+ (self.index1, self.index1_str),
+ (self.index2, self.index2_str),
+ (self.index3, self.index3_str),
+ (self.index4, self.index4_str),
+ (self.index5, self.index5_str),
+ (self.index6, self.index6_str),
+ ]
+ random.shuffle(procedures)
+ training_procedures = procedures[:-1]
+ training_procedures.append((self.overall, self.overall_str))
+
+ return training_procedures, procedures[-1]
+
+ def index1(self):
+ return (self.lime[3] - self.lime[1]) * self.solid
+
+ def index1_str(self):
+ return "(Sandstein_4 - Sandstein_2) * Mineralien"
+
+ def index2(self):
+ return (2 * self.algae) + min(self.lime)
+
+ def index2_str(self):
+ return "(2 * Algen) + Sandstein_min"
+
+ def index3(self):
+ return max(self.toxin) + min(self.toxin)
+
+ def index3_str(self):
+ return "Gifte_max + Gifte_min"
+
+ def index4(self):
+ return (self.solid * 2) - self.toxin[3]
+
+ def index4_str(self):
+ return "(Mineralien * 2) - Gifte_4"
+
+ def index5(self):
+ return max(self.lime[2], (self.toxin[2] - self.toxin[1]))
+
+ def index5_str(self):
+ return "Das Höhere von (Gifte_3 - Gifte_2), (Sandstein_3)"
+
+ def index6(self):
+ return min(self.algae, (self.lime[0] + self.toxin[0]))
+
+ def index6_str(self):
+ return "Das Kleinere von (Sandstein_1 + Gifte_1), (Algen)"
+
+ def overall(self):
+ return 100 - max(
+ self.index1(), self.index2(), self.index3(), self.index4(), self.index5()
+ )
+
+ def overall_str(self):
+ return "100 - dem Höchstem aller Ergebnisse"
+
+ def print_all(self):
+ print(f"Solid: {self.solid}")
+ print(f"Algae: {self.algae}")
+ print(f"Lime: {self.lime}")
+ print(f"Toxin: {self.toxin}")
+ print(f"Index 1: {self.index1_str()} = {self.index1()}")
+ print(f"Index 2: {self.index2_str()} = {self.index2()}")
+ print(f"Index 3: {self.index3_str()} = {self.index3()}")
+ print(f"Index 4: {self.index4_str()} = {self.index4()}")
+ print(f"Index 5: {self.index5_str()} = {self.index5()}")
+ print(f"Index 6: {self.index6_str()} = {self.index6()}")
+ print(f"Overall Quality: {self.overall_str()} = {self.overall()}")
+
+
+# No step should produce a negative number, greater/lesser of comparisons should not
+# use equal numbers
+def constrained_WaterSample():
+ water_sample = random_WaterSample()
+ resample = True
+ while resample:
+ water_sample = random_WaterSample()
+ resample = False
+ # check for negative results
+ for proc in water_sample.procedure_dict().keys():
+ if water_sample.procedure_dict()[proc][0] < 0:
+ resample = True
+ # check for negative intermediate result
+ if (water_sample.lime[3] - water_sample.lime[1]) < 0:
+ resample = True
+ if (water_sample.toxin[2] - water_sample.toxin[1]) < 0:
+ resample = True
+ # check for greater/lesser equality
+ # procedure 5
+ if (water_sample.toxin[2] - water_sample.toxin[1]) == water_sample.lime[2]:
+ resample = True
+ # procedure 6
+ if (water_sample.lime[0] + water_sample.toxin[0]) == water_sample.algae:
+ resample = True
+ return water_sample
+
+
+def random_WaterSample():
+ solid = random.randint(1, 9)
+ algae = random.randint(1, 9)
+ lime = tuple(random.randint(1, 9) for _ in range(4))
+ toxin = tuple(random.randint(1, 9) for _ in range(4))
+
+ return WaterSample(solid, algae, lime, toxin)