def test_add_parameters(pheno_path, param_new, init_expected, buf_new): model = Model(pheno_path) pset = model.parameters assert len(pset) == 6 pset.append(param_new) model.parameters = pset model.update_source() assert len(pset) == 7 assert model.parameters[param_new.name].init == init_expected parser = NMTranParser() stream = parser.parse(str(model)) assert str(model.control_stream) == str(stream) rec_ref = ( f'$THETA (0,0.00469307) ; PTVCL\n' f'$THETA (0,1.00916) ; PTVV\n' f'$THETA (-.99,.1)\n' f'{buf_new}\n' ) rec_mod = '' for rec in model.control_stream.get_records('THETA'): rec_mod += str(rec) assert rec_ref == rec_mod
def test_round_trip(pheno_path): parser = NMTranParser() with open(pheno_path, 'r') as fh: content = fh.read() model = parser.parse(content) assert str(model) == content
def test_statements_setter(pheno_path, buf_new, len_expected): model = Model(pheno_path) parser = NMTranParser() statements_new = parser.parse(f'$PRED\n{buf_new}').records[0].statements assert len(model.statements) == 15 assert len(statements_new) == len_expected model.statements = statements_new assert len(model.statements) == len_expected assert model.statements == statements_new
def test_remove_iov(testdata): model = Model(testdata / 'nonmem/pheno_block.mod') model_str = str(model) model_with_iov = re.sub( r'\$OMEGA 0.031128 ; IVV\n\$OMEGA 0.1', r'$OMEGA BLOCK(1)\n0.1\n$OMEGA BLOCK(1) SAME\n', model_str, ) model.control_stream = NMTranParser().parse(model_with_iov) remove_iov(model) model.update_source() assert (str(model.get_pred_pk_record()) == '$PK\n' 'CL=THETA(1)*EXP(ETA(1))\n' 'V = THETA(2)\n' 'S1 = ETA(2) + ETA(3) + V\n\n') rec_omega = ''.join( str(rec) for rec in model.control_stream.get_records('OMEGA')) assert (rec_omega == '$OMEGA 0.0309626 ; IVCL\n' '$OMEGA BLOCK(2)\n' '0.0309626\n' '0.0005 0.031128\n') model = Model(testdata / 'nonmem/pheno_block.mod') with pytest.warns(UserWarning): remove_iov(model)
def test_iiv_on_ruv(pheno_path, epsilons, same_eta, err_ref, omega_ref): model = Model(pheno_path) model_str = str(model) model_more_eps = re.sub('IPRED=F\nIRES=DV-IPRED', 'IPRED=F+EPS(2)\nIRES=DV-IPRED+EPS(3)', model_str) model_sigma = re.sub(r'\$SIGMA 0.013241', '$SIGMA 0.013241\n$SIGMA 0.1\n$SIGMA 0.1', model_more_eps) model.control_stream = NMTranParser().parse(model_sigma) iiv_on_ruv(model, epsilons, same_eta) model.update_source() err_rec = model.control_stream.get_records('ERROR')[0] assert str( err_rec) == f'$ERROR\n' f'W=F\n' f'{err_ref}' f'IWRES=IRES/W\n\n' omega_rec = ''.join( str(rec) for rec in model.control_stream.get_records('OMEGA')) assert omega_rec == (f'$OMEGA DIAGONAL(2)\n' f' 0.0309626 ; IVCL\n' f' 0.031128 ; IVV\n\n' f'{omega_ref}\n')
def test_simple_parse(): parser = NMTranParser() model = parser.parse('$PROBLEM MYPROB\n') assert len(model.records) == 1 assert type(model.records[0]).__name__ == 'ProblemRecord' assert str(model) == '$PROBLEM MYPROB\n' model2_str = ';Comment\n $PROBLEM TW2\n' model2 = parser.parse(model2_str) assert len(model2.records) == 2 assert type(model2.records[0]).__name__ == 'RawRecord' assert type(model2.records[1]).__name__ == 'ProblemRecord' assert str(model2) == model2_str
def test_add_statements(pheno_path, statement_new, buf_new): model = Model(pheno_path) sset = model.statements assert len(sset) == 15 # Insert new statement before ODE system. new_sset = ModelStatements() for s in sset: if isinstance(s, ODESystem): new_sset.append(statement_new) new_sset.append(s) model.statements = new_sset model.update_source() assert len(model.statements) == 16 parser = NMTranParser() stream = parser.parse(str(model)) assert str(model.control_stream) == str(stream) rec_ref = ( f'$PK\n' f'IF(AMT.GT.0) BTIME=TIME\n' f'TAD=TIME-BTIME\n' f'TVCL=THETA(1)*WGT\n' f'TVV=THETA(2)*WGT\n' f'IF(APGR.LT.5) TVV=TVV*(1+THETA(3))\n' f'CL=TVCL*EXP(ETA(1))\n' f'V=TVV*EXP(ETA(2))\n' f'S1=V\n' f'{buf_new}\n\n' ) rec_mod = str(model.control_stream.get_records('PK')[0]) assert rec_ref == rec_mod
def test_parse_illegal_record_name(): parser = NMTranParser() with pytest.raises(ModelSyntaxError): parser.parse('$PROBLEM MYPROB\n$1REC\n')