Beispiel #1
0
def test_eval():
    """Test ${expression}$ calls."""
    parser = PyMPL()
    parser.input = """
    s.t. con1: x + y <= ${abs((2**7)//5-135)}$ * z;
    var x1, >= ${2+6}$, <= ${10*5}$;
    """
    parser.parse(comment_cmds=False)
    assert "s.t. con1: x + y <= 110 * z;" in parser.output
    assert "var x1, >= 8, <= 50;" in parser.output
Beispiel #2
0
def test_eval():
    """Test ${expression}$ calls."""
    parser = PyMPL()
    parser.input = """
    s.t. con1: x + y <= ${abs((2**7)//5-135)}$ * z;
    var x1, >= ${2+6}$, <= ${10*5}$;
    """
    parser.parse(comment_cmds=False)
    assert "s.t. con1: x + y <= 110 * z;" in parser.output
    assert "var x1, >= 8, <= 50;" in parser.output
Beispiel #3
0
def test_stmt():
    """Test $STMT{stmt} calls."""
    parser = PyMPL()
    parser.input = """
    $STMT{"s.t. con1: x + y <= {0} * z;".format(abs((2**7)//5-135))};
    $EXEC{stmt = "s.t. {0}: x >= 10;".format("test")};
    $STMT{stmt};
    """
    parser.parse(comment_cmds=False)
    assert "s.t. con1: x + y <= 110 * z;" in parser.output
    assert "s.t. test: x >= 10;" in parser.output
Beispiel #4
0
def test_stmt():
    """Test $STMT{stmt} calls."""
    parser = PyMPL()
    parser.input = """
    $STMT{"s.t. con1: x + y <= {0} * z;".format(abs((2**7)//5-135))};
    $EXEC{stmt = "s.t. {0}: x >= 10;".format("test")};
    $STMT{stmt};
    """
    parser.parse(comment_cmds=False)
    assert "s.t. con1: x + y <= 110 * z;" in parser.output
    assert "s.t. test: x >= 10;" in parser.output
Beispiel #5
0
def test_set():
    """Test $SET[name]{values} calls."""
    parser = PyMPL()
    parser.input = """
    $SET[A]{range(5)};
    $SET[B]{zip(range(5),range(5))};
    $SET[^C]{range(5)};
    """
    parser.parse(comment_cmds=False)
    assert "set A := {0,1,2,3,4};" in parser.output
    assert "set B := {(0,0),(1,1),(2,2),(3,3),(4,4)};" in parser.output
    assert "set C := {0,1,2,3,4};" not in parser.output
    assert "set ^C := {0,1,2,3,4};" not in parser.output
Beispiel #6
0
def test_set():
    """Test $SET[name]{values} calls."""
    parser = PyMPL()
    parser.input = """
    $SET[A]{range(5)};
    $SET[B]{zip(range(5),range(5))};
    $SET[^C]{range(5)};
    """
    parser.parse(comment_cmds=False)
    assert "set A := {0,1,2,3,4};" in parser.output
    assert "set B := {(0,0),(1,1),(2,2),(3,3),(4,4)};" in parser.output
    assert "set C := {0,1,2,3,4};" not in parser.output
    assert "set ^C := {0,1,2,3,4};" not in parser.output
Beispiel #7
0
def solve_worker(app_name, method, form, args, output=sys.stdout):
    """Worker for solving the problem in a separate process."""
    VPSolver.PLIST = []

    def signal_handler(sig, frame):
        """Signal handler for cleaner exit."""
        for p in VPSolver.PLIST:
            try:
                os.killpg(p.pid, signal.SIGTERM)
            except Exception as e:
                pass
        sys.exit(0)
    signal.signal(signal.SIGTERM, signal_handler)

    sys.stdout = output
    sys.stderr = output
    input_ = form["input"].strip("\n")
    if DEBUG:
        print("Input:\n{0}\n\nOutput:".format(input_))
        output.flush()

    if app_name == "vbp":
        tmpfile = VPSolver.new_tmp_file(ext=".vbp")
        with open(tmpfile, "w") as f:
            f.write(input_)
        instance = VBP.from_file(tmpfile, verbose=False)
        afg = AFG(instance, verbose=True)
        lp_model = LP(afg, verbose=False)
        out, sol = VPSolver.script(
            form["script"], lp_model, afg,
            verbose=True
        )
    elif app_name == "pympl":
        tmpfile = VPSolver.new_tmp_file(ext=".mod")
        parser = PyMPL()
        parser.input = input_
        parser.parse()
        parser.write(tmpfile)
        VPSolver.run(
            "glpsol --math {0}".format(tmpfile),
            grepv="Generating",
            verbose=True
        )

    print("EOF\n")
    output.flush()
Beispiel #8
0
def test_comments():
    """Test valid comments."""
    parser = PyMPL()
    parser.input = """
    /* ... $SET[A]{range(5)}; ... */
    # $PARAM[VALUE]{10};
    # ... $PARAM[VALUE2]{10}; ...
    param a := "\\"/*";
    $PARAM[Y]{10};
    param b := "*/";
    """
    parser.parse(comment_cmds=True)
    assert "set A := {0,1,2,3,4};" not in parser.output
    assert "param VALUE := 10;" not in parser.output
    assert "param VALUE2 := 10;" not in parser.output
    assert "param Y := 10;" in parser.output
    assert "# $PARAM[VALUE]{10};" in parser.output
    assert "/*EVALUATED:PARAM[Y]{10}*/" in parser.output
Beispiel #9
0
def test_comments():
    """Test valid comments."""
    parser = PyMPL()
    parser.input = """
    /* ... $SET[A]{range(5)}; ... */
    # $PARAM[VALUE]{10};
    # ... $PARAM[VALUE2]{10}; ...
    param a := "\\"/*";
    $PARAM[Y]{10};
    param b := "*/";
    """
    parser.parse(comment_cmds=True)
    assert "set A := {0,1,2,3,4};" not in parser.output
    assert "param VALUE := 10;" not in parser.output
    assert "param VALUE2 := 10;" not in parser.output
    assert "param Y := 10;" in parser.output
    assert "# $PARAM[VALUE]{10};" in parser.output
    assert "/*EVALUATED:PARAM[Y]{10}*/" in parser.output
Beispiel #10
0
def test_var():
    """Test $VAR[name]{typ, lb, ub} calls."""
    parser = PyMPL()
    parser.input = """
    $VAR[x]{"integer", 0, 10};
    $VAR[y]{"binary"};
    $VAR[z]{ub=abs((2**7)//5-135)};
    $VAR[^z]{"integer", 0, 10};
    $VAR[xs{I}]{"integer", index_set=range(3)};
    $EXEC{VAR['y']("binary")};
    """
    parser.parse(comment_cmds=False)
    assert "var x, integer, >= 0, <= 10;" in parser.output
    assert "var y, binary;" in parser.output
    assert "var z, <= 110;" in parser.output
    assert "var ^z, integer, >= 0, <= 10;" not in parser.output
    assert "var y, binary;" in parser.output
    assert "var xs{I}, integer;" in parser.output
    assert "set I := {0,1,2};" in parser.output
Beispiel #11
0
def test_var():
    """Test $VAR[name]{typ, lb, ub} calls."""
    parser = PyMPL()
    parser.input = """
    $VAR[x]{"integer", 0, 10};
    $VAR[y]{"binary"};
    $VAR[z]{ub=abs((2**7)//5-135)};
    $VAR[^z]{"integer", 0, 10};
    $VAR[xs{I}]{"integer", index_set=range(3)};
    $EXEC{VAR['y']("binary")};
    """
    parser.parse(comment_cmds=False)
    assert "var x, integer, >= 0, <= 10;" in parser.output
    assert "var y, binary;" in parser.output
    assert "var z, <= 110;" in parser.output
    assert "var ^z, integer, >= 0, <= 10;" not in parser.output
    assert "var y, binary;" in parser.output
    assert "var xs{I}, integer;" in parser.output
    assert "set I := {0,1,2};" in parser.output
Beispiel #12
0
def test_param():
    """Test $PARAM[name]{value} calls."""
    parser = PyMPL()
    parser.input = """
    $PARAM[NAME]{"name"};
    $PARAM[VALUE]{10};
    $PARAM[D{I}]{{'a': 1}};
    $PARAM[L0]{[1,2,3], i0=0};
    $PARAM[L1]{[1,2,3], i0=1};
    $PARAM[^NAME2]{"something"};
    """
    parser.parse(comment_cmds=False)
    assert "param NAME := 'name';" in parser.output
    assert "param VALUE := 10;" in parser.output
    assert "param D := ['a']1;" in parser.output
    assert "set I := {'a'};" in parser.output
    assert "param L0 := [0]1[1]2[2]3;" in parser.output
    assert "param L1 := [1]1[2]2[3]3;" in parser.output
    assert "param NAME2 := 'something';" not in parser.output
    assert "param ^NAME2 := 'something';" not in parser.output
Beispiel #13
0
def test_param():
    """Test $PARAM[name]{value} calls."""
    parser = PyMPL()
    parser.input = """
    $PARAM[NAME]{"name"};
    $PARAM[VALUE]{10};
    $PARAM[D{I}]{{'a': 1}};
    $PARAM[L0]{[1,2,3], i0=0};
    $PARAM[L1]{[1,2,3], i0=1};
    $PARAM[^NAME2]{"something"};
    """
    parser.parse(comment_cmds=False)
    assert "param NAME := 'name';" in parser.output
    assert "param VALUE := 10;" in parser.output
    assert "param D := ['a']1;" in parser.output
    assert "set I := {'a'};" in parser.output
    assert "param L0 := [0]1[1]2[2]3;" in parser.output
    assert "param L1 := [1]1[2]2[3]3;" in parser.output
    assert "param NAME2 := 'something';" not in parser.output
    assert "param ^NAME2 := 'something';" not in parser.output
Beispiel #14
0
def test_con():
    """Test $CON[name]{lincomb, sign, rhs} calls."""
    parser = PyMPL()
    parser.input = """
    $VAR[x1]{}; $VAR[x2]{}; $VAR[x3]{};
    $CON[con1]{[("x1",5),("x2",15),("x3",10)],">=",20};
    $CON[con2]{[("x1",5),("x2",15),-20],">=",("x3",-10)};
    $CON[con3]{[("x1",5)],">=",[("x2",-15),("x3",-10),20]};
    $CON[con4]{-20,">=",[("x1",-5),("x2",-15),("x3",-10)]};
    $CON[con5]{-20,">=",[(-5, "x1"),("x2",-15),(-10, "x3")]};
    $CON[con6]{[-20, "x1"],">=",[(-4, "x1"),("x2",-15),(-10, "x3")]};
    $CON[con7]{"x1",">=",[(-4, "x1"),20,("x2",-15),(-10, "x3")]};
    $CON[^xyz]{[("x1",5),("x2",15),("x3",10)],">=",20};
    """
    parser.parse(comment_cmds=False)
    assert "s.t. con1: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con2: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con3: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con4: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con5: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con6: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con7: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. xyz: +5*x1 +15*x2 +10*x3 >= 20;" not in parser.output
Beispiel #15
0
def test_con():
    """Test $CON[name]{lincomb, sign, rhs} calls."""
    parser = PyMPL()
    parser.input = """
    $VAR[x1]{}; $VAR[x2]{}; $VAR[x3]{};
    $CON[con1]{[("x1",5),("x2",15),("x3",10)],">=",20};
    $CON[con2]{[("x1",5),("x2",15),-20],">=",("x3",-10)};
    $CON[con3]{[("x1",5)],">=",[("x2",-15),("x3",-10),20]};
    $CON[con4]{-20,">=",[("x1",-5),("x2",-15),("x3",-10)]};
    $CON[con5]{-20,">=",[(-5, "x1"),("x2",-15),(-10, "x3")]};
    $CON[con6]{[-20, "x1"],">=",[(-4, "x1"),("x2",-15),(-10, "x3")]};
    $CON[con7]{"x1",">=",[(-4, "x1"),20,("x2",-15),(-10, "x3")]};
    $CON[^xyz]{[("x1",5),("x2",15),("x3",10)],">=",20};
    """
    parser.parse(comment_cmds=False)
    assert "s.t. con1: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con2: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con3: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con4: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con5: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con6: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. con7: +5*x1 +15*x2 +10*x3 >= 20;" in parser.output
    assert "s.t. xyz: +5*x1 +15*x2 +10*x3 >= 20;" not in parser.output
Beispiel #16
0
def test_exceptions():
    """Test if exceptions are being thrown correctly."""
    parser = PyMPL()
    parser.input = """$EXEC{print(1/0)};"""
    with pytest.raises(ZeroDivisionError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[X]{0};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$VBP_FLOW[Z]{100, [10, 10]};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$VBP_FLOW[Z]{100, 10};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[X]{};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[X]{[1,2,3]};$SET[X]{[1,2]};"""
    with pytest.raises(AssertionError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[2X]{[1,2,3]};"""
    with pytest.raises(AssertionError):
        parser.parse(comment_cmds=False)
Beispiel #17
0
def test_exceptions():
    """Test if exceptions are being thrown correctly."""
    parser = PyMPL()
    parser.input = """$EXEC{print(1/0)};"""
    with pytest.raises(ZeroDivisionError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[X]{0};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$VBP_FLOW[Z]{100, [10, 10]};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$VBP_FLOW[Z]{100, 10};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[X]{};"""
    with pytest.raises(TypeError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[X]{[1,2,3]};$SET[X]{[1,2]};"""
    with pytest.raises(AssertionError):
        parser.parse(comment_cmds=False)
    parser.input = """$SET[2X]{[1,2,3]};"""
    with pytest.raises(AssertionError):
        parser.parse(comment_cmds=False)
Beispiel #18
0
def test_empty():
    """Test empty files."""
    parser = PyMPL()
    parser.input = ""
    parser.parse(comment_cmds=False)
    assert parser.output == ""
Beispiel #19
0
def test_empty():
    """Test empty files."""
    parser = PyMPL()
    parser.input = ""
    parser.parse(comment_cmds=False)
    assert parser.output == ""