modelbase2 0.6.0__py3-none-any.whl → 0.7.0__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.
@@ -1,14 +1,18 @@
1
1
  from collections.abc import Iterable
2
2
  from dataclasses import dataclass
3
+ from typing import Literal
3
4
 
4
5
  import numpy as np
5
6
  import pandas as pd
6
7
  from numpy import polynomial
7
- from typing import Union, Literal
8
8
 
9
9
  from modelbase2.types import AbstractSurrogate, ArrayLike
10
10
 
11
- __all__ = ["PolySurrogate", "PolynomialExpansion", "train_polynomial_surrogate"]
11
+ __all__ = [
12
+ "PolySurrogate",
13
+ "PolynomialExpansion",
14
+ "train_polynomial_surrogate",
15
+ ]
12
16
 
13
17
  # define custom type
14
18
  PolynomialExpansion = (
@@ -160,7 +160,7 @@ def train_torch_surrogate(
160
160
  if approximator is None:
161
161
  approximator = MLP(
162
162
  n_inputs=len(features.columns),
163
- layers=[50, 50, len(targets.columns)],
163
+ neurons_per_layer=[50, 50, len(targets.columns)],
164
164
  ).to(device)
165
165
 
166
166
  optimizer = optimimzer_cls(approximator.parameters())
modelbase2/types.py CHANGED
@@ -127,13 +127,13 @@ class IntegratorProtocol(Protocol):
127
127
  *,
128
128
  t_end: float,
129
129
  steps: int | None = None,
130
- ) -> tuple[ArrayLike | None, ArrayLike | None]:
130
+ ) -> tuple[Array | None, ArrayLike | None]:
131
131
  """Integrate the system."""
132
132
  ...
133
133
 
134
134
  def integrate_time_course(
135
135
  self, *, time_points: ArrayLike
136
- ) -> tuple[ArrayLike | None, ArrayLike | None]:
136
+ ) -> tuple[Array | None, ArrayLike | None]:
137
137
  """Integrate the system over a time course."""
138
138
  ...
139
139
 
@@ -454,6 +454,7 @@ class AbstractSurrogate:
454
454
  args |= self.predict(np.array([args[arg] for arg in self.args]))
455
455
 
456
456
  def calculate_inpl_time_course(self, args: pd.DataFrame) -> None:
457
+ """Predict outputs based on input data."""
457
458
  args[list(self.stoichiometries)] = pd.DataFrame(
458
459
  [self.predict(y) for y in args.loc[:, self.args].to_numpy()],
459
460
  index=args.index,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modelbase2
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: A package to build metabolic models
5
5
  Author-email: Marvin van Aalst <marvin.vanaalst@gmail.com>
6
6
  Maintainer-email: Marvin van Aalst <marvin.vanaalst@gmail.com>
@@ -60,6 +60,16 @@ Description-Content-Type: text/markdown
60
60
 
61
61
  # modelbase
62
62
 
63
+ [![pypi](https://img.shields.io/pypi/v/modelbase2.svg)](https://pypi.python.org/pypi/modelbase2)
64
+ [![docs][docs-badge]][docs]
65
+ ![License](https://img.shields.io/badge/license-GPL--3.0-blue?style=flat-square)
66
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
67
+ [![security: bandit](https://img.shields.io/badge/security-bandit-yellow.svg)](https://github.com/PyCQA/bandit)
68
+ [![Downloads](https://pepy.tech/badge/modelbase2)](https://pepy.tech/project/modelbase2)
69
+
70
+ [docs-badge]: https://img.shields.io/badge/docs-main-green.svg?style=flat-square
71
+ [docs]: https://computational-biology-aachen.github.io/modelbase2/
72
+
63
73
  ## Installation
64
74
 
65
75
  You can install modelbase using pip: `pip install modelbase2`
@@ -0,0 +1,44 @@
1
+ modelbase2/__init__.py,sha256=hAbljI8oAskpz6qQph4YWNGPlUXI2chdtxFuUffhxYA,4068
2
+ modelbase2/distributions.py,sha256=i456B0KYKdiGwuoVjoj3rey5lKdJmu9EVvacnfWXHGA,8744
3
+ modelbase2/fit.py,sha256=uAMiSa4bnYxW5kdVDB2d61iV9uQGYuxKrLSiOX1IpTE,8185
4
+ modelbase2/fns.py,sha256=mlV44qL8H2lbtmopsKRFkLA6rFZOiQ1mPNr5S2smjHY,4604
5
+ modelbase2/label_map.py,sha256=LUwcOHQWiGfBGV5XUmPM_SOwM9IyDVcQVJ11DPfVpAo,17774
6
+ modelbase2/linear_label_map.py,sha256=6qs7SZIaiMcA0jRCdZXMe44lG7pBtKzYNMYSfNz2CfY,10317
7
+ modelbase2/mc.py,sha256=zlDL7e_udpIMRhSjfFJo5AwkigD0B_3H2rQxyelBuzI,16285
8
+ modelbase2/mca.py,sha256=AFXMOpV1dhPxHBdDOP3212qXM_ItonMOj8v3UAMK0J0,8869
9
+ modelbase2/model.py,sha256=YFzBOCuy53dvXLbeel0o4rAqw_rmRSUq8dL6ASltdSU,57136
10
+ modelbase2/nnarchitectures.py,sha256=vk0BYTssVMWyoLYQUBvj-Q4mVSukwhYP1uEzQCHrD9Q,4067
11
+ modelbase2/npe.py,sha256=G-GMpC6LFzHq8-Sk0b1IbbUOoT_xq5yJztjcq3JNDhc,8767
12
+ modelbase2/parallel.py,sha256=kX4Td5YoovDwZp6kX_3cfO6QtHSS9ieJ0bMZiKs3Xv8,5002
13
+ modelbase2/parameterise.py,sha256=2jMhhO-bHTFP_0kXercJekeATAZYBg5FrK1MQ_mWGpk,654
14
+ modelbase2/paths.py,sha256=uatKXDa79uniUB2Z3dr8eBJVuUPXDI-o_bf-DqPKq1Y,1039
15
+ modelbase2/plot.py,sha256=72Oivv-jsCF9J9U7Uli15p5SnuEHSnHRXCaRP8uUaJo,22724
16
+ modelbase2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ modelbase2/scan.py,sha256=ooBgRYovFkJL22Uaw5uv7yEhNuYGz5Png6naUpn8F7s,18098
18
+ modelbase2/simulator.py,sha256=syK_o8Xk2rIXVu3ZUe_BlWz2UNlzNLNbkI1qbaxmS38,19996
19
+ modelbase2/types.py,sha256=_V45vC8VPPAJuRtDHKUrglekzIDIM1zMuk7iF3GlXBU,13545
20
+ modelbase2/experimental/__init__.py,sha256=IzgcQ7MtMII7n6cg1PMp-oZm06CNVR19ax2exvb9Ny0,444
21
+ modelbase2/experimental/codegen.py,sha256=OI8sDeQjd7ShH8TAOq61IvNcWO0oQ1LF9lLW5p6Xwf0,6965
22
+ modelbase2/experimental/diff.py,sha256=yADvi_AKppO071bVBmq1Ej85BREXZu2K7kIRqr2FEyY,8962
23
+ modelbase2/experimental/notes.md,sha256=YlM2biTzub6jSlx-aDZaBYsvQcGwb7NHyVAbbl2acGE,238
24
+ modelbase2/experimental/source_tools.py,sha256=erdIVfF2q7TwS4v54AKLBGAiRhd_bIYxxjxsZ6MjfP0,735
25
+ modelbase2/experimental/strikepy.py,sha256=cKBs9InXR9mEPgx70Ynv0qkmAGfloksqinbpppTiC6U,19464
26
+ modelbase2/experimental/symbolic.py,sha256=wZuQAaykCsRabhxSy5Dl_VpG7u_EoOBCXLYCMGseZf4,11592
27
+ modelbase2/experimental/tex.py,sha256=geFwHt9xYgtudJiZsKGk-b_xCELuhFj0ANn0tOTe5dY,13624
28
+ modelbase2/integrators/__init__.py,sha256=kqmV6a0TRyLGR_XqbyAI652AfptYnXAUpqbSFg0CpP8,450
29
+ modelbase2/integrators/int_assimulo.py,sha256=FdNzh1zkXV7DFO10XCtIqJHicSlsRjc9Ixtr4LDQmOY,4610
30
+ modelbase2/integrators/int_scipy.py,sha256=twb3s3b1nAX7TKBmd2HT5p-lcSlhh5wMpFJANRXmpsQ,4348
31
+ modelbase2/sbml/__init__.py,sha256=FBaQsVvrVc7QbCBXuG9tZOdSzHcqmmsaRbFx80rxrac,231
32
+ modelbase2/sbml/_data.py,sha256=XwT1sSxn6KLTXYMbk4ORbEAEgZhQDBfoyrjMBDAoY_s,1135
33
+ modelbase2/sbml/_export.py,sha256=7I5TWkSmXZ1uPwlv5MuMP3OMS9dEOFTUQlcsrMtueJ0,19998
34
+ modelbase2/sbml/_import.py,sha256=K-SL3aUaefqxxR0daCErisJ_Nd9rKdCmtjVu4rXD0_k,22063
35
+ modelbase2/sbml/_mathml.py,sha256=bNk9RQ_NQFDhY1R354p-gwqqHaIiyAwZ1xLPHHhiguQ,24436
36
+ modelbase2/sbml/_name_conversion.py,sha256=XK9DEyzhrD0GBBwwjK9RA0yORrDX5c-Uvx0VtKMR5rA,1325
37
+ modelbase2/sbml/_unit_conversion.py,sha256=dW_I6_Ou09ccwnp6LIdrPriIQnQUK5lJcjzM2Fawm6U,1927
38
+ modelbase2/surrogates/__init__.py,sha256=N_iXERECKvmrHiihwnyQEKOSBsmlGEuQhEotn-mWKdk,924
39
+ modelbase2/surrogates/_poly.py,sha256=7T3xE7I4fKOxQY-bDnMG6WjMC5DHXeuvx-6vMi2fZbA,3118
40
+ modelbase2/surrogates/_torch.py,sha256=xNpkY4cfcy1cYVpAuEiKrh3ZuMWlzE07J-p2F7Q227Y,5896
41
+ modelbase2-0.7.0.dist-info/METADATA,sha256=6p81vMPYQk72L55UyQM2pjazgihWi_ymS1pSP8g89eE,4058
42
+ modelbase2-0.7.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
43
+ modelbase2-0.7.0.dist-info/licenses/LICENSE,sha256=qvG2VolmSkrcocL34V1ieOx-Rn-fpVcUbb25gHzVgZw,35079
44
+ modelbase2-0.7.0.dist-info/RECORD,,
modelbase2/scope.py DELETED
@@ -1,96 +0,0 @@
1
- """Label Scope Module.
2
-
3
- This module provides functions for creating and managing label scopes in metabolic models.
4
- It includes functionality for initializing label scopes and retrieving reachable label positions.
5
-
6
- Functions:
7
- get_label_scope: Return all label positions that can be reached step by step.
8
- """
9
-
10
- from __future__ import annotations
11
-
12
- # def _create_label_scope_seed(
13
- # self, *, initial_labels: dict[str, int] | dict[str, list[int]]
14
- # ) -> dict[str, int]:
15
- # """Create initial label scope seed."""
16
- # # initialise all compounds with 0 (no label)
17
- # labelled_compounds = {compound: 0 for compound in self.get_compounds()}
18
- # # Set all unlabelled compounds to 1
19
- # for name, compound in self.label_compounds.items():
20
- # num_labels = compound["num_labels"]
21
- # labelled_compounds[f"{name}__{'0' * num_labels}"] = 1
22
- # # Also set all non-label compounds to 1
23
- # for name in self.nonlabel_compounds:
24
- # labelled_compounds[name] = 1
25
- # # Set initial label
26
- # for i in [
27
- # self.get_compound_isotopomer_with_label_position(
28
- # base_compound=base_compound, label_position=label_position
29
- # )
30
- # for base_compound, label_position in initial_labels.items()
31
- # ]:
32
- # labelled_compounds[i] = 1
33
- # return labelled_compounds
34
-
35
-
36
- # def get_label_scope(
37
- # self,
38
- # initial_labels: dict[str, int] | dict[str, list[int]],
39
- # ) -> dict[int, set[str]]:
40
- # """Return all label positions that can be reached step by step.
41
-
42
- # Parameters:
43
- # initial_labels : dict(str: num)
44
-
45
- # Returns:
46
- # label_scope : dict{step : set of new positions}
47
-
48
- # Examples:
49
- # >>> l.get_label_scope({"x": 0})
50
- # >>> l.get_label_scope({"x": [0, 1], "y": 0})
51
-
52
- # """
53
- # labelled_compounds = self._create_label_scope_seed(initial_labels=initial_labels)
54
- # new_labels = set("non empty entry to not fulfill while condition")
55
- # # Loop until no new labels are inserted
56
- # loop_count = 0
57
- # result = {}
58
- # while new_labels != set():
59
- # new_cpds = labelled_compounds.copy()
60
- # for rec, cpd_dict in self.get_stoichiometries().items():
61
- # # Isolate substrates
62
- # cpds = [i for i, j in cpd_dict.items() if j < 0]
63
- # # Count how many of the substrates are 1
64
- # i = 0
65
- # for j in cpds:
66
- # i += labelled_compounds[j]
67
- # # If all substrates are 1, set all products to 1
68
- # if i == len(cpds):
69
- # for cpd in self.get_stoichiometries()[rec]:
70
- # new_cpds[cpd] = 1
71
- # if self.rates[rec]["reversible"]:
72
- # # Isolate substrates
73
- # cpds = [i for i, j in cpd_dict.items() if j > 0]
74
- # # Count how many of the substrates are 1
75
- # i = 0
76
- # for j in cpds:
77
- # i += labelled_compounds[j]
78
- # # If all substrates are 1, set all products to 1
79
- # if i == len(cpds):
80
- # for cpd in self.get_stoichiometries()[rec]:
81
- # new_cpds[cpd] = 1
82
- # # Isolate "old" labels
83
- # s1 = pd.Series(labelled_compounds)
84
- # s1 = cast(pd.Series, s1[s1 == 1])
85
- # # Isolate new labels
86
- # s2 = pd.Series(new_cpds)
87
- # s2 = cast(pd.Series, s2[s2 == 1])
88
- # # Find new labels
89
- # new_labels = cast(set[str], set(s2.index).difference(set(s1.index)))
90
- # # Break the loop once no new labels can be found
91
- # if new_labels == set():
92
- # break
93
- # labelled_compounds = new_cpds
94
- # result[loop_count] = new_labels
95
- # loop_count += 1
96
- # return result
modelbase2/surrogates.py DELETED
@@ -1,287 +0,0 @@
1
- """Surrogate Models Module.
2
-
3
- This module provides classes and functions for creating and training surrogate models
4
- for metabolic simulations. It includes functionality for both steady-state and time-series
5
- data using neural networks.
6
-
7
- Classes:
8
- AbstractSurrogate: Abstract base class for surrogate models.
9
- TorchSurrogate: Surrogate model using PyTorch.
10
- Approximator: Neural network approximator for surrogate modeling.
11
-
12
- Functions:
13
- train_torch_surrogate: Train a PyTorch surrogate model.
14
- train_torch_time_course_estimator: Train a PyTorch time course estimator.
15
- """
16
-
17
- from __future__ import annotations
18
-
19
- from dataclasses import dataclass
20
- from pathlib import Path
21
- from typing import TYPE_CHECKING
22
-
23
- import numpy as np
24
- import pandas as pd
25
- import torch
26
- import tqdm
27
- from torch import nn
28
- from torch.optim.adam import Adam
29
-
30
- from modelbase2.parallel import Cache
31
- from modelbase2.types import AbstractSurrogate
32
-
33
- if TYPE_CHECKING:
34
- from collections.abc import Callable
35
-
36
- from torch.optim.optimizer import ParamsT
37
-
38
- __all__ = [
39
- "Approximator",
40
- "DefaultCache",
41
- "DefaultDevice",
42
- "TorchSurrogate",
43
- "train_torch_surrogate",
44
- ]
45
-
46
-
47
- DefaultDevice = torch.device("cpu")
48
- DefaultCache = Cache(Path(".cache"))
49
-
50
-
51
- @dataclass(kw_only=True)
52
- class TorchSurrogate(AbstractSurrogate):
53
- """Surrogate model using PyTorch.
54
-
55
- Attributes:
56
- model: PyTorch neural network model.
57
-
58
- Methods:
59
- predict: Predict outputs based on input data using the PyTorch model.
60
-
61
- """
62
-
63
- model: torch.nn.Module
64
-
65
- def predict(self, y: np.ndarray) -> dict[str, float]:
66
- """Predict outputs based on input data using the PyTorch model.
67
-
68
- Args:
69
- y: Input data as a numpy array.
70
-
71
- Returns:
72
- dict[str, float]: Dictionary mapping output variable names to predicted values.
73
-
74
- """
75
- with torch.no_grad():
76
- return dict(
77
- zip(
78
- self.stoichiometries,
79
- self.model(
80
- torch.tensor(y, dtype=torch.float32),
81
- ).numpy(),
82
- strict=True,
83
- )
84
- )
85
-
86
-
87
- class Approximator(nn.Module):
88
- """Neural network approximator for surrogate modeling.
89
-
90
- Attributes:
91
- net: Sequential neural network model.
92
-
93
- Methods:
94
- forward: Forward pass through the neural network.
95
-
96
- """
97
-
98
- def __init__(self, n_inputs: int, n_outputs: int) -> None:
99
- """Initializes the surrogate model with the given number of inputs and outputs.
100
-
101
- Args:
102
- n_inputs (int): The number of input features.
103
- n_outputs (int): The number of output features.
104
-
105
- Initializes a neural network with the following architecture:
106
- - Linear layer with `n_inputs` inputs and 50 outputs
107
- - ReLU activation
108
- - Linear layer with 50 inputs and 50 outputs
109
- - ReLU activation
110
- - Linear layer with 50 inputs and `n_outputs` outputs
111
-
112
- The weights of the linear layers are initialized with a normal distribution
113
- (mean=0, std=0.1) and the biases are initialized to 0.
114
-
115
- """
116
- super().__init__()
117
-
118
- self.net = nn.Sequential(
119
- nn.Linear(n_inputs, 50),
120
- nn.ReLU(),
121
- nn.Linear(50, 50),
122
- nn.ReLU(),
123
- nn.Linear(50, n_outputs),
124
- )
125
-
126
- for m in self.net.modules():
127
- if isinstance(m, nn.Linear):
128
- nn.init.normal_(m.weight, mean=0, std=0.1)
129
- nn.init.constant_(m.bias, val=0)
130
-
131
- def forward(self, x: torch.Tensor) -> torch.Tensor:
132
- """Forward pass through the neural network.
133
-
134
- Args:
135
- x: Input tensor.
136
-
137
- Returns:
138
- torch.Tensor: Output tensor.
139
-
140
- """
141
- return self.net(x)
142
-
143
-
144
- def _train_batched(
145
- aprox: nn.Module,
146
- features: pd.DataFrame,
147
- targets: pd.DataFrame,
148
- epochs: int,
149
- optimizer: Adam,
150
- device: torch.device,
151
- batch_size: int,
152
- ) -> pd.Series:
153
- """Train the neural network using mini-batch gradient descent.
154
-
155
- Args:
156
- aprox: Neural network model to train.
157
- features: Input features as a tensor.
158
- targets: Target values as a tensor.
159
- epochs: Number of training epochs.
160
- optimizer: Optimizer for training.
161
- device: torch device
162
- batch_size: Size of mini-batches for training.
163
-
164
- Returns:
165
- pd.Series: Series containing the training loss history.
166
-
167
- """
168
- rng = np.random.default_rng()
169
- losses = {}
170
- for i in tqdm.trange(epochs):
171
- idxs = rng.choice(features.index, size=batch_size)
172
- X = torch.Tensor(features.iloc[idxs].to_numpy(), device=device)
173
- Y = torch.Tensor(targets.iloc[idxs].to_numpy(), device=device)
174
- optimizer.zero_grad()
175
- loss = torch.mean(torch.abs(aprox(X) - Y))
176
- loss.backward()
177
- optimizer.step()
178
- losses[i] = loss.detach().numpy()
179
- return pd.Series(losses, dtype=float)
180
-
181
-
182
- def _train_full(
183
- aprox: nn.Module,
184
- features: pd.DataFrame,
185
- targets: pd.DataFrame,
186
- epochs: int,
187
- optimizer: Adam,
188
- device: torch.device,
189
- ) -> pd.Series:
190
- """Train the neural network using full-batch gradient descent.
191
-
192
- Args:
193
- aprox: Neural network model to train.
194
- features: Input features as a tensor.
195
- targets: Target values as a tensor.
196
- epochs: Number of training epochs.
197
- optimizer: Optimizer for training.
198
- device: Torch device
199
-
200
- Returns:
201
- pd.Series: Series containing the training loss history.
202
-
203
- """
204
- X = torch.Tensor(features.to_numpy(), device=device)
205
- Y = torch.Tensor(targets.to_numpy(), device=device)
206
-
207
- losses = {}
208
- for i in tqdm.trange(epochs):
209
- optimizer.zero_grad()
210
- loss = torch.mean(torch.abs(aprox(X) - Y))
211
- loss.backward()
212
- optimizer.step()
213
- losses[i] = loss.detach().numpy()
214
- return pd.Series(losses, dtype=float)
215
-
216
-
217
- def train_torch_surrogate(
218
- features: pd.DataFrame,
219
- targets: pd.DataFrame,
220
- epochs: int,
221
- surrogate_inputs: list[str],
222
- surrogate_stoichiometries: dict[str, dict[str, float]],
223
- batch_size: int | None = None,
224
- approximator: nn.Module | None = None,
225
- optimimzer_cls: Callable[[ParamsT], Adam] = Adam,
226
- device: torch.device = DefaultDevice,
227
- ) -> tuple[TorchSurrogate, pd.Series]:
228
- """Train a PyTorch surrogate model.
229
-
230
- Examples:
231
- >>> train_torch_surrogate(
232
- ... features,
233
- ... targets,
234
- ... epochs=100,
235
- ... surrogate_inputs=["x1", "x2"],
236
- ... surrogate_stoichiometries={
237
- ... "v1": {"x1": -1, "x2": 1, "ATP": -1},
238
- ... },
239
- ...)
240
-
241
- Args:
242
- features: DataFrame containing the input features for training.
243
- targets: DataFrame containing the target values for training.
244
- epochs: Number of training epochs.
245
- surrogate_inputs: List of input variable names for the surrogate model.
246
- surrogate_stoichiometries: Dictionary mapping reaction names to stoichiometries.
247
- batch_size: Size of mini-batches for training (None for full-batch).
248
- approximator: Predefined neural network model (None to use default).
249
- optimimzer_cls: Optimizer class to use for training (default: Adam).
250
- device: Device to run the training on (default: DefaultDevice).
251
-
252
- Returns:
253
- tuple[TorchSurrogate, pd.Series]: Trained surrogate model and loss history.
254
-
255
- """
256
- if approximator is None:
257
- approximator = Approximator(
258
- n_inputs=len(features.columns),
259
- n_outputs=len(targets.columns),
260
- ).to(device)
261
-
262
- optimizer = optimimzer_cls(approximator.parameters())
263
- if batch_size is None:
264
- losses = _train_full(
265
- aprox=approximator,
266
- features=features,
267
- targets=targets,
268
- epochs=epochs,
269
- optimizer=optimizer,
270
- device=device,
271
- )
272
- else:
273
- losses = _train_batched(
274
- aprox=approximator,
275
- features=features,
276
- targets=targets,
277
- epochs=epochs,
278
- optimizer=optimizer,
279
- device=device,
280
- batch_size=batch_size,
281
- )
282
- surrogate = TorchSurrogate(
283
- model=approximator,
284
- args=surrogate_inputs,
285
- stoichiometries=surrogate_stoichiometries,
286
- )
287
- return surrogate, losses
@@ -1,45 +0,0 @@
1
- modelbase2/__init__.py,sha256=ArYJZoCTulkjFctJzxk7c9CDBXYRl2J9_LXr1EORilk,4048
2
- modelbase2/distributions.py,sha256=i456B0KYKdiGwuoVjoj3rey5lKdJmu9EVvacnfWXHGA,8744
3
- modelbase2/fit.py,sha256=WEI2lxLhdHFr6ax5xXrrkHUTxcEhmXyBHebfHEcXwCY,8172
4
- modelbase2/fns.py,sha256=8JtIzPk3DAnNHz3LoJ1ukLFTjPNO1rNCeZ7VnRmJY2o,4503
5
- modelbase2/label_map.py,sha256=LUwcOHQWiGfBGV5XUmPM_SOwM9IyDVcQVJ11DPfVpAo,17774
6
- modelbase2/linear_label_map.py,sha256=6qs7SZIaiMcA0jRCdZXMe44lG7pBtKzYNMYSfNz2CfY,10317
7
- modelbase2/mc.py,sha256=zlDL7e_udpIMRhSjfFJo5AwkigD0B_3H2rQxyelBuzI,16285
8
- modelbase2/mca.py,sha256=nMS2VnzR2VEujCFUaj9WL82CNd-oxTb3jCHP8IlJvxA,8845
9
- modelbase2/model.py,sha256=3FSYqOMUqR2hkeqcqwnnEwyXK0V6cN0i-QpMR-_huoM,56730
10
- modelbase2/nnarchitectures.py,sha256=OA1X4UHrn7gsLuuqxK6Dhv5aiKnQflhHezYCUV-NuO8,4012
11
- modelbase2/npe.py,sha256=o876zHjyfJelGijSmCL0vUBfWbIhcbQyyPkwp8hZ4NA,8743
12
- modelbase2/parallel.py,sha256=kX4Td5YoovDwZp6kX_3cfO6QtHSS9ieJ0bMZiKs3Xv8,5002
13
- modelbase2/parameterise.py,sha256=7VrYxrQv0visraqUthWSnWfx-cxh2evlXbszIY5031U,690
14
- modelbase2/paths.py,sha256=uatKXDa79uniUB2Z3dr8eBJVuUPXDI-o_bf-DqPKq1Y,1039
15
- modelbase2/plot.py,sha256=72Oivv-jsCF9J9U7Uli15p5SnuEHSnHRXCaRP8uUaJo,22724
16
- modelbase2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- modelbase2/scan.py,sha256=q6GmI0nqLtzmHjgs-AEcK2aaj6tcw8dvzmOE79yL2Pg,18117
18
- modelbase2/scope.py,sha256=4twnEh8LrTmlLE-uRvubVkE3SSWejlLvtBzTCPqG3Aw,3710
19
- modelbase2/simulator.py,sha256=3x_biwvwQmHCRs6C6R3dG5hUGwQqIgL0QQOrBR0zZQY,20986
20
- modelbase2/surrogates.py,sha256=1ikylwZ5LdgnFAcZDOCx_lY_xvnQHxcTX_2z-L98r0s,8387
21
- modelbase2/types.py,sha256=WDowHRr1YIvNNnK0clw_sBs5l2dwihT4av04Tt0jyFc,13502
22
- modelbase2/experimental/__init__.py,sha256=IzgcQ7MtMII7n6cg1PMp-oZm06CNVR19ax2exvb9Ny0,444
23
- modelbase2/experimental/codegen.py,sha256=i0soAT64oMBILGsWonoSSVkYMWOcCTY4RJ4TZoYlTos,6962
24
- modelbase2/experimental/diff.py,sha256=e7fjD9kqxkRUNxSevbAznd5cOlEdWJ6pj0y7Kd5KKrw,8973
25
- modelbase2/experimental/notes.md,sha256=YlM2biTzub6jSlx-aDZaBYsvQcGwb7NHyVAbbl2acGE,238
26
- modelbase2/experimental/strikepy.py,sha256=cKBs9InXR9mEPgx70Ynv0qkmAGfloksqinbpppTiC6U,19464
27
- modelbase2/experimental/symbolic.py,sha256=QT82TSW42RSVsvXK2WTQW1XluXnflWzrHbx6RFr_YmY,9953
28
- modelbase2/experimental/tex.py,sha256=48SrUEN-s2H_shHoXtimmLg_EDyCBa_vIVOXD2hlNbE,13664
29
- modelbase2/integrators/__init__.py,sha256=kqmV6a0TRyLGR_XqbyAI652AfptYnXAUpqbSFg0CpP8,450
30
- modelbase2/integrators/int_assimulo.py,sha256=VEQIZFZcEovLPy8i_jR8H8XcxBRQoRVmNzzCYzInPc0,4611
31
- modelbase2/integrators/int_scipy.py,sha256=-_9MS55eTc9jI7tk-3X49p-c7zrydoXaCCvDTn7Tybw,4334
32
- modelbase2/sbml/__init__.py,sha256=FBaQsVvrVc7QbCBXuG9tZOdSzHcqmmsaRbFx80rxrac,231
33
- modelbase2/sbml/_data.py,sha256=XwT1sSxn6KLTXYMbk4ORbEAEgZhQDBfoyrjMBDAoY_s,1135
34
- modelbase2/sbml/_export.py,sha256=9BLD3Qz86vlfDTZXwOnNOSVWq8mHrJoQjQmKJRZL_Wo,20285
35
- modelbase2/sbml/_import.py,sha256=K-SL3aUaefqxxR0daCErisJ_Nd9rKdCmtjVu4rXD0_k,22063
36
- modelbase2/sbml/_mathml.py,sha256=bNk9RQ_NQFDhY1R354p-gwqqHaIiyAwZ1xLPHHhiguQ,24436
37
- modelbase2/sbml/_name_conversion.py,sha256=XK9DEyzhrD0GBBwwjK9RA0yORrDX5c-Uvx0VtKMR5rA,1325
38
- modelbase2/sbml/_unit_conversion.py,sha256=dW_I6_Ou09ccwnp6LIdrPriIQnQUK5lJcjzM2Fawm6U,1927
39
- modelbase2/surrogates/__init__.py,sha256=N_iXERECKvmrHiihwnyQEKOSBsmlGEuQhEotn-mWKdk,924
40
- modelbase2/surrogates/_poly.py,sha256=zjlNL4iYR9G51gjvZPHe3CAYF-tgACGdIBe4QUYXLQk,3110
41
- modelbase2/surrogates/_torch.py,sha256=CBS_3JzSgI2-xQrbq9CIXY0fJQsxbhBnWkG2TQyj7Zs,5885
42
- modelbase2-0.6.0.dist-info/METADATA,sha256=Hjf5E6yvvCRbWsBwpqxF74_WInWGKVU6jMcqI9AR6VM,3344
43
- modelbase2-0.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
44
- modelbase2-0.6.0.dist-info/licenses/LICENSE,sha256=qvG2VolmSkrcocL34V1ieOx-Rn-fpVcUbb25gHzVgZw,35079
45
- modelbase2-0.6.0.dist-info/RECORD,,