Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from cadCAD.configuration.utils import config_sim | |
| from cadCAD.configuration import Experiment | |
| from cadCAD.engine import ExecutionMode, ExecutionContext | |
| from cadCAD.engine import Executor | |
| from cadCAD import configs | |
| import pandas as pd | |
| import numpy as np | |
| from seir_model import * | |
| def create_and_run_exp(population): | |
| #Total Population : population | |
| initial_state = { | |
| "S": population-10, | |
| "E": 10, | |
| "I":0, | |
| "R":0 | |
| } | |
| sys_params = { | |
| "infection_rate":[1], | |
| "recovery_rate":[1/14], | |
| "exposure_rate":[1/3] | |
| } | |
| partial_state_update_blocks = [ | |
| { | |
| "policies":{ | |
| "expsoed_growth":p_exposed, | |
| "infected_growth":p_infected, | |
| "recovered_growth":p_recovered, | |
| }, | |
| "variables":{ | |
| "S":s_susceptible, | |
| "E":s_exposed, | |
| "I":s_infected, | |
| "R":s_recovered, | |
| } | |
| } | |
| ] | |
| del configs[:] | |
| timesteps = 100 | |
| sim_config = config_sim({ | |
| "N":1, | |
| "T":range(timesteps), | |
| "M":sys_params | |
| }) | |
| experiment = Experiment() | |
| experiment.append_configs( | |
| sim_configs=sim_config, | |
| initial_state=initial_state, | |
| partial_state_update_blocks=partial_state_update_blocks | |
| ) | |
| exec_context = ExecutionContext() | |
| simulation = Executor(exec_context=exec_context, configs=experiment.configs) | |
| return simulation | |
| css = """ | |
| .gradio-container { | |
| font-family: 'IBM Plex Sans', sans-serif; | |
| } | |
| .gr-button { | |
| color: white; | |
| border-color: black; | |
| background: black; | |
| } | |
| input[type='range'] { | |
| accent-color: black; | |
| } | |
| .dark input[type='range'] { | |
| accent-color: #dfdfdf; | |
| } | |
| .container { | |
| max-width: 900px; | |
| margin: auto; | |
| padding-top: 1.5rem; | |
| } | |
| .details:hover { | |
| text-decoration: underline; | |
| } | |
| .gr-button { | |
| white-space: nowrap; | |
| } | |
| .gr-button:focus { | |
| border-color: rgb(147 197 253 / var(--tw-border-opacity)); | |
| outline: none; | |
| box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); | |
| --tw-border-opacity: 1; | |
| --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); | |
| --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px var(--tw-ring-offset-width)) var(--tw-ring-color); | |
| --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity)); | |
| --tw-ring-opacity: .5; | |
| } | |
| #advanced-btn { | |
| font-size: .7rem !important; | |
| line-height: 19px; | |
| margin-top: 12px; | |
| margin-bottom: 12px; | |
| padding: 2px 8px; | |
| border-radius: 14px !important; | |
| } | |
| #advanced-options { | |
| display: none; | |
| margin-bottom: 20px; | |
| } | |
| .footer { | |
| margin-bottom: 45px; | |
| margin-top: 35px; | |
| text-align: center; | |
| border-bottom: 1px solid #e5e5e5; | |
| } | |
| .footer>p { | |
| font-size: .8rem; | |
| display: inline-block; | |
| padding: 0 10px; | |
| transform: translateY(10px); | |
| background: white; | |
| } | |
| .dark .footer { | |
| border-color: #303030; | |
| } | |
| .dark .footer>p { | |
| background: #0b0f19; | |
| } | |
| """ | |
| def plot_seir(population): | |
| simulation = create_and_run_exp(population) | |
| raw_result, tensor_fields, sessions = simulation.execute() | |
| result = pd.DataFrame(raw_result) | |
| pd.options.plotting.backend = "plotly" | |
| fig = result.plot( | |
| kind = "line", | |
| x = "timestep", | |
| y= ["S","E","I", "R"]) | |
| fig.update_layout(title = "Population Evolution Over Time", | |
| xaxis_title="Time (Days)", | |
| yaxis_title="People") | |
| return fig | |
| with gr.Blocks(css = css) as demo: | |
| gr.Markdown(""" | |
| ## Epidemic Simulation | |
| """) | |
| gr.HTML(''' | |
| <p style="margin-bottom: 10px; font-size: 94%"> | |
| A cadCAD-based simulation of an outbreak of any epidemic using the SEIR compartmental model | |
| </p> | |
| ''') | |
| population_input = gr.Slider(1000, 100000, value=10000, label = "Population") | |
| simulate_btn = gr.Button('Run Simulation') | |
| graph = gr.Plot() | |
| simulate_btn.click(plot_seir, inputs = population_input, outputs = graph) | |
| demo.launch() |