import numpy as np
import pandas as pd
from anml.parameter.utils import combine_constraints
from anml.parameter.variables import ParameterBlock, collect_blocks
[docs]def process_all(param_block: ParameterBlock, df: pd.DataFrame):
process_for_betas(param_block, df)
if param_block.num_re_var > 0:
process_for_gammas(param_block, df)
process_for_us(param_block, df)
[docs]def process_for_betas(param_block: ParameterBlock, df: pd.DataFrame, reset=True):
if reset:
param_block.reset()
# collecting blocks related to betas ...
design_mat_blocks = collect_blocks(param_block, 'design_matrix_fe', 'build_design_matrix_fe', inputs=df)
lbs_fe = collect_blocks(param_block, 'lb_fe', 'build_bounds_fe')
ubs_fe = collect_blocks(param_block, 'ub_fe')
constr_mat_fe_blocks = collect_blocks(param_block, 'constr_matrix_fe', 'build_constraint_matrix_fe')
constr_lbs_fe = collect_blocks(param_block, 'constr_lb_fe')
constr_ubs_fe = collect_blocks(param_block, 'constr_ub_fe')
param_block.fe_priors = collect_blocks(param_block, 'fe_prior')
# combining blocks ...
param_block.design_matrix_fe = np.hstack(design_mat_blocks)
param_block.lb_fe = np.hstack(lbs_fe)
param_block.ub_fe = np.hstack(ubs_fe)
param_block.constr_matrix_fe, param_block.constr_lb_fe, param_block.constr_ub_fe = combine_constraints(
constr_mat_fe_blocks, constr_lbs_fe, constr_ubs_fe
)
assert param_block.design_matrix_fe.shape[1] == param_block.num_fe
assert len(param_block.lb_fe) == len(param_block.ub_fe)
assert param_block.constr_matrix_fe.shape[1] == param_block.num_fe
assert len(param_block.constr_lb_fe) == len(param_block.constr_ub_fe) == param_block.constr_matrix_fe.shape[0]
[docs]def process_for_gammas(param_block: ParameterBlock, df: pd.DataFrame, reset=False):
if reset:
param_block.reset()
has_re = lambda v: v.add_re == True
# collecting blocks related to betas ...
if param_block.design_matrix_re is None:
design_mat_re_blocks = collect_blocks(
param_block, 'design_matrix_re', 'build_design_matrix_re', inputs=df, should_include=has_re
)
else:
design_mat_re_blocks = None
lbs_re_var = collect_blocks(param_block, 'lb_re_var', 'build_bounds_re_var', should_include=has_re)
ubs_re_var = collect_blocks(param_block, 'ub_re_var', should_include=has_re)
constr_mat_re_var_blocks = collect_blocks(
param_block, 'constr_matrix_re_var', 'build_constraint_matrix_re_var', should_include=has_re
)
constr_lbs_re_var = collect_blocks(param_block, 'constr_lb_re_var', should_include=has_re)
constr_ubs_re_var = collect_blocks(param_block, 'constr_ub_re_var', should_include=has_re)
param_block.re_var_priors = collect_blocks(param_block, 're_var_prior', should_include=has_re)
grouping = collect_blocks(param_block, 'n_groups', should_include=has_re)
# combining blocks ...
if param_block.design_matrix_re is None:
param_block.design_matrix_re = np.hstack(design_mat_re_blocks)
param_block.lb_re_var = np.hstack(lbs_re_var)
param_block.ub_re_var = np.hstack(ubs_re_var)
param_block.constr_matrix_re_var, param_block.constr_lb_re_var, param_block.constr_ub_re_var = combine_constraints(
constr_mat_re_var_blocks,
constr_lbs_re_var,
constr_ubs_re_var,
)
param_block.re_var_padding = np.repeat(np.identity(len(grouping)), grouping, axis=0)
assert param_block.design_matrix_re.shape[1] == param_block.re_var_padding.shape[0] == param_block.num_re
assert param_block.constr_matrix_re_var.shape[1] == param_block.num_re_var
assert len(param_block.constr_lb_re_var) == \
param_block.constr_matrix_re_var.shape[0] == \
len(param_block.constr_ub_re_var)
[docs]def process_for_us(param_block: ParameterBlock, df: pd.DataFrame, reset=False):
if reset:
param_block.reset()
has_re = lambda v: v.add_re == True
# collecting blocks related to betas ...
if param_block.design_matrix_re is None:
design_mat_re_blocks = collect_blocks(
param_block, 'design_matrix_re', 'build_design_matrix_re', inputs=df, should_include=has_re
)
else:
design_mat_re_blocks = None
lbs_re = collect_blocks(param_block, 'lb_re', 'build_bounds_re', should_include=has_re)
ubs_re = collect_blocks(param_block, 'ub_re', should_include=has_re)
constr_mat_re_blocks = collect_blocks(param_block, 'constr_matrix_re', 'build_constraint_matrix_re', should_include=has_re)
constr_lbs_re = collect_blocks(param_block, 'constr_lb_re', should_include=has_re)
constr_ubs_re = collect_blocks(param_block, 'constr_ub_re', should_include=has_re)
re_priors = collect_blocks(param_block, 're_prior', should_include=has_re)
grouping = collect_blocks(param_block, 'n_groups', should_include=has_re)
# combining blocks ...
if param_block.design_matrix_re is None:
param_block.design_matrix_re = np.hstack(design_mat_re_blocks)
param_block.lb_re = np.hstack(lbs_re)
param_block.ub_re = np.hstack(ubs_re)
param_block.constr_matrix_re, param_block.constr_lb_re, param_block.constr_ub_re = combine_constraints(
constr_mat_re_blocks,
constr_lbs_re,
constr_ubs_re,
)
param_block.re_var_padding = np.repeat(np.identity(len(grouping)), grouping, axis=0)
param_block.re_priors = []
for n_group, prior in zip(grouping, re_priors):
param_block.re_priors.extend([prior] * n_group)
assert param_block.design_matrix_re.shape[1] == param_block.re_var_padding.shape[0] == param_block.num_re
assert param_block.constr_matrix_re.shape[1] == param_block.num_re
assert len(param_block.constr_lb_re) == param_block.constr_matrix_re.shape[0] == len(param_block.constr_ub_re)