From de67fe3e74a8757fc7aa2d4d45799f4cb1f8ad88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Garc=C3=ADa=20Mart=C3=ADn?= Date: Wed, 5 Jul 2017 13:19:56 +0200 Subject: [PATCH] Initial commit --- LICENSE | 0 MANIFEST.in | 4 - README.md | 32 +- TerroristModel.png | Bin 0 -> 24061 bytes TerroristModel_tipo.png | Bin 0 -> 15388 bytes TerroristModel_type.png | Bin 0 -> 16647 bytes clase_base.pyc | Bin 0 -> 2061 bytes data.txt | 8802 +++++++++++++++++ debug.py | 3 - docs/Makefile | 0 docs/Tutorial - Spreading news.rst | 1284 --- docs/conf.py | 0 docs/index.rst | 29 +- docs/installation.rst | 21 +- docs/make.bat | 0 docs/models.rst | 112 + docs/output_21_0.png | Bin 8743 -> 0 bytes docs/output_44_0.png | Bin 11949 -> 0 bytes docs/output_44_1.png | Bin 17662 -> 0 bytes docs/output_44_2.png | Bin 16842 -> 0 bytes docs/output_44_3.png | Bin 15695 -> 0 bytes docs/output_44_4.png | Bin 14643 -> 0 bytes docs/output_45_0.png | Bin 11354 -> 0 bytes docs/output_45_1.png | Bin 12530 -> 0 bytes docs/output_45_2.png | Bin 11905 -> 0 bytes docs/output_45_3.png | Bin 11762 -> 0 bytes docs/output_45_4.png | Bin 11653 -> 0 bytes docs/quickstart.rst | 194 - docs/usage.rst | 99 + examples/complete.yml | 24 - .../UnnamedSimulation.dumped.yml | 17 - examples/custom-agents/agent.py | 20 - examples/torvalds.edgelist | 2 - examples/torvalds.yml | 14 - logo_gsi.png | Bin logo_gsi.svg | 0 models/BaseBehaviour/BaseBehaviour.py | 38 + models/BaseBehaviour/__init__.py | 1 + models/TerroristModel/TerroristModel.py | 367 + models/TerroristModel/__init__.py | 1 + models/__init__.py | 3 + models/models.py | 7 + models_org.py | 596 -- notebooks/soil_tutorial.ipynb | 1912 ---- requirements.txt | 3 +- settings.json | 23 + settings.py | 13 + setup.py | 39 - sim_01/log.0.state.pickled | Bin 0 -> 128665 bytes sim_01/log.1.state.pickled | Bin 0 -> 116150 bytes simulation.yml | 63 - soil.py | 215 + soil.py~ | 394 + soil/__init__.py | 42 - soil/agents/BaseBehaviour.py | 123 - soil/agents/BassModel.py | 40 - soil/agents/BigMarketModel.py | 102 - soil/agents/CounterModel.py | 31 - soil/agents/DrawingAgent.py | 18 - soil/agents/IndependentCascadeModel.py | 49 - soil/agents/ModelM2.py | 242 - soil/agents/SISaModel.py | 93 - soil/agents/SentimentCorrelationModel.py | 102 - soil/agents/__init__.py | 166 - soil/analysis.py | 23 - soil/environment.py | 190 - soil/settings.py | 1 - soil/simulation.py | 241 - soil/utils.py | 61 - soil_tutorial.ipynb | 913 ++ test-requirements.txt | 0 tests/test_main.py | 225 - tests/unknown.extension | 1 - 73 files changed, 10998 insertions(+), 5997 deletions(-) mode change 100644 => 100755 LICENSE delete mode 100644 MANIFEST.in mode change 100644 => 100755 README.md create mode 100644 TerroristModel.png create mode 100644 TerroristModel_tipo.png create mode 100644 TerroristModel_type.png create mode 100755 clase_base.pyc create mode 100755 data.txt delete mode 100644 debug.py mode change 100644 => 100755 docs/Makefile delete mode 100644 docs/Tutorial - Spreading news.rst mode change 100644 => 100755 docs/conf.py mode change 100644 => 100755 docs/index.rst mode change 100644 => 100755 docs/installation.rst mode change 100644 => 100755 docs/make.bat create mode 100755 docs/models.rst delete mode 100644 docs/output_21_0.png delete mode 100644 docs/output_44_0.png delete mode 100644 docs/output_44_1.png delete mode 100644 docs/output_44_2.png delete mode 100644 docs/output_44_3.png delete mode 100644 docs/output_44_4.png delete mode 100644 docs/output_45_0.png delete mode 100644 docs/output_45_1.png delete mode 100644 docs/output_45_2.png delete mode 100644 docs/output_45_3.png delete mode 100644 docs/output_45_4.png delete mode 100644 docs/quickstart.rst create mode 100755 docs/usage.rst delete mode 100644 examples/complete.yml delete mode 100644 examples/custom-agents/UnnamedSimulation.dumped.yml delete mode 100644 examples/custom-agents/agent.py delete mode 100644 examples/torvalds.edgelist delete mode 100644 examples/torvalds.yml mode change 100644 => 100755 logo_gsi.png mode change 100644 => 100755 logo_gsi.svg create mode 100755 models/BaseBehaviour/BaseBehaviour.py create mode 100755 models/BaseBehaviour/__init__.py create mode 100644 models/TerroristModel/TerroristModel.py create mode 100644 models/TerroristModel/__init__.py create mode 100755 models/__init__.py create mode 100755 models/models.py delete mode 100644 models_org.py delete mode 100644 notebooks/soil_tutorial.ipynb mode change 100644 => 100755 requirements.txt create mode 100755 settings.json create mode 100755 settings.py delete mode 100644 setup.py create mode 100755 sim_01/log.0.state.pickled create mode 100644 sim_01/log.1.state.pickled delete mode 100644 simulation.yml create mode 100755 soil.py create mode 100755 soil.py~ delete mode 100644 soil/__init__.py delete mode 100644 soil/agents/BaseBehaviour.py delete mode 100644 soil/agents/BassModel.py delete mode 100644 soil/agents/BigMarketModel.py delete mode 100644 soil/agents/CounterModel.py delete mode 100644 soil/agents/DrawingAgent.py delete mode 100644 soil/agents/IndependentCascadeModel.py delete mode 100644 soil/agents/ModelM2.py delete mode 100644 soil/agents/SISaModel.py delete mode 100644 soil/agents/SentimentCorrelationModel.py delete mode 100644 soil/agents/__init__.py delete mode 100644 soil/analysis.py delete mode 100644 soil/environment.py delete mode 100644 soil/settings.py delete mode 100644 soil/simulation.py delete mode 100644 soil/utils.py create mode 100755 soil_tutorial.ipynb delete mode 100644 test-requirements.txt delete mode 100644 tests/test_main.py delete mode 100644 tests/unknown.extension diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 4976979..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,4 +0,0 @@ -include requirements.txt -include test-requirements.txt -include README.rst -graft soil \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 2fc6b44..af3dadb --- a/README.md +++ b/README.md @@ -1,34 +1,12 @@ -# [SOIL](https://github.com/gsi-upm/soil) +#[Soil](https://github.com/gsi-upm/soil) -Soil is an extensible and user-friendly Agent-based Social Simulator for Social Networks. -Learn how to run your own simulations with our [documentation](http://soilsim.readthedocs.io). +The purpose of Soil (SOcial network sImuLator) is provding an Agent-based Social Simulator written in Python for Social Networks. + + +In order to see quickly how to use Soil, you can follow the following [tutorial](https://github.com/gsi-upm/soil/blob/master/soil_tutorial.ipynb). -Follow our [tutorial](notebooks/soil_tutorial.ipynb) to develop your own agent models. -If you use Soil in your research, don't forget to cite this paper: -```bibtex -@inbook{soil-gsi-conference-2017, - author = "S{\'a}nchez, Jes{\'u}s M. and Iglesias, Carlos A. and S{\'a}nchez-Rada, J. Fernando", - booktitle = "Advances in Practical Applications of Cyber-Physical Multi-Agent Systems: The PAAMS Collection", - doi = "10.1007/978-3-319-59930-4_19", - editor = "Demazeau Y., Davidsson P., Bajo J., Vale Z.", - isbn = "978-3-319-59929-8", - keywords = "soil;social networks;agent based social simulation;python", - month = "June", - organization = "PAAMS 2017", - pages = "234-245", - publisher = "Springer Verlag", - series = "LNAI", - title = "{S}oil: {A}n {A}gent-{B}ased {S}ocial {S}imulator in {P}ython for {M}odelling and {S}imulation of {S}ocial {N}etworks", - url = "https://link.springer.com/chapter/10.1007/978-3-319-59930-4_19", - volume = "10349", - year = "2017", -} -``` @Copyright GSI - Universidad Politécnica de Madrid 2017 - -[![SOIL](logo_gsi.png)](https://www.gsi.dit.upm.es) - diff --git a/TerroristModel.png b/TerroristModel.png new file mode 100644 index 0000000000000000000000000000000000000000..e59ff273e297d4b7ce2e3838532a1867c11a0741 GIT binary patch literal 24061 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%0A}I)Vi}81gmahnB{?jN7CmK8SwHHD_xD z_3BTaT>}@8KLihE3I-?5Hrh&ms>j@8>;i1$B=`)>mq6ByZtM zPX2rcN1D{~vn-9Y-U`Qs!=bb@d3AMC49&}XSn7mAm)a;ZT+*@;N$NomC-t~a=X-p} zZF-V$WR!9AB8}!ak~*z?&2w<2PmwO=r|UJtnZv5_kKid1j`M* z=u@MNTfwB81xcdzb|+^C^=^I}4q~qY198kC8C%w#o!8Yj0T#NUyOu2LS4Y9bggW~Z z`^Zi(zw&1yR~s>t%w$MJ#52FsgL?GT%HYTFVH z({1x7J$_T_;H7mw$4+2CTABUs&mLk1iIUE;=~}PdrgQvv;oznoRzSYrJiQS968!Uk z=#u47M%(I;6R%-S{GDj_ZD3)h<-P2zur~KSAXIJwTIh) zD)RbFO79yOO_>(WI*9ciC4hi%@5pmB-+=hiwZPsKNjNGe!Rza`kO%R;*WGC;)oL66 z-X{E!YYMq1x7uTxkXAd&K_~asRWchv)9>xy5fgHoIkXV3cy;@EmO*tHyGE)ijAk`a z_B3V#1LdF&p@Sj7uSA~yaQ7ZBhOy~M@i87OC)azdh^jl@wAu$L<4b2*47YCTe)7P; zK*^JV06-u4RlmMGG|>K~i0sEdby6TVN}%h!Z*4Y=T$Uw2)#~$|Fp_T>0)U$rWYQCx zn%dj`=5m6>GwYZQAjeD>jl2alq_%OIgUKvg!_L>7>~vv}0b{{?ot*pc;^KA(RrnpJ zo{j2Qkvdi$Z&t5@;DSDElckYxxtiv8cJv_F&wvr4n_c~>DIqQKR>0&XkPb{wC<;e0s1`{7)0pU1RjhT=B()fR*-OneI>zSIN=ILAlrGhMjJ;fg-1VS`;c z6&+o8kHuwn_MbI|Uj65ccFoQN4Nub;^``_^YYeN)HqUnKV%HxuZ5Y^D{)asK=7RI3 zNV>g^ja77auK-#?*t;)e{1atw|6bBxrgM~5F03p3L7ksC;#7P16ohEgEPn$3Xbz2U zrbP~5O+|UkyLSS1lVTV-EG*1)tk8s-nmS(ZaZhHNKBe7@D4YiS-#)jj9&>UIaF$q& zeftX_u@YzS8-{aqcl-R#iaYghBMzp$_?i4p1b3JFELR6VuFuq`CD~PVWOCVT#zins z+W{lTaEpTLc^Fc}T~F!{VcBxA{Y`hWcytg6T~+yi_yxprCEypU0BoUdVsf;zv~2t6 zfW7WJf!4zZougj$c-N1LVGL2IgNVUv=hyyz_~)R2R^lIhDEL}yQ0g=0+#z%a2DaRj)b^v)rf*CnH7!j8 z0y88{oiYw~_P1$iek0E6iPuA+f_A_Sh4zJKqw*X~RyapTTlTM8?fn*k%6bPGorz2r zTax)5bs4#@<&{hQI7|DV{IpQyJQ|ckHI}4{!|C>}7{vV>%@{~I-NcV=?CL54wI3JM zbjs`3|Zo`zj6>(Z7JJQ6ny3ZM1+%TwGkIY|3*juf%3F5}(QY^}Bb}x%astkrUI2 z5c~g+HDoM46dxwgQhr|hE>jPcwEkWA#7n1B2M6E7)khg<@Mng4Vt+XDF2C-Tj;G7L zz-wu1t1gfFM-=)$XDeov-!jeJ^lbPZZTLRI(rW>^ztM2ggH+wGI>d(CnSQyq&l@)d_F8>Sw&{?)oW z3Cx5N%PqFx5GcF~ea^;k@WVjBb|93+OL;iOY%qCmJy%-RoGP`s2vPgl+K9(`^1LJ# zJHmH=Shr@Y>D*>Pb8|DM+8a#9l=bOT2=2KH$-76g_Dekx%;B#5ShJn)xQp-}{Y55j zfxt5!cTz{vi<`P~zKe-TFbMem!k^Ip?2EQG$`(hExLNvSqQFBI1NF9fA;@!Za<0D8 zPN?)g-YDN&9SRN!A<)v&s(_Hi$;IV_D%a!j1}LQ?Lv`_D+hnCP^0tZ!cKV}oJ5UAl zYj%_yJn(md=a`tBhO*&YxhTOh4zOw{`vyFwDd)c4?& zW20(zNoRbIc>(wo{1%4bE{V9nZ`l1D8~=+GUQA4kf}I^-_yykiXbl-;dQD9-N2+_k z{@UnnBR*3ha7I9g2IcnmR2SmZn4e!^y&gY8IIwtu{<39SkB!80gXa1;;o4VQ=lkCrLk+mzd)7VACn_Ax5D=X-yl}pN*L5cfhxhm2JpeRV-E&$80)lFaL<~gScrb+O{CS-P zlm@7PEBJ#+tyS2w{-mK6aW710czT`H(bv+C5SZO+ymXeTF0%Z?Z;I?aiS_;fDDM5` z_C}la=rgW~(E_7Bh)9@2JUKz!+%V@*2s*+Kc%J=sXlN)WP}ZTh=y)X~>Z|XmCpbqy z^BjVipFawu=-2UGA72J&O`{eE2m}oU?hMRO9S7dC4i}~ySux& zCZd>Rdm)EgLLyl9%`>V`&3jbtH23l%R<9+(@5t8O!^5LAe7ZGV)60gqAB|y+XjO0GhUO*|-fZWD(`1o?jcptLrKDvLgk9A&{C-xy(b0RMkQ{XsX z10Z`)hKV)MeIV$2;{Gj?LFEM=$ykXM6~?2M;*9Xp?PuyRnI3==fUOSb2?!bXv{uds zmi!>CE(=hYFnStn zxPZrw`Pp`q-}gRI?&X)QTUi|o-mm_vsVl0gzWQ7`d9dkuR_w~}c3{&Jh>m32y%8B%+apTRI?{)jy5Pm|wCt#(g zt@K}sWj=S}lKT$JE7VfM(35z&>e5Ipp=4~sTOoe6#fN|LY;Nk(DvA8ICBeuXf-w3A z<;(4cWYf4(j?~i?6s|tlEEK&@XKIO#=rknn{Y_nUa>)Luil5kfV*(BXa_&9^>jorq zjt*;n@0;%maLo-Jr>JnJxU96Wj9kday?zRML`XS^1efy_$)j*?93$hMNfwuHy!a;Y zr@p@gpV<3{_-CtWqOq;~^&2;y%uJEtX+DqdNWbtc#7GqTV;+)}K{AkG@)_SU7nV>+gzkV0vi6TLW568?8$L z0)E3Lle%#y)N)TMSNZulBqfsoy_!Idz4kb)EuVspZmq~U z6g9wbLw3O$hcj0lm{(fUM03hq!7zeGy#CJ|Dzla1Jz`JRmAFf*@3i>}D`h)i7O2j# z!YPAF*YmT}3kT zERh#B&&?)SreZij;LDe95)(VMHKcViY{F3e|K4O=%ON?rR)kVAFzu)z`M|g_Eje1E zyq+|u$5q7b`wc*_MyN-4H_-E@dcxRMr;L=6-}fiTDYmaR3y5htHodb^3Y3Rt0_)Qw zIOAWvkDL-kWryEgWMJrlTn$<^I|oOwEF5;|-NY2!5L+Mt@4y~j11*xTdi~n8`vOUp zdWtd_(&w4d-K`3&paTPEFy%PNs)yTcOaS;X)db&9+CzGlh)K%~zu=Z3GQDFwZX{Yu12}zoTiz_TFj0n_nLLwqejCDo%0r{9hJt}$9czQ6?SL3leX|fKLWMf!V z5P0$YInun}wuWC!+ZS&#Ym3|ly0Wv=#V-V0AHi3%brY=mYHg(L9S$M3Uz|?vey@Mj zH*CDUit~2ynmJqeI-_SKv{K`h_qR6fQ`{~p$Y+iK5#)k=*7ijw2P(PL<yVmPj+mj@!{qUi3y{~0j*Zyce zXPtr@;`HvH@vMNOpAXtSCy!*zr1VeC^HASoBs(8`wIpXXt7T#S~SQq^O~%Xs#C>Da!w&w(+d?vP@`5yN4;bloatAZ$Lo6Ar$UA0|}{U zKrK1;XsAEku-`OuMNJzl31Rp*RGCla$ow4aA5}UnJt!D}B0EH+_Rdbz^|7Mtje=g` z)^ZRJ$P|Kt98AoB&?uSA-O6s7@o$^^Qa^HZNqY20z3xYS1&6zZ&I^6I1P{a+h(t$M zX(6P$?DmLK0Uj)|8hSESB@D;{)8`123PGx#_Cud?wV{{z{pLzX4b6I!#cjvGzN|-| zqE29+ET#S2-Nm5SfSF8c3xWPKT0d6jBgw6sZw_U31hDJF3%ECAmuT@K^^R(aB`?k< z`rSa)e?OXxiB$f&lZ@Od8J2xW=I?qdd8#$-jGsm^rGSH#as_w}M$*DGNu2)KUzqkn zJq9VyW#dQ8QdgXi<9rKO8yS;KawrwY4ji`r3?(vHs2&E;&w6cClf~WusE$%%^a%XD zF(KrA=spGDPIK|%WQ_a;sGM;Q+!yg5gVZHBQU*MqF$ZYYF0dnWA7xGz>g`q9zS zY68vWj*7}7PY5kOps0L1y|)+99Yw(99ZV|{+{G?7<98-190=#@V<;b1+}UPd4_E_oPn+bH8nM% z07aS9^9{P_J)rpl^A6IUd&c1AJVtdV$wD8G-_@K)m`nb+>yZ1Z$;{FaQNyn9hUQbN zd-tjT(=Wfm1EX}4@Msd2zVDT!P+>PKm9V@D#Q>2?O2P0o)bxHavkq>HmIF{G3@ZHa zf%V$8Ywf+gS-_djPBoqtl>zYv(fWR_o*YQ0z3!>dUkp)t%4lNawesAB!^XG!O5w(TqtQkDm(gbLc5(`UT7-nfvkXv_1op_6|Zh@GmwezF(qLVNpd zo@e^VJKjKWs4rgB*3-MKuTS6D2yKgtF((p;pNosIr*e1h5W+HGD1*yN|8t?x=E4^75JFuX;hxBxR%k6 z--Na}?j(Z;yHq8Y2%h3K$Mz+22cFC|OYkdkusZQUbVqEGUwzKT$Jcu*#GDNsrekGK zA3;J0?y*>a_Gh#2pEP+4s!B$dySls0n*s?jO}>(xoSdmwhl_oG5PuXY6iHVIPTgu& zjD0Grm#ytvwX2Qr6x~qMcb_bv_qp(bqdAhT(3$gOOU7jS!pHpr!yaIX?OSuroZQ?CP&w7v#JWIDoxF>_0O*9^ z+_{{Csx=OiS)}6kGhtg~+|)TE zH7Ak4k~-QZ>n)!5a8CmVAD^2zu9i5#{sIHzKHlT^n zmrKRHNA8ALSGcJvmPhqLfLO0+;clLKIrNqPrk}V4i3_5*PWcZ{H12$2bJ6KmDeX-- zPu;WSNC6?C=z{vQM9{e2L`UC(c4Q-;{qs<5xgsJGD`@sj04mY3JP&Syq=ZSmmo8nh ze2UoS%tyrkIx+MtuR{1gp0E}rUWd5wbv#D?;pMgaNy77%+=1QxAAY>l!l*pbP(}wi z3X_S_pH7tRt&K)ugubKYG$CVuXRL+gG{01qTR{TQmVgnf-@bhd`V1L6SJ?*kBSyV| z_u~o(eNPi9L|6H!l&y{g*MkZh7Q|>t%{L+8vP%SNRW~1VdZYRKlC{C4FFjB)PKKiW z|D&iYq47Jp<~Z&mSM1pl4DSAIaSETAMiT37&dq4|UHhh}w>sH9zOFT7VywH{=KmAB5YNlu zT90}&^N07lc1y8+(r$)e{E-fk|Jl!redx+PJDpvVS?K+#8#~2CjAnW~IUH@JMNXZy z9i3I{N_*MCUyF0#-tf~h4GxItJ>aY-@V}U9jq`c)Pe|8qUd$B@TBYk*N~UB{u|y56 zW{7ZSyM`ANQhvUe4_<~3esvS3Azi-CEvWWo{nvC2iwTPyH6!=qV~w_)XA-&xD5xys zjJ64Rk~|WlyNS5pw{voYiSVxgk#uzI`}v)nq^VR0$A>?>j$=GtX2gWY$H)ION7@Lv zFK}|~d=Wixv|Lr5UgFt!4;C6D%%?5pIh-Z@*nL&aFD*`d@>G~su5NOdjV*>PQ!#r` zur8xbS*quy&wEXktEIPktM}a);8h)gk6esdDs+q3J-xJvX!=a}UUySWUg6_Ha`y4j zpgr^uIX^qox=XGvH3BR1;BL<{6})C96wyuZb*}%t6Uh6EEIPSvDXa^(WB6hP3QpIFmJhrrgZsPKQhaFuJ)ls z_6zY*Z-1lpvjC!u0N02g1K09Dwy8*~$=_Nzd9-{yEVPF9grtU4NA??4q@g7b9)62U zp~o|u{D2N;suIyySC}lU(e>No2n;%U+^^(pAm^ zsi%Ivnld)$Mz91vwKDgOc<|j>?X8ZBBx+Cf`rqdo-=sLyAOdc&R33|y)fPHZ6AqZX zyDz3!ecWz!d~s7h3XQOQ;^X2%cBMj>y^D((56E1`63wCuzzCYBw84hwtF|c zb$%1i&^5@!SUbqi;D-?z3FWMNo%2<=Nh1FX`mJRhME#RJ&gzY-_HOE4zCBF%-tC9$ z*P|_qn>;M~Q}fnQv3k5L?;Qs6dJkqkUxE*1)?G#X!PZ4cb)ERtFIHh!fc(17mL2ra zz!|--ys6N<6_lD+ROR^!PeovnH#mT)`?DPIAxYvoBC+Cdf;?1APwj3F{Au-Jh@NNap&(Mbbc(g6L$7cB^vr8P>{@T@lRl9WFicbMrqx?Y)zfa}0;28SlM|Y9w-YhAtM<`wX|g zpnKfCs`JO{i6lYz^IH?fZIs0z4pMA$6ZzNKq7Uvq_?awOpxHCJzTxxUndUHDYI&;u ztml}Dmj2fOr426+QPt$UcfDt9Whu;ecnSB0QCXYtsfxyOp%sb2k6&2n0X~m=O%@xi zUP$XDrP3Yg zo_Mg)km~Iwj{j{WBZ1+U98P#ZhJ!AgYu5wMy%j+^n3&rKya7o;DFjP{!Bf6S$e{7JR!Nr!?PEXK z(evgT4ldiT_N3KuS>e&z-f&1DfvuFu&B5{L7h-3B%l?ul_d87d?>ee?_oVeS?q&tNm3 z_&D)bM5Hw zsjCqd{}Fb$m-r|OOeceIsE|)O`>+>%aFpLCD6sOQf?F*kk&@b+WueI(5&Lv^a2bJ= zn8KkTX^h2xBqLgl={QUSJ=#V&>XvWht`9GEy3OH1V(e%|d1cV^+A<292FNSuS?>Z1 zxYYaR;qC-N47#8B>JCjmWMtgAeR~$9A!bZ-vLJ|rujoW04-efxeE5K=kU*O=yNw2)D!LDLhpX ztLRzBv|xI_g-$SN47>)VwEOw`9Um0JLGxMul~Vxak#?VM%#}5efxAzRb{{}l>i7VK zxw3Yx=$G}Ug&q6+YCq|uy(==T)3wsVGH)$NE`M^M@h;zWNa@NIC3$os>3Q!#j%C6_ z%-!UIoe4yR!`w}%8>m5f7K()DpuCPjMC-Q8@=YR15#z;{yHEod0Hxh?Z>16BC%rmv zabTL)EB`n`k}ONKiXUvC)7^ci;5^?zb}_k(%a;Ga8-BPkFJr1%Gu&ScOto&{w(#NzTY z)qn7`*?;i#g2#V*7MFDz6|YK?niRe6ulvU2#(V0j(0LxNd#0432cz8(qD+O(EACcP z)_EFoa@kpdM|Kxz3@d^#@$2HbkiP{^OkX_c62Dwhq3Hl4zWIL4%yj?MWbFhi;v|TJ zJGzoV+T3Vat*&INM-iry$f)Nt%s;%VYS4_t8>Z=EsjZ<1>K3 z|5Y6~pZ@pKo8!;rwg1*KCG3e8EEyVv{m%M^PbWl6`Jr#xQab;jV;NEFDRbkZu2B2W zsJXF(;0+82a)C+OBIw$Z?CUx(4XG|J*Wu*2V@mE~mE*n20%yM0UAbJ>&5On_Bb{h9D@Gz;_|(n@=l9LH~MIY8UTx4GtE zs4SW`2H;xyob|ap(?gF6AIvmdz$PRlIvNJm1L?cAv5UlVsX+3r0td~j2C~fNth&V_TjtYVh0|!4k###GhdF_fd<;g*#MQ1D)lb+S(EJFQ* z54)%3eQDOQ;2>{=Aphff)j6MyuiOl=*58QoF*=m)%kv=hhl|*tGJn~xEPQRuXE&!W z*t!Ewd<)GUngL(= z2tE&J4_3lrZkXjHPx`eUZy0a&H|QIxz^gCn_+hQU-DAhKrbh{Nz7lYBp79o#oju#V z6QcTQfQ?^roZzcegD~GX^_-x?kSy|CuGf&bEap2Dk^x9h=)7yHvt2$mBJ@X3 zZ5#RS4%q7*3`u;*)l^*-dYOGJ<@4>CpI;BU+--S4^WD)|+sxD*2||{0CadJPnRx<; zDX-ihp2gF=C$CxYBGS+?;ZjV4|0Q3`MJ{HyngDkc@dtvgv2jdF&YbXzBFr?uA9M0?OX`B~d4J z&yzDIDPxG4Myg}??DWoELvuT6*m&RD$o`r0-pG9GCj+z(-Ku9<&I_McJvHZw^4k$R zUwU4Dd{cS47FtYJog6cK`LDFwUC!(JtRt7$9@K_WzZ`_T}?-)RSnBTt_>*#H}76u zH#j#@q6{nAJ`N~+YIPY+skQbr-+8oXHXL^nJ#b3@MNB?8mf^5V&2Mg?F3Rw`dEZ5| z{?E$@=X%L+9kjYHy!+UPHk~R=vX)POam=kSImbS#PqsTeJ&x*LjM(iEPJ1Z$tW$>)96( z@Sh^hxNt*{nEs6Z>vFsS<`Rn$Xn2;{Y3Q}rH$Q52QPHK%lBJzI5Bov%c7nawWl>Af zm0|o78?jyFE;5yui_z}1c=?nA?PH{91!$4Lwz> zkJ8AlPwPR8Qp@hoEzypZqyb}W>9d%M6@jXfhz0>>OFy9+67L_peR3{X^j*Qj57_`B z8sr-K z^@RLZ8qV^0hxtz&IMy+Mp^BJc-s^QJ_tZ}j#+q^zgm;>|`GQw2uunFuuOMv8<4m$Oy457F|T70hn-wWQd3kpgNNtvJHSLp3Z;w2 zKPl{+^n^7@j0a*S@$THFM98aySNi+d*`v5;wkR^1=MEElU$$SnkbF07$88O}vA`^F>^G%!sczg^(4R?Yu}ly?iH@Y|{BOU0hC7s9O98+HhZQE%It zDh^m4Cy&Q`-wjUk9Q^ncN8$0XRFSQv@gz~5De)d7c2JiycSY9VI_BmZZ3hi+SIemB-O@A}f5c}nJ{kUm2S z{CWUjfg1NlrFs2&S_4UK^7krY#z$|Jbn?2^-_k028@Y?oX>H;YAMSa$pW=yCjjnfM zUJI_F>R$uJI9IYDT}=glhFV8pIb+Hq?z;m$g}{yn&2fFI94oHJ*3R(j{)+gvRc81qWh;2ng!sxq-f39=d}w)NIP}^&1%9!Q7G>?@v{SUDuBF zrJ%_POonrR=7XErhvOyST{|dr;|iLp7;`hd@(PjvAag3cqxhYttXFw*<~x>`U zY;EDKxG@p%m;8Z4RkSHDNdcnnnXa92(k8gvnU%D%ob zAdqHeXM2?^C@DolYl^yhWM~X-P^JilYV|O9xpR)&?lZXrSek2IA7&9n6cl}jWA^@krV@ z$-?`DN1O~=QrPnOH5dC3Z)6)Mrwh*>^w7a^^KE^L+|q*DN;sH?;$~rKTz`8K+hbw& zdqt)s(xEV?Fd6-T>PAlB$-Dkohhy)tgC1!sD=XPQ z&)&a(54GT7uMQ0r)Y2l@OM|ECv3yQh8Rq^K}_qQ|_2!+@T!hTslqwIbwM(gccVU z7h<20n#y>MAq@WKO=_lrfB&SWpYVYLmK5kdOpaa0~&-LUV~0*dWTQXMT{<;_awF%itI$W^&%! z0agJH5BQ?w=vPZ4kJsnAOizYKni#Xrhvh}&#^?!kZ>WTO(!}jNP^>)gmOt-s(KGvZ zJ*bN!lb5RIW*(f_3>bO1qs7X}#Hi3Z(zJ3!re;~SOS>0ldyk$uDm1rAFsyO=lmz!N zPa!c^oA||n+mGd?La5oWnQ0*ocPkuvLL+g)GVsu3N3^@=HC;5$N%?^*RX}(wUorxY zp)uu2uaQ$oXOq4|T;VsC_FQif#1X1QC+a*N`?)6+*D~gFh`_oqSWoI0eyQqlW5hN* zMxNX+is|W?`B{vb=J3nax94Uk_3UsOyB%dIy09L5p`VJ6sXJeDZ%ec-**jDrYSk^8 zINE{3`q8`D?i%WfC}OyvJf3(nn+AALpVPinGt^3~a`MhPb#S*Wu`K76)!uV9Qw+J$ zvUk1@1UR&DE$l|Skdp}eLUu2y{&lM9dx%j6s`ZJMS7EJRY|IHQO=+JA8*r z$&j}LC8ty*p3R~3;@w+>2K*g-&oFA@a0VsajB;YwPLAv;I+`yf;U7IUM&fenfX()$ zGW@y*8>KyWtLpDBOL>NDN{QT;Ln-EIZghUKc@d1ousv)c@0*UZ5oo@(``2!A{E3s` zR~lsDsMY)T1hNXB+J8^M)mPZ5-*hlVRl2afq{H3iPVIjHI~P&&Yq9T`up2^U*Bhp; zCb1PT#8k>x9bvmo{xb=30-yY(p=Z_>F&`R2Y2A&&@SXge(H|QfCHztPc*i7@%#D#f z8RS-V#|Xl{3+;hq&Uv3KB(JT@Wi@f3LLZ^~e)iRV4tar3PVHZCFt<}eC1O?Vx5U1U zxYi}J&TZ948kUfluPqJ0Zx3R-wYin|MDRNz-dd@@XW{I!12==fk_7pcU+~7yW^Yu) zyu62TqSLh{MF!tQ5&1_v^o8jhWt-}P6vM8mwYNt%{jT&9Ki9#t(BuzeplAILqYD*! z%Dq%}+Y3#p#%p}VHKkUB6qaee_sx&Z;6?wnStn_hG*E>7`d8QF$3s%2CzjownG8r_ zrt>=*=~HCT2c6zlF1FY;}aanw*Nf_#c#R{aUhPoNpS(dQLg3R&$V`b>a~9 z_;}^W9wix#egRcFZOjDxa|hfB!1t#2cW?{N6+SPSSf+bDY@e+xS48^9r1nEkVNIx^0& zUh`JWUzKlXhz~MH%Onr}IW?uu1^L1A*5eJDFJOdBXNo$ci?YYpr2gjkp|QK%iJ?~Ntkg2f z&xuRQff1w`jlsGMGB4+CN3GwNC|1OTGlwY>2xwXH&osK*Y~9+GH`|H?y_2WTJX~hl z#Ux)~%Xa(v$$vj?dcTEYWkmmyZ$0e5i)V8J6ETsIGzGNdg44;ghwR9Gk{BQK?;Avz zw$HTn;X-y1ZtQDwOXpb|vz;_S#x{z|D&M%E9(Uml5zHmtKcDrX@z~E9YPzHJ^46oP z=!zS7iY1*sgVy8TdpRuNY9yVuAC(u!1pe-y2RDR6$n0Q?9=(6=TvrqHlUTllt zV9f_)TS%J-W_Rm*3H&|BNduPMPZ&)&Us~m1S2?n09N}5wNyN`>$9aq~jBs#MeR3mn z8B?EvKGk>(F9E)kh)o^!?MGUVZH~{Y@{zAK$5X%kkSkl*)75tz()L^MscCD1tHvYP z^HsS}Wp~j*oCxJ*EIYF2b*@JKx}#GS9h};dV2o4!%fI*s3+qtRC~{iqBJUZSHeSLk&85!^Uo}OYgLkd9V%CSCkt`!IunVXo4Iq+u zuym2v3B>r6KN@arl8MgTFF2R)pH_TiL7kzRxNCXVI&-q z>}<`l8kfHbPlruB&7U~3bvaItG^5x&&qRC2fexD?@4kzP=}}=};piF&TfThxBE2pL z`?koas9(Q!c-Uq!5cbB#74zcQ=+={fT*7ch-QhX`6$a)t2G0$kpFQ21qPF96+|H7lQ$@XTg$Utc4URxD z*3WyV+$CkApoNC}@xuoNOqoFmj6yrC1l~eZ23##UFE9@>!YF}RHHv6=oY{+fZ7W5%2i{^x!hajy+#4Qj;vW^|tt+fTDt_1NPSSoZ% zOJPmS%AoMyQY>gWhTqy0!aTkAr;*)mC6(W8#)P;iQ{$dVb=M~@`uBj8O zrG?bgM$_b6Q({f&rJF6P-5yZzBMb6ygT({E{DH8r{(VCC%9X%ElwP7V;;WmK8o>J043p9+1&&=e*zhlt@`uDhP@Pb@bppc}Dj6z+&lE-r!LjQ}k zVb=ucQ}9GRY#dDkLA4!Rwu@dl5F$1-E6@;=gE8I7&R!%sf~%piv6z_H>$Z2#h1At^ zAj1YV;h?gF9Js1-1q&rLs;#}97807iySsZs_0kYt45$>BEru^XwHEc)jzO^x{hp_t z2P|Rc0aq#X~w|7puzsrTH{E$JtNeTCZ?tz zD;)G8a1l27&HMM~GZYYAGai5^u*VD+Od&xl>f zdSxgLApvjugXK^08Ydl8h2!Lbf(txBQ^CpNc2<_Vza`BaoQDChfK{#o?ECgP`YWaQ zfV4Jvi~_h9X#AA@X4{|}qy;Eu?EMV^BJG-x`*7tUaq;PTw$nN~I&H6BJutanmFeNM zjppqFDX>MA3m2#r^FV$*x&X)_tQKC-I}3VUv=BPwr8wPRd;rvONP>qIEBiV%5GMC+ zXJ`J47inSJn{1#21kVl#3nbP_By6Tp!Ei$?NIAWR98${zmTXrkS7E!x_P?j*4rNep z#enxFMMYdv(jFenZ1S&zpQWflT62ZN`}OsSq|;~4JgZR$*?w|za*%sdFvSDSr{x!vlS275{l4pt`nZ$C}ikHJU_e7;bPjF)=Cg98&{us+1arhD#v}ZAGMi z4O&lGa6%)0$kKOk5CK(j_)tE5JV@8q7KwA)nSfu~+8zWC5@Au%wRJf_f0n72oEg$mQz8l3f;fXTU?Sc@$oBaS2=)^1FbSJihr+kYh8A91WmWTi3um- zu_YyyP*hU)ZgMuG6v4}2((b0E>4A@_XVbPkaFR{{RkdbYsKJV(M{DXeOXN51ta%iW3sSm9#QG{DabUM>D{29J4#Z0G(f c-*)UUk^{yhgS5=^z`q@JTE|GcL=zkFKLavhGXMYp literal 0 HcmV?d00001 diff --git a/TerroristModel_tipo.png b/TerroristModel_tipo.png new file mode 100644 index 0000000000000000000000000000000000000000..dba3c6e1ca599d57be90326e7faa4a9f5cea326b GIT binary patch literal 15388 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 YtA0;@X}BB*5}?SQP&}S^)bPfC10>8W00000 literal 0 HcmV?d00001 diff --git a/TerroristModel_type.png b/TerroristModel_type.png new file mode 100644 index 0000000000000000000000000000000000000000..68198c09675696f785339fdb48e118491e6d2239 GIT binary patch literal 16647 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 EKWsiThX4Qo literal 0 HcmV?d00001 diff --git a/data.txt b/data.txt new file mode 100755 index 0000000..e1e4337 --- /dev/null +++ b/data.txt @@ -0,0 +1,8802 @@ +{ + "agent_0": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.08880030965403382, + "2": 0.12880030965403383, + "4": 0.20880030965403384, + "6": 0.4288003096540339, + "8": 0.5188003096540339, + "10": 0.648800309654034, + "12": 0.648800309654034, + "14": 0.648800309654034, + "16": 0.648800309654034, + "18": 0.648800309654034, + "20": 0.648800309654034, + "22": 0.648800309654034, + "24": 0.648800309654034, + "26": 0.648800309654034, + "28": 0.648800309654034, + "30": 0.648800309654034, + "32": 0.648800309654034, + "34": 0.648800309654034, + "36": 0.648800309654034, + "38": 0.648800309654034, + "40": 0.648800309654034, + "42": 0.648800309654034, + "44": 0.648800309654034, + "46": 0.648800309654034, + "48": 0.648800309654034 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_1": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.15809591017204133, + "2": 0.2780959101720414, + "4": 0.5580959101720416, + "6": 0.6480959101720417, + "8": 0.6480959101720417, + "10": 0.6480959101720417, + "12": 0.6480959101720417, + "14": 0.6480959101720417, + "16": 0.6480959101720417, + "18": 0.6480959101720417, + "20": 0.6480959101720417, + "22": 0.6480959101720417, + "24": 0.6480959101720417, + "26": 0.6480959101720417, + "28": 0.6480959101720417, + "30": 0.6480959101720417, + "32": 0.6480959101720417, + "34": 0.6480959101720417, + "36": 0.6480959101720417, + "38": 0.6480959101720417, + "40": 0.6480959101720417, + "42": 0.6480959101720417, + "44": 0.6480959101720417, + "46": 0.6480959101720417, + "48": 0.6480959101720417 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_10": { + "fstatus": { + "0": 2, + "2": 6, + "4": 6, + "6": 6, + "8": 6, + "10": 6, + "12": 6, + "14": 6, + "16": 6, + "18": 6, + "20": 6, + "22": 6, + "24": 6, + "26": 6, + "28": 6, + "30": 6, + "32": 6, + "34": 6, + "36": 6, + "38": 6, + "40": 6, + "42": 6, + "44": 6, + "46": 6, + "48": 6 + }, + "radicalism": { + "0": 0.8035297540281455, + "2": 0.8535297540281456, + "4": 0.9035297540281456, + "6": 0.9535297540281457, + "8": 1.0035297540281456, + "10": 1.0535297540281456, + "12": 1.1035297540281457, + "14": 1.1535297540281457, + "16": 1.2035297540281458, + "18": 1.2535297540281458, + "20": 1.3035297540281459, + "22": 1.353529754028146, + "24": 1.403529754028146, + "26": 1.453529754028146, + "28": 1.503529754028146, + "30": 1.553529754028146, + "32": 1.6035297540281461, + "34": 1.6535297540281462, + "36": 1.7035297540281462, + "38": 1.7535297540281463, + "40": 1.8035297540281463, + "42": 1.8535297540281463, + "44": 1.9035297540281464, + "46": 1.9535297540281464, + "48": 2.0035297540281465 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_11": { + "fstatus": { + "0": 1, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.6009401979934893, + "2": 0.6509401979934893, + "4": 0.7009401979934894, + "6": 0.7509401979934894, + "8": 0.8009401979934895, + "10": 0.8509401979934895, + "12": 0.9009401979934896, + "14": 0.9509401979934896, + "16": 1.0009401979934895, + "18": 1.0509401979934896, + "20": 1.1009401979934896, + "22": 1.1509401979934897, + "24": 1.2009401979934897, + "26": 1.2509401979934898, + "28": 1.3009401979934898, + "30": 1.3509401979934899, + "32": 1.40094019799349, + "34": 1.45094019799349, + "36": 1.50094019799349, + "38": 1.55094019799349, + "40": 1.60094019799349, + "42": 1.6509401979934901, + "44": 1.7009401979934902, + "46": 1.7509401979934902, + "48": 1.8009401979934903 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_12": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.07120438914023139, + "2": 0.1512043891402314, + "4": 0.4312043891402315, + "6": 0.5212043891402315, + "8": 0.6912043891402316, + "10": 0.6912043891402316, + "12": 0.6912043891402316, + "14": 0.6912043891402316, + "16": 0.6912043891402316, + "18": 0.6912043891402316, + "20": 0.6912043891402316, + "22": 0.6912043891402316, + "24": 0.6912043891402316, + "26": 0.6912043891402316, + "28": 0.6912043891402316, + "30": 0.6912043891402316, + "32": 0.6912043891402316, + "34": 0.6912043891402316, + "36": 0.6912043891402316, + "38": 0.6912043891402316, + "40": 0.6912043891402316, + "42": 0.6912043891402316, + "44": 0.6912043891402316, + "46": 0.6912043891402316, + "48": 0.6912043891402316 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_13": { + "fstatus": { + "0": 1, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.5854833303883875, + "2": 0.7554833303883877, + "4": 0.7554833303883877, + "6": 0.7554833303883877, + "8": 0.7554833303883877, + "10": 0.7554833303883877, + "12": 0.7554833303883877, + "14": 0.7554833303883877, + "16": 0.7554833303883877, + "18": 0.7554833303883877, + "20": 0.7554833303883877, + "22": 0.7554833303883877, + "24": 0.7554833303883877, + "26": 0.7554833303883877, + "28": 0.7554833303883877, + "30": 0.7554833303883877, + "32": 0.7554833303883877, + "34": 0.7554833303883877, + "36": 0.7554833303883877, + "38": 0.7554833303883877, + "40": 0.7554833303883877, + "42": 0.7554833303883877, + "44": 0.7554833303883877, + "46": 0.7554833303883877, + "48": 0.7554833303883877 + }, + "status": { + "0": 1, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_14": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.42252345656789614, + "2": 0.42252345656789614, + "4": 0.42252345656789614, + "6": 0.42252345656789614, + "8": 0.42252345656789614, + "10": 0.42252345656789614, + "12": 0.4625234565678962, + "14": 0.5925234565678963, + "16": 0.6425234565678963, + "18": 0.6425234565678963, + "20": 0.6425234565678963, + "22": 0.6425234565678963, + "24": 0.6425234565678963, + "26": 0.6425234565678963, + "28": 0.6425234565678963, + "30": 0.6425234565678963, + "32": 0.6425234565678963, + "34": 0.6425234565678963, + "36": 0.6425234565678963, + "38": 0.6425234565678963, + "40": 0.6425234565678963, + "42": 0.6425234565678963, + "44": 0.6425234565678963, + "46": 0.6425234565678963, + "48": 0.6425234565678963 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_15": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.2126113364252416, + "2": 0.3726113364252417, + "4": 0.3726113364252417, + "6": 0.3726113364252417, + "8": 0.45261133642524176, + "10": 0.692611336425242, + "12": 0.692611336425242, + "14": 0.692611336425242, + "16": 0.692611336425242, + "18": 0.692611336425242, + "20": 0.692611336425242, + "22": 0.692611336425242, + "24": 0.692611336425242, + "26": 0.692611336425242, + "28": 0.692611336425242, + "30": 0.692611336425242, + "32": 0.692611336425242, + "34": 0.692611336425242, + "36": 0.692611336425242, + "38": 0.692611336425242, + "40": 0.692611336425242, + "42": 0.692611336425242, + "44": 0.692611336425242, + "46": 0.692611336425242, + "48": 0.692611336425242 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_16": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.1743730559361031, + "2": 0.2943730559361032, + "4": 0.59, + "6": 0.68, + "8": 0.68, + "10": 0.68, + "12": 0.68, + "14": 0.68, + "16": 0.68, + "18": 0.68, + "20": 0.68, + "22": 0.68, + "24": 0.68, + "26": 0.68, + "28": 0.68, + "30": 0.68, + "32": 0.68, + "34": 0.68, + "36": 0.68, + "38": 0.68, + "40": 0.68, + "42": 0.68, + "44": 0.68, + "46": 0.68, + "48": 0.68 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_17": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.49396896059319867, + "2": 0.49396896059319867, + "4": 0.49396896059319867, + "6": 0.49396896059319867, + "8": 0.49396896059319867, + "10": 0.6539689605931988, + "12": 0.6539689605931988, + "14": 0.6539689605931988, + "16": 0.6539689605931988, + "18": 0.6539689605931988, + "20": 0.6539689605931988, + "22": 0.6539689605931988, + "24": 0.6539689605931988, + "26": 0.6539689605931988, + "28": 0.6539689605931988, + "30": 0.6539689605931988, + "32": 0.6539689605931988, + "34": 0.6539689605931988, + "36": 0.6539689605931988, + "38": 0.6539689605931988, + "40": 0.6539689605931988, + "42": 0.6539689605931988, + "44": 0.6539689605931988, + "46": 0.6539689605931988, + "48": 0.6539689605931988 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_18": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.09014238039585168, + "2": 0.2501423803958517, + "4": 0.59, + "6": 0.7200000000000001, + "8": 0.7200000000000001, + "10": 0.7200000000000001, + "12": 0.7200000000000001, + "14": 0.7200000000000001, + "16": 0.7200000000000001, + "18": 0.7200000000000001, + "20": 0.7200000000000001, + "22": 0.7200000000000001, + "24": 0.7200000000000001, + "26": 0.7200000000000001, + "28": 0.7200000000000001, + "30": 0.7200000000000001, + "32": 0.7200000000000001, + "34": 0.7200000000000001, + "36": 0.7200000000000001, + "38": 0.7200000000000001, + "40": 0.7200000000000001, + "42": 0.7200000000000001, + "44": 0.7200000000000001, + "46": 0.7200000000000001, + "48": 0.7200000000000001 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_19": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.4731752191572189, + "2": 0.4731752191572189, + "4": 0.4731752191572189, + "6": 0.4731752191572189, + "8": 0.5131752191572189, + "10": 0.5931752191572189, + "12": 0.713175219157219, + "14": 0.713175219157219, + "16": 0.713175219157219, + "18": 0.713175219157219, + "20": 0.713175219157219, + "22": 0.713175219157219, + "24": 0.713175219157219, + "26": 0.713175219157219, + "28": 0.713175219157219, + "30": 0.713175219157219, + "32": 0.713175219157219, + "34": 0.713175219157219, + "36": 0.713175219157219, + "38": 0.713175219157219, + "40": 0.713175219157219, + "42": 0.713175219157219, + "44": 0.713175219157219, + "46": 0.713175219157219, + "48": 0.713175219157219 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_2": { + "fstatus": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.8271650258338952, + "2": 0.8271650258338952, + "4": 0.8271650258338952, + "6": 0.8271650258338952, + "8": 0.8271650258338952, + "10": 0.8271650258338952, + "12": 0.8271650258338952, + "14": 0.8271650258338952, + "16": 0.8271650258338952, + "18": 0.8271650258338952, + "20": 0.8271650258338952, + "22": 0.8271650258338952, + "24": 0.8271650258338952, + "26": 0.8271650258338952, + "28": 0.8271650258338952, + "30": 0.8271650258338952, + "32": 0.8271650258338952, + "34": 0.8271650258338952, + "36": 0.8271650258338952, + "38": 0.8271650258338952, + "40": 0.8271650258338952, + "42": 0.8271650258338952, + "44": 0.8271650258338952, + "46": 0.8271650258338952, + "48": 0.8271650258338952 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_20": { + "fstatus": { + "0": 0, + "2": 0, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.13553780592089704, + "2": 0.21553780592089705, + "4": 0.6555378059208974, + "6": 0.6555378059208974, + "8": 0.6555378059208974, + "10": 0.6555378059208974, + "12": 0.6555378059208974, + "14": 0.6555378059208974, + "16": 0.6555378059208974, + "18": 0.6555378059208974, + "20": 0.6555378059208974, + "22": 0.6555378059208974, + "24": 0.6555378059208974, + "26": 0.6555378059208974, + "28": 0.6555378059208974, + "30": 0.6555378059208974, + "32": 0.6555378059208974, + "34": 0.6555378059208974, + "36": 0.6555378059208974, + "38": 0.6555378059208974, + "40": 0.6555378059208974, + "42": 0.6555378059208974, + "44": 0.6555378059208974, + "46": 0.6555378059208974, + "48": 0.6555378059208974 + }, + "status": { + "0": 0, + "2": 0, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_21": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.13966398522048593, + "2": 0.4696639852204859, + "4": 0.619663985220486, + "6": 0.7196639852204861, + "8": 0.8196639852204862, + "10": 0.9196639852204863, + "12": 1.0196639852204863, + "14": 1.1196639852204864, + "16": 1.2196639852204865, + "18": 1.3196639852204866, + "20": 1.4196639852204866, + "22": 1.5196639852204867, + "24": 1.6196639852204868, + "26": 1.719663985220487, + "28": 1.819663985220487, + "30": 1.919663985220487, + "32": 2.019663985220487, + "34": 2.1196639852204866, + "36": 2.2196639852204862, + "38": 2.319663985220486, + "40": 2.4196639852204855, + "42": 2.519663985220485, + "44": 2.619663985220485, + "46": 2.7196639852204845, + "48": 2.819663985220484 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_22": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.470841683280595, + "2": 0.470841683280595, + "4": 0.470841683280595, + "6": 0.470841683280595, + "8": 0.470841683280595, + "10": 0.590841683280595, + "12": 0.7108416832805952, + "14": 0.7108416832805952, + "16": 0.7108416832805952, + "18": 0.7108416832805952, + "20": 0.7108416832805952, + "22": 0.7108416832805952, + "24": 0.7108416832805952, + "26": 0.7108416832805952, + "28": 0.7108416832805952, + "30": 0.7108416832805952, + "32": 0.7108416832805952, + "34": 0.7108416832805952, + "36": 0.7108416832805952, + "38": 0.7108416832805952, + "40": 0.7108416832805952, + "42": 0.7108416832805952, + "44": 0.7108416832805952, + "46": 0.7108416832805952, + "48": 0.7108416832805952 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_23": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.14790005774497247, + "2": 0.34790005774497257, + "4": 0.3879000577449726, + "6": 0.5579000577449726, + "8": 0.7679000577449728, + "10": 0.7679000577449728, + "12": 0.7679000577449728, + "14": 0.7679000577449728, + "16": 0.7679000577449728, + "18": 0.7679000577449728, + "20": 0.7679000577449728, + "22": 0.7679000577449728, + "24": 0.7679000577449728, + "26": 0.7679000577449728, + "28": 0.7679000577449728, + "30": 0.7679000577449728, + "32": 0.7679000577449728, + "34": 0.7679000577449728, + "36": 0.7679000577449728, + "38": 0.7679000577449728, + "40": 0.7679000577449728, + "42": 0.7679000577449728, + "44": 0.7679000577449728, + "46": 0.7679000577449728, + "48": 0.7679000577449728 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_24": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.09745274067666362, + "2": 0.17745274067666364, + "4": 0.2974527406766637, + "6": 0.4274527406766637, + "8": 0.5474527406766638, + "10": 0.747452740676664, + "12": 0.747452740676664, + "14": 0.747452740676664, + "16": 0.747452740676664, + "18": 0.747452740676664, + "20": 0.747452740676664, + "22": 0.747452740676664, + "24": 0.747452740676664, + "26": 0.747452740676664, + "28": 0.747452740676664, + "30": 0.747452740676664, + "32": 0.747452740676664, + "34": 0.747452740676664, + "36": 0.747452740676664, + "38": 0.747452740676664, + "40": 0.747452740676664, + "42": 0.747452740676664, + "44": 0.747452740676664, + "46": 0.747452740676664, + "48": 0.747452740676664 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_25": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.10542251799583074, + "2": 0.18542251799583076, + "4": 0.2654225179958308, + "6": 0.3454225179958308, + "8": 0.3454225179958308, + "10": 0.3854225179958308, + "12": 0.4654225179958309, + "14": 0.545422517995831, + "16": 0.625422517995831, + "18": 0.625422517995831, + "20": 0.625422517995831, + "22": 0.625422517995831, + "24": 0.625422517995831, + "26": 0.625422517995831, + "28": 0.625422517995831, + "30": 0.625422517995831, + "32": 0.625422517995831, + "34": 0.625422517995831, + "36": 0.625422517995831, + "38": 0.625422517995831, + "40": 0.625422517995831, + "42": 0.625422517995831, + "44": 0.625422517995831, + "46": 0.625422517995831, + "48": 0.625422517995831 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_26": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.2335518690523134, + "2": 0.5035518690523134, + "4": 0.6035518690523135, + "6": 0.6535518690523135, + "8": 0.7035518690523136, + "10": 0.7535518690523136, + "12": 0.8035518690523137, + "14": 0.8535518690523137, + "16": 0.9035518690523138, + "18": 0.9535518690523138, + "20": 1.0035518690523137, + "22": 1.0535518690523138, + "24": 1.1035518690523138, + "26": 1.1535518690523139, + "28": 1.203551869052314, + "30": 1.253551869052314, + "32": 1.303551869052314, + "34": 1.353551869052314, + "36": 1.403551869052314, + "38": 1.4535518690523141, + "40": 1.5035518690523142, + "42": 1.5535518690523142, + "44": 1.6035518690523143, + "46": 1.6535518690523143, + "48": 1.7035518690523144 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_27": { + "fstatus": { + "0": 1, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.505345212696026, + "2": 0.555345212696026, + "4": 0.6753452126960261, + "6": 0.6753452126960261, + "8": 0.6753452126960261, + "10": 0.6753452126960261, + "12": 0.6753452126960261, + "14": 0.6753452126960261, + "16": 0.6753452126960261, + "18": 0.6753452126960261, + "20": 0.6753452126960261, + "22": 0.6753452126960261, + "24": 0.6753452126960261, + "26": 0.6753452126960261, + "28": 0.6753452126960261, + "30": 0.6753452126960261, + "32": 0.6753452126960261, + "34": 0.6753452126960261, + "36": 0.6753452126960261, + "38": 0.6753452126960261, + "40": 0.6753452126960261, + "42": 0.6753452126960261, + "44": 0.6753452126960261, + "46": 0.6753452126960261, + "48": 0.6753452126960261 + }, + "status": { + "0": 1, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_28": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.06103253863394516, + "2": 0.40103253863394517, + "4": 0.6310325386339453, + "6": 0.7310325386339454, + "8": 0.8310325386339454, + "10": 0.9310325386339455, + "12": 1.0310325386339456, + "14": 1.1310325386339457, + "16": 1.2310325386339458, + "18": 1.3310325386339459, + "20": 1.431032538633946, + "22": 1.531032538633946, + "24": 1.6310325386339461, + "26": 1.7310325386339462, + "28": 1.8310325386339463, + "30": 1.9310325386339464, + "32": 2.0310325386339465, + "34": 2.131032538633946, + "36": 2.231032538633946, + "38": 2.3310325386339454, + "40": 2.431032538633945, + "42": 2.5310325386339447, + "44": 2.6310325386339444, + "46": 2.731032538633944, + "48": 2.8310325386339437 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_29": { + "fstatus": { + "0": 0, + "2": 0, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.1073306046107562, + "2": 0.23733060461075622, + "4": 0.6373306046107565, + "6": 0.6373306046107565, + "8": 0.6373306046107565, + "10": 0.6373306046107565, + "12": 0.6373306046107565, + "14": 0.6373306046107565, + "16": 0.6373306046107565, + "18": 0.6373306046107565, + "20": 0.6373306046107565, + "22": 0.6373306046107565, + "24": 0.6373306046107565, + "26": 0.6373306046107565, + "28": 0.6373306046107565, + "30": 0.6373306046107565, + "32": 0.6373306046107565, + "34": 0.6373306046107565, + "36": 0.6373306046107565, + "38": 0.6373306046107565, + "40": 0.6373306046107565, + "42": 0.6373306046107565, + "44": 0.6373306046107565, + "46": 0.6373306046107565, + "48": 0.6373306046107565 + }, + "status": { + "0": 0, + "2": 0, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_3": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.047285269729742986, + "2": 0.187285269729743, + "4": 0.36728526972974307, + "6": 0.46728526972974305, + "8": 0.6072852697297432, + "10": 0.6572852697297432, + "12": 0.7072852697297433, + "14": 0.7572852697297433, + "16": 0.8072852697297433, + "18": 0.8572852697297434, + "20": 0.9072852697297434, + "22": 0.9572852697297435, + "24": 1.0072852697297434, + "26": 1.0572852697297435, + "28": 1.1072852697297435, + "30": 1.1572852697297435, + "32": 1.2072852697297436, + "34": 1.2572852697297436, + "36": 1.3072852697297437, + "38": 1.3572852697297437, + "40": 1.4072852697297438, + "42": 1.4572852697297438, + "44": 1.5072852697297439, + "46": 1.557285269729744, + "48": 1.607285269729744 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_30": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.4273553059276942, + "2": 0.4273553059276942, + "4": 0.4273553059276942, + "6": 0.4273553059276942, + "8": 0.4273553059276942, + "10": 0.4273553059276942, + "12": 0.46735530592769425, + "14": 0.5973553059276944, + "16": 0.6473553059276944, + "18": 0.6473553059276944, + "20": 0.6473553059276944, + "22": 0.6473553059276944, + "24": 0.6473553059276944, + "26": 0.6473553059276944, + "28": 0.6473553059276944, + "30": 0.6473553059276944, + "32": 0.6473553059276944, + "34": 0.6473553059276944, + "36": 0.6473553059276944, + "38": 0.6473553059276944, + "40": 0.6473553059276944, + "42": 0.6473553059276944, + "44": 0.6473553059276944, + "46": 0.6473553059276944, + "48": 0.6473553059276944 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_31": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.44001544543070764, + "2": 0.44001544543070764, + "4": 0.44001544543070764, + "6": 0.5200154454307077, + "8": 0.6800154454307078, + "10": 0.6800154454307078, + "12": 0.6800154454307078, + "14": 0.6800154454307078, + "16": 0.6800154454307078, + "18": 0.6800154454307078, + "20": 0.6800154454307078, + "22": 0.6800154454307078, + "24": 0.6800154454307078, + "26": 0.6800154454307078, + "28": 0.6800154454307078, + "30": 0.6800154454307078, + "32": 0.6800154454307078, + "34": 0.6800154454307078, + "36": 0.6800154454307078, + "38": 0.6800154454307078, + "40": 0.6800154454307078, + "42": 0.6800154454307078, + "44": 0.6800154454307078, + "46": 0.6800154454307078, + "48": 0.6800154454307078 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_32": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "radicalism": { + "0": 0.6037830407953667, + "2": 0.6037830407953667, + "4": 0.6037830407953667, + "6": 0.6037830407953667, + "8": 0.6037830407953667, + "10": 0.6037830407953667, + "12": 0.6037830407953667, + "14": 0.6037830407953667, + "16": 0.6037830407953667, + "18": 0.6037830407953667, + "20": 0.6037830407953667, + "22": 0.6037830407953667, + "24": 0.6037830407953667, + "26": 0.6037830407953667, + "28": 0.6037830407953667, + "30": 0.6037830407953667, + "32": 0.6037830407953667, + "34": 0.6037830407953667, + "36": 0.6037830407953667, + "38": 0.6037830407953667, + "40": 0.6037830407953667, + "42": 0.6037830407953667, + "44": 0.6037830407953667, + "46": 0.6037830407953667, + "48": 0.6037830407953667 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_33": { + "fstatus": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.1459504193482717, + "2": 0.5859504193482719, + "4": 0.685950419348272, + "6": 0.735950419348272, + "8": 0.785950419348272, + "10": 0.8359504193482721, + "12": 0.8859504193482721, + "14": 0.9359504193482722, + "16": 0.9859504193482722, + "18": 1.0359504193482723, + "20": 1.0859504193482723, + "22": 1.1359504193482723, + "24": 1.1859504193482724, + "26": 1.2359504193482724, + "28": 1.2859504193482725, + "30": 1.3359504193482725, + "32": 1.3859504193482726, + "34": 1.4359504193482726, + "36": 1.4859504193482727, + "38": 1.5359504193482727, + "40": 1.5859504193482727, + "42": 1.6359504193482728, + "44": 1.6859504193482728, + "46": 1.7359504193482729, + "48": 1.785950419348273 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_34": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.14116155796065988, + "2": 0.2611615579606599, + "4": 0.4311615579606599, + "6": 0.64116155796066, + "8": 0.64116155796066, + "10": 0.64116155796066, + "12": 0.64116155796066, + "14": 0.64116155796066, + "16": 0.64116155796066, + "18": 0.64116155796066, + "20": 0.64116155796066, + "22": 0.64116155796066, + "24": 0.64116155796066, + "26": 0.64116155796066, + "28": 0.64116155796066, + "30": 0.64116155796066, + "32": 0.64116155796066, + "34": 0.64116155796066, + "36": 0.64116155796066, + "38": 0.64116155796066, + "40": 0.64116155796066, + "42": 0.64116155796066, + "44": 0.64116155796066, + "46": 0.64116155796066, + "48": 0.64116155796066 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_35": { + "fstatus": { + "0": 2, + "2": 6, + "4": 6, + "6": 6, + "8": 6, + "10": 6, + "12": 6, + "14": 6, + "16": 6, + "18": 6, + "20": 6, + "22": 6, + "24": 6, + "26": 6, + "28": 6, + "30": 6, + "32": 6, + "34": 6, + "36": 6, + "38": 6, + "40": 6, + "42": 6, + "44": 6, + "46": 6, + "48": 6 + }, + "radicalism": { + "0": 0.8381303094857427, + "2": 0.8881303094857428, + "4": 0.9381303094857428, + "6": 0.9881303094857429, + "8": 1.0381303094857428, + "10": 1.0881303094857429, + "12": 1.138130309485743, + "14": 1.188130309485743, + "16": 1.238130309485743, + "18": 1.288130309485743, + "20": 1.338130309485743, + "22": 1.3881303094857431, + "24": 1.4381303094857432, + "26": 1.4881303094857432, + "28": 1.5381303094857433, + "30": 1.5881303094857433, + "32": 1.6381303094857433, + "34": 1.6881303094857434, + "36": 1.7381303094857434, + "38": 1.7881303094857435, + "40": 1.8381303094857435, + "42": 1.8881303094857436, + "44": 1.9381303094857436, + "46": 1.9881303094857437, + "48": 2.0381303094857435 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_36": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.08025539747254315, + "2": 0.16025539747254317, + "4": 0.2802553974725432, + "6": 0.40025539747254324, + "8": 0.40025539747254324, + "10": 0.4402553974725433, + "12": 0.5602553974725434, + "14": 0.6802553974725435, + "16": 0.6802553974725435, + "18": 0.6802553974725435, + "20": 0.6802553974725435, + "22": 0.6802553974725435, + "24": 0.6802553974725435, + "26": 0.6802553974725435, + "28": 0.6802553974725435, + "30": 0.6802553974725435, + "32": 0.6802553974725435, + "34": 0.6802553974725435, + "36": 0.6802553974725435, + "38": 0.6802553974725435, + "40": 0.6802553974725435, + "42": 0.6802553974725435, + "44": 0.6802553974725435, + "46": 0.6802553974725435, + "48": 0.6802553974725435 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_37": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.10593058181753726, + "2": 0.25593058181753725, + "4": 0.48593058181753723, + "6": 0.6659305818175374, + "8": 0.7159305818175374, + "10": 0.7659305818175375, + "12": 0.8159305818175375, + "14": 0.8659305818175376, + "16": 0.9159305818175376, + "18": 0.9659305818175377, + "20": 1.0159305818175377, + "22": 1.0659305818175377, + "24": 1.1159305818175378, + "26": 1.1659305818175378, + "28": 1.2159305818175379, + "30": 1.265930581817538, + "32": 1.315930581817538, + "34": 1.365930581817538, + "36": 1.415930581817538, + "38": 1.465930581817538, + "40": 1.5159305818175381, + "42": 1.5659305818175382, + "44": 1.6159305818175382, + "46": 1.6659305818175383, + "48": 1.7159305818175383 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_38": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 6, + "16": 6, + "18": 6, + "20": 6, + "22": 6, + "24": 6, + "26": 6, + "28": 6, + "30": 6, + "32": 6, + "34": 6, + "36": 6, + "38": 6, + "40": 6, + "42": 6, + "44": 6, + "46": 6, + "48": 6 + }, + "radicalism": { + "0": 0.46738699576326936, + "2": 0.46738699576326936, + "4": 0.46738699576326936, + "6": 0.46738699576326936, + "8": 0.46738699576326936, + "10": 0.46738699576326936, + "12": 0.5473869957632694, + "14": 0.6273869957632695, + "16": 0.6273869957632695, + "18": 0.6273869957632695, + "20": 0.6273869957632695, + "22": 0.6273869957632695, + "24": 0.6273869957632695, + "26": 0.6273869957632695, + "28": 0.6273869957632695, + "30": 0.6273869957632695, + "32": 0.6273869957632695, + "34": 0.6273869957632695, + "36": 0.6273869957632695, + "38": 0.6273869957632695, + "40": 0.6273869957632695, + "42": 0.6273869957632695, + "44": 0.6273869957632695, + "46": 0.6273869957632695, + "48": 0.6273869957632695 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_39": { + "fstatus": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.9099735008069635, + "2": 0.9599735008069635, + "4": 1.0099735008069635, + "6": 1.0599735008069635, + "8": 1.1099735008069636, + "10": 1.1599735008069636, + "12": 1.2099735008069636, + "14": 1.2599735008069637, + "16": 1.3099735008069637, + "18": 1.3599735008069638, + "20": 1.4099735008069638, + "22": 1.4599735008069639, + "24": 1.509973500806964, + "26": 1.559973500806964, + "28": 1.609973500806964, + "30": 1.659973500806964, + "32": 1.709973500806964, + "34": 1.7599735008069641, + "36": 1.8099735008069642, + "38": 1.8599735008069642, + "40": 1.9099735008069643, + "42": 1.9599735008069643, + "44": 2.0099735008069644, + "46": 2.059973500806964, + "48": 2.109973500806964 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_4": { + "fstatus": { + "0": 2, + "2": 6, + "4": 6, + "6": 6, + "8": 6, + "10": 6, + "12": 6, + "14": 6, + "16": 6, + "18": 6, + "20": 6, + "22": 6, + "24": 6, + "26": 6, + "28": 6, + "30": 6, + "32": 6, + "34": 6, + "36": 6, + "38": 6, + "40": 6, + "42": 6, + "44": 6, + "46": 6, + "48": 6 + }, + "radicalism": { + "0": 0.9144186686474172, + "2": 0.9644186686474172, + "4": 1.0144186686474173, + "6": 1.0644186686474173, + "8": 1.1144186686474173, + "10": 1.1644186686474174, + "12": 1.2144186686474174, + "14": 1.2644186686474175, + "16": 1.3144186686474175, + "18": 1.3644186686474176, + "20": 1.4144186686474176, + "22": 1.4644186686474177, + "24": 1.5144186686474177, + "26": 1.5644186686474177, + "28": 1.6144186686474178, + "30": 1.6644186686474178, + "32": 1.7144186686474179, + "34": 1.764418668647418, + "36": 1.814418668647418, + "38": 1.864418668647418, + "40": 1.914418668647418, + "42": 1.964418668647418, + "44": 2.014418668647418, + "46": 2.0644186686474177, + "48": 2.1144186686474176 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_40": { + "fstatus": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.9071008191179996, + "2": 0.9071008191179996, + "4": 0.9071008191179996, + "6": 0.9071008191179996, + "8": 0.9071008191179996, + "10": 0.9071008191179996, + "12": 0.9071008191179996, + "14": 0.9071008191179996, + "16": 0.9071008191179996, + "18": 0.9071008191179996, + "20": 0.9071008191179996, + "22": 0.9071008191179996, + "24": 0.9071008191179996, + "26": 0.9071008191179996, + "28": 0.9071008191179996, + "30": 0.9071008191179996, + "32": 0.9071008191179996, + "34": 0.9071008191179996, + "36": 0.9071008191179996, + "38": 0.9071008191179996, + "40": 0.9071008191179996, + "42": 0.9071008191179996, + "44": 0.9071008191179996, + "46": 0.9071008191179996, + "48": 0.9071008191179996 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_41": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.07208782098570736, + "2": 0.11208782098570737, + "4": 0.1520878209857074, + "6": 0.1920878209857074, + "8": 0.2320878209857074, + "10": 0.2720878209857074, + "12": 0.4320878209857075, + "14": 0.47208782098570756, + "16": 0.5120878209857076, + "18": 0.5520878209857076, + "20": 0.5920878209857077, + "22": 0.6320878209857077, + "24": 0.6320878209857077, + "26": 0.6320878209857077, + "28": 0.6320878209857077, + "30": 0.6320878209857077, + "32": 0.6320878209857077, + "34": 0.6320878209857077, + "36": 0.6320878209857077, + "38": 0.6320878209857077, + "40": 0.6320878209857077, + "42": 0.6320878209857077, + "44": 0.6320878209857077, + "46": 0.6320878209857077, + "48": 0.6320878209857077 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_42": { + "fstatus": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.8012677533614061, + "2": 0.8012677533614061, + "4": 0.8012677533614061, + "6": 0.8012677533614061, + "8": 0.8012677533614061, + "10": 0.8012677533614061, + "12": 0.8012677533614061, + "14": 0.8012677533614061, + "16": 0.8012677533614061, + "18": 0.8012677533614061, + "20": 0.8012677533614061, + "22": 0.8012677533614061, + "24": 0.8012677533614061, + "26": 0.8012677533614061, + "28": 0.8012677533614061, + "30": 0.8012677533614061, + "32": 0.8012677533614061, + "34": 0.8012677533614061, + "36": 0.8012677533614061, + "38": 0.8012677533614061, + "40": 0.8012677533614061, + "42": 0.8012677533614061, + "44": 0.8012677533614061, + "46": 0.8012677533614061, + "48": 0.8012677533614061 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_43": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.2135570742174386, + "2": 0.37355707421743867, + "4": 0.37355707421743867, + "6": 0.45355707421743874, + "8": 0.5735570742174388, + "10": 0.773557074217439, + "12": 0.773557074217439, + "14": 0.773557074217439, + "16": 0.773557074217439, + "18": 0.773557074217439, + "20": 0.773557074217439, + "22": 0.773557074217439, + "24": 0.773557074217439, + "26": 0.773557074217439, + "28": 0.773557074217439, + "30": 0.773557074217439, + "32": 0.773557074217439, + "34": 0.773557074217439, + "36": 0.773557074217439, + "38": 0.773557074217439, + "40": 0.773557074217439, + "42": 0.773557074217439, + "44": 0.773557074217439, + "46": 0.773557074217439, + "48": 0.773557074217439 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_44": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.47419476080421896, + "2": 0.47419476080421896, + "4": 0.47419476080421896, + "6": 0.514194760804219, + "8": 0.5941947608042191, + "10": 0.7541947608042192, + "12": 0.7541947608042192, + "14": 0.7541947608042192, + "16": 0.7541947608042192, + "18": 0.7541947608042192, + "20": 0.7541947608042192, + "22": 0.7541947608042192, + "24": 0.7541947608042192, + "26": 0.7541947608042192, + "28": 0.7541947608042192, + "30": 0.7541947608042192, + "32": 0.7541947608042192, + "34": 0.7541947608042192, + "36": 0.7541947608042192, + "38": 0.7541947608042192, + "40": 0.7541947608042192, + "42": 0.7541947608042192, + "44": 0.7541947608042192, + "46": 0.7541947608042192, + "48": 0.7541947608042192 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_45": { + "fstatus": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.9115481906248958, + "2": 0.9115481906248958, + "4": 0.9115481906248958, + "6": 0.9115481906248958, + "8": 0.9115481906248958, + "10": 0.9115481906248958, + "12": 0.9115481906248958, + "14": 0.9115481906248958, + "16": 0.9115481906248958, + "18": 0.9115481906248958, + "20": 0.9115481906248958, + "22": 0.9115481906248958, + "24": 0.9115481906248958, + "26": 0.9115481906248958, + "28": 0.9115481906248958, + "30": 0.9115481906248958, + "32": 0.9115481906248958, + "34": 0.9115481906248958, + "36": 0.9115481906248958, + "38": 0.9115481906248958, + "40": 0.9115481906248958, + "42": 0.9115481906248958, + "44": 0.9115481906248958, + "46": 0.9115481906248958, + "48": 0.9115481906248958 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_46": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.1870712881496192, + "2": 0.4470712881496193, + "4": 0.49707128814961926, + "6": 0.6770712881496194, + "8": 0.7270712881496194, + "10": 0.7770712881496195, + "12": 0.8270712881496195, + "14": 0.8770712881496195, + "16": 0.9270712881496196, + "18": 0.9770712881496196, + "20": 1.0270712881496196, + "22": 1.0770712881496196, + "24": 1.1270712881496197, + "26": 1.1770712881496197, + "28": 1.2270712881496197, + "30": 1.2770712881496198, + "32": 1.3270712881496198, + "34": 1.3770712881496199, + "36": 1.42707128814962, + "38": 1.47707128814962, + "40": 1.52707128814962, + "42": 1.57707128814962, + "44": 1.62707128814962, + "46": 1.6770712881496201, + "48": 1.7270712881496202 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_47": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.10203104630475306, + "2": 0.14203104630475305, + "4": 0.18203104630475306, + "6": 0.22203104630475307, + "8": 0.26203104630475305, + "10": 0.3420310463047531, + "12": 0.38203104630475315, + "14": 0.4220310463047532, + "16": 0.4620310463047532, + "18": 0.5020310463047533, + "20": 0.5420310463047533, + "22": 0.6220310463047534, + "24": 0.6220310463047534, + "26": 0.6220310463047534, + "28": 0.6220310463047534, + "30": 0.6220310463047534, + "32": 0.6220310463047534, + "34": 0.6220310463047534, + "36": 0.6220310463047534, + "38": 0.6220310463047534, + "40": 0.6220310463047534, + "42": 0.6220310463047534, + "44": 0.6220310463047534, + "46": 0.6220310463047534, + "48": 0.6220310463047534 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_48": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.4550316561417992, + "2": 0.5050316561417992, + "4": 0.5550316561417993, + "6": 0.6050316561417993, + "8": 0.6550316561417994, + "10": 0.7050316561417994, + "12": 0.7550316561417995, + "14": 0.8050316561417995, + "16": 0.8550316561417995, + "18": 0.9050316561417996, + "20": 0.9550316561417996, + "22": 1.0050316561417996, + "24": 1.0550316561417996, + "26": 1.1050316561417997, + "28": 1.1550316561417997, + "30": 1.2050316561417997, + "32": 1.2550316561417998, + "34": 1.3050316561417998, + "36": 1.3550316561417999, + "38": 1.4050316561418, + "40": 1.4550316561418, + "42": 1.5050316561418, + "44": 1.5550316561418, + "46": 1.6050316561418, + "48": 1.6550316561418001 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_49": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "radicalism": { + "0": 0.1418817100709423, + "2": 0.30188171007094233, + "4": 0.30188171007094233, + "6": 0.47188171007094243, + "8": 0.6418817100709425, + "10": 0.6418817100709425, + "12": 0.6418817100709425, + "14": 0.6418817100709425, + "16": 0.6418817100709425, + "18": 0.6418817100709425, + "20": 0.6418817100709425, + "22": 0.6418817100709425, + "24": 0.6418817100709425, + "26": 0.6418817100709425, + "28": 0.6418817100709425, + "30": 0.6418817100709425, + "32": 0.6418817100709425, + "34": 0.6418817100709425, + "36": 0.6418817100709425, + "38": 0.6418817100709425, + "40": 0.6418817100709425, + "42": 0.6418817100709425, + "44": 0.6418817100709425, + "46": 0.6418817100709425, + "48": 0.6418817100709425 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_5": { + "fstatus": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.17076584445991447, + "2": 0.47076584445991443, + "4": 0.6907658444599146, + "6": 0.7407658444599147, + "8": 0.7907658444599147, + "10": 0.8407658444599148, + "12": 0.8907658444599148, + "14": 0.9407658444599148, + "16": 0.9907658444599149, + "18": 1.0407658444599148, + "20": 1.0907658444599149, + "22": 1.140765844459915, + "24": 1.190765844459915, + "26": 1.240765844459915, + "28": 1.290765844459915, + "30": 1.340765844459915, + "32": 1.3907658444599151, + "34": 1.4407658444599152, + "36": 1.4907658444599152, + "38": 1.5407658444599153, + "40": 1.5907658444599153, + "42": 1.6407658444599154, + "44": 1.6907658444599154, + "46": 1.7407658444599154, + "48": 1.7907658444599155 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_50": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.48426647620251495, + "2": 0.534266476202515, + "4": 0.584266476202515, + "6": 0.6342664762025151, + "8": 0.6842664762025151, + "10": 0.7342664762025152, + "12": 0.7842664762025152, + "14": 0.8342664762025153, + "16": 0.8842664762025153, + "18": 0.9342664762025154, + "20": 0.9842664762025154, + "22": 1.0342664762025153, + "24": 1.0842664762025154, + "26": 1.1342664762025154, + "28": 1.1842664762025155, + "30": 1.2342664762025155, + "32": 1.2842664762025156, + "34": 1.3342664762025156, + "36": 1.3842664762025156, + "38": 1.4342664762025157, + "40": 1.4842664762025157, + "42": 1.5342664762025158, + "44": 1.5842664762025158, + "46": 1.6342664762025159, + "48": 1.684266476202516 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_51": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 6, + "10": 6, + "12": 6, + "14": 6, + "16": 6, + "18": 6, + "20": 6, + "22": 6, + "24": 6, + "26": 6, + "28": 6, + "30": 6, + "32": 6, + "34": 6, + "36": 6, + "38": 6, + "40": 6, + "42": 6, + "44": 6, + "46": 6, + "48": 6 + }, + "radicalism": { + "0": 0.09841082606620145, + "2": 0.2784108260662015, + "4": 0.4184108260662015, + "6": 0.5884108260662015, + "8": 0.6384108260662016, + "10": 0.6884108260662016, + "12": 0.7384108260662017, + "14": 0.7884108260662017, + "16": 0.8384108260662018, + "18": 0.8884108260662018, + "20": 0.9384108260662019, + "22": 0.9884108260662019, + "24": 1.038410826066202, + "26": 1.088410826066202, + "28": 1.138410826066202, + "30": 1.188410826066202, + "32": 1.2384108260662021, + "34": 1.2884108260662022, + "36": 1.3384108260662022, + "38": 1.3884108260662023, + "40": 1.4384108260662023, + "42": 1.4884108260662023, + "44": 1.5384108260662024, + "46": 1.5884108260662024, + "48": 1.6384108260662025 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_52": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "radicalism": { + "0": 0.2045787959553396, + "2": 0.3645787959553397, + "4": 0.3645787959553397, + "6": 0.3645787959553397, + "8": 0.3645787959553397, + "10": 0.4845787959553398, + "12": 0.6045787959553399, + "14": 0.6045787959553399, + "16": 0.6045787959553399, + "18": 0.6045787959553399, + "20": 0.6045787959553399, + "22": 0.6045787959553399, + "24": 0.6045787959553399, + "26": 0.6045787959553399, + "28": 0.6045787959553399, + "30": 0.6045787959553399, + "32": 0.6045787959553399, + "34": 0.6045787959553399, + "36": 0.6045787959553399, + "38": 0.6045787959553399, + "40": 0.6045787959553399, + "42": 0.6045787959553399, + "44": 0.6045787959553399, + "46": 0.6045787959553399, + "48": 0.6045787959553399 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_53": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.14924101157973158, + "2": 0.26924101157973157, + "4": 0.46924101157973175, + "6": 0.5992410115797319, + "8": 0.729241011579732, + "10": 0.729241011579732, + "12": 0.729241011579732, + "14": 0.729241011579732, + "16": 0.729241011579732, + "18": 0.729241011579732, + "20": 0.729241011579732, + "22": 0.729241011579732, + "24": 0.729241011579732, + "26": 0.729241011579732, + "28": 0.729241011579732, + "30": 0.729241011579732, + "32": 0.729241011579732, + "34": 0.729241011579732, + "36": 0.729241011579732, + "38": 0.729241011579732, + "40": 0.729241011579732, + "42": 0.729241011579732, + "44": 0.729241011579732, + "46": 0.729241011579732, + "48": 0.729241011579732 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_54": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.210222866132391, + "2": 0.4102228661323911, + "4": 0.4102228661323911, + "6": 0.5402228661323912, + "8": 0.7102228661323914, + "10": 0.7102228661323914, + "12": 0.7102228661323914, + "14": 0.7102228661323914, + "16": 0.7102228661323914, + "18": 0.7102228661323914, + "20": 0.7102228661323914, + "22": 0.7102228661323914, + "24": 0.7102228661323914, + "26": 0.7102228661323914, + "28": 0.7102228661323914, + "30": 0.7102228661323914, + "32": 0.7102228661323914, + "34": 0.7102228661323914, + "36": 0.7102228661323914, + "38": 0.7102228661323914, + "40": 0.7102228661323914, + "42": 0.7102228661323914, + "44": 0.7102228661323914, + "46": 0.7102228661323914, + "48": 0.7102228661323914 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_55": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.07876429836418261, + "2": 0.11876429836418262, + "4": 0.15876429836418263, + "6": 0.19876429836418263, + "8": 0.23876429836418264, + "10": 0.35876429836418267, + "12": 0.3987642983641827, + "14": 0.43876429836418274, + "16": 0.47876429836418277, + "18": 0.5187642983641828, + "20": 0.5587642983641828, + "22": 0.678764298364183, + "24": 0.678764298364183, + "26": 0.678764298364183, + "28": 0.678764298364183, + "30": 0.678764298364183, + "32": 0.678764298364183, + "34": 0.678764298364183, + "36": 0.678764298364183, + "38": 0.678764298364183, + "40": 0.678764298364183, + "42": 0.678764298364183, + "44": 0.678764298364183, + "46": 0.678764298364183, + "48": 0.678764298364183 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_56": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.10868148079493808, + "2": 0.3086814807949382, + "4": 0.3086814807949382, + "6": 0.4786814807949383, + "8": 0.7286814807949384, + "10": 0.7286814807949384, + "12": 0.7286814807949384, + "14": 0.7286814807949384, + "16": 0.7286814807949384, + "18": 0.7286814807949384, + "20": 0.7286814807949384, + "22": 0.7286814807949384, + "24": 0.7286814807949384, + "26": 0.7286814807949384, + "28": 0.7286814807949384, + "30": 0.7286814807949384, + "32": 0.7286814807949384, + "34": 0.7286814807949384, + "36": 0.7286814807949384, + "38": 0.7286814807949384, + "40": 0.7286814807949384, + "42": 0.7286814807949384, + "44": 0.7286814807949384, + "46": 0.7286814807949384, + "48": 0.7286814807949384 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_57": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.12374461206401023, + "2": 0.38374461206401034, + "4": 0.5937446120640104, + "6": 0.6437446120640105, + "8": 0.6937446120640105, + "10": 0.7437446120640105, + "12": 0.7937446120640106, + "14": 0.8437446120640106, + "16": 0.8937446120640107, + "18": 0.9437446120640107, + "20": 0.9937446120640108, + "22": 1.0437446120640108, + "24": 1.0937446120640109, + "26": 1.143744612064011, + "28": 1.193744612064011, + "30": 1.243744612064011, + "32": 1.293744612064011, + "34": 1.343744612064011, + "36": 1.3937446120640111, + "38": 1.4437446120640112, + "40": 1.4937446120640112, + "42": 1.5437446120640113, + "44": 1.5937446120640113, + "46": 1.6437446120640113, + "48": 1.6937446120640114 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_58": { + "fstatus": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.19972453589217024, + "2": 0.5997245358921705, + "4": 0.6497245358921705, + "6": 0.6997245358921705, + "8": 0.7497245358921706, + "10": 0.7997245358921706, + "12": 0.8497245358921707, + "14": 0.8997245358921707, + "16": 0.9497245358921708, + "18": 0.9997245358921708, + "20": 1.0497245358921707, + "22": 1.0997245358921708, + "24": 1.1497245358921708, + "26": 1.1997245358921709, + "28": 1.249724535892171, + "30": 1.299724535892171, + "32": 1.349724535892171, + "34": 1.399724535892171, + "36": 1.449724535892171, + "38": 1.4997245358921711, + "40": 1.5497245358921712, + "42": 1.5997245358921712, + "44": 1.6497245358921713, + "46": 1.6997245358921713, + "48": 1.7497245358921714 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_59": { + "fstatus": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.13149999666239542, + "2": 0.5714999966623956, + "4": 0.6214999966623956, + "6": 0.6714999966623957, + "8": 0.7214999966623957, + "10": 0.7714999966623958, + "12": 0.8214999966623958, + "14": 0.8714999966623959, + "16": 0.9214999966623959, + "18": 0.971499996662396, + "20": 1.0214999966623959, + "22": 1.071499996662396, + "24": 1.121499996662396, + "26": 1.171499996662396, + "28": 1.221499996662396, + "30": 1.271499996662396, + "32": 1.3214999966623961, + "34": 1.3714999966623962, + "36": 1.4214999966623962, + "38": 1.4714999966623963, + "40": 1.5214999966623963, + "42": 1.5714999966623964, + "44": 1.6214999966623964, + "46": 1.6714999966623965, + "48": 1.7214999966623965 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_6": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.20277444106244377, + "2": 0.4427744410624439, + "4": 0.562774441062444, + "6": 0.6827744410624441, + "8": 0.6827744410624441, + "10": 0.6827744410624441, + "12": 0.6827744410624441, + "14": 0.6827744410624441, + "16": 0.6827744410624441, + "18": 0.6827744410624441, + "20": 0.6827744410624441, + "22": 0.6827744410624441, + "24": 0.6827744410624441, + "26": 0.6827744410624441, + "28": 0.6827744410624441, + "30": 0.6827744410624441, + "32": 0.6827744410624441, + "34": 0.6827744410624441, + "36": 0.6827744410624441, + "38": 0.6827744410624441, + "40": 0.6827744410624441, + "42": 0.6827744410624441, + "44": 0.6827744410624441, + "46": 0.6827744410624441, + "48": 0.6827744410624441 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_60": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.0723130801985715, + "2": 0.1523130801985715, + "4": 0.23231308019857153, + "6": 0.3123130801985715, + "8": 0.3123130801985715, + "10": 0.3123130801985715, + "12": 0.35231308019857155, + "14": 0.3923130801985716, + "16": 0.47231308019857166, + "18": 0.5523130801985717, + "20": 0.6723130801985718, + "22": 0.6723130801985718, + "24": 0.6723130801985718, + "26": 0.6723130801985718, + "28": 0.6723130801985718, + "30": 0.6723130801985718, + "32": 0.6723130801985718, + "34": 0.6723130801985718, + "36": 0.6723130801985718, + "38": 0.6723130801985718, + "40": 0.6723130801985718, + "42": 0.6723130801985718, + "44": 0.6723130801985718, + "46": 0.6723130801985718, + "48": 0.6723130801985718 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_61": { + "fstatus": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "radicalism": { + "0": 0.1158717620741975, + "2": 0.19587176207419751, + "4": 0.2758717620741975, + "6": 0.3958717620741976, + "8": 0.3958717620741976, + "10": 0.3958717620741976, + "12": 0.3958717620741976, + "14": 0.4458717620741976, + "16": 0.5358717620741976, + "18": 0.6258717620741977, + "20": 0.6258717620741977, + "22": 0.6258717620741977, + "24": 0.6258717620741977, + "26": 0.6258717620741977, + "28": 0.6258717620741977, + "30": 0.6258717620741977, + "32": 0.6258717620741977, + "34": 0.6258717620741977, + "36": 0.6258717620741977, + "38": 0.6258717620741977, + "40": 0.6258717620741977, + "42": 0.6258717620741977, + "44": 0.6258717620741977, + "46": 0.6258717620741977, + "48": 0.6258717620741977 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_62": { + "fstatus": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.8761471650735113, + "2": 0.8761471650735113, + "4": 0.8761471650735113, + "6": 0.8761471650735113, + "8": 0.8761471650735113, + "10": 0.8761471650735113, + "12": 0.8761471650735113, + "14": 0.8761471650735113, + "16": 0.8761471650735113, + "18": 0.8761471650735113, + "20": 0.8761471650735113, + "22": 0.8761471650735113, + "24": 0.8761471650735113, + "26": 0.8761471650735113, + "28": 0.8761471650735113, + "30": 0.8761471650735113, + "32": 0.8761471650735113, + "34": 0.8761471650735113, + "36": 0.8761471650735113, + "38": 0.8761471650735113, + "40": 0.8761471650735113, + "42": 0.8761471650735113, + "44": 0.8761471650735113, + "46": 0.8761471650735113, + "48": 0.8761471650735113 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_63": { + "fstatus": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.08870479044734575, + "2": 0.5887047904473458, + "4": 0.6887047904473459, + "6": 0.788704790447346, + "8": 0.8887047904473461, + "10": 0.9887047904473462, + "12": 1.0887047904473461, + "14": 1.1887047904473462, + "16": 1.2887047904473463, + "18": 1.3887047904473464, + "20": 1.4887047904473465, + "22": 1.5887047904473466, + "24": 1.6887047904473467, + "26": 1.7887047904473468, + "28": 1.8887047904473468, + "30": 1.988704790447347, + "32": 2.0887047904473466, + "34": 2.1887047904473462, + "36": 2.288704790447346, + "38": 2.3887047904473455, + "40": 2.488704790447345, + "42": 2.588704790447345, + "44": 2.6887047904473445, + "46": 2.788704790447344, + "48": 2.8887047904473437 + }, + "status": { + "0": 0, + "2": 1, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_64": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "radicalism": { + "0": 0.23881783978080057, + "2": 0.6188178397808007, + "4": 0.6188178397808007, + "6": 0.6188178397808007, + "8": 0.6188178397808007, + "10": 0.6188178397808007, + "12": 0.6188178397808007, + "14": 0.6188178397808007, + "16": 0.6188178397808007, + "18": 0.6188178397808007, + "20": 0.6188178397808007, + "22": 0.6188178397808007, + "24": 0.6188178397808007, + "26": 0.6188178397808007, + "28": 0.6188178397808007, + "30": 0.6188178397808007, + "32": 0.6188178397808007, + "34": 0.6188178397808007, + "36": 0.6188178397808007, + "38": 0.6188178397808007, + "40": 0.6188178397808007, + "42": 0.6188178397808007, + "44": 0.6188178397808007, + "46": 0.6188178397808007, + "48": 0.6188178397808007 + }, + "status": { + "0": 0, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_65": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 6, + "8": 6, + "10": 6, + "12": 6, + "14": 6, + "16": 6, + "18": 6, + "20": 6, + "22": 6, + "24": 6, + "26": 6, + "28": 6, + "30": 6, + "32": 6, + "34": 6, + "36": 6, + "38": 6, + "40": 6, + "42": 6, + "44": 6, + "46": 6, + "48": 6 + }, + "radicalism": { + "0": 0.49191295321098594, + "2": 0.541912953210986, + "4": 0.591912953210986, + "6": 0.6419129532109861, + "8": 0.6919129532109861, + "10": 0.7419129532109862, + "12": 0.7919129532109862, + "14": 0.8419129532109862, + "16": 0.8919129532109863, + "18": 0.9419129532109863, + "20": 0.9919129532109864, + "22": 1.0419129532109863, + "24": 1.0919129532109864, + "26": 1.1419129532109864, + "28": 1.1919129532109864, + "30": 1.2419129532109865, + "32": 1.2919129532109865, + "34": 1.3419129532109866, + "36": 1.3919129532109866, + "38": 1.4419129532109867, + "40": 1.4919129532109867, + "42": 1.5419129532109868, + "44": 1.5919129532109868, + "46": 1.6419129532109868, + "48": 1.691912953210987 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + } + }, + "agent_66": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.17466451403307784, + "2": 0.2946645140330779, + "4": 0.5346645140330781, + "6": 0.6546645140330782, + "8": 0.6546645140330782, + "10": 0.6546645140330782, + "12": 0.6546645140330782, + "14": 0.6546645140330782, + "16": 0.6546645140330782, + "18": 0.6546645140330782, + "20": 0.6546645140330782, + "22": 0.6546645140330782, + "24": 0.6546645140330782, + "26": 0.6546645140330782, + "28": 0.6546645140330782, + "30": 0.6546645140330782, + "32": 0.6546645140330782, + "34": 0.6546645140330782, + "36": 0.6546645140330782, + "38": 0.6546645140330782, + "40": 0.6546645140330782, + "42": 0.6546645140330782, + "44": 0.6546645140330782, + "46": 0.6546645140330782, + "48": 0.6546645140330782 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_67": { + "fstatus": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.12985201337204827, + "2": 0.40985201337204835, + "4": 0.40985201337204835, + "6": 0.5398520133720484, + "8": 0.7898520133720486, + "10": 0.7898520133720486, + "12": 0.7898520133720486, + "14": 0.7898520133720486, + "16": 0.7898520133720486, + "18": 0.7898520133720486, + "20": 0.7898520133720486, + "22": 0.7898520133720486, + "24": 0.7898520133720486, + "26": 0.7898520133720486, + "28": 0.7898520133720486, + "30": 0.7898520133720486, + "32": 0.7898520133720486, + "34": 0.7898520133720486, + "36": 0.7898520133720486, + "38": 0.7898520133720486, + "40": 0.7898520133720486, + "42": 0.7898520133720486, + "44": 0.7898520133720486, + "46": 0.7898520133720486, + "48": 0.7898520133720486 + }, + "status": { + "0": 0, + "2": 1, + "4": 1, + "6": 1, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_68": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_69": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_7": { + "fstatus": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.47987486574034277, + "2": 0.47987486574034277, + "4": 0.47987486574034277, + "6": 0.47987486574034277, + "8": 0.5598748657403428, + "10": 0.759874865740343, + "12": 0.759874865740343, + "14": 0.759874865740343, + "16": 0.759874865740343, + "18": 0.759874865740343, + "20": 0.759874865740343, + "22": 0.759874865740343, + "24": 0.759874865740343, + "26": 0.759874865740343, + "28": 0.759874865740343, + "30": 0.759874865740343, + "32": 0.759874865740343, + "34": 0.759874865740343, + "36": 0.759874865740343, + "38": 0.759874865740343, + "40": 0.759874865740343, + "42": 0.759874865740343, + "44": 0.759874865740343, + "46": 0.759874865740343, + "48": 0.759874865740343 + }, + "status": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_70": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_71": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_72": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_73": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_74": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 4, + "10": 4, + "12": 4, + "14": 4, + "16": 4, + "18": 4, + "20": 5, + "22": 5, + "24": 5, + "26": 5, + "28": 5, + "30": 5, + "32": 5, + "34": 5, + "36": 5, + "38": 5, + "40": 5, + "42": 5, + "44": 5, + "46": 5, + "48": 5 + }, + "radicalism": { + "0": 0, + "2": 0.1, + "4": 0.2, + "6": 0.25, + "8": 0.3, + "10": 0.35, + "12": 0.39999999999999997, + "14": 0.44999999999999996, + "16": 0.49999999999999994, + "18": 0.5499999999999999, + "20": 0.6, + "22": 0.65, + "24": 0.7000000000000001, + "26": 0.7500000000000001, + "28": 0.8000000000000002, + "30": 0.8500000000000002, + "32": 0.9000000000000002, + "34": 0.9500000000000003, + "36": 1.0000000000000002, + "38": 1.0500000000000003, + "40": 1.1000000000000003, + "42": 1.1500000000000004, + "44": 1.2000000000000004, + "46": 1.2500000000000004, + "48": 1.3000000000000005 + }, + "status": { + "0": 0, + "2": 0, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_75": { + "fstatus": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + }, + "radicalism": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "status": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + }, + "type": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + } + }, + "agent_76": { + "fstatus": { + "0": 7, + "2": 7, + "4": 7, + "6": 7, + "8": 7, + "10": 7, + "12": 7, + "14": 7, + "16": 7, + "18": 7, + "20": 7, + "22": 7, + "24": 7, + "26": 7, + "28": 7, + "30": 7, + "32": 7, + "34": 7, + "36": 7, + "38": 7, + "40": 7, + "42": 7, + "44": 7, + "46": 7, + "48": 7 + }, + "radicalism": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + } + }, + "agent_77": { + "fstatus": { + "0": 7, + "2": 7, + "4": 7, + "6": 7, + "8": 7, + "10": 7, + "12": 7, + "14": 7, + "16": 7, + "18": 7, + "20": 7, + "22": 7, + "24": 7, + "26": 7, + "28": 7, + "30": 7, + "32": 7, + "34": 7, + "36": 7, + "38": 7, + "40": 7, + "42": 7, + "44": 7, + "46": 7, + "48": 7 + }, + "radicalism": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + } + }, + "agent_78": { + "fstatus": { + "0": 7, + "2": 7, + "4": 7, + "6": 7, + "8": 7, + "10": 7, + "12": 7, + "14": 7, + "16": 7, + "18": 7, + "20": 7, + "22": 7, + "24": 7, + "26": 7, + "28": 7, + "30": 7, + "32": 7, + "34": 7, + "36": 7, + "38": 7, + "40": 7, + "42": 7, + "44": 7, + "46": 7, + "48": 7 + }, + "radicalism": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + } + }, + "agent_79": { + "fstatus": { + "0": 7, + "2": 7, + "4": 7, + "6": 7, + "8": 7, + "10": 7, + "12": 7, + "14": 7, + "16": 7, + "18": 7, + "20": 7, + "22": 7, + "24": 7, + "26": 7, + "28": 7, + "30": 7, + "32": 7, + "34": 7, + "36": 7, + "38": 7, + "40": 7, + "42": 7, + "44": 7, + "46": 7, + "48": 7 + }, + "radicalism": { + "0": 1, + "2": 1, + "4": 1, + "6": 1, + "8": 1, + "10": 1, + "12": 1, + "14": 1, + "16": 1, + "18": 1, + "20": 1, + "22": 1, + "24": 1, + "26": 1, + "28": 1, + "30": 1, + "32": 1, + "34": 1, + "36": 1, + "38": 1, + "40": 1, + "42": 1, + "44": 1, + "46": 1, + "48": 1 + }, + "status": { + "0": 2, + "2": 2, + "4": 2, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 3, + "2": 3, + "4": 3, + "6": 3, + "8": 3, + "10": 3, + "12": 3, + "14": 3, + "16": 3, + "18": 3, + "20": 3, + "22": 3, + "24": 3, + "26": 3, + "28": 3, + "30": 3, + "32": 3, + "34": 3, + "36": 3, + "38": 3, + "40": 3, + "42": 3, + "44": 3, + "46": 3, + "48": 3 + } + }, + "agent_8": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.1029605352882617, + "2": 0.1829605352882617, + "4": 0.3029605352882617, + "6": 0.3029605352882617, + "8": 0.42296053528826183, + "10": 0.622960535288262, + "12": 0.622960535288262, + "14": 0.622960535288262, + "16": 0.622960535288262, + "18": 0.622960535288262, + "20": 0.622960535288262, + "22": 0.622960535288262, + "24": 0.622960535288262, + "26": 0.622960535288262, + "28": 0.622960535288262, + "30": 0.622960535288262, + "32": 0.622960535288262, + "34": 0.622960535288262, + "36": 0.622960535288262, + "38": 0.622960535288262, + "40": 0.622960535288262, + "42": 0.622960535288262, + "44": 0.622960535288262, + "46": 0.622960535288262, + "48": 0.622960535288262 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 1, + "8": 1, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + }, + "agent_9": { + "fstatus": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "radicalism": { + "0": 0.10244406243340591, + "2": 0.22244406243340592, + "4": 0.5024440624334061, + "6": 0.6324440624334062, + "8": 0.6324440624334062, + "10": 0.6324440624334062, + "12": 0.6324440624334062, + "14": 0.6324440624334062, + "16": 0.6324440624334062, + "18": 0.6324440624334062, + "20": 0.6324440624334062, + "22": 0.6324440624334062, + "24": 0.6324440624334062, + "26": 0.6324440624334062, + "28": 0.6324440624334062, + "30": 0.6324440624334062, + "32": 0.6324440624334062, + "34": 0.6324440624334062, + "36": 0.6324440624334062, + "38": 0.6324440624334062, + "40": 0.6324440624334062, + "42": 0.6324440624334062, + "44": 0.6324440624334062, + "46": 0.6324440624334062, + "48": 0.6324440624334062 + }, + "status": { + "0": 0, + "2": 0, + "4": 1, + "6": 2, + "8": 2, + "10": 2, + "12": 2, + "14": 2, + "16": 2, + "18": 2, + "20": 2, + "22": 2, + "24": 2, + "26": 2, + "28": 2, + "30": 2, + "32": 2, + "34": 2, + "36": 2, + "38": 2, + "40": 2, + "42": 2, + "44": 2, + "46": 2, + "48": 2 + }, + "type": { + "0": 0, + "2": 0, + "4": 0, + "6": 0, + "8": 0, + "10": 0, + "12": 0, + "14": 0, + "16": 0, + "18": 0, + "20": 0, + "22": 0, + "24": 0, + "26": 0, + "28": 0, + "30": 0, + "32": 0, + "34": 0, + "36": 0, + "38": 0, + "40": 0, + "42": 0, + "44": 0, + "46": 0, + "48": 0 + } + } +} \ No newline at end of file diff --git a/debug.py b/debug.py deleted file mode 100644 index c1edbcb..0000000 --- a/debug.py +++ /dev/null @@ -1,3 +0,0 @@ -import soil -soil.main() -import pdb diff --git a/docs/Makefile b/docs/Makefile old mode 100644 new mode 100755 diff --git a/docs/Tutorial - Spreading news.rst b/docs/Tutorial - Spreading news.rst deleted file mode 100644 index 8eaf7cd..0000000 --- a/docs/Tutorial - Spreading news.rst +++ /dev/null @@ -1,1284 +0,0 @@ -Developing new models ---------------------- - -Introduction -============ - -This notebook is an introduction to the soil agent-based social network -simulation framework. In particular, we will focus on a specific use -case: studying the propagation of news in a social network. - -The steps we will follow are: - -- Modelling the behavior of agents -- Running the simulation using different configurations -- Analysing the results of each simulation - -But before that, let's import the soil module and networkx. - -.. code:: ipython3 - - import soil - import networkx as nx - -.. code:: ipython3 - - %pylab inline - # To display plots in the notebook - - -.. parsed-literal:: - - Populating the interactive namespace from numpy and matplotlib - - -Basic concepts -============== - -There are three main elements in a soil simulation: - -- The network topology. A simulation may use an existing NetworkX - topology, or generate one on the fly -- Agents. There are two types: 1) network agents, which are linked to a - node in the topology, and 2) environment agents, which are freely - assigned to the environment. -- The environment. It assigns agents to nodes in the network, and - stores the environment parameters (shared state for all agents). - -Soil is based on ``simpy``, which is an event-based network simulation -library. Soil provides several abstractions over events to make -developing agents easier. This means you can use events (timeouts, -delays) in soil, but for the most part we will assume your models will -be step-based. - -Modeling behaviour -================== - -Our first step will be to model how every person in the social network -reacts when it comes to news. We will follow a very simple model (a -finite state machine). - -There are two types of people, those who have heard about a newsworthy -event (infected) or those who have not (neutral). A neutral person may -heard about the news either on the TV (with probability -**prob\_tv\_spread**) or through their friends. Once a person has heard -the news, they will spread it to their friends (with a probability -**prob\_neighbor\_spread**). Some users do not have a TV, so they only -rely on their friends. - -The spreading probabilities will change over time due to different -factors. We will represent this variance using an environment agent. - -Network Agents -++++++++++++++ - -A basic network agent in Soil should inherit from -``soil.agents.BaseAgent``, and define its behaviour in every step of the -simulation by implementing a ``run(self)`` method. The most important -attributes of the agent are: - -- ``agent.state``, a dictionary with the state of the agent. - ``agent.state['id']`` reflects the state id of the agent. That state - id can be used to look for other networks in that specific state. The - state can be access via the agent as well. For instance: - - .. code:: py - - a = soil.agents.BaseAgent(env=env) - a['hours_of_sleep'] = 10 - print(a['hours_of_sleep']) - - The state of the agent is stored in every step of the simulation: - ``py print(a['hours_of_sleep', 10]) # hours of sleep before step #10 print(a[None, 0]) # whole state of the agent before step #0`` - -- ``agent.env``, a reference to the environment. Most commonly used to - get access to the environment parameters and the topology: - - .. code:: py - - a.env.G.nodes() # Get all nodes ids in the topology - a.env['minimum_hours_of_sleep'] - -Since our model is a finite state machine, we will be basing it on -``soil.agents.FSM``. - -With ``soil.agents.FSM``, we do not need to specify a ``step`` method. -Instead, we describe every step as a function. To change to another -state, a function may return the new state. If no state is returned, the -state remains unchanged.[ It will consist of two states, ``neutral`` -(default) and ``infected``. - -Here's the code: - -.. code:: ipython3 - - import random - - class NewsSpread(soil.agents.FSM): - @soil.agents.default_state - @soil.agents.state - def neutral(self): - r = random.random() - if self['has_tv'] and r < self.env['prob_tv_spread']: - return self.infected - return - - @soil.agents.state - def infected(self): - prob_infect = self.env['prob_neighbor_spread'] - for neighbor in self.get_neighboring_agents(state_id=self.neutral.id): - r = random.random() - if r < prob_infect: - neighbor.state['id'] = self.infected.id - return - - -Environment agents -++++++++++++++++++ - -Environment agents allow us to control the state of the environment. In -this case, we will use an environment agent to simulate a very viral -event. - -When the event happens, the agent will modify the probability of -spreading the rumor. - -.. code:: ipython3 - - NEIGHBOR_FACTOR = 0.9 - TV_FACTOR = 0.5 - class NewsEnvironmentAgent(soil.agents.BaseAgent): - def step(self): - if self.now == self['event_time']: - self.env['prob_tv_spread'] = 1 - self.env['prob_neighbor_spread'] = 1 - elif self.now > self['event_time']: - self.env['prob_tv_spread'] = self.env['prob_tv_spread'] * TV_FACTOR - self.env['prob_neighbor_spread'] = self.env['prob_neighbor_spread'] * NEIGHBOR_FACTOR - -Testing the agents -++++++++++++++++++ - -Feel free to skip this section if this is your first time with soil. - -Testing agents is not easy, and this is not a thorough testing process -for agents. Rather, this section is aimed to show you how to access -internal pats of soil so you can test your agents. - -First of all, let's check if our network agent has the states we would -expect: - -.. code:: ipython3 - - NewsSpread.states - - - - -.. parsed-literal:: - - {'infected': , - 'neutral': } - - - -Now, let's run a simulation on a simple network. It is comprised of -three nodes: - -.. code:: ipython3 - - G = nx.Graph() - G.add_edge(0, 1) - G.add_edge(0, 2) - G.add_edge(2, 3) - G.add_node(4) - pos = nx.spring_layout(G) - nx.draw_networkx(G, pos, node_color='red') - nx.draw_networkx(G, pos, nodelist=[0], node_color='blue') - - - -.. image:: output_21_0.png - - -Let's run a simple simulation that assigns a NewsSpread agent to all the -nodes in that network. Notice how node 0 is the only one with a TV. - -.. code:: ipython3 - - env_params = {'prob_tv_spread': 0, - 'prob_neighbor_spread': 0} - - MAX_TIME = 100 - EVENT_TIME = 10 - - sim = soil.simulation.SoilSimulation(topology=G, - num_trials=1, - max_time=MAX_TIME, - environment_agents=[{'agent_type': NewsEnvironmentAgent, - 'state': { - 'event_time': EVENT_TIME - }}], - network_agents=[{'agent_type': NewsSpread, - 'weight': 1}], - states={0: {'has_tv': True}}, - default_state={'has_tv': False}, - environment_params=env_params) - env = sim.run_simulation()[0] - - -.. parsed-literal:: - - Trial: 0 - Running - Finished trial in 0.014928102493286133 seconds - Finished simulation in 0.015764951705932617 seconds - - -Now we can access the results of the simulation and compare them to our -expected results - -.. code:: ipython3 - - agents = list(env.network_agents) - - # Until the event, all agents are neutral - for t in range(10): - for a in agents: - assert a['id', t] == a.neutral.id - - # After the event, the node with a TV is infected, the rest are not - assert agents[0]['id', 11] == NewsSpread.infected.id - - for a in agents[1:4]: - assert a['id', 11] == NewsSpread.neutral.id - - # At the end, the agents connected to the infected one will probably be infected, too. - assert agents[1]['id', MAX_TIME] == NewsSpread.infected.id - assert agents[2]['id', MAX_TIME] == NewsSpread.infected.id - - # But the node with no friends should not be affected - assert agents[4]['id', MAX_TIME] == NewsSpread.neutral.id - - -Lastly, let's see if the probabilities have decreased as expected: - -.. code:: ipython3 - - assert abs(env.environment_params['prob_neighbor_spread'] - (NEIGHBOR_FACTOR**(MAX_TIME-1-10))) < 10e-4 - assert abs(env.environment_params['prob_tv_spread'] - (TV_FACTOR**(MAX_TIME-1-10))) < 10e-6 - -Running the simulation -====================== - -To run a simulation, we need a configuration. Soil can load -configurations from python dictionaries as well as JSON and YAML files. -For this demo, we will use a python dictionary: - -.. code:: ipython3 - - config = { - 'name': 'ExampleSimulation', - 'max_time': 20, - 'interval': 1, - 'num_trials': 1, - 'network_params': { - 'generator': 'complete_graph', - 'n': 500, - }, - 'network_agents': [ - { - 'agent_type': NewsSpread, - 'weight': 1, - 'state': { - 'has_tv': False - } - }, - { - 'agent_type': NewsSpread, - 'weight': 2, - 'state': { - 'has_tv': True - } - } - ], - 'states': [ {'has_tv': True} ], - 'environment_params':{ - 'prob_tv_spread': 0.01, - 'prob_neighbor_spread': 0.5 - } - } - -Let's run our simulation: - -.. code:: ipython3 - - soil.simulation.run_from_config(config, dump=False) - - -.. parsed-literal:: - - Using config(s): ExampleSimulation - Trial: 0 - Running - Finished trial in 1.4140360355377197 seconds - Finished simulation in 2.4056642055511475 seconds - - -In real life, you probably want to run several simulations, varying some -of the parameters so that you can compare and answer your research -questions. - -For instance: - -- Does the outcome depend on the structure of our network? We will use - different generation algorithms to compare them (Barabasi-Albert and - Erdos-Renyi) -- How does neighbor spreading probability affect my simulation? We will - try probability values in the range of [0, 0.4], in intervals of 0.1. - -.. code:: ipython3 - - network_1 = { - 'generator': 'erdos_renyi_graph', - 'n': 500, - 'p': 0.1 - } - network_2 = { - 'generator': 'barabasi_albert_graph', - 'n': 500, - 'm': 2 - } - - - for net in [network_1, network_2]: - for i in range(5): - prob = i / 10 - config['environment_params']['prob_neighbor_spread'] = prob - config['network_params'] = net - config['name'] = 'Spread_{}_prob_{}'.format(net['generator'], prob) - s = soil.simulation.run_from_config(config) - - -.. parsed-literal:: - - Using config(s): Spread_erdos_renyi_graph_prob_0.0 - Trial: 0 - Running - Finished trial in 0.2691483497619629 seconds - Finished simulation in 0.3650345802307129 seconds - Using config(s): Spread_erdos_renyi_graph_prob_0.1 - Trial: 0 - Running - Finished trial in 0.34261059761047363 seconds - Finished simulation in 0.44017767906188965 seconds - Using config(s): Spread_erdos_renyi_graph_prob_0.2 - Trial: 0 - Running - Finished trial in 0.34417223930358887 seconds - Finished simulation in 0.4550771713256836 seconds - Using config(s): Spread_erdos_renyi_graph_prob_0.3 - Trial: 0 - Running - Finished trial in 0.3237779140472412 seconds - Finished simulation in 0.42307496070861816 seconds - Using config(s): Spread_erdos_renyi_graph_prob_0.4 - Trial: 0 - Running - Finished trial in 0.3507683277130127 seconds - Finished simulation in 0.45061564445495605 seconds - Using config(s): Spread_barabasi_albert_graph_prob_0.0 - Trial: 0 - Running - Finished trial in 0.19115304946899414 seconds - Finished simulation in 0.20927715301513672 seconds - Using config(s): Spread_barabasi_albert_graph_prob_0.1 - Trial: 0 - Running - Finished trial in 0.22086191177368164 seconds - Finished simulation in 0.2390913963317871 seconds - Using config(s): Spread_barabasi_albert_graph_prob_0.2 - Trial: 0 - Running - Finished trial in 0.21225976943969727 seconds - Finished simulation in 0.23252630233764648 seconds - Using config(s): Spread_barabasi_albert_graph_prob_0.3 - Trial: 0 - Running - Finished trial in 0.2853121757507324 seconds - Finished simulation in 0.30568504333496094 seconds - Using config(s): Spread_barabasi_albert_graph_prob_0.4 - Trial: 0 - Running - Finished trial in 0.21434736251831055 seconds - Finished simulation in 0.23370599746704102 seconds - - -The results are conveniently stored in pickle (simulation), csv (history -of agent and environment state) and gexf format. - -.. code:: ipython3 - - !tree soil_output - !du -xh soil_output/* - - -.. parsed-literal:: - - soil_output - ├── Sim_prob_0 - │   ├── Sim_prob_0.dumped.yml - │   ├── Sim_prob_0.simulation.pickle - │   ├── Sim_prob_0_trial_0.environment.csv - │   └── Sim_prob_0_trial_0.gexf - ├── Spread_barabasi_albert_graph_prob_0.0 - │   ├── Spread_barabasi_albert_graph_prob_0.0.dumped.yml - │   ├── Spread_barabasi_albert_graph_prob_0.0.simulation.pickle - │   ├── Spread_barabasi_albert_graph_prob_0.0_trial_0.environment.csv - │   └── Spread_barabasi_albert_graph_prob_0.0_trial_0.gexf - ├── Spread_barabasi_albert_graph_prob_0.1 - │   ├── Spread_barabasi_albert_graph_prob_0.1.dumped.yml - │   ├── Spread_barabasi_albert_graph_prob_0.1.simulation.pickle - │   ├── Spread_barabasi_albert_graph_prob_0.1_trial_0.environment.csv - │   └── Spread_barabasi_albert_graph_prob_0.1_trial_0.gexf - ├── Spread_barabasi_albert_graph_prob_0.2 - │   ├── Spread_barabasi_albert_graph_prob_0.2.dumped.yml - │   ├── Spread_barabasi_albert_graph_prob_0.2.simulation.pickle - │   ├── Spread_barabasi_albert_graph_prob_0.2_trial_0.environment.csv - │   └── Spread_barabasi_albert_graph_prob_0.2_trial_0.gexf - ├── Spread_barabasi_albert_graph_prob_0.3 - │   ├── Spread_barabasi_albert_graph_prob_0.3.dumped.yml - │   ├── Spread_barabasi_albert_graph_prob_0.3.simulation.pickle - │   ├── Spread_barabasi_albert_graph_prob_0.3_trial_0.environment.csv - │   └── Spread_barabasi_albert_graph_prob_0.3_trial_0.gexf - ├── Spread_barabasi_albert_graph_prob_0.4 - │   ├── Spread_barabasi_albert_graph_prob_0.4.dumped.yml - │   ├── Spread_barabasi_albert_graph_prob_0.4.simulation.pickle - │   ├── Spread_barabasi_albert_graph_prob_0.4_trial_0.environment.csv - │   └── Spread_barabasi_albert_graph_prob_0.4_trial_0.gexf - ├── Spread_erdos_renyi_graph_prob_0.0 - │   ├── Spread_erdos_renyi_graph_prob_0.0.dumped.yml - │   ├── Spread_erdos_renyi_graph_prob_0.0.simulation.pickle - │   ├── Spread_erdos_renyi_graph_prob_0.0_trial_0.environment.csv - │   └── Spread_erdos_renyi_graph_prob_0.0_trial_0.gexf - ├── Spread_erdos_renyi_graph_prob_0.1 - │   ├── Spread_erdos_renyi_graph_prob_0.1.dumped.yml - │   ├── Spread_erdos_renyi_graph_prob_0.1.simulation.pickle - │   ├── Spread_erdos_renyi_graph_prob_0.1_trial_0.environment.csv - │   └── Spread_erdos_renyi_graph_prob_0.1_trial_0.gexf - ├── Spread_erdos_renyi_graph_prob_0.2 - │   ├── Spread_erdos_renyi_graph_prob_0.2.dumped.yml - │   ├── Spread_erdos_renyi_graph_prob_0.2.simulation.pickle - │   ├── Spread_erdos_renyi_graph_prob_0.2_trial_0.environment.csv - │   └── Spread_erdos_renyi_graph_prob_0.2_trial_0.gexf - ├── Spread_erdos_renyi_graph_prob_0.3 - │   ├── Spread_erdos_renyi_graph_prob_0.3.dumped.yml - │   ├── Spread_erdos_renyi_graph_prob_0.3.simulation.pickle - │   ├── Spread_erdos_renyi_graph_prob_0.3_trial_0.environment.csv - │   └── Spread_erdos_renyi_graph_prob_0.3_trial_0.gexf - └── Spread_erdos_renyi_graph_prob_0.4 - ├── Spread_erdos_renyi_graph_prob_0.4.dumped.yml - ├── Spread_erdos_renyi_graph_prob_0.4.simulation.pickle - ├── Spread_erdos_renyi_graph_prob_0.4_trial_0.environment.csv - └── Spread_erdos_renyi_graph_prob_0.4_trial_0.gexf - - 11 directories, 44 files - 1.8M soil_output/Sim_prob_0 - 652K soil_output/Spread_barabasi_albert_graph_prob_0.0 - 684K soil_output/Spread_barabasi_albert_graph_prob_0.1 - 692K soil_output/Spread_barabasi_albert_graph_prob_0.2 - 692K soil_output/Spread_barabasi_albert_graph_prob_0.3 - 688K soil_output/Spread_barabasi_albert_graph_prob_0.4 - 1.8M soil_output/Spread_erdos_renyi_graph_prob_0.0 - 1.9M soil_output/Spread_erdos_renyi_graph_prob_0.1 - 1.9M soil_output/Spread_erdos_renyi_graph_prob_0.2 - 1.9M soil_output/Spread_erdos_renyi_graph_prob_0.3 - 1.9M soil_output/Spread_erdos_renyi_graph_prob_0.4 - - -Analysing the results -===================== - -Once the simulations are over, we can use soil to analyse the results. - -First, let's load the stored results into a pandas dataframe. - -.. code:: ipython3 - - %pylab inline - from soil import analysis - - -.. parsed-literal:: - - Populating the interactive namespace from numpy and matplotlib - - -.. parsed-literal:: - - /usr/lib/python3.6/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['random'] - `%matplotlib` prevents importing * from pylab and numpy - "\n`%matplotlib` prevents importing * from pylab and numpy" - - -.. code:: ipython3 - - config_file, df, config = list(analysis.get_data('soil_output/Spread_barabasi*prob_0.1*', process=False))[0] - df - - - - -.. raw:: html - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
agent_idtstepattributevalue
0env0prob_tv_spread0.01
1env0prob_neighbor_spread0.1
2env1prob_tv_spread0.01
3env1prob_neighbor_spread0.1
4env2prob_tv_spread0.01
5env2prob_neighbor_spread0.1
6env3prob_tv_spread0.01
7env3prob_neighbor_spread0.1
8env4prob_tv_spread0.01
9env4prob_neighbor_spread0.1
10env5prob_tv_spread0.01
11env5prob_neighbor_spread0.1
12env6prob_tv_spread0.01
13env6prob_neighbor_spread0.1
14env7prob_tv_spread0.01
15env7prob_neighbor_spread0.1
16env8prob_tv_spread0.01
17env8prob_neighbor_spread0.1
18env9prob_tv_spread0.01
19env9prob_neighbor_spread0.1
20env10prob_tv_spread0.01
21env10prob_neighbor_spread0.1
22env11prob_tv_spread0.01
23env11prob_neighbor_spread0.1
24env12prob_tv_spread0.01
25env12prob_neighbor_spread0.1
26env13prob_tv_spread0.01
27env13prob_neighbor_spread0.1
28env14prob_tv_spread0.01
29env14prob_neighbor_spread0.1
...............
210124996has_tvTrue
210134996idneutral
210144997has_tvTrue
210154997idneutral
210164998has_tvTrue
210174998idneutral
210184999has_tvTrue
210194999idneutral
2102049910has_tvTrue
2102149910idneutral
2102249911has_tvTrue
2102349911idneutral
2102449912has_tvTrue
2102549912idneutral
2102649913has_tvTrue
2102749913idneutral
2102849914has_tvTrue
2102949914idneutral
2103049915has_tvTrue
2103149915idneutral
2103249916has_tvTrue
2103349916idneutral
2103449917has_tvTrue
2103549917idneutral
2103649918has_tvTrue
2103749918idneutral
2103849919has_tvTrue
2103949919idneutral
2104049920has_tvTrue
2104149920idinfected
-

21042 rows × 4 columns

-
- - - -.. code:: ipython3 - - list(analysis.get_data('soil_output/Spread_barabasi*prob_0.1*', process=True))[0][1] - - - - -.. raw:: html - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
value0.010.1FalseTrueinfectedneutral
tstep
01.01.0163.0337.00.0500.0
11.01.0163.0337.03.0497.0
21.01.0163.0337.06.0494.0
31.01.0163.0337.012.0488.0
41.01.0163.0337.023.0477.0
51.01.0163.0337.036.0464.0
61.01.0163.0337.053.0447.0
71.01.0163.0337.079.0421.0
81.01.0163.0337.0119.0381.0
91.01.0163.0337.0164.0336.0
101.01.0163.0337.0204.0296.0
111.01.0163.0337.0254.0246.0
121.01.0163.0337.0293.0207.0
131.01.0163.0337.0336.0164.0
141.01.0163.0337.0365.0135.0
151.01.0163.0337.0391.0109.0
161.01.0163.0337.0407.093.0
171.01.0163.0337.0424.076.0
181.01.0163.0337.0442.058.0
191.01.0163.0337.0452.048.0
201.01.0163.0337.0464.036.0
-
- - - -If you don't want to work with pandas, you can also use some pre-defined -functions from soil to conveniently plot the results: - -.. code:: ipython3 - - analysis.plot_all('soil_output/Spread_barabasi*', attributes=['id']) - - - -.. image:: output_44_0.png - - - -.. image:: output_44_1.png - - - -.. image:: output_44_2.png - - - -.. image:: output_44_3.png - - - -.. image:: output_44_4.png - - -.. code:: ipython3 - - analysis.plot_all('soil_output/Spread_erdos*', attributes=['id']) - - - -.. image:: output_45_0.png - - - -.. image:: output_45_1.png - - - -.. image:: output_45_2.png - - - -.. image:: output_45_3.png - - - -.. image:: output_45_4.png - diff --git a/docs/conf.py b/docs/conf.py old mode 100644 new mode 100755 diff --git a/docs/index.rst b/docs/index.rst old mode 100644 new mode 100755 index 24fbf0b..6d96db2 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,38 +8,13 @@ Welcome to Soil's documentation! Soil is an Agent-based Social Simulator in Python for modelling and simulation of Social Networks. -If you use Soil in your research, do not forget to cite this paper: - -.. code:: bibtex - - @inbook{soil-gsi-conference-2017, - author = "S{\'a}nchez, Jes{\'u}s M. and Iglesias, Carlos A. and S{\'a}nchez-Rada, J. Fernando", - booktitle = "Advances in Practical Applications of Cyber-Physical Multi-Agent Systems: The PAAMS Collection", - doi = "10.1007/978-3-319-59930-4_19", - editor = "Demazeau Y., Davidsson P., Bajo J., Vale Z.", - isbn = "978-3-319-59929-8", - keywords = "soil;social networks;agent based social simulation;python", - month = "June", - organization = "PAAMS 2017", - pages = "234-245", - publisher = "Springer Verlag", - series = "LNAI", - title = "{S}oil: {A}n {A}gent-{B}ased {S}ocial {S}imulator in {P}ython for {M}odelling and {S}imulation of {S}ocial {N}etworks", - url = "https://link.springer.com/chapter/10.1007/978-3-319-59930-4_19", - volume = "10349", - year = "2017", - } - - - - .. toctree:: :maxdepth: 2 :caption: Learn more about soil: installation - quickstart - Tutorial - Spreading news + usage + models diff --git a/docs/installation.rst b/docs/installation.rst old mode 100644 new mode 100755 index a1fddd4..f4fa73c --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,24 +1,7 @@ Installation ------------ - -The easiest way to install Soil is through pip: +The latest version can be installed through GitLab. .. code:: bash - pip install soil - - -Now test that it worked by running the command line tool - -.. code:: bash - - soil --help - -Or using soil programmatically: - -.. code:: python - - import soil - print(soil.__version__) - -The latest version can be installed through `GitLab `_. + git clone https://lab.cluster.gsi.dit.upm.es/soil/soil.git \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat old mode 100644 new mode 100755 diff --git a/docs/models.rst b/docs/models.rst new file mode 100755 index 0000000..d179d7b --- /dev/null +++ b/docs/models.rst @@ -0,0 +1,112 @@ +Developing new models +--------------------- +This document describes how to develop a new analysis model. + +What is a model? +================ + +A model defines the behaviour of the agents with a view to assessing their effects on the system as a whole. +In practice, a model consists of at least two parts: + +* Python module: the actual code that describes the behaviour. +* Setting up the variables in the Settings JSON file. + +This separation allows us to run the simulation with different agents. + +Models Code +=========== + +All the models are imported to the main file. The initialization look like this: + +.. code:: python + + import settings + + networkStatus = {} # Dict that will contain the status of every agent in the network + + sentimentCorrelationNodeArray = [] + for x in range(0, settings.network_params["number_of_nodes"]): + sentimentCorrelationNodeArray.append({'id': x}) + # Initialize agent states. Let's assume everyone is normal. + init_states = [{'id': 0, } for _ in range(settings.network_params["number_of_nodes"])] + # add keys as as necessary, but "id" must always refer to that state category + +A new model have to inherit the BaseBehaviour class which is in the same module. +There are two basics methods: + +* __init__ +* step: used to define the behaviour over time. + +Variable Initialization +======================= + +The different parameters of the model have to be initialize in the Simulation Settings JSON file which will be +passed as a parameter to the simulation. + +.. code:: json + + { + "agent": ["SISaModel","ControlModelM2"], + + "neutral_discontent_spon_prob": 0.04, + "neutral_discontent_infected_prob": 0.04, + "neutral_content_spon_prob": 0.18, + "neutral_content_infected_prob": 0.02, + + "discontent_neutral": 0.13, + "discontent_content": 0.07, + "variance_d_c": 0.02, + + "content_discontent": 0.009, + "variance_c_d": 0.003, + "content_neutral": 0.088, + + "standard_variance": 0.055, + + + "prob_neutral_making_denier": 0.035, + + "prob_infect": 0.075, + + "prob_cured_healing_infected": 0.035, + "prob_cured_vaccinate_neutral": 0.035, + + "prob_vaccinated_healing_infected": 0.035, + "prob_vaccinated_vaccinate_neutral": 0.035, + "prob_generate_anti_rumor": 0.035 + } + +In this file you will also define the models you are going to simulate. You can simulate as many models as you want. +The simulation returns one result for each model, executing each model separately. For the usage, see :doc:`usage`. + +Example Model +============= + +In this section, we will implement a Sentiment Correlation Model. + +The class would look like this: + +.. code:: python + + from ..BaseBehaviour import * + from .. import sentimentCorrelationNodeArray + + class SentimentCorrelationModel(BaseBehaviour): + + def __init__(self, environment=None, agent_id=0, state=()): + super().__init__(environment=environment, agent_id=agent_id, state=state) + self.outside_effects_prob = environment.environment_params['outside_effects_prob'] + self.anger_prob = environment.environment_params['anger_prob'] + self.joy_prob = environment.environment_params['joy_prob'] + self.sadness_prob = environment.environment_params['sadness_prob'] + self.disgust_prob = environment.environment_params['disgust_prob'] + self.time_awareness = [] + for i in range(4): # In this model we have 4 sentiments + self.time_awareness.append(0) # 0-> Anger, 1-> joy, 2->sadness, 3 -> disgust + sentimentCorrelationNodeArray[self.id][self.env.now] = 0 + + def step(self, now): + self.behaviour() # Method which define the behaviour + super().step(now) + +The variables will be modified by the user, so you have to include them in the Simulation Settings JSON file. \ No newline at end of file diff --git a/docs/output_21_0.png b/docs/output_21_0.png deleted file mode 100644 index df257821b189e9455590549421910c0123187685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8743 zcmd6NXHZnpwkA1)l7k4^lC!jcNK`=uBuJ2)RJtWMIcHFUh)8Up0SO{G=hPq|p#en! zfhH$OO;Bi%G@E=6^FYx(A({Lf@=h7 zDtGn0Gq$Gv+zpmd=eu~BYkYTA8pC7Eaw3^bK0Q;uOB#KfDhzVZ*yL(A>1PU$@Q}H< z8c#b%L1vE{QHK1wYo1Ky`6Yri_6`HJ-DHWO$_C29^b*!+BeiR0ZS6`2ckjEt&pCzLN9pReU2#1XmGvB3 z8b=nw-@)CZo7{Bnaq?vZdp9iYe|*%uGCVZ&w(t=>J*5M-!KJ;qzO>Z5bRLH*9u#SQ z#g`l0%~kTeVg@q=t)|1Z)qh-s!Qs``pI=S3wMItjTfu_j^3COYu;K)shTi6E6MPVe zAVVCYUSKMx>;VjxfN=;zItqx1z5QIzLLdKffgTs3yh>FrN9dO$<&G!CWiH}m9jC_b zyx@UA3Iw_4+h`h~lJ+a=*?D!lp7iu;B_`sZ(k7_Um$PG$%tW)KLqrICLGUt~!irpn z3XA&mOjU(Px)PJzSekrF=MQyaj*9GM|IV-fpT4T}zh}T>9bLy#{c`20w6n9i+M00< zMqWKD^Gm~VW%<`Sc)ETH|A>_!mY0_*bGj#^MccR%ubZv(y6?n))}A|YZ<@Jhhi;=U z-A(Kix1Q8=PnAP}cHq&-@@!r7^~L5YcV{KKgh2HQ;>7qqYe}P~dhYu@UcBdZ27*QU zdGopr8oC!(VtHi~M>q@AVjWR@i6a@{E0uTr9WXk=B;UOC+e&FvEBi)=I*VqZeD%Q# zw6jr*sBA=ZcyOordzjWtL1H|Y&9F|W&Mfr_N$RDOzlkh1c~Jgxo_VS0@Ca~C&P)57 z!Uq-{HUb|h4lf_Ff8|OgGNZuA<|lm*U-lEr_dY&*ktjSe2X-mQGKi(hh^$)0$Cr;A z{v4zBZdcd%Y@B#y|CJR)HwxVB+3$mo2C#0Dv$&%6SEa!>3`~;a`;xcPT7?;?Bbs?s zfd@x7Z8b-sf5XrdPfWSx^`~7_@*rTy%*RL8^F&$7uRPZObe3wWj{Z%vp-15FT$hr^ zJS|MP_m?9gA|7WcqMW9i;xjXcl;}!$P$L4O)fBjW$@sYiJH-m>-r^C-FkN4~d~$D< z>b?8(VlLIb`*uBV*za$Qm9AkMp)suDD|-Xt@WC{xmImIG^`Pl9ibUeA;2{3go6sWl zVn#M$&!DVY`*FS^YRHEVh?MV7EiAMG0~HM|e0bN^)@axz!$nQ&BwQ9$4sg>0XQ#(L zYxyY+>qW)Ae_c&qdHoD`k?)UhqQ|&+&9UvgNMh-6DRbN>E3`h~vS2|Q^~+W(=K zi9&6`Rup{y?C@$NcjXR1_E{=Ap7$C>H0!%8_0nf41+`iFEGGpXOu(CwK6u=8zzPO= z_U$1zYIj$gti`3IM@QzZ!IjM<$BC-$*R)qwG}CVFvWS`-CJO4cgUx_-ybMFfD z*6ZC*5?JM%Yqh?J3Jd=}-fo{Yt+iXWwY9yNZP^|efZbqKOEUUA9a`6yl8~@?McUy} zA3hnqK3aUV8yAG>PZE|z%n_8D*28{%{qPudC#krsNk~wN$$54-2U|Z;)hbAS3Dtcx z7&p?qdb3B#cg5?ONt?gy?BB8apDjMnt*LtWWR308%F6rXj~bdI2;{^Aui?U4RA=k1 zfVen(zB59^q$aX{#y4hf&sD7L@R?KF5$vO8`hzcTuj-jUySF)2AIA=b?M&L2yDW53 zK6uO7w-~3Sl_F-YYo7K9)y;vs6G7S7Uu}9Z$HZh(u-bHG2z6!Biu@vg&QE902S40@ z?Y&v~ML%`N|( zwra<3gOfQu#uw-nXvyz(F=pJRcck@=|EoPe6Rgka)HoMPZPb9co?`CFUTj#dXw#5y zTn#G}tG&x1WyfS%=P-YazwSc&lq7);U$dmAjBu)e3Vt}<^ChvIZ%zm2e}{VXcp zej;gT8Q@W*L7Sw7x>Nb0j{*4P=v!Q1SJv4d{yQG)D%&%y#&r(HMFWgcQJt-sQPS9F zu#+WzrEdt0_xbtxHytN$QBhO-EXK;b94%tbeHgcL@_QH#vN){%lQw@MyZI4(7p0zBfK1WU8-VHm^dbtYOtTo7>M|LAR>w zF%H$p*vOzlTGQqEIJoGfbcvj6$m_L+8qs%herO2oi1#`w?>g@Wl31AbzGv+53ZeGff^F!zuk&)Kcfrr-HUq6JUBZKyfE%%oPQVNHHPc8_sKV)7Q{%dVdq5rLUEKT;y{%f}Q!}F^|2ValWjP!`o!mcbkuX zZ@3>y*^eFmtb8tog?Q|NnDL9_Qov$b?8nQ_e&}f*?Jj=NGf%!Hu}gy|L~jeV3=!`M z)lN{km+knnzBBml!pMT-4{O!JyA;dL#c|3mTo`(ZO=9l193v?4gKlnai>`2pt(oW6 z+$;L@rOf?BDb#{(EXwlW1`R{gfIK_wG_Wkqee2!dc2dvPD^a0^{ z3ZO{a!&rB?TNE4i{3eliiq#mV{>Bs+kyEt%Hfc!=$vNL#mYp2zUT46cU!U&Zgm%C~ z@I`{y!4~hGIib&@&wJi{L&Wf4L8P5T3zs3FzsE{VkBKkIXD3iZ35_8x4Wm+{qqFS| zKUqKM97QWyJ(M~g2=17epy85BK0k~*|C-^Z)}*a?6b|qpYc(q<^Txxs5)MBlGQAfl zegFK5UmwZKeCZDgdCjjkm*O+yJ1jpwo{xXX^`t^WJp<&Uh*3rGu;THXtn-uA&7YNF zAlgPsO=Vcb%u?6)@(3xl8=Pm%7LENxN=j(z9HR8@Lf|XFp-Zj!nMIV>%)Ex>Uxoxe z%^aWKD~~g7#}kv&B~v7POUw@$&ZV1s@j`ifCaOq>$LST_RrR}f36JsH z7ny@W$)&t`Lvw*TLnyi7%{eu*s{0HA$%0Z*-dzDgOJBGR&0*K}*f^1k7P~iZPrCR1 zamVN69FFn6C;1Y`jfZFY^oTe8g2+HYfoxX7W8FOD9=%WAdR#jznh>$3* zvgbAU9$>Tl04DK_q{cD*=N(msYoemDl#F~8ZmU{#PSgDW_PY*u7iB@cYgo>G;~e*4s-lBR+!O2gQB% z?4Uj|Ir##(EPR%kO=|7Bg9(X2tuP;zSz5jCB$k*=wz?+ea%pmTMQCoL5fS0n9=P)> z_Z`x>9&ZC9+a4&~cO!(*KB$HbrYiVJU-+pznweA9HQc_e5jgLT1birCj>zF|2Wtn{ zt{{T4qv;0O3kHAAQzm|5#Y}FM#0DzE2I9w=C#vX&>^ZU#6RaJIKCZ6ojA|hp`ME1hmH6=7F7&ZT0SCdXw z++~veA_ECucZsl%dpepA9#nwT$wq~mb3~Pth_HxTU;qg)+6m)Etj)9<<$p*O3AJiZ zo7+6Se(ma^$8uQX=e^}LRXuGfO%FoKgaqR9Hja}8Q4=Qry+3muR$PADGZKL zNua=bQ)s!`9lgL$k-&dj#?*ZmImAo3!7_vsq0BP~r9wy3(}gG%#?SAs=A*C8X^?1q ze)@q|ZoL#iHxT(~%g(rJk?rm$8B*!7A37SIKQ!i*+*sp(*%?(Wl607Ro!vz+zUElX zvh928s|LqGVhw0DJpD<3Qag~FjJnf^PCRi2{V7NB?qaT!#ly?%uY>7G+@@($8A>bt zYQMz)0L|*Hr=ubhF3e9@o)fJY`Zn8xJ88~~jijPFfJL~I9P{SetUS9p2v%FnkX7GX zrCC?%1QwBOfN%bP*9xKvwYAba&GRbd26^RPwf+^Fs&`%mjO(L$v!{q@orvtd`eV=r zyH09&UL@#rvlkTbh6~cxwj1k=0E~voU0DcP?ie*p(%09wOKb8(EALDe-0W$IQAg^{ z=PxI!c!dqi@&Id96K=eDvpN=MvB6LWTJ5NGP@NO)%UhE#fgwpAFL?aGKyJ|anLnUxg<{1|z_uS@L7x)iI8|5ahj*%~sxqp4rdp(7 z=MId0e;M%ex!gF#g$wGRb$*o9xKY;ZUMUrIF(?7pu>ASSZxQpR#1sqPD3IvYZmUE3 zDWd`cSXG{Rr=~SN#k0fbll9Kp0DQa`qWE>qb$@|l;1L{Bz?(@sVS52z=zYTuWxI{I zme1^j5#43h10n$}?BFeOOQPC%w1yoHo5DC0BNe!3B~^JuxV+~GrJZLmpeptD_b=ev z&jX4ysPaudPh-*uw23~4SfCwYW5v4ZIAtzGQgaY{YI3lNDi2TF$+9?LB8pB8^JHbs zxI27W8J}WGU04Q?enD2Ro3~x@u2z&1MY`!hq?zvcFan$f)5UrYBO@c;%SndbN6RTk z%i=+5o}SV{=f|^p=1*UCG2mDUnuS}$-Z&KhVwhuqn!;flgPX6snFS#8(l89$1s(NS zMLn!{nogB*wg7fU7q`(vgKvu!AVo|Uf4{rV|CtiW_qWiM#+S4aUl`014O_v@lSmbxXNnJ&F7 z(|$xdtbpg#R@i3(1nl{6W`A|HDv+vZN4Dx`wXChL!%-eAAX9BXUsWhpXz>K(MOYGm zKv4H(K!?;5PRZDSYuW&f3ZNkSp%(_VJmm5TS2{l$cKBHl0;=VV_hPJmN}?;sNXiJ| zvWCz&rL$Dw@|O36#AFhHdw?{)UIHS6B@tg}Q7vBq%V_WY)jL>;j1 zFDzhw{yQDy4RYp9?$)~t-GyR;Yha%Y>VOshgAAn4p71SxiGz1V(sKglJ!-=n3oN>~ zwflwpLUkxHt$zy);uuJKda+TSD$HSNY|?k5X<*C z6%AZC6bmSJQ%osX&bDS{IBOX6zs8NOyjzpC&%b}v1RHR=IH*sw9JeBYCBAsv;Bt!P zkXPGpRNAbLK8f3E=T$FstPGju>QKbO!V(kbjcJ&+3eU5%lOwFxY``A?!3M=ozZDr2 zi+i##p)+JFo~iCMElg)iN}{j6y7an5{@1v;wbZ(_9|YoY%ch^n6Nl|9$O=>k?J$rL z3`4IT9Z9^P5HaTn_g$VkNlGG}N*1G?TwdjG{v(w35y+VFfAau2ZaF_Y#<~qFTr{dD z<$+0R+ifvP$zx|QF9FdAEOu^xsV_>jj_i&bD}5mkU>c;f?`2b3 zf%c}XpZqrajv%M+Qy_ur=gw}FCs;qVIc7xPMTg|0#c#yvB_@$R|04*ngg)xyCyJ*f z=$yxQ*hw?4_ykJ+m3iv4LDW;-iJfXG}IW6*e08`iuWL_5FL3^jpLq3H*YC3d_C$epp;c2hIWV zt;T`f?fW8nXx%e2C{Vtr5PG5D-U|4u?CYB}Xc}@H9H1;KaRo5!&DQ8QG{2_hLR6n> zUr4)yhr3T?3J7CD=tx*~+qETlet&)$J6#Mcx{!Z!`ueHHq6=>gxAN~$c5r%;(=mnz zF#n63{Zh}324sAb4C?m<o-9v@HNqNHj^>jkyH zCou)T{gt|55aX+AJ05B!upaBpDhPScaQe3+H|`z`Ha(MqWN#7Y_gHPL%xJ`udo~=4 zd5M!JU-nlnuG%JcqdZdwqVem#gm#KU0S)?$&dnGr?fD$*%cc#M1e;|$O%hdGZZJ>w zuM^Yf1s{o#6Fkr?Ia~bw{jnnZ|QPwUY>g2 z{_U*zuYV;eRD+m{yl33=nwKSkNbnr&YGslDMEBCt61upY%)VRX-sG-J@8Vdi|6m8NiDWXTlfC zSi+7FuGn1C@)CE!OXD)Pa1&@>BL_|sw#Q7XHA2d z&A=swlLuL&HCJ6%Y=HcX{Q7V5GsxKgF4gCOz@)tXf2HdGzqyp@ztDgu2ih{#jf!m__Cvb(>e-Q?(^t;J$ zXAix^V_VEFxko!AArM{G%J5@SG>)pA`o>fdl+eh9PxZn*wjB4b#8eIDO5bWG?jnqF%E1yj&pooN(@`d{{h2*Ocm&r0~4-+ zvnFUtpNN2s(KIj{J*^Bunv=qL260z#pxF;>4} z0)ipQq93%m8;+e`PDziBM)lh2G|0e6NhRQPB}ViuivEW&0p+b^v!`M-+;l!ZU&}4+ z?3m)e=U5|qgp{~n(S+n{gz1#CZ4%hnbku>*o<~Q8pLA8U5{9r>a!>qw2O~yCCa0Rn zw_M%A#uNDY>!j(Us8NkF(xjwPWXI=3WM)P_U;2V)E3S8tMn978V#2{Z!;r1dVR9IU zr-`TV^of}GQ|DA;&lc*W+ej!sn`>cDDY|iVOGKD@MjWzlQ9ADg(+uVhnO7E{lZI{> z6i$%LWj9;W$kWMlZr|gji;fPBDZoAPnk9chlwyDn^fGGWjE-T{&yMWU5P{=PL$2c5 z2Brr>c+sEK9Ul-5Kget+GP8%Vv`g}ev4|FV8eZRF>bO+?04BxtP-XqKQRgXBh2@V2O)}3b^IbA942bIV3r!$Whzo_lYIubdIJQ6_X40avJ#<$TW}CY1Rh6x6P|Hqx{?n)gMkM> zAf;}k>Qt8KrrV&+<5!=DC^Zi z*{kgA9mlG9GkOg&(*J^s+7yl40SwIyQ0r5hRCvm25Ju14U3bf|SgRRd&GELuQ0T!! z?$I1;2yG;YwBo)5>ro*#g*&Nt^?W|@-MH~n5$JeY9bzNdzc8&g2l_$`EosN1jcWuB zm)1JMI^+*#TEmQQHhBw;TmuiWD0YxgJ@bgjuJ~6rD*wmFqW>(Q8lzPku%|R93VpM6 zv=vHyvrywstPF+M`H%Wn!px@|>$uv$CJCGQOe$Di$MpTiJ%iL^vUyzA-!a7K>Y1(4 zga3HS`r~J3z}+J1N7)j1+RkaE{nGiO`cr%T=K%F%RiDcN-eSvikNtm_5_`q+3OD~a zHX$9M)q}7DKj=nU^c`(O$J64kP9?}jRZ={4D<@?(UGH6^=g9o;#%}PzA6TJ z`VBJ^ed6@?kt(X-GbYd)rV2aolsX>71Tw50!=M}Kn;f~WcpZgcKD5>xB%6K5FxxO+ zS}(W&GVDxh@z`V9Wpipg7}NW^k2c@A@<4o~jI@Ho=+aVN6YloeW)rb9;p#&Rcs}@c z;7BMTyVt_HbGK-t?EX0!VL(WI@q`kQ5g{9bcjrNoy(eBL^WXRYL9S3OJE{B?pED{% zDbkq1Uf#U+U~u~U7cM_OWg|pOt!(#k*IqU8p`rxq?F`Jqkd8>evEiJWmlDMsP8E#0 zcaO-B55>wmQ*Np~3xIb`8xoV-y_BRf+6>u8`@qJo%Z?g|znKpttZ44s=y|-_8t6{HUg$GhJ??I^dgL_W5@l0dxHGj-dpW(zKU>mP@y$vw7;*3_BtS0y zaF3zPVnvN@7)u>8#BAY}vz`^4Re!VkBS{e7*dMrI0KLYnM71@#J|rD``slq~%0{~nPau3V7rIuZ?wCyIrJ5N>dNvm?d}H6NG$4k?^a2=ZZ7>IU9LK9TUffL2boI1C z`dnJ4Ca&$e)bf~`NPCI~rC8*1m?On2TTkBF{_l($vx+2Tq!QJcB=Z&-KZF?J>rN%zdN(0?^K6smP~7TD1!;rSsMMEA=hk2k5~!^-;d$bE+Q!#<*5Fq3 zlhEovlxPLC0&}2~_JhA|`E4g!>x@O<5U8nYsg&Kb3jH7Kz%@<) diff --git a/docs/output_44_0.png b/docs/output_44_0.png deleted file mode 100644 index 101c22a8860c268df12365b79ba9ba2985fccf60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11949 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 WOi$ds=oat*69!LLKbLh*2~7a#pI=b` diff --git a/docs/output_44_2.png b/docs/output_44_2.png deleted file mode 100644 index 3e55aba0b18d95eb6488fe6f11a1f6e384168135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16842 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 diff --git a/docs/output_44_3.png b/docs/output_44_3.png deleted file mode 100644 index db7d651c7c61325c79be3121aa63f8c35684364c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15695 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 diff --git a/docs/output_44_4.png b/docs/output_44_4.png deleted file mode 100644 index 226fa729fb4634766f0f610f44bf020c851928c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14643 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 diff --git a/docs/output_45_0.png b/docs/output_45_0.png deleted file mode 100644 index 4b3a22b9c77761fac94d9cfe339fc4612535d666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11354 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 L3;zD9Thf06?e`v( diff --git a/docs/output_45_1.png b/docs/output_45_1.png deleted file mode 100644 index bf1b9d2accd0df3a5cb235eca73ac4ed9ae043bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12530 zcmZ{L2UJsCw=KO$4IMs;gsLDdNQVeSK#(RVy+Z)$Mk&%!I?`JpG*M7NP$NycC^ZBT z1nCiwfb`x1xd*@d{(IjT?`7l+M%FlIx3lKlYt6k#G%?a;xWsdbgoK3QmLBX52?=Qo zaB=%dpqc&N2mQa@gQ`sKHto}M;~7J`kZ;OPrP zgUi>h(HdTg)?$el5~au!@GN!YBzx+}>LN^DCsJ72l^eG5!Od=NPGHyWeRWV>^LKl# zP5i?9w4x$p(eawc^^&5^pe4u>N*f02u4(b6z6=IWyo6l_%XMD?B_yN-=u?2fE-04h zgkG-7|2FqthBWtJ&VLnsD1Hb**CHp<(0sZ|kmk>rh(hv!HF-3Xt19EI6c$a6{E1M^ znli)-f)0ltR3nQr*BgbEu}zT=vEf&z0$Q^2CoVxk2QiEV6OSRP_Y*>hvlx3>v<9SE z_K8#5f;h-EA8AO+Pua$lO@@f_BaP3pO+{K65zjEym#Lk5hXU#QdSiV!j6XTcqaWb% zI>u?w6&1*s=(ls%JLX7;(tO(~BFe2oA@SDqI8^hH^7tl7brBUht=#ZcU<~R7pF7m0 z1BRdU?VmyKC&=&~Ofe-R8Qq}w8{~`|d=Nh70Vgs~9wR5fkkEe2LBRw+#Kr|K;xwQ- zjIozPGeSa1xJr7dWzf4AZ#0r`OIN|5t72Uqy^8Us`{o9x+#Yj*mnfju&zC)lkb?&c zgBaiIXpVOE`uvIQ0B2wcBRt?~NGr~*O1J_R)8-D3lt<6N4}>5R2fHP1a0d8+TYE7a za{9C+FsY>dviEVM6TI+j>lyq2O;JDY20w@+s)nhzOni}cd5b*5U?!s_Fl*+J&{@AZ z;HhXNd+fC#g)KYqxFV>zq~*A z9ShBM3$88W4sS)l$srrmGo5rICd$e5DEFJ!0%sIJvfE*Ph}=G3Cj) z_3YiTJE_^(kwo;=pmzac<7Rssx@+mofM~_y4DTT&GFBgyNPjH$=OptwbGIemBabxP z;#1$+E{2lll8YT5M#_0lHb;%0o%&I2$UzJ)PY)0tz*)m8eUtMeL^}_cc_B9R z)6}+fx2gHb&n48Hj)%e+-z7Mn675j?7NpYg_Dc9qQ7TaT?|sUZx^V&&#M_4?3=~BF z)hJ{K`wdn{r`>b@#!)6ek~TgCA5qP$I{`l%(@0lcst<)a1PEKF&#PCJaRT#S&b4uy zLfx&5sFnC2vJ(12g~i8F%~6G26^3MwqmMgIX<6`|H|%4k4)}3mPPGinWE`>2RQZ1X ziXS3lB&Bp3v56WXY(47Wf!gZ(3*YG*X)**`NzmCtW7hV6IQ8T##I_#{GIX z&Zwlgw*R9eE8^&qW9XL?UKt6jiUNsZY^w&g2f0b)V6@~?I9u&_;#9jErGu+}x7q0s zYe-}^;S`H&{_L`~P)u2qu-jHbs+hV*d>{#Z(5Ajq)T?}WwG%3N{_fDdqn)gsl&6Ro z80yDN(4q^0cpr(EGJ7zdcII&w^kCr3gg2qmowW;Uj_oCWfhmu^BG~+!kl}*fw!_S_ z-8MtsxR>AP@V1r6b;>0re6bu_fTV#u(izS~?ht^j>q(RiI~$=5j4S+Hp8;CKX&tEG zPd?iV2)v7c5jmr`NWEQ3&cYd@{TA`S?LQGhx1jgpH&yF4%Z6 z$kpP@3C*dRcA_m@u+#MB#}zc~sj3Q|3bST78}Siho-+K9%naOZsA&lGtgI-LL||KW zwj>lr57foxWzLOhB21auM7)m-V}xQJ;B6BlZwFvw8DA3nhT2D!6=O@Sgg&kl7Ep7LI~ZQ>-rC<3Jo@Uu z&ar8Zw*{-}pb*bGb}0;H^D<%R^l^F&L+e&JtDE*0x=zz^uNyCk&Ed})&V2=UKgS8R z3w5zKVeDhpIj>=R+Y65m6;m&FTbHVMBUxz+a_+Mx*y-FzyxfIZvz(Jv9&az!{f63A zg$~f;cpwt;=wzCL4F2SLN#ej>0Ip=vI|=#Q>YHX*MTwhSXKgh(Tp_+;6ILSTk^8AT zhH(Z;ZDfcOnx-Y>AX^8>SO?d-;0ns!gzd3i1dbJ6k2!=8gtlT3zLlHR;dw}Q7WvJG ztRG9nFv^NJm$n}Qf=+M*W(_6GvCA5RHZvmOH-ev0_z>}h6V2hL#|=skD)~L-zA-*L z5$Yb&LE@|63WJf6ZN1;z$A$k$53VUe3Q5BLv0OzZ*R={zXn1$76vuYt(MDveaViYq zG2S(s3n$iOvKsWfewy)w;23z_wez0uAOf*BIOfbU8u_fjG%(k)#su8k!We^X;gnRW z`WQ~LcTNfipA{V3gD=bJn_r*y*onr5Xig=$e<PTzS_JpwEJRH_ zPV$)q;Z%c1L!ARZt%DosU?QB>pSpc1i0s`5+*a7bFCqaqz6-{&KtnEd8iheMM?Tx* zLbsh$=2Zmnn*^jXk(@W{%c+3q(f;W>Iu#k#B~%q<+l_Cev$wYn{hXFZV%xR8{hHC- zIxb(oAt2}>HFso20z5sv7q#}_+r|Rn}b)IqbS`&&&1cR1+nn1htoH9GCA-NUG#-RLr31aW+ClJ z!}^sEi@kfme(vx`9quRu5%T%>Z8An?`O`J7B{@_i@gU<1%XcnUw zi!R+gK(w_BPO4S8d|~~w*pgma{xPw1Vv{8=R(qREHn3nK6vCx#6xq;y^*Tc$5T>Yr znL*qO59VV&?Cd;Hj65fJ#|whx-gr-b^h`tep6KOeu_ij66OO&78)c`QfWYP|JXh~} zRO6_;@c%#55y_^JY^!)AP#~%erYS<22V-oQeBa|z?}5RY<(bOh zBQyN89De!%@#Jw#Gx#o<@yR%efN*0Y8Zx#>IpxdA_D9|ilJYhEmzmXzvJYtBLo??kc z+THa3($U8rvbER{PrRZfn%z0tB=g9A51%+9C>_*%lYerwW73d;cWtG-s_@5Z5Q`(zk-aYj2;NFnk+1KFC>0d-59bTrBZBrHoHROrenaMp#9$dQrS`1lD}X zNWxLeRD-qWrWz-^j1wyIU_mTZ!qFKpb+en;<{L*8%SHEEIx4<|E7OXQ;cc@bfmNrP zuOw^MHq?OM)ASz~p-CnAym?n854KThEh82DA_?(rW+|(y&@WPBOLX*Yd@6i4w_GZc zjl;DXygBvo@BsbxWmeUY^_M&gQN*q!C?g}WkcKcQzk@>XMFfj)=GQe`=sQIQr-`14G#9Ppgto{eKTQ( z{tyA;Ze~#i=hLcrYjz<>w-EU0$ij)_jwkRyku6;u7)k`<8JZ1HDDx4lzuYK?pp_qJ zzLjsn7SLPwG!VU9n2mgmqUmCUz)WFq!Lew{u#8+*-&r@-mm@UbnCuyjbIS zcdN?hez~ibAVNP0&G955#jq*#l3_)T1(hMp>dwed>^8d6S>?AbOzw8#^`rrz;9VCCzsd$vx( z3$@Xu0B45iQwWOaYT7&9JE6T_Fqv6V6lF2 z4Gl+zqzRbD!XCK|`v%4RoSd#nbq4kEh{X82>2|d}Ufvw|d3DuBb!CGO7yO7VSua-{ z^i;xup1jo`_blb@hx)!Cwjon6bH*Cbiem63&!vL+`#e)z7U@0DSN@1|{Iy#IKHNfe zn(28JOj_QNjg1LAy8;td{dh>LSSBy7kymD>M@_{G%;BoM7})A1jQMp~KzEH)1cIok z!g%<)+!FRdKk@RN<6&+uo;RN67jrLR(R}eiU#XFral_#B4KPn}jN(;yBmL7)FqpF` zIDzer@<+w9LGA0$d?bsNkpYy)o(_2ldXoAS8FCLVy+))?Rs`-dCFqS^0l_Y@mlz^;tnu^y&YEMMa4}mlbNWqv5 zL)<2lhkhv32kfQXV&nWfR)fUL1t0o9a+Xwi-ZujVyGQ{%`#o%`KR4AkutDG+G3sAa zzxG%B_Yq^}tLkFV8ywGnmLE;jA@|70mtp8(PAwXOKYtQj}gkIapsoP$eWCaDX0is%4RcDc`yEQfE~nL^OQ9j z`MYpJ0JCOFd>oBzb%al0)<_`|I}1I><5OpQ$1AkzgWt`=YUnRPOX=D=<8IczCD1(x9P&Ed!Nl0+vBH0jYz) z={Qx3faR)t6X#KaK-;(WZexdEc!BVK38y*6qunKA!8w)X1Tq!Rz1G)ji7pRcUoRUwSlsKFU^7<#S0T z>CvB835%HkXfarFYZRjJv#u`khltGjTM%~U7s_S>Wup;(viCG*uo3WCvk@m-0Hu3< z3;D8cVfwjZ;LJ;jydV^*ts`7D`jocd={dW&ESd~DWLw(Dq)4($LfCtK<9=;_e|G0Q z;`NHyE1&xdf02_4Fc=CExr!4jwht3`M0}P30{P~N)$qu7nE}8 z>xkq0UN%Z=a%O6%KG*01cv$YfM-=0v4sz&qig1#kq;=o*IRfHY9g9RMl z__)_taDC+;+`b*3`D-h{+0t1w)vkzZG`xNJr1+fFPEQo9d@J#CF@a3nM*ca>WQyw( zbu=JREb@!Qz_R(&pI4L>R49l(lfb?DPJ4x3A0~V~n})^Ip7!)lyd8kE_swW#-3zEm0gXRR8e%9fDHSz;Y|Zx-*!Y2F zWn<0_MB-lrgYx-I+;O*cQFalJ$JQ&t5V8opVc(fq`DB zUZJk)8!BN@9%z!G{AgO>knhEUe~C)cP2tKbAmKM*0b3~8ZaVPWRo(=wXKuCQ&iF&V z-YnnG9E-}XD22gvj1n)K0$dzndS{$vRH5#D@RDmc`(mXmu(lbdz$5>%apFwZqj*)CKzk0=Xev$)`y2PhUzxqgZ8 z?WUpt_qRUYLPL&yl6;^9J>QGFSt`@V6zUNFVWkI!z}=Zju^%gL0gEE1A`W!Z_=U6N zpHE$lFUt#O*5iLbFN4ctSTsNMbM~mmeys1CD-W)}7}6myB#CH%z0bI{djP?ySG*LK zUcK|x-(xQQD<1F+q=Q0q-vS+kD?g!k3uw4X?cr4aPrmN!hCUaRW2&8a*{Tc@?<~*s zzsO1FS&TQe%pc%oeN~Em_^#aYr3lRV&-(hyva;xnjScU3xvMDx(BdWp{*GmS@zT-- zT)WAQ$rlI&uOh^pJesoO?8cQX7XR0XnjTCyDU{TR>VQn(5qABy!QO<7Wth}sFqh=D zG9j{zd>$U2e6waQ8~NshJHs~JcjWf3K^9Sk zaW?)?wxC_3uG!mlpj`{X@-a;R!H2qENed^={|`rYX(p!d&&(n&CJz0 zWgfvd(>l7j^8M|Vo37@!#6e2@f!flCkp#0_GF9)O?HJYO^?DzT+x4^)PurQ=+P1s@IUZ|h`EgS6^5vgB_t|rrw@g|D$6S>R-PeTwZOU*>>ZCGQ)DePYQIpS zY>kXZnMfb8W%9;>p-4`XrJhLIMvZ+Ze3UqVPK9~^(R!(kio7fD9$kIASMj+P{lotci7z zN;NIAY_t<2#%k;a-rTM7@bYr$PT^+b;P?=6_INgU;hE4ZV$@Xk{iD@;i~<_BZEXHA z);Ja>>ET7tzkU1mNn&Y3L*C@%WJ*Nw!(mXTf2@VzS=PwUw&o{^H;*wz_fRv9Fjtei zciH*)_%KLFd{WY-d$sn1$M}+=o!OtU;dC%MTwiS&iwf zyOWcWESm$bjoTs^e0+TN_V)wU>&EZgy_>U=mh(WL;_pn11>eq%eEqzV^|0=RUTVm1 zAjpm%7#MI-SbrE8$jCSswmUctT)G&v_k>(=#L3DiHPY=q4^K@?n7AE9=#!~?V-11t zJx;zzQj35y)kI=4#F>0;Lf%!Tb(6^vm7p-|HlXPeSl-n!* z0w%-qJK3o;%}&*U+A#x2sa@IbfVpTRmrN`c?qM7?n=VXyrhv&I3|r^xVsuM(fo>Pg zo1UPzlTD-ZnX^Q~w-$&Nd&PG*g4$I#)P~e{>4BFeX;Yt~9nUCIM{qd%W8ppX>H13J z2UA9yM8~JL6T{g8=jBFx?A&euM4B3RtF6#+wPC*{yk}dG^Ye>R9DKguUMi6okcyHU zXxH;QD7sgi_2hS}Qx_FhWmWRtTkEgyd-wgB+d7^B5 zn_|t3lw)5SVym=|%>C2)Sj$LAW_eP}5Kg2e%#_-$5l!q$Ga?xzg! zgJs=)_B80Z(p0_A!eKj69jh$Wh$91DtY?3J{}DE*tqVP*VGt6ce0s26{_$from8Xa zRx63by=t5;^aPZXlhd;Gna(zR|A*TCs9D%{vcn>}b zRy4dt?R1u?b$^&Emy!Cu`4YB>j>1hiaAUeJbauD6VQ}|oA?@N~8sq=7w&n_qsD-dI zP;Fh81ZW*3`UVDRmJ#mmVngbOyqtD>_hQex;-3hl4QZT8GO6z|ljPYyzA|nXWcLT^ z$g58ww5Nag@E*ws;|9rW9?+*wk!wU#dPZQ1#RNuzhRHI(#cgLLD~)5X55mE~m;$Nuaql9unH90>EAH`2}RBaYoj zuu2Q`7xZv>8HK%YtI65N3Fl04$XMXWEO&r=~K#dGn_6 zSKL2JyBNspnwlj8hZ7d&X}VvzHom{Uuo}OpsYwM$%O9A$shyqS-Mc?5v63p|J$Pbp;?tr+%vuWZy9Xm|tCilne`uaIn6K=qCL_}hoCV$Khmd&0w zBn{>WywxDfkoCZ0iwFcfRA4L=ZTdh3$hn=~9JEt4_4G(O%{V{xY$V z?U$qqc>Gl3X4`4wE>^YaXg)b)xh(!@h)5WE_4~O?(@I6*(d=PcPkEZgr4IGO>8{-& z=uqx88}Vz`Ue?y8#S28_UooqA=RU-5q`EE-pg5+Qvw*G=CUg5yTY2zSnsUTdK)6`S zL;sVXAne^4LkaK=eN>jQ1`?Qkw{xE`;}Gzaxaa@zgfD@mBwrb8b; zc9sg7|I*-V*9;%zv9__9_~^+R8ykx$ftCOPDqBQSM)H)dBOEwbY(=)-hu6UmZbI8e zF~u@ypYxCc0Y7+PA<{2 z@rCF)$wv4V3WPt)>kRjkWAh4AE8f0+#tng+SX%a;?5~C_JX8EmxRRNt=N=%i<%XYT z!O7zg@IYRF^{p3(8kXSi?NmpXO;!XfNTIhwMy)thT$U36M=_@!`Xj@^UFV#We7;u+ z9VDJ_5+D3|UAgm_PMZGwj{`vGl$4a_78Z!rw+;O7TYgkopaT|ka-|)x1=qcl4t}~o zPC{5R9&+D@gi;(uN1}eCycE!v9G@UIxFDxY(6Evc;{La=_qocG{U)`cO^IF`r{u)& z^-$%&vFrxXhwHI69G@rV;vjALtt2-ep!!Y3q}}^X3MayFFdU^L+ylQ+;(j!-MB*3M z`nEGI*>>zdQLd;!2*-~)imyvcd4^%9PZQl_9u=#kT!gwxp!^A8oFL8`Z+mKj*5MBN z;uMeAU<9OH{PfPsNTnE$j?pV16qxq>nj(#XK5)KS2c(`UR{?brA|b3t=7mDE@0ACg ziV6}C$pUjE7`o6?+tMr7e=WrU(C5hQX_Rky&U4@!zftz!Wy0d;8IW%BL%%8*mVNrI zH3XpGYJ$bXmUC=hb=i@KS;^B14O>yV*;Q zGrLzD54v76GL86@3pS2m<-kQ4(0LrVR5r#Ck=LJfh( z8cyvjh?3!_{Ss$4nBIZ=35-Y6GzwvJ$M*9%zs3!$XJn`WjA zH3ETtga0uCoW$hzuIs4x^Ib5wNhk3#ZJ9HIZouUsTm0=J>aQcC7c>fFmn>9%#>zri zP&D%5O#%vop4POPZr7morE4~2(t(2yKpD0`dinHZtY-P^((~7^;?DU!!mpi00|y9E zz~ga}3Y@ROjb}v#@i5_WATuqial2S%eNL@mVG%M=AE1BI@^JZI&^>W8%Nne3+j)d47eh}`j(x^wI-&Q%KtfXap!kG{2&OtJv15u_M3`-`3mSTtk) zSgTs)-zMJByLo+Wl8l`EH4`9kPy&*JKM+hV)o(1GP-|U%^UGg#Z7$;k7{wjnP>-}M zb>2w;6m>B(cVK3vzDkv;aTrUokXWF=BNGig&3siM$b91I;+(CFlpfWE^+Me+8J|Q3 zzi;x;Iu!MnssmQ)1+Y?NF=o2)!;)-wOc~-2G;Os1#IS&Ffka}Iw7xE})Tr=0)4u~q zj%MHlA#-ov;S?v73XdH6lB9HF@eP=8k2vTH=&FL^bD@~$v?dWLK=3Lob_MjsbbQ{J zkFO6zx(q+~JEHjulr08O-Y&_80VBBjrmUP>C9qNyP&n8C8CK|(Y_{vg$Sk<3N`R#S z>P>isG#<&jj?s1^c9$}w4Pe5t^P*&s<|&Ldrdrh7_BB%72|h*Gm50t^))XL9zHl4N z+KY!&CBAm?Pn;3AW{Tx<=L*u4&Wk!_8>2Ux}Z6l%-yOzAR7E&GI7RU)5$kfltNfnID z_bOlE3vadLQL6#~^g!>8YI1pzHEZ2>prGM@XsJ>uW%QNby6fym+Ae7YPS4y8!^_|% z_r^rWpjUl8(1xRJhK`nZ$4g{}T};x=e{7oXjF|Guy{E4L1R&-Nl-xAz9b@A(lLMm~ zi^92F}HtVRtz zlYeC^W9cH!r%OT7?1g(3R2et{FhQwAvI|$WN!-HNVhU?BfZ>jH#Rx+Ly7ee2K zHL2nIM~gG`YwMQP?J_~K0Rxn9WoCOtE}=C=GkE1)|AO6BvK zy5tsfj>2Tuii@7O^(jn&p5zpB{-u#zi?Uj=@Kt8eEdU&Bj{wx_@5j1k03O>erWC3N z6Hd;i0n^hf1+J~!b^w6;^#jgoP#c`-rcVJXm}DHDQB6PL(axy27WKUE0(g%A`yZRL z*X1j|JpBW78zjs$S1;kyO;?N=cuNj&1)hr;N!|f( zQ5o|Mc7r-GSKp~!4E&M^S?w%mp+t#!_HhoUVbqRGHoz|u*)%Pm#!AbTgn;!M9$dRA zYyen*ePC^m>8ZK7HePD^XHhE`%=I?UE^ywayAZ97yavqvmGFMewTX*!xEC=GB}Xw> z%5#QZ>WDQ|^A*0;Td*KM=%CMxJf9K_c%XClTwA`5@A=9N#b?xv!y}w*VXE+@MekTz zv=L2lp`!NhiHT%wST`zLj0`eB?MscN;)&uM^e#g9uKMQ!()04VKxt)U)NC8+b6wsF6t?HVKFMr=KhRv3Jf8Uc&-okzGi8R<^@ish=-JiW9dxB2+k>-_~ z$02NS{FDa=lAL+0!#y0qAz79T;fjsFT;)CrE@=xWGkd)(` zY=$Hse!7Z)n^w!AhJDW8hjqSR#9->29{OF6VZcuLJ%h%c;_9F`P#{N|N3#0;9X|+k zD>_?|K^cF7S=;UKqcIX_ol>?a{Ij2spm+bp?>!d$v`dG}ie-I5!i#&U#kyC(VB~WE zlK*#&WD{?r(4Yk`C4JL^aX>Of z^TE{M^`-$8SdRpR{1=)e$PXPe)N9Msf;gZQQweb93|T1)mQKD2#><*XkUAZ0RJovz z3F@^%#XKev>kI<*727HUWe*vWz!@n}{2*6AgITkMgw9~<3n%tXE7BlnYQi2T#ydiE zVOJIdLGQy4-XMPzOmLQC5V^=Y37~>!5Ne#fJv(rw2AtaM(DwuV3x&GQco7b~7+tccDVTpNeq z%Ng#Nosa4n^acua*xeq3r_{`(1P`E=Qr-jUNMOh`=iJfUrb~S<*H3Q6l(%`zhePFl z?Y7abZg359HGRA`N4FM;^+}dhmzaV$L$h-?-9=e7!HRXp%iV`aM|f6Ld=zjfvJT2} z0DH{8qH1FzTpigCaaY0{k!jF`VKK9uvg%^>m6Q#Vtt3Y`v-^Nok(D7awNF*bWXbB1 z8$6fx@Ko>}jU|;lt9&!8Khb9;Jf$p+O0G?PVJ+Ud?OK1MV1wtsT?(LjFqfiU({K7C zV3_K3$A#Je?3vtyPl%cs8sqhnV|=dou4{Pn31i1@)DNs8y{q%y1vY%KBUGNX(LuuJ1B>SIc8MGN~{lYBfCM{fH z7$X`VN2|i@1%}&D+rpzqqUygnxy5}Yyv(7SlG8d0+IoP?5Z@(GS$e`p!Vo?BP$?k* zqBs>CkVAEH?F#Rl=~X41zk(*eKL>mOxkZY*jy*|z@~VWCk#-H| z_Vhlbv!hV0xxRNH=q7cS_4w~QXXc5t0D&1mIBH_;RM#il=Ol)*XpL?Qr-hO+;yB{ zL?h2nU=!z8T143_Wp%LN$|)#&a!JoR?zdMbQe4kAB0J|if>%IO^sX)^-01$m8QmNn zQ0t(Ke?Eh}Pw6kW^;|m99AgvPMipG8H!&0?bcrn~g-QjSE;~S}cqK&O8x3I;Bb6*y zNP2i8^wbU8Tc!O)xZ-UJdr5D_7CktRiYZ&3sk zLQ!gf5D+O+0@6a~o%r8-=e@b}m^s6oowL_&Yk%uo-`;2)ZB?eT9A`lw5RUBh%|C;2(|0J#_!`@ ztP%V&xV$n?|Bl&y;!{W%2x z7_7vb5bWt?=rvO4=)XKfT(55<-u6*NAT%E1E$ObnU=a_|cM*ACZ$MC}w=(?HkVI%9 z;tEXf*IRnvn+#}}C%k$ex!c#UYMX<>k05vFKF43n#F*J2L)fX^OU0|(IaX!(lr(4} zusCh8>TX;q9w(KK*MrOXSIoU>b0>$mlONK`#mk6ShvKAWxw%|V?8q-cCKi_efxnYSkCKqB)Q%!d6e!b+Qa)5y9hfvLsd>RhV`w$mM z%uR8?m6v1&S8DXVWgh6!H1o`%ovbNYZe z9>hI(x${V>x)!ON-e_~h32`T(#8z|qBj~_dO+o5dfw4-(Sve}8v4*PibzVYH?Y(glF4)YOY&&K$afW3hg%QfA%U)ejQ*hfJ$k{Kee8rAw260I@Q7u7^U*`k zXG%(%qO@&^bxypwLirH;t&>Z}Z=bjGQfDy?gg=5 z{Sgj3W7QOOU0svDyqw<$wr4vNUo&g|(f+u;`BM``Bfk zLk~+L*P$`v)0EwVjSIGSt3r$`J95)UkjrI%ky79o22;lg;riM6Oh+kDv+;QT2qzqlNLh?R)5)Z@AUL zL9sjHEsCKj<)!s~ zP9fe3Xhm&&qzIfv3%algQqrlIZ9)#RwIsh5}_00EzyD2)XNQw2`pkS{}4L#VPm z$&&9YcUzH0>ISXV+~bL=afGQ>;je)z*RNV357Y7XLF2eJgx8Gfg<8mV=e-#xcz}i7 z#<6U3_HY2lnHDgg3i_}9<OORtiMV7& zGGPczTvGjRZNKu=1<9iFVQa+itFP!r*5DPTjG`xNjT_eXY*yLl&~J{;%&v}5ePJ+ol!&88{1a11@XB-Tv`FyhZ^4lQz6xS#8g9f^HevATkIRndn% zyq}G}O0k_I^`banr@}3+UgHnyb^-_q%}SaE#6adB<%!cT@CAGD4UOb@H9eJmIPFEu1BZPi|=Ro?b) z+(-#ci1c#3y2Y@qn7f?IiU^rBJ%m2Kq;yRvv+e%yx06OE;if}j1V8SS@8DAwQwI0R z^o{l_2k$qZ_-;?22ML^^%q&6c^%st_^V-fCd)AIIcl45}Y^e&N$Ajuo-RS*bWBhmT zvZmzEHb^#z*|GZ<%Whcn?dr$qPhAJ?3RBvW8&bNp11rZy0F&-V~Hs3+Z}WD5!{@2 zm%hHe(dGxPDDOnPs!y>kiI%GNGx?=1`6BD#uufA}(S++K=6kyG5998aX{rIV4UCPKU_v;0pURoGQ#j7Cegya*>ZS~k`w&kvv(%S+z3ykNe^BhyP9 z|MEsjGUuus!p1ep73MbcS?p*nVd@xZnLYfSK#${dsqa@1SiV*`$jqLVS<0JQ7tQJCHk04`^}xk%TQX~ZYZ7Gq$uu5?VieyO z2%jSa1>?a@#|Uz`m-)dNh-G+FI$e5V)~PrRRSD+`2sNg6;6G6>|4FL{NXmH zf<8(+0!n_XUei-8ufW|2zd0ARpZDX?aitv4%-Z{TG~-^8cx`jrn?4r2S<)t+;J?

3K!3R( zWeaHm&b-%OF3Z{x-UhS=KWS{k@G2e1wg-DFn2|F6W-&Z{@yjMYaIAr9vJjtbp(q|2vQ_^d4 zRH!vo_1lXlqzsKPytBybb0u3Q_%_{eoXAoe0zs?akC-8qQw_m!uGC1|)OGCq8T2g+ zw5**oh^*jJMwqUQ2*@_+E(`I^97%t(D(5d_ac53vfoJPhR~&oVV-YlJ742K&WHhF- zSXcDdcf2UrIrj#>Yaq)vB3t2vR;z4Hli(^rJX~T_lyRm`o?i~V3H!^MfOt($ey--S z{1`SqT$PDG-3@qB=d&56veNkb>vt}nL0`?W@EA1)lsb&wjQt6x)zRmm;KS@`jh|Jm zNxYd#NkauB)0r6rBC5`J*pJWQ!(y=co#9j`@C;#RBr-+~VN(uCKm}l8`L`T0$YvdkGuj*G4J#^ZmvX#V^2iq^}rlLy;%K6O4n+djlTF=Rrkp<{GmYFT1nAhpDiK}(Ydmk()9c}ubnRgH=r=RrA_;PwP(yKoFAH( z6v`%zd<2k*U&I`p)9m9O%+&SD%9kOT9+CI96At<9H?LzI>(3gC`YH?o2ui;z&Ci0- z*Ypp7{7&sp%wyP+>xj-h%CMS%UPL8CR>icGL~%TsV3#ZnpG}?zbETrb4YHOabc{v| z+h_ncD!v3we8X0b00k|ZO^yF7Z~%Jb=O;)F7nZKJ#jQ%u?%2Qse&UQUcr&CC>jLw+ z^2gEhNwfmnA_qFKL14VFAYn)#kME7Oopx&JhQo`N=iJ;=L&PgO2}Gu;3!}nW%Lj^v zOdpxUP;Z-BpkWv-8b$genHH%TF!oDD&!aHr$Uhz(j$bzMR>!~8h95j;Y9u#3S&Y9` z=QJXt0)y?pqi>@-x;Dsao?PQajEu~) zI+-`gCGTWCa(Tlc!Y7*scZSEE?1zO}Y8$WJ zn`sjZ3h~u4K0yV@2U@E#tP^y>HosCfCbdH$&2$UnN z=+l6Svy|% z<6?>UQT6Wgk4Ijk=-stw?#L!f=J~Uh0PC&xltr1n`TE0ugQQ3gsRH3#-~q|V^ig3z zj`%7G$Oi$S!YEvxAqJ}EZfsF@DBkC(0V({u^@v=EoSxyoy)YJR#8+jJ0 z)t2YaX`Ad@QQx%1wQ2CK&xm=zhWUB34V@z!0JGDqD|v5>;6u5>)P{E_j7upbfv*dl z!&4`vJQi<;bah_0aXdUv>CY9QN)u0uum-KYUgr0I14C1)Js40Zj@FxF{I?USzsf>h zS_$|+y;lsF`u6Er2K{aFtK*7+yvZlwCD78nd z5!~3&Ws<=t{k5*2gSq`SFcoE0RXWG9PtOl`*CM!k%&qn|W;HWp5_@`jsPMu42uox~ z7(bAMpWO2~O~Yu>l4u-43&XYutpr>YRXrFUCNT4X)P}s9JCNV3j~6HklGY;dQv*oL zSWxRYcH3e2x`0;NON`6qNlu@_j~~&LLch)5RCrZILltK%-BggQ7+8jYi$8P1+VGiB z2r>pL%(&JArrbCnba?+W4AW z<~bh-GG<>my||~7swmweAd>AIu`@;z-*~F;s7CVvP_k&#-`qW+JusdhF?K@EBkQQg zY2;~I&bF+PGOdzpu_spkAv0Q`6)l(9v#ruoF!}9q@Yl% z1x-!<6)Nl!K}~_f1S0Jva5uGepUB9#Jj9r{V2qj$^m5)hv@epr&f=#(n{?ejFU^b2 zKx1*sI47r69;zeO4QK^@DvMF`g$7YgBCk2iJEdQw=4ASqf+m-G!1ulqlOLOZC%2y- zlg7r(18!QJ9*kiW0;E*Ay)LS9xzmsdK17#w(-vQG+e|Mb^2$Kq0vwmE#2Y%_o8s|P zT~OR(K~r09O+w0PTx=%$1N-I;h$iR~2JeB@$EuJ{IA=6w&caQ#hH2d#jsF{e3}-t? z5r`-Mke=U~G}SoeHD*RAUvE2fQ9SvZ;IZCH-rOE~RBiVI*0$Fv`euE7I6nTo;vs&Z z%5C=EJ5h^%LB+oepBfj^!p^oAz1Y3xMqUiP2FHcGDr(JHJX*v0ok4%P0Nr`*1duBH zR58^eLZdTLmFIhbR=RO}umTekQyiysJOhis2J`6#vxrI6%c`o|qh+SuU9ULtKExmo zmvvxPW+U0mXWr^-Q(1P$b8DuGS>-4_(EZwMD~^z^baj2dpXsx-`U3DXjc*xuJd7LM zuDZ7FT=H1#fBrfAjD&iVUJYF?5>@ulAAVP+NCV6NHz9tDnIcacUf=Op7@V5Y3<^?6PEHniQiGD7_O-4j zbNSAMwe0m*FzogDO4&15|WeSXISM2rye+ zZ*Sdg-)HJ=;K@g+q{U~HnjyNkv-0yc;!KI2v@IQQaQSqCy5w)R;E^H~#_8Mr; z5C9k!Xcr`#4CyEKLB@RNK?mJ}$bpw;_p)8UR}ygV(J%Q^;IBxph70&Y0i! z4^_%4z>zr1$vWqtiIei+9bxmpznzNRlI$H;DF~PyuT)kg-^YhbQ4%ny-)d#|i%->- zpQ+on^F=G4b)J0?$Nr;mjVujejC!L+^F4;62ZzyV^r}#SBwmH>^alL>)tM2v`5lLW zN2@R^y!G2!m?a(Ubt^59n%5UNiF>qL3w_|3gO&2dr4I?ni5mOBHAjn;>Cv@%Vt|%C^VuHdhJDC`wWO1^Yf)Tf-EpIyzqCAD!!Lo4M{@-6&9{rwAv7nvV8M9by zn2VnStSyvS96S7FrpX_yW*^s+ddFc&jPaqBy9oI+yV7p{J$B{XVY}a6@Q3{g{66#X z1`a+@@nT+MchXfU9&pNcx6FF@Q=Wd|J=vh^mt7HAz+pNfm=(Vj85a*7P=j)JPW!cw@G3c}vv>uUItDR(jI|uvkBl=eHUnudwat1@HBasI`{dik6m) z{{DW#sJl$~Qqj>J>+w)8x^6 zMHL1MC>he0do}6OTo&Ng)SDh)B=M-(#(`icKp;Bm830;{xekQ(aHK4^rQ8{r}h*7c==5=^PnBW zOCrYDvij+s?LR|+$2*XZ-<-}VokXO&G@(BvD5fneEGX|gNu`pLA7LaN--!aU2DUC_ zKfG{%ab&S_phkbTJVea$5R!P*vie&M<&Hs;{zqUKsTTl{WD-$yzoaKv4jJ2?EI1gI2Oo_bN-D&JKkUJ!}>2#VM7lrp{nxF_R{_SUo0{%sYLQ)GIXxu%SgvM04Ma-@a`Qp&9$0sEoQ3IHSr2ZwQ6;2j`dX{Je_0S3ml zp}*Rg;S8urp_rSut5a}J`IsO@T)B94G|tJ;mxpa39Ye4~mh`ROfy+7MC?Q-aDTPsV z`l#SCg+80?NIl)oQ%|B;1p#z~mz$d#`>8|A_UHeKjG;>RiSt9oQw)JW2+ZL4Gq+~z_Z=Q%wO3^v6FMqma+oN>+?opoyO_0jhQn&rJHg_ zvVlWr^%TT-K>fgRm}yu7o5U|g9iVNyG#PgoCFRJOpqoSfC*N?#)@8#X4Trqno~|>C z$#oo@f7%x9&Wg}?=2hYSY|w9$qto6;b3| zb(Tp$hSMDxEMi38O-YDBdB!@!?3{_prnYQzESHO;>YSsvxg%HrQRD*fX@x0o_}gLr zJk#_Tu0%j5xkyA@=(;>nR%zTCdmrHqnM1thFwa#*=LF2$0a}BgykIB|8ZQh-ta5$n zMF_*Qbow;l1f{^%8Y{VQ4Fo#RM!5@6SsaA`Do-K?Q=P0=zi9~d1_XY!`jGRifdZQ} zmD)7TwalQ@kNSXKmNqT`0OBDjh+c2_qb4HH)QLs8%e?ajhbs^ODK9EjuO>?QsbAd{ zg1v$EA_hkrBi^lLVkYT9(D#VJ5yL4gAl~H|3xp5ne=sSDf_e>(Fia9}Ju?76TfdY= zd9>>nX}YtR2MR$yhpFudk!lejKvRQ#m4Ha(MWuY3c#t#Q34`6J)T9Aa2L)9gEnOh7 zSE~mscG+-VE9tpxVwmU`36ZpX{;!%0#O5Xw=xy@nZxjIzbzulG_||D)I{M0e%9Moy z8Gk9bKYs`dWXpGf=7Ib^Cu|Xc2p{JU=QitKFrrlYE$of9>>c%PlJ97Z3D6k6*KK6y zdQ;mH=(52oRJmV~<_3B&!In8}IDGdIc{gwl6^(x$yHLE*vABmJs!#ltO z`f>3b-)7){c+6qh#a9QlR`2Kip4W$^GG|O%Pa9%8NQxAZo>m5&3gtofxRa9+*4CXoHnj89qbHew%jYy$#SeqTG`+9Qy4pVPhf;eD#s4)n_aMgoWg z2|KBWtj>`*L0>#%N~)ALkQ4rn9W8`ZJRnHnaPK4~E|Qirfq7&7=jE;C;|kOt0dL5w zVQs1$zm40{1P*EbM~Pw;3GI3Z=!w;u@AEzuh0j`35S72Y9c^h{+#@Jo*k9ln2L3sk zPG7nn;u|#f_7UK$h*pZZ-#gNfDdwl_1)?;hhv^~84gO2UId=>r4MhByL=)c>=>tpn zwk7ZuZ!6fBOXe$XG!5U0^}^mj)}58%Z=v-C`7#+ZO;HE>-_0f6*RN9W0W2@eQaJec z-rJU^+N6_ulS_U56`#N<>-IXw^CStr$tohIv=E_CbL;YW4&ZVP#ycV|_A7a<)xxJx z<=pdi&SBi#U{1=$x>N%Agezduf$-HF!DocNvOdeN2W^fV`Qcmo0|QB#*MO{% z_!Cej2RRIx<_X4AW|DanLg3jc40#Dv)`AhCVU&#o$eM4Q<2X&!@B3x(mIzU?UZWtS z#*o{+m*0%Yg3lPbOqNh`CjT2sIirGw?rbU`s~~4o`Gby1g?amn$9( z+?~;Jf+`m?E4LR%{qszUhW#dp%N)l49@s#76VH<959BxPV*J@+)zGn8FuSFdZy#=O z_-Z3Go&q)Xt1^LOgKNb-hr3;nIcyIF%lL(*C_R3#R;2ij7Sz+@ZGKM(rWgJ!nZ9dL zZrSb;`aeq&qXk>q3ibF?EIAD<>!)$P@ZiTx%AWJDDXxI%gh4z>OV74Oy&VqCBn>zX znHt%o#2|^ScSWF|-<5GU3<2xorQqoju{-*ORsdGThPn^4TcxZIN&C5jAg~B5C5Q^u z$4pc;ErvNL1Y(z`QjLbt@o>A|p=g(&V?@=ycU^w((O^qm=npiC(V6nAp$a-!AlyA^ z=FMrujY8}kF?wAqB9g7+!1gR#9^eD4Nr*vhL%+)(R1LO6t{rkSc(_Cil!sa?oe4SM zo(jBu^gCjs$JJ|&1A;C~(r3hNw0X$G$qdFBFmB0#5z$= z+E)ae?zJ(0csPe5?KBx*^m1d?)N1_tUbgT|)W?l)^;bR$$07K5X!#(i_&>Fe;uUC zdhlVjhf#o=SApYk2aELQ7`Yit_UGnDVRN^lBedg30SXX%Q62*729*$wB|-3J78$m0 zY4qlPC6Ok?Bc-~iq~Nw5Mrel+yJSl^OW`odermrYNIJs{+;W<2iFe-UPM@{q4Hu`o zYnbcnjzV3;-sKBF4wD`-FF!Lq>A??gW^7=z+zzI5@0mS(T_j}tyCTLcyF^HhF*d6t z+EA>jI0NC!W29@8O8e_XBQ83rjjNVl{`8^mj+L9486T{3vpd|Wvjqz-!{Gg}_M~8S z-ylV|xaJV4$pAoqnD2deQ`n9R26MMX_7Z|dvs`SiaK!#2BU$vNyrIV^lo}Ny0_J-* z^%*j$uk>u{xhW;kAq0|0echKctl1|GZyQRan#Vem+NuUAW2_ibbiN{;ykWXQ$tnS}3R1g31}ax%`UGaL~!2A!EqHN1aA@4~YR+RT$V z=je*^a795b+P+UV$WY0xGzO0H26QOh_;yA2-}&%;Et*Cb2UlbVZuL{ekvcrx0JnFK zkuDVvg9m)a8KvPD;iVo`7|C>e%*Nj0v+m2kjIEIa(d^#MaX6TC)ZBgshTHJ>-g$Mo z2g0~jZusH71TWe(<21Z8vhF+1TrK^vHIf;FFW!*9)f*tnxKet%`dlp6+zxX0#a{Zf zBhtFMrG9K(74oZP6gQfG>^y+moHidgcOSL&sfK+l6(1wAeske3&XI#Se3x}Y#LYLsOOfeFOmpB2NysSBUR)Cte|G3YsM2%Pmd%WGXZ%f-QpeB<^LN<{ zN0-EAjAy5~5LRA_`oqQAuK##`p|}8`^|*>X8F;`bF4z&N zAImYWeO}%U+1s~T#n`)bXQA_U%Ic}5%B*n#CGuZ6u%%gsm%`u1uLzEpa!75&r(sTT^Ibg5^CjqO00&cC?r$*o(6$D@xa{n|I@c zLdCbs8yZz{rEivIMBT`zq{b-%(Vc9Q8Vo9usGfjDqnpc_2hu|W&@uQwo4|nGXg6w_ zT~`||i@16vIQ2(tXZ`e}yl9UbqG++zp?*9ndB!^WR#@&)%GzW~i~!D6X$;uw48(w$3o+N{E{A}gY0@7+WK)K1Tv1Idh4CXuQz z4d0+caCb<3d=cp_>&EXE-|X5~rL9Ozpc?t0uv}ifs+7HTPaII#tD4LEYAVLNt5dcH zu|S7@P-l&%1qtY`kV~+VR@2g`wn0z_x|rDr971zm2pM=aiUk#;J3uA;WlnQuJ*=I1 zC6Lxw-7~U-1$#()wLjv^Nj6huUc9Y;2JO_vc=8suR2k*L_X8cIIni>}T?GARh&Cr; z>G5zU!dZ_QT=K<3%h>1A##{|K7#8^GF_>5MMO+DbIaHrGFr4gtNX5Lpdwl&xhSE7= z^CC*ylEuI4viZ8V`E_K5)ydJY&uwSIXZb9AzY2Ksc=!Sf492gm0MKm8J>LJhz(S$r z{M!F@=~qo%yt)#(`-f}gsadHnB8u8fQHY;EZgP{;C*+an3Ll}h$xa!~SQYd6{N227 zpTOtOTlXuS;i8TcII!5exS?!`FmC%vSj6CoRN2=!1oqWuhJd3H+#BGYCmC!S+DMw# z*?z=V6%A0;`~{)h*$P{bD7gLH&`=mFDVVjQk6`pj*wBr};aGiT1XzuEhnonmQj#Kt1XLPJBtW?~Gp zrlFyY2QEG)2B5}=?dcToK_7I*#Fh#8i(eDOH}kRI}Uc!K2Oo}8!K9Bj-^u9GB#r= z4a%yfRNPpomTbt^DJl@71_Gs6=_%_oQN#yCkxxr5o?l)ukLcc_%;m341$(cW+ug9+ zAsX^txM?0PWRPtz1V*xfW62q#!zE{h2U`=%yA z2hLP9|8MnET6kzG>d3t=%DfsizKA1I<}<{4ahERFIH$*}jiSdVyM>c@3{whOal{Ys z-DK2#)f(XQBTCqr)Ogo(>ZoAq=x9FU^~>DxC}`v~t{LZxLJ8-*CMrQE-Qb!yq6t*9 zDy#Y?w?sS_w8jM6idBt+6F3Q`dSuQqclhPECo%Awsw{5hatKxfMZtP|ov)7vaJP{s zG;Mm@?bTe3VqFfEG^I@xae@+|3x4^-nd%!Dt7y>*>sST?si7&d9kU)xrr@JP%13p5 z;WJEi35z|xF$d}J`YBwS8=M2=h+W0`enR1W;b(h@_n?%n?T$X2lRumTWj~0U=<%&a znWcPKKLd@N!fD`$>@HE~ow2yy%QY8p#5&6wb&Y!8R+OU`{2kI9`mUR-4&SAPI-K=3 zGVLJ}6lQS52h(mnr|pJI(adOR9F%6yoBN{7}|y&Mx3%_E{q*cl=3@FJnM8 z>Xi%pN#Yu20N3UPXRF?6LOJ@u+c{##RvAvDm}U@Y)KLenS61}fJbbqgzKj0&VO_Ci z;iIqN9uAn}6Rd&jaT9#^dU8+`N?6^qt_wY0b3P+hwI+%(<_zj*M za8O7Qt}kw#j+sD1P{qz9Y{s(Wv7~_};&`#`3HR8rsnvbAX}0N3axWaaBYUvuxZ4DX zi?+fgS!WI{{cVo%-1VTicKV6Vh%WF**3C!v%0Tbpq~mCfxQ^&>yfbpH=vT090}rhY zf2?(}Gm0B|LVv8Dr7PjPC7-m{3%T~mrgPH+33Xp>Kf7m}+a|adm>)JxQxeyZc>nLn z#?j0<2P657UQU0p0HFZ4y|aBZ`5>Kh4rQS3&*Xh>LM)QpwOiyw0L`v%ohR^OH@`Fq zg$aa-4YUQ@9bgj92sNt6`iLLs51G`)j(|=WZ=F{Dviq>CGp3(a>-ur@>MFK@u_sb6 z%r1jGb(+ZX_lV!phII1xT2z*HT=gCkW359R+pK6UkD9_E_xg^7X|PMX=yiF+*Q*$(`5kh$g5uCfANOv_ zN1$=mV)4K2vxT?%b;EvDHhgn(P;+V3xxC(k75Tg^jWsX4R38NmaLaAux+PSKPI>mF zcH_W%^Fn+(qhD&PA6>*RP4N5gH5pGph%P7107K$V5|XiV`zv-rzhDuoAFkuB9$-e? zIeR6qj%Y$(l`3~a7vMn*VY7m$OVo=*Dbydzx;W;a@yqDqT+n8{leZYX1Jix0Q{8@o zcHdE4nG}1MiP1IM<}fYaJ5GCBf3|Iv#Gn`$m)!sCuPo!kw0|Q zDCX>5EoS{YxBKDNWHNi=JGaU2$?O4MCNo1{Xa+iBuH+soZseiNXr|c?2l1*4`-hDW z=l(WE+U>=R|Ne?QX5AB1kpJRjWDEVdo8LkC{_dg9lV9W?_cklyT_eh#Q5&9{zHo#ohE}_9h=Zo94-*2IhlGqKmnQHxk z_wVL%Z|e(BkZPiFfio8-ER9K!Vjf~djE04FJ+K}u$%@DOYq0h`kFMXZh@=FeGlAq6 zNF!uB-6fhB+wT;&%XC9S@}HYha)ka~v0aTgm&<$XSK!_^BPTb_rxPY3P}#9cl$eM? z{T4bz)NCBTAd7wTh*Pf)k&GKl+D|AyJ%2Abi|HB;m%(&FvMgyViA!biP=iOErf~|l z(nE|YhL=#3K3qIhY8BbDgQD-kRrp?s>ZtRejJGeYsz5a#wQ>|c;ZiYmJZHXitP*gA z)_FD(%h*FSo4xDz88__;=dQ`>BdhDuUQ(=Sf?sCeyFgGxIE$E%w*A1Zq`X9g(jJ}q zqK3sIl5(p!RK#&aPN-%y)4QhZa<)UM;vjm1YI?OU+%%W@UQ9|f$I3%9`cRq*OZP*| zM5O}7nhMvGruZqlF`gCw9wHlj6c*fjHwEJ{IgOxO|G4y^FM?nL)4g^sC3`;^WyW#g zm9Cv$8Up0cdf`tOx5~Q@?7BI-T*ps(m219jv~M=RdY-nQ`N^M?%%#5^!uiTG8dv=8 zc8po@6{3ynzB^X7*xAjQmamaQD1Fp;I^`uiU&4FWo~}f`h{82s@@oxyBG#ph`K;+Q=`a33ACPU1C_HakeitQ(4i(Bkzm{a|*;*!<@LhUv3E zW1ip``y-QIrsj(tOipWMHGbLyTdi&1D1J_S;c;<^B+ogb(5_!wl@H3}KA!f{J%3QN zN!j=w&RvA@r=7l9JL4~Qplh;z`c`n=7-CR9rMJqLp`KHsliWy|`~Gx%+N{Ca93HAT zFe2hFhmifG3Ux3FRvA4ZE=EYwRDo3}hpxG+8ym-U6z=ZAkV_Xd{%XG^W#tT7rt67w zKqL9BD0>E-Q77u~QJ#sGb{4Ix!8g*smlwiBDId!@UfCvg^>quM)oV9G#e0fx>Z8h%*of@4b%%TE(u%qJpsqbt^>sBAAVL35Gv5SFG_;Hwsz##l#VPPxlJ#$~XN^dQam=Mv2RT z+=V){D)au}$=1p7iIL8n43hQ}TUAGV^!|)2L@A!djGlc;q`Cd55;H?Dl&jN-p?upe z6oDCxd`&8!~T1zv4R#w+9+rehF~mWPtRK^&Vj2|WvK&(*2GRGd zI9-9sWO3=g9RG+xd9D)&-n@obS7$N(P8{!nDUFz=n)9R@Cs;$0&%#x?O?I?oAiUR8 zME%Z~8Ia6B*-#(y&NceL<i2=aQ~8(5ZvglIECHJ4!8jw%y_zVY zK8d76d}C?OQn=J2lQsUj-}|y6bF?)~=6QxwUqJ!hGw>*t}imd zN}frBSua1rq)r;>8h8tGWnL?VDg5H(>d;HqGXpy5U@@nM-}HgELu(>CS5ffYT+|1} z8cp2$^EeTHrz*B?51tF#5P>Up!#{fcynWJsr0-m1zXmG_OSBeiqzk*Wd*B?mijU^| z$kwQgYv=j3K#FC#Bl7b`#$Ow(_vuQo@&&+Ts=4STA=W~tB1yOxS&_Go9&` zOcA& zE};DfezA$tQeR&mA1{ZZ^PzVbX?>Jzi)^O*nMa@J1NWevLz=);9!bM*^2h90Fgh{M ztI{OVoyEOp&t?77uIZy}Qrl6V9iA#-^ADcR(}GA$>?pnrLt%9}zws0!PnSb``bu?b zT;%8N!Ht(656>fJ$_y3Ws?;sq7n~TGw0MiLph7c@5+u@*jlIz0D>tAXhweN?BXbl^ zo?~xN_}v7=Zx@w;A`o!7Paf~xfY7?aH$j<=Er2|a-BdV=Bs^lh7fQSMM9+7gyZwdB z&mw_T@lMCD|6XgEW-3&gKyurGibF=Oq=-JJBVC#v>H{DMu^!K2Qj#uY9Nbo?8v!6O zC=I^*tP&i2uL>+~gI69M8yr?B8IpxSUT1LWOR_PS``{uo^y+BA6%5ztQMvPL@ZwgR zBLKD`mXPm~7OLDoY*pnntYjfK^io98Fo)yP^VDuxq`-HdzxMi$Hwk?U0C7Yg_%V3M zGSTl@C~@U=!_2?+J|z+F%XPnh287q#wO8(MeFW^4wzNRygDFR?04VA}fGbm`5cbq8 z1CvU%IqzcX_l(8eVEqqNlhdI#m5A@(S{jz54!Q|E%g`{Fwugq%(-rswcWt(ii71Hm zez16VX(jD9i{4veo@0eO5bLX1Ob>oMKm-Ex@via=Fh~*Xsc8--b!4kN*%r_f?tBW? zdSN^CG}#sm6qJ1n6SzQ3@Qj+mdq*RGz?jnNt^vnXq8Q!^W+ znnXI|O`5qY`x2z%t57ua6uUC$35dTj@(C&(Qvd*H2q<=$6cpEl6@Z6AHsrB8 zB%Ra0814xEbY}4lBI};2ke_@<<8SV-6%Dae3>r&*#nkn?GXLN=K2UMUJgUCC!xK*}U&e<$pS_RPaVR z@CJYSh4bzqGP^)GXg;!s_24O2GTE@_T@N@35^*1+H2a^qzIuTgzXo+^y4T&N9hD)N za&u`pZu(Vq_2X>dZAI{8F-^73;1}tJklb-%P~OvhDC-yN(9R=CM8P6yYhq%8CB0$W zjm-65JFC#)mb@;7V7dn_={CY2sko>IKoq{>1}~t?Kvj>H*|0@4uKRagE@sPwBK~3> zzf$R)_XnB@_r3>L`e@mZu!ar7D!J%Og@OYta-9U7xN~&>kSN1UGKTLBKb93x4apF5 zv8v^nfAp#YsH&>%z`Jexjl5#)aa4x(?yU@s6)95FVt({=L)89*UL6V%IVN(nWYjdD z<3Mw(&YSl_L6lOLFhZ!TAV%Y?s-NruSt6zIdbqew z*DI2_WcaZ4Wn#0}`>Hn;`sCS^w9qc0AXc=h|3bE%lWTX5-1S!)*rsqo=u<$40Y6JfcmU}4zC;#6UKdjZgxm*SK4D8qAKS-h|k+&rP; z*=n3%|IvlkG)H!J#LoHN?B@horU^)YU3vLOgd%V_EB z-1q5Tci7*r{N(UH*CgR@HGMj!2!!fnga2X&qX<1=qm#n}cqC9tVMD_UkNoh`l9{qw zwqjDSB{&4NvVb+2>lRK==JDJmjt2(^2Yf%Dq;P*inNRNa7xl%w&X(}4TusC!BcZ@A zI_v7&{RZJ=%uLUKkx0*b`x>={-12)ZMMX#n)0}|)`4=_Ol+c5NgT1{jUFwsV9@QD< zap|Auy8kpH`|jH$)$3?mk|*pgQ+~us1#)?Gbo9NMW`(V{%fWvX*m!IpVB z{~rzuFWL_!YCQVjq^Tw%Fc0I^lkvV7>UwJaY5X}LTn{|T%i_Qg_6myu%Q7=bYqoRY ze==L{@yR>k%5;ys^22^J3!XijRC_!t8ULW)>H}v8Tkyzr0^z{+_!Gn$JlNjyLf*Mo zx-9Q={HfDwzmvso)p~+Sz2x?jXj03TdE4QV zhg*H1jU?Seq-y(qk5KI4->BKs&QeE-dI&y#q6!*^tP`GRHz-+&TGlO?9k&ZjThf>b z*br|EGoN+TJtQI8=TIK`vxJ8n3nkCZf6pd~EF7)J>b4(@RH;#jHB@AiXJU1IM&Hi@ z1F(^L0Xpb@%zM$(%WL+c^F9lQ?xDhm4K;8)(LB?FP)pHIvG`F7S{Xkg7!N+O<40(Ct#o!Bb_dELo;ArHH~ zJcKMio3gVywl&(&7E+}|odIy2=*<{Z*gjVA8Qu8v+~Si<2iyO$;jg2V5-#M2LFP82 z*5xn15|h$%KJmM}YvJNH<1^2G754Mb_K?LQqwZdZ-eRzP`=Js*HSpuZ{i*Q9SHLDl zQ}36a=vkl^2oV;x3fe3&d7i5tB&mC}Y=M-j(Axj=oF*@L&}1rxvZfdOpjimO{l^dQ zUX)mrR{LubN%9Cah&4mmt5Cspfce6=&@(tIBjK+A#FmzpTmY+%I^HT+1lENLo~X^| z1@y($oc|!EzHnyrgG1Nvuc=M@3uqM7gB?Ksxij+ntIj7Hs?%X&T_Uks0FTIbBWeZ| zDh~lJh?@VIJ11&9ukQywIp| z8AL%t`|8c~LYg1893~udoWXw5{t6I?*!7e`nzahQXFBQ;MSwtY12~JJHd!mDdTb`t zLa(1w4G^BSwsZi3h5~>EaU1R7%VwwE-2fuPw;6s?7xg0FCM__}6;)A#!nYaT^rwtN zLyhJ*#V4pzNThvxjJEFn4~xW|=?B5;uTr@5X@TeyCiYyy7I5fV=K-Ix`R$o>U^Sm! z-+{UFUYGz*lHPtf*jZHvtZN_3sDlMKOnt3(=vPya$0(^-zHQGfN7i0x<9NGj|6OJC zW9Q?|7gXz8t!mGA@M}ug>eDR<>Qzq~GS^JEmHB$OzoowW%Uyk?{51nf>YQ0{hUk<3 zcn`&b9hEm#*izDJ3!G0?>8N~K)moBL+j`mZb@aV`=lur!H*y^tWp8S-?bJWa#YgVRrR4y4}MRh2e1q1xJXNNp59Nwb%*$Vg2p8W-~; z{l+z4rrJQhi;a(i^j04+l;2OtXJ5iI?--o@U<@-X0N%M0f^>(5N*be8&INUtr6RSR zVH?Kg*P#d&w67L$lTuPuN_raMJ-z4dz z97UN-8EdRO*-c>TXdBonKZWu;+SzrH@EGJ0VR~rjc}Qyt%*`d@@9(d^Tn<4 z#YZvau~FhZs($_a>oTlxiykr}Wrr95v@#b!C8GgQsJ*?rOBabyef48^ZBm^O2P&_s z@)-YguVwFd>eXXD1H11(e(MlyNHO98kPR?25){C@QHbfIJI7i@+e;5m=(>k(Fw$D# z^5#&9M|Kuw-9Hd37r!!0S>xXW_V~2;~`A3_}%5R+F&n|oppNV(p%hpr|lmox=B){QcgZpr3oO@hX z9B7DO}u~hb4$l+GY)t2<@irI2Sa}wQy|K4kCroI3!%nlZ*2i5v4$Dz zi0#5_k4ceGl_?Wt6SE}MCW;oKU~Keq1Y?9r>F1uiG}PGZ(Io(&#ye6{;9PrcE3R8a z(g_&u&ti7v(PEG5F@tD~Nl!2#JCnI#dqOkP6UA96t6-zb4H3JmoR)D*`f=+AmL~7- zzzNUd)R9m1Ra0c@=k2Rl?dpC0#CJ*N^!1Axx(X8#Huzd`!Cjmsa3kgZ;oe_>3?&}Y zHERC2`|R&r7ylZR1rQp=33LQ$sHyWEiaJ4%U=GFb?1?>X1I_6WWL@O?Pu)=}2EVwa zG}3vt)NBGOHo#C}*UkUbm^W7^T7w!gC>MwbnSFaA(g*AwsrAP#DOh~$)rHX5xP5`2 znj4u%X+E|Ah-a_xkuMWPuhFCPFF9L6ZWOk)GDGmE8fRMpMMtsR|L8dK67fRMD*Pl>M~5u=C$F0U&<+B^ zW?>*W1JtK+${~%OBPgxlJv9Jj`%l~3b9St6yf`Dl6_9K6>co*P&peHM?o1gVTs2U# z8R9ITQwLYbT%)(&{uf5}O{+eC^Dq7bP6PO;5v0d@OyVFA3D@z4l3(Zm;T^aX_Vnrj z{8MYhIWs`kIVS-EXR?&Ro_^IMbESlf`Mm`a36iO~0J4irdOd)214zrCJo|>XJYP1W zIRB0OHD6G_zVtjmrzJ8#FrG;ymezmEox0V&ekJ6p9OMQpMKl#~2Nz%<6%_%)Wg*>D z?{88i2^L_UwPg`X1yT%vzG-$3Vyy!74Uqb}HhYK53jE5yFqY4uCPY57l)4Da67jOn zDrE7dB^799a0S;jdI93f+JzDP3yfj^@LQ@d2=pl+uK7BWNog0FmE-x3{_Km(VX()* z%X)bCpz?PV@UCtHooPwLvoermdhNyf@jyrnth$mh8Jb1jwECw{=5y&YEC8#`PQJch0$ZaaE{#Zmm69tI8`X712_6| z+#9M{pWDH2I;y`qM^zcifvu0X>ZxFd99H1rg5xQzB~ncsW2a9X6lp&jD6p}X$y`$l zn3vL%>wF%3iSMuHNJ@b-AwVEE6@5w}?E1H@IFZCXh%!1%uf|au7vleEgd<)i@Dz^VF4H*ESJIM{YfO>4bc;#9$+RA{KFCXi zXOJ&MS1%cd@PNUdUxc2&zC$dnfp)$ZZH%2mm` z*+L*+Uu&i^nuPN8_gTIqUE-rEJPO9mh6;6F$pHSS8mxk`(n!yrZxMnkEWebg254%0 zwd4VyT@L2^_a8JiCoYNqlVm#p(bJ@~*-P%v<056eqwGJu^l5y=x%43_cxI_Tv%m3T z8vdL24_Ucw$9Uh>6=@>;lQNZ80lG*YA00{6OxU5q@?qtN{u#R#EC5SDrk0F`+UsjS zDV3O@NqY4#$(Ivc!Fr8e5rjA8QR36TeTB^RPpnP$61mp*+KXxzfU>KP%NOjhL?=?k zWU9ja{C`&GyodhnXqB35D=HD6`#-Zo8BXEc4tYM_refJm8vLb}U&Ax{j#;{&40q<^ z(to#K@)e5j814boNx=Qe{a~=>1TmwUsS7ZdAH$rO7sgb=w+5CX{y%O_qMewh_YJCc zB`XmxIxc`WP$;3Y%ZL6U+Ez^?H5qW`ZyN~Hvt`WVq)BD^x4g;5SFIsTfYF`1nXX6W z!+D@Mc*M#^`LEFd2LMlXj1-8#4on>xQ27DH|G!(BL2S)SAkK@I2GbjytJSGIPaBdB zoO@Yk0`uAJ%`Zy-ugzrmT0$Tag)mM)WUOVc>ugdBfu4u(UP}=*M(At%{#(8*E?NQ= z-bpjc^eaePn9NNpEga&y1Fup)|x$kFbY{Ss_kdYnYWV%l~IyjU(G>$j&u+Vj! z4G-$N1wbAJ(d}J8*!o? zhr+YxG2S(!KfzQyv}xZ>b&V|q;iHd0jE9b`nA0)-2KU*_=Dfoled1r2SqOx(;_R8A z7Ks_@Rz0G1(z}P=%B`~v{ng9|O2OuKHX;&uVzSagc4E zEFU;?Q$P+tGFY1XU&2~tNs8!9;V%4gFOJ02Eds3(c#|goC7>K72dx3p)&!s!hye;n zvBIFV!RKO~SJVuIR(psQoSix^GVT8)e$=)@k5@}%tZ)3f9Pt?!nmgXbm@Pe7uUsRN zI}V3NYFw@w$DLECQJD?*&LKPT{CuxilX^{PE(E?CwTGU*4;SdV)zc80CEEM0hdBRh zX7|19dQbQrDg8Xe7q>h9aErU){?ZK|-{vd_b}bO{KOUBwu7qG$;}{4g1h$7iqt5J^ z=Q=S>S-stJQ@jq!U>gDwnR+-ErLnDVGUN>21F0uM-FX ztk!h|O&>VD^G-@H$ZzL+6;c|W<6${pjN*77MCR|_-lqhRd9kDVHFFdKp!LGTR+q6L zQrif=ftG{DBTL2*(LRHxeC~GUPN%zd)4u-Rc^36cX}Na-6Wx0-$jQe$`w2e-g=Bsn z+y8_;^|GXNF#bX+xf;!|*Jg<~vtAh*R>Zms@U@TQ@|9}}(Bs5s4E0GMGJ0GFijnQy zyiy-tAuCSN{pI;9$BVIhU8I6{|C zje9Q{b+lhN|Jp6`w({NOCaeWi_MF`011ZDq&?BvWM%i9#@tI>Q-x&rc4&15BTq+pW z%QE%%HdOyqvSmd@E~vBLi*`s1S8wo==GH&|aDpRCu|~s1sq>v5i68pz!o*%G{z#WW z9zhl+<+BWtX?NhGw|^@HlI=ck!3loF-l2ESPqy&%(w{?+%^vcn<=hvjk;X^y<*Rx~ z+3cfO#`TrlfIqm_04f_zTDc^Gsf4-+eAih4M>cnL?OFJ8-)b<6_NkD%z>d`S)D z-gcpzDe|=31IR~h#}BgA@7rq)JL`qS+c=!)r=Az#VnJo7@!|fdz}vZYT<}na0EvJ~ z4C0=&&G%y~+lReIM>lf%+=21!Mc>$kF$O?Ppr46l(8P^E*jYk;g zQ^a6$(|Kkg=9Z-L&gv#T-H%f5FX|5`4OV02gba-c5l1D86T0AlgRqp zCpDti+xhoyF#qNk2=o?wruY^A9KIWHrbUZ3_@%x4Q@TNwcy!zdd^b$ZVk0)iu=MTu zmAXwaY^vS`g-P5^aC#{@-#S(#GqbSU=xUEIS+)%Gk5O2bL(#gZf2rOPs2$=L_|cduLrdtA|j3fo-0%o zz=$V(>LT!m%wJRAk_z|zxXYEf!M9WNgh$k=+XGBETi1eWvmLYjNn5TKR zcM+HSqmwqTaRLHA9}6(Wz12ZcQ8O_?W2N6Gh>ftPOZN%ID1Vc`c46r|0P0TzxmvQm zdh}4*h;EfJviG(#E0bPoxU|Oe7cT_t@@1Q=Uz+A9LGj6!sMMe|A_B_La} z$kXBNN`pZ`tySD54#!s=z}@@_y`D4Y51aOe84hnpkreoMBA$wewNhaBa8!Nt zF3Fv!^QfArg6p_Jv={X999`=~_Q}lQCwrW;05>wsfUN}4OngZn2LBQ1Lhfr*upvvb zOw4;z+o+^JK`m{nQh})TR2RpNl3>ydOCM*2zKmK^`;QfHG;-LklBd9>^V(HZhA{k-|)6MWWfXWf!KxiDJd){ z2cZgs*=P>0H#B*BqPJxrp(J|Q)>_>&(#S-#S70R%#vOJVcLamYI64F^3%+C9Dd=GItM;Qc#n)3&Y@L23u;h4Dz|Z$_5gJLHYk#D*2AZo!nSulmaCX ztCKI08<{Kwsf|&FaXunjVhkX@(|hcST8={8))F}s#m3*JZBW>g+FLQZI6}cu>~DFj z7|z^gr^!0Aj~^UH*<+UvK1Gr>fI=WkvF z*exo!Y$sBBZ>}LsaPLrMzY~-|>O(*H&1U7i2jb1wg$mW|T#e$7cIjOXQQ8ypb)Q$` zvEp1BT_%pCP)k4N*d&*ri7ZSZ*&-TZ*^t4yVvV7NWy%)2;-9dnVW$PfVo6!*;?ev3 zdy*)Rw>NhD_bh*N8xiA#FWt73QFzLCp)?^rnFo|F@M>yj7=N6D`mN;fGE(*=^_3Sb zL{?lTn!zOX)R&(+&L)}jXGf`rhN9}ry+i5E-%PYN1zwVg4Ii}c5?`=pE*Gpc^NL^# zk4{lN3=i-szF}7Oq+wFtHX}2{kIA|bE#6^@X~x0^%#jSj{p}Q1y2(sZT@$8k-%P;KETM@B6osP`_KdODatN=52~g+3Jb!@I#RoT$Gp6|#hTo{R6j zk2ek412_20uVzhTGG058Z&^ZHY;9V&qP={uN?32`@{6sg;iAQEYkSc`(x^l9_8a%D z9KTQ5yMf2#yvC}&_*O)J)cNAM8swDMS9LEK*24ZfucIeNc;MHJkFXL)osqJRPC$$y zye-sWe)Vzj3$pR$b!!M0V<+S9u8#WA!;_!K#wmlCj=s~OE0VBd3hV+Zk13SYd{|_` zpCVGnp5xcE(yl^Vid`h=(a`&Fhlz`1+>#GW5_I&GjoC%$NinB?I~+Crk$iYNz%iy{ zV_Pe=w=(5z@8bEbVjoCV%kH_@&MR%pBZsVu^rp3}1P?NAoZ5{uqX0a@>2yZxPv2rV zcyAOctPyoYkTEN&zN~9WAlN4eZ}XlY<}^s~DiOMt{E^^E5WK@-1EhO#pba;!DmHNMn@8j5J%kmd^k}{SzgBbq8mQVy{~Dx^^74Kbn*Cp z!{Kh``^fnN?C57-`Xx8X@%_$%~rL-D7+F-$rcCWo5qM;4N4GHZ>+h6z4 z>6$`ket$~;&u#cyGWvQ_8)<#Ov=OvUNZ2A$*4J5~p$#8dA$^D5zMP|=I zAvMU#=f8iOJtP_bP%92=;p-@X@(Flkwtp&Sz(kTIOJK#%sD39Px^4xmw`9+C40~y2 z9{jQ2xQZf&$uFP>h%OmazT-SK-F9-t+hqiZy(oiNnO2E{cNwJ}xIFZ-=OSQ12TVc! z5Oc2IMbL0Etwt(E40?%KDXiWZ|K`MzCF*{3NTqaytQKN4ckcV%pFgZm>*{Wdsprmd z4c8(nM<1qjxG67vAl+^G;Ww&NY_h;x4C_fx$(?H&`x&N9EG2#`vqAT`sb|77EJH?j2 z2-skj8&=Vp+D1}kbGF!NPf;(BpE(p89uoQD1;+1kZp3eNsfUNkl|!Kw-$>zcgMa#y@T%hh??_3>xN?0DZ{R%pMwylZw(W25_$Pg7M2v#Ti^fYFyHyb zR%~)?_?|5QzXA8iUKTv5Envvwy;!=@bM2(~AZzcC}6w0=$TvnC_JSUeCfdXMzHkB2<1UJiG}}H&m%I8G*o+3}!%b zr};ZG#ZF}E` zS-=OV^MgS~g=+b1qW3J7=s;=J&ahZCMQT<~-2bNn0*2dSn4`5nOovVsFR;{6ZIx%w zslr-ro)vIU=OXOf#@|sEN+J0T{!l=n4@c?BboTH#wFS(^i@_`w44XTJuTKcw_|8?g z7ln!NxQ)bw&s5FAt5hQb?ZbRf{IZ>nEM^x0{Xi2?>>eqMn48KA4xDf2#huRcz95m6 z>ubFs_4oj%p0tWOFedJClkaTLx8aL`^PF>3lz>1SjWot&42wMFJ?BLo%S4?*fqudG zqpI8pCQP-&`ISJ=zIHq2XoQ`Sr3?0R)ltJ)&Pq=r=JB4a-g&mjb=eBxm--z-iPU#i zj)XPO_xx6iGd$alBQI??!}!4#0kH)~$^Q7jm4}fj2-kKOGlTLwE05haQ;i-IWkcMO z{nvP3i3P8n@-3Wa>y>HwX(Vd`I_I*c;0biP*`hda&+}`{xAN90o_9^tk z2!E}*f~{%*-B<=P^6doY;K!wS=n&kvZ^>9}No(u3v^I?av^0#S3e-tqDaOu9!K zd>IKlrt_9Y+8;ccBRU+fx^2wg<0bZuPlB4w{gMBO|dI!9;MLKi3tV_ zkJPKQk39PVMBde)1U)tju%5d+#;P;^pJC&v8TWx(pei+hB~rNK4`5hD zzeee$cBuh@fGM$8h+GUb<%AMi>H!Q)ebw^clFE&H-R`Uhtrxlg6BAyk{CAW$>8AXoiWb-+|L=-7Hy;&Tm!pO2 z9RZXTf+Qe!jns>`8Lvt}&OLU}A{H!Fb8OgdMC zg-?H&;LIjd6D;KfV?M^EQdyL|T$r*J1K%}*J2qT5(tejaov0^n24=5qV|&Jux;KaolC5W{mHiM# zzhZMK>u4v^b7hv#$`eM9vcK&%&M#S(859y|Hv+DIyjv0+KUq#N3cshGWVj3R;KFs> zWHd7RbTM45fi?T;%X~^P>Y?Dc!52IDw$sOQF`#!*<=2fRuY;SNO$R`>6k!ACdn`x9 zi|o_OR84V5g~SreNG8#@ZQ`8PdHj+6->QE8YvSH|{6&l591UV(m*k2{T8JH#wRXZg zzX$V9y3Eh)lW-3*H9VeC2VP0kYo7f4&4`BGE-%N|_mR)G7uf09x==s^5Q$zK8}2bkLaQkrWk-%9?TahQ=BUYElh#dIV=FHog(==`tj6h zVI3o1ro-mR4ZKPi^rO4Ul^yfI7;r99!s=;M&ilNZbV72XKzKR=g3`vNY^m}hO$~SgYZiezvj&hrJcroPvZH`zDFkC| zW#s7H2_mrrp9hRyoRrhSZ}R}FD^HE(Ct7F2oM+05W}2HVr9{#;XBHNQ=9@j|y2C@u zw5n)a29sUqo7`pPX&B5H8Y1I&SJu zQTUG2oYznX20#_IYMhC}fs@bDRGWf!9tas_qkjFI{JNYO-@%gDZ`BbbPRSeMsBd4A zT3*D9<-w`ZX4B_6!v=|#iRuFJ94HvJ*X%;m5!unh+bW-4WA9#)*zqRZYYS6UejOkg zej4<^#wLS|#u3)k(vsP9oUQ;05#Z&OkK?0UA{L|Bilpfj7Axf7Woa30_PFq@5F|;u z&UB-|Lrpy0rYhyGMt(o+o)0XAm@7Io>S~lYZt3dFTJmGsp;KZ>;ukx1w>{&+?f)Aw zI!upLoJ)sqSN{}*mR?~?r&hC)Op6e|Ymsgqwj~_W})`YcV{zW7OTpM^bj_ zz|;Nt(qlcL1oz%sX*qHcXTJ^N&7`&3!=^AFh=!tEqV!>zn_dMJwX{Q?(dWdy$6Zk) z&SW+q(&t~~38kWk#S#$zc3|>1#8OC?s8wji$k$_?H;4^;5As)}ole7X-8M;YJ?I2t z*m4BF|?c=~cQ9zKFJMR@Y=J2TSO3KOu|feI{arKM7PjonQuIiPn z>0G5+Jg3I)(QRF7PB}=0oCjfRi=hh4rE>IvLdWLFRJ{zvv%S8#)+hX1)9+j+%Z-f+ zR1j5nDh_^{M&_&yW!<@de{e{$2OUSxHS1Owet_Hkvr)KFRZ;Nm6N@RC<6tt6QNB|1 zluwD6?0dz+^?V?lNv-51SjIm+TyK0d4z_=~#x|mM>UBlJ_H(&$u2q|#U{X>NP?m>( z*gE9mwV@4p%xIzmjzje?A-XqlQa+S%DHhVFI|aR-cPcmZyA z4fN~y_~6&1Y1Yws`b!V8SgJ{*Pt2;F?mh5~WF07ttpB=E%VW%!h|`_Hsj52&^+>gf z!U!e*b+ps*_8fQE-p3AAx65<C9$#Vcrx*vB<;Rd(Uq3Q8>#jJ7t z!F<)i6;j)*l$UzLf4^1^Jnu3pwZVg#(sD|mW(iW2wO{S;5^@5!V2tJqccBMAo&As= zKoYS5*aCTwMJkl%mQ(P^q&?Wn{Lm@rgIK=2z!SD%4(W#UUTC?#b9uk#gl$yi5S_YO z{V8BpsfG<~1Zlj?4k?HMTZr?9V52)-2^+hihQGxdx-C7B#HCPr&Zq#g1ai*xoD#0u zorUa5-)mqCu_~V>g2TLEF>wU8kDyR=p*mmi#-RFz^oQjLWry?4`vk2M&Di?W>+%G$ z5|r%l=gWPHE}QoNk|Fbc3BKw4iDSBQ~0ff?_6Y~AXH+;Au`-NMXLzdBvu#jyL*d_H3_fi zbos(%0q-O&b{CkgweGW7KAE=rvKWrX5FS#0#{ShO_uf6|UrkXT0a$zFnV6GWVT5?U zaIw0t$f&YMpLE3tyAQUS|H|xb|Mpuvwhri z9^~A}PL!WNEBqOPz`fK}xe3aPM)#TM_8z1uGk)H-; zV3FHm1p@0V95Xf0Ycdb=119vtu%vw0S(lWxF)c<{z`(pP?HLG&+d;o%L>i!z0&65} zA2Aw6k${W!9hRH%{k;-@*h?$f;Jc#vxN~0zHk{LsMnEWWS!emXVewn_Jp}}tsjK_a zq%^D7T7Q;z%Rj9DC0hmqe+}im;Jwc=qyGAR&f7!Mm6NK8+Q*-eqiRFfv+_ zyTD+gnDCJToQ+%zNr1rXfZtHMc-)9VJkV)d0*e0e3eR-t>-JuXr#V6I-CuFi9zqNN z&&&ljeGFtep&-$&V+AyD9!bm^#LoK#(SPE8B;S>12c?1U5Ts8lb=MTN$|pFpKVb?& zPsX*kwesFu=ryoA!9FA-_7j~{KQP}haVv(JMJ0zYz7sbdr}tpy$zafh>ZIDjuT5IA z@ux9s@T!I@&$f4^wCqCrgq@XqqOWY3vj#O3KS!2|2MjvrhRvqD+B<@f)rC>+rj&WEb-y5SbvxSxCiaX$Me5TpI7yQ;8WSlwhZ+u){Egdf053u&CY&;8H;~d>`jUI z#lM8_#yohf#a9-8^4Z@8bkJ- zg-r7Fbag2Qx&7(f@}B7Q3+EVCKvQ+acm-o_h#Q-O^?p=ePkZnL8%-$#@J>Vs8Gy>( z1h)SuQr!Q%pwPz($THY*Eke~BR!Fl|@qYtPuo|FxfG8JF`4p!+ z@Bdi1?Kza4??OH0Bxdo(&-kip_({OMI$LVgYeB;wJ3Hh-`Hz*})YVBGFNOMWa&cL= z2i%bC{_PB3?jK{DuwJALo5nB_CljjykQ$i;C5})ccCARGI-)pMHk`4i+9~a?ER40@ zt!hm&RrXnx#<}K7oD?TYd<*V5!C}v2d|IS~&WW zO%yUNFFJO!uO6+5*!8B^K0l z4`intE{Bn4-!J4;F6%2CB~|GZ^2rW&qd0bJ10I3z8cv!qViFK>^XPKYcv42)5!R* zT$*o~R`3H25#kMz^OF_CTQ6B2{|OX&ZLTYg%BD6`*MZ+IrPArefNHdXg82GR0lkp37hV#x3 zR3veX$+Cb$3Dr)mT}NixqPpViS3Js@?vv#iUWAUL<1!k(b3x<}Ne{-ZhO*BjjO8zW zJYKqZWC>ta9Y8Dztpx0nlu@N&!b$I~{)QhryA~m!$Qi+}#an?n@8&hS>v`w?+iT6b z0<-+NetAECSgdLOZ^y(?#i_9+AxDxV$don@w18T=EovlY>Odb!Cm6%+ye}YbeDun@ zcDc=B(kOvY)O;?2j3YgfOn)1?WM&P9MyTIRvh%DpzZp=)5V}MyT@~+wqV$0$W3u+) zK(vDZ-C9C_Xt9kYL%F*Uv@{OrfLCwv0vieaZxFe$x0P!yd4Y=rT!gy-hrsH8`Qa~c>TOG3pZ@V-fH^^r9$*NZsR!fL zA~IX1S{14R8dW)tl_R|@a=YRl{h`2(oKC>o9a{?F4A*qhufqb&%w;4~oP2>71kCL$1E@_0cHl>-~mV}vD||38jrt~`P(^j0Ql$T)~l`oIhbTALD@Qh+)Rd07pl!ovCyJu z&S;72Y-yXB3ZU#cV_3^Ly1>9jp&yNtM&4b)e{WbqZ!1A;ykVx3i2sfgp z5v|~toX#UqhVEM&~Ox&OC?{L6V|(%-T_ zTj5v}Y-d9lZ-apMdE3fnkxNvaC5uHfd$xTskY-`m0L{&$)<+>QBzZ(lh`9$?QPfw| z4lL;Uo&vVk>`Ve{=_ofwZ)+BlZFo~|#dahVRNB;};V1g*ar{7|V6qXkRQ5oKB>1vI zEO#9yvV|JN%T^i~e5LX;(a3+zX}5?W4mB2avIK+6O49nDv&xbOzNE;26D*Bg;EJhC zc~Np^`N>(V-0+LPppk~sH~sm6l#gPADq1&kLQJ3@QOqB&<-=7J-kDYas51dr(r|{8 z=(3T@CdJ1!60qsJcL=m39Se$BAq1)K0xp!)F$vneu{|;V*BtMfz^@sD+nyJ6U-ah2 z-6pvGR{(%zF~l@=kCk611T2dq0I~hl`@;WD+`Q}*hPdF#>${*d5I|}e^@~}n8q}n* z9Hcj3$eIB-9)L-6JmTc^;3KXq1PlW}q;sMH#D+3Gnjjm2G_bl;Z#Kn%{1vHDvzO%v zCIYIPS`JC$exNH&K&S~!8p~FPB*5QV6Ck3;24wC^-&A8U@z?BDtsdn7o0DKEE*K*V z#G*%l+ds;o22}z0?O#Nn9pLk)ETA$1$cz2D)3yBrUu370L%{7Dzfl6NMFG62%YIj- z^y9-D;_nDr`f36Giyz0$Thl2E7i{fH`Vn@e0?JgX!^T*zGse(O+TwHLzk_t1G@Go$ z3V;ya>jOpV)&$+L-2nsOo4}g^xd}7%S6VVs?N-kL@c%>vMArC8N{6k2 z5J;=DnKj0w^Pa|8Zht9o!mnDwr^1_+K4eGbNII?p(&&1icw`dO$?SwAM zHg)RlY62%SFAJ!mN}|8wF0K+mI@lChKIc$fbUKL&N1O)tMQBhmtA>01#JSq+CfBZU zZoUG7tdYlK=ZRLG<9yjnt#Xrx7XJL9rtEzS%VTQW?2p{zy>nMi6c{7AvQRSf z&t}qYbh5fuq=WmhB=~)9eB%47{`lhUM~?9@H)7$A)A-(1|ELno`J1@{ph)I+Xmr*# zUu6PS1;Sb;FdN%HBMio^JFm>D@9YCuHnqJjkYL`j!m%L7I0Vllm@#S&l`j~=0|MQM zDaM0ZLkkh%B)`SY7#F|eOs}2>LZPLK0D)H>%jAo9Uxp_p=sj_N*qHEHqyostGGA_h z5)xkd0dWglVmnTmPA^J@e1|&BNG>7rzAd*HuJh!IsoW>3m&n;_!I9^S;k^a8Qi1#Q z^nHi@>^%29U@e+|U$CZ^j`=3m;_(v6ergWj1plR;ln(XPDkBw1{U%oDk$~iMChNEM zD!DlV8V625z!?w=pi}@`T>p1@YZi^}-1*!&c1VY~SLA1Oc^0IbsqX^TGKDUXLskrL z-{JU@=LoZd9b5hWqRGv_=i!J@stdrx9>ta0?ZIE zc?=;P|Dfe_=I*%v&k=0iTH8jf3~(aSDKi+7giyVDQ4U0Ni_DGnv#|8*BfveXwWgk( zD(iyW!%nj}MIXb&C%{{oYi(;P1stPVf~R5aq1F)z<)snCA>w0XDh!=Z%n&KW>QqB+ zq#rUwyPMd{NpxSVQKJeWpPrKJZTSsmUZ0k`ZIirHLDEA^r$`Y}8PhmTT2DmzD&2*; zlSh#xJ#|=J)Ts8z zp=Q-8chk9glw?ZODq>&7vU=3*mM0mhLUS-)Aho?Jyd4r<7`LX4vK5^(j)VB)k8l@{ ztd?k03Lif8rLcIwXKJv#LJ$YYpy9WW_&-i z9)YI*EI)p3+Cb{sOW8&HNZc@h<3)K@Uv#{Tm)bO%R{^=4J%@fz(ej2gICstf(xKRQ zteO0@EzkHkvLVe^?2i2^ZtMDq8`<%Q8BBm@hLQQ}iOfIvKO*s_FNA7y-^;qZDs}lI z@A$l<{>%F=@Sy+L(@KHDQ9q#=qvdT%hmHq&i1$*+eH0I>40o~lb~uGu?g^TtoA#`F zai4s!?Gyy`C%`3+1xjx|(BNdTO=bb{nM~h$nx9y_b1CwTHFmR^1b|+)D>MzJe#<3R{@`ZkYnaK zi^W|mKmX8iT7%g(e$#vx zPm8+R*Iv&Y{+4)vS&pxkf|tVHX5_afosVF(jw-Rrl?W4ZHIgua^gm>Kvg2$Fkz`92 z(TWaS_LuuihMOVfgYKxKl@N7mbk*&=VW{wN*Ti&Ef{T87-ZW_!bh%hUVDnA;RV%g# zQ)<@@B6X8c9A)1|fSj)e!o}8jiX!hMth}yi;cBbs%ti_N$%R-LuHc$dv@s92TS(`^ z)1tg5aYwWkh5t0Y&rm6t8_^Q{6Xx-fnsA|&KT-SteYy4D8y_5Z(O$0+;bNu;(JyQ% zpY`4j>AG4{AGVy$W0uoPj21D2S>hsTG@g|KL}1q-xxIF&jWd3f1`1ky8Jj|~OED0; zW7=^V203-ZG8enQ<|9#C$0?)57|xh}hdM%hTRMDho+>lXX?bwI9$)t>{@LJ0I!fF_ zKZJ}LTs-%4%NPhF|W%%`Qq&b@<-PS?sM&5m22b121^W`bZ2Pv$gmkY zsxXeT*DF~4Go~KhGQ=Ev)55}lOlICou>FV+7DUuAj){cIPP%LsjC2)c5{-YdKSX=& z?&aNBdCGKtiKZRmBf2n)`>p-b#8^wFx-}Gy#xW{L`Vce2rfEM#TP9&Cu+)%H*Qc~I4W#M0r#kh^tDZ(b()Sb{|igNKScll diff --git a/docs/quickstart.rst b/docs/quickstart.rst deleted file mode 100644 index acb2b85..0000000 --- a/docs/quickstart.rst +++ /dev/null @@ -1,194 +0,0 @@ -Quickstart ----------- - -This section shows how to run simulations from simulation configuration files. -First of all, you need to install the package (See :doc:`installation`) - -Simulation configuration files are ``json`` or ``yaml`` files that define all the parameters of a simulation. -Here's an example (``example.yml``). - -.. code:: yaml - - --- - name: MyExampleSimulation - max_time: 50 - num_trials: 3 - timeout: 2 - network_params: - network_type: barabasi_albert_graph - n: 100 - m: 2 - agent_distribution: - - agent_type: SISaModel - weight: 1 - state: - id: content - - agent_type: SISaModel - weight: 1 - state: - id: discontent - - agent_type: SISaModel - weight: 8 - state: - id: neutral - environment_params: - prob_infect: 0.075 - -Now run the simulation with the command line tool: - -.. code:: bash - - soil example.yml - -Once the simulation finishes, its results will be stored in a folder named ``MyExampleSimulation``. -Four types of objects are saved by default: a pickle of the simulation, a ``YAML`` representation of the simulation (to re-launch it), for every trial, a csv file with the content of the state of every network node and the environment parameters at every step of the simulation as well as the network in gephi format (``gexf``). - - -.. code:: - - soil_output - ├── Sim_prob_0 - │   ├── Sim_prob_0.dumped.yml - │   ├── Sim_prob_0.simulation.pickle - │   ├── Sim_prob_0_trial_0.environment.csv - │   └── Sim_prob_0_trial_0.gexf - - -This example configuration will run three trials of a simulation containing a randomly generated network. -The 100 nodes in the network will be SISaModel agents, 10% of them will start in the content state, 10% in the discontent state, and the remaining 80% in the neutral state. -All agents will have access to the environment, which only contains one variable, ``prob_infected``. -The state of the agents will be updated every 2 seconds (``timeout``). - - -Network -======= - -The network topology for the simulation can be loaded from an existing network file or generated with one of the random network generation methods from networkx. - -Loading a network -################# - -To load an existing network, specify its path in the configuration: - -.. code:: yaml - - --- - network_params: - path: /tmp/mynetwork.gexf - -Soil will try to guess what networkx method to use to read the file based on its extension. -However, we only test using ``gexf`` files. - -Generating a random network -########################### - -To generate a random network using one of networkx's built-in methods, specify the `graph generation algorithm `_ and other parameters. -For example, the following configuration is equivalent to :code:`nx.complete_graph(100)`: - -.. code:: yaml - - network_params: - network_type: complete_graph - n: 100 - -Environment -============ -The environment is the place where the shared state of the simulation is stored. -For instance, the probability of certain events. -The configuration file may specify the initial value of the environment parameters: - -.. code:: yaml - - environment_params: - daily_probability_of_earthquake: 0.001 - number_of_earthquakes: 0 - -Agents -====== -Agents are a way of modelling behavior. -Agents can be characterized with two variables: an agent type (``agent_type``) and its state. -Only one agent is executed at a time (generally, every ``timeout`` seconds), and it has access to its state and the environment parameters. -Through the environment, it can access the network topology and the state of other agents. - -There are three three types of agents according to how they are added to the simulation: network agents, environment agent, and other agents. - -Network Agents -############## -Network agents are attached to a node in the topology. -The configuration file allows you to specify how agents will be mapped to topology nodes. - -The simplest way is to specify a single type of agent. -Hence, every node in the network will have an associated agent of that type. - -.. code:: yaml - - agent_type: SISaModel - -It is also possible to add more than one type of agent to the simulation, and to control the ratio of each type (``weight``). -For instance, with following configuration, it is five times more likely for a node to be assigned a CounterModel type than a SISaModel type. - -.. code:: yaml - - agent_distribution: - - agent_type: SISaModel - weight: 1 - - agent_type: CounterModel - weight: 5 - -In addition to agent type, you may also add a custom initial state to the distribution. -This is very useful to add the same agent type with different states. -e.g., to populate the network with SISaModel, roughly 10% of them with a discontent state: - -.. code:: yaml - - agent_distribution: - - agent_type: SISaModel - weight: 9 - state: - id: neutral - - agent_type: SISaModel - weight: 1 - state: - id: discontent - -Lastly, the configuration may include initial state for one or more nodes. -For instance, to add a state for the two nodes in this configuration: - -.. code:: yaml - - agent_type: SISaModel - network: - network_type: complete_graph - n: 2 - states: - - id: content - - id: discontent - - -Or to add state only to specific nodes (by ``id``). -For example, to apply special skills to Linux Torvalds in a simulation: - -.. literalinclude:: ../examples/torvalds.yml - :language: yaml - - -Environment Agents -################## -In addition to network agents, more agents can be added to the simulation. -These agens are programmed in much the same way as network agents, the only difference is that they will not be assigned to network nodes. - - -.. code:: - - environment_agents: - - agent_type: MyAgent - state: - mood: happy - - agent_type: DummyAgent - - -Visualizing the results -======================= - -The simulation will return a dynamic graph .gexf file which could be visualized with -`Gephi `__. diff --git a/docs/usage.rst b/docs/usage.rst new file mode 100755 index 0000000..17b3291 --- /dev/null +++ b/docs/usage.rst @@ -0,0 +1,99 @@ +Usage +----- + +First of all, you need to install the package. See :doc:`installation` for installation instructions. + +Simulation Settings +=================== + +Once installed, before running a simulation, you need to configure it. + +* In the Settings JSON file you will find the configuration of the network. + + .. code:: python + + { + "network_type": 1, + "number_of_nodes": 1000, + "max_time": 50, + "num_trials": 1, + "timeout": 2 + } + +* In the Settings JSON file, you will also find the configuration of the models. + +Network Types +============= + +There are three types of network implemented, but you could add more. + +.. code:: python + + if settings.network_type == 0: + G = nx.complete_graph(settings.number_of_nodes) + if settings.network_type == 1: + G = nx.barabasi_albert_graph(settings.number_of_nodes, 10) + if settings.network_type == 2: + G = nx.margulis_gabber_galil_graph(settings.number_of_nodes, None) + # More types of networks can be added here + +Models Settings +=============== + +After having configured the simulation, the next step is setting up the variables of the models. +For this, you will need to modify the Settings JSON file again. + +.. code:: json + + { + "agent": ["SISaModel","ControlModelM2"], + + "neutral_discontent_spon_prob": 0.04, + "neutral_discontent_infected_prob": 0.04, + "neutral_content_spon_prob": 0.18, + "neutral_content_infected_prob": 0.02, + + "discontent_neutral": 0.13, + "discontent_content": 0.07, + "variance_d_c": 0.02, + + "content_discontent": 0.009, + "variance_c_d": 0.003, + "content_neutral": 0.088, + + "standard_variance": 0.055, + + + "prob_neutral_making_denier": 0.035, + + "prob_infect": 0.075, + + "prob_cured_healing_infected": 0.035, + "prob_cured_vaccinate_neutral": 0.035, + + "prob_vaccinated_healing_infected": 0.035, + "prob_vaccinated_vaccinate_neutral": 0.035, + "prob_generate_anti_rumor": 0.035 + } + +In this file you will define the different models you are going to simulate. You can simulate as many models +as you want. Each model will be simulated separately. + +After setting up the models, you have to initialize the parameters of each one. You will find the parameters needed +in the documentation of each model. + +Parameter validation will fail if a required parameter without a default has not been provided. + +Running the Simulation +====================== + +After setting all the configuration, you will be able to run the simulation. All you need to do is execute: + +.. code:: bash + + python3 soil.py + +The simulation will return a dynamic graph .gexf file which could be visualized with +`Gephi `__. + +It will also return one .png picture for each model simulated. diff --git a/examples/complete.yml b/examples/complete.yml deleted file mode 100644 index 7b52842..0000000 --- a/examples/complete.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: simple -dir_path: "/tmp/" -num_trials: 3 -max_time: 100 -interval: 1 -network_params: - generator: complete_graph - n: 10 -network_agents: - - agent_type: CounterModel - weight: 1 - state: - id: 0 - - agent_type: AggregatedCounter - weight: 0.2 -environment_agents: [] -environment_params: - am_i_complete: true -default_state: - incidents: 0 -states: - - name: 'The first node' - - name: 'The second node' \ No newline at end of file diff --git a/examples/custom-agents/UnnamedSimulation.dumped.yml b/examples/custom-agents/UnnamedSimulation.dumped.yml deleted file mode 100644 index 34c5534..0000000 --- a/examples/custom-agents/UnnamedSimulation.dumped.yml +++ /dev/null @@ -1,17 +0,0 @@ -default_state: {} -environment_agents: [] -environment_params: {prob_neighbor_spread: 0.0, prob_tv_spread: 0.01} -interval: 1 -max_time: 20 -name: Sim_prob_0 -network_agents: -- agent_type: NewsSpread - state: {has_tv: false} - weight: 1 -- agent_type: NewsSpread - state: {has_tv: true} - weight: 2 -network_params: {generator: erdos_renyi_graph, n: 500, p: 0.1} -num_trials: 1 -states: -- {has_tv: true} diff --git a/examples/custom-agents/agent.py b/examples/custom-agents/agent.py deleted file mode 100644 index 0f4d8a4..0000000 --- a/examples/custom-agents/agent.py +++ /dev/null @@ -1,20 +0,0 @@ -import soil -import random - -class NewsSpread(soil.agents.FSM): - @soil.agents.default_state - @soil.agents.state - def neutral(self): - r = random.random() - if self['has_tv'] and r < self.env['prob_tv_spread']: - return self.infected - return - - @soil.agents.state - def infected(self): - prob_infect = self.env['prob_neighbor_spread'] - for neighbor in self.get_neighboring_agents(state_id=self.neutral.id): - r = random.random() - if r < prob_infect: - neighbor.state['id'] = self.infected.id - return diff --git a/examples/torvalds.edgelist b/examples/torvalds.edgelist deleted file mode 100644 index 3947fe2..0000000 --- a/examples/torvalds.edgelist +++ /dev/null @@ -1,2 +0,0 @@ -balkian Torvalds {} -anonymous Torvalds {} diff --git a/examples/torvalds.yml b/examples/torvalds.yml deleted file mode 100644 index d346c99..0000000 --- a/examples/torvalds.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: torvalds_example -max_time: 1 -interval: 2 -agent_type: CounterModel -default_state: - skill_level: 'beginner' -network_params: - path: 'torvalds.edgelist' -states: - Torvalds: - skill_level: 'God' - balkian: - skill_level: 'developer' \ No newline at end of file diff --git a/logo_gsi.png b/logo_gsi.png old mode 100644 new mode 100755 diff --git a/logo_gsi.svg b/logo_gsi.svg old mode 100644 new mode 100755 diff --git a/models/BaseBehaviour/BaseBehaviour.py b/models/BaseBehaviour/BaseBehaviour.py new file mode 100755 index 0000000..aef94b1 --- /dev/null +++ b/models/BaseBehaviour/BaseBehaviour.py @@ -0,0 +1,38 @@ +import settings +from nxsim import BaseNetworkAgent +from .. import networkStatus + + +class BaseBehaviour(BaseNetworkAgent): + + def __init__(self, environment=None, agent_id=0, state=()): + super().__init__(environment=environment, agent_id=agent_id, state=state) + self._attrs = {} + + @property + def attrs(self): + now = self.env.now + if now not in self._attrs: + self._attrs[now] = {} + return self._attrs[now] + + @attrs.setter + def attrs(self, value): + self._attrs[self.env.now] = value + + def run(self): + while True: + self.step(self.env.now) + yield self.env.timeout(settings.network_params["timeout"]) + + def step(self, now): + networkStatus['agent_%s'% self.id] = self.to_json() + + def to_json(self): + final = {} + for stamp, attrs in self._attrs.items(): + for a in attrs: + if a not in final: + final[a] = {} + final[a][stamp] = attrs[a] + return final diff --git a/models/BaseBehaviour/__init__.py b/models/BaseBehaviour/__init__.py new file mode 100755 index 0000000..7494c75 --- /dev/null +++ b/models/BaseBehaviour/__init__.py @@ -0,0 +1 @@ +from .BaseBehaviour import BaseBehaviour diff --git a/models/TerroristModel/TerroristModel.py b/models/TerroristModel/TerroristModel.py new file mode 100644 index 0000000..42bb3ad --- /dev/null +++ b/models/TerroristModel/TerroristModel.py @@ -0,0 +1,367 @@ +import random +import numpy as np +from ..BaseBehaviour import * +import settings +import networkx as nx + + + +POPULATION = 0 +LEADERS = 1 +HAVEN = 2 +TRAININGENV = 3 + +NON_RADICAL = 0 +NEUTRAL = 1 +RADICAL = 2 + +POPNON =0 +POPNE=1 +POPRAD=2 + +HAVNON=3 +HAVNE=4 +HAVRAD=5 + +LEADER=6 + +TRAINING = 7 + + +class TerroristModel(BaseBehaviour): + num_agents = 0 + + def __init__(self, environment=None, agent_id=0, state=()): + + super().__init__(environment=environment, agent_id=agent_id, state=state) + + self.population = settings.network_params["number_of_nodes"] * settings.environment_params['initial_population'] + self.havens = settings.network_params["number_of_nodes"] * settings.environment_params['initial_havens'] + self.training_enviroments = settings.network_params["number_of_nodes"] * settings.environment_params['initial_training_enviroments'] + + self.initial_radicalism = settings.environment_params['initial_radicalism'] + self.information_spread_intensity = settings.environment_params['information_spread_intensity'] + self.influence = settings.environment_params['influence'] + self.relative_inequality = settings.environment_params['relative_inequality'] + self.additional_influence = settings.environment_params['additional_influence'] + + if TerroristModel.num_agents < self.population: + self.state['type'] = POPULATION + TerroristModel.num_agents = TerroristModel.num_agents + 1 + random1 = random.random() + if random1 < 0.7: + self.state['id'] = NON_RADICAL + self.state['fstatus'] = POPNON + elif random1 >= 0.7 and random1 < 0.9: + self.state['id'] = NEUTRAL + self.state['fstatus'] = POPNE + elif random1 >= 0.9: + self.state['id'] = RADICAL + self.state['fstatus'] = POPRAD + + elif TerroristModel.num_agents < self.havens + self.population: + self.state['type'] = HAVEN + TerroristModel.num_agents = TerroristModel.num_agents + 1 + random2 = random.random() + random1 = random2 + self.initial_radicalism + if random1 < 1.2: + self.state['id'] = NON_RADICAL + self.state['fstatus'] = HAVNON + elif random1 >= 1.2 and random1 < 1.6: + self.state['id'] = NEUTRAL + self.state['fstatus'] = HAVNE + elif random1 >= 1.6: + self.state['id'] = RADICAL + self.state['fstatus'] = HAVRAD + + elif TerroristModel.num_agents < self.training_enviroments + self.havens + self.population: + self.state['type'] = TRAININGENV + self.state['fstatus'] = TRAINING + TerroristModel.num_agents = TerroristModel.num_agents + 1 + + def step(self, now): + if self.state['type'] == POPULATION: + self.population_and_leader_conduct() + if self.state['type'] == LEADERS: + self.population_and_leader_conduct() + if self.state['type'] == HAVEN: + self.haven_conduct() + if self.state['type'] == TRAININGENV: + self.training_enviroment_conduct() + + self.attrs['status'] = self.state['id'] + self.attrs['type'] = self.state['type'] + self.attrs['radicalism'] = self.state['rad'] + self.attrs['fstatus'] = self.state['fstatus'] + super().step(now) + + def population_and_leader_conduct(self): + if self.state['id'] == NON_RADICAL: + if self.state['rad'] == 0.000: + self.state['rad'] = self.set_radicalism() + self.non_radical_behaviour() + if self.state['id'] == NEUTRAL: + if self.state['rad'] == 0.000: + self.state['rad'] = self.set_radicalism() + while self.state['id'] == RADICAL: + self.radical_behaviour() + break + self.neutral_behaviour() + if self.state['id'] == RADICAL: + if self.state['rad'] == 0.000: + self.state['rad'] = self.set_radicalism() + self.radical_behaviour() + + def haven_conduct(self): + non_radical_neighbors = self.get_neighboring_agents(state_id=NON_RADICAL) + neutral_neighbors = self.get_neighboring_agents(state_id=NEUTRAL) + radical_neighbors = self.get_neighboring_agents(state_id=RADICAL) + + neighbors_of_non_radical = len(neutral_neighbors) + len(radical_neighbors) + neighbors_of_neutral = len(non_radical_neighbors) + len(radical_neighbors) + neighbors_of_radical = len(non_radical_neighbors) + len(neutral_neighbors) + threshold = 8 + if (len(non_radical_neighbors) > neighbors_of_non_radical) and len(non_radical_neighbors) >= threshold: + self.state['id'] = NON_RADICAL + elif (len(neutral_neighbors) > neighbors_of_neutral) and len(neutral_neighbors) >= threshold: + self.state['id'] = NEUTRAL + elif (len(radical_neighbors) > neighbors_of_radical) and len(radical_neighbors) >= threshold: + self.state['id'] = RADICAL + + if self.state['id'] == NEUTRAL: + for neighbor in non_radical_neighbors: + neighbor.state['rad'] = neighbor.state['rad'] + (self.influence + self.additional_influence) * self.information_spread_intensity + if neighbor.state['rad'] >= 0.3 and neighbor.state['rad'] <= 0.59: + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + elif neighbor.state['rad'] > 0.59: + neighbor.state['rad'] = 0.59 + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + + if self.state['id'] == RADICAL: + + for neighbor in non_radical_neighbors: + neighbor.state['rad'] = neighbor.state['rad'] + (self.influence + self.additional_influence) * self.information_spread_intensity + if neighbor.state['rad'] >= 0.3 and neighbor.state['rad'] <= 0.59: + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + elif neighbor.state['rad'] > 0.59: + neighbor.state['rad'] = 0.59 + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + + for neighbor in neutral_neighbors: + neighbor.state['rad'] = neighbor.state['rad'] + (self.influence + self.additional_influence) * self.information_spread_intensity + if neighbor.state['rad'] >= 0.6: + neighbor.state['id'] = RADICAL + if neighbor.state['type'] != HAVEN and neighbor.state['type']!=TRAININGENV: + if neighbor.state['rad'] >= 0.62: + if create_leader(neighbor): + neighbor.state['type'] = LEADERS + neighbor.state['fstatus'] = LEADER + # elif neighbor.state['type'] == LEADERS: + # neighbor.state['type'] = POPULATION + # neighbor.state['fstatus'] = POPRAD + elif neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPRAD + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVRAD + + def training_enviroment_conduct(self): + self.state['id'] = RADICAL + self.state['rad'] = 1 + neighbors = self.get_neighboring_agents() + for neighbor in neighbors: + if neighbor.state['id'] == NON_RADICAL: + neighbor.state['rad'] = neighbor.state['rad'] + (self.influence + self.additional_influence) * self.information_spread_intensity + if neighbor.state['rad'] >= 0.3 and self.state['rad'] <= 0.59: + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + elif neighbor.state['rad'] > 0.59: + neighbor.state['rad'] = 0.59 + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + + + neighbor.state['rad'] = neighbor.state['rad'] + (neighbor.influence + neighbor.additional_influence) * neighbor.information_spread_intensity + if neighbor.state['rad'] >= 0.3 and neighbor.state['rad'] <= 0.59: + neighbor.state['id'] = NEUTRAL + if neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPNE + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVNE + elif neighbor.state['rad'] >= 0.6: + neighbor.state['id'] = RADICAL + if neighbor.state['type'] != HAVEN and neighbor.state['type'] != TRAININGENV: + if neighbor.state['rad'] >= 0.62: + if create_leader(neighbor): + neighbor.state['type'] = LEADERS + neighbor.state['fstatus'] = LEADER + # elif neighbor.state['type'] == LEADERS: + # neighbor.state['type'] = POPULATION + # neighbor.state['fstatus'] = POPRAD + elif neighbor.state['type'] == POPULATION: + neighbor.state['fstatus'] = POPRAD + elif neighbor.state['type'] == HAVEN: + neighbor.state['fstatus'] = HAVRAD + + def non_radical_behaviour(self): + neighbors = self.get_neighboring_agents() + + for neighbor in neighbors: + if neighbor.state['type'] == POPULATION: + if neighbor.state['id'] == NEUTRAL or neighbor.state['id'] == RADICAL: + self.state['rad'] = self.state['rad'] + self.influence * self.information_spread_intensity + if self.state['rad'] >= 0.3 and self.state['rad'] <= 0.59: + self.state['id'] = NEUTRAL + + if self.state['type']==POPULATION: + self.state['fstatus'] = POPNE + elif self.state['type'] == HAVEN: + self.state['fstatus'] = HAVNE + elif self.state['rad'] > 0.59: + self.state['rad'] = 0.59 + self.state['id'] = NEUTRAL + if self.state['type']==POPULATION: + self.state['fstatus'] = POPNE + elif self.state['type'] == HAVEN: + self.state['fstatus'] = HAVNE + + elif neighbor.state['type'] == LEADERS: + + if neighbor.state['id'] == NEUTRAL or neighbor.state['id'] == RADICAL: + self.state['rad'] = self.state['rad'] + (self.influence + self.additional_influence) * self.information_spread_intensity + if self.state['rad'] >= 0.3 and self.state['rad'] <= 0.59: + self.state['id'] = NEUTRAL + if self.state['type']==POPULATION: + self.state['fstatus'] = POPNE + elif self.state['type'] == HAVEN: + self.state['fstatus'] = HAVNE + elif self.state['rad'] > 0.59: + self.state['rad'] = 0.59 + self.state['id'] = NEUTRAL + if self.state['type']==POPULATION: + self.state['fstatus'] = POPNE + elif self.state['type'] == HAVEN: + self.state['fstatus'] = HAVNE + + + def neutral_behaviour(self): + neighbors = self.get_neighboring_agents() + for neighbor in neighbors: + if neighbor.state['type'] == POPULATION: + if neighbor.state['id'] == RADICAL: + self.state['rad'] = self.state['rad'] + self.influence * self.information_spread_intensity + if self.state['rad'] >= 0.6: + self.state['id'] = RADICAL + if self.state['type'] != HAVEN: + if self.state['rad'] >= 0.62: + if create_leader(self): + self.state['type'] = LEADERS + + self.state['fstatus'] = LEADER + # elif self.state['type'] == LEADERS: + # self.state['type'] = POPULATION + # self.state['fstatus'] = POPRAD + elif neighbor.state['type'] == POPULATION: + self.state['fstatus'] = POPRAD + elif self.state['type'] == HAVEN: + self.state['fstatus'] = HAVRAD + + + elif neighbor.state['type'] == LEADERS: + if neighbor.state['id'] == RADICAL: + self.state['rad'] = self.state['rad'] + (self.influence + self.additional_influence) * self.information_spread_intensity + if self.state['rad'] >= 0.6: + self.state['id'] = RADICAL + if self.state['type'] != HAVEN: + if self.state['rad'] >= 0.62: + if create_leader(self): + self.state['type'] = LEADERS + self.state['fstatus'] = LEADER + # elif self.state['type'] == LEADERS: + # self.state['type'] = POPULATION + # self.state['fstatus'] = POPRAD + elif neighbor.state['type'] == POPULATION: + self.state['fstatus'] = POPRAD + elif self.state['type'] == HAVEN: + self.state['fstatus'] = HAVRAD + + + + + + def radical_behaviour(self): + neighbors = self.get_neighboring_agents(state_id=RADICAL) + + for neighbor in neighbors: + if self.state['rad']< neighbor.state['rad'] and self.state['type']== LEADERS and neighbor.state['type']==LEADERS: + self.state['type'] = POPULATION + self.state['fstatus'] = POPRAD + + + def set_radicalism(self): + if self.state['id'] == NON_RADICAL: + radicalism = random.uniform(0.0, 0.29) * self.relative_inequality + return radicalism + elif self.state['id'] == NEUTRAL: + radicalism = 0.3 + random.uniform(0.3, 0.59) * self.relative_inequality + if radicalism >= 0.6: + self.state['id'] = RADICAL + return radicalism + elif self.state['id'] == RADICAL: + radicalism = 0.6 + random.uniform(0.6, 1.0) * self.relative_inequality + return radicalism + +def get_partition(agent): + return settings.partition_param[agent.id] + +def get_centrality(agent): + return settings.centrality_param[agent.id] +def get_centrality_given_id(id): + return settings.centrality_param[id] + +def get_leader(partition): + if not bool(settings.leaders) or partition not in settings.leaders.keys(): + return None + return settings.leaders[partition] + +def set_leader(partition, agent): + settings.leaders[partition] = agent.id + +def create_leader(agent): + my_partition = get_partition(agent) + old_leader = get_leader(my_partition) + + if old_leader == None: + set_leader(my_partition, agent) + return True + else: + my_centrality = get_centrality(agent) + old_leader_centrality = get_centrality_given_id(old_leader) + if my_centrality > old_leader_centrality: + set_leader(my_partition, agent) + return True + return False + + + diff --git a/models/TerroristModel/__init__.py b/models/TerroristModel/__init__.py new file mode 100644 index 0000000..8a1d874 --- /dev/null +++ b/models/TerroristModel/__init__.py @@ -0,0 +1 @@ +from .TerroristModel import TerroristModel \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py new file mode 100755 index 0000000..1e45794 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,3 @@ +from .models import * +from .BaseBehaviour import * +from .TerroristModel import * diff --git a/models/models.py b/models/models.py new file mode 100755 index 0000000..3ff0403 --- /dev/null +++ b/models/models.py @@ -0,0 +1,7 @@ +import settings + +networkStatus = {} # Dict that will contain the status of every agent in the network + +# Initialize agent states. Let's assume everyone is normal and all types are population. +init_states = [{'id': 0, 'type': 0, 'rad': 0, 'fstatus':0, } for _ in range(settings.network_params["number_of_nodes"])] + diff --git a/models_org.py b/models_org.py deleted file mode 100644 index fb776cc..0000000 --- a/models_org.py +++ /dev/null @@ -1,596 +0,0 @@ -from nxsim import BaseNetworkAgent -import numpy as np -import random -import settings - -settings.init() - -############################## -# Variables initialization # -############################## -def init(): - global networkStatus - networkStatus = {} # Dict that will contain the status of every agent in the network - -sentimentCorrelationNodeArray=[] -for x in range(0, settings.number_of_nodes): - sentimentCorrelationNodeArray.append({'id':x}) -# Initialize agent states. Let's assume everyone is normal. -init_states = [{'id': 0, } for _ in range(settings.number_of_nodes)] # add keys as as necessary, but "id" must always refer to that state category - - -#################### -# Available models # -#################### - -class BaseBehaviour(BaseNetworkAgent): - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self._attrs = {} - - @property - def attrs(self): - now = self.env.now - if now not in self._attrs: - self._attrs[now] = {} - return self._attrs[now] - - @attrs.setter - def attrs(self, value): - self._attrs[self.env.now] = value - - def run(self): - while True: - self.step(self.env.now) - yield self.env.timeout(settings.timeout) - - def step(self, now): - networkStatus['agent_%s'% self.id] = self.to_json() - - def to_json(self): - final = {} - for stamp, attrs in self._attrs.items(): - for a in attrs: - if a not in final: - final[a] = {} - final[a][stamp] = attrs[a] - return final - -class ControlModelM2(BaseBehaviour): - #Init infected - init_states[random.randint(0,settings.number_of_nodes-1)] = {'id':1} - init_states[random.randint(0,settings.number_of_nodes-1)] = {'id':1} - - # Init beacons - init_states[random.randint(0, settings.number_of_nodes-1)] = {'id': 4} - init_states[random.randint(0, settings.number_of_nodes-1)] = {'id': 4} - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - - self.prob_neutral_making_denier = np.random.normal(settings.prob_neutral_making_denier, settings.standard_variance) - - self.prob_infect = np.random.normal(settings.prob_infect, settings.standard_variance) - - self.prob_cured_healing_infected = np.random.normal(settings.prob_cured_healing_infected, settings.standard_variance) - self.prob_cured_vaccinate_neutral = np.random.normal(settings.prob_cured_vaccinate_neutral, settings.standard_variance) - - self.prob_vaccinated_healing_infected = np.random.normal(settings.prob_vaccinated_healing_infected, settings.standard_variance) - self.prob_vaccinated_vaccinate_neutral = np.random.normal(settings.prob_vaccinated_vaccinate_neutral, settings.standard_variance) - self.prob_generate_anti_rumor = np.random.normal(settings.prob_generate_anti_rumor, settings.standard_variance) - - def step(self, now): - - if self.state['id'] == 0: #Neutral - self.neutral_behaviour() - elif self.state['id'] == 1: #Infected - self.infected_behaviour() - elif self.state['id'] == 2: #Cured - self.cured_behaviour() - elif self.state['id'] == 3: #Vaccinated - self.vaccinated_behaviour() - elif self.state['id'] == 4: #Beacon-off - self.beacon_off_behaviour() - elif self.state['id'] == 5: #Beacon-on - self.beacon_on_behaviour() - - self.attrs['status'] = self.state['id'] - super().step(now) - - - def neutral_behaviour(self): - - # Infected - infected_neighbors = self.get_neighboring_agents(state_id=1) - if len(infected_neighbors)>0: - if random.random() < self.prob_neutral_making_denier: - self.state['id'] = 3 # Vaccinated making denier - - def infected_behaviour(self): - - # Neutral - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_infect: - neighbor.state['id'] = 1 # Infected - - def cured_behaviour(self): - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - - def vaccinated_behaviour(self): - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Generate anti-rumor - infected_neighbors_2 = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors_2: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - - def beacon_off_behaviour(self): - infected_neighbors = self.get_neighboring_agents(state_id=1) - if len(infected_neighbors) > 0: - self.state['id'] == 5 #Beacon on - - def beacon_on_behaviour(self): - - # Cure (M2 feature added) - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - neutral_neighbors_infected = neighbor.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors_infected: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 3 # Vaccinated - infected_neighbors_infected = neighbor.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors_infected: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - -class SpreadModelM2(BaseBehaviour): - init_states[random.randint(0,settings.number_of_nodes)] = {'id':1} - init_states[random.randint(0,settings.number_of_nodes)] = {'id':1} - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - - self.prob_neutral_making_denier = np.random.normal(settings.prob_neutral_making_denier, settings.standard_variance) - - self.prob_infect = np.random.normal(settings.prob_infect, settings.standard_variance) - - self.prob_cured_healing_infected = np.random.normal(settings.prob_cured_healing_infected, settings.standard_variance) - self.prob_cured_vaccinate_neutral = np.random.normal(settings.prob_cured_vaccinate_neutral, settings.standard_variance) - - self.prob_vaccinated_healing_infected = np.random.normal(settings.prob_vaccinated_healing_infected, settings.standard_variance) - self.prob_vaccinated_vaccinate_neutral = np.random.normal(settings.prob_vaccinated_vaccinate_neutral, settings.standard_variance) - self.prob_generate_anti_rumor = np.random.normal(settings.prob_generate_anti_rumor, settings.standard_variance) - - def step(self, now): - - if self.state['id'] == 0: #Neutral - self.neutral_behaviour() - elif self.state['id'] == 1: #Infected - self.infected_behaviour() - elif self.state['id'] == 2: #Cured - self.cured_behaviour() - elif self.state['id'] == 3: #Vaccinated - self.vaccinated_behaviour() - - self.attrs['status'] = self.state['id'] - super().step(now) - - - def neutral_behaviour(self): - - # Infected - infected_neighbors = self.get_neighboring_agents(state_id=1) - if len(infected_neighbors)>0: - if random.random() < self.prob_neutral_making_denier: - self.state['id'] = 3 # Vaccinated making denier - - def infected_behaviour(self): - - # Neutral - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_infect: - neighbor.state['id'] = 1 # Infected - - def cured_behaviour(self): - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - - def vaccinated_behaviour(self): - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Generate anti-rumor - infected_neighbors_2 = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors_2: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - - -class SISaModel(BaseBehaviour): - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - - self.neutral_discontent_spon_prob = np.random.normal(settings.neutral_discontent_spon_prob, settings.standard_variance) - self.neutral_discontent_infected_prob = np.random.normal(settings.neutral_discontent_infected_prob,settings.standard_variance) - self.neutral_content_spon_prob = np.random.normal(settings.neutral_content_spon_prob,settings.standard_variance) - self.neutral_content_infected_prob = np.random.normal(settings.neutral_content_infected_prob,settings.standard_variance) - - self.discontent_neutral = np.random.normal(settings.discontent_neutral,settings.standard_variance) - self.discontent_content = np.random.normal(settings.discontent_content,settings.variance_d_c) - - self.content_discontent = np.random.normal(settings.content_discontent,settings.variance_c_d) - self.content_neutral = np.random.normal(settings.content_neutral,settings.standard_variance) - - def step(self, now): - - if self.state['id'] == 0: - self.neutral_behaviour() - if self.state['id'] == 1: - self.discontent_behaviour() - if self.state['id'] == 2: - self.content_behaviour() - - self.attrs['status'] = self.state['id'] - super().step(now) - - - def neutral_behaviour(self): - - #Spontaneus effects - if random.random() < self.neutral_discontent_spon_prob: - self.state['id'] = 1 - if random.random() < self.neutral_content_spon_prob: - self.state['id'] = 2 - - #Infected - discontent_neighbors = self.get_neighboring_agents(state_id=1) - if random.random() < len(discontent_neighbors)*self.neutral_discontent_infected_prob: - self.state['id'] = 1 - content_neighbors = self.get_neighboring_agents(state_id=2) - if random.random() < len(content_neighbors)*self.neutral_content_infected_prob: - self.state['id'] = 2 - - def discontent_behaviour(self): - - #Healing - if random.random() < self.discontent_neutral: - self.state['id'] = 0 - - #Superinfected - content_neighbors = self.get_neighboring_agents(state_id=2) - if random.random() < len(content_neighbors)*self.discontent_content: - self.state['id'] = 2 - - def content_behaviour(self): - - #Healing - if random.random() < self.content_neutral: - self.state['id'] = 0 - - #Superinfected - discontent_neighbors = self.get_neighboring_agents(state_id=1) - if random.random() < len(discontent_neighbors)*self.content_discontent: - self.state['id'] = 1 - - -class BigMarketModel(BaseBehaviour): - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self.enterprises = settings.enterprises - self.type = "" - self.number_of_enterprises = len(settings.enterprises) - - if self.id < self.number_of_enterprises: #Enterprises - self.state['id']=self.id - self.type="Enterprise" - self.tweet_probability = settings.tweet_probability_enterprises[self.id] - else: #normal users - self.state['id']=self.number_of_enterprises - self.type="User" - self.tweet_probability = settings.tweet_probability_users - self.tweet_relevant_probability = settings.tweet_relevant_probability - self.tweet_probability_about = settings.tweet_probability_about #List - self.sentiment_about = settings.sentiment_about #List - - def step(self, now): - - if(self.id < self.number_of_enterprises): # Ennterprise - self.enterpriseBehaviour() - else: # Usuario - self.userBehaviour() - for i in range(self.number_of_enterprises): # So that it never is set to 0 if there are not changes (logs) - self.attrs['sentiment_enterprise_%s'% self.enterprises[i]] = self.sentiment_about[i] - - super().step(now) - - def enterpriseBehaviour(self): - - if random.random()< self.tweet_probability: #Tweets - aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) #Nodes neighbour users - for x in aware_neighbors: - if random.uniform(0,10) < 5: - x.sentiment_about[self.id] += 0.1 #Increments for enterprise - else: - x.sentiment_about[self.id] -= 0.1 #Decrements for enterprise - - # Establecemos limites - if x.sentiment_about[self.id] > 1: - x.sentiment_about[self.id] = 1 - if x.sentiment_about[self.id]< -1: - x.sentiment_about[self.id] = -1 - - x.attrs['sentiment_enterprise_%s'% self.enterprises[self.id]] = x.sentiment_about[self.id] - - - def userBehaviour(self): - - if random.random() < self.tweet_probability: #Tweets - if random.random() < self.tweet_relevant_probability: #Tweets something relevant - #Tweet probability per enterprise - for i in range(self.number_of_enterprises): - random_num = random.random() - if random_num < self.tweet_probability_about[i]: - #The condition is fulfilled, sentiments are evaluated towards that enterprise - if self.sentiment_about[i] < 0: - #NEGATIVO - self.userTweets("negative",i) - elif self.sentiment_about[i] == 0: - #NEUTRO - pass - else: - #POSITIVO - self.userTweets("positive",i) - - def userTweets(self,sentiment,enterprise): - aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) #Nodes neighbours users - for x in aware_neighbors: - if sentiment == "positive": - x.sentiment_about[enterprise] +=0.003 - elif sentiment == "negative": - x.sentiment_about[enterprise] -=0.003 - else: - pass - - # Establecemos limites - if x.sentiment_about[enterprise] > 1: - x.sentiment_about[enterprise] = 1 - if x.sentiment_about[enterprise] < -1: - x.sentiment_about[enterprise] = -1 - - x.attrs['sentiment_enterprise_%s'% self.enterprises[enterprise]] = x.sentiment_about[enterprise] - -class SentimentCorrelationModel(BaseBehaviour): - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self.outside_effects_prob = settings.outside_effects_prob - self.anger_prob = settings.anger_prob - self.joy_prob = settings.joy_prob - self.sadness_prob = settings.sadness_prob - self.disgust_prob = settings.disgust_prob - self.time_awareness=[] - for i in range(4): #In this model we have 4 sentiments - self.time_awareness.append(0) #0-> Anger, 1-> joy, 2->sadness, 3 -> disgust - sentimentCorrelationNodeArray[self.id][self.env.now]=0 - - - def step(self, now): - self.behaviour() - super().step(now) - - def behaviour(self): - - angry_neighbors_1_time_step=[] - joyful_neighbors_1_time_step=[] - sad_neighbors_1_time_step=[] - disgusted_neighbors_1_time_step=[] - - - angry_neighbors = self.get_neighboring_agents(state_id=1) - for x in angry_neighbors: - if x.time_awareness[0] > (self.env.now-500): - angry_neighbors_1_time_step.append(x) - num_neighbors_angry = len(angry_neighbors_1_time_step) - - - joyful_neighbors = self.get_neighboring_agents(state_id=2) - for x in joyful_neighbors: - if x.time_awareness[1] > (self.env.now-500): - joyful_neighbors_1_time_step.append(x) - num_neighbors_joyful = len(joyful_neighbors_1_time_step) - - - sad_neighbors = self.get_neighboring_agents(state_id=3) - for x in sad_neighbors: - if x.time_awareness[2] > (self.env.now-500): - sad_neighbors_1_time_step.append(x) - num_neighbors_sad = len(sad_neighbors_1_time_step) - - - disgusted_neighbors = self.get_neighboring_agents(state_id=4) - for x in disgusted_neighbors: - if x.time_awareness[3] > (self.env.now-500): - disgusted_neighbors_1_time_step.append(x) - num_neighbors_disgusted = len(disgusted_neighbors_1_time_step) - - - anger_prob= settings.anger_prob+(len(angry_neighbors_1_time_step)*settings.anger_prob) - joy_prob= settings.joy_prob+(len(joyful_neighbors_1_time_step)*settings.joy_prob) - sadness_prob = settings.sadness_prob+(len(sad_neighbors_1_time_step)*settings.sadness_prob) - disgust_prob = settings.disgust_prob+(len(disgusted_neighbors_1_time_step)*settings.disgust_prob) - outside_effects_prob= settings.outside_effects_prob - - - num = random.random() - - - if(numanger_prob): - - self.state['id'] = 2 - sentimentCorrelationNodeArray[self.id][self.env.now]=2 - self.time_awareness[self.state['id']-1] = self.env.now - elif (numjoy_prob+anger_prob): - - - self.state['id'] = 3 - sentimentCorrelationNodeArray[self.id][self.env.now]=3 - self.time_awareness[self.state['id']-1] = self.env.now - elif (numsadness_prob+anger_prob+joy_prob): - - - self.state['id'] = 4 - sentimentCorrelationNodeArray[self.id][self.env.now]=4 - self.time_awareness[self.state['id']-1] = self.env.now - - self.attrs['sentiment'] = self.state['id'] - - -class BassModel(BaseBehaviour): - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self.innovation_prob = settings.innovation_prob - self.imitation_prob = settings.imitation_prob - sentimentCorrelationNodeArray[self.id][self.env.now]=0 - - def step(self, now): - self.behaviour() - super().step(now) - - def behaviour(self): - #Outside effects - if random.random() < settings.innovation_prob: - if self.state['id'] == 0: - self.state['id'] = 1 - sentimentCorrelationNodeArray[self.id][self.env.now]=1 - else: - pass - - self.attrs['status'] = self.state['id'] - return - - #Imitation effects - if self.state['id'] == 0: - aware_neighbors = self.get_neighboring_agents(state_id=1) - num_neighbors_aware = len(aware_neighbors) - if random.random() < (settings.imitation_prob*num_neighbors_aware): - self.state['id'] = 1 - sentimentCorrelationNodeArray[self.id][self.env.now]=1 - - else: - pass - self.attrs['status'] = self.state['id'] - - -class IndependentCascadeModel(BaseBehaviour): - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self.innovation_prob = settings.innovation_prob - self.imitation_prob = settings.imitation_prob - self.time_awareness = 0 - sentimentCorrelationNodeArray[self.id][self.env.now]=0 - - def step(self,now): - self.behaviour() - super().step(now) - - def behaviour(self): - aware_neighbors_1_time_step=[] - #Outside effects - if random.random() < settings.innovation_prob: - if self.state['id'] == 0: - self.state['id'] = 1 - sentimentCorrelationNodeArray[self.id][self.env.now]=1 - self.time_awareness = self.env.now #To know when they have been infected - else: - pass - - self.attrs['status'] = self.state['id'] - return - - #Imitation effects - if self.state['id'] == 0: - aware_neighbors = self.get_neighboring_agents(state_id=1) - for x in aware_neighbors: - if x.time_awareness == (self.env.now-1): - aware_neighbors_1_time_step.append(x) - num_neighbors_aware = len(aware_neighbors_1_time_step) - if random.random() < (settings.imitation_prob*num_neighbors_aware): - self.state['id'] = 1 - sentimentCorrelationNodeArray[self.id][self.env.now]=1 - else: - pass - - self.attrs['status'] = self.state['id'] - return diff --git a/notebooks/soil_tutorial.ipynb b/notebooks/soil_tutorial.ipynb deleted file mode 100644 index d19424e..0000000 --- a/notebooks/soil_tutorial.ipynb +++ /dev/null @@ -1,1912 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T16:44:14.120953Z", - "start_time": "2017-07-02T18:44:14.117152+02:00" - } - }, - "source": [ - "# Introduction" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "cell_style": "center", - "collapsed": true - }, - "source": [ - "This notebook is an introduction to the soil agent-based social network simulation framework.\n", - "In particular, we will focus on a specific use case: studying the propagation of news in a social network.\n", - "\n", - "The steps we will follow are:\n", - "\n", - "* Modelling the behavior of agents\n", - "* Running the simulation using different configurations\n", - "* Analysing the results of each simulation" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T13:38:48.052876Z", - "start_time": "2017-07-03T15:38:48.044762+02:00" - } - }, - "source": [ - "But before that, let's import the soil module and networkx." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:51.679937Z", - "start_time": "2017-07-03T16:42:51.185463+02:00" - }, - "collapsed": true - }, - "outputs": [], - "source": [ - "import soil\n", - "import networkx as nx" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:51.690373Z", - "start_time": "2017-07-03T16:42:51.682644+02:00" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Populating the interactive namespace from numpy and matplotlib\n" - ] - } - ], - "source": [ - "%pylab inline\n", - "# To display plots in the notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T13:41:19.788717Z", - "start_time": "2017-07-03T15:41:19.785448+02:00" - } - }, - "source": [ - "# Basic concepts" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are three main elements in a soil simulation:\n", - " \n", - "* The network topology. A simulation may use an existing NetworkX topology, or generate one on the fly\n", - "* Agents. There are two types: 1) network agents, which are linked to a node in the topology, and 2) environment agents, which are freely assigned to the environment.\n", - "* The environment. It assigns agents to nodes in the network, and stores the environment parameters (shared state for all agents).\n", - "\n", - "Soil is based on ``simpy``, which is an event-based network simulation library.\n", - "Soil provides several abstractions over events to make developing agents easier.\n", - "This means you can use events (timeouts, delays) in soil, but for the most part we will assume your models will be step-based.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T15:55:12.933978Z", - "start_time": "2017-07-02T17:55:12.930860+02:00" - } - }, - "source": [ - "# Modeling behaviour" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T13:49:31.269687Z", - "start_time": "2017-07-03T15:49:31.257850+02:00" - } - }, - "source": [ - "Our first step will be to model how every person in the social network reacts when it comes to news.\n", - "We will follow a very simple model (a finite state machine).\n", - "\n", - "There are two types of people, those who have heard about a newsworthy event (infected) or those who have not (neutral).\n", - "A neutral person may heard about the news either on the TV (with probability **prob_tv_spread**) or through their friends.\n", - "Once a person has heard the news, they will spread it to their friends (with a probability **prob_neighbor_spread**).\n", - "Some users do not have a TV, so they only rely on their friends.\n", - "\n", - "The spreading probabilities will change over time due to different factors.\n", - "We will represent this variance using an environment agent." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Network Agents" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:03:07.171127Z", - "start_time": "2017-07-03T16:03:07.165779+02:00" - } - }, - "source": [ - "A basic network agent in Soil should inherit from ``soil.agents.BaseAgent``, and define its behaviour in every step of the simulation by implementing a ``run(self)`` method.\n", - "The most important attributes of the agent are:\n", - "\n", - "* ``agent.state``, a dictionary with the state of the agent. ``agent.state['id']`` reflects the state id of the agent. That state id can be used to look for other networks in that specific state. The state can be access via the agent as well. For instance:\n", - "```py\n", - "a = soil.agents.BaseAgent(env=env)\n", - "a['hours_of_sleep'] = 10\n", - "print(a['hours_of_sleep'])\n", - "```\n", - " The state of the agent is stored in every step of the simulation:\n", - " ```py\n", - " print(a['hours_of_sleep', 10]) # hours of sleep before step #10\n", - " print(a[None, 0]) # whole state of the agent before step #0\n", - " ```\n", - "\n", - "* ``agent.env``, a reference to the environment. Most commonly used to get access to the environment parameters and the topology:\n", - " ```py\n", - " a.env.G.nodes() # Get all nodes ids in the topology\n", - " a.env['minimum_hours_of_sleep']\n", - "\n", - " ```\n", - "\n", - "Since our model is a finite state machine, we will be basing it on ``soil.agents.FSM``.\n", - "\n", - "With ``soil.agents.FSM``, we do not need to specify a ``step`` method.\n", - "Instead, we describe every step as a function.\n", - "To change to another state, a function may return the new state.\n", - "If no state is returned, the state remains unchanged.[\n", - "It will consist of two states, ``neutral`` (default) and ``infected``.\n", - "\n", - "Here's the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:51.715535Z", - "start_time": "2017-07-03T16:42:51.692301+02:00" - }, - "collapsed": true - }, - "outputs": [], - "source": [ - "import random\n", - "\n", - "class NewsSpread(soil.agents.FSM):\n", - " @soil.agents.default_state\n", - " @soil.agents.state\n", - " def neutral(self):\n", - " r = random.random()\n", - " if self['has_tv'] and r < self.env['prob_tv_spread']:\n", - " return self.infected\n", - " return\n", - " \n", - " @soil.agents.state\n", - " def infected(self):\n", - " prob_infect = self.env['prob_neighbor_spread']\n", - " for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):\n", - " r = random.random()\n", - " if r < prob_infect:\n", - " neighbor.state['id'] = self.infected.id\n", - " return\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T12:22:53.931963Z", - "start_time": "2017-07-02T14:22:53.928340+02:00" - } - }, - "source": [ - "## Environment agents" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Environment agents allow us to control the state of the environment.\n", - "In this case, we will use an environment agent to simulate a very viral event.\n", - "\n", - "When the event happens, the agent will modify the probability of spreading the rumor." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:51.727938Z", - "start_time": "2017-07-03T16:42:51.717828+02:00" - }, - "collapsed": true - }, - "outputs": [], - "source": [ - "NEIGHBOR_FACTOR = 0.9\n", - "TV_FACTOR = 0.5\n", - "class NewsEnvironmentAgent(soil.agents.BaseAgent):\n", - " def step(self):\n", - " if self.now == self['event_time']:\n", - " self.env['prob_tv_spread'] = 1\n", - " self.env['prob_neighbor_spread'] = 1\n", - " elif self.now > self['event_time']:\n", - " self.env['prob_tv_spread'] = self.env['prob_tv_spread'] * TV_FACTOR\n", - " self.env['prob_neighbor_spread'] = self.env['prob_neighbor_spread'] * NEIGHBOR_FACTOR" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T11:23:18.052235Z", - "start_time": "2017-07-02T13:23:18.047452+02:00" - } - }, - "source": [ - "## Testing the agents" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T16:14:54.572431Z", - "start_time": "2017-07-02T18:14:54.564095+02:00" - } - }, - "source": [ - "Feel free to skip this section if this is your first time with soil." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing agents is not easy, and this is not a thorough testing process for agents.\n", - "Rather, this section is aimed to show you how to access internal pats of soil so you can test your agents." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "cell_style": "split" - }, - "source": [ - "First of all, let's check if our network agent has the states we would expect:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:51.816465Z", - "start_time": "2017-07-03T16:42:51.811222+02:00" - }, - "cell_style": "split" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'infected': ,\n", - " 'neutral': }" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "NewsSpread.states" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "cell_style": "split" - }, - "source": [ - "Now, let's run a simulation on a simple network. It is comprised of three nodes:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:52.106636Z", - "start_time": "2017-07-03T16:42:51.904738+02:00" - }, - "cell_style": "split", - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n/X8ieN7dQkZLXwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "G = nx.Graph()\n", - "G.add_edge(0, 1)\n", - "G.add_edge(0, 2)\n", - "G.add_edge(2, 3)\n", - "G.add_node(4)\n", - "pos = nx.spring_layout(G)\n", - "nx.draw_networkx(G, pos, node_color='red')\n", - "nx.draw_networkx(G, pos, nodelist=[0], node_color='blue')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T11:53:30.997756Z", - "start_time": "2017-07-03T13:53:30.989609+02:00" - }, - "cell_style": "split" - }, - "source": [ - "Let's run a simple simulation that assigns a NewsSpread agent to all the nodes in that network.\n", - "Notice how node 0 is the only one with a TV." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:52.136477Z", - "start_time": "2017-07-03T16:42:52.108729+02:00" - }, - "cell_style": "split" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.014928102493286133 seconds\n", - "Finished simulation in 0.015764951705932617 seconds\n" - ] - } - ], - "source": [ - "env_params = {'prob_tv_spread': 0,\n", - " 'prob_neighbor_spread': 0}\n", - "\n", - "MAX_TIME = 100\n", - "EVENT_TIME = 10\n", - "\n", - "sim = soil.simulation.SoilSimulation(topology=G,\n", - " num_trials=1,\n", - " max_time=MAX_TIME,\n", - " environment_agents=[{'agent_type': NewsEnvironmentAgent,\n", - " 'state': {\n", - " 'event_time': EVENT_TIME\n", - " }}],\n", - " network_agents=[{'agent_type': NewsSpread,\n", - " 'weight': 1}],\n", - " states={0: {'has_tv': True}},\n", - " default_state={'has_tv': False},\n", - " environment_params=env_params)\n", - "env = sim.run_simulation()[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "cell_style": "split" - }, - "source": [ - "Now we can access the results of the simulation and compare them to our expected results" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:52.160856Z", - "start_time": "2017-07-03T16:42:52.138976+02:00" - }, - "cell_style": "split", - "collapsed": true, - "scrolled": false - }, - "outputs": [], - "source": [ - "agents = list(env.network_agents)\n", - "\n", - "# Until the event, all agents are neutral\n", - "for t in range(10):\n", - " for a in agents:\n", - " assert a['id', t] == a.neutral.id\n", - "\n", - "# After the event, the node with a TV is infected, the rest are not\n", - "assert agents[0]['id', 11] == NewsSpread.infected.id\n", - "\n", - "for a in agents[1:4]:\n", - " assert a['id', 11] == NewsSpread.neutral.id\n", - "\n", - "# At the end, the agents connected to the infected one will probably be infected, too.\n", - "assert agents[1]['id', MAX_TIME] == NewsSpread.infected.id\n", - "assert agents[2]['id', MAX_TIME] == NewsSpread.infected.id\n", - "\n", - "# But the node with no friends should not be affected\n", - "assert agents[4]['id', MAX_TIME] == NewsSpread.neutral.id\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T16:41:09.110652Z", - "start_time": "2017-07-02T18:41:09.106966+02:00" - }, - "cell_style": "split" - }, - "source": [ - "Lastly, let's see if the probabilities have decreased as expected:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:52.193918Z", - "start_time": "2017-07-03T16:42:52.163476+02:00" - }, - "cell_style": "split", - "collapsed": true - }, - "outputs": [], - "source": [ - "assert abs(env.environment_params['prob_neighbor_spread'] - (NEIGHBOR_FACTOR**(MAX_TIME-1-10))) < 10e-4\n", - "assert abs(env.environment_params['prob_tv_spread'] - (TV_FACTOR**(MAX_TIME-1-10))) < 10e-6" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Running the simulation" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T11:20:28.566944Z", - "start_time": "2017-07-03T13:20:28.561052+02:00" - }, - "cell_style": "split" - }, - "source": [ - "To run a simulation, we need a configuration.\n", - "Soil can load configurations from python dictionaries as well as JSON and YAML files.\n", - "For this demo, we will use a python dictionary:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:52.219072Z", - "start_time": "2017-07-03T16:42:52.196203+02:00" - }, - "cell_style": "split", - "collapsed": true - }, - "outputs": [], - "source": [ - "config = {\n", - " 'name': 'ExampleSimulation',\n", - " 'max_time': 20,\n", - " 'interval': 1,\n", - " 'num_trials': 1,\n", - " 'network_params': {\n", - " 'generator': 'complete_graph',\n", - " 'n': 500,\n", - " },\n", - " 'network_agents': [\n", - " {\n", - " 'agent_type': NewsSpread,\n", - " 'weight': 1,\n", - " 'state': {\n", - " 'has_tv': False\n", - " }\n", - " },\n", - " {\n", - " 'agent_type': NewsSpread,\n", - " 'weight': 2,\n", - " 'state': {\n", - " 'has_tv': True\n", - " }\n", - " }\n", - " ],\n", - " 'states': [ {'has_tv': True} ],\n", - " 'environment_params':{\n", - " 'prob_tv_spread': 0.01,\n", - " 'prob_neighbor_spread': 0.5\n", - " }\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T11:57:34.219618Z", - "start_time": "2017-07-03T13:57:34.213817+02:00" - }, - "cell_style": "split" - }, - "source": [ - "Let's run our simulation:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:42:55.366288Z", - "start_time": "2017-07-03T16:42:52.295584+02:00" - }, - "cell_style": "split" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using config(s): ExampleSimulation\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 1.4140360355377197 seconds\n", - "Finished simulation in 2.4056642055511475 seconds\n" - ] - } - ], - "source": [ - "soil.simulation.run_from_config(config, dump=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T12:03:32.183588Z", - "start_time": "2017-07-03T14:03:32.167797+02:00" - }, - "cell_style": "split", - "collapsed": true - }, - "source": [ - "In real life, you probably want to run several simulations, varying some of the parameters so that you can compare and answer your research questions.\n", - "\n", - "For instance:\n", - " \n", - "* Does the outcome depend on the structure of our network? We will use different generation algorithms to compare them (Barabasi-Albert and Erdos-Renyi)\n", - "* How does neighbor spreading probability affect my simulation? We will try probability values in the range of [0, 0.4], in intervals of 0.1." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:15.488799Z", - "start_time": "2017-07-03T16:42:55.368021+02:00" - }, - "cell_style": "split", - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using config(s): Spread_erdos_renyi_graph_prob_0.0\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.2691483497619629 seconds\n", - "Finished simulation in 0.3650345802307129 seconds\n", - "Using config(s): Spread_erdos_renyi_graph_prob_0.1\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.34261059761047363 seconds\n", - "Finished simulation in 0.44017767906188965 seconds\n", - "Using config(s): Spread_erdos_renyi_graph_prob_0.2\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.34417223930358887 seconds\n", - "Finished simulation in 0.4550771713256836 seconds\n", - "Using config(s): Spread_erdos_renyi_graph_prob_0.3\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.3237779140472412 seconds\n", - "Finished simulation in 0.42307496070861816 seconds\n", - "Using config(s): Spread_erdos_renyi_graph_prob_0.4\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.3507683277130127 seconds\n", - "Finished simulation in 0.45061564445495605 seconds\n", - "Using config(s): Spread_barabasi_albert_graph_prob_0.0\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.19115304946899414 seconds\n", - "Finished simulation in 0.20927715301513672 seconds\n", - "Using config(s): Spread_barabasi_albert_graph_prob_0.1\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.22086191177368164 seconds\n", - "Finished simulation in 0.2390913963317871 seconds\n", - "Using config(s): Spread_barabasi_albert_graph_prob_0.2\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.21225976943969727 seconds\n", - "Finished simulation in 0.23252630233764648 seconds\n", - "Using config(s): Spread_barabasi_albert_graph_prob_0.3\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.2853121757507324 seconds\n", - "Finished simulation in 0.30568504333496094 seconds\n", - "Using config(s): Spread_barabasi_albert_graph_prob_0.4\n", - "Trial: 0\n", - "\tRunning\n", - "Finished trial in 0.21434736251831055 seconds\n", - "Finished simulation in 0.23370599746704102 seconds\n" - ] - } - ], - "source": [ - "network_1 = {\n", - " 'generator': 'erdos_renyi_graph',\n", - " 'n': 500,\n", - " 'p': 0.1\n", - "}\n", - "network_2 = {\n", - " 'generator': 'barabasi_albert_graph',\n", - " 'n': 500,\n", - " 'm': 2\n", - "}\n", - "\n", - "\n", - "for net in [network_1, network_2]:\n", - " for i in range(5):\n", - " prob = i / 10\n", - " config['environment_params']['prob_neighbor_spread'] = prob\n", - " config['network_params'] = net\n", - " config['name'] = 'Spread_{}_prob_{}'.format(net['generator'], prob)\n", - " s = soil.simulation.run_from_config(config)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T11:05:18.043194Z", - "start_time": "2017-07-03T13:05:18.034699+02:00" - }, - "cell_style": "split" - }, - "source": [ - "The results are conveniently stored in pickle (simulation), csv (history of agent and environment state) and gexf format." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:15.721720Z", - "start_time": "2017-07-03T16:43:15.490854+02:00" - }, - "cell_style": "split", - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[01;34msoil_output\u001b[00m\n", - "├── \u001b[01;34mSim_prob_0\u001b[00m\n", - "│   ├── Sim_prob_0.dumped.yml\n", - "│   ├── Sim_prob_0.simulation.pickle\n", - "│   ├── Sim_prob_0_trial_0.environment.csv\n", - "│   └── Sim_prob_0_trial_0.gexf\n", - "├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.0\u001b[00m\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.0.dumped.yml\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.0.simulation.pickle\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.0_trial_0.environment.csv\n", - "│   └── Spread_barabasi_albert_graph_prob_0.0_trial_0.gexf\n", - "├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.1\u001b[00m\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.1.dumped.yml\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.1.simulation.pickle\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.1_trial_0.environment.csv\n", - "│   └── Spread_barabasi_albert_graph_prob_0.1_trial_0.gexf\n", - "├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.2\u001b[00m\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.2.dumped.yml\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.2.simulation.pickle\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.2_trial_0.environment.csv\n", - "│   └── Spread_barabasi_albert_graph_prob_0.2_trial_0.gexf\n", - "├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.3\u001b[00m\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.3.dumped.yml\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.3.simulation.pickle\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.3_trial_0.environment.csv\n", - "│   └── Spread_barabasi_albert_graph_prob_0.3_trial_0.gexf\n", - "├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.4\u001b[00m\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.4.dumped.yml\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.4.simulation.pickle\n", - "│   ├── Spread_barabasi_albert_graph_prob_0.4_trial_0.environment.csv\n", - "│   └── Spread_barabasi_albert_graph_prob_0.4_trial_0.gexf\n", - "├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.0\u001b[00m\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.0.dumped.yml\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.0.simulation.pickle\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.0_trial_0.environment.csv\n", - "│   └── Spread_erdos_renyi_graph_prob_0.0_trial_0.gexf\n", - "├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.1\u001b[00m\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.1.dumped.yml\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.1.simulation.pickle\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.1_trial_0.environment.csv\n", - "│   └── Spread_erdos_renyi_graph_prob_0.1_trial_0.gexf\n", - "├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.2\u001b[00m\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.2.dumped.yml\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.2.simulation.pickle\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.2_trial_0.environment.csv\n", - "│   └── Spread_erdos_renyi_graph_prob_0.2_trial_0.gexf\n", - "├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.3\u001b[00m\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.3.dumped.yml\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.3.simulation.pickle\n", - "│   ├── Spread_erdos_renyi_graph_prob_0.3_trial_0.environment.csv\n", - "│   └── Spread_erdos_renyi_graph_prob_0.3_trial_0.gexf\n", - "└── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.4\u001b[00m\n", - " ├── Spread_erdos_renyi_graph_prob_0.4.dumped.yml\n", - " ├── Spread_erdos_renyi_graph_prob_0.4.simulation.pickle\n", - " ├── Spread_erdos_renyi_graph_prob_0.4_trial_0.environment.csv\n", - " └── Spread_erdos_renyi_graph_prob_0.4_trial_0.gexf\n", - "\n", - "11 directories, 44 files\n", - "1.8M\tsoil_output/Sim_prob_0\n", - "652K\tsoil_output/Spread_barabasi_albert_graph_prob_0.0\n", - "684K\tsoil_output/Spread_barabasi_albert_graph_prob_0.1\n", - "692K\tsoil_output/Spread_barabasi_albert_graph_prob_0.2\n", - "692K\tsoil_output/Spread_barabasi_albert_graph_prob_0.3\n", - "688K\tsoil_output/Spread_barabasi_albert_graph_prob_0.4\n", - "1.8M\tsoil_output/Spread_erdos_renyi_graph_prob_0.0\n", - "1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.1\n", - "1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.2\n", - "1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.3\n", - "1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.4\n" - ] - } - ], - "source": [ - "!tree soil_output\n", - "!du -xh soil_output/*" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-02T10:40:14.384177Z", - "start_time": "2017-07-02T12:40:14.381885+02:00" - } - }, - "source": [ - "# Analysing the results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once the simulations are over, we can use soil to analyse the results." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:44:30.978223Z", - "start_time": "2017-07-03T16:44:30.971952+02:00" - } - }, - "source": [ - "First, let's load the stored results into a pandas dataframe." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:15.987794Z", - "start_time": "2017-07-03T16:43:15.724519+02:00" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Populating the interactive namespace from numpy and matplotlib\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/lib/python3.6/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['random']\n", - "`%matplotlib` prevents importing * from pylab and numpy\n", - " \"\\n`%matplotlib` prevents importing * from pylab and numpy\"\n" - ] - } - ], - "source": [ - "%pylab inline\n", - "from soil import analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:16.590910Z", - "start_time": "2017-07-03T16:43:15.990320+02:00" - }, - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "

\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
agent_idtstepattributevalue
0env0prob_tv_spread0.01
1env0prob_neighbor_spread0.1
2env1prob_tv_spread0.01
3env1prob_neighbor_spread0.1
4env2prob_tv_spread0.01
5env2prob_neighbor_spread0.1
6env3prob_tv_spread0.01
7env3prob_neighbor_spread0.1
8env4prob_tv_spread0.01
9env4prob_neighbor_spread0.1
10env5prob_tv_spread0.01
11env5prob_neighbor_spread0.1
12env6prob_tv_spread0.01
13env6prob_neighbor_spread0.1
14env7prob_tv_spread0.01
15env7prob_neighbor_spread0.1
16env8prob_tv_spread0.01
17env8prob_neighbor_spread0.1
18env9prob_tv_spread0.01
19env9prob_neighbor_spread0.1
20env10prob_tv_spread0.01
21env10prob_neighbor_spread0.1
22env11prob_tv_spread0.01
23env11prob_neighbor_spread0.1
24env12prob_tv_spread0.01
25env12prob_neighbor_spread0.1
26env13prob_tv_spread0.01
27env13prob_neighbor_spread0.1
28env14prob_tv_spread0.01
29env14prob_neighbor_spread0.1
...............
210124996has_tvTrue
210134996idneutral
210144997has_tvTrue
210154997idneutral
210164998has_tvTrue
210174998idneutral
210184999has_tvTrue
210194999idneutral
2102049910has_tvTrue
2102149910idneutral
2102249911has_tvTrue
2102349911idneutral
2102449912has_tvTrue
2102549912idneutral
2102649913has_tvTrue
2102749913idneutral
2102849914has_tvTrue
2102949914idneutral
2103049915has_tvTrue
2103149915idneutral
2103249916has_tvTrue
2103349916idneutral
2103449917has_tvTrue
2103549917idneutral
2103649918has_tvTrue
2103749918idneutral
2103849919has_tvTrue
2103949919idneutral
2104049920has_tvTrue
2104149920idinfected
\n", - "

21042 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " agent_id tstep attribute value\n", - "0 env 0 prob_tv_spread 0.01\n", - "1 env 0 prob_neighbor_spread 0.1\n", - "2 env 1 prob_tv_spread 0.01\n", - "3 env 1 prob_neighbor_spread 0.1\n", - "4 env 2 prob_tv_spread 0.01\n", - "5 env 2 prob_neighbor_spread 0.1\n", - "6 env 3 prob_tv_spread 0.01\n", - "7 env 3 prob_neighbor_spread 0.1\n", - "8 env 4 prob_tv_spread 0.01\n", - "9 env 4 prob_neighbor_spread 0.1\n", - "10 env 5 prob_tv_spread 0.01\n", - "11 env 5 prob_neighbor_spread 0.1\n", - "12 env 6 prob_tv_spread 0.01\n", - "13 env 6 prob_neighbor_spread 0.1\n", - "14 env 7 prob_tv_spread 0.01\n", - "15 env 7 prob_neighbor_spread 0.1\n", - "16 env 8 prob_tv_spread 0.01\n", - "17 env 8 prob_neighbor_spread 0.1\n", - "18 env 9 prob_tv_spread 0.01\n", - "19 env 9 prob_neighbor_spread 0.1\n", - "20 env 10 prob_tv_spread 0.01\n", - "21 env 10 prob_neighbor_spread 0.1\n", - "22 env 11 prob_tv_spread 0.01\n", - "23 env 11 prob_neighbor_spread 0.1\n", - "24 env 12 prob_tv_spread 0.01\n", - "25 env 12 prob_neighbor_spread 0.1\n", - "26 env 13 prob_tv_spread 0.01\n", - "27 env 13 prob_neighbor_spread 0.1\n", - "28 env 14 prob_tv_spread 0.01\n", - "29 env 14 prob_neighbor_spread 0.1\n", - "... ... ... ... ...\n", - "21012 499 6 has_tv True\n", - "21013 499 6 id neutral\n", - "21014 499 7 has_tv True\n", - "21015 499 7 id neutral\n", - "21016 499 8 has_tv True\n", - "21017 499 8 id neutral\n", - "21018 499 9 has_tv True\n", - "21019 499 9 id neutral\n", - "21020 499 10 has_tv True\n", - "21021 499 10 id neutral\n", - "21022 499 11 has_tv True\n", - "21023 499 11 id neutral\n", - "21024 499 12 has_tv True\n", - "21025 499 12 id neutral\n", - "21026 499 13 has_tv True\n", - "21027 499 13 id neutral\n", - "21028 499 14 has_tv True\n", - "21029 499 14 id neutral\n", - "21030 499 15 has_tv True\n", - "21031 499 15 id neutral\n", - "21032 499 16 has_tv True\n", - "21033 499 16 id neutral\n", - "21034 499 17 has_tv True\n", - "21035 499 17 id neutral\n", - "21036 499 18 has_tv True\n", - "21037 499 18 id neutral\n", - "21038 499 19 has_tv True\n", - "21039 499 19 id neutral\n", - "21040 499 20 has_tv True\n", - "21041 499 20 id infected\n", - "\n", - "[21042 rows x 4 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "config_file, df, config = list(analysis.get_data('soil_output/Spread_barabasi*prob_0.1*', process=False))[0]\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:17.192030Z", - "start_time": "2017-07-03T16:43:16.601046+02:00" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
value0.010.1FalseTrueinfectedneutral
tstep
01.01.0163.0337.00.0500.0
11.01.0163.0337.03.0497.0
21.01.0163.0337.06.0494.0
31.01.0163.0337.012.0488.0
41.01.0163.0337.023.0477.0
51.01.0163.0337.036.0464.0
61.01.0163.0337.053.0447.0
71.01.0163.0337.079.0421.0
81.01.0163.0337.0119.0381.0
91.01.0163.0337.0164.0336.0
101.01.0163.0337.0204.0296.0
111.01.0163.0337.0254.0246.0
121.01.0163.0337.0293.0207.0
131.01.0163.0337.0336.0164.0
141.01.0163.0337.0365.0135.0
151.01.0163.0337.0391.0109.0
161.01.0163.0337.0407.093.0
171.01.0163.0337.0424.076.0
181.01.0163.0337.0442.058.0
191.01.0163.0337.0452.048.0
201.01.0163.0337.0464.036.0
\n", - "
" - ], - "text/plain": [ - "value 0.01 0.1 False True infected neutral\n", - "tstep \n", - "0 1.0 1.0 163.0 337.0 0.0 500.0\n", - "1 1.0 1.0 163.0 337.0 3.0 497.0\n", - "2 1.0 1.0 163.0 337.0 6.0 494.0\n", - "3 1.0 1.0 163.0 337.0 12.0 488.0\n", - "4 1.0 1.0 163.0 337.0 23.0 477.0\n", - "5 1.0 1.0 163.0 337.0 36.0 464.0\n", - "6 1.0 1.0 163.0 337.0 53.0 447.0\n", - "7 1.0 1.0 163.0 337.0 79.0 421.0\n", - "8 1.0 1.0 163.0 337.0 119.0 381.0\n", - "9 1.0 1.0 163.0 337.0 164.0 336.0\n", - "10 1.0 1.0 163.0 337.0 204.0 296.0\n", - "11 1.0 1.0 163.0 337.0 254.0 246.0\n", - "12 1.0 1.0 163.0 337.0 293.0 207.0\n", - "13 1.0 1.0 163.0 337.0 336.0 164.0\n", - "14 1.0 1.0 163.0 337.0 365.0 135.0\n", - "15 1.0 1.0 163.0 337.0 391.0 109.0\n", - "16 1.0 1.0 163.0 337.0 407.0 93.0\n", - "17 1.0 1.0 163.0 337.0 424.0 76.0\n", - "18 1.0 1.0 163.0 337.0 442.0 58.0\n", - "19 1.0 1.0 163.0 337.0 452.0 48.0\n", - "20 1.0 1.0 163.0 337.0 464.0 36.0" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list(analysis.get_data('soil_output/Spread_barabasi*prob_0.1*', process=True))[0][1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't want to work with pandas, you can also use some pre-defined functions from soil to conveniently plot the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:20.937324Z", - "start_time": "2017-07-03T16:43:17.193845+02:00" - }, - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\nESilVID7f/7YFJ+blHWwAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\noUMmlSunJdAAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "analysis.plot_all('soil_output/Spread_barabasi*', attributes=['id'])" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "ExecuteTime": { - "end_time": "2017-07-03T14:43:49.238790Z", - "start_time": "2017-07-03T16:43:20.939175+02:00" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\ntZXGxkYefPBBAPbdd18aGhq6A0F7ezsrVqwo6vcpFF0RiMhua+bMmWzdupXJkyczceJEFi5cyMkn\nn8zcuXOZM2cO++23X5/PTJ06ldNPP51Zs2YxY8YMDjooqhkvLy9n8eLFXHTRRTQ2NtLR0cEXvvAF\nZs6cWeyvlXc2HDr0zJ0715cuXTrU2RCRInnxxRfZf/9MtyNJNpmOmZktc/e5O7ttVQ2JiMScAoGI\nSMwpEIiIxJwCgYhIzCkQiIjEnAKBiEjMKRCISCy95z3vGTDNo48+ysyZM5kzZw4tLS2D2v7vfvc7\nXnjhhUHnayiGw1YgEJFYevzxxwdMs2jRIr7yla/w7LPPMmLEiEFtf0cDwVBQIBCRWEqeeS9ZsoSj\njz6a+fPns99++7Fw4ULcnZ///OfccccdfOtb32LhwoUAXH311Rx66KHMmjWLyy+/vHtbt9xyC7Nm\nzWL27NmcccYZPP7449xzzz189atfZc6cOaxatYpVq1Zx/PHHc8ghh/C+972Pl156CYDXXnuNI444\ngkMPPZSvf/3rxT8QaIgJERli3/zvFbyw9u28bvOASaO4/OTch374y1/+wooVK5g0aRJHHnkkjz32\nGJ/85Cf505/+xEknncT8+fO5//77WblyJX/+859xd0455RQeeeQRxo4dy5VXXsljjz3GuHHj2LRp\nE3V1dZxyyindnwWYN28eP/nJT5gxYwZPPfUUF1xwAQ899BCf//zn+cxnPsOZZ57Jddddl9fjkCsF\nAhGJvcMOO4wpU6YAMGfOHFavXs173/veXmnuv/9+7r///u6xh5qamli5ciXPPfcc8+fPZ9y4cQDU\n1dX12X5TUxOPP/44p53WM0J/a2srAI899hh33nknAGeccQYXX3xx/r/gABQIRGRIDebMvVAqKiq6\np0tLS+no6OiTxt352te+xqc+9aley6+99lrMMj2qvUdXVxe1tbU8++yzGdcP9PlCUxuBiEgOjjvu\nOG688UaampoAWLNmDRs2bGDevHnccccdbNy4EYBNm6JHtNfU1LB161YARo0axfTp0/nNb34DREHl\nueeeA+DII4/ktttuA6LG6aGgQCAikoNjjz2Wj3/84xxxxBEceOCBzJ8/n61btzJz5kwuu+wyjjrq\nKGbPns2XvvQlIHoWwtVXX81BBx3EqlWrWLRoETfccAOzZ89m5syZ3c9L/v73v891113HoYceSmNj\n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\nAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\nhPdhAd1fv7EAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\nIjLK/X+WBgkuYDfsgAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "analysis.plot_all('soil_output/Spread_erdos*', attributes=['id'])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.6.1" - }, - "toc": { - "colors": { - "hover_highlight": "#DAA520", - "navigate_num": "#000000", - "navigate_text": "#333333", - "running_highlight": "#FF0000", - "selected_highlight": "#FFD700", - "sidebar_border": "#EEEEEE", - "wrapper_background": "#FFFFFF" - }, - "moveMenuLeft": true, - "nav_menu": { - "height": "31px", - "width": "252px" - }, - "navigate_menu": true, - "number_sections": true, - "sideBar": true, - "threshold": 4, - "toc_cell": false, - "toc_section_display": "block", - "toc_window_display": true, - "widenNotebook": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/requirements.txt b/requirements.txt old mode 100644 new mode 100755 index 1921c99..0b541b4 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,4 @@ nxsim simpy networkx numpy -matplotlib -pyyaml +matplotlib \ No newline at end of file diff --git a/settings.json b/settings.json new file mode 100755 index 0000000..daf5a39 --- /dev/null +++ b/settings.json @@ -0,0 +1,23 @@ +[ + { + "network_type": 0, + "number_of_nodes": 80, + "max_time": 50, + "num_trials": 1, + "timeout": 2 + }, + + { + "agent": ["TerroristModel"], + + "initial_population": 0.85, + "initial_havens": 0.1, + "initial_training_enviroments": 0.05, + + "initial_radicalism": 0.12, + "relative_inequality": 0.33, + "information_spread_intensity": 0.1, + "influence": 0.4, + "additional_influence": 0.1 + } +] \ No newline at end of file diff --git a/settings.py b/settings.py new file mode 100755 index 0000000..33d6d4f --- /dev/null +++ b/settings.py @@ -0,0 +1,13 @@ +# General configuration +import json + +with open('settings.json', 'r') as f: + settings = json.load(f) + +network_params = settings[0] +environment_params = settings[1] + +centrality_param = {} +partition_param={} +leaders={} + diff --git a/setup.py b/setup.py deleted file mode 100644 index 166063a..0000000 --- a/setup.py +++ /dev/null @@ -1,39 +0,0 @@ -import pip -from setuptools import setup -# parse_requirements() returns generator of pip.req.InstallRequirement objects -from pip.req import parse_requirements -from soil import __version__ - -try: - install_reqs = parse_requirements( - "requirements.txt", session=pip.download.PipSession()) - test_reqs = parse_requirements( - "test-requirements.txt", session=pip.download.PipSession()) -except AttributeError: - install_reqs = parse_requirements("requirements.txt") - test_reqs = parse_requirements("test-requirements.txt") - -install_reqs = [str(ir.req) for ir in install_reqs] -test_reqs = [str(ir.req) for ir in test_reqs] - - -setup( - name='soil', - packages=['soil'], # this must be the same as the name above - version=__version__, - description=('An Agent-Based Social Simulator for Social Networks'), - author='J. Fernando Sanchez', - author_email='jf.sanchez@upm.es', - url='https://github.com/gsi-upm/soil', # use the URL to the github repo - download_url='https://github.com/gsi-upm/soil/archive/{}.tar.gz'.format( - __version__), - keywords=['agent', 'social', 'simulator'], - classifiers=[], - install_requires=install_reqs, - tests_require=test_reqs, - setup_requires=['pytest-runner', ], - include_package_data=True, - entry_points={ - 'console_scripts': - ['soil = soil.__init__:main'] - }) diff --git a/sim_01/log.0.state.pickled b/sim_01/log.0.state.pickled new file mode 100755 index 0000000000000000000000000000000000000000..c104f74828e1a42fb7ad876f6a4268f01cd14d28 GIT binary patch literal 128665 zcmZ^sb(|H|`^V`Lkd#KcB&Ew;5LoG!R6#&e@LoDDQVL2bsic5(2~rYDH_Y8^Ou3e9A-8!`E)wxIap2_O_+jsDH zXkV>!yI#qBaSAr_#Vt@fPQVvW{onWnn#YS1Cr;<~z67=7G*2M^Z?FE}bnqpV{}EsQ zhrexmU!t&(b(>~BJGr4u^ThI_uX^@s+pBj^U*g(vde@E{@FgkGNe=BKM|2W$XQe?i zZ@pg7Nmb(od`Ycpyx8iUe!2D?2+b_jc)e@K5BQQfj@^FtqxMZ-CD+F$2>9NKJvOe@ z`N8=SKNj1*MyiQ=*G?GlC3hTqv`K}J*QUCnk4+TtrEpaDMGddhIp(;oCJy*gTGhC* zv%0vhdg?h_l1Vjg@7hTMzIPqRZfrF>_o+d-^|46Y5(<*mMD37RRyMTGajS#@r}xmy7A@HRw+&u*44}bUrxuk z|24lIQKQv8J#LnOFPEcw`Gb9bl}&VCSF;9uxgDL4tl4%f|MO3D=WGFA9!GW4fCQTt zZ>y-Q*#o}3j?U*=>`%SoXsGV|e!!Q{Q9WO<%#SgNn(1nefG@vQ4L*Zc8x=piBjrq8 z%^C0&aEyC+VBLi~Z+6q;<_h=Ue}+hR2X<&s&cpI z3HUy69J^-ptla%hf3J_t8}Jo&RQI=fa6j$H3Aμ45NPgLnId+e`B{5A7~hx!dyx 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 literal 0 HcmV?d00001 diff --git a/sim_01/log.1.state.pickled b/sim_01/log.1.state.pickled new file mode 100644 index 0000000000000000000000000000000000000000..f71d1a48742fe043b238dcfd174db7e038a3fb1b GIT binary patch literal 116150 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
`}ITA>f9SNi=js#LwM*^vuBY{-ikwB{9 zNFdd8B#>%35=gZj38XrX1X5i`0;!%OfmGj-Kx*JfASGOo8pcO)AT{!uKx*trAT@C$ zkeWIYNX;Axq~?wUQVT}{sih-<6mlexS~(I(tsM!ZHjV^RTSo$^og;zN-jP7+;7A~K zbR>{EITA>n9SNi^js#LyM*`_#M*`^)M*^vvBZ1W2kwEI9SNjyjs#NFkw6;nNFYscB#!5=f6b5=c`W38ZO`1k!Xz0%?XLfi%;RK$_)9AkB6pkmfiNNOK(t zqy6qt#>4lHaHSU&pHxF z8yyLxO^yW8W=8^Piz9)w)saBj=13rIcO;N@I1)%Z9SNjejs((fM*?Y&BZ0KnkwDt# zNFY7uNFeQZB#@qWB#>TkB#;g`5=bvP5=bvO5=bvQ5=aLf38YsX38YsY38dE?38X`g z1k&q{1kzzg0_lh&f%JwWfppZ7Ksx3~Aie2GARTukklu16kWM%fNN+n5NGBZ$q*I9^ zfb@EOuKsw_{Af0t2kj^<0Nar01qz@elq>mg4q>mj5 zqzjG&(kG4t(x;9D(r1nY(nUuC>5?OX^tmH}blH(Wy5dM6ec?zTed$ObU3Daot~nA& z2^XZV;-ff_u6s=&-Ebt3zIG&#zHuawzI7y!ZaNZ3-#HRU-#ZdWKR6OdKROafKRFUe zw;TzipB)LL+l~a%FOCG#uZ{%LZ;k}g9Y+G`cSi#04@Uy&Pe%gjFGm9DZ$|>@A4dY| zt|Ni;uOor1X6NG0x5+fft1pbKuYCEAfos{c1Hp!ha-WM(~&^R`pITA>P9SNi& zjs#LsM*^vsBY{-hkw7ZpNFbGTB#=ru5=f;T38XTP1kyu}1X5W?0;!xMfmGg+K&s$K zAXRiEkSaM6NR=G{q~-}1q$=@I97t8YCXlK*5=hk@38Wg11X4{$0;!fGfmGX(K&sQa?umslOwEG{BKS8t6zM z4RR!q20Ic+LmUaDp^gO7Fh>Guc%ld(jc_E8MmiEmqZ|pO(T)Vt7)Jsr>_{L*90{bc zjs(&;M*=D8NFa@OB#5p)R911=13qdcO;NjI1)%tIub}vITA=uI}%7M9SNjWjs((b zM*?Y$BZ0Kmkw9AKNFY7qNFc3uB#<^Z5=hTF5=a{z38YPq1kz?l0%?mQfwa|;K-%U= zAZ>Rfkajo{NIM+~q+N~#(r!lrX^$g;wAYb9+UH0hJ?BUu?RO-Qo_8dWUT`Fk4mc7> zFFF!PFF6uOFFO)Q2OSBdR~!kXR~-qY*Bl9?Ly01Q^tvN~bl8zVI^swmz2Qh89d#s- zjyV!YZ#oi4#~lfzw;Tzi6OIJZ+l~a%Nk;z>Y<47Q#btI6^ITA?c9SNil9SNk590{b49se(oqGkU-jT)~b literal 0 HcmV?d00001 diff --git a/simulation.yml b/simulation.yml deleted file mode 100644 index a396f9f..0000000 --- a/simulation.yml +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: ControlModelM2_sim -max_time: 50 -num_trials: 1 -timeout: 2 -network_params: - generator: barabasi_albert_graph - n: 100 - m: 2 -agent_distribution: - - agent_type: ControlModelM2 - weight: 0.1 - state: - id: 1 - - agent_type: ControlModelM2 - weight: 0.9 - state: - id: 0 -environment_params: - prob_neutral_making_denier: 0.035 - prob_infect: 0.075 - prob_cured_healing_infected: 0.035 - prob_cured_vaccinate_neutral: 0.035 - prob_vaccinated_healing_infected: 0.035 - prob_vaccinated_vaccinate_neutral: 0.035 - prob_generate_anti_rumor: 0.035 - standard_variance: 0.055 ---- -name: SISA_sm -max_time: 50 -num_trials: 2 -timeout: 2 -network_params: - generator: erdos_renyi_graph - n: 10000 - p: 0.05 -#other_agents: -# - agent_type: DrawingAgent -agent_distribution: - - agent_type: SISaModel - weight: 1 - state: - id: content - - agent_type: SISaModel - weight: 1 - state: - id: neutral - - agent_type: SISaModel - weight: 1 - state: - id: discontent -environment_params: - neutral_discontent_spon_prob: 0.04 - neutral_discontent_infected_prob: 0.04 - neutral_content_spon_prob: 0.18 - neutral_content_infected_prob: 0.02 - discontent_neutral: 0.13 - discontent_content: 0.07 - variance_d_c: 0.02 - content_discontent: 0.009 - variance_c_d: 0.003 - content_neutral: 0.088 - standard_variance: 0.055 diff --git a/soil.py b/soil.py new file mode 100755 index 0000000..d36fdfc --- /dev/null +++ b/soil.py @@ -0,0 +1,215 @@ +from models import * +from nxsim import NetworkSimulation +# import numpy +from matplotlib import pyplot as plt +import networkx as nx +import settings +import models +import math +import json +import operator +import community + + + +POPULATION = 0 +LEADERS = 1 +HAVEN = 2 +TRAINING = 3 + +NON_RADICAL = 0 +NEUTRAL = 1 +RADICAL = 2 +################# +# Visualization # +################# + +def visualization(graph_name): + + for x in range(0, settings.network_params["number_of_nodes"]): + attributes = {} + spells = [] + for attribute in models.networkStatus["agent_%s" % x]: + if attribute == 'visible': + lastvisible = False + laststep = 0 + for t_step in models.networkStatus["agent_%s" % x][attribute]: + nowvisible = models.networkStatus["agent_%s" % x][attribute][t_step] + if nowvisible and not lastvisible: + laststep = t_step + if not nowvisible and lastvisible: + spells.append((laststep, t_step)) + + lastvisible = nowvisible + if lastvisible: + spells.append((laststep, None)) + else: + emotionStatusAux = [] + for t_step in models.networkStatus["agent_%s" % x][attribute]: + prec = 2 + output = math.floor(models.networkStatus["agent_%s" % x][attribute][t_step] * (10 ** prec)) / (10 ** prec) # 2 decimals + emotionStatusAux.append((output, t_step, t_step + settings.network_params["timeout"])) + attributes[attribute] = emotionStatusAux + if spells: + G.add_node(x, attributes, spells=spells) + else: + G.add_node(x, attributes) + + print("Done!") + + + with open('data.txt', 'w') as outfile: + json.dump(models.networkStatus, outfile, sort_keys=True, indent=4, separators=(',', ': ')) + + for node in range(settings.network_params["number_of_nodes"]): + G.node[node]['x'] = G.node[node]['pos'][0] + G.node[node]['y'] = G.node[node]['pos'][1] + G.node[node]['viz'] = {"position": {"x": G.node[node]['pos'][0], "y": G.node[node]['pos'][1], "z": 0.0}} + del (G.node[node]['pos']) + + nx.write_gexf(G, graph_name+".gexf", version="1.2draft") + +########### +# Results # +########### + +def results(model_name): + x_values = [] + neutral_values = [] + non_radical_values = [] + radical_values = [] + + attribute_plot = 'status' + for time in range(0, settings.network_params["max_time"]): + value_neutral = 0 + value_non_radical = 0 + value_radical = 0 + real_time = time * settings.network_params["timeout"] + activity = False + for x in range(0, settings.network_params["number_of_nodes"]): + if attribute_plot in models.networkStatus["agent_%s" % x]: + if real_time in models.networkStatus["agent_%s" % x][attribute_plot]: + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == NON_RADICAL: + value_non_radical += 1 + activity = True + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == NEUTRAL: + value_neutral += 1 + activity = True + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == RADICAL: + value_radical += 1 + activity = True + + + if activity: + x_values.append(real_time) + neutral_values.append(value_neutral) + non_radical_values.append(value_non_radical) + radical_values.append(value_radical) + activity = False + + fig1 = plt.figure() + ax1 = fig1.add_subplot(111) + + non_radical_line = ax1.plot(x_values, non_radical_values, label='Non radical') + neutral_line = ax1.plot(x_values, neutral_values, label='Neutral') + radical_line = ax1.plot(x_values, radical_values, label='Radical') + ax1.legend() + fig1.savefig(model_name+'.png') + plt.show() + +########### +# Results # +########### + +def resultadosTipo(model_name): + x_values = [] + population_values = [] + leaders_values = [] + havens_values = [] + training_enviroments_values = [] + + attribute_plot = 'type' + for time in range(0, settings.network_params["max_time"]): + value_population = 0 + value_leaders = 0 + value_havens = 0 + value_training_enviroments = 0 + real_time = time * settings.network_params["timeout"] + activity = False + for x in range(0, settings.network_params["number_of_nodes"]): + if attribute_plot in models.networkStatus["agent_%s" % x]: + if real_time in models.networkStatus["agent_%s" % x][attribute_plot]: + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == POPULATION: + value_population += 1 + activity = True + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == LEADERS: + value_leaders += 1 + activity = True + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == HAVEN: + value_havens += 1 + activity = True + if models.networkStatus["agent_%s" % x][attribute_plot][real_time] == TRAINING: + value_training_enviroments += 1 + activity = True + if activity: + x_values.append(real_time) + population_values.append(value_population) + leaders_values.append(value_leaders) + havens_values.append(value_havens) + training_enviroments_values.append(value_training_enviroments) + activity = False + + fig2 = plt.figure() + ax2 = fig2.add_subplot(111) + + population_line = ax2.plot(x_values, population_values, label='Population') + leaders_line = ax2.plot(x_values, leaders_values, label='Leader') + havens_line = ax2.plot(x_values, havens_values, label='Havens') + training_enviroments_line = ax2.plot(x_values, training_enviroments_values, label='Training Enviroments') + ax2.legend() + fig2.savefig(model_name+'_type'+'.png') + plt.show() + +#################### +# Network creation # +#################### + +# nx.degree_centrality(G); + +if settings.network_params["network_type"] == 0: + G = nx.random_geometric_graph(settings.network_params["number_of_nodes"], 0.2) + + settings.partition_param = community.best_partition(G) + settings.centrality_param = nx.betweenness_centrality(G).copy() + + + # print(settings.centrality_param) + # print(settings.partition_param) +# More types of networks can be added here + +############## +# Simulation # +############## + +agents = settings.environment_params['agent'] + +print("Using Agent(s): {agents}".format(agents=agents)) + +if len(agents) > 1: + for agent in agents: + sim = NetworkSimulation(topology=G, states=init_states, agent_type=locals()[agent], max_time=settings.network_params["max_time"], + num_trials=settings.network_params["num_trials"], logging_interval=1.0, **settings.environment_params) + sim.run_simulation() + print(str(agent)) + results(str(agent)) + resultadosTipo(str(agent)) + visualization(str(agent)) +else: + agent = agents[0] + sim = NetworkSimulation(topology=G, states=init_states, agent_type=locals()[agent], max_time=settings.network_params["max_time"], + num_trials=settings.network_params["num_trials"], logging_interval=1.0, **settings.environment_params) + sim.run_simulation() + results(str(agent)) + resultadosTipo(str(agent)) + + visualization(str(agent)) \ No newline at end of file diff --git a/soil.py~ b/soil.py~ new file mode 100755 index 0000000..d6d6204 --- /dev/null +++ b/soil.py~ @@ -0,0 +1,394 @@ +from nxsim import NetworkSimulation +from nxsim import BaseNetworkAgent +from nxsim import BaseLoggingAgent +from random import randint +from matplotlib import pyplot as plt +import random +import numpy as np +import networkx as nx +import settings + + +settings.init() + +if settings.network_type == 0: + G = nx.complete_graph(settings.number_of_nodes) +if settings.network_type == 1: + G = nx.barabasi_albert_graph(settings.number_of_nodes,3) +if settings.network_type == 2: + G = nx.margulis_gabber_galil_graph(settings.number_of_nodes, None) + + +myList=[] +networkStatus=[] +for x in range(0, settings.number_of_nodes): + networkStatus.append({'id':x}) + + + +# # Just like subclassing a process in SimPy +# class MyAgent(BaseNetworkAgent): +# def __init__(self, environment=None, agent_id=0, state=()): # Make sure to have these three keyword arguments +# super().__init__(environment=environment, agent_id=agent_id, state=state) +# # Add your own attributes here + +# def run(self): +# # Add your behaviors here + + + + +class SentimentCorrelationModel(BaseNetworkAgent): + def __init__(self, environment=None, agent_id=0, state=()): + super().__init__(environment=environment, agent_id=agent_id, state=state) + self.outside_effects_prob = settings.outside_effects_prob + self.anger_prob = settings.anger_prob + self.joy_prob = settings.joy_prob + self.sadness_prob = settings.sadness_prob + self.disgust_prob = settings.disgust_prob + self.time_awareness=[] + for i in range(4): + self.time_awareness.append(0) #0-> Anger, 1-> joy, 2->sadness, 3 -> disgust + networkStatus[self.id][self.env.now]=0 + + + def run(self): + while True: + if self.env.now > 10: + G.add_node(205) + G.add_edge(205,0) + angry_neighbors_1_time_step=[] + joyful_neighbors_1_time_step=[] + sad_neighbors_1_time_step=[] + disgusted_neighbors_1_time_step=[] + + + angry_neighbors = self.get_neighboring_agents(state_id=1) + for x in angry_neighbors: + if x.time_awareness[0] > (self.env.now-500): + angry_neighbors_1_time_step.append(x) + num_neighbors_angry = len(angry_neighbors_1_time_step) + + + joyful_neighbors = self.get_neighboring_agents(state_id=2) + for x in joyful_neighbors: + if x.time_awareness[1] > (self.env.now-500): + joyful_neighbors_1_time_step.append(x) + num_neighbors_joyful = len(joyful_neighbors_1_time_step) + + + sad_neighbors = self.get_neighboring_agents(state_id=3) + for x in sad_neighbors: + if x.time_awareness[2] > (self.env.now-500): + sad_neighbors_1_time_step.append(x) + num_neighbors_sad = len(sad_neighbors_1_time_step) + + + disgusted_neighbors = self.get_neighboring_agents(state_id=4) + for x in disgusted_neighbors: + if x.time_awareness[3] > (self.env.now-500): + disgusted_neighbors_1_time_step.append(x) + num_neighbors_disgusted = len(disgusted_neighbors_1_time_step) + + # #Outside effects. Asignamos un estado aleatorio + # if random.random() < settings.outside_effects_prob: + # if self.state['id'] == 0: + # self.state['id'] = random.randint(1,4) + # myList.append(self.id) + # networkStatus[self.id][self.env.now]=self.state['id'] #Almaceno cuando se ha infectado para la red dinamica + # self.time_awareness = self.env.now #Para saber cuando se han contagiado + # yield self.env.timeout(settings.timeout) + # else: + # yield self.env.timeout(settings.timeout) + + + # #Imitation effects-Joy + + # if random.random() < (settings.joy_prob*(num_neighbors_joyful)/10): + # myList.append(self.id) + # self.state['id'] = 2 + # networkStatus[self.id][self.env.now]=2 + # yield self.env.timeout(settings.timeout) + + + # #Imitation effects-Sadness + + # if random.random() < (settings.sadness_prob*(num_neighbors_sad)/10): + # myList.append(self.id) + # self.state['id'] = 3 + # networkStatus[self.id][self.env.now]=3 + # yield self.env.timeout(settings.timeout) + + + # #Imitation effects-Disgust + + # if random.random() < (settings.disgust_prob*(num_neighbors_disgusted)/10): + # myList.append(self.id) + # self.state['id'] = 4 + # networkStatus[self.id][self.env.now]=4 + # yield self.env.timeout(settings.timeout) + + # #Imitation effects-Anger + + # if random.random() < (settings.anger_prob*(num_neighbors_angry)/10): + # myList.append(self.id) + # self.state['id'] = 1 + # networkStatus[self.id][self.env.now]=1 + # yield self.env.timeout(settings.timeout) + + # yield self.env.timeout(settings.timeout) + +########################################### + + + anger_prob= settings.anger_prob+(len(angry_neighbors_1_time_step)*settings.anger_prob) + print("anger_prob " + str(anger_prob)) + joy_prob= settings.joy_prob+(len(joyful_neighbors_1_time_step)*settings.joy_prob) + print("joy_prob " + str(joy_prob)) + sadness_prob = settings.sadness_prob+(len(sad_neighbors_1_time_step)*settings.sadness_prob) + print("sadness_prob "+ str(sadness_prob)) + disgust_prob = settings.disgust_prob+(len(disgusted_neighbors_1_time_step)*settings.disgust_prob) + print("disgust_prob " + str(disgust_prob)) + outside_effects_prob= settings.outside_effects_prob + print("outside_effects_prob " + str(outside_effects_prob)) + + + num = random.random() + + + if(numanger_prob): + + myList.append(self.id) + self.state['id'] = 2 + networkStatus[self.id][self.env.now]=2 + self.time_awareness[self.state['id']-1] = self.env.now + elif (numjoy_prob+anger_prob): + + myList.append(self.id) + self.state['id'] = 3 + networkStatus[self.id][self.env.now]=3 + self.time_awareness[self.state['id']-1] = self.env.now + elif (numsadness_prob+anger_prob+joy_prob): + + myList.append(self.id) + self.state['id'] = 4 + networkStatus[self.id][self.env.now]=4 + self.time_awareness[self.state['id']-1] = self.env.now + + yield self.env.timeout(settings.timeout) + + + # anger_propagation = settings.anger_prob*num_neighbors_angry/10 + # joy_propagation = anger_propagation + (settings.joy_prob*num_neighbors_joyful/10) + # sadness_propagation = joy_propagation + (settings.sadness_prob*num_neighbors_sad/10) + # disgust_propagation = sadness_propagation + (settings.disgust_prob*num_neighbors_disgusted/10) + # outside_effects_propagation = disgust_propagation + settings.outside_effects_prob + + # if (num 1: - x.sentiment_about[self.id] = 1 - if x.sentiment_about[self.id]< -1: - x.sentiment_about[self.id] = -1 - - x.attrs['sentiment_enterprise_%s'% self.enterprises[self.id]] = x.sentiment_about[self.id] - - def userBehaviour(self): - - if random.random() < self.tweet_probability: # Tweets - if random.random() < self.tweet_relevant_probability: # Tweets something relevant - # Tweet probability per enterprise - for i in range(self.number_of_enterprises): - random_num = random.random() - if random_num < self.tweet_probability_about[i]: - # The condition is fulfilled, sentiments are evaluated towards that enterprise - if self.sentiment_about[i] < 0: - # NEGATIVO - self.userTweets("negative",i) - elif self.sentiment_about[i] == 0: - # NEUTRO - pass - else: - # POSITIVO - self.userTweets("positive",i) - - def userTweets(self,sentiment,enterprise): - aware_neighbors = self.get_neighboring_agents(state_id=self.number_of_enterprises) # Nodes neighbours users - for x in aware_neighbors: - if sentiment == "positive": - x.sentiment_about[enterprise] +=0.003 - elif sentiment == "negative": - x.sentiment_about[enterprise] -=0.003 - else: - pass - - # Establecemos limites - if x.sentiment_about[enterprise] > 1: - x.sentiment_about[enterprise] = 1 - if x.sentiment_about[enterprise] < -1: - x.sentiment_about[enterprise] = -1 - - x.attrs['sentiment_enterprise_%s'% self.enterprises[enterprise]] = x.sentiment_about[enterprise] diff --git a/soil/agents/CounterModel.py b/soil/agents/CounterModel.py deleted file mode 100644 index 186ed45..0000000 --- a/soil/agents/CounterModel.py +++ /dev/null @@ -1,31 +0,0 @@ -from . import NetworkAgent - - -class CounterModel(NetworkAgent): - """ - Dummy behaviour. It counts the number of nodes in the network and neighbors - in each step and adds it to its state. - """ - - def step(self): - # Outside effects - total = len(self.get_all_agents()) - neighbors = len(self.get_neighboring_agents()) - self.state['times'] = self.state.get('times', 0) + 1 - self.state['neighbors'] = neighbors - self.state['total'] = total - - -class AggregatedCounter(NetworkAgent): - """ - Dummy behaviour. It counts the number of nodes in the network and neighbors - in each step and adds it to its state. - """ - - def step(self): - # Outside effects - total = len(self.get_all_agents()) - neighbors = len(self.get_neighboring_agents()) - self.state['times'] = self.state.get('times', 0) + 1 - self.state['neighbors'] = self.state.get('neighbors', 0) + neighbors - self.state['total'] = self.state.get('total', 0) + total diff --git a/soil/agents/DrawingAgent.py b/soil/agents/DrawingAgent.py deleted file mode 100644 index ccf0aa8..0000000 --- a/soil/agents/DrawingAgent.py +++ /dev/null @@ -1,18 +0,0 @@ -from . import BaseAgent - -import os.path -import matplotlib -import matplotlib.pyplot as plt -import networkx as nx - - -class DrawingAgent(BaseAgent): - """ - Agent that draws the state of the network. - """ - - def step(self): - # Outside effects - f = plt.figure() - nx.draw(self.env.G, node_size=10, width=0.2, pos=nx.spring_layout(self.env.G, scale=100), ax=f.add_subplot(111)) - f.savefig(os.path.join(self.env.sim().dir_path, "graph-"+str(self.env.now)+".png")) diff --git a/soil/agents/IndependentCascadeModel.py b/soil/agents/IndependentCascadeModel.py deleted file mode 100644 index 80e58ca..0000000 --- a/soil/agents/IndependentCascadeModel.py +++ /dev/null @@ -1,49 +0,0 @@ -import random -from . import BaseAgent - - -class IndependentCascadeModel(BaseAgent): - """ - Settings: - innovation_prob - - imitation_prob - """ - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self.innovation_prob = environment.environment_params['innovation_prob'] - self.imitation_prob = environment.environment_params['imitation_prob'] - self.state['time_awareness'] = 0 - self.state['sentimentCorrelation'] = 0 - - def step(self): - self.behaviour() - - def behaviour(self): - aware_neighbors_1_time_step = [] - # Outside effects - if random.random() < self.innovation_prob: - if self.state['id'] == 0: - self.state['id'] = 1 - self.state['sentimentCorrelation'] = 1 - self.state['time_awareness'] = self.env.now # To know when they have been infected - else: - pass - - return - - # Imitation effects - if self.state['id'] == 0: - aware_neighbors = self.get_neighboring_agents(state_id=1) - for x in aware_neighbors: - if x.state['time_awareness'] == (self.env.now-1): - aware_neighbors_1_time_step.append(x) - num_neighbors_aware = len(aware_neighbors_1_time_step) - if random.random() < (self.imitation_prob*num_neighbors_aware): - self.state['id'] = 1 - self.state['sentimentCorrelation'] = 1 - else: - pass - - return diff --git a/soil/agents/ModelM2.py b/soil/agents/ModelM2.py deleted file mode 100644 index 750dd4b..0000000 --- a/soil/agents/ModelM2.py +++ /dev/null @@ -1,242 +0,0 @@ -import random -import numpy as np -from . import NetworkAgent - - -class SpreadModelM2(NetworkAgent): - """ - Settings: - prob_neutral_making_denier - - prob_infect - - prob_cured_healing_infected - - prob_cured_vaccinate_neutral - - prob_vaccinated_healing_infected - - prob_vaccinated_vaccinate_neutral - - prob_generate_anti_rumor - """ - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - - self.prob_neutral_making_denier = np.random.normal(environment.environment_params['prob_neutral_making_denier'], - environment.environment_params['standard_variance']) - - self.prob_infect = np.random.normal(environment.environment_params['prob_infect'], - environment.environment_params['standard_variance']) - - self.prob_cured_healing_infected = np.random.normal(environment.environment_params['prob_cured_healing_infected'], - environment.environment_params['standard_variance']) - self.prob_cured_vaccinate_neutral = np.random.normal(environment.environment_params['prob_cured_vaccinate_neutral'], - environment.environment_params['standard_variance']) - - self.prob_vaccinated_healing_infected = np.random.normal(environment.environment_params['prob_vaccinated_healing_infected'], - environment.environment_params['standard_variance']) - self.prob_vaccinated_vaccinate_neutral = np.random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'], - environment.environment_params['standard_variance']) - self.prob_generate_anti_rumor = np.random.normal(environment.environment_params['prob_generate_anti_rumor'], - environment.environment_params['standard_variance']) - - def step(self): - - if self.state['id'] == 0: # Neutral - self.neutral_behaviour() - elif self.state['id'] == 1: # Infected - self.infected_behaviour() - elif self.state['id'] == 2: # Cured - self.cured_behaviour() - elif self.state['id'] == 3: # Vaccinated - self.vaccinated_behaviour() - - def neutral_behaviour(self): - - # Infected - infected_neighbors = self.get_neighboring_agents(state_id=1) - if len(infected_neighbors) > 0: - if random.random() < self.prob_neutral_making_denier: - self.state['id'] = 3 # Vaccinated making denier - - def infected_behaviour(self): - - # Neutral - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_infect: - neighbor.state['id'] = 1 # Infected - - def cured_behaviour(self): - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - def vaccinated_behaviour(self): - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Generate anti-rumor - infected_neighbors_2 = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors_2: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - - -class ControlModelM2(NetworkAgent): - """ - Settings: - prob_neutral_making_denier - - prob_infect - - prob_cured_healing_infected - - prob_cured_vaccinate_neutral - - prob_vaccinated_healing_infected - - prob_vaccinated_vaccinate_neutral - - prob_generate_anti_rumor - """ - - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - - self.prob_neutral_making_denier = np.random.normal(environment.environment_params['prob_neutral_making_denier'], - environment.environment_params['standard_variance']) - - self.prob_infect = np.random.normal(environment.environment_params['prob_infect'], - environment.environment_params['standard_variance']) - - self.prob_cured_healing_infected = np.random.normal(environment.environment_params['prob_cured_healing_infected'], - environment.environment_params['standard_variance']) - self.prob_cured_vaccinate_neutral = np.random.normal(environment.environment_params['prob_cured_vaccinate_neutral'], - environment.environment_params['standard_variance']) - - self.prob_vaccinated_healing_infected = np.random.normal(environment.environment_params['prob_vaccinated_healing_infected'], - environment.environment_params['standard_variance']) - self.prob_vaccinated_vaccinate_neutral = np.random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'], - environment.environment_params['standard_variance']) - self.prob_generate_anti_rumor = np.random.normal(environment.environment_params['prob_generate_anti_rumor'], - environment.environment_params['standard_variance']) - - def step(self): - - if self.state['id'] == 0: # Neutral - self.neutral_behaviour() - elif self.state['id'] == 1: # Infected - self.infected_behaviour() - elif self.state['id'] == 2: # Cured - self.cured_behaviour() - elif self.state['id'] == 3: # Vaccinated - self.vaccinated_behaviour() - elif self.state['id'] == 4: # Beacon-off - self.beacon_off_behaviour() - elif self.state['id'] == 5: # Beacon-on - self.beacon_on_behaviour() - - def neutral_behaviour(self): - self.state['visible'] = False - - # Infected - infected_neighbors = self.get_neighboring_agents(state_id=1) - if len(infected_neighbors) > 0: - if random.random() < self.prob_neutral_making_denier: - self.state['id'] = 3 # Vaccinated making denier - - def infected_behaviour(self): - - # Neutral - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_infect: - neighbor.state['id'] = 1 # Infected - self.state['visible'] = False - - def cured_behaviour(self): - - self.state['visible'] = True - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - def vaccinated_behaviour(self): - self.state['visible'] = True - - # Cure - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_cured_healing_infected: - neighbor.state['id'] = 2 # Cured - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated - - # Generate anti-rumor - infected_neighbors_2 = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors_2: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - - def beacon_off_behaviour(self): - self.state['visible'] = False - infected_neighbors = self.get_neighboring_agents(state_id=1) - if len(infected_neighbors) > 0: - self.state['id'] == 5 # Beacon on - - def beacon_on_behaviour(self): - self.state['visible'] = False - # Cure (M2 feature added) - infected_neighbors = self.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - neutral_neighbors_infected = neighbor.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors_infected: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 3 # Vaccinated - infected_neighbors_infected = neighbor.get_neighboring_agents(state_id=1) - for neighbor in infected_neighbors_infected: - if random.random() < self.prob_generate_anti_rumor: - neighbor.state['id'] = 2 # Cured - - # Vaccinate - neutral_neighbors = self.get_neighboring_agents(state_id=0) - for neighbor in neutral_neighbors: - if random.random() < self.prob_cured_vaccinate_neutral: - neighbor.state['id'] = 3 # Vaccinated diff --git a/soil/agents/SISaModel.py b/soil/agents/SISaModel.py deleted file mode 100644 index 9aa6c2e..0000000 --- a/soil/agents/SISaModel.py +++ /dev/null @@ -1,93 +0,0 @@ -import random -import numpy as np -from . import FSM, state - - -class SISaModel(FSM): - """ - Settings: - neutral_discontent_spon_prob - - neutral_discontent_infected_prob - - neutral_content_spong_prob - - neutral_content_infected_prob - - discontent_neutral - - discontent_content - - variance_d_c - - content_discontent - - variance_c_d - - content_neutral - - standard_variance - """ - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - - self.neutral_discontent_spon_prob = np.random.normal(environment.environment_params['neutral_discontent_spon_prob'], - environment.environment_params['standard_variance']) - self.neutral_discontent_infected_prob = np.random.normal(environment.environment_params['neutral_discontent_infected_prob'], - environment.environment_params['standard_variance']) - self.neutral_content_spon_prob = np.random.normal(environment.environment_params['neutral_content_spon_prob'], - environment.environment_params['standard_variance']) - self.neutral_content_infected_prob = np.random.normal(environment.environment_params['neutral_content_infected_prob'], - environment.environment_params['standard_variance']) - - self.discontent_neutral = np.random.normal(environment.environment_params['discontent_neutral'], - environment.environment_params['standard_variance']) - self.discontent_content = np.random.normal(environment.environment_params['discontent_content'], - environment.environment_params['variance_d_c']) - - self.content_discontent = np.random.normal(environment.environment_params['content_discontent'], - environment.environment_params['variance_c_d']) - self.content_neutral = np.random.normal(environment.environment_params['content_neutral'], - environment.environment_params['standard_variance']) - - @state - def neutral(self): - # Spontaneous effects - if random.random() < self.neutral_discontent_spon_prob: - return self.discontent - if random.random() < self.neutral_content_spon_prob: - return self.content - - # Infected - discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent) - if random.random() < discontent_neighbors * self.neutral_discontent_infected_prob: - return self.discontent - content_neighbors = self.count_neighboring_agents(state_id=self.content.id) - if random.random() < content_neighbors * self.neutral_content_infected_prob: - return self.content - return self.neutral - - @state - def discontent(self): - # Healing - if random.random() < self.discontent_neutral: - return self.neutral - - # Superinfected - content_neighbors = self.count_neighboring_agents(state_id=self.content.id) - if random.random() < content_neighbors * self.discontent_content: - return self.content - return self.discontent - - @state - def content(self): - # Healing - if random.random() < self.content_neutral: - return self.neutral - - # Superinfected - discontent_neighbors = self.count_neighboring_agents(state_id=self.discontent.id) - if random.random() < discontent_neighbors * self.content_discontent: - self.discontent - return self.content diff --git a/soil/agents/SentimentCorrelationModel.py b/soil/agents/SentimentCorrelationModel.py deleted file mode 100644 index 2e034cf..0000000 --- a/soil/agents/SentimentCorrelationModel.py +++ /dev/null @@ -1,102 +0,0 @@ -import random -from . import NetworkAgent - - -class SentimentCorrelationModel(NetworkAgent): - """ - Settings: - outside_effects_prob - - anger_prob - - joy_prob - - sadness_prob - - disgust_prob - """ - - def __init__(self, environment=None, agent_id=0, state=()): - super().__init__(environment=environment, agent_id=agent_id, state=state) - self.outside_effects_prob = environment.environment_params['outside_effects_prob'] - self.anger_prob = environment.environment_params['anger_prob'] - self.joy_prob = environment.environment_params['joy_prob'] - self.sadness_prob = environment.environment_params['sadness_prob'] - self.disgust_prob = environment.environment_params['disgust_prob'] - self.state['time_awareness'] = [] - for i in range(4): # In this model we have 4 sentiments - self.state['time_awareness'].append(0) # 0-> Anger, 1-> joy, 2->sadness, 3 -> disgust - self.state['sentimentCorrelation'] = 0 - - def step(self): - self.behaviour() - - def behaviour(self): - - angry_neighbors_1_time_step = [] - joyful_neighbors_1_time_step = [] - sad_neighbors_1_time_step = [] - disgusted_neighbors_1_time_step = [] - - angry_neighbors = self.get_neighboring_agents(state_id=1) - for x in angry_neighbors: - if x.state['time_awareness'][0] > (self.env.now-500): - angry_neighbors_1_time_step.append(x) - num_neighbors_angry = len(angry_neighbors_1_time_step) - - joyful_neighbors = self.get_neighboring_agents(state_id=2) - for x in joyful_neighbors: - if x.state['time_awareness'][1] > (self.env.now-500): - joyful_neighbors_1_time_step.append(x) - num_neighbors_joyful = len(joyful_neighbors_1_time_step) - - sad_neighbors = self.get_neighboring_agents(state_id=3) - for x in sad_neighbors: - if x.state['time_awareness'][2] > (self.env.now-500): - sad_neighbors_1_time_step.append(x) - num_neighbors_sad = len(sad_neighbors_1_time_step) - - disgusted_neighbors = self.get_neighboring_agents(state_id=4) - for x in disgusted_neighbors: - if x.state['time_awareness'][3] > (self.env.now-500): - disgusted_neighbors_1_time_step.append(x) - num_neighbors_disgusted = len(disgusted_neighbors_1_time_step) - - anger_prob = self.anger_prob+(len(angry_neighbors_1_time_step)*self.anger_prob) - joy_prob = self.joy_prob+(len(joyful_neighbors_1_time_step)*self.joy_prob) - sadness_prob = self.sadness_prob+(len(sad_neighbors_1_time_step)*self.sadness_prob) - disgust_prob = self.disgust_prob+(len(disgusted_neighbors_1_time_step)*self.disgust_prob) - outside_effects_prob = self.outside_effects_prob - - num = random.random() - - if numanger_prob): - - self.state['id'] = 2 - self.state['sentimentCorrelation'] = 2 - self.state['time_awareness'][self.state['id']-1] = self.env.now - elif (numjoy_prob+anger_prob): - - self.state['id'] = 3 - self.state['sentimentCorrelation'] = 3 - self.state['time_awareness'][self.state['id']-1] = self.env.now - elif (numsadness_prob+anger_prob+joy_prob): - - self.state['id'] = 4 - self.state['sentimentCorrelation'] = 4 - self.state['time_awareness'][self.state['id']-1] = self.env.now - - self.state['sentiment'] = self.state['id'] diff --git a/soil/agents/__init__.py b/soil/agents/__init__.py deleted file mode 100644 index b951058..0000000 --- a/soil/agents/__init__.py +++ /dev/null @@ -1,166 +0,0 @@ -# networkStatus = {} # Dict that will contain the status of every agent in the network -# sentimentCorrelationNodeArray = [] -# for x in range(0, settings.network_params["number_of_nodes"]): -# sentimentCorrelationNodeArray.append({'id': x}) -# Initialize agent states. Let's assume everyone is normal. - - -import nxsim -from collections import OrderedDict -from copy import deepcopy -import json - -from functools import wraps - - -agent_types = {} - - -class MetaAgent(type): - def __init__(cls, name, bases, nmspc): - super(MetaAgent, cls).__init__(name, bases, nmspc) - agent_types[name] = cls - - -class BaseAgent(nxsim.BaseAgent, metaclass=MetaAgent): - """ - A special simpy BaseAgent that keeps track of its state history. - """ - - def __init__(self, *args, **kwargs): - self._history = OrderedDict() - self._neighbors = None - super().__init__(*args, **kwargs) - - def __getitem__(self, key): - if isinstance(key, tuple): - k, t_step = key - if k is not None: - if t_step is not None: - return self._history[t_step][k] - else: - return {tt: tv.get(k, None) for tt, tv in self._history.items()} - else: - return self._history[t_step] - return self.state[key] - - def __setitem__(self, key, value): - self.state[key] = value - - def save_state(self): - self._history[self.now] = deepcopy(self.state) - - @property - def now(self): - try: - return self.env.now - except AttributeError: - # No environment - return None - - def run(self): - while True: - res = self.step() - yield res or self.env.timeout(self.env.interval) - - def step(self): - pass - - def to_json(self): - return json.dumps(self._history) - - -class NetworkAgent(BaseAgent, nxsim.BaseNetworkAgent): - - def count_agents(self, state_id=None, limit_neighbors=False): - if limit_neighbors: - agents = self.global_topology.neighbors(self.id) - else: - agents = self.global_topology.nodes() - count = 0 - for agent in agents: - if state_id and state_id != self.global_topology.node[agent]['agent'].state['id']: - continue - count += 1 - return count - - def count_neighboring_agents(self, state_id=None): - return self.count_agents(state_id, limit_neighbors=True) - - -def state(func): - - @wraps(func) - def func_wrapper(self): - when = None - next_state = func(self) - try: - next_state, when = next_state - except TypeError: - pass - if next_state: - try: - self.state['id'] = next_state.id - except AttributeError: - raise NotImplemented('State id %s is not valid.' % next_state) - return when - - func_wrapper.id = func.__name__ - func_wrapper.is_default = False - return func_wrapper - - -def default_state(func): - func.is_default = True - return func - - -class MetaFSM(MetaAgent): - def __init__(cls, name, bases, nmspc): - super(MetaFSM, cls).__init__(name, bases, nmspc) - states = {} - # Re-use states from inherited classes - default_state = None - for i in bases: - if isinstance(i, MetaFSM): - for state_id, state in i.states.items(): - if state.is_default: - default_state = state - states[state_id] = state - - # Add new states - for name, func in nmspc.items(): - if hasattr(func, 'id'): - if func.is_default: - default_state = func - states[func.id] = func - cls.default_state = default_state - cls.states = states - - -class FSM(BaseAgent, metaclass=MetaFSM): - def __init__(self, *args, **kwargs): - super(FSM, self).__init__(*args, **kwargs) - if 'id' not in self.state: - self.state['id'] = self.default_state.id - - def step(self): - if 'id' in self.state: - next_state = self.state['id'] - elif self.default_state: - next_state = self.default_state.id - else: - raise Exception('{} has no valid state id or default state'.format(self)) - if next_state not in self.states: - raise Exception('{} is not a valid id for {}'.format(next_state, self)) - self.states[next_state](self) - - -from .BassModel import * -from .BigMarketModel import * -from .IndependentCascadeModel import * -from .ModelM2 import * -from .SentimentCorrelationModel import * -from .SISaModel import * -from .CounterModel import * -from .DrawingAgent import * diff --git a/soil/analysis.py b/soil/analysis.py deleted file mode 100644 index 6a5789b..0000000 --- a/soil/analysis.py +++ /dev/null @@ -1,23 +0,0 @@ -import pandas as pd - -import glob -import yaml -from os.path import join - - -def get_data(pattern, process=True, attributes=None): - for folder in glob.glob(pattern): - config_file = glob.glob(join(folder, '*.yml'))[0] - config = yaml.load(open(config_file)) - for trial_data in sorted(glob.glob(join(folder, '*.environment.csv'))): - df = pd.read_csv(trial_data) - if process: - if attributes is not None: - df = df[df['attribute'].isin(attributes)] - df = df.pivot_table(values='attribute', index='tstep', columns=['value'], aggfunc='count').fillna(0) - yield config_file, df, config - - -def plot_all(*args, **kwargs): - for config_file, df, config in sorted(get_data(*args, **kwargs)): - df.plot(title=config['name']) diff --git a/soil/environment.py b/soil/environment.py deleted file mode 100644 index 927063c..0000000 --- a/soil/environment.py +++ /dev/null @@ -1,190 +0,0 @@ -import os -import csv -import weakref -from random import random -from copy import deepcopy - -import networkx as nx -import nxsim - - -class SoilEnvironment(nxsim.NetworkEnvironment): - - def __init__(self, name=None, - network_agents=None, - environment_agents=None, - states=None, - default_state=None, - interval=1, - *args, **kwargs): - self.name = name or 'UnnamedEnvironment' - self.states = deepcopy(states) or {} - self.default_state = deepcopy(default_state) or {} - super().__init__(*args, **kwargs) - self._env_agents = {} - self._history = {} - self.interval = interval - self.logger = None - # Add environment agents first, so their events get - # executed before network agents - self.environment_agents = environment_agents or [] - self.network_agents = network_agents or [] - self.process(self.save_state()) - - @property - def agents(self): - yield from self.environment_agents - yield from self.network_agents - - @property - def environment_agents(self): - for ref in self._env_agents.values(): - yield ref() - - @environment_agents.setter - def environment_agents(self, environment_agents): - # Set up environmental agent - self._env_agents = {} - for item in environment_agents: - kwargs = deepcopy(item) - atype = kwargs.pop('agent_type') - kwargs['agent_id'] = kwargs.get('agent_id', atype.__name__) - kwargs['state'] = kwargs.get('state', {}) - a = atype(**kwargs, - environment=self) - self._env_agents[a.id] = weakref.ref(a) - - @property - def network_agents(self): - for i in self.G.nodes(): - node = self.G.node[i] - if 'agent' in node: - yield node['agent'] - - @network_agents.setter - def network_agents(self, network_agents): - for ix in self.G.nodes(): - i = ix - node = self.G.node[i] - v = random() - found = False - for d in network_agents: - threshold = d['threshold'] - if v >= threshold[0] and v < threshold[1]: - agent = d['agent_type'] - state = None - if 'state' in d: - state = deepcopy(d['state']) - else: - try: - state = self.states[i] - except (IndexError, KeyError): - state = deepcopy(self.default_state) - node['agent'] = agent(environment=self, - agent_id=i, - state=state) - found = True - break - assert found - - def run(self, *args, **kwargs): - self._save_state() - super().run(*args, **kwargs) - self._save_state() - - def _save_state(self): - for agent in self.agents: - agent.save_state() - self._history[self.now] = deepcopy(self.environment_params) - - def save_state(self): - while True: - ev = self.event() - ev._ok = True - # Schedule the event with minimum priority so - # that it executes after all agents are done - self.schedule(ev, -1, self.interval) - yield ev - self._save_state() - - def __getitem__(self, key): - return self.environment_params[key] - - def __setitem__(self, key, value): - self.environment_params[key] = value - - def get_path(self, dir_path=None): - dir_path = dir_path or self.sim().dir_path - if not os.path.exists(dir_path): - os.makedirs(dir_path) - return dir_path - - def get_agent(self, agent_id): - return self.G.node[agent_id]['agent'] - - def get_agents(self): - return list(self.agents) - - def dump_csv(self, dir_path=None): - csv_name = os.path.join(self.get_path(dir_path), - '{}.environment.csv'.format(self.name)) - - with open(csv_name, 'w') as f: - cr = csv.writer(f) - cr.writerow(('agent_id', 'tstep', 'attribute', 'value')) - for i in self.history_to_tuples(): - cr.writerow(i) - - def dump_gexf(self, dir_path=None): - G = self.history_to_graph() - graph_path = os.path.join(self.get_path(dir_path), - self.name+".gexf") - nx.write_gexf(G, graph_path, version="1.2draft") - - def history_to_tuples(self): - for tstep, state in self._history.items(): - for attribute, value in state.items(): - yield ('env', tstep, attribute, value) - for agent in self.agents: - for tstep, state in agent._history.items(): - for attribute, value in state.items(): - yield (agent.id, tstep, attribute, value) - - def history_to_graph(self): - G = nx.Graph(self.G) - - for agent in self.agents: - - attributes = {'agent': str(agent.__class__)} - lastattributes = {} - spells = [] - lastvisible = False - laststep = None - for t_step, state in reversed(agent._history.items()): - for attribute, value in state.items(): - if attribute == 'visible': - nowvisible = state[attribute] - if nowvisible and not lastvisible: - laststep = t_step - if not nowvisible and lastvisible: - spells.append((laststep, t_step)) - - lastvisible = nowvisible - else: - if attribute not in lastattributes or lastattributes[attribute][0] != value: - laststep = lastattributes.get(attribute, - (None, None))[1] - value = (state[attribute], t_step, laststep) - key = 'attr_' + attribute - if key not in attributes: - attributes[key] = list() - attributes[key].append(value) - lastattributes[attribute] = (state[attribute], t_step) - if lastvisible: - spells.append((laststep, None)) - if spells: - G.add_node(agent.id, attributes, spells=spells) - else: - G.add_node(agent.id, attributes) - - return G diff --git a/soil/settings.py b/soil/settings.py deleted file mode 100644 index a95cf2f..0000000 --- a/soil/settings.py +++ /dev/null @@ -1 +0,0 @@ -# General configuration diff --git a/soil/simulation.py b/soil/simulation.py deleted file mode 100644 index 838cd65..0000000 --- a/soil/simulation.py +++ /dev/null @@ -1,241 +0,0 @@ -import weakref -import os -import csv -import time -import yaml -import networkx as nx -from networkx.readwrite import json_graph - -from copy import deepcopy -from random import random -from matplotlib import pyplot as plt - -import pickle - -from nxsim import NetworkSimulation - -from . import agents, utils, environment, basestring - - -class SoilSimulation(NetworkSimulation): - """ - Subclass of nsim.NetworkSimulation with three main differences: - 1) agent type can be specified by name or by class. - 2) instead of just one type, an network_agents can be used. - The distribution specifies the weight (or probability) of each - agent type in the topology. This is an example distribution: :: - - [ - {'agent_type': 'agent_type_1', - 'weight': 0.2, - 'state': { - 'id': 0 - } - }, - {'agent_type': 'agent_type_2', - 'weight': 0.8, - 'state': { - 'id': 1 - } - } - ] - - In this example, 20% of the nodes will be marked as type - 'agent_type_1'. - 3) if no initial state is given, each node's state will be set - to `{'id': 0}`. - """ - def __init__(self, name=None, topology=None, network_params=None, - network_agents=None, agent_type=None, states=None, - default_state=None, interval=1, - dir_path=None, num_trials=3, max_time=100, - agent_module=None, - environment_agents=None, environment_params=None): - - if topology is None: - topology = utils.load_network(network_params, - dir_path=dir_path) - elif isinstance(topology, basestring) or isinstance(topology, dict): - topology = json_graph.node_link_graph(topology) - - self.topology = nx.Graph(topology) - self.network_params = network_params - self.name = name or 'UnnamedSimulation' - self.num_trials = num_trials - self.max_time = max_time - self.default_state = default_state or {} - self.dir_path = dir_path or os.getcwd() - self.interval = interval - self.environment_params = environment_params or {} - - environment_agents = environment_agents or [] - self.environment_agents = self._convert_agent_types(environment_agents) - - distro = self.calculate_distribution(network_agents, - agent_type) - self.network_agents = self._convert_agent_types(distro) - - self.states = self.validate_states(states, - topology) - - def calculate_distribution(self, - network_agents=None, - agent_type=None): - if network_agents: - network_agents = deepcopy(network_agents) - elif agent_type: - network_agents = [{'agent_type': agent_type}] - else: - return [] - - # Calculate the thresholds - total = sum(x.get('weight', 1) for x in network_agents) - acc = 0 - for v in network_agents: - upper = acc + (v.get('weight', 1)/total) - v['threshold'] = [acc, upper] - acc = upper - return network_agents - - def serialize_distribution(self): - d = self._convert_agent_types(self.network_agents, - to_string=True) - for v in d: - if 'threshold' in v: - del v['threshold'] - return d - - def _convert_agent_types(self, ind, to_string=False): - d = deepcopy(ind) - for v in d: - agent_type = v['agent_type'] - if to_string and not isinstance(agent_type, str): - v['agent_type'] = str(agent_type.__name__) - elif not to_string and isinstance(agent_type, str): - v['agent_type'] = agents.agent_types[agent_type] - return d - - def validate_states(self, states, topology): - states = states or [] - # Validate states to avoid ignoring states during - # initialization - if isinstance(states, dict): - for x in states: - assert x in self.topology.node - else: - assert len(states) <= len(self.topology) - return states - - def run_simulation(self): - return self.run() - - def run(self): - return list(self.run_simulation_gen()) - - def run_simulation_gen(self): - with utils.timer('simulation'): - for i in range(self.num_trials): - yield self.run_trial(i) - - def run_trial(self, trial_id=0): - """Run a single trial of the simulation - - Parameters - ---------- - trial_id : int - """ - # Set-up trial environment and graph - print('Trial: {}'.format(trial_id)) - env_name = '{}_trial_{}'.format(self.name, trial_id) - env = environment.SoilEnvironment(name=env_name, - topology=self.topology.copy(), - initial_time=0, - interval=self.interval, - network_agents=self.network_agents, - states=self.states, - default_state=self.default_state, - environment_agents=self.environment_agents, - **self.environment_params) - - env.sim = weakref.ref(self) - # Set up agents on nodes - print('\tRunning') - with utils.timer('trial'): - env.run(until=self.max_time) - return env - - def to_dict(self): - return self.__getstate__() - - def to_yaml(self): - return yaml.dump(self.to_dict()) - - def dump_yaml(self, dir_path=None, file_name=None): - dir_path = dir_path or self.dir_path - if not os.path.exists(dir_path): - os.makedirs(dir_path) - if not file_name: - file_name = os.path.join(dir_path, - '{}.dumped.yml'.format(self.name)) - with open(file_name, 'w') as f: - f.write(self.to_yaml()) - - def dump_pickle(self, dir_path=None, pickle_name=None): - dir_path = dir_path or self.dir_path - if not os.path.exists(dir_path): - os.makedirs(dir_path) - if not pickle_name: - pickle_name = os.path.join(dir_path, - '{}.simulation.pickle'.format(self.name)) - with open(pickle_name, 'wb') as f: - pickle.dump(self, f) - - def __getstate__(self): - state = self.__dict__.copy() - state['topology'] = json_graph.node_link_data(self.topology) - state['network_agents'] = self.serialize_distribution() - state['environment_agents'] = self._convert_agent_types(self.environment_agents, - to_string=True) - return state - - def __setstate__(self, state): - self.__dict__ = state - self.topology = json_graph.node_link_graph(state['topology']) - self.network_agents = self._convert_agent_types(self.network_agents) - self.environment_agents = self._convert_agent_types(self.environment_agents) - return state - - -def from_config(config, G=None): - config = list(utils.load_config(config)) - if len(config) > 1: - raise AttributeError('Provide only one configuration') - config = config[0][0] - sim = SoilSimulation(**config) - return sim - - -def run_from_config(*configs, dump=True, results_dir=None, timestamp=False): - if not results_dir: - results_dir = 'soil_output' - for config_def in configs: - for config, cpath in utils.load_config(config_def): - name = config.get('name', 'unnamed') - print("Using config(s): {name}".format(name=name)) - - sim = SoilSimulation(**config) - if timestamp: - sim_folder = '{}_{}'.format(sim.name, - time.strftime("%Y-%m-%d_%H:%M:%S")) - else: - sim_folder = sim.name - dir_path = os.path.join(results_dir, - sim_folder) - results = sim.run_simulation() - - if dump: - sim.dump_pickle(dir_path) - sim.dump_yaml(dir_path) - for env in results: - env.dump_gexf(dir_path) - env.dump_csv(dir_path) diff --git a/soil/utils.py b/soil/utils.py deleted file mode 100644 index 86bba4b..0000000 --- a/soil/utils.py +++ /dev/null @@ -1,61 +0,0 @@ -import os -import yaml -from time import time -from glob import glob - -import networkx as nx - -from contextlib import contextmanager - - -def load_network(network_params, dir_path=None): - path = network_params.get('path', None) - if path: - if dir_path and not os.path.isabs(path): - path = os.path.join(dir_path, path) - extension = os.path.splitext(path)[1][1:] - kwargs = {} - if extension == 'gexf': - kwargs['version'] = '1.2draft' - kwargs['node_type'] = int - try: - method = getattr(nx.readwrite, 'read_' + extension) - except AttributeError: - raise AttributeError('Unknown format') - return method(path, **kwargs) - - net_args = network_params.copy() - net_type = net_args.pop('generator') - - method = getattr(nx.generators, net_type) - return method(**net_args) - - -def load_file(infile): - with open(infile, 'r') as f: - return list(yaml.load_all(f)) - - -def load_files(*patterns): - for pattern in patterns: - for i in glob(pattern): - for config in load_file(i): - yield config, os.path.abspath(i) - - -def load_config(config): - if isinstance(config, dict): - yield config, None - else: - yield from load_files(config) - - -@contextmanager -def timer(name='task', pre="", function=print, to_object=None): - start = time() - yield start - end = time() - function('{}Finished {} in {} seconds'.format(pre, name, str(end-start))) - if to_object: - to_object.start = start - to_object.end = end diff --git a/soil_tutorial.ipynb b/soil_tutorial.ipynb new file mode 100755 index 0000000..fc1a68b --- /dev/null +++ b/soil_tutorial.ipynb @@ -0,0 +1,913 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Grupo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SOIL Tutorial " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook contains a tutorial to learn how to use the SOcial network sImuLator (SOIL) written in Python. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "SOIL is based in 2 main files:\n", + "* __soil.py__: It's the main file of SOIL. The network creation, simulation and visualization are done in this file.\n", + "+ __settings.json__: This file contains every variable needed in the simulation in order to be modified easily.\n", + "- __models__: All the spread models already implemented are stored in this directory as modules." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Requirements" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "SOIL requires to install:\n", + "* **Python 3** - you can use the Conda distribution\n", + "* **NetworkX** - install with conda install networkx or pip install networkx\n", + "* **simpy** - install with pip install simpy\n", + "* **nxsim** - install with pip install nxsim\n", + "* **Gephi** - Available at https://gephi.org" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Soil.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports and data initialization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First of all, you need to make all the imports. This simulator is based on [nxsim](https://pypi.python.org/pypi/nxsim), using [networkx](https://networkx.github.io/) for network management. We will also include the models and settings files where the spread models and initialization variables are stored." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from models import *\n", + "from nxsim import NetworkSimulation\n", + "# import numpy\n", + "from matplotlib import pyplot as plt\n", + "import networkx as nx\n", + "import settings\n", + "import models\n", + "import math\n", + "import json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Network creation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using a parameter provided in the settings file, we can choose what type of network we want to create, as well as the number of nodes and some other parameters. More types of networks can be implemented using [networkx](https://networkx.github.io/)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "if settings.network_params[\"network_type\"] == 0:\n", + " G = nx.complete_graph(settings.network_params[\"number_of_nodes\"])\n", + "if settings.network_params[\"network_type\"] == 1:\n", + " G = nx.barabasi_albert_graph(settings.network_params[\"number_of_nodes\"], 10)\n", + "if settings.network_params[\"network_type\"] == 2:\n", + " G = nx.margulis_gabber_galil_graph(settings.network_params[\"number_of_nodes\"], None)\n", + "# More types of networks can be added here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to analyse the results of the simulation. We include them in the topology and a .gexf file is generated. This allows the user to picture the network in [Gephi](https://gephi.org/). A JSON file is also generated to permit further analysis.\n", + "\n", + "The JSON file follows this schema. The file has three depth levels. In the first one we can find the identifier of each agent in the network. Secondly, inside every agent we can observe every attribute that the creator of the model wanted to make visible. In the deepest level the different values of each attribute are\n", + "visible.\n", + "\n", + "\t{\n", + "\t\t\"agent_0\": {\n", + "\t\t\t\"attribute_X\": {\n", + "\t\t\t\t\"0\": 0,\n", + "\t\t\t\t\"2\": 0,\n", + "\t\t\t\t\"4\": 1,\n", + "\t\t\t\t\"6\": 2,\n", + "\t\t\t\t...\n", + "\t\t\t}\n", + "\t\t},\n", + "\t\t\"agent_1\": {\n", + "\t\t\t\"attribute_X\": {\n", + "\t\t\t\t\"0\": 0,\n", + "\t\t\t\t\"2\": 3,\n", + "\t\t\t\t...\n", + "\t\t\t}\n", + "\t\t},\n", + "\t\t...\t\t\n", + "\t}\n", + "\n", + "This is done with the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def visualization(graph_name):\n", + "\n", + " for x in range(0, settings.network_params[\"number_of_nodes\"]):\n", + " for attribute in models.networkStatus[\"agent_%s\" % x]:\n", + " emotionStatusAux = []\n", + " for t_step in models.networkStatus[\"agent_%s\" % x][attribute]:\n", + " prec = 2\n", + " output = math.floor(models.networkStatus[\"agent_%s\" % x][attribute][t_step] * (10 ** prec)) / (10 ** prec) # 2 decimals\n", + " emotionStatusAux.append((output, t_step, t_step + settings.network_params[\"timeout\"]))\n", + " attributes = {}\n", + " attributes[attribute] = emotionStatusAux\n", + " G.add_node(x, attributes)\n", + "\n", + " print(\"Done!\")\n", + "\n", + " with open('data.txt', 'w') as outfile:\n", + " json.dump(models.networkStatus, outfile, sort_keys=True, indent=4, separators=(',', ': '))\n", + "\n", + " nx.write_gexf(G, graph_name+\".gexf\", version=\"1.2draft\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's only the basic visualization. Everything you need can be implemented as well. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def results(model_name):\n", + " x_values = []\n", + " infected_values = []\n", + " neutral_values = []\n", + " cured_values = []\n", + " vaccinated_values = []\n", + "\n", + " attribute_plot = 'status'\n", + " for time in range(0, settings.network_params[\"max_time\"]):\n", + " value_infectados = 0\n", + " value_neutral = 0\n", + " value_cured = 0\n", + " value_vaccinated = 0\n", + " real_time = time * settings.network_params[\"timeout\"]\n", + " activity = False\n", + " for x in range(0, settings.network_params[\"number_of_nodes\"]):\n", + " if attribute_plot in models.networkStatus[\"agent_%s\" % x]:\n", + " if real_time in models.networkStatus[\"agent_%s\" % x][attribute_plot]:\n", + " if models.networkStatus[\"agent_%s\" % x][attribute_plot][real_time] == 1: ## Infected\n", + " value_infectados += 1\n", + " activity = True\n", + " if models.networkStatus[\"agent_%s\" % x][attribute_plot][real_time] == 0: ## Neutral\n", + " value_neutral += 1\n", + " activity = True\n", + " if models.networkStatus[\"agent_%s\" % x][attribute_plot][real_time] == 2: ## Cured\n", + " value_cured += 1\n", + " activity = True\n", + " if models.networkStatus[\"agent_%s\" % x][attribute_plot][real_time] == 3: ## Vaccinated\n", + " value_vaccinated += 1\n", + " activity = True\n", + "\n", + " if activity:\n", + " x_values.append(real_time)\n", + " infected_values.append(value_infectados)\n", + " neutral_values.append(value_neutral)\n", + " cured_values.append(value_cured)\n", + " vaccinated_values.append(value_vaccinated)\n", + " activity = False\n", + "\n", + " fig1 = plt.figure()\n", + " ax1 = fig1.add_subplot(111)\n", + "\n", + " infected_line = ax1.plot(x_values, infected_values, label='Infected')\n", + " neutral_line = ax1.plot(x_values, neutral_values, label='Neutral')\n", + " cured_line = ax1.plot(x_values, cured_values, label='Cured')\n", + " vaccinated_line = ax1.plot(x_values, vaccinated_values, label='Vaccinated')\n", + " ax1.legend()\n", + " fig1.savefig(model_name + '.png')\n", + " # plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The simulation starts with the following code. The user can provide the network topology, the maximum time of simulation, the spread model to be used as well as other parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "agents = settings.environment_params['agent']\n", + "\n", + "print(\"Using Agent(s): {agents}\".format(agents=agents))\n", + "\n", + "if len(agents) > 1:\n", + " for agent in agents:\n", + " sim = NetworkSimulation(topology=G, states=init_states, agent_type=locals()[agent], max_time=settings.network_params[\"max_time\"],\n", + " num_trials=settings.network_params[\"num_trials\"], logging_interval=1.0, **settings.environment_params)\n", + " sim.run_simulation()\n", + " print(str(agent))\n", + " results(str(agent))\n", + " visualization(str(agent))\n", + "else:\n", + " agent = agents[0]\n", + " sim = NetworkSimulation(topology=G, states=init_states, agent_type=locals()[agent], max_time=settings.network_params[\"max_time\"],\n", + " num_trials=settings.network_params[\"num_trials\"], logging_interval=1.0, **settings.environment_params)\n", + " sim.run_simulation()\n", + " results(str(agent))\n", + " visualization(str(agent))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Models" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports and initialization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import settings\n", + "\n", + "networkStatus = {} # Dict that will contain the status of every agent in the network\n", + "\n", + "sentimentCorrelationNodeArray = []\n", + "for x in range(0, settings.network_params[\"number_of_nodes\"]):\n", + " sentimentCorrelationNodeArray.append({'id': x})\n", + "# Initialize agent states. Let's assume everyone is normal.\n", + "init_states = [{'id': 0, } for _ in range(settings.network_params[\"number_of_nodes\"])]\n", + " # add keys as as necessary, but \"id\" must always refer to that state category" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Base behaviour" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Every spread model used in SOIL should extend the base behaviour class. By doing this the exportation of the attributes values will be automatic. This feature will be explained in the Spread Models section. The class looks like this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import settings\n", + "from nxsim import BaseNetworkAgent\n", + "\n", + "\n", + "class BaseBehaviour(BaseNetworkAgent):\n", + "\n", + " def __init__(self, environment=None, agent_id=0, state=()):\n", + " super().__init__(environment=environment, agent_id=agent_id, state=state)\n", + " self._attrs = {}\n", + "\n", + " @property\n", + " def attrs(self):\n", + " now = self.env.now\n", + " if now not in self._attrs:\n", + " self._attrs[now] = {}\n", + " return self._attrs[now]\n", + "\n", + " @attrs.setter\n", + " def attrs(self, value):\n", + " self._attrs[self.env.now] = value\n", + "\n", + " def run(self):\n", + " while True:\n", + " self.step(self.env.now)\n", + " yield self.env.timeout(settings.network_params[\"timeout\"])\n", + "\n", + " def step(self, now):\n", + " networkStatus['agent_%s'% self.id] = self.to_json()\n", + "\n", + " def to_json(self):\n", + " final = {}\n", + " for stamp, attrs in self._attrs.items():\n", + " for a in attrs:\n", + " if a not in final:\n", + " final[a] = {}\n", + " final[a][stamp] = attrs[a]\n", + " return final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spread models" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Every model to be implemented must include an init and a step function. Depending on your model, you would need different attributes. If you want them to be automatic exported for a further analysis, you must name them like this *self.attrs['name_of_attribute']*. Moreover, the last thing you should do inside the step function is call the following method *super().step(now)*. This call will store the values.\n", + "\n", + "Some other tips:\n", + "* __self.state['id']__: To check the id of the current agent/node.\n", + "* __self.get_neighboring_agents(state_id=x)__: Returns the neighbours agents/nodes with the id provided\n", + "\n", + "An example of a spread model already implemented and working:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import settings\n", + "import random\n", + "import numpy as np\n", + "\n", + "\n", + "class ControlModelM2(BaseBehaviour):\n", + "\n", + " # Init infected\n", + " init_states[random.randint(0, settings.network_params[\"number_of_nodes\"]-1)] = {'id': 1}\n", + " init_states[random.randint(0, settings.network_params[\"number_of_nodes\"]-1)] = {'id': 1}\n", + "\n", + " # Init beacons\n", + " init_states[random.randint(0, settings.network_params[\"number_of_nodes\"]-1)] = {'id': 4}\n", + " init_states[random.randint(0, settings.network_params[\"number_of_nodes\"]-1)] = {'id': 4}\n", + "\n", + " def __init__(self, environment=None, agent_id=0, state=()):\n", + " super().__init__(environment=environment, agent_id=agent_id, state=state)\n", + "\n", + " self.prob_neutral_making_denier = np.random.normal(environment.environment_params['prob_neutral_making_denier'],\n", + " environment.environment_params['standard_variance'])\n", + "\n", + " self.prob_infect = np.random.normal(environment.environment_params['prob_infect'],\n", + " environment.environment_params['standard_variance'])\n", + "\n", + " self.prob_cured_healing_infected = np.random.normal(environment.environment_params['prob_cured_healing_infected'],\n", + " environment.environment_params['standard_variance'])\n", + " self.prob_cured_vaccinate_neutral = np.random.normal(environment.environment_params['prob_cured_vaccinate_neutral'],\n", + " environment.environment_params['standard_variance'])\n", + "\n", + " self.prob_vaccinated_healing_infected = np.random.normal(environment.environment_params['prob_vaccinated_healing_infected'],\n", + " environment.environment_params['standard_variance'])\n", + " self.prob_vaccinated_vaccinate_neutral = np.random.normal(environment.environment_params['prob_vaccinated_vaccinate_neutral'],\n", + " environment.environment_params['standard_variance'])\n", + " self.prob_generate_anti_rumor = np.random.normal(environment.environment_params['prob_generate_anti_rumor'],\n", + " environment.environment_params['standard_variance'])\n", + "\n", + " def step(self, now):\n", + "\n", + " if self.state['id'] == 0: # Neutral\n", + " self.neutral_behaviour()\n", + " elif self.state['id'] == 1: # Infected\n", + " self.infected_behaviour()\n", + " elif self.state['id'] == 2: # Cured\n", + " self.cured_behaviour()\n", + " elif self.state['id'] == 3: # Vaccinated\n", + " self.vaccinated_behaviour()\n", + " elif self.state['id'] == 4: # Beacon-off\n", + " self.beacon_off_behaviour()\n", + " elif self.state['id'] == 5: # Beacon-on\n", + " self.beacon_on_behaviour()\n", + "\n", + " self.attrs['status'] = self.state['id']\n", + " super().step(now)\n", + "\n", + " def neutral_behaviour(self):\n", + "\n", + " # Infected\n", + " infected_neighbors = self.get_neighboring_agents(state_id=1)\n", + " if len(infected_neighbors) > 0:\n", + " if random.random() < self.prob_neutral_making_denier:\n", + " self.state['id'] = 3 # Vaccinated making denier\n", + "\n", + " def infected_behaviour(self):\n", + "\n", + " # Neutral\n", + " neutral_neighbors = self.get_neighboring_agents(state_id=0)\n", + " for neighbor in neutral_neighbors:\n", + " if random.random() < self.prob_infect:\n", + " neighbor.state['id'] = 1 # Infected\n", + "\n", + " def cured_behaviour(self):\n", + "\n", + " # Vaccinate\n", + " neutral_neighbors = self.get_neighboring_agents(state_id=0)\n", + " for neighbor in neutral_neighbors:\n", + " if random.random() < self.prob_cured_vaccinate_neutral:\n", + " neighbor.state['id'] = 3 # Vaccinated\n", + "\n", + " # Cure\n", + " infected_neighbors = self.get_neighboring_agents(state_id=1)\n", + " for neighbor in infected_neighbors:\n", + " if random.random() < self.prob_cured_healing_infected:\n", + " neighbor.state['id'] = 2 # Cured\n", + "\n", + " def vaccinated_behaviour(self):\n", + "\n", + " # Cure\n", + " infected_neighbors = self.get_neighboring_agents(state_id=1)\n", + " for neighbor in infected_neighbors:\n", + " if random.random() < self.prob_cured_healing_infected:\n", + " neighbor.state['id'] = 2 # Cured\n", + "\n", + " # Vaccinate\n", + " neutral_neighbors = self.get_neighboring_agents(state_id=0)\n", + " for neighbor in neutral_neighbors:\n", + " if random.random() < self.prob_cured_vaccinate_neutral:\n", + " neighbor.state['id'] = 3 # Vaccinated\n", + "\n", + " # Generate anti-rumor\n", + " infected_neighbors_2 = self.get_neighboring_agents(state_id=1)\n", + " for neighbor in infected_neighbors_2:\n", + " if random.random() < self.prob_generate_anti_rumor:\n", + " neighbor.state['id'] = 2 # Cured\n", + "\n", + " def beacon_off_behaviour(self):\n", + " infected_neighbors = self.get_neighboring_agents(state_id=1)\n", + " if len(infected_neighbors) > 0:\n", + " self.state['id'] == 5 # Beacon on\n", + "\n", + " def beacon_on_behaviour(self):\n", + "\n", + " # Cure (M2 feature added)\n", + " infected_neighbors = self.get_neighboring_agents(state_id=1)\n", + " for neighbor in infected_neighbors:\n", + " if random.random() < self.prob_generate_anti_rumor:\n", + " neighbor.state['id'] = 2 # Cured\n", + " neutral_neighbors_infected = neighbor.get_neighboring_agents(state_id=0)\n", + " for neighbor in neutral_neighbors_infected:\n", + " if random.random() < self.prob_generate_anti_rumor:\n", + " neighbor.state['id'] = 3 # Vaccinated\n", + " infected_neighbors_infected = neighbor.get_neighboring_agents(state_id=1)\n", + " for neighbor in infected_neighbors_infected:\n", + " if random.random() < self.prob_generate_anti_rumor:\n", + " neighbor.state['id'] = 2 # Cured\n", + "\n", + " # Vaccinate\n", + " neutral_neighbors = self.get_neighboring_agents(state_id=0)\n", + " for neighbor in neutral_neighbors:\n", + " if random.random() < self.prob_cured_vaccinate_neutral:\n", + " neighbor.state['id'] = 3 # Vaccinated" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Settings.json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This file contains all the variables that can be modified from the simulation. In case of implementing a new spread model, the new variables should be also included in this file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "[\n", + " {\n", + " \"network_type\": 1,\n", + " \"number_of_nodes\": 1000,\n", + " \"max_time\": 50,\n", + " \"num_trials\": 1,\n", + " \"timeout\": 2\n", + " },\n", + "\n", + " {\n", + " \"agent\": [\"BaseBehaviour\",\"SISaModel\",\"ControlModelM2\"],\n", + "\n", + "\n", + " \"bite_prob\": 0.01,\n", + " \"heal_prob\": 0.01,\n", + "\n", + " \"innovation_prob\": 0.001,\n", + " \"imitation_prob\": 0.005,\n", + "\n", + " \"outside_effects_prob\": 0.2,\n", + " \"anger_prob\": 0.06,\n", + " \"joy_prob\": 0.05,\n", + " \"sadness_prob\": 0.02,\n", + " \"disgust_prob\": 0.02,\n", + "\n", + " \"enterprises\": [\"BBVA\", \"Santander\", \"Bankia\"],\n", + "\n", + " \"tweet_probability_users\": 0.44,\n", + " \"tweet_relevant_probability\": 0.25,\n", + " \"tweet_probability_about\": [0.15, 0.15, 0.15],\n", + " \"sentiment_about\": [0, 0, 0],\n", + "\n", + " \"tweet_probability_enterprises\": [0.3, 0.3, 0.3],\n", + "\n", + " \"neutral_discontent_spon_prob\": 0.04,\n", + " \"neutral_discontent_infected_prob\": 0.04,\n", + " \"neutral_content_spon_prob\": 0.18,\n", + " \"neutral_content_infected_prob\": 0.02,\n", + "\n", + " \"discontent_neutral\": 0.13,\n", + " \"discontent_content\": 0.07,\n", + " \"variance_d_c\": 0.02,\n", + "\n", + " \"content_discontent\": 0.009,\n", + " \"variance_c_d\": 0.003,\n", + " \"content_neutral\": 0.088,\n", + "\n", + " \"standard_variance\": 0.055,\n", + "\n", + "\n", + " \"prob_neutral_making_denier\": 0.035,\n", + "\n", + " \"prob_infect\": 0.075,\n", + "\n", + " \"prob_cured_healing_infected\": 0.035,\n", + " \"prob_cured_vaccinate_neutral\": 0.035,\n", + "\n", + " \"prob_vaccinated_healing_infected\": 0.035,\n", + " \"prob_vaccinated_vaccinate_neutral\": 0.035,\n", + " \"prob_generate_anti_rumor\": 0.035\n", + " }\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Library" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To test this simulator in all the experiments we have used the Albert\n", + "Barabasi Graph [34] to automatically generate the network and the con-\n", + "nections among the agents due it is one of the most suitable graphs to\n", + "recreate social networks.\n", + "\n", + "Using different human behaviour models we will recreate the different\n", + "decisions of each agent.\n", + "\n", + "Moreover there are some parameters regarding the basic simulation that\n", + "have to be settled. In addition, more parameters will be needed depend-\n", + "ing on the spread model used for the experiment." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spread Model M2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This model is based on the New Spread Model\n", + "M2 [1] which also refers to the cascade model [2]. Agents, usually Twit-\n", + "ter users, have four states regarding a rumour: neutral (initial state),\n", + "infected, vaccinated and cured.\n", + "\n", + "An agent becomes: infected when believes the rumour; vaccinated when is\n", + "influenced before being infected by a cured or already vaccinated agent\n", + "and cured when after becoming infected the agent is influenced by a\n", + "vaccinated/cured user.\n", + "\n", + "After a certain period of time, a random infected user develops an anti-\n", + "rumour and spreads it to its neighbours in order to vaccinate the neutral\n", + "and cure the infected ones.\n", + "\n", + "This model includes the fact that infected users who made a mistake\n", + "believing in the rumour will not be in favour of spreading theirs mistakes\n", + "through the network. Therefore, only vaccinated users will spread anti-\n", + "rumours. The probability of making a denier and becoming vaccinated\n", + "when a neutral user has an infected neighbour and the first already had\n", + "information about the rumour being false.\n", + "\n", + "* [1] E. Serrano and C. A. Iglesias. “Validating viral marketing\n", + "strategies in Twitter via agent-based social simulation”. In:\n", + "Expert Systems with Applications 50.1 (2016),\n", + "* [2] L. Weng et al. “Virality prediction and community structure\n", + "in social networks”. In: Scientific Reports 3 (2013)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Control model M2,2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This model is based on the New Control Model\n", + "M2,2 [1]. It includes the use of beacons, special agents, that represent\n", + "an authority which can work against the rumour once it is detected. It\n", + "only has two states: on or off. Beacons will switch to on status when they\n", + "detect the misinformation in an infected neighbour agent.\n", + "Once the beacon is activated, they will try to cure and vaccinate other\n", + "agents starting a anti-rumour. Therefore this model also takes into ac-\n", + "count that infected users might not admit a previous mistake.\n", + "\n", + "* [1] E. Serrano and C. A. Iglesias. “Validating viral marketing\n", + "strategies in Twitter via agent-based social simulation”. In:\n", + "Expert Systems with Applications 50.1 (2016)," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SISa Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The SISa model of infection is already included in the simulator. Its the evolution of the classic disease spread Susceptible-Infective-Susceptible (SIS) model [1, 2].\n", + "\n", + "The SISa model is proposed by [3] and the main new feature is considering the spontaneous generation process of sentiment. This model has two assumptions: first, a susceptible agent who is close and more exposed to the infected has a higher probability of infection that other agent; second, the number of infected agents does not affect the probability of recovery.\n", + "\n", + "Based on some recent implementations of the SISa model [3], every agent can be in three states: neutral (initial), content and discontent.\n", + "\n", + "All the transitions between every different state are allowed depending on customizable probabilities. This model includes the fact that an agent will be more likely to change state as the number of neighbours with this state increases.\n", + "\n", + "* [1] P. Weng and X.-Q. Zhao. “Spreading speed and traveling waves for a multi-type SIS epidemic model”. In: Journal of Differential Equations 229.1 (2006)\n", + "\n", + "* [2] P. V. Mieghem. “Epidemic phase transition of the SIS type in networks”. In: A Letters Journal Exploring the Frontiers of Physics 97.4 (2012).\n", + "* [3] A. L. Hill et al. “Emotions as infectious diseases in a large social network: the SISa model”. In: Proceedings of the Royal Society of London B: Biological Sciences 277.1701 (2010)," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Big Market Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As stated in several papers [2–4], social networks like Twitter are the perfect scenario to study the propagation of ideas, sentiments and marketing strategies. In this scenario several enterprises want to take advantage of social networks to promote their companies and connect with their clients.\n", + "\n", + "The goal of this model [1] is to recreate the behaviour of several enterprises in a social network. Following the example of HashtKat, we want to measure the effect of different marketing strategies in social networks.\n", + "Depending on the sentiment towards an enterprise the user will post positive or negative tweets about these enterprises. The fact that an user can increase its probabilities of posting a relevant tweet about a certain\n", + "company depending on its sentiment towards it is also considered.\n", + "In this model the number of enterprises as well as tweet rate probabilities of both companies and users can be changed.\n", + "\n", + "* [1] E. Serrano and C. A. Iglesias. “Validating viral marketing\n", + "strategies in Twitter via agent-based social simulation”. In:\n", + "Expert Systems with Applications 50.1 (2016)\n", + "* [2] B. A. Huberman et al. “Social Networks that Matter: Twitter\n", + "Under the Microscope”. In: Social Science Research Network\n", + "(2008).\n", + "* [3] M. Cha et al. “Measuring User Influence in Twitter: The\n", + "Million Follower Fallacy.” In: ICWSM 10.10-17 (2010),\n", + "* [4] M. Bulearca and S. Bulearca. “Twitter: a viable marketing\n", + "tool for SMEs?” In: Global business and management research\n", + "2.4 (2010)," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sentiment Correlation Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With this model we want to study\n", + "the influence of different sentiments in a social network. In order to do so, we base our model on the research made by [1]. In this paper the authors found out that in a social network (in this case Weibo) the correlation\n", + "of anger is significantly higher than joy and sadness meaning that the anger sentiment would occasionally spread faster than the others.\n", + "\n", + "They also confirmed some intuitive ideas such as a pair of users who have higher interactions are more likely to be influenced by each other, and that users with more friends would influence their neighbours more than other agents.\n", + "\n", + "In this simulation we have four emotions: anger, joy, sadness and disgust.\n", + "\n", + "Using the probabilities extracted from the dataset used by [1] we can visualise the graph and confirm the conclusions of the paper. Anger sentiment propagation rate is much higher than any other. Joy sentiment also spreads easily to the neighbours. However, sadness and disgust propagation rate is really small, few neighbours get affected by them.\n", + "\n", + "* [1] R. Fan et al. “Anger is More Influential Than Joy: Sentiment\n", + "Correlation in Weibo”. In: CoRR abs/1309.2402 (2013)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bass Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Even though Bass Model can be applied to many appli-\n", + "cations [57–60] it can be used to study the diffusion of information as\n", + "well.\n", + "This model is based on the implementation proposed by Rand and Wilen-\n", + "sky [13]. In this scenario there are only two states: unaware (initial) and\n", + "aware. For this simulation we assume that agents can only change status\n", + "from advertising (outside effects) and word of mouth (information inside\n", + "the network).\n", + "The probability of being affected by imitation (word of mouth effect)\n", + "increases as a function of the agent aware neighbours. In this model once\n", + "the user changes to aware status it remains in this state for the whole\n", + "simulation.\n", + "\n", + "* F. M. Bass. “A New Product Growth for Model ConsumerDurables”. In: Management Science 15.5 (1969),\n", + "W. Dodds. “An Application of the Bass Model in Long-TermNew Product Forecasting”. In: Journal of Marketing Research\n", + "10.3 (1973),\n", + "* F. Douglas Tigert. “The Bass New Product Growth Model: A Sensitivity Analysis for a High Technology Product”. In: Journal of Marketing 45.4 (1981),\n", + "* Z. Jiang et al. “Virtual Bass Model and the left-hand data-truncation bias in diffusion of innovation studies”. In: International Journal of Research in Marketing 23.1 (2006), " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Independent Cascade Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As stated by Rand and Wilensky [1], the Independent Cascade Model [61] suits better the case we want to\n", + "study as it is more appropriate for social networks than the Bass Model.\n", + "\n", + "In this scenario we also have two states: unaware (initial) and aware. The new feature in this model is that one agent will only get infected once at least one neighbour became aware the previous time step. There is also\n", + "a probability of becoming aware by outside effects (innovation).\n", + "\n", + "This new feature can be explained intuitively, one agent will have more influence on another if the first just infected and wants to spread the new information he acquired.\n", + "\n", + "\n", + "* [1] W. Rand and U. Wilensky. An Introduction to Agent-Based Modeling: Modeling Natural, Social, and Engineered Complex Systems with NetLogo. MIT Press, 2015.\n", + "* [2] J. Goldenberg et al. “Talk of the Network: A Complex Systems Look at the Underlying Process of Word-of-Mouth”. In: Marketing Letters 12.3 (2001),\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Copyright" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "SOIL has been developed by the Intelligent Systems Group, Universidad Politécnica de Madrid, 2016-2017.\n", + "\n", + "@Copyright Universidad Politécnica de Madrid, 2016-2017\n", + " \"Grupo" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_main.py b/tests/test_main.py deleted file mode 100644 index d107d8c..0000000 --- a/tests/test_main.py +++ /dev/null @@ -1,225 +0,0 @@ -from unittest import TestCase - -import os -import yaml -from functools import partial - -from os.path import join -from soil import simulation, agents, utils - - -ROOT = os.path.abspath(os.path.dirname(__file__)) - -EXAMPLES = join(ROOT, '..', 'examples') - - -class TestMain(TestCase): - - def test_load_graph(self): - """ - Load a graph from file if the extension is known. - Raise an exception otherwise. - """ - config = { - 'network_params': { - 'path': join(ROOT, 'test.gexf') - } - } - G = utils.load_network(config['network_params']) - assert G - assert len(G) == 2 - with self.assertRaises(AttributeError): - config = { - 'network_params': { - 'path': join(ROOT, 'unknown.extension') - } - } - G = utils.load_network(config['network_params']) - print(G) - - def test_generate_barabasi(self): - """ - If no path is given, a generator and network parameters - should be used to generate a network - """ - config = { - 'network_params': { - 'generator': 'barabasi_albert_graph' - } - } - with self.assertRaises(TypeError): - G = utils.load_network(config['network_params']) - config['network_params']['n'] = 100 - config['network_params']['m'] = 10 - G = utils.load_network(config['network_params']) - assert len(G) == 100 - - def test_empty_simulation(self): - """A simulation with a base behaviour should do nothing""" - config = { - 'network_params': { - 'path': join(ROOT, 'test.gexf') - }, - 'agent_type': 'NetworkAgent', - 'environment_params': { - } - } - s = simulation.from_config(config) - s.run_simulation() - - def test_counter_agent(self): - """ - The initial states should be applied to the agent and the - agent should be able to update its state.""" - config = { - 'network_params': { - 'path': join(ROOT, 'test.gexf') - }, - 'agent_type': 'CounterModel', - 'states': [{'neighbors': 10}, {'total': 12}], - 'max_time': 2, - 'num_trials': 1, - 'environment_params': { - } - } - s = simulation.from_config(config) - env = s.run_simulation()[0] - assert env.get_agent(0)['neighbors', 0] == 10 - assert env.get_agent(0)['neighbors', 1] == 1 - assert env.get_agent(1)['total', 0] == 12 - assert env.get_agent(1)['neighbors', 1] == 1 - - def test_counter_agent_history(self): - """ - The evolution of the state should be recorded in the logging agent - """ - config = { - 'network_params': { - 'path': join(ROOT, 'test.gexf') - }, - 'network_agents': [{ - 'agent_type': 'AggregatedCounter', - 'weight': 1, - 'state': {'id': 0} - - }], - 'max_time': 10, - 'environment_params': { - } - } - s = simulation.from_config(config) - env = s.run_simulation()[0] - for agent in env.network_agents: - last = 0 - assert len(agent._history) == 11 - for step, total in agent['total', None].items(): - if step > 0: - assert total == last + 2 - last = total - - def test_custom_agent(self): - """Allow for search of neighbors with a certain state_id""" - class CustomAgent(agents.NetworkAgent): - def step(self): - self.state['neighbors'] = self.count_agents(state_id=0, - limit_neighbors=True) - config = { - 'network_params': { - 'path': join(ROOT, 'test.gexf') - }, - 'network_agents': [{ - 'agent_type': CustomAgent, - 'weight': 1, - 'state': {'id': 0} - - }], - 'max_time': 10, - 'environment_params': { - } - } - s = simulation.from_config(config) - env = s.run_simulation()[0] - assert env.get_agent(0).state['neighbors'] == 1 - - def test_torvalds_example(self): - """A complete example from a documentation should work.""" - config = utils.load_file(join(EXAMPLES, 'torvalds.yml'))[0] - config['network_params']['path'] = join(EXAMPLES, - config['network_params']['path']) - s = simulation.from_config(config) - env = s.run_simulation()[0] - for a in env.network_agents: - skill_level = a.state['skill_level'] - if a.id == 'Torvalds': - assert skill_level == 'God' - assert a.state['total'] == 3 - assert a.state['neighbors'] == 2 - elif a.id == 'balkian': - assert skill_level == 'developer' - assert a.state['total'] == 3 - assert a.state['neighbors'] == 1 - else: - assert skill_level == 'beginner' - assert a.state['total'] == 3 - assert a.state['neighbors'] == 1 - - def test_yaml(self): - """ - The YAML version of a newly created simulation - should be equivalent to the configuration file used - """ - with utils.timer('loading'): - config = utils.load_file(join(EXAMPLES, 'complete.yml'))[0] - s = simulation.from_config(config) - with utils.timer('serializing'): - serial = s.to_yaml() - with utils.timer('recovering'): - recovered = yaml.load(serial) - with utils.timer('deleting'): - del recovered['topology'] - assert config == recovered - - def test_configuration_changes(self): - """ - The configuration should not change after running - the simulation. - """ - config = utils.load_file('examples/complete.yml')[0] - s = simulation.from_config(config) - for i in range(5): - s.run_simulation() - nconfig = s.to_dict() - del nconfig['topology'] - assert config == nconfig - - def test_examples(self): - """ - Make sure all examples in the examples folder are correct - """ - - -def make_example_test(path, config): - def wrapped(self): - root = os.getcwd() - os.chdir(os.path.dirname(path)) - s = simulation.from_config(config) - envs = s.run_simulation() - for env in envs: - n = config['network_params'].get('n', None) - if n is not None: - assert len(env.get_agents()) == n - os.chdir(root) - return wrapped - - -def add_example_tests(): - for config, path in utils.load_config(join(EXAMPLES, '*.yml')): - p = make_example_test(path=path, config=config) - fname = os.path.basename(path) - p.__name__ = 'test_example_file_%s' % fname - p.__doc__ = '%s should be a valid configuration' % fname - setattr(TestMain, p.__name__, p) - del p - - -add_example_tests() diff --git a/tests/unknown.extension b/tests/unknown.extension deleted file mode 100644 index 01336dd..0000000 --- a/tests/unknown.extension +++ /dev/null @@ -1 +0,0 @@ -This is an unknown file \ No newline at end of file