From 0528b858c4f88b6437d0bb5c18fcdd3219865f2e Mon Sep 17 00:00:00 2001
From: Steinmann Victor <victor.steinmann@arcor.de>
Date: Sun, 2 Feb 2025 22:51:03 +0100
Subject: [PATCH] tidied up functions used to express constraints

---
 optimierung_pymoo.ipynb | 189 +++++++++++++++++++++++++---------------
 1 file changed, 120 insertions(+), 69 deletions(-)

diff --git a/optimierung_pymoo.ipynb b/optimierung_pymoo.ipynb
index 6d28256..1ba4db9 100644
--- a/optimierung_pymoo.ipynb
+++ b/optimierung_pymoo.ipynb
@@ -58,8 +58,17 @@
      "output_type": "stream",
      "text": [
       "Defaulting to user installation because normal site-packages is not writeable\n",
-      "Requirement already satisfied: pyomo in c:\\users\\steinmann\\appdata\\roaming\\python\\python312\\site-packages (6.8.2)\n",
-      "Requirement already satisfied: ply in c:\\users\\steinmann\\appdata\\roaming\\python\\python312\\site-packages (from pyomo) (3.11)\n"
+      "Collecting pyomo\n",
+      "  Downloading Pyomo-6.8.2-py3-none-any.whl.metadata (8.0 kB)\n",
+      "Collecting ply (from pyomo)\n",
+      "  Downloading ply-3.11-py2.py3-none-any.whl.metadata (844 bytes)\n",
+      "Downloading Pyomo-6.8.2-py3-none-any.whl (3.7 MB)\n",
+      "   ---------------------------------------- 0.0/3.7 MB ? eta -:--:--\n",
+      "   ---------------------------- ----------- 2.6/3.7 MB 12.6 MB/s eta 0:00:01\n",
+      "   ---------------------------------------- 3.7/3.7 MB 11.6 MB/s eta 0:00:00\n",
+      "Downloading ply-3.11-py2.py3-none-any.whl (49 kB)\n",
+      "Installing collected packages: ply, pyomo\n",
+      "Successfully installed ply-3.11 pyomo-6.8.2\n"
      ]
     },
     {
@@ -67,8 +76,8 @@
      "output_type": "stream",
      "text": [
       "\n",
-      "[notice] A new release of pip is available: 24.2 -> 25.0\n",
-      "[notice] To update, run: C:\\Program Files\\Python312\\python.exe -m pip install --upgrade pip\n"
+      "[notice] A new release of pip is available: 24.3.1 -> 25.0\n",
+      "[notice] To update, run: C:\\Users\\Victor\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n"
      ]
     }
    ],
@@ -78,7 +87,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
@@ -108,7 +117,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
@@ -164,7 +173,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -174,7 +183,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -207,17 +216,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "{None: {'nodes': ['source', 'pump1', 'pump2', 'valveA', 'valveB', 'valveC'], 'pumps': ['pump1', 'pump2'], 'valves': ['valveA', 'valveB', 'valveC'], 'Q_valve': {'valveA': 1.0, 'valveB': 1.0, 'valveC': 2.0}}}\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "#defining abstract modell for given Network\n",
     "import pyomo.environ as pyo\n",
@@ -237,23 +238,21 @@
     "\n",
     "#Optimierungsvariable\n",
     "modell.n = pyo.Var(modell.pumps,bounds=(750/3600,1))\n",
-    "modell.Q = pyo.Var(modell.nodes)\n",
+    "modell.Q = pyo.Var(modell.nodes,bounds=(0.,10.))\n",
     "\n",
     "#expressions for constraints:\n",
     "def PumpFlow(modell,pump):\n",
-    "    return np.dot(np.array([modell.Q[pump]**2,modell.n[pump]*modell.Q[pump],modell.n[pump]**2]),LR_H.coef_)\n",
+    "    return pyo.summation(np.array([modell.Q[pump]**2, modell.n[pump]*modell.Q[pump], modell.n[pump]**2]),LR_H.coef_,index=[0,1,2])\n",
     "def Pump_delivery_req(modell,pump):\n",
     "    return PumpFlow(modell,pump) ==pyo.summation(modell.Q,index=graph.successors(pump))\n",
     "\n",
-    "\n",
     "def valve_req_rule(modell,valve):\n",
     "    return modell.Q[valve]>=modell.Q_valve[valve]\n",
     "\n",
-    "#modell.Flow_Objective = pyo.Objective(modell.pumps,rule=Flow_req,sense=pyo.minimize)\n",
-    "\n",
-    "#Constaints\n",
-    "def continuityRule(modell,node):\n",
-    "    return pyo.summation(modell.Q, index=graph.predecessors(node))==pyo.summation(modell.Q, index=graph.successors(node))\n",
+    "def continuity_inflow(modell,node):\n",
+    "    return  modell.Q[node]==pyo.summation(modell.Q, index=graph.successors(node))\n",
+    "def continuity_outflow(modell,node):\n",
+    "    return modell.Q[node]==pyo.summation(modell.Q,index=graph.predecessors(node))\n",
     "\n",
     "#Objective\n",
     "def PumpPower(modell):\n",
@@ -262,18 +261,7 @@
     "            [modell.Q[i]**3,(modell.Q[i]**2)*modell.n[i],modell.Q[i]*modell.n[i]**2,modell.n[i]**3]\n",
     "            ),LR_P.coef_\n",
     "            ) for i in modell.pumps)\n",
-    "modell.Power_Objective = pyo.Objective(rule=PumpPower,sense=pyo.minimize)\n",
-    "\n",
-    "TestData={\n",
-    "    None:{\n",
-    "        \n",
-    "        'nodes':[key for key in graph.nodes.keys()],\n",
-    "        'pumps':[key for key in graph.nodes.keys() if 'pump' in key],\n",
-    "        'valves':[key for key in graph.nodes.keys() if 'valve' in key],\n",
-    "        'Q_valve':{'valveA':1.,'valveB':1.,'valveC':2.},\n",
-    "    }\n",
-    "}\n",
-    "print(TestData)"
+    "modell.Power_Objective = pyo.Objective(rule=PumpPower,sense=pyo.minimize)"
    ]
   },
   {
@@ -289,79 +277,142 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 87,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "SCIP version 9.2.0 [precision: 8 byte] [memory: block] [mode: optimized] [LP solver: Soplex 7.1.2] [GitHash: 74cea9222e]\n",
-      "Copyright (c) 2002-2024 Zuse Institute Berlin (ZIB)\n",
+      "SCIP version 9.2.1 [precision: 8 byte] [memory: block] [mode: optimized] [LP solver: Soplex 7.1.3] [GitHash: 0d2d3c7c2d]\n",
+      "Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB)\n",
       "\n",
       "External libraries: \n",
-      "  Soplex 7.1.2         Linear Programming Solver developed at Zuse Institute Berlin (soplex.zib.de) [GitHash: b040369c]\n",
+      "  Soplex 7.1.3         Linear Programming Solver developed at Zuse Institute Berlin (soplex.zib.de) [GitHash: 60fd96f2]\n",
       "  CppAD 20180000.0     Algorithmic Differentiation of C++ algorithms developed by B. Bell (github.com/coin-or/CppAD)\n",
       "  TinyCThread 1.2      small portable implementation of the C11 threads API (tinycthread.github.io)\n",
       "  MPIR 3.0.0           Multiple Precision Integers and Rationals Library developed by W. Hart (mpir.org)\n",
       "  ZIMPL 3.6.2          Zuse Institute Mathematical Programming Language developed by T. Koch (zimpl.zib.de)\n",
       "  AMPL/MP 690e9e7      AMPL .nl file reader library (github.com/ampl/mp)\n",
-      "  PaPILO 2.4.0         parallel presolve for integer and linear optimization (github.com/scipopt/papilo) (built with TBB) [GitHash: 2d9fe29f]\n",
+      "  PaPILO 2.4.1         parallel presolve for integer and linear optimization (github.com/scipopt/papilo) (built with TBB) [GitHash: 11974394]\n",
       "  Nauty 2.8.8          Computing Graph Automorphism Groups by Brendan D. McKay (users.cecs.anu.edu.au/~bdm/nauty)\n",
       "  sassy 1.1            Symmetry preprocessor by Markus Anders (github.com/markusa4/sassy)\n",
       "  Ipopt 3.14.16        Interior Point Optimizer developed by A. Waechter et.al. (github.com/coin-or/Ipopt)\n",
       "\n",
       "user parameter file <scip.set> not found - using default parameters\n",
-      "read problem <C:\\Users\\STEINM~1\\AppData\\Local\\Temp\\tmprv0ikbwh.pyomo.nl>\n",
+      "read problem <C:\\Users\\Victor\\AppData\\Local\\Temp\\tmpfcunk5gi.pyomo.nl>\n",
       "============\n",
       "\n",
-      "original problem has 9 variables (0 bin, 0 int, 0 impl, 9 cont) and 12 constraints\n",
+      "original problem has 8 variables (0 bin, 0 int, 0 impl, 8 cont) and 6 constraints\n",
       "\n",
       "solve problem\n",
       "=============\n",
       "\n",
       "presolving:\n",
-      "(round 1, fast)       2 del vars, 6 del conss, 0 add conss, 12 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs\n",
-      "presolving (2 rounds: 2 fast, 0 medium, 0 exhaustive):\n",
-      " 2 deleted vars, 6 deleted constraints, 0 added constraints, 16 tightened bounds, 0 added holes, 0 changed sides, 0 changed coefficients\n",
+      "(round 1, fast)       0 del vars, 3 del conss, 0 add conss, 11 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs\n",
+      "   (0.0s) symmetry computation started: requiring (bin +, int +, cont +), (fixed: bin -, int -, cont -)\n",
+      "   (0.0s) symmetry computation finished: 1 generators found (max: 1500, log10 of symmetry group size: 0.0) (symcode time: 0.00)\n",
+      "dynamic symmetry handling statistics:\n",
+      "   orbitopal reduction:       no components\n",
+      "   orbital reduction:         no components\n",
+      "   lexicographic reduction:   no permutations\n",
+      "handled 1 out of 1 symmetry components\n",
+      "(round 2, exhaustive) 0 del vars, 3 del conss, 1 add conss, 11 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs\n",
+      "presolving (3 rounds: 3 fast, 2 medium, 2 exhaustive):\n",
+      " 0 deleted vars, 3 deleted constraints, 0 added constraints, 11 tightened bounds, 0 added holes, 0 changed sides, 0 changed coefficients\n",
       " 0 implications, 0 cliques\n",
-      "presolving detected infeasibility\n",
+      "presolved problem has 8 variables (0 bin, 0 int, 0 impl, 8 cont) and 4 constraints\n",
+      "      1 constraints of type <linear>\n",
+      "      3 constraints of type <nonlinear>\n",
       "Presolving Time: 0.00\n",
       "\n",
-      "SCIP Status        : problem is solved [infeasible]\n",
+      " time | node  | left  |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr|  dualbound   | primalbound  |  gap   | compl. \n",
+      "  0.0s|     1 |     0 |    22 |     - |   914k |   0 |  25 |   4 |  36 |   0 |  0 |   0 |   0 |-3.474607e+01 |      --      |    Inf | unknown\n",
+      "L 0.0s|     1 |     0 |    22 |     - |  subnlp|   0 |  25 |   4 |  36 |   0 |  0 |   0 |   0 |-3.474607e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    22 |     - |   914k |   0 |  25 |   4 |  36 |   0 |  0 |   0 |   0 |-3.474607e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    22 |     - |   914k |   0 |  25 |   4 |  36 |   0 |  0 |   0 |   0 |-3.474607e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    26 |     - |   920k |   0 |  25 |   4 |  39 |   3 |  1 |   0 |   0 |-1.963132e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    26 |     - |   920k |   0 |  25 |   4 |  39 |   3 |  1 |   0 |   0 |-1.963132e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    30 |     - |   935k |   0 |  25 |   4 |  42 |   6 |  2 |   0 |   0 |-1.885311e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    33 |     - |   939k |   0 |  25 |   4 |  45 |   9 |  3 |   0 |   0 |-1.766937e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    33 |     - |   939k |   0 |  25 |   4 |  45 |   9 |  3 |   0 |   0 |-1.766937e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    36 |     - |   939k |   0 |  25 |   4 |  47 |  11 |  4 |   0 |   0 |-1.728948e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    37 |     - |   941k |   0 |  25 |   4 |  48 |  12 |  5 |   0 |   0 |-1.712829e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    38 |     - |   941k |   0 |  25 |   4 |  49 |  13 |  6 |   0 |   0 |-1.701866e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    39 |     - |   943k |   0 |  25 |   4 |  50 |  14 |  7 |   0 |   0 |-1.701746e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |    41 |     - |   951k |   0 |  25 |   4 |  52 |  16 |  8 |   0 |   0 |-1.695801e+01 | 1.151406e+01 |    Inf | unknown\n",
+      "  0.0s|     1 |     0 |   332 |     - |   957k |   0 |  25 |   4 |  52 |  16 |  9 |   0 |   0 | 1.150982e+01 | 1.151406e+01 |   0.04%| unknown\n",
+      " time | node  | left  |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr|  dualbound   | primalbound  |  gap   | compl. \n",
+      "  0.0s|     1 |     0 |   334 |     - |   957k |   0 |  25 |   4 |  54 |  18 | 10 |   0 |   0 | 1.150982e+01 | 1.151406e+01 |   0.04%| unknown\n",
+      "  0.0s|     1 |     0 |   346 |     - |   957k |   0 |  25 |   4 |  37 |  20 | 11 |   0 |   0 | 1.151405e+01 | 1.151406e+01 |   0.00%| unknown\n",
+      "  0.0s|     1 |     0 |   346 |     - |   957k |   0 |  25 |   4 |  20 |  20 | 11 |   0 |   0 | 1.151405e+01 | 1.151406e+01 |   0.00%| unknown\n",
+      "  0.0s|     1 |     0 |   347 |     - |   957k |   0 |  25 |   4 |  21 |  21 | 12 |   0 |   0 | 1.151406e+01 | 1.151406e+01 |   0.00%| unknown\n",
+      "L 0.0s|     1 |     0 |   347 |     - |  subnlp|   0 |  25 |   4 |  21 |  21 | 13 |   0 |   0 | 1.151406e+01 | 1.151406e+01 |   0.00%| unknown\n",
+      "  0.0s|     1 |     0 |   347 |     - |   958k |   0 |  25 |   4 |  21 |  21 | 13 |   0 |   0 | 1.151406e+01 | 1.151406e+01 |   0.00%| unknown\n",
+      "* 0.0s|     1 |     0 |   347 |     - |    LP  |   0 |  25 |   4 |  21 |  21 | 14 |   0 |   0 | 1.151406e+01 | 1.151406e+01 |   0.00%| unknown\n",
+      "\n",
+      "SCIP Status        : problem is solved [optimal solution found]\n",
       "Solving Time (sec) : 0.00\n",
-      "Solving Nodes      : 0\n",
-      "Primal Bound       : +1.00000000000000e+20 (0 solutions)\n",
-      "Dual Bound         : +1.00000000000000e+20\n",
+      "Solving Nodes      : 1\n",
+      "Primal Bound       : +1.15140564709997e+01 (3 solutions)\n",
+      "Dual Bound         : +1.15140564709997e+01\n",
       "Gap                : 0.00 %\n",
-      "WARNING: Loading a SolverResults object with a warning status into\n",
-      "model.name=\"unknown\";\n",
-      "    - termination condition: infeasible\n",
-      "    - message from solver: infeasible\n",
+      "\n",
+      "Problem: \n",
+      "- Lower bound: -inf\n",
+      "  Upper bound: inf\n",
+      "  Number of objectives: 1\n",
+      "  Number of constraints: 0\n",
+      "  Number of variables: 7\n",
+      "  Sense: unknown\n",
+      "Solver: \n",
+      "- Status: ok\n",
+      "  Message: optimal solution found\n",
+      "  Termination condition: optimal\n",
+      "  Id: 0\n",
+      "  Error rc: 0\n",
+      "  Time: 0.3383963108062744\n",
+      "Solution: \n",
+      "- number of solutions: 0\n",
+      "  number of solutions displayed: 0\n",
+      "\n",
       "n : Size=2, Index=pumps\n",
-      "    Key   : Lower               : Value : Upper : Fixed : Stale : Domain\n",
-      "    pump1 : 0.20833333333333334 :  None :     1 : False :  True :  Reals\n",
-      "    pump2 : 0.20833333333333334 :  None :     1 : False :  True :  Reals\n",
+      "    Key   : Lower               : Value               : Upper : Fixed : Stale : Domain\n",
+      "    pump1 : 0.20833333333333334 : 0.34519801810114614 :     1 : False : False :  Reals\n",
+      "    pump2 : 0.20833333333333334 :  0.4881837415314729 :     1 : False : False :  Reals\n",
       "Q : Size=6, Index=nodes\n",
       "    Key    : Lower : Value : Upper : Fixed : Stale : Domain\n",
-      "     pump1 :  None :  None :  None : False :  True :  Reals\n",
-      "     pump2 :  None :  None :  None : False :  True :  Reals\n",
-      "    source :  None :  None :  None : False :  True :  Reals\n",
-      "    valveA :  None :  None :  None : False :  True :  Reals\n",
-      "    valveB :  None :  None :  None : False :  True :  Reals\n",
-      "    valveC :  None :  None :  None : False :  True :  Reals\n"
+      "     pump1 :   0.0 :   0.0 :  10.0 : False : False :  Reals\n",
+      "     pump2 :   0.0 :   0.0 :  10.0 : False : False :  Reals\n",
+      "    source :   0.0 :  None :  10.0 : False :  True :  Reals\n",
+      "    valveA :   0.0 :   1.0 :  10.0 : False : False :  Reals\n",
+      "    valveB :   0.0 :   1.0 :  10.0 : False : False :  Reals\n",
+      "    valveC :   0.0 :   1.0 :  10.0 : False : False :  Reals\n"
      ]
     }
    ],
    "source": [
     "from pyomo.opt import SolverFactory\n",
     "\n",
-    "opt = pyo.SolverFactory('scipampl', executable=r'C:\\Program Files\\SCIPOptSuite 9.2.0\\bin\\scip.exe')\n",
+    "TestData={\n",
+    "    None:{\n",
+    "        \n",
+    "        'nodes':[key for key in graph.nodes.keys()],\n",
+    "        'pumps':[key for key in graph.nodes.keys() if 'pump' in key],\n",
+    "        'valves':[key for key in graph.nodes.keys() if 'valve' in key],\n",
+    "        'Q_valve':{'valveA':1.,'valveB':1.,'valveC':1.},\n",
+    "        \n",
+    "    }\n",
+    "}\n",
+    "\n",
+    "opt = pyo.SolverFactory('scipampl', executable=r'C:\\Program Files\\SCIPOptSuite 9.2.1\\bin\\scip.exe')\n",
     "instance = modell.create_instance(TestData)\n",
-    "instance.Continuity_constaint=pyo.Constraint(instance.nodes, rule=continuityRule)\n",
     "instance.Flow_constraint=pyo.Constraint(instance.valves,rule=valve_req_rule)\n",
     "instance.pump_Flow_constraint=pyo.Constraint(instance.pumps,rule=Pump_delivery_req)\n",
+    "#instance.flow_constraint=pyo.Constraint(instance.nodes,rule=continuity_inflow)\n",
+    "#instance.flow_constraint=pyo.Constraint(instance.nodes,rule=continuity_outflow)\n",
     "result=opt.solve(instance, tee=True)\n",
+    "print(result)\n",
     "instance.n.pprint()\n",
     "instance.Q.pprint()\n"
    ]
@@ -383,7 +434,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.5"
+   "version": "3.12.8"
   }
  },
  "nbformat": 4,
-- 
GitLab