TB-DevAcc / MVSEIQRD_Model

A simulation of the coronavirus pandemic in Germany based on the SEIR model.
MIT License
1 stars 0 forks source link

Shapes with J=1 / Simulation breaks after commit "cleanup" #54

Closed TB-DevAcc closed 2 years ago

TB-DevAcc commented 2 years ago

Describe the bug Für J=401 sollte die Simulation funktionieren, dauert allerdings erwartungsweise recht lange. Mit unserem eigentlichen Default J=1 funktioniert die Simulation nicht mehr, da die verschiedenen shapes nicht zusammenpassen.

To Reproduce Steps to reproduce the behavior:

  1. Go to default_values.json
  2. Change J to 1
  3. Call model.run()
  4. See broadcast error

Expected behavior A running simulation with correct broadcastet values

Code snippets (J,) Funktioniert nicht mehr für J=1, da Beds immer noch shape (401,) hat https://github.com/TB-DevAcc/MVSEIQRD_Model/blob/084641037e87bb21a9877ae8dcafd0a8657837f1/app/controller.py#L231

S hat bei initialisierung shape (J, K), erhält hier aber auch shape (J*401*K)

image

Additional context 77d5177eea5407293c6a18860a5724f79022deff ist vermutlich der letzte funktionierende commit.

Sp3zif1sch commented 2 years ago

Das ist in der Tat ein grundlegendes Problem, wenn wir immer die ausgelesenen Werte vom RKI als Basis haben wollen, weil diese immer 401 Landkreise haben. https://github.com/TB-DevAcc/MVSEIQRD_Model/blob/084641037e87bb21a9877ae8dcafd0a8657837f1/app/controller.py#L608-L626

  1. Würde vorschlagen get_simulation_initial_values() bekommt J als Parameter übergeben und gibt basierend darauf entweder 401 Landkreise oder 1 Landkreis (Deutschland) zurück.
  2. Wenn wir auch Werte dazwischen abbilden wollen, könnte man einfach die ersten J Elemente des dahinter liegenden Dataframes zurückgeben
TB-DevAcc commented 2 years ago
  1. Würde vorschlagen get_simulation_initial_values() bekommt J als Parameter übergeben und gibt basierend darauf entweder 401 Landkreise oder 1 Landkreis (Deutschland) zurück.

Das klingt gut. Der "1 Landkreis" (Dtl) sollte ja dann die Summe der 401 sein?

  1. Wenn wir auch Werte dazwischen abbilden wollen, könnte man einfach die ersten J Elemente des dahinter liegenden Dataframes zurückgeben

Ich denke das macht inhaltlich nicht so viel Sinn. Angenommen man möchte die Simulation für J=16 (Bundesländer) ausführen, dann muss man auch eine neue Datei bzw. Werte bereitstellen.

Warum ist denn die Simulation im Moment überhaupt abhängig von den Landkreis Daten? Sollte die nicht nur dann abhängig sein wenn J=401 gesetzt, und die entsprechenden Werte in params eingegeben werden? Es sollte ja eigentlich nicht vorkommen, dass J, K und die anderen Parameter nicht zusammenpassen, solange die Eingabedaten korrekt sind.

Sp3zif1sch commented 2 years ago

Das klingt gut. Der "1 Landkreis" (Dtl) sollte ja dann die Summe der 401 sein?

Korrekt - unterteilt in die 6 Altersgruppen.

Ich denke das macht inhaltlich nicht so viel Sinn. Angenommen man möchte die Simulation für J=16 (Bundesländer) ausführen, dann muss man auch eine neue Datei bzw. Werte bereitstellen.

Find ich tatsächlich auch nicht wirklich sinnvoll, habe es aber einfach mal vorgeschlagen. Über die Situation mit J=16 (Bundesländer) habe ich auch bereits nachgedacht und diesen Fall könnten wir, wenn wir das haben wollen, wahrscheinlich auch recht einfach abbilden, da die ersten beiden Nummern der Landkreis-ID das Bundesland anzeigen (01 -> SH, 09 -> BY, 11 -> BE).

Warum ist denn die Simulation im Moment überhaupt abhängig von den Landkreis Daten? Sollte die nicht nur dann abhängig sein wenn J=401 gesetzt, und die entsprechenden Werte in params eingegeben werden? Es sollte ja eigentlich nicht vorkommen, dass J, K und die anderen Parameter nicht zusammenpassen, solange die Eingabedaten korrekt sind.

Ähm, ich dachte mir, dass esdas sinvollste ist, immer genaue Werte aus der csv-Datei zu verwenden und im Init des Controllers deshalb immer das Laden der Basisdaten aufrufe: https://github.com/TB-DevAcc/MVSEIQRD_Model/blob/084641037e87bb21a9877ae8dcafd0a8657837f1/app/controller.py#L205 Wir können das Laden der Daten aber gerne von irgendetwas, wie z.B. J=401, abhängig machen.

TB-DevAcc commented 2 years ago

Über die Situation mit J=16 (Bundesländer) habe ich auch bereits nachgedacht und diesen Fall könnten wir, wenn wir das haben wollen, wahrscheinlich auch recht einfach abbilden, da die ersten beiden Nummern der Landkreis-ID das Bundesland anzeigen (01 -> SH, 09 -> BY, 11 -> BE).

Ah cool. Ja das ist dann nice to have für die Erstellung von Szenarien, aber muss ja nicht in unsere App rein.

Wir können das Laden der Daten aber gerne von irgendetwas, wie z.B. J=401, abhängig machen.

Also mal die Szenarien:

  1. Default: J=1, K=6

    model = Model() # Modell wird mit default_values.json initialisiert, also J=1, K=6; (Klassen müssen in json Form (J, K) haben)
    model.run()
    model.run_app() # oder plot()
  2. J=401, K=6 Mit Pseudofunktionen für dh:

    dh = DataHandler() # DataHandler wird mit default Landkreis  Daten (RKI_COVID19.csv ... ) initialisiert
    params = dh.initialize() # params: dict = {<Relevante Klassen in Form (J, K); J; K; Relevante Parameter in Form (1,)>}
    model = Model(params=params, fill_missing_values=True) # Modell wird mit params von Landkreis daten initialisiert plus Default Werte
    model.run()
    model.plot()
  3. J=16, K=6 Mit Pseudofunktionen für dh:

    
    dh = DataHandler(coviddata=Bundesländer.csv, bedsdata=BLBeds.csv, impfdata=BLImpf.csv) 
    params = dh.initialize() # params: dict = {<Relevante Klassen in Form (J, K); J; K; Relevante Parameter in Form (1,)>}
    # Oder alternativ
    dh = DataHandler() 
    params = dh.initialize()
    params['J'] = 16
    params['S'] = [sum(x) for x in [LK Data in Bundesland]]
    ...

model = Model(params=params, fill_missing_values=True) # Modell wird mit params von Landkreis daten initialisiert plus Default Werte model.run() model.plot()


4. J=1, K != 6
_Mit Pseudofunktion set_S_value_
```python
params = {}
params['K'] = k
params['S'] = [set_S_value(x) for x in range(k)]
...
model = Model(params=params, , fill_missing_values=True) # Modell wird mit params initialisiert und mit default_values ergänzt
model.run()
model.run_app() # oder plot()
TB-DevAcc commented 2 years ago

Stimmt ihr da mit überein?

Sp3zif1sch commented 2 years ago

Ja, wobei du bei 2. und 3. dh nicht explizit erstellen müsstest, das passiert automatisch im Controller (zumindest für Basiswerte der Simulation) Bei 4. bin ich mir nicht sicher, ob wir das brauchen.

TB-DevAcc commented 2 years ago

Ja, wobei du bei 2. und 3. dh nicht explizit erstellen müsstest, das passiert automatisch im Controller (zumindest für Basiswerte der Simulation)

Aber dann ist ja dem Model nicht klar welche parameter es verwenden soll wenn automatisch mit dh von (echten) Daten initialisiert wird. Kann gerne implizit funktionieren, aber sollte dann ja mit einer Flag gesetzt werden. Wie unterscheiden wir sonst zwischen 1., 2. und 3.?

Bei 4. bin ich mir nicht sicher, ob wir das brauchen.

Ist als theoretisch mögliches Szenario gedacht, weniger als konkreter Fall für den wir etwas implementiert haben. Sollte aber eben theoretisch möglich sein, oder nicht?

Sp3zif1sch commented 2 years ago

Aber dann ist ja dem Model nicht klar welche parameter es verwenden soll wenn automatisch mit dh von (echten) Daten initialisiert wird. Kann gerne implizit funktionieren, aber sollte dann ja mit einer Flag gesetzt werden. Wie unterscheiden wir sonst zwischen 1., 2. und 3.?

Das Model sagt dem Controller über dessen __init__, ob er base_parameter laden soll: https://github.com/TB-DevAcc/MVSEIQRD_Model/blob/20aff845d5ca3d73fd0d63d9be6ac8153ea77ba6/app/controller.py#L78-L86

Die Unterscheidung, ob wir für J=1, J=16 oder J=401 Daten der Landkreise laden, machen wir über J.

Ist als theoretisch mögliches Szenario gedacht, weniger als konkreter Fall für den wir etwas implementiert haben. Sollte aber eben theoretisch möglich sein, oder nicht?

Theoretisch ja 😄