├── .flake8 ├── .github └── workflows │ ├── build-package.yml │ ├── deploy-documentation.yml │ ├── gitlab-mirror.yml │ └── release.yml ├── .gitignore ├── CHANGELOG.md ├── INSTALL.md ├── LICENSE ├── README.md ├── dev └── requirements.txt ├── docs ├── Makefile ├── _static │ ├── favicon.ico │ ├── favicon.png │ ├── rwth_fak08_rgb.png │ └── rwth_operations_research_rgb.png ├── api │ ├── classifier.rst │ ├── decomposition.rst │ ├── detector.rst │ ├── detprobdata.rst │ ├── index.rst │ ├── model.rst │ ├── partition.rst │ ├── pricingsolver.rst │ └── score.rst ├── conf.py ├── examples │ └── index.rst ├── index.md ├── make.bat └── requirements.txt ├── examples ├── alldecomps │ ├── alldecomps.ipynb │ ├── alldecomps_instances.zip │ ├── alldecomps_instances │ │ ├── bpp1.lp.gz │ │ ├── bpp2.lp.gz │ │ ├── bpp3.lp.gz │ │ ├── cflp1.lp.gz │ │ ├── cflp2.lp.gz │ │ ├── cflp3.lp.gz │ │ ├── coloring1.lp.gz │ │ ├── coloring2.lp.gz │ │ ├── coloring3.lp.gz │ │ ├── cpmp1.lp.gz │ │ ├── cpmp2.lp.gz │ │ ├── cpmp3.lp.gz │ │ ├── flugpl.mps.gz │ │ ├── gap1.lp.gz │ │ ├── gap2.lp.gz │ │ ├── gap3.lp.gz │ │ ├── mod008.mps.gz │ │ ├── p0033.mps.gz │ │ ├── vrp1.lp.gz │ │ ├── vrp2.lp.gz │ │ └── vrp3.lp.gz │ └── results │ │ └── coloring3.lp │ │ ├── result_coloring3.lp_2021-11-26T130601.jsonl │ │ ├── result_coloring3.lp_2022-02-05T035919.jsonl │ │ ├── result_coloring3.lp_2022-02-05T040212.jsonl │ │ └── result_coloring3.lp_2022-02-05T040231.jsonl └── cpmp │ ├── cpmp.ipynb │ └── instances │ └── p550-01.json ├── make_release.sh ├── pyproject.toml ├── setup.cfg ├── setup.py ├── src └── pygcgopt │ ├── __init__.py │ ├── consclassifier.pxi │ ├── decomposition.pxi │ ├── detector.pxi │ ├── detprobdata.pxi │ ├── gcg.pxd │ ├── gcg.pyx │ ├── partition.pxi │ ├── pricing_solver.pxi │ ├── score.pxi │ ├── util.py │ └── varclassifier.pxi └── tests ├── instances_bpp ├── N1C1W4_M.BPP.dec ├── N1C1W4_M.BPP.lp ├── N1C2W2_O.BPP.dec └── N1C2W2_O.BPP.lp ├── test_classifier.py └── test_score.py /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | filename = *.pyx,*.pxd,*.pxi 3 | ignore = E211,E901,E999,E225,E226,E227,W504,E501 -------------------------------------------------------------------------------- /.github/workflows/build-package.yml: -------------------------------------------------------------------------------- 1 | name: Build Package 2 | 3 | on: [push] 4 | 5 | jobs: 6 | Build-Package-Linux: 7 | runs-on: ubuntu-24.04 8 | env: 9 | SCIPOPTDIR: ${{ github.workspace }}/scip_install 10 | strategy: 11 | matrix: 12 | python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] 13 | steps: 14 | - name: Check out repository code 15 | uses: actions/checkout@v4 16 | 17 | - name: Update and install wget 18 | run: | 19 | sudo apt-get update && sudo apt-get install --yes wget 20 | 21 | - name: Download libscip-linux.zip 22 | run: | 23 | wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.7.0/libscip-linux.zip -O scip.zip 24 | 25 | - name: Unzip the downloaded file 26 | run: | 27 | sudo apt-get install --yes unzip 28 | unzip scip.zip 29 | 30 | - name: Setup python ${{ matrix.python-version }} 31 | uses: actions/setup-python@v4 32 | with: 33 | python-version: ${{ matrix.python-version }} 34 | 35 | - name: Prepare python environment 36 | run: | 37 | python -m pip install --upgrade pip 38 | python -m pip install cython pytest 39 | python -m pip install pyscipopt==5.3.0 --no-binary=:all: 40 | 41 | - name: Build & Install PyGCGOpt 42 | run: | 43 | pip install . 44 | 45 | - name: Run PyGCGOpt tests 46 | run: | 47 | pytest . 48 | -------------------------------------------------------------------------------- /.github/workflows/deploy-documentation.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Documentation 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | workflow_dispatch: 8 | 9 | jobs: 10 | Deploy-Documentation: 11 | runs-on: ubuntu-24.04 12 | env: 13 | SCIPOPTDIR: ${{ github.workspace }}/scip_install 14 | strategy: 15 | matrix: 16 | python-version: ["3.12"] 17 | steps: 18 | - name: Check out repository code 19 | uses: actions/checkout@v4 20 | 21 | - name: Update and install wget, pandoc 22 | run: | 23 | sudo apt-get update && sudo apt-get install --yes wget pandoc 24 | 25 | - name: Download libscip-linux.zip 26 | run: | 27 | wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.7.0/libscip-linux.zip -O scip.zip 28 | 29 | - name: Unzip the downloaded file 30 | run: | 31 | sudo apt-get install --yes unzip 32 | unzip scip.zip 33 | 34 | - name: Setup python ${{ matrix.python-version }} 35 | uses: actions/setup-python@v4 36 | with: 37 | python-version: ${{ matrix.python-version }} 38 | 39 | - name: Prepare python environment 40 | run: | 41 | python -m pip install --upgrade pip 42 | python -m pip install cython pytest 43 | python -m pip install pyscipopt==5.3.0 --no-binary=:all: 44 | pip install -r docs/requirements.txt 45 | 46 | - name: Build & Install PyGCGOpt 47 | run: | 48 | pip install . 49 | 50 | - name: Run PyGCGOpt tests 51 | run: | 52 | pytest . 53 | 54 | - name: Build Documentation 55 | run: make html 56 | working-directory: ./docs 57 | 58 | - name: Checkout Documentation Branch 59 | uses: actions/checkout@v4 60 | with: 61 | ref: gh-pages 62 | path: gh-pages 63 | 64 | - name: Deploy Documentation 65 | run: | 66 | rm -rf gh-pages/* 67 | cp -r docs/_build/html/* gh-pages/ 68 | cd gh-pages 69 | git config user.name "GCG CI Bot" 70 | git config user.email "noreply@or.rwth-aachen.de" 71 | git add . 72 | git commit --allow-empty -m "Deploy docs to GitHub Pages, GitHub Actions build: ${GITHUB_RUN_ID}" -m "Commit: ${GITHUB_SHA}" 73 | git push 74 | 75 | - name: Archive Documentation 76 | uses: actions/upload-artifact@v4 77 | with: 78 | name: sphinx-documentation 79 | path: docs/_build/html 80 | -------------------------------------------------------------------------------- /.github/workflows/gitlab-mirror.yml: -------------------------------------------------------------------------------- 1 | name: OR-Gitlab Mirror 2 | on: 3 | - push 4 | - delete 5 | jobs: 6 | sync: 7 | runs-on: ubuntu-latest 8 | name: Git Repo Sync 9 | steps: 10 | - uses: actions/checkout@v2 11 | with: 12 | fetch-depth: 0 13 | - uses: wangchucheng/git-repo-sync@v0.1.0 14 | with: 15 | target-url: ${{ secrets.OR_GITLAB_URL }} 16 | target-username: ${{ secrets.OR_GITLAB_USERNAME }} 17 | target-token: ${{ secrets.OR_GITLAB_ACCESS_TOKEN }} 18 | 19 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Build wheels 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | upload_to_pypi: 7 | type: boolean 8 | description: Should upload 9 | required: false 10 | default: true 11 | test_pypi: 12 | type: boolean 13 | description: Use Test PyPI 14 | required: false 15 | default: true 16 | 17 | jobs: 18 | build_wheels: 19 | name: Build wheels on ${{ matrix.os }} 20 | runs-on: ${{ matrix.os }} 21 | strategy: 22 | matrix: 23 | include: 24 | - os: ubuntu-20.04 25 | arch: x86_64 26 | - os: macos-14 27 | arch: arm64 28 | - os: macos-13 29 | arch: x86_64 30 | - os: windows-latest 31 | arch: AMD64 32 | 33 | 34 | 35 | steps: 36 | - uses: actions/checkout@v4 37 | 38 | - name: Build wheels 39 | uses: pypa/cibuildwheel@v2.21.1 40 | env: 41 | CIBW_ARCHS: ${{ matrix.arch }} 42 | CIBW_TEST_REQUIRES: pytest 43 | CIBW_TEST_COMMAND: "pytest {project}/tests" 44 | 45 | - uses: actions/upload-artifact@v4 46 | with: 47 | name: wheels-${{ matrix.os}}-${{ matrix.arch }} 48 | path: ./wheelhouse/*.whl 49 | 50 | build_sdist: 51 | name: Build source distribution 52 | runs-on: ubuntu-latest 53 | steps: 54 | - uses: actions/checkout@v4 55 | 56 | - name: Build sdist 57 | shell: bash -l {0} 58 | run: pipx run build --sdist 59 | 60 | - uses: actions/upload-artifact@v4 61 | with: 62 | name: source-distribution 63 | path: dist/*.tar.gz 64 | 65 | merge_artifacts: 66 | name: Merge Artifacts 67 | needs: [build_wheels, build_sdist] 68 | runs-on: ubuntu-latest 69 | steps: 70 | - name: Merge Artifacts 71 | uses: actions/upload-artifact/merge@v4 72 | 73 | upload_pypi: 74 | needs: [build_wheels, build_sdist, merge_artifacts] 75 | runs-on: ubuntu-latest 76 | if: github.event.inputs.upload_to_pypi == 'true' 77 | steps: 78 | - uses: actions/download-artifact@v4 79 | with: 80 | name: merged-artifacts 81 | path: dist 82 | 83 | - uses: pypa/gh-action-pypi-publish@release/v1 84 | if: github.event.inputs.test_pypi == 'false' 85 | with: 86 | user: __token__ 87 | password: ${{ secrets.PYPI_API_TOKEN }} 88 | verbose: true 89 | 90 | - uses: pypa/gh-action-pypi-publish@release/v1 91 | if: github.event.inputs.test_pypi == 'true' 92 | with: 93 | repository-url: https://test.pypi.org/legacy/ 94 | user: __token__ 95 | password: ${{ secrets.TESTPYPI_API_TOKEN }} 96 | verbose: true 97 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # project specific 2 | *~ 3 | *.swp 4 | *.swo 5 | build/ 6 | dist/ 7 | include 8 | lib 9 | src/pygcgopt/*.c 10 | src/pygcgopt/*.cpp 11 | __pycache__ 12 | .cache 13 | scripts/ 14 | docs/README.md 15 | docs/INSTALL.md 16 | docs/CHANGELOG.md 17 | docs/examples/* 18 | !docs/examples/index.rst 19 | 20 | # Byte-compiled / optimized / DLL files 21 | __pycache__/ 22 | *.py[cod] 23 | *$py.class 24 | 25 | # C extensions 26 | *.so 27 | 28 | # Distribution / packaging 29 | .Python 30 | build/ 31 | develop-eggs/ 32 | dist/ 33 | downloads/ 34 | eggs/ 35 | .eggs/ 36 | lib/ 37 | lib64/ 38 | parts/ 39 | sdist/ 40 | var/ 41 | wheels/ 42 | *.egg-info/ 43 | .installed.cfg 44 | *.egg 45 | MANIFEST 46 | 47 | # PyInstaller 48 | # Usually these files are written by a python script from a template 49 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 50 | *.manifest 51 | *.spec 52 | 53 | # Installer logs 54 | pip-log.txt 55 | pip-delete-this-directory.txt 56 | 57 | # Unit test / coverage reports 58 | htmlcov/ 59 | .tox/ 60 | .coverage 61 | .coverage.* 62 | .cache 63 | nosetests.xml 64 | coverage.xml 65 | *.cover 66 | .hypothesis/ 67 | 68 | # Translations 69 | *.mo 70 | *.pot 71 | 72 | # Django stuff: 73 | *.log 74 | .static_storage/ 75 | .media/ 76 | local_settings.py 77 | 78 | # Flask stuff: 79 | instance/ 80 | .webassets-cache 81 | 82 | # Scrapy stuff: 83 | .scrapy 84 | 85 | # Sphinx documentation 86 | docs/_build/ 87 | 88 | # PyBuilder 89 | target/ 90 | 91 | # Jupyter Notebook 92 | .ipynb_checkpoints 93 | 94 | # pyenv 95 | .python-version 96 | 97 | # celery beat schedule file 98 | celerybeat-schedule 99 | 100 | # SageMath parsed files 101 | *.sage.py 102 | 103 | # Environments 104 | .env 105 | .venv 106 | env/ 107 | venv/ 108 | venv3/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | 126 | # pytest 127 | .pytest_cache/ 128 | 129 | # model (for tests) 130 | model 131 | model.cip 132 | model.lp 133 | 134 | # VSCode 135 | .vscode/ 136 | .devcontainer/ 137 | 138 | # documentation 139 | docs/html 140 | docs/*.tag 141 | 142 | # MacOS 143 | .DS_Store 144 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## Unreleased 4 | ### Added 5 | ### Fixed 6 | ### Changed 7 | ### Removed 8 | 9 | ## v0.4.1 10 | ### Update 11 | * support PySCIPOpt 5.3.0, SCIP 9.2.1 and GCG 3.7.0 12 | 13 | ## v0.4.0 14 | ### Added 15 | * added support for Windows 16 | * added score plugin type 17 | * added constraint classifier plugin type 18 | * added variable classifier plugin type 19 | * added class ConsPart 20 | * added class VarPart 21 | * added tests for score and classifier 22 | 23 | ## v0.3.1 24 | ### Update 25 | * support cython 3.0.0 26 | 27 | ## v0.3.0 28 | ### Update 29 | * update to PySCIPOpt 4.4.0, SCIP 8.1.0 and GCG 3.5.5 30 | 31 | ## v0.2.0 32 | ### Added 33 | * method getMastervars in class Model 34 | * method getOrigvars in class GCGMasterModel 35 | 36 | ## v0.1.4 37 | ### Changed 38 | * rename GCGModel to Model 39 | ### Removed 40 | * pyscipopt.Model not importable with pygcgopt.Model anymore 41 | ## v0.1.3 42 | ### Added 43 | * Initial public release 44 | -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | 4 | ## Using Conda 5 | 6 | [![Conda version](https://img.shields.io/conda/vn/conda-forge/pygcgopt?logo=conda-forge)](https://anaconda.org/conda-forge/pygcgopt) 7 | [![Conda platforms](https://img.shields.io/conda/pn/conda-forge/pygcgopt?logo=conda-forge)](https://anaconda.org/conda-forge/pygcgopt) 8 | 9 | Conda will install `GCG`, `SCIP` and `PySCIPOpt` automatically, hence everything can be installed in a single command: 10 | ```bash 11 | conda install --channel conda-forge pygcgopt 12 | ``` 13 | 14 | ## Installing PyGCGOpt from PyPI 15 | 16 | Simply run the following to install PyGCGOpt (and its requirement PySCIPOpt) with `pip`: 17 | ``` 18 | pip install PySCIPOpt 19 | pip install PyGCGOpt 20 | ``` 21 | 22 | The following table summarizes which versions of PyGCGOpt and PySCIPOpt are compatible: 23 | 24 | | PySCIPOpt | PyGCGOpt | 25 | |----|----| 26 | | 5.2.1 | 0.4.0 | 27 | | 5.3.0 | 0.4.1 | 28 | 29 | 30 | ## Testing new installation 31 | 32 | To test your brand-new installation of PyGCGOpt you need 33 | [pytest](https://pytest.org/) on your system. 34 | 35 | pip install pytest 36 | 37 | Here is the complete [installation 38 | procedure](https://docs.pytest.org/en/latest/getting-started.html). 39 | 40 | Tests can be run in the `PyGCGOpt` directory with: : 41 | 42 | py.test # all the available tests 43 | py.test tests/test_name.py # a specific tests/test_name.py (Unix) 44 | 45 | Ideally, the status of your tests must be passed or skipped. Running 46 | tests with pytest creates the `__pycache__` directory in `tests` and, 47 | occasionally, a `model` file in the working directory. They can be 48 | removed harmlessly. 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Operations Research, RWTH Aachen University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PyGCGOpt 2 | ========= 3 | 4 | This project provides an interface from Python to the [GCG Solver](https://gcg.or.rwth-aachen.de/). 5 | 6 | Documentation 7 | ------------- 8 | 9 | See [CHANGELOG.md](CHANGELOG.md) for added, removed or fixed functionality. 10 | 11 | Installation 12 | ------------ 13 | 14 | **Using Conda** 15 | 16 | [![Conda version](https://img.shields.io/conda/vn/conda-forge/pygcgopt?logo=conda-forge)](https://anaconda.org/conda-forge/pygcgopt) 17 | [![Conda platforms](https://img.shields.io/conda/pn/conda-forge/pygcgopt?logo=conda-forge)](https://anaconda.org/conda-forge/pygcgopt) 18 | 19 | Conda will install `GCG`, `SCIP` and `PySCIPOpt` automatically, hence everything can be installed in a single command: 20 | ```bash 21 | conda install --channel conda-forge pygcgopt 22 | ``` 23 | 24 | **Using PyPI and from Source** 25 | 26 | See [INSTALL.md](INSTALL.md) for instructions. 27 | Please note that the latest PyGCGOpt version is usually only compatible with the latest major release of the SCIP Optimization Suite and the GCG Solver. 28 | Information which version of PyGCGOpt is required for a given GCG version can also be found in [INSTALL.md](INSTALL.md). 29 | 30 | -------------------------------------------------------------------------------- /dev/requirements.txt: -------------------------------------------------------------------------------- 1 | setuptools 2 | cython >=3.0.0 3 | pyscipopt==5.2.1 -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @for filename in ../*.md; do\ 21 | ln -s -f $${filename} $(SOURCEDIR); \ 22 | done 23 | @for dirname in ../examples/*; do\ 24 | ln -s -f ../$${dirname} $(SOURCEDIR)/examples; \ 25 | done 26 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 27 | -------------------------------------------------------------------------------- /docs/_static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/docs/_static/favicon.ico -------------------------------------------------------------------------------- /docs/_static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/docs/_static/favicon.png -------------------------------------------------------------------------------- /docs/_static/rwth_fak08_rgb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/docs/_static/rwth_fak08_rgb.png -------------------------------------------------------------------------------- /docs/_static/rwth_operations_research_rgb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/docs/_static/rwth_operations_research_rgb.png -------------------------------------------------------------------------------- /docs/api/classifier.rst: -------------------------------------------------------------------------------- 1 | Classifier 2 | ********** 3 | 4 | .. autoclass:: pygcgopt.gcg.ConsClassifier 5 | :members: 6 | 7 | .. autoclass:: pygcgopt.gcg.VarClassifier 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/api/decomposition.rst: -------------------------------------------------------------------------------- 1 | Decomposition 2 | ************* 3 | 4 | .. autoclass:: pygcgopt.gcg.PartialDecomposition 5 | :members: -------------------------------------------------------------------------------- /docs/api/detector.rst: -------------------------------------------------------------------------------- 1 | Detector 2 | ************* 3 | 4 | .. autoclass:: pygcgopt.gcg.Detector 5 | :members: -------------------------------------------------------------------------------- /docs/api/detprobdata.rst: -------------------------------------------------------------------------------- 1 | DetProbData 2 | *********** 3 | 4 | .. autoclass:: pygcgopt.gcg.DetProbData 5 | :members: -------------------------------------------------------------------------------- /docs/api/index.rst: -------------------------------------------------------------------------------- 1 | API Reference 2 | ************* 3 | 4 | .. toctree:: 5 | 6 | model.rst 7 | classifier.rst 8 | decomposition.rst 9 | detprobdata.rst 10 | detector.rst 11 | partition.rst 12 | pricingsolver.rst 13 | score.rst 14 | -------------------------------------------------------------------------------- /docs/api/model.rst: -------------------------------------------------------------------------------- 1 | Model 2 | ************* 3 | 4 | .. autoclass:: pygcgopt.gcg.Model 5 | :members: -------------------------------------------------------------------------------- /docs/api/partition.rst: -------------------------------------------------------------------------------- 1 | Partition 2 | ********* 3 | 4 | .. autoclass:: pygcgopt.gcg.ConsPart 5 | :members: 6 | 7 | .. autoclass:: pygcgopt.gcg.VarPart 8 | :members: 9 | -------------------------------------------------------------------------------- /docs/api/pricingsolver.rst: -------------------------------------------------------------------------------- 1 | PricingSolver 2 | ************* 3 | 4 | .. autoclass:: pygcgopt.gcg.PricingSolver 5 | :members: -------------------------------------------------------------------------------- /docs/api/score.rst: -------------------------------------------------------------------------------- 1 | Score 2 | ***** 3 | 4 | .. autoclass:: pygcgopt.gcg.Score 5 | :members: -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | 13 | import os 14 | import sys 15 | sys.path.insert(0, os.path.abspath('..')) 16 | 17 | # import version of PyGCGOpt 18 | from pygcgopt import __version__ 19 | 20 | 21 | # -- Project information ----------------------------------------------------- 22 | 23 | project = 'PyGCGOpt' 24 | copyright = '2021, Operations Research, RWTH Aachen University' 25 | author = 'Operations Research, RWTH Aachen University' 26 | 27 | 28 | # -- General configuration --------------------------------------------------- 29 | 30 | # Add any Sphinx extension module names here, as strings. They can be 31 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 32 | # ones. 33 | extensions = [ 34 | 'sphinx_copybutton', # for copybuttons 35 | 'sphinx.ext.mathjax', 36 | 'sphinx.ext.autodoc', 37 | 'myst_parser', # for markdown in docs 38 | 'nbsphinx', # for jupyter notebooks 39 | 'sphinx.ext.githubpages', # for githubpages 40 | ] 41 | 42 | # allow also markdown files and jupyter notebooks 43 | source_suffix = ['.rst', '.md'] 44 | 45 | # Add any paths that contain templates here, relative to this directory. 46 | templates_path = ['_templates'] 47 | 48 | # List of patterns, relative to source directory, that match files and 49 | # directories to ignore when looking for source files. 50 | # This pattern also affects html_static_path and html_extra_path. 51 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 52 | 53 | 54 | # -- Options for HTML output ------------------------------------------------- 55 | 56 | # The theme to use for HTML and HTML Help pages. See the documentation for 57 | # a list of builtin themes. 58 | # 59 | html_theme = 'furo' 60 | 61 | # Add any paths that contain custom static files (such as style sheets) here, 62 | # relative to this directory. They are copied after the builtin static files, 63 | # so a file named "default.css" will overwrite the builtin "default.css". 64 | html_static_path = ['_static'] 65 | 66 | # Changing sidebar title 67 | html_title = 'PyGCGOpt' + ' ' + __version__ 68 | 69 | # set favicon path 70 | html_favicon = '_static/favicon.ico' 71 | 72 | # set logo path 73 | #html_logo = '_static/rwth_operations_research_rgb.png' 74 | 75 | myst_enable_extensions = [ 76 | "amsmath" #latex extensions 77 | ] -------------------------------------------------------------------------------- /docs/examples/index.rst: -------------------------------------------------------------------------------- 1 | Examples 2 | ******** 3 | 4 | .. toctree:: 5 | 6 | cpmp/cpmp.ipynb 7 | alldecomps/alldecomps.ipynb -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ```{include} README.md 2 | ``` 3 | 4 | ```{toctree} 5 | --- 6 | maxdepth: 2 7 | hidden: 8 | caption: Contents 9 | --- 10 | self 11 | INSTALL.md 12 | examples/index.rst 13 | api/index.rst 14 | ``` 15 | 16 | ```{toctree} 17 | --- 18 | hidden: 19 | caption: About the project 20 | --- 21 | CHANGELOG.md 22 | GCG Documentation 23 | GitHub repo 24 | SCIP Documentation 25 | PySCIPOpt repo 26 | ``` -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.https://www.sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | Sphinx 2 | sphinx_copybutton 3 | furo 4 | myst-parser 5 | nbsphinx 6 | jupyter 7 | -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances.zip -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/bpp1.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/bpp1.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/bpp2.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/bpp2.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/bpp3.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/bpp3.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/cflp1.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/cflp1.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/cflp2.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/cflp2.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/cflp3.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/cflp3.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/coloring1.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/coloring1.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/coloring2.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/coloring2.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/coloring3.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/coloring3.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/cpmp1.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/cpmp1.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/cpmp2.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/cpmp2.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/cpmp3.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/cpmp3.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/flugpl.mps.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/flugpl.mps.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/gap1.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/gap1.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/gap2.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/gap2.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/gap3.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/gap3.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/mod008.mps.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/mod008.mps.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/p0033.mps.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/p0033.mps.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/vrp1.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/vrp1.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/vrp2.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/vrp2.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/alldecomps_instances/vrp3.lp.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scipopt/PyGCGOpt/9ab1ac514ba63bbb76a9479d89a63945e3acc066/examples/alldecomps/alldecomps_instances/vrp3.lp.gz -------------------------------------------------------------------------------- /examples/alldecomps/results/coloring3.lp/result_coloring3.lp_2021-11-26T130601.jsonl: -------------------------------------------------------------------------------- 1 | {"reformulation_constraints": [], "iteration_idx": 0, "dual_bound": 2.0, "total_time": 0.11065499999999999, "solving_time": 0.022966, "reading_time": 0.000401, "presolving_time": 0.00036199999999999996, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000000.log"} 2 | {"reformulation_constraints": ["edge_1_1"], "iteration_idx": 1, "dual_bound": 0.6666666666666666, "total_time": 0.089573, "solving_time": 0.07361999999999999, "reading_time": 0.000234, "presolving_time": 0.000145, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000001.log"} 3 | {"reformulation_constraints": ["edge_2_1"], "iteration_idx": 2, "dual_bound": 0.6666666666666666, "total_time": 0.057852999999999995, "solving_time": 0.037947, "reading_time": 0.000194, "presolving_time": 0.00018099999999999998, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000002.log"} 4 | {"reformulation_constraints": ["node_1"], "iteration_idx": 3, "dual_bound": 0.6666666666666666, "total_time": 0.097146, "solving_time": 0.044449999999999996, "reading_time": 0.00035, "presolving_time": 0.000128, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000003.log"} 5 | {"reformulation_constraints": ["node_2"], "iteration_idx": 4, "dual_bound": 0.6666666666666666, "total_time": 0.057433, "solving_time": 0.040727, "reading_time": 0.000343, "presolving_time": 0.000543, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000004.log"} 6 | {"reformulation_constraints": ["use_1"], "iteration_idx": 5, "dual_bound": 0.8333333333333333, "total_time": 0.067366, "solving_time": 0.042058, "reading_time": 0.000954, "presolving_time": 0.000112, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000005.log"} 7 | {"reformulation_constraints": ["use_2"], "iteration_idx": 6, "dual_bound": 0.8333333333333333, "total_time": 0.047654999999999996, "solving_time": 0.032935, "reading_time": 0.000399, "presolving_time": 0.00022799999999999999, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000006.log"} 8 | {"reformulation_constraints": ["edge_1_1", "edge_2_1"], "iteration_idx": 7, "dual_bound": 0.6666666666666666, "total_time": 0.057051, "solving_time": 0.04579, "reading_time": 0.000505, "presolving_time": 0.000118, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000007.log"} 9 | {"reformulation_constraints": ["edge_1_1", "node_1"], "iteration_idx": 8, "dual_bound": 0.6666666666666666, "total_time": 0.052564, "solving_time": 0.03678, "reading_time": 0.000193, "presolving_time": 0.00018899999999999999, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000008.log"} 10 | {"reformulation_constraints": ["edge_1_1", "node_2"], "iteration_idx": 9, "dual_bound": 0.6666666666666666, "total_time": 0.075719, "solving_time": 0.053801999999999996, "reading_time": 0.00016099999999999998, "presolving_time": 0.000138, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000009.log"} 11 | {"reformulation_constraints": ["edge_1_1", "use_1"], "iteration_idx": 10, "dual_bound": 2.0, "total_time": 0.25354499999999996, "solving_time": 0.027701999999999997, "reading_time": 0.00017999999999999998, "presolving_time": 0.00015, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000010.log"} 12 | {"reformulation_constraints": ["edge_1_1", "use_2"], "iteration_idx": 11, "dual_bound": 0.8333333333333333, "total_time": 0.353686, "solving_time": 0.217448, "reading_time": 0.00033, "presolving_time": 0.00016099999999999998, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000011.log"} 13 | {"reformulation_constraints": ["edge_2_1", "node_1"], "iteration_idx": 12, "dual_bound": 0.6666666666666666, "total_time": 0.09423899999999999, "solving_time": 0.055438999999999995, "reading_time": 0.000245, "presolving_time": 0.00010499999999999999, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000012.log"} 14 | {"reformulation_constraints": ["edge_2_1", "node_2"], "iteration_idx": 13, "dual_bound": 0.6666666666666666, "total_time": 0.099077, "solving_time": 0.064956, "reading_time": 0.000176, "presolving_time": 0.000251, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000013.log"} 15 | {"reformulation_constraints": ["edge_2_1", "use_1"], "iteration_idx": 14, "dual_bound": 0.8333333333333333, "total_time": 0.118339, "solving_time": 0.069908, "reading_time": 0.000372, "presolving_time": 0.00010899999999999999, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000014.log"} 16 | {"reformulation_constraints": ["edge_2_1", "use_2"], "iteration_idx": 15, "dual_bound": 2.0, "total_time": 0.046799, "solving_time": 0.021508, "reading_time": 0.00018099999999999998, "presolving_time": 0.000169, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000015.log"} 17 | {"reformulation_constraints": ["node_1", "node_2"], "iteration_idx": 16, "dual_bound": 0.6666666666666666, "total_time": 0.302191, "solving_time": 0.281005, "reading_time": 0.000193, "presolving_time": 0.000212, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000016.log"} 18 | {"reformulation_constraints": ["node_1", "use_1"], "iteration_idx": 17, "dual_bound": 0.8333333333333333, "total_time": 0.089528, "solving_time": 0.063669, "reading_time": 0.000479, "presolving_time": 0.000217, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000017.log"} 19 | {"reformulation_constraints": ["node_1", "use_2"], "iteration_idx": 18, "dual_bound": 0.8333333333333333, "total_time": 0.142702, "solving_time": 0.10803399999999999, "reading_time": 0.001344, "presolving_time": 0.000104, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000018.log"} 20 | {"reformulation_constraints": ["node_2", "use_1"], "iteration_idx": 19, "dual_bound": 0.8333333333333333, "total_time": 0.10919699999999999, "solving_time": 0.06773599999999999, "reading_time": 0.000285, "presolving_time": 0.000159, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000019.log"} 21 | {"reformulation_constraints": ["node_2", "use_2"], "iteration_idx": 20, "dual_bound": 0.8333333333333333, "total_time": 0.195426, "solving_time": 0.099919, "reading_time": 0.000234, "presolving_time": 0.000156, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000020.log"} 22 | {"reformulation_constraints": ["use_1", "use_2"], "iteration_idx": 21, "dual_bound": 1.0, "total_time": 0.059470999999999996, "solving_time": 0.043676, "reading_time": 0.000312, "presolving_time": 0.00016099999999999998, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000021.log"} 23 | {"reformulation_constraints": ["edge_1_1", "node_1", "edge_2_1"], "iteration_idx": 22, "dual_bound": 0.6666666666666666, "total_time": 0.07511799999999999, "solving_time": 0.054847, "reading_time": 0.000448, "presolving_time": 0.000122, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000022.log"} 24 | {"reformulation_constraints": ["edge_1_1", "node_2", "edge_2_1"], "iteration_idx": 23, "dual_bound": 0.6666666666666666, "total_time": 0.093107, "solving_time": 0.063091, "reading_time": 0.000303, "presolving_time": 0.000148, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000023.log"} 25 | {"reformulation_constraints": ["edge_1_1", "use_1", "edge_2_1"], "iteration_idx": 24, "dual_bound": 2.0, "total_time": 0.07814499999999999, "solving_time": 0.058346999999999996, "reading_time": 0.000601, "presolving_time": 0.000144, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000024.log"} 26 | {"reformulation_constraints": ["edge_1_1", "use_2", "edge_2_1"], "iteration_idx": 25, "dual_bound": 2.0, "total_time": 0.106082, "solving_time": 0.053277, "reading_time": 0.008565, "presolving_time": 0.000192, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000025.log"} 27 | {"reformulation_constraints": ["edge_1_1", "node_2", "node_1"], "iteration_idx": 26, "dual_bound": 0.6666666666666666, "total_time": 0.237338, "solving_time": 0.047228, "reading_time": 0.000347, "presolving_time": 0.000145, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000026.log"} 28 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1"], "iteration_idx": 27, "dual_bound": 2.0, "total_time": 0.061890999999999995, "solving_time": 0.028114999999999998, "reading_time": 0.000425, "presolving_time": 0.000173, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000027.log"} 29 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1"], "iteration_idx": 28, "dual_bound": 0.8333333333333333, "total_time": 0.061258999999999994, "solving_time": 0.039742, "reading_time": 0.000287, "presolving_time": 0.000326, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000028.log"} 30 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_1"], "iteration_idx": 29, "dual_bound": 2.0, "total_time": 0.08886999999999999, "solving_time": 0.043990999999999995, "reading_time": 0.000341, "presolving_time": 0.00012299999999999998, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000029.log"} 31 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_2"], "iteration_idx": 30, "dual_bound": 0.8333333333333333, "total_time": 0.078457, "solving_time": 0.049079, "reading_time": 0.002023, "presolving_time": 0.00015999999999999999, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000030.log"} 32 | {"reformulation_constraints": ["edge_1_1", "use_2", "use_1"], "iteration_idx": 31, "dual_bound": 2.0, "total_time": 0.029849999999999998, "solving_time": 0.013682, "reading_time": 0.000203, "presolving_time": 9.999999999999999e-05, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000031.log"} 33 | {"reformulation_constraints": ["edge_2_1", "node_2", "node_1"], "iteration_idx": 32, "dual_bound": 0.6666666666666666, "total_time": 0.069954, "solving_time": 0.046327, "reading_time": 0.00031, "presolving_time": 0.00011899999999999999, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000032.log"} 34 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1"], "iteration_idx": 33, "dual_bound": 0.8333333333333333, "total_time": 0.114856, "solving_time": 0.08828599999999999, "reading_time": 0.000245, "presolving_time": 0.001072, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000033.log"} 35 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_1"], "iteration_idx": 34, "dual_bound": 2.0, "total_time": 0.052711, "solving_time": 0.030683, "reading_time": 0.00069, "presolving_time": 0.00024099999999999998, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000034.log"} 36 | {"reformulation_constraints": ["edge_2_1", "use_1", "node_2"], "iteration_idx": 35, "dual_bound": 0.8333333333333333, "total_time": 0.168729, "solving_time": 0.071083, "reading_time": 0.000321, "presolving_time": 0.00026399999999999997, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000035.log"} 37 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_2"], "iteration_idx": 36, "dual_bound": 2.0, "total_time": 0.046187, "solving_time": 0.022749, "reading_time": 0.000208, "presolving_time": 0.000104, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000036.log"} 38 | {"reformulation_constraints": ["edge_2_1", "use_2", "use_1"], "iteration_idx": 37, "dual_bound": 2.0, "total_time": 0.060884, "solving_time": 0.024768, "reading_time": 0.000279, "presolving_time": 0.000215, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000037.log"} 39 | {"reformulation_constraints": ["node_1", "node_2", "use_1"], "iteration_idx": 38, "dual_bound": 0.8333333333333333, "total_time": 0.078261, "solving_time": 0.051632, "reading_time": 0.000614, "presolving_time": 0.000251, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000038.log"} 40 | {"reformulation_constraints": ["node_1", "use_2", "node_2"], "iteration_idx": 39, "dual_bound": 0.8333333333333333, "total_time": 0.077315, "solving_time": 0.056935, "reading_time": 0.000385, "presolving_time": 0.000116, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000039.log"} 41 | {"reformulation_constraints": ["node_1", "use_2", "use_1"], "iteration_idx": 40, "dual_bound": 1.0, "total_time": 0.09980399999999999, "solving_time": 0.06473999999999999, "reading_time": 0.00039, "presolving_time": 0.000128, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000040.log"} 42 | {"reformulation_constraints": ["node_2", "use_2", "use_1"], "iteration_idx": 41, "dual_bound": 1.0, "total_time": 0.058268999999999994, "solving_time": 0.042933, "reading_time": 0.00021999999999999998, "presolving_time": 9.6e-05, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000041.log"} 43 | {"reformulation_constraints": ["edge_1_1", "node_2", "node_1", "edge_2_1"], "iteration_idx": 42, "dual_bound": 0.6666666666666666, "total_time": 0.073075, "solving_time": 0.053362, "reading_time": 0.000768, "presolving_time": 0.000154, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000042.log"} 44 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "edge_2_1"], "iteration_idx": 43, "dual_bound": 2.0, "total_time": 0.062583, "solving_time": 0.034376, "reading_time": 0.000399, "presolving_time": 0.000104, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000043.log"} 45 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1", "edge_2_1"], "iteration_idx": 44, "dual_bound": 2.0, "total_time": 0.049047999999999994, "solving_time": 0.022491, "reading_time": 0.000403, "presolving_time": 0.000187, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000044.log"} 46 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_1", "edge_2_1"], "iteration_idx": 45, "dual_bound": 2.0, "total_time": 0.058419, "solving_time": 0.033108, "reading_time": 0.000224, "presolving_time": 9.9e-05, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000045.log"} 47 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_2", "edge_2_1"], "iteration_idx": 46, "dual_bound": 2.0, "total_time": 0.067554, "solving_time": 0.027197, "reading_time": 0.000318, "presolving_time": 0.000301, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000046.log"} 48 | {"reformulation_constraints": ["edge_1_1", "use_2", "use_1", "edge_2_1"], "iteration_idx": 47, "dual_bound": 2.0, "total_time": 0.06854099999999999, "solving_time": 0.041916999999999996, "reading_time": 0.000183, "presolving_time": 0.000198, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000047.log"} 49 | {"reformulation_constraints": ["edge_1_1", "node_2", "node_1", "use_1"], "iteration_idx": 48, "dual_bound": 2.0, "total_time": 0.054064999999999995, "solving_time": 0.020777, "reading_time": 0.000299, "presolving_time": 0.000107, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000048.log"} 50 | {"reformulation_constraints": ["edge_1_1", "node_2", "node_1", "use_2"], "iteration_idx": 49, "dual_bound": 2.0, "total_time": 0.069352, "solving_time": 0.036175, "reading_time": 0.002193, "presolving_time": 0.00015999999999999999, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000049.log"} 51 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1", "use_1"], "iteration_idx": 50, "dual_bound": 2.0, "total_time": 0.06534, "solving_time": 0.027964, "reading_time": 0.000744, "presolving_time": 9.3e-05, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000050.log"} 52 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_1", "use_2"], "iteration_idx": 51, "dual_bound": 2.0, "total_time": 0.048097, "solving_time": 0.024014999999999998, "reading_time": 0.000325, "presolving_time": 0.000263, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000051.log"} 53 | {"reformulation_constraints": ["edge_2_1", "node_2", "node_1", "use_1"], "iteration_idx": 52, "dual_bound": 2.0, "total_time": 0.056513, "solving_time": 0.036740999999999996, "reading_time": 0.000247, "presolving_time": 0.000144, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000052.log"} 54 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_2", "node_1"], "iteration_idx": 53, "dual_bound": 2.0, "total_time": 0.040166, "solving_time": 0.018564, "reading_time": 0.000712, "presolving_time": 0.001906, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000053.log"} 55 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_1", "use_1"], "iteration_idx": 54, "dual_bound": 2.0, "total_time": 0.034496, "solving_time": 0.019728, "reading_time": 0.000234, "presolving_time": 0.00011399999999999999, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000054.log"} 56 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_2", "use_1"], "iteration_idx": 55, "dual_bound": 2.0, "total_time": 0.036042, "solving_time": 0.022491999999999998, "reading_time": 0.000185, "presolving_time": 0.000124, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000055.log"} 57 | {"reformulation_constraints": ["node_1", "use_2", "use_1", "node_2"], "iteration_idx": 56, "dual_bound": 1.0, "total_time": 0.07936599999999999, "solving_time": 0.06658599999999999, "reading_time": 0.00025, "presolving_time": 0.00017099999999999998, "status": "nodelimit", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000056.log"} 58 | {"reformulation_constraints": ["edge_2_1", "edge_1_1", "node_1", "use_1", "node_2"], "iteration_idx": 57, "dual_bound": 2.0, "total_time": 0.039876999999999996, "solving_time": 0.023601, "reading_time": 0.000366, "presolving_time": 0.000112, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000057.log"} 59 | {"reformulation_constraints": ["node_2", "edge_2_1", "edge_1_1", "node_1", "use_2"], "iteration_idx": 58, "dual_bound": 2.0, "total_time": 0.042821, "solving_time": 0.02502, "reading_time": 0.00023799999999999998, "presolving_time": 0.000136, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000058.log"} 60 | {"reformulation_constraints": ["edge_2_1", "edge_1_1", "node_1", "use_1", "use_2"], "iteration_idx": 59, "dual_bound": 2.0, "total_time": 0.11077, "solving_time": 0.041928, "reading_time": 0.028766, "presolving_time": 0.000134, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000059.log"} 61 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_2", "edge_2_1", "use_2"], "iteration_idx": 60, "dual_bound": 2.0, "total_time": 0.110093, "solving_time": 0.051133, "reading_time": 0.000236, "presolving_time": 0.000154, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000060.log"} 62 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_1", "node_2", "use_2"], "iteration_idx": 61, "dual_bound": 2.0, "total_time": 0.064944, "solving_time": 0.032819, "reading_time": 0.000491, "presolving_time": 9.099999999999999e-05, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000061.log"} 63 | {"reformulation_constraints": ["node_1", "use_2", "use_1", "node_2", "edge_2_1"], "iteration_idx": 62, "dual_bound": 2.0, "total_time": 0.052582, "solving_time": 0.01652, "reading_time": 0.000301, "presolving_time": 0.000196, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000062.log"} 64 | {"reformulation_constraints": ["edge_2_1", "edge_1_1", "use_1", "node_1", "node_2", "use_2"], "iteration_idx": 63, "dual_bound": 2.0, "total_time": 0.029559, "solving_time": 0.011576, "reading_time": 0.00052, "presolving_time": 0.000159, "status": "optimal", "log_filename": "/Users/lentz/Desktop/pygcgopt-env-docs/PyGCGOpt/docs/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2021-11-26T130601_idx_000063.log"} 65 | -------------------------------------------------------------------------------- /examples/alldecomps/results/coloring3.lp/result_coloring3.lp_2022-02-05T035919.jsonl: -------------------------------------------------------------------------------- 1 | {"reformulation_constraints": [], "iteration_idx": 0, "dual_bound": 2.0, "total_time": 0.02265, "solving_time": 0.009035999999999999, "reading_time": 0.001089, "presolving_time": 0.000137, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000000.log"} 2 | {"reformulation_constraints": ["edge_1_1"], "iteration_idx": 1, "dual_bound": 0.6666666666666666, "total_time": 0.024263, "solving_time": 0.01684, "reading_time": 0.000748, "presolving_time": 7.4e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000001.log"} 3 | {"reformulation_constraints": ["edge_2_1"], "iteration_idx": 2, "dual_bound": 0.6666666666666666, "total_time": 0.022394999999999998, "solving_time": 0.015352999999999999, "reading_time": 0.001133, "presolving_time": 6.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000002.log"} 4 | {"reformulation_constraints": ["node_1"], "iteration_idx": 3, "dual_bound": 0.6666666666666666, "total_time": 0.025219, "solving_time": 0.018311, "reading_time": 0.0007279999999999999, "presolving_time": 0.000104, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000003.log"} 5 | {"reformulation_constraints": ["node_2"], "iteration_idx": 4, "dual_bound": 0.6666666666666666, "total_time": 0.024572, "solving_time": 0.01763, "reading_time": 0.000919, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000004.log"} 6 | {"reformulation_constraints": ["use_1"], "iteration_idx": 5, "dual_bound": 0.8333333333333333, "total_time": 0.026487, "solving_time": 0.01663, "reading_time": 0.00142, "presolving_time": 7.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000005.log"} 7 | {"reformulation_constraints": ["use_2"], "iteration_idx": 6, "dual_bound": 0.8333333333333333, "total_time": 0.022234, "solving_time": 0.015262, "reading_time": 0.001013, "presolving_time": 6.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000006.log"} 8 | {"reformulation_constraints": ["edge_1_1", "edge_2_1"], "iteration_idx": 7, "dual_bound": 0.6666666666666666, "total_time": 0.032765999999999997, "solving_time": 0.023535999999999998, "reading_time": 0.00112, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000007.log"} 9 | {"reformulation_constraints": ["edge_1_1", "node_1"], "iteration_idx": 8, "dual_bound": 0.6666666666666666, "total_time": 0.026536999999999998, "solving_time": 0.018376, "reading_time": 0.001161, "presolving_time": 7.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000008.log"} 10 | {"reformulation_constraints": ["edge_1_1", "node_2"], "iteration_idx": 9, "dual_bound": 0.6666666666666666, "total_time": 0.026095, "solving_time": 0.018149, "reading_time": 0.001406, "presolving_time": 6.5e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000009.log"} 11 | {"reformulation_constraints": ["edge_1_1", "use_1"], "iteration_idx": 10, "dual_bound": 2.0, "total_time": 0.015167, "solving_time": 0.007147, "reading_time": 0.00073, "presolving_time": 6.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000010.log"} 12 | {"reformulation_constraints": ["edge_1_1", "use_2"], "iteration_idx": 11, "dual_bound": 0.8333333333333333, "total_time": 0.034821, "solving_time": 0.025290999999999998, "reading_time": 0.001135, "presolving_time": 6.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000011.log"} 13 | {"reformulation_constraints": ["edge_2_1", "node_1"], "iteration_idx": 12, "dual_bound": 0.6666666666666666, "total_time": 0.029807, "solving_time": 0.021051999999999998, "reading_time": 0.001062, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000012.log"} 14 | {"reformulation_constraints": ["edge_2_1", "node_2"], "iteration_idx": 13, "dual_bound": 0.6666666666666666, "total_time": 0.027524999999999997, "solving_time": 0.019618999999999998, "reading_time": 0.001614, "presolving_time": 6.5e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000013.log"} 15 | {"reformulation_constraints": ["edge_2_1", "use_1"], "iteration_idx": 14, "dual_bound": 0.8333333333333333, "total_time": 0.053454999999999996, "solving_time": 0.041388999999999995, "reading_time": 0.001434, "presolving_time": 6.5e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000014.log"} 16 | {"reformulation_constraints": ["edge_2_1", "use_2"], "iteration_idx": 15, "dual_bound": 2.0, "total_time": 0.020715, "solving_time": 0.009035, "reading_time": 0.001055, "presolving_time": 7.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000015.log"} 17 | {"reformulation_constraints": ["node_1", "node_2"], "iteration_idx": 16, "dual_bound": 0.6666666666666666, "total_time": 0.043115999999999995, "solving_time": 0.03186, "reading_time": 0.000655, "presolving_time": 9.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000016.log"} 18 | {"reformulation_constraints": ["node_1", "use_1"], "iteration_idx": 17, "dual_bound": 0.8333333333333333, "total_time": 0.042366, "solving_time": 0.033045, "reading_time": 0.000979, "presolving_time": 8.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000017.log"} 19 | {"reformulation_constraints": ["node_1", "use_2"], "iteration_idx": 18, "dual_bound": 0.8333333333333333, "total_time": 0.039359, "solving_time": 0.028811, "reading_time": 0.000744, "presolving_time": 0.00044199999999999996, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000018.log"} 20 | {"reformulation_constraints": ["node_2", "use_1"], "iteration_idx": 19, "dual_bound": 0.8333333333333333, "total_time": 0.035135, "solving_time": 0.024534999999999998, "reading_time": 0.001426, "presolving_time": 8.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000019.log"} 21 | {"reformulation_constraints": ["node_2", "use_2"], "iteration_idx": 20, "dual_bound": 0.8333333333333333, "total_time": 0.037652, "solving_time": 0.027427, "reading_time": 0.000843, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000020.log"} 22 | {"reformulation_constraints": ["use_1", "use_2"], "iteration_idx": 21, "dual_bound": 1.0, "total_time": 0.029476, "solving_time": 0.018781, "reading_time": 0.00074, "presolving_time": 8.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000021.log"} 23 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_1"], "iteration_idx": 22, "dual_bound": 0.6666666666666666, "total_time": 0.037642999999999996, "solving_time": 0.028485999999999997, "reading_time": 0.001292, "presolving_time": 0.000107, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000022.log"} 24 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_2"], "iteration_idx": 23, "dual_bound": 0.6666666666666666, "total_time": 0.044682, "solving_time": 0.031745999999999996, "reading_time": 0.00115, "presolving_time": 0.000374, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000023.log"} 25 | {"reformulation_constraints": ["edge_1_1", "use_1", "edge_2_1"], "iteration_idx": 24, "dual_bound": 2.0, "total_time": 0.037621999999999996, "solving_time": 0.025988999999999998, "reading_time": 0.001242, "presolving_time": 7.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000024.log"} 26 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "use_2"], "iteration_idx": 25, "dual_bound": 2.0, "total_time": 0.043956999999999996, "solving_time": 0.033361, "reading_time": 0.00158, "presolving_time": 9.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000025.log"} 27 | {"reformulation_constraints": ["edge_1_1", "node_1", "node_2"], "iteration_idx": 26, "dual_bound": 0.6666666666666666, "total_time": 0.034244, "solving_time": 0.022550999999999998, "reading_time": 0.001651, "presolving_time": 7.5e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000026.log"} 28 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1"], "iteration_idx": 27, "dual_bound": 2.0, "total_time": 0.019055, "solving_time": 0.00928, "reading_time": 0.001825, "presolving_time": 8.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000027.log"} 29 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_2"], "iteration_idx": 28, "dual_bound": 0.8333333333333333, "total_time": 0.028488, "solving_time": 0.02079, "reading_time": 0.001032, "presolving_time": 6.4e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000028.log"} 30 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_2"], "iteration_idx": 29, "dual_bound": 2.0, "total_time": 0.019622, "solving_time": 0.009915, "reading_time": 0.002846, "presolving_time": 6.9e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000029.log"} 31 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_2"], "iteration_idx": 30, "dual_bound": 0.8333333333333333, "total_time": 0.037184, "solving_time": 0.026944, "reading_time": 0.001517, "presolving_time": 9.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000030.log"} 32 | {"reformulation_constraints": ["edge_1_1", "use_2", "use_1"], "iteration_idx": 31, "dual_bound": 2.0, "total_time": 0.016677, "solving_time": 0.007069, "reading_time": 0.001687, "presolving_time": 6.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000031.log"} 33 | {"reformulation_constraints": ["edge_2_1", "node_1", "node_2"], "iteration_idx": 32, "dual_bound": 0.6666666666666666, "total_time": 0.031037, "solving_time": 0.022955999999999997, "reading_time": 0.00142, "presolving_time": 6.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000032.log"} 34 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1"], "iteration_idx": 33, "dual_bound": 0.8333333333333333, "total_time": 0.034356, "solving_time": 0.023972999999999998, "reading_time": 0.00165, "presolving_time": 6.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000033.log"} 35 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_2"], "iteration_idx": 34, "dual_bound": 2.0, "total_time": 0.021566, "solving_time": 0.011855, "reading_time": 0.000869, "presolving_time": 8.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000034.log"} 36 | {"reformulation_constraints": ["edge_2_1", "use_1", "node_2"], "iteration_idx": 35, "dual_bound": 0.8333333333333333, "total_time": 0.034801, "solving_time": 0.024588, "reading_time": 0.001524, "presolving_time": 7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000035.log"} 37 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2"], "iteration_idx": 36, "dual_bound": 2.0, "total_time": 0.018987999999999998, "solving_time": 0.009922, "reading_time": 0.001715, "presolving_time": 7.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000036.log"} 38 | {"reformulation_constraints": ["edge_2_1", "use_2", "use_1"], "iteration_idx": 37, "dual_bound": 2.0, "total_time": 0.020662, "solving_time": 0.009963, "reading_time": 0.001705, "presolving_time": 9.999999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000037.log"} 39 | {"reformulation_constraints": ["node_1", "use_1", "node_2"], "iteration_idx": 38, "dual_bound": 0.8333333333333333, "total_time": 0.031239999999999997, "solving_time": 0.023042, "reading_time": 0.000739, "presolving_time": 7.4e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000038.log"} 40 | {"reformulation_constraints": ["node_1", "use_2", "node_2"], "iteration_idx": 39, "dual_bound": 0.8333333333333333, "total_time": 0.031226999999999998, "solving_time": 0.022142, "reading_time": 0.00162, "presolving_time": 6.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000039.log"} 41 | {"reformulation_constraints": ["node_1", "use_2", "use_1"], "iteration_idx": 40, "dual_bound": 1.0, "total_time": 0.029754, "solving_time": 0.020399999999999998, "reading_time": 0.000704, "presolving_time": 8.499999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000040.log"} 42 | {"reformulation_constraints": ["node_2", "use_2", "use_1"], "iteration_idx": 41, "dual_bound": 1.0, "total_time": 0.028263, "solving_time": 0.018593, "reading_time": 0.001859, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000041.log"} 43 | {"reformulation_constraints": ["edge_1_1", "node_1", "edge_2_1", "node_2"], "iteration_idx": 42, "dual_bound": 0.6666666666666666, "total_time": 0.030282, "solving_time": 0.019885, "reading_time": 0.001709, "presolving_time": 8.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000042.log"} 44 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "edge_2_1"], "iteration_idx": 43, "dual_bound": 2.0, "total_time": 0.021307, "solving_time": 0.01292, "reading_time": 0.000749, "presolving_time": 6.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000043.log"} 45 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1", "edge_2_1"], "iteration_idx": 44, "dual_bound": 2.0, "total_time": 0.019594999999999998, "solving_time": 0.009673, "reading_time": 0.001341, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000044.log"} 46 | {"reformulation_constraints": ["edge_1_1", "node_2", "edge_2_1", "use_1"], "iteration_idx": 45, "dual_bound": 2.0, "total_time": 0.020415, "solving_time": 0.011436, "reading_time": 0.001818, "presolving_time": 6.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000045.log"} 47 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_2", "use_2"], "iteration_idx": 46, "dual_bound": 2.0, "total_time": 0.01909, "solving_time": 0.010298, "reading_time": 0.001514, "presolving_time": 6.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000046.log"} 48 | {"reformulation_constraints": ["edge_1_1", "use_2", "edge_2_1", "use_1"], "iteration_idx": 47, "dual_bound": 2.0, "total_time": 0.020956, "solving_time": 0.010138, "reading_time": 0.001736, "presolving_time": 9.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000047.log"} 49 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_2", "node_1"], "iteration_idx": 48, "dual_bound": 2.0, "total_time": 0.017301, "solving_time": 0.008369999999999999, "reading_time": 0.001831, "presolving_time": 7.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000048.log"} 50 | {"reformulation_constraints": ["edge_1_1", "node_1", "node_2", "use_2"], "iteration_idx": 49, "dual_bound": 2.0, "total_time": 0.021619, "solving_time": 0.01095, "reading_time": 0.001805, "presolving_time": 7.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000049.log"} 51 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "use_2"], "iteration_idx": 50, "dual_bound": 2.0, "total_time": 0.016273, "solving_time": 0.008376999999999999, "reading_time": 0.000726, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000050.log"} 52 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_2", "use_2"], "iteration_idx": 51, "dual_bound": 2.0, "total_time": 0.018501999999999998, "solving_time": 0.00912, "reading_time": 0.000808, "presolving_time": 9.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000051.log"} 53 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1", "node_2"], "iteration_idx": 52, "dual_bound": 2.0, "total_time": 0.021313, "solving_time": 0.011198, "reading_time": 0.001833, "presolving_time": 8.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000052.log"} 54 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2", "node_1"], "iteration_idx": 53, "dual_bound": 2.0, "total_time": 0.024052, "solving_time": 0.014112999999999999, "reading_time": 0.0015119999999999999, "presolving_time": 7.3e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000053.log"} 55 | {"reformulation_constraints": ["edge_2_1", "use_1", "use_2", "node_1"], "iteration_idx": 54, "dual_bound": 2.0, "total_time": 0.016902, "solving_time": 0.008816, "reading_time": 0.000799, "presolving_time": 6.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000054.log"} 56 | {"reformulation_constraints": ["edge_2_1", "use_1", "node_2", "use_2"], "iteration_idx": 55, "dual_bound": 2.0, "total_time": 0.017051, "solving_time": 0.008106, "reading_time": 0.001648, "presolving_time": 6.5e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000055.log"} 57 | {"reformulation_constraints": ["node_1", "use_1", "node_2", "use_2"], "iteration_idx": 56, "dual_bound": 1.0, "total_time": 0.032369999999999996, "solving_time": 0.022711, "reading_time": 0.001689, "presolving_time": 8.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000056.log"} 58 | {"reformulation_constraints": ["use_1", "edge_2_1", "node_2", "node_1", "edge_1_1"], "iteration_idx": 57, "dual_bound": 2.0, "total_time": 0.024648999999999997, "solving_time": 0.013621, "reading_time": 0.001434, "presolving_time": 8.3e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000057.log"} 59 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_2", "node_2", "edge_2_1"], "iteration_idx": 58, "dual_bound": 2.0, "total_time": 0.020959, "solving_time": 0.009613, "reading_time": 0.000808, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000058.log"} 60 | {"reformulation_constraints": ["use_1", "use_2", "edge_2_1", "node_1", "edge_1_1"], "iteration_idx": 59, "dual_bound": 2.0, "total_time": 0.030306, "solving_time": 0.011193, "reading_time": 0.000821, "presolving_time": 8.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000059.log"} 61 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_2", "use_2", "edge_2_1"], "iteration_idx": 60, "dual_bound": 2.0, "total_time": 0.020523, "solving_time": 0.009925, "reading_time": 0.001679, "presolving_time": 7.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000060.log"} 62 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "use_2", "node_2"], "iteration_idx": 61, "dual_bound": 2.0, "total_time": 0.019955999999999998, "solving_time": 0.009529, "reading_time": 0.001733, "presolving_time": 7.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000061.log"} 63 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2", "use_1", "node_1"], "iteration_idx": 62, "dual_bound": 2.0, "total_time": 0.019681, "solving_time": 0.008813999999999999, "reading_time": 0.001555, "presolving_time": 0.000425, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000062.log"} 64 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_1", "use_2", "node_2", "edge_2_1"], "iteration_idx": 63, "dual_bound": 2.0, "total_time": 0.012643, "solving_time": 0.0033539999999999998, "reading_time": 0.001499, "presolving_time": 0.000108, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T035919_idx_000063.log"} 65 | -------------------------------------------------------------------------------- /examples/alldecomps/results/coloring3.lp/result_coloring3.lp_2022-02-05T040212.jsonl: -------------------------------------------------------------------------------- 1 | {"reformulation_constraints": [], "iteration_idx": 0, "dual_bound": 2.0, "total_time": 0.02456, "solving_time": 0.011243999999999999, "reading_time": 0.000992, "presolving_time": 0.000491, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000000.log"} 2 | {"reformulation_constraints": ["edge_1_1"], "iteration_idx": 1, "dual_bound": 0.6666666666666666, "total_time": 0.046495999999999996, "solving_time": 0.02606, "reading_time": 0.002222, "presolving_time": 8.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000001.log"} 3 | {"reformulation_constraints": ["edge_2_1"], "iteration_idx": 2, "dual_bound": 0.6666666666666666, "total_time": 0.034685, "solving_time": 0.021523999999999998, "reading_time": 0.003633, "presolving_time": 8.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000002.log"} 4 | {"reformulation_constraints": ["node_1"], "iteration_idx": 3, "dual_bound": 0.6666666666666666, "total_time": 0.036892999999999995, "solving_time": 0.023089, "reading_time": 0.003166, "presolving_time": 7.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000003.log"} 5 | {"reformulation_constraints": ["node_2"], "iteration_idx": 4, "dual_bound": 0.6666666666666666, "total_time": 0.03017, "solving_time": 0.019135, "reading_time": 0.002974, "presolving_time": 8.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000004.log"} 6 | {"reformulation_constraints": ["use_1"], "iteration_idx": 5, "dual_bound": 0.8333333333333333, "total_time": 0.029869, "solving_time": 0.016125, "reading_time": 0.003418, "presolving_time": 7.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000005.log"} 7 | {"reformulation_constraints": ["use_2"], "iteration_idx": 6, "dual_bound": 0.8333333333333333, "total_time": 0.02966, "solving_time": 0.016158, "reading_time": 0.003512, "presolving_time": 7.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000006.log"} 8 | {"reformulation_constraints": ["edge_1_1", "edge_2_1"], "iteration_idx": 7, "dual_bound": 0.6666666666666666, "total_time": 0.032664, "solving_time": 0.021717, "reading_time": 0.0008839999999999999, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000007.log"} 9 | {"reformulation_constraints": ["edge_1_1", "node_1"], "iteration_idx": 8, "dual_bound": 0.6666666666666666, "total_time": 0.032241, "solving_time": 0.019143999999999998, "reading_time": 0.003741, "presolving_time": 6.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000008.log"} 10 | {"reformulation_constraints": ["edge_1_1", "node_2"], "iteration_idx": 9, "dual_bound": 0.6666666666666666, "total_time": 0.033836, "solving_time": 0.019931, "reading_time": 0.003166, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000009.log"} 11 | {"reformulation_constraints": ["edge_1_1", "use_1"], "iteration_idx": 10, "dual_bound": 2.0, "total_time": 0.019126, "solving_time": 0.0076489999999999995, "reading_time": 0.000846, "presolving_time": 6.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000010.log"} 12 | {"reformulation_constraints": ["edge_1_1", "use_2"], "iteration_idx": 11, "dual_bound": 0.8333333333333333, "total_time": 0.035884, "solving_time": 0.025227, "reading_time": 0.002593, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000011.log"} 13 | {"reformulation_constraints": ["edge_2_1", "node_1"], "iteration_idx": 12, "dual_bound": 0.6666666666666666, "total_time": 0.032522999999999996, "solving_time": 0.019351, "reading_time": 0.004842, "presolving_time": 7.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000012.log"} 14 | {"reformulation_constraints": ["edge_2_1", "node_2"], "iteration_idx": 13, "dual_bound": 0.6666666666666666, "total_time": 0.041261, "solving_time": 0.027975999999999997, "reading_time": 0.003542, "presolving_time": 7.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000013.log"} 15 | {"reformulation_constraints": ["edge_2_1", "use_1"], "iteration_idx": 14, "dual_bound": 0.8333333333333333, "total_time": 0.048193, "solving_time": 0.034173999999999996, "reading_time": 0.003368, "presolving_time": 8.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000014.log"} 16 | {"reformulation_constraints": ["edge_2_1", "use_2"], "iteration_idx": 15, "dual_bound": 2.0, "total_time": 0.025539, "solving_time": 0.010817, "reading_time": 0.003922999999999999, "presolving_time": 7.999999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000015.log"} 17 | {"reformulation_constraints": ["node_1", "node_2"], "iteration_idx": 16, "dual_bound": 0.6666666666666666, "total_time": 0.033323, "solving_time": 0.019864, "reading_time": 0.003302, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000016.log"} 18 | {"reformulation_constraints": ["node_1", "use_1"], "iteration_idx": 17, "dual_bound": 0.8333333333333333, "total_time": 0.035647, "solving_time": 0.021689999999999997, "reading_time": 0.003784, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000017.log"} 19 | {"reformulation_constraints": ["node_1", "use_2"], "iteration_idx": 18, "dual_bound": 0.8333333333333333, "total_time": 0.035767, "solving_time": 0.02214, "reading_time": 0.003361, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000018.log"} 20 | {"reformulation_constraints": ["node_2", "use_1"], "iteration_idx": 19, "dual_bound": 0.8333333333333333, "total_time": 0.033736999999999996, "solving_time": 0.023150999999999998, "reading_time": 0.003423, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000019.log"} 21 | {"reformulation_constraints": ["node_2", "use_2"], "iteration_idx": 20, "dual_bound": 0.8333333333333333, "total_time": 0.0348, "solving_time": 0.022746, "reading_time": 0.003254, "presolving_time": 8.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000020.log"} 22 | {"reformulation_constraints": ["use_1", "use_2"], "iteration_idx": 21, "dual_bound": 1.0, "total_time": 0.041103999999999995, "solving_time": 0.026372, "reading_time": 0.003457, "presolving_time": 0.00012299999999999998, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000021.log"} 23 | {"reformulation_constraints": ["edge_1_1", "node_1", "edge_2_1"], "iteration_idx": 22, "dual_bound": 0.6666666666666666, "total_time": 0.034921, "solving_time": 0.02112, "reading_time": 0.003823, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000022.log"} 24 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_2"], "iteration_idx": 23, "dual_bound": 0.6666666666666666, "total_time": 0.044346, "solving_time": 0.030562, "reading_time": 0.00349, "presolving_time": 8.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000023.log"} 25 | {"reformulation_constraints": ["edge_1_1", "use_1", "edge_2_1"], "iteration_idx": 24, "dual_bound": 2.0, "total_time": 0.044109999999999996, "solving_time": 0.03218, "reading_time": 0.001875, "presolving_time": 0.00013099999999999999, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000024.log"} 26 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "use_2"], "iteration_idx": 25, "dual_bound": 2.0, "total_time": 0.046675, "solving_time": 0.033325, "reading_time": 0.00299, "presolving_time": 8.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000025.log"} 27 | {"reformulation_constraints": ["edge_1_1", "node_1", "node_2"], "iteration_idx": 26, "dual_bound": 0.6666666666666666, "total_time": 0.04899, "solving_time": 0.031527, "reading_time": 0.003754, "presolving_time": 0.000117, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000026.log"} 28 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1"], "iteration_idx": 27, "dual_bound": 2.0, "total_time": 0.022902, "solving_time": 0.009927, "reading_time": 0.003643, "presolving_time": 7.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000027.log"} 29 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1"], "iteration_idx": 28, "dual_bound": 0.8333333333333333, "total_time": 0.035619, "solving_time": 0.021533, "reading_time": 0.003584, "presolving_time": 6.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000028.log"} 30 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_1"], "iteration_idx": 29, "dual_bound": 2.0, "total_time": 0.02086, "solving_time": 0.009888, "reading_time": 0.003349, "presolving_time": 9.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000029.log"} 31 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_2"], "iteration_idx": 30, "dual_bound": 0.8333333333333333, "total_time": 0.035988, "solving_time": 0.022435, "reading_time": 0.0035619999999999996, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000030.log"} 32 | {"reformulation_constraints": ["edge_1_1", "use_1", "use_2"], "iteration_idx": 31, "dual_bound": 2.0, "total_time": 0.01873, "solving_time": 0.0065119999999999996, "reading_time": 0.004057, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000031.log"} 33 | {"reformulation_constraints": ["edge_2_1", "node_1", "node_2"], "iteration_idx": 32, "dual_bound": 0.6666666666666666, "total_time": 0.031134, "solving_time": 0.020078, "reading_time": 0.003005, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000032.log"} 34 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1"], "iteration_idx": 33, "dual_bound": 0.8333333333333333, "total_time": 0.037954999999999996, "solving_time": 0.023866, "reading_time": 0.003467, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000033.log"} 35 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_2"], "iteration_idx": 34, "dual_bound": 2.0, "total_time": 0.025611, "solving_time": 0.01081, "reading_time": 0.003652, "presolving_time": 0.000494, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000034.log"} 36 | {"reformulation_constraints": ["edge_2_1", "use_1", "node_2"], "iteration_idx": 35, "dual_bound": 0.8333333333333333, "total_time": 0.033527, "solving_time": 0.020524999999999998, "reading_time": 0.003885, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000035.log"} 37 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_2"], "iteration_idx": 36, "dual_bound": 2.0, "total_time": 0.017011, "solving_time": 0.009302, "reading_time": 0.000968, "presolving_time": 6.1e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000036.log"} 38 | {"reformulation_constraints": ["edge_2_1", "use_1", "use_2"], "iteration_idx": 37, "dual_bound": 2.0, "total_time": 0.021445, "solving_time": 0.0071719999999999996, "reading_time": 0.003851, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000037.log"} 39 | {"reformulation_constraints": ["node_1", "node_2", "use_1"], "iteration_idx": 38, "dual_bound": 0.8333333333333333, "total_time": 0.032972, "solving_time": 0.021547, "reading_time": 0.003764, "presolving_time": 7.999999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000038.log"} 40 | {"reformulation_constraints": ["node_1", "use_2", "node_2"], "iteration_idx": 39, "dual_bound": 0.8333333333333333, "total_time": 0.031129999999999998, "solving_time": 0.0207, "reading_time": 0.003505, "presolving_time": 6.5e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000039.log"} 41 | {"reformulation_constraints": ["node_1", "use_2", "use_1"], "iteration_idx": 40, "dual_bound": 1.0, "total_time": 0.033698, "solving_time": 0.019878, "reading_time": 0.003979, "presolving_time": 6.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000040.log"} 42 | {"reformulation_constraints": ["node_2", "use_2", "use_1"], "iteration_idx": 41, "dual_bound": 1.0, "total_time": 0.039452999999999995, "solving_time": 0.028888999999999998, "reading_time": 0.000811, "presolving_time": 7.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000041.log"} 43 | {"reformulation_constraints": ["edge_1_1", "node_1", "edge_2_1", "node_2"], "iteration_idx": 42, "dual_bound": 0.6666666666666666, "total_time": 0.037077, "solving_time": 0.022106999999999998, "reading_time": 0.003372, "presolving_time": 7.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000042.log"} 44 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "edge_2_1"], "iteration_idx": 43, "dual_bound": 2.0, "total_time": 0.019858, "solving_time": 0.011379, "reading_time": 0.002072, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000043.log"} 45 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1", "edge_2_1"], "iteration_idx": 44, "dual_bound": 2.0, "total_time": 0.024193, "solving_time": 0.010144, "reading_time": 0.003379, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000044.log"} 46 | {"reformulation_constraints": ["edge_1_1", "use_1", "edge_2_1", "node_2"], "iteration_idx": 45, "dual_bound": 2.0, "total_time": 0.025592999999999998, "solving_time": 0.011099999999999999, "reading_time": 0.003888, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000045.log"} 47 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_2", "edge_2_1"], "iteration_idx": 46, "dual_bound": 2.0, "total_time": 0.018734999999999998, "solving_time": 0.010492999999999999, "reading_time": 0.000799, "presolving_time": 7.3e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000046.log"} 48 | {"reformulation_constraints": ["edge_1_1", "use_2", "use_1", "edge_2_1"], "iteration_idx": 47, "dual_bound": 2.0, "total_time": 0.024512, "solving_time": 0.010692, "reading_time": 0.004025, "presolving_time": 6.5e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000047.log"} 49 | {"reformulation_constraints": ["edge_1_1", "node_2", "node_1", "use_1"], "iteration_idx": 48, "dual_bound": 2.0, "total_time": 0.018136, "solving_time": 0.009889, "reading_time": 0.000842, "presolving_time": 7.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000048.log"} 50 | {"reformulation_constraints": ["edge_1_1", "node_1", "node_2", "use_2"], "iteration_idx": 49, "dual_bound": 2.0, "total_time": 0.024627, "solving_time": 0.010646, "reading_time": 0.005072, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000049.log"} 51 | {"reformulation_constraints": ["edge_1_1", "use_2", "node_1", "use_1"], "iteration_idx": 50, "dual_bound": 2.0, "total_time": 0.021747, "solving_time": 0.008243, "reading_time": 0.00417, "presolving_time": 8.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000050.log"} 52 | {"reformulation_constraints": ["edge_1_1", "use_2", "use_1", "node_2"], "iteration_idx": 51, "dual_bound": 2.0, "total_time": 0.017239, "solving_time": 0.0072569999999999996, "reading_time": 0.000852, "presolving_time": 6.5e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000051.log"} 53 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1", "node_2"], "iteration_idx": 52, "dual_bound": 2.0, "total_time": 0.023979999999999998, "solving_time": 0.010452999999999999, "reading_time": 0.00363, "presolving_time": 6.9e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000052.log"} 54 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2", "node_1"], "iteration_idx": 53, "dual_bound": 2.0, "total_time": 0.023056, "solving_time": 0.009241, "reading_time": 0.003499, "presolving_time": 8.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000053.log"} 55 | {"reformulation_constraints": ["edge_2_1", "use_2", "node_1", "use_1"], "iteration_idx": 54, "dual_bound": 2.0, "total_time": 0.014641, "solving_time": 0.007052999999999999, "reading_time": 0.000832, "presolving_time": 6.1e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000054.log"} 56 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2", "use_1"], "iteration_idx": 55, "dual_bound": 2.0, "total_time": 0.015733999999999998, "solving_time": 0.008143, "reading_time": 0.000741, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000055.log"} 57 | {"reformulation_constraints": ["node_1", "use_2", "use_1", "node_2"], "iteration_idx": 56, "dual_bound": 1.0, "total_time": 0.031469, "solving_time": 0.019773, "reading_time": 0.003816, "presolving_time": 9.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000056.log"} 58 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_1", "node_1", "edge_1_1"], "iteration_idx": 57, "dual_bound": 2.0, "total_time": 0.021137, "solving_time": 0.007742, "reading_time": 0.003632, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000057.log"} 59 | {"reformulation_constraints": ["node_2", "use_2", "edge_2_1", "edge_1_1", "node_1"], "iteration_idx": 58, "dual_bound": 2.0, "total_time": 0.02255, "solving_time": 0.008324999999999999, "reading_time": 0.002889, "presolving_time": 0.00037999999999999997, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000058.log"} 60 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "use_2", "edge_2_1"], "iteration_idx": 59, "dual_bound": 2.0, "total_time": 0.019013, "solving_time": 0.011143, "reading_time": 0.000825, "presolving_time": 7.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000059.log"} 61 | {"reformulation_constraints": ["node_2", "use_2", "edge_2_1", "use_1", "edge_1_1"], "iteration_idx": 60, "dual_bound": 2.0, "total_time": 0.023968999999999997, "solving_time": 0.01014, "reading_time": 0.002868, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000060.log"} 62 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "node_2", "use_2"], "iteration_idx": 61, "dual_bound": 2.0, "total_time": 0.021995, "solving_time": 0.008388999999999999, "reading_time": 0.003629, "presolving_time": 7.999999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000061.log"} 63 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_1", "use_2", "node_1"], "iteration_idx": 62, "dual_bound": 2.0, "total_time": 0.021611, "solving_time": 0.007640999999999999, "reading_time": 0.00349, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000062.log"} 64 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2", "use_1", "edge_1_1", "node_1"], "iteration_idx": 63, "dual_bound": 2.0, "total_time": 0.011642, "solving_time": 0.003441, "reading_time": 0.0007859999999999999, "presolving_time": 6.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040212_idx_000063.log"} 65 | -------------------------------------------------------------------------------- /examples/alldecomps/results/coloring3.lp/result_coloring3.lp_2022-02-05T040231.jsonl: -------------------------------------------------------------------------------- 1 | {"reformulation_constraints": [], "iteration_idx": 0, "dual_bound": 2.0, "total_time": 0.014329999999999999, "solving_time": 0.005408, "reading_time": 0.001168, "presolving_time": 8.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000000.log"} 2 | {"reformulation_constraints": ["edge_1_1"], "iteration_idx": 1, "dual_bound": 0.6666666666666666, "total_time": 0.039071999999999996, "solving_time": 0.022973999999999998, "reading_time": 0.005397, "presolving_time": 8.999999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000001.log"} 3 | {"reformulation_constraints": ["edge_2_1"], "iteration_idx": 2, "dual_bound": 0.6666666666666666, "total_time": 0.029141, "solving_time": 0.020624, "reading_time": 0.000768, "presolving_time": 9.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000002.log"} 4 | {"reformulation_constraints": ["node_1"], "iteration_idx": 3, "dual_bound": 0.6666666666666666, "total_time": 0.035599, "solving_time": 0.021353, "reading_time": 0.005247, "presolving_time": 8.4e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000003.log"} 5 | {"reformulation_constraints": ["node_2"], "iteration_idx": 4, "dual_bound": 0.6666666666666666, "total_time": 0.035869, "solving_time": 0.020101, "reading_time": 0.005428, "presolving_time": 9.4e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000004.log"} 6 | {"reformulation_constraints": ["use_1"], "iteration_idx": 5, "dual_bound": 0.8333333333333333, "total_time": 0.029956999999999998, "solving_time": 0.017287, "reading_time": 0.005164, "presolving_time": 7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000005.log"} 7 | {"reformulation_constraints": ["use_2"], "iteration_idx": 6, "dual_bound": 0.8333333333333333, "total_time": 0.029082, "solving_time": 0.016309, "reading_time": 0.005199, "presolving_time": 7.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000006.log"} 8 | {"reformulation_constraints": ["edge_1_1", "edge_2_1"], "iteration_idx": 7, "dual_bound": 0.6666666666666666, "total_time": 0.028238, "solving_time": 0.021466, "reading_time": 0.000707, "presolving_time": 7.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000007.log"} 9 | {"reformulation_constraints": ["edge_1_1", "node_1"], "iteration_idx": 8, "dual_bound": 0.6666666666666666, "total_time": 0.034435, "solving_time": 0.020291, "reading_time": 0.005385, "presolving_time": 8.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000008.log"} 10 | {"reformulation_constraints": ["edge_1_1", "node_2"], "iteration_idx": 9, "dual_bound": 0.6666666666666666, "total_time": 0.033625999999999996, "solving_time": 0.01959, "reading_time": 0.005417, "presolving_time": 7.7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000009.log"} 11 | {"reformulation_constraints": ["edge_1_1", "use_1"], "iteration_idx": 10, "dual_bound": 2.0, "total_time": 0.018087, "solving_time": 0.007502999999999999, "reading_time": 0.003596, "presolving_time": 8.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000010.log"} 12 | {"reformulation_constraints": ["edge_1_1", "use_2"], "iteration_idx": 11, "dual_bound": 0.8333333333333333, "total_time": 0.039997, "solving_time": 0.025894, "reading_time": 0.005212, "presolving_time": 7e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000011.log"} 13 | {"reformulation_constraints": ["edge_2_1", "node_1"], "iteration_idx": 12, "dual_bound": 0.6666666666666666, "total_time": 0.031581, "solving_time": 0.019872, "reading_time": 0.003942, "presolving_time": 8.999999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000012.log"} 14 | {"reformulation_constraints": ["edge_2_1", "node_2"], "iteration_idx": 13, "dual_bound": 0.6666666666666666, "total_time": 0.033669, "solving_time": 0.019603, "reading_time": 0.005313, "presolving_time": 6.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000013.log"} 15 | {"reformulation_constraints": ["edge_2_1", "use_1"], "iteration_idx": 14, "dual_bound": 0.8333333333333333, "total_time": 0.038602, "solving_time": 0.024298, "reading_time": 0.005756, "presolving_time": 8.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000014.log"} 16 | {"reformulation_constraints": ["edge_2_1", "use_2"], "iteration_idx": 15, "dual_bound": 2.0, "total_time": 0.024512, "solving_time": 0.0077789999999999995, "reading_time": 0.005748, "presolving_time": 9.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000015.log"} 17 | {"reformulation_constraints": ["node_1", "node_2"], "iteration_idx": 16, "dual_bound": 0.6666666666666666, "total_time": 0.035216, "solving_time": 0.019721, "reading_time": 0.005364, "presolving_time": 6.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000016.log"} 18 | {"reformulation_constraints": ["node_1", "use_1"], "iteration_idx": 17, "dual_bound": 0.8333333333333333, "total_time": 0.036909, "solving_time": 0.021818999999999998, "reading_time": 0.005924, "presolving_time": 7.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000017.log"} 19 | {"reformulation_constraints": ["node_1", "use_2"], "iteration_idx": 18, "dual_bound": 0.8333333333333333, "total_time": 0.035149, "solving_time": 0.02189, "reading_time": 0.006111, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000018.log"} 20 | {"reformulation_constraints": ["node_2", "use_1"], "iteration_idx": 19, "dual_bound": 0.8333333333333333, "total_time": 0.035821, "solving_time": 0.020737, "reading_time": 0.005313, "presolving_time": 7.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000019.log"} 21 | {"reformulation_constraints": ["node_2", "use_2"], "iteration_idx": 20, "dual_bound": 0.8333333333333333, "total_time": 0.039508999999999996, "solving_time": 0.023087, "reading_time": 0.005377, "presolving_time": 7.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000020.log"} 22 | {"reformulation_constraints": ["use_1", "use_2"], "iteration_idx": 21, "dual_bound": 1.0, "total_time": 0.032616, "solving_time": 0.016659999999999998, "reading_time": 0.00549, "presolving_time": 8.8e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000021.log"} 23 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_1"], "iteration_idx": 22, "dual_bound": 0.6666666666666666, "total_time": 0.034401, "solving_time": 0.019326, "reading_time": 0.004273, "presolving_time": 7.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000022.log"} 24 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_2"], "iteration_idx": 23, "dual_bound": 0.6666666666666666, "total_time": 0.034589, "solving_time": 0.021151, "reading_time": 0.005841, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000023.log"} 25 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "use_1"], "iteration_idx": 24, "dual_bound": 2.0, "total_time": 0.042145999999999996, "solving_time": 0.026213999999999998, "reading_time": 0.005795, "presolving_time": 7.099999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000024.log"} 26 | {"reformulation_constraints": ["edge_1_1", "use_2", "edge_2_1"], "iteration_idx": 25, "dual_bound": 2.0, "total_time": 0.049256, "solving_time": 0.033319999999999995, "reading_time": 0.005436, "presolving_time": 8.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000025.log"} 27 | {"reformulation_constraints": ["edge_1_1", "node_1", "node_2"], "iteration_idx": 26, "dual_bound": 0.6666666666666666, "total_time": 0.041775, "solving_time": 0.023771, "reading_time": 0.00585, "presolving_time": 7.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000026.log"} 28 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1"], "iteration_idx": 27, "dual_bound": 2.0, "total_time": 0.026067, "solving_time": 0.009635, "reading_time": 0.005476, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000027.log"} 29 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_2"], "iteration_idx": 28, "dual_bound": 0.8333333333333333, "total_time": 0.037121, "solving_time": 0.02188, "reading_time": 0.005998, "presolving_time": 7.599999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000028.log"} 30 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_1"], "iteration_idx": 29, "dual_bound": 2.0, "total_time": 0.022978, "solving_time": 0.010289, "reading_time": 0.0009639999999999999, "presolving_time": 0.00041999999999999996, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000029.log"} 31 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_2"], "iteration_idx": 30, "dual_bound": 0.8333333333333333, "total_time": 0.036628, "solving_time": 0.022656, "reading_time": 0.005595, "presolving_time": 6.9e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000030.log"} 32 | {"reformulation_constraints": ["edge_1_1", "use_2", "use_1"], "iteration_idx": 31, "dual_bound": 2.0, "total_time": 0.020767, "solving_time": 0.008785, "reading_time": 0.000995, "presolving_time": 7.5e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000031.log"} 33 | {"reformulation_constraints": ["edge_2_1", "node_2", "node_1"], "iteration_idx": 32, "dual_bound": 0.6666666666666666, "total_time": 0.033555, "solving_time": 0.019093, "reading_time": 0.0055, "presolving_time": 7.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000032.log"} 34 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1"], "iteration_idx": 33, "dual_bound": 0.8333333333333333, "total_time": 0.037809999999999996, "solving_time": 0.021759999999999998, "reading_time": 0.005651, "presolving_time": 9.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000033.log"} 35 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_2"], "iteration_idx": 34, "dual_bound": 2.0, "total_time": 0.026725, "solving_time": 0.010116, "reading_time": 0.005836999999999999, "presolving_time": 7.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000034.log"} 36 | {"reformulation_constraints": ["edge_2_1", "use_1", "node_2"], "iteration_idx": 35, "dual_bound": 0.8333333333333333, "total_time": 0.037481, "solving_time": 0.020117, "reading_time": 0.005757, "presolving_time": 7.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000035.log"} 37 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_2"], "iteration_idx": 36, "dual_bound": 2.0, "total_time": 0.024495, "solving_time": 0.009330999999999999, "reading_time": 0.006127, "presolving_time": 7.9e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000036.log"} 38 | {"reformulation_constraints": ["edge_2_1", "use_2", "use_1"], "iteration_idx": 37, "dual_bound": 2.0, "total_time": 0.022344, "solving_time": 0.008612999999999999, "reading_time": 0.005495, "presolving_time": 7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000037.log"} 39 | {"reformulation_constraints": ["node_1", "use_1", "node_2"], "iteration_idx": 38, "dual_bound": 0.8333333333333333, "total_time": 0.035588999999999996, "solving_time": 0.021766999999999998, "reading_time": 0.005385, "presolving_time": 8.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000038.log"} 40 | {"reformulation_constraints": ["node_1", "node_2", "use_2"], "iteration_idx": 39, "dual_bound": 0.8333333333333333, "total_time": 0.03277, "solving_time": 0.022786, "reading_time": 0.001292, "presolving_time": 8.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000039.log"} 41 | {"reformulation_constraints": ["node_1", "use_1", "use_2"], "iteration_idx": 40, "dual_bound": 1.0, "total_time": 0.035669, "solving_time": 0.020592, "reading_time": 0.005425999999999999, "presolving_time": 7.099999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000040.log"} 42 | {"reformulation_constraints": ["node_2", "use_1", "use_2"], "iteration_idx": 41, "dual_bound": 1.0, "total_time": 0.027141, "solving_time": 0.019192999999999998, "reading_time": 0.000701, "presolving_time": 8.499999999999999e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000041.log"} 43 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "node_2", "node_1"], "iteration_idx": 42, "dual_bound": 0.6666666666666666, "total_time": 0.027162, "solving_time": 0.019466999999999998, "reading_time": 0.0008259999999999999, "presolving_time": 7.2e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000042.log"} 44 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "edge_2_1"], "iteration_idx": 43, "dual_bound": 2.0, "total_time": 0.023171999999999998, "solving_time": 0.0103, "reading_time": 0.004595, "presolving_time": 7.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000043.log"} 45 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "use_2", "node_1"], "iteration_idx": 44, "dual_bound": 2.0, "total_time": 0.020097999999999998, "solving_time": 0.009065, "reading_time": 0.00079, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000044.log"} 46 | {"reformulation_constraints": ["edge_1_1", "use_1", "edge_2_1", "node_2"], "iteration_idx": 45, "dual_bound": 2.0, "total_time": 0.031620999999999996, "solving_time": 0.015182, "reading_time": 0.005438, "presolving_time": 0.000106, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000045.log"} 47 | {"reformulation_constraints": ["edge_1_1", "node_2", "edge_2_1", "use_2"], "iteration_idx": 46, "dual_bound": 2.0, "total_time": 0.020458999999999998, "solving_time": 0.010256, "reading_time": 0.001042, "presolving_time": 6.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000046.log"} 48 | {"reformulation_constraints": ["edge_1_1", "edge_2_1", "use_1", "use_2"], "iteration_idx": 47, "dual_bound": 2.0, "total_time": 0.019582, "solving_time": 0.010404, "reading_time": 0.001052, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000047.log"} 49 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "node_2"], "iteration_idx": 48, "dual_bound": 2.0, "total_time": 0.031567, "solving_time": 0.012721, "reading_time": 0.005741, "presolving_time": 9.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000048.log"} 50 | {"reformulation_constraints": ["edge_1_1", "node_2", "use_2", "node_1"], "iteration_idx": 49, "dual_bound": 2.0, "total_time": 0.0208, "solving_time": 0.011321, "reading_time": 0.001, "presolving_time": 0.00043299999999999995, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000049.log"} 51 | {"reformulation_constraints": ["edge_1_1", "node_1", "use_1", "use_2"], "iteration_idx": 50, "dual_bound": 2.0, "total_time": 0.016364999999999998, "solving_time": 0.008478, "reading_time": 0.000759, "presolving_time": 6.8e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000050.log"} 52 | {"reformulation_constraints": ["edge_1_1", "use_1", "node_2", "use_2"], "iteration_idx": 51, "dual_bound": 2.0, "total_time": 0.016485, "solving_time": 0.007427, "reading_time": 0.0008169999999999999, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000051.log"} 53 | {"reformulation_constraints": ["edge_2_1", "node_1", "use_1", "node_2"], "iteration_idx": 52, "dual_bound": 2.0, "total_time": 0.025956999999999997, "solving_time": 0.0112, "reading_time": 0.00598, "presolving_time": 6.5e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000052.log"} 54 | {"reformulation_constraints": ["edge_2_1", "node_1", "node_2", "use_2"], "iteration_idx": 53, "dual_bound": 2.0, "total_time": 0.023507, "solving_time": 0.009670999999999999, "reading_time": 0.0055, "presolving_time": 0.000453, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000053.log"} 55 | {"reformulation_constraints": ["edge_2_1", "use_2", "use_1", "node_1"], "iteration_idx": 54, "dual_bound": 2.0, "total_time": 0.018217999999999998, "solving_time": 0.008649, "reading_time": 0.000977, "presolving_time": 7.3e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000054.log"} 56 | {"reformulation_constraints": ["edge_2_1", "use_1", "node_2", "use_2"], "iteration_idx": 55, "dual_bound": 2.0, "total_time": 0.02028, "solving_time": 0.007133, "reading_time": 0.004765999999999999, "presolving_time": 8.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000055.log"} 57 | {"reformulation_constraints": ["node_1", "use_2", "node_2", "use_1"], "iteration_idx": 56, "dual_bound": 1.0, "total_time": 0.031605999999999995, "solving_time": 0.018668999999999998, "reading_time": 0.005046, "presolving_time": 8.3e-05, "status": "nodelimit", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000056.log"} 58 | {"reformulation_constraints": ["edge_2_1", "node_2", "use_1", "edge_1_1", "node_1"], "iteration_idx": 57, "dual_bound": 2.0, "total_time": 0.017821999999999998, "solving_time": 0.009191, "reading_time": 0.000754, "presolving_time": 6.599999999999999e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000057.log"} 59 | {"reformulation_constraints": ["edge_2_1", "node_1", "node_2", "use_2", "edge_1_1"], "iteration_idx": 58, "dual_bound": 2.0, "total_time": 0.021348, "solving_time": 0.008246999999999999, "reading_time": 0.000985, "presolving_time": 6.9e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000058.log"} 60 | {"reformulation_constraints": ["edge_2_1", "use_2", "use_1", "edge_1_1", "node_1"], "iteration_idx": 59, "dual_bound": 2.0, "total_time": 0.024718999999999998, "solving_time": 0.009982999999999999, "reading_time": 0.004986, "presolving_time": 8.4e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000059.log"} 61 | {"reformulation_constraints": ["edge_1_1", "use_1", "use_2", "edge_2_1", "node_2"], "iteration_idx": 60, "dual_bound": 2.0, "total_time": 0.024533, "solving_time": 0.009923, "reading_time": 0.006298, "presolving_time": 7.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000060.log"} 62 | {"reformulation_constraints": ["use_1", "node_2", "node_1", "use_2", "edge_1_1"], "iteration_idx": 61, "dual_bound": 2.0, "total_time": 0.018664999999999998, "solving_time": 0.009245999999999999, "reading_time": 0.001031, "presolving_time": 7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000061.log"} 63 | {"reformulation_constraints": ["use_1", "edge_2_1", "node_2", "use_2", "node_1"], "iteration_idx": 62, "dual_bound": 2.0, "total_time": 0.015649, "solving_time": 0.008241, "reading_time": 0.0006879999999999999, "presolving_time": 6.7e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000062.log"} 64 | {"reformulation_constraints": ["node_2", "edge_2_1", "use_2", "use_1", "node_1", "edge_1_1"], "iteration_idx": 63, "dual_bound": 2.0, "total_time": 0.013333, "solving_time": 0.003041, "reading_time": 0.002196, "presolving_time": 7.2e-05, "status": "optimal", "log_filename": "/home/lentz/pygcgopt-dev/PyGCGOpt/examples/alldecomps/results/coloring3.lp/log/log_coloring3.lp_2022-02-05T040231_idx_000063.log"} 65 | -------------------------------------------------------------------------------- /examples/cpmp/instances/p550-01.json: -------------------------------------------------------------------------------- 1 | {"n": 50, "p": 5, "d": {"0": {"0": 0, "1": 86, "2": 42, "3": 67, "4": 54, "5": 76, "6": 78, "7": 107, "8": 100, "9": 57, "10": 42, "11": 93, "12": 44, "13": 21, "14": 25, "15": 35, "16": 56, "17": 16, "18": 60, "19": 101, "20": 10, "21": 54, "22": 58, "23": 72, "24": 82, "25": 60, "26": 58, "27": 72, "28": 43, "29": 67, "30": 70, "31": 15, "32": 36, "33": 61, "34": 102, "35": 14, "36": 69, "37": 64, "38": 23, "39": 83, "40": 19, "41": 52, "42": 94, "43": 10, "44": 62, "45": 50, "46": 69, "47": 53, "48": 52, "49": 4}, "1": {"0": 86, "1": 0, "2": 76, "3": 23, "4": 47, "5": 18, "6": 60, "7": 23, "8": 16, "9": 51, "10": 70, "11": 7, "12": 62, "13": 97, "14": 63, "15": 75, "16": 51, "17": 70, "18": 37, "19": 19, "20": 75, "21": 49, "22": 74, "23": 27, "24": 32, "25": 71, "26": 28, "27": 30, "28": 47, "29": 43, "30": 42, "31": 86, "32": 72, "33": 80, "34": 16, "35": 77, "36": 21, "37": 46, "38": 63, "39": 6, "40": 94, "41": 81, "42": 15, "43": 78, "44": 62, "45": 87, "46": 47, "47": 72, "48": 42, "49": 85}, "2": {"0": 42, "1": 76, "2": 0, "3": 68, "4": 71, "5": 60, "6": 41, "7": 100, "8": 93, "9": 28, "10": 6, "11": 81, "12": 14, "13": 34, "14": 48, "15": 68, "16": 27, "17": 43, "18": 70, "19": 95, "20": 40, "21": 72, "22": 16, "23": 77, "24": 57, "25": 89, "26": 57, "27": 79, "28": 56, "29": 39, "30": 83, "31": 29, "32": 68, "33": 93, "34": 89, "35": 50, "36": 69, "37": 35, "38": 40, "39": 77, "40": 32, "41": 10, "42": 77, "43": 33, "44": 24, "45": 12, "46": 86, "47": 83, "48": 34, "49": 46}, "3": {"0": 67, "1": 23, "2": 68, "3": 0, "4": 24, "5": 27, "6": 65, "7": 40, "8": 34, "9": 49, "10": 61, "11": 30, "12": 54, "13": 81, "14": 42, "15": 52, "16": 49, "17": 50, "18": 14, "19": 34, "20": 56, "21": 26, "22": 71, "23": 10, "24": 43, "25": 49, "26": 10, "27": 13, "28": 25, "29": 45, "30": 22, "31": 70, "32": 49, "33": 58, "34": 39, "35": 56, "36": 2, "37": 46, "38": 44, "39": 18, "40": 78, "41": 75, "42": 36, "43": 60, "44": 61, "45": 80, "46": 28, "47": 50, "48": 36, "49": 66}, "4": {"0": 54, "1": 47, "2": 71, "3": 24, "4": 0, "5": 50, "6": 80, "7": 61, "8": 56, "9": 60, "10": 65, "11": 54, "12": 60, "13": 72, "14": 29, "15": 29, "16": 60, "17": 38, "18": 10, "19": 54, "20": 44, "21": 2, "22": 79, "23": 22, "24": 64, "25": 25, "26": 25, "27": 21, "28": 15, "29": 61, "30": 15, "31": 62, "32": 26, "33": 34, "34": 63, "35": 41, "36": 26, "37": 61, "38": 34, "39": 42, "40": 70, "41": 80, "42": 61, "43": 51, "44": 72, "45": 83, "46": 15, "47": 25, "48": 46, "49": 52}, "5": {"0": 76, "1": 18, "2": 60, "3": 27, "4": 50, "5": 0, "6": 42, "7": 41, "8": 34, "9": 33, "10": 53, "11": 21, "12": 45, "13": 84, "14": 57, "15": 72, "16": 34, "17": 62, "18": 41, "19": 37, "20": 66, "21": 52, "22": 56, "23": 36, "24": 16, "25": 76, "26": 25, "27": 40, "28": 44, "29": 25, "30": 50, "31": 73, "32": 70, "33": 84, "34": 29, "35": 70, "36": 27, "37": 27, "38": 54, "39": 22, "40": 81, "41": 64, "42": 18, "43": 67, "44": 44, "45": 70, "46": 55, "47": 75, "48": 27, "49": 76}, "6": {"0": 78, "1": 60, "2": 41, "3": 65, "4": 80, "5": 42, "6": 0, "7": 80, "8": 74, "9": 22, "10": 38, "11": 61, "12": 34, "13": 75, "14": 71, "15": 92, "16": 23, "17": 72, "18": 75, "19": 78, "20": 72, "21": 82, "22": 27, "23": 75, "24": 28, "25": 105, "26": 57, "27": 78, "28": 68, "29": 19, "30": 86, "31": 67, "32": 90, "33": 111, "34": 65, "35": 80, "36": 65, "37": 19, "38": 65, "39": 64, "40": 73, "41": 37, "42": 53, "43": 68, "44": 17, "45": 44, "46": 91, "47": 101, "48": 34, "49": 80}, "7": {"0": 107, "1": 23, "2": 100, "3": 40, "4": 61, "5": 41, "6": 80, "7": 0, "8": 7, "9": 74, "10": 93, "11": 19, "12": 86, "13": 119, "14": 83, "15": 91, "16": 75, "17": 91, "18": 52, "19": 7, "20": 96, "21": 63, "22": 97, "23": 39, "24": 51, "25": 82, "26": 49, "27": 41, "28": 66, "29": 65, "30": 51, "31": 108, "32": 88, "33": 91, "34": 16, "35": 97, "36": 38, "37": 68, "38": 84, "39": 24, "40": 117, "41": 105, "42": 28, "43": 100, "44": 85, "45": 110, "46": 56, "47": 85, "48": 66, "49": 106}, "8": {"0": 100, "1": 16, "2": 93, "3": 34, "4": 56, "5": 34, "6": 74, "7": 7, "8": 0, "9": 67, "10": 86, "11": 13, "12": 79, "13": 112, "14": 76, "15": 85, "16": 68, "17": 84, "18": 46, "19": 4, "20": 90, "21": 58, "22": 91, "23": 34, "24": 46, "25": 77, "26": 42, "27": 36, "28": 59, "29": 59, "30": 46, "31": 101, "32": 82, "33": 86, "34": 13, "35": 90, "36": 31, "37": 62, "38": 77, "39": 17, "40": 110, "41": 98, "42": 23, "43": 93, "44": 78, "45": 104, "46": 51, "47": 80, "48": 59, "49": 99}, "9": {"0": 57, "1": 51, "2": 28, "3": 49, "4": 60, "5": 33, "6": 22, "7": 74, "8": 67, "9": 0, "10": 22, "11": 55, "12": 15, "13": 58, "14": 49, "15": 70, "16": 1, "17": 50, "18": 56, "19": 70, "20": 50, "21": 62, "22": 23, "23": 59, "24": 29, "25": 84, "26": 39, "27": 62, "28": 47, "29": 11, "30": 68, "31": 49, "32": 68, "33": 90, "34": 62, "35": 58, "36": 50, "37": 7, "38": 43, "39": 53, "40": 55, "41": 30, "42": 50, "43": 47, "44": 12, "45": 36, "46": 73, "47": 80, "48": 13, "49": 59}, "10": {"0": 42, "1": 70, "2": 6, "3": 61, "4": 65, "5": 53, "6": 38, "7": 93, "8": 86, "9": 22, "10": 0, "11": 75, "12": 7, "13": 37, "14": 43, "15": 64, "16": 21, "17": 40, "18": 64, "19": 89, "20": 38, "21": 66, "22": 16, "23": 70, "24": 51, "25": 84, "26": 50, "27": 73, "28": 50, "29": 33, "30": 77, "31": 29, "32": 64, "33": 88, "34": 82, "35": 47, "36": 63, "37": 29, "38": 36, "39": 70, "40": 35, "41": 15, "42": 71, "43": 32, "44": 21, "45": 18, "46": 80, "47": 78, "48": 27, "49": 44}, "11": {"0": 93, "1": 7, "2": 81, "3": 30, "4": 54, "5": 21, "6": 61, "7": 19, "8": 13, "9": 55, "10": 75, "11": 0, "12": 67, "13": 103, "14": 70, "15": 82, "16": 56, "17": 77, "18": 44, "19": 17, "20": 82, "21": 56, "22": 78, "23": 33, "24": 33, "25": 78, "26": 35, "27": 36, "28": 54, "29": 46, "30": 47, "31": 92, "32": 79, "33": 87, "34": 9, "35": 84, "36": 28, "37": 49, "38": 70, "39": 12, "40": 100, "41": 86, "42": 11, "43": 85, "44": 65, "45": 92, "46": 53, "47": 79, "48": 48, "49": 92}, "12": {"0": 44, "1": 62, "2": 14, "3": 54, "4": 60, "5": 45, "6": 34, "7": 86, "8": 79, "9": 15, "10": 7, "11": 67, "12": 0, "13": 42, "14": 41, "15": 62, "16": 14, "17": 39, "18": 58, "19": 81, "20": 38, "21": 61, "22": 19, "23": 63, "24": 44, "25": 80, "26": 43, "27": 66, "28": 45, "29": 26, "30": 71, "31": 34, "32": 61, "33": 85, "34": 74, "35": 47, "36": 56, "37": 23, "38": 34, "39": 63, "40": 40, "41": 21, "42": 63, "43": 34, "44": 17, "45": 25, "46": 74, "47": 75, "48": 19, "49": 46}, "13": {"0": 21, "1": 97, "2": 34, "3": 81, "4": 72, "5": 84, "6": 75, "7": 119, "8": 112, "9": 58, "10": 37, "11": 103, "12": 42, "13": 0, "14": 43, "15": 56, "16": 57, "17": 35, "18": 76, "19": 114, "20": 28, "21": 73, "22": 50, "23": 87, "24": 86, "25": 81, "26": 71, "27": 89, "28": 59, "29": 68, "30": 88, "31": 11, "32": 57, "33": 82, "34": 112, "35": 35, "36": 83, "37": 65, "38": 38, "39": 95, "40": 2, "41": 41, "42": 102, "43": 21, "44": 58, "45": 37, "46": 88, "47": 74, "48": 57, "49": 25}, "14": {"0": 25, "1": 63, "2": 48, "3": 42, "4": 29, "5": 57, "6": 71, "7": 83, "8": 76, "9": 49, "10": 43, "11": 70, "12": 41, "13": 43, "14": 0, "15": 21, "16": 48, "17": 8, "18": 34, "19": 76, "20": 15, "21": 29, "22": 60, "23": 46, "24": 66, "25": 41, "26": 35, "27": 47, "28": 17, "29": 55, "30": 44, "31": 33, "32": 20, "33": 44, "34": 79, "35": 13, "36": 45, "37": 53, "38": 7, "39": 60, "40": 40, "41": 58, "42": 73, "43": 22, "44": 57, "45": 59, "46": 45, "47": 35, "48": 38, "49": 23}, "15": {"0": 35, "1": 75, "2": 68, "3": 52, "4": 29, "5": 72, "6": 92, "7": 91, "8": 85, "9": 70, "10": 64, "11": 82, "12": 62, "13": 56, "14": 21, "15": 0, "16": 69, "17": 24, "18": 39, "19": 84, "20": 29, "21": 28, "22": 81, "23": 51, "24": 84, "25": 25, "26": 48, "27": 50, "28": 28, "29": 75, "30": 43, "31": 48, "32": 3, "33": 26, "34": 91, "35": 21, "36": 54, "37": 74, "38": 28, "39": 70, "40": 54, "41": 78, "42": 87, "43": 37, "44": 79, "45": 78, "46": 41, "47": 18, "48": 58, "49": 31}, "16": {"0": 56, "1": 51, "2": 27, "3": 49, "4": 60, "5": 34, "6": 23, "7": 75, "8": 68, "9": 1, "10": 21, "11": 56, "12": 14, "13": 57, "14": 48, "15": 69, "16": 0, "17": 49, "18": 56, "19": 71, "20": 49, "21": 62, "22": 23, "23": 59, "24": 30, "25": 83, "26": 39, "27": 62, "28": 47, "29": 12, "30": 68, "31": 48, "32": 67, "33": 89, "34": 62, "35": 57, "36": 50, "37": 8, "38": 42, "39": 53, "40": 54, "41": 30, "42": 50, "43": 46, "44": 12, "45": 36, "46": 72, "47": 79, "48": 13, "49": 58}, "17": {"0": 16, "1": 70, "2": 43, "3": 50, "4": 38, "5": 62, "6": 72, "7": 91, "8": 84, "9": 50, "10": 40, "11": 77, "12": 39, "13": 35, "14": 8, "15": 24, "16": 49, "17": 0, "18": 43, "19": 84, "20": 6, "21": 38, "22": 57, "23": 55, "24": 70, "25": 48, "26": 42, "27": 55, "28": 26, "29": 57, "30": 53, "31": 25, "32": 24, "33": 50, "34": 86, "35": 8, "36": 53, "37": 55, "38": 8, "39": 67, "40": 32, "41": 54, "42": 79, "43": 14, "44": 57, "45": 54, "46": 53, "47": 41, "48": 41, "49": 15}, "18": {"0": 60, "1": 37, "2": 70, "3": 14, "4": 10, "5": 41, "6": 75, "7": 52, "8": 46, "9": 56, "10": 64, "11": 44, "12": 58, "13": 76, "14": 34, "15": 39, "16": 56, "17": 43, "18": 0, "19": 45, "20": 49, "21": 12, "22": 76, "23": 13, "24": 56, "25": 34, "26": 18, "27": 12, "28": 17, "29": 55, "30": 13, "31": 65, "32": 35, "33": 43, "34": 53, "35": 47, "36": 16, "37": 55, "38": 38, "39": 32, "40": 74, "41": 79, "42": 51, "43": 55, "44": 68, "45": 82, "46": 16, "47": 35, "48": 42, "49": 58}, "19": {"0": 101, "1": 19, "2": 95, "3": 34, "4": 54, "5": 37, "6": 78, "7": 7, "8": 4, "9": 70, "10": 89, "11": 17, "12": 81, "13": 114, "14": 76, "15": 84, "16": 71, "17": 84, "18": 45, "19": 0, "20": 90, "21": 56, "22": 94, "23": 32, "24": 50, "25": 75, "26": 42, "27": 34, "28": 59, "29": 62, "30": 44, "31": 102, "32": 81, "33": 84, "34": 17, "35": 90, "36": 31, "37": 65, "38": 77, "39": 18, "40": 111, "41": 101, "42": 27, "43": 94, "44": 81, "45": 106, "46": 49, "47": 78, "48": 61, "49": 99}, "20": {"0": 10, "1": 75, "2": 40, "3": 56, "4": 44, "5": 66, "6": 72, "7": 96, "8": 90, "9": 50, "10": 38, "11": 82, "12": 38, "13": 28, "14": 15, "15": 29, "16": 49, "17": 6, "18": 49, "19": 90, "20": 0, "21": 44, "22": 55, "23": 61, "24": 73, "25": 54, "26": 47, "27": 62, "28": 32, "29": 59, "30": 60, "31": 19, "32": 30, "33": 55, "34": 91, "35": 9, "36": 58, "37": 56, "38": 12, "39": 72, "40": 25, "41": 50, "42": 83, "43": 8, "44": 56, "45": 50, "46": 60, "47": 47, "48": 43, "49": 10}, "21": {"0": 54, "1": 49, "2": 72, "3": 26, "4": 2, "5": 52, "6": 82, "7": 63, "8": 58, "9": 62, "10": 66, "11": 56, "12": 61, "13": 73, "14": 29, "15": 28, "16": 62, "17": 38, "18": 12, "19": 56, "20": 44, "21": 0, "22": 80, "23": 24, "24": 67, "25": 23, "26": 27, "27": 22, "28": 16, "29": 63, "30": 16, "31": 62, "32": 25, "33": 31, "34": 65, "35": 40, "36": 28, "37": 63, "38": 35, "39": 44, "40": 70, "41": 81, "42": 63, "43": 51, "44": 73, "45": 84, "46": 15, "47": 23, "48": 48, "49": 51}, "22": {"0": 58, "1": 74, "2": 16, "3": 71, "4": 79, "5": 56, "6": 27, "7": 97, "8": 91, "9": 23, "10": 16, "11": 78, "12": 19, "13": 50, "14": 60, "15": 81, "16": 23, "17": 57, "18": 76, "19": 94, "20": 55, "21": 80, "22": 0, "23": 81, "24": 49, "25": 99, "26": 61, "27": 84, "28": 64, "29": 32, "30": 89, "31": 45, "32": 80, "33": 104, "34": 84, "35": 64, "36": 72, "37": 29, "38": 52, "39": 76, "40": 48, "41": 10, "42": 72, "43": 49, "44": 13, "45": 17, "46": 92, "47": 94, "48": 35, "49": 61}, "23": {"0": 72, "1": 27, "2": 77, "3": 10, "4": 22, "5": 36, "6": 75, "7": 39, "8": 34, "9": 59, "10": 70, "11": 33, "12": 63, "13": 87, "14": 46, "15": 51, "16": 59, "17": 55, "18": 13, "19": 32, "20": 61, "21": 24, "22": 81, "23": 0, "24": 52, "25": 44, "26": 20, "27": 3, "28": 29, "29": 55, "30": 14, "31": 76, "32": 48, "33": 53, "34": 41, "35": 60, "36": 9, "37": 57, "38": 49, "39": 21, "40": 85, "41": 85, "42": 42, "43": 66, "44": 71, "45": 89, "46": 20, "47": 46, "48": 46, "49": 70}, "24": {"0": 82, "1": 32, "2": 57, "3": 43, "4": 64, "5": 16, "6": 28, "7": 51, "8": 46, "9": 29, "10": 51, "11": 33, "12": 44, "13": 86, "14": 66, "15": 84, "16": 30, "17": 70, "18": 56, "19": 50, "20": 73, "21": 67, "22": 49, "23": 52, "24": 0, "25": 90, "26": 39, "27": 56, "28": 56, "29": 18, "30": 66, "31": 76, "32": 82, "33": 98, "34": 37, "35": 78, "36": 43, "37": 21, "38": 62, "39": 37, "40": 83, "41": 58, "42": 24, "43": 72, "44": 36, "45": 65, "46": 71, "47": 89, "48": 30, "49": 83}, "25": {"0": 60, "1": 71, "2": 89, "3": 49, "4": 25, "5": 76, "6": 105, "7": 82, "8": 77, "9": 84, "10": 84, "11": 78, "12": 80, "13": 81, "14": 41, "15": 25, "16": 83, "17": 48, "18": 34, "19": 75, "20": 54, "21": 23, "22": 99, "23": 44, "24": 90, "25": 0, "26": 51, "27": 41, "28": 36, "29": 86, "30": 31, "31": 73, "32": 24, "33": 9, "34": 86, "35": 46, "36": 51, "37": 86, "38": 49, "39": 65, "40": 79, "41": 99, "42": 86, "43": 62, "44": 95, "45": 100, "46": 26, "47": 7, "48": 70, "49": 57}, "26": {"0": 58, "1": 28, "2": 57, "3": 10, "4": 25, "5": 25, "6": 57, "7": 49, "8": 42, "9": 39, "10": 50, "11": 35, "12": 43, "13": 71, "14": 35, "15": 48, "16": 39, "17": 42, "18": 18, "19": 42, "20": 47, "21": 27, "22": 61, "23": 20, "24": 39, "25": 51, "26": 0, "27": 23, "28": 20, "29": 37, "30": 29, "31": 60, "32": 45, "33": 59, "34": 44, "35": 49, "36": 12, "37": 38, "38": 35, "39": 25, "40": 68, "41": 65, "42": 39, "43": 51, "44": 51, "45": 69, "46": 34, "47": 50, "48": 26, "49": 57}, "27": {"0": 72, "1": 30, "2": 79, "3": 13, "4": 21, "5": 40, "6": 78, "7": 41, "8": 36, "9": 62, "10": 73, "11": 36, "12": 66, "13": 89, "14": 47, "15": 50, "16": 62, "17": 55, "18": 12, "19": 34, "20": 62, "21": 22, "22": 84, "23": 3, "24": 56, "25": 41, "26": 23, "27": 0, "28": 29, "29": 59, "30": 11, "31": 77, "32": 47, "33": 50, "34": 44, "35": 60, "36": 13, "37": 60, "38": 50, "39": 24, "40": 86, "41": 87, "42": 45, "43": 67, "44": 74, "45": 91, "46": 17, "47": 44, "48": 49, "49": 70}, "28": {"0": 43, "1": 47, "2": 56, "3": 25, "4": 15, "5": 44, "6": 68, "7": 66, "8": 59, "9": 47, "10": 50, "11": 54, "12": 45, "13": 59, "14": 17, "15": 28, "16": 47, "17": 26, "18": 17, "19": 59, "20": 32, "21": 16, "22": 64, "23": 29, "24": 56, "25": 36, "26": 20, "27": 29, "28": 0, "29": 50, "30": 28, "31": 48, "32": 25, "33": 43, "34": 63, "35": 31, "36": 27, "37": 49, "38": 21, "39": 43, "40": 56, "41": 65, "42": 59, "43": 38, "44": 58, "45": 68, "46": 30, "47": 33, "48": 34, "49": 41}, "29": {"0": 67, "1": 43, "2": 39, "3": 45, "4": 61, "5": 25, "6": 19, "7": 65, "8": 59, "9": 11, "10": 33, "11": 46, "12": 26, "13": 68, "14": 55, "15": 75, "16": 12, "17": 57, "18": 55, "19": 62, "20": 59, "21": 63, "22": 32, "23": 55, "24": 18, "25": 86, "26": 37, "27": 59, "28": 50, "29": 0, "30": 67, "31": 59, "32": 73, "33": 93, "34": 52, "35": 65, "36": 46, "37": 3, "38": 49, "39": 46, "40": 66, "41": 41, "42": 40, "43": 57, "44": 19, "45": 47, "46": 72, "47": 83, "48": 17, "49": 68}, "30": {"0": 70, "1": 42, "2": 83, "3": 22, "4": 15, "5": 50, "6": 86, "7": 51, "8": 46, "9": 68, "10": 77, "11": 47, "12": 71, "13": 88, "14": 44, "15": 43, "16": 68, "17": 53, "18": 13, "19": 44, "20": 60, "21": 16, "22": 89, "23": 14, "24": 66, "25": 31, "26": 29, "27": 11, "28": 28, "29": 67, "30": 0, "31": 77, "32": 40, "33": 40, "34": 55, "35": 56, "36": 23, "37": 68, "38": 49, "39": 35, "40": 85, "41": 92, "42": 56, "43": 66, "44": 80, "45": 95, "46": 5, "47": 34, "48": 55, "49": 67}, "31": {"0": 15, "1": 86, "2": 29, "3": 70, "4": 62, "5": 73, "6": 67, "7": 108, "8": 101, "9": 49, "10": 29, "11": 92, "12": 34, "13": 11, "14": 33, "15": 48, "16": 48, "17": 25, "18": 65, "19": 102, "20": 19, "21": 62, "22": 45, "23": 76, "24": 76, "25": 73, "26": 60, "27": 77, "28": 48, "29": 59, "30": 77, "31": 0, "32": 49, "33": 74, "34": 101, "35": 27, "36": 72, "37": 56, "38": 27, "39": 84, "40": 8, "41": 38, "42": 91, "43": 11, "44": 50, "45": 35, "46": 78, "47": 66, "48": 46, "49": 19}, "32": {"0": 36, "1": 72, "2": 68, "3": 49, "4": 26, "5": 70, "6": 90, "7": 88, "8": 82, "9": 68, "10": 64, "11": 79, "12": 61, "13": 57, "14": 20, "15": 3, "16": 67, "17": 24, "18": 35, "19": 81, "20": 30, "21": 25, "22": 80, "23": 48, "24": 82, "25": 24, "26": 45, "27": 47, "28": 25, "29": 73, "30": 40, "31": 49, "32": 0, "33": 25, "34": 88, "35": 22, "36": 51, "37": 72, "38": 27, "39": 67, "40": 55, "41": 78, "42": 84, "43": 38, "44": 77, "45": 78, "46": 38, "47": 17, "48": 56, "49": 32}, "33": {"0": 61, "1": 80, "2": 93, "3": 58, "4": 34, "5": 84, "6": 111, "7": 91, "8": 86, "9": 90, "10": 88, "11": 87, "12": 85, "13": 82, "14": 44, "15": 26, "16": 89, "17": 50, "18": 43, "19": 84, "20": 55, "21": 31, "22": 104, "23": 53, "24": 98, "25": 9, "26": 59, "27": 50, "28": 43, "29": 93, "30": 40, "31": 74, "32": 25, "33": 0, "34": 95, "35": 47, "36": 59, "37": 92, "38": 52, "39": 74, "40": 80, "41": 103, "42": 94, "43": 63, "44": 100, "45": 104, "46": 35, "47": 10, "48": 77, "49": 57}, "34": {"0": 102, "1": 16, "2": 89, "3": 39, "4": 63, "5": 29, "6": 65, "7": 16, "8": 13, "9": 62, "10": 82, "11": 9, "12": 74, "13": 112, "14": 79, "15": 91, "16": 62, "17": 86, "18": 53, "19": 17, "20": 91, "21": 65, "22": 84, "23": 41, "24": 37, "25": 86, "26": 44, "27": 44, "28": 63, "29": 52, "30": 55, "31": 101, "32": 88, "33": 95, "34": 0, "35": 93, "36": 37, "37": 55, "38": 79, "39": 21, "40": 109, "41": 93, "42": 12, "43": 93, "44": 71, "45": 99, "46": 61, "47": 87, "48": 55, "49": 101}, "35": {"0": 14, "1": 77, "2": 50, "3": 56, "4": 41, "5": 70, "6": 80, "7": 97, "8": 90, "9": 58, "10": 47, "11": 84, "12": 47, "13": 35, "14": 13, "15": 21, "16": 57, "17": 8, "18": 47, "19": 90, "20": 9, "21": 40, "22": 64, "23": 60, "24": 78, "25": 46, "26": 49, "27": 60, "28": 31, "29": 65, "30": 56, "31": 27, "32": 22, "33": 47, "34": 93, "35": 0, "36": 59, "37": 63, "38": 16, "39": 74, "40": 33, "41": 60, "42": 87, "43": 17, "44": 64, "45": 59, "46": 56, "47": 39, "48": 49, "49": 11}, "36": {"0": 69, "1": 21, "2": 69, "3": 2, "4": 26, "5": 27, "6": 65, "7": 38, "8": 31, "9": 50, "10": 63, "11": 28, "12": 56, "13": 83, "14": 45, "15": 54, "16": 50, "17": 53, "18": 16, "19": 31, "20": 58, "21": 28, "22": 72, "23": 9, "24": 43, "25": 51, "26": 12, "27": 13, "28": 27, "29": 46, "30": 23, "31": 72, "32": 51, "33": 59, "34": 37, "35": 59, "36": 0, "37": 47, "38": 46, "39": 16, "40": 80, "41": 77, "42": 35, "43": 63, "44": 62, "45": 81, "46": 29, "47": 51, "48": 37, "49": 68}, "37": {"0": 64, "1": 46, "2": 35, "3": 46, "4": 61, "5": 27, "6": 19, "7": 68, "8": 62, "9": 7, "10": 29, "11": 49, "12": 23, "13": 65, "14": 53, "15": 74, "16": 8, "17": 55, "18": 55, "19": 65, "20": 56, "21": 63, "22": 29, "23": 57, "24": 21, "25": 86, "26": 38, "27": 60, "28": 49, "29": 3, "30": 68, "31": 56, "32": 72, "33": 92, "34": 55, "35": 63, "36": 47, "37": 0, "38": 47, "39": 48, "40": 63, "41": 37, "42": 43, "43": 54, "44": 16, "45": 43, "46": 72, "47": 82, "48": 15, "49": 65}, "38": {"0": 23, "1": 63, "2": 40, "3": 44, "4": 34, "5": 54, "6": 65, "7": 84, "8": 77, "9": 43, "10": 36, "11": 70, "12": 34, "13": 38, "14": 7, "15": 28, "16": 42, "17": 8, "18": 38, "19": 77, "20": 12, "21": 35, "22": 52, "23": 49, "24": 62, "25": 49, "26": 35, "27": 50, "28": 21, "29": 49, "30": 49, "31": 27, "32": 27, "33": 52, "34": 79, "35": 16, "36": 46, "37": 47, "38": 0, "39": 60, "40": 35, "41": 50, "42": 71, "43": 17, "44": 50, "45": 51, "46": 50, "47": 43, "48": 33, "49": 22}, "39": {"0": 83, "1": 6, "2": 77, "3": 18, "4": 42, "5": 22, "6": 64, "7": 24, "8": 17, "9": 53, "10": 70, "11": 12, "12": 63, "13": 95, "14": 60, "15": 70, "16": 53, "17": 67, "18": 32, "19": 18, "20": 72, "21": 44, "22": 76, "23": 21, "24": 37, "25": 65, "26": 25, "27": 24, "28": 43, "29": 46, "30": 35, "31": 84, "32": 67, "33": 74, "34": 21, "35": 74, "36": 16, "37": 48, "38": 60, "39": 0, "40": 92, "41": 83, "42": 21, "43": 76, "44": 64, "45": 88, "46": 41, "47": 67, "48": 43, "49": 82}, "40": {"0": 19, "1": 94, "2": 32, "3": 78, "4": 70, "5": 81, "6": 73, "7": 117, "8": 110, "9": 55, "10": 35, "11": 100, "12": 40, "13": 2, "14": 40, "15": 54, "16": 54, "17": 32, "18": 74, "19": 111, "20": 25, "21": 70, "22": 48, "23": 85, "24": 83, "25": 79, "26": 68, "27": 86, "28": 56, "29": 66, "30": 85, "31": 8, "32": 55, "33": 80, "34": 109, "35": 33, "36": 80, "37": 63, "38": 35, "39": 92, "40": 0, "41": 40, "42": 99, "43": 18, "44": 56, "45": 36, "46": 86, "47": 72, "48": 54, "49": 23}, "41": {"0": 52, "1": 81, "2": 10, "3": 75, "4": 80, "5": 64, "6": 37, "7": 105, "8": 98, "9": 30, "10": 15, "11": 86, "12": 21, "13": 41, "14": 58, "15": 78, "16": 30, "17": 54, "18": 79, "19": 101, "20": 50, "21": 81, "22": 10, "23": 85, "24": 58, "25": 99, "26": 65, "27": 87, "28": 65, "29": 41, "30": 92, "31": 38, "32": 78, "33": 103, "34": 93, "35": 60, "36": 77, "37": 37, "38": 50, "39": 83, "40": 40, "41": 0, "42": 81, "43": 43, "44": 23, "45": 6, "46": 95, "47": 93, "48": 40, "49": 55}, "42": {"0": 94, "1": 15, "2": 77, "3": 36, "4": 61, "5": 18, "6": 53, "7": 28, "8": 23, "9": 50, "10": 71, "11": 11, "12": 63, "13": 102, "14": 73, "15": 87, "16": 50, "17": 79, "18": 51, "19": 27, "20": 83, "21": 63, "22": 72, "23": 42, "24": 24, "25": 86, "26": 39, "27": 45, "28": 59, "29": 40, "30": 56, "31": 91, "32": 84, "33": 94, "34": 12, "35": 87, "36": 35, "37": 43, "38": 71, "39": 21, "40": 99, "41": 81, "42": 0, "43": 85, "44": 59, "45": 87, "46": 62, "47": 86, "48": 45, "49": 94}, "43": {"0": 10, "1": 78, "2": 33, "3": 60, "4": 51, "5": 67, "6": 68, "7": 100, "8": 93, "9": 47, "10": 32, "11": 85, "12": 34, "13": 21, "14": 22, "15": 37, "16": 46, "17": 14, "18": 55, "19": 94, "20": 8, "21": 51, "22": 49, "23": 66, "24": 72, "25": 62, "26": 51, "27": 67, "28": 38, "29": 57, "30": 66, "31": 11, "32": 38, "33": 63, "34": 93, "35": 17, "36": 63, "37": 54, "38": 17, "39": 76, "40": 18, "41": 43, "42": 85, "43": 0, "44": 52, "45": 42, "46": 67, "47": 55, "48": 42, "49": 12}, "44": {"0": 62, "1": 62, "2": 24, "3": 61, "4": 72, "5": 44, "6": 17, "7": 85, "8": 78, "9": 12, "10": 21, "11": 65, "12": 17, "13": 58, "14": 57, "15": 79, "16": 12, "17": 57, "18": 68, "19": 81, "20": 56, "21": 73, "22": 13, "23": 71, "24": 36, "25": 95, "26": 51, "27": 74, "28": 58, "29": 19, "30": 80, "31": 50, "32": 77, "33": 100, "34": 71, "35": 64, "36": 62, "37": 16, "38": 50, "39": 64, "40": 56, "41": 23, "42": 59, "43": 52, "44": 0, "45": 29, "46": 84, "47": 90, "48": 25, "49": 64}, "45": {"0": 50, "1": 87, "2": 12, "3": 80, "4": 83, "5": 70, "6": 44, "7": 110, "8": 104, "9": 36, "10": 18, "11": 92, "12": 25, "13": 37, "14": 59, "15": 78, "16": 36, "17": 54, "18": 82, "19": 106, "20": 50, "21": 84, "22": 17, "23": 89, "24": 65, "25": 100, "26": 69, "27": 91, "28": 68, "29": 47, "30": 95, "31": 35, "32": 78, "33": 104, "34": 99, "35": 59, "36": 81, "37": 43, "38": 51, "39": 88, "40": 36, "41": 6, "42": 87, "43": 42, "44": 29, "45": 0, "46": 98, "47": 94, "48": 45, "49": 54}, "46": {"0": 69, "1": 47, "2": 86, "3": 28, "4": 15, "5": 55, "6": 91, "7": 56, "8": 51, "9": 73, "10": 80, "11": 53, "12": 74, "13": 88, "14": 45, "15": 41, "16": 72, "17": 53, "18": 16, "19": 49, "20": 60, "21": 15, "22": 92, "23": 20, "24": 71, "25": 26, "26": 34, "27": 17, "28": 30, "29": 72, "30": 5, "31": 78, "32": 38, "33": 35, "34": 61, "35": 56, "36": 29, "37": 72, "38": 50, "39": 41, "40": 86, "41": 95, "42": 62, "43": 67, "44": 84, "45": 98, "46": 0, "47": 29, "48": 59, "49": 67}, "47": {"0": 53, "1": 72, "2": 83, "3": 50, "4": 25, "5": 75, "6": 101, "7": 85, "8": 80, "9": 80, "10": 78, "11": 79, "12": 75, "13": 74, "14": 35, "15": 18, "16": 79, "17": 41, "18": 35, "19": 78, "20": 47, "21": 23, "22": 94, "23": 46, "24": 89, "25": 7, "26": 50, "27": 44, "28": 33, "29": 83, "30": 34, "31": 66, "32": 17, "33": 10, "34": 87, "35": 39, "36": 51, "37": 82, "38": 43, "39": 67, "40": 72, "41": 93, "42": 86, "43": 55, "44": 90, "45": 94, "46": 29, "47": 0, "48": 67, "49": 49}, "48": {"0": 52, "1": 42, "2": 34, "3": 36, "4": 46, "5": 27, "6": 34, "7": 66, "8": 59, "9": 13, "10": 27, "11": 48, "12": 19, "13": 57, "14": 38, "15": 58, "16": 13, "17": 41, "18": 42, "19": 61, "20": 43, "21": 48, "22": 35, "23": 46, "24": 30, "25": 70, "26": 26, "27": 49, "28": 34, "29": 17, "30": 55, "31": 46, "32": 56, "33": 77, "34": 55, "35": 49, "36": 37, "37": 15, "38": 33, "39": 43, "40": 54, "41": 40, "42": 45, "43": 42, "44": 25, "45": 45, "46": 59, "47": 67, "48": 0, "49": 53}, "49": {"0": 4, "1": 85, "2": 46, "3": 66, "4": 52, "5": 76, "6": 80, "7": 106, "8": 99, "9": 59, "10": 44, "11": 92, "12": 46, "13": 25, "14": 23, "15": 31, "16": 58, "17": 15, "18": 58, "19": 99, "20": 10, "21": 51, "22": 61, "23": 70, "24": 83, "25": 57, "26": 57, "27": 70, "28": 41, "29": 68, "30": 67, "31": 19, "32": 32, "33": 57, "34": 101, "35": 11, "36": 68, "37": 65, "38": 22, "39": 82, "40": 23, "41": 55, "42": 94, "43": 12, "44": 64, "45": 54, "46": 67, "47": 49, "48": 53, "49": 0}}, "q": {"0": 3, "1": 14, "2": 1, "3": 14, "4": 19, "5": 2, "6": 14, "7": 6, "8": 7, "9": 6, "10": 10, "11": 18, "12": 3, "13": 6, "14": 20, "15": 4, "16": 14, "17": 11, "18": 19, "19": 15, "20": 15, "21": 4, "22": 13, "23": 13, "24": 5, "25": 16, "26": 3, "27": 7, "28": 14, "29": 17, "30": 3, "31": 3, "32": 12, "33": 14, "34": 20, "35": 13, "36": 10, "37": 9, "38": 6, "39": 18, "40": 7, "41": 20, "42": 9, "43": 1, "44": 8, "45": 5, "46": 1, "47": 7, "48": 9, "49": 2}, "Q": {"0": 120, "1": 120, "2": 120, "3": 120, "4": 120, "5": 120, "6": 120, "7": 120, "8": 120, "9": 120, "10": 120, "11": 120, "12": 120, "13": 120, "14": 120, "15": 120, "16": 120, "17": 120, "18": 120, "19": 120, "20": 120, "21": 120, "22": 120, "23": 120, "24": 120, "25": 120, "26": 120, "27": 120, "28": 120, "29": 120, "30": 120, "31": 120, "32": 120, "33": 120, "34": 120, "35": 120, "36": 120, "37": 120, "38": 120, "39": 120, "40": 120, "41": 120, "42": 120, "43": 120, "44": 120, "45": 120, "46": 120, "47": 120, "48": 120, "49": 120}} -------------------------------------------------------------------------------- /make_release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | export PARSED_VERSION=$(head -n1 src/pygcgopt/__init__.py | cut -d "'" -f2) 5 | 6 | echo "Parsed version number ${PARSED_VERSION} from src/pygcgopt/__init__.py." 7 | 8 | if ! grep -q "v${PARSED_VERSION}" CHANGELOG.md; then 9 | echo "The parsed version number ${PARSED_VERSION} is not contained in CHANGELOG.md. Please update the changelog and try again." 10 | exit 1 11 | fi 12 | 13 | echo "Updating remotes" 14 | git remote update 15 | 16 | if [[ `git status --porcelain` ]]; then 17 | echo "Your git working tree is not clean. Please commit all changes and push them before crafting the release." 18 | exit 1 19 | fi 20 | 21 | git push 22 | 23 | echo "Creating release tag" 24 | gh release create "v${PARSED_VERSION}" --title "v${PARSED_VERSION}" --notes "Release ${PARSED_VERSION}" 25 | 26 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ['setuptools', 'pyscipopt==5.3.0', 'cython >=3.0.0'] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "PyGCGOpt" 7 | description = "Python interface and modeling environment for GCG" 8 | authors = [ 9 | {name = "Lehrstuhl für Operations Research - RWTH Aachen University", email = "gcg-bugs@or.rwth-aachen.de"}, 10 | ] 11 | dependencies = ["pyscipopt"] 12 | requires-python = ">=3.8" 13 | readme = "README.md" 14 | license = {text = "MIT"} 15 | classifiers = [ 16 | "Development Status :: 2 - Pre-Alpha", 17 | "Intended Audience :: Science/Research", 18 | "Intended Audience :: Education", 19 | "License :: OSI Approved :: MIT License", 20 | "Programming Language :: Python :: 3", 21 | "Programming Language :: Cython", 22 | "Topic :: Scientific/Engineering :: Mathematics", 23 | ] 24 | dynamic = ["version"] 25 | 26 | [project.urls] 27 | Homepage = "https://github.com/SCIP-Interfaces/PyGCGOpt" 28 | 29 | [tool.pytest.ini_options] 30 | norecursedirs = ["check"] 31 | testpaths = ["tests"] 32 | 33 | [tool.setuptools] 34 | include-package-data = false 35 | 36 | [tool.setuptools.dynamic] 37 | version = {attr = "pygcgopt.__version__"} 38 | 39 | [tool.cibuildwheel] 40 | skip="pp*" # currently doesn't work with PyPy 41 | manylinux-x86_64-image = "manylinux_2_28" 42 | 43 | [tool.cibuildwheel.linux] 44 | skip="pp* cp36* cp37* *musllinux*" 45 | before-all = [ 46 | "(apt-get update && apt-get install --yes wget) || yum install -y wget zlib libgfortran || brew install wget", 47 | "wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.7.0/libscip-linux.zip -O scip.zip", 48 | "unzip scip.zip", 49 | ] 50 | environment = {PIP_NO_BINARY="pyscipopt", SCIPOPTDIR="$(pwd)/scip_install", GCGOPTDIR="$(pwd)/scip_install", LD_LIBRARY_PATH="$(pwd)/scip_install/lib:$LD_LIBRARY_PATH", DYLD_LIBRARY_PATH="$(pwd)/scip_install/lib:$DYLD_LIBRARY_PATH", PATH="$(pwd)/scip_install/bin:$PATH", PKG_CONFIG_PATH="$(pwd)/scip_install/lib/pkgconfig:$PKG_CONFIG_PATH", RELEASE="true"} 51 | 52 | [tool.cibuildwheel.macos] 53 | skip="pp* cp36* cp37*" 54 | before-all = ''' 55 | #!/bin/bash 56 | brew install wget zlib gcc 57 | if [[ $CIBW_ARCHS == *"arm"* ]]; then 58 | wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.7.0/libscip-macos-arm.zip -O scip.zip 59 | export MACOSX_DEPLOYMENT_TARGET=14.0 60 | else 61 | wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.7.0/libscip-macos.zip -O scip.zip 62 | export MACOSX_DEPLOYMENT_TARGET=13.0 63 | fi 64 | unzip scip.zip 65 | ''' 66 | environment = {PIP_NO_BINARY="pyscipopt", SCIPOPTDIR="$(pwd)/scip_install", GCGOPTDIR="$(pwd)/scip_install", LD_LIBRARY_PATH="$(pwd)/scip_install/lib:LD_LIBRARY_PATH", DYLD_LIBRARY_PATH="$(pwd)/scip_install/lib:$DYLD_LIBRARY_PATH", PATH="$(pwd)/scip_install/bin:$PATH", PKG_CONFIG_PATH="$(pwd)/scip_install/lib/pkgconfig:$PKG_CONFIG_PATH", RELEASE="true"} 67 | repair-wheel-command = ''' 68 | bash -c ' 69 | if [[ $CIBW_ARCHS == *"arm"* ]]; then 70 | export MACOSX_DEPLOYMENT_TARGET=14.0 71 | delocate-listdeps {wheel} 72 | delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel} 73 | else 74 | export MACOSX_DEPLOYMENT_TARGET=13.0 75 | delocate-listdeps {wheel} 76 | delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel} 77 | fi 78 | ' 79 | ''' 80 | 81 | [tool.cibuildwheel.windows] 82 | skip="pp* cp36* cp37*" 83 | before-all = [ 84 | "choco install 7zip wget", 85 | "wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.7.0/libscip-windows.zip -O scip.zip", 86 | "\"C:\\Program Files\\7-Zip\\7z.exe\" x \"scip.zip\" -o\"gcg-test\"", 87 | "mv .\\gcg-test\\scip_install .\\test", 88 | "mv .\\test .\\gcg" 89 | ] 90 | before-build = "pip install delvewheel" 91 | environment = {PIP_NO_BINARY="pyscipopt",SCIPOPTDIR='D:\\a\\PyGCGOpt\\PyGCGOpt\\gcg', GCGOPTDIR='D:\\a\\PyGCGOpt\\PyGCGOpt\\gcg', RELEASE="true" } 92 | repair-wheel-command = "delvewheel repair --add-path c:/bin;c:/lib;c:/bin/src;c:/lib/src;D:/a/PyGCGOpt/PyGCGOpt/gcg/;D:/a/PyGCGOpt/PyGCGOpt/gcg/lib/;D:/a/PyGCGOpt/PyGCGOpt/gcg/bin/ -w {dest_dir} {wheel}" 93 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] 2 | universal = 1 3 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, Extension 2 | import os, platform, sys, re 3 | 4 | # look for environment variable that specifies path to SCIP and GCG 5 | scipoptdir = os.environ.get('SCIPOPTDIR', '').strip('"') 6 | gcgoptdir = os.environ.get('GCGOPTDIR', scipoptdir).strip('"') 7 | 8 | extra_compile_args = [] 9 | extra_link_args = [] 10 | 11 | includedirs = [] 12 | 13 | for optdir in set([scipoptdir, gcgoptdir]): 14 | # determine include directory 15 | if os.path.exists(os.path.join(optdir, 'src')): 16 | # SCIP seems to be installed in place 17 | includedirs.append(os.path.abspath(os.path.join(optdir, 'src'))) 18 | else: 19 | # assume that SCIP is installed on the system 20 | includedirs.append(os.path.abspath(os.path.join(optdir, 'include'))) 21 | 22 | if not gcgoptdir: 23 | if platform.system() == 'Linux': 24 | includedirs.append("/usr/include/gcg") 25 | 26 | includedirs = list(set(includedirs)) 27 | 28 | print('Using include path <%s>.' % ", ".join(includedirs)) 29 | 30 | 31 | # determine scip library 32 | if os.path.exists(os.path.join(scipoptdir, "lib", "shared", "libscip.so")): 33 | # SCIP seems to be created with make 34 | sciplibdir = os.path.abspath(os.path.join(scipoptdir, "lib", "shared")) 35 | sciplibname = "scip" 36 | extra_compile_args.append("-DNO_CONFIG_HEADER") 37 | # the following is a temporary hack to make it compile with SCIP/make: 38 | extra_compile_args.append("-DTPI_NONE") # if other TPIs are used, please modify 39 | else: 40 | # assume that SCIP is installed on the system 41 | sciplibdir = os.path.abspath(os.path.join(scipoptdir, "lib")) 42 | sciplibname = "libscip" if platform.system() in ["Windows"] else "scip" 43 | 44 | # determine gcg library 45 | if os.path.exists(os.path.join(gcgoptdir, "lib", "shared", "libgcg.so")): 46 | # SCIP seems to be created with make 47 | gcglibdir = os.path.abspath(os.path.join(gcgoptdir, "lib", "shared")) 48 | gcglibname = "gcg" 49 | else: 50 | # assume that SCIP is installed on the system 51 | gcglibdir = os.path.abspath(os.path.join(gcgoptdir, "lib")) 52 | gcglibname = "libgcg" if platform.system() in ["Windows"] else "gcg" 53 | 54 | print('Using SCIP library <%s> at <%s>.' % (sciplibname, sciplibdir)) 55 | print('Using GCG library <%s> at <%s>.' % (gcglibname, gcglibdir)) 56 | 57 | # set runtime libraries 58 | if platform.system() in ['Linux', 'Darwin']: 59 | for libdir in set([sciplibdir, gcglibdir]): 60 | extra_link_args.append('-Wl,-rpath,'+libdir) 61 | 62 | # enable debug mode if requested 63 | if "--debug" in sys.argv: 64 | extra_compile_args.append('-UNDEBUG') 65 | sys.argv.remove("--debug") 66 | 67 | use_cython = True 68 | 69 | packagedirgcg = os.path.join('src', 'pygcgopt') 70 | 71 | with open(os.path.join(packagedirgcg, '__init__.py'), 'r') as initfile: 72 | version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', 73 | initfile.read(), re.MULTILINE).group(1) 74 | 75 | try: 76 | from Cython.Build import cythonize 77 | except ImportError: 78 | if not os.path.exists(os.path.join(packagedir, 'gcg.cpp')): 79 | print('Cython is required') 80 | quit(1) 81 | use_cython = False 82 | 83 | if not os.path.exists(os.path.join(packagedirgcg, 'gcg.pyx')): 84 | use_cython = False 85 | 86 | ext = '.pyx' if use_cython else '.cpp' 87 | 88 | extra_compile_args.append("-std=c++11") 89 | 90 | on_github_actions = os.getenv('GITHUB_ACTIONS') == 'true' 91 | release_mode = os.getenv('RELEASE') == 'true' 92 | compile_with_line_tracing = on_github_actions and not release_mode 93 | 94 | extensions = [Extension('pygcgopt.gcg', [os.path.join(packagedirgcg, 'gcg'+ext)], 95 | include_dirs=includedirs, 96 | library_dirs=list(set([sciplibdir, gcglibdir])), 97 | libraries=[sciplibname, gcglibname], 98 | extra_compile_args = extra_compile_args, 99 | extra_link_args=extra_link_args 100 | )] 101 | 102 | if use_cython: 103 | # Compiler directives needed for documentation, see https://stackoverflow.com/a/10060115/11362041 104 | extensions = cythonize(extensions, compiler_directives={'language_level': 3, 'embedsignature': True}) 105 | 106 | with open('README.md') as f: 107 | long_description = f.read() 108 | 109 | setup( 110 | name='PyGCGOpt', 111 | version=version, 112 | description='Python interface and modeling environment for GCG', 113 | long_description=long_description, 114 | long_description_content_type='text/markdown', 115 | url='https://github.com/scipopt/PyGCGOpt', 116 | author='Lehrstuhl für Operations Research - RWTH Aachen University', 117 | author_email='gcg-bugs@or.rwth-aachen.de', 118 | license='MIT', 119 | classifiers=[ 120 | 'Development Status :: 2 - Pre-Alpha', 121 | 'Intended Audience :: Science/Research', 122 | 'Intended Audience :: Education', 123 | 'License :: OSI Approved :: MIT License', 124 | 'Programming Language :: Python :: 3', 125 | 'Programming Language :: Cython', 126 | 'Topic :: Scientific/Engineering :: Mathematics'], 127 | ext_modules=extensions, 128 | install_requires=[ 129 | 'wheel', 130 | 'pyscipopt==5.3.0' 131 | ], 132 | packages=['pygcgopt'], 133 | package_dir={'pygcgopt': packagedirgcg}, 134 | package_data = {'pygcgopt': ['gcg.pyx', 'gcg.pxd', '*.pxi', 'gcg/lib/*']} 135 | ) 136 | -------------------------------------------------------------------------------- /src/pygcgopt/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.4.1' 2 | 3 | # required for Python 3.8 on Windows 4 | import os 5 | if hasattr(os, 'add_dll_directory'): 6 | if os.getenv('SCIPOPTDIR'): 7 | os.add_dll_directory(os.path.join(os.getenv('SCIPOPTDIR').strip('"'), 'bin')) 8 | 9 | # Expose pyscipopt object through pygcgopt 10 | from pyscipopt import multidict 11 | from pyscipopt import Benders 12 | from pyscipopt import Benderscut 13 | from pyscipopt import Branchrule 14 | from pyscipopt import Nodesel 15 | from pyscipopt import Conshdlr 16 | from pyscipopt import Eventhdlr 17 | from pyscipopt import Heur 18 | from pyscipopt import Presol 19 | from pyscipopt import Pricer 20 | from pyscipopt import Prop 21 | from pyscipopt import Sepa 22 | from pyscipopt import LP 23 | from pyscipopt import Expr 24 | from pyscipopt import quicksum 25 | from pyscipopt import quickprod 26 | from pyscipopt import exp 27 | from pyscipopt import log 28 | from pyscipopt import sqrt 29 | from pyscipopt import SCIP_RESULT 30 | from pyscipopt import SCIP_PARAMSETTING 31 | from pyscipopt import SCIP_PARAMEMPHASIS 32 | from pyscipopt import SCIP_STATUS 33 | from pyscipopt import SCIP_STAGE 34 | from pyscipopt import SCIP_PROPTIMING 35 | from pyscipopt import SCIP_PRESOLTIMING 36 | from pyscipopt import SCIP_HEURTIMING 37 | from pyscipopt import SCIP_EVENTTYPE 38 | from pyscipopt import SCIP_LPSOLSTAT 39 | from pyscipopt import SCIP_BRANCHDIR 40 | from pyscipopt import SCIP_BENDERSENFOTYPE 41 | from pyscipopt import SCIP_ROWORIGINTYPE 42 | 43 | # export user-relevant objects 44 | from pygcgopt.gcg import Model 45 | from pygcgopt.gcg import Detector 46 | from pygcgopt.gcg import PricingSolver 47 | from pygcgopt.gcg import ConsClassifier 48 | from pygcgopt.gcg import VarClassifier 49 | from pygcgopt.gcg import Score 50 | from pygcgopt.gcg import PY_GCG_PRICINGSTATUS as GCG_PRICINGSTATUS 51 | from pygcgopt.gcg import PY_CONS_DECOMPINFO as CONS_DECOMPINFO 52 | from pygcgopt.gcg import PY_VAR_DECOMPINFO as VAR_DECOMPINFO 53 | from pygcgopt.gcg import PY_USERGIVEN as USERGIVEN 54 | -------------------------------------------------------------------------------- /src/pygcgopt/consclassifier.pxi: -------------------------------------------------------------------------------- 1 | cdef class ConsClassifier: 2 | """Base class of the Constraint Classifier Plugin""" 3 | cdef public Model model 4 | cdef public str name 5 | 6 | def freeConsClassifier(self): 7 | '''calls destructor and frees memory of constraint classifier''' 8 | pass 9 | 10 | def classify(self, conss, partition): 11 | pass 12 | 13 | cdef SCIP_RETCODE PyConsClassifierFree(SCIP* scip, GCG_CONSCLASSIFIER* consclassifier) noexcept with gil: 14 | cdef GCG_CLASSIFIERDATA* consclassifierdata 15 | consclassifierdata = GCGconsClassifierGetData(consclassifier) 16 | py_consclassifier = consclassifierdata 17 | py_consclassifier.freeConsClassifier() 18 | Py_DECREF(py_consclassifier) 19 | return SCIP_OKAY 20 | 21 | cdef SCIP_RETCODE PyConsClassifierClassify(SCIP* scip, GCG_CONSCLASSIFIER* consclassifier, SCIP_Bool transformed) noexcept with gil: 22 | cdef GCG_CLASSIFIERDATA* consclassifierdata 23 | consclassifierdata = GCGconsClassifierGetData(consclassifier) 24 | py_consclassifier = consclassifierdata 25 | if transformed: 26 | detprobdata = py_consclassifier.model.getDetprobdataPresolved() 27 | else: 28 | detprobdata = py_consclassifier.model.getDetprobdataOrig() 29 | conss = detprobdata.getRelevantConss() 30 | partition = detprobdata.createConsPart(py_consclassifier.name, 0, len(conss)) 31 | py_consclassifier.classify(conss, partition) 32 | print("Consclassifier {0} yields a classification with {1} different constraint classes".format(partition.getName(), partition.getNClasses())) 33 | detprobdata.addConsPartition(partition) 34 | return SCIP_OKAY -------------------------------------------------------------------------------- /src/pygcgopt/detector.pxi: -------------------------------------------------------------------------------- 1 | cdef class Detector: 2 | """Base class of the Detector Plugin""" 3 | cdef public Model model 4 | cdef public str detectorname 5 | 6 | def freeDetector(self): 7 | '''calls destructor and frees memory of detector''' 8 | pass 9 | 10 | def initDetector(self): 11 | '''initializes detector''' 12 | pass 13 | 14 | def exitDetector(self): 15 | '''calls exit method of detector''' 16 | pass 17 | 18 | def propagatePartialdec(self, detprobdata, workonpartialdec): 19 | '''refines a partial decomposition inside detection loop''' 20 | return {} 21 | 22 | def finishPartialdec(self, detprobdata, workonpartialdec): 23 | '''completes a partial decomposition when called in detection loop''' 24 | return {} 25 | 26 | def postprocessPartialdec(self, detprobdata, workonpartialdec): 27 | '''postprocess a complete decomposition, called after detection loop''' 28 | return {} 29 | 30 | def setParamAggressive(self): 31 | '''called if the detection emphasis setting aggressive is chosen''' 32 | pass 33 | 34 | def setParamDefault(self): 35 | '''called if the detection emphasis setting default is chosen''' 36 | pass 37 | 38 | def setParamFast(self): 39 | '''called if the detection emphasis setting fast is chosen''' 40 | pass 41 | 42 | 43 | cdef Detector get_py_detector(GCG_DETECTOR* detector): 44 | cdef GCG_DETECTORDATA* detectordata 45 | detectordata = GCGdetectorGetData(detector) 46 | py_detector = detectordata 47 | return py_detector 48 | 49 | 50 | cdef tuple get_py_partialdec_detection_data(PARTIALDEC_DETECTION_DATA* partialdecdetectiondata): 51 | detprobdata = DetProbData.create(partialdecdetectiondata.detprobdata) 52 | workonpartialdec = PartialDecomposition.create(partialdecdetectiondata.workonpartialdec) 53 | return detprobdata, workonpartialdec 54 | 55 | 56 | cdef wrap_detector_callback_result(Detector detector, PARTIALDEC_DETECTION_DATA* partialdecdetectiondata, SCIP_RESULT* result, object result_dict, double detection_time): 57 | if result_dict is None or type(result_dict) is not dict: 58 | raise TypeError("Detector callback returned '{}' of type '{}'. Expected a dictionary with optional keys 'newpartialdecs' and 'result'.".format(result_dict, type(result_dict))) 59 | 60 | py_newpartialdecs = result_dict.get("newpartialdecs", []) 61 | if py_newpartialdecs is None or type(py_newpartialdecs) is not list: 62 | raise TypeError("The value of the key 'newpartialdecs' is '{}' of type '{}'. Expected a list of 'PartialDecomposition' objects.".format(py_newpartialdecs, type(py_newpartialdecs))) 63 | 64 | nnewpartialdecs = len(py_newpartialdecs) 65 | cdef PARTIALDECOMP** newpartialdecs = malloc(nnewpartialdecs * sizeof(PARTIALDECOMP*)) 66 | for i in range(nnewpartialdecs): 67 | py_newpartialdecs[i].sort() 68 | # TODO: It would be nice if the user could set a custom chain info 69 | py_newpartialdecs[i].addDetectorChainInfo(detector.detectorname) 70 | py_newpartialdecs[i].addClockTime(detection_time / nnewpartialdecs) 71 | newpartialdecs[i] = (py_newpartialdecs[i]).thisptr 72 | partialdecdetectiondata.newpartialdecs = newpartialdecs 73 | partialdecdetectiondata.nnewpartialdecs = nnewpartialdecs 74 | partialdecdetectiondata.detectiontime = detection_time 75 | result[0] = result_dict.get("result", result[0]) 76 | 77 | 78 | cdef SCIP_RETCODE PyDetectorFree (SCIP* scip, GCG_DETECTOR* detector) noexcept with gil: 79 | py_detector = get_py_detector(detector) 80 | py_detector.freeDetector() 81 | Py_DECREF(py_detector) 82 | return SCIP_OKAY 83 | 84 | cdef SCIP_RETCODE PyDetectorInit (SCIP* scip, GCG_DETECTOR* detector) noexcept with gil: 85 | py_detector = get_py_detector(detector) 86 | py_detector.initDetector() 87 | return SCIP_OKAY 88 | 89 | cdef SCIP_RETCODE PyDetectorExit (SCIP* scip, GCG_DETECTOR* detector) noexcept with gil: 90 | py_detector = get_py_detector(detector) 91 | py_detector.exitDetector() 92 | return SCIP_OKAY 93 | 94 | cdef SCIP_RETCODE PyDetectorPropagatePartialdec (SCIP* scip, GCG_DETECTOR* detector, PARTIALDEC_DETECTION_DATA* partialdecdetectiondata, SCIP_RESULT* result) noexcept with gil: 95 | cdef SCIP_CLOCK* clock = start_new_clock(scip) 96 | 97 | py_detector = get_py_detector(detector) 98 | detprobdata, workonpartialdec = get_py_partialdec_detection_data(partialdecdetectiondata) 99 | 100 | result_dict = py_detector.propagatePartialdec(detprobdata, workonpartialdec) 101 | 102 | cdef double detection_time = stop_and_free_clock(scip, clock) 103 | wrap_detector_callback_result(py_detector, partialdecdetectiondata, result, result_dict, detection_time) 104 | 105 | return SCIP_OKAY 106 | 107 | cdef SCIP_RETCODE PyDetectorFinishPartialdec (SCIP* scip, GCG_DETECTOR* detector, PARTIALDEC_DETECTION_DATA* partialdecdetectiondata, SCIP_RESULT* result) noexcept with gil: 108 | cdef SCIP_CLOCK* clock = start_new_clock(scip) 109 | 110 | py_detector = get_py_detector(detector) 111 | detprobdata, workonpartialdec = get_py_partialdec_detection_data(partialdecdetectiondata) 112 | 113 | result_dict = py_detector.finishPartialdec(detprobdata, workonpartialdec) 114 | 115 | cdef double detection_time = stop_and_free_clock(scip, clock) 116 | wrap_detector_callback_result(py_detector, partialdecdetectiondata, result, result_dict, detection_time) 117 | 118 | return SCIP_OKAY 119 | 120 | cdef SCIP_RETCODE PyDetectorPostprocessPartialdec (SCIP* scip, GCG_DETECTOR* detector, PARTIALDEC_DETECTION_DATA* partialdecdetectiondata, SCIP_RESULT* result) noexcept with gil: 121 | cdef SCIP_CLOCK* clock = start_new_clock(scip) 122 | 123 | py_detector = get_py_detector(detector) 124 | detprobdata, workonpartialdec = get_py_partialdec_detection_data(partialdecdetectiondata) 125 | 126 | result_dict = py_detector.postprocessPartialdec(detprobdata, workonpartialdec) 127 | 128 | cdef double detection_time = stop_and_free_clock(scip, clock) 129 | wrap_detector_callback_result(py_detector, partialdecdetectiondata, result, result_dict, detection_time) 130 | 131 | return SCIP_OKAY 132 | 133 | cdef SCIP_RETCODE PyDetectorSetParamAggressive (SCIP* scip, GCG_DETECTOR* detector, SCIP_RESULT* result) noexcept with gil: 134 | py_detector = get_py_detector(detector) 135 | result_dict = py_detector.setParamAggressive() or {} 136 | result[0] = result_dict.get("result", result[0]) 137 | return SCIP_OKAY 138 | 139 | cdef SCIP_RETCODE PyDetectorSetParamDefault (SCIP* scip, GCG_DETECTOR* detector, SCIP_RESULT* result) noexcept with gil: 140 | py_detector = get_py_detector(detector) 141 | result_dict = py_detector.setParamDefault() or {} 142 | result[0] = result_dict.get("result", result[0]) 143 | return SCIP_OKAY 144 | 145 | cdef SCIP_RETCODE PyDetectorSetParamFast (SCIP* scip, GCG_DETECTOR* detector, SCIP_RESULT* result) noexcept with gil: 146 | py_detector = get_py_detector(detector) 147 | result_dict = py_detector.setParamFast() or {} 148 | result[0] = result_dict.get("result", result[0]) 149 | return SCIP_OKAY 150 | -------------------------------------------------------------------------------- /src/pygcgopt/partition.pxi: -------------------------------------------------------------------------------- 1 | cdef class ConsPart: 2 | """Base class holding a pointer to corresponding ConsPartition""" 3 | 4 | @staticmethod 5 | cdef create(ConsPartition* consPartition, DetProbData detProbData): 6 | if consPartition == NULL: 7 | raise Warning("cannot create ConsPart with ConsPartition* == NULL") 8 | new_ConsPart = ConsPart() 9 | new_ConsPart.consPartition = consPartition 10 | new_ConsPart.detProbData = detProbData 11 | return new_ConsPart 12 | 13 | def getClassDescription(self, classindex): 14 | """returns the description of the class corresponding to the classindex 15 | 16 | :param classindex: index of the class 17 | :type classindex: int 18 | :return: description of the class 19 | :rtype: str 20 | """ 21 | return self.consPartition.getClassDescription(classindex).decode('utf-8') 22 | 23 | def getClassName(self, classindex): 24 | """returns the name of the class corresponding to the classindex 25 | 26 | :param classindex: index of the class 27 | :type classindex: int 28 | :return: name of the class 29 | :rtype: str 30 | """ 31 | return self.consPartition.getClassName(classindex).decode('utf-8') 32 | 33 | def getName(self): 34 | """returns the name of the constraint partition 35 | 36 | :return: name of the constraint partition 37 | :rtype: str 38 | """ 39 | return self.consPartition.getName().decode('utf-8') 40 | 41 | def getNClasses(self): 42 | """returns the number of classes of the constraint partition 43 | 44 | :return: number of classes 45 | :rtype: int 46 | """ 47 | return self.consPartition.getNClasses() 48 | 49 | def removeEmptyClasses(self): 50 | """removes all classes which do not have any assigned indices (classindices may change) 51 | 52 | :return: number of removed classes 53 | :rtype: int 54 | """ 55 | return self.consPartition.removeEmptyClasses() 56 | 57 | def setClassDescription(self, classindex, desc): 58 | """sets the description of the class corresponding to the classindex 59 | 60 | :param classindex: index of the class 61 | :type classindex: int 62 | :param desc: description of the class 63 | :type desc: str 64 | """ 65 | c_desc = str_conversion(desc) 66 | self.consPartition.setClassDescription(classindex, c_desc) 67 | 68 | def setClassName(self, classindex, name): 69 | """sets the name of the class corresponding to the classindex 70 | 71 | :param classindex: index of the class 72 | :type classindex: int 73 | :param name: name of the class 74 | :type name: str 75 | """ 76 | c_name = str_conversion(name) 77 | self.consPartition.setClassName(classindex, name) 78 | 79 | def addClass(self, name, desc, decompInfo): 80 | """adds a new class to the constraint partition 81 | 82 | :param name: name of the class 83 | :type name: str 84 | :param desc: description of the class 85 | :type desc: str 86 | :param decompInfo: decomposition information of the constraint class 87 | :type decompInfo: :class:`CONS_DECOMPINFO` 88 | :return: index of the added class 89 | :rtype: int 90 | """ 91 | c_name = str_conversion(name) 92 | c_desc = str_conversion(desc) 93 | return self.consPartition.addClass(c_name, c_desc, decompInfo) 94 | 95 | def assignConsToClass(self, Constraint cons, classindex): 96 | """assigns a constraint to the class corresponding to the classindex 97 | 98 | :param cons: constraint that should be assigned to a class 99 | :type cons: :class:`Constraint` 100 | :param classindex: index of the class 101 | :type classindex: int 102 | """ 103 | cdef int cpp_consindex = self.detProbData.getIndexForCons(cons) 104 | self.consPartition.assignConsToClass(cpp_consindex, classindex) 105 | 106 | def getAllSubsets(self, both, only_master, only_pricing): 107 | """returns a list containing all possible subsets of the chosen classindices 108 | 109 | :param both: True iff PY_BOTH classes should be considered 110 | :type both: bool 111 | :param only_master: True iff PY_ONLY_MASTER classes should be considered 112 | :type only_master: bool 113 | :param only_pricing: True iff PY_ONLY_PRICING classes should be considered 114 | :type only_pricing: bool 115 | :return: list of lists containing all possible subsets of the chosen classindices 116 | :rtype: list 117 | """ 118 | return self.consPartition.getAllSubsets(both, only_master, only_pricing) 119 | 120 | def getClassDecompInfo(self, classindex): 121 | """returns the decomposition information of a class 122 | 123 | :param classindex: index of the class 124 | :type classindex: int 125 | :return: decomposition information of the constraint class 126 | :rtype: :class:`CONS_DECOMPINFO` 127 | """ 128 | return self.consPartition.getClassDecompInfo(classindex) 129 | 130 | def getClassNameOfCons(self, Constraint cons): 131 | """returns the name of the class a constraint is assigned to 132 | 133 | :param cons: constraint 134 | :type cons: :class:`Constraint` 135 | :return: name of the class of the constraint 136 | :rtype: str 137 | """ 138 | cdef int cpp_consindex = self.detProbData.getIndexForCons(cons) 139 | return self.consPartition.getClassNameOfCons(cpp_consindex).decode('utf-8') 140 | 141 | def getClassOfCons(self, Constraint cons): 142 | """returns the index of the class a constraint is assigned to 143 | 144 | :param cons: constraint 145 | :type cons: :class:`Constraint` 146 | :return: classindex of the constraint 147 | :rtype: int 148 | """ 149 | cdef int cpp_consindex = self.detProbData.getIndexForCons(cons) 150 | return self.consPartition.getClassOfCons(cpp_consindex) 151 | 152 | def getNConss(self): 153 | """returns the number of constraints of the constraint partition 154 | 155 | :return: number of constraints 156 | :rtype: int 157 | """ 158 | return self.consPartition.getNConss() 159 | 160 | def getNConssOfClasses(self): 161 | """returns list with the numbers of constraints that are assigned to the classes 162 | 163 | :return: list with the numbers of constraints that are assigned to the classes 164 | :rtype: list 165 | """ 166 | return self.consPartition.getNConssOfClasses() 167 | 168 | def isConsClassified(self, Constraint cons): 169 | """returns whether a constraint is already assigned to a class 170 | 171 | :param cons: constraint that should be checked if it is already assigned to a class 172 | :type cons: :class:`Constraint` 173 | :return: True iff variable is already assigned to a class 174 | :rtype: bool 175 | """ 176 | cdef int cpp_consindex = self.detProbData.getIndexForCons(cons) 177 | return self.consPartition.isConsClassified(cpp_consindex) 178 | 179 | def reduceClasses(self, maxNumberOfClasses): 180 | """returns constraint partition with reduced number of classes 181 | 182 | :param maxNumberOfClasses: maximal number of classes that are allowed 183 | :type maxNumberOfClasses: int 184 | :return: 185 | :rtype: :class:`ConsPart` 186 | """ 187 | cdef ConsPartition* result = self.consPartition.reduceClasses(maxNumberOfClasses) 188 | return ConsPart.create(result, self.detProbData) 189 | 190 | def setClassDecompInfo(self, classindex, decompInfo): 191 | """sets the decomposition information of a class 192 | 193 | :param classindex: index of the class 194 | :type classindex: int 195 | :param decompInfo: decomposition information of the constraint class 196 | :type decompInfo: :class:`CONS_DECOMPINFO` 197 | """ 198 | self.consPartition.setClassDecompInfo(classindex, decompInfo) 199 | 200 | cdef class VarPart: 201 | """Base class holding a pointer to corresponding VarPartition""" 202 | 203 | @staticmethod 204 | cdef create(VarPartition* varPartition, DetProbData detProbData): 205 | if varPartition == NULL: 206 | raise Warning("cannot create VarPart with VarPartition* == NULL") 207 | new_VarPart = VarPart() 208 | new_VarPart.varPartition = varPartition 209 | new_VarPart.detProbData = detProbData 210 | return new_VarPart 211 | 212 | def getClassDescription(self, classindex): 213 | """returns the description of the class corresponding to the classindex 214 | 215 | :param classindex: index of the class 216 | :type classindex: int 217 | :return: description of the class 218 | :rtype: str 219 | """ 220 | return self.varPartition.getClassDescription(classindex).decode('utf-8') 221 | 222 | def getClassName(self, classindex): 223 | """returns the name of the class corresponding to the classindex 224 | 225 | :param classindex: index of the class 226 | :type classindex: int 227 | :return: name of the class 228 | :rtype: str 229 | """ 230 | return self.varPartition.getClassName(classindex).decode('utf-8') 231 | 232 | def getName(self): 233 | """returns the name of the variable partition 234 | 235 | :return: name of the constraint partition 236 | :rtype: str 237 | """ 238 | return self.varPartition.getName().decode('utf-8') 239 | 240 | def getNClasses(self): 241 | """returns the number of classes of the variable partition 242 | 243 | :return: number of classes 244 | :rtype: int 245 | """ 246 | return self.varPartition.getNClasses() 247 | 248 | def removeEmptyClasses(self): 249 | """removes all classes which do not have any assigned indices (classindices may change) 250 | 251 | :return: number of removed classes 252 | :rtype: int 253 | """ 254 | return self.varPartition.removeEmptyClasses() 255 | 256 | def setClassDescription(self, classindex, desc): 257 | """sets the description of the class corresponding to the classindex 258 | 259 | :param classindex: index of the class 260 | :type classindex: int 261 | :param desc: description of the class 262 | :type desc: str 263 | """ 264 | c_desc = str_conversion(desc) 265 | self.varPartition.setClassDescription(classindex, c_desc) 266 | 267 | def setClassName(self, classindex, name): 268 | """sets the name of the class corresponding to the classindex 269 | 270 | :param classindex: index of the class 271 | :type classindex: int 272 | :param name: name of the class 273 | :type name: str 274 | """ 275 | c_name = str_conversion(name) 276 | self.varPartition.setClassName(classindex, c_name) 277 | 278 | def addClass(self, name, desc, decompInfo): 279 | """adds a new class to the variable partition 280 | 281 | :param name: name of the class 282 | :type name: str 283 | :param desc: description of the class 284 | :type desc: str 285 | :param decompInfo: decomposition information of the variable class 286 | :type decompInfo: :class:`VAR_DECOMPINFO` 287 | :return: index of the added class 288 | :rtype: int 289 | """ 290 | c_name = str_conversion(name) 291 | c_desc = str_conversion(desc) 292 | return self.varPartition.addClass(c_name, c_desc, decompInfo) 293 | 294 | def assignVarToClass(self, Variable var, classindex): 295 | """assigns a variable to the class corresponding to the classindex 296 | 297 | :param var: variable that should be assigned to a class 298 | :type var: :class:`Variable` 299 | :param classindex: index of the class 300 | :type classindex: int 301 | """ 302 | cdef int cpp_varindex = self.detProbData.getIndexForVar(var) 303 | self.varPartition.assignVarToClass(cpp_varindex, classindex) 304 | 305 | def getAllSubsets(self, all, linking, master, block): 306 | """returns a list containing all possible subsets of the chosen classindices 307 | 308 | :param all: True iff PY_ALL classes should be considered 309 | :type all: bool 310 | :param linking: True iff PY_LINKING classes should be considered 311 | :type linking: bool 312 | :param master: True iff PY_MASTER classes should be considered 313 | :type master: bool 314 | :param block: True iff PY_BLOCK classes should be considered 315 | :type block: bool 316 | :return: list of lists containing all possible subsets of the chosen classindices 317 | :rtype: list 318 | """ 319 | return self.varPartition.getAllSubsets(all, linking, master, block) 320 | 321 | def getClassDecompInfo(self, classindex): 322 | """returns the decomposition information of a class 323 | 324 | :param classindex: index of the class 325 | :type classindex: int 326 | :return: decomposition information of the variable class 327 | :rtype: :class:`VAR_DECOMPINFO` 328 | """ 329 | return self.varPartition.getClassDecompInfo(classindex) 330 | 331 | def getClassNameOfVar(self, Variable var): 332 | """returns the name of the class a variable is assigned to 333 | 334 | :param var: variable 335 | :type var: :class:`Variable` 336 | :return: name of the class of the variable 337 | :rtype: str 338 | """ 339 | cdef int cpp_varindex = self.detProbData.getIndexForVar(var) 340 | return self.varPartition.getClassNameOfVar(cpp_varindex).decode('utf-8') 341 | 342 | def getClassOfVar(self, Variable var): 343 | """returns the index of the class a variable is assigned to 344 | 345 | :param var: variable 346 | :type var: :class:`Variable` 347 | :return: classindex of the variable 348 | :rtype: int 349 | """ 350 | cdef int cpp_varindex = self.detProbData.getIndexForVar(var) 351 | return self.varPartition.getClassOfVar(cpp_varindex) 352 | 353 | def getNVars(self): 354 | """returns the number of variables of the variable partition 355 | 356 | :return: number of variables 357 | :rtype: int 358 | """ 359 | return self.varPartition.getNVars() 360 | 361 | def getNVarsOfClasses(self): 362 | """returns list with the numbers of variables that are assigned to the classes 363 | 364 | :return: list with the numbers of variables that are assigned to the classes 365 | :rtype: list 366 | """ 367 | return self.varPartition.getNVarsOfClasses() 368 | 369 | def isVarClassified(self, Variable var): 370 | """returns whether a variable is already assigned to a class 371 | 372 | :param var: variable that should be checked if it is already assigned to a class 373 | :type var: :class:`Variable` 374 | :return: True iff variable is already assigned to a class 375 | :rtype: bool 376 | """ 377 | cdef int cpp_varindex = self.detProbData.getIndexForVar(var) 378 | return self.varPartition.isVarClassified(cpp_varindex) 379 | 380 | def reduceClasses(self, maxNumberOfClasses): 381 | """returns variable partition with reduced number of classes 382 | 383 | :param maxNumberOfClasses: maximal number of classes that are allowed 384 | :type maxNumberOfClasses: int 385 | :return: 386 | :rtype: :class:`VarPart` 387 | """ 388 | cdef VarPartition* result = self.varPartition.reduceClasses(maxNumberOfClasses) 389 | return VarPart.create(result, self.detProbData) 390 | 391 | def setClassDecompInfo(self, classindex, decompInfo): 392 | """sets the decomposition information of a class 393 | 394 | :param classindex: index of the class 395 | :type classindex: int 396 | :param decompInfo: decomposition information of the variable class 397 | :type decompInfo: :class:`VAR_DECOMPINFO` 398 | """ 399 | self.varPartition.setClassDecompInfo(classindex, decompInfo) 400 | -------------------------------------------------------------------------------- /src/pygcgopt/pricing_solver.pxi: -------------------------------------------------------------------------------- 1 | cdef class PricingSolver: 2 | """Base class of the Pricing Solver Plugin""" 3 | 4 | cdef public Model model 5 | cdef public str solvername 6 | 7 | def freeSolver(self): 8 | pass 9 | 10 | def initSolver(self): 11 | pass 12 | 13 | def exitSolver(self): 14 | pass 15 | 16 | def initSolution(self): 17 | pass 18 | 19 | def exitSolution(self): 20 | pass 21 | 22 | def updateSolver(self, pricingprob, probnr, varobjschanged, varbndschanged, consschanged): 23 | pass 24 | 25 | def solve(self, pricingprob, probnr, dualsolconv): 26 | return {} 27 | 28 | def solveHeuristic(self, pricingprob, probnr, dualsolconv): 29 | return {} 30 | 31 | 32 | cdef PricingSolver get_py_pricing_solver(GCG_SOLVER* pricingSolver) noexcept with gil: 33 | cdef GCG_SOLVERDATA* solverdata 34 | solverdata = GCGsolverGetData(pricingSolver) 35 | py_pricing_solver = solverdata 36 | return py_pricing_solver 37 | 38 | cdef SCIP_RETCODE PyPricingSolverFree (SCIP* scip, GCG_SOLVER* solver) noexcept with gil: 39 | py_pricing_solver = get_py_pricing_solver(solver) 40 | py_pricing_solver.freeSolver() 41 | Py_DECREF(py_pricing_solver) 42 | return SCIP_OKAY 43 | 44 | cdef SCIP_RETCODE PyPricingSolverInit (SCIP* scip, GCG_SOLVER* solver) noexcept with gil: 45 | py_pricing_solver = get_py_pricing_solver(solver) 46 | py_pricing_solver.initSolver() 47 | return SCIP_OKAY 48 | 49 | cdef SCIP_RETCODE PyPricingSolverExit (SCIP* scip, GCG_SOLVER* solver) noexcept with gil: 50 | py_pricing_solver = get_py_pricing_solver(solver) 51 | py_pricing_solver.exitSolver() 52 | return SCIP_OKAY 53 | 54 | cdef SCIP_RETCODE PyPricingSolverInitSol (SCIP* scip, GCG_SOLVER* solver) noexcept with gil: 55 | py_pricing_solver = get_py_pricing_solver(solver) 56 | py_pricing_solver.initSolution() 57 | return SCIP_OKAY 58 | 59 | cdef SCIP_RETCODE PyPricingSolverExitSol (SCIP* scip, GCG_SOLVER* solver) noexcept with gil: 60 | py_pricing_solver = get_py_pricing_solver(solver) 61 | py_pricing_solver.exitSolution() 62 | return SCIP_OKAY 63 | 64 | cdef SCIP_RETCODE PyPricingSolverUpdate (SCIP* pricingprob, GCG_SOLVER* solver, int probnr, SCIP_Bool varobjschanged, SCIP_Bool varbndschanged, SCIP_Bool consschanged) noexcept with gil: 65 | py_pricing_solver = get_py_pricing_solver(solver) 66 | py_pricingprob = GCGPricingModel.create(pricingprob) 67 | py_pricing_solver.updateSolver(py_pricingprob, probnr, varobjschanged, varbndschanged, consschanged) 68 | return SCIP_OKAY 69 | 70 | cdef SCIP_RETCODE PyPricingSolverSolve (SCIP* scip, SCIP* pricingprob, GCG_SOLVER* solver, int probnr, SCIP_Real dualsolconv, SCIP_Real* lowerbound, GCG_PRICINGSTATUS* status) noexcept with gil: 71 | py_pricing_solver = get_py_pricing_solver(solver) 72 | py_pricingprob = GCGPricingModel.create(pricingprob) 73 | result_dict = py_pricing_solver.solve(py_pricingprob, probnr, dualsolconv) 74 | lowerbound[0] = result_dict.get("lowerbound", 0) 75 | status[0] = result_dict.get("status", status[0]) 76 | return SCIP_OKAY 77 | 78 | cdef SCIP_RETCODE PyPricingSolverSolveHeur (SCIP* scip, SCIP* pricingprob, GCG_SOLVER* solver, int probnr, SCIP_Real dualsolconv, SCIP_Real* lowerbound, GCG_PRICINGSTATUS* status) noexcept with gil: 79 | py_pricing_solver = get_py_pricing_solver(solver) 80 | py_pricingprob = GCGPricingModel.create(pricingprob) 81 | result_dict = py_pricing_solver.solveHeuristic(py_pricingprob, probnr, dualsolconv) 82 | lowerbound[0] = result_dict.get("lowerbound", 0) 83 | status[0] = result_dict.get("status", status[0]) 84 | return SCIP_OKAY 85 | -------------------------------------------------------------------------------- /src/pygcgopt/score.pxi: -------------------------------------------------------------------------------- 1 | cdef class Score: 2 | """Base class of the Score Plugin""" 3 | 4 | cdef public Model model 5 | cdef public str scorename 6 | 7 | def scorefree(self): 8 | '''calls destructor and frees memory of score''' 9 | pass 10 | 11 | def scorecalculate(self, partialdec): 12 | '''calls calculate method of score''' 13 | return {} 14 | 15 | cdef SCIP_RETCODE PyScoreFree(SCIP* scip, GCG_SCORE* score) noexcept with gil: 16 | cdef GCG_SCOREDATA* scoredata 17 | scoredata = GCGscoreGetData(score) 18 | py_score = scoredata 19 | py_score.scorefree() 20 | Py_DECREF(py_score) 21 | return SCIP_OKAY 22 | 23 | cdef SCIP_RETCODE PyScoreCalculate(SCIP* scip, GCG_SCORE* score, int partialdecid, SCIP_Real* scorevalue) noexcept with gil: 24 | cdef GCG_SCOREDATA* scoredata 25 | scoredata = GCGscoreGetData(score) 26 | py_score = scoredata 27 | partialdec = py_score.model.getPartDecompFromID(partialdecid) 28 | result_dict = py_score.scorecalculate(partialdec) 29 | scorevalue[0] = result_dict.get("scorevalue", scorevalue[0]) 30 | return SCIP_OKAY 31 | -------------------------------------------------------------------------------- /src/pygcgopt/util.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | if sys.version_info >= (3, 0): 4 | str_conversion = lambda x:bytes(x,'utf-8') 5 | else: 6 | str_conversion = lambda x:x -------------------------------------------------------------------------------- /src/pygcgopt/varclassifier.pxi: -------------------------------------------------------------------------------- 1 | cdef class VarClassifier: 2 | """Base class of the Variable Classifier Plugin""" 3 | cdef public Model model 4 | cdef public str name 5 | 6 | def freeVarClassifier(self): 7 | '''calls destructor and frees memory of variable classifier''' 8 | pass 9 | 10 | def classify(self, vars, partition): 11 | return {} 12 | 13 | cdef SCIP_RETCODE PyVarClassifierFree(SCIP* scip, GCG_VARCLASSIFIER* varclassifier) noexcept with gil: 14 | cdef GCG_CLASSIFIERDATA* varclassifierdata 15 | varclassifierdata = GCGvarClassifierGetData(varclassifier) 16 | py_varclassifier = varclassifierdata 17 | py_varclassifier.freeVarClassifier() 18 | Py_DECREF(py_varclassifier) 19 | return SCIP_OKAY 20 | 21 | cdef SCIP_RETCODE PyVarClassifierClassify(SCIP* scip, GCG_VARCLASSIFIER* varclassifier, SCIP_Bool transformed) noexcept with gil: 22 | cdef GCG_CLASSIFIERDATA* varclassifierdata 23 | varclassifierdata = GCGvarClassifierGetData(varclassifier) 24 | py_varclassifier = varclassifierdata 25 | if transformed: 26 | detprobdata = py_varclassifier.model.getDetprobdataPresolved() 27 | else: 28 | detprobdata = py_varclassifier.model.getDetprobdataOrig() 29 | vars = detprobdata.getRelevantVars() 30 | partition = detprobdata.createVarPart(py_varclassifier.name, 0, len(vars)) 31 | py_varclassifier.classify(vars, partition) 32 | print("Varclassifier {0} yields a classification with {1} different variable classes".format(partition.getName(), partition.getNClasses())) 33 | detprobdata.addVarPartition(partition) 34 | return SCIP_OKAY 35 | -------------------------------------------------------------------------------- /tests/instances_bpp/N1C1W4_M.BPP.dec: -------------------------------------------------------------------------------- 1 | PRESOLVED 2 | 1 3 | NBLOCKS 4 | 50 5 | BLOCK 1 6 | b_Capacity_1 7 | BLOCK 2 8 | b_Capacity_2 9 | BLOCK 3 10 | b_Capacity_3 11 | BLOCK 4 12 | b_Capacity_4 13 | BLOCK 5 14 | b_Capacity_5 15 | BLOCK 6 16 | b_Capacity_6 17 | BLOCK 7 18 | b_Capacity_7 19 | BLOCK 8 20 | b_Capacity_8 21 | BLOCK 9 22 | b_Capacity_9 23 | BLOCK 10 24 | b_Capacity_10 25 | BLOCK 11 26 | b_Capacity_11 27 | BLOCK 12 28 | b_Capacity_12 29 | BLOCK 13 30 | b_Capacity_13 31 | BLOCK 14 32 | b_Capacity_14 33 | BLOCK 15 34 | b_Capacity_15 35 | BLOCK 16 36 | b_Capacity_16 37 | BLOCK 17 38 | b_Capacity_17 39 | BLOCK 18 40 | b_Capacity_18 41 | BLOCK 19 42 | b_Capacity_19 43 | BLOCK 20 44 | b_Capacity_20 45 | BLOCK 21 46 | b_Capacity_21 47 | BLOCK 22 48 | b_Capacity_22 49 | BLOCK 23 50 | b_Capacity_23 51 | BLOCK 24 52 | b_Capacity_24 53 | BLOCK 25 54 | b_Capacity_25 55 | BLOCK 26 56 | b_Capacity_26 57 | BLOCK 27 58 | b_Capacity_27 59 | BLOCK 28 60 | b_Capacity_28 61 | BLOCK 29 62 | b_Capacity_29 63 | BLOCK 30 64 | b_Capacity_30 65 | BLOCK 31 66 | b_Capacity_31 67 | BLOCK 32 68 | b_Capacity_32 69 | BLOCK 33 70 | b_Capacity_33 71 | BLOCK 34 72 | b_Capacity_34 73 | BLOCK 35 74 | b_Capacity_35 75 | BLOCK 36 76 | b_Capacity_36 77 | BLOCK 37 78 | b_Capacity_37 79 | BLOCK 38 80 | b_Capacity_38 81 | BLOCK 39 82 | b_Capacity_39 83 | BLOCK 40 84 | b_Capacity_40 85 | BLOCK 41 86 | b_Capacity_41 87 | BLOCK 42 88 | b_Capacity_42 89 | BLOCK 43 90 | b_Capacity_43 91 | BLOCK 44 92 | b_Capacity_44 93 | BLOCK 45 94 | b_Capacity_45 95 | BLOCK 46 96 | b_Capacity_46 97 | BLOCK 47 98 | b_Capacity_47 99 | BLOCK 48 100 | b_Capacity_48 101 | BLOCK 49 102 | b_Capacity_49 103 | BLOCK 50 104 | b_Capacity_50 105 | MASTERCONSS 106 | m_Allocate_1 107 | m_Allocate_2 108 | m_Allocate_3 109 | m_Allocate_4 110 | m_Allocate_5 111 | m_Allocate_6 112 | m_Allocate_7 113 | m_Allocate_8 114 | m_Allocate_9 115 | m_Allocate_10 116 | m_Allocate_11 117 | m_Allocate_12 118 | m_Allocate_13 119 | m_Allocate_14 120 | m_Allocate_15 121 | m_Allocate_16 122 | m_Allocate_17 123 | m_Allocate_18 124 | m_Allocate_19 125 | m_Allocate_20 126 | m_Allocate_21 127 | m_Allocate_22 128 | m_Allocate_23 129 | m_Allocate_24 130 | m_Allocate_25 131 | m_Allocate_26 132 | m_Allocate_27 133 | m_Allocate_28 134 | m_Allocate_29 135 | m_Allocate_30 136 | m_Allocate_31 137 | m_Allocate_32 138 | m_Allocate_33 139 | m_Allocate_34 140 | m_Allocate_35 141 | m_Allocate_36 142 | m_Allocate_37 143 | m_Allocate_38 144 | m_Allocate_39 145 | m_Allocate_40 146 | m_Allocate_41 147 | m_Allocate_42 148 | m_Allocate_43 149 | m_Allocate_44 150 | m_Allocate_45 151 | m_Allocate_46 152 | m_Allocate_47 153 | m_Allocate_48 154 | m_Allocate_49 155 | m_Allocate_50 156 | -------------------------------------------------------------------------------- /tests/instances_bpp/N1C2W2_O.BPP.dec: -------------------------------------------------------------------------------- 1 | PRESOLVED 2 | 0 3 | NBLOCKS 4 | 50 5 | BLOCK 1 6 | b_Capacity_1 7 | BLOCK 2 8 | b_Capacity_2 9 | BLOCK 3 10 | b_Capacity_3 11 | BLOCK 4 12 | b_Capacity_4 13 | BLOCK 5 14 | b_Capacity_5 15 | BLOCK 6 16 | b_Capacity_6 17 | BLOCK 7 18 | b_Capacity_7 19 | BLOCK 8 20 | b_Capacity_8 21 | BLOCK 9 22 | b_Capacity_9 23 | BLOCK 10 24 | b_Capacity_10 25 | BLOCK 11 26 | b_Capacity_11 27 | BLOCK 12 28 | b_Capacity_12 29 | BLOCK 13 30 | b_Capacity_13 31 | BLOCK 14 32 | b_Capacity_14 33 | BLOCK 15 34 | b_Capacity_15 35 | BLOCK 16 36 | b_Capacity_16 37 | BLOCK 17 38 | b_Capacity_17 39 | BLOCK 18 40 | b_Capacity_18 41 | BLOCK 19 42 | b_Capacity_19 43 | BLOCK 20 44 | b_Capacity_20 45 | BLOCK 21 46 | b_Capacity_21 47 | BLOCK 22 48 | b_Capacity_22 49 | BLOCK 23 50 | b_Capacity_23 51 | BLOCK 24 52 | b_Capacity_24 53 | BLOCK 25 54 | b_Capacity_25 55 | BLOCK 26 56 | b_Capacity_26 57 | BLOCK 27 58 | b_Capacity_27 59 | BLOCK 28 60 | b_Capacity_28 61 | BLOCK 29 62 | b_Capacity_29 63 | BLOCK 30 64 | b_Capacity_30 65 | BLOCK 31 66 | b_Capacity_31 67 | BLOCK 32 68 | b_Capacity_32 69 | BLOCK 33 70 | b_Capacity_33 71 | BLOCK 34 72 | b_Capacity_34 73 | BLOCK 35 74 | b_Capacity_35 75 | BLOCK 36 76 | b_Capacity_36 77 | BLOCK 37 78 | b_Capacity_37 79 | BLOCK 38 80 | b_Capacity_38 81 | BLOCK 39 82 | b_Capacity_39 83 | BLOCK 40 84 | b_Capacity_40 85 | BLOCK 41 86 | b_Capacity_41 87 | BLOCK 42 88 | b_Capacity_42 89 | BLOCK 43 90 | b_Capacity_43 91 | BLOCK 44 92 | b_Capacity_44 93 | BLOCK 45 94 | b_Capacity_45 95 | BLOCK 46 96 | b_Capacity_46 97 | BLOCK 47 98 | b_Capacity_47 99 | BLOCK 48 100 | b_Capacity_48 101 | BLOCK 49 102 | b_Capacity_49 103 | BLOCK 50 104 | b_Capacity_50 105 | MASTERCONSS 106 | m_Allocate_1 107 | m_Allocate_2 108 | m_Allocate_3 109 | m_Allocate_4 110 | m_Allocate_5 111 | m_Allocate_6 112 | m_Allocate_7 113 | m_Allocate_8 114 | m_Allocate_9 115 | m_Allocate_10 116 | m_Allocate_11 117 | m_Allocate_12 118 | m_Allocate_13 119 | m_Allocate_14 120 | m_Allocate_15 121 | m_Allocate_16 122 | m_Allocate_17 123 | m_Allocate_18 124 | m_Allocate_19 125 | m_Allocate_20 126 | m_Allocate_21 127 | m_Allocate_22 128 | m_Allocate_23 129 | m_Allocate_24 130 | m_Allocate_25 131 | m_Allocate_26 132 | m_Allocate_27 133 | m_Allocate_28 134 | m_Allocate_29 135 | m_Allocate_30 136 | m_Allocate_31 137 | m_Allocate_32 138 | m_Allocate_33 139 | m_Allocate_34 140 | m_Allocate_35 141 | m_Allocate_36 142 | m_Allocate_37 143 | m_Allocate_38 144 | m_Allocate_39 145 | m_Allocate_40 146 | m_Allocate_41 147 | m_Allocate_42 148 | m_Allocate_43 149 | m_Allocate_44 150 | m_Allocate_45 151 | m_Allocate_46 152 | m_Allocate_47 153 | m_Allocate_48 154 | m_Allocate_49 155 | m_Allocate_50 156 | -------------------------------------------------------------------------------- /tests/test_classifier.py: -------------------------------------------------------------------------------- 1 | from pygcgopt import Model, ConsClassifier, VarClassifier, CONS_DECOMPINFO, VAR_DECOMPINFO, quicksum 2 | import pytest 3 | 4 | class PyConsClassifier(ConsClassifier): 5 | def classify(self, conss, partition): 6 | partition.addClass("demand", "demand conss", CONS_DECOMPINFO.PY_ONLY_PRICING) 7 | partition.addClass("others", "other conss", CONS_DECOMPINFO.PY_ONLY_MASTER) 8 | 9 | for i in conss: 10 | if i.name[0:6] == "demand": 11 | partition.assignConsToClass(i, 0) 12 | else: 13 | partition.assignConsToClass(i, 1) 14 | 15 | class PyVarClassifier(VarClassifier): 16 | def classify(self, vars, partition): 17 | partition.addClass("x", "first x", VAR_DECOMPINFO.PY_BLOCK) 18 | partition.addClass("others", "first other", VAR_DECOMPINFO.PY_MASTER) 19 | 20 | for i in vars: 21 | if i.name[0] == "x": 22 | partition.assignVarToClass(i, 0) 23 | else: 24 | partition.assignVarToClass(i, 1) 25 | 26 | # taken from https://github.com/scipopt/PySCIPOpt/blob/master/examples/unfinished/cutstock.py 27 | def cuttingStockExample1(): 28 | B = 110 # roll width (bin size) 29 | w = [20,45,50,55,75] # width (size) of orders (items) 30 | q = [48,35,24,10,8] # quantitiy of orders 31 | return w, q, B 32 | 33 | def cuttingStockExample2(): 34 | B = 9 # roll width (bin size) 35 | w = [2,3,4,5,6,7,8] # width (size) of orders (items) 36 | q = [4,2,6,6,2,2,2] # quantitiy of orders 37 | return w, q, B 38 | 39 | def createCuttingStockModel(width, widths, quantities, ndemands, nrolls): 40 | model = Model() 41 | 42 | x = {} 43 | y = {} 44 | 45 | demands = {} 46 | capacities = {} 47 | 48 | for i in range(ndemands): 49 | for j in range(nrolls): 50 | x[i, j] = model.addVar(vtype="I", name="x_%s_%s"%(i,j)) 51 | 52 | for j in range(nrolls): 53 | y[j] = model.addVar(vtype="B", name="y_%s"%j) 54 | 55 | for i in range(ndemands): 56 | demands[i] = model.addCons(quicksum(x[i, j] for j in range(nrolls)) >= quantities[i], "demand_%s" % i) 57 | 58 | for j in range(nrolls): 59 | capacities[j] = model.addCons(quicksum(widths[i] * x[i, j] for i in range(ndemands)) <= width * y[j], "capacity_%s" % j) 60 | 61 | model.setObjective(quicksum(y[j] for j in range(nrolls)), "minimize") 62 | 63 | return model, demands, capacities, x, y 64 | 65 | @pytest.mark.parametrize("cuttingstockexample", [ 66 | cuttingStockExample1, 67 | cuttingStockExample2 68 | ]) 69 | def test_classify(cuttingstockexample): 70 | widths, quantities, width = cuttingstockexample() 71 | model, demands, capacities, x, y = createCuttingStockModel(width, widths, quantities, len(widths), sum(quantities)) 72 | 73 | for i in model.listConsClassifiers(): 74 | model.setBoolParam("detection/classification/consclassifier/{}/enabled".format(i), False) 75 | for i in model.listVarClassifiers(): 76 | model.setBoolParam("detection/classification/varclassifier/{}/enabled".format(i), False) 77 | 78 | pyConsClassifier = PyConsClassifier() 79 | model.includeConsClassifier(pyConsClassifier, "pyconsclassifier", "classify by constraint name") 80 | assert "pyconsclassifier" in model.listConsClassifiers() 81 | 82 | pyVarClassifier = PyVarClassifier() 83 | model.includeVarClassifier(pyVarClassifier, "pyvarclassifier", "classify by variable name") 84 | assert "pyvarclassifier" in model.listVarClassifiers() 85 | 86 | model.setIntParam("presolving/maxrounds", 0) 87 | 88 | model.detect() 89 | 90 | detprobdata = model.getDetprobdataOrig() 91 | assert detprobdata.getNVarPartitions() == 1 92 | assert detprobdata.getNConsPartitions() == 1 93 | 94 | # asserts for varpart 95 | varpartition = detprobdata.getVarPartitions()[0] 96 | assert varpartition.getName() == "pyvarclassifier" 97 | assert varpartition.getNClasses() == 2 98 | 99 | # asserts of first class of varpart 100 | assert varpartition.getClassName(0) == "x" 101 | assert varpartition.getClassDescription(0) == "first x" 102 | assert varpartition.getClassDecompInfo(0) == VAR_DECOMPINFO.PY_BLOCK 103 | assert varpartition.getNVarsOfClasses()[0] == len(widths) * sum(quantities) 104 | 105 | for i in range(len(widths)): 106 | for j in range(sum(quantities)): 107 | assert varpartition.getClassOfVar(x[i, j]) == 0 108 | assert varpartition.getClassNameOfVar(x[i, j]) == "x" 109 | 110 | # asserts of second class of varpart 111 | assert varpartition.getClassName(1) == "others" 112 | assert varpartition.getClassDescription(1) == "first other" 113 | assert varpartition.getClassDecompInfo(1) == VAR_DECOMPINFO.PY_MASTER 114 | assert varpartition.getNVarsOfClasses()[1] == sum(quantities) 115 | 116 | for j in range(sum(quantities)): 117 | assert varpartition.getClassOfVar(y[j]) == 1 118 | assert varpartition.getClassNameOfVar(y[j]) == "others" 119 | 120 | # asserts for conspart 121 | conspartition = detprobdata.getConsPartitions()[0] 122 | assert conspartition.getName() == "pyconsclassifier" 123 | assert conspartition.getNClasses() == 2 124 | 125 | # asserts of first class of conspart 126 | assert conspartition.getClassName(0) == "demand" 127 | assert conspartition.getClassDescription(0) == "demand conss" 128 | assert conspartition.getClassDecompInfo(0) == CONS_DECOMPINFO.PY_ONLY_PRICING 129 | assert conspartition.getNConssOfClasses()[0] == len(demands) 130 | 131 | for i in range(len(demands)): 132 | assert conspartition.getClassOfCons(demands[i]) == 0 133 | assert conspartition.getClassNameOfCons(demands[i]) == "demand" 134 | 135 | # asserts of second class of conspart 136 | assert conspartition.getClassName(1) == "others" 137 | assert conspartition.getClassDescription(1) == "other conss" 138 | assert conspartition.getClassDecompInfo(1) == CONS_DECOMPINFO.PY_ONLY_MASTER 139 | assert conspartition.getNConssOfClasses()[1] == len(capacities) 140 | 141 | for j in range(len(capacities)): 142 | assert conspartition.getClassOfCons(capacities[j]) == 1 143 | assert conspartition.getClassNameOfCons(capacities[j]) == "others" 144 | -------------------------------------------------------------------------------- /tests/test_score.py: -------------------------------------------------------------------------------- 1 | from pygcgopt import Model, Score 2 | 3 | import pytest 4 | 5 | import os 6 | 7 | class PyScore(Score): 8 | def scorecalculate(self, partialdec): 9 | nmasterconss = float(partialdec.getNMasterconss()) 10 | nconss = float(partialdec.getNConss()) 11 | score = 1 - nmasterconss/nconss 12 | 13 | return {"scorevalue": score} 14 | 15 | @pytest.mark.parametrize("lp_file", [ 16 | "instances_bpp/N1C1W4_M.BPP.lp", "instances_bpp/N1C2W2_O.BPP.lp" 17 | ]) 18 | def test_score(lp_file): 19 | dirname = os.path.dirname(__file__) 20 | lp_file = os.path.join(dirname, lp_file) 21 | 22 | m = Model() 23 | 24 | proxyScore = PyScore() 25 | m.includeScore(proxyScore, "pyscore", "python", "Python score test") 26 | assert "pyscore" in m.listScores() 27 | 28 | m.readProblem(lp_file) 29 | m.detect() 30 | 31 | partdecs = m.listDecompositions() 32 | 33 | for partdec in partdecs: 34 | assert partdec.getScore(proxyScore) == 1 - float(partdec.getNMasterconss())/float(partdec.getNConss()) 35 | --------------------------------------------------------------------------------