acceptable_project clean

This commit is contained in:
Kevin Cavailles 2020-11-24 21:57:38 +01:00
parent d2f77bcfa2
commit e0f35908b2
41 changed files with 308 additions and 759 deletions

View file

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

21
graphs/graph3 Normal file
View file

@ -0,0 +1,21 @@
% This is a graph.
n 0.0 1.0
n 1.0 1.0
n 2.0 1.0
n 3.0 1.0
n 4.0 1.0
n 5.0 1.0
e 0 2 8/8
e 0 3 10/10
e 0 1 7/7
e 2 4 9/12
e 3 4 5/5
e 3 2 1/2
e 3 1 4/11
e 1 4 0/1
e 1 5 11/21
e 4 5 14/14
% End of graph

14
graphs/graph3.dot Normal file
View file

@ -0,0 +1,14 @@
digraph graphique1 {
size="20"
node [shape = circle];
0 -> 2 [ label = "8/8" ];
0 -> 3 [ label = "10/10" ];
0 -> 1 [ label = "7/7" ];
2 -> 4 [ label = "9/12" ];
3 -> 4 [ label = "5/5" ];
3 -> 2 [ label = "1/2" ];
3 -> 1 [ label = "4/11" ];
1 -> 4 [ label = "0/1" ];
1 -> 5 [ label = "11/21" ];
4 -> 5 [ label = "14/14" ];
}

119
graphs/graph3.svg Normal file
View file

@ -0,0 +1,119 @@
<?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.40.1 (20161225.0304)
-->
<!-- Title: graphique1 Pages: 1 -->
<svg width="188pt" height="392pt"
viewBox="0.00 0.00 188.00 392.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 388)">
<title>graphique1</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-388 184,-388 184,4 -4,4"/>
<!-- 0 -->
<g id="node1" class="node">
<title>0</title>
<ellipse fill="none" stroke="#000000" cx="72" cy="-366" rx="18" ry="18"/>
<text text-anchor="middle" x="72" y="-362.3" font-family="Times,serif" font-size="14.00" fill="#000000">0</text>
</g>
<!-- 2 -->
<g id="node2" class="node">
<title>2</title>
<ellipse fill="none" stroke="#000000" cx="18" cy="-192" rx="18" ry="18"/>
<text text-anchor="middle" x="18" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">2</text>
</g>
<!-- 0&#45;&gt;2 -->
<g id="edge1" class="edge">
<title>0&#45;&gt;2</title>
<path fill="none" stroke="#000000" d="M58.983,-353.1198C46.8886,-340.1986 29.6311,-319.0932 22,-297 13.3896,-272.0714 13.2288,-241.8111 14.72,-220.1919"/>
<polygon fill="#000000" stroke="#000000" points="18.2232,-220.3025 15.5845,-210.0415 11.2484,-219.7084 18.2232,-220.3025"/>
<text text-anchor="middle" x="33.5" y="-275.3" font-family="Times,serif" font-size="14.00" fill="#000000">8/8</text>
</g>
<!-- 3 -->
<g id="node3" class="node">
<title>3</title>
<ellipse fill="none" stroke="#000000" cx="72" cy="-279" rx="18" ry="18"/>
<text text-anchor="middle" x="72" y="-275.3" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
</g>
<!-- 0&#45;&gt;3 -->
<g id="edge2" class="edge">
<title>0&#45;&gt;3</title>
<path fill="none" stroke="#000000" d="M72,-347.9735C72,-336.1918 72,-320.5607 72,-307.1581"/>
<polygon fill="#000000" stroke="#000000" points="75.5001,-307.0033 72,-297.0034 68.5001,-307.0034 75.5001,-307.0033"/>
<text text-anchor="middle" x="92.5" y="-318.8" font-family="Times,serif" font-size="14.00" fill="#000000">10/10</text>
</g>
<!-- 1 -->
<g id="node4" class="node">
<title>1</title>
<ellipse fill="none" stroke="#000000" cx="137" cy="-192" rx="18" ry="18"/>
<text text-anchor="middle" x="137" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">1</text>
</g>
<!-- 0&#45;&gt;1 -->
<g id="edge3" class="edge">
<title>0&#45;&gt;1</title>
<path fill="none" stroke="#000000" d="M88.0173,-356.9724C97.8133,-350.6458 109.8055,-341.3126 117,-330 138.1739,-296.7064 140.4934,-249.8701 139.3836,-220.2302"/>
<polygon fill="#000000" stroke="#000000" points="142.8735,-219.9456 138.8482,-210.1452 135.8834,-220.3168 142.8735,-219.9456"/>
<text text-anchor="middle" x="148.5" y="-275.3" font-family="Times,serif" font-size="14.00" fill="#000000">7/7</text>
</g>
<!-- 4 -->
<g id="node5" class="node">
<title>4</title>
<ellipse fill="none" stroke="#000000" cx="76" cy="-105" rx="18" ry="18"/>
<text text-anchor="middle" x="76" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">4</text>
</g>
<!-- 2&#45;&gt;4 -->
<g id="edge4" class="edge">
<title>2&#45;&gt;4</title>
<path fill="none" stroke="#000000" d="M17.4941,-173.8297C17.9922,-163.523 19.9922,-150.773 26,-141 31.8818,-131.432 41.3501,-123.6565 50.4733,-117.8128"/>
<polygon fill="#000000" stroke="#000000" points="52.4786,-120.6944 59.336,-112.6181 48.9388,-114.6553 52.4786,-120.6944"/>
<text text-anchor="middle" x="42" y="-144.8" font-family="Times,serif" font-size="14.00" fill="#000000">9/12</text>
</g>
<!-- 3&#45;&gt;2 -->
<g id="edge6" class="edge">
<title>3&#45;&gt;2</title>
<path fill="none" stroke="#000000" d="M57.7101,-267.978C50.0595,-261.4356 41.0026,-252.5652 35,-243 30.5351,-235.8851 27.1085,-227.4695 24.5419,-219.5471"/>
<polygon fill="#000000" stroke="#000000" points="27.8925,-218.5344 21.7375,-209.9108 21.1713,-220.4905 27.8925,-218.5344"/>
<text text-anchor="middle" x="46.5" y="-231.8" font-family="Times,serif" font-size="14.00" fill="#000000">1/2</text>
</g>
<!-- 3&#45;&gt;1 -->
<g id="edge7" class="edge">
<title>3&#45;&gt;1</title>
<path fill="none" stroke="#000000" d="M81.6391,-263.4852C88.1991,-253.1991 97.2478,-239.5259 106,-228 109.7706,-223.0344 114.0174,-217.8624 118.1304,-213.0388"/>
<polygon fill="#000000" stroke="#000000" points="120.8975,-215.1906 124.8183,-205.3479 115.6153,-210.5973 120.8975,-215.1906"/>
<text text-anchor="middle" x="122" y="-231.8" font-family="Times,serif" font-size="14.00" fill="#000000">4/11</text>
</g>
<!-- 3&#45;&gt;4 -->
<g id="edge5" class="edge">
<title>3&#45;&gt;4</title>
<path fill="none" stroke="#000000" d="M72.4205,-260.7078C73.1185,-230.3436 74.5213,-169.3226 75.3484,-133.3464"/>
<polygon fill="#000000" stroke="#000000" points="78.8543,-133.1249 75.5851,-123.0471 71.8561,-132.964 78.8543,-133.1249"/>
<text text-anchor="middle" x="85.5" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">5/5</text>
</g>
<!-- 1&#45;&gt;4 -->
<g id="edge8" class="edge">
<title>1&#45;&gt;4</title>
<path fill="none" stroke="#000000" d="M124.6262,-178.7937C118.6943,-172.1806 111.6654,-163.9136 106,-156 100.1156,-147.7805 94.3223,-138.3442 89.4195,-129.8412"/>
<polygon fill="#000000" stroke="#000000" points="92.4435,-128.0782 84.4867,-121.0825 86.3443,-131.5132 92.4435,-128.0782"/>
<text text-anchor="middle" x="117.5" y="-144.8" font-family="Times,serif" font-size="14.00" fill="#000000">0/1</text>
</g>
<!-- 5 -->
<g id="node6" class="node">
<title>5</title>
<ellipse fill="none" stroke="#000000" cx="108" cy="-18" rx="18" ry="18"/>
<text text-anchor="middle" x="108" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">5</text>
</g>
<!-- 1&#45;&gt;5 -->
<g id="edge9" class="edge">
<title>1&#45;&gt;5</title>
<path fill="none" stroke="#000000" d="M138.6021,-173.6686C140.3628,-146.7805 141.4761,-95.3565 129,-54 127.7305,-49.7917 125.8809,-45.5534 123.798,-41.5363"/>
<polygon fill="#000000" stroke="#000000" points="126.7141,-39.5872 118.6779,-32.6828 120.6544,-43.0917 126.7141,-39.5872"/>
<text text-anchor="middle" x="159.5" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">11/21</text>
</g>
<!-- 4&#45;&gt;5 -->
<g id="edge10" class="edge">
<title>4&#45;&gt;5</title>
<path fill="none" stroke="#000000" d="M78.9419,-87.1717C80.8936,-77.2108 83.8652,-64.6891 88,-54 89.4953,-50.1345 91.3388,-46.1737 93.2963,-42.359"/>
<polygon fill="#000000" stroke="#000000" points="96.5174,-43.7648 98.2634,-33.3148 90.3818,-40.3951 96.5174,-43.7648"/>
<text text-anchor="middle" x="108.5" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">14/14</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

21
graphs/graph4 Normal file
View file

@ -0,0 +1,21 @@
% This is a graph.
n 0.0 1.0
n 1.0 1.0
n 2.0 1.0
n 3.0 1.0
n 4.0 1.0
n 5.0 1.0
e 4 5 4/4
e 4 3 7/7
e 3 5 19/20
e 3 2 0/9
e 2 4 11/14
e 2 1 2/4
e 1 3 12/12
e 1 2 0/10
e 0 2 13/13
e 0 1 10/16
% End of graph

14
graphs/graph4.dot Normal file
View file

@ -0,0 +1,14 @@
digraph graphique1 {
size="20"
node [shape = circle];
4 -> 5 [ label = "4/4" ];
4 -> 3 [ label = "7/7" ];
3 -> 5 [ label = "19/20" ];
3 -> 2 [ label = "0/9" ];
2 -> 4 [ label = "11/14" ];
2 -> 1 [ label = "2/4" ];
1 -> 3 [ label = "12/12" ];
1 -> 2 [ label = "0/10" ];
0 -> 2 [ label = "13/13" ];
0 -> 1 [ label = "10/16" ];
}

119
graphs/graph4.svg Normal file
View file

@ -0,0 +1,119 @@
<?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.40.1 (20161225.0304)
-->
<!-- Title: graphique1 Pages: 1 -->
<svg width="280pt" height="305pt"
viewBox="0.00 0.00 280.00 305.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 301)">
<title>graphique1</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-301 276,-301 276,4 -4,4"/>
<!-- 4 -->
<g id="node1" class="node">
<title>4</title>
<ellipse fill="none" stroke="#000000" cx="90" cy="-279" rx="18" ry="18"/>
<text text-anchor="middle" x="90" y="-275.3" font-family="Times,serif" font-size="14.00" fill="#000000">4</text>
</g>
<!-- 5 -->
<g id="node2" class="node">
<title>5</title>
<ellipse fill="none" stroke="#000000" cx="18" cy="-105" rx="18" ry="18"/>
<text text-anchor="middle" x="18" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">5</text>
</g>
<!-- 4&#45;&gt;5 -->
<g id="edge1" class="edge">
<title>4&#45;&gt;5</title>
<path fill="none" stroke="#000000" d="M77.9541,-265.3725C66.7415,-252.0678 50.2604,-230.8368 40,-210 28.9421,-187.5436 29.0363,-180.5195 24,-156 22.4882,-148.6398 21.3215,-140.5981 20.4366,-133.1214"/>
<polygon fill="#000000" stroke="#000000" points="23.9043,-132.6316 19.3665,-123.0578 16.9436,-133.3718 23.9043,-132.6316"/>
<text text-anchor="middle" x="51.5" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">4/4</text>
</g>
<!-- 3 -->
<g id="node3" class="node">
<title>3</title>
<ellipse fill="none" stroke="#000000" cx="90" cy="-192" rx="18" ry="18"/>
<text text-anchor="middle" x="90" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
</g>
<!-- 4&#45;&gt;3 -->
<g id="edge2" class="edge">
<title>4&#45;&gt;3</title>
<path fill="none" stroke="#000000" d="M90,-260.9735C90,-249.1918 90,-233.5607 90,-220.1581"/>
<polygon fill="#000000" stroke="#000000" points="93.5001,-220.0033 90,-210.0034 86.5001,-220.0034 93.5001,-220.0033"/>
<text text-anchor="middle" x="101.5" y="-231.8" font-family="Times,serif" font-size="14.00" fill="#000000">7/7</text>
</g>
<!-- 3&#45;&gt;5 -->
<g id="edge3" class="edge">
<title>3&#45;&gt;5</title>
<path fill="none" stroke="#000000" d="M73.3889,-184.8324C61.1787,-178.7811 45.0301,-169.0177 35,-156 29.7931,-149.2422 26.1373,-140.8083 23.5886,-132.7568"/>
<polygon fill="#000000" stroke="#000000" points="26.9155,-131.6522 20.919,-122.9176 20.1597,-133.4852 26.9155,-131.6522"/>
<text text-anchor="middle" x="55.5" y="-144.8" font-family="Times,serif" font-size="14.00" fill="#000000">19/20</text>
</g>
<!-- 2 -->
<g id="node4" class="node">
<title>2</title>
<ellipse fill="none" stroke="#000000" cx="167" cy="-105" rx="18" ry="18"/>
<text text-anchor="middle" x="167" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">2</text>
</g>
<!-- 3&#45;&gt;2 -->
<g id="edge4" class="edge">
<title>3&#45;&gt;2</title>
<path fill="none" stroke="#000000" d="M99.0402,-175.9907C105.3474,-165.4959 114.3393,-151.7758 124,-141 129.9407,-134.3736 137.1211,-127.8896 143.8985,-122.2911"/>
<polygon fill="#000000" stroke="#000000" points="146.4989,-124.6948 152.1441,-115.7292 142.14,-119.2175 146.4989,-124.6948"/>
<text text-anchor="middle" x="135.5" y="-144.8" font-family="Times,serif" font-size="14.00" fill="#000000">0/9</text>
</g>
<!-- 2&#45;&gt;4 -->
<g id="edge5" class="edge">
<title>2&#45;&gt;4</title>
<path fill="none" stroke="#000000" d="M162.41,-122.6992C155.0214,-149.6635 139.0536,-202.201 117,-243 114.4192,-247.7744 111.2509,-252.6085 108.0039,-257.1185"/>
<polygon fill="#000000" stroke="#000000" points="105.0583,-255.2101 101.7969,-265.2905 110.6326,-259.4441 105.0583,-255.2101"/>
<text text-anchor="middle" x="165.5" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">11/14</text>
</g>
<!-- 1 -->
<g id="node5" class="node">
<title>1</title>
<ellipse fill="none" stroke="#000000" cx="163" cy="-18" rx="18" ry="18"/>
<text text-anchor="middle" x="163" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">1</text>
</g>
<!-- 2&#45;&gt;1 -->
<g id="edge6" class="edge">
<title>2&#45;&gt;1</title>
<path fill="none" stroke="#000000" d="M154.3717,-91.7776C149.1557,-85.4162 143.7041,-77.3626 141,-69 137.9173,-59.4665 140.9614,-49.2702 145.6665,-40.5196"/>
<polygon fill="#000000" stroke="#000000" points="148.6515,-42.3473 150.9839,-32.0124 142.7157,-38.6371 148.6515,-42.3473"/>
<text text-anchor="middle" x="152.5" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">2/4</text>
</g>
<!-- 1&#45;&gt;3 -->
<g id="edge7" class="edge">
<title>1&#45;&gt;3</title>
<path fill="none" stroke="#000000" d="M148.3458,-28.8353C133.0601,-41.0707 109.8445,-62.4968 99,-87 88.2315,-111.3314 86.7934,-141.9038 87.5599,-163.7742"/>
<polygon fill="#000000" stroke="#000000" points="84.0796,-164.2407 88.1029,-174.0419 91.0698,-163.871 84.0796,-164.2407"/>
<text text-anchor="middle" x="119.5" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">12/12</text>
</g>
<!-- 1&#45;&gt;2 -->
<g id="edge8" class="edge">
<title>1&#45;&gt;2</title>
<path fill="none" stroke="#000000" d="M163.8277,-36.0034C164.3692,-47.7801 165.0878,-63.4102 165.7042,-76.8156"/>
<polygon fill="#000000" stroke="#000000" points="162.2155,-77.1449 166.1712,-86.9735 169.2081,-76.8233 162.2155,-77.1449"/>
<text text-anchor="middle" x="181" y="-57.8" font-family="Times,serif" font-size="14.00" fill="#000000">0/10</text>
</g>
<!-- 0 -->
<g id="node6" class="node">
<title>0</title>
<ellipse fill="none" stroke="#000000" cx="244" cy="-192" rx="18" ry="18"/>
<text text-anchor="middle" x="244" y="-188.3" font-family="Times,serif" font-size="14.00" fill="#000000">0</text>
</g>
<!-- 0&#45;&gt;2 -->
<g id="edge9" class="edge">
<title>0&#45;&gt;2</title>
<path fill="none" stroke="#000000" d="M228.0312,-182.8022C217.7,-176.282 204.4623,-166.7966 195,-156 188.5183,-148.6042 182.9169,-139.4574 178.4637,-130.9611"/>
<polygon fill="#000000" stroke="#000000" points="181.4966,-129.1973 173.9381,-121.773 175.217,-132.2903 181.4966,-129.1973"/>
<text text-anchor="middle" x="215.5" y="-144.8" font-family="Times,serif" font-size="14.00" fill="#000000">13/13</text>
</g>
<!-- 0&#45;&gt;1 -->
<g id="edge10" class="edge">
<title>0&#45;&gt;1</title>
<path fill="none" stroke="#000000" d="M242.1687,-173.8503C240.9233,-164.014 238.954,-151.7136 236,-141 224.9216,-100.821 224.4457,-88.4585 201,-54 196.5716,-47.4915 190.7891,-41.2657 185.076,-35.8764"/>
<polygon fill="#000000" stroke="#000000" points="187.2584,-33.1333 177.4621,-29.098 182.6039,-38.3616 187.2584,-33.1333"/>
<text text-anchor="middle" x="251.5" y="-101.3" font-family="Times,serif" font-size="14.00" fill="#000000">10/16</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -1,21 +0,0 @@
build:
@echo "\n==== COMPILING ====\n"
#ocamlbuild ftest.native#
ocamlbuild MSftest.native
format:
ocp-indent --inplace src/*
edit:
code . -n
demo: build
@echo "\n==== EXECUTING ====\n"
./ftest.native graphs/graph1 1 2 outfile
@echo "\n==== RESULT ==== (content of outfile) \n"
@cat outfile
clean:
-rm -rf _build/
-rm MSftest.native

View file

@ -1,21 +0,0 @@
Base project for Ocaml project on Ford-Fulkerson. This project contains some simple configuration files to facilitate editing Ocaml in VSCode.
To use, you should install the *OCaml* extension in VSCode. Other extensions might work as well but make sure there is only one installed.
Then open VSCode in the root directory of this repository (command line: `code path/to/ocaml-maxflow-project`).
Features :
- full compilation as VSCode build task (Ctrl+Shift+b)
- highlights of compilation errors as you type
- code completion
- automatic indentation on file save
A makefile provides some useful commands:
- `make build` to compile. This creates an ftest.native executable
- `make demo` to run the `ftest` program with some arguments
- `make format` to indent the entire project
- `make edit` to open the project in VSCode
- `make clean` to remove build artifacts
In case of trouble with the VSCode extension (e.g. the project does not build, there are strange mistakes), a common workaround is to (1) close vscode, (2) `make clean`, (3) `make build` and (4) reopen vscode (`make edit`).

View file

@ -1,3 +0,0 @@
<src/**>: include

View file

@ -1,24 +0,0 @@
%% Test graph #1
%% Nodes
n 88 209 % This is node #0, with its coordinates (which are not used by the algorithms).
n 408 183
n 269 491
n 261 297
n 401 394
n 535 294 % This is node #5.
%% Edges
e 3 1 11 % An edge from 3 to 1, labeled "11".
e 3 2 2
e 1 5 21
e 4 5 14
e 1 4 1
e 0 1 7
e 0 3 10
e 3 4 5
e 2 4 12
e 0 2 8

View file

@ -1,106 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
<!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
]>
<!-- Generated by dot version 2.7.20060111.0540 (Fri Sep 3 08:16:42 UTC 2010)
For user: (lebotlan) D. Le Botlan,,, -->
<!-- Title: finite_state_machine Pages: 1 -->
<svg width="689px" height="302px"
viewBox = "0 0 517 227"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" style="font-family:Times-Roman;font-size:14.00;">
<title>finite_state_machine</title>
<polygon style="fill:white;stroke:white;" points="0,227 0,-11 528,-11 528,227 0,227"/>
<!-- 0 -->
<g id="node1" class="node"><title>0</title>
<ellipse style="fill:none;stroke:black;" cx="29" cy="112" rx="18" ry="18"/>
<text text-anchor="middle" x="29" y="119">0</text>
</g>
<!-- 2 -->
<g id="node3" class="node"><title>2</title>
<ellipse style="fill:none;stroke:black;" cx="259" cy="43" rx="18" ry="18"/>
<text text-anchor="middle" x="259" y="50">2</text>
</g>
<!-- 0&#45;&gt;2 -->
<g id="edge2" class="edge"><title>0&#45;&gt;2</title>
<path style="fill:none;stroke:black;" d="M51,100C59,95 68,90 77,86 127,64 140,59 192,48 201,47 212,46 221,44"/>
<polygon style="fill:black;stroke:black;" points="221,39 235,44 221,48 221,39"/>
<text text-anchor="middle" x="144" y="52">8</text>
</g>
<!-- 3 -->
<g id="node5" class="node"><title>3</title>
<ellipse style="fill:none;stroke:black;" cx="144" cy="112" rx="18" ry="18"/>
<text text-anchor="middle" x="144" y="119">3</text>
</g>
<!-- 0&#45;&gt;3 -->
<g id="edge4" class="edge"><title>0&#45;&gt;3</title>
<path style="fill:none;stroke:black;" d="M53,112C69,112 89,112 107,112"/>
<polygon style="fill:black;stroke:black;" points="107,107 120,112 107,116 107,107"/>
<text text-anchor="middle" x="87" y="108">10</text>
</g>
<!-- 1 -->
<g id="node7" class="node"><title>1</title>
<ellipse style="fill:none;stroke:black;" cx="259" cy="191" rx="18" ry="18"/>
<text text-anchor="middle" x="259" y="198">1</text>
</g>
<!-- 0&#45;&gt;1 -->
<g id="edge6" class="edge"><title>0&#45;&gt;1</title>
<path style="fill:none;stroke:black;" d="M48,127C65,142 93,160 120,170 153,182 192,187 221,188"/>
<polygon style="fill:black;stroke:black;" points="221,184 235,190 221,192 221,184"/>
<text text-anchor="middle" x="144" y="162">7</text>
</g>
<!-- 4 -->
<g id="node9" class="node"><title>4</title>
<ellipse style="fill:none;stroke:black;" cx="373" cy="120" rx="18" ry="18"/>
<text text-anchor="middle" x="373" y="127">4</text>
</g>
<!-- 2&#45;&gt;4 -->
<g id="edge8" class="edge"><title>2&#45;&gt;4</title>
<path style="fill:none;stroke:black;" d="M279,56C296,68 321,86 343,99"/>
<polygon style="fill:black;stroke:black;" points="345,95 353,107 340,103 345,95"/>
<text text-anchor="middle" x="316" y="72">12</text>
</g>
<!-- 3&#45;&gt;2 -->
<g id="edge12" class="edge"><title>3&#45;&gt;2</title>
<path style="fill:none;stroke:black;" d="M165,99C183,90 207,75 225,63"/>
<polygon style="fill:black;stroke:black;" points="224,59 237,55 229,66 224,59"/>
<text text-anchor="middle" x="201" y="71">2</text>
</g>
<!-- 3&#45;&gt;1 -->
<g id="edge14" class="edge"><title>3&#45;&gt;1</title>
<path style="fill:none;stroke:black;" d="M161,128C171,136 181,146 192,152 203,159 215,167 225,172"/>
<polygon style="fill:black;stroke:black;" points="228,168 237,179 224,176 228,168"/>
<text text-anchor="middle" x="201" y="148">11</text>
</g>
<!-- 3&#45;&gt;4 -->
<g id="edge10" class="edge"><title>3&#45;&gt;4</title>
<path style="fill:none;stroke:black;" d="M168,114C208,115 288,118 336,119"/>
<polygon style="fill:black;stroke:black;" points="336,114 349,119 336,123 336,114"/>
<text text-anchor="middle" x="259" y="114">5</text>
</g>
<!-- 1&#45;&gt;4 -->
<g id="edge16" class="edge"><title>1&#45;&gt;4</title>
<path style="fill:none;stroke:black;" d="M280,179C293,171 311,162 325,152 331,150 336,146 343,142"/>
<polygon style="fill:black;stroke:black;" points="340,138 353,135 344,146 340,138"/>
<text text-anchor="middle" x="316" y="148">1</text>
</g>
<!-- 5 -->
<g id="node15" class="node"><title>5</title>
<ellipse style="fill:none;stroke:black;" cx="488" cy="168" rx="18" ry="18"/>
<text text-anchor="middle" x="488" y="175">5</text>
</g>
<!-- 1&#45;&gt;5 -->
<g id="edge18" class="edge"><title>1&#45;&gt;5</title>
<path style="fill:none;stroke:black;" d="M283,188C311,186 357,182 397,178 415,175 433,174 451,172"/>
<polygon style="fill:black;stroke:black;" points="451,168 464,171 451,176 451,168"/>
<text text-anchor="middle" x="373" y="174">21</text>
</g>
<!-- 4&#45;&gt;5 -->
<g id="edge20" class="edge"><title>4&#45;&gt;5</title>
<path style="fill:none;stroke:black;" d="M396,130C412,138 435,147 453,154"/>
<polygon style="fill:black;stroke:black;" points="455,150 465,159 451,158 455,150"/>
<text text-anchor="middle" x="431" y="138">14</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -1,50 +0,0 @@
open Graph
type path = id list
(*type record avec id noeud et son cout*)
type t_cost={
mutable cout:float;
mutable father:int
}
let blf gr id_src id_dest=
(*je compte le nb de noeuds dans le graphe pour instancier mon tableau*)
let nb_n=n_fold gr (fun acu id->acu+1) 0 in
let cost ={cout=max_float; father=(-1)} in
let acu =Array.make nb_n cost in
(*je fais un fold_left pour pouvoir individualiser au niveau de la mémoire les cases de la table*)
let blf_tab=n_fold gr (fun acu id->acu.(id)<-{cout=max_float; father=(-1)}; acu ) acu in
blf_tab.(id_src).cout<-0.0;
let file_id=[id_src] in
let file_marque =[] in
let rec blf_rec gr file_id file_marque= match file_id with
|[]-> blf_tab
|a::b->
let l_out_arc=out_arcs gr a in
let rec loop_suc l_out_arc blf_tab file =
match l_out_arc with
|[]-> blf_rec gr file (a::file_marque)
|(id,label)::d->
if label != 0.0 && (Float.add blf_tab.(a).cout label)<(blf_tab.(id).cout) then
begin
blf_tab.(id).cout<-(Float.add blf_tab.(a).cout label);
blf_tab.(id).father<-a;
if not (List.mem id file_marque) then loop_suc d blf_tab (id::file) else loop_suc d blf_tab file
end
else loop_suc d blf_tab file in
loop_suc l_out_arc blf_tab b in
blf_rec gr file_id file_marque
(*avec blf_tab, on retrace chemin avec les pères*)
let get_path gr id_src id_dest=
let blf_tab=blf gr id_src id_dest in
let path=[id_dest] in
let rec loop path blf_tab id_src id_dest=
let father_id=blf_tab.(id_dest).father in match father_id with
|(-1)->None
|a->if a == id_src then Some (id_src::path) else loop (a::path) blf_tab id_src a in
loop path blf_tab id_src id_dest

View file

@ -1,12 +0,0 @@
open Graph
type path = id list
type t_cost={
mutable cout:float;
mutable father:int
}
val blf: float graph -> id -> id -> t_cost array
val get_path: float graph -> id -> id -> path option

View file

@ -1,137 +0,0 @@
open Graph
open Tool
open BLF
let g_to_string gr = gmap gr string_of_float
let g_to_float gr = gmap gr float_of_string
(* Create a list of pairs (origin,end) from a list of nodes *)
let rec create_arcs_from_nodes = function
| [] -> []
| a :: [] -> []
| a :: b :: rest -> (a,b) :: (create_arcs_from_nodes (b :: rest))
(* Return the minimum value of a path's edge*)
let get_min_label_from_path (graph : float graph) (path : (id * id) list) =
let min = Some 999.0 in
let min = List.fold_left
(
fun acu (id1, id2) ->
let label = find_arc graph id1 id2 in
if label < acu then label else acu
) min path in
match min with
|None -> 999.0
|Some x -> x
(* Add a value to every egde of a path *)
let add_value_to_arcs (graph : float graph) (path : (id * id) list) (value : float) =
List.fold_left
(
fun acu (id1, id2) ->
add_arc acu id1 id2 value
)
graph path
(* Reverse a path and its edges
ex :[(a, b);(b, c)] -> [(b,a);(c, b)] *)
let rev_arcs (path : (id * id) list) =
List.map (fun (id1, id2) -> (id2, id1)) path
(* Removes the edges whose label = 0 *)
let remove_zeroes (graph : float graph) =
let initGraph = clone_nodes graph in
e_fold graph
(
fun acu id1 id2 x ->
if x = 0.0 then acu else new_arc acu id1 id2 x
) initGraph
(* Remove bi-directional edges between 2 nodes*)
let only_one_edge (graph : float graph) =
let graphWithZeroes = e_fold graph
(
fun acu id1 id2 x ->
let path = [(id1,id2);(id2,id1)] in
let label_rev = (match find_arc graph id2 id1 with
|None -> 0.0
|Some x -> x) in
let mini = min x label_rev in
let gr = add_value_to_arcs graph path (Float.neg mini) in
if x = 0.0 || mini = 0.0 then acu else gr
)
graph in
let graphWithoutZeroes = remove_zeroes graphWithZeroes in
graphWithoutZeroes
(* Get the final graph after the FFalgorithm
The label of every arc becomes "x/max_capacity" where x
is the value of the opposite arc on the residual graph*)
let get_final_graph (initGraph : float graph) (residualGraph : float graph) =
(* First get the initial and residual graph as string graphs *)
let initGraphString = g_to_string initGraph in
let residualGraphString = g_to_string residualGraph in
let finalGraph = clone_nodes initGraph in
(* For every arc in the initial graph, we get its label (aka max_capacity)
then, we get the label of the opposite arc in the residual graph.
If it exists then the arc of the final graph gets the label "x/max_capacity",
"0.0/max_capacity" otherwise*)
e_fold initGraph
(
fun acu id1 id2 x ->
let label_arc = (match find_arc initGraphString id1 id2 with
|None -> "-1"
|Some x -> x) in
let label_rev_arc = find_arc residualGraphString id2 id1 in
match label_rev_arc with
|None -> new_arc acu id1 id2 ("0/"^label_arc)
|Some x -> new_arc acu id1 id2 (""^x^"/"^label_arc)
)
finalGraph
let ford_fulk_algorithm (graph : float graph) (origin : id) (sink : id) =
let flow = 0.0 in
let graph = only_one_edge graph in
let initGraph = graph in
let rec boucle graph origin sink flow =
let path = get_path graph origin sink in
match path with
|None -> (flow, graph)
|Some x ->
(let path = x in
let arcs = create_arcs_from_nodes path in
(*let () = printf "dans boucle\n" in*)
(* Find the min value of the path *)
let min = get_min_label_from_path graph arcs in
(* Substract the min to every arc of the path *)
let graph = add_value_to_arcs graph arcs (Float.neg min) in
(* Get the reverse path *)
let reverse = rev_arcs arcs in
(* Add the min to every arc of the reverse path *)
let graph = add_value_to_arcs graph reverse min in
(* Add the min to the flow *)
let flow = Float.add flow min in
boucle graph origin sink flow) in
let (maxFlow, residualGraph) = boucle graph origin sink flow in
let finalGraph = get_final_graph initGraph residualGraph in
(maxFlow, finalGraph)

View file

@ -1,20 +0,0 @@
open Graph
open Tool
open BLF
val g_to_float: string graph -> float graph
val ford_fulk_algorithm : float graph -> id -> id -> (float * string graph)
(* val g_to_string: float graph -> string graph *)
(* val only_one_edge: float graph -> float graph *)
(* for testing purpose *)
(* val rev_arcs: (id * id) list -> (id * id) list
val add_value_to_arcs: float graph -> (id * id) list -> float -> float graph
val get_final_graph: float graph -> float graph -> string graph *)

View file

@ -1,48 +0,0 @@
open MSgfile
open Tool
open FFAlgorithm
open BLF
open Format
open Sys
let () =
(*/!\ Format de la commande pour lancer le test :
./ftest.native [nom_fichier_lecture] [id_source] [id_dest] [nom_fichier_ecriture]
ex : ./ftest.native graphs/graph1 0 5 graphs/graph3 *)
(* Check the number of command-line arguments *)
if Array.length Sys.argv <> 5 then
begin
Printf.printf "\nUsage: %s infile source sink outfile\n\n%!" Sys.argv.(0) ;
exit 0
end ;
(* Arguments are : infile(1) source-id(2) sink-id(3) outfile(4) *)
let infile = Sys.argv.(1)
and outfile = Sys.argv.(4)
(* These command-line arguments are not used for the moment. *)
and _source = int_of_string Sys.argv.(2)
and _sink = int_of_string Sys.argv.(3)
in
(* Open file *)
let (graph, l_id) = from_file infile in
let initGraph = graph in
(* Rewrite the graph that has been read. *)
let (flow,finalGraph) = ford_fulk_algorithm initGraph _source _sink in
let () = printf "max flow = %f\n" flow in
let () = write_file outfile finalGraph l_id in
let () = export outfile finalGraph in
(* let () = export infile graph in *)
(*Uncomment the following line if you have graphviz installed *)
(*let retour = command ("dot -Tsvg "^outfile^".dot > "^outfile^".svg") in*)
()

View file

@ -1,113 +0,0 @@
open Graph
open Printf
open MoneySharing
type path = string
(* Format of text files:
% Welcome to MoneySharing, your favorite tool to ease your reimbursements !
% Please, type the name of all users of your group:
u Gaby
u Flo
u Macha
% You can now enter your payements as it follows: p userWhoPaid [forWhichUser1; forWhichUser2 ..] amount
p Flo Gaby,Flo,Macha 11.0
p Gaby Flo 8.5
*)
let write_file path graph l_id=
(* Open a write-file. *)
let ff = open_out path in
(* Write in this file. *)
fprintf ff "%% Here is your MoneySharing graph.\n\n" ;
(* Write all users *)
n_iter_sorted graph (fun id -> fprintf ff "u %s\n" (get_user id l_id)) ;
fprintf ff "\n" ;
fprintf ff "%% Here are the reimbursements to be made.\n\n" ;
(* Write all arcs *)
e_iter graph (fun id1 id2 lbl -> fprintf ff "p %s %s %s\n" (get_user id1 l_id) (get_user id2 l_id) lbl) ;
fprintf ff "\n%% End of reimbursements\n" ;
close_out ff ;
()
let read_comment graph line l_id=
try Scanf.sscanf line " %%" (graph, l_id)
with _ ->
Printf.printf "Unknown line:\n%s\n%!" line ;
failwith "from_file"
(* Reads a line with a user. *)
let read_user id graph l_id line =
try Scanf.sscanf line "u %s" (fun user -> init_node graph user id l_id )
with e ->
Printf.printf "Cannot read node in line - %s:\n%s\n%!" (Printexc.to_string e) line ;
failwith "from_file"
(* Reads a line with a payement. *)
let read_payement graph l_id line =
try Scanf.sscanf line "p %s %s %f"
(fun user l_user label -> paiement graph user (String.split_on_char ',' l_user) label l_id)
with e ->
Printf.printf "Cannot read arc in line - %s:\n%s\n%!" (Printexc.to_string e) line ;
failwith "from_file"
let from_file path =
let infile = open_in path in
(* Read all lines until end of file.
* n is the current node counter. *)
let rec loop n graph l_id=
try
let line = input_line infile in
(* Remove leading and trailing spaces. *)
let line = String.trim line in
let (n2, (graph2, l2)) =
(* Ignore empty lines *)
if line = "" then (n, (graph, l_id))
(* The first character of a line determines its content : u or p. *)
else match line.[0] with
| 'u' -> (n+1, read_user n graph l_id line)
| 'p' -> (n, read_payement graph l_id line)
(* It should be a comment, otherwise we complain. *)
| _ -> (n, read_comment graph line l_id)
in
loop n2 graph2 l2
with End_of_file -> (graph, l_id) (* Done *)
in
let final_graph_lid= loop 0 empty_graph [] in
close_in infile ;
final_graph_lid
(* Write the graph in a .dot file*)
let export path graph =
(* Open a write-file. *)
let ff = open_out (path^".dot") in
(* Write in this file. *)
fprintf ff "digraph graphique1 {\n\tsize=\"20\"\n\tnode [shape = circle];\n";
(* Write all arcs *)
e_iter graph (fun id1 id2 lbl -> fprintf ff "\t%d -> %d [ label = \"%s\" ];\n" id1 id2 lbl) ;
fprintf ff "}\n" ;
close_out ff ;
()

View file

@ -1,10 +0,0 @@
open Graph
type path = string
val from_file: path -> (float graph * (string * id * float) list)
val write_file: path -> string graph -> (string * id * float) list -> unit
val export: path -> string graph -> unit

View file

@ -1,49 +0,0 @@
type id = int
type 'a out_arcs = (id * 'a) list
(* A graph is just a list of pairs: a node & its outgoing arcs. *)
type 'a graph = (id * 'a out_arcs) list
exception Graph_error of string
let empty_graph = []
let node_exists gr id = List.mem_assoc id gr
let out_arcs gr id =
try List.assoc id gr
with Not_found -> raise (Graph_error ("Node " ^ string_of_int id ^ " does not exist in this graph."))
let find_arc gr id1 id2 =
let out = out_arcs gr id1 in
try Some (List.assoc id2 out)
with Not_found -> None
let new_node gr id =
if node_exists gr id then raise (Graph_error ("Node " ^ string_of_int id ^ " already exists in the graph."))
else (id, []) :: gr
let new_arc gr id1 id2 lbl =
(* Existing out-arcs *)
let outa = out_arcs gr id1 in
(* Update out-arcs.
* remove_assoc does not fail if id2 is not bound. *)
let outb = (id2, lbl) :: List.remove_assoc id2 outa in
(* Replace out-arcs in the graph. *)
let gr2 = List.remove_assoc id1 gr in
(id1, outb) :: gr2
let n_iter gr f = List.iter (fun (id, _) -> f id) gr
let n_iter_sorted gr f = n_iter (List.sort compare gr) f
let n_fold gr f acu = List.fold_left (fun acu (id, _) -> f acu id) acu gr
let e_iter gr f = List.iter (fun (id1, out) -> List.iter (fun (id2, x) -> f id1 id2 x) out) gr
let e_fold gr f acu = List.fold_left (fun acu (id1, out) -> List.fold_left (fun acu (id2, x) -> f acu id1 id2 x) acu out) acu gr

View file

@ -1,63 +0,0 @@
(* Type of a directed graph in which arcs have labels of type 'a. *)
type 'a graph
(* Each node has a unique identifier (a number). *)
type id = int
exception Graph_error of string
(************** CONSTRUCTORS **************)
(* The empty graph. *)
val empty_graph: 'a graph
(* Add a new node with the given identifier.
* @raise Graph_error if the id already exists. *)
val new_node: 'a graph -> id -> 'a graph
(* new_arc gr id1 id2 lbl : adds an arc from node id1 to node id2 with label lbl
* Both nodes must already exist in the graph.
* If the arc already exists, its label is replaced by lbl.
* @raise Graph_error if node id1 or id2 does not exist in the graph. *)
val new_arc: 'a graph -> id -> id -> 'a -> 'a graph
(************** GETTERS *****************)
(* node_exists gr id indicates if the node with identifier id exists in graph gr. *)
val node_exists: 'a graph -> id -> bool
(* Type of lists of outgoing arcs of a node.
* An arc is represented by a pair of the destination identifier and the arc label. *)
type 'a out_arcs = (id * 'a) list
(* Find the out_arcs of a node.
* @raise Graph_error if the id is unknown in the graph. *)
val out_arcs: 'a graph -> id -> 'a out_arcs
(* find_arc gr id1 id2 finds an arc between id1 and id2 and returns its label. Returns None if the arc does not exist.
* @raise Graph_error if id1 is unknown. *)
val find_arc: 'a graph -> id -> id -> 'a option
(************** COMBINATORS, ITERATORS **************)
(* Iterate on all nodes, in no special order. *)
val n_iter: 'a graph -> (id -> unit) -> unit
(* Like n_iter, but the nodes are sorted. *)
val n_iter_sorted: 'a graph -> (id -> unit) -> unit
(* Fold on all (unsorted) nodes. You must remember what List.fold_left does. *)
val n_fold: 'a graph -> ('b -> id -> 'b) -> 'b -> 'b
(* Iter on all arcs (edges) *)
val e_iter: 'a graph -> (id -> id -> 'a -> unit) -> unit
(* Fold on all arcs (edges) *)
val e_fold: 'a graph -> ('b -> id -> id -> 'a -> 'b) -> 'b -> 'b

View file

@ -1,41 +0,0 @@
open Graph
open Tool
(*fonction qui créé le noeud associé à un utilisateur et rentre la correspondance dans la table des id*)
let init_node g user id l_id=
( (new_node g id), ((user,id,0.0)::l_id) )
(*fonction qui renvoie l'id d'un utilisateur*)
let rec get_id utilisateur l_id= match l_id with
|[]-> raise Not_found
|(a,id1,value)::b-> if a=utilisateur then id1 else get_id utilisateur b
(*fonction qui renvoie le nom correspondant à un id*)
let rec get_user id1 l_id= match l_id with
|[]-> raise Not_found
|(nom,a,value)::b-> if a=id1 then nom else get_user id1 b
let set_val_du a l_id montant l_utilisateurs=
List.map (fun (nom,id,value)-> if nom=a
then (nom,id,(Float.sub value (Float.div montant (Float.of_int(List.length l_utilisateurs)))))
else (nom,id,value)
) l_id
let set_val_pret utilisateur montant l_id=
List.map (fun (nom,id,value)-> if nom=utilisateur
then (nom,id,(Float.add value montant))
else (nom,id,value)
) l_id
(*fonction qui rentre les paiements réalisés*)
let paiement g utilisateur l_utilisateurs montant l_id=
let rec paye g utilisateur l_utilisateurs montant l_id=match l_utilisateurs with
|[]-> (g, l_id)
|a::b-> paye g utilisateur b montant (set_val_du a l_id montant l_utilisateurs) in
let l_id= set_val_pret utilisateur montant l_id in
paye g utilisateur l_utilisateurs montant l_id

View file

@ -1,13 +0,0 @@
open Graph
val paiement: float graph -> string -> string list -> float -> (string * id * float) list -> (float graph * (string * id * float) list)
val init_node: float graph -> string -> id -> (string * id * float) list-> (float graph * (string * id * float) list)
val get_id: string -> (string * id * float) list -> id
val get_user: id -> (string * id * float) list -> string
val set_val_du: string -> (string * id * float) list -> float -> string list -> (string * id * float) list
val set_val_pret: string -> float -> (string * id * float) list -> (string * id * float) list

View file

@ -1,19 +0,0 @@
(* Yes, we have to repeat open Graph. *)
open Graph
(* assert false is of type ∀α.α, so the type-checker is happy. *)
let clone_nodes gr = n_fold gr new_node empty_graph
(* Clone the nodes first then clone every arc but change their label by applying f*)
let gmap gr f =
let new_graph = clone_nodes gr in
e_fold gr (fun acu id1 id2 x -> new_arc acu id1 id2 (f x)) new_graph
let add_arc g id1 id2 n =
let f = find_arc g id1 id2 in
match f with
|None->new_arc g id1 id2 n
|Some x->new_arc g id1 id2 (Float.add n x)

View file

@ -1,9 +0,0 @@
open Graph
(* Clone a graph by keeping only its nodes *)
val clone_nodes: 'a graph -> 'b graph
(* Apply a function f to every label of the graph's arcs *)
val gmap: 'a graph -> ('a -> 'b) -> 'b graph
val add_arc: float graph -> id -> id -> float -> float graph