File size: 3,765 Bytes
2c23a1f e352d7c 0a71629 96280a7 0a71629 e352d7c 2c23a1f e352d7c 3060b9d 67bc924 e45c9b8 67bc924 e45c9b8 67bc924 e45c9b8 67bc924 734c384 208ac86 734c384 3060b9d d6591d0 4e3d344 208ac86 1f4b934 d608e91 1f4b934 e7576f2 1f4b934 e7576f2 1f4b934 e7576f2 c343a7e 1f4b934 e352d7c 1f4b934 4e3d344 1f4b934 4e3d344 d6591d0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import os
import sys
import streamlit as st
from SIR_model import main as run_sir_model
import matplotlib
import plotly.graph_objs as go
import plotly.express as px
matplotlib.use("agg") # Use the non-interactive Agg backend
# Add Graphviz bin directory to PATH
graphviz_bin_dir = os.path.join(sys.prefix, "bin")
os.environ["PATH"] += os.pathsep + graphviz_bin_dir
# Streamlit app title
st.title('SIR Model Simulation')
# Introduction
st.write('This application simulates and visualizes the SIR model for infectious disease spread.')
# Custom CSS to inject for Streamlit buttons
css = """
<style>
.stButton > button {
align-items: center;
background-color: #FCFCFD;
border: 0;
border-radius: 4px;
box-shadow: rgba(45, 35, 66, 0.4) 0 2px 4px,
rgba(45, 35, 66, 0.3) 0 7px 13px -3px,
#D6D6E7 0 -3px 0 inset;
color: #36395A;
cursor: pointer;
display: inline-flex;
font-family: "JetBrains Mono", monospace;
font-size: 18px;
height: 48px;
justify-content: center;
line-height: 1;
padding: 0 16px;
transition: box-shadow .15s, transform .15s;
user-select: none;
-webkit-user-select: none;
touch-action: manipulation;
will-change: box-shadow, transform;
}
.stButton > button:focus {
box-shadow: #D6D6E7 0 0 0 1.5px inset,
rgba(45, 35, 66, 0.4) 0 2px 4px,
rgba(45, 35, 66, 0.3) 0 7px 13px -3px,
#D6D6E7 0 -3px 0 inset;
}
.stButton > button:hover {
box-shadow: rgba(45, 35, 66, 0.4) 0 4px 8px,
rgba(45, 35, 66, 0.3) 0 7px 13px -3px,
#D6D6E7 0 -3px 0 inset;
transform: translateY(-2px);
}
.stButton > button:active {
box-shadow: #D6D6E7 0 3px 7px inset;
transform: translateY(2px);
}
</style>
"""
st.markdown(css, unsafe_allow_html=True)
# Create an expander for model parameters
with st.expander("Model Parameters", expanded=True):
# Create a 2-column layout
col1, col2 = st.columns(2)
# Place number input and sliders in the first column
with col1:
total_population = st.number_input("Total Population", value=1000, min_value=1)
initial_infected = st.number_input("Initial Infected Population", value=1, min_value=0)
initial_recovered = st.number_input("Initial Recovered Population", value=0, min_value=0)
# Place the other sliders in the second column
with col2:
beta = st.slider("Infection Rate (β)", min_value=0.0, max_value=1.0, value=0.3)
gamma = st.slider("Recovery Rate (γ)", min_value=0.0, max_value=1.0, value=0.1)
st.write('The SIR model divides the population into three categories: Susceptible (S), Infected (I), and Recovered (R). The model simulates how an infectious disease spreads and is managed within a population over time.')
# Buttons to control the simulation
run_model_button = st.button('Run Model and Generate Plots')
generate_graph_button = st.button('Generate Computation Graph')
if run_model_button:
# Call the modified run_sir_model function with user input and slider values
fig, gif_path = run_sir_model(total_population, initial_infected, initial_recovered, beta, gamma, mode="run")
st.write("Static Population Model Output:")
st.pyplot(fig)
st.write("Animated Population Model Output:") # Display the GIF
st.image(gif_path, caption='SIR Model Animation')
st.success('Model executed successfully with user input and slider values.')
if generate_graph_button:
# Call the modified run_sir_model function with "graph" mode
image_path = run_sir_model(total_population, initial_infected, initial_recovered, beta, gamma, mode="graph")
st.image(image_path, caption="SIR Model Graph")
st.success('Graph generated successfully with user input and slider values.')
|