Source code for pharmpy.modeling.remove_iov
"""
:meta private:
"""
import warnings
from collections import defaultdict
from typing import List, Optional, Union
from pharmpy.deps import sympy
from pharmpy.model import Model
from pharmpy.modeling import remove_unused_parameters_and_rvs
from pharmpy.modeling.help_functions import _format_input_list
[docs]def remove_iov(model: Model, to_remove: Optional[Union[List[str], str]] = None):
"""Removes all IOV etas given a list with eta names.
Parameters
----------
model : Model
Pharmpy model to remove IOV from.
to_remove : str, list
Name/names of IOV etas to remove, e.g. 'ETA_IOV_1_1'.
If None, all etas that are IOVs will be removed. None is default.
Return
------
Model
Pharmpy model object
Example
-------
>>> from pharmpy.modeling import *
>>> model = load_example_model("pheno")
>>> model = remove_iov(model)
See also
--------
add_iiv
add_iov
remove_iiv
add_pk_iiv
"""
rvs, sset = model.random_variables, model.statements
etas = _get_iov_etas(model, to_remove)
if not etas:
warnings.warn('No IOVs present')
return model
keep = [name for name in rvs.names if name not in etas]
d = {sympy.Symbol(name): 0 for name in etas}
model = model.replace(statements=sset.subs(d), random_variables=rvs[keep])
model = remove_unused_parameters_and_rvs(model)
return model.update_source()
def _get_iov_etas(model: Model, list_of_etas):
list_of_etas = _format_input_list(list_of_etas)
rvs = model.random_variables
if list_of_etas is None:
return set(rvs.iov.names)
# NOTE Include all directly referenced ETAs
direct_etas = set(list_of_etas)
# NOTE Include all IOV ETAs that are identically distributed to the ones
# directly referenced
indirect_etas = set()
for group in _get_iov_groups(model):
if not direct_etas.isdisjoint(group):
indirect_etas.update(group)
return direct_etas | indirect_etas
def _get_iov_groups(model: Model):
iovs = model.random_variables.iov
same = defaultdict(set)
for dist in iovs:
for i, name in enumerate(dist.names):
key = (i, dist.variance)
same[key].add(name)
return same.values()