Skip to content
Snippets Groups Projects
Commit 008c5cfd authored by Maxime MORGE's avatar Maxime MORGE :construction_worker:
Browse files

PSSI: XP from 13

parent 3994fe21
No related branches found
No related tags found
No related merge requests found
Showing
with 429 additions and 178 deletions
...@@ -123,11 +123,11 @@ ...@@ -123,11 +123,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M144.29,422.40 L144.29,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M135.32,422.40 L135.32,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M144.29,422.40 L144.29,413.40 M144.29,72.01 L144.29,81.01 '/> <g transform="translate(144.29,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M135.32,422.40 L135.32,413.40 M135.32,72.01 L135.32,81.01 '/> <g transform="translate(135.32,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 5</tspan></text> <text><tspan font-family="Arial" > 5</tspan></text>
</g> </g>
</g> </g>
...@@ -136,11 +136,11 @@ ...@@ -136,11 +136,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M216.04,422.40 L216.04,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M198.10,422.40 L198.10,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M216.04,422.40 L216.04,413.40 M216.04,72.01 L216.04,81.01 '/> <g transform="translate(216.04,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M198.10,422.40 L198.10,413.40 M198.10,72.01 L198.10,81.01 '/> <g transform="translate(198.10,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 6</tspan></text> <text><tspan font-family="Arial" > 6</tspan></text>
</g> </g>
</g> </g>
...@@ -149,11 +149,11 @@ ...@@ -149,11 +149,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M287.80,422.40 L287.80,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M260.89,422.40 L260.89,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M287.80,422.40 L287.80,413.40 M287.80,72.01 L287.80,81.01 '/> <g transform="translate(287.80,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M260.89,422.40 L260.89,413.40 M260.89,72.01 L260.89,81.01 '/> <g transform="translate(260.89,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 7</tspan></text> <text><tspan font-family="Arial" > 7</tspan></text>
</g> </g>
</g> </g>
...@@ -162,11 +162,11 @@ ...@@ -162,11 +162,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M359.55,422.40 L359.55,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M323.68,422.40 L323.68,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M359.55,422.40 L359.55,413.40 M359.55,72.01 L359.55,81.01 '/> <g transform="translate(359.55,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M323.68,422.40 L323.68,413.40 M323.68,72.01 L323.68,81.01 '/> <g transform="translate(323.68,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 8</tspan></text> <text><tspan font-family="Arial" > 8</tspan></text>
</g> </g>
</g> </g>
...@@ -175,11 +175,11 @@ ...@@ -175,11 +175,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M431.31,422.40 L431.31,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M386.46,422.40 L386.46,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M431.31,422.40 L431.31,413.40 M431.31,72.01 L431.31,81.01 '/> <g transform="translate(431.31,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M386.46,422.40 L386.46,413.40 M386.46,72.01 L386.46,81.01 '/> <g transform="translate(386.46,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 9</tspan></text> <text><tspan font-family="Arial" > 9</tspan></text>
</g> </g>
</g> </g>
...@@ -188,11 +188,11 @@ ...@@ -188,11 +188,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M503.06,422.40 L503.06,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M449.25,422.40 L449.25,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M503.06,422.40 L503.06,413.40 M503.06,72.01 L503.06,81.01 '/> <g transform="translate(503.06,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M449.25,422.40 L449.25,413.40 M449.25,72.01 L449.25,81.01 '/> <g transform="translate(449.25,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 10</tspan></text> <text><tspan font-family="Arial" > 10</tspan></text>
</g> </g>
</g> </g>
...@@ -200,13 +200,26 @@ ...@@ -200,13 +200,26 @@
</g> </g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M512.03,422.40 L512.03,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M512.03,422.40 L512.03,413.40 M512.03,72.01 L512.03,81.01 '/> <g transform="translate(512.03,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 11</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M574.82,422.40 L574.82,72.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M574.82,422.40 L574.82,72.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M574.82,422.40 L574.82,413.40 M574.82,72.01 L574.82,81.01 '/> <g transform="translate(574.82,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M574.82,422.40 L574.82,413.40 M574.82,72.01 L574.82,81.01 '/> <g transform="translate(574.82,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 11</tspan></text> <text><tspan font-family="Arial" > 12</tspan></text>
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
...@@ -228,8 +241,8 @@ ...@@ -228,8 +241,8 @@
<g id="gnuplot_plot_1" fill="none"><title>gnuplot_plot_1</title> <g id="gnuplot_plot_1" fill="none"><title>gnuplot_plot_1</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(211, 211, 211)' fill-opacity = '0.300000' points = '72.53,88.36 144.29,99.99 216.04,109.83 287.80,117.18 359.55,125.21 431.31,131.06 503.06,137.23 574.82,142.19 574.82,138.47 503.06,133.40 431.31,128.37 359.55,121.29 287.80,114.29 216.04,106.26 144.29,97.02 72.53,86.00 <polygon fill = 'rgb(211, 211, 211)' fill-opacity = '0.300000' points = '72.53,88.36 135.32,99.99 198.10,109.83 260.89,117.18 323.68,125.21 386.46,131.06 449.25,137.23 512.03,142.19 574.82,146.57 574.82,142.59 512.03,138.47 449.25,133.40 386.46,128.37 323.68,121.29 260.89,114.29 198.10,106.26
'/> 135.32,97.02 72.53,86.00 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -240,14 +253,14 @@ ...@@ -240,14 +253,14 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb(160, 160, 160)' d='M231.94,18.00 L274.50,18.00 M72.53,87.01 L144.29,98.39 L216.04,108.16 L287.80,115.82 L359.55,123.40 L431.31,129.79 <path stroke='rgb(160, 160, 160)' d='M231.94,18.00 L274.50,18.00 M72.53,87.01 L135.32,98.39 L198.10,108.16 L260.89,115.82 L323.68,123.40 L386.46,129.79
L503.06,135.22 L574.82,140.08 '/></g> L449.25,135.22 L512.03,140.08 L574.82,144.26 '/></g>
</g> </g>
<g id="gnuplot_plot_3" fill="none"><title>gnuplot_plot_3</title> <g id="gnuplot_plot_3" fill="none"><title>gnuplot_plot_3</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(144, 238, 144)' fill-opacity = '0.300000' points = '72.53,87.08 144.29,99.22 216.04,109.20 287.80,117.06 359.55,125.10 431.31,130.66 503.06,136.71 574.82,141.96 574.82,137.86 503.06,132.53 431.31,127.76 359.55,120.62 287.80,113.16 216.04,105.25 144.29,95.34 72.53,83.58 <polygon fill = 'rgb(144, 238, 144)' fill-opacity = '0.300000' points = '72.53,87.08 135.32,99.22 198.10,109.20 260.89,117.06 323.68,125.10 386.46,130.66 449.25,136.71 512.03,141.96 574.82,146.38 574.82,141.82 512.03,137.86 449.25,132.53 386.46,127.76 323.68,120.62 260.89,113.16 198.10,105.25
'/> 135.32,95.34 72.53,83.58 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -258,14 +271,14 @@ ...@@ -258,14 +271,14 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb( 0, 100, 0)' stroke-dasharray='1.0,2.0' d='M231.94,36.00 L274.50,36.00 M72.53,85.63 L144.29,97.42 L216.04,107.28 L287.80,115.64 L359.55,123.11 L431.31,129.55 <path stroke='rgb( 0, 100, 0)' stroke-dasharray='1.0,2.0' d='M231.94,36.00 L274.50,36.00 M72.53,85.63 L135.32,97.42 L198.10,107.28 L260.89,115.64 L323.68,123.11 L386.46,129.55
L503.06,134.90 L574.82,139.72 '/></g> L449.25,134.90 L512.03,139.72 L574.82,144.01 '/></g>
</g> </g>
<g id="gnuplot_plot_5" fill="none"><title>gnuplot_plot_5</title> <g id="gnuplot_plot_5" fill="none"><title>gnuplot_plot_5</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(173, 216, 230)' fill-opacity = '0.300000' points = '72.53,80.34 144.29,86.45 216.04,91.47 287.80,97.18 359.55,100.54 431.31,105.22 503.06,107.77 574.82,110.78 574.82,109.38 503.06,106.40 431.31,102.14 359.55,98.54 287.80,95.26 216.04,90.43 144.29,85.17 72.53,77.96 <polygon fill = 'rgb(173, 216, 230)' fill-opacity = '0.300000' points = '72.53,80.34 135.32,86.45 198.10,91.47 260.89,97.18 323.68,100.54 386.46,105.22 449.25,107.77 512.03,110.78 574.82,112.48 574.82,111.57 512.03,109.38 449.25,106.40 386.46,102.14 323.68,98.54 260.89,95.26 198.10,90.43
'/> 135.32,85.17 72.53,77.96 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -276,14 +289,14 @@ ...@@ -276,14 +289,14 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb( 0, 0, 139)' stroke-dasharray='2.5,4.0' d='M231.94,54.00 L274.50,54.00 M72.53,79.12 L144.29,86.07 L216.04,90.66 L287.80,96.21 L359.55,99.31 L431.31,103.91 <path stroke='rgb( 0, 0, 139)' stroke-dasharray='2.5,4.0' d='M231.94,54.00 L274.50,54.00 M72.53,79.12 L135.32,86.07 L198.10,90.66 L260.89,96.21 L323.68,99.31 L386.46,103.91
L503.06,106.61 L574.82,109.46 '/></g> L449.25,106.61 L512.03,109.46 L574.82,112.08 '/></g>
</g> </g>
<g id="gnuplot_plot_7" fill="none"><title>gnuplot_plot_7</title> <g id="gnuplot_plot_7" fill="none"><title>gnuplot_plot_7</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(240, 50, 50)' fill-opacity = '0.300000' points = '72.53,86.45 144.29,98.12 216.04,107.61 287.80,116.16 359.55,123.16 431.31,129.33 503.06,134.66 574.82,140.49 574.82,136.68 503.06,131.23 431.31,125.55 359.55,119.49 287.80,112.37 216.04,104.43 144.29,95.23 72.53,84.04 <polygon fill = 'rgb(240, 50, 50)' fill-opacity = '0.300000' points = '72.53,86.45 135.32,98.12 198.10,107.61 260.89,116.16 323.68,123.16 386.46,129.33 449.25,134.66 512.03,140.49 574.82,145.04 574.82,141.17 512.03,136.68 449.25,131.23 386.46,125.55 323.68,119.49 260.89,112.37 198.10,104.43
'/> 135.32,95.23 72.53,84.04 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -294,13 +307,13 @@ ...@@ -294,13 +307,13 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb(139, 0, 0)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M442.30,18.00 L484.86,18.00 M72.53,85.08 L144.29,96.68 L216.04,106.11 L287.80,114.26 L359.55,121.27 L431.31,127.54 <path stroke='rgb(139, 0, 0)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M442.30,18.00 L484.86,18.00 M72.53,85.08 L135.32,96.68 L198.10,106.11 L260.89,114.26 L323.68,121.27 L386.46,127.54
L503.06,133.22 L574.82,138.55 '/></g> L449.25,133.22 L512.03,138.55 L574.82,143.25 '/></g>
</g> </g>
<g id="gnuplot_plot_9" fill="none"><title>gnuplot_plot_9</title> <g id="gnuplot_plot_9" fill="none"><title>gnuplot_plot_9</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(240, 85, 240)' fill-opacity = '0.300000' points = '72.53,86.50 144.29,98.14 144.29,94.82 72.53,84.36 '/> <polygon fill = 'rgb(240, 85, 240)' fill-opacity = '0.300000' points = '72.53,86.50 135.32,98.14 135.32,94.82 72.53,84.36 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -311,7 +324,7 @@ ...@@ -311,7 +324,7 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb(192, 0, 255)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M442.30,36.00 L484.86,36.00 M72.53,85.35 L144.29,96.60 '/></g> <path stroke='rgb(192, 0, 255)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M442.30,36.00 L484.86,36.00 M72.53,85.35 L135.32,96.60 '/></g>
</g> </g>
<g fill="none" color="white" stroke="rgb(192, 0, 255)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="white" stroke="rgb(192, 0, 255)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
......
...@@ -215,11 +215,11 @@ ...@@ -215,11 +215,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M158.67,422.40 L158.67,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M150.00,422.40 L150.00,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M158.67,422.40 L158.67,413.40 M158.67,168.01 L158.67,177.01 '/> <g transform="translate(158.67,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M150.00,422.40 L150.00,413.40 M150.00,168.01 L150.00,177.01 '/> <g transform="translate(150.00,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 5</tspan></text> <text><tspan font-family="Arial" > 5</tspan></text>
</g> </g>
</g> </g>
...@@ -228,11 +228,11 @@ ...@@ -228,11 +228,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M228.03,422.40 L228.03,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M210.69,422.40 L210.69,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M228.03,422.40 L228.03,413.40 M228.03,168.01 L228.03,177.01 '/> <g transform="translate(228.03,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M210.69,422.40 L210.69,413.40 M210.69,168.01 L210.69,177.01 '/> <g transform="translate(210.69,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 6</tspan></text> <text><tspan font-family="Arial" > 6</tspan></text>
</g> </g>
</g> </g>
...@@ -241,11 +241,11 @@ ...@@ -241,11 +241,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M297.39,422.40 L297.39,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M271.38,422.40 L271.38,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M297.39,422.40 L297.39,413.40 M297.39,168.01 L297.39,177.01 '/> <g transform="translate(297.39,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M271.38,422.40 L271.38,413.40 M271.38,168.01 L271.38,177.01 '/> <g transform="translate(271.38,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 7</tspan></text> <text><tspan font-family="Arial" > 7</tspan></text>
</g> </g>
</g> </g>
...@@ -254,11 +254,11 @@ ...@@ -254,11 +254,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M366.74,422.40 L366.74,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M332.07,422.40 L332.07,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M366.74,422.40 L366.74,413.40 M366.74,168.01 L366.74,177.01 '/> <g transform="translate(366.74,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M332.07,422.40 L332.07,413.40 M332.07,168.01 L332.07,177.01 '/> <g transform="translate(332.07,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 8</tspan></text> <text><tspan font-family="Arial" > 8</tspan></text>
</g> </g>
</g> </g>
...@@ -267,11 +267,11 @@ ...@@ -267,11 +267,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M436.10,422.40 L436.10,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M392.75,422.40 L392.75,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M436.10,422.40 L436.10,413.40 M436.10,168.01 L436.10,177.01 '/> <g transform="translate(436.10,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M392.75,422.40 L392.75,413.40 M392.75,168.01 L392.75,177.01 '/> <g transform="translate(392.75,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 9</tspan></text> <text><tspan font-family="Arial" > 9</tspan></text>
</g> </g>
</g> </g>
...@@ -280,11 +280,11 @@ ...@@ -280,11 +280,11 @@
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M505.46,422.40 L505.46,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M453.44,422.40 L453.44,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M505.46,422.40 L505.46,413.40 M505.46,168.01 L505.46,177.01 '/> <g transform="translate(505.46,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M453.44,422.40 L453.44,413.40 M453.44,168.01 L453.44,177.01 '/> <g transform="translate(453.44,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 10</tspan></text> <text><tspan font-family="Arial" > 10</tspan></text>
</g> </g>
</g> </g>
...@@ -292,13 +292,26 @@ ...@@ -292,13 +292,26 @@
</g> </g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M514.13,422.40 L514.13,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M514.13,422.40 L514.13,413.40 M514.13,168.01 L514.13,177.01 '/> <g transform="translate(514.13,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 11</tspan></text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M574.82,422.40 L574.82,168.01 '/></g> <path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M574.82,422.40 L574.82,168.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M574.82,422.40 L574.82,413.40 M574.82,168.01 L574.82,177.01 '/> <g transform="translate(574.82,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> <path stroke='black' d='M574.82,422.40 L574.82,413.40 M574.82,168.01 L574.82,177.01 '/> <g transform="translate(574.82,444.30)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle">
<text><tspan font-family="Arial" > 11</tspan></text> <text><tspan font-family="Arial" > 12</tspan></text>
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
...@@ -320,8 +333,8 @@ ...@@ -320,8 +333,8 @@
<g id="gnuplot_plot_1" fill="none"><title>gnuplot_plot_1</title> <g id="gnuplot_plot_1" fill="none"><title>gnuplot_plot_1</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(144, 238, 144)' fill-opacity = '0.300000' points = '89.31,397.62 158.67,352.31 228.03,332.55 297.39,313.50 366.74,288.48 436.10,277.73 505.46,271.87 574.82,259.95 574.82,228.93 505.46,241.55 436.10,249.71 366.74,266.01 297.39,281.74 228.03,307.52 158.67,326.63 89.31,370.59 <polygon fill = 'rgb(144, 238, 144)' fill-opacity = '0.300000' points = '89.31,397.62 150.00,352.31 210.69,332.55 271.38,313.50 332.07,288.48 392.75,277.73 453.44,271.87 514.13,259.95 574.82,245.48 574.82,217.80 514.13,228.93 453.44,241.55 392.75,249.71 332.07,266.01 271.38,281.74 210.69,307.52
'/> 150.00,326.63 89.31,370.59 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -332,14 +345,14 @@ ...@@ -332,14 +345,14 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb( 0, 100, 0)' stroke-dasharray='1.0,2.0' d='M355.31,24.00 L420.31,24.00 M89.31,379.79 L158.67,338.09 L228.03,320.15 L297.39,297.10 L366.74,279.47 L436.10,264.50 <path stroke='rgb( 0, 100, 0)' stroke-dasharray='1.0,2.0' d='M355.31,24.00 L420.31,24.00 M89.31,379.79 L150.00,338.09 L210.69,320.15 L271.38,297.10 L332.07,279.47 L392.75,264.50
L505.46,257.98 L574.82,246.58 '/></g> L453.44,257.98 L514.13,246.58 L574.82,234.02 '/></g>
</g> </g>
<g id="gnuplot_plot_3" fill="none"><title>gnuplot_plot_3</title> <g id="gnuplot_plot_3" fill="none"><title>gnuplot_plot_3</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(173, 216, 230)' fill-opacity = '0.300000' points = '89.31,407.39 158.67,384.60 228.03,365.48 297.39,365.11 366.74,347.51 436.10,334.47 505.46,344.32 574.82,333.30 574.82,320.83 505.46,325.90 436.10,323.73 366.74,339.78 297.39,352.52 228.03,362.29 158.67,370.63 89.31,387.59 <polygon fill = 'rgb(173, 216, 230)' fill-opacity = '0.300000' points = '89.31,407.39 150.00,384.60 210.69,365.48 271.38,365.11 332.07,347.51 392.75,334.47 453.44,344.32 514.13,333.30 574.82,324.30 574.82,315.05 514.13,320.83 453.44,325.90 392.75,323.73 332.07,339.78 271.38,352.52 210.69,362.29
'/> 150.00,370.63 89.31,387.59 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -350,14 +363,14 @@ ...@@ -350,14 +363,14 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb( 0, 0, 139)' stroke-dasharray='2.5,4.0' d='M355.31,54.00 L420.31,54.00 M89.31,396.74 L158.67,371.92 L228.03,362.94 L297.39,356.15 L366.74,345.60 L436.10,333.76 <path stroke='rgb( 0, 0, 139)' stroke-dasharray='2.5,4.0' d='M355.31,54.00 L420.31,54.00 M89.31,396.74 L150.00,371.92 L210.69,362.94 L271.38,356.15 L332.07,345.60 L392.75,333.76
L505.46,329.73 L574.82,326.55 '/></g> L453.44,329.73 L514.13,326.55 L574.82,318.23 '/></g>
</g> </g>
<g id="gnuplot_plot_5" fill="none"><title>gnuplot_plot_5</title> <g id="gnuplot_plot_5" fill="none"><title>gnuplot_plot_5</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(240, 50, 50)' fill-opacity = '0.300000' points = '89.31,406.91 158.67,384.83 228.03,372.01 297.39,360.69 366.74,346.24 436.10,337.54 505.46,334.97 574.82,325.49 574.82,311.25 505.46,319.17 436.10,320.23 366.74,334.99 297.39,344.47 228.03,356.69 158.67,371.13 89.31,398.11 <polygon fill = 'rgb(240, 50, 50)' fill-opacity = '0.300000' points = '89.31,406.91 150.00,384.83 210.69,372.01 271.38,360.69 332.07,346.24 392.75,337.54 453.44,334.97 514.13,325.49 574.82,320.28 574.82,305.87 514.13,311.25 453.44,319.17 392.75,320.23 332.07,334.99 271.38,344.47 210.69,356.69
'/> 150.00,371.13 89.31,398.11 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -368,13 +381,13 @@ ...@@ -368,13 +381,13 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb(139, 0, 0)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M355.31,84.00 L420.31,84.00 M89.31,402.75 L158.67,378.30 L228.03,365.16 L297.39,351.86 L366.74,339.13 L436.10,329.92 <path stroke='rgb(139, 0, 0)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M355.31,84.00 L420.31,84.00 M89.31,402.75 L150.00,378.30 L210.69,365.16 L271.38,351.86 L332.07,339.13 L392.75,329.92
L505.46,327.08 L574.82,321.54 '/></g> L453.44,327.08 L514.13,321.54 L574.82,312.98 '/></g>
</g> </g>
<g id="gnuplot_plot_7" fill="none"><title>gnuplot_plot_7</title> <g id="gnuplot_plot_7" fill="none"><title>gnuplot_plot_7</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(240, 85, 240)' fill-opacity = '0.300000' points = '89.31,351.85 158.67,324.58 158.67,301.66 89.31,326.76 '/> <polygon fill = 'rgb(240, 85, 240)' fill-opacity = '0.300000' points = '89.31,351.85 150.00,324.58 150.00,301.66 89.31,326.76 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -385,13 +398,13 @@ ...@@ -385,13 +398,13 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb(192, 0, 255)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M355.31,114.00 L420.31,114.00 M89.31,340.83 L158.67,311.91 '/></g> <path stroke='rgb(192, 0, 255)' stroke-dasharray='4.5,2.0,0.5,2.0,0.5,2.0' d='M355.31,114.00 L420.31,114.00 M89.31,340.83 L150.00,311.91 '/></g>
</g> </g>
<g id="gnuplot_plot_9" fill="none"><title>gnuplot_plot_9</title> <g id="gnuplot_plot_9" fill="none"><title>gnuplot_plot_9</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'> <g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(211, 211, 211)' fill-opacity = '0.300000' points = '89.31,353.79 158.67,320.59 228.03,304.01 297.39,280.40 366.74,267.04 436.10,254.20 505.46,243.67 574.82,232.99 574.82,188.98 505.46,203.40 436.10,220.96 366.74,234.76 297.39,245.50 228.03,272.34 158.67,286.31 89.31,333.75 <polygon fill = 'rgb(211, 211, 211)' fill-opacity = '0.300000' points = '89.31,353.79 150.00,320.59 210.69,304.01 271.38,280.40 332.07,267.04 392.75,254.20 453.44,243.67 514.13,232.99 574.82,222.61 574.82,177.33 514.13,188.98 453.44,203.40 392.75,220.96 332.07,234.76 271.38,245.50 210.69,272.34
'/> 150.00,286.31 89.31,333.75 '/>
</g> </g>
</g> </g>
</g> </g>
...@@ -402,8 +415,8 @@ ...@@ -402,8 +415,8 @@
</g> </g>
</g> </g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb(160, 160, 160)' d='M355.31,144.00 L420.31,144.00 M89.31,341.88 L158.67,307.98 L228.03,290.93 L297.39,267.88 L366.74,247.29 L436.10,242.69 <path stroke='rgb(160, 160, 160)' d='M355.31,144.00 L420.31,144.00 M89.31,341.88 L150.00,307.98 L210.69,290.93 L271.38,267.88 L332.07,247.29 L392.75,242.69
L505.46,224.86 L574.82,215.28 '/></g> L453.44,224.86 L514.13,215.28 L574.82,201.51 '/></g>
</g> </g>
<g fill="none" color="white" stroke="rgb(160, 160, 160)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter"> <g fill="none" color="white" stroke="rgb(160, 160, 160)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g> </g>
......
...@@ -6,7 +6,7 @@ set auto y ...@@ -6,7 +6,7 @@ set auto y
set auto y2 set auto y2
set key autotitle columnhead set key autotitle columnhead
unset key unset key
set key font ",20" set key font ",10"
set key left above set key left above
set ticslevel 0 set ticslevel 0
set style data lines set style data lines
...@@ -26,4 +26,6 @@ plot "negotiationLog.csv" using ($2):($3) smooth bezier dt 7 lc "dark-green" tit ...@@ -26,4 +26,6 @@ plot "negotiationLog.csv" using ($2):($3) smooth bezier dt 7 lc "dark-green" tit
"noNegotiationLog.csv" using ($2):($4) smooth bezier dt 8 lc "dark-red" title 'Tâches consommées' axes x1y2,\ "noNegotiationLog.csv" using ($2):($4) smooth bezier dt 8 lc "dark-red" title 'Tâches consommées' axes x1y2,\
"noNegotiationLog.csv" using ($2):($5) smooth bezier dt 1 lc "dark-red" title 'Simple consommation' axes x1y1,\ "noNegotiationLog.csv" using ($2):($5) smooth bezier dt 1 lc "dark-red" title 'Simple consommation' axes x1y1,\
"ssiLog.csv" using ($2):($4) smooth bezier dt 8 lc "dark-blue" title 'Tâches consommées' axes x1y2,\ "ssiLog.csv" using ($2):($4) smooth bezier dt 8 lc "dark-blue" title 'Tâches consommées' axes x1y2,\
"ssiLog.csv" using ($2):($5) smooth bezier dt 1 lc "dark-blue" title 'SSI' axes x1y1 "ssiLog.csv" using ($2):($5) smooth bezier dt 1 lc "dark-blue" title 'SSI' axes x1y1,\
\ No newline at end of file "psiLog.csv" using ($2):($4) smooth bezier dt 8 lc "dark-magenta" title 'Tâches consommées' axes x1y2,\
"psiLog.csv" using ($2):($5) smooth bezier dt 1 lc "dark-magenta" title 'PSI' axes x1y1
\ No newline at end of file
...@@ -4,9 +4,10 @@ package org.smastaplus.consumer.deal.mas ...@@ -4,9 +4,10 @@ package org.smastaplus.consumer.deal.mas
import org.smastaplus.core._ import org.smastaplus.core._
import org.smastaplus.process.{Delegation, Swap} import org.smastaplus.process.{Delegation, Swap}
import org.smastaplus.strategy.consumption.{Bundle, Insight} import org.smastaplus.strategy.consumption.{Bundle, Insight}
import org.joda.time.LocalDateTime import org.joda.time.LocalDateTime
import java.io.PrintWriter import java.io.PrintWriter
import scala.collection.SortedSet
/** /**
* Class representing a message of the agent communication language * Class representing a message of the agent communication language
...@@ -200,3 +201,13 @@ case class NotifyDone(node: ComputingNode, task: Task, completionTime: LocalDat ...@@ -200,3 +201,13 @@ case class NotifyDone(node: ComputingNode, task: Task, completionTime: LocalDat
// Notify the monitor about the consumption of the task at completionTime // Notify the monitor about the consumption of the task at completionTime
override def toString: String = s"Notify($node,$task,$completionTime)" override def toString: String = s"Notify($node,$task,$completionTime)"
} }
case class Reschedule(nodes: SortedSet[ComputingNode], allocation: ExecutedAllocation, potentialDelegatedTasks : List[Task]) extends Message(Message.ID, None) {
// Ask the scheduler to apply Parallel Single-Issue Auction
override def toString: String = s"Reschedule($nodes,$allocation,$potentialDelegatedTasks)"
}
// Messages for negotiation
case class Suggest(delegation: Delegation) extends Message(delegation.hashCode(), None){// The scheduler suggest a delegation
override def toString: String = s"Suggest($delegation)"
}
...@@ -25,11 +25,11 @@ class AsynchronousDecentralizedConsumer(stap: STAP, ...@@ -25,11 +25,11 @@ class AsynchronousDecentralizedConsumer(stap: STAP,
monitor: Boolean, monitor: Boolean,
simulated: SimulatedCost, simulated: SimulatedCost,
val ssi : Boolean = false, val ssi : Boolean = false,
val pssi : Boolean = false) val psi : Boolean = false)
extends AsynchronousConsumer(stap, name, monitor, simulated){ extends AsynchronousConsumer(stap, name, monitor, simulated){
// Launch a new distributor // Launch a new distributor
private val distributor : ActorRef = system.actorOf(Props(classOf[Distributor], stap, simulated, dispatcherId, monitor, ssi, pssi) private val distributor : ActorRef = system.actorOf(Props(classOf[Distributor], stap, simulated, dispatcherId, monitor, ssi, psi)
withDispatcher dispatcherId, name = "Distributor") withDispatcher dispatcherId, name = "Distributor")
......
...@@ -21,13 +21,13 @@ import org.smastaplus.balancer.SSIBalancer ...@@ -21,13 +21,13 @@ import org.smastaplus.balancer.SSIBalancer
* @param dispatcherId is the name of the dispatcher "akka.actor.default-dispatcher" or "single-thread-dispatcher" * @param dispatcherId is the name of the dispatcher "akka.actor.default-dispatcher" or "single-thread-dispatcher"
* @param isMonitored is true if the ongoing consumption is monitored * @param isMonitored is true if the ongoing consumption is monitored
* @param ssi true if sequential single-item auction is applied * @param ssi true if sequential single-item auction is applied
* @param pssi true if parallel single-item auction is applied * @param psi true if parallel single-item auction is applied
**/ **/
class Distributor(stap: STAP, simulated: SimulatedCost, class Distributor(stap: STAP, simulated: SimulatedCost,
val dispatcherId: String, val dispatcherId: String,
isMonitored: Boolean, isMonitored: Boolean,
val ssi: Boolean, val ssi: Boolean,
val pssi: Boolean) val psi: Boolean)
extends Actor with Stash extends Actor with Stash
with FSM[DistributorState, DistributorStatus] { with FSM[DistributorState, DistributorStatus] {
...@@ -52,9 +52,15 @@ class Distributor(stap: STAP, simulated: SimulatedCost, ...@@ -52,9 +52,15 @@ class Distributor(stap: STAP, simulated: SimulatedCost,
private var distributedConsumptionSystem: ActorRef = context.parent // The parent private var distributedConsumptionSystem: ActorRef = context.parent // The parent
var directory = new Directory() // White page for the agents var directory = new Directory() // White page for the agents
val scheduler: Option[ActorRef] = if (psi)
Some(context.actorOf(Props(classOf[Scheduler], stap, GlobalFlowtime)
.withDispatcher(dispatcherId), "Scheduler"))
else None
// Eventually build the monitor // Eventually build the monitor
private val logName = if (ssi) "ssi" else if (psi) "psi" else "noNegotiation"
val monitor: Option[ActorRef] = if (isMonitored) val monitor: Option[ActorRef] = if (isMonitored)
Some(context.actorOf(Props(classOf[Monitor], stap, if (ssi) "ssi" else "noNegotiation", None, None) Some(context.actorOf(Props(classOf[Monitor], stap, logName, None, None)
.withDispatcher(dispatcherId), "Monitor")) .withDispatcher(dispatcherId), "Monitor"))
else None else None
...@@ -136,7 +142,31 @@ class Distributor(stap: STAP, simulated: SimulatedCost, ...@@ -136,7 +142,31 @@ class Distributor(stap: STAP, simulated: SimulatedCost,
monitor.get ! Init(allocation) monitor.get ! Init(allocation)
if (debugMetrics) println(s"${updatedStatus.allocation.realGlobalMeanFlowtime}") if (debugMetrics) println(s"${updatedStatus.allocation.realGlobalMeanFlowtime}")
} }
if (debug) println(s"Initial allocation: ${updatedStatus.allocation}")
if (debug) println(s"Initial tasks in progress: ${updatedStatus.allocation.tasksInProgress}") if (debug) println(s"Initial tasks in progress: ${updatedStatus.allocation.tasksInProgress}")
// Activate the scheduler
if (psi) scheduler.get ! Reschedule(stap.ds.computingNodes,updatedStatus.allocation,updatedStatus.allocation.pendingTasks())
stay() using updatedStatus
// When the scheduler suggest a delegation
case Event(Suggest(delegation), status) =>
var updatedStatus = status
if (debug) println(s"Distributor: current allocation=\n ${updatedStatus.allocation}")
if (debug) println(s"Distributor: scheduler suggestion= $delegation")
if (debug) println(s"Distributor donor mind= ${updatedStatus.minds(delegation.donor)}")
if ( delegation.endowment.forall(updatedStatus.allocation.bundle(delegation.donor).contains)){
updatedStatus = updatedStatus.updateAllocation(delegation.execute(updatedStatus.allocation))
updatedStatus = updatedStatus.updateMind(delegation.donor, updatedStatus.minds(delegation.donor).removeTasks(delegation.endowment))
updatedStatus = updatedStatus.updateMind(delegation.recipient, updatedStatus.minds(delegation.recipient).addTasks(delegation.endowment))
if (isMonitored) {
new BundleWriter(pathName + delegation.donor + ".json", updatedStatus.allocation.getTheBundle(delegation.donor), "monitoring").write()
monitor.get ! Notify(delegation.donor, updatedStatus.minds(delegation.donor).getCurrentTasks, updatedStatus.minds(delegation.donor).insight())
new BundleWriter(pathName + delegation.recipient + ".json", updatedStatus.allocation.getTheBundle(delegation.recipient), "monitoring").write()
monitor.get ! Notify(delegation.recipient, updatedStatus.minds(delegation.recipient).getCurrentTasks, updatedStatus.minds(delegation.recipient).insight())
}
}
scheduler.get ! Reschedule(stap.ds.computingNodes,updatedStatus.allocation, updatedStatus.allocation.pendingTasks().diff(delegation.endowment))
stay() using updatedStatus stay() using updatedStatus
// When the allocation is updated // When the allocation is updated
...@@ -185,7 +215,7 @@ class Distributor(stap: STAP, simulated: SimulatedCost, ...@@ -185,7 +215,7 @@ class Distributor(stap: STAP, simulated: SimulatedCost,
stay() using updatedStatus stay() using updatedStatus
// When there is still a task to give to the worker // When there is still a task to give to the worker
case Event(Done(completionDate), status) if status.allocation.bundle(directory.nodeOf(sender())).size !=1 => case Event(Done(completionDate), status) if status.allocation.bundle(directory.nodeOf(sender())).nonEmpty =>
if (debug) println(s"Case 1: there is still a task to give to the worker") if (debug) println(s"Case 1: there is still a task to give to the worker")
var updatedStatus = new DistributorStatus(status.allocation, status.minds) var updatedStatus = new DistributorStatus(status.allocation, status.minds)
val node = directory.nodeOf(sender()) val node = directory.nodeOf(sender())
...@@ -221,11 +251,13 @@ class Distributor(stap: STAP, simulated: SimulatedCost, ...@@ -221,11 +251,13 @@ class Distributor(stap: STAP, simulated: SimulatedCost,
if (debugMetrics) println(s"${updatedStatus.allocation.realGlobalMeanFlowtime}") if (debugMetrics) println(s"${updatedStatus.allocation.realGlobalMeanFlowtime}")
} }
if (debug) println(s"Tasks in progress: ${updatedStatus.allocation.tasksInProgress}") if (debug) println(s"Tasks in progress: ${updatedStatus.allocation.tasksInProgress}")
if (psi) scheduler.get ! Reschedule(stap.ds.computingNodes - node, updatedStatus.allocation, updatedStatus.allocation.pendingTasks())
stay() using updatedStatus stay() using updatedStatus
// When there is no more task for this worker, but there are still tasks for others // When there is no more task for this worker, but there are still tasks for others
case Event(Done(completionDate), status) if status.allocation.bundle(directory.nodeOf(sender())).size == 1 && case Event(Done(completionDate), status) if status.allocation.bundle(directory.nodeOf(sender())).isEmpty&&
status.allocation.tasksInProgress.values.collect { case Some(task) => task }.size != 1 => status.allocation.tasksInProgress.values.collect { case Some(task) => task }.size != 1 =>
if (debug) println(s"Case 2: there is no more task for this worker, but there are still tasks for others") if (debug) println(s"Case 2: there is no more task for this worker, but there are still tasks for others")
var updatedStatus = new DistributorStatus(status.allocation, status.minds) var updatedStatus = new DistributorStatus(status.allocation, status.minds)
...@@ -263,12 +295,13 @@ class Distributor(stap: STAP, simulated: SimulatedCost, ...@@ -263,12 +295,13 @@ class Distributor(stap: STAP, simulated: SimulatedCost,
if (debugMetrics) println(s"${updatedStatus.allocation.realGlobalMeanFlowtime}") if (debugMetrics) println(s"${updatedStatus.allocation.realGlobalMeanFlowtime}")
} }
if (debug) println(s"Tasks in progress: ${updatedStatus.allocation.tasksInProgress}") if (debug) println(s"Tasks in progress: ${updatedStatus.allocation.tasksInProgress}")
if (psi) scheduler.get ! Reschedule(stap.ds.computingNodes - node, updatedStatus.allocation, updatedStatus.allocation.pendingTasks())
stay() using updatedStatus stay() using updatedStatus
// When there is no more task for this worker, but there are still tasks for others // When there is no more task for this worker, but there no more tasks for others
case Event(Done(completionDate), status) if status.allocation.bundle(directory.nodeOf(sender())).size == 1 && case Event(Done(completionDate), status) if status.allocation.bundle(directory.nodeOf(sender())).isEmpty &&
status.allocation.tasksInProgress.values.collect { case Some(task) => task }.size == 1 => status.allocation.tasksInProgress.values.collect { case Some(task) => task }.size == 1 =>
if (debug) println(s"Case 3: there is no more task for this worker, but there are still tasks for others") if (debug) println(s"Case 3: there is no more task for this worker, but there no more tasks for others")
var updatedStatus = new DistributorStatus(status.allocation, status.minds) var updatedStatus = new DistributorStatus(status.allocation, status.minds)
val node = directory.nodeOf(sender()) val node = directory.nodeOf(sender())
val mind = status.minds(node) val mind = status.minds(node)
......
// Copyright (C) Maxime MORGE 2021, 2022, 2023
package org.smastaplus.consumer.nodeal
import akka.actor.{Actor, ActorRef}
import org.joda.time.LocalDateTime
import org.smastaplus.consumer.deal.mas._
import org.smastaplus.consumer.deal.mas.nodeAgent.manager.ManagerMind
import org.smastaplus.core._
import org.smastaplus.process.SingleDelegation
import org.smastaplus.provisioning.{Active, ProvisioningUsage}
import org.smastaplus.strategy.consumption.BeliefBase
import org.smastaplus.strategy.deal.counterproposal.CounterProposalStrategy
import org.smastaplus.strategy.deal.proposal.ProposalStrategy
import org.smastaplus.utils.RandomUtils
import java.io._
import scala.annotation.unused
import scala.collection.SortedSet
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
import scala.language.postfixOps
import scala.math.log10
/**
* Scheduler
*
* @param stap instance
* @param rule is the social rule to be applied
*/
class Scheduler(stap: STAP, rule: SocialRule) extends Actor {
import scala.concurrent.ExecutionContext.Implicits.global
val debug = false
private val TIMEOUT_VALUE: FiniteDuration = 6000 minutes // Default timeout of a run
private val noFuture = false // true if the bids are sequential
private var distributor: ActorRef = context.parent // The parent
var potentialDelegatedTasks: List[Task] = List.empty[Task]
var currentAllocation: ExecutedAllocation = _
/**
* Process the messages
*/
override def receive: Receive = {
case Reschedule(nodes, allocation: Allocation, potentialDelegatedTasks) =>
distributor = sender()
currentAllocation = allocation
this.potentialDelegatedTasks = potentialDelegatedTasks
val potentialAuctioneers = potentialNodes(nodes)
if (potentialAuctioneers.nonEmpty) reallocate(potentialAuctioneers)
case Stop =>
if (debug) println(s"Scheduler> stops")
context.stop(self)
}
/**
* Reallocate the allocations with the nodes as auctioneers
*
*/
def reallocate(auctioneers: SortedSet[ComputingNode]): Unit = {
val auctioneer = RandomUtils.random[ComputingNode](auctioneers)
val tasks: List[Task] = currentAllocation.bundle(auctioneer).intersect(potentialDelegatedTasks)
if (debug) println(s"Scheduler considers $auctioneer with the potential tasks $tasks")
val bidders: List[ComputingNode] = stap.ds.computingNodes.diff(Set(auctioneer)).toList
val proposals: List[(ComputingNode, Task)] = bidders.flatMap(bidder => tasks.map(task => (bidder, task)))
val initialBid = rule match { // Any bid must improve the current allocation
case GlobalFlowtime =>
(tasks.head, auctioneer, currentAllocation.ongoingGlobalFlowtime)
case _ =>
throw new RuntimeException(s"Scheduler cannot apply the social rule $rule")
}
val (bestTask, bestBidder, bestFlowtime): (Task, ComputingNode, Double) = if (noFuture) { // sequential computation of the best bid
proposals.foldLeft(initialBid) {
(best: (Task, ComputingNode, Double), proposal: (ComputingNode, Task)) =>
val (bidder, task) = proposal
val bid = rule match {
case GlobalFlowtime =>
accept(currentAllocation, auctioneer, bidder, task).ongoingGlobalFlowtime
case _ =>
throw new RuntimeException(s"Scheduler cannot apply the social rule $rule")
}
if (bid < best._3) (task, bidder, bid)
else best
}
} else { // concurrents computation of the best bid
val futures: List[Future[(Task, ComputingNode, Double)]] = proposals.map {
case (bidder, task) =>
val bid = rule match {
case GlobalFlowtime =>
accept(currentAllocation, auctioneer, bidder, task).ongoingGlobalFlowtime
case _ =>
throw new RuntimeException(s"Scheduler cannot apply the social rule $rule")
}
Future((task, bidder, bid))
}
val future: Future[(Task, ComputingNode, Double)] = Future.foldLeft(futures)(initialBid) {
case (best: (Task, ComputingNode, Double), bid: (Task, ComputingNode, Double)) =>
if (bid._3 < best._3) bid
else best
}
Await.result(future, TIMEOUT_VALUE)
}
if (auctioneer != bestBidder) {
if (debug) println(s"Scheduler reallocates $bestTask from $auctioneer to $bestBidder for flowtime $bestFlowtime ")
val delegation = new SingleDelegation(stap, auctioneer, bestBidder, bestTask)
distributor ! Suggest(delegation)
} else {
if (debug) println(s"Scheduler does not reallocate any task from $auctioneer")
}
potentialDelegatedTasks = potentialDelegatedTasks.filter(_ != bestTask)
}
/**
* Returns the potential auctioneers for PSI
* */
private def potentialNodes(nodes: SortedSet[ComputingNode]): SortedSet[ComputingNode] =
nodes.filter(node => currentAllocation.bundle(node).intersect(potentialDelegatedTasks).nonEmpty)
/**
* Returns the allocation by delegating a task from the auctioneer to the bidder in an allocation
*/
private def accept(allocation: ExecutedAllocation, auctioneer: ComputingNode, bidder: ComputingNode, task: Task): ExecutedAllocation = {
val delegation = new SingleDelegation(stap, auctioneer, bidder, task)
delegation.execute(allocation)
}
}
\ No newline at end of file
...@@ -21,7 +21,7 @@ import akka.util.Timeout ...@@ -21,7 +21,7 @@ import akka.util.Timeout
* @param monitor is true if the completion times are monitored during the solving * @param monitor is true if the completion times are monitored during the solving
* @param simulated cost with with a perfect information of the running environment by default * @param simulated cost with with a perfect information of the running environment by default
* @param ssi true if sequential single-item auction is applied * @param ssi true if sequential single-item auction is applied
* @param pssi true if parallel single-item auction is applied * @param psi true if parallel single-item auction is applied
*/ */
class SynchronousDecentralizedConsumer(stap: STAP, class SynchronousDecentralizedConsumer(stap: STAP,
val system: ActorSystem, name: String, val system: ActorSystem, name: String,
...@@ -29,14 +29,14 @@ class SynchronousDecentralizedConsumer(stap: STAP, ...@@ -29,14 +29,14 @@ class SynchronousDecentralizedConsumer(stap: STAP,
monitor: Boolean = false, monitor: Boolean = false,
simulated: SimulatedCost = new SimulatedCostE(), simulated: SimulatedCost = new SimulatedCostE(),
val ssi: Boolean, val ssi: Boolean,
val pssi: Boolean) val psi: Boolean)
extends SynchronousConsumer(stap, name, monitor, simulated){ extends SynchronousConsumer(stap, name, monitor, simulated){
val TIMEOUT_VALUE : FiniteDuration = 6000 minutes // Default timeout of a run val TIMEOUT_VALUE : FiniteDuration = 6000 minutes // Default timeout of a run
implicit val timeout : Timeout = Timeout(TIMEOUT_VALUE) implicit val timeout : Timeout = Timeout(TIMEOUT_VALUE)
// Launch a new distributor // Launch a new distributor
private val distributor : ActorRef = system.actorOf(Props(classOf[Distributor], stap, simulated, dispatcherId, monitor, ssi, pssi) private val distributor : ActorRef = system.actorOf(Props(classOf[Distributor], stap, simulated, dispatcherId, monitor, ssi, psi)
withDispatcher dispatcherId, name = "Distributor") withDispatcher dispatcherId, name = "Distributor")
/** /**
......
...@@ -160,8 +160,9 @@ Allocation(stap, delay){ ...@@ -160,8 +160,9 @@ Allocation(stap, delay){
* Updates an allocation with a new task in progress for a computing node * Updates an allocation with a new task in progress for a computing node
*/ */
def updateTaskInProgress(node: ComputingNode, task: Option[Task]): ExecutedAllocation = { def updateTaskInProgress(node: ComputingNode, task: Option[Task]): ExecutedAllocation = {
val allocation = this.copy() var allocation = this.copy()
allocation.tasksInProgress += (node -> task) allocation.tasksInProgress += (node -> task)
if (task.isDefined) allocation = allocation.removeTask(node,task.get)
allocation allocation
} }
......
...@@ -37,7 +37,7 @@ class CampaignBalancer extends Campaign{ ...@@ -37,7 +37,7 @@ class CampaignBalancer extends Campaign{
AgentBasedBalancer.id += 1 AgentBasedBalancer.id += 1
val configurations : List[BalancerConfiguration] = { // The configurations val configurations : List[BalancerConfiguration] = { // The configurations
val numbersOfNodes = List.range(12, 17, 1) // m in [2,17[ val numbersOfNodes = List.range(13, 17, 1) // m in [2,17[
val numbersOfJobs = List.range(4, 5, 1) // l in [4,5[ val numbersOfJobs = List.range(4, 5, 1) // l in [4,5[
val couples = for(j <- numbersOfJobs ; i <- numbersOfNodes) yield (i, j) val couples = for(j <- numbersOfJobs ; i <- numbersOfNodes) yield (i, j)
couples.map{ case (i, j) => couples.map{ case (i, j) =>
......
...@@ -13,7 +13,7 @@ import akka.actor.ActorSystem ...@@ -13,7 +13,7 @@ import akka.actor.ActorSystem
import akka.dispatch.MessageDispatcher import akka.dispatch.MessageDispatcher
import com.typesafe.config.{Config, ConfigFactory} import com.typesafe.config.{Config, ConfigFactory}
import org.joda.time.LocalDateTime import org.joda.time.LocalDateTime
import org.smastaplus.balancer.SSIBalancer import org.smastaplus.balancer.{PSIBalancer, SSIBalancer}
/** /**
* Consume and negotiate a random allocation for a random STAP instance using : * Consume and negotiate a random allocation for a random STAP instance using :
...@@ -28,6 +28,7 @@ object MASTAPlusConsumer extends App { ...@@ -28,6 +28,7 @@ object MASTAPlusConsumer extends App {
val decentralizedSystem: ActorSystem = ActorSystem("DecentralizedSystem1") val decentralizedSystem: ActorSystem = ActorSystem("DecentralizedSystem1")
val decentralizedSystem2: ActorSystem = ActorSystem("DecentralizedSystem2") val decentralizedSystem2: ActorSystem = ActorSystem("DecentralizedSystem2")
val decentralizedSystem3: ActorSystem = ActorSystem("DecentralizedSystem3") val decentralizedSystem3: ActorSystem = ActorSystem("DecentralizedSystem3")
val decentralizedSystem4: ActorSystem = ActorSystem("DecentralizedSystem4")
implicit val decentralizedContext: MessageDispatcher = decentralizedSystem.dispatchers.lookup(decentralizedDispatcherId) implicit val decentralizedContext: MessageDispatcher = decentralizedSystem.dispatchers.lookup(decentralizedDispatcherId)
val config: Config = ConfigFactory.load() val config: Config = ConfigFactory.load()
...@@ -57,16 +58,18 @@ object MASTAPlusConsumer extends App { ...@@ -57,16 +58,18 @@ object MASTAPlusConsumer extends App {
val pb = STAP.randomProblem(l = l, m = m, n = n, o, d = d, Uncorrelated) val pb = STAP.randomProblem(l = l, m = m, n = n, o, d = d, Uncorrelated)
if (verbose) println(pb) if (verbose) println(pb)
private val a0 = ExecutedAllocation.randomAllocation(pb) private val a0 = ExecutedAllocation.randomAllocation(pb)
a0.setDelay(pb.ds.t0)
println("Random allocation") println("Random allocation")
if (verbose) println(a0) if (verbose) println(a0)
val balancer = new SSIBalancer(pb, GlobalFlowtime) //val balancer = new SSIBalancer(pb, GlobalFlowtime)
private val a1 = balancer.balance(a0) //private val a1 = balancer.balance(a0)
//val balancer2 = new PSIBalancer(pb, GlobalFlowtime)
//private val a2 = balancer.balance(a0)
//Thread.sleep(5000) // wait for 5000 millisecond //Thread.sleep(5000) // wait for 5000 millisecond
println("Consume without sequential single-item auction ...") a0.setDelay(pb.ds.t0)
println("Consume ...")
private val consumptionSystem = new SynchronousDecentralizedConsumer(pb, decentralizedSystem, name = "DecentralizedConsumer", dispatcherId = decentralizedDispatcherId, private val consumptionSystem = new SynchronousDecentralizedConsumer(pb, decentralizedSystem, name = "DecentralizedConsumer", dispatcherId = decentralizedDispatcherId,
true, ssi = false, pssi = false) true, ssi = false, psi = false)
private val consumedA0 = consumptionSystem.consume(a0) private val consumedA0 = consumptionSystem.consume(a0)
private val cs0 = a0.simulatedMeanGlobalFlowtime / 1000 / 60 private val cs0 = a0.simulatedMeanGlobalFlowtime / 1000 / 60
println(s"C^S(A0):\t$cs0 mn") println(s"C^S(A0):\t$cs0 mn")
...@@ -76,30 +79,42 @@ object MASTAPlusConsumer extends App { ...@@ -76,30 +79,42 @@ object MASTAPlusConsumer extends App {
pb.ds.t0 = LocalDateTime.now() pb.ds.t0 = LocalDateTime.now()
a0.setDelay(pb.ds.t0) a0.setDelay(pb.ds.t0)
a1.setDelay(pb.ds.t0) //a2.setDelay(pb.ds.t0)
println("Consume with parallel single-item auction ...")
private val psiSystem = new SynchronousDecentralizedConsumer(pb, decentralizedSystem3, name = "PSSIConsumption", dispatcherId = decentralizedDispatcherId,
true, ssi = false, psi = true)
private val consumedA2 = psiSystem.consume(a0)
//private val cs2 = a2.simulatedMeanGlobalFlowtime / 1000 / 60
//println(s"C^S(A2):\t$cs2 mn")
private val cr2 = consumedA2.realGlobalMeanFlowtime / 1000 / 60
println(s"C^R(A0):\t$cr2 mn")
decentralizedSystem3.terminate()
private val gammaPSI = (cr0 - cr2) / cr0 * 100
println(s"GammaPSI:\t$gammaPSI %")
pb.ds.t0 = LocalDateTime.now()
a0.setDelay(pb.ds.t0)
//a1.setDelay(pb.ds.t0)
println("Consume with sequential single-item auction ...") println("Consume with sequential single-item auction ...")
private val ssiSystem = new SynchronousDecentralizedConsumer(pb, decentralizedSystem2, name = "SSIConsumption", dispatcherId = decentralizedDispatcherId, private val ssiSystem = new SynchronousDecentralizedConsumer(pb, decentralizedSystem2, name = "SSIConsumption", dispatcherId = decentralizedDispatcherId,
true, ssi = true, pssi = false) true, ssi = true, psi = false)
private val consumedA1 = ssiSystem.consume(a0) private val consumedA1 = ssiSystem.consume(a0)
private val cs1 = a1.simulatedMeanGlobalFlowtime / 1000 / 60 //private val cs1 = a1.simulatedMeanGlobalFlowtime / 1000 / 60
println(s"C^S(A1):\t$cs1 mn") //println(s"C^S(A1):\t$cs1 mn")
private val cr1 = consumedA1.realGlobalMeanFlowtime / 1000 / 60 private val cr1 = consumedA1.realGlobalMeanFlowtime / 1000 / 60
println(s"C^R(A0):\t$cr1 mn") println(s"C^R(A0):\t$cr1 mn")
decentralizedSystem2.terminate() decentralizedSystem2.terminate()
pb.ds.t0 = LocalDateTime.now()
a0.setDelay(pb.ds.t0)
private val gammaSSI = (cr0 - cr1) / cr0 * 100 private val gammaSSI = (cr0 - cr1) / cr0 * 100
println(s"GammaSSI:\t$gammaSSI %") println(s"GammaSSI:\t$gammaSSI %")
pb.ds.t0 = LocalDateTime.now()
a0.setDelay(pb.ds.t0)
println("Consume with negotiation...") println("Consume with negotiation...")
val consumer = new AgentBasedConsumer(pb, GlobalFlowtime, val consumer = new AgentBasedConsumer(pb, GlobalFlowtime,
ConcreteMultiProposalStrategy(), ConcreteMultiProposalStrategy(),
Some(ConcreteLiberalSingleProposalStrategy()), Some(ConcreteLiberalSingleProposalStrategy()),
new ConcreteSingleCounterProposalStrategy, new ConcreteSingleCounterProposalStrategy,
decentralizedSystem3, decentralizedSystem4,
name = "AgentBasedConsumer", name = "AgentBasedConsumer",
dispatcherId = decentralizedDispatcherId, dispatcherId = decentralizedDispatcherId,
monitor) monitor)
...@@ -111,7 +126,7 @@ object MASTAPlusConsumer extends App { ...@@ -111,7 +126,7 @@ object MASTAPlusConsumer extends App {
println(s"C^S(Ae):\t$csE mn") println(s"C^S(Ae):\t$csE mn")
private val crE = consumedAe.realGlobalMeanFlowtime / 1000 / 60 private val crE = consumedAe.realGlobalMeanFlowtime / 1000 / 60
println(s"C^R(Ae):\t$crE mn ") println(s"C^R(Ae):\t$crE mn ")
decentralizedSystem2.terminate() decentralizedSystem4.terminate()
private val gammaNeg = (cr0 - crE) / cr0 * 100 private val gammaNeg = (cr0 - crE) / cr0 * 100
println(s"GammaNeg:\t$gammaNeg %") println(s"GammaNeg:\t$gammaNeg %")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment