split choice network stuff into separate file

This commit is contained in:
AntonObersteiner 2024-06-02 21:10:30 +02:00
parent a073c04697
commit 8f06d4e1ee
2 changed files with 77 additions and 72 deletions

75
choice_network.py Normal file
View file

@ -0,0 +1,75 @@
#!/usr/bin/python3
from random import randint, random, choice
class Choice:
def __init__(self, **data):
""" stores a dict.
the keys are strings that indicate the next state,
the values are lists that store the possible emissions in transition to that new state.
"""
self.data = data
self.new_states = list(self.data.keys())
def choose(self):
new_state = choice(self.new_states)
emission = choice(self.data[new_state])
return new_state, emission
class SingleArgChoice:
def __init__(self, kwarg):
if len(kwarg) != 1:
raise ValueError(
f"{self.__class__.__name__} takes exactly one keyword argument!"
)
for self.next_state, self.value in kwarg.items():
pass
class RandInt(SingleArgChoice):
def __init__(self, **kwarg):
super().__init__(kwarg)
assert len(self.value) == 2
assert type(self.value[0]) == int
assert type(self.value[1]) == int
self.minimum = self.value[0]
self.maximum = self.value[1]
def choose(self):
number = randint(self.minimum, self.maximum)
return self.next_state, f"{number} "
class FixedText(SingleArgChoice):
def __init__(self, **kwarg):
super().__init__(kwarg)
self.text = self.value
def choose(self):
return self.next_state, self.text
class Network:
def __init__(self, **choices):
""" takes a dict,
the keys are strings that name states,
the values are the choices for new states and emissions possible in these states.
the 'start' state and the 'stop' state have their respective special roles.
"""
self.choices = choices
self.recursion_warning = 100
def choose(self):
state = 'start'
emissions = []
states = [state]
while state != 'stop':
state, emission = self.choices[state].choose()
emissions.append(emission)
states.append(states)
if len(emissions) > self.recursion_warning:
raise RecursionError(
"there are over a hundred emissions. probably a bug!"
)
return emissions, states

View file

@ -2,6 +2,8 @@
from random import randint, random, choice from random import randint, random, choice
from choice_network import Choice, FixedText, RandInt, Network
greeting = """ greeting = """
Englisch version below. Englisch version below.
@ -21,82 +23,10 @@ Hi, we have two students matching the criteria from the database and a certain a
Maybe you can filter it with regular expressions? Good luck. Maybe you can filter it with regular expressions? Good luck.
""" """
def matriculation_number():
return randint(40_000_000, 55_000_000)
# fünf Tatverdächtige # fünf Tatverdächtige
# Uhrzeiten, siehe Infos von Verantwortlichen # Uhrzeiten, siehe Infos von Verantwortlichen
# Groß-Klein-Schreibung # Groß-Klein-Schreibung
class Choice:
def __init__(self, **data):
""" stores a dict.
the keys are strings that indicate the next state,
the values are lists that store the possible emissions in transition to that new state.
"""
self.data = data
self.new_states = list(self.data.keys())
def choose(self):
new_state = choice(self.new_states)
emission = choice(self.data[new_state])
return new_state, emission
class SingleArgChoice:
def __init__(self, kwarg):
if len(kwarg) != 1:
raise ValueError(
f"{self.__class__.__name__} takes exactly one keyword argument!"
)
for self.next_state, self.value in kwarg.items():
pass
class RandInt(SingleArgChoice):
def __init__(self, **kwarg):
super().__init__(kwarg)
assert len(self.value) == 2
assert type(self.value[0]) == int
assert type(self.value[1]) == int
self.minimum = self.value[0]
self.maximum = self.value[1]
def choose(self):
number = randint(self.minimum, self.maximum)
return self.next_state, f"{number} "
class FixedText(SingleArgChoice):
def __init__(self, **kwarg):
super().__init__(kwarg)
self.text = self.value
def choose(self):
return self.next_state, self.text
class Network:
def __init__(self, **choices):
""" takes a dict,
the keys are strings that name states,
the values are the choices for new states and emissions possible in these states.
the 'start' state and the 'stop' state have their respective special roles.
"""
self.choices = choices
self.recursion_warning = 100
def choose(self):
state = 'start'
emissions = []
states = [state]
while state != 'stop':
state, emission = self.choices[state].choose()
emissions.append(emission)
states.append(states)
if len(emissions) > self.recursion_warning:
raise RecursionError(
"there are over a hundred emissions. probably a bug!"
)
return emissions, states
network = Network( network = Network(
start = Choice( start = Choice(
student = ["Student ", "Studentin ", "", "Studierende:r "], student = ["Student ", "Studentin ", "", "Studierende:r "],