From 4696a6431d576d47d726cbb1ca07c60c4ddbb68f Mon Sep 17 00:00:00 2001 From: Anna280 <54855627+Anna280@users.noreply.github.com> Date: Mon, 22 May 2023 11:12:31 +0200 Subject: [PATCH 01/24] replace png with svg --- docs/src/Julia_src_files/premade_HGF.jl | 13 +- .../images/HGF_structures/Binary_2_level.png | Bin 27246 -> 0 bytes .../images/HGF_structures/Binary_3_level.png | Bin 33436 -> 0 bytes docs/src/images/HGF_structures/all_models.png | Bin 195429 -> 0 bytes docs/src/images/HGF_structures/binary.svg | 729 ++++++++ .../src/images/HGF_structures/cat_3_level.png | Bin 37645 -> 0 bytes .../HGF_structures/cat_3_level_state.png | Bin 42366 -> 0 bytes .../src/images/HGF_structures/categorical.svg | 1638 +++++++++++++++++ .../images/HGF_structures/cont_2_level.png | Bin 27240 -> 0 bytes docs/src/images/HGF_structures/continuous.svg | 855 +++++++++ 10 files changed, 3234 insertions(+), 1 deletion(-) delete mode 100644 docs/src/images/HGF_structures/Binary_2_level.png delete mode 100644 docs/src/images/HGF_structures/Binary_3_level.png delete mode 100644 docs/src/images/HGF_structures/all_models.png create mode 100644 docs/src/images/HGF_structures/binary.svg delete mode 100644 docs/src/images/HGF_structures/cat_3_level.png delete mode 100644 docs/src/images/HGF_structures/cat_3_level_state.png create mode 100644 docs/src/images/HGF_structures/categorical.svg delete mode 100644 docs/src/images/HGF_structures/cont_2_level.png create mode 100644 docs/src/images/HGF_structures/continuous.svg diff --git a/docs/src/Julia_src_files/premade_HGF.jl b/docs/src/Julia_src_files/premade_HGF.jl index 1bfd1b4..46800e2 100644 --- a/docs/src/Julia_src_files/premade_HGF.jl +++ b/docs/src/Julia_src_files/premade_HGF.jl @@ -9,7 +9,6 @@ # - [Categorical 3-level HGF](#Categorical-3-level-HGF) # - [Categorical 3-level state transition HGF](#Categorical-3-level-state-transition) -# ![continuous 2-level graph](../images/HGF_structures/all_models.png) # #Load data for examples @@ -40,6 +39,11 @@ inputs_binary = CSV.read(hgf_path_binary * "classic_binary_inputs.csv", DataFram # ## Continuous 2-level HGF + + +# ![continuous 2-level graph](../images/HGF_structures/continuous.svg) + + # The continuous 2-level HGF is structured with following nodes: # - input node: continuous @@ -47,6 +51,7 @@ inputs_binary = CSV.read(hgf_path_binary * "classic_binary_inputs.csv", DataFram # - 1st level: continuous (value coupling to input node) # - 2nd level: continous (volatility coupling to 1st level) + #Create HGF and Agent continuous_2_level = premade_hgf("continuous_2level"); agent_continuous_2_level = @@ -93,6 +98,9 @@ plot_trajectory( # ## Binary 2-level HGF +# ![continuous 2-level graph](../images/HGF_structures/binary.svg) + + # - input node: binary # - state nodes: # - 1st level: binary (value coupling to input node) @@ -143,6 +151,9 @@ plot_trajectory(agent_binary_3_level, ("x3", "posterior")) # ## Categorical 3-level HGF +# ![continuous 2-level graph](../images/HGF_structures/categorical.svg) + + # The categorical 3-level HGF model takes an input from one of m categories and learns the probability of a category appearing. # - input node: categorical diff --git a/docs/src/images/HGF_structures/Binary_2_level.png b/docs/src/images/HGF_structures/Binary_2_level.png deleted file mode 100644 index 60a1caf957d2d8e7de6a9f49504cc9c02f195699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27246 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 O^`4T3BDgs7{Qm)fcU<=X diff --git a/docs/src/images/HGF_structures/all_models.png b/docs/src/images/HGF_structures/all_models.png deleted file mode 100644 index 8ebaea3b37a1f0186db98c2c5e478e4fe7ba260c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195429 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

}D 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \textsf{value coupling} + \textsf{volatility/noise coupling} + + + \textsf{binary state} + \textsf{observed state} + \textsf{continuous state} + \textsf{2-level Binary HGF} + \textsf{3-level Binary HGF} + + + + \textsf{generating observations} + + + $u$ + $x_a$ + + + $x_b$ + + + + + + $u$ + $x_a$ + + + + + + $x_b$ + + $\check{x}_b$ + + + $\kappa_b$ + + $\omega_b$ + $\omega_b$ + + $\omega_{\check{b}}$ + + + + + + + + + diff --git a/docs/src/images/HGF_structures/cat_3_level.png b/docs/src/images/HGF_structures/cat_3_level.png deleted file mode 100644 index cddcd1a25209e1ba127bfe37cf9b723098d8bf9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37645 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

%o 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 Bn8g49 diff --git a/docs/src/images/HGF_structures/cat_3_level_state.png b/docs/src/images/HGF_structures/cat_3_level_state.png deleted file mode 100644 index 685a7a7d90f5ed83c34741710c408a24dfce460a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42366 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 z z{%?z!1lL;vnf=6!d{^6FZ_O;ng-dVUF41*?-s%<2j`1B$hMD2bq1GHrjLjge#y?q&B*0CG8i|(Bd@yHTFn=RkE*}$LLd~ z06J5jJ0;_BwgJeG+}7d;NOxAiDYa7TeS(rOHK!J8lmX>)WwstunXg4m+CI|J3p#wL zjJ)tWS@)UHQPczksjetOh~~V^p2-%)*RBs@FePg}wxZ)c^Ofu5n$WOR?@|oiI}0Dl z__LDB$D#}a3awgls!gOkpkXQCGc(3#q||-TcfD>^)a1!Rs2x2QyF;1fZrj}o&Q9o8 zw+ws{FM!pASW<>>cv_Y6ONY!qJxOYd$S)i$j7DfWNUm?TVEjCw7pSwv7e-*y>n4kt z>`XtFm^+>XqvKY!qmA9V7ow|oZf?L2KotAsJUrMf;P9a$4KRuNAw-A5k-R+#gKd>- z#&eDU1*ek{pz8?d=gQ|#`oWJC+n>uKf0SFX)VNg|?^xxD3}ovt%{`e#o&^0yEuu-@ z+q1=i(>di1Bc(H@mQ7;i?zXGb$sJU}$pgebsBZ6rF)~;-!uWEL7}h8Gn5xZYM{?*b znwN=Pn~JD!e;owBVAUyl{3P_W{dy62@`N;QW8{}$^5)lth1#P>fvS7;w#b-4n62-? zAiXhk|5qbVE~5ixg>fdb4pho#!MtjA%La+XU zbBIA2E;#N{83`lj5cQYZzKT#;ZAfg=hqI*VceN8Mw)_QhGzNb9Z@tbGQxB*CSV;fd zu=pL&I!eLf#BS!&c|aSz(n3?oI3IcEal%X8Ow3EpS7%Xyq#Nj^bE5OC-=9OWk}399 zQ*lp+D_1(@(c1`7;S`+p8I6cjLsl%S@b05D_9syrB)}TWO$!e6R?6HCVOv}dB4^l~ zg8VgEj$U0pi3$U{Fp#}ly1SxzbAdP@ViEQG$dOFUi9>BVB#h9vZbO7Z?;QSbkr#mi z4V!iKz5hT%xGSi@|JnOy0^941Yg5S?4H==3tV?76O0XdzI`eG`vg`JSw?|KpOpU4^ z$-u;gv{{mD&?^Iz0PNKoAt=iJt|w0 zX;+)x2m8yig1}2oZYnw8qtG#w64-_wcvV}5DDxmElJwU_4>t>FP-=Ivu4;DOrcoSX zfi&-aS4FU_A#78$lqJQmt8G|;^AN~!9QYBm^*T+c`5^)YkXH#M;%m6lp$1ocs}Y*!1Ljb49xJYR|2R&5@0oj@cgOoF~I74SsqQLJ)HxlW@7aG{sZ5i zY`uPQPW>T>Em5ini)>Ac>=e9>;y})|nC4OVNV|@vNO_l9a5@At;GR+-2TbjLO7$x=jxQgPO&)wEAJL4_yt2&j@EV#odC zYgK%>2Y5$l&OhYS+ItYDXpSa_HYdrT=6I5KP(*O#Y3V6!m3jYZI-F}{Yn(4E17mQx z%?OCMuS)x>w69A4BUR~<{al!O>)kVCJJUBXrk?V(kx>7A{&RM@rz1$(MRZyO9DDDV zR$dY{DzG!bE%8d==N_l9`!$|;Dprw_X2^E$z$;#qH}p5oVMjU826Rp?U0xqoCnm=8 zsyrJgvne@Tw=0T-U$*o$mmL9{FXAjjhKfL( z0tQc>8Y1Xce0&SW$NqCP++~wL`4oKQU(*o?u>a8RU&mZA0`vHUIzs diff --git a/docs/src/images/HGF_structures/categorical.svg b/docs/src/images/HGF_structures/categorical.svg new file mode 100644 index 0000000..80d8772 --- /dev/null +++ b/docs/src/images/HGF_structures/categorical.svg @@ -0,0 +1,1638 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \textsf{value coupling} + \textsf{volatility coupling} + + + \textsf{categorical state} + \textsf{observed state} + \textsf{binary state} + + + + \textsf{continuous state} + \textsf{The Categorical HGF} + \textsf{The State Transition HGF} + + + + + + + + + + \textsf{generating outcomes} + + + + + + + + + + + + $c_1$ + $x_1$ + $x_n$ + $\dots$ + $\dots$ + $c_n$ + $\omega_1$ + $\omega_n$ + $c$ + $u$ + + + + + + + + + + + + + + $c_{1,1}$ + $x_{1,1}$ + $x_{1,j}$ + $\dots$ + $c_{1,j}$ + $\omega_{1,1}$ + $\omega_{1,j}$ + $c_1$ + $u_1$ + + + + + + + + + + + + + + + + $c_{i,1}$ + $x_{i,1}$ + $x_{i,j}$ + $\dots$ + $c_{i,j}$ + $\omega_{i,1}$ + $\omega_{i,j}$ + $c_i$ + $u_j$ + + + + + $\check{x}$ + + + + + + $\omega_x$ + + $\check{x}$ + + $\omega_x$ + + + + + + + + + + + + + diff --git a/docs/src/images/HGF_structures/cont_2_level.png b/docs/src/images/HGF_structures/cont_2_level.png deleted file mode 100644 index 1a5e3ec4da254f25e12605cf06573624ff0be722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27240 zcmeFYWmsIzwl3N<9nwHZa1FspaChtA?(Xgqpm8Taa0mp~;10oqhakb-g9LYi2S1a1 zYpuP{Irq=K_wVL;nmKz`)u>UU-tpF`Q9Z*H5jJ65Ikr-d$!~ zE_pZ)r(dzAr1;%G{Cvp#3X0v}Ay>kre*vpzmV3E=ARiMNnX`t3@T>@is|lw4kVb2a zgmjH4YJRZ1@f{H)H`i>gQg?s%@IZ^g?@NmZdV~H8U!RtX;Fn5h+j@AH6)5|H!gn!} zeGI#SOcsX%jr=EDw<8-rYd6b8B+>*6*<1RcV$h1z%V_TBAWY)piHWa{lEiUDow&l8 zu+S=~QPTQ4_N&fb3{GKVbP}r)L5j_0UPr%D0*dm!UtLlj=1dcTm*{!naok!DTaLF5 zQu1+w6-NGVX!Q57f;7d}2R$)WZu96PwO%q0fS2I6?7cGH!WJoM{o$!*uX?{Lq^8x* z`X!n?(YLkAV0ZmNf2tzz-a;!KlTwdPeb9KARf4~vf|5mbH)g9Q|GZ{Rq|<^&553+! zQ3dP$-KMdoa=Rub|;1nZt&!Rb)xY(NEvdxLAgqd9$Ekj+Q&7#zL@ zrR!0@emydLb&CYz=0O1+@1&1Fc_`)>K@|y3RI6tM%V&C>Ao5s|r6(mYtZgubAySz? z@jI}62iBiJ5IUIr8%oEMV^V@0e#CWuG*S}mz;eT^l;M!m z6^3^_x=%=giGIoamir_46SY0CR}n<@KIe0-lKC5?@L&{}*k@xU<4J8*gpy}!!6g!P z+4D+nO07j0ldsuv<=#$=nOnZDeZh-8BvvV0DTeo%Zj@tN98Pr2*z`gm{62)tWRj%- zU*Z`NRzTQyQ^OM$v*ho|6UlVRH^~TtPw8=Gz7rZBd=Z?Lv<16z)I*z}F8H^G9&}xp z^uFUxrya)LibU;jd}r0@{gd&h($6Qlc=n)645s%pojSi-e=E6@3E~-q2n7no9Cf}} zeGNT<_ykgr`FBv5VuT}qfHDLv1R-=nlmaXz;nX4MSfNCr8(p5OIICEzd;|mp!~{=M zs93=%=d2s7y=E1CXMNt}G;y+$^y92?LAAlEa!rz+lAaRO@n}En*WWl1dZ2zy^iH{r zyj4mhw_zMe+~})_FaKos=^)OBK_Ye{$)vwLb|8^1o{z>&$6hp()PZy)ZtF*7LggnR zie(0&0+>>jDpXNY{f#nr&O1FLNsL0v?Cs(oDuXKgMebT(vI29ql{K*$%_ug|H&D#{ z!}AH1=O!W6Was#G?|Dn|icE8{3qBRA7Q^L>lR|O`MrUg&wOI}z2M7l>)gi1ZDU~f+ zU-iGrc<7pChNqzzWzu#?`>}6-?XyFhgY-VS)iL@MNUu4H(m*E((d2XXrt6K}v z&ez7P)gMpTmi5GJO0N@>^6ZXmV(R{!JxwM}bQn^Nm#wYzPx<&I5?&7ASobbnX4jhdCqNUH6DS?h4q z+;vn`G1{_urCba{x9i6P>ILk>u}WQyoBodP+%&h| zP5+9|%`iz_L+)))A56#0h~`FPVAuU&;BINuUK7pMd*$z3iMmKNZ`LkTSz1rmTi1X7 zHLZeZu7BV&_H=D+t7fP$t^C_&war{^+eMp=_rk5D?>Ao@-;q1H+wOaYh!wH6h&rr=$1<24QwLq(%^&?xqD1cNx6U4kF>k`Q0UUw`~ zDx$3AkY%*h(zKg(ZTmZ`Giy)_wKU z0kk9w#`ZR0JF)R_XSxk_C-uz89?=gHBw_cR$SbOjJ;t*v%_ibs=?~=(=`x8bKXDDZ zZ6^JGYLa0hWBg$?eXYJ1t+%-+sXGR$8Hn;N4U!e)gS-}o5H=MSFZD|bt?$qJ_Bxxe zm{Cp@gBTkXTfT}ZZ9m?5g_CZb$yCv-f;Tsgv|i?Xy0{opt_~(e-;205c+y$_Sqy;@ z!D}`g*5H(eYT0T|3p8^tvxgSK*3{-E4hcRB5&31p%~V92&vh&|Ix{;J13Fw)OI|)h zNUI@TXzd%?>xt`a%lK_ys1zt1eDoh)ED23+3~WZ6HgoaV&0kVnOMHtVPAlg+n!hdg z*LasZnp0KwTLzy-|r-YVh!M)!c`;L>^MITO9f|kRk<0IqG3(ph| z1m$@2Mxh+$9MPQJT<4q;oNk%N0u%GAlTOzfrv{}X)>-BJh46|${Kwu)SAD2+cs-2a zjM2K`&6CSb)#t|>p#zumiM1}e$IVU$B{Ne42ZI-=GwGEXt%vS+gJ?Zb1!=BaL=JOH zymx5_4uyRCyo3%5%l2(+?+Wvsjkc~BXDVde1P=9Ed)wSj?^ka!UI>$%!I}0B4}P6L z6Oi@%v#E5Q8`is*WtfT0pWvr`A$zAab=1?&bvA#Vxp%tVe9r&pYR%XFp;Sou;SX!< zW#Da&t)fkp>ksSg{i>PY8A&n*&s#8CQ}O#ARDO*tRz~S(T@M^o>f~bNB06+AP%q=Q zs`zN!Ep7VjX|BxHyyzpL?m-nS@h!XR`ZIaYb9=fX+JpBq>7=s9K&S1>$BQ+EpND2O zlxHFrgrdaFiR<4m1&XCW$o~0u^Fuz{=~*p|Z5cEHxyKqA{5fI#6eeI?&_g~g28yPz z_J2b#R{Zfz7h1>kv~os{hn83$98~pFu2;l~{BI@yXG=9_Gba%TJD^Lr;D1fmzZ(Dd!hbd7XL=m@f3w6tX8!vWu(KcvKhuBa zOc2F@eRLR@#+O#23aY>r0NLXoLO$^C%|F-2d+zy5hTCA^S|BC*R@EJ0KjZ1>Pw~Z` zjhH17Cgj=Y5PZ)g!?Y#vv+tw7>W~9IUvffhRS-Xa?@+XxklAKXT|oCdB3?Kf_4;sg z_Hr&lz9CLsulZ(T@J9Nz-PO@iyIV}XWu1MZJu(r56odeUfxuDFG7(84M+(e;9vI4l z$nwd7=ji?*h&DP*Qm2E0_Fr|$@}K`t!T*@#AK?6d27{&KN=E=KLam;$-TC~ieV~iI(RWR(Wp)L5~{<1xutK}D3-+=x_ z_4<0eg1o)QfDZMM&yiOz=RoPLh)HOyr`lbC-M-)bY1aDh?=KYOc{Vzr%5FV24m7ZRP5oWpIJmDGxQWXXu<7QLk^ocSIZCg zZWw3ZN$%e{>krR~Qyb!jof2y(lbR;;<4&_4 zZcQe0`?ju{m+u%o4r~n4EN@r;ti>n{yZ5lE&)@b6-LvrQSAE|!5vTs0)OMD?F0IiN zclF~HI0N&~fWdv7_uZa>!u?sH&`|pbUhB3PpWJeyrX{%{oyqc6ph@!cPfwfk4XWqp z46gd;3gptv@tQ`1&G)9u)ADglcaDB;3104N&ooW%&yDzA?2q`}J6F-~V%u&FXVkD| zT@9kjKYj5E9__pTrI&Ga@plLpJX!(aBbS_jGeP7j;ecI4= zUY=x5Rv?^OX3#E34f*5}2=P6RFrd_EJ4wJg&})z}xE}9IYQNnO#aeEf58O-KN0E(! z2b#=wFLq;(E6QxsD0uYmKinTZs2{2`xqgWlQVw9?IPJnxNY7_G#&w)XDX3BK*;UDR z6mFd@5F@0;>gQk#08D65vuE&d9dWdEHSE?lmvQ91H5Z?CyRLQJIAwdfIaE`VabO#< zx8rcV`sX;t&%3ba!*uE{cC?8xF!TZ&jWy3XrWl^-N=^ zc#^YYSoVLGYZ=8yBFnS3+tkUqzO8U;Ev>I~+436kT5>+lZ(XNi+M(~NV@tDy1i^En z!)D8D^iNYykJhm=e+Ma}?9>d_G%p_5M;ujROu#?Kj=Q@shERiD`j^yZNAW#{#IFH& z@VLq6h{%wZG3zM zz~!COAWJX3pv8+?|58nbkg*g&~_yU7&~%rIZmj{G>|)cX8Pn`>P7 zlwk}9jYE{n(pdqQoILMN9%Y7)LBD|uZ7YJjFW?SLo%uE1@gD@wK1Yn$J)e(0>T83) zvAWljc`Z(DWy3S({cLElaaXM}HBWE0PmIy&qcGNa^VuU<9QE3%c7~2tYxV+s+3I-X z>u&%W$VV-#t>bY}(FwUa6My(QMckvglV=c}&^!V+mfe%kVqZ{*=_xWR{h~1=cg(II z&s%?T6z$fsMz8ne2aT1BPH{wkURs7zmV9!m-jU~wjxL+gpnlCqq2n+G?9JRSE2X*{ zv~)3;$$zeVuFaTa>G-1ad!zd61qVz|>^!$_N;F!n!?sZMe}m&qH`*$BnN_vMgE`DE zn`Txvw~6k^;-t$2dDCGB0YsGO-i=bn)6ZA!%N3{~&bxt3rwHJIDEZ zO!d}&LG45{>u8R=v&RW5@F1x_*Z@GKJU4Ff%i__y?B2?Z6uVUNpEsXOWZl;?+v0I< zVL5zf&YH#+^jfSd?Wg#{hBLaqeA#yC(y4Cn^XzbhryPDalrLdl;TUBzm&*@pRt8iq53qkZmH^ zeAOze-WP8M?qg?HKDxA@i>xL*Z;=uiP|rVDSM8%hM%?uLQ^GghQWad6sHHzWT$wXU zciA%j<4Xxz^PVX}(kB2Wy<8U-mRubt5{7?g?tC2<D-9 z37Ym|aN%N*jFDM`IZ2}3Rru>~aeq>nGDKwzT6+06Sx%YCAoIFxUSUlG)8>)2QLz_F z1^f-RGHsD!ZT4SlB|lUk`h40T7;*1uSt?41b0xtgm;S(DzQw=Avt=~pnK6ISr{L>U zd|#+HnUSK|AaAu4jO#OYsmK-)fg2I~XNw4_srZXskHThitK(Wv%8BD*b$mnHpKhiK z(Y^1Rw$v^J=4UP$jXa+HH_&wBrlOuiYL_;C7ULihwSWYpq1{|zpB+NO$^#r zQ(9`<0gmFjnQmw^3mm>|ikIt^Pds_E7dIsSN=EYLjY_5t$ts1b$z*_Fe_S-;$ll;1 zv}_ZqUX>PZzzg{nTg*-YG=3vAFN??YRLL6OfLZLsC1s>2H^{dFTItV{BhW1@9Y?#- zcM{$h9EWR^iDEdEubOsRJ^*O9r%FEvYKr6tQ+6EZ!LBE*5wsmPS4}eFJj9M^#Z_j& zNGzA+O?)5n^ZshYZ+QI4OI+8Y=B^D#qQzsW+3E{}L#HGj_$Jh#P4Ld=}ovXeV zHCcMn5BnBEUPiO~!7RbGd#oE@&&dQ$rUEJka)?^savL5QQh3bC`Fk_wrNQT#5Sa*FO2WX3JC^} zqMLS4b+S0qT6US)9Sd46)g?I?<1@T-!#{_;tv{R;B+d?#EKs(t1kXw9DN1+@A>U9ugp!@KVnynV}JKr14?em2SL6E*GePPb9f&zGgqS zs`--tTm;La-^(Fb)c{we4N0!H4B<+>T!cz8^SsTp_gn$NJ+-$Im-8~` zKpXF~fqu3Gn9GJ!#V!? zsfQ(s!R|8ksnLRIL{D+ej!ll*SYm~U;EU3}P)|N}U!qR)jh%jGhh_HXpGApC@rE&t<&b)gRN;zAImq&H zP1MQz08zYwc9#fhfaO>)wGQu|+fD;@nmBJkY6}pc>!)KPGK9x1*ZvXVZFU=et>?!r z^?~x_ZQN&DSF=Xr6;%aUwO^(C$^!~+{WLTA?Ku`yrQ=cu0=9=hl#!jiTfJ7 zBsa6Y>Ty<{Pc;h9%~>-%XY4arIW{)u!%sgyZ%pj|V<2On2@sc7anjsTD(>&1)5toh z=E~M4dX5x%PV2*<1HMl~It-PCg6GBZe%gi<&0nW!T2y=dx&KHFVz-gk{fy8uXf1Qy4GnRh87F1pj<{@jT@EV~qE@@_k8% zOLN@Wtmwr+fyn~>j{=;^=xzLW(47bM?7r*#Z60NkU6>x3n!sbU$WKx^!1{xvv~AC0 z=gVu#J7BF!PLXn{wz@oAETF|Zq^i9-!S)#zQrNrJ^IpZuYW&oDaj<}TVC6;jATZ-deNk^wQLqkc+qa#y&6xUv3&Z!6F`#Fb!Sgcsa|vw8+&JIHL|aam3>f&P z2+ka>>MUPR2iqCLqn*=pkN1AU5pA2l4dZII6Kl2SF&!owOfx6{q68L1k-7c;s=;X* zy;E&TwYTF9!t`pd)F{iX=3L|btqGg%!K?7-cT-7#aWvC(FA- zDSqLSjY`Jhq7j(lCn~=D^|MaCwVjm~KgG*lVz+dbFPE)*Zc4%q`)poOD$|Q_kxCYu zFx|NVGjut@`Moh-0iyJb4@&3hJBpmmtn_q8pDH{U^1vyT{3S5L*H(NO!UnP`Gx@Z@$BU43h62D44lXhX!SYWp(H*vRo zHrd5jO(A0GO}v~NG;NQ0aGrC@1X1LZ*a&VD zy>CVS#xtUW0eeopHq;6u_NQ-0w9{Jl;9E_bN;nn6ZY(!FcqTQ|9n+>2C32lbhg#jv zdN?#b?c0G-eIxr5ZV(MKo_4{YAs2jJ0s$vdK*ifhFuMt;VBE42MW-IUC91VaJ1UeG zEvXOHg7Y&a@hO3#{)eSr66kGV&m;}>)oDX5I%i?^?UAN0^wSCG7 zL(k*ZIJo;`=w?zT_Ip+`HDiyo>mtPd!jWpr`o<<1y^z;%EX&=Bi{4jWWrKSz6A=XC zc=}8yj|{hL<0}?6bH!-g*7NHFNn6z%vkK}d5W>Qha8F-xln3Vh*5*}-*=w|Ik{Ya# zH9eUiT&XysC+^(jeWuqh;F?Stq>A2tQCG>}a+!<*zn;kQy=d$esHn!tAwgQaGwbC) zAAgr5r>D0`z!_heNJmeoqn7$Q13o@};-4CzThCGMensMrM>e$laTnFD?MIW$^x~Ik zu2ItPQC0L?#iA4{PX4jtT~w`sfx;YD6c* zNcsaC+6s>1mWplmCoZpnT`y@k!DXM3}P;b|SV z-cWS$Fg=2wn`obZPmvSp^~@EnPgB1tQOlVjH?vsSiB=;2WOr_vBd*2;p9r53mF(_& z$L5tFx96VPtQU1KUr&Qlyp;a&4ujKdT>r>#k{MQyCtQiH0z_o#GCteQ&qLj^%#;=f z+fo%r$P4H~%NsqG+kDs--w+CF-*D^nYLM6RlaclLHOMZxT<8h-j;}W-S0L4`Y*^QX zB#f)|Sx-#JReG4KdRQ%m48^D+Us^e1g{WObdkDNC;~+f;x%iF>=y<4oVb>xTDym?{ z)NQS6>no6gT-ht-7jOMMyH}D^m@!2(iJ)z6!qlq=h(9cL7uW;#4BzTk7SR$8WaPw# zS1x6KJ|6SdI>}Pwtdmb0h9A^CPxc(Q(3-p}bkRe@Tl~GairbLvwrJg|7ZsdpGha%l zIpTCtXQj(chcef)_p;PxVq-{xal`UjPd15Jx5MDdW9=DyDsbV-$ zrq{Dh^8YLP&y5rB zD^H!X9%>zrsod<(@%v?Kwkhnc*JTz0rDuHRGF*Q0T<}fvM%z#tl97wAFVYs6Yv;Hx zcpUJ`73i`~6Qd2NcBHALw7jT1oJoW2U=pc~A2lBN-$fS9`*J!0=k2!xsatQi(7&n;h zZz8ut0Sqn9^8If8w}WITLJ*uhy5rgZboW2T{BKZMrF{2$<(tR1%Y%ia?OAV5FFp3& z$ISN!y>{O_?@B)+PTORXw7Xl8YX=~gd1^CX^A-fY!-PrRY{=}QCu7Cp6MmUQCO%qj z_e1B!)JHDAif<&ZdY}C|UJ^>0_mMl*__=~15Uid~ugB(S6@J3hMBbe)*TI5>@z@0(u$=_Vgv8#o|awx}%DU$bHP&tvz5CiXDbrFvk9P8{_FIR@1*S|W(? zYya3DeZ)6@WC&rRi(f|S>gqgXCb$AvI!n?*c+1tCYqH&K(L)nJ!i1$;Gz|&<5V0IZ z3E0$P@pQ_)@N8;m35Mz-tY{z=4a|Z8lQcQuG-IGrEPO&JGh?oSZsT31`*$ifVU zS{Xji=RQZaOjj(IN+M|7ZHlU!qEb?uyWF2sLDmW^srp9kA4_3sqIAYG{Jvd&Z?L8ElwJ3^cVR1 z1sX?AB%sDK{ennTaK&OHbQ`R-5dcxsEq#R%mo4pn&W%n45hnMK4Oy4#SC;O`$C1`B zrRf}xVAR{Fm6ySA8dCv?s4)8bz9(c7g_a04zfLvALd&v_*JVPP(<6c?ku^~FGz#Fq zwBD))Tm%;$`?>0T_UDU@`R;^zZ~~#Jp$JG)N^2B4mX$C-aL7D}Dos?`BsA@D63Ewh^@`Y3a2JkRu!azgtdo4 z(Xn1DQsuxm8~zHU{*hN#FrBV`K;rgs~er0wYF1Or2N{Hyxucfw19? zct&PnUaQM4Gu<(h=d#pcrLP)4sk?}+Q%3}v5F#d?#PFOy`? z(Tp$hZVe}Qrclc~2%hR2He8b9$kYVSEk&tA(Vgrbpir)3#%!blSdR*p<0jI<`7N}M zVzCO12d7SYD*j_uy7(gU+};Eokua}7mZ*i&SWN(YM_dDk5Jxkn)pnuYj_PoJe*X4j zasq0)KdcuRT6931t`E5043uK1nq@M`V!O6yonZX~)=F%Pz7512^RM;BD<~D&d%AV> zXvZ)}MY1hdG0MlEQ9kzqV0aOd7^DZC)y|b=b|RBV=10)MV=~G2koG=&4>WzMHV!9; z*-Rp11-wKarFDUbRSg56%AlZns{yVR*OS5+PVhh2j8reC6X@ii@{i@Dl4wzf*b2Ez z$9@@8*UXL4ouoBuB)u*fqXPxiYP3-5i*{W6e1jztZt2+e9ARNiwN`o$ozhkhpdUTs zAO|`BX-k_RN=4!9BDH?!KC02i$#6gq6q1i==v4xz5;nESQmfb)Rdv!HoL@t6w-$h9 zY5|kd*A84SC0>hbZ9*xGjG&!Q^{#P}2e7eo9;K#u$8`C?A2kA&3JxmRhy)M|mdb$0 z%4H&dmqTZ%30QKgag@pN&C-d<0?Lsu+n&kj1;x)AcpQ4cUz zMILk}++W|K4mj9KU^lOs>*tY&Wz&J-N3LRV@P44N8N6|t0AayaFO&G-8542>dbU>s zS)2JoDzI?o1Z5(2r=N1nwsGOV|+{2_I#3a&rY%hW6I zgiC?Q4&tb-w2+wvt-Cw>5Rhk^+&rF{!=6GiafAsQ-xn(KFPJdVcQQX2=`wj={+v~u zBpj$J_C7;&2cIM(h$x4%lT)6Sl;0P}rEa_I zH`L1FjnohE4o<;-(HBHC!{?8U+K_wG1ceDJkDk(eJ-AZpk$C!6ftm+g@2I?M{2Y^n z2w3olj40yh5PVy7r7$WS9!scSp34bDpJ9x1-|}nI*ezO>Rr00s7EjZl7cgxw8THbpJ^KGqY5&;gP`(_%lA-AW za3zd?N&Y_uh+FQ~DVmLd{QDva!ARm0fZUHY9~fzcdD$ILO36DSTK_jaRwM@g+QYCk zexboZ0iKBlmIEA5t`DO!4zy^Q5DH~xM(~tELV6|T3bmq)ewCZdU&DpuazanhQ8V=D zeV+io|Mc>h7HIWP?S&J6V3Cugtg;0{R}h(o}x9mk>T3CN>E~U)UL)sC!$Wqk% z@wG7Fhb##?DmFI>5rrNe@XyH&|KDHOfLZv*tElt#W-1lf^}CS*$dG4y_S_EUIgU68 z#-E>{!~l_HrowBroE+p=gP+nrrR6Y(5Hu?_dVCTl&&xH8p;MuL*}ZW@lQ=!iRt?0s zqFAxBq@#(z_!3Ev>5ylsJ<7_<(XN4b<5Bx9NO+HwR&oFeD>lNypEsy1&%}goz0t>i`|yWhvdZ%!bBS67*;xi0 zkG&}sb_fPuQW25q)OsYO9;uoj?!ySsTCUGWDm@Vp83*O;rE~{%US#}5czTxtmEqpB znP$N5*yDmIlbWX{36O{|yYBW!{{tlXITpcriZf`uxFiMqT2rh(N^Pu_FOh5Y#|$Uu zi1vu%AKxF!`5!g>F~SuZ4xytIgP3GdqdO+JbJN1vYPZQpfw2BH5y)fQi+~$zddraP53g zp*-ras<+uR2n!TUwc=^xl$of2rw3yi@xE4^yb~|2b)HnBlC)u`byFy)g6^2=Vq}rk zO0S)IEK}9jiF>T)JM8Ag#40}(r+}5h+0WjZ%i6F@Hh3xlfg37UunlGT_&Xmy)4p)~ ze#@xmJHhU!!jfy}ca+llXNW)8{NmrmaEV*u{<*)q(bzXb2*IID-wps^gQyx;Cecw( zU7~DQU?vd#C1hImh(V{m3_ELj8wFGT3uHuoO!tFLY^aemAj2^5ogc>Fvr7 zav1-qrpWuw_F4iJVL`Jv@R&RD32q@SB%B)mV6oZF*SQ}00|Das2sCI?-X2C(lyk8e z*~cjkPN*p|b6aNqx8r1h$5?jaFEJ5(@sj}a1^OTK$S5Tnsv<-WWB??~Cm|hZ2gP&1*Q3Vo)?@0S z7ZB#9_BpA?d~@^JRLP63x=4OL5dj-SjW4E#My;k91Xn)nz!%9b+KUb*eD<09Qfw^; zzSE;c0-T%v6DL!FcUKdV59ewuc3K2~=Y9>O49EJZEB4Er2{kO%bElp=GBLU2Nt_=7 z_gcQ=A0eIooI~H>U%`u7$}eNy0?W8F!c86*>a zVZund?+lVkNw16vD@JOl=u&k>@%$1odrg3_r#DYwNgmSQBZHyxI%o-rHdVJPkIg}k zFz*-CD%KvYQW1z$X=#K?eqHHM35$L|vkA=?mJ~U&&NdU4MRY04*Ayc!$)-oJMCd72 z0$4A1_4R2JZ|4+P zPP~$vCeN8TCBU5nbaiD+KaYgX#Z-5x3e&zdOG65%&V*=%hRT0e(EJ5#5M9<;c|#T9FkdoJlc@4>u(s=dJMj(JBbAjUbz`Y%(k%d3=g5^R(X+%@ikwF=~s* z$zB2=``(yYEJ{)qHLi*Sy#m&xiltu})PDOvzt%9Dh}NQ`;qjCD$9k?%%9bg>j7#i) zmXJ8yb(EHVEGGe52ZtX64us0K!oV18*|-8Mm6KQ!M&@kbYqA;9+}nX~a@N)v(vnn7 zwu_iW*1@z~JtEC!^44p>(%$<^z5)@mXm>Y(CNjfyE4CyJZ$nhW-mOK-${X0D{1NO3 zM1VHJ&-jgi} z_4S;1x~C}u5Mdyd5^`wN zuMy!N^xf>1J*_B+qSoF3x$wTke8rrH`FSePl`POza*Lc+1~NOwq%EBq!4-R^b$@9Z zG^t{NUJ}AC^L`BMf}&u*U9l_@D4$Fn6jnG_$2OVyFYJk(8(UaO%$V_P8F@6+f$3%Q%Im_@xHZrD2Rd z!+xF%C@OC71f-bck5RyxV}0_e(V8vL`eJUnl!wzRm@CIJ`ZQ}wth9U>e~UkGgQQ#m z6t8y_^S6igA!=kn<}lM6sqfe;Lc zgowe!=*)p7d6Q047Iz#OXDYpv$OTOnLnI8tyk|fX&Kejr2Zb;!n+uGoVyEReW#PQ^ zasi?NE*^re-->M33{QyJ6jgnI`2p6xpN(UM@KRLSFE%CA{%f}a0)Gdn_Jf6dGUtgC>+>+9VEUkew&R4v}4kg!Uksm=;!+;Nshjq1S~jA2Ff3Rr4(vK1mKtFa_P6EE5HxlT`a^Tp^<>o6QcY;=Z{K{rek!1Yiacov6hE{-*wa z0Y-XUE&rzQp`n0?ST-7zzrW#srT~mFlZQw6@%R0(N2~a!ODX+52QYL8=;8NZAI9Iq z1Tdg8(z0y;VnrjlAHWB-+pp9$EA-`OeXZ`b|+(hzv!bN;?2(D56P z|0^Y);&0dgPL4kLD?bGAhUX*cFUb_sK$S|R|0fh$W}A8VjD@ou0D~+CNs$211SZ#C z5)*wp447Oj&A4C~V8wApt2kUp6R;Av4#ZEAjslTREnXQVN`O3|M}{FK2K4L^CrM1j zBH3s_8JfVVupuchPFQvy5*Q7rgqDr*1T69hOJKKw{tnQpsfL^qA`VPtbVz0-nIfgh4PYV)*YYBWWy9d(;0n2Ke8}HAuh%FeAmt=)e7enGJ|% zX3+*3)m9X)2m;T2PH^jc0I)?3t$mu20g|3c_TRVvod*9mcam@dR=s3*#S|Ouk!iH08t_*)Mm&)SWZ}GL!$`-3<64*#OQpa#3K{wZ6*MS2Fpes zqCi1tx|~ugpr_{+>$B*O9nr*m>fv^L4Va-=01%FV3QHLA2!AIkNEYa5uK5$%--+@B zgk3}@Kl_UjQd6MsA4~bRk1vOij`9H}b?Y+y=RFcKz=$FjjArlu0$~ZjU@HYR;y)M! zvZ;jCZZ!YAb8-ea+yOBQ!C#EPegIv^w#v-?m7nbf$Uh40dqgJ)A`G}_$i7}b(q9a= z0`k2iWRd=Mjm`>K$Mi^<^RN8v3;+{+#;kwOx&mT>uF1TTs-K7$eh)#TGvjgpz4DkW z`QPZraIwjS&hdYU>Hj}5p^uO9OMCn~v5!d~fJVew_UT~d+k3h#ZUhAA|7*%wB|%^t z{_3#YCfd7MGgm6Q`DgUA$SJtOpxswVkB`*)3o=F4xp zKiuEFAN}}ST6HL^3nzdWB9I~qoRda%jbS^xgPYxsG8?ErU=Q);f9jA{Y_MMpubM`X z(1fl7ZpK6E9RyPWW6GX#soK;OmtVOTG~*i$#s6Z1lmMWbii9Er2!qAB-41_h;rH~S z)~frQ5pu==xf0?C{wq%z*jmPJ{Zv*8XtID=yp}zrcqr0rSSbB^E`3J-Ds9NM%o)?& zPOmmH$_I`x^6}&am<|9xutW0q&+x|>DOfdyNC_7+PPQ1%JKOnj(v@Lq`q*oS$fa>o z@wx6B%GR~&NRk2UWd$3~dvk{#>;D*gxvq+H4>g(`Ks+N2yXuOoN^Gq^ORLV2q65y! zenAMkLPeIO+>Q3BC@&wr! zup7wiLTPKfPtX3mBnR{rtyC_M23s?HjeIW++bO7B`;;9nhtsRs^zGmiHxVLG1Bpqc z=Ly1$y)FbEP<8?fq^(ekfl4V-wRpY^MFanv5^1Pb#!=KX@_hGGJha2dJ;(A()2EAZ zh+hi;Z030g8+4<{R#%+Ud{a)v70vh=PLY$ASly@dv#K$cGLi{coelVdGoqkH1C9fU z4Ec^bJq+Cw+c^V&itY6&8wdC8f|4b%fCWfBI!0QgLzU#jRtLc3O@<~|@A?cVDigaMcaus`PZ8GYUN9OxT47+#?;Sp#WfSeGk zbFI$4e6iY4vihE?QS$aiP(18E{Y1m2+>5jYP`-1%LRj1`8fdk2q3nY5FULAN1CRhB zr*!lHT8w-;H{oGvxsS=XQ3h+n5*IEL%mJ~HzpDER=O3L_z zGp=oi^&bq1Ihv%d(iSM6Z2Q^uK_g9;2MCkYd9Z$u11D`p$hk&qrLZ&?~ z%nG)~qzjg@4D*&xe^0DHlDAjDPbR!f3&b8s{BBveBi=#gF%9$VJP7S9z$Aj+MZ+s_ zdz=9pF4hT^{zP6Y@l@@5XPk!^zuUD9Ac@8$#WqGnS-9LGtH5Mb0>-zZ{W_vUk0ns) zs>8-)t_^?Kt8BLq`8_a!hDr3CvP1Gkki)JEq<=BJ{q91?WlQMcc7mgZHid_CiEYBb z@9zA-eu;-xtvdyod7P~@iS*Ko3(x23WaA)|3L#{Y3YYC}r!dPN-<^IFDGco?hGE{* z0ImaGunZR-%b3fp`JBxTUWswR;d+MH#_9Ao$&u2ukp_@(;dyos->ub2YzC)}SzJJb#? zlFM+BB&f7JT+g)YvW+ah`k*!<`9j2Dl?uF(W@8=0-^kb`NqlBCH{oVS+$Yn+bf;I|>luh)ihb@>|o=i`^l@D1!E zLeC2;IscFK)YdISki^4r7il-P@nXcgRgSurLfYt$nbH*=@p?^%8=nqaQX7hFcd#oZ z^0Y@edbGija0Z&21L0@4+P)JBs;__6Lw$&S~NW4?;XUb+uH+V>9W4D z;A=sjjR#RI##ekH!PIQ(*{E#d7q$362h71M9@^Hx^#gkd{*JvRT1yD*z;Y5z+~&vJ zmO#KfjsA@EvdYQnE1>k1YSh|J?C}?EUF<5QSazq`wU^H=&+PzpoAQ zq%V)NYExq7T|EFtoxU(sj3NeiGuVu{h~~soCgOx9-Pkq`*C!p4ZrwJ&slatx;*0pz zq5~He(8*VYPO8_>-rfkx_}#p5P8y`)v5M3yEuXyl$*8{u~%XUfXt>OntKfF zptfR9<1+NhmJY!}us#m!k{&_)nx5t61N5wauswN#6DMX9H%K->;(AFOacc76r8**$DgXNEw0@iZP0TtLjA$f{syK2vn82XA1 zZD9aK;@e?*z?dqi%-YcdPPWPfeXikbJ$rk5L!3nDmSP<{i|Uk7&M_d0R*7DVA?W1c z^!dIeTMJT?2vEfL&U-QluyWuSX$+LR{3bMZ`>n{%8RT+l8N%RnJ!>HiMdh7 zO=BJDfh1slM{k7DCMFTkMJBbU1oNFwZFqN2G{m~lO#o>^$-l4AI4>TRU)ZCrSKk}? zJG6hj@ALHgim|ORzawdaou#0tht=yMYVK73y*vpz=F8hixV_JZqT%x~GE>P6(F0y9 zgw^BHNxQK!ck%gW`2p4t>lul~Z6yk`g(ZmY>&5@o&Xq?)*|&f0ri@AkEyz9@OL>%i z$r@wGGS9~Dm)_p@{LXp*`u+1e z=XXwj&3)Y0_u9VK^0~hE?SAAww8-IPJy&UB9T3>H((%Wn-cpq6oI;NEb%w_1N9dC@ zy*^Z)pzWeL1WW*1wv~`qUB^(D2f2;lF?s#`{gO_n8k@C~@yiZ&HlXp_9GR^jp4qbsJ{j zgyS)9%lV0LC#U$Ru8ij~VrAFJ(I|zzC#Ouvo<59B z*bh6~nX!DGY!cP=o+hOB#Lf@Q2~#tSPtmkPxznEar;7(}@Tw(L$#=EJoTOE4wdY>L z_eW-2bp624KPLsX*O-X=C;AL6*ei#bHKIv1>Kma6Q7bVzD zb{ehNVM3Oo^i`kzGow1<(EWj#-%ZT`U-bxfZr#Eoj z1wGj$9XI=JKP=fVwxO&^y}5Gm4@Dn=RB=U;z7!Ky@0j<3k=0LHh`W-Vxcd)Zh~@uc zn=5WV34Ei`zVO(RKgA7Vvy{kI6iJ7*3T@Qqh7^o?!KPPFV2c>6H2GO#c_53T(ciD{ zqsLc-CO$MpU3c30>29h`(A0mM7Sy-#Klui0x*WnOdL1LqH12eu%qwf^w#R|f{l{hD zsK@w#+wTq}G0L5#arnkeu{*J*MGJRI251pwCzO!nziJ@SEI_5aFMlgRd*c--JmZLz z6fkUlYg4g_eC^Nw;yx5h9sL1Oqy!r*Zc|egr*)|cGpU`rddDi^$I42HBYZ;U9vwD` z*hSGd+vPg%{vhM6+|6J`@95OzOZxc4GZS^Wo)hyI zC-pX?f^DXU=oc?ZBIIHYon77NF7k3XZ=kP8@3Ws`ysNj@hJ%6>U1*Zb9xYnIl-8$H z#6x0(Bcu9_Y4$o4vZA-~yXyoBc^NZXj`ONB{G(dy`73XSFP|Ht#mDv>6GuIPO^0$A zj&i=!H_?`2^WIw=<&S}4z%W+j0U_J(^Q_7tBR|%=&h5z$C=w<|XSIVV^V+?AZm9VD z*mb)-Otd?ybL-jSc9WVx+kWg*o1DysX)_sT-rbXk=>L|UADwk2bTHB(qcTnUtMpFU z>D4Y^^s7BW->bDI;4%Q)>d!wqY{l3`?((8pQI2i~K@IYIQOBSUur&L&4sBQ~BzEI8OQTJgY}*R&Dad3l{{jbJ~jEEu(Z| zWvTRIig^Ka%OS=Rw2&vf7p~2rUmH$QBAXR`=Jwy7S^748!~Re5GGU!@BHya0uuSku z$N|CLnvmB{g9k>~^j{O$A_MIk^%r=wRoVv5-WZP-{4zyKzAr&bE^b-DQ>U!%zK|vL z7p2#PTy&fEYjDi)D^YpAl-XJNXTYfo;wS-Bd=!3bt^;lQat$&v!1Ma6eWb$nLv@>g zoNA5^>uC*-eyzhJCFva!agJKD$e~q;mKzY10hsd&qGCb3g#*U`9-1K~TGm{5T{A^o znIL$>Vs0d|ombcz&n}jqHrb`XsVBI0vR;CAG2`8X+v&9Hi3?U&p*>^81B_*rvE94E zS=>$h+1EvcyrmQ}pFb6jq$I0n`NevgC=|R>I&QI^+1zp2;LuWQJ>i?PipJR4eW{My zVfQAawBstN@SdZ8Y=O9KnVMZ4e1>D{0FmiC7pdRpNj%Gd(|4|h=K&8Ct5u*?8P}u( zSd^L7fbc-|yqIB(OQ-dFWY*mBQL1YW=&3P2w_rbid%HxEw%y!v9!jm5x%W3Y-QDqe z!{`%$M8=vPl-jh`%uO;OiU0}}-$*ZeK+h8>lEuDyK zC$uuhDtb4xINpm475c`vRb68{UvajV317bP>D@HP4sR<#cek|V%vDqS9GRY)Jum3o zZyDywu;-q~E5vcdl*8V5P2A!9Bjnn4rKeSw$l&9xlRDjG&x3+r7P(2+B1<1m0o-03 zTwS`Q`E8GOBvW9y4*xfiJN6k*1EE=KY-xY!y7SR2Z~bU1X>%(Dn;L zK{lYgJo0fbih~bJdR2Q$zcpSc>)Mqm+^cCIHYe36Nps40TzW6l*uUA+x~1T_MMe2L zk!=^9AznyJ9_`_QXXt@S>-W0n_)pL219C2(0u-j7Acsvd>iHgNUSVx6T9V!R)FDB9FP=F z$EFl*Cb5-FhuumJPtgaQBwioKI?xip!{0Qu-p?yqW-{VA9~u&*B}gS`nc}UXb#%ypN(haSV&gVbh_HedaPDN4k`O82&Q*B{F`LPewt~A)=adF@Ug>(CZm~BJq7r5- zuPAWbHFE3%cr!_adUwVo&q{hZ(sKGbq%&lA}3I+-Es{_kbRuA<}Ol z>q!g;o01uCk%|ET$~N7$*FqTW$Tl`%2Xp<;%H~x~h>gCq|J<2WuF%78 z;UvfEG1cbk1t5*xA!X4?{D_VVts1zzyd8bZ27g@ZX+7c2lz)lf*Gb{x=5hba7UOuu zFxZN)$_t9DzMi?I8K3%{6xDdPmW&*(iI#G^VYxwTo&wT-1tT*kt7b4I z`KFov$cblOTGZ5z|@>?dII&#koe4 z-fmG1rZ^BU++}7w?U7ixKfc~X+%l4+ysr5ffpMkHEiB;shgx*AKJ>Kw7wgFaL^6Ds ztaC=~&edk`{!(_w?+YE=WxZUM4AohqH*g49Dz@L*O3(IAnl*1`d_=3K(u$GWcR{&&o{Ud3S~fBW40 z8!>sw_T$1sSrChzrF3*{tYz%Rf18MV9QF_^0JXNOmHn%$YBw!bYaf0Z+uBHJ66s&^ zALpE~P#p`3Qa(<+qCNsJsQTup7}CZnyvJ<6SJPC7A{YuVA=}BJ`#Zg|ghKqxj5-!gocND6KO#PRDy~vSE)tetb9dwy_ zBd(QHq*T$F7`uq^g%YhS@Wlh33YD=tbL4WB$EP#}S-7qH;WF(WjxEoQsc1cJYcCQ< zqQPekGcOw>5250D7vt!sAmp zNX)#-1LT$Ub^oH4Jt)j1gy^cHD;|}MqY_f^I64wckxsH*ICWb^=w?Yt1k@_rS;Jkq z4l3DZF!6CBq$DsiiOPAH^lL&If^^GU6?ZK>mk==N3f3f5z`|Q^!Cr*0lS6t{`Gyy)h7eVOlbk zWu(U|z&{E-jDdVHGSh6qL$qgQ`#S&|Mbp0nQxtl4vL zsv{^^!Ke{q2Zu0HdCPlM*uW>ak}rvO!QEM9{sz!_lZ|AwgNSC%NSu4 zdycZIttCjY{L4O!DhqT+_qt)&qo51uvoi9#!~PFRyxdJP1dfJr_ZSc#xPSwM5bA4C z@ip?0ha?RboI0y&BkZu6ecnNHLu`*Br1 z*xWtzd$nw}K(tm_7(Vq7kixW!xeNv1m7}u;DiK`LLgB=aejS0R|EFm1=>${ojFDQY zyI>7{p$MiAxVfT)_LGu|fSh$ZVe z`(!w>(mVFb$N&sT)|X&(1U8bn`Qt@U4jm13l5-&ByOxdzy2EmJQbxEc*tbHDd zL@$HA0W_H-NE?v0Ef&fm;hnJ0H`Vvfgx!Dp$RRYs^xKq5aM9E0k*hiOj zkb;5&)IkBJRy%THcx;>imt^r607k)&Pv{%9)*bt1%^UtRTw#$?1@ z*dN22pWyv_jLhqY-k7aevvvNxjxZeaG44y_xs7R8Vez;7btH*{g?cBmxHW!c+z-6{ zhGPmNL3pE{%^-kUHV8@X69xn-C|tuxzwaU&*@>Y;#VM2bi922)WPi*H%rps2zr~g& zB=fH{a#N?O_n|KJt1TOtPlXFVrX1kEb?iilKi_Y)etYY8Z2iu}-v#1#IsM&ye)q)R z2;%<~Z)J;x=+Z9?G6atUUGYL+wE^F1+jF81GfJSflJz}CqVN`7;0C`KO-MFU^D@Q;chu@OvZM42Ag kVXXSgKmVUh8TmmcS>7&BkNwL4K5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \textsf{value coupling} + \textsf{volatility/noise coupling} + + \textsf{continuous state} + + + + \textsf{generating observations} + \textsf{The 2-level Continuous HGF} + \textsf{The JGET HGF} + + + $x_a$ + + + + + $\check{x}_a$ + + + $\kappa_a$ + + $\omega_{\check{a}}$ + + $\omega_a$ + + $\check{x}_a$ + + + $\kappa_a$ + + $\omega_{\check{a}}$ + + $\check{x}_b$ + + + $\kappa_b$ + + $\omega_{\check{b}}$ + + + + $u$ + $x_a$ + + $\omega_a$ + + + + $u$ + + $x_b$ + + + + $\omega_b$ + \textsf{observed state} + + + + + + From 288642f0c84f9da9481dd44356352f9b03627b7b Mon Sep 17 00:00:00 2001 From: Anna280 <54855627+Anna280@users.noreply.github.com> Date: Mon, 22 May 2023 11:18:06 +0200 Subject: [PATCH 02/24] deleted png --- docs/src/images/HGF_structures/JGET.png | Bin 30453 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/src/images/HGF_structures/JGET.png diff --git a/docs/src/images/HGF_structures/JGET.png b/docs/src/images/HGF_structures/JGET.png deleted file mode 100644 index 7ad6dbf886d640ad9d41f84f7314e546a73cfc57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30453 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 Date: Mon, 22 May 2023 11:39:36 +0200 Subject: [PATCH 03/24] added table to theory part --- docs/src/theory/genmodel.md | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/docs/src/theory/genmodel.md b/docs/src/theory/genmodel.md index fe29cc5..e3c7a55 100644 --- a/docs/src/theory/genmodel.md +++ b/docs/src/theory/genmodel.md @@ -47,4 +47,76 @@ x_3^{(k)} &\sim \mathcal{N}(x_3^{(k)} | x_3^{(k-1)}, \, \exp(\kappa_3 \end{align} ``` + + +```math +\begin{table}[H] +\begin{center} +\begin{tabular}{ccc} + \textbf{Main parameters} \\ + \hline + \hline + evolution rate & $ \omega $ & $x_s$\\ + \hline + initial mean & $\mu_0 $ & $x_s$ \\ + \hline + initial precision & $\pi_0$ & $x_s$ \\ + \hline + value coupling strength & $\alpha $ & $x_s$ \\ + \hline + volatility coupling strength & $\kappa$ & $x_s$ \\ + \\ + \textbf{Optional parameters} \\ + \hline + \hline + input precision & $\hat{\pi}$ & $x_i \ b_i$ \\ + \hline + category means & $\eta$ & $b_i$\\ + \hline + drift & $\rho$ & $x_s$\\ + \\ + \textbf{Main states} \\ + \hline + \hline + input value & $u$ & $x_i \ b_i \ c_i$ \\ + \hline + posterior mean & $\mu$ & $x_s \ b_s \ c_s$ \\ + \hline + posterior precision & $\pi$ & $x_s \ b_s$ \\ + \hline + prediction mean & $\hat{\mu}$ & $x_{i,s} \ b_{i,s} \ c_s$ \\ + \hline + prediction precision & $\hat{\pi}$ & $x_s \ b_s$ \\ + \hline + value prediction error & $\delta$ & $x_s \ b_{i,s} \ c_s$ \\ + \hline + volatility prediction error & $\Delta$ & $x_s$ \\ + \\ + \hline + implied learning rate & $\nu$ & $c_s$ \\ + \hline + implied Dirichlet parameters & $\xi$ & $c_s$ \\ + \textbf{Additional states} \\ + \hline + \hline + surprise & $\Im$ & $x_s \ b_s \ c_s$ \\ + \hline + prediction volatility & $\nu$ & $x_s$ \\ + \hline + auxiliary prediction precision & $\gamma$ & $x_s$ \\ + \hline + precision-weighted value prediction error & ? & $x_s \ b_s$ \\ + \hline + precision-weighted volatility prediction error & ? & $x_s$ \\ + \hline + overall prediction & ? & $x_{i,s}$ \\ + \hline + overall prediction error & ? & $x_s$ \\ + \hline +\end{tabular} + \caption{\label{table:variables} List of variables (either parameters or states) for continuous $(x)$, binary $(b)$ and categorical $(c)$ nodes, either input nodes (subscript $i$) or state nodes (subscript $s$).} +\end{center} +\end{table} +``` + Note that in this example, all states that are value parents of other states (or outcomes) have their own volatility parent, while states that are volatility parents to other nodes either have a value parent (as state $\check{x}_1$), or no parents (as states $\check{x}_2$ and $\check{x}_3$). This is deliberately so, and we will see these two motifs - every state of a hierarchy has its own volatility estimation, and volatility states only have value parents - reappear in the following chapters. From 8e22b02ffa9928211f30d3cbfb2647e75508b8ba Mon Sep 17 00:00:00 2001 From: Anna280 <54855627+Anna280@users.noreply.github.com> Date: Mon, 26 Jun 2023 12:03:54 +0200 Subject: [PATCH 04/24] svg versions of HGF structures --- docs/src/images/HGF_structures/binary.svg | 1942 +++++++++-- .../src/images/HGF_structures/categorical.svg | 2972 ++++++++++++----- docs/src/images/HGF_structures/continuous.svg | 1790 +++++++--- 3 files changed, 5068 insertions(+), 1636 deletions(-) diff --git a/docs/src/images/HGF_structures/binary.svg b/docs/src/images/HGF_structures/binary.svg index 4911d28..699a3d8 100644 --- a/docs/src/images/HGF_structures/binary.svg +++ b/docs/src/images/HGF_structures/binary.svg @@ -8,12 +8,13 @@ version="1.1" id="svg1670" inkscape:version="1.2.2 (b0a8486, 2022-12-01)" - sodipodi:docname="2-3-level.svg" + sodipodi:docname="binary.svg" + xml:space="preserve" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \textsf{value coupling} - \textsf{volatility/noise coupling} - - - \textsf{binary state} - \textsf{observed state} - \textsf{continuous state} - \textsf{2-level Binary HGF} - \textsf{3-level Binary HGF} - - - - \textsf{generating observations} - - - $u$ - $x_a$ - - - $x_b$ - - - - - - $u$ - $x_a$ - - - - - - $x_b$ - - $\check{x}_b$ - - - $\kappa_b$ - - $\omega_b$ - $\omega_b$ - - $\omega_{\check{b}}$ - - - - - - - - - + inkscape:transform-center-x="1.6989203" /> diff --git a/docs/src/images/HGF_structures/categorical.svg b/docs/src/images/HGF_structures/categorical.svg index 80d8772..74ad7fc 100644 --- a/docs/src/images/HGF_structures/categorical.svg +++ b/docs/src/images/HGF_structures/categorical.svg @@ -12,11 +12,12 @@ inkscape:export-filename="Categorical_HGF.svg" inkscape:export-xdpi="98.818092" inkscape:export-ydpi="98.818092" + xml:space="preserve" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \textsf{value coupling} - \textsf{volatility coupling} - - - \textsf{categorical state} - \textsf{observed state} - \textsf{binary state} - - - - \textsf{continuous state} - \textsf{The Categorical HGF} - \textsf{The State Transition HGF} - - - - - - - - - - \textsf{generating outcomes} - - - - - - - - - - - - $c_1$ - $x_1$ - $x_n$ - $\dots$ - $\dots$ - $c_n$ - $\omega_1$ - $\omega_n$ - $c$ - $u$ - - - - - - - - - - - - - - $c_{1,1}$ - $x_{1,1}$ - $x_{1,j}$ - $\dots$ - $c_{1,j}$ - $\omega_{1,1}$ - $\omega_{1,j}$ - $c_1$ - $u_1$ - - - - - - - - - - - - - - - - $c_{i,1}$ - $x_{i,1}$ - $x_{i,j}$ - $\dots$ - $c_{i,j}$ - $\omega_{i,1}$ - $\omega_{i,j}$ - $c_i$ - $u_j$ - - - - - $\check{x}$ - - - - - - $\omega_x$ - - $\check{x}$ - - $\omega_x$ - - - - - - - - - - - - - + sodipodi:nodetypes="cc" /> diff --git a/docs/src/images/HGF_structures/continuous.svg b/docs/src/images/HGF_structures/continuous.svg index 7f2cfdf..8b1c781 100644 --- a/docs/src/images/HGF_structures/continuous.svg +++ b/docs/src/images/HGF_structures/continuous.svg @@ -8,12 +8,13 @@ version="1.1" id="svg19492" inkscape:version="1.2.2 (b0a8486, 2022-12-01)" - sodipodi:docname="2-3-cont.svg" + sodipodi:docname="continuous.svg" + xml:space="preserve" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \textsf{value coupling} - \textsf{volatility/noise coupling} - - \textsf{continuous state} - - - - \textsf{generating observations} - \textsf{The 2-level Continuous HGF} - \textsf{The JGET HGF} - - - $x_a$ - - - - - $\check{x}_a$ - - - $\kappa_a$ - - $\omega_{\check{a}}$ - - $\omega_a$ - - $\check{x}_a$ - - - $\kappa_a$ - - $\omega_{\check{a}}$ - - $\check{x}_b$ - - - $\kappa_b$ - - $\omega_{\check{b}}$ - - - - $u$ - $x_a$ - - $\omega_a$ - - - - $u$ - - $x_b$ - - - - $\omega_b$ - \textsf{observed state} - - - - - - + inkscape:transform-center-x="0.25901894" /> From ad6d666aa40ebb428879385f5a21d6bbf325f4fe Mon Sep 17 00:00:00 2001 From: Anna280 <54855627+Anna280@users.noreply.github.com> Date: Mon, 26 Jun 2023 13:00:39 +0200 Subject: [PATCH 05/24] updated svg files correct scaling --- docs/src/Julia_src_files/the_HGF_nodes.jl | 119 +- docs/src/images/HGF_structures/binary.svg | 582 ++- .../src/images/HGF_structures/categorical.svg | 16 +- docs/src/images/HGF_structures/continuous.svg | 318 +- docs/src/images/states_nodes/all_states.svg | 3894 +++++++++++++++++ docs/src/images/states_nodes/binary_nodes.svg | 2720 ++++++++++++ .../images/states_nodes/categorical_nodes.svg | 1224 ++++++ .../images/states_nodes/continuous_nodes.svg | 3756 ++++++++++++++++ 8 files changed, 12052 insertions(+), 577 deletions(-) create mode 100644 docs/src/images/states_nodes/all_states.svg create mode 100644 docs/src/images/states_nodes/binary_nodes.svg create mode 100644 docs/src/images/states_nodes/categorical_nodes.svg create mode 100644 docs/src/images/states_nodes/continuous_nodes.svg diff --git a/docs/src/Julia_src_files/the_HGF_nodes.jl b/docs/src/Julia_src_files/the_HGF_nodes.jl index 4610b48..bdaa053 100644 --- a/docs/src/Julia_src_files/the_HGF_nodes.jl +++ b/docs/src/Julia_src_files/the_HGF_nodes.jl @@ -2,120 +2,13 @@ # In this section we will cover the types of nodes, their parameters and the rules for structuring your own HGF. - # ### Overview -# - [The Node Types In an HGF and their states](#The-Node-Types-In-an-HGF) -# - [Building principles ](#Building-principles ) - -# ### The Node Types In an HGF - -# We have six types of nodes in the HGF: binary (state node and input node), categorical (state node and input node), and continuous (state node and input node). - -# If a node's parameters are configured with a default value, they are stated below as well. - -# We provide an overview of the states in each of the nodes. - -# 1. [Binary Nodes](#Binary-Nodes) -# 1. [State Node: States and parameters](#The-states-of-binary-state-nodes-and-parameters) -# 2. [Input Node: States and parameters](#The-states-of-binary-input-nodes-and-parameters) - -# 3. [Categorical Nodes](#Categorical-Nodes) -# 1. [State Node: States and parameters](#The-states-of-Categorical-state-nodes-and-parameters) -# 2. [Input Node: States and parameters](#The-states-of-Categorical-Input-nodes-and-parameters) - -# 4. [Continuous Nodes](#Continuous-Nodes) -# 1. [State Node: States and parameters](#The-states-of-Continuous-state-nodes-and-parameters) -# 2. [Input Node: States and parameters](#The-states-of-Continuous-Input-nodes-and-parameters) - - -# ## Binary Nodes - -# ### The states of binary state nodes - -# - posterior_mean -# - posterior_precision -# - value\_prediction\_error -# - prediction_mean -# - prediction_precision - -# ### Parameters - -# - Value coupling - - -# ### The states of binary input nodes and parameters - -# - input value -# - value prediction error - -# ### Parameters - -# - Category means (default is [0,1]) -# - Input precision (default is infinite input precision) - - -# ## Categorical Nodes - -# ### The states of Categorical state nodes and parameters +# ![states and parameters](../images/states_nodes/all_states.svg) -# - posterior -# - value prediction error -# - prediction +# ## Building principles -# ### Parameters - -# - no parameters in the categorical state node - -# ### The states of Categorical input nodes and parameters - -# - input value - -# ### Parameters - -# - no parameters in the categorical state node - -# ## Continuous Nodes - -# ### The states of Continuous state nodes and parameters - -# #### States - -# - posterior mean -# - posterior precision -# - value prediction error -# - volatility prediction error -# - prediction mean -# - prediciton volatility -# - prediction precision -# - auxiliary prediction precision - -# ### Parameters - -# - evolution rate (default is 0) -# - value coupling -# - volatility coupling -# - initial mean (default is 0) -# - initital precision (default is 0) - - -# ### The states of Continuous input nodes and parameters - -# - input value -# - value prediction error -# - volatility prediction error -# - prediction volatility -# - prediction precision - -# ### Parameters - -# - evolution rate (default is 0) -# - value coupling -# - volatility coupling - - - -# ## Building principles +# The following rules apply for connecting nodes, when customizing your own HGF structure: # ### Binary state node rules: @@ -123,6 +16,8 @@ # - Can only have excatly one value child # - Can only have a contionus state node as value parent +# ![states and parameters](../images/states_nodes/binary_nodes.svg) + # ### continuous state node rules: # - Can’t have binary input node as child @@ -132,8 +27,12 @@ # - Can’t have the same value parent as volatility parent # - Can’t have the same value child as volatility child +# ![states and parameters](../images/states_nodes/continuous_nodes.svg) + # ### Categorical state node rules: # - Can only have exactly one value child # - Can only have categorical input node as child # - Can only have binary state node as parents + +# ![states and parameters](../images/states_nodes/categorical_nodes.svg) \ No newline at end of file diff --git a/docs/src/images/HGF_structures/binary.svg b/docs/src/images/HGF_structures/binary.svg index 699a3d8..78c02e0 100644 --- a/docs/src/images/HGF_structures/binary.svg +++ b/docs/src/images/HGF_structures/binary.svg @@ -2,9 +2,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/images/states_nodes/binary_nodes.svg b/docs/src/images/states_nodes/binary_nodes.svg new file mode 100644 index 0000000..311c626 --- /dev/null +++ b/docs/src/images/states_nodes/binary_nodes.svg @@ -0,0 +1,2720 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/images/states_nodes/categorical_nodes.svg b/docs/src/images/states_nodes/categorical_nodes.svg new file mode 100644 index 0000000..7e5940b --- /dev/null +++ b/docs/src/images/states_nodes/categorical_nodes.svg @@ -0,0 +1,1224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/src/images/states_nodes/continuous_nodes.svg b/docs/src/images/states_nodes/continuous_nodes.svg new file mode 100644 index 0000000..76e920a --- /dev/null +++ b/docs/src/images/states_nodes/continuous_nodes.svg @@ -0,0 +1,3756 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f2c7abef844a57fc1a425a11509a7c2f2beb1888 Mon Sep 17 00:00:00 2001 From: Anna280 <54855627+Anna280@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:40:13 +0200 Subject: [PATCH 06/24] things --- docs/make.jl | 12 ++--- docs/src/generated_markdowns/dummy.jl | 1 - docs/src/theory/genmodel.md | 71 --------------------------- 3 files changed, 6 insertions(+), 78 deletions(-) delete mode 100644 docs/src/generated_markdowns/dummy.jl diff --git a/docs/make.jl b/docs/make.jl index 3d0cccf..f6bd8a8 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -61,12 +61,12 @@ makedocs(; ), pages = [ "Introduction to Hierarchical Gaussian Filtering" => "./index.md", - #"Theory" => [ - # "./theory/genmodel.md", - # "./theory/node.md", - # "./theory/vape.md", - # "./theory/vope.md", - #], + "Theory" => [ + "./theory/genmodel.md", + "./theory/node.md", + "./theory/vape.md", + "./theory/vope.md", + ], "Using the package" => [ "The HGF Nodes" => "./generated_markdowns/the_HGF_nodes.md", "Building an HGF" => "./generated_markdowns/building_an_HGF.md", diff --git a/docs/src/generated_markdowns/dummy.jl b/docs/src/generated_markdowns/dummy.jl deleted file mode 100644 index 89f36cd..0000000 --- a/docs/src/generated_markdowns/dummy.jl +++ /dev/null @@ -1 +0,0 @@ -# For pushing the folder diff --git a/docs/src/theory/genmodel.md b/docs/src/theory/genmodel.md index e3c7a55..a696750 100644 --- a/docs/src/theory/genmodel.md +++ b/docs/src/theory/genmodel.md @@ -48,75 +48,4 @@ x_3^{(k)} &\sim \mathcal{N}(x_3^{(k)} | x_3^{(k-1)}, \, \exp(\kappa_3 ``` - -```math -\begin{table}[H] -\begin{center} -\begin{tabular}{ccc} - \textbf{Main parameters} \\ - \hline - \hline - evolution rate & $ \omega $ & $x_s$\\ - \hline - initial mean & $\mu_0 $ & $x_s$ \\ - \hline - initial precision & $\pi_0$ & $x_s$ \\ - \hline - value coupling strength & $\alpha $ & $x_s$ \\ - \hline - volatility coupling strength & $\kappa$ & $x_s$ \\ - \\ - \textbf{Optional parameters} \\ - \hline - \hline - input precision & $\hat{\pi}$ & $x_i \ b_i$ \\ - \hline - category means & $\eta$ & $b_i$\\ - \hline - drift & $\rho$ & $x_s$\\ - \\ - \textbf{Main states} \\ - \hline - \hline - input value & $u$ & $x_i \ b_i \ c_i$ \\ - \hline - posterior mean & $\mu$ & $x_s \ b_s \ c_s$ \\ - \hline - posterior precision & $\pi$ & $x_s \ b_s$ \\ - \hline - prediction mean & $\hat{\mu}$ & $x_{i,s} \ b_{i,s} \ c_s$ \\ - \hline - prediction precision & $\hat{\pi}$ & $x_s \ b_s$ \\ - \hline - value prediction error & $\delta$ & $x_s \ b_{i,s} \ c_s$ \\ - \hline - volatility prediction error & $\Delta$ & $x_s$ \\ - \\ - \hline - implied learning rate & $\nu$ & $c_s$ \\ - \hline - implied Dirichlet parameters & $\xi$ & $c_s$ \\ - \textbf{Additional states} \\ - \hline - \hline - surprise & $\Im$ & $x_s \ b_s \ c_s$ \\ - \hline - prediction volatility & $\nu$ & $x_s$ \\ - \hline - auxiliary prediction precision & $\gamma$ & $x_s$ \\ - \hline - precision-weighted value prediction error & ? & $x_s \ b_s$ \\ - \hline - precision-weighted volatility prediction error & ? & $x_s$ \\ - \hline - overall prediction & ? & $x_{i,s}$ \\ - \hline - overall prediction error & ? & $x_s$ \\ - \hline -\end{tabular} - \caption{\label{table:variables} List of variables (either parameters or states) for continuous $(x)$, binary $(b)$ and categorical $(c)$ nodes, either input nodes (subscript $i$) or state nodes (subscript $s$).} -\end{center} -\end{table} -``` - Note that in this example, all states that are value parents of other states (or outcomes) have their own volatility parent, while states that are volatility parents to other nodes either have a value parent (as state $\check{x}_1$), or no parents (as states $\check{x}_2$ and $\check{x}_3$). This is deliberately so, and we will see these two motifs - every state of a hierarchy has its own volatility estimation, and volatility states only have value parents - reappear in the following chapters. From 7828d7d3641fbcdc530098154f9de868739983e4 Mon Sep 17 00:00:00 2001 From: Anna280 <54855627+Anna280@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:41:23 +0200 Subject: [PATCH 07/24] polish --- docs/src/Julia_src_files/the_HGF_nodes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/Julia_src_files/the_HGF_nodes.jl b/docs/src/Julia_src_files/the_HGF_nodes.jl index bdaa053..958e6ec 100644 --- a/docs/src/Julia_src_files/the_HGF_nodes.jl +++ b/docs/src/Julia_src_files/the_HGF_nodes.jl @@ -35,4 +35,4 @@ # - Can only have categorical input node as child # - Can only have binary state node as parents -# ![states and parameters](../images/states_nodes/categorical_nodes.svg) \ No newline at end of file +# ![states and parameters](../images/states_nodes/categorical_nodes.svg) From 95e40645b0c760040f05f0d42b14ca867f99c0a2 Mon Sep 17 00:00:00 2001 From: Jacopo Comoglio Date: Fri, 29 Sep 2023 16:14:16 +0200 Subject: [PATCH 08/24] Added drift --- Project.toml | 1 + src/create_hgf/init_hgf.jl | 2 ++ src/structs.jl | 1 + src/update_hgf/update_equations.jl | 2 +- test/test_fit_model.jl | 2 ++ test/test_initialization.jl | 5 +++++ 6 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 87911fc..e4e0cfb 100644 --- a/Project.toml +++ b/Project.toml @@ -8,6 +8,7 @@ ActionModels = "320cf53b-cc3b-4b34-9a10-0ecb113566a3" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +Turing = "fce5fe82-541a-59a6-adf8-730c64b5f9a0" [compat] ActionModels = "0.4" diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index a457858..a15cc21 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -138,6 +138,7 @@ function init_hgf(; "volatility_coupling" => 1, "category_means" => [0, 1], "input_precision" => Inf, + "drift" => 0, ) #If verbose @@ -513,6 +514,7 @@ function init_node(input_or_state_node, node_defaults, node_info) evolution_rate = parameters["evolution_rate"], initial_mean = parameters["initial_mean"], initial_precision = parameters["initial_precision"], + drift = parameters["drift"], ), #Set states states = ContinuousStateNodeState( diff --git a/src/structs.jl b/src/structs.jl index af107d0..f216c7e 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -21,6 +21,7 @@ Base.@kwdef mutable struct ContinuousStateNodeParameters volatility_coupling::Dict{String,Real} = Dict{String,Real}() initial_mean::Real = 0 initial_precision::Real = 0 + drift::Real = 0 end """ diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index 9cdf0c8..6e2f206 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -22,7 +22,7 @@ function calculate_prediction_mean(node::AbstractNode) prediction_mean += parent.states.posterior_mean * node.parameters.value_coupling[parent.name] end - + prediction_mean += node.parameters.drift return prediction_mean end diff --git a/test/test_fit_model.jl b/test/test_fit_model.jl index 7785e99..3ef7e3d 100644 --- a/test/test_fit_model.jl +++ b/test/test_fit_model.jl @@ -30,11 +30,13 @@ using Turing "gaussian_action_precision" => 100, ("x2", "evolution_rate") => -4, ("u", "evolution_rate") => 4, + ("x2", "drift") => 1, ) test_param_priors = Dict( ("x1", "evolution_rate") => Normal(log(100.0), 4), ("x1", "initial_mean") => Normal(1, sqrt(100.0)), + ("x1", "drift") => Normal(0, 1), ) #Fit single chain with defaults diff --git a/test/test_initialization.jl b/test/test_initialization.jl index abacc32..81a5350 100644 --- a/test/test_initialization.jl +++ b/test/test_initialization.jl @@ -10,6 +10,7 @@ using Test "initial_mean" => 1, "initial_precision" => 2, "value_coupling" => 1, + "drift" => 2, ) #List of input nodes to create @@ -26,6 +27,7 @@ using Test "evolution_rate" => 2, "initial_mean" => 4, "initial_precision" => 3, + "drift" => 5 ), ] @@ -59,6 +61,9 @@ using Test @test test_hgf.state_nodes["x4"].parameters.evolution_rate == 2 @test test_hgf.state_nodes["x5"].parameters.evolution_rate == 2 + @test test_hgf.state_nodes["x1"].parameters.evolution_rate == 2 + @test test_hgf.state_nodes["x5"].parameters.evolution_rate == 5 + @test test_hgf.input_nodes["u1"].parameters.value_coupling["x1"] == 1 @test test_hgf.input_nodes["u2"].parameters.value_coupling["x2"] == 1 @test test_hgf.input_nodes["u2"].parameters.volatility_coupling["x3"] == 1 From c581923a0ccac209ce052c18777a08058da873e5 Mon Sep 17 00:00:00 2001 From: Jacopo Comoglio Date: Fri, 29 Sep 2023 16:39:30 +0200 Subject: [PATCH 09/24] fixing test --- test/test_initialization.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_initialization.jl b/test/test_initialization.jl index 81a5350..3d7625e 100644 --- a/test/test_initialization.jl +++ b/test/test_initialization.jl @@ -61,8 +61,8 @@ using Test @test test_hgf.state_nodes["x4"].parameters.evolution_rate == 2 @test test_hgf.state_nodes["x5"].parameters.evolution_rate == 2 - @test test_hgf.state_nodes["x1"].parameters.evolution_rate == 2 - @test test_hgf.state_nodes["x5"].parameters.evolution_rate == 5 + @test test_hgf.state_nodes["x1"].parameters.drift == 2 + @test test_hgf.state_nodes["x5"].parameters.drift == 5 @test test_hgf.input_nodes["u1"].parameters.value_coupling["x1"] == 1 @test test_hgf.input_nodes["u2"].parameters.value_coupling["x2"] == 1 From 55c3477b1d0123df02b336850db31eb5e3570aab Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Sat, 30 Sep 2023 17:27:16 +0200 Subject: [PATCH 10/24] made changes to struct, init_hgf, update_hgf and update_node --- src/create_hgf/init_hgf.jl | 2 ++ src/structs.jl | 15 ++++++++++++++- src/update_hgf/update_hgf.jl | 4 ++-- src/update_hgf/update_node.jl | 31 ++++++++++++++++++++++++------- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index a457858..f7cf7c4 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -125,6 +125,7 @@ function init_hgf(; edges::Union{Vector{<:Dict},Dict}, shared_parameters::Dict = Dict(), node_defaults::Dict = Dict(), + update_type::HGFUpdate = EnhancedUpdate(), update_order::Union{Nothing,Vector{String}} = nothing, verbose::Bool = true, ) @@ -405,6 +406,7 @@ function init_hgf(; state_nodes_dict, ordered_nodes, shared_parameters_dict, + update_type, ) ### Check that the HGF has been specified properly ### diff --git a/src/structs.jl b/src/structs.jl index af107d0..4a2c939 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -276,8 +276,20 @@ Base.@kwdef mutable struct CategoricalInputNode <: AbstractInputNode end +######################################### +######## Update Function Structs ######## +######################################### -### Full HGF struct ### +abstract type HGFUpdate end + +abstract type EnhancedUpdate <: HGFUpdate end + +abstract type ClassicUpdate <: HGFUpdate end + + +############################ +######## HGF Struct ######## +############################ """ """ Base.@kwdef mutable struct OrderedNodes @@ -296,4 +308,5 @@ Base.@kwdef mutable struct HGF state_nodes::Dict{String,AbstractStateNode} ordered_nodes::OrderedNodes = OrderedNodes() shared_parameters::Dict = Dict() + update_type::HGFUpdate = EnhancedUpdate() end diff --git a/src/update_hgf/update_hgf.jl b/src/update_hgf/update_hgf.jl index 64490b3..a09fdf0 100644 --- a/src/update_hgf/update_hgf.jl +++ b/src/update_hgf/update_hgf.jl @@ -47,7 +47,7 @@ function update_hgf!( #For each node that is a value parent of an input node for node in hgf.ordered_nodes.early_update_state_nodes #Update its posterior - update_node_posterior!(node) + update_node_posterior!(node, HGF.update_type) #And its value prediction error update_node_value_prediction_error!(node) #And its volatility prediction error @@ -65,7 +65,7 @@ function update_hgf!( #For each state node, in the specified update order for node in hgf.ordered_nodes.late_update_state_nodes #Update its posterior - update_node_posterior!(node) + update_node_posterior!(node, HGF.update_type) #And its value prediction error update_node_value_prediction_error!(node) #And its volatility prediction error diff --git a/src/update_hgf/update_node.jl b/src/update_hgf/update_node.jl index d5a874b..46561ec 100644 --- a/src/update_hgf/update_node.jl +++ b/src/update_hgf/update_node.jl @@ -34,22 +34,39 @@ function update_node_prediction!(node::AbstractStateNode) end """ - update_node_posterior!(node::AbstractStateNode) + update_node_posterior!(node::AbstractStateNode; update_type::HGFUpdate) -Update the posterior of a single continuous state node. +Update the posterior of a single continuous state node. This is the classic HGF update. """ -function update_node_posterior!(node::AbstractStateNode) +function update_node_posterior!(node::AbstractStateNode, update_type::HGFUpdate) #Update posterior precision - node.states.posterior_precision = calculate_posterior_precision(node) + node.states.posterior_precision = calculate_posterior_precision(node, update_type) push!(node.history.posterior_precision, node.states.posterior_precision) #Update posterior mean - node.states.posterior_mean = calculate_posterior_mean(node) + node.states.posterior_mean = calculate_posterior_mean(node, update_type) push!(node.history.posterior_mean, node.states.posterior_mean) return nothing end +""" + update_node_posterior!(node::AbstractStateNode) + +Update the posterior of a single continuous state node. This is the enahnced HGF update. +""" +function update_node_posterior!(node::AbstractStateNode; update_type::EnhancedUpdate) + #Update posterior mean + node.states.posterior_mean = calculate_posterior_mean(node, update_type) + push!(node.history.posterior_mean, node.states.posterior_mean) + + #Update posterior precision + node.states.posterior_precision = calculate_posterior_precision(node, update_type) + push!(node.history.posterior_precision, node.states.posterior_precision) + + return nothing +end + """ update_node_value_prediction_error!(node::AbstractStateNode) @@ -135,9 +152,9 @@ end """ update_node_posterior!(node::CategoricalStateNode) -Update the posterior of a single binary state node. +Update the posterior of a single categorical state node. """ -function update_node_posterior!(node::CategoricalStateNode) +function update_node_posterior!(node::CategoricalStateNode, update_type::HGFUpdate) #Update posterior mean node.states.posterior = calculate_posterior(node) From eddfef28180e9bef1b9f8d426c7055a8c891127a Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Tue, 3 Oct 2023 18:33:33 +0200 Subject: [PATCH 11/24] ehgf now running, uncertain if correct --- docs/src/tutorials/classic_JGET.jl | 2 +- docs/src/tutorials/classic_binary.jl | 1 + docs/src/tutorials/classic_usdchf.jl | 6 +- src/HierarchicalGaussianFiltering.jl | 1 + src/premade_models/premade_action_models.jl | 36 ++++---- src/premade_models/premade_hgfs.jl | 12 +++ src/structs.jl | 4 +- src/update_hgf/update_equations.jl | 96 ++++++++++++++++++++- src/update_hgf/update_hgf.jl | 4 +- src/update_hgf/update_node.jl | 6 +- src/utils/pretty_printing.jl | 2 + test/quicktests.jl | 6 +- test/test_canonical.jl | 10 +-- test/test_premade_agent.jl | 2 +- test/test_premade_hgf.jl | 4 +- 15 files changed, 151 insertions(+), 41 deletions(-) diff --git a/docs/src/tutorials/classic_JGET.jl b/docs/src/tutorials/classic_JGET.jl index f60638f..f2d3b0e 100644 --- a/docs/src/tutorials/classic_JGET.jl +++ b/docs/src/tutorials/classic_JGET.jl @@ -8,7 +8,7 @@ path = "docs/src/tutorials/data" data = CSV.read("$path/classic_cannonball_data.csv", DataFrame) #Create HGF -hgf = premade_hgf("JGET") +hgf = premade_hgf("JGET", (Dict("update_type" => ClassicUpdate())), verbose = false) #Create agent agent = premade_agent("hgf_gaussian_action", hgf) #Set parameters diff --git a/docs/src/tutorials/classic_binary.jl b/docs/src/tutorials/classic_binary.jl index d62ca80..a37bb95 100644 --- a/docs/src/tutorials/classic_binary.jl +++ b/docs/src/tutorials/classic_binary.jl @@ -31,6 +31,7 @@ hgf_parameters = Dict( ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, ("x2", "x3", "volatility_coupling") => 1.0, + "update_type" => ClassicUpdate(), ); hgf = premade_hgf("binary_3level", hgf_parameters, verbose = false); diff --git a/docs/src/tutorials/classic_usdchf.jl b/docs/src/tutorials/classic_usdchf.jl index 2639588..294a49c 100644 --- a/docs/src/tutorials/classic_usdchf.jl +++ b/docs/src/tutorials/classic_usdchf.jl @@ -23,7 +23,11 @@ open(data_path * "classic_usdchf_inputs.dat") do f end #Create HGF -hgf = premade_hgf("continuous_2level", verbose = false); +hgf = premade_hgf( + "continuous_2level", + Dict("update_type" => ClassicUpdate()), + verbose = false, +); agent = premade_agent("hgf_gaussian_action", hgf, verbose = false); # Set parameters for parameter recovyer diff --git a/src/HierarchicalGaussianFiltering.jl b/src/HierarchicalGaussianFiltering.jl index 4678347..6da23b9 100644 --- a/src/HierarchicalGaussianFiltering.jl +++ b/src/HierarchicalGaussianFiltering.jl @@ -13,6 +13,7 @@ export premade_agent, plot_trajectory, plot_trajectory! export get_history, get_parameters, get_states, set_parameters!, reset!, give_inputs! +export EnhancedUpdate, ClassicUpdate #Add premade agents to shared dict at initialization function __init__() diff --git a/src/premade_models/premade_action_models.jl b/src/premade_models/premade_action_models.jl index 1ab4e08..eb5c330 100644 --- a/src/premade_models/premade_action_models.jl +++ b/src/premade_models/premade_action_models.jl @@ -127,15 +127,15 @@ function hgf_binary_softmax_action(agent::Agent, input) #Use sotmax to get the action probability action_probability = 1 / (1 + exp(-action_precision * target_value)) - # #If the action probability is not between 0 and 1 - # if !(0 <= action_probability <= 1) - # #Throw an error that will reject samples when fitted - # throw( - # RejectParameters( - # "With these parameters and inputs, the action probability became $action_probability, which should be between 0 and 1. Try other parameter settings", - # ), - # ) - # end + #If the action probability is not between 0 and 1 + if !(0 <= action_probability <= 1) + #Throw an error that will reject samples when fitted + throw( + RejectParameters( + "With these parameters and inputs, the action probability became $action_probability, which should be between 0 and 1. Try other parameter settings", + ), + ) + end #Create Bernoulli normal distribution with mean of the target value and a standard deviation from parameters distribution = Distributions.Bernoulli(action_probability) @@ -191,15 +191,15 @@ function hgf_unit_square_sigmoid_action(agent::Agent, input) target_value^action_precision / (target_value^action_precision + (1 - target_value)^action_precision) - # #If the action probability is not between 0 and 1 - # if !(0 <= action_probability <= 1) - # #Throw an error that will reject samples when fitted - # throw( - # RejectParameters( - # "With these parameters and inputs, the action probability became $action_probability, which should be between 0 and 1. Try other parameter settings", - # ), - # ) - # end + #If the action probability is not between 0 and 1 + if !(0 <= action_probability <= 1) + #Throw an error that will reject samples when fitted + throw( + RejectParameters( + "With these parameters and inputs, the action probability became $action_probability, which should be between 0 and 1. Try other parameter settings", + ), + ) + end #Create Bernoulli normal distribution with mean of the target value and a standard deviation from parameters distribution = Distributions.Bernoulli(action_probability) diff --git a/src/premade_models/premade_hgfs.jl b/src/premade_models/premade_hgfs.jl index 1323bdb..2053ed1 100644 --- a/src/premade_models/premade_hgfs.jl +++ b/src/premade_models/premade_hgfs.jl @@ -28,6 +28,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) ("x1", "initial_precision") => 1, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + "update_type" => EnhancedUpdate(), ) #Warn the user about used defaults and misspecified keys @@ -82,6 +83,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) state_nodes = state_nodes, edges = edges, verbose = false, + update_type = config["update_type"], ) end @@ -131,6 +133,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) ("x3", "initial_precision") => 1, ("x4", "initial_mean") => 0, ("x4", "initial_precision") => 1, + "update_type" => EnhancedUpdate(), ) #Warn the user about used defaults and misspecified keys @@ -204,6 +207,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) state_nodes = state_nodes, edges = edges, verbose = false, + update_type = config["update_type"], ) end @@ -232,6 +236,7 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) ("x1", "x2", "value_coupling") => 1, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + "update_type" => EnhancedUpdate(), ) #Warn the user about used defaults and misspecified keys @@ -278,6 +283,7 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) state_nodes = state_nodes, edges = edges, verbose = false, + update_type = config["update_type"], ) end @@ -321,6 +327,7 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) ("x2", "initial_precision") => 1, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + "update_type" => EnhancedUpdate(), ) #Warn the user about used defaults and misspecified keys @@ -378,6 +385,7 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) state_nodes = state_nodes, edges = edges, verbose = false, + update_type = config["update_type"], ) end @@ -414,6 +422,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) ("x2", "initial_precision") => 1, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + "update_type" => EnhancedUpdate(), ) #Warn the user about used defaults and misspecified keys @@ -550,6 +559,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) edges = edges, shared_parameters = shared_parameters, verbose = false, + update_type = config["update_type"], ) end @@ -594,6 +604,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo ("x2", "initial_precision") => 1, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + "update_type" => EnhancedUpdate(), ) #Warn the user about used defaults and misspecified keys @@ -790,5 +801,6 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo edges = edges, shared_parameters = shared_parameters, verbose = false, + update_type = config["update_type"], ) end diff --git a/src/structs.jl b/src/structs.jl index 4a2c939..c407371 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -282,9 +282,9 @@ end abstract type HGFUpdate end -abstract type EnhancedUpdate <: HGFUpdate end +struct EnhancedUpdate <: HGFUpdate end -abstract type ClassicUpdate <: HGFUpdate end +struct ClassicUpdate <: HGFUpdate end ############################ diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index b8cb161..0c4e15d 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -213,7 +213,7 @@ Calculates a node's posterior mean. Uses the equation `` `` """ -function calculate_posterior_mean(node::AbstractNode) +function calculate_posterior_mean(node::AbstractNode, update_type::HGFUpdate) value_children = node.value_children volatility_children = node.volatility_children @@ -222,12 +222,14 @@ function calculate_posterior_mean(node::AbstractNode) #Add update terms from value children for child in value_children - posterior_mean += calculate_posterior_mean_value_child_increment(node, child) + posterior_mean += + calculate_posterior_mean_value_child_increment(node, child, update_type) end #Add update terms from volatility children for child in volatility_children - posterior_mean += calculate_posterior_mean_volatility_child_increment(node, child) + posterior_mean += + calculate_posterior_mean_volatility_child_increment(node, child, update_type) end return posterior_mean @@ -237,6 +239,7 @@ end calculate_posterior_mean_value_child_increment(node::AbstractNode, child::AbstractNode) Calculates the posterior mean update term for a single continuous value child to a state node. +This is the classic HGF update. Uses the equation `` `` @@ -244,6 +247,7 @@ Uses the equation function calculate_posterior_mean_value_child_increment( node::AbstractNode, child::AbstractNode, + update_type::HGFUpdate, ) #For input node children with missing input if child isa AbstractInputNode && ismissing(child.states.input_value) @@ -260,10 +264,40 @@ function calculate_posterior_mean_value_child_increment( end end +@doc raw""" + calculate_posterior_mean_value_child_increment(node::AbstractNode, child::AbstractNode) + +Calculates the posterior mean update term for a single continuous value child to a state node. +This is the enhanced HGF update. + +Uses the equation +`` `` +""" +function calculate_posterior_mean_value_child_increment( + node::AbstractNode, + child::AbstractNode, + update_type::EnhancedUpdate, +) + #For input node children with missing input + if child isa AbstractInputNode && ismissing(child.states.input_value) + #No update + return 0 + else + update_term = + ( + child.parameters.value_coupling[node.name] * + child.states.prediction_precision + ) / node.states.prediction_precision * child.states.value_prediction_error + + return update_term + end +end + @doc raw""" calculate_posterior_mean_value_child_increment(node::AbstractNode, child::BinaryStateNode) Calculates the posterior mean update term for a single binary value child to a state node. +This is the classic HGF update. Uses the equation `` `` @@ -271,6 +305,7 @@ Uses the equation function calculate_posterior_mean_value_child_increment( node::AbstractNode, child::BinaryStateNode, + update_type::HGFUpdate, ) #For missing inputs if ismissing(child.states.posterior_mean) @@ -282,6 +317,30 @@ function calculate_posterior_mean_value_child_increment( end end +@doc raw""" + calculate_posterior_mean_value_child_increment(node::AbstractNode, child::BinaryStateNode) + +Calculates the posterior mean update term for a single binary value child to a state node. +This is the enhanced HGF update. + +Uses the equation +`` `` +""" +function calculate_posterior_mean_value_child_increment( + node::AbstractNode, + child::BinaryStateNode, + update_type::EnhancedUpdate, +) + #For missing inputs + if ismissing(child.states.posterior_mean) + #No update + return 0 + else + return child.parameters.value_coupling[node.name] / + (node.states.prediction_precision) * child.states.value_prediction_error + end +end + @doc raw""" calculate_posterior_mean_volatility_child_increment(node::AbstractNode, child::AbstractNode) @@ -293,6 +352,7 @@ Uses the equation function calculate_posterior_mean_volatility_child_increment( node::AbstractNode, child::AbstractNode, + update_type::HGFUpdate, ) #For input node children with missing input if child isa AbstractInputNode && ismissing(child.states.input_value) @@ -309,6 +369,34 @@ function calculate_posterior_mean_volatility_child_increment( end end +@doc raw""" + calculate_posterior_mean_volatility_child_increment(node::AbstractNode, child::AbstractNode) + +Calculates the posterior mean update term for a single continuos volatility child to a state node. + +Uses the equation +`` `` +""" +function calculate_posterior_mean_volatility_child_increment( + node::AbstractNode, + child::AbstractNode, + update_type::EnhancedUpdate, +) + #For input node children with missing input + if child isa AbstractInputNode && ismissing(child.states.input_value) + #No update + return 0 + else + update_term = + 1 / 2 * ( + child.parameters.volatility_coupling[node.name] * + child.states.auxiliary_prediction_precision + ) / node.states.prediction_precision * child.states.volatility_prediction_error + + return update_term + end +end + ######## Prediction error update functions ######## @doc raw""" calculate_value_prediction_error(node::AbstractNode) @@ -420,7 +508,7 @@ Calculates a node's posterior mean. Uses the equation `` \mu = \frac{e^{-0.5 \cdot \pi_n \cdot \eta_1^2}}{\hat{\mu}_n \cdot e^{-0.5 \cdot \pi_n \cdot \eta_1^2} \; + 1-\hat{\mu}_n \cdot e^{-0.5 \cdot \pi_n \cdot \eta_2^2}} `` """ -function calculate_posterior_mean(node::BinaryStateNode) +function calculate_posterior_mean(node::BinaryStateNode, update_type::HGFUpdate) #Extract the child child = node.value_children[1] diff --git a/src/update_hgf/update_hgf.jl b/src/update_hgf/update_hgf.jl index a09fdf0..1c1113e 100644 --- a/src/update_hgf/update_hgf.jl +++ b/src/update_hgf/update_hgf.jl @@ -47,7 +47,7 @@ function update_hgf!( #For each node that is a value parent of an input node for node in hgf.ordered_nodes.early_update_state_nodes #Update its posterior - update_node_posterior!(node, HGF.update_type) + update_node_posterior!(node, hgf.update_type) #And its value prediction error update_node_value_prediction_error!(node) #And its volatility prediction error @@ -65,7 +65,7 @@ function update_hgf!( #For each state node, in the specified update order for node in hgf.ordered_nodes.late_update_state_nodes #Update its posterior - update_node_posterior!(node, HGF.update_type) + update_node_posterior!(node, hgf.update_type) #And its value prediction error update_node_value_prediction_error!(node) #And its volatility prediction error diff --git a/src/update_hgf/update_node.jl b/src/update_hgf/update_node.jl index 46561ec..a9078ba 100644 --- a/src/update_hgf/update_node.jl +++ b/src/update_hgf/update_node.jl @@ -40,7 +40,7 @@ Update the posterior of a single continuous state node. This is the classic HGF """ function update_node_posterior!(node::AbstractStateNode, update_type::HGFUpdate) #Update posterior precision - node.states.posterior_precision = calculate_posterior_precision(node, update_type) + node.states.posterior_precision = calculate_posterior_precision(node) push!(node.history.posterior_precision, node.states.posterior_precision) #Update posterior mean @@ -59,9 +59,9 @@ function update_node_posterior!(node::AbstractStateNode; update_type::EnhancedUp #Update posterior mean node.states.posterior_mean = calculate_posterior_mean(node, update_type) push!(node.history.posterior_mean, node.states.posterior_mean) - + #Update posterior precision - node.states.posterior_precision = calculate_posterior_precision(node, update_type) + node.states.posterior_precision = calculate_posterior_precision(node) push!(node.history.posterior_precision, node.states.posterior_precision) return nothing diff --git a/src/utils/pretty_printing.jl b/src/utils/pretty_printing.jl index 06d2a0f..2591473 100644 --- a/src/utils/pretty_printing.jl +++ b/src/utils/pretty_printing.jl @@ -40,6 +40,8 @@ function Base.show(io::IO, hgf::HGF) "($n_continuous_state_nodes continuous, $n_binary_state_nodes binary, and $n_categorical_state_nodes categorical)", ) + println("Update type: $(hgf.update_type)") + #Number of observations if n_observations > 0 println("This HGF has received $n_observations inputs") diff --git a/test/quicktests.jl b/test/quicktests.jl index da42e29..7afa9e3 100644 --- a/test/quicktests.jl +++ b/test/quicktests.jl @@ -1,5 +1,7 @@ using HierarchicalGaussianFiltering -hgf = premade_hgf("continuous_2level", verbose = false) +hgf = premade_hgf("continuous_2level", verbose = true) -update_hgf!(hgf, [1.0, 1.02, 1.06]) +update_hgf!(hgf, [0.01, 0.02, 0.06]) + +get_states(hgf) diff --git a/test/test_canonical.jl b/test/test_canonical.jl index e006e2c..88fed11 100644 --- a/test/test_canonical.jl +++ b/test/test_canonical.jl @@ -45,6 +45,7 @@ using Plots ("x1", "initial_precision") => 1e4, ("x2", "initial_mean") => 1.0, ("x2", "initial_precision") => 10, + "update_type" => ClassicUpdate(), ) #Create HGF @@ -88,9 +89,7 @@ using Plots #Import the canonical trajectory of states canonical_trajectory = CSV.read(canonical_trajectory_path, DataFrame) - ### Set up HGF ### - #Create HGF - test_hgf = premade_hgf("binary_3level", verbose = false) + ### Set up HGF ### #Set parameters test_parameters = Dict( @@ -104,10 +103,11 @@ using Plots ("x2", "initial_precision") => 1.0, ("x3", "initial_mean") => 1.0, ("x3", "initial_precision") => 1.0, + "update_type" => ClassicUpdate(), ) - set_parameters!(test_hgf, test_parameters) - reset!(test_hgf) + #Create HGF + test_hgf = premade_hgf("binary_3level", test_parameters, verbose = false) #Give inputs (mu1's are equal to the inputs in a binary HGF without sensory noise) give_inputs!(test_hgf, canonical_trajectory.mu1) diff --git a/test/test_premade_agent.jl b/test/test_premade_agent.jl index 41aea2a..7811fd1 100644 --- a/test/test_premade_agent.jl +++ b/test/test_premade_agent.jl @@ -14,7 +14,7 @@ using Test ) #Give inputs to the agent - actions = give_inputs!(test_agent, [1.01, 1.02, 1.03]) + actions = give_inputs!(test_agent, [0.01, 0.02, 0.03]) #Check that actions are floats @test actions isa Vector{Any} diff --git a/test/test_premade_hgf.jl b/test/test_premade_hgf.jl index 5bcf308..91f6e05 100644 --- a/test/test_premade_hgf.jl +++ b/test/test_premade_hgf.jl @@ -23,7 +23,7 @@ using Test @testset "Standard 2 level HGF" begin #Set up test inputs - test_inputs = [1.0, 1.05, 1.1, missing, 1.02] + test_inputs = [0.01, 0.05, 0.01, missing, 0.02] #Initialize HGF HGF_test = premade_hgf("continuous_2level", verbose = false) @@ -34,7 +34,7 @@ using Test @testset "JGET" begin #Set up test inputs - test_inputs = [1.0, 1.05, 1.1, missing, 1.02] + test_inputs = [0.01, 0.05, 0.01, missing, 0.02] #Initialize HGF HGF_test = premade_hgf("JGET", verbose = false) From f707c97cf571186f21eb202631048348d6ac91cb Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Thu, 5 Oct 2023 18:08:12 +0200 Subject: [PATCH 12/24] ehgf is now be functional --- src/create_hgf/init_hgf.jl | 7 ++++++- src/structs.jl | 26 ++++++++++++++------------ src/update_hgf/update_hgf.jl | 4 ++-- src/update_hgf/update_node.jl | 6 +++--- src/utils/pretty_printing.jl | 2 -- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index f7cf7c4..d399f95 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -302,6 +302,12 @@ function init_hgf(; #Add coupling strength to child node child_node.parameters.volatility_coupling[parent_node.name] = parent_info[2] + + #If the enhanced HGF update is used + if update_type isa EnhancedUpdate && parent_node isa ContinuousStateNode + #Set the node to use the enhanced HGF update + parent_node.update_type = update_type + end end end end @@ -406,7 +412,6 @@ function init_hgf(; state_nodes_dict, ordered_nodes, shared_parameters_dict, - update_type, ) ### Check that the HGF has been specified properly ### diff --git a/src/structs.jl b/src/structs.jl index c407371..1e55d94 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -1,3 +1,14 @@ +######################################## +######## Update Function Tyopes ######## +######################################## + +abstract type HGFUpdate end + +struct EnhancedUpdate <: HGFUpdate end + +struct ClassicUpdate <: HGFUpdate end + + ############################ ######## Node Types ######## ############################ @@ -62,6 +73,7 @@ Base.@kwdef mutable struct ContinuousStateNode <: AbstractStateNode parameters::ContinuousStateNodeParameters = ContinuousStateNodeParameters() states::ContinuousStateNodeState = ContinuousStateNodeState() history::ContinuousStateNodeHistory = ContinuousStateNodeHistory() + update_type::HGFUpdate = ClassicUpdate() end @@ -110,6 +122,7 @@ Base.@kwdef mutable struct BinaryStateNode <: AbstractStateNode parameters::BinaryStateNodeParameters = BinaryStateNodeParameters() states::BinaryStateNodeState = BinaryStateNodeState() history::BinaryStateNodeHistory = BinaryStateNodeHistory() + update_type::HGFUpdate = ClassicUpdate() end @@ -151,6 +164,7 @@ Base.@kwdef mutable struct CategoricalStateNode <: AbstractStateNode parameters::CategoricalStateNodeParameters = CategoricalStateNodeParameters() states::CategoricalStateNodeState = CategoricalStateNodeState() history::CategoricalStateNodeHistory = CategoricalStateNodeHistory() + update_type::HGFUpdate = ClassicUpdate() end @@ -276,17 +290,6 @@ Base.@kwdef mutable struct CategoricalInputNode <: AbstractInputNode end -######################################### -######## Update Function Structs ######## -######################################### - -abstract type HGFUpdate end - -struct EnhancedUpdate <: HGFUpdate end - -struct ClassicUpdate <: HGFUpdate end - - ############################ ######## HGF Struct ######## ############################ @@ -308,5 +311,4 @@ Base.@kwdef mutable struct HGF state_nodes::Dict{String,AbstractStateNode} ordered_nodes::OrderedNodes = OrderedNodes() shared_parameters::Dict = Dict() - update_type::HGFUpdate = EnhancedUpdate() end diff --git a/src/update_hgf/update_hgf.jl b/src/update_hgf/update_hgf.jl index 1c1113e..e644d8c 100644 --- a/src/update_hgf/update_hgf.jl +++ b/src/update_hgf/update_hgf.jl @@ -47,7 +47,7 @@ function update_hgf!( #For each node that is a value parent of an input node for node in hgf.ordered_nodes.early_update_state_nodes #Update its posterior - update_node_posterior!(node, hgf.update_type) + update_node_posterior!(node, node.update_type) #And its value prediction error update_node_value_prediction_error!(node) #And its volatility prediction error @@ -65,7 +65,7 @@ function update_hgf!( #For each state node, in the specified update order for node in hgf.ordered_nodes.late_update_state_nodes #Update its posterior - update_node_posterior!(node, hgf.update_type) + update_node_posterior!(node, node.update_type) #And its value prediction error update_node_value_prediction_error!(node) #And its volatility prediction error diff --git a/src/update_hgf/update_node.jl b/src/update_hgf/update_node.jl index a9078ba..43721ba 100644 --- a/src/update_hgf/update_node.jl +++ b/src/update_hgf/update_node.jl @@ -38,7 +38,7 @@ end Update the posterior of a single continuous state node. This is the classic HGF update. """ -function update_node_posterior!(node::AbstractStateNode, update_type::HGFUpdate) +function update_node_posterior!(node::AbstractStateNode, update_type::ClassicUpdate) #Update posterior precision node.states.posterior_precision = calculate_posterior_precision(node) push!(node.history.posterior_precision, node.states.posterior_precision) @@ -55,7 +55,7 @@ end Update the posterior of a single continuous state node. This is the enahnced HGF update. """ -function update_node_posterior!(node::AbstractStateNode; update_type::EnhancedUpdate) +function update_node_posterior!(node::AbstractStateNode, update_type::EnhancedUpdate) #Update posterior mean node.states.posterior_mean = calculate_posterior_mean(node, update_type) push!(node.history.posterior_mean, node.states.posterior_mean) @@ -154,7 +154,7 @@ end Update the posterior of a single categorical state node. """ -function update_node_posterior!(node::CategoricalStateNode, update_type::HGFUpdate) +function update_node_posterior!(node::CategoricalStateNode, update_type::ClassicUpdate) #Update posterior mean node.states.posterior = calculate_posterior(node) diff --git a/src/utils/pretty_printing.jl b/src/utils/pretty_printing.jl index 2591473..06d2a0f 100644 --- a/src/utils/pretty_printing.jl +++ b/src/utils/pretty_printing.jl @@ -40,8 +40,6 @@ function Base.show(io::IO, hgf::HGF) "($n_continuous_state_nodes continuous, $n_binary_state_nodes binary, and $n_categorical_state_nodes categorical)", ) - println("Update type: $(hgf.update_type)") - #Number of observations if n_observations > 0 println("This HGF has received $n_observations inputs") From 0a8255ec4785338c619c79d4ac513a1d16ac9a1a Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Thu, 5 Oct 2023 18:15:48 +0200 Subject: [PATCH 13/24] update, use enhanced HGF in tutorials --- docs/src/tutorials/classic_JGET.jl | 2 +- docs/src/tutorials/classic_binary.jl | 1 - docs/src/tutorials/classic_usdchf.jl | 10 +++------- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/docs/src/tutorials/classic_JGET.jl b/docs/src/tutorials/classic_JGET.jl index f2d3b0e..2e933c7 100644 --- a/docs/src/tutorials/classic_JGET.jl +++ b/docs/src/tutorials/classic_JGET.jl @@ -8,7 +8,7 @@ path = "docs/src/tutorials/data" data = CSV.read("$path/classic_cannonball_data.csv", DataFrame) #Create HGF -hgf = premade_hgf("JGET", (Dict("update_type" => ClassicUpdate())), verbose = false) +hgf = premade_hgf("JGET", verbose = false) #Create agent agent = premade_agent("hgf_gaussian_action", hgf) #Set parameters diff --git a/docs/src/tutorials/classic_binary.jl b/docs/src/tutorials/classic_binary.jl index a37bb95..d62ca80 100644 --- a/docs/src/tutorials/classic_binary.jl +++ b/docs/src/tutorials/classic_binary.jl @@ -31,7 +31,6 @@ hgf_parameters = Dict( ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, ("x2", "x3", "volatility_coupling") => 1.0, - "update_type" => ClassicUpdate(), ); hgf = premade_hgf("binary_3level", hgf_parameters, verbose = false); diff --git a/docs/src/tutorials/classic_usdchf.jl b/docs/src/tutorials/classic_usdchf.jl index 294a49c..6359d2b 100644 --- a/docs/src/tutorials/classic_usdchf.jl +++ b/docs/src/tutorials/classic_usdchf.jl @@ -23,14 +23,10 @@ open(data_path * "classic_usdchf_inputs.dat") do f end #Create HGF -hgf = premade_hgf( - "continuous_2level", - Dict("update_type" => ClassicUpdate()), - verbose = false, -); +hgf = premade_hgf("continuous_2level", verbose = true); agent = premade_agent("hgf_gaussian_action", hgf, verbose = false); -# Set parameters for parameter recovyer +# Set parameters for parameter recover parameters = Dict( ("u", "x1", "value_coupling") => 1.0, ("x1", "x2", "volatility_coupling") => 1.0, @@ -116,7 +112,7 @@ fitted_model = fit_model( inputs, actions, fixed_parameters = fixed_parameters, - verbose = true, + verbose = false, n_iterations = 10, ) #- From 1d624138dea1bae440476aad23e23255e7290630 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Fri, 6 Oct 2023 12:36:42 +0100 Subject: [PATCH 14/24] Update Project.toml --- Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Project.toml b/Project.toml index e4e0cfb..87911fc 100644 --- a/Project.toml +++ b/Project.toml @@ -8,7 +8,6 @@ ActionModels = "320cf53b-cc3b-4b34-9a10-0ecb113566a3" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -Turing = "fce5fe82-541a-59a6-adf8-730c64b5f9a0" [compat] ActionModels = "0.4" From 57b58e4b059efe7f1b6da0c0885279bd2751bffb Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Fri, 6 Oct 2023 12:37:25 +0100 Subject: [PATCH 15/24] Update init_hgf.jl --- src/create_hgf/init_hgf.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index a15cc21..9ede4ee 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -132,13 +132,13 @@ function init_hgf(; preset_node_defaults = Dict( "type" => "continuous", "evolution_rate" => -2, + "drift" => 0, "initial_mean" => 0, "initial_precision" => 1, "value_coupling" => 1, "volatility_coupling" => 1, "category_means" => [0, 1], "input_precision" => Inf, - "drift" => 0, ) #If verbose From 157eb18d1c525a88cabacb0427c0337da8575533 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Fri, 6 Oct 2023 12:37:59 +0100 Subject: [PATCH 16/24] Update structs.jl --- src/structs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/structs.jl b/src/structs.jl index f216c7e..22d30dc 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -17,11 +17,11 @@ Configuration of continuous state nodes' parameters """ Base.@kwdef mutable struct ContinuousStateNodeParameters evolution_rate::Real = 0 + drift::Real = 0 value_coupling::Dict{String,Real} = Dict{String,Real}() volatility_coupling::Dict{String,Real} = Dict{String,Real}() initial_mean::Real = 0 initial_precision::Real = 0 - drift::Real = 0 end """ From 1fc5ccc26a70e43e6c6bc638c1d1e33591ff17e9 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Fri, 6 Oct 2023 13:52:42 +0200 Subject: [PATCH 17/24] initial types created --- src/create_hgf/init_hgf.jl | 1 + src/structs.jl | 42 ++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index a457858..8dbd146 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -131,6 +131,7 @@ function init_hgf(; ### Defaults ### preset_node_defaults = Dict( "type" => "continuous", + "dynamics" => RandomWalk(), "evolution_rate" => -2, "initial_mean" => 0, "initial_precision" => 1, diff --git a/src/structs.jl b/src/structs.jl index af107d0..7f61710 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -1,22 +1,52 @@ -############################ -######## Node Types ######## -############################ +################################ +######## Abstract Types ######## +################################ +#Top-level node type abstract type AbstractNode end +#Input and state node subtypes abstract type AbstractStateNode <: AbstractNode end - abstract type AbstractInputNode <: AbstractNode end +#Continuous state node parameter supertype +abstract type ContinuousStateNodeParameters end + +#Supertype for dynamics tyoes +abstract type ContinuousDynamicsType end + + +################################################# +######## Dynamics and update types Types ######## +################################################# + +struct RandomWalk <: ContinuousDynamicsType +end + +struct AR1 <: ContinuousDynamicsType +end ####################################### ######## Continuous State Node ######## ####################################### """ -Configuration of continuous state nodes' parameters +Configuration of continuous random walk state nodes' parameters +""" +Base.@kwdef mutable struct ContinuousStateNodeRandomWalkParameters <: ContinuousStateNodeParameters + evolution_rate::Real = 0 + value_coupling::Dict{String,Real} = Dict{String,Real}() + volatility_coupling::Dict{String,Real} = Dict{String,Real}() + initial_mean::Real = 0 + initial_precision::Real = 0 +end + +""" +Configuration of continuous AR1 state nodes' parameters """ -Base.@kwdef mutable struct ContinuousStateNodeParameters +Base.@kwdef mutable struct ContinuousStateNodeAR1Parameters <: ContinuousStateNodeParameters evolution_rate::Real = 0 + mean::Real = 0 + coefficient::Real = 0 value_coupling::Dict{String,Real} = Dict{String,Real}() volatility_coupling::Dict{String,Real} = Dict{String,Real}() initial_mean::Real = 0 From 6368e27df9946676a6bfceaf9861716d6287b39b Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Fri, 6 Oct 2023 15:48:59 +0200 Subject: [PATCH 18/24] ar1 hgf now implemented --- docs/src/tutorials/classic_usdchf.jl | 18 +- .../utils/get_states.jl | 2 +- src/ActionModels_variations/utils/reset.jl | 6 +- src/create_hgf/init_hgf.jl | 9 +- src/premade_models/premade_hgfs.jl | 225 ++++++++++++++---- src/structs.jl | 39 +-- src/update_hgf/update_equations.jl | 31 ++- src/update_hgf/update_node.jl | 8 +- src/utils/get_prediction.jl | 16 +- test/runtests.jl | 27 ++- 10 files changed, 258 insertions(+), 123 deletions(-) diff --git a/docs/src/tutorials/classic_usdchf.jl b/docs/src/tutorials/classic_usdchf.jl index 6359d2b..b2d84b1 100644 --- a/docs/src/tutorials/classic_usdchf.jl +++ b/docs/src/tutorials/classic_usdchf.jl @@ -23,7 +23,7 @@ open(data_path * "classic_usdchf_inputs.dat") do f end #Create HGF -hgf = premade_hgf("continuous_2level", verbose = true); +hgf = premade_hgf("continuous_2level", verbose = false); agent = premade_agent("hgf_gaussian_action", hgf, verbose = false); # Set parameters for parameter recover @@ -91,9 +91,9 @@ fixed_parameters = Dict( ); param_priors = Dict( - ("u", "evolution_rate") => Normal(-10, 2), - ("x1", "evolution_rate") => Normal(-10, 4), - ("x2", "evolution_rate") => Normal(-4, 4), + ("u", "evolution_rate") => Normal(-6, 1), + ("x1", "evolution_rate") => Normal(-4, 1), + ("x2", "evolution_rate") => Normal(-4, 1), ); #- # Prior predictive simulation plot @@ -102,7 +102,7 @@ plot_predictive_simulation( agent, inputs, ("x1", "posterior_mean"); - n_simulations = 3, + n_simulations = 100, ) #- # Do parameter recovery @@ -122,11 +122,3 @@ plot(fitted_model) # Plot prior posterior distributions plot_parameter_distribution(fitted_model, param_priors) #- -# Posterior predictive plot -plot_predictive_simulation( - fitted_model, - agent, - inputs, - ("x1", "posterior_mean"); - n_simulations = 3, -) diff --git a/src/ActionModels_variations/utils/get_states.jl b/src/ActionModels_variations/utils/get_states.jl index efab8f8..d6c03c4 100644 --- a/src/ActionModels_variations/utils/get_states.jl +++ b/src/ActionModels_variations/utils/get_states.jl @@ -43,7 +43,7 @@ function ActionModels.get_states(node::AbstractNode, state_name::String) if state_name in [ "prediction", "prediction_mean", - "prediction_volatility", + "predicted_volatility", "prediction_precision", "auxiliary_prediction_precision", ] diff --git a/src/ActionModels_variations/utils/reset.jl b/src/ActionModels_variations/utils/reset.jl index 82dc4d9..aad3535 100644 --- a/src/ActionModels_variations/utils/reset.jl +++ b/src/ActionModels_variations/utils/reset.jl @@ -32,7 +32,7 @@ function ActionModels.reset!(hgf::HGF) :value_prediction_error, :volatility_prediction_error, :prediction_mean, - :prediction_volatility, + :predicted_volatility, :prediction_precision, :auxiliary_prediction_precision, ] @@ -48,7 +48,7 @@ function ActionModels.reset!(hgf::HGF) :input_value, :value_prediction_error, :volatility_prediction_error, - :prediction_volatility, + :predicted_volatility, :prediction_precision, ] #Set the state to missing @@ -75,7 +75,7 @@ function ActionModels.reset!(hgf::HGF) state_name in [ :prediction, :prediction_mean, - :prediction_volatility, + :predicted_volatility, :prediction_precision, :auxiliary_prediction_precision, ] diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index f8c8fce..c12f60f 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -132,9 +132,10 @@ function init_hgf(; ### Defaults ### preset_node_defaults = Dict( "type" => "continuous", - "dynamics" => RandomWalk(), "evolution_rate" => -2, - "drift" => 0, + "drift" => 0, + "autoregressive_target" => 0, + "autoregressive_rate" => 0, "initial_mean" => 0, "initial_precision" => 1, "value_coupling" => 1, @@ -520,9 +521,11 @@ function init_node(input_or_state_node, node_defaults, node_info) #Set parameters parameters = ContinuousStateNodeParameters( evolution_rate = parameters["evolution_rate"], + drift = parameters["drift"], initial_mean = parameters["initial_mean"], initial_precision = parameters["initial_precision"], - drift = parameters["drift"], + autoregressive_target = parameters["autoregressive_target"], + autoregressive_rate = parameters["autoregressive_rate"], ), #Set states states = ContinuousStateNodeState( diff --git a/src/premade_models/premade_hgfs.jl b/src/premade_models/premade_hgfs.jl index 2053ed1..b32246b 100644 --- a/src/premade_models/premade_hgfs.jl +++ b/src/premade_models/premade_hgfs.jl @@ -20,14 +20,24 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) #Defaults spec_defaults = Dict( ("u", "evolution_rate") => -2, + ("x1", "evolution_rate") => -2, - ("x2", "evolution_rate") => -2, - ("u", "x1", "value_coupling") => 1, - ("x1", "x2", "volatility_coupling") => 1, + ("x1", "drift") => 0, + ("x1", "autoregressive_target") => 0, + ("x1", "autoregressive_rate") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, + + ("x2", "evolution_rate") => -2, + ("x2", "drift") => 0, + ("x2", "autoregressive_target") => 0, + ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + + ("u", "x1", "value_coupling") => 1, + ("x1", "x2", "volatility_coupling") => 1, + "update_type" => EnhancedUpdate(), ) @@ -53,6 +63,9 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) "name" => "x1", "type" => "continuous", "evolution_rate" => config[("x1", "evolution_rate")], + "drift" => config[("x1", "drift")], + "autoregressive_target" => config[("x1", "autoregressive_target")], + "autoregressive_rate" => config[("x1", "autoregressive_rate")], "initial_mean" => config[("x1", "initial_mean")], "initial_precision" => config[("x1", "initial_precision")], ), @@ -60,6 +73,9 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) "name" => "x2", "type" => "continuous", "evolution_rate" => config[("x2", "evolution_rate")], + "drift" => config[("x2", "drift")], + "autoregressive_target" => config[("x2", "autoregressive_target")], + "autoregressive_rate" => config[("x2", "autoregressive_rate")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -117,22 +133,40 @@ function premade_JGET(config::Dict; verbose::Bool = true) #Defaults spec_defaults = Dict( ("u", "evolution_rate") => -2, + ("x1", "evolution_rate") => -2, - ("x2", "evolution_rate") => -2, - ("x3", "evolution_rate") => -2, - ("x4", "evolution_rate") => -2, - ("u", "x1", "value_coupling") => 1, - ("u", "x3", "volatility_coupling") => 1, - ("x1", "x2", "volatility_coupling") => 1, - ("x3", "x4", "volatility_coupling") => 1, + ("x1", "drift") => 0, + ("x1", "autoregressive_target") => 0, + ("x1", "autoregressive_rate") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, + + ("x2", "evolution_rate") => -2, + ("x2", "drift") => 0, + ("x2", "autoregressive_target") => 0, + ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + + ("x3", "evolution_rate") => -2, + ("x3", "drift") => 0, + ("x3", "autoregressive_target") => 0, + ("x3", "autoregressive_rate") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + + ("x4", "evolution_rate") => -2, + ("x4", "drift") => 0, + ("x4", "autoregressive_target") => 0, + ("x4", "autoregressive_rate") => 0, ("x4", "initial_mean") => 0, ("x4", "initial_precision") => 1, + + ("u", "x1", "value_coupling") => 1, + ("u", "x3", "volatility_coupling") => 1, + ("x1", "x2", "volatility_coupling") => 1, + ("x3", "x4", "volatility_coupling") => 1, + "update_type" => EnhancedUpdate(), ) @@ -158,6 +192,9 @@ function premade_JGET(config::Dict; verbose::Bool = true) "name" => "x1", "type" => "continuous", "evolution_rate" => config[("x1", "evolution_rate")], + "drift" => config[("x1", "drift")], + "autoregressive_target" => config[("x1", "autoregressive_target")], + "autoregressive_rate" => config[("x1", "autoregressive_rate")], "initial_mean" => config[("x1", "initial_mean")], "initial_precision" => config[("x1", "initial_precision")], ), @@ -165,6 +202,9 @@ function premade_JGET(config::Dict; verbose::Bool = true) "name" => "x2", "type" => "continuous", "evolution_rate" => config[("x2", "evolution_rate")], + "drift" => config[("x2", "drift")], + "autoregressive_target" => config[("x2", "autoregressive_target")], + "autoregressive_rate" => config[("x2", "autoregressive_rate")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -172,6 +212,9 @@ function premade_JGET(config::Dict; verbose::Bool = true) "name" => "x3", "type" => "continuous", "evolution_rate" => config[("x3", "evolution_rate")], + "drift" => config[("x3", "drift")], + "autoregressive_target" => config[("x3", "autoregressive_target")], + "autoregressive_rate" => config[("x3", "autoregressive_rate")], "initial_mean" => config[("x3", "initial_precision")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -179,6 +222,9 @@ function premade_JGET(config::Dict; verbose::Bool = true) "name" => "x4", "type" => "continuous", "evolution_rate" => config[("x4", "evolution_rate")], + "drift" => config[("x4", "drift")], + "autoregressive_target" => config[("x4", "autoregressive_target")], + "autoregressive_rate" => config[("x4", "autoregressive_rate")], "initial_mean" => config[("x4", "initial_mean")], "initial_precision" => config[("x4", "initial_precision")], ), @@ -232,10 +278,16 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) spec_defaults = Dict( ("u", "category_means") => [0, 1], ("u", "input_precision") => Inf, + ("x2", "evolution_rate") => -2, - ("x1", "x2", "value_coupling") => 1, + ("x2", "drift") => 0, + ("x2", "autoregressive_target") => 0, + ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + + ("x1", "x2", "value_coupling") => 1, + "update_type" => EnhancedUpdate(), ) @@ -263,6 +315,9 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) "name" => "x2", "type" => "continuous", "evolution_rate" => config[("x2", "evolution_rate")], + "drift" => config[("x2", "drift")], + "autoregressive_target" => config[("x2", "autoregressive_target")], + "autoregressive_rate" => config[("x2", "autoregressive_rate")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -319,14 +374,24 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) defaults = Dict( ("u", "category_means") => [0, 1], ("u", "input_precision") => Inf, + ("x2", "evolution_rate") => -2, - ("x3", "evolution_rate") => -2, - ("x1", "x2", "value_coupling") => 1, - ("x2", "x3", "volatility_coupling") => 1, + ("x2", "drift") => 0, + ("x2", "autoregressive_target") => 0, + ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + + ("x3", "evolution_rate") => -2, + ("x3", "drift") => 0, + ("x3", "autoregressive_target") => 0, + ("x3", "autoregressive_rate") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + + ("x1", "x2", "value_coupling") => 1, + ("x2", "x3", "volatility_coupling") => 1, + "update_type" => EnhancedUpdate(), ) @@ -354,6 +419,9 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) "name" => "x2", "type" => "continuous", "evolution_rate" => config[("x2", "evolution_rate")], + "drift" => config[("x2", "drift")], + "autoregressive_target" => config[("x2", "autoregressive_target")], + "autoregressive_rate" => config[("x2", "autoregressive_rate")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -361,6 +429,9 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) "name" => "x3", "type" => "continuous", "evolution_rate" => config[("x3", "evolution_rate")], + "drift" => config[("x3", "drift")], + "autoregressive_target" => config[("x3", "autoregressive_target")], + "autoregressive_rate" => config[("x3", "autoregressive_rate")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -414,14 +485,24 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) #Defaults defaults = Dict( "n_categories" => 4, + ("x2", "evolution_rate") => -2, - ("x3", "evolution_rate") => -2, - ("x1", "x2", "value_coupling") => 1, - ("x2", "x3", "volatility_coupling") => 1, + ("x2", "drift") => 0, + ("x2", "autoregressive_target") => 0, + ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + + ("x3", "evolution_rate") => -2, + ("x3", "drift") => 0, + ("x3", "autoregressive_target") => 0, + ("x3", "autoregressive_rate") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + + ("x1", "x2", "value_coupling") => 1, + ("x2", "x3", "volatility_coupling") => 1, + "update_type" => EnhancedUpdate(), ) @@ -441,11 +522,14 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) binary_continuous_parent_names = Vector{String}() #Empty lists for derived parameters - derived_parameter_value_coupling_x1_x2 = [] - derived_parameter_x2_initial_precision = [] - derived_parameter_x2_initial_mean = [] - derived_parameters_x2_evolution_rates = [] - derived_parameter_x2_x3_volatility_coupling = [] + derived_parameters_x2_initial_precision = [] + derived_parameters_x2_initial_mean = [] + derived_parameters_x2_evolution_rate = [] + derived_parameters_x2_drift = [] + derived_parameters_x2_autoregressive_target = [] + derived_parameters_x2_autoregressive_rate = [] + derived_parameters_x2_x3_volatility_coupling = [] + derived_parameters_value_coupling_x1_x2 = [] #Populate the category node vectors with node names for category_number = 1:config["n_categories"] @@ -453,7 +537,6 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) push!(binary_continuous_parent_names, "x2_" * string(category_number)) end - ##List of input nodes input_nodes = Dict("name" => "u", "type" => "categorical") @@ -472,16 +555,21 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) Dict( "name" => node_name, "type" => "continuous", - "evolution_rate" => config[("x2", "evolution_rate")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], + "evolution_rate" => config[("x2", "evolution_rate")], + "drift" => config[("x2", "drift")], + "autoregressive_target" => config[("x2", "autoregressive_target")], + "autoregressive_rate" => config[("x2", "autoregressive_rate")], ), ) #Add the derived parameter name to derived parameters vector - push!(derived_parameters_x2_evolution_rates, (node_name, "evolution_rate")) - push!(derived_parameter_x2_initial_precision, (node_name, "initial_precision")) - push!(derived_parameter_x2_initial_mean, (node_name, "initial_mean")) - + push!(derived_parameters_x2_initial_precision, (node_name, "initial_precision")) + push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) + push!(derived_parameters_x2_evolution_rate, (node_name, "evolution_rate")) + push!(derived_parameters_x2_drift, (node_name, "drift")) + push!(derived_parameters_x2_autoregressive_rate, (node_name, "autoregressive_rate")) + push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) end #Add volatility parent @@ -491,6 +579,9 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) "name" => "x3", "type" => "continuous", "evolution_rate" => config[("x3", "evolution_rate")], + "drift" => config[("x3", "drift")], + "autoregressive_target" => config[("x3", "autoregressive_target")], + "autoregressive_rate" => config[("x3", "autoregressive_rate")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -515,7 +606,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) ) #Add the derived parameter name to derived parameters vector push!( - derived_parameter_value_coupling_x1_x2, + derived_parameters_value_coupling_x1_x2, (child_name, parent_name, "value_coupling"), ) end @@ -531,7 +622,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) ) #Add the derived parameter name to derived parameters vector push!( - derived_parameter_x2_x3_volatility_coupling, + derived_parameters_x2_x3_volatility_coupling, (child_name, "x3", "volatility_coupling"), ) end @@ -540,16 +631,29 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) shared_parameters = Dict() shared_parameters["x2_evolution_rates"] = - (config[("x2", "evolution_rate")], derived_parameters_x2_evolution_rates) + (config[("x2", "evolution_rate")], derived_parameters_x2_evolution_rate) + shared_parameters["x2_initial_precisions"] = - (config[("x2", "initial_precision")], derived_parameter_x2_initial_precision) + (config[("x2", "initial_precision")], derived_parameters_x2_initial_precision) + shared_parameters["x2_initial_means"] = - (config[("x2", "initial_mean")], derived_parameter_x2_initial_mean) + (config[("x2", "initial_mean")], derived_parameters_x2_initial_mean) + + shared_parameters["x2_drifts"] = + (config[("x2", "drift")], derived_parameters_x2_drift) + + shared_parameters["x2_autoregressive_rates"] = + (config[("x2", "autoregressive_rate")], derived_parameters_x2_autoregressive_rate) + + shared_parameters["x2_autoregressive_targets"] = + (config[("x2", "autoregressive_target")], derived_parameters_x2_autoregressive_target) + shared_parameters["value_couplings_x1_x2"] = - (config[("x1", "x2", "value_coupling")], derived_parameter_value_coupling_x1_x2) + (config[("x1", "x2", "value_coupling")], derived_parameters_value_coupling_x1_x2) + shared_parameters["volatility_couplings_x2_x3"] = ( config[("x2", "x3", "volatility_coupling")], - derived_parameter_x2_x3_volatility_coupling, + derived_parameters_x2_x3_volatility_coupling, ) #Initialize the HGF @@ -596,14 +700,24 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo #Defaults defaults = Dict( "n_categories" => 4, + ("x2", "evolution_rate") => -2, - ("x3", "evolution_rate") => -2, - ("x1", "x2", "value_coupling") => 1, - ("x2", "x3", "volatility_coupling") => 1, + ("x2", "drift") => 0, + ("x2", "autoregressive_target") => 0, + ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, + + ("x3", "evolution_rate") => -2, + ("x3", "drift") => 0, + ("x3", "autoregressive_target") => 0, + ("x3", "autoregressive_rate") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, + + ("x1", "x2", "value_coupling") => 1, + ("x2", "x3", "volatility_coupling") => 1, + "update_type" => EnhancedUpdate(), ) @@ -624,10 +738,13 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo binary_node_continuous_parent_names = Vector{String}() #Empty lists for derived parameters - derived_parameters_value_coupling_x1_x2 = [] derived_parameters_x2_initial_precision = [] derived_parameters_x2_initial_mean = [] - derived_parameters_x2_evolution_rates = [] + derived_parameters_x2_evolution_rate = [] + derived_parameters_x2_drift = [] + derived_parameters_x2_autoregressive_target = [] + derived_parameters_x2_autoregressive_rate = [] + derived_parameters_value_coupling_x1_x2 = [] derived_parameters_x2_x3_volatility_coupling = [] #Go through each category that the transition may have been from @@ -684,15 +801,21 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo Dict( "name" => node_name, "type" => "continuous", - "evolution_rate" => config[("x2", "evolution_rate")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], + "evolution_rate" => config[("x2", "evolution_rate")], + "drift" => config[("x2", "drift")], + "autoregressive_target" => config[("x2", "autoregressive_target")], + "autoregressive_rate" => config[("x2", "autoregressive_rate")], ), ) #Add the derived parameter name to derived parameters vector - push!(derived_parameters_x2_evolution_rates, (node_name, "evolution_rate")) push!(derived_parameters_x2_initial_precision, (node_name, "initial_precision")) push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) + push!(derived_parameters_x2_evolution_rate, (node_name, "evolution_rate")) + push!(derived_parameters_x2_drift, (node_name, "drift")) + push!(derived_parameters_x2_autoregressive_rate, (node_name, "autoregressive_rate")) + push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) end @@ -703,6 +826,9 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo "name" => "x3", "type" => "continuous", "evolution_rate" => config[("x3", "evolution_rate")], + "drift" => config[("x3", "drift")], + "autoregressive_target" => config[("x3", "autoregressive_target")], + "autoregressive_rate" => config[("x3", "autoregressive_rate")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -782,13 +908,26 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo shared_parameters = Dict() shared_parameters["x2_evolution_rates"] = - (config[("x2", "evolution_rate")], derived_parameters_x2_evolution_rates) + (config[("x2", "evolution_rate")], derived_parameters_x2_evolution_rate) + shared_parameters["x2_initial_precisions"] = (config[("x2", "initial_precision")], derived_parameters_x2_initial_precision) + shared_parameters["x2_initial_means"] = (config[("x2", "initial_mean")], derived_parameters_x2_initial_mean) + + shared_parameters["x2_drifts"] = + (config[("x2", "drift")], derived_parameters_x2_drift) + + shared_parameters["x2_autoregressive_rates"] = + (config[("x2", "autoregressive_rate")], derived_parameters_x2_autoregressive_rate) + + shared_parameters["x2_autoregressive_targets"] = + (config[("x2", "autoregressive_target")], derived_parameters_x2_autoregressive_target) + shared_parameters["value_couplings_x1_x2"] = (config[("x1", "x2", "value_coupling")], derived_parameters_value_coupling_x1_x2) + shared_parameters["volatility_couplings_x2_x3"] = ( config[("x2", "x3", "volatility_coupling")], derived_parameters_x2_x3_volatility_coupling, diff --git a/src/structs.jl b/src/structs.jl index 59cab06..aeabecc 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -9,17 +9,7 @@ abstract type AbstractNode end abstract type AbstractStateNode <: AbstractNode end abstract type AbstractInputNode <: AbstractNode end -#Continuous state node parameter supertype -abstract type ContinuousStateNodeParameters end - -#Supertype for dynamics tyoes -abstract type ContinuousDynamicsType end - -#Random walk and AR1 dynamics types -struct RandomWalk <: ContinuousDynamicsType end -struct AR1 <: ContinuousDynamicsType end - -#Supertype for HGF uodate types +#Supertype for HGF update types abstract type HGFUpdateType end #Classic and enhance dupdate types @@ -31,24 +21,13 @@ struct EnhancedUpdate <: HGFUpdateType end ######## Continuous State Node ######## ####################################### """ -Configuration of continuous random walk state nodes' parameters +Configuration of continuous state nodes' parameters """ -Base.@kwdef mutable struct ContinuousStateNodeRandomWalkParameters <: ContinuousStateNodeParameters +Base.@kwdef mutable struct ContinuousStateNodeParameters evolution_rate::Real = 0 drift::Real = 0 - value_coupling::Dict{String,Real} = Dict{String,Real}() - volatility_coupling::Dict{String,Real} = Dict{String,Real}() - initial_mean::Real = 0 - initial_precision::Real = 0 -end - -""" -Configuration of continuous AR1 state nodes' parameters -""" -Base.@kwdef mutable struct ContinuousStateNodeAR1Parameters <: ContinuousStateNodeParameters - evolution_rate::Real = 0 - autoregressive_mean::Real = 0 - autoregressive_update_rate::Real = 0 + autoregressive_target::Real = 0 + autoregressive_rate::Real = 0 value_coupling::Dict{String,Real} = Dict{String,Real}() volatility_coupling::Dict{String,Real} = Dict{String,Real}() initial_mean::Real = 0 @@ -64,7 +43,7 @@ Base.@kwdef mutable struct ContinuousStateNodeState value_prediction_error::Union{Real,Missing} = missing volatility_prediction_error::Union{Real,Missing} = missing prediction_mean::Union{Real,Missing} = missing - prediction_volatility::Union{Real,Missing} = missing + predicted_volatility::Union{Real,Missing} = missing prediction_precision::Union{Real,Missing} = missing auxiliary_prediction_precision::Union{Real,Missing} = missing end @@ -78,7 +57,7 @@ Base.@kwdef mutable struct ContinuousStateNodeHistory value_prediction_error::Vector{Union{Real,Missing}} = [missing] volatility_prediction_error::Vector{Union{Real,Missing}} = [missing] prediction_mean::Vector{Real} = [] - prediction_volatility::Vector{Real} = [] + predicted_volatility::Vector{Real} = [] prediction_precision::Vector{Real} = [] auxiliary_prediction_precision::Vector{Real} = [] end @@ -208,7 +187,7 @@ Base.@kwdef mutable struct ContinuousInputNodeState input_value::Union{Real,Missing} = missing value_prediction_error::Union{Real,Missing} = missing volatility_prediction_error::Union{Real,Missing} = missing - prediction_volatility::Union{Real,Missing} = missing + predicted_volatility::Union{Real,Missing} = missing prediction_precision::Union{Real,Missing} = missing auxiliary_prediction_precision::Union{Real} = 1 end @@ -220,7 +199,7 @@ Base.@kwdef mutable struct ContinuousInputNodeHistory input_value::Vector{Union{Real,Missing}} = [missing] value_prediction_error::Vector{Union{Real,Missing}} = [missing] volatility_prediction_error::Vector{Union{Real,Missing}} = [missing] - prediction_volatility::Vector{Real} = [] + predicted_volatility::Vector{Real} = [] prediction_precision::Vector{Real} = [] end diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index 1ca1313..7d64b57 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -14,38 +14,47 @@ Uses the equation `` \hat{\mu}_i=\mu_i+\sum_{j=1}^{j\;value\;parents} \mu_{j} \cdot \alpha_{i,j} `` """ function calculate_prediction_mean(node::AbstractNode) + #Get out value parents value_parents = node.value_parents - prediction_mean = node.states.posterior_mean + #Initialize the total drift as the basline drift plus the autoregressive drift + predicted_drift = + node.parameters.drift + + node.parameters.autoregressive_rate * + (node.parameters.autoregressive_target - node.states.posterior_mean) + #Add contributions from value parents for parent in value_parents - prediction_mean += + predicted_drift += parent.states.posterior_mean * node.parameters.value_coupling[parent.name] end - prediction_mean += node.parameters.drift + + #Add the drift to the posterior to get the prediction mean + prediction_mean = node.states.posterior_mean + 1 * predicted_drift + return prediction_mean end ### Volatility update ### @doc raw""" - calculate_prediction_volatility(node::AbstractNode) + calculate_predicted_volatility(node::AbstractNode) Calculates a node's prediction volatility. Uses the equation `` \nu_i =exp( \omega_i + \sum_{j=1}^{j\;volatility\;parents} \mu_{j} \cdot \kappa_{i,j}} `` """ -function calculate_prediction_volatility(node::AbstractNode) +function calculate_predicted_volatility(node::AbstractNode) volatility_parents = node.volatility_parents - prediction_volatility = node.parameters.evolution_rate + predicted_volatility = node.parameters.evolution_rate for parent in volatility_parents - prediction_volatility += + predicted_volatility += parent.states.posterior_mean * node.parameters.volatility_coupling[parent.name] end - return exp(prediction_volatility) + return exp(predicted_volatility) end ### Precision update ### @@ -59,7 +68,7 @@ Uses the equation """ function calculate_prediction_precision(node::AbstractNode) prediction_precision = - 1 / (1 / node.states.posterior_precision + node.states.prediction_volatility) + 1 / (1 / node.states.posterior_precision + node.states.predicted_volatility) #If the posterior precision is negative if prediction_precision < 0 @@ -84,7 +93,7 @@ Uses the equation `` \gamma_i = \nu_i \cdot \hat{\pi}_i `` """ function calculate_auxiliary_prediction_precision(node::AbstractNode) - node.states.prediction_volatility * node.states.prediction_precision + node.states.predicted_volatility * node.states.prediction_precision end ######## Posterior update functions ######## @@ -670,7 +679,7 @@ Uses the equation function calculate_prediction_precision(node::AbstractInputNode) #Doesn't use own posterior precision - 1 / node.states.prediction_volatility + 1 / node.states.predicted_volatility end """ diff --git a/src/update_hgf/update_node.jl b/src/update_hgf/update_node.jl index 3333b1f..21e2214 100644 --- a/src/update_hgf/update_node.jl +++ b/src/update_hgf/update_node.jl @@ -13,8 +13,8 @@ function update_node_prediction!(node::AbstractStateNode) push!(node.history.prediction_mean, node.states.prediction_mean) #Update prediction volatility - node.states.prediction_volatility = calculate_prediction_volatility(node) - push!(node.history.prediction_volatility, node.states.prediction_volatility) + node.states.predicted_volatility = calculate_predicted_volatility(node) + push!(node.history.predicted_volatility, node.states.predicted_volatility) #Update prediction precision node.states.prediction_precision = calculate_prediction_precision(node) @@ -196,8 +196,8 @@ Update the posterior of a single input node. """ function update_node_prediction!(node::AbstractInputNode) #Update prediction volatility - node.states.prediction_volatility = calculate_prediction_volatility(node) - push!(node.history.prediction_volatility, node.states.prediction_volatility) + node.states.predicted_volatility = calculate_predicted_volatility(node) + push!(node.history.predicted_volatility, node.states.predicted_volatility) #Update prediction precision node.states.prediction_precision = calculate_prediction_precision(node) diff --git a/src/utils/get_prediction.jl b/src/utils/get_prediction.jl index 816bb73..83d0691 100644 --- a/src/utils/get_prediction.jl +++ b/src/utils/get_prediction.jl @@ -25,7 +25,7 @@ function get_prediction(node::AbstractNode) #Save old states old_states = (; prediction_mean = node.states.prediction_mean, - prediction_volatility = node.states.prediction_volatility, + predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, auxiliary_prediction_precision = node.states.auxiliary_prediction_precision, ) @@ -34,7 +34,7 @@ function get_prediction(node::AbstractNode) node.states.prediction_mean = calculate_prediction_mean(node) #Update prediction volatility - node.states.prediction_volatility = calculate_prediction_volatility(node) + node.states.predicted_volatility = calculate_predicted_volatility(node) #Update prediction precision node.states.prediction_precision = calculate_prediction_precision(node) @@ -45,14 +45,14 @@ function get_prediction(node::AbstractNode) #Save new states new_states = (; prediction_mean = node.states.prediction_mean, - prediction_volatility = node.states.prediction_volatility, + predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, auxiliary_prediction_precision = node.states.auxiliary_prediction_precision, ) #Change states back to the old states node.states.prediction_mean = old_states.prediction_mean - node.states.prediction_volatility = old_states.prediction_volatility + node.states.predicted_volatility = old_states.predicted_volatility node.states.prediction_precision = old_states.prediction_precision node.states.auxiliary_prediction_precision = old_states.auxiliary_prediction_precision @@ -108,25 +108,25 @@ function get_prediction(node::AbstractInputNode) #Save old states old_states = (; - prediction_volatility = node.states.prediction_volatility, + predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, ) #Update prediction volatility - node.states.prediction_volatility = calculate_prediction_volatility(node) + node.states.predicted_volatility = calculate_predicted_volatility(node) #Update prediction precision node.states.prediction_precision = calculate_prediction_precision(node) #Save new states new_states = (; - prediction_volatility = node.states.prediction_volatility, + predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, auxiliary_prediction_precision = 1.0, ) #Change states back to the old states - node.states.prediction_volatility = old_states.prediction_volatility + node.states.predicted_volatility = old_states.predicted_volatility node.states.prediction_precision = old_states.prediction_precision return new_states diff --git a/test/runtests.jl b/test/runtests.jl index 5c15390..524fd5d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -33,13 +33,26 @@ using Test end -@testset "Tutorials" begin +@testset "Documentation" begin - #Set up path for tutorials + #Set up path for the documentation folder hgf_path = dirname(dirname(pathof(HierarchicalGaussianFiltering))) - tutorials_path = hgf_path * "/docs/src/tutorials/" - - #Classic tutorials - include(tutorials_path * "classic_binary.jl") - include(tutorials_path * "classic_usdchf.jl") + documentation_path = hgf_path * "/docs/src/" + + @testset "tutorials" begin + + #Get path for the tutorials subfolder + tutorials_path = documentation_path * "tutorials/" + + #Classic tutorials + include(tutorials_path * "classic_binary.jl") + include(tutorials_path * "classic_usdchf.jl") + end + + @testset "sourcefiles" begin + + #Get path for the tutorials subfolder + sourcefiles_path = documentation_path * "Julia_src_files/" + + end end From 70543537b10f871ce60d4b8581f34fac0f1e4d43 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Sat, 21 Oct 2023 17:38:31 +0200 Subject: [PATCH 19/24] evolution rate -> input noise --- docs/src/Julia_src_files/the_HGF_nodes.jl | 2 +- docs/src/tutorials/classic_usdchf.jl | 4 ++-- src/create_hgf/init_hgf.jl | 6 ++++-- src/premade_models/premade_hgfs.jl | 12 ++++++------ src/structs.jl | 2 +- src/update_hgf/update_equations.jl | 24 +++++++++++++++++++++-- test/test_canonical.jl | 2 +- test/test_fit_model.jl | 2 +- test/test_initialization.jl | 7 ++++--- test/test_shared_parameters.jl | 2 +- 10 files changed, 43 insertions(+), 20 deletions(-) diff --git a/docs/src/Julia_src_files/the_HGF_nodes.jl b/docs/src/Julia_src_files/the_HGF_nodes.jl index 4610b48..1ae33b3 100644 --- a/docs/src/Julia_src_files/the_HGF_nodes.jl +++ b/docs/src/Julia_src_files/the_HGF_nodes.jl @@ -109,7 +109,7 @@ # ### Parameters -# - evolution rate (default is 0) +# - input noise (default is 0) # - value coupling # - volatility coupling diff --git a/docs/src/tutorials/classic_usdchf.jl b/docs/src/tutorials/classic_usdchf.jl index b2d84b1..e86aa2d 100644 --- a/docs/src/tutorials/classic_usdchf.jl +++ b/docs/src/tutorials/classic_usdchf.jl @@ -30,7 +30,7 @@ agent = premade_agent("hgf_gaussian_action", hgf, verbose = false); parameters = Dict( ("u", "x1", "value_coupling") => 1.0, ("x1", "x2", "volatility_coupling") => 1.0, - ("u", "evolution_rate") => -log(1e4), + ("u", "input_noise") => -log(1e4), ("x1", "evolution_rate") => -13, ("x2", "evolution_rate") => -2, ("x1", "initial_mean") => 1.04, @@ -91,7 +91,7 @@ fixed_parameters = Dict( ); param_priors = Dict( - ("u", "evolution_rate") => Normal(-6, 1), + ("u", "input_noise") => Normal(-6, 1), ("x1", "evolution_rate") => Normal(-4, 1), ("x2", "evolution_rate") => Normal(-4, 1), ); diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index c12f60f..6519956 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -28,7 +28,7 @@ Edge information includes 'child', as well as 'value_parents' and/or 'volatility input_nodes = Dict( "name" => "u", "type" => "continuous", - "evolution_rate" => -2, + "input_noise" => -2, ) #List of state nodes @@ -73,6 +73,7 @@ hgf = init_hgf( #Set defaults for all nodes node_defaults = Dict( "evolution_rate" => -2, + "input_noise" => -2, "initial_mean" => 0, "initial_precision" => 1, "value_coupling" => 1, @@ -142,6 +143,7 @@ function init_hgf(; "volatility_coupling" => 1, "category_means" => [0, 1], "input_precision" => Inf, + "input_noise" => -2 ) #If verbose @@ -481,7 +483,7 @@ function init_node(input_or_state_node, node_defaults, node_info) node = ContinuousInputNode( name = parameters["name"], parameters = ContinuousInputNodeParameters( - evolution_rate = parameters["evolution_rate"], + input_noise = parameters["input_noise"], ), states = ContinuousInputNodeState(), ) diff --git a/src/premade_models/premade_hgfs.jl b/src/premade_models/premade_hgfs.jl index b32246b..fa89000 100644 --- a/src/premade_models/premade_hgfs.jl +++ b/src/premade_models/premade_hgfs.jl @@ -5,7 +5,7 @@ The standard 2 level continuous HGF, which filters a continuous input. It has a continous input node u, with a single value parent x1, which in turn has a single volatility parent x2. # Config defaults: - - ("u", "evolution_rate"): -2 + - ("u", "input_noise"): -2 - ("x1", "evolution_rate"): -2 - ("x2", "evolution_rate"): -2 - ("u", "x1", "value_coupling"): 1 @@ -19,7 +19,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) #Defaults spec_defaults = Dict( - ("u", "evolution_rate") => -2, + ("u", "input_noise") => -2, ("x1", "evolution_rate") => -2, ("x1", "drift") => 0, @@ -54,7 +54,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) input_nodes = Dict( "name" => "u", "type" => "continuous", - "evolution_rate" => config[("u", "evolution_rate")], + "input_noise" => config[("u", "input_noise")], ) #List of state nodes to create @@ -110,7 +110,7 @@ premade_JGET(config::Dict; verbose::Bool = true) The HGF used in the JGET model. It has a single continuous input node u, with a value parent x1, and a volatility parent x3. x1 has volatility parent x2, and x3 has a volatility parent x4. # Config defaults: - - ("u", "evolution_rate"): -2 + - ("u", "input_noise"): -2 - ("x1", "evolution_rate"): -2 - ("x2", "evolution_rate"): -2 - ("x3", "evolution_rate"): -2 @@ -132,7 +132,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) #Defaults spec_defaults = Dict( - ("u", "evolution_rate") => -2, + ("u", "input_noise") => -2, ("x1", "evolution_rate") => -2, ("x1", "drift") => 0, @@ -183,7 +183,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) input_nodes = Dict( "name" => "u", "type" => "continuous", - "evolution_rate" => config[("u", "evolution_rate")], + "input_noise" => config[("u", "input_noise")], ) #List of state nodes to create diff --git a/src/structs.jl b/src/structs.jl index aeabecc..43ad16b 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -175,7 +175,7 @@ end Configuration of continuous input node parameters """ Base.@kwdef mutable struct ContinuousInputNodeParameters - evolution_rate::Real = 0 + input_noise::Real = 0 value_coupling::Dict{String,Real} = Dict{String,Real}() volatility_coupling::Dict{String,Real} = Dict{String,Real}() end diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index 7d64b57..98eb62c 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -668,6 +668,28 @@ end ################################################### ######## Conntinuous Input Node Variations ######## ################################################### + +@doc raw""" + calculate_predicted_volatility(node::AbstractInputNode) + +Calculates an input node's prediction volatility. + +Uses the equation +`` \nu_i =exp( \omega_i + \sum_{j=1}^{j\;volatility\;parents} \mu_{j} \cdot \kappa_{i,j}} `` +""" +function calculate_predicted_volatility(node::AbstractInputNode) + volatility_parents = node.volatility_parents + + predicted_volatility = node.parameters.input_noise + + for parent in volatility_parents + predicted_volatility += + parent.states.posterior_mean * node.parameters.volatility_coupling[parent.name] + end + + return exp(predicted_volatility) +end + @doc raw""" calculate_prediction_precision(node::AbstractInputNode) @@ -698,8 +720,6 @@ Calculate's an input node's value prediction error. Uses the equation ``\delta_n= u - \sum_{j=1}^{j\;value\;parents} \hat{\mu}_{j} `` - - """ function calculate_value_prediction_error(node::ContinuousInputNode) #For missing input diff --git a/test/test_canonical.jl b/test/test_canonical.jl index 88fed11..59d6110 100644 --- a/test/test_canonical.jl +++ b/test/test_canonical.jl @@ -38,7 +38,7 @@ using Plots parameters = Dict( ("u", "x1", "value_coupling") => 1.0, ("x1", "x2", "volatility_coupling") => 1.0, - ("u", "evolution_rate") => log(1e-4), + ("u", "input_noise") => log(1e-4), ("x1", "evolution_rate") => -13, ("x2", "evolution_rate") => -2, ("x1", "initial_mean") => 1.04, diff --git a/test/test_fit_model.jl b/test/test_fit_model.jl index 3ef7e3d..4f1d054 100644 --- a/test/test_fit_model.jl +++ b/test/test_fit_model.jl @@ -29,7 +29,7 @@ using Turing ("x1", "x2", "volatility_coupling") => 1.0, "gaussian_action_precision" => 100, ("x2", "evolution_rate") => -4, - ("u", "evolution_rate") => 4, + ("u", "input_noise") => 4, ("x2", "drift") => 1, ) diff --git a/test/test_initialization.jl b/test/test_initialization.jl index 3d7625e..6b8dd4a 100644 --- a/test/test_initialization.jl +++ b/test/test_initialization.jl @@ -5,6 +5,7 @@ using Test #Parameter values to be used for all nodes unless other values are given node_defaults = Dict( "evolution_rate" => 3, + "input_noise" => -2, "category_means" => [0, 1], "input_precision" => Inf, "initial_mean" => 1, @@ -14,7 +15,7 @@ using Test ) #List of input nodes to create - input_nodes = [Dict("name" => "u1", "evolution_rate" => 2), "u2"] + input_nodes = [Dict("name" => "u1", "input_noise" => 2), "u2"] #List of state nodes to create state_nodes = [ @@ -52,8 +53,8 @@ using Test ) @testset "Check if inputs were placed the right places" begin - @test test_hgf.input_nodes["u1"].parameters.evolution_rate == 2 - @test test_hgf.input_nodes["u2"].parameters.evolution_rate == 3 + @test test_hgf.input_nodes["u1"].parameters.input_noise == 2 + @test test_hgf.input_nodes["u2"].parameters.input_noise == -2 @test test_hgf.state_nodes["x1"].parameters.evolution_rate == 3 @test test_hgf.state_nodes["x2"].parameters.evolution_rate == 3 diff --git a/test/test_shared_parameters.jl b/test/test_shared_parameters.jl index a182293..13e4dc8 100644 --- a/test/test_shared_parameters.jl +++ b/test/test_shared_parameters.jl @@ -4,7 +4,7 @@ using Test # Test of custom HGF with shared parameters #List of input nodes to create -input_nodes = Dict("name" => "u", "type" => "continuous", "evolution_rate" => 2) +input_nodes = Dict("name" => "u", "type" => "continuous", "input_noise" => 2) #List of state nodes to create state_nodes = [ From e0e2b1c186ca59a723ad7f9fafbab95852a8d0a3 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Sat, 21 Oct 2023 17:46:50 +0200 Subject: [PATCH 20/24] auxiliary prediction precision -> volatility-weighted prediction precision & eovlution rate -> volatility --- README.md | 2 +- docs/src/Julia_src_files/building_an_HGF.jl | 2 +- .../src/Julia_src_files/fitting_hgf_models.jl | 8 +- docs/src/Julia_src_files/index.jl | 2 +- docs/src/Julia_src_files/premade_models.jl | 2 +- docs/src/Julia_src_files/utility_functions.jl | 8 +- docs/src/index.md | 2 +- docs/src/tutorials/classic_JGET.jl | 10 +- docs/src/tutorials/classic_binary.jl | 8 +- docs/src/tutorials/classic_usdchf.jl | 8 +- .../utils/get_states.jl | 2 +- src/ActionModels_variations/utils/reset.jl | 4 +- src/create_hgf/init_hgf.jl | 10 +- src/premade_models/premade_hgfs.jl | 98 +++++++++---------- src/structs.jl | 8 +- src/update_hgf/update_equations.jl | 20 ++-- src/update_hgf/update_node.jl | 8 +- src/utils/get_prediction.jl | 12 +-- test/test_canonical.jl | 8 +- test/test_fit_model.jl | 8 +- test/test_initialization.jl | 16 +-- test/test_shared_parameters.jl | 18 ++-- 22 files changed, 132 insertions(+), 132 deletions(-) diff --git a/README.md b/README.md index 1dfd089..5e548de 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ plot_trajectory!(agent, ("x1", "prediction")) ````@example index using Distributions -prior = Dict(("x2", "evolution_rate") => Normal(1, 0.5)) +prior = Dict(("x2", "volatility") => Normal(1, 0.5)) model = fit_model(agent, prior, inputs, actions, n_iterations = 20) ```` diff --git a/docs/src/Julia_src_files/building_an_HGF.jl b/docs/src/Julia_src_files/building_an_HGF.jl index 597ed76..7f1b0d7 100644 --- a/docs/src/Julia_src_files/building_an_HGF.jl +++ b/docs/src/Julia_src_files/building_an_HGF.jl @@ -37,7 +37,7 @@ state_nodes = [ Dict( "name" => "continuous_state_node", "type" => "continuous", - "evolution_rate" => -2, + "volatility" => -2, "initial_mean" => 0, "initial_precision" => 1, ), diff --git a/docs/src/Julia_src_files/fitting_hgf_models.jl b/docs/src/Julia_src_files/fitting_hgf_models.jl index 3a38909..3970a92 100644 --- a/docs/src/Julia_src_files/fitting_hgf_models.jl +++ b/docs/src/Julia_src_files/fitting_hgf_models.jl @@ -47,10 +47,10 @@ using HierarchicalGaussianFiltering hgf_parameters = Dict( ("u", "category_means") => Real[0.0, 1.0], ("u", "input_precision") => Inf, - ("x2", "evolution_rate") => -2.5, + ("x2", "volatility") => -2.5, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -6.0, + ("x3", "volatility") => -6.0, ("x3", "initial_mean") => 1, ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, @@ -95,12 +95,12 @@ fixed_parameters = Dict( ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, ("x2", "x3", "volatility_coupling") => 1.0, - ("x3", "evolution_rate") => -6.0, + ("x3", "volatility") => -6.0, ); # As you can read from the fixed parameters, the evolution rate of x2 is not configured. We set the prior for the x2 evolution rate: using Distributions -param_priors = Dict(("x2", "evolution_rate") => Normal(-3.0, 0.5)); +param_priors = Dict(("x2", "volatility") => Normal(-3.0, 0.5)); # We can fit the evolution rate by inputting the variables: diff --git a/docs/src/Julia_src_files/index.jl b/docs/src/Julia_src_files/index.jl index c977407..f079a20 100644 --- a/docs/src/Julia_src_files/index.jl +++ b/docs/src/Julia_src_files/index.jl @@ -53,7 +53,7 @@ plot_trajectory!(agent, ("x1", "prediction")) # ### Fitting parameters using Distributions -prior = Dict(("x2", "evolution_rate") => Normal(1, 0.5)) +prior = Dict(("x2", "volatility") => Normal(1, 0.5)) model = fit_model(agent, prior, inputs, actions, n_iterations = 20) diff --git a/docs/src/Julia_src_files/premade_models.jl b/docs/src/Julia_src_files/premade_models.jl index d2b8e7c..54f4222 100644 --- a/docs/src/Julia_src_files/premade_models.jl +++ b/docs/src/Julia_src_files/premade_models.jl @@ -75,7 +75,7 @@ set_parameters!(agent, ("x3", "initial_precision"), 0.4) # Set multiple parameter values set_parameters!( agent, - Dict(("x3", "initial_precision") => 1, ("x3", "evolution_rate") => 0), + Dict(("x3", "initial_precision") => 1, ("x3", "volatility") => 0), ) diff --git a/docs/src/Julia_src_files/utility_functions.jl b/docs/src/Julia_src_files/utility_functions.jl index 15dd25b..bc5324f 100644 --- a/docs/src/Julia_src_files/utility_functions.jl +++ b/docs/src/Julia_src_files/utility_functions.jl @@ -34,7 +34,7 @@ get_parameters(agent) # ERROR WITH THIS get_parameters(agent, ("x2", "x3", "volatility_coupling")) # getting multiple parameters specify them in a vector -get_parameters(agent, [("x3", "evolution_rate"), ("x3", "initial_precision")]) +get_parameters(agent, [("x3", "volatility"), ("x3", "initial_precision")]) # ### Getting States @@ -46,7 +46,7 @@ get_states(agent) get_states(agent, ("x2", "posterior_precision")) #getting multiple states -get_states(agent, [("x2", "posterior_precision"), ("x2", "auxiliary_prediction_precision")]) +get_states(agent, [("x2", "posterior_precision"), ("x2", "volatility_weighted_prediction_precision")]) # ### Setting Parameters @@ -61,10 +61,10 @@ agent_parameter = Dict("sigmoid_action_precision" => 3) hgf_parameters = Dict( ("u", "category_means") => Real[0.0, 1.0], ("u", "input_precision") => Inf, - ("x2", "evolution_rate") => -2.5, + ("x2", "volatility") => -2.5, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -6.0, + ("x3", "volatility") => -6.0, ("x3", "initial_mean") => 1, ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, diff --git a/docs/src/index.md b/docs/src/index.md index 861e5dc..c7e3555 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -84,7 +84,7 @@ plot_trajectory!(agent, ("x1", "prediction")) ````@example index using Distributions -prior = Dict(("x2", "evolution_rate") => Normal(1, 0.5)) +prior = Dict(("x2", "volatility") => Normal(1, 0.5)) model = fit_model(agent, prior, inputs, actions, n_iterations = 20) ```` diff --git a/docs/src/tutorials/classic_JGET.jl b/docs/src/tutorials/classic_JGET.jl index 2e933c7..0aae4de 100644 --- a/docs/src/tutorials/classic_JGET.jl +++ b/docs/src/tutorials/classic_JGET.jl @@ -14,10 +14,10 @@ agent = premade_agent("hgf_gaussian_action", hgf) #Set parameters parameters = Dict( "gaussian_action_precision" => 1, - ("x1", "evolution_rate") => -8, - ("x2", "evolution_rate") => -5, - ("x3", "evolution_rate") => -5, - ("x4", "evolution_rate") => -5, + ("x1", "volatility") => -8, + ("x2", "volatility") => -5, + ("x3", "volatility") => -5, + ("x4", "volatility") => -5, ("x1", "x2", "volatility_coupling") => 1, ("x3", "x4", "volatility_coupling") => 1, ) @@ -35,7 +35,7 @@ plot_trajectory(agent, "x4") priors = Dict( "gaussian_action_precision" => LogNormal(-1, 0.1), - ("x1", "evolution_rate") => Normal(-8, 1), + ("x1", "volatility") => Normal(-8, 1), ) data_subset = data[(data.ID.∈[[20, 21]]).&(data.session.∈[[1, 2]]), :] diff --git a/docs/src/tutorials/classic_binary.jl b/docs/src/tutorials/classic_binary.jl index d62ca80..d29f30d 100644 --- a/docs/src/tutorials/classic_binary.jl +++ b/docs/src/tutorials/classic_binary.jl @@ -23,10 +23,10 @@ inputs = CSV.read(data_path * "classic_binary_inputs.csv", DataFrame)[!, 1]; hgf_parameters = Dict( ("u", "category_means") => Real[0.0, 1.0], ("u", "input_precision") => Inf, - ("x2", "evolution_rate") => -2.5, + ("x2", "volatility") => -2.5, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -6.0, + ("x3", "volatility") => -6.0, ("x3", "initial_mean") => 1, ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, @@ -64,11 +64,11 @@ fixed_parameters = Dict( ("x3", "initial_precision") => 1, ("x1", "x2", "value_coupling") => 1.0, ("x2", "x3", "volatility_coupling") => 1.0, - ("x3", "evolution_rate") => -6.0, + ("x3", "volatility") => -6.0, ); # Set priors for parameter recovery -param_priors = Dict(("x2", "evolution_rate") => Normal(-3.0, 0.5)); +param_priors = Dict(("x2", "volatility") => Normal(-3.0, 0.5)); #- # Prior predictive plot plot_predictive_simulation( diff --git a/docs/src/tutorials/classic_usdchf.jl b/docs/src/tutorials/classic_usdchf.jl index e86aa2d..bb305a6 100644 --- a/docs/src/tutorials/classic_usdchf.jl +++ b/docs/src/tutorials/classic_usdchf.jl @@ -31,8 +31,8 @@ parameters = Dict( ("u", "x1", "value_coupling") => 1.0, ("x1", "x2", "volatility_coupling") => 1.0, ("u", "input_noise") => -log(1e4), - ("x1", "evolution_rate") => -13, - ("x2", "evolution_rate") => -2, + ("x1", "volatility") => -13, + ("x2", "volatility") => -2, ("x1", "initial_mean") => 1.04, ("x1", "initial_precision") => 1 / (0.0001), ("x2", "initial_mean") => 1.0, @@ -92,8 +92,8 @@ fixed_parameters = Dict( param_priors = Dict( ("u", "input_noise") => Normal(-6, 1), - ("x1", "evolution_rate") => Normal(-4, 1), - ("x2", "evolution_rate") => Normal(-4, 1), + ("x1", "volatility") => Normal(-4, 1), + ("x2", "volatility") => Normal(-4, 1), ); #- # Prior predictive simulation plot diff --git a/src/ActionModels_variations/utils/get_states.jl b/src/ActionModels_variations/utils/get_states.jl index d6c03c4..e37da53 100644 --- a/src/ActionModels_variations/utils/get_states.jl +++ b/src/ActionModels_variations/utils/get_states.jl @@ -45,7 +45,7 @@ function ActionModels.get_states(node::AbstractNode, state_name::String) "prediction_mean", "predicted_volatility", "prediction_precision", - "auxiliary_prediction_precision", + "volatility_weighted_prediction_precision", ] #Get the new prediction prediction = get_prediction(node) diff --git a/src/ActionModels_variations/utils/reset.jl b/src/ActionModels_variations/utils/reset.jl index aad3535..88c826c 100644 --- a/src/ActionModels_variations/utils/reset.jl +++ b/src/ActionModels_variations/utils/reset.jl @@ -34,7 +34,7 @@ function ActionModels.reset!(hgf::HGF) :prediction_mean, :predicted_volatility, :prediction_precision, - :auxiliary_prediction_precision, + :volatility_weighted_prediction_precision, ] #Set the state to missing setfield!(node.states, state_name, missing) @@ -77,7 +77,7 @@ function ActionModels.reset!(hgf::HGF) :prediction_mean, :predicted_volatility, :prediction_precision, - :auxiliary_prediction_precision, + :volatility_weighted_prediction_precision, ] ) #Add the new current state as the first state in the history diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index 6519956..c3a76af 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -36,14 +36,14 @@ state_nodes = [ Dict( "name" => "x1", "type" => "continuous", - "evolution_rate" => -2, + "volatility" => -2, "initial_mean" => 0, "initial_precision" => 1, ), Dict( "name" => "x2", "type" => "continuous", - "evolution_rate" => -2, + "volatility" => -2, "initial_mean" => 0, "initial_precision" => 1, ), @@ -72,7 +72,7 @@ hgf = init_hgf( #Set defaults for all nodes node_defaults = Dict( - "evolution_rate" => -2, + "volatility" => -2, "input_noise" => -2, "initial_mean" => 0, "initial_precision" => 1, @@ -133,7 +133,7 @@ function init_hgf(; ### Defaults ### preset_node_defaults = Dict( "type" => "continuous", - "evolution_rate" => -2, + "volatility" => -2, "drift" => 0, "autoregressive_target" => 0, "autoregressive_rate" => 0, @@ -522,7 +522,7 @@ function init_node(input_or_state_node, node_defaults, node_info) name = parameters["name"], #Set parameters parameters = ContinuousStateNodeParameters( - evolution_rate = parameters["evolution_rate"], + volatility = parameters["volatility"], drift = parameters["drift"], initial_mean = parameters["initial_mean"], initial_precision = parameters["initial_precision"], diff --git a/src/premade_models/premade_hgfs.jl b/src/premade_models/premade_hgfs.jl index fa89000..f64c609 100644 --- a/src/premade_models/premade_hgfs.jl +++ b/src/premade_models/premade_hgfs.jl @@ -6,8 +6,8 @@ It has a continous input node u, with a single value parent x1, which in turn ha # Config defaults: - ("u", "input_noise"): -2 - - ("x1", "evolution_rate"): -2 - - ("x2", "evolution_rate"): -2 + - ("x1", "volatility"): -2 + - ("x2", "volatility"): -2 - ("u", "x1", "value_coupling"): 1 - ("x1", "x2", "volatility_coupling"): 1 - ("x1", "initial_mean"): 0 @@ -21,14 +21,14 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) spec_defaults = Dict( ("u", "input_noise") => -2, - ("x1", "evolution_rate") => -2, + ("x1", "volatility") => -2, ("x1", "drift") => 0, ("x1", "autoregressive_target") => 0, ("x1", "autoregressive_rate") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, - ("x2", "evolution_rate") => -2, + ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, ("x2", "autoregressive_rate") => 0, @@ -62,7 +62,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) Dict( "name" => "x1", "type" => "continuous", - "evolution_rate" => config[("x1", "evolution_rate")], + "volatility" => config[("x1", "volatility")], "drift" => config[("x1", "drift")], "autoregressive_target" => config[("x1", "autoregressive_target")], "autoregressive_rate" => config[("x1", "autoregressive_rate")], @@ -72,7 +72,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) Dict( "name" => "x2", "type" => "continuous", - "evolution_rate" => config[("x2", "evolution_rate")], + "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], "autoregressive_rate" => config[("x2", "autoregressive_rate")], @@ -111,10 +111,10 @@ The HGF used in the JGET model. It has a single continuous input node u, with a # Config defaults: - ("u", "input_noise"): -2 - - ("x1", "evolution_rate"): -2 - - ("x2", "evolution_rate"): -2 - - ("x3", "evolution_rate"): -2 - - ("x4", "evolution_rate"): -2 + - ("x1", "volatility"): -2 + - ("x2", "volatility"): -2 + - ("x3", "volatility"): -2 + - ("x4", "volatility"): -2 - ("u", "x1", "value_coupling"): 1 - ("u", "x3", "value_coupling"): 1 - ("x1", "x2", "volatility_coupling"): 1 @@ -134,28 +134,28 @@ function premade_JGET(config::Dict; verbose::Bool = true) spec_defaults = Dict( ("u", "input_noise") => -2, - ("x1", "evolution_rate") => -2, + ("x1", "volatility") => -2, ("x1", "drift") => 0, ("x1", "autoregressive_target") => 0, ("x1", "autoregressive_rate") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, - ("x2", "evolution_rate") => -2, + ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -2, + ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, ("x3", "autoregressive_rate") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, - ("x4", "evolution_rate") => -2, + ("x4", "volatility") => -2, ("x4", "drift") => 0, ("x4", "autoregressive_target") => 0, ("x4", "autoregressive_rate") => 0, @@ -191,7 +191,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) Dict( "name" => "x1", "type" => "continuous", - "evolution_rate" => config[("x1", "evolution_rate")], + "volatility" => config[("x1", "volatility")], "drift" => config[("x1", "drift")], "autoregressive_target" => config[("x1", "autoregressive_target")], "autoregressive_rate" => config[("x1", "autoregressive_rate")], @@ -201,7 +201,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) Dict( "name" => "x2", "type" => "continuous", - "evolution_rate" => config[("x2", "evolution_rate")], + "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], "autoregressive_rate" => config[("x2", "autoregressive_rate")], @@ -211,7 +211,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) Dict( "name" => "x3", "type" => "continuous", - "evolution_rate" => config[("x3", "evolution_rate")], + "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], "autoregressive_rate" => config[("x3", "autoregressive_rate")], @@ -221,7 +221,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) Dict( "name" => "x4", "type" => "continuous", - "evolution_rate" => config[("x4", "evolution_rate")], + "volatility" => config[("x4", "volatility")], "drift" => config[("x4", "drift")], "autoregressive_target" => config[("x4", "autoregressive_target")], "autoregressive_rate" => config[("x4", "autoregressive_rate")], @@ -267,7 +267,7 @@ It has one binary input node u, with a binary value parent x1, which in turn has # Config defaults: - ("u", "category_means"): [0, 1] - ("u", "input_precision"): Inf - - ("x2", "evolution_rate"): -2 + - ("x2", "volatility"): -2 - ("x1", "x2", "value_coupling"): 1 - ("x2", "initial_mean"): 0 - ("x2", "initial_precision"): 1 @@ -279,7 +279,7 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) ("u", "category_means") => [0, 1], ("u", "input_precision") => Inf, - ("x2", "evolution_rate") => -2, + ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, ("x2", "autoregressive_rate") => 0, @@ -314,7 +314,7 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) Dict( "name" => "x2", "type" => "continuous", - "evolution_rate" => config[("x2", "evolution_rate")], + "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], "autoregressive_rate" => config[("x2", "autoregressive_rate")], @@ -350,7 +350,7 @@ The standard binary 3 level HGF model, which takes a binary input, and learns th It has one binary input node u, with a binary value parent x1, which in turn has a continuous value parent x2. This then has a continunous volatility parent x3. This HGF has five shared parameters: -"x2_evolution_rates" +"x2_volatility" "x2_initial_precisions" "x2_initial_means" "value_couplings_x1_x2" @@ -359,8 +359,8 @@ This HGF has five shared parameters: # Config defaults: - ("u", "category_means"): [0, 1] - ("u", "input_precision"): Inf - - ("x2", "evolution_rate"): -2 - - ("x3", "evolution_rate"): -2 + - ("x2", "volatility"): -2 + - ("x3", "volatility"): -2 - ("x1", "x2", "value_coupling"): 1 - ("x2", "x3", "volatility_coupling"): 1 - ("x2", "initial_mean"): 0 @@ -375,14 +375,14 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) ("u", "category_means") => [0, 1], ("u", "input_precision") => Inf, - ("x2", "evolution_rate") => -2, + ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -2, + ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, ("x3", "autoregressive_rate") => 0, @@ -418,7 +418,7 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) Dict( "name" => "x2", "type" => "continuous", - "evolution_rate" => config[("x2", "evolution_rate")], + "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], "autoregressive_rate" => config[("x2", "autoregressive_rate")], @@ -428,7 +428,7 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) Dict( "name" => "x3", "type" => "continuous", - "evolution_rate" => config[("x3", "evolution_rate")], + "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], "autoregressive_rate" => config[("x3", "autoregressive_rate")], @@ -471,8 +471,8 @@ Setting parameter values for x1 and x2 sets that parameter value for each of the # Config defaults: - "n_categories": 4 - - ("x2", "evolution_rate"): -2 - - ("x3", "evolution_rate"): -2 + - ("x2", "volatility"): -2 + - ("x3", "volatility"): -2 - ("x1", "x2", "value_coupling"): 1 - ("x2", "x3", "volatility_coupling"): 1 - ("x2", "initial_mean"): 0 @@ -486,14 +486,14 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) defaults = Dict( "n_categories" => 4, - ("x2", "evolution_rate") => -2, + ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -2, + ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, ("x3", "autoregressive_rate") => 0, @@ -524,7 +524,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) #Empty lists for derived parameters derived_parameters_x2_initial_precision = [] derived_parameters_x2_initial_mean = [] - derived_parameters_x2_evolution_rate = [] + derived_parameters_x2_volatility = [] derived_parameters_x2_drift = [] derived_parameters_x2_autoregressive_target = [] derived_parameters_x2_autoregressive_rate = [] @@ -557,7 +557,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) "type" => "continuous", "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], - "evolution_rate" => config[("x2", "evolution_rate")], + "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], "autoregressive_rate" => config[("x2", "autoregressive_rate")], @@ -566,7 +566,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) #Add the derived parameter name to derived parameters vector push!(derived_parameters_x2_initial_precision, (node_name, "initial_precision")) push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) - push!(derived_parameters_x2_evolution_rate, (node_name, "evolution_rate")) + push!(derived_parameters_x2_volatility, (node_name, "volatility")) push!(derived_parameters_x2_drift, (node_name, "drift")) push!(derived_parameters_x2_autoregressive_rate, (node_name, "autoregressive_rate")) push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) @@ -578,7 +578,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) Dict( "name" => "x3", "type" => "continuous", - "evolution_rate" => config[("x3", "evolution_rate")], + "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], "autoregressive_rate" => config[("x3", "autoregressive_rate")], @@ -630,8 +630,8 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) #Create dictionary with shared parameter information shared_parameters = Dict() - shared_parameters["x2_evolution_rates"] = - (config[("x2", "evolution_rate")], derived_parameters_x2_evolution_rate) + shared_parameters["x2_volatility"] = + (config[("x2", "volatility")], derived_parameters_x2_volatility) shared_parameters["x2_initial_precisions"] = (config[("x2", "initial_precision")], derived_parameters_x2_initial_precision) @@ -678,7 +678,7 @@ Finally, all of these continuous nodes share a continuous volatility parent x3. Setting parameter values for x1 and x2 sets that parameter value for each of the x1_n_m and x2_n_m nodes. This HGF has five shared parameters: -"x2_evolution_rates" +"x2_volatility" "x2_initial_precisions" "x2_initial_means" "value_couplings_x1_x2" @@ -686,8 +686,8 @@ This HGF has five shared parameters: # Config defaults: - "n_categories": 4 - - ("x2", "evolution_rate"): -2 - - ("x3", "evolution_rate"): -2 + - ("x2", "volatility"): -2 + - ("x3", "volatility"): -2 - ("x1", "x2", "volatility_coupling"): 1 - ("x2", "x3", "volatility_coupling"): 1 - ("x2", "initial_mean"): 0 @@ -701,14 +701,14 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo defaults = Dict( "n_categories" => 4, - ("x2", "evolution_rate") => -2, + ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, ("x2", "autoregressive_rate") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, - ("x3", "evolution_rate") => -2, + ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, ("x3", "autoregressive_rate") => 0, @@ -740,7 +740,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo #Empty lists for derived parameters derived_parameters_x2_initial_precision = [] derived_parameters_x2_initial_mean = [] - derived_parameters_x2_evolution_rate = [] + derived_parameters_x2_volatility = [] derived_parameters_x2_drift = [] derived_parameters_x2_autoregressive_target = [] derived_parameters_x2_autoregressive_rate = [] @@ -803,7 +803,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo "type" => "continuous", "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], - "evolution_rate" => config[("x2", "evolution_rate")], + "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], "autoregressive_rate" => config[("x2", "autoregressive_rate")], @@ -812,7 +812,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo #Add the derived parameter name to derived parameters vector push!(derived_parameters_x2_initial_precision, (node_name, "initial_precision")) push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) - push!(derived_parameters_x2_evolution_rate, (node_name, "evolution_rate")) + push!(derived_parameters_x2_volatility, (node_name, "volatility")) push!(derived_parameters_x2_drift, (node_name, "drift")) push!(derived_parameters_x2_autoregressive_rate, (node_name, "autoregressive_rate")) push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) @@ -825,7 +825,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo Dict( "name" => "x3", "type" => "continuous", - "evolution_rate" => config[("x3", "evolution_rate")], + "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], "autoregressive_rate" => config[("x3", "autoregressive_rate")], @@ -907,8 +907,8 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo shared_parameters = Dict() - shared_parameters["x2_evolution_rates"] = - (config[("x2", "evolution_rate")], derived_parameters_x2_evolution_rate) + shared_parameters["x2_volatility"] = + (config[("x2", "volatility")], derived_parameters_x2_volatility) shared_parameters["x2_initial_precisions"] = (config[("x2", "initial_precision")], derived_parameters_x2_initial_precision) diff --git a/src/structs.jl b/src/structs.jl index 43ad16b..4cab26e 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -24,7 +24,7 @@ struct EnhancedUpdate <: HGFUpdateType end Configuration of continuous state nodes' parameters """ Base.@kwdef mutable struct ContinuousStateNodeParameters - evolution_rate::Real = 0 + volatility::Real = 0 drift::Real = 0 autoregressive_target::Real = 0 autoregressive_rate::Real = 0 @@ -45,7 +45,7 @@ Base.@kwdef mutable struct ContinuousStateNodeState prediction_mean::Union{Real,Missing} = missing predicted_volatility::Union{Real,Missing} = missing prediction_precision::Union{Real,Missing} = missing - auxiliary_prediction_precision::Union{Real,Missing} = missing + volatility_weighted_prediction_precision::Union{Real,Missing} = missing end """ @@ -59,7 +59,7 @@ Base.@kwdef mutable struct ContinuousStateNodeHistory prediction_mean::Vector{Real} = [] predicted_volatility::Vector{Real} = [] prediction_precision::Vector{Real} = [] - auxiliary_prediction_precision::Vector{Real} = [] + volatility_weighted_prediction_precision::Vector{Real} = [] end """ @@ -189,7 +189,7 @@ Base.@kwdef mutable struct ContinuousInputNodeState volatility_prediction_error::Union{Real,Missing} = missing predicted_volatility::Union{Real,Missing} = missing prediction_precision::Union{Real,Missing} = missing - auxiliary_prediction_precision::Union{Real} = 1 + volatility_weighted_prediction_precision::Union{Real} = 1 end """ diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index 98eb62c..6a6df87 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -47,7 +47,7 @@ Uses the equation function calculate_predicted_volatility(node::AbstractNode) volatility_parents = node.volatility_parents - predicted_volatility = node.parameters.evolution_rate + predicted_volatility = node.parameters.volatility for parent in volatility_parents predicted_volatility += @@ -85,14 +85,14 @@ function calculate_prediction_precision(node::AbstractNode) end @doc raw""" - calculate_auxiliary_prediction_precision(node::AbstractNode) + calculate_volatility_weighted_prediction_precision(node::AbstractNode) Calculates a node's auxiliary prediction precision. Uses the equation `` \gamma_i = \nu_i \cdot \hat{\pi}_i `` """ -function calculate_auxiliary_prediction_precision(node::AbstractNode) +function calculate_volatility_weighted_prediction_precision(node::AbstractNode) node.states.predicted_volatility * node.states.prediction_precision end @@ -197,16 +197,16 @@ function calculate_posterior_precision_vope(node::AbstractNode, child::AbstractN 1 / 2 * ( child.parameters.volatility_coupling[node.name] * - child.states.auxiliary_prediction_precision + child.states.volatility_weighted_prediction_precision )^2 + child.states.volatility_prediction_error * ( child.parameters.volatility_coupling[node.name] * - child.states.auxiliary_prediction_precision + child.states.volatility_weighted_prediction_precision )^2 - 1 / 2 * child.parameters.volatility_coupling[node.name]^2 * - child.states.auxiliary_prediction_precision * + child.states.volatility_weighted_prediction_precision * child.states.volatility_prediction_error return update_term @@ -371,7 +371,7 @@ function calculate_posterior_mean_volatility_child_increment( update_term = 1 / 2 * ( child.parameters.volatility_coupling[node.name] * - child.states.auxiliary_prediction_precision + child.states.volatility_weighted_prediction_precision ) / node.states.posterior_precision * child.states.volatility_prediction_error return update_term @@ -399,7 +399,7 @@ function calculate_posterior_mean_volatility_child_increment( update_term = 1 / 2 * ( child.parameters.volatility_coupling[node.name] * - child.states.auxiliary_prediction_precision + child.states.volatility_weighted_prediction_precision ) / node.states.prediction_precision * child.states.volatility_prediction_error return update_term @@ -705,11 +705,11 @@ function calculate_prediction_precision(node::AbstractInputNode) end """ - calculate_auxiliary_prediction_precision(node::AbstractInputNode) + calculate_volatility_weighted_prediction_precision(node::AbstractInputNode) An input node's auxiliary prediction precision is always 1. """ -function calculate_auxiliary_prediction_precision(node::AbstractInputNode) +function calculate_volatility_weighted_prediction_precision(node::AbstractInputNode) 1 end diff --git a/src/update_hgf/update_node.jl b/src/update_hgf/update_node.jl index 21e2214..b8e88ae 100644 --- a/src/update_hgf/update_node.jl +++ b/src/update_hgf/update_node.jl @@ -22,11 +22,11 @@ function update_node_prediction!(node::AbstractStateNode) #Get auxiliary prediction precision, only if there are volatility children and/or volatility parents if length(node.volatility_parents) > 0 || length(node.volatility_children) > 0 - node.states.auxiliary_prediction_precision = - calculate_auxiliary_prediction_precision(node) + node.states.volatility_weighted_prediction_precision = + calculate_volatility_weighted_prediction_precision(node) push!( - node.history.auxiliary_prediction_precision, - node.states.auxiliary_prediction_precision, + node.history.volatility_weighted_prediction_precision, + node.states.volatility_weighted_prediction_precision, ) end diff --git a/src/utils/get_prediction.jl b/src/utils/get_prediction.jl index 83d0691..bfced30 100644 --- a/src/utils/get_prediction.jl +++ b/src/utils/get_prediction.jl @@ -27,7 +27,7 @@ function get_prediction(node::AbstractNode) prediction_mean = node.states.prediction_mean, predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, - auxiliary_prediction_precision = node.states.auxiliary_prediction_precision, + volatility_weighted_prediction_precision = node.states.volatility_weighted_prediction_precision, ) #Update prediction mean @@ -39,22 +39,22 @@ function get_prediction(node::AbstractNode) #Update prediction precision node.states.prediction_precision = calculate_prediction_precision(node) - node.states.auxiliary_prediction_precision = - calculate_auxiliary_prediction_precision(node) + node.states.volatility_weighted_prediction_precision = + calculate_volatility_weighted_prediction_precision(node) #Save new states new_states = (; prediction_mean = node.states.prediction_mean, predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, - auxiliary_prediction_precision = node.states.auxiliary_prediction_precision, + volatility_weighted_prediction_precision = node.states.volatility_weighted_prediction_precision, ) #Change states back to the old states node.states.prediction_mean = old_states.prediction_mean node.states.predicted_volatility = old_states.predicted_volatility node.states.prediction_precision = old_states.prediction_precision - node.states.auxiliary_prediction_precision = old_states.auxiliary_prediction_precision + node.states.volatility_weighted_prediction_precision = old_states.volatility_weighted_prediction_precision return new_states end @@ -122,7 +122,7 @@ function get_prediction(node::AbstractInputNode) new_states = (; predicted_volatility = node.states.predicted_volatility, prediction_precision = node.states.prediction_precision, - auxiliary_prediction_precision = 1.0, + volatility_weighted_prediction_precision = 1.0, ) #Change states back to the old states diff --git a/test/test_canonical.jl b/test/test_canonical.jl index 59d6110..7a8d5e4 100644 --- a/test/test_canonical.jl +++ b/test/test_canonical.jl @@ -39,8 +39,8 @@ using Plots ("u", "x1", "value_coupling") => 1.0, ("x1", "x2", "volatility_coupling") => 1.0, ("u", "input_noise") => log(1e-4), - ("x1", "evolution_rate") => -13, - ("x2", "evolution_rate") => -2, + ("x1", "volatility") => -13, + ("x2", "volatility") => -2, ("x1", "initial_mean") => 1.04, ("x1", "initial_precision") => 1e4, ("x2", "initial_mean") => 1.0, @@ -95,8 +95,8 @@ using Plots test_parameters = Dict( ("u", "category_means") => [0.0, 1.0], ("u", "input_precision") => Inf, - ("x2", "evolution_rate") => -2.5, - ("x3", "evolution_rate") => -6.0, + ("x2", "volatility") => -2.5, + ("x3", "volatility") => -6.0, ("x1", "x2", "value_coupling") => 1.0, ("x2", "x3", "volatility_coupling") => 1.0, ("x2", "initial_mean") => 0.0, diff --git a/test/test_fit_model.jl b/test/test_fit_model.jl index 4f1d054..8b4d164 100644 --- a/test/test_fit_model.jl +++ b/test/test_fit_model.jl @@ -28,13 +28,13 @@ using Turing ("u", "x1", "value_coupling") => 1.0, ("x1", "x2", "volatility_coupling") => 1.0, "gaussian_action_precision" => 100, - ("x2", "evolution_rate") => -4, + ("x2", "volatility") => -4, ("u", "input_noise") => 4, ("x2", "drift") => 1, ) test_param_priors = Dict( - ("x1", "evolution_rate") => Normal(log(100.0), 4), + ("x1", "volatility") => Normal(log(100.0), 4), ("x1", "initial_mean") => Normal(1, sqrt(100.0)), ("x1", "drift") => Normal(0, 1), ) @@ -102,12 +102,12 @@ using Turing ("x3", "initial_precision") => exp(-1.0986), ("x1", "x2", "value_coupling") => 1.0, ("x2", "x3", "volatility_coupling") => 1.0, - ("x3", "evolution_rate") => -3, + ("x3", "volatility") => -3, ) test_param_priors = Dict( "softmax_action_precision" => Truncated(Normal(100, 20), 0, Inf), - ("x2", "evolution_rate") => Normal(-7, 5), + ("x2", "volatility") => Normal(-7, 5), ) #Fit single chain with defaults diff --git a/test/test_initialization.jl b/test/test_initialization.jl index 6b8dd4a..bd21fc8 100644 --- a/test/test_initialization.jl +++ b/test/test_initialization.jl @@ -4,7 +4,7 @@ using Test @testset "Initialization" begin #Parameter values to be used for all nodes unless other values are given node_defaults = Dict( - "evolution_rate" => 3, + "volatility" => 3, "input_noise" => -2, "category_means" => [0, 1], "input_precision" => Inf, @@ -22,10 +22,10 @@ using Test "x1", "x2", "x3", - Dict("name" => "x4", "evolution_rate" => 2), + Dict("name" => "x4", "volatility" => 2), Dict( "name" => "x5", - "evolution_rate" => 2, + "volatility" => 2, "initial_mean" => 4, "initial_precision" => 3, "drift" => 5 @@ -56,11 +56,11 @@ using Test @test test_hgf.input_nodes["u1"].parameters.input_noise == 2 @test test_hgf.input_nodes["u2"].parameters.input_noise == -2 - @test test_hgf.state_nodes["x1"].parameters.evolution_rate == 3 - @test test_hgf.state_nodes["x2"].parameters.evolution_rate == 3 - @test test_hgf.state_nodes["x3"].parameters.evolution_rate == 3 - @test test_hgf.state_nodes["x4"].parameters.evolution_rate == 2 - @test test_hgf.state_nodes["x5"].parameters.evolution_rate == 2 + @test test_hgf.state_nodes["x1"].parameters.volatility == 3 + @test test_hgf.state_nodes["x2"].parameters.volatility == 3 + @test test_hgf.state_nodes["x3"].parameters.volatility == 3 + @test test_hgf.state_nodes["x4"].parameters.volatility == 2 + @test test_hgf.state_nodes["x5"].parameters.volatility == 2 @test test_hgf.state_nodes["x1"].parameters.drift == 2 @test test_hgf.state_nodes["x5"].parameters.drift == 5 diff --git a/test/test_shared_parameters.jl b/test/test_shared_parameters.jl index 13e4dc8..9231e01 100644 --- a/test/test_shared_parameters.jl +++ b/test/test_shared_parameters.jl @@ -11,14 +11,14 @@ state_nodes = [ Dict( "name" => "x1", "type" => "continuous", - "evolution_rate" => 2, + "volatility" => 2, "initial_mean" => 1, "initial_precision" => 1, ), Dict( "name" => "x2", "type" => "continuous", - "evolution_rate" => 2, + "volatility" => 2, "initial_mean" => 1, "initial_precision" => 1, ), @@ -33,7 +33,7 @@ edges = [ # one shared parameter shared_parameters_1 = - Dict("evolution_rates" => (9, [("x1", "evolution_rate"), ("x2", "evolution_rate")])) + Dict("volatilitys" => (9, [("x1", "volatility"), ("x2", "volatility")])) #Initialize the HGF hgf_1 = init_hgf( @@ -46,14 +46,14 @@ hgf_1 = init_hgf( #get shared parameter get_parameters(hgf_1) -@test get_parameters(hgf_1, "evolution_rates") == 9 +@test get_parameters(hgf_1, "volatilitys") == 9 #set shared parameter -set_parameters!(hgf_1, "evolution_rates", 2) +set_parameters!(hgf_1, "volatilitys", 2) shared_parameters_2 = Dict( "initial_means" => (9, [("x1", "initial_mean"), ("x2", "initial_mean")]), - "evolution_rates" => (9, [("x1", "evolution_rate"), ("x2", "evolution_rate")]), + "volatilitys" => (9, [("x1", "volatility"), ("x2", "volatility")]), ) @@ -69,10 +69,10 @@ hgf_2 = init_hgf( get_parameters(hgf_2) #get shared parameter -@test get_parameters(hgf_2, "evolution_rates") == 9 +@test get_parameters(hgf_2, "volatilitys") == 9 #set shared parameter -set_parameters!(hgf_2, Dict("evolution_rates" => -2, "initial_means" => 1)) +set_parameters!(hgf_2, Dict("volatilitys" => -2, "initial_means" => 1)) -@test get_parameters(hgf_2, "evolution_rates") == -2 +@test get_parameters(hgf_2, "volatilitys") == -2 @test get_parameters(hgf_2, "initial_means") == 1 From 0755351fc91c82c94580304a0eaf9a893919b543 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Sat, 21 Oct 2023 17:49:19 +0200 Subject: [PATCH 21/24] autoregressive rate -> autoregressive strength --- src/create_hgf/init_hgf.jl | 4 +- src/premade_models/premade_hgfs.jl | 68 +++++++++++++++--------------- src/structs.jl | 2 +- src/update_hgf/update_equations.jl | 2 +- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index c3a76af..8e9017c 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -136,7 +136,7 @@ function init_hgf(; "volatility" => -2, "drift" => 0, "autoregressive_target" => 0, - "autoregressive_rate" => 0, + "autoregressive_strength" => 0, "initial_mean" => 0, "initial_precision" => 1, "value_coupling" => 1, @@ -527,7 +527,7 @@ function init_node(input_or_state_node, node_defaults, node_info) initial_mean = parameters["initial_mean"], initial_precision = parameters["initial_precision"], autoregressive_target = parameters["autoregressive_target"], - autoregressive_rate = parameters["autoregressive_rate"], + autoregressive_strength = parameters["autoregressive_strength"], ), #Set states states = ContinuousStateNodeState( diff --git a/src/premade_models/premade_hgfs.jl b/src/premade_models/premade_hgfs.jl index f64c609..35ead5c 100644 --- a/src/premade_models/premade_hgfs.jl +++ b/src/premade_models/premade_hgfs.jl @@ -24,14 +24,14 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) ("x1", "volatility") => -2, ("x1", "drift") => 0, ("x1", "autoregressive_target") => 0, - ("x1", "autoregressive_rate") => 0, + ("x1", "autoregressive_strength") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_rate") => 0, + ("x2", "autoregressive_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, @@ -65,7 +65,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) "volatility" => config[("x1", "volatility")], "drift" => config[("x1", "drift")], "autoregressive_target" => config[("x1", "autoregressive_target")], - "autoregressive_rate" => config[("x1", "autoregressive_rate")], + "autoregressive_strength" => config[("x1", "autoregressive_strength")], "initial_mean" => config[("x1", "initial_mean")], "initial_precision" => config[("x1", "initial_precision")], ), @@ -75,7 +75,7 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_rate" => config[("x2", "autoregressive_rate")], + "autoregressive_strength" => config[("x2", "autoregressive_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -137,28 +137,28 @@ function premade_JGET(config::Dict; verbose::Bool = true) ("x1", "volatility") => -2, ("x1", "drift") => 0, ("x1", "autoregressive_target") => 0, - ("x1", "autoregressive_rate") => 0, + ("x1", "autoregressive_strength") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_rate") => 0, + ("x2", "autoregressive_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_rate") => 0, + ("x3", "autoregressive_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, ("x4", "volatility") => -2, ("x4", "drift") => 0, ("x4", "autoregressive_target") => 0, - ("x4", "autoregressive_rate") => 0, + ("x4", "autoregressive_strength") => 0, ("x4", "initial_mean") => 0, ("x4", "initial_precision") => 1, @@ -194,7 +194,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) "volatility" => config[("x1", "volatility")], "drift" => config[("x1", "drift")], "autoregressive_target" => config[("x1", "autoregressive_target")], - "autoregressive_rate" => config[("x1", "autoregressive_rate")], + "autoregressive_strength" => config[("x1", "autoregressive_strength")], "initial_mean" => config[("x1", "initial_mean")], "initial_precision" => config[("x1", "initial_precision")], ), @@ -204,7 +204,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_rate" => config[("x2", "autoregressive_rate")], + "autoregressive_strength" => config[("x2", "autoregressive_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -214,7 +214,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_rate" => config[("x3", "autoregressive_rate")], + "autoregressive_strength" => config[("x3", "autoregressive_strength")], "initial_mean" => config[("x3", "initial_precision")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -224,7 +224,7 @@ function premade_JGET(config::Dict; verbose::Bool = true) "volatility" => config[("x4", "volatility")], "drift" => config[("x4", "drift")], "autoregressive_target" => config[("x4", "autoregressive_target")], - "autoregressive_rate" => config[("x4", "autoregressive_rate")], + "autoregressive_strength" => config[("x4", "autoregressive_strength")], "initial_mean" => config[("x4", "initial_mean")], "initial_precision" => config[("x4", "initial_precision")], ), @@ -282,7 +282,7 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_rate") => 0, + ("x2", "autoregressive_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, @@ -317,7 +317,7 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_rate" => config[("x2", "autoregressive_rate")], + "autoregressive_strength" => config[("x2", "autoregressive_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -378,14 +378,14 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_rate") => 0, + ("x2", "autoregressive_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_rate") => 0, + ("x3", "autoregressive_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, @@ -421,7 +421,7 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_rate" => config[("x2", "autoregressive_rate")], + "autoregressive_strength" => config[("x2", "autoregressive_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -431,7 +431,7 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_rate" => config[("x3", "autoregressive_rate")], + "autoregressive_strength" => config[("x3", "autoregressive_strength")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -489,14 +489,14 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_rate") => 0, + ("x2", "autoregressive_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_rate") => 0, + ("x3", "autoregressive_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, @@ -527,7 +527,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) derived_parameters_x2_volatility = [] derived_parameters_x2_drift = [] derived_parameters_x2_autoregressive_target = [] - derived_parameters_x2_autoregressive_rate = [] + derived_parameters_x2_autoregressive_strength = [] derived_parameters_x2_x3_volatility_coupling = [] derived_parameters_value_coupling_x1_x2 = [] @@ -560,7 +560,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_rate" => config[("x2", "autoregressive_rate")], + "autoregressive_strength" => config[("x2", "autoregressive_strength")], ), ) #Add the derived parameter name to derived parameters vector @@ -568,7 +568,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) push!(derived_parameters_x2_volatility, (node_name, "volatility")) push!(derived_parameters_x2_drift, (node_name, "drift")) - push!(derived_parameters_x2_autoregressive_rate, (node_name, "autoregressive_rate")) + push!(derived_parameters_x2_autoregressive_strength, (node_name, "autoregressive_strength")) push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) end @@ -581,7 +581,7 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_rate" => config[("x3", "autoregressive_rate")], + "autoregressive_strength" => config[("x3", "autoregressive_strength")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -642,8 +642,8 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) shared_parameters["x2_drifts"] = (config[("x2", "drift")], derived_parameters_x2_drift) - shared_parameters["x2_autoregressive_rates"] = - (config[("x2", "autoregressive_rate")], derived_parameters_x2_autoregressive_rate) + shared_parameters["x2_autoregressive_strengths"] = + (config[("x2", "autoregressive_strength")], derived_parameters_x2_autoregressive_strength) shared_parameters["x2_autoregressive_targets"] = (config[("x2", "autoregressive_target")], derived_parameters_x2_autoregressive_target) @@ -704,14 +704,14 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo ("x2", "volatility") => -2, ("x2", "drift") => 0, ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_rate") => 0, + ("x2", "autoregressive_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_rate") => 0, + ("x3", "autoregressive_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, @@ -743,7 +743,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo derived_parameters_x2_volatility = [] derived_parameters_x2_drift = [] derived_parameters_x2_autoregressive_target = [] - derived_parameters_x2_autoregressive_rate = [] + derived_parameters_x2_autoregressive_strength = [] derived_parameters_value_coupling_x1_x2 = [] derived_parameters_x2_x3_volatility_coupling = [] @@ -806,7 +806,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_rate" => config[("x2", "autoregressive_rate")], + "autoregressive_strength" => config[("x2", "autoregressive_strength")], ), ) #Add the derived parameter name to derived parameters vector @@ -814,7 +814,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) push!(derived_parameters_x2_volatility, (node_name, "volatility")) push!(derived_parameters_x2_drift, (node_name, "drift")) - push!(derived_parameters_x2_autoregressive_rate, (node_name, "autoregressive_rate")) + push!(derived_parameters_x2_autoregressive_strength, (node_name, "autoregressive_strength")) push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) end @@ -828,7 +828,7 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_rate" => config[("x3", "autoregressive_rate")], + "autoregressive_strength" => config[("x3", "autoregressive_strength")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -919,8 +919,8 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo shared_parameters["x2_drifts"] = (config[("x2", "drift")], derived_parameters_x2_drift) - shared_parameters["x2_autoregressive_rates"] = - (config[("x2", "autoregressive_rate")], derived_parameters_x2_autoregressive_rate) + shared_parameters["x2_autoregressive_strengths"] = + (config[("x2", "autoregressive_strength")], derived_parameters_x2_autoregressive_strength) shared_parameters["x2_autoregressive_targets"] = (config[("x2", "autoregressive_target")], derived_parameters_x2_autoregressive_target) diff --git a/src/structs.jl b/src/structs.jl index 4cab26e..283d91e 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -27,7 +27,7 @@ Base.@kwdef mutable struct ContinuousStateNodeParameters volatility::Real = 0 drift::Real = 0 autoregressive_target::Real = 0 - autoregressive_rate::Real = 0 + autoregressive_strength::Real = 0 value_coupling::Dict{String,Real} = Dict{String,Real}() volatility_coupling::Dict{String,Real} = Dict{String,Real}() initial_mean::Real = 0 diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index 6a6df87..1db4fb5 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -20,7 +20,7 @@ function calculate_prediction_mean(node::AbstractNode) #Initialize the total drift as the basline drift plus the autoregressive drift predicted_drift = node.parameters.drift + - node.parameters.autoregressive_rate * + node.parameters.autoregressive_strength * (node.parameters.autoregressive_target - node.states.posterior_mean) #Add contributions from value parents From 5c679cf19587df39b64c2f8c5c184a1f18967df5 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Thu, 2 Nov 2023 13:49:23 +0100 Subject: [PATCH 22/24] minor change to project.toml --- Project.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 661eb25..be97bc3 100644 --- a/Project.toml +++ b/Project.toml @@ -1,12 +1,14 @@ name = "HierarchicalGaussianFiltering" uuid = "63d42c3e-681c-42be-892f-a47f35336a79" -authors = ["Peter Thestrup Waade ptw@cas.au.dk", "Anna Hedvig Møller hedvig.2808@gmail.com", "Jacopo Comoglio jacopo.comoglio@gmail.com", "Christoph Mathys chmathys@cas.au.dk\n and contributors"] +authors = [ "Peter Thestrup Waade ptw@cas.au.dk", + "Anna Hedvig Møller hedvig.2808@gmail.com", + "Jacopo Comoglio jacopo.comoglio@gmail.com", + "Christoph Mathys chmathys@cas.au.dk"] version = "0.3.3" [deps] ActionModels = "320cf53b-cc3b-4b34-9a10-0ecb113566a3" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" [compat] From a820f629d9ee2dd6526efa3d585f75e4565c84fe Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Thu, 2 Nov 2023 13:52:20 +0100 Subject: [PATCH 23/24] autoregressive -> autoregression --- src/create_hgf/init_hgf.jl | 8 +- src/premade_models/premade_hgfs.jl | 136 ++++++++++++++--------------- src/structs.jl | 4 +- src/update_hgf/update_equations.jl | 6 +- 4 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/create_hgf/init_hgf.jl b/src/create_hgf/init_hgf.jl index 8e9017c..b348647 100644 --- a/src/create_hgf/init_hgf.jl +++ b/src/create_hgf/init_hgf.jl @@ -135,8 +135,8 @@ function init_hgf(; "type" => "continuous", "volatility" => -2, "drift" => 0, - "autoregressive_target" => 0, - "autoregressive_strength" => 0, + "autoregression_target" => 0, + "autoregression_strength" => 0, "initial_mean" => 0, "initial_precision" => 1, "value_coupling" => 1, @@ -526,8 +526,8 @@ function init_node(input_or_state_node, node_defaults, node_info) drift = parameters["drift"], initial_mean = parameters["initial_mean"], initial_precision = parameters["initial_precision"], - autoregressive_target = parameters["autoregressive_target"], - autoregressive_strength = parameters["autoregressive_strength"], + autoregression_target = parameters["autoregression_target"], + autoregression_strength = parameters["autoregression_strength"], ), #Set states states = ContinuousStateNodeState( diff --git a/src/premade_models/premade_hgfs.jl b/src/premade_models/premade_hgfs.jl index 35ead5c..fc1372f 100644 --- a/src/premade_models/premade_hgfs.jl +++ b/src/premade_models/premade_hgfs.jl @@ -23,15 +23,15 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) ("x1", "volatility") => -2, ("x1", "drift") => 0, - ("x1", "autoregressive_target") => 0, - ("x1", "autoregressive_strength") => 0, + ("x1", "autoregression_target") => 0, + ("x1", "autoregression_strength") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, ("x2", "volatility") => -2, ("x2", "drift") => 0, - ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_strength") => 0, + ("x2", "autoregression_target") => 0, + ("x2", "autoregression_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, @@ -64,8 +64,8 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x1", "volatility")], "drift" => config[("x1", "drift")], - "autoregressive_target" => config[("x1", "autoregressive_target")], - "autoregressive_strength" => config[("x1", "autoregressive_strength")], + "autoregression_target" => config[("x1", "autoregression_target")], + "autoregression_strength" => config[("x1", "autoregression_strength")], "initial_mean" => config[("x1", "initial_mean")], "initial_precision" => config[("x1", "initial_precision")], ), @@ -74,8 +74,8 @@ function premade_continuous_2level(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], - "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_strength" => config[("x2", "autoregressive_strength")], + "autoregression_target" => config[("x2", "autoregression_target")], + "autoregression_strength" => config[("x2", "autoregression_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -136,29 +136,29 @@ function premade_JGET(config::Dict; verbose::Bool = true) ("x1", "volatility") => -2, ("x1", "drift") => 0, - ("x1", "autoregressive_target") => 0, - ("x1", "autoregressive_strength") => 0, + ("x1", "autoregression_target") => 0, + ("x1", "autoregression_strength") => 0, ("x1", "initial_mean") => 0, ("x1", "initial_precision") => 1, ("x2", "volatility") => -2, ("x2", "drift") => 0, - ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_strength") => 0, + ("x2", "autoregression_target") => 0, + ("x2", "autoregression_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, - ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_strength") => 0, + ("x3", "autoregression_target") => 0, + ("x3", "autoregression_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, ("x4", "volatility") => -2, ("x4", "drift") => 0, - ("x4", "autoregressive_target") => 0, - ("x4", "autoregressive_strength") => 0, + ("x4", "autoregression_target") => 0, + ("x4", "autoregression_strength") => 0, ("x4", "initial_mean") => 0, ("x4", "initial_precision") => 1, @@ -193,8 +193,8 @@ function premade_JGET(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x1", "volatility")], "drift" => config[("x1", "drift")], - "autoregressive_target" => config[("x1", "autoregressive_target")], - "autoregressive_strength" => config[("x1", "autoregressive_strength")], + "autoregression_target" => config[("x1", "autoregression_target")], + "autoregression_strength" => config[("x1", "autoregression_strength")], "initial_mean" => config[("x1", "initial_mean")], "initial_precision" => config[("x1", "initial_precision")], ), @@ -203,8 +203,8 @@ function premade_JGET(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], - "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_strength" => config[("x2", "autoregressive_strength")], + "autoregression_target" => config[("x2", "autoregression_target")], + "autoregression_strength" => config[("x2", "autoregression_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -213,8 +213,8 @@ function premade_JGET(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], - "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_strength" => config[("x3", "autoregressive_strength")], + "autoregression_target" => config[("x3", "autoregression_target")], + "autoregression_strength" => config[("x3", "autoregression_strength")], "initial_mean" => config[("x3", "initial_precision")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -223,8 +223,8 @@ function premade_JGET(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x4", "volatility")], "drift" => config[("x4", "drift")], - "autoregressive_target" => config[("x4", "autoregressive_target")], - "autoregressive_strength" => config[("x4", "autoregressive_strength")], + "autoregression_target" => config[("x4", "autoregression_target")], + "autoregression_strength" => config[("x4", "autoregression_strength")], "initial_mean" => config[("x4", "initial_mean")], "initial_precision" => config[("x4", "initial_precision")], ), @@ -281,8 +281,8 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) ("x2", "volatility") => -2, ("x2", "drift") => 0, - ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_strength") => 0, + ("x2", "autoregression_target") => 0, + ("x2", "autoregression_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, @@ -316,8 +316,8 @@ function premade_binary_2level(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], - "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_strength" => config[("x2", "autoregressive_strength")], + "autoregression_target" => config[("x2", "autoregression_target")], + "autoregression_strength" => config[("x2", "autoregression_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -377,15 +377,15 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) ("x2", "volatility") => -2, ("x2", "drift") => 0, - ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_strength") => 0, + ("x2", "autoregression_target") => 0, + ("x2", "autoregression_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, - ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_strength") => 0, + ("x3", "autoregression_target") => 0, + ("x3", "autoregression_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, @@ -420,8 +420,8 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], - "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_strength" => config[("x2", "autoregressive_strength")], + "autoregression_target" => config[("x2", "autoregression_target")], + "autoregression_strength" => config[("x2", "autoregression_strength")], "initial_mean" => config[("x2", "initial_mean")], "initial_precision" => config[("x2", "initial_precision")], ), @@ -430,8 +430,8 @@ function premade_binary_3level(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], - "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_strength" => config[("x3", "autoregressive_strength")], + "autoregression_target" => config[("x3", "autoregression_target")], + "autoregression_strength" => config[("x3", "autoregression_strength")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -488,15 +488,15 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) ("x2", "volatility") => -2, ("x2", "drift") => 0, - ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_strength") => 0, + ("x2", "autoregression_target") => 0, + ("x2", "autoregression_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, - ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_strength") => 0, + ("x3", "autoregression_target") => 0, + ("x3", "autoregression_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, @@ -526,8 +526,8 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) derived_parameters_x2_initial_mean = [] derived_parameters_x2_volatility = [] derived_parameters_x2_drift = [] - derived_parameters_x2_autoregressive_target = [] - derived_parameters_x2_autoregressive_strength = [] + derived_parameters_x2_autoregression_target = [] + derived_parameters_x2_autoregression_strength = [] derived_parameters_x2_x3_volatility_coupling = [] derived_parameters_value_coupling_x1_x2 = [] @@ -559,8 +559,8 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) "initial_precision" => config[("x2", "initial_precision")], "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], - "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_strength" => config[("x2", "autoregressive_strength")], + "autoregression_target" => config[("x2", "autoregression_target")], + "autoregression_strength" => config[("x2", "autoregression_strength")], ), ) #Add the derived parameter name to derived parameters vector @@ -568,8 +568,8 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) push!(derived_parameters_x2_volatility, (node_name, "volatility")) push!(derived_parameters_x2_drift, (node_name, "drift")) - push!(derived_parameters_x2_autoregressive_strength, (node_name, "autoregressive_strength")) - push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) + push!(derived_parameters_x2_autoregression_strength, (node_name, "autoregression_strength")) + push!(derived_parameters_x2_autoregression_target, (node_name, "autoregression_target")) end #Add volatility parent @@ -580,8 +580,8 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) "type" => "continuous", "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], - "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_strength" => config[("x3", "autoregressive_strength")], + "autoregression_target" => config[("x3", "autoregression_target")], + "autoregression_strength" => config[("x3", "autoregression_strength")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -642,11 +642,11 @@ function premade_categorical_3level(config::Dict; verbose::Bool = true) shared_parameters["x2_drifts"] = (config[("x2", "drift")], derived_parameters_x2_drift) - shared_parameters["x2_autoregressive_strengths"] = - (config[("x2", "autoregressive_strength")], derived_parameters_x2_autoregressive_strength) + shared_parameters["x2_autoregression_strengths"] = + (config[("x2", "autoregression_strength")], derived_parameters_x2_autoregression_strength) - shared_parameters["x2_autoregressive_targets"] = - (config[("x2", "autoregressive_target")], derived_parameters_x2_autoregressive_target) + shared_parameters["x2_autoregression_targets"] = + (config[("x2", "autoregression_target")], derived_parameters_x2_autoregression_target) shared_parameters["value_couplings_x1_x2"] = (config[("x1", "x2", "value_coupling")], derived_parameters_value_coupling_x1_x2) @@ -703,15 +703,15 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo ("x2", "volatility") => -2, ("x2", "drift") => 0, - ("x2", "autoregressive_target") => 0, - ("x2", "autoregressive_strength") => 0, + ("x2", "autoregression_target") => 0, + ("x2", "autoregression_strength") => 0, ("x2", "initial_mean") => 0, ("x2", "initial_precision") => 1, ("x3", "volatility") => -2, ("x3", "drift") => 0, - ("x3", "autoregressive_target") => 0, - ("x3", "autoregressive_strength") => 0, + ("x3", "autoregression_target") => 0, + ("x3", "autoregression_strength") => 0, ("x3", "initial_mean") => 0, ("x3", "initial_precision") => 1, @@ -742,8 +742,8 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo derived_parameters_x2_initial_mean = [] derived_parameters_x2_volatility = [] derived_parameters_x2_drift = [] - derived_parameters_x2_autoregressive_target = [] - derived_parameters_x2_autoregressive_strength = [] + derived_parameters_x2_autoregression_target = [] + derived_parameters_x2_autoregression_strength = [] derived_parameters_value_coupling_x1_x2 = [] derived_parameters_x2_x3_volatility_coupling = [] @@ -805,8 +805,8 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo "initial_precision" => config[("x2", "initial_precision")], "volatility" => config[("x2", "volatility")], "drift" => config[("x2", "drift")], - "autoregressive_target" => config[("x2", "autoregressive_target")], - "autoregressive_strength" => config[("x2", "autoregressive_strength")], + "autoregression_target" => config[("x2", "autoregression_target")], + "autoregression_strength" => config[("x2", "autoregression_strength")], ), ) #Add the derived parameter name to derived parameters vector @@ -814,8 +814,8 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo push!(derived_parameters_x2_initial_mean, (node_name, "initial_mean")) push!(derived_parameters_x2_volatility, (node_name, "volatility")) push!(derived_parameters_x2_drift, (node_name, "drift")) - push!(derived_parameters_x2_autoregressive_strength, (node_name, "autoregressive_strength")) - push!(derived_parameters_x2_autoregressive_target, (node_name, "autoregressive_target")) + push!(derived_parameters_x2_autoregression_strength, (node_name, "autoregression_strength")) + push!(derived_parameters_x2_autoregression_target, (node_name, "autoregression_target")) end @@ -827,8 +827,8 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo "type" => "continuous", "volatility" => config[("x3", "volatility")], "drift" => config[("x3", "drift")], - "autoregressive_target" => config[("x3", "autoregressive_target")], - "autoregressive_strength" => config[("x3", "autoregressive_strength")], + "autoregression_target" => config[("x3", "autoregression_target")], + "autoregression_strength" => config[("x3", "autoregression_strength")], "initial_mean" => config[("x3", "initial_mean")], "initial_precision" => config[("x3", "initial_precision")], ), @@ -919,11 +919,11 @@ function premade_categorical_3level_state_transitions(config::Dict; verbose::Boo shared_parameters["x2_drifts"] = (config[("x2", "drift")], derived_parameters_x2_drift) - shared_parameters["x2_autoregressive_strengths"] = - (config[("x2", "autoregressive_strength")], derived_parameters_x2_autoregressive_strength) + shared_parameters["x2_autoregression_strengths"] = + (config[("x2", "autoregression_strength")], derived_parameters_x2_autoregression_strength) - shared_parameters["x2_autoregressive_targets"] = - (config[("x2", "autoregressive_target")], derived_parameters_x2_autoregressive_target) + shared_parameters["x2_autoregression_targets"] = + (config[("x2", "autoregression_target")], derived_parameters_x2_autoregression_target) shared_parameters["value_couplings_x1_x2"] = (config[("x1", "x2", "value_coupling")], derived_parameters_value_coupling_x1_x2) diff --git a/src/structs.jl b/src/structs.jl index 283d91e..1e7b776 100644 --- a/src/structs.jl +++ b/src/structs.jl @@ -26,8 +26,8 @@ Configuration of continuous state nodes' parameters Base.@kwdef mutable struct ContinuousStateNodeParameters volatility::Real = 0 drift::Real = 0 - autoregressive_target::Real = 0 - autoregressive_strength::Real = 0 + autoregression_target::Real = 0 + autoregression_strength::Real = 0 value_coupling::Dict{String,Real} = Dict{String,Real}() volatility_coupling::Dict{String,Real} = Dict{String,Real}() initial_mean::Real = 0 diff --git a/src/update_hgf/update_equations.jl b/src/update_hgf/update_equations.jl index 1db4fb5..d541877 100644 --- a/src/update_hgf/update_equations.jl +++ b/src/update_hgf/update_equations.jl @@ -17,11 +17,11 @@ function calculate_prediction_mean(node::AbstractNode) #Get out value parents value_parents = node.value_parents - #Initialize the total drift as the basline drift plus the autoregressive drift + #Initialize the total drift as the basline drift plus the autoregression drift predicted_drift = node.parameters.drift + - node.parameters.autoregressive_strength * - (node.parameters.autoregressive_target - node.states.posterior_mean) + node.parameters.autoregression_strength * + (node.parameters.autoregression_target - node.states.posterior_mean) #Add contributions from value parents for parent in value_parents From f7da75a700103cdb3585f5fa6ba938488f495271 Mon Sep 17 00:00:00 2001 From: Peter Thestrup Waade Date: Thu, 2 Nov 2023 14:16:32 +0100 Subject: [PATCH 24/24] removed linearalgebra --- src/HierarchicalGaussianFiltering.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HierarchicalGaussianFiltering.jl b/src/HierarchicalGaussianFiltering.jl index 6da23b9..21c6467 100644 --- a/src/HierarchicalGaussianFiltering.jl +++ b/src/HierarchicalGaussianFiltering.jl @@ -1,7 +1,7 @@ module HierarchicalGaussianFiltering #Load packages -using ActionModels, Distributions, RecipesBase, LinearAlgebra +using ActionModels, Distributions, RecipesBase #Export functions export init_node, init_hgf, premade_hgf, check_hgf, check_node, update_hgf!