From d82cfad111da87d362a8cefee1f8a7d93d69f398 Mon Sep 17 00:00:00 2001
From: Philipp Zander <p.raubfisch@gmx.de>
Date: Tue, 3 Dec 2019 15:14:31 -0300
Subject: [PATCH] pretty

---
 app.py                                    |  16 +++++++++++++
 src/__pycache__/population.cpython-37.pyc | Bin 5938 -> 6484 bytes
 src/__pycache__/world.cpython-37.pyc      | Bin 2121 -> 2149 bytes
 src/control.py                            |   1 +
 src/population.py                         |  26 ++++++++++++++++++++--
 src/world.py                              |  11 ++++-----
 templates/main.html                       |  18 +++++++++++++--
 7 files changed, 63 insertions(+), 9 deletions(-)

diff --git a/app.py b/app.py
index b24051d..952de6e 100644
--- a/app.py
+++ b/app.py
@@ -7,6 +7,7 @@ from src.population import Population
 
 app = Flask(__name__)
 world = None
+population = None
 simulation_frames = {}
 
 cone_number = 30
@@ -22,6 +23,7 @@ topological_checked = "checked"
 @app.route('/', methods=["GET", "POST"])
 def main():
     global world
+    global population
     global iterations
     global population_size
     global mutation_step_size
@@ -30,14 +32,17 @@ def main():
     global situational_checked
     global normative_checked
     global topological_checked
+    global simulation_frames
 
     """Entry point; the view for the main page"""
 
     if 'new_world' in request.form:
         cone_number = int(request.form['cone_number'])
         world = World(cone_number)
+        simulation_frames = {}
 
     if "run_simulation" in request.form:
+        simulation_frames = {}
         no_cultural_k = False
         normative_k = False
         topological_k = False
@@ -81,6 +86,7 @@ def main():
 @app.route('/main.png')
 def main_plot():
     global world
+    print("world: " + str(world))
     """The view for rendering the scatter chart"""
     if not world:
         world = World(3)
@@ -96,5 +102,15 @@ def time_plot(frame_id):
     return base64.b64encode(simulation_frames[int(frame_id)].getvalue())
 
 
+@app.route('/fitness.png')
+def fitness_plot():
+    print("fitness plot :" + str(population))
+    if population:
+        img = population.plot_fitness()
+        return send_file(img, mimetype='image/png', cache_timeout=0)
+    else:
+        return '', 204
+
+
 if __name__ == '__main__':
     app.run()
diff --git a/src/__pycache__/population.cpython-37.pyc b/src/__pycache__/population.cpython-37.pyc
index 7f61b2c8384765b7d859da5788da03b21bb24fb0..54a0d7d7e8f246da6741429b795e76d65e055f1e 100644
GIT binary patch
delta 2157
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
KsZ8b(R|5d3Mbz>D

delta 1634
zcmca&v`LT8iI<m)fq{Wx#{8$TCJGz*cp3R37#J8*8KM|d7^0X`L?>%9I`WI92&D+O
zFh+5why*ieicfB4)Mad&ypeHceF{SjLp(2-<O7rZHOw^(@d7D~H4O2BHOxiFY8Y4;
zvIJ9@%o&(KA}mEW&_q~^UZIJw75zaI0hz#<%`}0rNF)VfJ`>pddX@={MFu58%@AiW
z)i7iUN;A|jWbwue*RW1tEb=K40n72FAmsSsg=^R*FcxK$h=S$#k>vQ}g-e(hu+%VQ
zF{U#v1bITNhGBtt3e!SHMurrIU<OSVzamBk28Nd)B7{j(Vsa33=H&Cto$^u)3=Bo$
zAVLB}NP-A%1_p*(jF~GLij*dovqUm_O}@w?A;HYX2!>2-j4X_N2)vn@HJC95Y=jI*
zw=9T&8>Y!xB+tOW5G7bzkdj!E8efoFl$@GZl9--aqzJNxqbR>LC$*#`^%hG~VsUDb
z5=b|gPzJH&7#J9AHg95^&nTeEz`#(&k(XbTt59yGP^30FkwdE<Y?%<qAm-xI+#+d^
z9=KC(u@)3%=9S!HE-oo5Lb!+x;v#O4eeva~nduoNw^)<&OY=&KbU^w+?uz0p$uCLF
zi3b@9b`6*SIq8-J)F;__`Q?+jIC&WZCrfZfaWOM6FgP<XFceozuHh_?2ZuVNpC;Qa
zw$!rxoU&AKAm3t3OioTMC_%U;iZe4WEvGa!FF93{5$rIuAh^Ysms%d5o|>0hlvt9P
zpO*}>Luzs_m+a;>T$>mfRVT;uR55B#zQrRa1P%=YkRL$drpZ$zKbebHl~HlB0k5kF
z*au(&<c%UjkU5(>dEYQHDo!rrS45Y$WME+E-MpIrC}X`n$V70^2!mKGpx|c7%qy|b
z<SMcSMXo?%E-3ioOY-B3Q*%<2ONtyp!rTQ#`ALaMnK_vyl~L?znI+)h1O;!A0LUP9
zkRsM1u&4t_0PH$20d}Gl0|Uc628PM+1!Ea6P4*S~S<lE&!nS~8AwvvPEmtjf4fg`h
z6i}+?%Hm$g#K=&?y?_VG=Y{aI_-a^cSW~!CxO<sF@>zT}95tLNJV<<|8s-#UBtBaW
zdkP;CpCOAsOP~fs3Z~@nrwF77_OgJTA(X-g%3dXG3xrdIK&%?Z35-RHO4t^NEM#D0
z$kPF3)LNbrwk)w4o)qB}kzSA!c@~JLuz*yTuq}|N;R3O0c!D9BRMf8sRIC+&QhJfv
z<Uo-acUMrbIDrU3P^dE(<fUse-eOD3FUn0U(UdF#ha))JLGneqAeDL`0u*Prm<w`B
zZZRk4q)mP=V$LW&SzT0fa-ygR_bt}soc!WcP2M8;$(5opQs5v56QFRv#Zr)yU$PC9
zJ}f4`7nOA3VB}#GK!Q??T#Q^yY+%d>Vl!6p2jmx&=71BZ9!R&JCTobBn_Cel0|SF5
zqnjqr<h$ak^(r8jfs$qsIFTBIxS(`+i>J6Gu_QA&H?<@qKcxti^ol@{UlapU0d^RI
z06DRUgMop87vw@v-sfOqVC2%_5akf!5a5vF5#*5o%WDeWV#>@fVgi`~%AG}Qpp;u=
ZGPzGeo6%?TE{PNYgsEVb@?<?pH2~-mWsd*=

diff --git a/src/__pycache__/world.cpython-37.pyc b/src/__pycache__/world.cpython-37.pyc
index acac66c4f302c1cd111f5e3cf7ff16c6567b94be..5fc9c75c084a66d45a51b86a3c454e8f6cc34ccd 100644
GIT binary patch
delta 379
zcmX>p@Kk`$iI<m)fq{X+W#O|}caDvG_AK@L7#J8z7#1)tWT<5-VX9$jW~^l{VP3$J
z!dSzQ#hSvjkhzux&SwMjSxcA~u-CBEur6eZVX9@TWiMe~z)`}yfU|_Fgu8|zi>HKn
z0dEc4LPjvnzL2q*xtVbxV+!*^rdo~~<^_B;Y&GmP91EEl8ESMHizbyYEZ|?rzzA}N
zKn>GEMn;A_jS|6ThFZ=Nh6O@3oFI`Bh6MsOOq1WTm`~PZ&2+uRnw*ngoLa=hz`zj2
zUYuB#nwFV<i={X<HCvObNE9T>SCErm5?@vvUzA!>T9g;XS)N~%lM<hnnI6RfVNO26
zY9}iP3J)d@Mh+$cMiA6t=3``G<Y44sVq@f*EXx+jXgj%_ErCs+fq|jOVDeoy6GpMg
vLhL#GjtmS8#VjD*j2w(bW|Mo_O&Jv?A7*!9GXp6#oXpE%&T7WN%E1T#A@y8`

delta 351
zcmaDVa8iKJiI<m)fq{YHQ0LRwzw8_N>{;qJF)%QcFf3qP$iN7qnHDnCGL<mbFf}vQ
zGMBI{U`=7HVaQ@jVOq#s%L3=KgZZo_EDJblSZY`oGQ}{}vemMeuq@y#VOhXc!d=2s
z!;r;W!m@y`hHW7um}Xzd*v#C_xR5c0c_C9RM-B4={u;I#MfMtwh0Kf$HH<|QN*ERh
zfSi#hS0dQVP|I1uut2DWbMj9Xa~9_0oV3aMtXW1yObiSRx7dpl%Tm)a({Hg9r>16W
zautb!MEMGG@=M~&isOq?OG=CKZZU&YFipP4Y9}oN@--6&BL^b~lK>+K>M-*$vM_Qn
zu}!vQi)6H!Jee(l&6t6Kp~z(NPc{=q(aC!3Is6U`3=G9AAiaznj73(HSF)QjDo(!7
V?!smTQffL`lf#_Vl!KLn5dfzyR?GkZ

diff --git a/src/control.py b/src/control.py
index 687d9b0..78e528d 100644
--- a/src/control.py
+++ b/src/control.py
@@ -10,6 +10,7 @@ def main():
         print("iteration: " + str(i))
         population.plot(True)
         population.new_generation()
+    population.plot_fitness(True)
 
 
 if __name__ == '__main__':
diff --git a/src/population.py b/src/population.py
index 571e357..3a6ff30 100644
--- a/src/population.py
+++ b/src/population.py
@@ -24,6 +24,7 @@ class Population:
             self.x[i] = (random() * world.size_x)
             self.y[i] = (random() * world.size_y)
             self.fitness[i] = (world.height(self.x[i], self.y[i]))
+        self.population_fitness = []
 
         # cultural components
         self.situational = None
@@ -111,6 +112,7 @@ class Population:
             self.normative.influence(self)
         if self.topological:
             self.topological.influence(self)
+        self.population_fitness.append(np.sum(self.fitness) / self.individuals_n)
 
     def evolve(self):
         """Generates the next generation of individuals"""
@@ -191,7 +193,6 @@ class Population:
         def_y = self.y[self.knowledge == 0]
         print("numbers sit:" + str(len(sit_x)) + " norm: " + str(len(norm_x)) + " top: " + str(len(top_x)) + " def: " + str(len(def_x)))
         print("total " + str(len(sit_x)+len(norm_x)+len(top_x)+len(def_x)))
-        plt.clf()
         fig, ax = plt.subplots()
         ax.set_xlim(0, self.world.size_x)
         ax.set_ylim(0, self.world.size_y)
@@ -205,9 +206,30 @@ class Population:
 
         if plot_vs_return:
             plt.show()
+            plt.clf()
+            plt.cla()
+            plt.close()
         else:
             img = BytesIO()
             plt.savefig(img, format='png')
-            img.seek(0)
+            plt.clf()
+            plt.cla()
             plt.close(fig)
+            img.seek(0)
+            return img
+
+    def plot_fitness(self, plot_vs_return=False):
+        fit_fig, fit_ax = plt.subplots()
+        fit_ax.plot(range(len(self.population_fitness)), self.population_fitness)
+        plt.xlabel("iteration")
+        plt.ylabel("average fitness")
+
+        if plot_vs_return:
+            plt.show()
+            plt.close(fit_fig)
+        else:
+            img = BytesIO()
+            fit_fig.savefig(img, format='png')
+            plt.close(fit_fig)
+            img.seek(0)
             return img
diff --git a/src/world.py b/src/world.py
index 343d7ae..c9d0399 100644
--- a/src/world.py
+++ b/src/world.py
@@ -38,22 +38,23 @@ class World:
 
     def get_plot(self, plot_vs_return):
 
-        plt.clf()
-        fig = plt.figure()
-        ax = Axes3D(fig)
+        world_fig = plt.figure()
+        world_ax = Axes3D(world_fig)
 
         x = np.linspace(0, self.size_x, 100)
         y = np.linspace(0, self.size_y, 100)
         x_grid, y_grid = np.meshgrid(x, y)
         z = np.reshape(np.array(list(map(self.height, np.ravel(x_grid), np.ravel(y_grid)))), (100, 100))
 
-        # Plot a basic wireframe.
-        ax.plot_surface(x_grid, y_grid, z)
+        # Plot a basic wire frame.
+        world_ax.plot_surface(x_grid, y_grid, z)
         if plot_vs_return:
             plt.show()
+            plt.close(world_fig)
         else:
             img = BytesIO()
             plt.savefig(img)
+            plt.close(world_fig)
             img.seek(0)
             return img
 
diff --git a/templates/main.html b/templates/main.html
index 3c66838..7bec887 100644
--- a/templates/main.html
+++ b/templates/main.html
@@ -10,6 +10,15 @@
     <script>window.jQuery || document.write('<script src="{{
         url_for('static', filename='jquery.js') }}">\x3C/script>')
         $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
+        $.ajax({
+              dataType: "text",
+              url: $SCRIPT_ROOT + '/img/0',
+              data: "null",
+              success: function(data) {
+                  console.log("fuck");
+                  $("#time_plot").attr("src", "data:image/png;base64," + data);
+              }
+          });
     </script>
     <script type=text/javascript>
       $(function() {
@@ -36,7 +45,8 @@
       });
     </script>
     <div id="element1">
-        <img src="{{ url_for('main_plot') }}" alt="Image">
+        <p>Problem domain:</p><br>
+        <img src="{{ url_for('main_plot') }}" alt="cone world">
     </div>
     <div id="element2">
         <form method="post">
@@ -53,10 +63,14 @@
         </form>
     </div>
     <div class="slidecontainer">
-        <img class="image" alt="Image" id="time_plot" src="?"><br>
+        <img class="image" alt="Population per year" id="time_plot" src="?"><br>
         <input type="range" min="0" max="{{ iterations }}" value="0" class="slider" id="myRange"><br>
         <p>Year: <span id="current_frame"></span></p>
     </div>
+    <div id="element3">
+        <p>Average fitness:</p><br>
+        <img src="{{ url_for('fitness_plot') }}" alt="Run simulation to show the average fitness">
+    </div>
 
 </body>
 </html>
\ No newline at end of file
-- 
GitLab