-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cardiac tutorial #233
base: main
Are you sure you want to change the base?
Cardiac tutorial #233
Conversation
- Based on Max's pipeline scripts - Includes sampling, simulation, emulation, and sensitivity analysis
Check out this pull request on See visual diffs & provide feedback on Jupyter Notebooks. Powered by ReviewNB |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit
blackfmt
[blackfmt] reported by reviewdog 🐶
fig, ax = plt.subplots(ncols=2, figsize = (10, 5)) |
[blackfmt] reported by reviewdog 🐶
autoemulate/autoemulate/simulations/flow_functions.py
Lines 138 to 149 in 0f1382d
ax[0].plot(self.res.t, self.res.y[2*i,:] , 'r', alpha=0.1 + (1.-i/self.ncomp) *0.9) | |
ax[1].plot(self.res.t, self.res.y[2*i+1,:] , 'r', alpha=0.1 + (1.-i/self.ncomp) *0.9) | |
ax[0].set_title('Pressure') | |
ax[1].set_title('Flow rate') | |
ax[0].set_xlabel('Time (s)') | |
ax[1].set_xlabel('Time (s)') | |
ax[0].set_ylabel('mmHg') | |
ax[1].set_ylabel('$ml\cdot s^{-1}$') | |
return (fig, ax) |
import numpy as np | ||
import matplotlib.pyplot as plt | ||
|
||
class FlowProblem: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
class FlowProblem: | |
class FlowProblem: |
self, | ||
T=1.0, | ||
td=0.2, | ||
amp=900.0, | ||
dt=0.001, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
self, | |
T=1.0, | |
td=0.2, | |
amp=900.0, | |
dt=0.001, | |
self, | |
T=1.0, | |
td=0.2, | |
amp=900.0, | |
dt=0.001, |
ncomp = 10, | ||
C = 38., | ||
R = 0.06, | ||
L = 0.0017, | ||
R_o = 0.025, | ||
p_o = 10., | ||
) -> None : | ||
''' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
ncomp = 10, | |
C = 38., | |
R = 0.06, | |
L = 0.0017, | |
R_o = 0.025, | |
p_o = 10., | |
) -> None : | |
''' | |
ncomp=10, | |
C=38.0, | |
R=0.06, | |
L=0.0017, | |
R_o=0.025, | |
p_o=10.0, | |
) -> None: | |
""" |
''' | ||
|
||
assert td < T, f'td should be smaller than T but {td} >= {T}.' | ||
|
||
self._td = td | ||
self._T = T |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
''' | |
assert td < T, f'td should be smaller than T but {td} >= {T}.' | |
self._td = td | |
self._T = T | |
""" | |
assert td < T, f"td should be smaller than T but {td} >= {T}." | |
self._td = td | |
self._T = T |
out[i,0] = (Q_in(t%self.T) - y_temp[i,1]) / Cn | ||
if i < self.ncomp-1: | ||
out[i,1] = (-y_temp[i+1, 0] + y_temp[i, 0] - Rn * y_temp[i, 1]) / Ln |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
out[i,0] = (Q_in(t%self.T) - y_temp[i,1]) / Cn | |
if i < self.ncomp-1: | |
out[i,1] = (-y_temp[i+1, 0] + y_temp[i, 0] - Rn * y_temp[i, 1]) / Ln | |
out[i, 0] = (Q_in(t % self.T) - y_temp[i, 1]) / Cn | |
if i < self.ncomp - 1: | |
out[i, 1] = (-y_temp[i + 1, 0] + y_temp[i, 0] - Rn * y_temp[i, 1]) / Ln |
out[i,1] = (-y_temp[i+1, 0] + y_temp[i, 0] - Rn * y_temp[i, 1]) / Ln | ||
pass | ||
else: | ||
out[i,1] = (-self.p_o + y_temp[i, 0] - (Rn + self.R_o) * y_temp[i, 1]) / Ln |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
out[i,1] = (-self.p_o + y_temp[i, 0] - (Rn + self.R_o) * y_temp[i, 1]) / Ln | |
out[i, 1] = ( | |
-self.p_o + y_temp[i, 0] - (Rn + self.R_o) * y_temp[i, 1] | |
) / Ln |
else: | ||
out[i,1] = (-self.p_o + y_temp[i, 0] - (Rn + self.R_o) * y_temp[i, 1]) / Ln | ||
return out.reshape((-1,)) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
return out.reshape((-1,)) | ||
|
||
def solve(self): | ||
dfdt_fd_spec = lambda t, y : self.dfdt_fd(t=t, y=y, Q_in=self.Q_mi_lambda) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
dfdt_fd_spec = lambda t, y : self.dfdt_fd(t=t, y=y, Q_in=self.Q_mi_lambda) | |
dfdt_fd_spec = lambda t, y: self.dfdt_fd(t=t, y=y, Q_in=self.Q_mi_lambda) |
dfdt_fd_spec, | ||
[0.0, self.T * self.ncycles], | ||
y0 = np.zeros(self.ncomp*2), | ||
method='BDF', | ||
max_step=self.dt | ||
) | ||
self.res.y = self.res.y[:,self.res.t >= self.T*(self.ncycles-1)] | ||
self.res.t = self.res.t[self.res.t >= self.T*(self.ncycles-1)] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[blackfmt] reported by reviewdog 🐶
dfdt_fd_spec, | |
[0.0, self.T * self.ncycles], | |
y0 = np.zeros(self.ncomp*2), | |
method='BDF', | |
max_step=self.dt | |
) | |
self.res.y = self.res.y[:,self.res.t >= self.T*(self.ncycles-1)] | |
self.res.t = self.res.t[self.res.t >= self.T*(self.ncycles-1)] | |
dfdt_fd_spec, | |
[0.0, self.T * self.ncycles], | |
y0=np.zeros(self.ncomp * 2), | |
method="BDF", | |
max_step=self.dt, | |
) | |
self.res.y = self.res.y[:, self.res.t >= self.T * (self.ncycles - 1)] | |
self.res.t = self.res.t[self.res.t >= self.T * (self.ncycles - 1)] | |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #233 +/- ##
==========================================
+ Coverage 91.14% 91.54% +0.40%
==========================================
Files 45 51 +6
Lines 2393 2816 +423
==========================================
+ Hits 2181 2578 +397
- Misses 212 238 +26 ☔ View full report in Codecov by Sentry. |
@MaxBalmus I managed to transfer our original commits into the autoemulate repo, I think it makes more sense to work here directly, so that Martin can chip in where appropriate. |
@MaxBalmus @aranas: This is great! It would be best to make the simulation a function to be consistent with the other simulations eventually, but this isn't urgent. Let me know when I should have a look at it! |
this PR is a work in progress on the tutorial showcasing how autoemulate can be embedded into an end-to-end cardiac modelling pipeline including sensitivity analysis.
This tutorial still requires some improvements