pypharm 1.5.2__tar.gz → 1.6.1__tar.gz
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.
- {pypharm-1.5.2 → pypharm-1.6.1}/PKG-INFO +697 -695
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/__init__.py +3 -3
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/algorithms/country_optimization.py +469 -469
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/algorithms/country_optimization_v2.py +330 -330
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/algorithms/country_optimization_v3.py +428 -428
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/algorithms/genetic_optimization.py +130 -130
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/algorithms/gold_digger_optimization.py +126 -126
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/constants.py +80 -80
- pypharm-1.6.1/PyPharm/models/__init__.py +3 -0
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/models/compartment_models.py +985 -639
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/models/pbpk.py +683 -672
- {pypharm-1.5.2 → pypharm-1.6.1}/README.md +677 -677
- {pypharm-1.5.2 → pypharm-1.6.1}/pypharm.egg-info/PKG-INFO +697 -695
- {pypharm-1.5.2 → pypharm-1.6.1}/setup.cfg +4 -4
- {pypharm-1.5.2 → pypharm-1.6.1}/setup.py +28 -28
- pypharm-1.5.2/PyPharm/models/__init__.py +0 -2
- {pypharm-1.5.2 → pypharm-1.6.1}/PyPharm/algorithms/__init__.py +0 -0
- {pypharm-1.5.2 → pypharm-1.6.1}/pypharm.egg-info/SOURCES.txt +0 -0
- {pypharm-1.5.2 → pypharm-1.6.1}/pypharm.egg-info/dependency_links.txt +0 -0
- {pypharm-1.5.2 → pypharm-1.6.1}/pypharm.egg-info/requires.txt +0 -0
- {pypharm-1.5.2 → pypharm-1.6.1}/pypharm.egg-info/top_level.txt +0 -0
|
@@ -1,695 +1,697 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: pypharm
|
|
3
|
-
Version: 1.
|
|
4
|
-
Summary: Module for solving pharmacokinetic problems
|
|
5
|
-
Home-page: https://github.com/Krash13/PyPharm
|
|
6
|
-
Author: Krash13
|
|
7
|
-
Author-email: krasheninnikov.r.s@muctr.ru
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Classifier:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Requires-
|
|
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
|
-
B--'
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
[0,
|
|
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
|
-
[0,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
в
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
из
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
ORGAN_NAMES.LIVER:
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
ORGAN_NAMES.
|
|
329
|
-
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
330
|
-
'y': [
|
|
331
|
-
},
|
|
332
|
-
ORGAN_NAMES.
|
|
333
|
-
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
334
|
-
'y': [
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
B--'
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
[0,
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
[0,
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
```
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
```
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
ORGAN_NAMES.LIVER:
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
ORGAN_NAMES.
|
|
670
|
-
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
671
|
-
'y': [
|
|
672
|
-
},
|
|
673
|
-
ORGAN_NAMES.
|
|
674
|
-
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
675
|
-
'y': [
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: pypharm
|
|
3
|
+
Version: 1.6.1
|
|
4
|
+
Summary: Module for solving pharmacokinetic problems
|
|
5
|
+
Home-page: https://github.com/Krash13/PyPharm
|
|
6
|
+
Author: Krash13
|
|
7
|
+
Author-email: krasheninnikov.r.s@muctr.ru
|
|
8
|
+
Keywords: pharmacokinetics compartment-model
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
10
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Requires-Python: >=3.9
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Requires-Dist: numpy>=1.22.1
|
|
15
|
+
Requires-Dist: scipy<=1.13.0
|
|
16
|
+
Requires-Dist: numba>=0.58.1
|
|
17
|
+
Requires-Dist: matplotlib>=3.5.1
|
|
18
|
+
Requires-Dist: graycode>=1.0.5
|
|
19
|
+
Requires-Dist: numbalsoda>=0.3.4
|
|
20
|
+
|
|
21
|
+
PyPharm
|
|
22
|
+
----------
|
|
23
|
+
**1) Установка пакета**
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
pip install pypharm
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**2) Пример использования пакета для модели, где все параметры известны**
|
|
30
|
+
|
|
31
|
+
Задана двухкамерная модель такого вида
|
|
32
|
+
|
|
33
|
+
```mermaid
|
|
34
|
+
graph LR
|
|
35
|
+
D((Доза D)) --> V1[Камера V1]
|
|
36
|
+
V1 -- k12 --> V2[Камера V2]
|
|
37
|
+
V2 -- k21 --> V1
|
|
38
|
+
V1 -- k10 --> Out(Выведение)
|
|
39
|
+
```
|
|
40
|
+
При этом, нам известны параметры модели
|
|
41
|
+
| V1|V2 |k12 |K21 | K10
|
|
42
|
+
|--|--|--|--|--|
|
|
43
|
+
| 228| 629 |0.4586|0.1919|0.0309
|
|
44
|
+
|
|
45
|
+
Создание и расчет модели при помощи пакета PyPharm
|
|
46
|
+
```python
|
|
47
|
+
from PyPharm import BaseCompartmentModel
|
|
48
|
+
|
|
49
|
+
model = BaseCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629])
|
|
50
|
+
|
|
51
|
+
res = model(90, d=5700, compartment_number=0)
|
|
52
|
+
```
|
|
53
|
+
res - Результат работы решателя scipy solve_iv
|
|
54
|
+
|
|
55
|
+
**3) Пример использования пакета для модели, где все параметры неизвестны**
|
|
56
|
+
|
|
57
|
+
Задана многокамерная модель такого вида
|
|
58
|
+
|
|
59
|
+
```mermaid
|
|
60
|
+
graph LR
|
|
61
|
+
Br(Мозг) --'Kbr-'--> Is[Межклетачное пространство]
|
|
62
|
+
Is --'Kbr+'-->Br
|
|
63
|
+
Is--'Kis-'-->B(Кровь)
|
|
64
|
+
B--'Kis+'-->Is
|
|
65
|
+
B--'Ke'-->Out1((Выведение))
|
|
66
|
+
B--'Ki+'-->I(Печень)
|
|
67
|
+
I--'Ki-'-->Out2((Выведение))
|
|
68
|
+
B--'Kh+'-->H(Сердце)
|
|
69
|
+
H--'Kh-'-->B
|
|
70
|
+
```
|
|
71
|
+
При этом, известен лишь параметр Ke=0.077
|
|
72
|
+
|
|
73
|
+
Создание и расчет модели при помощи пакета PyPharm, используя метод minimize:
|
|
74
|
+
```python
|
|
75
|
+
from PyPharm import BaseCompartmentModel
|
|
76
|
+
import numpy as np
|
|
77
|
+
matrix = [[0, None, 0, 0, 0],
|
|
78
|
+
[None, 0, None, 0, 0],
|
|
79
|
+
[0, None, 0, None, None],
|
|
80
|
+
[0, 0, 0, 0, 0],
|
|
81
|
+
[0, 0, None, 0, 0]]
|
|
82
|
+
outputs = [0, 0, 0.077, None, 0]
|
|
83
|
+
|
|
84
|
+
model = BaseCompartmentModel(matrix, outputs)
|
|
85
|
+
|
|
86
|
+
model.load_optimization_data(
|
|
87
|
+
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
88
|
+
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
89
|
+
know_compartments=[0, 3, 4],
|
|
90
|
+
c0=[0, 0, 20000, 0, 0]
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
x_min = [1.5, 0.01, 0.5, 0.0001, 0.1, 0.1, 4, 3]
|
|
94
|
+
x_max = [2.5, 0.7, 1.5, 0.05, 0.5, 0.5, 7, 5]
|
|
95
|
+
x0 = np.random.uniform(x_min, x_max)
|
|
96
|
+
bounds = ((1.5, 2.5), (0.01, 0.7), (0.5, 1.5), (0.0001, 0.05), (0.1, 0.5), (0.1, 0.5), (4, 7), (3, 5))
|
|
97
|
+
|
|
98
|
+
model.optimize(
|
|
99
|
+
bounds=bounds,
|
|
100
|
+
x0=x0,
|
|
101
|
+
options={'disp': True}
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
print(model.configuration_matrix)
|
|
105
|
+
```
|
|
106
|
+
Или же при помощи алгоритма взаимодействующих стран
|
|
107
|
+
```python
|
|
108
|
+
from PyPharm import BaseCompartmentModel
|
|
109
|
+
import numpy as np
|
|
110
|
+
matrix = [[0, None, 0, 0, 0],
|
|
111
|
+
[None, 0, None, 0, 0],
|
|
112
|
+
[0, None, 0, None, None],
|
|
113
|
+
[0, 0, 0, 0, 0],
|
|
114
|
+
[0, 0, None, 0, 0]]
|
|
115
|
+
outputs = [0, 0, 0.077, None, 0]
|
|
116
|
+
|
|
117
|
+
model = BaseCompartmentModel(matrix, outputs)
|
|
118
|
+
|
|
119
|
+
model.load_optimization_data(
|
|
120
|
+
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
121
|
+
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
122
|
+
know_compartments=[0, 3, 4],
|
|
123
|
+
c0=[0, 0, 20000, 0, 0]
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
model.optimize(
|
|
127
|
+
method='country_optimization',
|
|
128
|
+
Xmin=[0.5, 0.001, 0.001, 0.00001, 0.01, 0.01, 1, 1],
|
|
129
|
+
Xmax=[5, 2, 2.5, 0.3, 1, 1, 10, 10],
|
|
130
|
+
M=10,
|
|
131
|
+
N=25,
|
|
132
|
+
n=[1, 10],
|
|
133
|
+
p=[0.00001, 2],
|
|
134
|
+
m=[1, 8],
|
|
135
|
+
k=8,
|
|
136
|
+
l=3,
|
|
137
|
+
ep=[0.2, 0.4],
|
|
138
|
+
tmax=300,
|
|
139
|
+
printing=True,
|
|
140
|
+
)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
При оптимизации, вектор неизвестных это
|
|
144
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные)]
|
|
145
|
+
|
|
146
|
+
Кроме того, вы можете использовать генетический алгоритм:
|
|
147
|
+
```python
|
|
148
|
+
model.optimize(
|
|
149
|
+
method='GA',
|
|
150
|
+
x_min=[0.00001, 0.001, 0.01, 1, 1],
|
|
151
|
+
x_max=[1, 2, 1, 10, 3],
|
|
152
|
+
genes=[16, 17, 16, 20, 16],
|
|
153
|
+
n=100,
|
|
154
|
+
child_percent=0.3,
|
|
155
|
+
mutation_chance=0.5,
|
|
156
|
+
max_mutation=5,
|
|
157
|
+
t_max=300,
|
|
158
|
+
max_step=0.5,
|
|
159
|
+
printing=True,
|
|
160
|
+
)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Вы даже можете использовать свой собственный алгоритм, если это необходимо
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
# CountriesAlgorithm - ваш класс алгоритма
|
|
167
|
+
# start - функция запуска алгоритма
|
|
168
|
+
# важно, чтобы ваша функция запуска возвращала numpy.array
|
|
169
|
+
|
|
170
|
+
model.optimize(
|
|
171
|
+
user_method=CountriesAlgorithm,
|
|
172
|
+
method_is_func=False,
|
|
173
|
+
optimization_func_name='start',
|
|
174
|
+
Xmin=[0.00001, 0.001, 0.01, 1, 1], #ваши настроечные параметры
|
|
175
|
+
Xmax=[1, 2, 1, 10, 3],
|
|
176
|
+
genes=[16, 17, 16, 20, 16],
|
|
177
|
+
M=20,
|
|
178
|
+
N=25,
|
|
179
|
+
n=[1, 10],
|
|
180
|
+
max_mutation=8,
|
|
181
|
+
m=[1, 8],
|
|
182
|
+
k=8,
|
|
183
|
+
l=3,
|
|
184
|
+
ep=[0.2, 0.4],
|
|
185
|
+
tmax=200,
|
|
186
|
+
max_step=0.5,
|
|
187
|
+
printing=True
|
|
188
|
+
)
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
или
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
# my_alg - ваша функция алгоритма, важно, чтобы она принимала только целевую функцию
|
|
195
|
+
|
|
196
|
+
model.optimize(
|
|
197
|
+
user_method=my_alg,
|
|
198
|
+
Xmin=[0.00001, 0.001, 0.01, 1, 1], #ваши настроечные параметры
|
|
199
|
+
Xmax=[1, 2, 1, 10, 3],
|
|
200
|
+
genes=[16, 17, 16, 20, 16],
|
|
201
|
+
M=20,
|
|
202
|
+
N=25,
|
|
203
|
+
n=[1, 10],
|
|
204
|
+
max_mutation=8,
|
|
205
|
+
m=[1, 8],
|
|
206
|
+
k=8,
|
|
207
|
+
l=3,
|
|
208
|
+
ep=[0.2, 0.4],
|
|
209
|
+
tmax=200,
|
|
210
|
+
max_step=0.5,
|
|
211
|
+
printing=True
|
|
212
|
+
)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**4) Модель MagicCompartmentModel**
|
|
216
|
+
|
|
217
|
+
Данная модель необходима нам для тех случаев,
|
|
218
|
+
когда мы не знаем как именно стоит переводить входные
|
|
219
|
+
единицы измерения в выходные.
|
|
220
|
+
|
|
221
|
+
В модель добавляется 2 дополнительных параметра:
|
|
222
|
+
|
|
223
|
+
* magic_coefficient - множитель преобразования входных единиц в выходные;
|
|
224
|
+
* exclude_compartments - список номеров камер, которые не
|
|
225
|
+
подвергнутся преобразованию.
|
|
226
|
+
|
|
227
|
+
```python
|
|
228
|
+
from PyPharm import MagicCompartmentModel
|
|
229
|
+
|
|
230
|
+
model = MagicCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629], magic_coefficient=None, exclude_compartments=[2])
|
|
231
|
+
|
|
232
|
+
res = model(90, d=5700, compartment_number=0)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Параметр magic_coefficient может быть задан None,
|
|
236
|
+
в таком случае он будет подвергнут оптимизации, в таком
|
|
237
|
+
случае он будет браться из последнего значения в векторе
|
|
238
|
+
переменных.
|
|
239
|
+
Если оба параметра не заданы, то модель выраздается
|
|
240
|
+
в простую BaseCompartmentModel.
|
|
241
|
+
|
|
242
|
+
**5) Модель ReleaseCompartmentModel**
|
|
243
|
+
|
|
244
|
+
Данная модель учитывает поправку на высвобождение
|
|
245
|
+
ЛВ в модель вводятся дополнительные параметры:
|
|
246
|
+
* v_release - Объем гепотетической камеры из которой происходит высвобождение
|
|
247
|
+
* release_parameters - Параметры функции высвобождения
|
|
248
|
+
* release_compartment - Номер камеры в которую происходит высвобождение
|
|
249
|
+
* release_function - Функция высвобождения по умолчанию f(t,m,b,c) = c0 * c * t ** b / (t ** b + m)
|
|
250
|
+
|
|
251
|
+
При этом d и c0 теперь везде носят характер параметров камеры,
|
|
252
|
+
из которой происходит высвобождение
|
|
253
|
+
```python
|
|
254
|
+
from PyPharm import ReleaseCompartmentModel
|
|
255
|
+
import matplotlib.pyplot as plt
|
|
256
|
+
|
|
257
|
+
model = ReleaseCompartmentModel(
|
|
258
|
+
6.01049235e+00,
|
|
259
|
+
[4.56683781e-03, 1.36845756e+00, 5.61175978e-01],
|
|
260
|
+
0,
|
|
261
|
+
configuration_matrix=[[0, 1.18292665e+01], [3.02373800e-01, 0]],
|
|
262
|
+
outputs=[5.00000000e+00, 0],
|
|
263
|
+
volumes=[1.98530383e+01, 3.81007392e+02],
|
|
264
|
+
numba_option=True
|
|
265
|
+
)
|
|
266
|
+
teoretic_t = [5/60, 0.25, 0.5, 1, 2, 4, 24, 48]
|
|
267
|
+
teoretic_c = [[3558.19, 508.49, 230.95, 52.05, 44.97, 36.52, 17.89, 10.36]]
|
|
268
|
+
d = 5 * 0.02 * 1000000
|
|
269
|
+
res = model(48, d=d)
|
|
270
|
+
plt.plot(teoretic_t, teoretic_c[0], 'r*')
|
|
271
|
+
plt.plot(res.t, res.y[0])
|
|
272
|
+
plt.grid()
|
|
273
|
+
plt.show()
|
|
274
|
+
```
|
|
275
|
+
Параметры release_parameters и v_release могут подвергаться оптимизации
|
|
276
|
+
в таком случае, искомое нужно просто задать как None. Тогда вектор неизвестных это
|
|
277
|
+
x = [configuration_matrix (неизвестные), outputs(неизвестные), volumes(неизвестные), release_parameters(неизвестные), v_release]
|
|
278
|
+
|
|
279
|
+
**6) Использование PBPK модели**
|
|
280
|
+
|
|
281
|
+
Вы можете использовать PBPK модель как для рассчёта по известным
|
|
282
|
+
данным так и для поиска параметров, исходя из ваших экспериментальных данных.
|
|
283
|
+
|
|
284
|
+
Чтобы задать исзвестные вам константы, при инициализации объекта следует использовать
|
|
285
|
+
параметры know_k и know_cl, которые содержат словари с известными параметрами, имена органов следует брать
|
|
286
|
+
из класса ORGAN_NAMES.
|
|
287
|
+
|
|
288
|
+
Ниже приведен пример поиска параметров и построение кривых распределения вещества
|
|
289
|
+
в органах с использованием генетического алгоритма.
|
|
290
|
+
|
|
291
|
+
```python
|
|
292
|
+
from PyPharm import PBPKmod
|
|
293
|
+
from PyPharm.constants import ORGAN_NAMES, MODEL_CONST
|
|
294
|
+
|
|
295
|
+
model = PBPKmod()
|
|
296
|
+
print(model.get_unknown_params())
|
|
297
|
+
model.load_optimization_data(
|
|
298
|
+
time_exp=[12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
299
|
+
dict_c_exp = {ORGAN_NAMES.LIVER: [103.2 * 1e-6, 134.54 * 1e-6, 87.89 * 1e-6, 81.87 * 1e-6, 45.83 * 1e-6, 28.48 * 1e-6],
|
|
300
|
+
ORGAN_NAMES.LUNG: [26.96 * 1e-6, 22.67 * 1e-6, 15.51 * 1e-6, 12.07 * 1e-6, 4.53 * 1e-6, 0 * 1e-6],
|
|
301
|
+
ORGAN_NAMES.SPLEEN: [11.84 * 1e-6, 12.22 * 1e-6, 8.52 * 1e-6, 7.01 * 1e-6, 3.65 * 1e-6, 2.16 * 1e-6]
|
|
302
|
+
},
|
|
303
|
+
start_c_in_venous=150 * 1e-3 / MODEL_CONST['rat']['venous_blood']['V']
|
|
304
|
+
)
|
|
305
|
+
result = model.optimize(
|
|
306
|
+
method='GA',
|
|
307
|
+
x_min=17 * [0.0001],
|
|
308
|
+
x_max=17 * [5],
|
|
309
|
+
genes=17 * [16],
|
|
310
|
+
n=300,
|
|
311
|
+
child_percent=0.3,
|
|
312
|
+
mutation_chance=0.5,
|
|
313
|
+
max_mutation=5,
|
|
314
|
+
t_max=300,
|
|
315
|
+
printing=True,
|
|
316
|
+
)
|
|
317
|
+
model.update_know_params(result)
|
|
318
|
+
|
|
319
|
+
result = model(max_time=24 * 60, start_c_in_venous=150 * 1e-3 / MODEL_CONST['rat']['venous_blood']['V'], step=0.1)
|
|
320
|
+
model.plot_last_result(
|
|
321
|
+
organ_names=[ORGAN_NAMES.LUNG, ORGAN_NAMES.LIVER, ORGAN_NAMES.SPLEEN],
|
|
322
|
+
user_names={
|
|
323
|
+
ORGAN_NAMES.LUNG: 'Лёгкие',
|
|
324
|
+
ORGAN_NAMES.LIVER: 'Печень',
|
|
325
|
+
ORGAN_NAMES.SPLEEN: 'Селезёнка',
|
|
326
|
+
},
|
|
327
|
+
theoretic_data={
|
|
328
|
+
ORGAN_NAMES.LIVER: {
|
|
329
|
+
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
330
|
+
'y': [103.2 * 1e-6, 134.54 * 1e-6, 87.89 * 1e-6, 81.87 * 1e-6, 45.83 * 1e-6, 28.48 * 1e-6],
|
|
331
|
+
},
|
|
332
|
+
ORGAN_NAMES.LUNG: {
|
|
333
|
+
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
334
|
+
'y': [26.96 * 1e-6, 22.67 * 1e-6, 15.51 * 1e-6, 12.07 * 1e-6, 4.53 * 1e-6, 0 * 1e-6],
|
|
335
|
+
},
|
|
336
|
+
ORGAN_NAMES.SPLEEN: {
|
|
337
|
+
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
338
|
+
'y': [11.84 * 1e-6, 12.22 * 1e-6, 8.52 * 1e-6, 7.01 * 1e-6, 3.65 * 1e-6, 2.16 * 1e-6]
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
)
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**7) Использование shared_memory**
|
|
345
|
+
|
|
346
|
+
Начиная с версии 1.3.0, вы можете использовать **shared_memory** для получения текущих данных
|
|
347
|
+
оптимизации. Имя нужного вам участка памяти хранится в поле **memory_name**.
|
|
348
|
+
|
|
349
|
+
```python
|
|
350
|
+
from multiprocessing import shared_memory
|
|
351
|
+
|
|
352
|
+
c = shared_memory.ShareableList(name='<your model.memory_name>')
|
|
353
|
+
print(c)
|
|
354
|
+
# ShareableList([4, 3.5192100752465563, 1.4158559227257506, 1.7264077213115414, 0.008336751860551, 0.2549196311342251, 0.5160375718404234, 6.915499993374695, 2.944744649331201, 0.5, 1.907294741996761], name='wnsm_0c50aa90')
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Данные хранятся в формате списка [текущая_итерация, x0, ... , xn, f], работает только для алгоритма country_optimization.
|
|
358
|
+
|
|
359
|
+
**ENG documentation**
|
|
360
|
+
----------
|
|
361
|
+
|
|
362
|
+
**1) Package Installation**
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
pip install pypharm
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**2) An example of using a package for a model where all parameters are known**
|
|
369
|
+
|
|
370
|
+
A two-chamber model of this type is given
|
|
371
|
+
|
|
372
|
+
```mermaid
|
|
373
|
+
graph LR
|
|
374
|
+
D((Dose D)) --> V1[Compartment V1]
|
|
375
|
+
V1 -- k12 --> V2[Compartment V2]
|
|
376
|
+
V2 -- k21 --> V1
|
|
377
|
+
V1 -- k10 --> Out(Output)
|
|
378
|
+
```
|
|
379
|
+
At the same time, we know the parameters of the model
|
|
380
|
+
| V1|V2 |k12 |K21 | K10
|
|
381
|
+
|--|--|--|--|--|
|
|
382
|
+
| 228| 629 |0.4586|0.1919|0.0309
|
|
383
|
+
|
|
384
|
+
Creating and calculating a model using the PyPharm package
|
|
385
|
+
```python
|
|
386
|
+
from PyPharm import BaseCompartmentModel
|
|
387
|
+
|
|
388
|
+
model = BaseCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629])
|
|
389
|
+
|
|
390
|
+
res = model(90, d=5700, compartment_number=0)
|
|
391
|
+
```
|
|
392
|
+
res is the result of the scipy solve_iv solver
|
|
393
|
+
|
|
394
|
+
**3) An example of using a package for a model where all parameters are unknown**
|
|
395
|
+
|
|
396
|
+
A multi-chamber model of this type is given
|
|
397
|
+
|
|
398
|
+
```mermaid
|
|
399
|
+
graph LR
|
|
400
|
+
Br(Brain) --'Kbr-'--> Is[Intercellular space]
|
|
401
|
+
Is --'Kbr+'-->Br
|
|
402
|
+
Is--'Kis-'-->B(Blood)
|
|
403
|
+
B--'Kis+'-->Is
|
|
404
|
+
B--'Ke'-->Out1((Output))
|
|
405
|
+
B--'Ki+'-->I(Liver)
|
|
406
|
+
I--'Ki-'-->Out2((Output))
|
|
407
|
+
B--'Kh+'-->H(Heart)
|
|
408
|
+
H--'Kh-'-->B
|
|
409
|
+
```
|
|
410
|
+
At the same time, only the parameter Ke=0 is known.077
|
|
411
|
+
|
|
412
|
+
Creating and calculating a model using the PyPharm package using the minimize method:
|
|
413
|
+
```python
|
|
414
|
+
from PyPharm import BaseCompartmentModel
|
|
415
|
+
import numpy as np
|
|
416
|
+
matrix = [[0, None, 0, 0, 0],
|
|
417
|
+
[None, 0, None, 0, 0],
|
|
418
|
+
[0, None, 0, None, None],
|
|
419
|
+
[0, 0, 0, 0, 0],
|
|
420
|
+
[0, 0, None, 0, 0]]
|
|
421
|
+
outputs = [0, 0, 0.077, None, 0]
|
|
422
|
+
|
|
423
|
+
model = BaseCompartmentModel(matrix, outputs)
|
|
424
|
+
|
|
425
|
+
model.load_optimization_data(
|
|
426
|
+
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
427
|
+
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
428
|
+
know_compartments=[0, 3, 4],
|
|
429
|
+
c0=[0, 0, 20000, 0, 0]
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
x_min = [1.5, 0.01, 0.5, 0.0001, 0.1, 0.1, 4, 3]
|
|
433
|
+
x_max = [2.5, 0.7, 1.5, 0.05, 0.5, 0.5, 7, 5]
|
|
434
|
+
x0 = np.random.uniform(x_min, x_max)
|
|
435
|
+
bounds = ((1.5, 2.5), (0.01, 0.7), (0.5, 1.5), (0.0001, 0.05), (0.1, 0.5), (0.1, 0.5), (4, 7), (3, 5))
|
|
436
|
+
|
|
437
|
+
model.optimize(
|
|
438
|
+
bounds=bounds,
|
|
439
|
+
x0=x0,
|
|
440
|
+
options={'disp': True}
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
print(model.configuration_matrix)
|
|
444
|
+
```
|
|
445
|
+
Or using the algorithm of interacting countries
|
|
446
|
+
```python
|
|
447
|
+
from PyPharm import BaseCompartmentModel
|
|
448
|
+
import numpy as np
|
|
449
|
+
matrix = [[0, None, 0, 0, 0],
|
|
450
|
+
[None, 0, None, 0, 0],
|
|
451
|
+
[0, None, 0, None, None],
|
|
452
|
+
[0, 0, 0, 0, 0],
|
|
453
|
+
[0, 0, None, 0, 0]]
|
|
454
|
+
outputs = [0, 0, 0.077, None, 0]
|
|
455
|
+
|
|
456
|
+
model = BaseCompartmentModel(matrix, outputs)
|
|
457
|
+
|
|
458
|
+
model.load_optimization_data(
|
|
459
|
+
teoretic_x=[0.25, 0.5, 1, 4, 8, 24],
|
|
460
|
+
teoretic_y=[[0, 0, 11.2, 5.3, 5.42, 3.2], [268.5, 783.3, 154.6, 224.2, 92.6, 0], [342, 637, 466, 235, 179, 158]],
|
|
461
|
+
know_compartments=[0, 3, 4],
|
|
462
|
+
c0=[0, 0, 20000, 0, 0]
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
model.optimize(
|
|
466
|
+
method='country_optimization',
|
|
467
|
+
Xmin=[0.5, 0.001, 0.001, 0.00001, 0.01, 0.01, 1, 1],
|
|
468
|
+
Xmax=[5, 2, 2.5, 0.3, 1, 1, 10, 10],
|
|
469
|
+
M=10,
|
|
470
|
+
N=25,
|
|
471
|
+
n=[1, 10],
|
|
472
|
+
p=[0.00001, 2],
|
|
473
|
+
m=[1, 8],
|
|
474
|
+
k=8,
|
|
475
|
+
l=3,
|
|
476
|
+
ep=[0.2, 0.4],
|
|
477
|
+
tmax=300,
|
|
478
|
+
printing=True,
|
|
479
|
+
)
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
When optimizing, the vector of unknowns is
|
|
483
|
+
x = [configuration_matrix (unknown), outputs(unknown), volumes(unknown)]
|
|
484
|
+
|
|
485
|
+
In addition, you can use a genetic algorithm:
|
|
486
|
+
|
|
487
|
+
```python
|
|
488
|
+
|
|
489
|
+
model.optimize(
|
|
490
|
+
method='GA',
|
|
491
|
+
x_min=[0.00001, 0.001, 0.01, 1, 1],
|
|
492
|
+
x_max=[1, 2, 1, 10, 3],
|
|
493
|
+
genes=[16, 17, 16, 20, 16],
|
|
494
|
+
n=100,
|
|
495
|
+
percentage of descendants=0.3,
|
|
496
|
+
the probability of mutation =0.5,
|
|
497
|
+
max_mutation=5,
|
|
498
|
+
t_max=300,
|
|
499
|
+
max_step=0.5,
|
|
500
|
+
print=True,
|
|
501
|
+
)
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
You can even use your own algorithm if necessary.
|
|
505
|
+
|
|
506
|
+
```python
|
|
507
|
+
# Countryalgorithm - your class is an algorithm
|
|
508
|
+
# start - start the algorithm
|
|
509
|
+
# it is important that your application aroused the interest of numpy.array
|
|
510
|
+
|
|
511
|
+
model.optimize(
|
|
512
|
+
user_method=country Countryalgorithm,
|
|
513
|
+
method_is_func=False,
|
|
514
|
+
optimization_func_name='start',
|
|
515
|
+
Xmin=[0.00001, 0.001, 0.01, 1, 1], # your desktop settings
|
|
516
|
+
Xmax Max=[1, 2, 1, 10, 3],
|
|
517
|
+
genes=[16, 17, 16, 20, 16],
|
|
518
|
+
M=20,
|
|
519
|
+
N=25,
|
|
520
|
+
n=[1, 10],
|
|
521
|
+
max_mutation=8,
|
|
522
|
+
m=[1, 8],
|
|
523
|
+
k=8,
|
|
524
|
+
l=3,
|
|
525
|
+
ep=[0,2, 0,4],
|
|
526
|
+
tmax=200,
|
|
527
|
+
max_step=0.5,
|
|
528
|
+
print=True
|
|
529
|
+
)
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
or
|
|
533
|
+
|
|
534
|
+
```python
|
|
535
|
+
# my_alg is your algorithm function, it is important that it accepts only the target function
|
|
536
|
+
|
|
537
|
+
model.optimize(
|
|
538
|
+
custom method=my_alg,
|
|
539
|
+
Xmin=[0.00001, 0.001, 0.01, 1, 1], # your desktop settings
|
|
540
|
+
Xmax Max=[1, 2, 1, 10, 3],
|
|
541
|
+
genes=[16, 17, 16, 20, 16],
|
|
542
|
+
M=20,
|
|
543
|
+
N=25,
|
|
544
|
+
n=[1, 10],
|
|
545
|
+
max_mutation=8,
|
|
546
|
+
m=[1, 8],
|
|
547
|
+
k=8,
|
|
548
|
+
l=3,
|
|
549
|
+
ep=[0,2, 0,4],
|
|
550
|
+
tmax=200,
|
|
551
|
+
max_step=0.5,
|
|
552
|
+
print=True
|
|
553
|
+
)
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
**4) The MagicCompartmentModel model**
|
|
557
|
+
|
|
558
|
+
We need this model for those cases
|
|
559
|
+
when we do not know exactly how to convert input
|
|
560
|
+
units of measurement into output units.
|
|
561
|
+
|
|
562
|
+
2 additional parameters are added to the model:
|
|
563
|
+
|
|
564
|
+
* magic_coefficient - multiplier for converting input units to output units;
|
|
565
|
+
* exclude_compartments - list of camera numbers that are not
|
|
566
|
+
they will undergo a transformation.
|
|
567
|
+
|
|
568
|
+
```python
|
|
569
|
+
from PyPharm import MagicCompartmentModel
|
|
570
|
+
|
|
571
|
+
model = MagicCompartmentModel([[0, 0.4586], [0.1919, 0]], [0.0309, 0], volumes=[228, 629], magic_coefficient=None, exclude_compartments=[2])
|
|
572
|
+
|
|
573
|
+
res = model(90, d=5700, compartment_number=0)
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
The magic_coefficient parameter can be set to None,
|
|
577
|
+
in which case it will be optimized, in
|
|
578
|
+
which case it will be taken from the last value in the vector
|
|
579
|
+
of variables.
|
|
580
|
+
If both parameters are not set, then the model is deleted
|
|
581
|
+
into a simple BaseCompartmentModel.
|
|
582
|
+
|
|
583
|
+
**5) The ReleaseCompartmentModel model**
|
|
584
|
+
|
|
585
|
+
This model takes into account the release adjustment
|
|
586
|
+
medicinal substance additional parameters are introduced into the model:
|
|
587
|
+
* v_release - The volume of the hepothetic chamber from which the release occurs
|
|
588
|
+
* release_parameters - Parameters of the release function
|
|
589
|
+
* release_compartment - The number of the camera into which the release takes place
|
|
590
|
+
* release_function - Default release function f(t,m,b,c) = c0 * c * t ** b / (t ** b + m)
|
|
591
|
+
|
|
592
|
+
At the same time, d and c0 are now everywhere in the nature of the parameters of the chamber
|
|
593
|
+
from which the release occurs
|
|
594
|
+
```python
|
|
595
|
+
from PyPharm import ReleaseCompartmentModel
|
|
596
|
+
import matplotlib.pyplot as plt
|
|
597
|
+
|
|
598
|
+
model = ReleaseCompartmentModel(
|
|
599
|
+
6.01049235e+00,
|
|
600
|
+
[4.56683781e-03, 1.36845756e+00, 5.61175978e-01],
|
|
601
|
+
0,
|
|
602
|
+
configuration_matrix=[[0, 1.18292665e+01], [3.02373800e-01, 0]],
|
|
603
|
+
outputs=[5.00000000e+00, 0],
|
|
604
|
+
volumes=[1.98530383e+01, 3.81007392e+02],
|
|
605
|
+
numba_option=True
|
|
606
|
+
)
|
|
607
|
+
teoretic_t = [5/60, 0.25, 0.5, 1, 2, 4, 24, 48]
|
|
608
|
+
teoretic_c = [[3558.19, 508.49, 230.95, 52.05, 44.97, 36.52, 17.89, 10.36]]
|
|
609
|
+
d = 5 * 0.02 * 1000000
|
|
610
|
+
res = model(48, d=d)
|
|
611
|
+
plt.plot(teoretic_t, teoretic_c[0], 'r*')
|
|
612
|
+
plt.plot(res.t, res.y[0])
|
|
613
|
+
plt.grid()
|
|
614
|
+
plt.show()
|
|
615
|
+
```
|
|
616
|
+
The release_parameters and v_release parameters can be optimized
|
|
617
|
+
in this case, you just need to set the desired value as None. Then the vector of unknowns is
|
|
618
|
+
x = [configuration_matrix (unknown), outputs(unknown), volumes(unknown), release_parameters(unknown), v_release]
|
|
619
|
+
|
|
620
|
+
**6) Using the PBPK model**
|
|
621
|
+
|
|
622
|
+
You can use the PBPK model both for calculations based on known
|
|
623
|
+
data and for searching for parameters based on your experimental data.
|
|
624
|
+
|
|
625
|
+
To set constants known to you, when initializing an object, you should use the
|
|
626
|
+
parameters know_k and know_cl, which contain dictionaries with known parameters, the names of organs should be taken
|
|
627
|
+
from the ORGAN_NAMES class.
|
|
628
|
+
|
|
629
|
+
Below is an example of searching for parameters and constructing distribution curves of a substance
|
|
630
|
+
in organs using a genetic algorithm.
|
|
631
|
+
|
|
632
|
+
```python
|
|
633
|
+
from PyPharm import PBPKmod
|
|
634
|
+
from PyPharm.constants import ORGAN_NAMES, MODEL_CONST
|
|
635
|
+
|
|
636
|
+
model = PBPKmod()
|
|
637
|
+
print(model.get_unknown_params())
|
|
638
|
+
model.load_optimization_data(
|
|
639
|
+
time_exp=[12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
640
|
+
dict_c_exp = {ORGAN_NAMES.LIVER: [103.2 * 1e-6, 134.54 * 1e-6, 87.89 * 1e-6, 81.87 * 1e-6, 45.83 * 1e-6, 28.48 * 1e-6],
|
|
641
|
+
ORGAN_NAMES.LUNG: [26.96 * 1e-6, 22.67 * 1e-6, 15.51 * 1e-6, 12.07 * 1e-6, 4.53 * 1e-6, 0 * 1e-6],
|
|
642
|
+
ORGAN_NAMES.SPLEEN: [11.84 * 1e-6, 12.22 * 1e-6, 8.52 * 1e-6, 7.01 * 1e-6, 3.65 * 1e-6, 2.16 * 1e-6]
|
|
643
|
+
},
|
|
644
|
+
start_c_in_venous=150 * 1e-3 / MODEL_CONST['rat']['venous_blood']['V']
|
|
645
|
+
)
|
|
646
|
+
result = model.optimize(
|
|
647
|
+
method='GA',
|
|
648
|
+
x_min=17 * [0.0001],
|
|
649
|
+
x_max=17 * [5],
|
|
650
|
+
genes=17 * [16],
|
|
651
|
+
n=300,
|
|
652
|
+
child_percent=0.3,
|
|
653
|
+
mutation_chance=0.5,
|
|
654
|
+
max_mutation=5,
|
|
655
|
+
t_max=300,
|
|
656
|
+
printing=True,
|
|
657
|
+
)
|
|
658
|
+
model.update_know_params(result)
|
|
659
|
+
|
|
660
|
+
result = model(max_time=24 * 60, start_c_in_venous=150 * 1e-3 / MODEL_CONST['rat']['venous_blood']['V'], step=0.1)
|
|
661
|
+
model.plot_last_result(
|
|
662
|
+
organ_names=[ORGAN_NAMES.LUNG, ORGAN_NAMES.LIVER, ORGAN_NAMES.SPLEEN],
|
|
663
|
+
user_names={
|
|
664
|
+
ORGAN_NAMES.LUNG: 'Лёгкие',
|
|
665
|
+
ORGAN_NAMES.LIVER: 'Печень',
|
|
666
|
+
ORGAN_NAMES.SPLEEN: 'Селезёнка',
|
|
667
|
+
},
|
|
668
|
+
theoretic_data={
|
|
669
|
+
ORGAN_NAMES.LIVER: {
|
|
670
|
+
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
671
|
+
'y': [103.2 * 1e-6, 134.54 * 1e-6, 87.89 * 1e-6, 81.87 * 1e-6, 45.83 * 1e-6, 28.48 * 1e-6],
|
|
672
|
+
},
|
|
673
|
+
ORGAN_NAMES.LUNG: {
|
|
674
|
+
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
675
|
+
'y': [26.96 * 1e-6, 22.67 * 1e-6, 15.51 * 1e-6, 12.07 * 1e-6, 4.53 * 1e-6, 0 * 1e-6],
|
|
676
|
+
},
|
|
677
|
+
ORGAN_NAMES.SPLEEN: {
|
|
678
|
+
'x': [12, 60, 3 * 60, 5* 60, 15 * 60, 24 * 60],
|
|
679
|
+
'y': [11.84 * 1e-6, 12.22 * 1e-6, 8.52 * 1e-6, 7.01 * 1e-6, 3.65 * 1e-6, 2.16 * 1e-6]
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
)
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
**7) Using shared_memory**
|
|
686
|
+
|
|
687
|
+
Since version 1.3.0, you can use **shared_memory** to get current data
|
|
688
|
+
optimization. The name of the memory location you need is stored in the **memory_name** field.
|
|
689
|
+
```python
|
|
690
|
+
from multiprocessing import shared_memory
|
|
691
|
+
|
|
692
|
+
c = shared_memory.ShareableList(name='<your model.memory_name>')
|
|
693
|
+
print(c)
|
|
694
|
+
# ShareableList([4, 3.5192100752465563, 1.4158559227257506, 1.7264077213115414, 0.008336751860551, 0.2549196311342251, 0.5160375718404234, 6.915499993374695, 2.944744649331201, 0.5, 1.907294741996761], name='wnsm_0c50aa90')
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
The data is stored in list format [current_iteration, x0, ... , xn, f], works only for the country_optimization algorithm.
|