backport from main branch

This commit is contained in:
Mizux Seiha
2025-05-12 12:57:50 +02:00
parent 99f94edb47
commit 4c60a56fa3
18 changed files with 1792 additions and 924 deletions

13
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,13 @@
# Keep GitHub Actions up to date with GitHub's Dependabot...
# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem
version: 2
updates:
- package-ecosystem: github-actions
directory: /
groups:
github-actions:
patterns:
- "*" # Group all Actions updates into a single larger pull request
schedule:
interval: weekly

View File

@@ -43,7 +43,7 @@
[windows_dotnet_svg]: ./../../../actions/workflows/amd64_windows_cmake_dotnet.yml/badge.svg?branch=main
[windows_dotnet_link]: ./../../../actions/workflows/amd64_windows_cmake_dotnet.yml
Dockers \[Alpine, Archlinux, Centos, Debian, Fedora, OpenSuse, Ubuntu\]x
Dockers \[AlmaLinux, Alpine, Archlinux, Debian, Fedora, OpenSuse, RockyLinux, Ubuntu\]x
\[C++, Python, Java, .Net\]: [![Status][docker_svg]][docker_link]
[docker_svg]: ./../../../actions/workflows/amd64_docker_cmake.yml/badge.svg?branch=main

View File

@@ -6,11 +6,11 @@ RUN apt-get update -qq \
python3-dev python3-pip \
python3-setuptools python3-wheel \
python3-venv python3-virtualenv \
python3-numpy python3-pandas python3-typing-extensions \
python3-numpy python3-pandas \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN python3 -m pip install --break-system-package \
absl-py mypy mypy-protobuf
absl-py mypy mypy-protobuf typing-extensions
FROM env AS devel
WORKDIR /home/project

View File

@@ -18,13 +18,14 @@ COPY . .
FROM devel AS build
RUN emcmake cmake -S. -Bbuild \
-DCMAKE_BUILD_TYPE=Release -DBUILD_DEPS=ON \
-DBUILD_TESTING=OFF \
-DBUILD_EXAMPLES=OFF \
-DUSE_COINOR=OFF \
-DUSE_GLPK=OFF \
-DUSE_HIGHS=OFF \
-DUSE_PDLP=OFF \
-DUSE_SCIP=OFF
RUN cmake --build build --target all -v
RUN cmake --build build --target all -v -j 4
#RUN cmake --build build --target install -v
FROM build AS test

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -1,329 +1,528 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: CMakeDeps Pages: 1 -->
<svg width="1743pt" height="622pt"
viewBox="0.00 0.00 1743.00 622.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 618)">
<svg width="3111pt" height="657pt"
viewBox="0.00 0.00 3111.00 656.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 652.75)">
<title>CMakeDeps</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-618 1739,-618 1739,4 -4,4"/>
<polygon fill="white" stroke="none" points="-4,4 -4,-652.75 3107,-652.75 3107,4 -4,4"/>
<g id="clust1" class="cluster">
<title>clusterZLIB</title>
<polygon fill="none" stroke="royalblue" points="205,-171 205,-246 387,-246 387,-171 205,-171"/>
<text text-anchor="middle" x="296" y="-230.8" font-family="Times,serif" font-size="14.00">madler/zlib.git + cmake patch</text>
<polygon fill="none" stroke="royalblue" points="553,-227.75 553,-305 784,-305 784,-227.75 553,-227.75"/>
<text text-anchor="middle" x="668.5" y="-235.7" font-family="Times,serif" font-size="14.00">madler/zlib.git + cmake patch</text>
</g>
<g id="clust2" class="cluster">
<title>clusterAbsl</title>
<polygon fill="none" stroke="royalblue" points="72,-171 72,-246 197,-246 197,-171 72,-171"/>
<text text-anchor="middle" x="134.5" y="-230.8" font-family="Times,serif" font-size="14.00">abseil/abseil&#45;cpp.git</text>
<title>clusterBZip2</title>
<polygon fill="none" stroke="royalblue" points="2010,-41.25 2010,-118.5 2243,-118.5 2243,-41.25 2010,-41.25"/>
<text text-anchor="middle" x="2126.5" y="-49.2" font-family="Times,serif" font-size="14.00">bzip2/bzip2.git + cmake patch</text>
</g>
<g id="clust3" class="cluster">
<title>clusterProtobuf</title>
<polygon fill="none" stroke="royalblue" points="8,-88 8,-163 279,-163 279,-88 8,-88"/>
<text text-anchor="middle" x="143.5" y="-147.8" font-family="Times,serif" font-size="14.00">protocolbuffers/protobuf.git</text>
<title>clusterAbsl</title>
<polygon fill="none" stroke="royalblue" points="1154,-313 1154,-390.25 1312,-390.25 1312,-313 1154,-313"/>
<text text-anchor="middle" x="1233" y="-320.95" font-family="Times,serif" font-size="14.00">abseil/abseil&#45;cpp.git</text>
</g>
<g id="clust4" class="cluster">
<title>clusterRe2</title>
<polygon fill="none" stroke="royalblue" points="789,-500 789,-575 881,-575 881,-500 789,-500"/>
<text text-anchor="middle" x="835" y="-559.8" font-family="Times,serif" font-size="14.00">google/re2.git</text>
<title>clusterProtobuf</title>
<polygon fill="none" stroke="royalblue" points="1142,-134.5 1142,-211.75 1474,-211.75 1474,-134.5 1142,-134.5"/>
<text text-anchor="middle" x="1308" y="-142.45" font-family="Times,serif" font-size="14.00">protocolbuffers/protobuf.git</text>
</g>
<g id="clust5" class="cluster">
<title>clusterEigen3</title>
<polygon fill="none" stroke="royalblue" points="889,-500 889,-575 1000,-575 1000,-500 889,-500"/>
<text text-anchor="middle" x="944.5" y="-559.8" font-family="Times,serif" font-size="14.00">libeigen/eigen.git</text>
<title>clusterRe2</title>
<polygon fill="none" stroke="royalblue" points="1084,-227.75 1084,-305 1199,-305 1199,-227.75 1084,-227.75"/>
<text text-anchor="middle" x="1141.5" y="-235.7" font-family="Times,serif" font-size="14.00">google/re2.git</text>
</g>
<g id="clust6" class="cluster">
<title>clusterPybind11</title>
<polygon fill="none" stroke="royalblue" points="1008,-500 1008,-575 1150,-575 1150,-500 1008,-500"/>
<text text-anchor="middle" x="1079" y="-559.8" font-family="Times,serif" font-size="14.00">pybind/pybind11.git</text>
<title>clusterEigen3</title>
<polygon fill="none" stroke="royalblue" points="2251,-41.25 2251,-118.5 2391,-118.5 2391,-41.25 2251,-41.25"/>
<text text-anchor="middle" x="2321" y="-49.2" font-family="Times,serif" font-size="14.00">libeigen/eigen.git</text>
</g>
<g id="clust7" class="cluster">
<title>clusterCoinOR</title>
<polygon fill="none" stroke="royalblue" points="395,-8 395,-606 781,-606 781,-8 395,-8"/>
<text text-anchor="middle" x="588" y="-590.8" font-family="Times,serif" font-size="14.00">&#45;DUSE_COINOR=ON AND &#45;DBUILD_DEPS=ON</text>
<polygon fill="none" stroke="royalblue" points="8,-8 8,-640.75 414,-640.75 414,-8 8,-8"/>
<text text-anchor="middle" x="211" y="-15.95" font-family="Times,serif" font-size="14.00">&#45;DUSE_COINOR=ON AND &#45;DBUILD_DEPS=ON</text>
</g>
<g id="clust8" class="cluster">
<title>clusterCoinUtils</title>
<polygon fill="none" stroke="royalblue" points="619,-500 619,-575 746,-575 746,-500 619,-500"/>
<text text-anchor="middle" x="682.5" y="-559.8" font-family="Times,serif" font-size="14.00">Mizux/CoinUtils.git</text>
<polygon fill="none" stroke="royalblue" points="234,-555.5 234,-632.75 388,-632.75 388,-555.5 234,-555.5"/>
<text text-anchor="middle" x="311" y="-563.45" font-family="Times,serif" font-size="14.00">Mizux/CoinUtils.git</text>
</g>
<g id="clust9" class="cluster">
<title>clusterOsi</title>
<polygon fill="none" stroke="royalblue" points="610,-409 610,-484 703,-484 703,-409 610,-409"/>
<text text-anchor="middle" x="656.5" y="-468.8" font-family="Times,serif" font-size="14.00">Mizux/Osi.git</text>
<polygon fill="none" stroke="royalblue" points="31,-470.25 31,-547.5 142,-547.5 142,-470.25 31,-470.25"/>
<text text-anchor="middle" x="86.5" y="-478.2" font-family="Times,serif" font-size="14.00">Mizux/Osi.git</text>
</g>
<g id="clust10" class="cluster">
<title>clusterClp</title>
<polygon fill="none" stroke="royalblue" points="455,-254 455,-401 683,-401 683,-254 455,-254"/>
<text text-anchor="middle" x="569" y="-385.8" font-family="Times,serif" font-size="14.00">Mizux/Clp.git</text>
<polygon fill="none" stroke="royalblue" points="68,-313 68,-462.25 334,-462.25 334,-313 68,-313"/>
<text text-anchor="middle" x="201" y="-320.95" font-family="Times,serif" font-size="14.00">Mizux/Clp.git</text>
</g>
<g id="clust11" class="cluster">
<title>clusterCgl</title>
<polygon fill="none" stroke="royalblue" points="606,-171 606,-246 700,-246 700,-171 606,-171"/>
<text text-anchor="middle" x="653" y="-230.8" font-family="Times,serif" font-size="14.00">Mizux/Cgl.git</text>
<polygon fill="none" stroke="royalblue" points="159,-227.75 159,-305 271,-305 271,-227.75 159,-227.75"/>
<text text-anchor="middle" x="215" y="-235.7" font-family="Times,serif" font-size="14.00">Mizux/Cgl.git</text>
</g>
<g id="clust12" class="cluster">
<title>clusterCbc</title>
<polygon fill="none" stroke="royalblue" points="403,-16 403,-163 635,-163 635,-16 403,-16"/>
<text text-anchor="middle" x="519" y="-147.8" font-family="Times,serif" font-size="14.00">Mizux/Cbc.git</text>
<polygon fill="none" stroke="royalblue" points="134,-41.25 134,-211.75 406,-211.75 406,-41.25 134,-41.25"/>
<text text-anchor="middle" x="270" y="-49.2" font-family="Times,serif" font-size="14.00">Mizux/Cbc.git</text>
</g>
<g id="clust13" class="cluster">
<title>clusterGLPKSolver</title>
<polygon fill="none" stroke="royalblue" points="1158,-492 1158,-606 1445,-606 1445,-492 1158,-492"/>
<text text-anchor="middle" x="1301.5" y="-590.8" font-family="Times,serif" font-size="14.00">&#45;DUSE_GLPK=ON AND &#45;DBUILD_GLPK=ON</text>
<polygon fill="none" stroke="royalblue" points="2399,-8 2399,-126.5 2733,-126.5 2733,-8 2399,-8"/>
<text text-anchor="middle" x="2566" y="-15.95" font-family="Times,serif" font-size="14.00">&#45;DUSE_GLPK=ON AND &#45;DBUILD_GLPK=ON</text>
</g>
<g id="clust14" class="cluster">
<title>clusterGLPK</title>
<polygon fill="none" stroke="royalblue" points="1246,-500 1246,-575 1356,-575 1356,-500 1246,-500"/>
<text text-anchor="middle" x="1301" y="-559.8" font-family="Times,serif" font-size="14.00">Mizux/GLPK.git</text>
<polygon fill="none" stroke="royalblue" points="2502,-41.25 2502,-118.5 2630,-118.5 2630,-41.25 2502,-41.25"/>
<text text-anchor="middle" x="2566" y="-49.2" font-family="Times,serif" font-size="14.00">Mizux/GLPK.git</text>
</g>
<g id="clust15" class="cluster">
<title>clusterSCIPSolver</title>
<polygon fill="none" stroke="royalblue" points="1453,-492 1453,-606 1727,-606 1727,-492 1453,-492"/>
<text text-anchor="middle" x="1590" y="-590.8" font-family="Times,serif" font-size="14.00">&#45;DUSE_SCIP=ON AND &#45;DBUILD_SCIP=ON</text>
<title>clusterHIGHSSolver</title>
<polygon fill="none" stroke="royalblue" points="2741,-8 2741,-126.5 3095,-126.5 3095,-8 2741,-8"/>
<text text-anchor="middle" x="2918" y="-15.95" font-family="Times,serif" font-size="14.00">&#45;DUSE_HIGHS=ON AND &#45;DBUILD_HIGHS=ON</text>
</g>
<g id="clust16" class="cluster">
<title>clusterHIGHS</title>
<polygon fill="none" stroke="royalblue" points="2828,-41.25 2828,-118.5 3007,-118.5 3007,-41.25 2828,-41.25"/>
<text text-anchor="middle" x="2917.5" y="-49.2" font-family="Times,serif" font-size="14.00">ERGO&#45;Code/HIGHS.git</text>
</g>
<g id="clust17" class="cluster">
<title>clusterSCIPSolver</title>
<polygon fill="none" stroke="royalblue" points="422,-8 422,-219.75 746,-219.75 746,-8 422,-8"/>
<text text-anchor="middle" x="584" y="-15.95" font-family="Times,serif" font-size="14.00">&#45;DUSE_SCIP=ON AND &#45;DBUILD_SCIP=ON</text>
</g>
<g id="clust18" class="cluster">
<title>clusterSoplex</title>
<polygon fill="none" stroke="royalblue" points="503,-134.5 503,-211.75 645,-211.75 645,-134.5 503,-134.5"/>
<text text-anchor="middle" x="574" y="-142.45" font-family="Times,serif" font-size="14.00">scipopt/soplex.git</text>
</g>
<g id="clust19" class="cluster">
<title>clusterSCIP</title>
<polygon fill="none" stroke="royalblue" points="1540,-500 1540,-575 1639,-575 1639,-500 1540,-500"/>
<text text-anchor="middle" x="1589.5" y="-559.8" font-family="Times,serif" font-size="14.00">scipopt/scip.git</text>
<polygon fill="none" stroke="royalblue" points="568,-41.25 568,-118.5 692,-118.5 692,-41.25 568,-41.25"/>
<text text-anchor="middle" x="630" y="-49.2" font-family="Times,serif" font-size="14.00">scipopt/scip.git</text>
</g>
<g id="clust20" class="cluster">
<title>clusterTesting</title>
<polygon fill="none" stroke="royalblue" points="754,-8 754,-219.75 1134,-219.75 1134,-8 754,-8"/>
<text text-anchor="middle" x="944" y="-15.95" font-family="Times,serif" font-size="14.00">&#45;DBUILD_TESTING=ON</text>
</g>
<g id="clust21" class="cluster">
<title>clusterGTest</title>
<polygon fill="none" stroke="royalblue" points="937,-134.5 937,-211.75 1103,-211.75 1103,-134.5 937,-134.5"/>
<text text-anchor="middle" x="1020" y="-142.45" font-family="Times,serif" font-size="14.00">google/googletest.git</text>
</g>
<g id="clust22" class="cluster">
<title>clusterBenchmark</title>
<polygon fill="none" stroke="royalblue" points="762,-41.25 762,-118.5 962,-118.5 962,-41.25 762,-41.25"/>
<text text-anchor="middle" x="862" y="-49.2" font-family="Times,serif" font-size="14.00">google/benchmark.git</text>
</g>
<g id="clust23" class="cluster">
<title>clusterFuzzTest</title>
<polygon fill="none" stroke="royalblue" points="970,-41.25 970,-118.5 1126,-118.5 1126,-41.25 970,-41.25"/>
<text text-anchor="middle" x="1048" y="-49.2" font-family="Times,serif" font-size="14.00">google/fuzztest.git</text>
</g>
<g id="clust24" class="cluster">
<title>clusterPython</title>
<polygon fill="none" stroke="gold" points="1512,-8 1512,-219.75 2002,-219.75 2002,-8 1512,-8"/>
<text text-anchor="middle" x="1757" y="-15.95" font-family="Times,serif" font-size="14.00">&#45;DBUILD_PYTHON=ON</text>
</g>
<g id="clust25" class="cluster">
<title>clusterPybind11</title>
<polygon fill="none" stroke="gold" points="1674,-134.5 1674,-211.75 1848,-211.75 1848,-134.5 1674,-134.5"/>
<text text-anchor="middle" x="1761" y="-142.45" font-family="Times,serif" font-size="14.00">pybind/pybind11.git</text>
</g>
<g id="clust26" class="cluster">
<title>clusterPybind11Absl</title>
<polygon fill="none" stroke="gold" points="1770,-41.25 1770,-118.5 1994,-118.5 1994,-41.25 1770,-41.25"/>
<text text-anchor="middle" x="1882" y="-49.2" font-family="Times,serif" font-size="14.00">pybind/pybind11_abseil.git</text>
</g>
<g id="clust27" class="cluster">
<title>clusterPybind11Protobuf</title>
<polygon fill="none" stroke="gold" points="1520,-41.25 1520,-118.5 1762,-118.5 1762,-41.25 1520,-41.25"/>
<text text-anchor="middle" x="1641" y="-49.2" font-family="Times,serif" font-size="14.00">pybind/pybind11_protobuf.git</text>
</g>
<!-- ZLIB -->
<g id="node1" class="node">
<title>ZLIB</title>
<path fill="royalblue" stroke="royalblue" d="M292,-215C292,-215 232,-215 232,-215 226,-215 220,-209 220,-203 220,-203 220,-191 220,-191 220,-185 226,-179 232,-179 232,-179 292,-179 292,-179 298,-179 304,-185 304,-191 304,-191 304,-203 304,-203 304,-209 298,-215 292,-215"/>
<text text-anchor="middle" x="262" y="-193.3" font-family="Times,serif" font-size="14.00">ZLIB::ZLIB</text>
<path fill="royalblue" stroke="royalblue" d="M665,-297C665,-297 595,-297 595,-297 589,-297 583,-291 583,-285 583,-285 583,-273 583,-273 583,-267 589,-261 595,-261 595,-261 665,-261 665,-261 671,-261 677,-267 677,-273 677,-273 677,-285 677,-285 677,-291 671,-297 665,-297"/>
<text text-anchor="middle" x="630" y="-274.32" font-family="Times,serif" font-size="14.00">ZLIB::ZLIB</text>
</g>
<!-- Protobuf -->
<g id="node3" class="node">
<title>Protobuf</title>
<path fill="royalblue" stroke="royalblue" d="M258.5,-132C258.5,-132 151.5,-132 151.5,-132 145.5,-132 139.5,-126 139.5,-120 139.5,-120 139.5,-108 139.5,-108 139.5,-102 145.5,-96 151.5,-96 151.5,-96 258.5,-96 258.5,-96 264.5,-96 270.5,-102 270.5,-108 270.5,-108 270.5,-120 270.5,-120 270.5,-126 264.5,-132 258.5,-132"/>
<text text-anchor="middle" x="205" y="-110.3" font-family="Times,serif" font-size="14.00">protobuf::libprotobuf</text>
</g>
<!-- ZLIB&#45;&gt;Protobuf -->
<g id="edge19" class="edge">
<title>ZLIB&#45;&gt;Protobuf</title>
<path fill="none" stroke="black" d="M249.91,-178.82C242.05,-167.65 231.67,-152.9 222.86,-140.38"/>
<polygon fill="black" stroke="black" points="225.69,-138.32 217.07,-132.15 219.96,-142.35 225.69,-138.32"/>
</g>
<!-- Cbc -->
<g id="node14" class="node">
<title>Cbc</title>
<path fill="royalblue" stroke="royalblue" d="M471,-132C471,-132 423,-132 423,-132 417,-132 411,-126 411,-120 411,-120 411,-108 411,-108 411,-102 417,-96 423,-96 423,-96 471,-96 471,-96 477,-96 483,-102 483,-108 483,-108 483,-120 483,-120 483,-126 477,-132 471,-132"/>
<text text-anchor="middle" x="447" y="-110.3" font-family="Times,serif" font-size="14.00">Coin::Cbc</text>
</g>
<!-- ZLIB&#45;&gt;Cbc -->
<g id="edge20" class="edge">
<title>ZLIB&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M301.23,-178.82C330.65,-165.94 370.96,-148.29 401.74,-134.82"/>
<polygon fill="black" stroke="black" points="403.2,-138 410.96,-130.78 400.4,-131.58 403.2,-138"/>
<!-- BZip2 -->
<g id="node2" class="node">
<title>BZip2</title>
<path fill="royalblue" stroke="royalblue" d="M2169.25,-110.5C2169.25,-110.5 2082.75,-110.5 2082.75,-110.5 2076.75,-110.5 2070.75,-104.5 2070.75,-98.5 2070.75,-98.5 2070.75,-86.5 2070.75,-86.5 2070.75,-80.5 2076.75,-74.5 2082.75,-74.5 2082.75,-74.5 2169.25,-74.5 2169.25,-74.5 2175.25,-74.5 2181.25,-80.5 2181.25,-86.5 2181.25,-86.5 2181.25,-98.5 2181.25,-98.5 2181.25,-104.5 2175.25,-110.5 2169.25,-110.5"/>
<text text-anchor="middle" x="2126" y="-87.83" font-family="Times,serif" font-size="14.00">BZip2::BZip2</text>
</g>
<!-- Absl -->
<g id="node2" class="node">
<g id="node3" class="node">
<title>Absl</title>
<path fill="royalblue" stroke="royalblue" d="M176.5,-215C176.5,-215 119.5,-215 119.5,-215 113.5,-215 107.5,-209 107.5,-203 107.5,-203 107.5,-191 107.5,-191 107.5,-185 113.5,-179 119.5,-179 119.5,-179 176.5,-179 176.5,-179 182.5,-179 188.5,-185 188.5,-191 188.5,-191 188.5,-203 188.5,-203 188.5,-209 182.5,-215 176.5,-215"/>
<text text-anchor="middle" x="148" y="-193.3" font-family="Times,serif" font-size="14.00">absl::absl_*</text>
<path fill="royalblue" stroke="royalblue" d="M1269.5,-382.25C1269.5,-382.25 1196.5,-382.25 1196.5,-382.25 1190.5,-382.25 1184.5,-376.25 1184.5,-370.25 1184.5,-370.25 1184.5,-358.25 1184.5,-358.25 1184.5,-352.25 1190.5,-346.25 1196.5,-346.25 1196.5,-346.25 1269.5,-346.25 1269.5,-346.25 1275.5,-346.25 1281.5,-352.25 1281.5,-358.25 1281.5,-358.25 1281.5,-370.25 1281.5,-370.25 1281.5,-376.25 1275.5,-382.25 1269.5,-382.25"/>
<text text-anchor="middle" x="1233" y="-359.57" font-family="Times,serif" font-size="14.00">absl::absl_*</text>
</g>
<!-- Absl&#45;&gt;Protobuf -->
<g id="edge21" class="edge">
<title>Absl&#45;&gt;Protobuf</title>
<path fill="none" stroke="black" d="M160.09,-178.82C167.95,-167.65 178.33,-152.9 187.14,-140.38"/>
<polygon fill="black" stroke="black" points="190.04,-142.35 192.93,-132.15 184.31,-138.32 190.04,-142.35"/>
</g>
<!-- Protoc -->
<!-- Protobuf -->
<g id="node4" class="node">
<title>Protoc</title>
<polygon fill="royalblue" stroke="royalblue" points="121.5,-132 16.5,-132 16.5,-128 12.5,-128 12.5,-124 16.5,-124 16.5,-104 12.5,-104 12.5,-100 16.5,-100 16.5,-96 121.5,-96 121.5,-132"/>
<polyline fill="none" stroke="royalblue" points="16.5,-128 20.5,-128 20.5,-124 16.5,-124 "/>
<polyline fill="none" stroke="royalblue" points="16.5,-104 20.5,-104 20.5,-100 16.5,-100 "/>
<text text-anchor="middle" x="69" y="-110.3" font-family="Times,serif" font-size="14.00">protobuf::protoc</text>
<title>Protobuf</title>
<path fill="royalblue" stroke="royalblue" d="M1304,-203.75C1304,-203.75 1162,-203.75 1162,-203.75 1156,-203.75 1150,-197.75 1150,-191.75 1150,-191.75 1150,-179.75 1150,-179.75 1150,-173.75 1156,-167.75 1162,-167.75 1162,-167.75 1304,-167.75 1304,-167.75 1310,-167.75 1316,-173.75 1316,-179.75 1316,-179.75 1316,-191.75 1316,-191.75 1316,-197.75 1310,-203.75 1304,-203.75"/>
<text text-anchor="middle" x="1233" y="-181.07" font-family="Times,serif" font-size="14.00">protobuf::libprotobuf</text>
</g>
<!-- Protobuf&#45;&gt;ZLIB -->
<g id="edge24" class="edge">
<title>Protobuf&#45;&gt;ZLIB</title>
<path fill="none" stroke="black" d="M1173.13,-204.19C1152.33,-209.78 1128.77,-215.59 1107,-219.75 957.65,-248.29 779.18,-265.72 688.75,-273.39"/>
<polygon fill="black" stroke="black" points="688.56,-269.89 678.89,-274.22 689.15,-276.87 688.56,-269.89"/>
</g>
<!-- Protobuf&#45;&gt;Absl -->
<g id="edge29" class="edge">
<title>Protobuf&#45;&gt;Absl</title>
<path fill="none" stroke="black" d="M1233,-203.99C1233,-234.31 1233,-297.44 1233,-334.47"/>
<polygon fill="black" stroke="black" points="1229.5,-334.42 1233,-344.42 1236.5,-334.42 1229.5,-334.42"/>
</g>
<!-- Re2 -->
<g id="node5" class="node">
<g id="node6" class="node">
<title>Re2</title>
<path fill="royalblue" stroke="royalblue" d="M852.5,-544C852.5,-544 817.5,-544 817.5,-544 811.5,-544 805.5,-538 805.5,-532 805.5,-532 805.5,-520 805.5,-520 805.5,-514 811.5,-508 817.5,-508 817.5,-508 852.5,-508 852.5,-508 858.5,-508 864.5,-514 864.5,-520 864.5,-520 864.5,-532 864.5,-532 864.5,-538 858.5,-544 852.5,-544"/>
<text text-anchor="middle" x="835" y="-522.3" font-family="Times,serif" font-size="14.00">re2::re2</text>
<path fill="royalblue" stroke="royalblue" d="M1161.5,-297C1161.5,-297 1112.5,-297 1112.5,-297 1106.5,-297 1100.5,-291 1100.5,-285 1100.5,-285 1100.5,-273 1100.5,-273 1100.5,-267 1106.5,-261 1112.5,-261 1112.5,-261 1161.5,-261 1161.5,-261 1167.5,-261 1173.5,-267 1173.5,-273 1173.5,-273 1173.5,-285 1173.5,-285 1173.5,-291 1167.5,-297 1161.5,-297"/>
<text text-anchor="middle" x="1137" y="-274.32" font-family="Times,serif" font-size="14.00">re2::re2</text>
</g>
<!-- Protobuf&#45;&gt;Re2 -->
<g id="edge35" class="edge">
<title>Protobuf&#45;&gt;Re2</title>
<path fill="none" stroke="black" d="M1214.94,-203.91C1200.42,-217.72 1179.81,-237.31 1163.43,-252.88"/>
<polygon fill="black" stroke="black" points="1161.24,-250.13 1156.4,-259.56 1166.06,-255.21 1161.24,-250.13"/>
</g>
<!-- Protoc -->
<g id="node5" class="node">
<title>Protoc</title>
<polygon fill="royalblue" stroke="royalblue" points="1466.12,-203.75 1333.88,-203.75 1333.88,-199.75 1329.88,-199.75 1329.88,-195.75 1333.88,-195.75 1333.88,-175.75 1329.88,-175.75 1329.88,-171.75 1333.88,-171.75 1333.88,-167.75 1466.12,-167.75 1466.12,-203.75"/>
<polyline fill="none" stroke="royalblue" points="1333.88,-199.75 1337.88,-199.75 1337.88,-195.75 1333.88,-195.75"/>
<polyline fill="none" stroke="royalblue" points="1333.88,-175.75 1337.88,-175.75 1337.88,-171.75 1333.88,-171.75"/>
<text text-anchor="middle" x="1400" y="-181.07" font-family="Times,serif" font-size="14.00">protobuf::protoc</text>
</g>
<!-- Re2&#45;&gt;Absl -->
<g id="edge28" class="edge">
<title>Re2&#45;&gt;Absl</title>
<path fill="none" stroke="black" d="M1156.89,-297.25C1170.66,-309.19 1189.2,-325.27 1204.54,-338.57"/>
<polygon fill="black" stroke="black" points="1202.14,-341.12 1211.99,-345.03 1206.73,-335.84 1202.14,-341.12"/>
</g>
<!-- Eigen3 -->
<g id="node6" class="node">
<title>Eigen3</title>
<path fill="royalblue" stroke="royalblue" d="M978,-544C978,-544 910,-544 910,-544 904,-544 898,-538 898,-532 898,-532 898,-520 898,-520 898,-514 904,-508 910,-508 910,-508 978,-508 978,-508 984,-508 990,-514 990,-520 990,-520 990,-532 990,-532 990,-538 984,-544 978,-544"/>
<text text-anchor="middle" x="944" y="-522.3" font-family="Times,serif" font-size="14.00">Eigen3::eigen</text>
</g>
<!-- Pybind11 -->
<g id="node7" class="node">
<title>Pybind11</title>
<path fill="royalblue" stroke="royalblue" d="M1130,-544C1130,-544 1028,-544 1028,-544 1022,-544 1016,-538 1016,-532 1016,-532 1016,-520 1016,-520 1016,-514 1022,-508 1028,-508 1028,-508 1130,-508 1130,-508 1136,-508 1142,-514 1142,-520 1142,-520 1142,-532 1142,-532 1142,-538 1136,-544 1130,-544"/>
<text text-anchor="middle" x="1079" y="-522.3" font-family="Times,serif" font-size="14.00">pybind11::pybind11</text>
<title>Eigen3</title>
<path fill="royalblue" stroke="royalblue" d="M2366.12,-110.5C2366.12,-110.5 2275.88,-110.5 2275.88,-110.5 2269.88,-110.5 2263.88,-104.5 2263.88,-98.5 2263.88,-98.5 2263.88,-86.5 2263.88,-86.5 2263.88,-80.5 2269.88,-74.5 2275.88,-74.5 2275.88,-74.5 2366.12,-74.5 2366.12,-74.5 2372.12,-74.5 2378.12,-80.5 2378.12,-86.5 2378.12,-86.5 2378.12,-98.5 2378.12,-98.5 2378.12,-104.5 2372.12,-110.5 2366.12,-110.5"/>
<text text-anchor="middle" x="2321" y="-87.83" font-family="Times,serif" font-size="14.00">Eigen3::eigen</text>
</g>
<!-- CoinUtils -->
<g id="node8" class="node">
<title>CoinUtils</title>
<path fill="royalblue" stroke="royalblue" d="M721.5,-544C721.5,-544 642.5,-544 642.5,-544 636.5,-544 630.5,-538 630.5,-532 630.5,-532 630.5,-520 630.5,-520 630.5,-514 636.5,-508 642.5,-508 642.5,-508 721.5,-508 721.5,-508 727.5,-508 733.5,-514 733.5,-520 733.5,-520 733.5,-532 733.5,-532 733.5,-538 727.5,-544 721.5,-544"/>
<text text-anchor="middle" x="682" y="-522.3" font-family="Times,serif" font-size="14.00">Coin::CoinUtils</text>
<path fill="royalblue" stroke="royalblue" d="M361,-624.75C361,-624.75 261,-624.75 261,-624.75 255,-624.75 249,-618.75 249,-612.75 249,-612.75 249,-600.75 249,-600.75 249,-594.75 255,-588.75 261,-588.75 261,-588.75 361,-588.75 361,-588.75 367,-588.75 373,-594.75 373,-600.75 373,-600.75 373,-612.75 373,-612.75 373,-618.75 367,-624.75 361,-624.75"/>
<text text-anchor="middle" x="311" y="-602.08" font-family="Times,serif" font-size="14.00">Coin::CoinUtils</text>
</g>
<!-- Osi -->
<g id="node9" class="node">
<title>Osi</title>
<path fill="royalblue" stroke="royalblue" d="M678.5,-453C678.5,-453 633.5,-453 633.5,-453 627.5,-453 621.5,-447 621.5,-441 621.5,-441 621.5,-429 621.5,-429 621.5,-423 627.5,-417 633.5,-417 633.5,-417 678.5,-417 678.5,-417 684.5,-417 690.5,-423 690.5,-429 690.5,-429 690.5,-441 690.5,-441 690.5,-447 684.5,-453 678.5,-453"/>
<text text-anchor="middle" x="656" y="-431.3" font-family="Times,serif" font-size="14.00">Coin::Osi</text>
<path fill="royalblue" stroke="royalblue" d="M114.25,-539.5C114.25,-539.5 57.75,-539.5 57.75,-539.5 51.75,-539.5 45.75,-533.5 45.75,-527.5 45.75,-527.5 45.75,-515.5 45.75,-515.5 45.75,-509.5 51.75,-503.5 57.75,-503.5 57.75,-503.5 114.25,-503.5 114.25,-503.5 120.25,-503.5 126.25,-509.5 126.25,-515.5 126.25,-515.5 126.25,-527.5 126.25,-527.5 126.25,-533.5 120.25,-539.5 114.25,-539.5"/>
<text text-anchor="middle" x="86" y="-516.83" font-family="Times,serif" font-size="14.00">Coin::Osi</text>
</g>
<!-- CoinUtils&#45;&gt;Osi -->
<!-- Osi&#45;&gt;CoinUtils -->
<g id="edge1" class="edge">
<title>CoinUtils&#45;&gt;Osi</title>
<path fill="none" stroke="black" d="M676.99,-507.84C673.28,-495.16 668.16,-477.64 663.91,-463.08"/>
<polygon fill="black" stroke="black" points="667.16,-461.72 661,-453.11 660.44,-463.69 667.16,-461.72"/>
<title>Osi&#45;&gt;CoinUtils</title>
<path fill="none" stroke="black" d="M126.75,-537.58C162.13,-550.67 213.76,-569.77 253.37,-584.43"/>
<polygon fill="black" stroke="black" points="251.93,-587.63 262.52,-587.81 254.36,-581.06 251.93,-587.63"/>
</g>
<!-- Clp -->
<g id="node10" class="node">
<title>Clp</title>
<path fill="royalblue" stroke="royalblue" d="M624,-370C624,-370 578,-370 578,-370 572,-370 566,-364 566,-358 566,-358 566,-346 566,-346 566,-340 572,-334 578,-334 578,-334 624,-334 624,-334 630,-334 636,-340 636,-346 636,-346 636,-358 636,-358 636,-364 630,-370 624,-370"/>
<text text-anchor="middle" x="601" y="-348.3" font-family="Times,serif" font-size="14.00">Coin::Clp</text>
<path fill="royalblue" stroke="royalblue" d="M290.62,-454.25C290.62,-454.25 233.38,-454.25 233.38,-454.25 227.38,-454.25 221.38,-448.25 221.38,-442.25 221.38,-442.25 221.38,-430.25 221.38,-430.25 221.38,-424.25 227.38,-418.25 233.38,-418.25 233.38,-418.25 290.62,-418.25 290.62,-418.25 296.62,-418.25 302.62,-424.25 302.62,-430.25 302.62,-430.25 302.62,-442.25 302.62,-442.25 302.62,-448.25 296.62,-454.25 290.62,-454.25"/>
<text text-anchor="middle" x="262" y="-431.57" font-family="Times,serif" font-size="14.00">Coin::Clp</text>
</g>
<!-- CoinUtils&#45;&gt;Clp -->
<!-- Clp&#45;&gt;CoinUtils -->
<g id="edge2" class="edge">
<title>CoinUtils&#45;&gt;Clp</title>
<path fill="none" stroke="black" d="M632.62,-507.94C622.14,-502 612.34,-494.18 606,-484 586.47,-452.65 589.69,-408.41 594.67,-380.22"/>
<polygon fill="black" stroke="black" points="598.13,-380.74 596.62,-370.26 591.26,-379.4 598.13,-380.74"/>
<title>Clp&#45;&gt;CoinUtils</title>
<path fill="none" stroke="black" d="M267.06,-454.65C275.54,-483.81 292.69,-542.79 302.88,-577.82"/>
<polygon fill="black" stroke="black" points="299.47,-578.62 305.62,-587.24 306.19,-576.66 299.47,-578.62"/>
</g>
<!-- Clp&#45;&gt;Osi -->
<g id="edge3" class="edge">
<title>Clp&#45;&gt;Osi</title>
<path fill="none" stroke="black" d="M225.1,-454.7C198.35,-467.36 161.96,-484.57 133.1,-498.22"/>
<polygon fill="black" stroke="black" points="131.76,-494.98 124.21,-502.42 134.75,-501.31 131.76,-494.98"/>
</g>
<!-- OsiClp -->
<g id="node11" class="node">
<title>OsiClp</title>
<path fill="royalblue" stroke="royalblue" d="M663.5,-298C663.5,-298 598.5,-298 598.5,-298 592.5,-298 586.5,-292 586.5,-286 586.5,-286 586.5,-274 586.5,-274 586.5,-268 592.5,-262 598.5,-262 598.5,-262 663.5,-262 663.5,-262 669.5,-262 675.5,-268 675.5,-274 675.5,-274 675.5,-286 675.5,-286 675.5,-292 669.5,-298 663.5,-298"/>
<text text-anchor="middle" x="631" y="-276.3" font-family="Times,serif" font-size="14.00">Coin::OsiClp</text>
<path fill="royalblue" stroke="royalblue" d="M168.25,-382.25C168.25,-382.25 87.75,-382.25 87.75,-382.25 81.75,-382.25 75.75,-376.25 75.75,-370.25 75.75,-370.25 75.75,-358.25 75.75,-358.25 75.75,-352.25 81.75,-346.25 87.75,-346.25 87.75,-346.25 168.25,-346.25 168.25,-346.25 174.25,-346.25 180.25,-352.25 180.25,-358.25 180.25,-358.25 180.25,-370.25 180.25,-370.25 180.25,-376.25 174.25,-382.25 168.25,-382.25"/>
<text text-anchor="middle" x="128" y="-359.57" font-family="Times,serif" font-size="14.00">Coin::OsiClp</text>
</g>
<!-- CoinUtils&#45;&gt;OsiClp -->
<!-- OsiClp&#45;&gt;CoinUtils -->
<g id="edge4" class="edge">
<title>CoinUtils&#45;&gt;OsiClp</title>
<path fill="none" stroke="black" d="M695.5,-507.63C700.09,-500.68 704.66,-492.35 707,-484 716.01,-451.91 715.82,-441.14 707,-409 696.29,-369.99 670.26,-330.82 651.65,-306.28"/>
<polygon fill="black" stroke="black" points="654.31,-304 645.42,-298.24 648.77,-308.28 654.31,-304"/>
<title>OsiClp&#45;&gt;CoinUtils</title>
<path fill="none" stroke="black" d="M141.16,-382.55C172.74,-424.05 252.98,-529.5 290.75,-579.14"/>
<polygon fill="black" stroke="black" points="287.96,-581.24 296.8,-587.08 293.53,-577.01 287.96,-581.24"/>
</g>
<!-- Cgl -->
<g id="node13" class="node">
<title>Cgl</title>
<path fill="royalblue" stroke="royalblue" d="M676,-215C676,-215 630,-215 630,-215 624,-215 618,-209 618,-203 618,-203 618,-191 618,-191 618,-185 624,-179 630,-179 630,-179 676,-179 676,-179 682,-179 688,-185 688,-191 688,-191 688,-203 688,-203 688,-209 682,-215 676,-215"/>
<text text-anchor="middle" x="653" y="-193.3" font-family="Times,serif" font-size="14.00">Coin::Cgl</text>
</g>
<!-- CoinUtils&#45;&gt;Cgl -->
<g id="edge8" class="edge">
<title>CoinUtils&#45;&gt;Cgl</title>
<path fill="none" stroke="black" d="M700.09,-507.88C706.03,-501.08 711.9,-492.79 715,-484 731.45,-437.33 703.38,-269.47 697,-254 692.34,-242.68 684.7,-231.74 677.09,-222.58"/>
<polygon fill="black" stroke="black" points="679.7,-220.25 670.48,-215.03 674.43,-224.86 679.7,-220.25"/>
</g>
<!-- CoinUtils&#45;&gt;Cbc -->
<g id="edge11" class="edge">
<title>CoinUtils&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M641.21,-507.99C624.09,-500.75 604.01,-492.11 586,-484 507.51,-448.64 462.16,-470.23 411,-401 398.19,-383.66 404,-374.56 404,-353 404,-353 404,-353 404,-279 404,-230.95 393.83,-216.59 409,-171 412.6,-160.19 418.93,-149.53 425.4,-140.46"/>
<polygon fill="black" stroke="black" points="428.33,-142.39 431.56,-132.3 422.74,-138.17 428.33,-142.39"/>
</g>
<!-- OsiCbc -->
<g id="node15" class="node">
<title>OsiCbc</title>
<path fill="royalblue" stroke="royalblue" d="M614.5,-60C614.5,-60 547.5,-60 547.5,-60 541.5,-60 535.5,-54 535.5,-48 535.5,-48 535.5,-36 535.5,-36 535.5,-30 541.5,-24 547.5,-24 547.5,-24 614.5,-24 614.5,-24 620.5,-24 626.5,-30 626.5,-36 626.5,-36 626.5,-48 626.5,-48 626.5,-54 620.5,-60 614.5,-60"/>
<text text-anchor="middle" x="581" y="-38.3" font-family="Times,serif" font-size="14.00">Coin::OsiCbc</text>
</g>
<!-- CoinUtils&#45;&gt;OsiCbc -->
<g id="edge15" class="edge">
<title>CoinUtils&#45;&gt;OsiCbc</title>
<path fill="none" stroke="black" d="M702.08,-507.62C709.08,-500.79 716.54,-492.55 722,-484 755.57,-431.49 772,-415.32 772,-353 772,-353 772,-353 772,-196 772,-138.06 744.4,-123.99 699,-88 680.83,-73.59 657.54,-63.41 636.45,-56.42"/>
<polygon fill="black" stroke="black" points="637.22,-52.99 626.63,-53.34 635.12,-59.67 637.22,-52.99"/>
</g>
<!-- Osi&#45;&gt;Clp -->
<g id="edge3" class="edge">
<title>Osi&#45;&gt;Clp</title>
<path fill="none" stroke="black" d="M644.34,-416.82C636.83,-405.76 626.92,-391.18 618.48,-378.75"/>
<polygon fill="black" stroke="black" points="621.16,-376.46 612.65,-370.15 615.37,-380.39 621.16,-376.46"/>
</g>
<!-- Osi&#45;&gt;OsiClp -->
<!-- OsiClp&#45;&gt;Osi -->
<g id="edge5" class="edge">
<title>Osi&#45;&gt;OsiClp</title>
<path fill="none" stroke="black" d="M654.9,-416.9C653.43,-396.9 650.37,-362.85 645,-334 643.41,-325.45 641.17,-316.25 638.95,-307.95"/>
<polygon fill="black" stroke="black" points="642.24,-306.74 636.19,-298.04 635.5,-308.61 642.24,-306.74"/>
<title>OsiClp&#45;&gt;Osi</title>
<path fill="none" stroke="black" d="M123.34,-382.46C116.15,-409.04 102.27,-460.34 93.61,-492.37"/>
<polygon fill="black" stroke="black" points="90.3,-491.19 91.07,-501.75 97.06,-493.02 90.3,-491.19"/>
</g>
<!-- Osi&#45;&gt;Cgl -->
<g id="edge9" class="edge">
<title>Osi&#45;&gt;Cgl</title>
<path fill="none" stroke="black" d="M676.53,-416.94C680.79,-412.26 684.68,-406.85 687,-401 711.06,-340.26 704.6,-316.92 687,-254 684.06,-243.48 678.54,-232.98 672.79,-223.96"/>
<polygon fill="black" stroke="black" points="675.56,-221.8 667.06,-215.48 669.77,-225.73 675.56,-221.8"/>
</g>
<!-- Osi&#45;&gt;Cbc -->
<g id="edge12" class="edge">
<title>Osi&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M621.25,-433.1C569.21,-431.01 474.59,-424.06 451,-401 380.8,-332.38 416.64,-199.18 436.6,-142.07"/>
<polygon fill="black" stroke="black" points="440.02,-142.92 440.12,-132.32 433.43,-140.54 440.02,-142.92"/>
</g>
<!-- Osi&#45;&gt;OsiCbc -->
<g id="edge16" class="edge">
<title>Osi&#45;&gt;OsiCbc</title>
<path fill="none" stroke="black" d="M683.96,-416.8C689.6,-412.25 695.01,-406.93 699,-401 729.88,-355.11 732,-336.31 732,-281 732,-281 732,-281 732,-196 732,-135.25 670.94,-89.89 626.48,-64.92"/>
<polygon fill="black" stroke="black" points="628.01,-61.77 617.55,-60.05 624.66,-67.91 628.01,-61.77"/>
</g>
<!-- Clp&#45;&gt;OsiClp -->
<!-- OsiClp&#45;&gt;Clp -->
<g id="edge6" class="edge">
<title>Clp&#45;&gt;OsiClp</title>
<path fill="none" stroke="black" d="M608.42,-333.7C611.79,-325.81 615.87,-316.3 619.62,-307.55"/>
<polygon fill="black" stroke="black" points="622.95,-308.67 623.67,-298.1 616.51,-305.92 622.95,-308.67"/>
<title>OsiClp&#45;&gt;Clp</title>
<path fill="none" stroke="black" d="M161.47,-382.73C178.87,-391.82 200.33,-403.03 218.95,-412.76"/>
<polygon fill="black" stroke="black" points="217.13,-415.76 227.62,-417.29 220.37,-409.56 217.13,-415.76"/>
</g>
<!-- ClpSolver -->
<g id="node12" class="node">
<title>ClpSolver</title>
<path fill="royalblue" stroke="royalblue" d="M556.5,-298C556.5,-298 475.5,-298 475.5,-298 469.5,-298 463.5,-292 463.5,-286 463.5,-286 463.5,-274 463.5,-274 463.5,-268 469.5,-262 475.5,-262 475.5,-262 556.5,-262 556.5,-262 562.5,-262 568.5,-268 568.5,-274 568.5,-274 568.5,-286 568.5,-286 568.5,-292 562.5,-298 556.5,-298"/>
<text text-anchor="middle" x="516" y="-276.3" font-family="Times,serif" font-size="14.00">Coin::ClpSolver</text>
<path fill="royalblue" stroke="royalblue" d="M313.5,-382.25C313.5,-382.25 210.5,-382.25 210.5,-382.25 204.5,-382.25 198.5,-376.25 198.5,-370.25 198.5,-370.25 198.5,-358.25 198.5,-358.25 198.5,-352.25 204.5,-346.25 210.5,-346.25 210.5,-346.25 313.5,-346.25 313.5,-346.25 319.5,-346.25 325.5,-352.25 325.5,-358.25 325.5,-358.25 325.5,-370.25 325.5,-370.25 325.5,-376.25 319.5,-382.25 313.5,-382.25"/>
<text text-anchor="middle" x="262" y="-359.57" font-family="Times,serif" font-size="14.00">Coin::ClpSolver</text>
</g>
<!-- Clp&#45;&gt;ClpSolver -->
<!-- ClpSolver&#45;&gt;Clp -->
<g id="edge7" class="edge">
<title>Clp&#45;&gt;ClpSolver</title>
<path fill="none" stroke="black" d="M579.99,-333.7C569.28,-324.88 556.11,-314.03 544.5,-304.47"/>
<polygon fill="black" stroke="black" points="546.71,-301.76 536.77,-298.1 542.26,-307.16 546.71,-301.76"/>
<title>ClpSolver&#45;&gt;Clp</title>
<path fill="none" stroke="black" d="M262,-382.55C262,-389.84 262,-398.52 262,-406.71"/>
<polygon fill="black" stroke="black" points="258.5,-406.63 262,-416.63 265.5,-406.63 258.5,-406.63"/>
</g>
<!-- Clp&#45;&gt;Cbc -->
<g id="edge13" class="edge">
<title>Clp&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M565.9,-348.94C531.49,-344.86 480.61,-332.89 455,-298 421.29,-252.07 430.84,-180.8 439.62,-142.15"/>
<polygon fill="black" stroke="black" points="443.08,-142.71 442.03,-132.16 436.28,-141.06 443.08,-142.71"/>
<!-- Cgl -->
<g id="node13" class="node">
<title>Cgl</title>
<path fill="royalblue" stroke="royalblue" d="M242.62,-297C242.62,-297 185.38,-297 185.38,-297 179.38,-297 173.38,-291 173.38,-285 173.38,-285 173.38,-273 173.38,-273 173.38,-267 179.38,-261 185.38,-261 185.38,-261 242.62,-261 242.62,-261 248.62,-261 254.62,-267 254.62,-273 254.62,-273 254.62,-285 254.62,-285 254.62,-291 248.62,-297 242.62,-297"/>
<text text-anchor="middle" x="214" y="-274.32" font-family="Times,serif" font-size="14.00">Coin::Cgl</text>
</g>
<!-- OsiClp&#45;&gt;Cgl -->
<!-- Cgl&#45;&gt;CoinUtils -->
<g id="edge8" class="edge">
<title>Cgl&#45;&gt;CoinUtils</title>
<path fill="none" stroke="black" d="M254.94,-285.47C287,-290.7 327.82,-299.75 338,-313 398.95,-392.29 350.78,-521.7 324.83,-578.06"/>
<polygon fill="black" stroke="black" points="321.73,-576.42 320.62,-586.95 328.06,-579.41 321.73,-576.42"/>
</g>
<!-- Cgl&#45;&gt;Osi -->
<g id="edge9" class="edge">
<title>Cgl&#45;&gt;Osi</title>
<path fill="none" stroke="black" d="M172.92,-283.35C133.31,-287.53 77.45,-296.27 64,-313 22.24,-364.95 51.87,-449.4 71.84,-492.81"/>
<polygon fill="black" stroke="black" points="68.67,-494.28 76.13,-501.8 74.98,-491.26 68.67,-494.28"/>
</g>
<!-- Cgl&#45;&gt;OsiClp -->
<g id="edge10" class="edge">
<title>OsiClp&#45;&gt;Cgl</title>
<path fill="none" stroke="black" d="M635.67,-261.82C638.58,-251.08 642.4,-237.03 645.71,-224.84"/>
<polygon fill="black" stroke="black" points="649.1,-225.72 648.34,-215.15 642.34,-223.89 649.1,-225.72"/>
<title>Cgl&#45;&gt;OsiClp</title>
<path fill="none" stroke="black" d="M196.18,-297.25C183.96,-309.08 167.54,-324.97 153.88,-338.19"/>
<polygon fill="black" stroke="black" points="151.63,-335.5 146.88,-344.97 156.5,-340.53 151.63,-335.5"/>
</g>
<!-- Cgl&#45;&gt;Cbc -->
<!-- Cbc -->
<g id="node14" class="node">
<title>Cbc</title>
<path fill="royalblue" stroke="royalblue" d="M363.12,-203.75C363.12,-203.75 302.88,-203.75 302.88,-203.75 296.88,-203.75 290.88,-197.75 290.88,-191.75 290.88,-191.75 290.88,-179.75 290.88,-179.75 290.88,-173.75 296.88,-167.75 302.88,-167.75 302.88,-167.75 363.12,-167.75 363.12,-167.75 369.12,-167.75 375.12,-173.75 375.12,-179.75 375.12,-179.75 375.12,-191.75 375.12,-191.75 375.12,-197.75 369.12,-203.75 363.12,-203.75"/>
<text text-anchor="middle" x="333" y="-181.07" font-family="Times,serif" font-size="14.00">Coin::Cbc</text>
</g>
<!-- Cbc&#45;&gt;ZLIB -->
<g id="edge25" class="edge">
<title>Cbc&#45;&gt;ZLIB</title>
<path fill="none" stroke="black" d="M375.55,-199.82C427.09,-215.66 514.14,-242.4 571.84,-260.13"/>
<polygon fill="black" stroke="black" points="570.58,-263.41 581.17,-263 572.64,-256.71 570.58,-263.41"/>
</g>
<!-- Cbc&#45;&gt;CoinUtils -->
<g id="edge11" class="edge">
<title>Cbc&#45;&gt;CoinUtils</title>
<path fill="none" stroke="black" d="M343.74,-204.21C347.74,-211.31 352.02,-219.72 355,-227.75 376.45,-285.58 385,-301.57 385,-363.25 385,-363.25 385,-363.25 385,-437.25 385,-488.15 376.37,-501.78 354,-547.5 348.53,-558.68 340.86,-569.92 333.51,-579.51"/>
<polygon fill="black" stroke="black" points="330.8,-577.3 327.3,-587.3 336.27,-581.66 330.8,-577.3"/>
</g>
<!-- Cbc&#45;&gt;Osi -->
<g id="edge12" class="edge">
<title>Cbc&#45;&gt;Osi</title>
<path fill="none" stroke="black" d="M290.43,-189.29C221.31,-196.08 87.8,-221.07 42,-313 12.42,-372.37 21.83,-399.39 43,-462.25 46.91,-473.86 54.08,-485.08 61.46,-494.52"/>
<polygon fill="black" stroke="black" points="58.73,-496.71 67.83,-502.15 64.11,-492.23 58.73,-496.71"/>
</g>
<!-- Cbc&#45;&gt;Clp -->
<g id="edge13" class="edge">
<title>Cbc&#45;&gt;Clp</title>
<path fill="none" stroke="black" d="M338.59,-204.23C349.36,-241.28 369.02,-329.32 335,-390.25 329.72,-399.71 321.55,-407.42 312.55,-413.62"/>
<polygon fill="black" stroke="black" points="310.92,-410.51 304.26,-418.75 314.6,-416.47 310.92,-410.51"/>
</g>
<!-- Cbc&#45;&gt;Cgl -->
<g id="edge14" class="edge">
<title>Cgl&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M617.59,-182.08C583.16,-168.54 530.7,-147.91 493.05,-133.11"/>
<polygon fill="black" stroke="black" points="493.92,-129.69 483.33,-129.29 491.36,-136.2 493.92,-129.69"/>
<title>Cbc&#45;&gt;Cgl</title>
<path fill="none" stroke="black" d="M310.34,-204.13C291.97,-218.21 265.9,-238.21 245.5,-253.84"/>
<polygon fill="black" stroke="black" points="243.59,-250.9 237.78,-259.77 247.85,-256.46 243.59,-250.9"/>
</g>
<!-- Cbc&#45;&gt;OsiCbc -->
<!-- OsiCbc -->
<g id="node15" class="node">
<title>OsiCbc</title>
<path fill="royalblue" stroke="royalblue" d="M237.75,-110.5C237.75,-110.5 154.25,-110.5 154.25,-110.5 148.25,-110.5 142.25,-104.5 142.25,-98.5 142.25,-98.5 142.25,-86.5 142.25,-86.5 142.25,-80.5 148.25,-74.5 154.25,-74.5 154.25,-74.5 237.75,-74.5 237.75,-74.5 243.75,-74.5 249.75,-80.5 249.75,-86.5 249.75,-86.5 249.75,-98.5 249.75,-98.5 249.75,-104.5 243.75,-110.5 237.75,-110.5"/>
<text text-anchor="middle" x="196" y="-87.83" font-family="Times,serif" font-size="14.00">Coin::OsiCbc</text>
</g>
<!-- OsiCbc&#45;&gt;CoinUtils -->
<g id="edge15" class="edge">
<title>OsiCbc&#45;&gt;CoinUtils</title>
<path fill="none" stroke="black" d="M223.18,-110.92C233.92,-116.94 246.64,-123.04 259,-126.5 272.4,-130.26 373.77,-125.07 384,-134.5 431.39,-178.19 405,-213.54 405,-278 405,-278 405,-278 405,-437.25 405,-488.15 400.58,-504.09 374,-547.5 366.27,-560.13 355.04,-571.74 344.2,-581.21"/>
<polygon fill="black" stroke="black" points="342.26,-578.27 336.82,-587.36 346.74,-583.64 342.26,-578.27"/>
</g>
<!-- OsiCbc&#45;&gt;Osi -->
<g id="edge16" class="edge">
<title>OsiCbc&#45;&gt;Osi</title>
<path fill="none" stroke="black" d="M158.91,-110.93C106.48,-138.44 17,-197.22 17,-278 17,-278 17,-278 17,-365.25 17,-408.51 6.36,-423.21 25,-462.25 31.11,-475.05 41.33,-486.51 51.68,-495.8"/>
<polygon fill="black" stroke="black" points="49.25,-498.33 59.15,-502.1 53.77,-492.98 49.25,-498.33"/>
</g>
<!-- OsiCbc&#45;&gt;Cbc -->
<g id="edge17" class="edge">
<title>Cbc&#45;&gt;OsiCbc</title>
<path fill="none" stroke="black" d="M479.78,-95.88C497.63,-86.55 519.9,-74.92 539,-64.94"/>
<polygon fill="black" stroke="black" points="540.85,-67.92 548.09,-60.19 537.61,-61.72 540.85,-67.92"/>
<title>OsiCbc&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M222.09,-110.88C243.52,-125.15 274.07,-145.5 297.68,-161.23"/>
<polygon fill="black" stroke="black" points="295.48,-163.97 305.75,-166.6 299.36,-158.14 295.48,-163.97"/>
</g>
<!-- CbcSolver -->
<g id="node16" class="node">
<title>CbcSolver</title>
<path fill="royalblue" stroke="royalblue" d="M505.5,-60C505.5,-60 422.5,-60 422.5,-60 416.5,-60 410.5,-54 410.5,-48 410.5,-48 410.5,-36 410.5,-36 410.5,-30 416.5,-24 422.5,-24 422.5,-24 505.5,-24 505.5,-24 511.5,-24 517.5,-30 517.5,-36 517.5,-36 517.5,-48 517.5,-48 517.5,-54 511.5,-60 505.5,-60"/>
<text text-anchor="middle" x="464" y="-38.3" font-family="Times,serif" font-size="14.00">Coin::CbcSolver</text>
<path fill="royalblue" stroke="royalblue" d="M386,-110.5C386,-110.5 280,-110.5 280,-110.5 274,-110.5 268,-104.5 268,-98.5 268,-98.5 268,-86.5 268,-86.5 268,-80.5 274,-74.5 280,-74.5 280,-74.5 386,-74.5 386,-74.5 392,-74.5 398,-80.5 398,-86.5 398,-86.5 398,-98.5 398,-98.5 398,-104.5 392,-110.5 386,-110.5"/>
<text text-anchor="middle" x="333" y="-87.83" font-family="Times,serif" font-size="14.00">Coin::CbcSolver</text>
</g>
<!-- Cbc&#45;&gt;CbcSolver -->
<!-- CbcSolver&#45;&gt;Cbc -->
<g id="edge18" class="edge">
<title>Cbc&#45;&gt;CbcSolver</title>
<path fill="none" stroke="black" d="M451.2,-95.7C453.1,-87.9 455.38,-78.51 457.48,-69.83"/>
<polygon fill="black" stroke="black" points="460.89,-70.65 459.85,-60.1 454.08,-69 460.89,-70.65"/>
<title>CbcSolver&#45;&gt;Cbc</title>
<path fill="none" stroke="black" d="M333,-110.66C333,-123.45 333,-141.22 333,-156.14"/>
<polygon fill="black" stroke="black" points="329.5,-155.84 333,-165.84 336.5,-155.84 329.5,-155.84"/>
</g>
<!-- GLPK -->
<g id="node17" class="node">
<title>GLPK</title>
<path fill="royalblue" stroke="royalblue" d="M1325,-544C1325,-544 1277,-544 1277,-544 1271,-544 1265,-538 1265,-532 1265,-532 1265,-520 1265,-520 1265,-514 1271,-508 1277,-508 1277,-508 1325,-508 1325,-508 1331,-508 1337,-514 1337,-520 1337,-520 1337,-532 1337,-532 1337,-538 1331,-544 1325,-544"/>
<text text-anchor="middle" x="1301" y="-522.3" font-family="Times,serif" font-size="14.00">glpk::glpk</text>
<path fill="royalblue" stroke="royalblue" d="M2597.25,-110.5C2597.25,-110.5 2534.75,-110.5 2534.75,-110.5 2528.75,-110.5 2522.75,-104.5 2522.75,-98.5 2522.75,-98.5 2522.75,-86.5 2522.75,-86.5 2522.75,-80.5 2528.75,-74.5 2534.75,-74.5 2534.75,-74.5 2597.25,-74.5 2597.25,-74.5 2603.25,-74.5 2609.25,-80.5 2609.25,-86.5 2609.25,-86.5 2609.25,-98.5 2609.25,-98.5 2609.25,-104.5 2603.25,-110.5 2597.25,-110.5"/>
<text text-anchor="middle" x="2566" y="-87.83" font-family="Times,serif" font-size="14.00">glpk::glpk</text>
</g>
<!-- HIGHS -->
<g id="node18" class="node">
<title>HIGHS</title>
<path fill="royalblue" stroke="royalblue" d="M2956.5,-110.5C2956.5,-110.5 2877.5,-110.5 2877.5,-110.5 2871.5,-110.5 2865.5,-104.5 2865.5,-98.5 2865.5,-98.5 2865.5,-86.5 2865.5,-86.5 2865.5,-80.5 2871.5,-74.5 2877.5,-74.5 2877.5,-74.5 2956.5,-74.5 2956.5,-74.5 2962.5,-74.5 2968.5,-80.5 2968.5,-86.5 2968.5,-86.5 2968.5,-98.5 2968.5,-98.5 2968.5,-104.5 2962.5,-110.5 2956.5,-110.5"/>
<text text-anchor="middle" x="2917" y="-87.83" font-family="Times,serif" font-size="14.00">highs::highs</text>
</g>
<!-- SPX -->
<g id="node19" class="node">
<title>SPX</title>
<path fill="royalblue" stroke="royalblue" d="M623.88,-203.75C623.88,-203.75 568.12,-203.75 568.12,-203.75 562.12,-203.75 556.12,-197.75 556.12,-191.75 556.12,-191.75 556.12,-179.75 556.12,-179.75 556.12,-173.75 562.12,-167.75 568.12,-167.75 568.12,-167.75 623.88,-167.75 623.88,-167.75 629.88,-167.75 635.88,-173.75 635.88,-179.75 635.88,-179.75 635.88,-191.75 635.88,-191.75 635.88,-197.75 629.88,-203.75 623.88,-203.75"/>
<text text-anchor="middle" x="596" y="-181.07" font-family="Times,serif" font-size="14.00">libsoplex</text>
</g>
<!-- SPX&#45;&gt;ZLIB -->
<g id="edge26" class="edge">
<title>SPX&#45;&gt;ZLIB</title>
<path fill="none" stroke="black" d="M602.4,-203.91C607.21,-216.83 613.91,-234.82 619.5,-249.83"/>
<polygon fill="black" stroke="black" points="616.22,-251.04 622.99,-259.18 622.78,-248.59 616.22,-251.04"/>
</g>
<!-- SCIP -->
<g id="node18" class="node">
<g id="node20" class="node">
<title>SCIP</title>
<path fill="royalblue" stroke="royalblue" d="M1611,-544C1611,-544 1567,-544 1567,-544 1561,-544 1555,-538 1555,-532 1555,-532 1555,-520 1555,-520 1555,-514 1561,-508 1567,-508 1567,-508 1611,-508 1611,-508 1617,-508 1623,-514 1623,-520 1623,-520 1623,-532 1623,-532 1623,-538 1617,-544 1611,-544"/>
<text text-anchor="middle" x="1589" y="-522.3" font-family="Times,serif" font-size="14.00">scip::scip</text>
<path fill="royalblue" stroke="royalblue" d="M671,-110.5C671,-110.5 589,-110.5 589,-110.5 583,-110.5 577,-104.5 577,-98.5 577,-98.5 577,-86.5 577,-86.5 577,-80.5 583,-74.5 589,-74.5 589,-74.5 671,-74.5 671,-74.5 677,-74.5 683,-80.5 683,-86.5 683,-86.5 683,-98.5 683,-98.5 683,-104.5 677,-110.5 671,-110.5"/>
<text text-anchor="middle" x="630" y="-87.83" font-family="Times,serif" font-size="14.00">SCIP::libscip</text>
</g>
<!-- SCIP&#45;&gt;ZLIB -->
<g id="edge27" class="edge">
<title>SCIP&#45;&gt;ZLIB</title>
<path fill="none" stroke="black" d="M640.08,-110.87C643.64,-117.95 647.21,-126.38 649,-134.5 657.16,-171.5 654.95,-182.33 649,-219.75 647.41,-229.76 644.37,-240.38 641.18,-249.78"/>
<polygon fill="black" stroke="black" points="637.93,-248.49 637.82,-259.09 644.51,-250.87 637.93,-248.49"/>
</g>
<!-- SCIP&#45;&gt;SPX -->
<g id="edge19" class="edge">
<title>SCIP&#45;&gt;SPX</title>
<path fill="none" stroke="black" d="M623.6,-110.66C618.79,-123.58 612.09,-141.57 606.5,-156.58"/>
<polygon fill="black" stroke="black" points="603.22,-155.34 603.01,-165.93 609.78,-157.79 603.22,-155.34"/>
</g>
<!-- gtest -->
<g id="node21" class="node">
<title>gtest</title>
<path fill="royalblue" stroke="royalblue" d="M1081.5,-203.75C1081.5,-203.75 1002.5,-203.75 1002.5,-203.75 996.5,-203.75 990.5,-197.75 990.5,-191.75 990.5,-191.75 990.5,-179.75 990.5,-179.75 990.5,-173.75 996.5,-167.75 1002.5,-167.75 1002.5,-167.75 1081.5,-167.75 1081.5,-167.75 1087.5,-167.75 1093.5,-173.75 1093.5,-179.75 1093.5,-179.75 1093.5,-191.75 1093.5,-191.75 1093.5,-197.75 1087.5,-203.75 1081.5,-203.75"/>
<text text-anchor="middle" x="1042" y="-181.07" font-family="Times,serif" font-size="14.00">GTest::gtest</text>
</g>
<!-- gtest&#45;&gt;Absl -->
<g id="edge30" class="edge">
<title>gtest&#45;&gt;Absl</title>
<path fill="none" stroke="black" d="M1042.96,-203.96C1045.27,-229.3 1053.14,-276.68 1080,-305 1104.5,-330.83 1141.64,-345.32 1173.2,-353.4"/>
<polygon fill="black" stroke="black" points="1172.08,-356.73 1182.62,-355.64 1173.7,-349.92 1172.08,-356.73"/>
</g>
<!-- gtest&#45;&gt;Re2 -->
<g id="edge36" class="edge">
<title>gtest&#45;&gt;Re2</title>
<path fill="none" stroke="black" d="M1059.87,-203.91C1074.24,-217.72 1094.64,-237.31 1110.85,-252.88"/>
<polygon fill="black" stroke="black" points="1108.16,-255.15 1117.8,-259.55 1113.01,-250.1 1108.16,-255.15"/>
</g>
<!-- bench -->
<g id="node22" class="node">
<title>bench</title>
<path fill="royalblue" stroke="royalblue" d="M942,-110.5C942,-110.5 782,-110.5 782,-110.5 776,-110.5 770,-104.5 770,-98.5 770,-98.5 770,-86.5 770,-86.5 770,-80.5 776,-74.5 782,-74.5 782,-74.5 942,-74.5 942,-74.5 948,-74.5 954,-80.5 954,-86.5 954,-86.5 954,-98.5 954,-98.5 954,-104.5 948,-110.5 942,-110.5"/>
<text text-anchor="middle" x="862" y="-87.83" font-family="Times,serif" font-size="14.00">benchmark::benchmark</text>
</g>
<!-- bench&#45;&gt;gtest -->
<g id="edge21" class="edge">
<title>bench&#45;&gt;gtest</title>
<path fill="none" stroke="black" d="M896.28,-110.88C924.96,-125.42 966.1,-146.27 997.35,-162.12"/>
<polygon fill="black" stroke="black" points="995.69,-165.2 1006.19,-166.6 998.85,-158.95 995.69,-165.2"/>
</g>
<!-- fuzz -->
<g id="node23" class="node">
<title>fuzz</title>
<path fill="royalblue" stroke="royalblue" d="M1105.5,-110.5C1105.5,-110.5 990.5,-110.5 990.5,-110.5 984.5,-110.5 978.5,-104.5 978.5,-98.5 978.5,-98.5 978.5,-86.5 978.5,-86.5 978.5,-80.5 984.5,-74.5 990.5,-74.5 990.5,-74.5 1105.5,-74.5 1105.5,-74.5 1111.5,-74.5 1117.5,-80.5 1117.5,-86.5 1117.5,-86.5 1117.5,-98.5 1117.5,-98.5 1117.5,-104.5 1111.5,-110.5 1105.5,-110.5"/>
<text text-anchor="middle" x="1048" y="-87.83" font-family="Times,serif" font-size="14.00">fuzztest::fuzztest</text>
</g>
<!-- fuzz&#45;&gt;Absl -->
<g id="edge31" class="edge">
<title>fuzz&#45;&gt;Absl</title>
<path fill="none" stroke="black" d="M1117.88,-95.12C1233.5,-98.53 1454.29,-108.42 1478,-134.5 1552.16,-216.07 1382.39,-302.19 1289.1,-341.45"/>
<polygon fill="black" stroke="black" points="1287.97,-338.13 1280.07,-345.2 1290.65,-344.59 1287.97,-338.13"/>
</g>
<!-- fuzz&#45;&gt;Protobuf -->
<g id="edge33" class="edge">
<title>fuzz&#45;&gt;Protobuf</title>
<path fill="none" stroke="black" d="M1086.28,-110.91C1101.79,-118.07 1119.82,-126.54 1136,-134.5 1153.9,-143.3 1173.46,-153.35 1190.3,-162.14"/>
<polygon fill="black" stroke="black" points="1188.57,-165.19 1199.06,-166.72 1191.82,-158.98 1188.57,-165.19"/>
</g>
<!-- fuzz&#45;&gt;Re2 -->
<g id="edge37" class="edge">
<title>fuzz&#45;&gt;Re2</title>
<path fill="none" stroke="black" d="M1082.13,-110.85C1091.47,-117.12 1100.73,-125.04 1107,-134.5 1130.07,-169.35 1135.89,-218.53 1137.09,-249.32"/>
<polygon fill="black" stroke="black" points="1133.59,-249.11 1137.32,-259.02 1140.59,-248.94 1133.59,-249.11"/>
</g>
<!-- fuzz&#45;&gt;gtest -->
<g id="edge20" class="edge">
<title>fuzz&#45;&gt;gtest</title>
<path fill="none" stroke="black" d="M1046.87,-110.66C1046.03,-123.45 1044.86,-141.22 1043.88,-156.14"/>
<polygon fill="black" stroke="black" points="1040.41,-155.63 1043.24,-165.84 1047.39,-156.09 1040.41,-155.63"/>
</g>
<!-- Pybind11 -->
<g id="node24" class="node">
<title>Pybind11</title>
<path fill="royalblue" stroke="royalblue" d="M1828.25,-203.75C1828.25,-203.75 1693.75,-203.75 1693.75,-203.75 1687.75,-203.75 1681.75,-197.75 1681.75,-191.75 1681.75,-191.75 1681.75,-179.75 1681.75,-179.75 1681.75,-173.75 1687.75,-167.75 1693.75,-167.75 1693.75,-167.75 1828.25,-167.75 1828.25,-167.75 1834.25,-167.75 1840.25,-173.75 1840.25,-179.75 1840.25,-179.75 1840.25,-191.75 1840.25,-191.75 1840.25,-197.75 1834.25,-203.75 1828.25,-203.75"/>
<text text-anchor="middle" x="1761" y="-181.07" font-family="Times,serif" font-size="14.00">pybind11::pybind11</text>
</g>
<!-- Pybind11Absl -->
<g id="node25" class="node">
<title>Pybind11Absl</title>
<path fill="royalblue" stroke="royalblue" d="M1973.62,-110.5C1973.62,-110.5 1790.38,-110.5 1790.38,-110.5 1784.38,-110.5 1778.38,-104.5 1778.38,-98.5 1778.38,-98.5 1778.38,-86.5 1778.38,-86.5 1778.38,-80.5 1784.38,-74.5 1790.38,-74.5 1790.38,-74.5 1973.62,-74.5 1973.62,-74.5 1979.62,-74.5 1985.62,-80.5 1985.62,-86.5 1985.62,-86.5 1985.62,-98.5 1985.62,-98.5 1985.62,-104.5 1979.62,-110.5 1973.62,-110.5"/>
<text text-anchor="middle" x="1882" y="-87.83" font-family="Times,serif" font-size="14.00">pybind11::pybind11_abseil</text>
</g>
<!-- Pybind11Absl&#45;&gt;Absl -->
<g id="edge32" class="edge">
<title>Pybind11Absl&#45;&gt;Absl</title>
<path fill="none" stroke="black" d="M1828.8,-110.98C1809.25,-116.77 1786.81,-122.71 1766,-126.5 1723.88,-134.17 1710.15,-119.64 1670,-134.5 1548.64,-179.4 1550.3,-248.27 1434,-305 1388.93,-326.99 1334.03,-342.2 1293,-351.55"/>
<polygon fill="black" stroke="black" points="1292.3,-348.12 1283.3,-353.7 1293.82,-354.95 1292.3,-348.12"/>
</g>
<!-- Pybind11Absl&#45;&gt;Pybind11 -->
<g id="edge22" class="edge">
<title>Pybind11Absl&#45;&gt;Pybind11</title>
<path fill="none" stroke="black" d="M1858.96,-110.88C1840.29,-124.96 1813.77,-144.96 1793.03,-160.59"/>
<polygon fill="black" stroke="black" points="1791.04,-157.71 1785.17,-166.53 1795.26,-163.3 1791.04,-157.71"/>
</g>
<!-- Pybind11Protobuf -->
<g id="node26" class="node">
<title>Pybind11Protobuf</title>
<path fill="royalblue" stroke="royalblue" d="M1742.38,-110.5C1742.38,-110.5 1539.62,-110.5 1539.62,-110.5 1533.62,-110.5 1527.62,-104.5 1527.62,-98.5 1527.62,-98.5 1527.62,-86.5 1527.62,-86.5 1527.62,-80.5 1533.62,-74.5 1539.62,-74.5 1539.62,-74.5 1742.38,-74.5 1742.38,-74.5 1748.38,-74.5 1754.38,-80.5 1754.38,-86.5 1754.38,-86.5 1754.38,-98.5 1754.38,-98.5 1754.38,-104.5 1748.38,-110.5 1742.38,-110.5"/>
<text text-anchor="middle" x="1641" y="-87.83" font-family="Times,serif" font-size="14.00">pybind11::pybind11_protobuf</text>
</g>
<!-- Pybind11Protobuf&#45;&gt;Protobuf -->
<g id="edge34" class="edge">
<title>Pybind11Protobuf&#45;&gt;Protobuf</title>
<path fill="none" stroke="black" d="M1527.26,-98.07C1466.11,-103.04 1390.1,-113.32 1325,-134.5 1305.36,-140.89 1285.06,-151.48 1268.54,-161.3"/>
<polygon fill="black" stroke="black" points="1266.78,-158.28 1260.08,-166.48 1270.43,-164.25 1266.78,-158.28"/>
</g>
<!-- Pybind11Protobuf&#45;&gt;Pybind11 -->
<g id="edge23" class="edge">
<title>Pybind11Protobuf&#45;&gt;Pybind11</title>
<path fill="none" stroke="black" d="M1663.85,-110.88C1682.37,-124.96 1708.67,-144.96 1729.23,-160.59"/>
<polygon fill="black" stroke="black" points="1726.95,-163.25 1737.03,-166.52 1731.19,-157.68 1726.95,-163.25"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -1,426 +1,426 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
<!-- Generated by graphviz version 12.2.1 (0)
-->
<!-- Title: DockerDeps Pages: 1 -->
<svg width="1904pt" height="1113pt"
viewBox="0.00 0.00 1904.00 1113.25" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1109.25)">
<svg width="2371pt" height="1198pt"
viewBox="0.00 0.00 2370.50 1198.19" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1194.19)">
<title>DockerDeps</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1109.25 1900,-1109.25 1900,4 -4,4"/>
<polygon fill="white" stroke="none" points="-4,4 -4,-1194.19 2366.5,-1194.19 2366.5,4 -4,4"/>
<g id="clust1" class="cluster">
<title>clusterDockerfile</title>
<polygon fill="none" stroke="royalblue" points="1484,-845.75 1484,-1026.25 1676,-1026.25 1676,-845.75 1484,-845.75"/>
<text text-anchor="middle" x="1580" y="-1011.05" font-family="Times,serif" font-size="14.00">docker/&lt;distro&gt;/Dockerfile</text>
<polygon fill="none" stroke="royalblue" points="1838,-909.31 1838,-1104.44 2080,-1104.44 2080,-909.31 1838,-909.31"/>
<text text-anchor="middle" x="1959" y="-1087.14" font-family="Times,serif" font-size="14.00">docker/&lt;distro&gt;/Dockerfile</text>
</g>
<g id="clust2" class="cluster">
<title>clusterLang</title>
<polygon fill="none" stroke="royalblue" points="563,-116 563,-812.75 1072,-812.75 1072,-116 563,-116"/>
<text text-anchor="middle" x="817.5" y="-797.55" font-family="Times,serif" font-size="14.00">docker/&lt;distro&gt;/&lt;lang&gt;.Dockerfile</text>
<polygon fill="none" stroke="royalblue" points="729,-120.5 729,-874.06 1377,-874.06 1377,-120.5 729,-120.5"/>
<text text-anchor="middle" x="1053" y="-856.76" font-family="Times,serif" font-size="14.00">docker/&lt;distro&gt;/&lt;lang&gt;.Dockerfile</text>
</g>
<g id="clust3" class="cluster">
<title>clusterCache</title>
<polygon fill="none" stroke="royalblue" points="8,-8 8,-83 1739,-83 1739,-8 8,-8"/>
<text text-anchor="middle" x="873.5" y="-67.8" font-family="Times,serif" font-size="14.00">cache/&lt;distro&gt;/</text>
<polygon fill="none" stroke="royalblue" points="8,-8 8,-85.25 2161,-85.25 2161,-8 8,-8"/>
<text text-anchor="middle" x="1084.5" y="-67.95" font-family="Times,serif" font-size="14.00">cache/&lt;distro&gt;/</text>
</g>
<!-- DISTRO_IMG -->
<g id="node1" class="node">
<title>DISTRO_IMG</title>
<path fill="royalblue" stroke="black" d="M1568,-1100.98C1568,-1102.78 1546.49,-1104.25 1520,-1104.25 1493.51,-1104.25 1472,-1102.78 1472,-1100.98 1472,-1100.98 1472,-1071.52 1472,-1071.52 1472,-1069.72 1493.51,-1068.25 1520,-1068.25 1546.49,-1068.25 1568,-1069.72 1568,-1071.52 1568,-1071.52 1568,-1100.98 1568,-1100.98"/>
<path fill="none" stroke="black" d="M1568,-1100.98C1568,-1099.17 1546.49,-1097.7 1520,-1097.7 1493.51,-1097.7 1472,-1099.17 1472,-1100.98"/>
<text text-anchor="middle" x="1520" y="-1082.55" font-family="Times,serif" font-size="14.00">&lt;distro&gt;:latest</text>
<path fill="royalblue" stroke="black" d="M1947.5,-1183.66C1947.5,-1185.47 1919.04,-1186.94 1884,-1186.94 1848.96,-1186.94 1820.5,-1185.47 1820.5,-1183.66 1820.5,-1183.66 1820.5,-1154.21 1820.5,-1154.21 1820.5,-1152.4 1848.96,-1150.94 1884,-1150.94 1919.04,-1150.94 1947.5,-1152.4 1947.5,-1154.21 1947.5,-1154.21 1947.5,-1183.66 1947.5,-1183.66"/>
<path fill="none" stroke="black" d="M1947.5,-1183.66C1947.5,-1181.86 1919.04,-1180.39 1884,-1180.39 1848.96,-1180.39 1820.5,-1181.86 1820.5,-1183.66"/>
<text text-anchor="middle" x="1884" y="-1164.26" font-family="Times,serif" font-size="14.00">&lt;distro&gt;:latest</text>
</g>
<!-- BASE_IMG -->
<g id="node8" class="node">
<title>BASE_IMG</title>
<path fill="royalblue" stroke="black" d="M1668,-990.6C1668,-993.24 1628.56,-995.38 1580,-995.38 1531.44,-995.38 1492,-993.24 1492,-990.6 1492,-990.6 1492,-947.65 1492,-947.65 1492,-945.01 1531.44,-942.87 1580,-942.87 1628.56,-942.87 1668,-945.01 1668,-947.65 1668,-947.65 1668,-990.6 1668,-990.6"/>
<path fill="none" stroke="black" d="M1668,-990.6C1668,-987.97 1628.56,-985.83 1580,-985.83 1531.44,-985.83 1492,-987.97 1492,-990.6"/>
<text text-anchor="middle" x="1580" y="-972.92" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_base</text>
<text text-anchor="middle" x="1580" y="-957.92" font-family="Times,serif" font-size="14.00">base</text>
<path fill="royalblue" stroke="black" d="M2072,-1065.88C2072,-1068.81 2021.35,-1071.19 1959,-1071.19 1896.65,-1071.19 1846,-1068.81 1846,-1065.88 1846,-1065.88 1846,-1018.06 1846,-1018.06 1846,-1015.13 1896.65,-1012.75 1959,-1012.75 2021.35,-1012.75 2072,-1015.13 2072,-1018.06 2072,-1018.06 2072,-1065.88 2072,-1065.88"/>
<path fill="none" stroke="black" d="M2072,-1065.88C2072,-1062.94 2021.35,-1060.56 1959,-1060.56 1896.65,-1060.56 1846,-1062.94 1846,-1065.88"/>
<text text-anchor="middle" x="1959" y="-1045.92" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_base</text>
<text text-anchor="middle" x="1959" y="-1028.67" font-family="Times,serif" font-size="14.00">base</text>
</g>
<!-- DISTRO_IMG&#45;&gt;BASE_IMG -->
<g id="edge2" class="edge">
<title>DISTRO_IMG&#45;&gt;BASE_IMG</title>
<path fill="none" stroke="black" d="M1529.11,-1067.76C1537.85,-1051 1551.28,-1025.23 1562.15,-1004.37"/>
<polygon fill="black" stroke="black" points="1565.27,-1005.96 1566.79,-995.48 1559.06,-1002.73 1565.27,-1005.96"/>
<path fill="none" stroke="black" d="M1894.43,-1150.56C1905.21,-1132.6 1922.37,-1104 1936.29,-1080.8"/>
<polygon fill="black" stroke="black" points="1939.11,-1082.91 1941.26,-1072.54 1933.11,-1079.31 1939.11,-1082.91"/>
</g>
<!-- PKG -->
<g id="node2" class="node">
<title>PKG</title>
<polygon fill="royalblue" stroke="black" points="1693.5,-1105.25 1590.5,-1105.25 1586.5,-1101.25 1586.5,-1067.25 1689.5,-1067.25 1693.5,-1071.25 1693.5,-1105.25"/>
<polyline fill="none" stroke="black" points="1689.5,-1101.25 1586.5,-1101.25 "/>
<polyline fill="none" stroke="black" points="1689.5,-1101.25 1689.5,-1067.25 "/>
<polyline fill="none" stroke="black" points="1689.5,-1101.25 1693.5,-1105.25 "/>
<text text-anchor="middle" x="1640" y="-1090.05" font-family="Times,serif" font-size="14.00">Build packages</text>
<text text-anchor="middle" x="1640" y="-1075.05" font-family="Times,serif" font-size="14.00">e.g. cmake, g++</text>
<polygon fill="royalblue" stroke="black" points="2100.25,-1190.19 1969.75,-1190.19 1965.75,-1186.19 1965.75,-1147.69 2096.25,-1147.69 2100.25,-1151.69 2100.25,-1190.19"/>
<polyline fill="none" stroke="black" points="2096.25,-1186.19 1965.75,-1186.19"/>
<polyline fill="none" stroke="black" points="2096.25,-1186.19 2096.25,-1147.69"/>
<polyline fill="none" stroke="black" points="2096.25,-1186.19 2100.25,-1190.19"/>
<text text-anchor="middle" x="2033" y="-1172.89" font-family="Times,serif" font-size="14.00">Build packages</text>
<text text-anchor="middle" x="2033" y="-1155.64" font-family="Times,serif" font-size="14.00">e.g. cmake, g++</text>
</g>
<!-- PKG&#45;&gt;BASE_IMG -->
<g id="edge3" class="edge">
<title>PKG&#45;&gt;BASE_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1630.49,-1067.01C1621.78,-1050.29 1608.65,-1025.11 1597.97,-1004.6"/>
<polygon fill="black" stroke="black" points="1600.98,-1002.81 1593.26,-995.56 1594.77,-1006.04 1600.98,-1002.81"/>
<text text-anchor="middle" x="1637" y="-1038.05" font-family="Times,serif" font-size="14.00">install</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2020.78,-1147.3C2010.17,-1129.39 1994.53,-1102.98 1981.65,-1081.21"/>
<polygon fill="black" stroke="black" points="1984.82,-1079.71 1976.72,-1072.89 1978.8,-1083.28 1984.82,-1079.71"/>
<text text-anchor="middle" x="2031.19" y="-1116.39" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- PYPKG -->
<g id="node3" class="node">
<title>PYPKG</title>
<polygon fill="gold" stroke="black" points="880,-898.88 776,-898.88 772,-894.88 772,-860.88 876,-860.88 880,-864.88 880,-898.88"/>
<polyline fill="none" stroke="black" points="876,-894.88 772,-894.88 "/>
<polyline fill="none" stroke="black" points="876,-894.88 876,-860.88 "/>
<polyline fill="none" stroke="black" points="876,-894.88 880,-898.88 "/>
<text text-anchor="middle" x="826" y="-883.67" font-family="Times,serif" font-size="14.00">Python packages</text>
<text text-anchor="middle" x="826" y="-868.67" font-family="Times,serif" font-size="14.00">e.g. python&#45;dev</text>
<polygon fill="gold" stroke="black" points="1139.38,-967.78 1006.62,-967.78 1002.62,-963.78 1002.62,-925.28 1135.38,-925.28 1139.38,-929.28 1139.38,-967.78"/>
<polyline fill="none" stroke="black" points="1135.38,-963.78 1002.62,-963.78"/>
<polyline fill="none" stroke="black" points="1135.38,-963.78 1135.38,-925.28"/>
<polyline fill="none" stroke="black" points="1135.38,-963.78 1139.38,-967.78"/>
<text text-anchor="middle" x="1071" y="-950.48" font-family="Times,serif" font-size="14.00">Python packages</text>
<text text-anchor="middle" x="1071" y="-933.23" font-family="Times,serif" font-size="14.00">e.g. python&#45;dev</text>
</g>
<!-- LANGENV_IMG -->
<g id="node10" class="node">
<title>LANGENV_IMG</title>
<path fill="royalblue" stroke="black" d="M1054,-777.1C1054,-779.74 1005.14,-781.88 945,-781.88 884.86,-781.88 836,-779.74 836,-777.1 836,-777.1 836,-734.15 836,-734.15 836,-731.51 884.86,-729.37 945,-729.37 1005.14,-729.37 1054,-731.51 1054,-734.15 1054,-734.15 1054,-777.1 1054,-777.1"/>
<path fill="none" stroke="black" d="M1054,-777.1C1054,-774.47 1005.14,-772.33 945,-772.33 884.86,-772.33 836,-774.47 836,-777.1"/>
<text text-anchor="middle" x="945" y="-759.42" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_env</text>
<text text-anchor="middle" x="945" y="-744.42" font-family="Times,serif" font-size="14.00">env</text>
<path fill="royalblue" stroke="black" d="M1356,-835.5C1356,-838.43 1293.25,-840.81 1216,-840.81 1138.75,-840.81 1076,-838.43 1076,-835.5 1076,-835.5 1076,-787.69 1076,-787.69 1076,-784.76 1138.75,-782.38 1216,-782.38 1293.25,-782.38 1356,-784.76 1356,-787.69 1356,-787.69 1356,-835.5 1356,-835.5"/>
<path fill="none" stroke="black" d="M1356,-835.5C1356,-832.57 1293.25,-830.19 1216,-830.19 1138.75,-830.19 1076,-832.57 1076,-835.5"/>
<text text-anchor="middle" x="1216" y="-815.54" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_env</text>
<text text-anchor="middle" x="1216" y="-798.29" font-family="Times,serif" font-size="14.00">env</text>
</g>
<!-- PYPKG&#45;&gt;LANGENV_IMG -->
<g id="edge13" class="edge">
<title>PYPKG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M843.56,-860.84C861.88,-842.02 890.99,-812.11 913.33,-789.16"/>
<polygon fill="black" stroke="black" points="915.86,-791.58 920.33,-781.97 910.85,-786.69 915.86,-791.58"/>
<text text-anchor="middle" x="898" y="-824.55" font-family="Times,serif" font-size="14.00">install</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1093.34,-925.05C1115.42,-904.81 1149.67,-873.41 1176.37,-848.93"/>
<polygon fill="black" stroke="black" points="1178.63,-851.6 1183.64,-842.27 1173.9,-846.44 1178.63,-851.6"/>
<text text-anchor="middle" x="1161.28" y="-886.01" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- JAVAPKG -->
<g id="node4" class="node">
<title>JAVAPKG</title>
<polygon fill="crimson" stroke="black" points="992,-898.88 902,-898.88 898,-894.88 898,-860.88 988,-860.88 992,-864.88 992,-898.88"/>
<polyline fill="none" stroke="black" points="988,-894.88 898,-894.88 "/>
<polyline fill="none" stroke="black" points="988,-894.88 988,-860.88 "/>
<polyline fill="none" stroke="black" points="988,-894.88 992,-898.88 "/>
<text text-anchor="middle" x="945" y="-883.67" font-family="Times,serif" font-size="14.00">Java packages</text>
<text text-anchor="middle" x="945" y="-868.67" font-family="Times,serif" font-size="14.00">e.g. openjdk</text>
<polygon fill="crimson" stroke="black" points="1274.25,-967.78 1161.75,-967.78 1157.75,-963.78 1157.75,-925.28 1270.25,-925.28 1274.25,-929.28 1274.25,-967.78"/>
<polyline fill="none" stroke="black" points="1270.25,-963.78 1157.75,-963.78"/>
<polyline fill="none" stroke="black" points="1270.25,-963.78 1270.25,-925.28"/>
<polyline fill="none" stroke="black" points="1270.25,-963.78 1274.25,-967.78"/>
<text text-anchor="middle" x="1216" y="-950.48" font-family="Times,serif" font-size="14.00">Java packages</text>
<text text-anchor="middle" x="1216" y="-933.23" font-family="Times,serif" font-size="14.00">e.g. openjdk</text>
</g>
<!-- JAVAPKG&#45;&gt;LANGENV_IMG -->
<g id="edge14" class="edge">
<title>JAVAPKG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M945,-860.84C945,-842.83 945,-814.68 945,-792.18"/>
<polygon fill="black" stroke="black" points="948.5,-791.97 945,-781.97 941.5,-791.97 948.5,-791.97"/>
<text text-anchor="middle" x="962" y="-824.55" font-family="Times,serif" font-size="14.00">install</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1216,-925.05C1216,-905.77 1216,-876.37 1216,-852.47"/>
<polygon fill="black" stroke="black" points="1219.5,-852.76 1216,-842.76 1212.5,-852.76 1219.5,-852.76"/>
<text text-anchor="middle" x="1238.12" y="-886.01" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- DOTNETPKG -->
<g id="node5" class="node">
<title>DOTNETPKG</title>
<polygon fill="forestgreen" stroke="black" points="1103.5,-898.88 1014.5,-898.88 1010.5,-894.88 1010.5,-860.88 1099.5,-860.88 1103.5,-864.88 1103.5,-898.88"/>
<polyline fill="none" stroke="black" points="1099.5,-894.88 1010.5,-894.88 "/>
<polyline fill="none" stroke="black" points="1099.5,-894.88 1099.5,-860.88 "/>
<polyline fill="none" stroke="black" points="1099.5,-894.88 1103.5,-898.88 "/>
<text text-anchor="middle" x="1057" y="-883.67" font-family="Times,serif" font-size="14.00">.Net packages</text>
<text text-anchor="middle" x="1057" y="-868.67" font-family="Times,serif" font-size="14.00">e.g. dotnet&#45;cli</text>
<polygon fill="forestgreen" stroke="black" points="1409.62,-967.78 1296.38,-967.78 1292.38,-963.78 1292.38,-925.28 1405.62,-925.28 1409.62,-929.28 1409.62,-967.78"/>
<polyline fill="none" stroke="black" points="1405.62,-963.78 1292.38,-963.78"/>
<polyline fill="none" stroke="black" points="1405.62,-963.78 1405.62,-925.28"/>
<polyline fill="none" stroke="black" points="1405.62,-963.78 1409.62,-967.78"/>
<text text-anchor="middle" x="1351" y="-950.48" font-family="Times,serif" font-size="14.00">.Net packages</text>
<text text-anchor="middle" x="1351" y="-933.23" font-family="Times,serif" font-size="14.00">e.g. dotnet&#45;cli</text>
</g>
<!-- DOTNETPKG&#45;&gt;LANGENV_IMG -->
<g id="edge15" class="edge">
<title>DOTNETPKG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1040.47,-860.84C1023.31,-842.1 996.07,-812.37 975.08,-789.45"/>
<polygon fill="black" stroke="black" points="977.56,-786.98 968.22,-781.97 972.39,-791.71 977.56,-786.98"/>
<text text-anchor="middle" x="1031" y="-824.55" font-family="Times,serif" font-size="14.00">install</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1330.2,-925.05C1309.74,-904.9 1278.03,-873.68 1253.22,-849.24"/>
<polygon fill="black" stroke="black" points="1255.75,-846.83 1246.17,-842.3 1250.84,-851.81 1255.75,-846.83"/>
<text text-anchor="middle" x="1325.61" y="-886.01" font-family="Times,serif" font-size="14.00">install</text>
</g>
<!-- SRC -->
<g id="node6" class="node">
<title>SRC</title>
<polygon fill="royalblue" stroke="black" points="554.5,-773.62 551.5,-777.62 530.5,-777.62 527.5,-773.62 495.5,-773.62 495.5,-737.62 554.5,-737.62 554.5,-773.62"/>
<text text-anchor="middle" x="525" y="-751.92" font-family="Times,serif" font-size="14.00">git repo</text>
<polygon fill="royalblue" stroke="black" points="721.12,-829.59 718.12,-833.59 697.12,-833.59 694.12,-829.59 648.88,-829.59 648.88,-793.59 721.12,-793.59 721.12,-829.59"/>
<text text-anchor="middle" x="685" y="-806.92" font-family="Times,serif" font-size="14.00">git repo</text>
</g>
<!-- LANGDEVEL_IMG -->
<g id="node11" class="node">
<title>LANGDEVEL_IMG</title>
<path fill="royalblue" stroke="black" d="M852.5,-673.85C852.5,-676.49 801.63,-678.63 739,-678.63 676.37,-678.63 625.5,-676.49 625.5,-673.85 625.5,-673.85 625.5,-630.9 625.5,-630.9 625.5,-628.26 676.37,-626.12 739,-626.12 801.63,-626.12 852.5,-628.26 852.5,-630.9 852.5,-630.9 852.5,-673.85 852.5,-673.85"/>
<path fill="none" stroke="black" d="M852.5,-673.85C852.5,-671.22 801.63,-669.08 739,-669.08 676.37,-669.08 625.5,-671.22 625.5,-673.85"/>
<text text-anchor="middle" x="739" y="-656.17" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_devel</text>
<text text-anchor="middle" x="739" y="-641.17" font-family="Times,serif" font-size="14.00">devel</text>
<path fill="royalblue" stroke="black" d="M1107.38,-723.81C1107.38,-726.74 1041.77,-729.12 961,-729.12 880.23,-729.12 814.62,-726.74 814.62,-723.81 814.62,-723.81 814.62,-676 814.62,-676 814.62,-673.07 880.23,-670.69 961,-670.69 1041.77,-670.69 1107.38,-673.07 1107.38,-676 1107.38,-676 1107.38,-723.81 1107.38,-723.81"/>
<path fill="none" stroke="black" d="M1107.38,-723.81C1107.38,-720.88 1041.77,-718.5 961,-718.5 880.23,-718.5 814.62,-720.88 814.62,-723.81"/>
<text text-anchor="middle" x="961" y="-703.86" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_devel</text>
<text text-anchor="middle" x="961" y="-686.61" font-family="Times,serif" font-size="14.00">devel</text>
</g>
<!-- SRC&#45;&gt;LANGDEVEL_IMG -->
<g id="edge16" class="edge">
<title>SRC&#45;&gt;LANGDEVEL_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M546.43,-737.61C550.49,-734.73 554.79,-731.9 559,-729.5 590.79,-711.37 627.74,-695.01 659.86,-682.14"/>
<polygon fill="black" stroke="black" points="661.22,-685.37 669.23,-678.43 658.64,-678.86 661.22,-685.37"/>
<text text-anchor="middle" x="634.5" y="-700.3" font-family="Times,serif" font-size="14.00">copy</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M707.14,-793.32C712.77,-789.39 718.95,-785.47 725,-782.38 763.96,-762.42 808.91,-745.53 849.06,-732.39"/>
<polygon fill="black" stroke="black" points="850.09,-735.74 858.53,-729.34 847.94,-729.07 850.09,-735.74"/>
<text text-anchor="middle" x="816.83" y="-751.08" font-family="Times,serif" font-size="14.00">copy</text>
</g>
<!-- SAMPLE -->
<g id="node7" class="node">
<title>SAMPLE</title>
<polygon fill="royalblue" stroke="black" points="1138,-477.88 1135,-481.88 1114,-481.88 1111,-477.88 1082,-477.88 1082,-441.88 1138,-441.88 1138,-477.88"/>
<text text-anchor="middle" x="1110" y="-456.18" font-family="Times,serif" font-size="14.00">sample</text>
<polygon fill="royalblue" stroke="black" points="1453.5,-510.78 1450.5,-514.78 1429.5,-514.78 1426.5,-510.78 1386.5,-510.78 1386.5,-474.78 1453.5,-474.78 1453.5,-510.78"/>
<text text-anchor="middle" x="1420" y="-488.11" font-family="Times,serif" font-size="14.00">sample</text>
</g>
<!-- LANGINSTALLDEVEL_IMG -->
<g id="node15" class="node">
<title>LANGINSTALLDEVEL_IMG</title>
<path fill="royalblue" stroke="black" d="M966.5,-378.1C966.5,-380.74 906.66,-382.88 833,-382.88 759.34,-382.88 699.5,-380.74 699.5,-378.1 699.5,-378.1 699.5,-335.15 699.5,-335.15 699.5,-332.51 759.34,-330.37 833,-330.37 906.66,-330.37 966.5,-332.51 966.5,-335.15 966.5,-335.15 966.5,-378.1 966.5,-378.1"/>
<path fill="none" stroke="black" d="M966.5,-378.1C966.5,-375.47 906.66,-373.33 833,-373.33 759.34,-373.33 699.5,-375.47 699.5,-378.1"/>
<text text-anchor="middle" x="833" y="-360.43" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_devel</text>
<text text-anchor="middle" x="833" y="-345.43" font-family="Times,serif" font-size="14.00">install_devel</text>
<path fill="royalblue" stroke="black" d="M1211.88,-405C1211.88,-407.93 1134.84,-410.31 1040,-410.31 945.16,-410.31 868.12,-407.93 868.12,-405 868.12,-405 868.12,-357.19 868.12,-357.19 868.12,-354.26 945.16,-351.88 1040,-351.88 1134.84,-351.88 1211.88,-354.26 1211.88,-357.19 1211.88,-357.19 1211.88,-405 1211.88,-405"/>
<path fill="none" stroke="black" d="M1211.88,-405C1211.88,-402.07 1134.84,-399.69 1040,-399.69 945.16,-399.69 868.12,-402.07 868.12,-405"/>
<text text-anchor="middle" x="1040" y="-385.04" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_devel</text>
<text text-anchor="middle" x="1040" y="-367.79" font-family="Times,serif" font-size="14.00">install_devel</text>
</g>
<!-- SAMPLE&#45;&gt;LANGINSTALLDEVEL_IMG -->
<g id="edge17" class="edge">
<title>SAMPLE&#45;&gt;LANGINSTALLDEVEL_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1089.12,-441.78C1084.93,-438.84 1080.45,-436.01 1076,-433.75 1035.41,-413.13 988.16,-396.78 946.17,-384.61"/>
<polygon fill="black" stroke="black" points="947.03,-381.21 936.45,-381.84 945.11,-387.94 947.03,-381.21"/>
<text text-anchor="middle" x="1044.5" y="-404.55" font-family="Times,serif" font-size="14.00">copy</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1399.07,-474.36C1393.47,-470.34 1387.23,-466.42 1381,-463.56 1330.41,-440.34 1272.45,-423.31 1218.84,-411.01"/>
<polygon fill="black" stroke="black" points="1219.83,-407.65 1209.31,-408.87 1218.3,-414.48 1219.83,-407.65"/>
<text text-anchor="middle" x="1353.54" y="-432.26" font-family="Times,serif" font-size="14.00">copy</text>
</g>
<!-- SWIG_IMG -->
<g id="node9" class="node">
<title>SWIG_IMG</title>
<path fill="royalblue" stroke="black" d="M1668.5,-901.35C1668.5,-903.99 1628.83,-906.13 1580,-906.13 1531.17,-906.13 1491.5,-903.99 1491.5,-901.35 1491.5,-901.35 1491.5,-858.4 1491.5,-858.4 1491.5,-855.76 1531.17,-853.62 1580,-853.62 1628.83,-853.62 1668.5,-855.76 1668.5,-858.4 1668.5,-858.4 1668.5,-901.35 1668.5,-901.35"/>
<path fill="none" stroke="black" d="M1668.5,-901.35C1668.5,-898.72 1628.83,-896.58 1580,-896.58 1531.17,-896.58 1491.5,-898.72 1491.5,-901.35"/>
<text text-anchor="middle" x="1580" y="-883.67" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_swig</text>
<text text-anchor="middle" x="1580" y="-868.67" font-family="Times,serif" font-size="14.00">swig</text>
<path fill="royalblue" stroke="black" d="M2072,-970.44C2072,-973.37 2021.35,-975.75 1959,-975.75 1896.65,-975.75 1846,-973.37 1846,-970.44 1846,-970.44 1846,-922.62 1846,-922.62 1846,-919.69 1896.65,-917.31 1959,-917.31 2021.35,-917.31 2072,-919.69 2072,-922.62 2072,-922.62 2072,-970.44 2072,-970.44"/>
<path fill="none" stroke="black" d="M2072,-970.44C2072,-967.51 2021.35,-965.12 1959,-965.12 1896.65,-965.12 1846,-967.51 1846,-970.44"/>
<text text-anchor="middle" x="1959" y="-950.48" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_swig</text>
<text text-anchor="middle" x="1959" y="-933.23" font-family="Times,serif" font-size="14.00">swig</text>
</g>
<!-- BASE_IMG&#45;&gt;SWIG_IMG -->
<g id="edge1" class="edge">
<title>BASE_IMG&#45;&gt;SWIG_IMG</title>
<path fill="none" stroke="black" d="M1580,-942.89C1580,-934.57 1580,-925.16 1580,-916.22"/>
<polygon fill="black" stroke="black" points="1583.5,-916.05 1580,-906.05 1576.5,-916.05 1583.5,-916.05"/>
<path fill="none" stroke="black" d="M1959,-1012.43C1959,-1004.62 1959,-996.01 1959,-987.69"/>
<polygon fill="black" stroke="black" points="1962.5,-987.73 1959,-977.73 1955.5,-987.73 1962.5,-987.73"/>
</g>
<!-- BASE_TAR -->
<g id="node18" class="node">
<title>BASE_TAR</title>
<polygon fill="royalblue" stroke="black" points="1725,-52 1629,-52 1629,-16 1731,-16 1731,-46 1725,-52"/>
<polyline fill="none" stroke="black" points="1725,-52 1725,-46 "/>
<polyline fill="none" stroke="black" points="1731,-46 1725,-46 "/>
<text text-anchor="middle" x="1680" y="-30.3" font-family="Times,serif" font-size="14.00">docker_base.tar</text>
<polygon fill="royalblue" stroke="black" points="2146.62,-52 2023.38,-52 2023.38,-16 2152.62,-16 2152.62,-46 2146.62,-52"/>
<polyline fill="none" stroke="black" points="2146.62,-52 2146.62,-46"/>
<polyline fill="none" stroke="black" points="2152.62,-46 2146.62,-46"/>
<text text-anchor="middle" x="2088" y="-29.32" font-family="Times,serif" font-size="14.00">docker_base.tar</text>
</g>
<!-- BASE_IMG&#45;&gt;BASE_TAR -->
<g id="edge18" class="edge">
<title>BASE_IMG&#45;&gt;BASE_TAR</title>
<path fill="none" stroke="red" d="M1668.02,-956.4C1710.76,-945.23 1753,-923.43 1753,-880.88 1753,-880.88 1753,-880.88 1753,-149.12 1753,-113.78 1727.84,-80.6 1707.07,-59.23"/>
<polygon fill="red" stroke="red" points="1709.51,-56.73 1699.95,-52.18 1704.59,-61.7 1709.51,-56.73"/>
<text text-anchor="middle" x="1824.5" y="-507.8" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_base</text>
<path fill="none" stroke="red" d="M2072.38,-1032.41C2124.53,-1021.61 2175,-998.09 2175,-947.53 2175,-947.53 2175,-947.53 2175,-156.72 2175,-117.45 2144.66,-82.11 2119.81,-59.76"/>
<polygon fill="red" stroke="red" points="2122.31,-57.29 2112.46,-53.4 2117.73,-62.59 2122.31,-57.29"/>
<text text-anchor="middle" x="2268.75" y="-543.95" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_base</text>
</g>
<!-- SWIG_IMG&#45;&gt;LANGENV_IMG -->
<g id="edge12" class="edge">
<title>SWIG_IMG&#45;&gt;LANGENV_IMG</title>
<path fill="none" stroke="black" d="M1491.37,-861.81C1379.96,-840.36 1188.32,-803.47 1064.16,-779.57"/>
<polygon fill="black" stroke="black" points="1064.71,-776.11 1054.23,-777.65 1063.39,-782.98 1064.71,-776.11"/>
<path fill="none" stroke="black" d="M1845.75,-925.27C1717.87,-902.39 1509.17,-865.05 1367.39,-839.68"/>
<polygon fill="black" stroke="black" points="1368.39,-836.3 1357.93,-837.99 1367.16,-843.2 1368.39,-836.3"/>
</g>
<!-- SWIG_TAR -->
<g id="node19" class="node">
<title>SWIG_TAR</title>
<polygon fill="royalblue" stroke="black" points="1605,-52 1507,-52 1507,-16 1611,-16 1611,-46 1605,-52"/>
<polyline fill="none" stroke="black" points="1605,-52 1605,-46 "/>
<polyline fill="none" stroke="black" points="1611,-46 1605,-46 "/>
<text text-anchor="middle" x="1559" y="-30.3" font-family="Times,serif" font-size="14.00">docker_swig.tar</text>
<polygon fill="royalblue" stroke="black" points="1999.62,-52 1876.38,-52 1876.38,-16 2005.62,-16 2005.62,-46 1999.62,-52"/>
<polyline fill="none" stroke="black" points="1999.62,-52 1999.62,-46"/>
<polyline fill="none" stroke="black" points="2005.62,-46 1999.62,-46"/>
<text text-anchor="middle" x="1941" y="-29.32" font-family="Times,serif" font-size="14.00">docker_swig.tar</text>
</g>
<!-- SWIG_IMG&#45;&gt;SWIG_TAR -->
<g id="edge19" class="edge">
<title>SWIG_IMG&#45;&gt;SWIG_TAR</title>
<path fill="none" stroke="red" d="M1580,-853.59C1580,-828.87 1580,-790.16 1580,-756.62 1580,-756.62 1580,-756.62 1580,-149.12 1580,-118.9 1572.79,-84.91 1566.82,-61.94"/>
<polygon fill="red" stroke="red" points="1570.18,-60.96 1564.19,-52.22 1563.42,-62.79 1570.18,-60.96"/>
<text text-anchor="middle" x="1652.5" y="-456.18" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_swig</text>
<path fill="none" stroke="red" d="M1959,-917.01C1959,-890.09 1959,-848.6 1959,-812.59 1959,-812.59 1959,-812.59 1959,-156.72 1959,-124.41 1952.72,-87.79 1947.57,-63.23"/>
<polygon fill="red" stroke="red" points="1951.05,-62.72 1945.5,-53.69 1944.21,-64.21 1951.05,-62.72"/>
<text text-anchor="middle" x="2052.75" y="-488.11" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_swig</text>
</g>
<!-- LANGENV_IMG&#45;&gt;LANGDEVEL_IMG -->
<g id="edge4" class="edge">
<title>LANGENV_IMG&#45;&gt;LANGDEVEL_IMG</title>
<path fill="none" stroke="black" d="M893.81,-729.47C865.2,-715.4 829.37,-697.79 799.38,-683.05"/>
<polygon fill="black" stroke="black" points="800.8,-679.85 790.28,-678.58 797.71,-686.13 800.8,-679.85"/>
<path fill="none" stroke="black" d="M1149.33,-781.92C1115.22,-767.24 1073.52,-749.3 1038.03,-734.04"/>
<polygon fill="black" stroke="black" points="1039.68,-730.94 1029.11,-730.2 1036.91,-737.37 1039.68,-730.94"/>
</g>
<!-- LANGINSTALLENV_IMG -->
<g id="node14" class="node">
<title>LANGINSTALLENV_IMG</title>
<path fill="royalblue" stroke="black" d="M1063.5,-481.35C1063.5,-483.99 1005.9,-486.13 935,-486.13 864.1,-486.13 806.5,-483.99 806.5,-481.35 806.5,-481.35 806.5,-438.4 806.5,-438.4 806.5,-435.76 864.1,-433.62 935,-433.62 1005.9,-433.62 1063.5,-435.76 1063.5,-438.4 1063.5,-438.4 1063.5,-481.35 1063.5,-481.35"/>
<path fill="none" stroke="black" d="M1063.5,-481.35C1063.5,-478.72 1005.9,-476.58 935,-476.58 864.1,-476.58 806.5,-478.72 806.5,-481.35"/>
<text text-anchor="middle" x="935" y="-463.68" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_env</text>
<text text-anchor="middle" x="935" y="-448.68" font-family="Times,serif" font-size="14.00">install_env</text>
<path fill="royalblue" stroke="black" d="M1368.5,-516.69C1368.5,-519.62 1294.32,-522 1203,-522 1111.68,-522 1037.5,-519.62 1037.5,-516.69 1037.5,-516.69 1037.5,-468.88 1037.5,-468.88 1037.5,-465.94 1111.68,-463.56 1203,-463.56 1294.32,-463.56 1368.5,-465.94 1368.5,-468.88 1368.5,-468.88 1368.5,-516.69 1368.5,-516.69"/>
<path fill="none" stroke="black" d="M1368.5,-516.69C1368.5,-513.76 1294.32,-511.38 1203,-511.38 1111.68,-511.38 1037.5,-513.76 1037.5,-516.69"/>
<text text-anchor="middle" x="1203" y="-496.73" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_env</text>
<text text-anchor="middle" x="1203" y="-479.48" font-family="Times,serif" font-size="14.00">install_env</text>
</g>
<!-- LANGENV_IMG&#45;&gt;LANGINSTALLENV_IMG -->
<g id="edge8" class="edge">
<title>LANGENV_IMG&#45;&gt;LANGINSTALLENV_IMG</title>
<path fill="none" stroke="black" d="M944.14,-729.33C942.36,-676.94 938.26,-556.49 936.21,-496.37"/>
<polygon fill="black" stroke="black" points="939.7,-496.09 935.86,-486.22 932.71,-496.33 939.7,-496.09"/>
<path fill="none" stroke="black" d="M1214.82,-781.92C1212.49,-725.14 1207.29,-598.28 1204.63,-533.5"/>
<polygon fill="black" stroke="black" points="1208.13,-533.52 1204.23,-523.67 1201.14,-533.81 1208.13,-533.52"/>
</g>
<!-- LANGENV_TAR -->
<g id="node20" class="node">
<title>LANGENV_TAR</title>
<polygon fill="royalblue" stroke="black" points="1482.5,-52 1345.5,-52 1345.5,-16 1488.5,-16 1488.5,-46 1482.5,-52"/>
<polyline fill="none" stroke="black" points="1482.5,-52 1482.5,-46 "/>
<polyline fill="none" stroke="black" points="1488.5,-46 1482.5,-46 "/>
<text text-anchor="middle" x="1417" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_env.tar</text>
<polygon fill="royalblue" stroke="black" points="1852.5,-52 1677.5,-52 1677.5,-16 1858.5,-16 1858.5,-46 1852.5,-52"/>
<polyline fill="none" stroke="black" points="1852.5,-52 1852.5,-46"/>
<polyline fill="none" stroke="black" points="1858.5,-46 1852.5,-46"/>
<text text-anchor="middle" x="1768" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_env.tar</text>
</g>
<!-- LANGENV_IMG&#45;&gt;LANGENV_TAR -->
<g id="edge20" class="edge">
<title>LANGENV_IMG&#45;&gt;LANGENV_TAR</title>
<path fill="none" stroke="red" d="M1054.21,-750.65C1183.06,-742.91 1380,-720.16 1380,-653.38 1380,-653.38 1380,-653.38 1380,-458.88 1380,-433.04 1379.51,-426.54 1381,-400.75 1388.32,-273.92 1406.03,-123.13 1413.54,-62.37"/>
<polygon fill="red" stroke="red" points="1417.06,-62.46 1414.82,-52.1 1410.11,-61.59 1417.06,-62.46"/>
<text text-anchor="middle" x="1473.5" y="-404.55" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_env</text>
<path fill="none" stroke="red" d="M1356.25,-805.94C1499.8,-797.24 1702,-772.32 1702,-700.91 1702,-700.91 1702,-700.91 1702,-491.78 1702,-463.57 1697.01,-455.77 1703.5,-428.31 1714.17,-383.16 1736.36,-378.79 1748,-333.88 1773.05,-237.2 1771.77,-117.38 1769.57,-63.54"/>
<polygon fill="red" stroke="red" points="1773.07,-63.55 1769.12,-53.72 1766.08,-63.87 1773.07,-63.55"/>
<text text-anchor="middle" x="1824.25" y="-432.26" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_env</text>
</g>
<!-- LANGBUILD_IMG -->
<g id="node12" class="node">
<title>LANGBUILD_IMG</title>
<path fill="royalblue" stroke="black" d="M903,-584.6C903,-587.24 852.35,-589.38 790,-589.38 727.65,-589.38 677,-587.24 677,-584.6 677,-584.6 677,-541.65 677,-541.65 677,-539.01 727.65,-536.87 790,-536.87 852.35,-536.87 903,-539.01 903,-541.65 903,-541.65 903,-584.6 903,-584.6"/>
<path fill="none" stroke="black" d="M903,-584.6C903,-581.97 852.35,-579.83 790,-579.83 727.65,-579.83 677,-581.97 677,-584.6"/>
<text text-anchor="middle" x="790" y="-566.92" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_build</text>
<text text-anchor="middle" x="790" y="-551.92" font-family="Times,serif" font-size="14.00">build</text>
<path fill="royalblue" stroke="black" d="M1149.25,-628.38C1149.25,-631.31 1084.15,-633.69 1004,-633.69 923.85,-633.69 858.75,-631.31 858.75,-628.38 858.75,-628.38 858.75,-580.56 858.75,-580.56 858.75,-577.63 923.85,-575.25 1004,-575.25 1084.15,-575.25 1149.25,-577.63 1149.25,-580.56 1149.25,-580.56 1149.25,-628.38 1149.25,-628.38"/>
<path fill="none" stroke="black" d="M1149.25,-628.38C1149.25,-625.44 1084.15,-623.06 1004,-623.06 923.85,-623.06 858.75,-625.44 858.75,-628.38"/>
<text text-anchor="middle" x="1004" y="-608.42" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_build</text>
<text text-anchor="middle" x="1004" y="-591.17" font-family="Times,serif" font-size="14.00">build</text>
</g>
<!-- LANGDEVEL_IMG&#45;&gt;LANGBUILD_IMG -->
<g id="edge5" class="edge">
<title>LANGDEVEL_IMG&#45;&gt;LANGBUILD_IMG</title>
<path fill="none" stroke="black" d="M753.75,-626.14C758.88,-617.37 764.72,-607.38 770.19,-598.02"/>
<polygon fill="black" stroke="black" points="773.26,-599.7 775.28,-589.3 767.21,-596.17 773.26,-599.7"/>
<path fill="none" stroke="black" d="M974.14,-670.36C977.89,-662.2 982.05,-653.16 986.05,-644.48"/>
<polygon fill="black" stroke="black" points="989.16,-646.08 990.16,-635.53 982.8,-643.15 989.16,-646.08"/>
</g>
<!-- LANGDEVEL_TAR -->
<g id="node21" class="node">
<title>LANGDEVEL_TAR</title>
<polygon fill="royalblue" stroke="black" points="164,-52 16,-52 16,-16 170,-16 170,-46 164,-52"/>
<polyline fill="none" stroke="black" points="164,-52 164,-46 "/>
<polyline fill="none" stroke="black" points="170,-46 164,-46 "/>
<text text-anchor="middle" x="93" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_devel.tar</text>
<polygon fill="royalblue" stroke="black" points="206,-52 16,-52 16,-16 212,-16 212,-46 206,-52"/>
<polyline fill="none" stroke="black" points="206,-52 206,-46"/>
<polyline fill="none" stroke="black" points="212,-46 206,-46"/>
<text text-anchor="middle" x="114" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_devel.tar</text>
</g>
<!-- LANGDEVEL_IMG&#45;&gt;LANGDEVEL_TAR -->
<g id="edge21" class="edge">
<title>LANGDEVEL_IMG&#45;&gt;LANGDEVEL_TAR</title>
<path fill="none" stroke="red" d="M625.43,-648.67C426.75,-642.42 37,-622.69 37,-564.12 37,-564.12 37,-564.12 37,-149.12 37,-116 56.25,-82.49 72.17,-60.43"/>
<polygon fill="red" stroke="red" points="75.09,-62.38 78.29,-52.28 69.49,-58.18 75.09,-62.38"/>
<text text-anchor="middle" x="134.5" y="-352.93" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_devel</text>
<path fill="none" stroke="red" d="M814.21,-698.73C554.46,-696.45 41,-682.23 41,-605.47 41,-605.47 41,-605.47 41,-156.72 41,-119.36 66.61,-83.55 87.49,-60.57"/>
<polygon fill="red" stroke="red" points="89.84,-63.18 94.16,-53.51 84.75,-58.37 89.84,-63.18"/>
<text text-anchor="middle" x="168.12" y="-376.42" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_devel</text>
</g>
<!-- LANGTEST_IMG -->
<g id="node13" class="node">
<title>LANGTEST_IMG</title>
<path fill="royalblue" stroke="black" d="M788.5,-481.35C788.5,-483.99 739.87,-486.13 680,-486.13 620.13,-486.13 571.5,-483.99 571.5,-481.35 571.5,-481.35 571.5,-438.4 571.5,-438.4 571.5,-435.76 620.13,-433.62 680,-433.62 739.87,-433.62 788.5,-435.76 788.5,-438.4 788.5,-438.4 788.5,-481.35 788.5,-481.35"/>
<path fill="none" stroke="black" d="M788.5,-481.35C788.5,-478.72 739.87,-476.58 680,-476.58 620.13,-476.58 571.5,-478.72 571.5,-481.35"/>
<text text-anchor="middle" x="680" y="-463.68" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_test</text>
<text text-anchor="middle" x="680" y="-448.68" font-family="Times,serif" font-size="14.00">test</text>
<path fill="royalblue" stroke="black" d="M1019.12,-516.69C1019.12,-519.62 955.87,-522 878,-522 800.13,-522 736.88,-519.62 736.88,-516.69 736.88,-516.69 736.88,-468.88 736.88,-468.88 736.88,-465.94 800.13,-463.56 878,-463.56 955.87,-463.56 1019.12,-465.94 1019.12,-468.88 1019.12,-468.88 1019.12,-516.69 1019.12,-516.69"/>
<path fill="none" stroke="black" d="M1019.12,-516.69C1019.12,-513.76 955.87,-511.38 878,-511.38 800.13,-511.38 736.88,-513.76 736.88,-516.69"/>
<text text-anchor="middle" x="878" y="-496.73" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_test</text>
<text text-anchor="middle" x="878" y="-479.48" font-family="Times,serif" font-size="14.00">test</text>
</g>
<!-- LANGBUILD_IMG&#45;&gt;LANGTEST_IMG -->
<g id="edge6" class="edge">
<title>LANGBUILD_IMG&#45;&gt;LANGTEST_IMG</title>
<path fill="none" stroke="black" d="M762.53,-536.84C748.22,-523.67 730.57,-507.42 715.26,-493.33"/>
<polygon fill="black" stroke="black" points="717.23,-490.39 707.5,-486.19 712.49,-495.54 717.23,-490.39"/>
<path fill="none" stroke="black" d="M971.22,-574.94C955.33,-561.1 936.07,-544.33 919.19,-529.64"/>
<polygon fill="black" stroke="black" points="921.59,-527.09 911.75,-523.16 917,-532.37 921.59,-527.09"/>
</g>
<!-- LANGBUILD_IMG&#45;&gt;LANGINSTALLENV_IMG -->
<g id="edge7" class="edge">
<title>LANGBUILD_IMG&#45;&gt;LANGINSTALLENV_IMG</title>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M824.93,-536.72C839.15,-526.46 855.8,-514.57 871,-504 876.69,-500.04 882.69,-495.92 888.65,-491.87"/>
<polygon fill="black" stroke="black" points="891,-494.51 897.31,-486 887.07,-488.72 891,-494.51"/>
<text text-anchor="middle" x="903" y="-507.8" font-family="Times,serif" font-size="14.00">copy install</text>
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1056.02,-574.79C1082.08,-560.43 1113.8,-542.95 1141.1,-527.9"/>
<polygon fill="black" stroke="black" points="1142.54,-531.1 1149.61,-523.21 1139.16,-524.97 1142.54,-531.1"/>
<text text-anchor="middle" x="1156.29" y="-543.95" font-family="Times,serif" font-size="14.00">copy install</text>
</g>
<!-- LANGBUILD_TAR -->
<g id="node22" class="node">
<title>LANGBUILD_TAR</title>
<polygon fill="royalblue" stroke="black" points="1321,-52 1175,-52 1175,-16 1327,-16 1327,-46 1321,-52"/>
<polyline fill="none" stroke="black" points="1321,-52 1321,-46 "/>
<polyline fill="none" stroke="black" points="1327,-46 1321,-46 "/>
<text text-anchor="middle" x="1251" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_build.tar</text>
<polygon fill="royalblue" stroke="black" points="1653.88,-52 1466.12,-52 1466.12,-16 1659.88,-16 1659.88,-46 1653.88,-52"/>
<polyline fill="none" stroke="black" points="1653.88,-52 1653.88,-46"/>
<polyline fill="none" stroke="black" points="1659.88,-46 1653.88,-46"/>
<text text-anchor="middle" x="1563" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_build.tar</text>
</g>
<!-- LANGBUILD_IMG&#45;&gt;LANGBUILD_TAR -->
<g id="edge22" class="edge">
<title>LANGBUILD_IMG&#45;&gt;LANGBUILD_TAR</title>
<path fill="none" stroke="red" d="M903.09,-551.05C994.18,-539.83 1112.54,-519.3 1147,-486 1209.09,-426 1137.76,-363.02 1194,-297.5 1207.49,-281.78 1225.03,-296.41 1237,-279.5 1283.79,-213.37 1268.69,-110.25 1257.9,-61.83"/>
<polygon fill="red" stroke="red" points="1261.31,-61.03 1255.63,-52.09 1254.5,-62.62 1261.31,-61.03"/>
<text text-anchor="middle" x="1290.5" y="-301.3" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_build</text>
<path fill="none" stroke="red" d="M1149.52,-595.67C1267.15,-586.21 1420.01,-565.7 1463,-522 1527.83,-456.1 1436.35,-387.25 1496,-316.62 1512.05,-297.62 1533.98,-318.46 1549,-298.62 1602.01,-228.63 1583.52,-115.76 1570.86,-63.38"/>
<polygon fill="red" stroke="red" points="1574.27,-62.59 1568.41,-53.76 1567.48,-64.32 1574.27,-62.59"/>
<text text-anchor="middle" x="1622" y="-320.57" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_build</text>
</g>
<!-- LANGTEST_TAR -->
<g id="node23" class="node">
<title>LANGTEST_TAR</title>
<polygon fill="royalblue" stroke="black" points="325.5,-52 188.5,-52 188.5,-16 331.5,-16 331.5,-46 325.5,-52"/>
<polyline fill="none" stroke="black" points="325.5,-52 325.5,-46 "/>
<polyline fill="none" stroke="black" points="331.5,-46 325.5,-46 "/>
<text text-anchor="middle" x="260" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_test.tar</text>
<polygon fill="royalblue" stroke="black" points="409.75,-52 230.25,-52 230.25,-16 415.75,-16 415.75,-46 409.75,-52"/>
<polyline fill="none" stroke="black" points="409.75,-52 409.75,-46"/>
<polyline fill="none" stroke="black" points="415.75,-46 409.75,-46"/>
<text text-anchor="middle" x="323" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_test.tar</text>
</g>
<!-- LANGTEST_IMG&#45;&gt;LANGTEST_TAR -->
<g id="edge23" class="edge">
<title>LANGTEST_IMG&#45;&gt;LANGTEST_TAR</title>
<path fill="none" stroke="red" d="M571.29,-453.97C446.85,-445.32 260,-421.66 260,-357.62 260,-357.62 260,-357.62 260,-149.12 260,-119.36 260,-85.24 260,-62.11"/>
<polygon fill="red" stroke="red" points="263.5,-62.01 260,-52.01 256.5,-62.02 263.5,-62.01"/>
<text text-anchor="middle" x="352" y="-249.68" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_test</text>
<path fill="none" stroke="red" d="M736.51,-491.35C572.08,-486.92 323,-466.32 323,-382.09 323,-382.09 323,-382.09 323,-156.72 323,-124.9 323,-88.41 323,-63.74"/>
<polygon fill="red" stroke="red" points="326.5,-63.85 323,-53.85 319.5,-63.85 326.5,-63.85"/>
<text text-anchor="middle" x="444.88" y="-264.73" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_test</text>
</g>
<!-- LANGINSTALLENV_IMG&#45;&gt;LANGINSTALLDEVEL_IMG -->
<g id="edge9" class="edge">
<title>LANGINSTALLENV_IMG&#45;&gt;LANGINSTALLDEVEL_IMG</title>
<path fill="none" stroke="black" d="M909.52,-433.59C896.26,-420.42 879.89,-404.17 865.7,-390.08"/>
<polygon fill="black" stroke="black" points="868.07,-387.5 858.5,-382.94 863.14,-392.47 868.07,-387.5"/>
<path fill="none" stroke="black" d="M1160.6,-463.25C1139.55,-449.09 1113.95,-431.85 1091.75,-416.92"/>
<polygon fill="black" stroke="black" points="1093.98,-414.2 1083.73,-411.52 1090.07,-420.01 1093.98,-414.2"/>
</g>
<!-- LANGINSTALLENV_TAR -->
<g id="node24" class="node">
<title>LANGINSTALLENV_TAR</title>
<polygon fill="royalblue" stroke="black" points="1150.5,-52 973.5,-52 973.5,-16 1156.5,-16 1156.5,-46 1150.5,-52"/>
<polyline fill="none" stroke="black" points="1150.5,-52 1150.5,-46 "/>
<polyline fill="none" stroke="black" points="1156.5,-46 1150.5,-46 "/>
<text text-anchor="middle" x="1065" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_env.tar</text>
<polygon fill="royalblue" stroke="black" points="1442,-52 1216,-52 1216,-16 1448,-16 1448,-46 1442,-52"/>
<polyline fill="none" stroke="black" points="1442,-52 1442,-46"/>
<polyline fill="none" stroke="black" points="1448,-46 1442,-46"/>
<text text-anchor="middle" x="1332" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_env.tar</text>
</g>
<!-- LANGINSTALLENV_IMG&#45;&gt;LANGINSTALLENV_TAR -->
<g id="edge24" class="edge">
<title>LANGINSTALLENV_IMG&#45;&gt;LANGINSTALLENV_TAR</title>
<path fill="none" stroke="red" d="M950.82,-433.61C959.29,-419.16 969.32,-400.45 976,-382.75 1001.04,-316.38 976.99,-288.95 1012,-227.25 1028.13,-198.82 1051.14,-205.86 1065,-176.25 1082.13,-139.66 1077.21,-91.66 1071.53,-62.09"/>
<polygon fill="red" stroke="red" points="1074.91,-61.16 1069.44,-52.09 1068.06,-62.59 1074.91,-61.16"/>
<text text-anchor="middle" x="1124.5" y="-249.68" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_env</text>
<path fill="none" stroke="red" d="M1209.41,-463.14C1212.89,-447.54 1217.23,-427.87 1221,-410.31 1237.22,-334.8 1212.27,-303.51 1256.5,-240.19 1282.14,-203.49 1319,-225.35 1342,-186.94 1364.84,-148.8 1353.36,-95.2 1342.79,-62.91"/>
<polygon fill="red" stroke="red" points="1346.23,-62.17 1339.64,-53.87 1339.62,-64.46 1346.23,-62.17"/>
<text text-anchor="middle" x="1402.75" y="-264.73" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_env</text>
</g>
<!-- LANGINSTALLBUILD_IMG -->
<g id="node16" class="node">
<title>LANGINSTALLBUILD_IMG</title>
<path fill="royalblue" stroke="black" d="M962,-274.85C962,-277.49 902.39,-279.63 829,-279.63 755.61,-279.63 696,-277.49 696,-274.85 696,-274.85 696,-231.9 696,-231.9 696,-229.26 755.61,-227.12 829,-227.12 902.39,-227.12 962,-229.26 962,-231.9 962,-231.9 962,-274.85 962,-274.85"/>
<path fill="none" stroke="black" d="M962,-274.85C962,-272.22 902.39,-270.08 829,-270.08 755.61,-270.08 696,-272.22 696,-274.85"/>
<text text-anchor="middle" x="829" y="-257.18" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_build</text>
<text text-anchor="middle" x="829" y="-242.18" font-family="Times,serif" font-size="14.00">install_build</text>
<path fill="royalblue" stroke="black" d="M1205.75,-293.31C1205.75,-296.24 1129.22,-298.62 1035,-298.62 940.78,-298.62 864.25,-296.24 864.25,-293.31 864.25,-293.31 864.25,-245.5 864.25,-245.5 864.25,-242.57 940.78,-240.19 1035,-240.19 1129.22,-240.19 1205.75,-242.57 1205.75,-245.5 1205.75,-245.5 1205.75,-293.31 1205.75,-293.31"/>
<path fill="none" stroke="black" d="M1205.75,-293.31C1205.75,-290.38 1129.22,-288 1035,-288 940.78,-288 864.25,-290.38 864.25,-293.31"/>
<text text-anchor="middle" x="1035" y="-273.36" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_build</text>
<text text-anchor="middle" x="1035" y="-256.11" font-family="Times,serif" font-size="14.00">install_build</text>
</g>
<!-- LANGINSTALLDEVEL_IMG&#45;&gt;LANGINSTALLBUILD_IMG -->
<g id="edge10" class="edge">
<title>LANGINSTALLDEVEL_IMG&#45;&gt;LANGINSTALLBUILD_IMG</title>
<path fill="none" stroke="black" d="M832,-330.34C831.52,-318.13 830.93,-303.29 830.41,-289.97"/>
<polygon fill="black" stroke="black" points="833.89,-289.55 830,-279.69 826.9,-289.82 833.89,-289.55"/>
<path fill="none" stroke="black" d="M1038.7,-351.56C1038.12,-338.87 1037.43,-323.71 1036.8,-309.94"/>
<polygon fill="black" stroke="black" points="1040.31,-310.14 1036.36,-300.31 1033.32,-310.46 1040.31,-310.14"/>
</g>
<!-- LANGINSTALLDEVEL_TAR -->
<g id="node25" class="node">
<title>LANGINSTALLDEVEL_TAR</title>
<polygon fill="royalblue" stroke="black" points="538,-52 350,-52 350,-16 544,-16 544,-46 538,-52"/>
<polyline fill="none" stroke="black" points="538,-52 538,-46 "/>
<polyline fill="none" stroke="black" points="544,-46 538,-46 "/>
<text text-anchor="middle" x="447" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_devel.tar</text>
<polygon fill="royalblue" stroke="black" points="674.5,-52 433.5,-52 433.5,-16 680.5,-16 680.5,-46 674.5,-52"/>
<polyline fill="none" stroke="black" points="674.5,-52 674.5,-46"/>
<polyline fill="none" stroke="black" points="680.5,-46 674.5,-46"/>
<text text-anchor="middle" x="557" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_devel.tar</text>
</g>
<!-- LANGINSTALLDEVEL_IMG&#45;&gt;LANGINSTALLDEVEL_TAR -->
<g id="edge25" class="edge">
<title>LANGINSTALLDEVEL_IMG&#45;&gt;LANGINSTALLDEVEL_TAR</title>
<path fill="none" stroke="red" d="M699.49,-340.39C615.23,-323.24 512.05,-286.77 456,-209.25 424.58,-165.79 432.31,-99.12 440.07,-62.11"/>
<polygon fill="red" stroke="red" points="443.55,-62.6 442.33,-52.07 436.72,-61.06 443.55,-62.6"/>
<text text-anchor="middle" x="573.5" y="-198.05" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_devel</text>
<path fill="none" stroke="red" d="M867.82,-367.71C765.65,-350.74 642.77,-311.59 572.75,-222.19 536.86,-176.37 543.36,-103.46 550.58,-63.5"/>
<polygon fill="red" stroke="red" points="553.97,-64.43 552.46,-53.94 547.1,-63.08 553.97,-64.43"/>
<text text-anchor="middle" x="725.38" y="-208.89" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_devel</text>
</g>
<!-- LANGINSTALLTEST_IMG -->
<g id="node17" class="node">
<title>LANGINSTALLTEST_IMG</title>
<path fill="royalblue" stroke="black" d="M1055.5,-171.6C1055.5,-174.24 997.9,-176.38 927,-176.38 856.1,-176.38 798.5,-174.24 798.5,-171.6 798.5,-171.6 798.5,-128.65 798.5,-128.65 798.5,-126.01 856.1,-123.87 927,-123.87 997.9,-123.87 1055.5,-126.01 1055.5,-128.65 1055.5,-128.65 1055.5,-171.6 1055.5,-171.6"/>
<path fill="none" stroke="black" d="M1055.5,-171.6C1055.5,-168.97 997.9,-166.83 927,-166.83 856.1,-166.83 798.5,-168.97 798.5,-171.6"/>
<text text-anchor="middle" x="927" y="-153.93" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_test</text>
<text text-anchor="middle" x="927" y="-138.93" font-family="Times,serif" font-size="14.00">install_test</text>
<path fill="royalblue" stroke="black" d="M1332.62,-181.62C1332.62,-184.56 1257.94,-186.94 1166,-186.94 1074.06,-186.94 999.38,-184.56 999.38,-181.62 999.38,-181.62 999.38,-133.81 999.38,-133.81 999.38,-130.88 1074.06,-128.5 1166,-128.5 1257.94,-128.5 1332.62,-130.88 1332.62,-133.81 1332.62,-133.81 1332.62,-181.62 1332.62,-181.62"/>
<path fill="none" stroke="black" d="M1332.62,-181.62C1332.62,-178.69 1257.94,-176.31 1166,-176.31 1074.06,-176.31 999.38,-178.69 999.38,-181.62"/>
<text text-anchor="middle" x="1166" y="-161.67" font-family="Times,serif" font-size="14.00">ortools/cmake:&lt;distro&gt;_&lt;lang&gt;_install_test</text>
<text text-anchor="middle" x="1166" y="-144.42" font-family="Times,serif" font-size="14.00">install_test</text>
</g>
<!-- LANGINSTALLBUILD_IMG&#45;&gt;LANGINSTALLTEST_IMG -->
<g id="edge11" class="edge">
<title>LANGINSTALLBUILD_IMG&#45;&gt;LANGINSTALLTEST_IMG</title>
<path fill="none" stroke="black" d="M853.48,-227.09C866.11,-214.04 881.66,-197.97 895.21,-183.97"/>
<polygon fill="black" stroke="black" points="898.06,-186.06 902.5,-176.44 893.03,-181.19 898.06,-186.06"/>
<path fill="none" stroke="black" d="M1069.08,-239.87C1085.75,-225.91 1106,-208.96 1123.66,-194.17"/>
<polygon fill="black" stroke="black" points="1125.51,-197.18 1130.93,-188.08 1121.02,-191.82 1125.51,-197.18"/>
</g>
<!-- LANGINSTALLBUILD_TAR -->
<g id="node26" class="node">
<title>LANGINSTALLBUILD_TAR</title>
<polygon fill="royalblue" stroke="black" points="748,-52 562,-52 562,-16 754,-16 754,-46 748,-52"/>
<polyline fill="none" stroke="black" points="748,-52 748,-46 "/>
<polyline fill="none" stroke="black" points="754,-46 748,-46 "/>
<text text-anchor="middle" x="658" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_build.tar</text>
<polygon fill="royalblue" stroke="black" points="937.38,-52 698.62,-52 698.62,-16 943.38,-16 943.38,-46 937.38,-52"/>
<polyline fill="none" stroke="black" points="937.38,-52 937.38,-46"/>
<polyline fill="none" stroke="black" points="943.38,-46 937.38,-46"/>
<text text-anchor="middle" x="821" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_build.tar</text>
</g>
<!-- LANGINSTALLBUILD_IMG&#45;&gt;LANGINSTALLBUILD_TAR -->
<g id="edge26" class="edge">
<title>LANGINSTALLBUILD_IMG&#45;&gt;LANGINSTALLBUILD_TAR</title>
<path fill="none" stroke="red" d="M779.94,-227.16C755.09,-215.41 724.09,-202.28 695,-194.25 665.19,-186.02 577.41,-199.49 557,-176.25 539.33,-156.13 545.41,-140.14 557,-116 569.05,-90.89 593.1,-71.11 614.71,-57.38"/>
<polygon fill="red" stroke="red" points="616.74,-60.24 623.47,-52.05 613.11,-54.26 616.74,-60.24"/>
<text text-anchor="middle" x="673.5" y="-146.43" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_build</text>
<path fill="none" stroke="red" d="M977.55,-239.74C949.43,-226.97 914.66,-213.02 882,-204.94 839.76,-194.48 716.32,-219.09 687,-186.94 667.1,-165.12 672.81,-146.39 687,-120.5 702.95,-91.4 733.48,-70.78 761.37,-57.09"/>
<polygon fill="red" stroke="red" points="762.55,-60.4 770.12,-52.99 759.58,-54.06 762.55,-60.4"/>
<text text-anchor="middle" x="838.5" y="-153.04" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_build</text>
</g>
<!-- LANGINSTALLTEST_TAR -->
<g id="node27" class="node">
<title>LANGINSTALLTEST_TAR</title>
<polygon fill="royalblue" stroke="black" points="949.5,-52 772.5,-52 772.5,-16 955.5,-16 955.5,-46 949.5,-52"/>
<polyline fill="none" stroke="black" points="949.5,-52 949.5,-46 "/>
<polyline fill="none" stroke="black" points="955.5,-46 949.5,-46 "/>
<text text-anchor="middle" x="864" y="-30.3" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_test.tar</text>
<polygon fill="royalblue" stroke="black" points="1192.25,-52 961.75,-52 961.75,-16 1198.25,-16 1198.25,-46 1192.25,-52"/>
<polyline fill="none" stroke="black" points="1192.25,-52 1192.25,-46"/>
<polyline fill="none" stroke="black" points="1198.25,-46 1192.25,-46"/>
<text text-anchor="middle" x="1080" y="-29.32" font-family="Times,serif" font-size="14.00">docker_&lt;lang&gt;_install_test.tar</text>
</g>
<!-- LANGINSTALLTEST_IMG&#45;&gt;LANGINSTALLTEST_TAR -->
<g id="edge27" class="edge">
<title>LANGINSTALLTEST_IMG&#45;&gt;LANGINSTALLTEST_TAR</title>
<path fill="none" stroke="red" d="M862.41,-123.85C855.91,-118.87 850.18,-112.97 846,-106 837.86,-92.45 841.87,-75.32 848.15,-61.28"/>
<polygon fill="red" stroke="red" points="851.38,-62.64 852.74,-52.13 845.13,-59.5 851.38,-62.64"/>
<text text-anchor="middle" x="958" y="-94.8" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_test</text>
<path fill="none" stroke="red" d="M1069.37,-128.26C1062.76,-123.26 1056.89,-117.4 1052.25,-110.5 1042.27,-95.67 1049.2,-76.81 1058.63,-61.64"/>
<polygon fill="red" stroke="red" points="1061.42,-63.76 1064.18,-53.54 1055.64,-59.81 1061.42,-63.76"/>
<text text-anchor="middle" x="1199.62" y="-97.2" font-family="Times,serif" font-size="14.00">make save_&lt;distro&gt;_&lt;lang&gt;_install_test</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,191 @@
#!/usr/bin/env python3
# Copyright 2010-2025 Google LLC
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This model implements the permutation flow shop problem (PFSP).
In the PFSP, a set of jobs has to be processed on a set of machines. Each job
must be processed on each machine in sequence and all jobs have to be processed
in the same order on every machine. The objective is to minimize the makespan.
"""
from typing import Sequence
from dataclasses import dataclass
from itertools import product
import numpy as np
from absl import app
from absl import flags
from google.protobuf import text_format
from ortools.sat.python import cp_model
_PARAMS = flags.DEFINE_string(
"params",
"num_search_workers:16",
"Sat solver parameters.",
)
_TIME_LIMIT = flags.DEFINE_float(
"time_limit",
60.0,
"Time limit in seconds. Default is 60s.",
)
_LOG = flags.DEFINE_boolean(
"log",
False,
"Whether to log the solver output.",
)
@dataclass
class TaskType:
"""
Small wrapper to hold the start, end, and interval variables of a task.
"""
start: cp_model.IntVar
end: cp_model.IntVar
interval: cp_model.IntervalVar
def permutation_flow_shop(
processing_times: np.ndarray,
time_limit: float,
log: bool,
params: str
):
"""
Solves the given permutation flow shop problem instance with OR-Tools.
Parameters
----------
processing_times
An n-by-m matrix of processing times of the jobs on the machines.
time_limit
The time limit in seconds. If not set, the solver runs until an
optimal solution is found.
log
Whether to log the solver output. Default is False.
Raises
------
ValueError
If the number of lines is greater than 1, i.e., the instance is a
distributed permutation flow shop problem.
"""
m = cp_model.CpModel()
num_jobs, num_machines = processing_times.shape
horizon = processing_times.sum()
# Create interval variables for all tasks (each job/machine pair).
tasks = {}
for job, machine in product(range(num_jobs), range(num_machines)):
start = m.new_int_var(0, horizon, "")
end = m.new_int_var(0, horizon, "")
duration = processing_times[job][machine]
interval = m.new_interval_var(start, duration, end, "")
tasks[job, machine] = TaskType(start, end, interval)
# No overlap for all job intervals on this machine.
for machine in range(num_machines):
intervals = [tasks[job, machine].interval for job in range(num_jobs)]
m.add_no_overlap(intervals)
# Add precedence constraints between tasks of the same job.
for job, machine in product(range(num_jobs), range(num_machines - 1)):
pred = tasks[job, machine]
succ = tasks[job, machine + 1]
m.add(pred.end <= succ.start)
# Create arcs for circuit constraints.
arcs = []
for idx1 in range(num_jobs):
arcs.append((0, idx1 + 1, m.new_bool_var("start")))
arcs.append((idx1 + 1, 0, m.new_bool_var("end")))
lits = {}
for idx1, idx2 in product(range(num_jobs), repeat=2):
if idx1 != idx2:
lit = m.new_bool_var(f"{idx1} -> {idx2}")
lits[idx1, idx2] = lit
arcs.append((idx1 + 1, idx2 + 1, lit))
m.add_circuit(arcs)
# Enforce that the permutation of jobs is the same on all machines.
for machine in range(num_machines):
starts = [tasks[job, machine].start for job in range(num_jobs)]
ends = [tasks[job, machine].end for job in range(num_jobs)]
for idx1, idx2 in product(range(num_jobs), repeat=2):
if idx1 == idx2:
continue
# Since all machines share the same arc literals, if the literal
# i -> j is True, this enforces that job i is always scheduled
# before job j on all machines.
lit = lits[idx1, idx2]
m.add(ends[idx1] <= starts[idx2]).only_enforce_if(lit)
# Set minimizing makespan as objective.
obj_var = m.new_int_var(0, horizon, "makespan")
completion_times = [
tasks[(job, num_machines - 1)].end for job in range(num_jobs)
]
m.add_max_equality(obj_var, completion_times)
m.minimize(obj_var)
solver = cp_model.CpSolver()
if params:
text_format.Parse(params, solver.parameters)
solver.parameters.log_search_progress = log
solver.parameters.max_time_in_seconds = time_limit
status_code = solver.Solve(m)
status = solver.StatusName(status_code)
print(f"Status: {status}")
print(f"Makespan: {solver.ObjectiveValue()}")
if status in ["OPTIMAL", "FEASIBLE"]:
start = [solver.Value(tasks[job, 0].start) for job in range(num_jobs)]
solution = np.argsort(start) + 1
print(f"Solution: {solution}")
def main(argv: Sequence[str]) -> None:
"""Creates the data and calls the solving procedure."""
# VRF_10_5_2 instance from http://soa.iti.es/problem-instances.
# Optimal makespan is 698.
processing_times = [
[79, 67, 10, 48, 52],
[40, 40, 57, 21, 54],
[48, 93, 49, 11, 79],
[16, 23, 19, 2, 38],
[38, 90, 57, 73, 3],
[76, 13, 99, 98, 55],
[73, 85, 40, 20, 85],
[34, 6, 27, 53, 21],
[38, 6, 35, 28, 44],
[32, 11, 11, 34, 27],
]
permutation_flow_shop(
np.array(processing_times), _TIME_LIMIT.value, _LOG.value, _PARAMS.value
)
if __name__ == "__main__":
app.run(main)

View File

@@ -3,7 +3,7 @@
The following examples showcase how to use OrTools.<br>
The project solution has examples for C#.
We recommend that all projects you create target `net6.0`,
We recommend that all projects you create target `net8.0`,
as this allows you to compile for various frameworks and
keep up-to-date with the latest frameworks.

View File

@@ -76,6 +76,129 @@ Flow algorithms:
supplies/demands at nodes, based on the Goldberg-Tarjan push-relabel
algorithm.
## Class design
`BaseGraph` is a generic graph interface on which most algorithms can be built
and provides efficient implementations with a fast construction time. Its design
is based on the experience acquired in various graph algorithm implementations.
The main ideas are:
- Graph nodes and arcs are represented by integers.
- Node or arc annotations (weight, cost, ...) are not part of the graph class,
they can be stored outside in one or more arrays and can be easily retrieved
using a node or arc as an index.
### Terminology
An *arc* (or *forward arc*) of a graph is directed and going from a *tail node*
to a *head node*.
```mermaid
graph TD;
tail -->|arc| head;
```
Node and arc indices are of type `NodeIndexType` and `ArcIndexType`
respectively. Those default to `int32_t`, which allows representing most
practical graphs, but applications that have smaller graphs can improve memory
usage and locality by parameterizing the graph type (e.g. `BaseGraph<int16_t,
int16_t>` allows representing graphs with up to 65k nodes and arcs).
A node or arc index is *valid* if it represents a node or arc of the graph. The
validity ranges are always `[0, num_nodes())` for nodes and `[0, num_arcs())`
for forward arcs. For example, the following graph has 4 nodes numbered 0
through 3 and 5 forward arcs numbered 0 through 4:
```mermaid
graph TD;
0-->|0| 1;
2-->|1| 1;
0-->|2| 2;
3-->|3| 3;
1-->|4| 2;
```
Some graph implementations also store *reverse arcs* and can be used for
undirected graphs or flow-like algorithms. Reverse arcs are elements of
`[-num_arcs(), 0)` and are also considered valid by the implementations that
store them. In the following diagram, reverse arcs are represented with dashed
lines. A reverse arc is created for each forward arc (the forward and
reverse arc in this pair are called *opposite* of each other). This possibly
results in multiarcs:
```mermaid
graph TD;
0-->|0| 1;
1-.->|-1| 0;
2-->|1| 1;
1-.->|-2| 2;
0-->|2| 2;
2-.->|-3| 0;
3-->|3| 3;
3-.->|-4| 3;
1-->|4| 2;
2-.->|-5| 1;
```
#### Graph traversal
- The *outgoing arcs* of a node `v` are the forward arcs whose tail is `v`.
- The *incoming arcs* of `v` are the forward arcs whose head is `v`.
- The *opposite incoming* arcs of `v` are the opposite arcs of the incoming
arcs for `v`.
Forward graph classes allow iteration on outgoing arcs using accessor
`OutgoingArcs()`. Graph classes with both forward and reverse arcs additionally
provide `IncomingArcs` and `OppositeIncomingArcs()`, that return iterators for
the two other categories. They also provide `OutgoingOrOppositeIncomingArcs()`,
which allows iterating both outgoing and opposite incoming arcs at the same
time, which corresponds to iterating forward and reverse arcs *leaving* the
node.
`v` | `OutgoingArcs(v)` | `IncomingArcs(v)` | `OppositeIncomingArcs(v)` | `OutgoingOrOppositeIncoming(v)`
--- | ----------------- | ----------------- | ------------------------- | -------------------------------
0 | {0,2} | {} | {} | {0,2}
1 | {4} | {0,1} | {-2,-1} | {-2,-1,4}
2 | {1} | {2,4} | {-5,-3} | {-5,-3,1}
3 | {3} | {3} | {-4} | {-4,3}
### Graph implementations
- `ListGraph<>`: Simplest API. Iterating outgoing arcs requires `2 + degree`
memory loads.
- `StaticGraph<>`: More memory and speed efficient than `ListGraph<>`, but
requires calling `Build()` once after adding all nodes and arcs. Iterating
outgoing arcs requires only `2` memory loads.
- `ReverseArcListGraph<>` adds reverse arcs to `ListGraph<>`. Iterating
neighboring arcs for a node requires `O(degree)` memory loads.
- `ReverseArcStaticGraph<>` adds reverse arcs to `StaticGraph<>`. Iterating
neighboring arcs for a node requires `O(1)` memory loads.
- `CompleteGraph<>`: If you need a fully connected graph. O(1) memory usage
and much faster than explicitly storing nodes and arcs using
`StaticGraph<>`.
- `CompleteBipartiteGraph<>`: If you need a fully connected bipartite graph.
O(1) memory usage and much faster than explicitly storing nodes and arcs
using `StaticGraph<>`.
- `FlowGraph<>`: A graph specialized for max-flow/min-cost-flow algorithms.
For max-flow or min-cost-flow we need a directed graph where each arc from
tail to head has a reverse arc from head to tail. In practice many input
graphs already have such reverse arc and it can make a big difference just
to reuse them. This is similar to `ReverseArcStaticGraph` but handles
reverse arcs in a different way. Instead of always creating a *new* reverse
arc for each arc of the input graph, this detects if a reverse arc is
already present in the input, and does not create a new one when this is the
case. In the best case, this can gain a factor 2 in the final graph size,
note however that the graph construction is slightly slower because of this
detection.
## Wrappers
* [`python`](python): the SWIG code that makes the wrapper available in Python

View File

@@ -352,9 +352,9 @@ void AddSourceAndSink(const typename Graph::NodeIndex num_tails,
}
template <typename Graph>
void GenerateCompleteGraph(const typename Graph::NodeIndex num_tails,
const typename Graph::NodeIndex num_heads,
Graph* graph) {
void GenerateCompleteGraphWithSourceAndSink(
const typename Graph::NodeIndex num_tails,
const typename Graph::NodeIndex num_heads, Graph* graph) {
const typename Graph::NodeIndex num_nodes = num_tails + num_heads + 2;
const typename Graph::ArcIndex num_arcs =
num_tails * num_heads + num_tails + num_heads;
@@ -470,7 +470,7 @@ void FullAssignment(std::optional<FlowQuantity> unused,
typename Graph::NodeIndex num_tails,
typename Graph::NodeIndex num_heads) {
Graph graph;
GenerateCompleteGraph(num_tails, num_heads, &graph);
GenerateCompleteGraphWithSourceAndSink(num_tails, num_heads, &graph);
graph.Build();
std::vector<int64_t> arc_capacity(graph.num_arcs(), 1);
std::unique_ptr<GenericMaxFlow<Graph>> max_flow(new GenericMaxFlow<Graph>(
@@ -590,7 +590,7 @@ void FullRandomFlow(std::optional<FlowQuantity> expected_flow,
const FlowQuantity kCapacityRange = 10000;
const FlowQuantity kCapacityDelta = 1000;
Graph graph;
GenerateCompleteGraph(num_tails, num_heads, &graph);
GenerateCompleteGraphWithSourceAndSink(num_tails, num_heads, &graph);
std::vector<int64_t> arc_capacity(graph.num_arcs());
GenerateRandomArcValuations(random, graph, kCapacityRange, &arc_capacity);

View File

@@ -0,0 +1,119 @@
// Copyright 2010-2025 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef UTIL_GRAPH_GRAPH_GENERATOR_H_
#define UTIL_GRAPH_GRAPH_GENERATOR_H_
// Generates a complete undirected graph with `num_nodes` nodes.
//
// A complete graph is a graph in which all pairs of distinct nodes are
// connected by an edge.
// The graph is represented using the provided `Graph` template.
// If the chosen graph type requires a call to `Build()`, the user is expected
// to perform this call, possibly after tweaking the graph.
//
// Consider using `CompleteGraph` (util/graph/graph.h) instead of this function
// in production code, as it uses constant memory to store the graph. Instead,
// this function explicitly creates the graph using the template type, which is
// mostly useful for tests or when you have to tweak the graph after creation
// (i.e. a complete graph is just the core of your final graph).
//
// Args:
// num_nodes: The number of nodes in the graph.
//
// Returns:
// A complete undirected graph.
template <typename Graph>
Graph GenerateCompleteUndirectedGraph(
const typename Graph::NodeIndex num_nodes) {
Graph graph;
graph.Reserve(num_nodes, num_nodes * (num_nodes - 1));
graph.AddNode(num_nodes - 1); // Only for degenerate cases with no arcs.
for (typename Graph::NodeIndex src = 0; src < num_nodes; ++src) {
for (typename Graph::NodeIndex dst = src + 1; dst < num_nodes; ++dst) {
graph.AddArc(src, dst);
graph.AddArc(dst, src);
}
}
return graph;
}
// Generates a complete undirected bipartite graph with `num_nodes_1` and
// `num_nodes_2` nodes in each part.
//
// A complete bipartite graph is a graph in which all pairs of distinct nodes,
// one in each part, are connected by an edge.
// The graph is represented using the provided `Graph` template.
// If the chosen graph type requires a call to `Build()`, the user is expected
// to perform this call, possibly after tweaking the graph.
//
// Args:
// num_nodes_1: The number of nodes in the first part of the graph.
// num_nodes_2: The number of nodes in the second part of the graph.
//
// Returns:
// A complete undirected bipartite graph.
template <typename Graph>
Graph GenerateCompleteUndirectedBipartiteGraph(
const typename Graph::NodeIndex num_nodes_1,
const typename Graph::NodeIndex num_nodes_2) {
Graph graph;
graph.Reserve(num_nodes_1 + num_nodes_2, 2 * num_nodes_1 * num_nodes_2);
graph.AddNode(num_nodes_1 + num_nodes_2 - 1); // Only for degenerate cases.
for (typename Graph::NodeIndex src = 0; src < num_nodes_1; ++src) {
for (typename Graph::NodeIndex dst = 0; dst < num_nodes_2; ++dst) {
graph.AddArc(src, num_nodes_1 + dst);
graph.AddArc(num_nodes_1 + dst, src);
}
}
return graph;
}
// Generates a complete directed bipartite graph with `num_nodes_1` and
// `num_nodes_2` nodes in each part.
//
// A complete bipartite graph is a graph in which all pairs of distinct nodes,
// one in each part, are connected by an edge. Edges are directed from the first
// part towards the second part.
// The graph is represented using the provided `Graph` template.
// If the chosen graph type requires a call to `Build()`, the user is expected
// to perform this call, possibly after tweaking the graph.
//
// Consider using `CompleteBipartiteGraph` (util/graph/graph.h) instead of this
// function in production code, as it uses constant memory to store the graph.
// Instead, this function explicitly creates the graph using the template type,
// which is mostly useful for tests or when you have to tweak the graph after
// creation (i.e. a complete graph is just the core of your final graph).
//
// Args:
// num_nodes_1: The number of nodes in the first part of the graph.
// num_nodes_2: The number of nodes in the second part of the graph.
//
// Returns:
// A complete directed bipartite graph.
template <typename Graph>
Graph GenerateCompleteDirectedBipartiteGraph(
const typename Graph::NodeIndex num_nodes_1,
const typename Graph::NodeIndex num_nodes_2) {
Graph graph;
graph.Reserve(num_nodes_1 + num_nodes_2, num_nodes_1 * num_nodes_2);
graph.AddNode(num_nodes_1 + num_nodes_2 - 1); // Only for degenerate cases.
for (typename Graph::NodeIndex src = 0; src < num_nodes_1; ++src) {
for (typename Graph::NodeIndex dst = 0; dst < num_nodes_2; ++dst) {
graph.AddArc(src, num_nodes_1 + dst);
}
}
return graph;
}
#endif // UTIL_GRAPH_GRAPH_GENERATOR_H_

View File

@@ -0,0 +1,129 @@
// Copyright 2010-2025 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "ortools/graph/graph_generator.h"
#include <vector>
#include "gtest/gtest.h"
#include "ortools/base/gmock.h"
#include "ortools/graph/graph.h"
namespace {
using ::testing::IsEmpty;
using ::testing::UnorderedElementsAre;
template <typename Graph>
std::vector<int> OutgoingNodes(const Graph& graph,
typename Graph::NodeIndex src) {
std::vector<int> nodes;
for (const typename Graph::ArcIndex arc : graph.OutgoingArcs(src)) {
nodes.push_back(graph.Head(arc));
}
return nodes;
}
template <class T>
class GenerateCompleteUndirectedGraphTest : public testing::Test {};
using GenerateCompleteUndirectedGraphTypes =
::testing::Types<util::ListGraph<int, int>, util::StaticGraph<int, int>>;
TYPED_TEST_SUITE(GenerateCompleteUndirectedGraphTest,
GenerateCompleteUndirectedGraphTypes);
TYPED_TEST(GenerateCompleteUndirectedGraphTest, SimpleGraph) {
TypeParam graph = GenerateCompleteUndirectedGraph<TypeParam>(3);
graph.Build();
EXPECT_EQ(graph.num_nodes(), 3);
EXPECT_EQ(graph.num_arcs(), 6);
EXPECT_THAT(graph.OutDegree(0), 2);
EXPECT_THAT(graph.OutDegree(1), 2);
EXPECT_THAT(graph.OutDegree(2), 2);
EXPECT_THAT(OutgoingNodes(graph, 0), UnorderedElementsAre(1, 2));
EXPECT_THAT(OutgoingNodes(graph, 1), UnorderedElementsAre(0, 2));
EXPECT_THAT(OutgoingNodes(graph, 2), UnorderedElementsAre(0, 1));
}
TYPED_TEST(GenerateCompleteUndirectedGraphTest, SmallestGraph) {
TypeParam graph = GenerateCompleteUndirectedGraph<TypeParam>(1);
graph.Build();
EXPECT_EQ(graph.num_nodes(), 1);
EXPECT_EQ(graph.num_arcs(), 0);
EXPECT_THAT(OutgoingNodes(graph, 0), IsEmpty());
}
template <class T>
class GenerateCompleteUndirectedBipartiteGraphTest : public testing::Test {};
using GenerateCompleteUndirectedBipartiteGraphTypes =
::testing::Types<util::ListGraph<int, int>, util::StaticGraph<int, int>>;
TYPED_TEST_SUITE(GenerateCompleteUndirectedBipartiteGraphTest,
GenerateCompleteUndirectedBipartiteGraphTypes);
TYPED_TEST(GenerateCompleteUndirectedBipartiteGraphTest, SimpleGraph) {
TypeParam graph = GenerateCompleteUndirectedBipartiteGraph<TypeParam>(2, 3);
graph.Build();
EXPECT_EQ(graph.num_nodes(), 5);
EXPECT_EQ(graph.num_arcs(), 12);
EXPECT_THAT(OutgoingNodes(graph, 0), UnorderedElementsAre(2, 3, 4));
EXPECT_THAT(OutgoingNodes(graph, 1), UnorderedElementsAre(2, 3, 4));
EXPECT_THAT(OutgoingNodes(graph, 2), UnorderedElementsAre(0, 1));
EXPECT_THAT(OutgoingNodes(graph, 3), UnorderedElementsAre(0, 1));
EXPECT_THAT(OutgoingNodes(graph, 4), UnorderedElementsAre(0, 1));
}
template <class T>
class GenerateCompleteDirectedBipartiteGraphTest : public testing::Test {};
using GenerateCompleteDirectedBipartiteGraphTypes =
::testing::Types<util::ListGraph<int, int>, util::StaticGraph<int, int>>;
TYPED_TEST_SUITE(GenerateCompleteDirectedBipartiteGraphTest,
GenerateCompleteDirectedBipartiteGraphTypes);
TYPED_TEST(GenerateCompleteDirectedBipartiteGraphTest, SimpleGraph) {
TypeParam graph = GenerateCompleteDirectedBipartiteGraph<TypeParam>(2, 3);
graph.Build();
EXPECT_EQ(graph.num_nodes(), 5);
EXPECT_EQ(graph.num_arcs(), 6);
EXPECT_THAT(OutgoingNodes(graph, 0), UnorderedElementsAre(2, 3, 4));
EXPECT_THAT(OutgoingNodes(graph, 1), UnorderedElementsAre(2, 3, 4));
EXPECT_THAT(OutgoingNodes(graph, 2), IsEmpty());
EXPECT_THAT(OutgoingNodes(graph, 3), IsEmpty());
EXPECT_THAT(OutgoingNodes(graph, 4), IsEmpty());
}
TYPED_TEST(GenerateCompleteDirectedBipartiteGraphTest, SimplSmallestGraphLeft) {
TypeParam graph = GenerateCompleteDirectedBipartiteGraph<TypeParam>(1, 0);
graph.Build();
EXPECT_EQ(graph.num_nodes(), 1);
EXPECT_EQ(graph.num_arcs(), 0);
EXPECT_THAT(OutgoingNodes(graph, 0), IsEmpty());
}
TYPED_TEST(GenerateCompleteDirectedBipartiteGraphTest,
SimplSmallestGraphRight) {
TypeParam graph = GenerateCompleteDirectedBipartiteGraph<TypeParam>(0, 1);
graph.Build();
EXPECT_EQ(graph.num_nodes(), 1);
EXPECT_EQ(graph.num_arcs(), 0);
EXPECT_THAT(OutgoingNodes(graph, 0), IsEmpty());
}
} // namespace

View File

@@ -715,7 +715,6 @@ TYPED_TEST(GenericGraphInterfaceTest, EmptyGraphAlternateSyntax) {
EXPECT_EQ(ArcIndex(0), graph.num_arcs());
}
#if !defined(_MSC_VER)
TYPED_TEST(GenericGraphInterfaceTest, GraphWithNodesButNoArc) {
using NodeIndex = typename TypeParam::NodeIndex;
using ArcIndex = typename TypeParam::ArcIndex;
@@ -737,7 +736,6 @@ TYPED_TEST(GenericGraphInterfaceTest, GraphWithNodesButNoArc) {
}
EXPECT_EQ(0, count);
}
#endif // !defined(_MSC_VER)
TYPED_TEST(GenericGraphInterfaceTest, BuildWithRandomArc) {
using NodeIndex = typename TypeParam::NodeIndex;

View File

@@ -129,7 +129,6 @@ cc_test(
":symmetry",
"//ortools/base:gmock_main",
"//ortools/math_opt/testing:stream",
"@abseil-cpp//absl/strings",
],
)

View File

@@ -165,7 +165,8 @@ TEST(FormatAttrValueTest, FormatsInt64) {
}
TEST(FormatAttrValueTest, FormatsDouble) {
EXPECT_EQ(FormatAttrValue(absl::SixDigits(4.2)), "4.2");
// need a double with an exact binary representation
EXPECT_EQ(FormatAttrValue(4.5), "4.5");
}
} // namespace

View File

@@ -324,6 +324,7 @@ ortools_cxx_library(
TESTING
)
if(USE_SCIP AND USE_GLOP)
ortools_cxx_test(
NAME
${_PREFIX}_test_models_test
@@ -334,9 +335,8 @@ ortools_cxx_test(
GTest::gmock_main
ortools::math_opt_test_models
ortools::math_opt_matchers
#ortools::math_opt_glop_solver
#ortools::math_opt_gscipt_solver
)
endif()
ortools_cxx_library(
NAME

View File

@@ -33,6 +33,9 @@ target_link_libraries(${NAME} PRIVATE
if(BUILD_TESTING)
file(GLOB _TEST_SRCS "*_test.cc")
if(NOT USE_SCIP)
list(FILTER _TEST_SRCS EXCLUDE REGEX ".*/set_cover_test.cc")
endif()
foreach(_FULL_FILE_NAME IN LISTS _TEST_SRCS)
get_filename_component(_NAME ${_FULL_FILE_NAME} NAME_WE)
get_filename_component(_FILE_NAME ${_FULL_FILE_NAME} NAME)