myokit 1.35.4__py3-none-any.whl → 1.36.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. myokit/__init__.py +5 -3
  2. myokit/__main__.py +9 -159
  3. myokit/_config.py +2 -2
  4. myokit/_expressions.py +6 -6
  5. myokit/_model_api.py +11 -7
  6. myokit/_myokit_version.py +1 -1
  7. myokit/_protocol.py +4 -0
  8. myokit/_sim/__init__.py +1 -0
  9. myokit/_sim/cvodessim.c +321 -177
  10. myokit/_sim/cvodessim.py +107 -43
  11. myokit/_sim/mcl.h +54 -0
  12. myokit/formats/__init__.py +63 -12
  13. myokit/formats/ansic/__init__.py +2 -1
  14. myokit/formats/ansic/_ewriter.py +159 -40
  15. myokit/formats/cpp/_ewriter.py +12 -1
  16. myokit/formats/cuda/_ewriter.py +15 -51
  17. myokit/formats/easyml/_ewriter.py +26 -54
  18. myokit/formats/heka/_patchmaster.py +15 -3
  19. myokit/formats/latex/_ewriter.py +103 -88
  20. myokit/formats/latex/_exporter.py +1 -1
  21. myokit/formats/mathml/_ewriter.py +2 -2
  22. myokit/formats/matlab/_ewriter.py +50 -28
  23. myokit/formats/opencl/_ewriter.py +61 -78
  24. myokit/formats/python/_ewriter.py +81 -50
  25. myokit/formats/stan/_ewriter.py +29 -37
  26. myokit/gui/source.py +1 -1
  27. myokit/lib/hh.py +3 -0
  28. myokit/lib/markov.py +6 -0
  29. myokit/tests/__init__.py +70 -0
  30. myokit/tests/data/decker.model +59 -59
  31. myokit/tests/test_formats.py +115 -7
  32. myokit/tests/test_formats_ansic.py +344 -0
  33. myokit/tests/test_formats_axon.py +17 -0
  34. myokit/tests/test_formats_cpp.py +97 -0
  35. myokit/tests/test_formats_cuda.py +226 -0
  36. myokit/tests/test_formats_easyml.py +169 -152
  37. myokit/tests/{test_formats_exporters.py → test_formats_exporters_run.py} +1 -69
  38. myokit/tests/test_formats_html.py +1 -3
  39. myokit/tests/test_formats_latex.py +211 -0
  40. myokit/tests/test_formats_mathml_content.py +13 -0
  41. myokit/tests/test_formats_mathml_presentation.py +54 -42
  42. myokit/tests/test_formats_matlab.py +218 -0
  43. myokit/tests/test_formats_opencl.py +206 -380
  44. myokit/tests/test_formats_python.py +557 -0
  45. myokit/tests/test_formats_stan.py +175 -0
  46. myokit/tests/test_formats_sympy.py +9 -2
  47. myokit/tests/test_lib_hh.py +36 -0
  48. myokit/tests/test_lib_plots.py +0 -16
  49. myokit/tests/test_model.py +21 -1
  50. myokit/tests/test_simulation_cvodes.py +137 -56
  51. myokit/tools.py +3 -2
  52. {myokit-1.35.4.dist-info → myokit-1.36.1.dist-info}/LICENSE.txt +1 -1
  53. {myokit-1.35.4.dist-info → myokit-1.36.1.dist-info}/METADATA +19 -8
  54. {myokit-1.35.4.dist-info → myokit-1.36.1.dist-info}/RECORD +57 -52
  55. {myokit-1.35.4.dist-info → myokit-1.36.1.dist-info}/WHEEL +1 -1
  56. myokit/tests/test_formats_expression_writers.py +0 -1281
  57. myokit/tests/test_formats_importers.py +0 -53
  58. {myokit-1.35.4.dist-info → myokit-1.36.1.dist-info}/entry_points.txt +0 -0
  59. {myokit-1.35.4.dist-info → myokit-1.36.1.dist-info}/top_level.txt +0 -0
@@ -113,7 +113,7 @@ calcium_alpha = 0.05;
113
113
  calcium_beta = 0.00068;
114
114
  csqnBar = 10.0;
115
115
  diff_fTrap = calcium_alpha * active * (active - fTrap) - calcium_beta * fTrap;
116
- diff_uCa_cal = (-ICaL) * AF / (v_cal * 2.0) + CaL * v_sr / v_cal;
116
+ diff_uCa_cal = -ICaL * AF / (v_cal * 2.0) + CaL * v_sr / v_cal;
117
117
  diff_uCa_i = Ca * v_sr / v_cyt - (ICab + IpCa - 2.0 * INaCa) * AF / (v_cyt * 2.0) - (Iup - Ileak) * v_nsr / v_cyt;
118
118
  diff_uCa_jsr = Itr - Irel;
119
119
  diff_uCa_sr = INaCaSS * AF / v_sr + Irel * v_jsr / v_sr - (Ca + CaL);
@@ -122,11 +122,11 @@ diff_uCa_sr = INaCaSS * AF / v_sr + Irel * v_jsr / v_sr - (Ca + CaL);
122
122
  BSLBar = 1.124;
123
123
  BSRBar = 0.047;
124
124
  BS_sum = BSRBar + BSLBar;
125
- Ca_cal = (-b_2) / 3.0 + 2.0 / 3.0 * sqrt(b_2 * b_2 - 3.0 * c_2) * cos(acos((9.0 * b_2 * c_2 - 2.0 * pow(b_2, 3.0) - 27.0 * d_1) / (2.0 * pow(b_2 * b_2 - 3.0 * c_2, 1.5))) / 3.0);
125
+ Ca_cal = -b_2 / 3.0 + 2.0 / 3.0 * sqrt(b_2 * b_2 - 3.0 * c_2) * cos(acos((9.0 * b_2 * c_2 - 2.0 * pow(b_2, 3.0) - 27.0 * d_1) / (2.0 * pow(b_2 * b_2 - 3.0 * c_2, 1.5))) / 3.0);
126
126
  b_2 = sum2 - uCa_cal;
127
127
  c_2 = pro_sum2 - Km_sum2 * uCa_cal;
128
- d_1 = (-Km_pro2) * uCa_cal;
129
- Ca_i = (-b_3) / 3.0 + 2.0 / 3.0 * sqrt(b_3 * b_3 - 3.0 * c_3) * cos(acos((9.0 * b_3 * c_3 - 2.0 * pow(b_3, 3.0) - 27.0 * d_2) / (2.0 * pow(b_3 * b_3 - 3.0 * c_3, 1.5))) / 3.0);
128
+ d_1 = -Km_pro2 * uCa_cal;
129
+ Ca_i = -b_3 / 3.0 + 2.0 / 3.0 * sqrt(b_3 * b_3 - 3.0 * c_3) * cos(acos((9.0 * b_3 * c_3 - 2.0 * pow(b_3, 3.0) - 27.0 * d_2) / (2.0 * pow(b_3 * b_3 - 3.0 * c_3, 1.5))) / 3.0);
130
130
  Km_cmdn = 0.00238;
131
131
  Km_pro = Km_cmdn * Km_trpn;
132
132
  Km_sum = Km_trpn + Km_cmdn;
@@ -134,14 +134,14 @@ Km_trpn = 0.0005;
134
134
  b_3 = sum - uCa_i;
135
135
  c_3 = pro - uCa_i * Km_sum;
136
136
  cmdnBar = 0.05;
137
- d_2 = (-Km_pro) * uCa_i;
137
+ d_2 = -Km_pro * uCa_i;
138
138
  pro = Km_pro + trpnBar * Km_cmdn + cmdnBar * Km_trpn;
139
139
  sum = cmdnBar + trpnBar + Km_trpn + Km_cmdn;
140
140
  trpnBar = 0.07;
141
- Ca_sr = (-b_4) / 3.0 + 2.0 / 3.0 * sqrt(b_4 * b_4 - 3.0 * c_4) * cos(acos((9.0 * b_4 * c_4 - 2.0 * pow(b_4, 3.0) - 27.0 * d_3) / (2.0 * pow(b_4 * b_4 - 3.0 * c_4, 1.5))) / 3.0);
141
+ Ca_sr = -b_4 / 3.0 + 2.0 / 3.0 * sqrt(b_4 * b_4 - 3.0 * c_4) * cos(acos((9.0 * b_4 * c_4 - 2.0 * pow(b_4, 3.0) - 27.0 * d_3) / (2.0 * pow(b_4 * b_4 - 3.0 * c_4, 1.5))) / 3.0);
142
142
  b_4 = sum2 - uCa_sr;
143
143
  c_4 = pro_sum2 - Km_sum2 * uCa_sr;
144
- d_3 = (-Km_pro2) * uCa_sr;
144
+ d_3 = -Km_pro2 * uCa_sr;
145
145
  Km_BSL = 0.0087;
146
146
  Km_BSR = 0.00087;
147
147
  Km_pro2 = Km_BSR * Km_BSL;
@@ -152,7 +152,7 @@ sum2 = BS_sum + Km_sum2;
152
152
  // cell
153
153
  A = 2.0 * geoArea;
154
154
  AF = A / F;
155
- geoArea = 3.14 * 2.0 * radius * radius + 2.0 * 3.14159265358979312e+00 * radius * length;
155
+ geoArea = 3.14 * 2.0 * radius * radius + 2.0 * 3.14159265358979312e+00 * radius * length;
156
156
  length = 0.01;
157
157
  radius = 0.0011;
158
158
  v_cal = volume * 0.002;
@@ -181,9 +181,9 @@ z1_1 = EK - ECl;
181
181
  z2_1 = 87.8251;
182
182
  CTNaCl = NaClBar * z1_2 / (z1_2 + z2_2);
183
183
  z1_2 = pow(ENa - ECl, 4.0);
184
- z2_2 = 5.94941976406925395e+07;
184
+ z2_2 = 5.94941976406925395e+07;
185
185
  KClBar = 1.77e-05;
186
- NaClBar = 2.46108000000000016e-05;
186
+ NaClBar = 2.46108000000000016e-05;
187
187
 
188
188
  // diff
189
189
  Ca = (Ca_sr - Ca_i) / var_diff_tau_diff;
@@ -206,10 +206,10 @@ e2v_1 = exp(2.0 * vf);
206
206
  // ical
207
207
  ACT_ss = 1.0 / (1.0 + exp((p05_1 - V) / p06_1));
208
208
  ACT_tau = p00_1 + p01_1 * exp(p02_1 * (V + p03_1)) / (1.0 + exp(p04_1 * (V + p03_1)));
209
- diff_C = (-(ical_alpha + delta_1 + yy)) * C + ical_beta * O + theta * Cs + xx * CI;
210
- diff_CI = (-(ical_alpha + delta_I + xx)) * CI + yy * C + theta_I * CIs + ical_beta * OI;
211
- diff_CIs = (-(ical_alpha + theta_I + xs)) * CIs + ys * Cs + delta_I * CI + ical_beta * OIs;
212
- diff_Cs = (-(ical_alpha + theta + ys)) * Cs + delta_1 * C + ical_beta * Os + xs * CIs;
209
+ diff_C = -(ical_alpha + delta_1 + yy) * C + ical_beta * O + theta * Cs + xx * CI;
210
+ diff_CI = -(ical_alpha + delta_I + xx) * CI + yy * C + theta_I * CIs + ical_beta * OI;
211
+ diff_CIs = -(ical_alpha + theta_I + xs) * CIs + ys * Cs + delta_I * CI + ical_beta * OIs;
212
+ diff_Cs = -(ical_alpha + theta + ys) * Cs + delta_1 * C + ical_beta * Os + xs * CIs;
213
213
  ICaL = ICaLBar * g_1;
214
214
  ICaLBar = ((e2v_2 == 1.0) ? p21 * 4.0 * F * FRT * (gCai * Ca_cal - gCao * Cao) / (2.0 * FRT) : p21 * 4.0 * vff * (gCai * Ca_cal * e2v_2 - gCao * Cao) / (e2v_2 - 1.0));
215
215
  e2v_2 = exp(2.0 * vf);
@@ -217,16 +217,16 @@ g_1 = O + Os;
217
217
  gCai = 1.0;
218
218
  gCao = 0.341;
219
219
  I_V1 = p07_1 * (1.0 + exp((V + p08_1) / p09_1));
220
- I_V2 = p10_1 * (1.0 + exp((-(V + p11_1)) / p12_1));
220
+ I_V2 = p10_1 * (1.0 + exp(-(V + p11_1) / p12_1));
221
221
  I_Vss = (p15_1 + 1.0 / (1.0 + exp((V + p13_1) / p14_1))) / (1.0 + p15_1);
222
222
  I_Vtau = 1.0 / (1.0 / I_V1 + 1.0 / I_V2);
223
223
  Is_Ca = p16 - p17 / (1.0 + zz_2);
224
- Is_V2 = Is_Ca * (1.0 + exp((-(V + p11_1)) / p12_1));
224
+ Is_V2 = Is_Ca * (1.0 + exp(-(V + p11_1) / p12_1));
225
225
  Is_Vss = (p18 + 1.0 / (1.0 + exp((V + p13_1) / p14_1))) / (1.0 + p18);
226
226
  Is_Vtau = 1.0 / (1.0 / I_V1 + 1.0 / Is_V2);
227
- diff_O = (-(ical_beta + delta_1 + yy)) * O + ical_alpha * C + theta * Os + xx * OI;
228
- diff_OI = (-(ical_beta + delta_I + xx)) * OI + yy * O + theta_I * OIs + ical_alpha * CI;
229
- diff_OIs = (-(ical_beta + theta_I + xs)) * OIs + ys * Os + delta_I * OI + ical_alpha * CIs;
227
+ diff_O = -(ical_beta + delta_1 + yy) * O + ical_alpha * C + theta * Os + xx * OI;
228
+ diff_OI = -(ical_beta + delta_I + xx) * OI + yy * O + theta_I * OIs + ical_alpha * CI;
229
+ diff_OIs = -(ical_beta + theta_I + xs) * OIs + ys * Os + delta_I * OI + ical_alpha * CIs;
230
230
  Os = 1.0 - C - CI - CIs - Cs - O - OI - OIs;
231
231
  ical_alpha = ACT_ss / ACT_tau;
232
232
  ical_beta = (1.0 - ACT_ss) / ACT_tau;
@@ -255,7 +255,7 @@ p17 = 17.5;
255
255
  p18 = 0.0001;
256
256
  p19 = 3.0;
257
257
  p20 = 1e-06;
258
- p21 = 1.55520000000000002e-04;
258
+ p21 = 1.55520000000000002e-04;
259
259
  theta = 1.0;
260
260
  theta_I = p20;
261
261
  xs = Is_Vss / Is_Vtau;
@@ -274,7 +274,7 @@ Ibar_1 = ((evf == 1.0) ? 9e-07 * vff * Clo : 9e-07 * vff * (Cl_i - Clo * evf) /
274
274
  KCaI = 1.0 - 1.0 / (1.0 + pow(Irel, 2.0) / 0.16);
275
275
  diff_i_fast_1 = (ss - i_fast_1) / 8.0;
276
276
  i_fast_alpha = 0.025 / (1.0 + exp((V + 58.0) / 5.0));
277
- i_fast_beta = 1.0 / (5.0 * (1.0 + exp((V + 19.0) / (-9.0))));
277
+ i_fast_beta = 1.0 / (5.0 * (1.0 + exp((V + 19.0) / -9.0)));
278
278
  ss = i_fast_alpha / (i_fast_alpha + i_fast_beta);
279
279
 
280
280
  // ik1
@@ -283,17 +283,17 @@ Gbar_2 = 0.5;
283
283
  IK1 = GK1 * K1 * dv;
284
284
  K1 = ak / (ak + bk);
285
285
  ak = 1.02 / (1.0 + exp(0.2385 * (dv - 59.215)));
286
- bk = (0.49124 * exp(0.08032 * (dv + 5.476)) + exp(0.06175 * (dv - 594.31))) / (1.0 + exp((-0.5143) * (dv + 4.753)));
286
+ bk = (0.49124 * exp(0.08032 * (dv + 5.476)) + exp(0.06175 * (dv - 594.31))) / (1.0 + exp(-0.5143 * (dv + 4.753)));
287
287
  dv = V - EK;
288
288
 
289
289
  // ikr
290
290
  G = Gbar_3 * sqrt(Ko / 5.4);
291
291
  Gbar_3 = 0.0138542;
292
292
  IKr = G * a_1 * i_1 * (V - EK);
293
- a_1_inf = 1.0 / (1.0 + exp((V + 10.085) / (-4.25)));
293
+ a_1_inf = 1.0 / (1.0 + exp((V + 10.085) / -4.25));
294
294
  tau_a_1 = 1.0 / (0.0006 * ta - 0.0003 * tb);
295
295
  ta = ((dd_1 == 0.0) ? 1.0 / 0.136 : vv_1 / dd_1);
296
- dd_1 = -expm1((-0.136) * vv_1);
296
+ dd_1 = -expm1(-0.136 * vv_1);
297
297
  vv_1 = V - 1.7384;
298
298
  tb = ((dd_2 == 0.0) ? 1.0 / 0.1522 : vv_2 / dd_2);
299
299
  dd_2 = -expm1(0.1522 * vv_2);
@@ -318,7 +318,7 @@ diff_C8 = 2.0 * a_2 * C7 + 3.0 * b_5 * C9 + 3.0 * g_2 * C4 + 2.0 * d_4 * C11 - C
318
318
  diff_C9 = a_2 * C8 + 4.0 * g_2 * C5 + 2.0 * d_4 * C12 - C9 * (3.0 * b_5 + 3.0 * g_2 + d_4);
319
319
  GKs = p15_2 * (1.0 + 0.6 / (1.0 + pow(3.8e-05 / Ca_i, 1.4)));
320
320
  IKs = GKs * (O1 + O2) * (V - EKs);
321
- diff_O1 = (-(e + p)) * O1 + o * O2 + t * C15;
321
+ diff_O1 = -(e + p) * O1 + o * O2 + t * C15;
322
322
  O2 = 1.0 - C1 - C2 - C3 - C4 - C5 - C6 - C7 - C8 - C9 - C10 - C11 - C12 - C13 - C14 - C15 - O1;
323
323
  a_2 = p00_2 * exp(vf * p01_2);
324
324
  b_5 = p02_2 * exp(vf * p03_2);
@@ -327,21 +327,21 @@ e = p08_2 * exp(vf * p09_2);
327
327
  g_2 = p04_2 * exp(vf * p05_2);
328
328
  o = p11_2 * exp(vf * p12_2);
329
329
  p = p13_2 * exp(vf * p14_2);
330
- p00_2 = 1.48645979808599994e-02;
331
- p01_2 = 2.98773012358800015e-02;
332
- p02_2 = 8.39863121998299933e-02;
333
- p03_2 = (- 5.54610571266399982e-02);
334
- p04_2 = 1.46006611831600002e-02;
335
- p05_2 = 2.44649530996450010e-01;
336
- p06_2 = 3.11732688739999996e-03;
337
- p07_2 = (- 4.26254519443760027e-01);
338
- p08_2 = 7.73199009733099990e-02;
339
- p09_2 = (- 6.47261224887100001e-02);
340
- p10_2 = 8.95383064110199939e-02;
341
- p11_2 = 7.94054599586400012e-01;
342
- p12_2 = (- 8.01737819297699966e-02);
343
- p13_2 = 5.86382286630140026e-01;
344
- p14_2 = 2.82055543314960022e-01;
330
+ p00_2 = 1.48645979808599994e-02;
331
+ p01_2 = 2.98773012358800015e-02;
332
+ p02_2 = 8.39863121998299933e-02;
333
+ p03_2 = -5.54610571266399982e-02;
334
+ p04_2 = 1.46006611831600002e-02;
335
+ p05_2 = 2.44649530996450010e-01;
336
+ p06_2 = 3.11732688739999996e-03;
337
+ p07_2 = -4.26254519443760027e-01;
338
+ p08_2 = 7.73199009733099990e-02;
339
+ p09_2 = -6.47261224887100001e-02;
340
+ p10_2 = 8.95383064110199939e-02;
341
+ p11_2 = 7.94054599586400012e-01;
342
+ p12_2 = -8.01737819297699966e-02;
343
+ p13_2 = 5.86382286630140026e-01;
344
+ p14_2 = 2.82055543314960022e-01;
345
345
  p15_2 = 0.0826;
346
346
  t = p10_2;
347
347
 
@@ -353,14 +353,14 @@ K = 1.0 / (1.0 + exp((7.488 - V) / 5.98));
353
353
  // ina
354
354
  Gbar_5 = 9.075;
355
355
  INa = Gbar_5 * pow(m, 3.0) * h * j * (V - ENa);
356
- alpha_h = ((V >= (-40.0)) ? 0.0 : 0.135 * exp((80.0 + V) / (-6.8)));
357
- beta_h = ((V >= (-40.0)) ? 1.0 / (0.13 * (1.0 + exp((V + 10.66) / (-11.1)))) : 3.56 * exp(0.079 * V) + 310000.0 * exp(0.35 * V));
358
- alpha_j = ((V >= (-40.0)) ? 0.0 : ((-127140.0) * exp(0.2444 * V) - 6.948e-05 * exp((-0.04391) * V)) * (V + 37.78) / (1.0 + exp(0.311 * (V + 79.23))));
359
- beta_j = ((V >= (-40.0)) ? 0.3 * exp((-2.535e-07) * V) / (1.0 + exp((-0.1) * (V + 32.0))) : 0.1212 * exp((-0.01052) * V) / (1.0 + exp((-0.1378) * (V + 40.14))));
356
+ alpha_h = ((V >= -40.0) ? 0.0 : 0.135 * exp((80.0 + V) / -6.8));
357
+ beta_h = ((V >= -40.0) ? 1.0 / (0.13 * (1.0 + exp((V + 10.66) / -11.1))) : 3.56 * exp(0.079 * V) + 310000.0 * exp(0.35 * V));
358
+ alpha_j = ((V >= -40.0) ? 0.0 : (-127140.0 * exp(0.2444 * V) - 6.948e-05 * exp(-0.04391 * V)) * (V + 37.78) / (1.0 + exp(0.311 * (V + 79.23))));
359
+ beta_j = ((V >= -40.0) ? 0.3 * exp(-2.535e-07 * V) / (1.0 + exp(-0.1 * (V + 32.0))) : 0.1212 * exp(-0.01052 * V) / (1.0 + exp(-0.1378 * (V + 40.14))));
360
360
  alpha_m = ((dd_3 == 0.0) ? 3.2 : 0.32 * vv_3 / dd_3);
361
- dd_3 = -expm1((-0.1) * vv_3);
361
+ dd_3 = -expm1(-0.1 * vv_3);
362
362
  vv_3 = V + 47.13;
363
- beta_m = 0.08 * exp((-V) / 11.0);
363
+ beta_m = 0.08 * exp(-V / 11.0);
364
364
 
365
365
  // inab
366
366
  INaB = ((evf == 1.0) ? P * F * (Nai - Nao) : P * vff * (Nai * evf - Nao) / (evf - 1.0));
@@ -398,21 +398,21 @@ vMax = 4.5;
398
398
  // inak
399
399
  INaK = Ibar_2 * fv * pow(Pna, 3.0) * Pk;
400
400
  Pna = Nai / (Nai + K_Nai);
401
- fv = 1.0 / (1.0 + exp((-phi)));
401
+ fv = 1.0 / (1.0 + exp(-phi));
402
402
  phi = (V - VHalf) * FRT;
403
403
  Ibar_2 = 1.4;
404
404
  K_Ko = 1.5;
405
405
  K_Nai = 2.6;
406
406
  Pk = Ko / (Ko + K_Ko);
407
- VHalf = (-92.0);
407
+ VHalf = -92.0;
408
408
 
409
409
  // inal
410
410
  Gbar_6 = 0.0065;
411
411
  INaL = Gbar_6 * pow(a_3, 3.0) * i_2 * (V - ENa);
412
412
  alpha_a_3 = ((dd_4 == 0.0) ? 3.2 : 0.32 * vv_4 / dd_4);
413
- dd_4 = -expm1((-0.1) * vv_4);
413
+ dd_4 = -expm1(-0.1 * vv_4);
414
414
  vv_4 = V + 47.13;
415
- beta_a_3 = 0.08 * exp((-V) / 11.0);
415
+ beta_a_3 = 0.08 * exp(-V / 11.0);
416
416
  diff_i_2 = (hLss - i_2) / 600.0;
417
417
  hLss = 1.0 / (1.0 + exp((V + 91.0) / 6.1));
418
418
 
@@ -422,7 +422,7 @@ IpCa_bar = 0.0575;
422
422
  Km_pCa = 0.0005;
423
423
 
424
424
  // irel
425
- diff_Irel = (-(irel_inf_var + Irel)) / irel_tau;
425
+ diff_Irel = -(irel_inf_var + Irel) / irel_tau;
426
426
  irel_alpha = irel_beta * 0.1125;
427
427
  irel_beta = 4.75 * (1.0 + delta_2);
428
428
  delta_2 = 1.0 / (1.0 + pow(0.28 / active, 10.0));
@@ -433,11 +433,11 @@ irel_tau = irel_beta / (1.0 + 0.0123 / Ca_jsr);
433
433
  Gbar_7 = 0.4975;
434
434
  ITo = Gbar_7 * pow(a_4, 3.0) * i_fast_2 * i_slow * Rto1 * (V - EK);
435
435
  Rto1 = exp(V / 550.0);
436
- ito_a_alpha = 1.0 / (1.2089 * (1.0 + exp((V - 18.4099) / (-29.3814))));
436
+ ito_a_alpha = 1.0 / (1.2089 * (1.0 + exp((V - 18.4099) / -29.3814)));
437
437
  ito_a_beta = 3.5 / (1.0 + exp((V + 100.0) / 29.3814));
438
- a_4_inf = 1.0 / (1.0 + exp((V + 9.437) / (-7.133)));
438
+ a_4_inf = 1.0 / (1.0 + exp((V + 9.437) / -7.133));
439
439
  tau_a_4 = 1.0 / (ito_a_alpha + ito_a_beta);
440
- ito_beta_i = 1.0 / (9.7953 * (1.0 + exp((V + 19.0) / (-9.0))));
440
+ ito_beta_i = 1.0 / (9.7953 * (1.0 + exp((V + 19.0) / -9.0)));
441
441
  beta_i_fast_2 = ito_beta_i;
442
442
  beta_i_slow = ito_beta_i;
443
443
  alpha_i_fast_2 = 0.025 / (1.0 + exp((V + 58.0) / 5.0));
@@ -446,10 +446,10 @@ alpha_i_slow = 1.0 / (250.0 * (1.0 + exp((V + 60.0) / 5.0)));
446
446
  // membrane
447
447
  i_ion = INa_tot + IK_tot + ICa_tot + ICl_tot;
448
448
  i_stim = 0.0 * stim_amplitude;
449
- stim_amplitude = (-80.0);
449
+ stim_amplitude = -80.0;
450
450
 
451
451
  // nernst
452
- ECl = (-RTF) * log(Clo / Cl_i);
452
+ ECl = -RTF * log(Clo / Cl_i);
453
453
  EK = RTF * log(Ko / K_i);
454
454
  EKs = RTF * log((Ko + P_NaK * Nao) / (K_i + P_NaK * Nai));
455
455
  ENa = RTF * log(Nao / Nai);
@@ -464,14 +464,14 @@ T = 310.0;
464
464
 
465
465
  // potassium
466
466
  IK_tot = IK1 + IKr + IKs + IKur + ITo - INaK * 2.0;
467
- diff_K_i = (-IK_tot) * (AF / v_cyt) + CTKCl;
467
+ diff_K_i = -IK_tot * (AF / v_cyt) + CTKCl;
468
468
 
469
469
  // sodium
470
470
  INa_cyt = INa + INaL + INaB + INaK * 3.0 + INaCa * 3.0;
471
471
  INa_tot = INa_cyt + INaCaSS * 3.0;
472
- diff_Na_sr = (-(3.0 * INaCaSS * r1_3 + Na));
472
+ diff_Na_sr = -(3.0 * INaCaSS * r1_3 + Na);
473
473
  r1_3 = AF / v_sr;
474
- diff_Nai = (-r1_4) * INa_cyt + r2_2 * Na + CTNaCl;
474
+ diff_Nai = -r1_4 * INa_cyt + r2_2 * Na + CTNaCl;
475
475
  r1_4 = AF / v_cyt;
476
476
  r2_2 = v_sr / v_cyt;
477
477
 
@@ -5,6 +5,7 @@
5
5
  # This file is part of Myokit.
6
6
  # See http://myokit.org for copyright, sharing, and licensing details.
7
7
  #
8
+ import os
8
9
  import unittest
9
10
 
10
11
  import myokit
@@ -14,9 +15,7 @@ from myokit.tests import TemporaryDirectory
14
15
 
15
16
 
16
17
  class FormatsTest(unittest.TestCase):
17
- """
18
- Test infrastructure from the formats module.
19
- """
18
+ """ Test shared formats functionality. """
20
19
 
21
20
  def test_register_external_importer(self):
22
21
  # Tests registering an external importer.
@@ -101,10 +100,8 @@ class FormatsTest(unittest.TestCase):
101
100
 
102
101
 
103
102
  class ExporterTest(unittest.TestCase):
104
- """
105
- Tests some parts of :class:`Exporter` that are not tested when testing the
106
- various exporter implementations.
107
- """
103
+ """ Tests shared :class:`Exporter` functionality. """
104
+
108
105
  def test_writable_dir(self):
109
106
  # Test :meth:`_test_writable_dir` for existing paths.
110
107
 
@@ -126,6 +123,117 @@ class ExporterTest(unittest.TestCase):
126
123
  self.assertRaisesRegex(
127
124
  myokit.ExportError, 'file exists', e.runnable, path, m, p)
128
125
 
126
+ def test_runnable_exporter(self):
127
+ # Test shared functionality of the TemplatedRunnableExporters.
128
+
129
+ e = myokit.formats.exporter('ansic')
130
+
131
+ # Load model, protocol
132
+ m, p, x = myokit.load('example')
133
+
134
+ # Create empty output directory as subdirectory of DIR_OUT
135
+ with TemporaryDirectory() as d:
136
+ path = d.path()
137
+
138
+ # Simple export
139
+ dpath = os.path.join(path, 'runnable1')
140
+ ret = e.runnable(dpath, m)
141
+ self.assertIsNone(ret)
142
+ self.assertTrue(os.path.isdir(dpath))
143
+ self.assertTrue(len(os.listdir(dpath)) > 0)
144
+
145
+ # Write to complex path
146
+ dpath = os.path.join(path, 'runnable2', 'nest', 'test')
147
+ ret = e.runnable(dpath, m, p)
148
+ self.assertIsNone(ret)
149
+ self.assertTrue(os.path.isdir(dpath))
150
+ self.assertTrue(len(os.listdir(dpath)) > 0)
151
+
152
+ # Overwrite existing path
153
+ ret = e.runnable(dpath, m, p)
154
+ self.assertIsNone(ret)
155
+ self.assertTrue(os.path.isdir(dpath))
156
+ self.assertTrue(len(os.listdir(dpath)) > 0)
157
+
158
+ # Path pointing to file
159
+ dpath = os.path.join(path, 'file')
160
+ with open(dpath, 'w') as f:
161
+ f.write('contents\n')
162
+ self.assertRaisesRegex(
163
+ myokit.ExportError, 'file exists', e.runnable, dpath, m, p)
164
+
165
+ # Directory exists where we're trying to write a file
166
+ dpath = os.path.join(path, 'runnable3')
167
+ fname = os.path.join(dpath, 'sim.c')
168
+ os.makedirs(fname)
169
+ self.assertRaisesRegex(
170
+ myokit.ExportError, 'Directory exists',
171
+ e.runnable, dpath, m, p)
172
+
173
+ # Directory embedded in the output file path
174
+ def embedded():
175
+ return {'sim.c': 'nested/sim.c'}
176
+
177
+ # 1. Normal operation
178
+ e._dict = embedded
179
+ dpath = os.path.join(path, 'runnable4')
180
+ ret = e.runnable(dpath, m, p)
181
+ self.assertIsNone(ret)
182
+ self.assertTrue(os.path.isdir(dpath))
183
+ self.assertTrue(len(os.listdir(dpath)) > 0)
184
+
185
+ # 2. Try to create directory where file exists
186
+ def embedded():
187
+ return {'sim.c': 'nested/sim.c/som.c'}
188
+
189
+ e._dict = embedded
190
+ dpath = os.path.join(path, 'runnable4')
191
+ self.assertRaisesRegex(
192
+ myokit.ExportError, 'file or link', e.runnable, dpath, m, p)
193
+
194
+
195
+ class ImporterTest(unittest.TestCase):
196
+ """ Test shared importer functionality. """
197
+
198
+ def test_importer_interface(self):
199
+ # Test listing and creating importers.
200
+ ims = myokit.formats.importers()
201
+ self.assertTrue(len(ims) > 0)
202
+ for i in ims:
203
+ self.assertIsInstance(i, str)
204
+ i = myokit.formats.importer(i)
205
+ self.assertTrue(isinstance(i, myokit.formats.Importer))
206
+
207
+ def test_unknown(self):
208
+ # Test requesting an unknown importer.
209
+ # Test fetching using importer method
210
+ self.assertRaisesRegex(
211
+ KeyError, 'Importer not found', myokit.formats.importer, 'blip')
212
+
213
+
214
+ class EWriterTest(unittest.TestCase):
215
+ """ Test shared ewriter functionality. """
216
+
217
+ def test_ewriter_interface(self):
218
+ # Test listing and creating expression writers.
219
+
220
+ # Test listing
221
+ es = myokit.formats.ewriters()
222
+ self.assertTrue(len(es) > 0)
223
+
224
+ # Create one of each
225
+ for e in es:
226
+ self.assertIsInstance(e, str)
227
+ e = myokit.formats.ewriter(e)
228
+ self.assertTrue(isinstance(e, myokit.formats.ExpressionWriter))
229
+
230
+ def test_unknown(self):
231
+ # Test requesting an unknown expression writer.
232
+ # Test fetching using ewriter method
233
+ self.assertRaisesRegex(
234
+ KeyError, 'Expression writer not found', myokit.formats.ewriter,
235
+ 'dada')
236
+
129
237
 
130
238
  if __name__ == '__main__':
131
239
  unittest.main()