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
@@ -1,1281 +0,0 @@
1
- #!/usr/bin/env python3
2
- #
3
- # Tests the expression writer classes.
4
- #
5
- # This file is part of Myokit.
6
- # See http://myokit.org for copyright, sharing, and licensing details.
7
- #
8
- import unittest
9
-
10
- import myokit
11
- import myokit.formats
12
- import myokit.formats.ansic
13
- import myokit.formats.cpp
14
- import myokit.formats.latex
15
- import myokit.formats.matlab
16
- import myokit.formats.python
17
- import myokit.formats.stan
18
-
19
-
20
- class ExpressionWriterTest(unittest.TestCase):
21
- """ Test shared expression writer functionality. """
22
-
23
- def test_ewriter_interface(self):
24
- # Test listing and creating expression writers.
25
-
26
- # Test listing
27
- es = myokit.formats.ewriters()
28
- self.assertTrue(len(es) > 0)
29
-
30
- # Create one of each
31
- for e in es:
32
- self.assertIsInstance(e, str)
33
- e = myokit.formats.ewriter(e)
34
- self.assertTrue(isinstance(e, myokit.formats.ExpressionWriter))
35
-
36
- def test_unknown(self):
37
- # Test requesting an unknown expression writer.
38
- # Test fetching using ewriter method
39
- self.assertRaisesRegex(
40
- KeyError, 'Expression writer not found', myokit.formats.ewriter,
41
- 'dada')
42
-
43
-
44
- class AnsicExpressionWriterTest(unittest.TestCase):
45
- """ Test the Ansi C ewriter class. """
46
-
47
- def test_all(self):
48
- w = myokit.formats.ansic.AnsiCExpressionWriter()
49
-
50
- model = myokit.Model()
51
- component = model.add_component('c')
52
- avar = component.add_variable('a')
53
-
54
- # Name
55
- a = myokit.Name(avar)
56
- self.assertEqual(w.ex(a), 'c.a')
57
- # Number with unit
58
- b = myokit.Number('12', 'pF')
59
- self.assertEqual(w.ex(b), '12.0')
60
-
61
- # Prefix plus
62
- x = myokit.PrefixPlus(b)
63
- self.assertEqual(w.ex(x), '12.0')
64
- # Prefix minus
65
- x = myokit.PrefixMinus(b)
66
- self.assertEqual(w.ex(x), '(-12.0)')
67
-
68
- # Plus
69
- x = myokit.Plus(a, b)
70
- self.assertEqual(w.ex(x), 'c.a + 12.0')
71
- # Minus
72
- x = myokit.Minus(a, b)
73
- self.assertEqual(w.ex(x), 'c.a - 12.0')
74
- # Multiply
75
- x = myokit.Multiply(a, b)
76
- self.assertEqual(w.ex(x), 'c.a * 12.0')
77
- # Divide
78
- x = myokit.Divide(a, b)
79
- self.assertEqual(w.ex(x), 'c.a / 12.0')
80
-
81
- # Quotient
82
- x = myokit.Quotient(a, b)
83
- self.assertEqual(w.ex(x), 'floor(c.a / 12.0)')
84
- # Remainder
85
- x = myokit.Remainder(a, b)
86
- self.assertEqual(w.ex(x), 'c.a - 12.0 * (floor(c.a / 12.0))')
87
-
88
- # Power
89
- x = myokit.Power(a, b)
90
- self.assertEqual(w.ex(x), 'pow(c.a, 12.0)')
91
- # Sqrt
92
- x = myokit.Sqrt(b)
93
- self.assertEqual(w.ex(x), 'sqrt(12.0)')
94
- # Exp
95
- x = myokit.Exp(a)
96
- self.assertEqual(w.ex(x), 'exp(c.a)')
97
- # Log(a)
98
- x = myokit.Log(b)
99
- self.assertEqual(w.ex(x), 'log(12.0)')
100
- # Log(a, b)
101
- x = myokit.Log(a, b)
102
- self.assertEqual(w.ex(x), '(log(c.a) / log(12.0))')
103
- # Log10
104
- x = myokit.Log10(b)
105
- self.assertEqual(w.ex(x), 'log10(12.0)')
106
-
107
- # Sin
108
- x = myokit.Sin(b)
109
- self.assertEqual(w.ex(x), 'sin(12.0)')
110
- # Cos
111
- x = myokit.Cos(b)
112
- self.assertEqual(w.ex(x), 'cos(12.0)')
113
- # Tan
114
- x = myokit.Tan(b)
115
- self.assertEqual(w.ex(x), 'tan(12.0)')
116
- # ASin
117
- x = myokit.ASin(b)
118
- self.assertEqual(w.ex(x), 'asin(12.0)')
119
- # ACos
120
- x = myokit.ACos(b)
121
- self.assertEqual(w.ex(x), 'acos(12.0)')
122
- # ATan
123
- x = myokit.ATan(b)
124
- self.assertEqual(w.ex(x), 'atan(12.0)')
125
-
126
- # Floor
127
- x = myokit.Floor(b)
128
- self.assertEqual(w.ex(x), 'floor(12.0)')
129
- # Ceil
130
- x = myokit.Ceil(b)
131
- self.assertEqual(w.ex(x), 'ceil(12.0)')
132
- # Abs
133
- x = myokit.Abs(b)
134
- self.assertEqual(w.ex(x), 'fabs(12.0)')
135
-
136
- # Equal
137
- x = myokit.Equal(a, b)
138
- self.assertEqual(w.ex(x), '(c.a == 12.0)')
139
- # NotEqual
140
- x = myokit.NotEqual(a, b)
141
- self.assertEqual(w.ex(x), '(c.a != 12.0)')
142
- # More
143
- x = myokit.More(a, b)
144
- self.assertEqual(w.ex(x), '(c.a > 12.0)')
145
- # Less
146
- x = myokit.Less(a, b)
147
- self.assertEqual(w.ex(x), '(c.a < 12.0)')
148
- # MoreEqual
149
- x = myokit.MoreEqual(a, b)
150
- self.assertEqual(w.ex(x), '(c.a >= 12.0)')
151
- # LessEqual
152
- x = myokit.LessEqual(a, b)
153
- self.assertEqual(w.ex(x), '(c.a <= 12.0)')
154
-
155
- # Not
156
- cond1 = myokit.parse_expression('5 > 3')
157
- cond2 = myokit.parse_expression('2 < 1')
158
- x = myokit.Not(cond1)
159
- self.assertEqual(w.ex(x), '!((5.0 > 3.0))')
160
- # And
161
- x = myokit.And(cond1, cond2)
162
- self.assertEqual(w.ex(x), '((5.0 > 3.0) && (2.0 < 1.0))')
163
- # Or
164
- x = myokit.Or(cond1, cond2)
165
- self.assertEqual(w.ex(x), '((5.0 > 3.0) || (2.0 < 1.0))')
166
-
167
- # If
168
- x = myokit.If(cond1, a, b)
169
- self.assertEqual(w.ex(x), '((5.0 > 3.0) ? c.a : 12.0)')
170
- # Piecewise
171
- c = myokit.Number(1)
172
- x = myokit.Piecewise(cond1, a, cond2, b, c)
173
- self.assertEqual(
174
- w.ex(x),
175
- '((5.0 > 3.0) ? c.a : ((2.0 < 1.0) ? 12.0 : 1.0))')
176
-
177
- # If/Piecewise with special function
178
- w.set_condition_function('ifthenelse')
179
- x = myokit.If(cond1, a, b)
180
- self.assertEqual(w.ex(x), 'ifthenelse((5.0 > 3.0), c.a, 12.0)')
181
- # Piecewise
182
- c = myokit.Number(1)
183
- x = myokit.Piecewise(cond1, a, cond2, b, c)
184
- self.assertEqual(
185
- w.ex(x),
186
- 'ifthenelse((5.0 > 3.0), c.a, ifthenelse((2.0 < 1.0), 12.0, 1.0))')
187
-
188
- # Test fetching using ewriter method
189
- w = myokit.formats.ewriter('ansic')
190
- self.assertIsInstance(w, myokit.formats.ansic.AnsiCExpressionWriter)
191
-
192
- # Test without a Myokit expression
193
- self.assertRaisesRegex(
194
- ValueError, 'Unknown expression type', w.ex, 7)
195
-
196
-
197
- class CppExpressionWriterTest(unittest.TestCase):
198
- """ Test the C++ ewriter class. """
199
-
200
- def test_all(self):
201
- w = myokit.formats.cpp.CppExpressionWriter()
202
-
203
- model = myokit.Model()
204
- component = model.add_component('c')
205
- avar = component.add_variable('a')
206
-
207
- # Name
208
- a = myokit.Name(avar)
209
- self.assertEqual(w.ex(a), 'c.a')
210
- # Number with unit
211
- b = myokit.Number('12', 'pF')
212
- self.assertEqual(w.ex(b), '12.0')
213
-
214
- # Prefix plus
215
- x = myokit.PrefixPlus(b)
216
- self.assertEqual(w.ex(x), '12.0')
217
- # Prefix minus
218
- x = myokit.PrefixMinus(b)
219
- self.assertEqual(w.ex(x), '(-12.0)')
220
-
221
- # Plus
222
- x = myokit.Plus(a, b)
223
- self.assertEqual(w.ex(x), 'c.a + 12.0')
224
- # Minus
225
- x = myokit.Minus(a, b)
226
- self.assertEqual(w.ex(x), 'c.a - 12.0')
227
- # Multiply
228
- x = myokit.Multiply(a, b)
229
- self.assertEqual(w.ex(x), 'c.a * 12.0')
230
- # Divide
231
- x = myokit.Divide(a, b)
232
- self.assertEqual(w.ex(x), 'c.a / 12.0')
233
-
234
- # Quotient
235
- x = myokit.Quotient(a, b)
236
- self.assertEqual(w.ex(x), 'floor(c.a / 12.0)')
237
- # Remainder
238
- x = myokit.Remainder(a, b)
239
- self.assertEqual(w.ex(x), 'c.a - 12.0 * (floor(c.a / 12.0))')
240
-
241
- # Power
242
- x = myokit.Power(a, b)
243
- self.assertEqual(w.ex(x), 'pow(c.a, 12.0)')
244
- # Sqrt
245
- x = myokit.Sqrt(b)
246
- self.assertEqual(w.ex(x), 'sqrt(12.0)')
247
- # Exp
248
- x = myokit.Exp(a)
249
- self.assertEqual(w.ex(x), 'exp(c.a)')
250
- # Log(a)
251
- x = myokit.Log(b)
252
- self.assertEqual(w.ex(x), 'log(12.0)')
253
- # Log(a, b)
254
- x = myokit.Log(a, b)
255
- self.assertEqual(w.ex(x), '(log(c.a) / log(12.0))')
256
- # Log10
257
- x = myokit.Log10(b)
258
- self.assertEqual(w.ex(x), 'log10(12.0)')
259
-
260
- # Sin
261
- x = myokit.Sin(b)
262
- self.assertEqual(w.ex(x), 'sin(12.0)')
263
- # Cos
264
- x = myokit.Cos(b)
265
- self.assertEqual(w.ex(x), 'cos(12.0)')
266
- # Tan
267
- x = myokit.Tan(b)
268
- self.assertEqual(w.ex(x), 'tan(12.0)')
269
- # ASin
270
- x = myokit.ASin(b)
271
- self.assertEqual(w.ex(x), 'asin(12.0)')
272
- # ACos
273
- x = myokit.ACos(b)
274
- self.assertEqual(w.ex(x), 'acos(12.0)')
275
- # ATan
276
- x = myokit.ATan(b)
277
- self.assertEqual(w.ex(x), 'atan(12.0)')
278
-
279
- # Floor
280
- x = myokit.Floor(b)
281
- self.assertEqual(w.ex(x), 'floor(12.0)')
282
- # Ceil
283
- x = myokit.Ceil(b)
284
- self.assertEqual(w.ex(x), 'ceil(12.0)')
285
- # Abs
286
- x = myokit.Abs(b)
287
- self.assertEqual(w.ex(x), 'fabs(12.0)')
288
-
289
- # Equal
290
- x = myokit.Equal(a, b)
291
- self.assertEqual(w.ex(x), '(c.a == 12.0)')
292
- # NotEqual
293
- x = myokit.NotEqual(a, b)
294
- self.assertEqual(w.ex(x), '(c.a != 12.0)')
295
- # More
296
- x = myokit.More(a, b)
297
- self.assertEqual(w.ex(x), '(c.a > 12.0)')
298
- # Less
299
- x = myokit.Less(a, b)
300
- self.assertEqual(w.ex(x), '(c.a < 12.0)')
301
- # MoreEqual
302
- x = myokit.MoreEqual(a, b)
303
- self.assertEqual(w.ex(x), '(c.a >= 12.0)')
304
- # LessEqual
305
- x = myokit.LessEqual(a, b)
306
- self.assertEqual(w.ex(x), '(c.a <= 12.0)')
307
-
308
- # Not
309
- cond1 = myokit.parse_expression('5 > 3')
310
- cond2 = myokit.parse_expression('2 < 1')
311
- x = myokit.Not(cond1)
312
- self.assertEqual(w.ex(x), '!((5.0 > 3.0))')
313
- # And
314
- x = myokit.And(cond1, cond2)
315
- self.assertEqual(w.ex(x), '((5.0 > 3.0) && (2.0 < 1.0))')
316
- # Or
317
- x = myokit.Or(cond1, cond2)
318
- self.assertEqual(w.ex(x), '((5.0 > 3.0) || (2.0 < 1.0))')
319
-
320
- # If
321
- x = myokit.If(cond1, a, b)
322
- self.assertEqual(w.ex(x), '((5.0 > 3.0) ? c.a : 12.0)')
323
- # Piecewise
324
- c = myokit.Number(1)
325
- x = myokit.Piecewise(cond1, a, cond2, b, c)
326
- self.assertEqual(
327
- w.ex(x),
328
- '((5.0 > 3.0) ? c.a : ((2.0 < 1.0) ? 12.0 : 1.0))')
329
-
330
- # Test fetching using ewriter method
331
- w = myokit.formats.ewriter('cpp')
332
- self.assertIsInstance(w, myokit.formats.cpp.CppExpressionWriter)
333
-
334
- # Test without a Myokit expression
335
- self.assertRaisesRegex(
336
- ValueError, 'Unknown expression type', w.ex, 7)
337
-
338
-
339
- class CudaExpressionWriterTest(unittest.TestCase):
340
- """ Test the CUDA ewriter class. """
341
-
342
- def test_all(self):
343
- # Single and double precision
344
- ws = myokit.formats.cuda.CudaExpressionWriter()
345
- wd = myokit.formats.cuda.CudaExpressionWriter(myokit.DOUBLE_PRECISION)
346
-
347
- model = myokit.Model()
348
- component = model.add_component('c')
349
- avar = component.add_variable('a')
350
-
351
- # Name
352
- a = myokit.Name(avar)
353
- self.assertEqual(ws.ex(a), 'c.a')
354
- self.assertEqual(wd.ex(a), 'c.a')
355
- # Number with unit
356
- b = myokit.Number('12', 'pF')
357
- self.assertEqual(ws.ex(b), '12.0f')
358
- self.assertEqual(wd.ex(b), '12.0')
359
-
360
- # Prefix plus
361
- x = myokit.PrefixPlus(b)
362
- self.assertEqual(ws.ex(x), '12.0f')
363
- self.assertEqual(wd.ex(x), '12.0')
364
- # Prefix minus
365
- x = myokit.PrefixMinus(b)
366
- self.assertEqual(ws.ex(x), '(-12.0f)')
367
- self.assertEqual(wd.ex(x), '(-12.0)')
368
-
369
- # Plus
370
- x = myokit.Plus(a, b)
371
- self.assertEqual(ws.ex(x), 'c.a + 12.0f')
372
- self.assertEqual(wd.ex(x), 'c.a + 12.0')
373
- # Minus
374
- x = myokit.Minus(a, b)
375
- self.assertEqual(ws.ex(x), 'c.a - 12.0f')
376
- self.assertEqual(wd.ex(x), 'c.a - 12.0')
377
- # Multiply
378
- x = myokit.Multiply(a, b)
379
- self.assertEqual(ws.ex(x), 'c.a * 12.0f')
380
- self.assertEqual(wd.ex(x), 'c.a * 12.0')
381
- # Divide
382
- x = myokit.Divide(a, b)
383
- self.assertEqual(ws.ex(x), 'c.a / 12.0f')
384
- self.assertEqual(wd.ex(x), 'c.a / 12.0')
385
-
386
- # Quotient
387
- x = myokit.Quotient(a, b)
388
- self.assertEqual(ws.ex(x), 'floorf(c.a / 12.0f)')
389
- self.assertEqual(wd.ex(x), 'floor(c.a / 12.0)')
390
- # Remainder
391
- x = myokit.Remainder(a, b)
392
- self.assertEqual(ws.ex(x), 'c.a - 12.0f * (floorf(c.a / 12.0f))')
393
- self.assertEqual(wd.ex(x), 'c.a - 12.0 * (floor(c.a / 12.0))')
394
-
395
- # Power
396
- x = myokit.Power(a, b)
397
- self.assertEqual(ws.ex(x), 'powf(c.a, 12.0f)')
398
- self.assertEqual(wd.ex(x), 'pow(c.a, 12.0)')
399
- # Square
400
- x = myokit.Power(a, myokit.Number(2))
401
- self.assertEqual(ws.ex(x), '(c.a * c.a)')
402
- self.assertEqual(wd.ex(x), '(c.a * c.a)')
403
- # Square with brackets
404
- x = myokit.Power(myokit.Plus(a, b), myokit.Number(2))
405
- self.assertEqual(ws.ex(x), '((c.a + 12.0f) * (c.a + 12.0f))')
406
- self.assertEqual(wd.ex(x), '((c.a + 12.0) * (c.a + 12.0))')
407
- # Sqrt
408
- x = myokit.Sqrt(b)
409
- self.assertEqual(ws.ex(x), 'sqrtf(12.0f)')
410
- self.assertEqual(wd.ex(x), 'sqrt(12.0)')
411
- # Exp
412
- x = myokit.Exp(a)
413
- self.assertEqual(ws.ex(x), 'expf(c.a)')
414
- self.assertEqual(wd.ex(x), 'exp(c.a)')
415
- # Log(a)
416
- x = myokit.Log(b)
417
- self.assertEqual(ws.ex(x), 'logf(12.0f)')
418
- self.assertEqual(wd.ex(x), 'log(12.0)')
419
- # Log(a, b)
420
- x = myokit.Log(a, b)
421
- self.assertEqual(ws.ex(x), '(logf(c.a) / logf(12.0f))')
422
- self.assertEqual(wd.ex(x), '(log(c.a) / log(12.0))')
423
- # Log10
424
- x = myokit.Log10(b)
425
- self.assertEqual(ws.ex(x), 'log10f(12.0f)')
426
- self.assertEqual(wd.ex(x), 'log10(12.0)')
427
-
428
- # Sin
429
- x = myokit.Sin(b)
430
- self.assertEqual(ws.ex(x), 'sinf(12.0f)')
431
- self.assertEqual(wd.ex(x), 'sin(12.0)')
432
- # Cos
433
- x = myokit.Cos(b)
434
- self.assertEqual(ws.ex(x), 'cosf(12.0f)')
435
- self.assertEqual(wd.ex(x), 'cos(12.0)')
436
- # Tan
437
- x = myokit.Tan(b)
438
- self.assertEqual(ws.ex(x), 'tanf(12.0f)')
439
- self.assertEqual(wd.ex(x), 'tan(12.0)')
440
- # ASin
441
- x = myokit.ASin(b)
442
- self.assertEqual(ws.ex(x), 'asinf(12.0f)')
443
- self.assertEqual(wd.ex(x), 'asin(12.0)')
444
- # ACos
445
- x = myokit.ACos(b)
446
- self.assertEqual(ws.ex(x), 'acosf(12.0f)')
447
- self.assertEqual(wd.ex(x), 'acos(12.0)')
448
- # ATan
449
- x = myokit.ATan(b)
450
- self.assertEqual(ws.ex(x), 'atanf(12.0f)')
451
- self.assertEqual(wd.ex(x), 'atan(12.0)')
452
-
453
- # Floor
454
- x = myokit.Floor(b)
455
- self.assertEqual(ws.ex(x), 'floorf(12.0f)')
456
- self.assertEqual(wd.ex(x), 'floor(12.0)')
457
- # Ceil
458
- x = myokit.Ceil(b)
459
- self.assertEqual(ws.ex(x), 'ceilf(12.0f)')
460
- self.assertEqual(wd.ex(x), 'ceil(12.0)')
461
- # Abs
462
- x = myokit.Abs(b)
463
- self.assertEqual(ws.ex(x), 'fabsf(12.0f)')
464
- self.assertEqual(wd.ex(x), 'fabs(12.0)')
465
-
466
- # Equal
467
- x = myokit.Equal(a, b)
468
- self.assertEqual(ws.ex(x), '(c.a == 12.0f)')
469
- self.assertEqual(wd.ex(x), '(c.a == 12.0)')
470
- # NotEqual
471
- x = myokit.NotEqual(a, b)
472
- self.assertEqual(ws.ex(x), '(c.a != 12.0f)')
473
- self.assertEqual(wd.ex(x), '(c.a != 12.0)')
474
- # More
475
- x = myokit.More(a, b)
476
- self.assertEqual(ws.ex(x), '(c.a > 12.0f)')
477
- self.assertEqual(wd.ex(x), '(c.a > 12.0)')
478
- # Less
479
- x = myokit.Less(a, b)
480
- self.assertEqual(ws.ex(x), '(c.a < 12.0f)')
481
- self.assertEqual(wd.ex(x), '(c.a < 12.0)')
482
- # MoreEqual
483
- x = myokit.MoreEqual(a, b)
484
- self.assertEqual(ws.ex(x), '(c.a >= 12.0f)')
485
- self.assertEqual(wd.ex(x), '(c.a >= 12.0)')
486
- # LessEqual
487
- x = myokit.LessEqual(a, b)
488
- self.assertEqual(ws.ex(x), '(c.a <= 12.0f)')
489
- self.assertEqual(wd.ex(x), '(c.a <= 12.0)')
490
-
491
- # Not
492
- cond1 = myokit.parse_expression('5 > 3')
493
- cond2 = myokit.parse_expression('2 < 1')
494
- x = myokit.Not(cond1)
495
- self.assertEqual(ws.ex(x), '!((5.0f > 3.0f))')
496
- self.assertEqual(wd.ex(x), '!((5.0 > 3.0))')
497
- # And
498
- x = myokit.And(cond1, cond2)
499
- self.assertEqual(ws.ex(x), '((5.0f > 3.0f) && (2.0f < 1.0f))')
500
- self.assertEqual(wd.ex(x), '((5.0 > 3.0) && (2.0 < 1.0))')
501
- # Or
502
- x = myokit.Or(cond1, cond2)
503
- self.assertEqual(ws.ex(x), '((5.0f > 3.0f) || (2.0f < 1.0f))')
504
- self.assertEqual(wd.ex(x), '((5.0 > 3.0) || (2.0 < 1.0))')
505
-
506
- # If
507
- x = myokit.If(cond1, a, b)
508
- self.assertEqual(ws.ex(x), '((5.0f > 3.0f) ? c.a : 12.0f)')
509
- self.assertEqual(wd.ex(x), '((5.0 > 3.0) ? c.a : 12.0)')
510
- # Piecewise
511
- c = myokit.Number(1)
512
- x = myokit.Piecewise(cond1, a, cond2, b, c)
513
- self.assertEqual(
514
- ws.ex(x),
515
- '((5.0f > 3.0f) ? c.a : ((2.0f < 1.0f) ? 12.0f : 1.0f))')
516
- self.assertEqual(
517
- wd.ex(x),
518
- '((5.0 > 3.0) ? c.a : ((2.0 < 1.0) ? 12.0 : 1.0))')
519
-
520
- # Test fetching using ewriter method
521
- w = myokit.formats.ewriter('cuda')
522
- self.assertIsInstance(w, myokit.formats.cuda.CudaExpressionWriter)
523
-
524
- # Test without a Myokit expression
525
- self.assertRaisesRegex(
526
- ValueError, 'Unknown expression type', w.ex, 7)
527
-
528
-
529
- class LatexExpressionWriterTest(unittest.TestCase):
530
- """ Test the Latex ewriter class. """
531
-
532
- def test_all(self):
533
- w = myokit.formats.latex.LatexExpressionWriter()
534
-
535
- model = myokit.Model()
536
- component = model.add_component('c')
537
- avar = component.add_variable('a')
538
-
539
- # Model needs to be validated --> sets unames
540
- avar.set_rhs(12)
541
- avar.set_binding('time')
542
- model.validate()
543
-
544
- # Name
545
- a = myokit.Name(avar)
546
- self.assertEqual(w.ex(a), '\\text{a}')
547
- # Number with unit
548
- b = myokit.Number('12', 'pF')
549
- self.assertEqual(w.ex(b), '12.0')
550
-
551
- # Prefix plus
552
- x = myokit.PrefixPlus(b)
553
- self.assertEqual(w.ex(x), '12.0')
554
- # Prefix minus
555
- x = myokit.PrefixMinus(b)
556
- self.assertEqual(w.ex(x), '\\left(-12.0\\right)')
557
- # Prefix minus with bracket
558
- x = myokit.PrefixMinus(myokit.Plus(a, b))
559
- self.assertEqual(
560
- w.ex(x), '\\left(-\\left(\\text{a}+12.0\\right)\\right)')
561
-
562
- # Plus
563
- x = myokit.Plus(a, b)
564
- self.assertEqual(w.ex(x), '\\text{a}+12.0')
565
- # Minus
566
- x = myokit.Minus(a, b)
567
- self.assertEqual(w.ex(x), '\\text{a}-12.0')
568
- # Multiply
569
- x = myokit.Multiply(a, b)
570
- self.assertEqual(w.ex(x), '\\text{a}*12.0')
571
- # Divide
572
- x = myokit.Divide(a, b)
573
- self.assertEqual(w.ex(x), '\\frac{\\text{a}}{12.0}')
574
-
575
- # Quotient
576
- # Not supported in latex!
577
- x = myokit.Quotient(a, b)
578
- self.assertEqual(
579
- w.ex(x), '\\left\\lfloor\\frac{\\text{a}}{12.0}\\right\\rfloor')
580
- # Remainder
581
- x = myokit.Remainder(a, b)
582
- self.assertEqual(w.ex(x), '\\bmod\\left(\\text{a},12.0\\right)')
583
-
584
- # Power
585
- x = myokit.Power(a, b)
586
- self.assertEqual(w.ex(x), '\\text{a}^{12.0}')
587
- # Power with brackets
588
- x = myokit.Power(myokit.Plus(a, b), b)
589
- self.assertEqual(w.ex(x), '\\left(\\text{a}+12.0\\right)^{12.0}')
590
- # Sqrt
591
- x = myokit.Sqrt(b)
592
- self.assertEqual(w.ex(x), '\\sqrt{12.0}')
593
- # Exp
594
- x = myokit.Exp(a)
595
- self.assertEqual(w.ex(x), '\\exp\\left(\\text{a}\\right)')
596
- # Log(a)
597
- x = myokit.Log(b)
598
- self.assertEqual(w.ex(x), '\\log\\left(12.0\\right)')
599
- # Log(a, b)
600
- x = myokit.Log(a, b)
601
- self.assertEqual(w.ex(x), '\\log_{12.0}\\left(\\text{a}\\right)')
602
- # Log10
603
- x = myokit.Log10(b)
604
- self.assertEqual(w.ex(x), '\\log_{10.0}\\left(12.0\\right)')
605
-
606
- # Sin
607
- x = myokit.Sin(b)
608
- self.assertEqual(w.ex(x), '\\sin\\left(12.0\\right)')
609
- # Cos
610
- x = myokit.Cos(b)
611
- self.assertEqual(w.ex(x), '\\cos\\left(12.0\\right)')
612
- # Tan
613
- x = myokit.Tan(b)
614
- self.assertEqual(w.ex(x), '\\tan\\left(12.0\\right)')
615
- # ASin
616
- x = myokit.ASin(b)
617
- self.assertEqual(w.ex(x), '\\arcsin\\left(12.0\\right)')
618
- # ACos
619
- x = myokit.ACos(b)
620
- self.assertEqual(w.ex(x), '\\arccos\\left(12.0\\right)')
621
- # ATan
622
- x = myokit.ATan(b)
623
- self.assertEqual(w.ex(x), '\\arctan\\left(12.0\\right)')
624
-
625
- # Floor
626
- x = myokit.Floor(b)
627
- self.assertEqual(w.ex(x), '\\left\\lfloor{12.0}\\right\\rfloor')
628
- # Ceil
629
- x = myokit.Ceil(b)
630
- self.assertEqual(w.ex(x), '\\left\\lceil{12.0}\\right\\rceil')
631
- # Abs
632
- x = myokit.Abs(b)
633
- self.assertEqual(w.ex(x), '\\lvert{12.0}\\rvert')
634
-
635
- # Equal
636
- x = myokit.Equal(a, b)
637
- self.assertEqual(w.ex(x), '\\left(\\text{a}=12.0\\right)')
638
- # NotEqual
639
- x = myokit.NotEqual(a, b)
640
- self.assertEqual(w.ex(x), '\\left(\\text{a}\\neq12.0\\right)')
641
- # More
642
- x = myokit.More(a, b)
643
- self.assertEqual(w.ex(x), '\\left(\\text{a}>12.0\\right)')
644
- # Less
645
- x = myokit.Less(a, b)
646
- self.assertEqual(w.ex(x), '\\left(\\text{a}<12.0\\right)')
647
- # MoreEqual
648
- x = myokit.MoreEqual(a, b)
649
- self.assertEqual(w.ex(x), '\\left(\\text{a}\\geq12.0\\right)')
650
- # LessEqual
651
- x = myokit.LessEqual(a, b)
652
- self.assertEqual(w.ex(x), '\\left(\\text{a}\\leq12.0\\right)')
653
-
654
- # Not
655
- cond1 = myokit.parse_expression('5 > 3')
656
- cond2 = myokit.parse_expression('2 < 1')
657
- x = myokit.Not(cond1)
658
- self.assertEqual(
659
- w.ex(x), '\\not\\left(\\left(5.0>3.0\\right)\\right)')
660
- # And
661
- x = myokit.And(cond1, cond2)
662
- self.assertEqual(
663
- w.ex(x),
664
- '\\left(\\left(5.0>3.0\\right)\\and'
665
- '\\left(2.0<1.0\\right)\\right)')
666
- # Or
667
- x = myokit.Or(cond1, cond2)
668
- self.assertEqual(
669
- w.ex(x),
670
- '\\left(\\left(5.0>3.0\\right)\\or'
671
- '\\left(2.0<1.0\\right)\\right)')
672
- # If
673
- x = myokit.If(cond1, a, b)
674
- self.assertEqual(
675
- w.ex(x), 'if\\left(\\left(5.0>3.0\\right),\\text{a},12.0\\right)')
676
- # Piecewise
677
- c = myokit.Number(1)
678
- x = myokit.Piecewise(cond1, a, cond2, b, c)
679
- self.assertEqual(
680
- w.ex(x),
681
- 'piecewise\\left(\\left(5.0>3.0\\right),\\text{a},'
682
- '\\left(2.0<1.0\\right),12.0,1.0\\right)')
683
-
684
- # Test fetching using ewriter method
685
- w = myokit.formats.ewriter('latex')
686
- self.assertIsInstance(w, myokit.formats.latex.LatexExpressionWriter)
687
-
688
- # Test without a Myokit expression
689
- self.assertRaisesRegex(
690
- ValueError, 'Unknown expression type', w.ex, 7)
691
-
692
-
693
- class MatlabExpressionWriterTest(unittest.TestCase):
694
- """ Test the Matlab ewriter class. """
695
-
696
- def test_all(self):
697
- w = myokit.formats.matlab.MatlabExpressionWriter()
698
-
699
- model = myokit.Model()
700
- component = model.add_component('c')
701
- avar = component.add_variable('a')
702
-
703
- # Name
704
- a = myokit.Name(avar)
705
- self.assertEqual(w.ex(a), 'c.a')
706
- # Number with unit
707
- b = myokit.Number('12', 'pF')
708
- self.assertEqual(w.ex(b), '12.0')
709
-
710
- # Prefix plus
711
- x = myokit.PrefixPlus(b)
712
- self.assertEqual(w.ex(x), '12.0')
713
- # Prefix minus
714
- x = myokit.PrefixMinus(b)
715
- self.assertEqual(w.ex(x), '(-12.0)')
716
-
717
- # Plus
718
- x = myokit.Plus(a, b)
719
- self.assertEqual(w.ex(x), 'c.a + 12.0')
720
- # Minus
721
- x = myokit.Minus(a, b)
722
- self.assertEqual(w.ex(x), 'c.a - 12.0')
723
- # Multiply
724
- x = myokit.Multiply(a, b)
725
- self.assertEqual(w.ex(x), 'c.a * 12.0')
726
- # Divide
727
- x = myokit.Divide(a, b)
728
- self.assertEqual(w.ex(x), 'c.a / 12.0')
729
-
730
- # Quotient
731
-
732
- x = myokit.Quotient(a, b)
733
- self.assertEqual(w.ex(x), 'floor(c.a / 12.0)')
734
- # Remainder
735
- x = myokit.Remainder(a, b)
736
- self.assertEqual(w.ex(x), 'mod(c.a, 12.0)')
737
-
738
- # Power
739
- x = myokit.Power(a, b)
740
- self.assertEqual(w.ex(x), 'c.a ^ 12.0')
741
- # Sqrt
742
- x = myokit.Sqrt(b)
743
- self.assertEqual(w.ex(x), 'sqrt(12.0)')
744
- # Exp
745
- x = myokit.Exp(a)
746
- self.assertEqual(w.ex(x), 'exp(c.a)')
747
- # Log(a)
748
- x = myokit.Log(b)
749
- self.assertEqual(w.ex(x), 'log(12.0)')
750
- # Log(a, b)
751
- x = myokit.Log(a, b)
752
- self.assertEqual(w.ex(x), '(log(c.a) / log(12.0))')
753
- # Log10
754
- x = myokit.Log10(b)
755
- self.assertEqual(w.ex(x), 'log10(12.0)')
756
-
757
- # Sin
758
- x = myokit.Sin(b)
759
- self.assertEqual(w.ex(x), 'sin(12.0)')
760
- # Cos
761
- x = myokit.Cos(b)
762
- self.assertEqual(w.ex(x), 'cos(12.0)')
763
- # Tan
764
- x = myokit.Tan(b)
765
- self.assertEqual(w.ex(x), 'tan(12.0)')
766
- # ASin
767
- x = myokit.ASin(b)
768
- self.assertEqual(w.ex(x), 'asin(12.0)')
769
- # ACos
770
- x = myokit.ACos(b)
771
- self.assertEqual(w.ex(x), 'acos(12.0)')
772
- # ATan
773
- x = myokit.ATan(b)
774
- self.assertEqual(w.ex(x), 'atan(12.0)')
775
-
776
- # Floor
777
- x = myokit.Floor(b)
778
- self.assertEqual(w.ex(x), 'floor(12.0)')
779
- # Ceil
780
- x = myokit.Ceil(b)
781
- self.assertEqual(w.ex(x), 'ceil(12.0)')
782
- # Abs
783
- x = myokit.Abs(b)
784
- self.assertEqual(w.ex(x), 'abs(12.0)')
785
-
786
- # Equal
787
- x = myokit.Equal(a, b)
788
- self.assertEqual(w.ex(x), '(c.a == 12.0)')
789
- # NotEqual
790
- x = myokit.NotEqual(a, b)
791
- self.assertEqual(w.ex(x), '(c.a != 12.0)')
792
- # More
793
- x = myokit.More(a, b)
794
- self.assertEqual(w.ex(x), '(c.a > 12.0)')
795
- # Less
796
- x = myokit.Less(a, b)
797
- self.assertEqual(w.ex(x), '(c.a < 12.0)')
798
- # MoreEqual
799
- x = myokit.MoreEqual(a, b)
800
- self.assertEqual(w.ex(x), '(c.a >= 12.0)')
801
- # LessEqual
802
- x = myokit.LessEqual(a, b)
803
- self.assertEqual(w.ex(x), '(c.a <= 12.0)')
804
-
805
- # Not
806
- cond1 = myokit.parse_expression('5 > 3')
807
- cond2 = myokit.parse_expression('2 < 1')
808
- x = myokit.Not(cond1)
809
- self.assertEqual(w.ex(x), '!((5.0 > 3.0))')
810
- # And
811
- x = myokit.And(cond1, cond2)
812
- self.assertEqual(w.ex(x), '((5.0 > 3.0) && (2.0 < 1.0))')
813
- # Or
814
- x = myokit.Or(cond1, cond2)
815
- self.assertEqual(w.ex(x), '((5.0 > 3.0) || (2.0 < 1.0))')
816
-
817
- # If (custom function)
818
- x = myokit.If(cond1, a, b)
819
- self.assertEqual(w.ex(x), 'ifthenelse((5.0 > 3.0), c.a, 12.0)')
820
- # Piecewise
821
- c = myokit.Number(1)
822
- x = myokit.Piecewise(cond1, a, cond2, b, c)
823
- self.assertEqual(
824
- w.ex(x),
825
- 'ifthenelse((5.0 > 3.0), c.a, ifthenelse((2.0 < 1.0), 12.0, 1.0))')
826
-
827
- # Test fetching using ewriter method
828
- w = myokit.formats.ewriter('matlab')
829
- self.assertIsInstance(w, myokit.formats.matlab.MatlabExpressionWriter)
830
-
831
- # Test without a Myokit expression
832
- self.assertRaisesRegex(
833
- ValueError, 'Unknown expression type', w.ex, 7)
834
-
835
-
836
- class NumPyExpressionWriterTest(unittest.TestCase):
837
- """ Test the NumPy ewriter class. """
838
-
839
- def test_all(self):
840
- w = myokit.formats.python.NumPyExpressionWriter()
841
-
842
- model = myokit.Model()
843
- component = model.add_component('c')
844
- avar = component.add_variable('a')
845
-
846
- # Name
847
- a = myokit.Name(avar)
848
- self.assertEqual(w.ex(a), 'c.a')
849
- # Number with unit
850
- b = myokit.Number('12', 'pF')
851
- self.assertEqual(w.ex(b), '12.0')
852
-
853
- # Prefix plus
854
- x = myokit.PrefixPlus(b)
855
- self.assertEqual(w.ex(x), '12.0')
856
- # Prefix minus
857
- x = myokit.PrefixMinus(b)
858
- self.assertEqual(w.ex(x), '(-12.0)')
859
-
860
- # Plus
861
- x = myokit.Plus(a, b)
862
- self.assertEqual(w.ex(x), 'c.a + 12.0')
863
- # Minus
864
- x = myokit.Minus(a, b)
865
- self.assertEqual(w.ex(x), 'c.a - 12.0')
866
- # Multiply
867
- x = myokit.Multiply(a, b)
868
- self.assertEqual(w.ex(x), 'c.a * 12.0')
869
- # Divide
870
- x = myokit.Divide(a, b)
871
- self.assertEqual(w.ex(x), 'c.a / 12.0')
872
-
873
- # Quotient
874
- x = myokit.Quotient(a, b)
875
- self.assertEqual(w.ex(x), 'c.a // 12.0')
876
- # Remainder
877
- x = myokit.Remainder(a, b)
878
- self.assertEqual(w.ex(x), 'c.a % 12.0')
879
-
880
- # Power
881
- x = myokit.Power(a, b)
882
- self.assertEqual(w.ex(x), 'c.a ** 12.0')
883
- # Sqrt
884
- x = myokit.Sqrt(b)
885
- self.assertEqual(w.ex(x), 'numpy.sqrt(12.0)')
886
- # Exp
887
- x = myokit.Exp(a)
888
- self.assertEqual(w.ex(x), 'numpy.exp(c.a)')
889
- # Log(a)
890
- x = myokit.Log(b)
891
- self.assertEqual(w.ex(x), 'numpy.log(12.0)')
892
- # Log(a, b)
893
- x = myokit.Log(a, b)
894
- self.assertEqual(w.ex(x), 'numpy.log(c.a, 12.0)')
895
- # Log10
896
- x = myokit.Log10(b)
897
- self.assertEqual(w.ex(x), 'numpy.log10(12.0)')
898
-
899
- # Sin
900
- x = myokit.Sin(b)
901
- self.assertEqual(w.ex(x), 'numpy.sin(12.0)')
902
- # Cos
903
- x = myokit.Cos(b)
904
- self.assertEqual(w.ex(x), 'numpy.cos(12.0)')
905
- # Tan
906
- x = myokit.Tan(b)
907
- self.assertEqual(w.ex(x), 'numpy.tan(12.0)')
908
- # ASin
909
- x = myokit.ASin(b)
910
- self.assertEqual(w.ex(x), 'numpy.arcsin(12.0)')
911
- # ACos
912
- x = myokit.ACos(b)
913
- self.assertEqual(w.ex(x), 'numpy.arccos(12.0)')
914
- # ATan
915
- x = myokit.ATan(b)
916
- self.assertEqual(w.ex(x), 'numpy.arctan(12.0)')
917
-
918
- # Floor
919
- x = myokit.Floor(b)
920
- self.assertEqual(w.ex(x), 'numpy.floor(12.0)')
921
- # Ceil
922
- x = myokit.Ceil(b)
923
- self.assertEqual(w.ex(x), 'numpy.ceil(12.0)')
924
- # Abs
925
- x = myokit.Abs(b)
926
- self.assertEqual(w.ex(x), 'abs(12.0)')
927
-
928
- # Equal
929
- x = myokit.Equal(a, b)
930
- self.assertEqual(w.ex(x), '(c.a == 12.0)')
931
- # NotEqual
932
- x = myokit.NotEqual(a, b)
933
- self.assertEqual(w.ex(x), '(c.a != 12.0)')
934
- # More
935
- x = myokit.More(a, b)
936
- self.assertEqual(w.ex(x), '(c.a > 12.0)')
937
- # Less
938
- x = myokit.Less(a, b)
939
- self.assertEqual(w.ex(x), '(c.a < 12.0)')
940
- # MoreEqual
941
- x = myokit.MoreEqual(a, b)
942
- self.assertEqual(w.ex(x), '(c.a >= 12.0)')
943
- # LessEqual
944
- x = myokit.LessEqual(a, b)
945
- self.assertEqual(w.ex(x), '(c.a <= 12.0)')
946
-
947
- # Not
948
- cond1 = myokit.parse_expression('5 > 3')
949
- cond2 = myokit.parse_expression('2 < 1')
950
- x = myokit.Not(cond1)
951
- self.assertEqual(w.ex(x), 'not ((5.0 > 3.0))')
952
- # And
953
- x = myokit.And(cond1, cond2)
954
- self.assertEqual(w.ex(x), '((5.0 > 3.0) and (2.0 < 1.0))')
955
- # Or
956
- x = myokit.Or(cond1, cond2)
957
- self.assertEqual(w.ex(x), '((5.0 > 3.0) or (2.0 < 1.0))')
958
-
959
- # If
960
- x = myokit.If(cond1, a, b)
961
- self.assertEqual(
962
- w.ex(x), 'numpy.select([(5.0 > 3.0)], [c.a], 12.0)')
963
- # Piecewise
964
- c = myokit.Number(1)
965
- x = myokit.Piecewise(cond1, a, cond2, b, c)
966
- self.assertEqual(
967
- w.ex(x),
968
- 'numpy.select([(5.0 > 3.0), (2.0 < 1.0)], [c.a, 12.0], 1.0)')
969
-
970
- # Test fetching using ewriter method
971
- w = myokit.formats.ewriter('numpy')
972
- self.assertIsInstance(w, myokit.formats.python.NumPyExpressionWriter)
973
-
974
- # Test without a Myokit expression
975
- self.assertRaisesRegex(
976
- ValueError, 'Unknown expression type', w.ex, 7)
977
-
978
-
979
- class PythonExpressionWriterTest(unittest.TestCase):
980
- """ Test the Python ewriter class. """
981
-
982
- def test_all(self):
983
- w = myokit.formats.python.PythonExpressionWriter()
984
-
985
- model = myokit.Model()
986
- component = model.add_component('c')
987
- avar = component.add_variable('a')
988
-
989
- # Name
990
- a = myokit.Name(avar)
991
- self.assertEqual(w.ex(a), 'c.a')
992
- # Derivative
993
- x = myokit.Derivative(a)
994
- self.assertEqual(w.ex(x), 'dot(c.a)')
995
- # Partial derivative
996
- x = myokit.PartialDerivative(a, a)
997
- self.assertEqual(w.ex(x), 'diff(c.a, c.a)')
998
- # Initial value
999
- x = myokit.InitialValue(a)
1000
- self.assertEqual(w.ex(x), 'init(c.a)')
1001
-
1002
- # Number
1003
- b = myokit.Number(3)
1004
- self.assertEqual(w.ex(b), '3.0')
1005
- # Number with unit
1006
- b = myokit.Number(12, 'pF')
1007
- self.assertEqual(w.ex(b), '12.0')
1008
-
1009
- # Prefix plus
1010
- x = myokit.PrefixPlus(b)
1011
- self.assertEqual(w.ex(x), '12.0')
1012
- # Prefix minus
1013
- x = myokit.PrefixMinus(b)
1014
- self.assertEqual(w.ex(x), '(-12.0)')
1015
-
1016
- # Plus
1017
- x = myokit.Plus(a, b)
1018
- self.assertEqual(w.ex(x), 'c.a + 12.0')
1019
- # Minus
1020
- x = myokit.Minus(a, b)
1021
- self.assertEqual(w.ex(x), 'c.a - 12.0')
1022
- # Multiply
1023
- x = myokit.Multiply(a, b)
1024
- self.assertEqual(w.ex(x), 'c.a * 12.0')
1025
- # Divide
1026
- x = myokit.Divide(a, b)
1027
- self.assertEqual(w.ex(x), 'c.a / 12.0')
1028
-
1029
- # Quotient
1030
- x = myokit.Quotient(a, b)
1031
- self.assertEqual(w.ex(x), 'c.a // 12.0')
1032
- # Remainder
1033
- x = myokit.Remainder(a, b)
1034
- self.assertEqual(w.ex(x), 'c.a % 12.0')
1035
-
1036
- # Power
1037
- x = myokit.Power(a, b)
1038
- self.assertEqual(w.ex(x), 'c.a ** 12.0')
1039
- # Sqrt
1040
- x = myokit.Sqrt(b)
1041
- self.assertEqual(w.ex(x), 'math.sqrt(12.0)')
1042
- # Exp
1043
- x = myokit.Exp(a)
1044
- self.assertEqual(w.ex(x), 'math.exp(c.a)')
1045
- # Log(a)
1046
- x = myokit.Log(b)
1047
- self.assertEqual(w.ex(x), 'math.log(12.0)')
1048
- # Log(a, b)
1049
- x = myokit.Log(a, b)
1050
- self.assertEqual(w.ex(x), 'math.log(c.a, 12.0)')
1051
- # Log10
1052
- x = myokit.Log10(b)
1053
- self.assertEqual(w.ex(x), 'math.log10(12.0)')
1054
-
1055
- # Sin
1056
- x = myokit.Sin(b)
1057
- self.assertEqual(w.ex(x), 'math.sin(12.0)')
1058
- # Cos
1059
- x = myokit.Cos(b)
1060
- self.assertEqual(w.ex(x), 'math.cos(12.0)')
1061
- # Tan
1062
- x = myokit.Tan(b)
1063
- self.assertEqual(w.ex(x), 'math.tan(12.0)')
1064
- # ASin
1065
- x = myokit.ASin(b)
1066
- self.assertEqual(w.ex(x), 'math.asin(12.0)')
1067
- # ACos
1068
- x = myokit.ACos(b)
1069
- self.assertEqual(w.ex(x), 'math.acos(12.0)')
1070
- # ATan
1071
- x = myokit.ATan(b)
1072
- self.assertEqual(w.ex(x), 'math.atan(12.0)')
1073
-
1074
- # Floor
1075
- x = myokit.Floor(b)
1076
- self.assertEqual(w.ex(x), 'math.floor(12.0)')
1077
- # Ceil
1078
- x = myokit.Ceil(b)
1079
- self.assertEqual(w.ex(x), 'math.ceil(12.0)')
1080
- # Abs
1081
- x = myokit.Abs(b)
1082
- self.assertEqual(w.ex(x), 'abs(12.0)')
1083
-
1084
- # Equal
1085
- x = myokit.Equal(a, b)
1086
- self.assertEqual(w.ex(x), '(c.a == 12.0)')
1087
- # NotEqual
1088
- x = myokit.NotEqual(a, b)
1089
- self.assertEqual(w.ex(x), '(c.a != 12.0)')
1090
- # More
1091
- x = myokit.More(a, b)
1092
- self.assertEqual(w.ex(x), '(c.a > 12.0)')
1093
- # Less
1094
- x = myokit.Less(a, b)
1095
- self.assertEqual(w.ex(x), '(c.a < 12.0)')
1096
- # MoreEqual
1097
- x = myokit.MoreEqual(a, b)
1098
- self.assertEqual(w.ex(x), '(c.a >= 12.0)')
1099
- # LessEqual
1100
- x = myokit.LessEqual(a, b)
1101
- self.assertEqual(w.ex(x), '(c.a <= 12.0)')
1102
-
1103
- # Not
1104
- cond1 = myokit.parse_expression('5 > 3')
1105
- cond2 = myokit.parse_expression('2 < 1')
1106
- x = myokit.Not(cond1)
1107
- self.assertEqual(w.ex(x), 'not ((5.0 > 3.0))')
1108
- # And
1109
- x = myokit.And(cond1, cond2)
1110
- self.assertEqual(w.ex(x), '((5.0 > 3.0) and (2.0 < 1.0))')
1111
- # Or
1112
- x = myokit.Or(cond1, cond2)
1113
- self.assertEqual(w.ex(x), '((5.0 > 3.0) or (2.0 < 1.0))')
1114
-
1115
- # If
1116
- x = myokit.If(cond1, a, b)
1117
- self.assertEqual(w.ex(x), '(c.a if (5.0 > 3.0) else 12.0)')
1118
- # Piecewise
1119
- c = myokit.Number(1)
1120
- x = myokit.Piecewise(cond1, a, cond2, b, c)
1121
- self.assertEqual(
1122
- w.ex(x),
1123
- '(c.a if (5.0 > 3.0) else (12.0 if (2.0 < 1.0) else 1.0))')
1124
-
1125
- # Test fetching using ewriter method
1126
- w = myokit.formats.ewriter('python')
1127
- self.assertIsInstance(w, myokit.formats.python.PythonExpressionWriter)
1128
-
1129
- # Test lhs method
1130
- w.set_lhs_function(lambda x: 'sheep')
1131
- self.assertEqual(w.ex(a), 'sheep')
1132
-
1133
- # Test without a Myokit expression
1134
- self.assertRaisesRegex(
1135
- ValueError, 'Unknown expression type', w.ex, 7)
1136
-
1137
-
1138
- class StanExpressionWriterTest(unittest.TestCase):
1139
- """ Test the Stan ewriter class. """
1140
-
1141
- def test_all(self):
1142
- w = myokit.formats.stan.StanExpressionWriter()
1143
-
1144
- model = myokit.Model()
1145
- component = model.add_component('c')
1146
- avar = component.add_variable('a')
1147
-
1148
- # Name
1149
- a = myokit.Name(avar)
1150
- self.assertEqual(w.ex(a), 'c.a')
1151
- # Number with unit
1152
- b = myokit.Number('12', 'pF')
1153
- self.assertEqual(w.ex(b), '12.0')
1154
-
1155
- # Prefix plus
1156
- x = myokit.PrefixPlus(b)
1157
- self.assertEqual(w.ex(x), '12.0')
1158
- # Prefix minus
1159
- x = myokit.PrefixMinus(b)
1160
- self.assertEqual(w.ex(x), '(-12.0)')
1161
-
1162
- # Plus
1163
- x = myokit.Plus(a, b)
1164
- self.assertEqual(w.ex(x), 'c.a + 12.0')
1165
- # Minus
1166
- x = myokit.Minus(a, b)
1167
- self.assertEqual(w.ex(x), 'c.a - 12.0')
1168
- # Multiply
1169
- x = myokit.Multiply(a, b)
1170
- self.assertEqual(w.ex(x), 'c.a * 12.0')
1171
- # Divide
1172
- x = myokit.Divide(a, b)
1173
- self.assertEqual(w.ex(x), 'c.a / 12.0')
1174
-
1175
- # Quotient
1176
- x = myokit.Quotient(a, b)
1177
- self.assertEqual(w.ex(x), 'floor(c.a / 12.0)')
1178
- # Remainder
1179
- x = myokit.Remainder(a, b)
1180
- self.assertEqual(w.ex(x), 'fmod(c.a, 12.0)')
1181
-
1182
- # Power
1183
- x = myokit.Power(a, b)
1184
- self.assertEqual(w.ex(x), 'c.a ^ 12.0')
1185
- # Sqrt
1186
- x = myokit.Sqrt(b)
1187
- self.assertEqual(w.ex(x), 'sqrt(12.0)')
1188
- # Exp
1189
- x = myokit.Exp(a)
1190
- self.assertEqual(w.ex(x), 'exp(c.a)')
1191
- # Log(a)
1192
- x = myokit.Log(b)
1193
- self.assertEqual(w.ex(x), 'log(12.0)')
1194
- # Log(a, b)
1195
- x = myokit.Log(a, b)
1196
- self.assertEqual(w.ex(x), '(log(c.a) / log(12.0))')
1197
- # Log10
1198
- x = myokit.Log10(b)
1199
- self.assertEqual(w.ex(x), 'log10(12.0)')
1200
-
1201
- # Sin
1202
- x = myokit.Sin(b)
1203
- self.assertEqual(w.ex(x), 'sin(12.0)')
1204
- # Cos
1205
- x = myokit.Cos(b)
1206
- self.assertEqual(w.ex(x), 'cos(12.0)')
1207
- # Tan
1208
- x = myokit.Tan(b)
1209
- self.assertEqual(w.ex(x), 'tan(12.0)')
1210
- # ASin
1211
- x = myokit.ASin(b)
1212
- self.assertEqual(w.ex(x), 'asin(12.0)')
1213
- # ACos
1214
- x = myokit.ACos(b)
1215
- self.assertEqual(w.ex(x), 'acos(12.0)')
1216
- # ATan
1217
- x = myokit.ATan(b)
1218
- self.assertEqual(w.ex(x), 'atan(12.0)')
1219
-
1220
- # Floor
1221
- x = myokit.Floor(b)
1222
- self.assertEqual(w.ex(x), 'floor(12.0)')
1223
- # Ceil
1224
- x = myokit.Ceil(b)
1225
- self.assertEqual(w.ex(x), 'ceil(12.0)')
1226
- # Abs
1227
- x = myokit.Abs(b)
1228
- self.assertEqual(w.ex(x), 'abs(12.0)')
1229
-
1230
- # Equal
1231
- x = myokit.Equal(a, b)
1232
- self.assertEqual(w.ex(x), '(c.a == 12.0)')
1233
- # NotEqual
1234
- x = myokit.NotEqual(a, b)
1235
- self.assertEqual(w.ex(x), '(c.a != 12.0)')
1236
- # More
1237
- x = myokit.More(a, b)
1238
- self.assertEqual(w.ex(x), '(c.a > 12.0)')
1239
- # Less
1240
- x = myokit.Less(a, b)
1241
- self.assertEqual(w.ex(x), '(c.a < 12.0)')
1242
- # MoreEqual
1243
- x = myokit.MoreEqual(a, b)
1244
- self.assertEqual(w.ex(x), '(c.a >= 12.0)')
1245
- # LessEqual
1246
- x = myokit.LessEqual(a, b)
1247
- self.assertEqual(w.ex(x), '(c.a <= 12.0)')
1248
-
1249
- # Not
1250
- cond1 = myokit.parse_expression('5 > 3')
1251
- cond2 = myokit.parse_expression('2 < 1')
1252
- x = myokit.Not(cond1)
1253
- self.assertEqual(w.ex(x), '!((5.0 > 3.0))')
1254
- # And
1255
- x = myokit.And(cond1, cond2)
1256
- self.assertEqual(w.ex(x), '((5.0 > 3.0) && (2.0 < 1.0))')
1257
- # Or
1258
- x = myokit.Or(cond1, cond2)
1259
- self.assertEqual(w.ex(x), '((5.0 > 3.0) || (2.0 < 1.0))')
1260
-
1261
- # If
1262
- x = myokit.If(cond1, a, b)
1263
- self.assertEqual(w.ex(x), '((5.0 > 3.0) ? c.a : 12.0)')
1264
- # Piecewise
1265
- c = myokit.Number(1)
1266
- x = myokit.Piecewise(cond1, a, cond2, b, c)
1267
- self.assertEqual(
1268
- w.ex(x),
1269
- '((5.0 > 3.0) ? c.a : ((2.0 < 1.0) ? 12.0 : 1.0))')
1270
-
1271
- # Test fetching using ewriter method
1272
- w = myokit.formats.ewriter('stan')
1273
- self.assertIsInstance(w, myokit.formats.stan.StanExpressionWriter)
1274
-
1275
- # Test without a Myokit expression
1276
- self.assertRaisesRegex(
1277
- ValueError, 'Unknown expression type', w.ex, 7)
1278
-
1279
-
1280
- if __name__ == '__main__':
1281
- unittest.main()