From adfe1567d6f40bea9daa95d9eed4708abf5b3155 Mon Sep 17 00:00:00 2001
From: shinedday <shinedday@gmail.com>
Date: Wed, 8 Jun 2022 15:07:49 +0200
Subject: [PATCH] Add some experiments

---
 ant.zip                        | Bin 1946 -> 2029 bytes
 ant/agent.py                   |  36 ++++++++++-----
 ant/amas.py                    |   6 +--
 ant/config.json                |   6 +--
 ant/env.py                     |   4 +-
 ant/scheduler.py               |   2 +-
 ant_communicating.zip          | Bin 0 -> 2279 bytes
 ant_communicating/__init__.py  |   0
 ant_communicating/agent.py     |  80 +++++++++++++++++++++++++++++++++
 ant_communicating/amas.py      |  43 ++++++++++++++++++
 ant_communicating/config.json  |  11 +++++
 ant_communicating/env.py       |  15 +++++++
 ant_communicating/scheduler.py |   7 +++
 box.zip                        | Bin 0 -> 1539 bytes
 box/__init__.py                |   0
 box/agent.py                   |  17 +++++++
 box/amas.py                    |  18 ++++++++
 box/box.py                     |   9 ++++
 box/config.json                |   4 ++
 box/env.py                     |  27 +++++++++++
 demonstrator.zip               | Bin 0 -> 1894 bytes
 demonstrator/__init__.py       |   0
 demonstrator/agent.py          |  61 +++++++++++++++++++++++++
 demonstrator/amas.py           |  18 ++++++++
 demonstrator/config.json       |   3 ++
 demonstrator/env.py            |  13 ++++++
 demonstrator/scheduler.py      |   7 +++
 27 files changed, 367 insertions(+), 20 deletions(-)
 create mode 100644 ant_communicating.zip
 create mode 100644 ant_communicating/__init__.py
 create mode 100644 ant_communicating/agent.py
 create mode 100644 ant_communicating/amas.py
 create mode 100644 ant_communicating/config.json
 create mode 100644 ant_communicating/env.py
 create mode 100644 ant_communicating/scheduler.py
 create mode 100644 box.zip
 create mode 100644 box/__init__.py
 create mode 100644 box/agent.py
 create mode 100644 box/amas.py
 create mode 100644 box/box.py
 create mode 100644 box/config.json
 create mode 100644 box/env.py
 create mode 100644 demonstrator.zip
 create mode 100644 demonstrator/__init__.py
 create mode 100644 demonstrator/agent.py
 create mode 100644 demonstrator/amas.py
 create mode 100644 demonstrator/config.json
 create mode 100644 demonstrator/env.py
 create mode 100644 demonstrator/scheduler.py

diff --git a/ant.zip b/ant.zip
index 7f598ed6dbbf36c137aa684b8571ad27ef2c45db..64f65499b46aa579f4afbf1c9ddb7ad78e624126 100644
GIT binary patch
delta 1509
zcmbQm|CWD(dA*S9zK}=WlYWITF)-X?V_@K6U|>khE74C(Pt7aQE2x|r8kj%ZK%lOF
z%Kw7J{71E1FRanen0dv1gS~+3G;X!6Y-KFVlxKgtU%pMzVuH`w_@4dNzki=APj{&e
z>1}H}>2&q=)PmFBuB;1x9eQ(xRLdoO)8CStnWsy!wTo{y(0g4U8n<y<tN2Q1?nya&
znPi-@R*9YsT`G0skbL{Bi75hiRLfW{vMguQJ8k*r$)4VW?dFdaQ!NkG-%XL^HPzao
zVz)VMf{UHahO`N8)9+0)ZC;*H$FV7G!_1Dm?gzaWoX|E|ns|D(5z{r9T~h0po?USD
zY=vc-MD?A;hf><+u1k1qI<MaO!<)Mk%@sS(A4&Im^g8I$E!NdX@|U$v3R7r2{{Dlr
z=Q~d8B)fF$&%tqpzfSQ#3cei>aqg(~{+-8<sqM7bvv<|9qd(XdT>sLex2IM)@8;X|
zHLT}d3uk}s@|*VhzxSJmiPm2{a@2Ize)wqF)SkY{;~u+>tEJp;-rb3ZZ1;5wN!0)K
z-~Ok4(oCK58*H-I_OG4IDR(+!x<jYD$nGm0wjVxd-}KKrcFbq<>Fjbl;e_*d68|5s
zdw!ICowM1Q#;q(ZZ_d75vhU0^eV3#yVx6rz74p~C@V}iU@MF_nx&IQ=10UMkOuNgu
zr|`+VA6Z&oxj&h!74t<o-pyS0vvosc+GLKPH}!5!m7ezcIh8ls&QxD3m79LF{q;`Q
z^r+&y9e3V-tdY(6b;eF=h1Mo3&o}Rt>QpUr#J?P@dvm@n)7JOe<x8(F)qk7uboawu
z*-sw4`KNhk&*Di}=LFrzdpPgXEKbjte+9UU!=)ZgmU^^b>zMlc+Uf63PVf;kpKFr%
zhdIETnMH(wp`L+*;kC!Uki<u(Y`Ym57|yaVFmS_?U~XcuUP0y3kb_x|4FvYGf8ux6
zn|k}og~M@9n=hP}`_AqqnG#*5p4}Vdsb`q_zgG2l=bW6&Vpi;p>GSSMd!Bc$%3i~M
zefQ5b+uWL`{gcc%voFGaelM%hKgZMdJFi@lWl(&mRG(m{9sN?qrr?N$;Pf2P&jO2r
zOcjJCyNmd3{VKF1*J|yJ-J%xx(+{+|-fVHX!<y`pVV81IT4(K~xPw-S!bRDgdo3oV
z3HRl#UUTBp;(sDjZW-HL@!VFOwSBtsVduk_*JUL$HcG5{;@0_n)|^9^9am+Y*A<)e
z_mRsynN5qH?KGHMFPq=NR29*!DSg$M@!IQ!CCiehzSlXdf77aTle+240PXyhH9aQ&
z6Q93*|2?8>{e~sC^!7YhTK37U_4Z9&qaAxS%8sa<`WJlaANQ2ns!0-}mhzQ{^%cqr
zWPk1Bbh>`QzvZ|w--YTOzYCwO*rXrb+M1P7B6#Ot%l)>iSz020UDE68lD2;KxVp1n
zsbunkEiL^Q480CteOTt_BlazC)BleTr#_xmJ|oFz&p*w}u7A{aSl#C5?J90u8rE^q
zIlLoENI9<em)@2-3C%>G4uhqiKK$Qjch5HUbiw__Yfk4LSE_->GXn?1;mVyMIpHbk
z5ey6rB@7G<{Ge!_9Ll1@7&y6!#XvEHM<s;&QY<$EG-*InMz_MjBlAJZ87JRk(Wu`t
z`N6EdCDK2>ZOhrEy1l0UpZ!7$wUZ0vZRN7QPf`jv75gP$yh6=WhB<wKYsFo+(}$8j
zth!LBcjV2Ay&+sn=PhJ+NjlZxcKE{l1E;fBDXrCt$QF5&W41+b?lFa9yY`=s3z?n8
z^jkt;VeUf5o_P`*Bj1YNy5BkL=#>1}jWhC}@8*b2zH;)&u{y@d9juS|Pz%q=6>K^Y
z*b*}X0|Nsig8~Bs!)hjI=?Y2O0p5&EA`Bu73^;-Zp|OARA2vA!kl~2%U|`?^DS#U;
V!aCWC-Hh?}<U)33wh}gw8~{+*sLTKW

delta 1418
zcmaFMKZ}2Yd3|E}=8*3%e$M&I$iPs_%D}+Gz`&50SE8Soo|;#pS5P@M<Y3-n1A)En
zr|i$9@gLQ4U2-dC(OIvbjei?CBKss?tVnP_R+6~CE_XqrgLLlBhWmRy+EmLqKXsMn
zc3TlL{k7=V)2r5ATm4nbco)m1ZxLPBJ)W%4;b~bMUva8Rl{>ILv>?Rng~PV*3Om$~
z@>r<5PW!yzkP>%e(D4O57v3~Z;eD9%MO(^mx^2j{A2AYg^94)`8lK16IN#<ET*;jq
zlhSov+=Q`voz}5mlP~3HMXc`gUbJBUp-EwLi`e}4KiD2-Ay`p(d|v9QFtHQoXI!3s
zX^uzdm$v!ON}dOM{5%~w`&9khLI$bR>t8h4^6r`vY_xjTqLS+$Mdv!*`Yj|~VZ#&F
z_2=|fi;7#VA9f^ni``4?yYpV5^li-buVpRwqieeqi{<ZBp3I+?ydn9d$7jQbwyW)S
zP44{hdY-y_f6<nM%cAol9+l=TZ_<i6v2cyMQjn&Zqvosy(Z+1|=g6nG=AF3}UjJ9c
zdge9VFY*)gojh4qFI=;BLxpl;+3Z4&+ZKJ2e@fn03r(xEe^&4EK0D-P{qChjDRGNT
zResOm+}^&od-wg%FP=Lb?_3sXZues2<z+Wj-oMMAcCoBy+v$w^7qyeGIX7=J%ToB>
z-23N8&?1*}4+|RD&v`p`eQtlKb13)e@p=1A>&*?66F+UgY?ioCK2`bCoDB#6Dj9A4
z#QvK-z?+#xgn@y9gTbSGbBMo_Lcu{s28K&43=G_`B$At0tXELE6p=!DiZn|!Z>_uH
zy(Mzxbh+Qmp(aKK7d#K1>zk{!;#Ph9YypML&1<(5J0$F{e4l8~YaXp!&zF<^d~=Ww
zb8pf41AkxT7k-Z1fAH8{^H-{&y_?({;x{lF%zwIdli0h`12;5m9;HUG$FojtI5A5$
zDP^Ue@QEXPCMe`jPnfGR;kwVQn=B=2E42R0-CDT*!sN2mFL<6gof2H*_J(EW?MW_$
zRwsC!n%!)+rk1d$gv!r&(>S;HU5{VA?-VzNM$?W<qOS6lvktl6cP)I-C+4;LXs1o|
zl_OV+)5<Q*=cz9Fer8!tOqukCsM6?kE2lhlDY=l`mrK%3GB+x!&#`BnRr;Xv_vd<@
zo8b}1_U_%k!Mp5I*PoYf#0~Gnh)5eKr~cMV{mpu+Y|o?s)@bpH+AoW3W2*1p-*drq
zOTF;JfAZEZ{CDiN_71uC%rwzW^t)!$?D!8ECc4X=6#Z+asry#9$IN-I;b5*jMfiuf
zRY+b*q0QXM6Mo+F{Ui52-*QXM0g<dpU;St5Ju<hu`Y|!0U<P}XX^VtWN$U-bYaQWx
z_kF$AzxYUh`w9Q$A)a4<mF(^lme^OfMtH~Xd(|7{R=z2DV*if`5!;24n?t^3Z_rL=
zU|^U$c^QidW7y=|ECxEWB3L{4RTBSrO~{?<r4Xlk;zJYzLf5pA4Ivh*CbiCDU|{&l
zFj<FHqkik;4W_c5<~MHd-t_WM@#+6h{hbOuCOM|t%6V;_q!e(<_sd*vn~5rYjm8(a
z;=W(A`tWA2mdPCP<9~L33yO*O!lkPq6zpaq_3Il8zh|t#l7#^qJdZ1OY<ze8-IZNk
zUVOhL1QxDa=+rY$V&g3*kyq~(XC2kCx72_CvTR@UZb3gcX0vb1lW(&=;zKRrCZA^0
ziNKbk85kHC7#S287#Mt*phX}geFu0mGKnxivI0urFfcIigLJ_)noag+ms3Cu3I+x)
Y6g9_KCik+NF?LKo!miAw$Oe)F05ULliU0rr

diff --git a/ant/agent.py b/ant/agent.py
index 0d1d88c..6492e4d 100644
--- a/ant/agent.py
+++ b/ant/agent.py
@@ -5,12 +5,24 @@ from iotAmak.agent import Agent
 
 
 class Ant(Agent):
+    int_to_color = {
+        0: "#000000",
+        1: "#ff0000",
+        2: "#00ff00",
+        3: "#0000ff",
+    }
+    color_to_int = {
+        "#000000": 0,
+        "#ff0000": 1,
+        "#00ff00": 2,
+        "#0000ff": 3,
+    }
 
-    def __init__(self, identifier: int, broker_ip: str):
-        self.x = 250
-        self.y = 250
-        self.color = 0
-        super().__init__(identifier, broker_ip)
+    def __init__(self, arguments: str):
+        self.x = 0
+        self.y = 0
+        self.color = "#000000"
+        super().__init__(arguments)
 
     def on_initialization(self) -> None:
         pass
@@ -28,17 +40,21 @@ class Ant(Agent):
     def on_act(self) -> None:
         self.x += random.randint(-5, +5)
         self.y += random.randint(-5, +5)
+        if self.x < 0:
+            self.x = 0
+        if self.y < 0:
+            self.y = 0
 
         # count color
-        color = [0 for _ in range(5)]
+        color = [0 for _ in range(4)]
         for ant in self.next_neighbors:
-            color[ant.get("color")] += 1
+            color[Ant.color_to_int.get(ant.get("color"))] += 1
         # set color
         if color.index(max(color)) != 0:
-            self.color = color[color.index(max(color))]
+            self.color = Ant.int_to_color.get(color[color.index(max(color))])
         # low chance to mutate
         if random.randint(0, 1000) < 10:
-            self.color = random.randint(0, 4)
+            self.color = Ant.int_to_color.get(random.randint(0, 3))
 
     def on_cycle_end(self) -> None:
         pass
@@ -53,5 +69,5 @@ class Ant(Agent):
 
 
 if __name__ == '__main__':
-    a = Ant(int(sys.argv[1]), str(sys.argv[2]))
+    a = Ant(str(sys.argv[1]))
     a.run()
diff --git a/ant/amas.py b/ant/amas.py
index 267f805..db8368d 100644
--- a/ant/amas.py
+++ b/ant/amas.py
@@ -6,9 +6,9 @@ from iotAmak.amas import Amas
 
 class AntAmas(Amas):
 
-    def __init__(self, broker_ip: str, clients, nbr_agent):
+    def __init__(self, arguments: str, nbr_agent):
         self.agent_to_create = nbr_agent
-        super().__init__(broker_ip, clients)
+        super().__init__(arguments)
 
     def on_initial_agents_creation(self):
         for _ in range(self.agent_to_create):
@@ -39,5 +39,5 @@ class AntAmas(Amas):
 
 
 if __name__ == '__main__':
-    s = AntAmas(str(sys.argv[1]), sys.argv[2], 50)
+    s = AntAmas(str(sys.argv[1]), 15)
     s.run()
diff --git a/ant/config.json b/ant/config.json
index d9cf6ab..d96ea1d 100644
--- a/ant/config.json
+++ b/ant/config.json
@@ -1,13 +1,11 @@
 {
-  "iotamak_version": "0.0.3",
+  "iotamak_version": "0.0.4",
 
   "seed" : 0,
 
   "canvas": {
     "height" : 500,
-    "width" : 500,
-    "x" : "x",
-    "y": "y"
+    "width" : 500
   }
 
 }
\ No newline at end of file
diff --git a/ant/env.py b/ant/env.py
index a4f1c42..ebadace 100644
--- a/ant/env.py
+++ b/ant/env.py
@@ -6,8 +6,8 @@ from iotAmak.environment import Environment
 
 class AntEnv(Environment):
 
-    def __init__(self, broker_ip):
-        super().__init__(broker_ip)
+    def __init__(self, arguments):
+        super().__init__(arguments)
 
 
 if __name__ == '__main__':
diff --git a/ant/scheduler.py b/ant/scheduler.py
index 9aac6b6..01638e3 100644
--- a/ant/scheduler.py
+++ b/ant/scheduler.py
@@ -3,5 +3,5 @@ import sys
 from iotAmak.scheduler import Scheduler
 
 if __name__ == '__main__':
-    a = Scheduler(str(sys.argv[1]))
+    a = Scheduler(str(sys.argv[1]), str(sys.argv[2]), str(sys.argv[3]))
     a.run()
\ No newline at end of file
diff --git a/ant_communicating.zip b/ant_communicating.zip
new file mode 100644
index 0000000000000000000000000000000000000000..2db59209b24cdbea563f93791e888e8b9e7a2e14
GIT binary patch
literal 2279
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
Bh_V0x

literal 0
HcmV?d00001

diff --git a/ant_communicating/__init__.py b/ant_communicating/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/ant_communicating/agent.py b/ant_communicating/agent.py
new file mode 100644
index 0000000..e6a074d
--- /dev/null
+++ b/ant_communicating/agent.py
@@ -0,0 +1,80 @@
+import random
+import sys
+
+from iotAmak.communicating_agent import CommunicatingAgent
+
+
+class Ant(CommunicatingAgent):
+    int_to_color = {
+        0: "#000000",
+        1: "#ff0000",
+        2: "#00ff00",
+        3: "#0000ff",
+    }
+    color_to_int = {
+        "#000000": 0,
+        "#ff0000": 1,
+        "#00ff00": 2,
+        "#0000ff": 3,
+    }
+
+    def __init__(self, arguments: str):
+        self.x = 0
+        self.y = 0
+        self.color = "#000000"
+
+        self.other_color = [0 for _ in range(4)]
+
+        super().__init__(arguments)
+
+    def on_initialization(self) -> None:
+        pass
+
+    def on_cycle_begin(self) -> None:
+        pass
+
+    def on_perceive(self) -> None:
+        self.neighbors = self.next_neighbors
+        self.next_neighbors = []
+
+        self.other_color = [0 for _ in range(4)]
+        for mail in self.mailbox:
+            self.other_color[Ant.color_to_int.get(mail.payload.get("color"))] += 1
+        self.mailbox = []
+
+    def on_decide(self) -> None:
+        pass
+
+    def on_act(self) -> None:
+        self.x += random.randint(-5, +5)
+        self.y += random.randint(-5, +5)
+        if self.x < 0:
+            self.x = 0
+        if self.y < 0:
+            self.y = 0
+
+        # count color
+        index_max = self.other_color.index(max(self.other_color[1:]))
+        if self.other_color[index_max] != 0:
+            self.color = Ant.int_to_color.get(self.other_color[index_max])
+        # low chance to mutate
+        if random.randint(0, 1000) < 10:
+            self.color = Ant.int_to_color.get(random.randint(0, 3))
+
+    def on_cycle_end(self) -> None:
+        for n in self.neighbors:
+            self.send_mail(n.get("id"), {"color": self.color})
+
+
+    def send_metric(self):
+        metric = super(Ant, self).send_metric()
+
+        metric["x"] = self.x
+        metric["y"] = self.y
+        metric["color"] = self.color
+        return metric
+
+
+if __name__ == '__main__':
+    a = Ant(str(sys.argv[1]))
+    a.run()
diff --git a/ant_communicating/amas.py b/ant_communicating/amas.py
new file mode 100644
index 0000000..f79ec7a
--- /dev/null
+++ b/ant_communicating/amas.py
@@ -0,0 +1,43 @@
+import sys
+from math import sqrt
+
+from iotAmak.amas import Amas
+
+
+class AntAmas(Amas):
+
+    def __init__(self, arguments: str, nbr_agent):
+        self.agent_to_create = nbr_agent
+        super().__init__(arguments)
+
+    def on_initial_agents_creation(self):
+        for _ in range(self.agent_to_create):
+            self.add_agent("ant_communicating")
+
+    def is_neighbour(self, id_a, id_b):
+        if id_a == id_b:
+            return False
+        if self.agents_metric[id_a] == {}:
+            return False
+        if self.agents_metric[id_b] == {}:
+            return False
+
+        x = self.agents_metric[id_a].get("x") - self.agents_metric[id_b].get("x")
+        y = self.agents_metric[id_a].get("y") - self.agents_metric[id_b].get("y")
+
+        dist = sqrt(x * x + y * y)
+        return dist < 1500
+
+    def on_cycle_begin(self) -> None:
+
+        for i in range(self.next_id):
+            for j in range(i, self.next_id):
+                cond = self.is_neighbour(i, j)
+                if cond:
+                    self.agent_neighbour(i, j)
+                    self.agent_neighbour(j, i)
+
+
+if __name__ == '__main__':
+    s = AntAmas(str(sys.argv[1]), 2)
+    s.run()
diff --git a/ant_communicating/config.json b/ant_communicating/config.json
new file mode 100644
index 0000000..d96ea1d
--- /dev/null
+++ b/ant_communicating/config.json
@@ -0,0 +1,11 @@
+{
+  "iotamak_version": "0.0.4",
+
+  "seed" : 0,
+
+  "canvas": {
+    "height" : 500,
+    "width" : 500
+  }
+
+}
\ No newline at end of file
diff --git a/ant_communicating/env.py b/ant_communicating/env.py
new file mode 100644
index 0000000..ebadace
--- /dev/null
+++ b/ant_communicating/env.py
@@ -0,0 +1,15 @@
+import sys
+
+
+from iotAmak.environment import Environment
+
+
+class AntEnv(Environment):
+
+    def __init__(self, arguments):
+        super().__init__(arguments)
+
+
+if __name__ == '__main__':
+    s = AntEnv(str(sys.argv[1]))
+    s.run()
\ No newline at end of file
diff --git a/ant_communicating/scheduler.py b/ant_communicating/scheduler.py
new file mode 100644
index 0000000..01638e3
--- /dev/null
+++ b/ant_communicating/scheduler.py
@@ -0,0 +1,7 @@
+import sys
+
+from iotAmak.scheduler import Scheduler
+
+if __name__ == '__main__':
+    a = Scheduler(str(sys.argv[1]), str(sys.argv[2]), str(sys.argv[3]))
+    a.run()
\ No newline at end of file
diff --git a/box.zip b/box.zip
new file mode 100644
index 0000000000000000000000000000000000000000..1341005ebc9deb871cb11248c71264bfbc027384
GIT binary patch
literal 1539
zcmWIWW@Zs#00ATa6CofPhWQy77?ScU^yA|*^D;}~<Mj$EVTw5zw4+XhoHO94Kf%Dj
z;KInjzynpBn4X$fqE}GqJHe6bkb!{f_ttxfFOIQf9mrkiWZNJvAerQAdP7BZvR8HW
z<ft{9XZ`&A?6Yt#+jHg%K9$qb=a#c=;qINNuPA?tO)+zuuAc1+{W~fvJ-v3F+`MhN
zOF_})MH_R^uHMoXQGS(i(KaguqoCUGrZ4>$T{^TDJP_u}zG$Iwe#Z~lKLP*VKi4^B
zrjsZ0&E3L!^}pCfdTk%CWmj!_^laIpmPHTlpRhW*@sftiitHPTQY&>I<(Vq1*v@{m
zLZ@y*hvB{Hho^p?Dp<Eghff~i<6V&_LVo`-Zh6MQz%YxEfq@(5<J`nzu!nuS4jb^a
zes8?vSQ0GVweYr+*xc+XN+z9?yE@+{ST5cB_l76O#Z%XQfBAAakIS&JX6d?DtNITz
zwwIKDNk1`BV$%BjjW&(pU*e1;Be-6zlJ#V%JG6Ys6}?x{f{O0x)eb4=IRiUoe{%=O
zq@~wRlJ@9gZPiVgmlJa94XgF4{<?$uR+l?WL_}|AXcm6(ZeN@%uVk>H-J@<p))wug
zTNA}^EARFRaCx=sYQ)^S!_P|^r@GCXmHe@J{xeaP%A&CK&mU~c`Kj!5`GDj_!RjNQ
zuemL_**~>B{O1R?_dn`l=11jsbZ!p+g%liT0#Af+N1sczV_;y&U|?Y2f(A!YeuZ8^
z<>RN1o_d}0)X@toIJJJmBi2tM4GOBJzKV8s#`>F8?BW(%n5z3;=2Bv0QrH*Q+O)Qb
zanq+GQ$%94w&sfRFd_ndRpyBh?v)eP*)lLNI5IFWz|v%LeqLH;x?Wase%|V5PlEyi
zPMy*BJmY(&Pv2Wt>)e_1!JC2tj4l{oFb==O=q;|EzGT^yXDQE?9-kf}wxnr^aJTm7
zNmDC!W+B;>U3MbmY_QDDEJg-~k4y;vq~?|B6;zf6oz6OJAh3u16Mwhf)Q(jFFEl4O
zaqa!a-Xyq5ce!`+$&A#=e`=RrDZI1gs%O;Mb7$-}yshbQNRQH+)~)tK?85QbY`dwY
z%|<0<Q~k^j<Ui13zjvqM;O=X?EK;ZbD>=I7S1_Nx_|=O7Pt&~~e4m*#S#g42uJi>d
zS+}*8H<OhQwm8psR5>`+QT-E7`^S_XsmB}kD!uy`+;Zu;-N|CcUj7A)vMi7Jrp0@9
zM+V)$d7yRH93QzOyi+nin4dj!dx?LoXXt@TMQMDUX=lSknB6xfy`FOTNlNf+twrTY
z_xhtN-guNAaZy^RE}bRZ+j31v_1VrJt{%yAU%81_UXu>g`o*WcaD{c!lbo|h{;d?K
z-;z`RRAb7@?0=W1{54?yWfx<^Sy9ti{{GFg`~S|cm)>8Zm(s1%%Wif+#cSHn8G9@b
zI?dJlHRJo?nb)#-Z|mA*+?6VcvhSHvdG7JFr;{!ltv1=C7_RZKa?PZW7qa5<0p5&E
zA`G}oBuMF`0HH9;CzxjJB@{>(BLhgYE;PBq$}5Dm91PfUIzp#BBcxbNgyef<jo9)8
zLZcoNL?a}JAnU`H$`SgeK=mP|d1TGl5-vjXKd5F%G7j)&Wdq5vF|aYjGBPksU;*&}
DlO#Li

literal 0
HcmV?d00001

diff --git a/box/__init__.py b/box/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/box/agent.py b/box/agent.py
new file mode 100644
index 0000000..7fcf405
--- /dev/null
+++ b/box/agent.py
@@ -0,0 +1,17 @@
+import sys
+
+from iotAmak.agent.async_agent import AsyncAgent
+
+
+class BoxAgent(AsyncAgent):
+
+    def __init__(self, arguments: str):
+        super().__init__(arguments)
+
+    def on_act(self) -> None:
+        self.publish("box", "")
+
+
+if __name__ == '__main__':
+    s = BoxAgent(str(sys.argv[1]))
+    s.run()
diff --git a/box/amas.py b/box/amas.py
new file mode 100644
index 0000000..d9b787f
--- /dev/null
+++ b/box/amas.py
@@ -0,0 +1,18 @@
+import sys
+
+from iotAmak.amas.async_amas import AsyncAmas
+
+
+class BoxAmas(AsyncAmas):
+
+    def __init__(self, arguments: str):
+        super().__init__(arguments)
+
+    def on_initial_agents_creation(self):
+        for i in range(len(self.clients)):
+            self.add_agent("box", client_ip=self.clients[i].hostname)
+
+
+if __name__ == '__main__':
+    s = BoxAmas(str(sys.argv[1]))
+    s.run()
\ No newline at end of file
diff --git a/box/box.py b/box/box.py
new file mode 100644
index 0000000..041aad9
--- /dev/null
+++ b/box/box.py
@@ -0,0 +1,9 @@
+
+
+class Box:
+
+    def __init__(self):
+        self.x = 0
+
+    def add(self):
+        self.x += 1
\ No newline at end of file
diff --git a/box/config.json b/box/config.json
new file mode 100644
index 0000000..c771fea
--- /dev/null
+++ b/box/config.json
@@ -0,0 +1,4 @@
+{
+  "iotamak_version": "0.0.7",
+  "scheduling_type": "async"
+}
\ No newline at end of file
diff --git a/box/env.py b/box/env.py
new file mode 100644
index 0000000..64ddb93
--- /dev/null
+++ b/box/env.py
@@ -0,0 +1,27 @@
+import sys
+
+from iotAmak.env.async_env import AsyncEnvironment
+
+from box import Box
+
+
+class BoxEnv(AsyncEnvironment):
+
+    def __init__(self, arguments, nbr_box):
+        self.nbr_box = nbr_box
+        self.boxs = [Box() for _ in range(nbr_box)]
+        super().__init__(arguments)
+        for i in range(nbr_box):
+            self.subscribe("agent/"+str(i)+"/box", self.box_action)
+
+    def box_action(self, client, userdata, message):
+        agent_id = int(str(message.topic).split("/")[1])
+        self.boxs[agent_id].add()
+
+    def behaviour(self) -> None:
+        for i in range(self.nbr_box):
+            print("Box : ",i," -> ",self.boxs[i].x)
+
+if __name__ == '__main__':
+    s = BoxEnv(str(sys.argv[1]), 4)
+    s.run()
\ No newline at end of file
diff --git a/demonstrator.zip b/demonstrator.zip
new file mode 100644
index 0000000000000000000000000000000000000000..035d3cff04ceab08e99d3f5296d749f0af940548
GIT binary patch
literal 1894
zcmWIWW@Zs#0D(_I8$v)d3`;ODFr=jB=I0fc6eX7A7wN~xXXa&=#K-FuRKj#|Fvz%{
z2>Iq>;u6Qiz_6N~fk6~qS7Lf<UWr~o<=jxm^@|Jy_RanwuNEU0>N0=3X`%4u<$L$s
zy&Tt*sTC5ZyoK$;_IK;=&unU9jeGQ((dqf@nfd$91x%gm6X&E?lC$ZfN9g>cTP6CB
zEq2Z`3Rre0<&i{}%PXTEpJ{WqcDbx9IrLWUil6<hWxSCZ$0|gYF4B0Q-nP(oKX<Zr
z6XUuFxrXAUp(l67pZFrsaAI<C+kzxk*O}}KzE@5yV_j9$S|w;#V{&-cLF)tE9_KeX
z94LDp;ZitdW46Woly{py_`UP%-nvsd_pR5GSMt}=x9Bz<d}F;wQa5%JTXWZ?Co|Sq
zH5gQxYfbuhZFUu7g>jY73&ZbaYt}a$n;aLhaX-g{=&dnn7froX@1J(zy&Tl;=GNW*
zRZ2{kVJ)*!n1=pRza{%q`sPlX#<lZigx0%R_V+}Otvfq~`J-*%ERVZd^8M0jA5QIJ
z)LAjX>e<YImHit7&iEGoaeh?k%(v3B=Dly-jXU>5e)rkT)Yh06r*hS`uI|L%UN<2j
z<)Dj;UL@!LvyysHI6={-GdrtAbXDU0#o?FtFSMAuA!q)PO^O~YGmAxymuJlsE7Ax#
zx>tDhvcq?#t?6EoU3)=m+QhE*sa6m54}BB}{24iW*``;IW+^M@PK*6H$I|)lvgSi~
z)mDj??Y?pFOXB0w?=N&O-_zNgzWL0)NvWT5rkxDmbY}ipqxUH<e+mY=^Ul@pZQpmk
zEjOdR$@+$)_R`za%H|y8<6U!LG4s*RyoZUmKEM9>;QD*%J-VL!Q$oe(E;{Yq?Nj8p
zYj44$WtR0TcXEfks^g8~3ZJvqX6FJIodv&F-Hd#fcUkq&pEb3Ae(<9v$l1A0c5fLN
z7}hf~Fn|&_N-|E&O)S<cs7#%BwyVW}=lJ`k_X5w1ba`6$@>Se;Y<E~eF{AYGt*}{E
z8}j$(iVB*wJ4}xM_fuoH=@FJs+PRm_f_eBXmiW8dx5;>x9<ZLWcxu+{L`A_Ls}`(y
z^kwrA#oHO`4k_n313P1vu?NgCPp_S%?$O2CdN?IIH{{kFR`pfus}5ebx!hzjU5D>t
z(4z<0?W-S&C>d;M_o&;Jwb44Mt#$RAscVI&sPsP8Ta&lA^x$(%&DM(Q195G8%EG6L
ze}87}@##rUtpBd-`~CLb>p%KbuGOVwU9<Hf<!>F|lZ6`J*`(&J`4m4x=Vx8*mniv;
z&e`EVKeEGuhk;?Q=b@0pcb#7=F)%QIFh(v<&d*EBOxMdQ&d;mn<x)^k%FHiG%uURW
zFH0>d&dkqKvQkho&@<38Q{v^Sg_#Q}2jn9TmCj~hVED?wz#xoX4y5Ll=@nG^_8;Ur
zWWdw*zIm^6UbZ7wT&t{2#Ro|jr;C0~*;=0FAKvEPEcvH6{f~UTP}h1D$uDbjjXk;?
zH02l9?>bPNJL!mF0bA68%Vt@#qqbjMeaQ0ZqZ#(s<yLXKem7uHGE8+@oG4TF;HhD#
zhc@f#k}6iiYkzO_Mui2QO_XO=`eIwsaZy;gEW5+$zpcyW8J{L=3w}<m-&&?R$0z3v
zJd7ZIVYvGIO&J3N!)68s21#_k6enk-rj+KS7U>mKo<5^{LSHLTW1Y^kr;na`X`ebD
zdg6?J;ThjE*R=i4dH8Cc_0)CRAY!C=syUHK!FOgR*T;{QojX^4{K&O!8`rCkA9r@n
zto-=#RoI>wE{6##61p!e2#jGmGWBRxr|Zkqi)|ZcS#fD7xk)G;+c;}hK=YR_ug@kX
zi~-(^Od{a4&A@=I;D!|93J?lUF%B~Y;%W4P9HgC*0c469dJw>hb%aA8MxbXsgb~M?
z(CQOtMnsr^J#`{Xc*cxo0#aH<m;!MJdRj!7V#k7J3M6Hs8-Shw5C(9uq8Wgk90I&q
T*+5F!7}ywQGBPl1X9e*9D%In_

literal 0
HcmV?d00001

diff --git a/demonstrator/__init__.py b/demonstrator/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/demonstrator/agent.py b/demonstrator/agent.py
new file mode 100644
index 0000000..6c256d0
--- /dev/null
+++ b/demonstrator/agent.py
@@ -0,0 +1,61 @@
+import random
+import sys
+
+from iotAmak.agent.communicating_agent import CommunicatingAgent
+
+
+class IotAgent(CommunicatingAgent):
+
+    def __init__(self, arguments: str, nbr_agent: int):
+        self.nbr_agent: int = nbr_agent
+        self.values = []
+        self.asked = []
+        super().__init__(arguments)
+
+    def on_initialization(self) -> None:
+        self.operator = random.choice(["+", "-", "*", "/"])
+        self.value = random.randint(0, 9999999)
+
+    def on_cycle_begin(self) -> None:
+        if self.nbr_cycle == 0:
+            for i in range(2):
+                nei = self.id
+                while self.id == nei:
+                    nei = random.randint(0, self.nbr_agent - 1)
+                self.send_mail(nei, "AskValue")
+                self.log("New nei "+str(nei))
+
+    def on_perceive(self) -> None:
+        self.values = []
+        for mail in self.mailbox:
+            if mail.payload == "AskValue":
+                self.asked.append(int(mail.sender_id))
+            else:
+                self.values.append(int(mail.payload))
+        self.mailbox = []
+
+    def on_decide(self) -> None:
+        pass
+
+    def on_act(self) -> None:
+        if len(self.values) == 2:
+            if self.operator == "+":
+                self.value = self.values[0] + self.values[1]
+            elif self.operator == "-":
+                self.value = self.values[0] - self.values[1]
+            elif self.operator == "*":
+                self.value = self.values[0] * self.values[1]
+            elif self.operator == "/":
+                self.value = self.values[0] / self.values[1]
+
+    def on_cycle_end(self) -> None:
+        for n in self.asked:
+            self.send_mail(n, self.value)
+        self.log(" Value : " + str(self.value) +
+                 " OP : " + self.operator
+                 )
+
+
+if __name__ == '__main__':
+    a = IotAgent(str(sys.argv[1]), int(sys.argv[2]))
+    a.run()
diff --git a/demonstrator/amas.py b/demonstrator/amas.py
new file mode 100644
index 0000000..775492b
--- /dev/null
+++ b/demonstrator/amas.py
@@ -0,0 +1,18 @@
+import sys
+
+from iotAmak.amas.amas import Amas
+
+
+class IotAmas(Amas):
+
+    def __init__(self, arguments: str):
+        super().__init__(arguments)
+
+    def on_initial_agents_creation(self):
+        for i in range(len(self.clients)):
+            self.add_agent("demonstrator", client_ip=self.clients[i].hostname, args=[len(self.clients)])
+
+
+if __name__ == '__main__':
+    s = IotAmas(str(sys.argv[1]))
+    s.run()
diff --git a/demonstrator/config.json b/demonstrator/config.json
new file mode 100644
index 0000000..6c22a08
--- /dev/null
+++ b/demonstrator/config.json
@@ -0,0 +1,3 @@
+{
+  "iotamak_version": "0.0.6"
+}
\ No newline at end of file
diff --git a/demonstrator/env.py b/demonstrator/env.py
new file mode 100644
index 0000000..d3723ef
--- /dev/null
+++ b/demonstrator/env.py
@@ -0,0 +1,13 @@
+import sys
+from iotAmak.env.environment import Environment
+
+
+class IotEnv(Environment):
+
+    def __init__(self, arguments):
+        super().__init__(arguments)
+
+
+if __name__ == '__main__':
+    s = IotEnv(str(sys.argv[1]))
+    s.run()
\ No newline at end of file
diff --git a/demonstrator/scheduler.py b/demonstrator/scheduler.py
new file mode 100644
index 0000000..4a21e61
--- /dev/null
+++ b/demonstrator/scheduler.py
@@ -0,0 +1,7 @@
+import sys
+
+from iotAmak.scheduler.scheduler import Scheduler
+
+if __name__ == '__main__':
+    a = Scheduler(str(sys.argv[1]), str(sys.argv[2]), str(sys.argv[3]))
+    a.run()
\ No newline at end of file
-- 
GitLab