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