Best Python code snippet using localstack_python
vpsolver.py
Source:vpsolver.py  
...34    """35    Wrapper for .vbp files.36    """37    def __init__(self, W, w, b, binary=False, vtype="I", verbose=False):38        self.vbp_file = VPSolver.new_tmp_file(".vbp")39        with open(self.vbp_file, "w") as fdst:40            print(len(W), file=fdst)  # ndims41            print(" ".join(map(str, W)), file=fdst)  # W42            print(len(w), file=fdst)  # m43            for i in range(len(w)):  # items44                row = list(w[i])+[b[i]]45                assert len(row) == len(W)+146                print(" ".join(map(str, row)), file=fdst)47            print("BINARY{{{:d}}};".format(binary), file=fdst)48            print("VTYPE{{{}}};".format(vtype), file=fdst)49        if verbose:50            print(utils.get_content(self.vbp_file))51        self.m = len(b)52        self.ndims = len(W)53        self.binary = binary54        self.vtype = vtype55        self.W, self.w, self.b = W, w, b56        self.labels = list(range(self.m))57    @classmethod58    def from_str(cls, content, verbose=False):59        lst = utils.get_instance_data(content)60        ndims = lst.pop(0)61        W = lst[:ndims]62        lst = lst[ndims:]63        m = lst.pop(0)64        w, b = [], []65        for i in range(m):66            w.append(lst[:ndims])67            lst = lst[ndims:]68            b.append(lst.pop(0))69        assert lst == []70        binary = bool(int(utils.get_opt("BINARY", content, False)))71        vtype = utils.get_opt("VTYPE", content, "I")72        return cls(W, w, b, binary, vtype, verbose)73    @classmethod74    def from_file(cls, vbp_file, verbose=False):75        return cls.from_str(utils.get_content(vbp_file), verbose=verbose)76    @property77    def filename(self):78        """Return the filename."""79        return self.vbp_file80    def weights(self):81        """Return the item weights."""82        return {i: tuple(self.w[i]) for i in range(self.m)}83    def capacities(self):84        """Return the bin capacities."""85        return [tuple(self.W)]86    def __del__(self):87        try:88            os.remove(self.vbp_file)89        except:90            pass91class MVP(object):92    """93    Wrapper for .mvp files.94    """95    def __init__(96            self, Ws, Cs, Qs, ws, b, binary=False, vtype="I", verbose=False):97        self.mvp_file = VPSolver.new_tmp_file(".mvp")98        with open(self.mvp_file, "w") as fdst:99            ndims = len(Ws[0])100            print(ndims, file=fdst)  # ndims101            print(len(Ws), file=fdst)  # nbtypes102            assert len(Ws) == len(Cs)103            assert len(Ws) == len(Qs)104            for Wi, Ci, Qi in zip(Ws, Cs, Qs):  # Ws, Cs, Qs105                assert len(Wi) == ndims106                if Qi == utils.inf:107                    Qi = -1108                print(" ".join(map(str, list(Wi)+[Ci]+[Qi])), file=fdst)109            assert len(ws) == len(b)110            print(len(ws), file=fdst)  # m111            for i in range(len(ws)):  # items112                print("{} {}".format(len(ws[i]), b[i]), file=fdst)113                for j, w in enumerate(ws[i]):114                    assert len(w) == ndims115                    print(" ".join(map(str, w)), file=fdst)116            print("BINARY{{{:d}}};".format(binary), file=fdst)117            print("VTYPE{{{}}};".format(vtype), file=fdst)118        if verbose:119            print(utils.get_content(self.mvp_file))120        self.m = len(b)121        self.ndims = ndims122        self.binary = binary123        self.vtype = vtype124        self.Ws, self.Cs, self.Qs = Ws, Cs, Qs125        self.ws, self.b = ws, b126        self.labels = [127            (i, j)128            for i in range(len(self.ws))129            for j in range(len(self.ws[i]))130        ]131    @classmethod132    def from_str(cls, content, verbose=False):133        lst = utils.get_instance_data(content)134        ndims = lst.pop(0)135        nbtypes = lst.pop(0)136        Ws, Cs, Qs = [], [], []137        for i in range(nbtypes):138            Ws.append(lst[:ndims])139            lst = lst[ndims:]140            Cs.append(lst.pop(0))141            Qs.append(lst.pop(0))142        m = lst.pop(0)143        ws, b = [], []144        for i in range(m):145            ws.append([])146            qi = lst.pop(0)147            bi = lst.pop(0)148            b.append(bi)149            for j in range(qi):150                ws[i].append(lst[:ndims])151                lst = lst[ndims:]152        assert lst == []153        binary = bool(int(utils.get_opt("BINARY", content, False)))154        vtype = utils.get_opt("VTYPE", content, "I")155        return cls(Ws, Cs, Qs, ws, b, binary, vtype, verbose)156    @classmethod157    def from_file(cls, mvp_file, verbose=False):158        return cls.from_str(utils.get_content(mvp_file), verbose=verbose)159    @property160    def filename(self):161        """Return the filename."""162        return self.mvp_file163    def weights(self):164        """Return the item weights."""165        return {166            (i, j): tuple(self.ws[i][j])167            for i in range(len(self.ws))168            for j in range(len(self.ws[i]))169        }170    def capacities(self):171        """Return the bin capacities."""172        return list(map(tuple, self.Ws))173    def __del__(self):174        try:175            os.remove(self.mvp_file)176        except:177            pass178class AFG(object):179    """180    Wrapper for .afg files.181    """182    def __init__(self, instance, verbose=None):183        if instance is not None:184            assert isinstance(instance, (VBP, MVP))185            self.instance = instance186            self.afg_file = VPSolver.new_tmp_file(".afg")187            self.output = VPSolver.vbp2afg(188                instance, self.filename, verbose=verbose189            )190    @classmethod191    def from_file(cls, afg_file, verbose=None):192        obj = cls(None)193        obj.instance = MVP.from_file(afg_file)194        obj.afg_file = VPSolver.new_tmp_file(".afg")195        shutil.copyfile(afg_file, obj.afg_file)196        return obj197    def graph(self):198        """Return the graph as an AFGraph object."""199        content = utils.get_content(self.filename)200        labels = self.instance.labels201        S = int(utils.get_opt("S", content))202        Ts = list(map(int, utils.get_opt("Ts", content).split(",")))203        arcs = list(map(int, utils.get_opt("ARCS", content).split()))204        LOSS = int(utils.get_opt("LOSS", content))205        V, A = set([]), []206        for i in range(0, len(arcs), 3):207            u, v, i = arcs[i:i+3]208            V.add(u)209            V.add(v)210            A.append((u, v, labels[i] if i != LOSS else LOSS))211        graph = AFGraph(V, A, S, Ts, LOSS)212        lbls = {S: "S"}213        if len(Ts) == 1:214            lbls[Ts[0]] = "T"215        else:216            for t, new in zip(Ts, ["T{}".format(i+1) for i in range(len(Ts))]):217                lbls[t] = new218        graph.relabel(lambda u: lbls.get(u, u))219        return graph220    def draw(self, svg_file, lpaths=False, graph_attrs=None, verbose=False):221        """Draw the arc-flow graph in .svg format."""222        if lpaths:223            weights = self.instance.weights()224            capacities = self.instance.capacities()225        else:226            weights = None227            capacities = None228        self.graph().draw(229            svg_file, weights=weights, capacities=capacities, lpaths=lpaths,230            graph_attrs=graph_attrs, verbose=verbose231        )232    @property233    def filename(self):234        """Return the filename."""235        return self.afg_file236    def __del__(self):237        try:238            os.remove(self.afg_file)239        except:240            pass241class MPS(object):242    """243    Wrapper for .mps files.244    """245    def __init__(self, graph, verbose=None):246        assert isinstance(graph, AFG)247        self.afg_graph = graph248        self.mps_file = VPSolver.new_tmp_file(".mps")249        self.output = VPSolver.afg2mps(250            graph.filename, self.filename, verbose=verbose251        )252    @property253    def filename(self):254        """Return the filename."""255        return self.mps_file256    def __del__(self):257        try:258            os.remove(self.mps_file)259        except:260            pass261class LP(object):262    """263    Wrapper for .lp files.264    """265    def __init__(self, graph, verbose=None):266        assert isinstance(graph, AFG)267        self.afg_graph = graph268        self.lp_file = VPSolver.new_tmp_file(".lp")269        self.output = VPSolver.afg2lp(270            graph.filename, self.filename, verbose=verbose271        )272    @property273    def filename(self):274        """Return the filename."""275        return self.lp_file276    def __del__(self):277        try:278            os.remove(self.lp_file)279        except:280            pass281class VPSolver(object):282    """283    Tools to interact with VPSolver binaries and scripts.284    """285    VPSOLVER_EXEC = "vpsolver"286    VBP2AFG_EXEC = "vbp2afg"287    AFG2MPS_EXEC = "afg2mps"288    AFG2LP_EXEC = "afg2lp"289    VBPSOL_EXEC = "vbpsol"290    TMP_DIR = tempfile.mkdtemp()291    TMP_CNT = 0292    PLIST = []293    VERBOSE = True294    @staticmethod295    def set_verbose(verbose):296        """Enable/disable verbose output."""297        if verbose is not None:298            VPSolver.VERBOSE = verbose299    @staticmethod300    def new_tmp_file(ext="tmp"):301        """Create a temporary file."""302        if not ext.startswith("."):303            ext = ".{}".format(ext)304        fname = "{}/{}{}".format(VPSolver.TMP_DIR, VPSolver.TMP_CNT, ext)305        VPSolver.TMP_CNT += 1306        if not os.path.exists(VPSolver.TMP_DIR):307            os.makedirs(VPSolver.TMP_DIR)308        return fname309    @staticmethod310    @atexit.register311    def clear():312        """Delete temporary files and kills child processes."""313        for p in VPSolver.PLIST:314            try:315                os.killpg(p.pid, signal.SIGTERM)316            except:317                pass318        try:319            shutil.rmtree(VPSolver.TMP_DIR)320        except:321            pass322    @staticmethod323    def log(msg, verbose=None):324        """Log a message."""325        if verbose is None:326            verbose = VPSolver.VERBOSE327        if verbose:328            print(msg)329    @staticmethod330    def run(cmd, tee=None, grep=None, grepv=None, verbose=None):331        """Run a system command."""332        if verbose is None:333            verbose = VPSolver.VERBOSE334        proc = subprocess.Popen(335            cmd, shell=True,336            stdout=subprocess.PIPE,337            stderr=subprocess.STDOUT,338            preexec_fn=os.setsid339        )340        VPSolver.PLIST.append(proc)341        def pipe_output(fin, fout_list, grep=None, grepv=None):342            while True:343                line = fin.readline().decode("utf-8")344                if not line:345                    break346                if grep is not None and grep not in line:347                    continue348                if grepv is not None and grepv in line:349                    continue350                for f in fout_list:351                    if f is sys.stdout and line.startswith("PYSOL="):352                        continue353                    f.write(line)354                    f.flush()355        if tee is None:356            if verbose:357                pipe_output(proc.stdout, [sys.stdout], grep, grepv)358        else:359            with open(tee, "w") as ftee:360                if verbose:361                    pipe_output(proc.stdout, [sys.stdout, ftee], grep, grepv)362                else:363                    pipe_output(proc.stdout, [ftee], grep, grepv)364        exit_code = proc.wait()365        proc.stdout.close()366        if exit_code != 0:367            raise RuntimeError("failed to run '{}'".format(cmd))368    @staticmethod369    def parse_vbpsol(vpsol_output):370        """Transform 'vbpsol' solutions into python data."""371        marker = "PYSOL="372        if marker in vpsol_output:373            vpsol_output = vpsol_output[vpsol_output.find(marker)+len(marker):]374            vpsol_output = vpsol_output[:vpsol_output.find("\n")]375            obj, sol = eval(vpsol_output)376            return obj, sol377        else:378            return None379    @staticmethod380    def vbpsol(afg_file, sol_file, print_inst=False, pyout=True, verbose=None):381        """Call 'vbpsol' to extract a vector packing solution."""382        if isinstance(afg_file, AFG):383            afg_file = afg_file.filename384        out_file = VPSolver.new_tmp_file()385        opts = "{print_inst:d} {pyout:d}".format(386            print_inst=print_inst, pyout=pyout387        )388        VPSolver.run(389            "{} {} {} {}".format(390                VPSolver.VBPSOL_EXEC, afg_file, sol_file, opts391            ),392            tee=out_file,393            verbose=verbose394        )395        output = utils.get_content(out_file)396        os.remove(out_file)397        return VPSolver.parse_vbpsol(output)398    @staticmethod399    def vpsolver(instance_file, print_inst=False, pyout=True, verbose=None):400        """Call 'vpsolver' to solve .vbp instances."""401        if isinstance(instance_file, (VBP, MVP)):402            instance_file = instance_file.filename403        content = utils.get_content(instance_file)404        method = int(utils.get_opt("METHOD", content, -3))405        binary = int(utils.get_opt("BINARY", content, 0))406        vtype = utils.get_opt("VTYPE", content, "I")407        out_file = VPSolver.new_tmp_file()408        opts = "{method:d} {binary:d} {vtype} {print_inst:d} {pyout:d}".format(409            method=method, binary=binary, vtype=vtype,410            print_inst=print_inst, pyout=pyout411        )412        VPSolver.run(413            "{} {} {}".format(VPSolver.VPSOLVER_EXEC, instance_file, opts),414            tee=out_file,415            verbose=verbose416        )417        output = utils.get_content(out_file)418        os.remove(out_file)419        return output, VPSolver.parse_vbpsol(output)420    @staticmethod421    def vbp2afg(instance_file, afg_file, opts="", verbose=None):422        """Call 'vbp2afg' to create an arc-flow graph for a .vbp instance."""423        if isinstance(instance_file, (VBP, MVP)):424            instance_file = instance_file.filename425        out_file = VPSolver.new_tmp_file()426        VPSolver.run(427            "{} {} {} {}".format(428                VPSolver.VBP2AFG_EXEC, instance_file, afg_file, opts429            ),430            tee=out_file,431            verbose=verbose432        )433        output = utils.get_content(out_file)434        os.remove(out_file)435        return output436    @staticmethod437    def afg2mps(afg_file, mps_file, opts="", verbose=None):438        """Call 'afg2mps' to create a .mps model for an arc-flow graph."""439        if isinstance(afg_file, AFG):440            afg_file = afg_file.filename441        out_file = VPSolver.new_tmp_file()442        VPSolver.run(443            "{} {} {} {}".format(444                VPSolver.AFG2MPS_EXEC, afg_file, mps_file, opts445            ),446            tee=out_file,447            verbose=verbose448        )449        output = utils.get_content(out_file)450        os.remove(out_file)451        return output452    @staticmethod453    def afg2lp(afg_file, lp_file, opts="", verbose=None):454        """Call 'afg2lp' to create a .lp model for an arc-flow graph."""455        if isinstance(afg_file, AFG):456            afg_file = afg_file.filename457        out_file = VPSolver.new_tmp_file()458        VPSolver.run(459            "{} {} {} {}".format(460                VPSolver.AFG2LP_EXEC, afg_file, lp_file, opts461            ),462            tee=out_file,463            verbose=verbose464        )465        output = utils.get_content(out_file)466        os.remove(out_file)467        return output468    @staticmethod469    def afg2svg(afg_file, svg_file, verbose=None):470        """Draw a .afg arc-flow graph in .svg format."""471        if isinstance(afg_file, AFG):472            afg_file = afg_file.filename473        AFG.from_file(afg_file).draw(svg_file)474    @staticmethod475    def script(script_name, arg1=None, arg2=None, options=None, pyout=True,476               verbose=None):477        """Call a VPSolver script and return a vector packing solution."""478        cmd = script_name479        for arg in [arg1, arg2]:480            if isinstance(arg, MPS):481                cmd += " --mps {}".format(arg.filename)482            elif isinstance(arg, LP):483                cmd += " --lp {}".format(arg.filename)484            elif isinstance(arg, AFG):485                cmd += " --afg {}".format(arg.filename)486            elif isinstance(arg, VBP):487                cmd += " --vbp {}".format(arg.filename)488            elif isinstance(arg, MVP):489                cmd += " --mvp {}".format(arg.filename)490            elif isinstance(arg, six.string_types):491                if arg.endswith(".mps"):492                    cmd += " --mps {}".format(arg)493                elif arg.endswith(".lp"):494                    cmd += " --lp {}".format(arg)495                elif arg.endswith(".afg"):496                    cmd += " --afg {}".format(arg)497                elif arg.endswith(".vbp"):498                    cmd += " --vbp {}".format(arg)499                elif arg.endswith(".mvp"):500                    cmd += " --mvp {}".format(arg)501                else:502                    raise Exception("Invalid file extension!")503        if options is not None:504            cmd += " --options \"{}\"".format(options)505        if pyout is True:506            cmd += " --pyout"507        out_file = VPSolver.new_tmp_file()508        VPSolver.run(cmd, tee=out_file, verbose=verbose)509        output = utils.get_content(out_file)510        os.remove(out_file)511        return output, VPSolver.parse_vbpsol(output)512    @staticmethod513    def script_wsol(script_name, model, options=None, verbose=None):514        """Call a solver script and return the solution."""515        from pympl import Tools516        if verbose is None:517            verbose = VPSolver.VERBOSE518        if isinstance(model, (LP, MPS)):519            model = model.filename520        return Tools.script(521            script_name=script_name, model=model, options=options,...test_vpsolver.py
Source:test_vpsolver.py  
...21    """Test vbpsolver."""22    from pyvpsolver import VPSolver23    from pyvpsolver.solvers import vbpsolver24    W, w, b = (1,), [(1,)], [1]25    lp_file = VPSolver.new_tmp_file(".lp")26    mps_file = VPSolver.new_tmp_file(".mps")27    svg_file = VPSolver.new_tmp_file(".svg")28    solution = vbpsolver.solve(W, w, b, script="vpsolver_glpk.sh")29    vbpsolver.print_solution(solution)30    obj, patterns = solution31    assert obj == 132    solution = vbpsolver.solve(33        W, w, b, lp_file=lp_file, mps_file=mps_file, svg_file=svg_file,34        script="vpsolver_glpk.sh"35    )36    vbpsolver.print_solution(solution)37    obj, patterns = solution38    assert obj == 139    vbpsolver.print_solution(obj, patterns)40def test_mvpsolvers():41    """Test mvpsolvers."""42    from pyvpsolver import VPSolver43    from pyvpsolver.solvers import mvpsolver2013, mvpsolver201644    Ws = [(100, 75), (75, 50), (75, 50), (100, 100)]45    Cs = [3, 2, 3, 100]46    Qs = [inf, -1, -1, -1]47    ws = [[(75, 50)], [(40, 75), (25, 25)]]48    b = [2, 1]49    for mvpsolver in [mvpsolver2013, mvpsolver2016]:50        solution = mvpsolver.solve(51            Ws, Cs, Qs, ws, b, script="vpsolver_glpk.sh"52        )53        mvpsolver.print_solution(solution)54        obj, patterns = solution55        assert obj == 556        lp_file = VPSolver.new_tmp_file(".lp")57        mps_file = VPSolver.new_tmp_file(".mps")58        svg_file = VPSolver.new_tmp_file(".svg")59        solution = mvpsolver.solve(60            Ws, Cs, Qs, ws, b, lp_file=lp_file, mps_file=mps_file,61            svg_file=svg_file, script="vpsolver_glpk.sh", verbose=True62        )63        mvpsolver.print_solution(solution)64        obj, patterns = solution65        assert obj == 566        mvpsolver.print_solution(obj, patterns)67def test_scripts():68    """Test scripts."""69    from pyvpsolver import VPSolver, VBP, MVP, AFG, LP, MPS70    VPSolver.clear()71    vbp = VBP(W=(1,), w=[(1,)], b=[1], verbose=True)72    mvp = MVP(Ws=[(1,)], Cs=[1], Qs=[inf], ws=[[(1,)]], b=[1], verbose=True)73    for instance in [vbp, mvp]:74        afg = AFG(instance, verbose=True)75        lp = LP(afg, verbose=True)76        mps = MPS(afg, verbose=True)77        VPSolver.set_verbose(False)78        output, solution = VPSolver.script(79            "vpsolver_glpk.sh", instance, options="--seed 1234"80        )81        assert solution[0] == 182        if isinstance(instance, (VBP, MVP)):83            instance_file = instance.filename84        output, solution = VPSolver.script("vpsolver_glpk.sh", instance_file)85        assert solution[0] == 186        output, solution = VPSolver.script("vpsolver_glpk.sh", afg)87        assert solution[0] == 188        output, solution = VPSolver.script("vpsolver_glpk.sh", afg, lp)89        assert solution[0] == 190        output, solution = VPSolver.script("vpsolver_glpk.sh", afg, mps)91        assert solution[0] == 192        output, solution = VPSolver.script("vpsolver_glpk.sh", lp)93        assert solution is None94        output, solution = VPSolver.script("vpsolver_glpk.sh", mps)95        assert solution is None96        output, solution = VPSolver.script("vpsolver_glpk.sh", afg.filename)97        assert solution[0] == 198        output, solution = VPSolver.script("vpsolver_glpk.sh", lp.filename)99        assert solution is None100        output, solution = VPSolver.script("vpsolver_glpk.sh", mps.filename)101        assert solution is None102def test_vbpsol():103    """Test vbpsol."""104    from pyvpsolver import VPSolver, VBP, MVP, AFG, LP, MPS105    vbp = VBP(W=(1,), w=[(1,)], b=[1], verbose=True)106    afg = AFG(vbp, verbose=True)107    lp = LP(afg, verbose=True)108    sol_file = VPSolver.new_tmp_file(".sol")109    output, solution = VPSolver.script_wsol("vpsolver_glpk.sh", lp)110    assert isinstance(solution, dict)111    with open(sol_file, "w") as f:112        lst = []113        for var, value in solution.items():114            lst.append(str(var))115            lst.append(str(value))116        print(" ".join(lst), file=f)117    obj, patterns = VPSolver.vbpsol(afg, sol_file)118    assert obj == 1119def test_draw():120    """Test scripts."""121    from pyvpsolver import VPSolver, VBP, MVP, AFG122    vbp = VBP(W=(1,), w=[(1,)], b=[1])123    mvp = MVP(Ws=[(1,)], Cs=[1], Qs=[inf], ws=[[(1,)]], b=[1])124    svg_file = VPSolver.new_tmp_file(".svg")125    for instance in [vbp, mvp]:126        afg = AFG(instance)127        try:128            afg.draw(129                svg_file, lpaths=True, graph_attrs={"size": "8,8"}130            )131        except Exception as e:132            print(repr(e))133        try:134            VPSolver.afg2svg(afg, svg_file)135        except Exception as e:136            print(repr(e))137        try:138            VPSolver.afg2svg(afg.filename, svg_file)139        except Exception as e:140            print(repr(e))141def test_lowlevel():142    """Test low-level API."""143    from pyvpsolver import VPSolver, VBP, MVP, AFG144    vbp = VBP(W=(1,), w=[(1,)], b=[1])145    mvp = MVP(Ws=[(1,)], Cs=[1], Qs=[inf], ws=[[(1,)]], b=[1])146    afg_file = VPSolver.new_tmp_file(".afg")147    lp_file = VPSolver.new_tmp_file(".lp")148    mps_file = VPSolver.new_tmp_file(".mps")149    svg_file = VPSolver.new_tmp_file(".svg")150    VPSolver.vbp2afg(vbp, afg_file)151    VPSolver.vbp2afg(mvp, afg_file)152    VPSolver.vbp2afg(vbp.filename, afg_file)153    VPSolver.vbp2afg(mvp.filename, afg_file)154    VPSolver.afg2lp(afg_file, lp_file)155    VPSolver.afg2mps(afg_file, mps_file)156    VPSolver.afg2lp(AFG(vbp), lp_file)157    VPSolver.afg2mps(AFG(mvp), mps_file)158if __name__ == "__main__":159    test_vbpsolver()160    test_mvpsolvers()161    test_scripts()162    test_vbpsol()163    test_draw()...tools.py
Source:tools.py  
...35        """Enable/disable verbose output."""36        if verbose is not None:37            Tools.VERBOSE = verbose38    @staticmethod39    def new_tmp_file(ext="tmp"):40        """Create temporary files."""41        if not ext.startswith("."):42            ext = ".{0}".format(ext)43        fname = "{0}/{1}{2}".format(Tools.TMP_DIR, Tools.TMP_CNT, ext)44        Tools.TMP_CNT += 145        if not os.path.exists(Tools.TMP_DIR):46            os.makedirs(Tools.TMP_DIR)47        return fname48    @staticmethod49    @atexit.register50    def clear():51        """Delete temporary files and kill child processes."""52        for p in Tools.PLIST:53            try:54                os.killpg(p.pid, signal.SIGTERM)55            except:56                pass57        try:58            shutil.rmtree(Tools.TMP_DIR)59        except:60            pass61    @staticmethod62    def log(msg, verbose=None):63        """Log function."""64        if verbose is None:65            verbose = Tools.VERBOSE66        if verbose:67            print(msg)68    @staticmethod69    def run(cmd, tee=None, grep=None, grepv=None, verbose=None):70        """Run a system command."""71        if verbose is None:72            verbose = Tools.VERBOSE73        proc = subprocess.Popen(74            cmd, shell=True,75            stdout=subprocess.PIPE,76            stderr=subprocess.STDOUT,77            preexec_fn=os.setsid78        )79        Tools.PLIST.append(proc)80        def pipe_output(fin, fout_list, grep=None, grepv=None):81            while True:82                line = fin.readline().decode("utf-8")83                if not line:84                    break85                if grep is not None and grep not in line:86                    continue87                if grepv is not None and grepv in line:88                    continue89                for f in fout_list:90                    f.write(line)91                    f.flush()92        if tee is None:93            if verbose:94                pipe_output(proc.stdout, [sys.stdout], grep, grepv)95        else:96            with open(tee, "w") as ftee:97                if verbose:98                    pipe_output(proc.stdout, [sys.stdout, ftee], grep, grepv)99                else:100                    pipe_output(proc.stdout, [ftee], grep, grepv)101        exit_code = proc.wait()102        proc.stdout.close()103        if exit_code != 0:104            raise RuntimeError("failed to run '{0}'".format(cmd))105    @staticmethod106    def script(script_name, model, options=None, verbose=None):107        """Call a solver script and returns the solutions."""108        cmd = script_name109        if model.endswith(".mps"):110            cmd += " --mps {0}".format(model)111        elif model.endswith(".lp"):112            cmd += " --lp {0}".format(model)113        else:114            raise Exception("Invalid file extension!")115        if options is not None:116            cmd += " --options \"{0}\"".format(options)117        out_file = Tools.new_tmp_file()118        sol_file = Tools.new_tmp_file(".sol")119        Tools.run(120            "{0} --wsol {1}".format(cmd, sol_file),121            tee=out_file,122            verbose=verbose123        )124        with open(out_file) as f:125            output = f.read()126        os.remove(out_file)127        try:128            with open(sol_file) as f:129                sol = f.read().split()130                values = {}131                assert len(sol) % 2 == 0132                for i in range(0, len(sol), 2):...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
