From eff4bd04d2e26f6d7a36f22cb6cc865069d921be Mon Sep 17 00:00:00 2001 From: Mohammed Ghannam Date: Wed, 3 Apr 2024 00:20:44 +0200 Subject: [PATCH] Fix pipelines (#834) * Use backwards compatible type hint * Install bison in macos pipeline * Enable integration test for pull requests for now * Install locales needed by tests in ubuntu integration test * Turn off again integration tests for PRs --- .github/workflows/integration-test.yml | 5 +++- src/pyscipopt/recipes/piecewise.py | 41 ++++++++++++++------------ 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 6e9d1e95a..b56129a34 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -25,6 +25,9 @@ jobs: wget --quiet --no-check-certificate https://github.com/scipopt/scip/releases/download/$(echo "v${{env.version}}" | tr -d '.')/SCIPOptSuite-${{ env.version }}-Linux-ubuntu20.deb sudo apt-get update && sudo apt install -y ./SCIPOptSuite-${{ env.version }}-Linux-ubuntu20.deb + - name: Install locales for tests + run: sudo apt-get install tzdata locales -y && sudo locale-gen pt_PT && sudo update-locale # add pt_PT locale that is used in tests + - name: Setup python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: @@ -109,7 +112,7 @@ jobs: - name: Install dependencies (SCIPOptSuite) if: steps.cache-scip.outputs.cache-hit != 'true' run: | - brew install tbb boost + brew install tbb boost bison wget --quiet --no-check-certificate https://github.com/scipopt/scip/releases/download/$(echo "v${{env.version}}" | tr -d '.')/scipoptsuite-${{ env.version }}.tgz tar xfz scipoptsuite-${{ env.version }}.tgz cd scipoptsuite-${{ env.version }} diff --git a/src/pyscipopt/recipes/piecewise.py b/src/pyscipopt/recipes/piecewise.py index 7540414da..05029a574 100644 --- a/src/pyscipopt/recipes/piecewise.py +++ b/src/pyscipopt/recipes/piecewise.py @@ -1,9 +1,12 @@ +from typing import List from pyscipopt import Model, quicksum, Variable, Constraint -def add_piecewise_linear_cons(model: Model, X: Variable, Y: Variable, a: list[float], b: list[float]) -> Constraint: - """add constraint of the form y = f(x), where f is a piecewise linear function +def add_piecewise_linear_cons(model: Model, X: Variable, Y: Variable, a: List[float], b: List[float]) -> Constraint: + """add constraint of the form y = f(x), where f is a piecewise linear function + + :param model: pyscipopt model to add the constraint to :param X: x variable :param Y: y variable :param a: array with x-coordinates of the points in the piecewise linear relation @@ -12,25 +15,25 @@ def add_piecewise_linear_cons(model: Model, X: Variable, Y: Variable, a: list[fl Disclaimer: For the moment, can only model 2d piecewise linear functions Adapted from https://github.com/scipopt/PySCIPOpt/blob/master/examples/finished/piecewise.py """ - assert len(a) == len(b), "Must have the same number of x and y-coordinates" + assert len(a) == len(b), "Must have the same number of x and y-coordinates" + + K = len(a) - 1 + w, z = {}, {} + for k in range(K): + w[k] = model.addVar(lb=-model.infinity()) + z[k] = model.addVar(vtype="B") + + for k in range(K): + model.addCons(w[k] >= a[k] * z[k]) + model.addCons(w[k] <= a[k + 1] * z[k]) - K = len(a)-1 - w,z = {},{} - for k in range(K): - w[k] = model.addVar(lb=-model.infinity()) - z[k] = model.addVar(vtype="B") + model.addCons(quicksum(z[k] for k in range(K)) == 1) - for k in range(K): - model.addCons(w[k] >= a[k]*z[k]) - model.addCons(w[k] <= a[k+1]*z[k]) + model.addCons(X == quicksum(w[k] for k in range(K))) - model.addCons(quicksum(z[k] for k in range(K)) == 1) + c = [float(b[k + 1] - b[k]) / (a[k + 1] - a[k]) for k in range(K)] + d = [b[k] - c[k] * a[k] for k in range(K)] - model.addCons(X == quicksum(w[k] for k in range(K))) + new_cons = model.addCons(Y == quicksum(d[k] * z[k] + c[k] * w[k] for k in range(K))) - c = [float(b[k+1]-b[k]) / (a[k+1]-a[k]) for k in range(K)] - d = [b[k] - c[k]*a[k] for k in range(K)] - - new_cons = model.addCons(Y == quicksum(d[k]*z[k] + c[k]*w[k] for k in range(K))) - - return new_cons + return new_cons