diff --git a/diagramms/.$Evolution_01.drawio.bkp b/diagramms/.$Evolution_01.drawio.bkp deleted file mode 100755 index 71818555ae5e2792cf5211aa4ff952c7a9a78208..0000000000000000000000000000000000000000 --- a/diagramms/.$Evolution_01.drawio.bkp +++ /dev/null @@ -1,465 +0,0 @@ -<mxfile host="Electron" modified="2023-06-02T14:00:28.948Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.8 Chrome/112.0.5615.165 Electron/24.2.0 Safari/537.36" etag="uGRXNjCx3vq0dflRDGp-" version="21.2.8" type="device"> - <diagram name="Page-1" id="ZgEUCu97vCsvLgyVy6hc"> - <mxGraphModel dx="2359" dy="1982" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> - <root> - <mxCell id="0" /> - <mxCell id="1" parent="0" /> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-17" value="Population" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="-800" y="340" width="250" height="270" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-8" value="+ population_index: int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="26" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-18" value="+ population_name: string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="52" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-33" value="+ epoch_counter: int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="78" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-100" value="+ individuals: array" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="104" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-29" value="+ operator: operator" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="130" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-90" value="+ mean_individual_fitness: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="156" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-19" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="182" width="250" height="8" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-64" value="+ instantiate_individuals()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="190" width="250" height="28" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-20" value="+ recombine(operator(g_0, g_1))" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-17" vertex="1"> - <mxGeometry y="218" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-8" value="+ apply_operator(operator)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="fyUvw5QtPV9Wiu8gB0H8-17"> - <mxGeometry y="244" width="250" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-21" value="Individual" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="-60" y="164" width="160" height="138" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-22" value="+ gene: array " style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-21" vertex="1"> - <mxGeometry y="26" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-25" value="+ fitness: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-21" vertex="1"> - <mxGeometry y="52" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-99" value="+ population: population" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-21" vertex="1"> - <mxGeometry y="78" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-23" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="fyUvw5QtPV9Wiu8gB0H8-21" vertex="1"> - <mxGeometry y="104" width="160" height="8" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-24" value="+ method(type): type" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-21" vertex="1"> - <mxGeometry y="112" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-26" value="World_controller" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="-445" width="330" height="112" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-27" value="+ populations: array(Populatoon" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-26" vertex="1"> - <mxGeometry y="26" width="330" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-51" value="+ epoch: int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-26" vertex="1"> - <mxGeometry y="52" width="330" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-28" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="fyUvw5QtPV9Wiu8gB0H8-26" vertex="1"> - <mxGeometry y="78" width="330" height="8" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-29" value="+ epoch()&nbsp;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="fyUvw5QtPV9Wiu8gB0H8-26" vertex="1"> - <mxGeometry y="86" width="330" height="26" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-30" value="<b><font style="font-size: 30px;">Class diagramms</font></b>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="-520" y="-130" width="270" height="50" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-31" value="<font size="1"><b style="font-size: 30px;">Flowchart</b></font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1735" y="-240" width="160" height="50" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-34" value="main" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="1735" y="-180" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-115" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="fyUvw5QtPV9Wiu8gB0H8-35" target="YBbd6qHGsjDS6U28tkjz-114" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="fyUvw5QtPV9Wiu8gB0H8-35" target="YBbd6qHGsjDS6U28tkjz-9" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="1580.0000000000005" y="160.00000000000023" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-35" value="mpi?" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1"> - <mxGeometry x="1745" y="156" width="100" height="100" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-42" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1875" y="174" width="30" height="30" as="geometry" /> - </mxCell> - <mxCell id="fyUvw5QtPV9Wiu8gB0H8-45" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1695" y="173" width="30" height="30" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-1" value="since the programm will be run as sbatch<br>and the like it is nice if there is at least one<br>place to define all the params and a contfig file might be nice<br>Read config herer for decide if mpi shall be used or not.<br>Make this file a python dict that is imported in the end<br><br>This step includes to define all user functions like experiments and&nbsp; on_init...<br>It will load all these functions from the respective files and pass them to the controller instance or the worker instance" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1465" y="-135" width="640" height="130" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-32" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-9" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="1600" y="640" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-172" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-9" target="YBbd6qHGsjDS6U28tkjz-168" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-9" value="CONTROLLER<br>INIT" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="500" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-30" value="Think:<br>&nbsp;operators distributed among different populations (each has one)<br>and then let the populations meet at some point to make new population.<br>Which operator to use then for this population? the one from each?<br>Or make thwo populations one with each operator?<br>Which populations to ditch then to not reach more then max? (just make not more then N*2 Pops )<br><br>Maybe for the name of a population make a random string which can reflect from which indexes the populations where made<br>so it is possible in the end to track how the most fittest individuan emerged.<br>It would be good since then one would have a "stammbaum" for each individual and as such can<br>Decide if population fusion/combination is bringing good :)<br>also for master thesis evolver this could be helpfull to understand the algorithm." style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="-810" y="138" width="680" height="190" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-33" target="YBbd6qHGsjDS6U28tkjz-34" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-33" value="while Controller.fitness or Controller.epochs&nbsp;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.loop_limit;whiteSpace=wrap;" parent="1" vertex="1"> - <mxGeometry x="1550" y="640" width="100" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-37" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-34" target="YBbd6qHGsjDS6U28tkjz-36" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-39" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-34" target="YBbd6qHGsjDS6U28tkjz-36" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-34" target="YBbd6qHGsjDS6U28tkjz-40" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-34" target="YBbd6qHGsjDS6U28tkjz-45" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-34" target="6sdkXRkWTDobi1n3qOID-22" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-34" value="Controller.epoch()" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="838" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-36" value="population.mutate()" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1281" y="838" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-38" value="call mutate on all the populations" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1240" y="797" width="200" height="30" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-40" value="population.recombine(<br>operator(g_0,g_1))" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1281" y="1148" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-44" value="will create N new individuals based on the the operators<br>&nbsp;and replace them with the last in the list.<br>N &lt;= popsize, if N==popsize no elitism :)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1220" y="1095" width="320" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-176" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-45" target="YBbd6qHGsjDS6U28tkjz-173" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-45" value="population.instantiiate_<br>individuals(mpi=true)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1281" y="990" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-50" value="Here the fitness value will be evaluated by conducting the experiment<br>Based on bool mpi use the mpi passing model<br>or the process pool model to distribute the genes from<br>the populations to the experiments." style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1126" y="918" width="390" height="70" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-52" value="Experiment" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="-520" y="777" width="160" height="164" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-53" value="+ inputs: ?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-52" vertex="1"> - <mxGeometry y="26" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-54" value="+ outputs:?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-52" vertex="1"> - <mxGeometry y="52" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-57" value="+ Environment" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-52" vertex="1"> - <mxGeometry y="78" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-35" value="+ Fitness_function?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-52" vertex="1"> - <mxGeometry y="104" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-55" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="YBbd6qHGsjDS6U28tkjz-52" vertex="1"> - <mxGeometry y="130" width="160" height="8" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-56" value="+ ?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-52" vertex="1"> - <mxGeometry y="138" width="160" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-58" value="Environment" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="-256" y="826" width="230" height="112" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-59" value="+ name: string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-58" vertex="1"> - <mxGeometry y="26" width="230" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-62" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" parent="YBbd6qHGsjDS6U28tkjz-58" vertex="1"> - <mxGeometry y="52" width="230" height="8" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-63" value="+ instantiate_individual(gene)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-58" vertex="1"> - <mxGeometry y="60" width="230" height="26" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-34" value="+ save_instantiation(filename, gene)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" parent="YBbd6qHGsjDS6U28tkjz-58" vertex="1"> - <mxGeometry y="86" width="230" height="26" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-85" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-74" target="YBbd6qHGsjDS6U28tkjz-75" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-74" target="YBbd6qHGsjDS6U28tkjz-87" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-74" target="6sdkXRkWTDobi1n3qOID-21" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-74" value="Combine populations into new one?" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1"> - <mxGeometry x="1550" y="1394" width="100" height="100" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-75" target="6sdkXRkWTDobi1n3qOID-16" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-75" value="Controller.<br>population_fusion<br>(Indexes)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1213" y="1414" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-79" value="Y" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1511" y="1418" width="30" height="30" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-80" value="N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1650" y="1414" width="30" height="30" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-81" value="There needs to be some configurable parameter maybe:<br>&nbsp;epochs<br>certain change in fitness<br>Gene diversity<br>&nbsp;on which to start this combination process.<br>Gene diversity tracking and if it stagnates then this could be called<br>Experiment or fitness function could also set a flag to call this<br>in the next round" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1416" y="1217" width="380" height="130" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-97" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6sdkXRkWTDobi1n3qOID-21" target="YBbd6qHGsjDS6U28tkjz-96" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="1590" y="2020" as="sourcePoint" /> - </mxGeometry> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-86" value="This will fusion the populations at the indexes inside the Controller<br>Population array. It will allow therefore to choose not only the fittest<br>But also random choices possible.<br>How to fusion populations?<br>Apply the genetic operators on them to create new individuals.<br>Make two pops, one with the operator from population one, one from the other one" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1022" y="1314" width="460" height="100" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-87" value="Controller.<br>population_removal<br>(Indexes)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1206" y="1700" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-89" value="Since new populations are there the need to shrink.<br>Indexes for more option.<br>But generally take the ones with the worst fitness.<br>But it might be okay to first test the newly generated because to make sure that you<br>do not remove some that are better then the newly generated?<br>So here a eval and experimental step of the new populations could be helpfull.<br>And generally it might be good for the diversity to keel the old populations?<br>Maybe make a switch for that so these are kept anyway?<br>Could be done in a index selection function" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1013" y="1547" width="470" height="140" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-102" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-96" target="YBbd6qHGsjDS6U28tkjz-101" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-96" value="Controller.<br>get_fittest(N)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="1860" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-98" value="Get the N fittest members from all populations.<br>Display some information about them" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1473" y="1800" width="270" height="40" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-105" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-101" target="YBbd6qHGsjDS6U28tkjz-104" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-101" value="Controller.<br>experiment.<br>world.<br>instantiate(gene)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="2025" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-103" value="Instantiate the most fittest ones so that one can work with them&nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1436" y="1966" width="360" height="30" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-104" value="Save" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="2220" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-106" value="Save the results:<br>the most fittest genes<br>the instantiation of the most fittest genes.<br>The instantiation is saved via the method the<br>experiment/world is implementing.<br>If it is not implementing such save feature one can save the gene string and pass&nbsp;<br>it to the representative function in the world to get something usefull" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1375" y="2099" width="460" height="110" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-108" value="+ save_instantiation(gene):<br>Will save the instantiation of the individual<br>This will allow it for further use and<br>reflects the result of the genetic algorithm.<br><br>instantiate_individual(gene) will use the fitness funtion to test the individual?<br>Or will it make the object (a logic circuit) which is then passed back to the Experiment<br>Which will then evaluate it based on the fitness function?" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="-256" y="698" width="480" height="130" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-161" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-114" target="YBbd6qHGsjDS6U28tkjz-9" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="1970.0000000000005" y="363" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-162" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-114" target="YBbd6qHGsjDS6U28tkjz-116" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="2377.5" y="440" as="sourcePoint" /> - </mxGeometry> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-114" value="controller or<br>Worker?" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1"> - <mxGeometry x="2315" y="236" width="100" height="100" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-122" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-116" target="YBbd6qHGsjDS6U28tkjz-121" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-116" value="Init_Worker<br>Wait for work" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="2589" y="320" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-128" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-121" target="YBbd6qHGsjDS6U28tkjz-125" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-131" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-121" target="YBbd6qHGsjDS6U28tkjz-130" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-121" value="get_gene()" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2590" y="462" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-125" value="EXPERIMENT<br>WORKFLOW" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2373" y="461" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-130" value="return fitness" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2589" y="600" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-133" value="Controller init&nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontStyle=1;fontSize=30;fontColor=#006600;" parent="1" vertex="1"> - <mxGeometry x="1010" y="186" width="230" height="50" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-151" value="Experiment workflow" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontStyle=1;fontSize=30;fontColor=#006600;" parent="1" vertex="1"> - <mxGeometry x="2089.5" y="748" width="330" height="50" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-152" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-154" target="YBbd6qHGsjDS6U28tkjz-155" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-153" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-154" target="YBbd6qHGsjDS6U28tkjz-156" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-10" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-154" target="6sdkXRkWTDobi1n3qOID-9" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-154" value="experiment.<br>test_individual(gene)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2253" y="1060" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-155" value="world.instantiate_<br>individual(gene)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2053" y="1060" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-156" value="world.test_<br>individual(input, outputs)" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2049" y="1190" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-157" value="These are all objects where each object is one experiment(with its world)<br>on one individual.<br>As such this can be passed to a worker wrapper and here<br>for each individual a own worker process is generated testing the individual and<br>returns the fitness value, or whatever value is represented." style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="2069" y="797" width="450" height="90" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-159" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="fyUvw5QtPV9Wiu8gB0H8-34" target="YBbd6qHGsjDS6U28tkjz-158" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="1795" y="-120" as="sourcePoint" /> - <mxPoint x="1795" y="156" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-160" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-158" target="fyUvw5QtPV9Wiu8gB0H8-35" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-158" value="read_config()" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1735" y="26" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-164" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-165" target="YBbd6qHGsjDS6U28tkjz-169" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-165" value="init_populations()" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1053" y="500" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-166" value="will create a population with given params<br>will create all gene strings and the like" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="985" y="435" width="250" height="40" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-167" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-168" target="YBbd6qHGsjDS6U28tkjz-165" edge="1"> - <mxGeometry relative="1" as="geometry"> - <Array as="points"> - <mxPoint x="1216" y="530" /> - <mxPoint x="1216" y="530" /> - </Array> - </mxGeometry> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-168" value="Controlller = world_controller()" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="1306" y="500" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-169" value="init_individ.()" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="730" y="500" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-170" value="Will create the individuals inside the population.<br>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="650" y="445" width="280" height="30" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-171" value="World_controller will handle all the populations<br>the genetic operators applied and<br>has functons to mutate&nbsp;<br>as well as produce offsprings.<br>This is but just a bridge that calls all these funcitons&nbsp;<br>on the populations itself." style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="960" y="291" width="300" height="100" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-180" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-173" target="YBbd6qHGsjDS6U28tkjz-177" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-181" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="YBbd6qHGsjDS6U28tkjz-173" target="YBbd6qHGsjDS6U28tkjz-179" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-173" value="use MPI?" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1"> - <mxGeometry x="860" y="1050" width="100" height="100" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-177" value="pass genes to MPI workers" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="1000" y="1130" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-183" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-179" target="YBbd6qHGsjDS6U28tkjz-182" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-179" value="pass genes to process worker que/wrapper" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="620" y="1130" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-185" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="YBbd6qHGsjDS6U28tkjz-182" target="YBbd6qHGsjDS6U28tkjz-184" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-182" value="proces_pool_worker<br>wrapper function" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="620" y="1270" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="YBbd6qHGsjDS6U28tkjz-184" value="EXERIMENT<br>WORKFLOW" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="620" y="1410" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6sdkXRkWTDobi1n3qOID-1" target="YBbd6qHGsjDS6U28tkjz-154" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-1" value="Init_experiment()" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2253" y="912" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-4" value="Init experiment will need to read all its own experiment configurations from its own config file.<br>This way the experiment can be treated independently from the Controller config." style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="2090" y="983" width="520" height="40" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-9" value="call_gene_modification" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="2253" y="1392" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-11" value="This could be a module/interface in which the fitness function can advise the controller to&nbsp;<br>Apply specific genetic operators, like the gene string extending operator<br>Recombine new populations<br>build entire new populations<br>sort out some populations.<br>Basically a function which can be called with differient params to achieve the above behaviour<br>Or maybe more a set of functions in the controller class that can be called if needed here from the experiment." style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="2010" y="1260" width="610" height="110" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="6sdkXRkWTDobi1n3qOID-16" target="YBbd6qHGsjDS6U28tkjz-173" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-16" value="instantiate<br>individuals of new pops" style="whiteSpace=wrap;html=1;rounded=1;" parent="1" vertex="1"> - <mxGeometry x="850" y="1414" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-19" value="This is necessary to ensure that the<br>population and the individuals got<br>fitness values" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="812" y="1340" width="210" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="6sdkXRkWTDobi1n3qOID-21" target="YBbd6qHGsjDS6U28tkjz-33" edge="1"> - <mxGeometry relative="1" as="geometry"> - <Array as="points"> - <mxPoint x="1870" y="1650" /> - <mxPoint x="1870" y="670" /> - </Array> - </mxGeometry> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-21" value="print or log information about epoch" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="1620" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="6sdkXRkWTDobi1n3qOID-22" target="YBbd6qHGsjDS6U28tkjz-74" edge="1"> - <mxGeometry relative="1" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-22" value="check if the algorithm stagnates (no diversity)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="1540" y="1148" width="120" height="60" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-30" value="World<br>experiment<br>controller<br>populations<br>individuals<br>operators" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="2880" y="1223" width="80" height="100" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-31" value="controller.pops_stagnation_check()<br>make all of these functions to have a better code overview" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1545" y="1080" width="330" height="40" as="geometry" /> - </mxCell> - <mxCell id="6sdkXRkWTDobi1n3qOID-32" value="On all populations set the epoch counder one up<br>so again you would pack this here into functions.<br>Like _populatios.mutat()<br>_populations_instantiate()<br>_populations_apply_operatos()" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> - <mxGeometry x="1193" y="700" width="280" height="90" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-1" value="Operator_interface" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> - <mxGeometry x="-297" y="480" width="230" height="112" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-2" value="+ name: string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="2305VUciKoEtOX_F4iJQ-1"> - <mxGeometry y="26" width="230" height="26" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-3" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;strokeColor=inherit;" vertex="1" parent="2305VUciKoEtOX_F4iJQ-1"> - <mxGeometry y="52" width="230" height="8" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-4" value="+ apply_operator(gene_0, gene_1)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="2305VUciKoEtOX_F4iJQ-1"> - <mxGeometry y="60" width="230" height="26" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-7" value="+ apply_operator(gene_0)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;html=1;" vertex="1" parent="2305VUciKoEtOX_F4iJQ-1"> - <mxGeometry y="86" width="230" height="26" as="geometry" /> - </mxCell> - <mxCell id="2305VUciKoEtOX_F4iJQ-6" value="Thies will be an interface to the operators used to produce offsprings<br>There can be operators which will just use one gene string" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1"> - <mxGeometry x="-355" y="373" width="390" height="40" as="geometry" /> - </mxCell> - </root> - </mxGraphModel> - </diagram> -</mxfile> diff --git a/src/testing/Epoch_Amdahls_speedup.pdf b/src/testing/Epoch_Amdahls_speedup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cbcb1d7e2485cceeacda15ec44a7190f2f17cba0 Binary files /dev/null and b/src/testing/Epoch_Amdahls_speedup.pdf differ diff --git a/src/testing/Epoch_Amdahls_speedup.png b/src/testing/Epoch_Amdahls_speedup.png new file mode 100644 index 0000000000000000000000000000000000000000..c5eba3e69cfb5999d09c894c8cfc937ab769d174 Binary files /dev/null and b/src/testing/Epoch_Amdahls_speedup.png differ diff --git a/src/testing/Epoch_Gustavsons_speedup.pdf b/src/testing/Epoch_Gustavsons_speedup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b1210e3e6212a37d1d6dc22c9103eeec97ce0c23 Binary files /dev/null and b/src/testing/Epoch_Gustavsons_speedup.pdf differ diff --git a/src/testing/Epoch_Gustavsons_speedup.png b/src/testing/Epoch_Gustavsons_speedup.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcf1a50406e0cf706f0b9ff045041d73f83c074 Binary files /dev/null and b/src/testing/Epoch_Gustavsons_speedup.png differ diff --git a/src/testing/Epoch_runtime.pdf b/src/testing/Epoch_runtime.pdf new file mode 100644 index 0000000000000000000000000000000000000000..de78bcdf47882b3efb2efd6e7d44d8b3482cebc2 Binary files /dev/null and b/src/testing/Epoch_runtime.pdf differ diff --git a/src/testing/Epoch_runtime.png b/src/testing/Epoch_runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8a92e3f579daaf04d6d02eac64771773cf054b Binary files /dev/null and b/src/testing/Epoch_runtime.png differ diff --git a/src/testing/Epoch_runtime_inlet.pdf b/src/testing/Epoch_runtime_inlet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..14b033772f95d1007fa90cb23c46acb2f4cd4464 Binary files /dev/null and b/src/testing/Epoch_runtime_inlet.pdf differ diff --git a/src/testing/Epoch_runtime_inlet.png b/src/testing/Epoch_runtime_inlet.png new file mode 100644 index 0000000000000000000000000000000000000000..3efca50a65172f6b9629e1d18266d4a9d6dfcc19 Binary files /dev/null and b/src/testing/Epoch_runtime_inlet.png differ diff --git a/src/testing/Speedup_figures.ipynb b/src/testing/Speedup_figures.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..bf21fedf6c7ea7c688ab2c520f2c21b27a344391 --- /dev/null +++ b/src/testing/Speedup_figures.ipynb @@ -0,0 +1,651 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7ef3f4ef-11ce-4ce0-9cfc-be1a7cc7fe0c", + "metadata": {}, + "source": [ + "# speed up graphs for parralelisation" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e3dcb16b-3661-4f3c-9dcb-400bd1f55f24", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# speed tests\n", + "mpi_cores = [2,10,20,40,60,80,100,200,280,300]\n", + "mpi_times = [5.225689952159641, 0.5698658002175366, 0.2761596009580796, 0.14349941399406357, 0.09708592028316865, 0.08158155453957593, 0.06397446999914226, 0.04267250263809762, 0.03894918543159764, 0.039870780171746036]\n", + "\n", + "local_cores = [1,2,10,20,40,60,80]\n", + "local_times = [4.905603394649996, 6.289567973878649, 6.438861921855381, 6.791049808263779, 7.110521283260612, 7.244502800266917, 7.444024534786449]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "6d31c1fb-d6e2-4072-87f3-7ff1932eb2b9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "#import matplotlib\n", + "\n", + "#matplotlib.rcParams['font.family'] = 'cantarell'\n", + "serif_font = {'fontname':'cantarell'}" + ] + }, + { + "cell_type": "markdown", + "id": "39c98e33-9e84-41e3-bd40-9d0730cc0b74", + "metadata": {}, + "source": [ + "# strong scaling" + ] + }, + { + "cell_type": "markdown", + "id": "7c12d6ef-f5d9-4d6f-8b84-d40b93c6931d", + "metadata": {}, + "source": [ + "### Amdahl's law\n", + "speedup = T/(s+p/N)\n", + "\n", + "where:\n", + "\n", + "s = serial parts execution time on one processor core \n", + "\n", + "p = parralel parts execution time on one processor core\n", + "\n", + "T = s + p overall runtime on one processor core\n", + "\n", + "N = number of processor cores used for parallelization\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f47ac90f-39fd-4026-bb7f-dc4e9f2b44a6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "max speedup with T= 4.90559\n", + "772.5338582677166\n" + ] + } + ], + "source": [ + "s = 0.00635\n", + "p = 4.89924\n", + "amdahl_speedup_per_cores = []\n", + "for N in mpi_cores:\n", + " amdahl_speedup_per_cores.append((s+p)/(s+p/N))\n", + " \n", + "# max speedup\n", + "T = p+s\n", + "print('max speedup with T=',T)\n", + "print(T/s)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b9597664-1c23-43a0-962a-9d400e4b1b33", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[<matplotlib.lines.Line2D at 0x7fd8a20b5b90>]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGdCAYAAAA44ojeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7lklEQVR4nO3deXxU9b3/8ffMZJkEMhNCSCZhDTuRRRbBuOBChKBSEbwVi9aFq1cKvVVwo79Wir29tLZXb7UWb6+t2OuC2ooWq7QIAkUCwSAKRhAwEpAskJCZJDBZZs7vj8jUsCaQzJnl9Xw85iFzzjfhM18nmTff7/d8j8UwDEMAAAAhxGp2AQAAACcioAAAgJBDQAEAACGHgAIAAEIOAQUAAIQcAgoAAAg5BBQAABByCCgAACDkxJhdwLnw+/06ePCgkpKSZLFYzC4HAAC0gmEYqqmpUWZmpqzWM4+RhGVAOXjwoHr27Gl2GQAA4Bzs379fPXr0OGObsAwoSUlJkppfoMPhMLkaAADQGh6PRz179gx8jp9JWAaU49M6DoeDgAIAQJhpzfIMFskCAICQQ0ABAAAhh4ACAABCDgEFAACEHAIKAAAIOQQUAAAQcggoAAAg5BBQAABAyAnLjdoAAEDH8PkNFRRXqaLGq7Qku8ZmpchmDf597wgoAABAkrRyR6kWrShSqdsbOJbhtGvhlGzlDc0Iai1M8QAAAK3cUarZL25tEU4kqczt1ewXt2rljtKg1kNAAQAgyvn8hhatKJJxinPHjy1aUSSf/1QtOgYBBQCAKFdQXHXSyMk3GZJK3V4VFFcFrSYCCgAAUa6i5vTh5FzatQcCCgAAUayhya+0JHur2ra2XXsgoAAAEKWWFZTosl+skT3WqgynXae7mNii5qt5xmalBK02AgoAAFGqeb+Tev1f/j4tnJItSSeFlOPPF07JDup+KOyDAgBAlPh4f7V6d01UcmKcJGn+pEEa2t2pWy/urbgYq5bcOuqkfVBcJu2DYjEMI3jXDLUTj8cjp9Mpt9sth8NhdjkAAIS8//r7Lj29Zo/uvjxL/++67NO268idZNvy+c0ICgAAUWBU7y6yWKTaep8Mw5DFcurQYbNalNOva5CrOxkBBQCACONt9Gnpxi/Vp2tiYGrmyoHdtGb+lcpK7WRyda1DQAEAIMK8uGmffv7uTvXokqCrBqcpPsYmi8USNuFE4ioeAAAiwrEGX+DPM8f11sheybo/d6BirOH5Uc8ICgAAYeyLQ7Va+JdPFR9j1XO3XyRJSoiz6Y3Zl5x2nUk4IKAAABDGDEkb91bKapH2Vx1Vz5RESQrrcCIRUAAACDlnutTX423UJ/vdumxAqiSpX7fOWjxtmMZlpQTCSSQgoAAAEEJW7ig9abO0jK83SxuS4dDUZz5QfZNfax+8MnBvnG+P6WlWuR0mPFfOAAAQgVbuKNXsF7e2CCeSVOb2avaLW1V00KNeXTspMzlBFZ56k6oMDkZQAAAIAT6/oUUrinSq7d0NNd8T57G3i/Tn2ZcoLSleMbbIHmOI7FcHAECYKCiuOmnk5JsMSaVur/ZVHo34cCIRUAAACAkVNacPJ+fSLtwRUAAACAGtXVNyfGFspGMNCgAAIeDjA9VnPG+R5HI2X3IcDRhBAQDABI0+v7yN/9ye/kfXZWvC4DRZ1BxGvun484VTsgP7oUQ6AgoAAEG2teSIrn9qg55Y9XngmMtp1+/vuEhLbh0ll7PlNI7LadeSW0cF7kwcDdoUUBYvXqyLLrpISUlJSktL09SpU7Vr164Wbbxer+bMmaOuXbuqc+fOmj59usrLy1u0KSkp0XXXXafExESlpaXpwQcfVFNT0/m/GgAAwkD10QbtKq/R8o++0tGGlp9/eUMztOHhq/XK3Rfr1zMu1Ct3X6wND18dVeFEamNAWbdunebMmaNNmzZp1apVamxs1MSJE1VXVxdoc//992vFihV6/fXXtW7dOh08eFDTpk0LnPf5fLruuuvU0NCgjRs36oUXXtDSpUv16KOPtt+rAgAghPj8hvZXHQ08v3pwun46daj+ft94JcadvBzUZrUop19X3XBhd+X06xo10zrfZDEM41R7wrTKoUOHlJaWpnXr1mn8+PFyu93q1q2bXn75Zd10002SpJ07d2rIkCHKz8/XxRdfrHfffVfXX3+9Dh48qPT0dEnSs88+q4cffliHDh1SXFzcWf9ej8cjp9Mpt9sth8NxruUDANDh9lXWafaLW+XxNmrV/VcoIc5mdkmmacvn93mtQXG73ZKklJTmFcWFhYVqbGxUbm5uoM3gwYPVq1cv5efnS5Ly8/M1bNiwQDiRpEmTJsnj8ejTTz895d9TX18vj8fT4gEAQDhI7RyvI0cb5DnWqJ1lfH611jkHFL/fr/vuu0+XXnqphg4dKkkqKytTXFyckpOTW7RNT09XWVlZoM03w8nx88fPncrixYvldDoDj549I++mSACAyOD3G1r/+aHA807xMVpy62iteeBKjezVxcTKwss5B5Q5c+Zox44dWrZsWXvWc0oLFiyQ2+0OPPbv39/hfycAAG3V6PPrpmc36rt/KNCG3YcDxy/smazUzvEmVhZ+zimgzJ07V2+//bbef/999ejRI3Dc5XKpoaFB1dXVLdqXl5fL5XIF2px4Vc/x58fbnCg+Pl4Oh6PFAwCAUBNrs2p4j2R1jo/R4drIvttwR2tTQDEMQ3PnztXy5cu1Zs0aZWVltTg/evRoxcbGavXq1YFju3btUklJiXJyciRJOTk52r59uyoqKgJtVq1aJYfDoezs7PN5LQAABJXfb+j1D/frUM0/w8j8iQO1Zv4Vmjqyu4mVhb82bXU/Z84cvfzyy3rrrbeUlJQUWDPidDqVkJAgp9OpWbNmad68eUpJSZHD4dD3v/995eTk6OKLL5YkTZw4UdnZ2brtttv0+OOPq6ysTD/60Y80Z84cxccz/AUACB8/emuHXt5commjuuuJb18oSUqyxyrJHmtuYRGgTSMoS5Yskdvt1pVXXqmMjIzA49VXXw20efLJJ3X99ddr+vTpGj9+vFwul954443AeZvNprfffls2m005OTm69dZb9d3vflePPfZY+70qAACC4F9G91Dn+BgNSk/SeezagVM4r31QzMI+KACAYDMMQ3/5+KCsFoumjMgMHPd4G+VgxKRV2vL5zd2MAQBohb98fFA/WLZNXRJjdVn/VHXp1LyxKOGkY3CzQAAAWuHaYRka0TNZsy7LUmJ89O4GGyyMoAAAcALDMPTO9jKtKirTkzdfKIvFolibVctnXyJrFN4XxwwEFAAATnCopl7zX98mb6Nf12S7dN3w5jsJE06Ch4ACAICa9zQ5HkDSHHbNu2ag6up9mjAkzeTKohMBBQAQ1QzD0Kqicv185U794faL1Ce1kyTpnvH9TK4surFIFgAQ9V7cXKIvDtXpN+/vMbsUfI0RFABA1PE2+mS1WBQXY5XFYtGib12gPxXu15yr+ptdGr7GCAoAIKps2H1YE59cr//9xxeBY1mpnfTgpMFKjOPf7aGCgAIAiCqHar0qqTqqPxUeUKPPb3Y5OA2iIgAgojU0+VVR41WPLomSpKkXdpfnWJOmj+6hWBv/Tg9VBBQAQMTaWebR917aqjibVW9//zLF2JrXnNx+SR+zS8NZEB0BABErLcmuqroGHa6t15eVdWaXgzZgBAUAEDEafX5t+qJSlw/oJklK6RSn5747RgPSk+RM4KZ+4YQRFABARDja0KQpT2/Qd/9QoI/3VweOj+mTQjgJQwQUAEBESIyL0ZAMh7okxulQTb3Z5eA8McUDAAhLTT6/lm3ZrxsuzFSSvXmE5MfXZ2uhRUpOjDO5OpwvAgoAICz9YNk2/XV7qb44VKdHp2RLal5zgsjAFA8AICzdfFFPORNiNSC9s9mloAMwggIACHk+v6FlW0rkctg1YUi6JGn8wG7a8PBVgekdRBYCCgAg5L24aZ8W/uVTZTrtyunXNXDPHMJJ5GKKBwAQ8r49pqcGu5J09/i+imN7+qjACAoAIKT4/Yb+VHhAH+0/osXThkuSEuJseuffL5fVajG5OgQLAQUAEFK+rKzTguXb5fMbun54pi7tnypJhJMoQ0ABAJjO7zcCAaRvt86ac1V/dY63aWxWismVwSxM5AEATGMYht786CvlPrFO5R5v4Pi8awbqnvH9FMt6k6jF/3kAgGkMQ1q68Ut9cbhO/7v+C7PLQQhhigcAEFR19U2yx9pks1pktVr00xuGav3uQ/rXy7PMLg0hhBEUAEDQ/O3TMk34r3VatqUkcGxYD6fmXNVf8TE2EytDqCGgAACC5mD1MZV5vHpty34ZhmF2OQhhTPEAADrMsQafjhxtUGZygiTptot7y2a16Ntjespi4bJhnB4jKACADrG15Ihyn1inf3/lo8BoSYzNqu/m9JE9lukcnBkBBQDQITKcdh052qBSt1cH3d6zfwHwDUzxAADahbfRp8J9RwI7v2Y4E7T0zrEa2t0RuLkf0FqMoAAAzltVXYMmPrledzxfoD0VtYHjY7NSCCc4JwQUAMB565IYq/5pnZXSKU6HaurNLgcRgFgLAGizhia/Xt68TzPG9pI91iaLxaKfTx+mxLgYdY7nowXnj3cRAKDN7ni+QBv3Vsp9rEk/yB0gSUpLsptcFSIJUzwAgDa7ZWwvpXaOV1a3TmaXggjFCAoA4IwafX4t/eBLDe3uVE6/rpKk64dn6KrBaUznoMMwggIAOKPfvr9XP3vnM/34rR1qaPJLkiwWC+EEHYqAAgA4ozsu6aMBaZ11z/i+irGyPT2Cg/gLAAho8vn1f5v2aX/VMT06JVuS5EyM1d/uGy8r4QRBREABAAQUlXq0aEWRJOnGkd01rIdTkggnCDoCCgBEOb/fCASQ4T2SdfflWeqT2knZmQ6TK0M0Yw0KAEQpn9/Qi5v2KffJdXIfbQwc/3/XZWvmuN6yMWoCExFQACBK+fyGlm78Ul8cqtP/bfrS7HKAFpjiAYAo4vE2Kik+RhaLRXExVv30hqHaWebRbRf3Nrs0oAVGUAAgSryx9YCu/OVa/XV7aeBYTr+uuvPSLMXY+DhAaOEdCQBRoqTqqKrqGvTqlv1mlwKcFVM8ABChPN5GeRt8SnM038Tv3iv6qWvneM24qKfJlQFnxwgKAESgDbsP6+pfrdOCN7YHjtljbbrt4t6KZToHYYARFAAIMz6/oYLiKlXUeJWWZNfYrJSTLgl2OePlPtag4sN1OlLXoC6d4kyqFjg3BBQACCMrd5Rq0Yoilbq9gWMZTrseyhssl8MeuNtw/7Qk/fGucRrVO1nxMTazygXOmcUwDMPsItrK4/HI6XTK7XbL4WCnQwDRYeWOUs1+catO90s7LsaqdQ9eqQxnQlDrAlqrLZ/fTEQCQBjw+Q0tWlF02nByvE1ptfcMLYDwQUABgDBQUFzVYlrnVHx+Q/VN/iBVBHQsAgoAhIGKmtaNjLS2HRDqCCgAEAbSkuzt2g4IdQQUAAhx3kafendNVIbTrtPdX9ii5qt5xmalBLM0oMMQUAAghH1xqFY3/OYD3ftioX547RBJOimkHH++cEr2SfuhAOGKgAIAIcwea1OZx6uD1V4NdiVpya2j5HK2nMZxOe1acuso5Q3NMKlKoP2xDwoAhBif32gxElJQXKWs1E7qlhQfOH+2nWSBUNSWz292kgWAEFK4r0oPvv6JnrplpIZ2d0rSSetKbFZLYMdYIFIxxQMAIeQPG77UF4fr9Mu/7TK7FMBUjKAAQAj52Y1D1S0pXvMnDjS7FMBUjKAAgInW7CzXkrV7A8+TE+P0k29doCR7rIlVAeZrc0BZv369pkyZoszMTFksFr355pstzt9xxx2yWCwtHnl5eS3aVFVVaebMmXI4HEpOTtasWbNUW1t7Xi8EAMJN0UGP7lr6oR7/205t+bLK7HKAkNLmKZ66ujqNGDFCd911l6ZNm3bKNnl5eXr++ecDz+Pj41ucnzlzpkpLS7Vq1So1Njbqzjvv1D333KOXX365reUAQNjKznTolrG9lBBr0/AeTrPLAUJKmwPK5MmTNXny5DO2iY+Pl8vlOuW5zz77TCtXrtSWLVs0ZswYSdLTTz+ta6+9Vr/61a+UmZnZ1pIAICwYhqF3tpfpqsHdlBjX/Ov3Z1OHysolwsBJOmQNytq1a5WWlqZBgwZp9uzZqqysDJzLz89XcnJyIJxIUm5urqxWqzZv3nzK71dfXy+Px9PiAQDh5j/++pnmvLxVj60oChwjnACn1u4BJS8vT3/84x+1evVq/eIXv9C6des0efJk+Xw+SVJZWZnS0tJafE1MTIxSUlJUVlZ2yu+5ePFiOZ3OwKNnz57tXTYAdLgJg9MUa7OoZ0qiwnCPTCCo2v0y4xkzZgT+PGzYMA0fPlz9+vXT2rVrNWHChHP6ngsWLNC8efMCzz0eDyEFQMjz+w2VerzqnpwgSbqkf6rWP3SVMpwJJlcGhL4Ov8y4b9++Sk1N1Z49eyRJLpdLFRUVLdo0NTWpqqrqtOtW4uPj5XA4WjwAIJRV1TXojqVbdNOSjTpS1xA4TjgBWqfDA8qBAwdUWVmpjIzmm1jl5OSourpahYWFgTZr1qyR3+/XuHHjOrocAAiK+BirDlQd1ZGjDdr+ldvscoCw0+Ypntra2sBoiCQVFxdr27ZtSklJUUpKihYtWqTp06fL5XJp7969euihh9S/f39NmjRJkjRkyBDl5eXp7rvv1rPPPqvGxkbNnTtXM2bM4AoeAGHtmzf56xQfo2dmjlKM1aIB6UkmVwaEnzaPoHz44YcaOXKkRo4cKUmaN2+eRo4cqUcffVQ2m02ffPKJvvWtb2ngwIGaNWuWRo8erX/84x8t9kJ56aWXNHjwYE2YMEHXXnutLrvsMv3ud79rv1cFAEG2r7JO0377gVbuKA0cG5LhIJwA58hihOFS8rbcrhkAguFXf9ul37y/R71SErVm/hWKsXEnEeBEbfn85maBANAO/n3CALmPNereK/sRToB2wE8RAJyDHV+59Z/vfBbYzyQuxqqfTh0auKQYwPlhBAUA2qj6aINu/p981TX4NCCts/5lDPsyAe2NgAIAbZScGKcf5A5QQfER5Q5JN7scICIRUACgFfL3ViortZNcTrsk6V8v66u7L5csFu6lA3QE1qAAwFm8UlCi7zy3Sfe9+pF8/uY1J1arhXACdCACCgCcxbisFCXE2tQ7pZMafX6zywGiAlM8AHAKB6uPKfPrK3L6duusVfOu4AodIIgYQQGAb6hv8umHy7drwn+t056K2sBxwgkQXAQUAPiGWKtV+yrr5G3yKX/vYbPLAaIWUzwAop5hGDKM5oWvVqtFT3z7Qu0ur9VlA1LNLg2IWoygAIhq1UcbNPvFrfqf9V8EjqU77IQTwGQEFABRbc3OCq38tExPrd6tytp6s8sB8DWmeABEtRtHdtfOshpNGZ6prp3jzS4HwNcYQQEQVUrdx/ToWzvU0NS8n4nFYtEPrx2iYT2cJlcG4JsYQQEQNXx+QzP/d7O+OFynTvExejhvsNklATgNRlAARA2b1aJHJg/WsO5OfZs7EAMhjREUABFtT0WtGpr8ys50SJImXuDShCHpslm5jw4QyhhBARCxPthzWFOe3qDvvVSo2vqmwHHCCRD6CCgAItYFmQ51SYxV9y4J8jb6zC4HQBswxQMgopS5vXI57ZKk5MQ4vT77EmU47LIyagKEFUZQAEQEwzD027V7NP7x97Vh9z/vodM9OYFwAoQhAgqAiGCxWHTgyDE1+PxaVVRmdjkAzhNTPADCmmEYsliaR0gevT5bOX276vrhGSZXBeB8MYICICw1NPn1s78W6ZE/bw8cs8faNGVEZiCwAAhfBBQAYWnHQbee21CsVz/cr+0H3GaXA6CdMcUDICyN6tVFj+QNVlZqJ+6jA0QgRlAAhIXa+iY9tqJIVXUNgWP/dkU/TbzAZWJVADoKIygAwsJ9yz7Se59V6MCRo/rdd8eYXQ6ADsYICoCwcP81A9Wna6L+9fK+ZpcCIAgYQQEQkipr67X3UJ3GZqVIki7IdOq9eVcoxsa/q4BowE86gJCz91Ct8n79D/3rC1t04MjRwHHCCRA9GEEBEHJ6pSQqMzlBR+ubuMkfEKUIKABCQkWNV906x8tisSjWZtXvbhsthz1WCXE2s0sDYALGSwGY7q+flGrCr9bp5YKSwLF0h51wAkQxAgoA05W6j6mmvknvbC+VYRhmlwMgBDDFA8AU37zJ312XZsmZEKsbR3bnPjoAJDGCAiDIDMPQH/O/1O3Pb5HP3zxaYrVa9C9jenKVDoAAfhsACKoyj1e/eHen1n9+SCs+Pmh2OQBCFFM8AIIqw5mg/5w2TIdrG3TDhZlmlwMgRBFQAHSoJp9fv127V9cOc6l/WpIk6YYLu5tcFYBQxxQPgA71y7/v0hOrPtfclz9So89vdjkAwgQBBUCHmnVplnp3TdTsK/splkWwAFqJKR4A7crb6FNBcZXGD+wmSUpz2LWam/wBaCN+YwBoN+5jjZr6zAe6c+kWFe47EjhOOAHQVvzWANBuHPYYDUhPUpfEWNU3cZM/AOeOKR4A58V9rFH2WKviY2yyWCz62Y1D5W30KS3JbnZpAMIYIygAztnWkiO69tf/0OMrdwWOOeyxhBMA542AAuCcVdU26KvqY3rvs3LV1TeZXQ6ACMIUD4A2+eZN/nKz0/XEt0fomux0dYrn1wmA9sMICoBWW7OzXNOWbFSNtzFwbNqoHkqyx5pYFYBIREAB0Cr1TT79+M1P9VFJtX63/guzywEQ4RiTBdAq8TE2/XrGhXpne5nmXt3f7HIARDgCCoBTMgxDf976ldId8bp8QPOusGP6pGhMnxSTKwMQDZjiAXBKfyo8oAde/1j3v/qxquoazC4HQJQhoAA4pSkjMpWd4dAdl/SWM4FFsACCiykeAJIkv9/Qut2HdNWgNEmSPdamt+Zeyh2IAZiC3zwA5PcbmvXCFt35/Ba9te2rwHHCCQCz8NsHgKxWi4b1SFZ8jFUNTX6zywEApniAaNXo8+tYo0+OrzdZ+/er++vGkd2VldrJ5MoAgBEUICrtrzqqm57N1/3LtskwDElSjM1KOAEQMhhBAaJQbX2TPiv1yB5j1b7Ko+pDMAEQYggoQJT45k3+hmQ49NSMkRrWw6nuyQkmVwYAJ2OKB4gCnx50a9qSjdpfdTRwLG+oi3ACIGQRUIAo8NO3i/RRSbX+853PzC4FAFqFgAJEgV/eNEJTL8zUz24cZnYpANAqBBQgAuXvrdQbWw8EnvdMSdR/zxiplE5xJlYFAK3HIlkgwhTuO6LvPLdJsTarLsh0apAryeySAKDN2jyCsn79ek2ZMkWZmZmyWCx68803W5w3DEOPPvqoMjIylJCQoNzcXO3evbtFm6qqKs2cOVMOh0PJycmaNWuWamtrz+uFAGg2qleyrhzYTVMvzFTPFBbBAghPbQ4odXV1GjFihJ555plTnn/88cf11FNP6dlnn9XmzZvVqVMnTZo0SV6vN9Bm5syZ+vTTT7Vq1Sq9/fbbWr9+ve65555zfxVAlPtgz2H5/M0brlksFv3PbWP0+E0jlBjHICmA8GQxjm8jeS5fbLFo+fLlmjp1qqTm0ZPMzEzNnz9fDzzwgCTJ7XYrPT1dS5cu1YwZM/TZZ58pOztbW7Zs0ZgxYyRJK1eu1LXXXqsDBw4oMzPzrH+vx+OR0+mU2+2Ww+E41/KBiPCf73ym363/QvflDtB9uQPNLgcATqstn9/tuki2uLhYZWVlys3NDRxzOp0aN26c8vPzJUn5+flKTk4OhBNJys3NldVq1ebNm0/5fevr6+XxeFo8ADTLzmj+IW/0cZM/AJGjXcd/y8rKJEnp6ektjqenpwfOlZWVKS0trWURMTFKSUkJtDnR4sWLtWjRovYsFQhbhmHIfaxRyYnNV+RMHdldQzIcLIYFEFHC4jLjBQsWyO12Bx779+83uyTAFO6jjfreS1s143eb5G30BY4TTgBEmnYNKC6XS5JUXl7e4nh5eXngnMvlUkVFRYvzTU1NqqqqCrQ5UXx8vBwOR4sHEI3qfT5t+bJKew/VqnDfEbPLAYAO064BJSsrSy6XS6tXrw4c83g82rx5s3JyciRJOTk5qq6uVmFhYaDNmjVr5Pf7NW7cuPYsB4g4aUl2PXXLSP159iW6tH+q2eUAQIdp8xqU2tpa7dmzJ/C8uLhY27ZtU0pKinr16qX77rtP//Ef/6EBAwYoKytLP/7xj5WZmRm40mfIkCHKy8vT3XffrWeffVaNjY2aO3euZsyY0aoreIBoUub26oHXP9b91wzQ6N4pkqRL+hFMAES+NgeUDz/8UFdddVXg+bx58yRJt99+u5YuXaqHHnpIdXV1uueee1RdXa3LLrtMK1eulN1uD3zNSy+9pLlz52rChAmyWq2aPn26nnrqqXZ4OUBkeWrNbm3Yc1gVNV6t/MF4Wa0Ws0sCgKA4r31QzMI+KIgWNd5GPfSnT/RQ3mBlpXYyuxwAOC+m7YMC4PzsqajV7zcUB54n2WO15NbRhBMAUYd9sIEQUeHx6lu/2aCjDT5lpSbq6sHpZ/8iAIhQBBQgRKQ57Lr5op76vLxGQzOdZpcDAKYioAAm+nh/tbK6dZLDHitJWjB5iGxWi2wshgUQ5ViDAphkWUGJpi/ZqB8t36Hja9XjYqyEEwAQAQUwzYD0JBmSfIahRl/YXUwHAB2KKR6gg/j8hgqKq1RR41Vakl1js1JUW98kZ0LzdM7o3l20Yu5lGpKRJIuFURMA+CYCCtABVu4o1aIVRSp1ewPHOsXZZLVatHr+FUpLat64MDuTfXwA4FSY4gHa2codpZr94tYW4USS6hp8qvE26clVn5tUGQCEDwIK0I58fkOLVhTpTCtK1u46JJ+fNScAcCYEFKAdFRRXnTRycqJSt1cFxVVBqggAwhMBBWhHFTVnDidtbQcA0YqAArSj44tf26sdAEQrAgrQTvZU1OiiPl2U4bTrdBcNWyRlOJsvOQYAnB4BBWgHr23Zr8m//oee21CshVOyJemkkHL8+cIp2ewWCwBnQUAB2oG3yadGn6FPD3o06QKXltw6Si5ny2kcl9OuJbeOUt7QDJOqBIDwYTGO3wQkjHg8HjmdTrndbjkcbHSF0LBmZ7muGpQW2BX2VDvJMnICIJq15fObnWSBc1BSeVS/XbtHj90wVHExzQORVw9Ob9HGZrUop19XM8oDgLBHQAHaqNHn162/36ySqqNyJMTqh9cOMbskAIg4rEEB2ijWZtVjN1ygkb2SNeuyLLPLAYCIxAgK0ApNPr8q6xqU7mhe+HrloDSNH9BNVtaUAECHYAQFOAuPt1F3vfChbv6ffFUfbQgcJ5wAQMchoABn0dDk196KWpV5vCo66DG7HACICkzxAGeR2jlev79jjBqbDA3r4TS7HACICgQU4BRe3lyiPl0TdUn/VEnSYBf77QBAMDHFA5zgzY++0g+Xb9fsl7aqzM1dhwHADIygACfIG+rSqPxkXT04TemOeLPLAYCoREABJB2pa1CXTnGSJHusTa/+W45ibQwwAoBZ+A2MqLdxz2Fd+au1enVLSeAY4QQAzMVvYUS9LV8ekftYo/5c+JX8/rC7dyYARCSmeBD1/n1Cf6V0itW/jOnJ5msAECIYQUHE8/kN5e+t1FvbvlL+3kpV1Tbo6dW7A6MlFotFt+X0kT3WZnKlAIDjGEFBRFu5o1SLVhSp9BuXC8dYLWryG6pv8uuBSYNMrA4AcDoEFESslTtKNfvFrTpxVUnT1yMnjgTe/gAQqpjiQUTy+Q0tWlF0Ujg5ziLp+Q++lI9FsQAQkggoiEgFxVUtpnVOZEgqdXtVUFwVvKIAAK1GQEFEqqhp3Rb1rW0HAAguAgoiUlqSvV3bAQCCi4CCiPPFoVol2WOU4bTrdLuaWCRlOO0am5USzNIAAK1EQEFE2fGVW9OWbNSsF7bo+1f3l6STQsrx5wunZMvGxmwAEJIIKIgoPVMSlZYUL5fDrmuyXVpy6yi5nC2ncVxOu5bcOkp5QzNMqhIAcDYWwzDC7jpLj8cjp9Mpt9sth8NhdjkIMeUer5LsMUqMa97nxOc3VFBcpYoar9KSmqd1GDkBgOBry+c3O1UhrDX5/Prp20W6tH+qJl7gkiSlO1qOmNisFuX062pGeQCAc8QUD8LaK1v264X8fbr/1W2qrK03uxwAQDthBAVh7ZaLemrjnsP61ohMde0cb3Y5AIB2QkBB2KnweNUtKV4Wi0UxNquW3Dra7JIAAO2MKR6ElU1fVCr3iXX63fovzC4FANCBCCgIK0UHPfJ4m/TeZ+Vq8vnNLgcA0EGY4kFYueuyLDkTYnXd8AzF2MjXABCp+A2PkNbk8+sPG4rV0PTP0ZLpo3vIHmszsSoAQEdjBAUh7QfLtumv20u1q6xGv7hpuNnlAACChBEUhLSbRvdQUnyMrslON7sUAEAQMYKCkGMYhiyW5q3orxqcpn88fJWSE+NMrgoAEEyMoCCkfLDnsKb+dqOqjzYEjhFOACD6EFAQMhp9fv1w+XZ9vL9av1mzx+xyAAAmIqAgZMTarPrdbWN0y9ieejBvkNnlAABMRECBqRqa/NpdXhN4PsiVpMXThis+hsuIASCasUgWQeHzGyoorlJFjVdpSXaNzUrR0YYmzX5xq3YcdOvPsy9Rv26dzS4TABAiCCjocCt3lGrRiiKVur2BYxlOux6ZPFi19U1qaPKrtNpLQAEABBBQ0KFW7ijV7Be3yjjheJnbq/uWbdMvbhqu7AyHhnZ3mlIfACA0sQYFHcbnN7RoRdFJ4URS4NiTqz7XkAxHMMsCAIQBAgo6TEFxVYtpnRMZkkrdXhUUVwWvKABAWCCgoMNU1Jw+nJxLOwBA9CCgoMOkJdnbtR0AIHoQUNBhRvZKVkLs6d9iFjVfzTM2KyV4RQEAwgIBBR0m/4tKHWv0n/Kc5ev/LpySLZvVcso2AIDoxWXG6DBXDUrTD68dLPexRr2x9asWC2ZdTrsWTslW3tAMEysEAIQqi2EYp7oK9Jz95Cc/0aJFi1ocGzRokHbu3ClJ8nq9mj9/vpYtW6b6+npNmjRJv/3tb5Went7qv8Pj8cjpdMrtdsvh4BLVUFLh8cqRECt7bMut6k+1kywjJwAQXdry+d0hIygXXHCB3nvvvX/+JTH//Gvuv/9+/fWvf9Xrr78up9OpuXPnatq0afrggw86ohQE0ReHanXb7wuUnenQkpmjFGP75wyizWpRTr+uJlYHAAgnHRJQYmJi5HK5Tjrudrv1+9//Xi+//LKuvvpqSdLzzz+vIUOGaNOmTbr44os7ohwEyeHaBh2qrdeeilpVHW3g6hwAwDnrkEWyu3fvVmZmpvr27auZM2eqpKREklRYWKjGxkbl5uYG2g4ePFi9evVSfn7+ab9ffX29PB5PiwdCz9isFP3h9ov0+r05hBMAwHlp94Aybtw4LV26VCtXrtSSJUtUXFysyy+/XDU1NSorK1NcXJySk5NbfE16errKyspO+z0XL14sp9MZePTs2bO9y8Y5eq+oXBWefy5+vWxAqlI7x5tYEQAgErT7FM/kyZMDfx4+fLjGjRun3r1767XXXlNCQsI5fc8FCxZo3rx5gecej4eQEgLe2vaV7nt1mwalJ+n1e3OUZI81uyQAQITo8H1QkpOTNXDgQO3Zs0cul0sNDQ2qrq5u0aa8vPyUa1aOi4+Pl8PhaPGA+Ub27KLUzvEa1buLEuO4Yh0A0H46PKDU1tZq7969ysjI0OjRoxUbG6vVq1cHzu/atUslJSXKycnp6FLQznp1TdTb379MP5s6lEuGAQDtqt0DygMPPKB169bpyy+/1MaNG3XjjTfKZrPplltukdPp1KxZszRv3jy9//77Kiws1J133qmcnByu4AkDDU1+LXjjE+34yh04lu6wy2IhnAAA2le7j8sfOHBAt9xyiyorK9WtWzdddtll2rRpk7p16yZJevLJJ2W1WjV9+vQWG7Uh9D21erdeKdiv93ce0toHrzxpMzYAANpLu+8kGwzsJGuOGm+j7lq6RXOu6q8rB6WZXQ4AIMyYvpMsIoe30RcYKUmyx+q1f8thSgcA0OG4mzFOa09FrXKfWKd3tpcGjhFOAADBQEDBab3+4X4dOHJMT6/ZI58/7GYCAQBhjCkenNZDeYMVF2PVnZdmcRkxACCoGEFBC9sPuHV83bTNatH8iYOU0inO5KoAANGGgIKAP+Z/qW89s0FPrd5jdikAgChHQEGAYTQ/DtfWKwyvPgcARBDWoEQZn99QQXGVKmq8Skuya2xWSmB9ye2X9NGA9M7K6duVq3UAAKYioESRlTtKtWhFkUrd3sCxpPgY/ee0oZoyorsk6ZJ+qWaVBwBAAAElSqzcUarZL27ViRM3NfVN+v4r2xRrsypvaIYptQEAcCLWoEQBn9/QohVFJ4WTb1q0ooi9TgAAIYOAEgUKiqtaTOucSqnbq4LiqiBVBADAmRFQokBFzZnDSVvbAQDQ0QgoUSAtyd6u7QAA6GgElCgwNitFGc7Thw+LpAxn8yXHAACEAgJKhGvy+WWzWrRwSrYsag4j33T8+cIp2dxvBwAQMggoEeyjkiOa8MQ6fVbqUd7QDC25dZRcJ4ykuJx2Lbl1FJcYAwBCCvugRLAnVn2ufZVH9d/vfa7/uW2M8oZm6Jps12l3kgUAIFQQUCLYb74zSk/8fZceyhscOGazWpTTr6uJVQEAcHZM8USYQzX1gT87E2K16Iah6hRPDgUAhBcCSgT56yeluvzxNVq5o8zsUgAAOC8ElAiydleFvI1+rSoqN7sUAADOC2P/EWTxtGEa2auLbr6op9mlAABwXhhBCXOF+44E/hxjs+o743pxVQ4AIOwRUMLYkrV7NX3JRv1mzW6zSwEAoF0RUMKY7ev/ew0+w9xCAABoZ6xBCWP3jO+nUb26aEwf7qEDAIgsjKCEEb/f0LKCEjX6/IFjhBMAQCQioISRhX/5VI+8sV3zX/tYhsG0DgAgchFQwsjVg9Nkj7XqqsHdZLFwpQ4AIHKxBiWMXDU4TesfukppSfazNwYAIIwxghLCvI0+/eQvn+pIXUPgGOEEABANCCgh7OE/f6KlG7/Uv71YyJoTAEBUIaCEsLlX9VevlEQ9MHEQa04AAFGFNSghbEB6klbPv0KxNnIkACC68MkXQg7X1mvmc5u0u7wmcIxwAgCIRnz6mcTnN5S/t1JvbftK+Xsr5fMb+unbRfpgT6Xuf20ba04AAFGNKR4TrNxRqkUrilTq9gaOZTjtmn/NQNV4m/Tj67NZcwIAiGqMoATZyh2lmv3i1hbhRJLK3F49+KdP9O0xPZSV2smk6gAACA0ElCDy+Q0tWlGkU03eHD+2aEWRfH6mdwAA0Y2AEkQFxVUnjZx8kyGp1O1VQXFV8IoCACAEEVCCqKLm9OHkXNoBABCpCChB1Npt6tnOHgAQ7QgoQZRkj9GZLs6xqPlqnrFZKUGrCQCAUERACaKNew/r+PYmJ+aU488XTsmWzcolxgCA6MY+KEF0z/h+cthjFRtj1a/+tqvFglmX066FU7KVNzTDxAoBAAgNBJQOVlJ5VN27JARGRWaM7SVJmnphdxUUV6mixqu0pOZpHUZOAABoRkDpQEUHPZr53CZdMbCb/uvbF7YIIDarRTn9uppYHQAAoYs1KB3owJGjqvE2qbjyqI41+swuBwCAsMEISgeaeIFLz995kYb3SFbneLoaAIDWYgSlnX1eXiOPtzHw/PIB3eRMiDWxIgAAwg//rD8PPr/RYqFrp3ibvvuHAvXu2kn/N2usHHaCCQAA54KAco5W7ijVohVFLS4VTu0cp4Ym/0l7nAAAgLYhoJyDlTtKNfvFrSfdlbiytkGGpO/m9Gb0BACA88AalDby+Q0tWlF0UjiRmu9GbJH0y7/tks9/qhYAAKA1CChtVFBc1WJa50SGpFK3VwXFVcErCgCACENAaaOKmtOHk3NpBwAATkZAaaO0JHu7tgMAACcjoLRR185xSukUd9ordSySMpzN99YBAADnhoDSBgeOHNVtv98sz7HGwILYbzr+fOGUbG78BwDAeSCgtEFq53gNzXSqb7dO+uVNw+VytpzGcTntWnLrKOUNzTCpQgAAIoPFMIywux7W4/HI6XTK7XbL4XAE9e9uaPKrtr5JKZ3iTtpJdmxWCiMnAACcRls+v9mo7SzK3F5t3HtY00b1kCTFxViVEhMnSbJZLcrp19XM8gAAiEgElG84cURkcEaSvvO/m/TF4To1+Qx9+6KeZpcIAEBUIKB87VT31nE57RrRw6n6Jr8u6c9ICQAAwUJA0envrVPu9urvbq9+9S/D1aNLoim1AQAQjaL+Kp6z3VtHkn7198+5tw4AAEFkakB55pln1KdPH9ntdo0bN04FBQVBr4F76wAAEHpMCyivvvqq5s2bp4ULF2rr1q0aMWKEJk2apIqKiqDWwb11AAAIPaYFlCeeeEJ333237rzzTmVnZ+vZZ59VYmKi/vCHPwS1Du6tAwBA6DEloDQ0NKiwsFC5ubn/LMRqVW5urvLz84Nay9isFGU47dxbBwCAEGJKQDl8+LB8Pp/S09NbHE9PT1dZWdlJ7evr6+XxeFo82ovNatHCKdmSuLcOAAChIiyu4lm8eLGcTmfg0bNn+26Yljc0Q0tuHcW9dQAACBGm7IOSmpoqm82m8vLyFsfLy8vlcrlOar9gwQLNmzcv8Nzj8XRISLkm28W9dQAACAGmBJS4uDiNHj1aq1ev1tSpUyVJfr9fq1ev1ty5c09qHx8fr/j4+A6vi3vrAAAQGkzbSXbevHm6/fbbNWbMGI0dO1b//d//rbq6Ot15551mlQQAAEKEaQHl5ptv1qFDh/Too4+qrKxMF154oVauXHnSwlkAABB9LIZhhN0e7h6PR06nU263Ww6Hw+xyAABAK7Tl8zssruIBAADRhYACAABCDgEFAACEHAIKAAAIOQQUAAAQcggoAAAg5Ji2D8r5OH5ldHveNBAAAHSs45/brdnhJCwDSk1NjSS1+/14AABAx6upqZHT6Txjm7DcqM3v9+vgwYNKSkqSxXL+N/M7fvPB/fv3s/HbWdBXbUN/tQ391Xr0VdvQX23TUf1lGIZqamqUmZkpq/XMq0zCcgTFarWqR48e7f59HQ4Hb9xWoq/ahv5qG/qr9eirtqG/2qYj+utsIyfHsUgWAACEHAIKAAAIOQQUSfHx8Vq4cKHi4+PNLiXk0VdtQ3+1Df3VevRV29BfbRMK/RWWi2QBAEBkYwQFAACEHAIKAAAIOQQUAAAQcggoAAAg5ER9QHnmmWfUp08f2e12jRs3TgUFBWaXFBJ+8pOfyGKxtHgMHjw4cN7r9WrOnDnq2rWrOnfurOnTp6u8vNzEioNn/fr1mjJlijIzM2WxWPTmm2+2OG8Yhh599FFlZGQoISFBubm52r17d4s2VVVVmjlzphwOh5KTkzVr1izV1tYG8VUEz9n664477jjpvZaXl9eiTbT01+LFi3XRRRcpKSlJaWlpmjp1qnbt2tWiTWt+9kpKSnTdddcpMTFRaWlpevDBB9XU1BTMlxIUremvK6+88qT317333tuiTTT015IlSzR8+PDAxms5OTl69913A+dD8X0V1QHl1Vdf1bx587Rw4UJt3bpVI0aM0KRJk1RRUWF2aSHhggsuUGlpaeCxYcOGwLn7779fK1as0Ouvv65169bp4MGDmjZtmonVBk9dXZ1GjBihZ5555pTnH3/8cT311FN69tlntXnzZnXq1EmTJk2S1+sNtJk5c6Y+/fRTrVq1Sm+//bbWr1+ve+65J1gvIajO1l+SlJeX1+K99sorr7Q4Hy39tW7dOs2ZM0ebNm3SqlWr1NjYqIkTJ6quri7Q5mw/ez6fT9ddd50aGhq0ceNGvfDCC1q6dKkeffRRM15Sh2pNf0nS3Xff3eL99fjjjwfORUt/9ejRQz//+c9VWFioDz/8UFdffbVuuOEGffrpp5JC9H1lRLGxY8cac+bMCTz3+XxGZmamsXjxYhOrCg0LFy40RowYccpz1dXVRmxsrPH6668Hjn322WeGJCM/Pz9IFYYGScby5csDz/1+v+FyuYxf/vKXgWPV1dVGfHy88corrxiGYRhFRUWGJGPLli2BNu+++65hsViMr776Kmi1m+HE/jIMw7j99tuNG2644bRfE839VVFRYUgy1q1bZxhG63723nnnHcNqtRplZWWBNkuWLDEcDodRX18f3BcQZCf2l2EYxhVXXGH84Ac/OO3XRHN/denSxXjuuedC9n0VtSMoDQ0NKiwsVG5ubuCY1WpVbm6u8vPzTawsdOzevVuZmZnq27evZs6cqZKSEklSYWGhGhsbW/Td4MGD1atXr6jvu+LiYpWVlbXoG6fTqXHjxgX6Jj8/X8nJyRozZkygTW5urqxWqzZv3hz0mkPB2rVrlZaWpkGDBmn27NmqrKwMnIvm/nK73ZKklJQUSa372cvPz9ewYcOUnp4eaDNp0iR5PJ7Av5Yj1Yn9ddxLL72k1NRUDR06VAsWLNDRo0cD56Kxv3w+n5YtW6a6ujrl5OSE7PsqLG8W2B4OHz4sn8/XorMlKT09XTt37jSpqtAxbtw4LV26VIMGDVJpaakWLVqkyy+/XDt27FBZWZni4uKUnJzc4mvS09NVVlZmTsEh4vjrP9X76vi5srIypaWltTgfExOjlJSUqOy/vLw8TZs2TVlZWdq7d69++MMfavLkycrPz5fNZova/vL7/brvvvt06aWXaujQoZLUqp+9srKyU77/jp+LVKfqL0n6zne+o969eyszM1OffPKJHn74Ye3atUtvvPGGpOjqr+3btysnJ0der1edO3fW8uXLlZ2drW3btoXk+ypqAwrObPLkyYE/Dx8+XOPGjVPv3r312muvKSEhwcTKEGlmzJgR+POwYcM0fPhw9evXT2vXrtWECRNMrMxcc+bM0Y4dO1qs/cLpna6/vrlWadiwYcrIyNCECRO0d+9e9evXL9hlmmrQoEHatm2b3G63/vSnP+n222/XunXrzC7rtKJ2iic1NVU2m+2kVcrl5eVyuVwmVRW6kpOTNXDgQO3Zs0cul0sNDQ2qrq5u0Ya+U+D1n+l95XK5TlqI3dTUpKqqqqjvP0nq27evUlNTtWfPHknR2V9z587V22+/rffff189evQIHG/Nz57L5Trl++/4uUh0uv46lXHjxklSi/dXtPRXXFyc+vfvr9GjR2vx4sUaMWKEfv3rX4fs+ypqA0pcXJxGjx6t1atXB475/X6tXr1aOTk5JlYWmmpra7V3715lZGRo9OjRio2NbdF3u3btUklJSdT3XVZWllwuV4u+8Xg82rx5c6BvcnJyVF1drcLCwkCbNWvWyO/3B355RrMDBw6osrJSGRkZkqKrvwzD0Ny5c7V8+XKtWbNGWVlZLc635mcvJydH27dvbxHqVq1aJYfDoezs7OC8kCA5W3+dyrZt2ySpxfsrWvrrRH6/X/X19aH7vuqQpbdhYtmyZUZ8fLyxdOlSo6ioyLjnnnuM5OTkFquUo9X8+fONtWvXGsXFxcYHH3xg5ObmGqmpqUZFRYVhGIZx7733Gr169TLWrFljfPjhh0ZOTo6Rk5NjctXBUVNTY3z00UfGRx99ZEgynnjiCeOjjz4y9u3bZxiGYfz85z83kpOTjbfeesv45JNPjBtuuMHIysoyjh07FvgeeXl5xsiRI43NmzcbGzZsMAYMGGDccsstZr2kDnWm/qqpqTEeeOABIz8/3yguLjbee+89Y9SoUcaAAQMMr9cb+B7R0l+zZ882nE6nsXbtWqO0tDTwOHr0aKDN2X72mpqajKFDhxoTJ040tm3bZqxcudLo1q2bsWDBAjNeUoc6W3/t2bPHeOyxx4wPP/zQKC4uNt566y2jb9++xvjx4wPfI1r665FHHjHWrVtnFBcXG5988onxyCOPGBaLxfj73/9uGEZovq+iOqAYhmE8/fTTRq9evYy4uDhj7NixxqZNm8wuKSTcfPPNRkZGhhEXF2d0797duPnmm409e/YEzh87dsz43ve+Z3Tp0sVITEw0brzxRqO0tNTEioPn/fffNySd9Lj99tsNw2i+1PjHP/6xkZ6ebsTHxxsTJkwwdu3a1eJ7VFZWGrfccovRuXNnw+FwGHfeeadRU1NjwqvpeGfqr6NHjxoTJ040unXrZsTGxhq9e/c27r777pP+kRAt/XWqfpJkPP/884E2rfnZ+/LLL43JkycbCQkJRmpqqjF//nyjsbExyK+m452tv0pKSozx48cbKSkpRnx8vNG/f3/jwQcfNNxud4vvEw39dddddxm9e/c24uLijG7duhkTJkwIhBPDCM33lcUwDKNjxmYAAADOTdSuQQEAAKGLgAIAAEIOAQUAAIQcAgoAAAg5BBQAABByCCgAACDkEFAAAEDIIaAAAICQQ0ABAAAhh4ACAABCDgEFAACEHAIKAAAIOf8fqK0/eHtIs1MAAAAASUVORK5CYII=", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(mpi_cores, amdahl_speedup_per_cores, linestyle=':', marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d845915-5cb5-4a66-acba-ec1fd2d960f6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ef90cc8e-6201-4c2f-a331-29a8ea210f35", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 720x240 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# figure properties\n", + "plt.figure(figsize=(9, 3), dpi=80, facecolor='w', edgecolor='k')\n", + "\n", + "# data plotting\n", + "plt.plot(mpi_cores, mpi_times, linestyle=':', marker='^', label='MPI', color='green')\n", + "plt.plot(local_cores, local_times, linestyle=':', marker='v', label='locally spawned processes')\n", + "\n", + "plt.xticks([1,10,20,40,60,80,100, 200, 280, 300])\n", + "\n", + "plt.xlabel('Cores')\n", + "plt.ylabel('Epoch Time (S)')\n", + "\n", + "# showing figure\n", + "plt.legend()\n", + "plt.grid()\n", + "plt.savefig('Epoch_runtime.png', dpi=300, bbox_inches='tight')\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "019390a6-5574-4c6d-b533-0d564c7d071f", + "metadata": {}, + "source": [ + "### inlet plotting" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b7683422-e720-48de-aeb4-19ef638f26b0", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 360x120 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# figure properties\n", + "plt.figure(figsize=(4.5, 1.5), dpi=80, facecolor='w', edgecolor='k')\n", + "\n", + "# data plotting\n", + "plt.plot(mpi_cores, mpi_times, linestyle=':', marker='^', color='green')\n", + "#plt.plot(local_cores, local_times, linestyle=(0, (1, 10)), marker='v')\n", + "\n", + "plt.xticks([2,10,20,40,60,80,100, 200, 280, 300])\n", + "\n", + "#plt.xlabel('Cores')\n", + "#plt.ylabel('Time (S)')\n", + "plt.xlim((33,303))\n", + "plt.ylim((0, 0.2))\n", + "# showing figure\n", + "plt.grid()\n", + "plt.savefig('Epoch_runtime_inlet.png', dpi=300, bbox_inches='tight')\n", + "plt.show()\n", + "\n", + "\n", + "\n", + "#plt.savefig('filename.png', dpi=300)" + ] + }, + { + "cell_type": "markdown", + "id": "d262d755-4ad1-4e57-879a-089d517d6c73", + "metadata": {}, + "source": [ + "### speedup calculation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dccea070-8e4f-4b9e-84dc-b74008ebcf89", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "745c2eee-5e7f-4412-abf7-9aa8438af185", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# calculate speedup with 1 process as reference point\n", + "mpi_speedup = mpi_times[0]/np.array(mpi_times)\n", + "local_speedup = local_times[0]/np.array(local_times)\n", + "mpi_to_local_speedup = local_times[0]/np.array(mpi_times)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "60caa1bb-6fff-485b-b666-a7d42cf92716", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 720x240 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# figure properties\n", + "plt.figure(figsize=(9, 3), dpi=80, facecolor='w', edgecolor='k')\n", + "\n", + "# data plotting\n", + "# speedup compared to 2 mpi processes\n", + "#plt.plot(mpi_cores, mpi_speedup, linestyle=':', marker='^')\n", + "# speedup compared to one local core\n", + "plt.plot(mpi_cores, mpi_to_local_speedup, linestyle=':', marker='^', label='real world (MPI)', color='green')\n", + "# linear speedup\n", + "plt.plot(range(130), linestyle='--', label='linear', color='grey')\n", + "# Amdahl's law\n", + "plt.plot(mpi_cores, amdahl_speedup_per_cores, linestyle=':', marker='o', label=\"Amdahl's law\", color='orange')\n", + "\n", + "\n", + "plt.xticks([1,10,20,40,60,80,100, 200, 280, 300])\n", + "\n", + "plt.xlabel('Cores')\n", + "plt.ylabel('Speedup X')\n", + "\n", + "# showing figure\n", + "plt.legend()\n", + "plt.grid()\n", + "plt.savefig('Epoch_Amdahls_speedup.png', dpi=300, bbox_inches='tight')\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "84ecfa3d-b23f-4a8b-b059-7a67c61366e2", + "metadata": {}, + "source": [ + "### table" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "fba800c6-4d6e-467e-8da9-c46d79a326da", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "128 & $2$ & $5.226$ & $2.00$ & $0.94$ \\\n", + "128 & $10$ & $0.570$ & $9.88$ & $8.61$ \\\n", + "128 & $20$ & $0.276$ & $19.52$ & $17.76$ \\\n", + "128 & $40$ & $0.143$ & $38.08$ & $34.19$ \\\n", + "128 & $60$ & $0.097$ & $55.74$ & $50.53$ \\\n", + "128 & $80$ & $0.082$ & $72.58$ & $60.13$ \\\n", + "128 & $100$ & $0.064$ & $88.64$ & $76.68$ \\\n", + "128 & $200$ & $0.043$ & $159.03$ & $114.96$ \\\n", + "128 & $280$ & $0.039$ & $205.71$ & $125.95$ \\\n", + "128 & $300$ & $0.040$ & $216.29$ & $123.04$ \\\n" + ] + } + ], + "source": [ + "# table strong scaling\n", + "for c, et, t, r in zip(mpi_cores, mpi_times, amdahl_speedup_per_cores, mpi_to_local_speedup):\n", + " print(f'128 & ${c}$ & ${et:.3f}$ & ${t:.2f}$ & ${r:.2f}$ \\\\')\n" + ] + }, + { + "cell_type": "markdown", + "id": "73639c5d-16f8-40f3-9f0e-eeab875338d1", + "metadata": { + "tags": [] + }, + "source": [ + "# Weak scaling\n", + "\n", + "scaled speedup = s + p × N\n", + "\n", + "s = serial part execution fraction\n", + "\n", + "p = parallel part executio fraction\n", + "\n", + "1 = s + p\n", + "\n", + "N = number of processors used" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "dcec9f22-30a6-454e-bb5a-0dd4f08fc399", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "s = 0.00635\n", + "p = 4.89924\n", + "T = s + p\n", + "# frac\n", + "s_f = s/T\n", + "p_f = p/T\n", + "\n", + "gustavson_speedup_per_cores = []\n", + "\n", + "for N in mpi_cores:\n", + " gustavson_speedup_per_cores.append(s_f+p_f*N)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3155dce3-6594-4ef7-9634-3a2ac1eae8e7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(mpi_cores, gustavson_speedup_per_cores, linestyle=':', marker='o')\n", + "#plt.xticks(mpi_cores)\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "40930116-35f8-4388-afde-8e688f9be043", + "metadata": {}, + "source": [ + "### real world data" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "a10d36f9-072b-4edb-9de5-c0c32e8702c3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "mpi_cores_gustav = [2,10,20,40,60,80,100,200,280,300]\n", + "mpi_times_gustav = [\n", + " 5.225689952159641,\n", + " 2.508382789550289,\n", + " 2.614600996817312,\n", + " 2.949139879595849,\n", + " 3.3782926528684554,\n", + " 4.276260360594718,\n", + " 4.687892344690138,\n", + " 11.918889322588521,\n", + " 21.86820093277962,\n", + " 26.4730200382971\n", + "]\n", + "# 3.940 ÷ (4.378÷24)\n", + "\n", + "mpi_times_gustav_speedup = local_times[0]/(np.array(mpi_times_gustav)/np.array(mpi_cores_gustav))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "14fbc7ac-329a-41b1-ae00-e2026b0c7c32", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4.905603394649996" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "local_times[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "dee4099e-1370-463a-a9b1-77ff980e98ea", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.87749501, 19.55683724, 37.52468083, 66.53605587,\n", + " 87.12572708, 91.77370845, 104.64411369, 82.31645184,\n", + " 62.8112461 , 55.59173137])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mpi_times_gustav_speedup" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "2b255fa7-49e3-4b06-9d38-ecc88f1850d4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 720x240 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# figure properties\n", + "plt.figure(figsize=(9, 3), dpi=80, facecolor='w', edgecolor='k')\n", + "\n", + "# data plotting\n", + "# speedup compared to one local core\n", + "plt.plot(mpi_cores_gustav, mpi_times_gustav_speedup, linestyle=':', marker='^', label='real world (MPI)', color='green')\n", + "# linear speedup\n", + "plt.plot(range(130), linestyle='--', label='linear', color='grey')\n", + "# Gustav's law\n", + "plt.plot(mpi_cores_gustav, gustavson_speedup_per_cores, linestyle=':', marker='o', label=\"Gustafson's law\", color='orange')\n", + "\n", + "\n", + "plt.xticks([1,10,20,40,60,80,100, 200, 280, 300])\n", + "\n", + "plt.xlabel('Cores')\n", + "plt.ylabel('Speedup X')\n", + "\n", + "# showing figure\n", + "plt.legend()\n", + "plt.grid()\n", + "plt.savefig('Epoch_Gustavsons_speedup.png', dpi=300, bbox_inches='tight')\n", + "plt.show()\n", + "\n", + "#plt.savefig('filename.png', dpi=300)" + ] + }, + { + "cell_type": "markdown", + "id": "70c8a5d9-e17e-4290-9b56-74fd366b8cee", + "metadata": {}, + "source": [ + "### table" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "a14f6243-5b18-4ad4-aed9-93736f7fb17c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "128 & $2$ & $5.226$ & $2.00$ & $1.88$ \\\n", + "640 & $10$ & $2.508$ & $9.99$ & $19.56$ \\\n", + "1280 & $20$ & $2.615$ & $19.98$ & $37.52$ \\\n", + "2560 & $40$ & $2.949$ & $39.95$ & $66.54$ \\\n", + "3840 & $60$ & $3.378$ & $59.92$ & $87.13$ \\\n", + "5120 & $80$ & $4.276$ & $79.90$ & $91.77$ \\\n", + "6400 & $100$ & $4.688$ & $99.87$ & $104.64$ \\\n", + "12800 & $200$ & $11.919$ & $199.74$ & $82.32$ \\\n", + "17920 & $280$ & $21.868$ & $279.64$ & $62.81$ \\\n", + "19200 & $300$ & $26.473$ & $299.61$ & $55.59$ \\\n" + ] + } + ], + "source": [ + "# table strong scaling\n", + "for c, et, t, r in zip(mpi_cores_gustav, mpi_times_gustav, gustavson_speedup_per_cores, mpi_times_gustav_speedup):\n", + " print(f'{64*c} & ${c}$ & ${et:.3f}$ & ${t:.2f}$ & ${r:.2f}$ \\\\')" + ] + }, + { + "cell_type": "markdown", + "id": "a97ca92f-51c6-4aa2-abaa-9ab2e28781eb", + "metadata": {}, + "source": [ + "# Into todo\n", + "- take not only always the n best performing individuals but with a propability of P take one or two of the fittest n elit individuals\n", + "- in the MPI implemetation implement a check that ensures that the main process does not wait indevinitely if a result is not retrieved from the worker. This could be done by adding a time stamp to each gene in process and if it is not finished after a time defined in the global configuration file then the gene is send to another worker for processing. Additionally it should be checked if the worker is okay and fully functioning. And maybe there is also a message printed because it could be that this particular gene results in a infinite loop during fitness evaluation and as such can not be evaluated, the experiment has a bug..." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "197f7834-e23e-4a1e-b5fa-4e665ba5ec0a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "l\n" + ] + } + ], + "source": [ + "if (True and\n", + " True):\n", + " print('l')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97d62d2c-ef23-405a-afae-ce26b528f92f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv_evolution", + "language": "python", + "name": "venv_evolution" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/testing/testing_notebook.ipynb b/src/testing/testing_notebook.ipynb index e307495cb7ef2178100c3ab1a5cc34f6535deea7..55f86be606c9970c4c15176ed0deb2ffa56251ff 100755 --- a/src/testing/testing_notebook.ipynb +++ b/src/testing/testing_notebook.ipynb @@ -884,6 +884,30 @@ " OUT = 9" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "3195a45b-0670-4229-aafa-9e33d712baff", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f2c3580-02a3-4ef5-a200-8f88803477bf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18de20c2-8910-4a2c-8575-90d6eef3e66a", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -3486,6 +3510,88 @@ "metadata": {}, "outputs": [], "source": [] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ba23d20a-d282-4ac4-a365-a967d6a75fc2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "577f7722-ebe5-4f1d-9ffe-aec85d5678ff", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "a = np.array([1,2])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6176bc96-a87c-488a-a9bd-25b66b4985a8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b = np.copy(a)\n", + "b[0]=3\n", + "a" + ] + }, + { + "cell_type": "markdown", + "id": "e7bcc21e-8eee-4152-abf4-c30f19ac43d0", + "metadata": {}, + "source": [ + "# speed up graphs for parralelisation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3eac6bc1-7229-4505-b370-984f090bc3a3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# speed tests\n", + "mpi_cores = [2,10,20,40,60,80,100,200,280,300]\n", + "mpi_times = [5.225689952159641, 0.5698658002175366, 0.2761596009580796, 0.14349941399406357, 0.09708592028316865, 0.08158155453957593, 0.06397446999914226, 0.04267250263809762, 0.03894918543159764, 0.039870780171746036]\n", + "\n", + "local_cores = [1,2,10,20,40,60,80]\n", + "local_times = [4.905603394649996, 6.289567973878649, 6.438861921855381, 6.791049808263779, 7.110521283260612, 7.244502800266917, 7.444024534786449]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fd0732e-3147-47bd-851f-3083a8817a94", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -3504,7 +3610,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.5" } }, "nbformat": 4,