nlpec03.gms : NLPEC test suite - loop over option combos

Description


Small Model of Type : GAMS


Category : GAMS Test library


Main file : nlpec03.gms

scalar errCount;

$if set VERBOSE $setEnv VERBOSE true
$onEmbeddedCode Python:
# verify normal operation of NLPEC
#
# Run NLPEC over a wide range of combinations of reformulation options

import os, sys
import subprocess
import gams.transfer as gt

pySysdir = os.environ.get("PYSYSDIR")
if None == pySysdir:
    gamscmd = os.path.join(r"%gams.sysdir% ".strip(), "gams")
else:
    gamscmd = os.path.join(pySysdir, "gams")

optFmt = "{:<12} {:>12} {:>12}\n"

# create an option file for NLPEC
def makeOptFile(fname,sname,optS,optD,*args):
    with open(fname,'w') as f:
        f.write("dotGams {}\n".format(sname))
        f.write("\n")
        f.write(optFmt.format("refType"   ,optS[0],optD[0]))
        f.write(optFmt.format("slack"     ,optS[1],optD[1]))
        f.write(optFmt.format("constraint",optS[2],optD[2]))
        f.write(optFmt.format("aggregate" ,optS[3],optD[3]))
        f.write(optFmt.format("NCPBounds" ,optS[4],optD[4]))
        for t in args:
            for o in t:
                f.write("{}\n".format(o))
    # print ("")
    # print ("makeOptFile: #args = {}".format(len(args)))
    return

# for some reformulations we need additional args 
def getXtraArgs(optS,optD):
    xx = []
    s_initMU = None
    d_initMU = None
    if optS[0] in ["fCMfx", "fCMxf"]:
        s_initMU = "5e-6"
    if optS[0] in ["CMfx", "CMxf"]:
        s_initMU = "8e-3"
    if optS[0] in ["fVUsin", "fVUpow"]:
        s_initMU = "1e-3"
    if optS[0] in ["penalty"]:
        s_initMU = "5e-3"
    if optD[0] in ["fCMfx", "fCMxf"]:
        d_initMU = "5e-6"
    if optD[0] in ["CMfx", "CMxf"]:
        d_initMU = "8e-3"
    if optD[0] in ["fVUsin", "fVUpow"]:
        d_initMU = "1e-3"
    if optD[0] in ["penalty"]:
        d_initMU = "5e-3"
    if (s_initMU is not None) or (d_initMU is not None):
        if s_initMU is None:
            s_initMU = "*"
        if d_initMU is None:
            d_initMU = "*"
        xx.append(optFmt.format("initMU",s_initMU,d_initMU))
        
    return tuple(xx)


# solve model <gms> using optfile=<opt> with NLPEC
# return true if the solve completes successfully
def processGMS(gms,opt):
    # verify the options file exists
    assert(opt>=100)
    optFileOld = "nlpec.{}".format(opt)
    assert(os.path.isfile(optFileOld))
    assert(os.path.isfile(gms))

    # run NLPEC
    cmd = [ gamscmd, gms, "solver=nlpec", "optfile={}".format(opt)]
    p = subprocess.run(cmd, capture_output=True, text=True)
    if p.returncode != 0:
        print ("failure in processGMS({},{}): NLPEC run failed".format(gms,opt))
        print ("cmd: ", cmd)
        print ("rc: ", p.returncode)
        with open("stdout.txt","w") as sss:
            sss.write(p.stdout)
        print ("stdout available in file 'stdout.txt'")
    assert(p.returncode == 0)
    return True


def getCombos(row):
    return [ row[2*k] for k in range(5) ] , [ row[2*k+1] for k in range(5) ] 


if __name__ == "__main__":
    verbose = False
    eCount = 0
    try:
        if None == pySysdir:
            m = gt.Container("nlpec03_opts.gdx", system_directory=r"%gams.sysdir% ".strip())
        else:
            m = gt.Container("nlpec03_opts.gdx", system_directory=pySysdir)
        df = m['valid10'].records
        verbose = (None != os.environ.get("VERBOSE"))
        # rS, rD = getCombos(df.iloc[0])

        nOptFiles = 0
        nTests = 0
        nDeltas = 0
        gmsfiles = [ "mpec01.gms" ]
        for idx, row in df.iterrows():
            rS, rD = getCombos(row)
            if (nOptFiles >= 999999):  # easy way to be quick and successful
                continue
            nOptFiles += 1
            if verbose:
                print ("Testing row {}: {}".format(idx,row.to_list()))
            xargs = getXtraArgs(rS,rD)
            makeOptFile("nlpec.100","scalar100.gms",rS,rD,xargs)

            for gms in gmsfiles:
                nTests += 1
                # print ("GAMS file to process: {}".format(gms))
                brc = processGMS(gms,100)
                if verbose:
                    print ("  GAMS file: {}  result: {}".format(gms,brc))
                if not brc:
                    nDeltas += 1

        if verbose:
            print ("")
            print ("ALL DONE: {} option files, {} comparisons, {} deltas".format(nOptFiles,nTests,nDeltas))
        assert(0 == nDeltas)

    except Exception as e:
        print(repr(e))
        eCount = eCount + 1
    gams.set('errCount', [eCount])
$offEmbeddedCode errCount

display errCount;
abort$errCount "There were errors in the test run", errCount;