RandomFields/0000755000175100001440000000000012412741522012637 5ustar hornikusersRandomFields/inst/0000755000175100001440000000000012412655465013626 5ustar hornikusersRandomFields/inst/CITATION0000644000175100001440000000345212412655465014767 0ustar hornikusers year <- sub("-.*", "", meta$Date) note <- sprintf("R package version %s", meta$Version) bibentry(bibtype="Manual", header="For general purposes please refer to", footer="", title = "{RandomFields}: Simulation and Analysis of Random Fields", author = c(person("Martin", "Schlather"), person("Alexander", "Malinowski"), person("Marco", "Oesting"), person("Daphne", "Boecker"), person("Kirstin", "Strokorb"), person("Sebastian", "Engelke"), person("Johannes", "Martini"), person("Felix", "Ballani"), person("Peter", "Menck", middle="J"), person("Sebastian", "Gross"), person("Ulrike", "Ober"), person("Katharina", "Burmeister"), person("Juliane", "Manitz"), person("Paulo", "Ribeiro"), person("Richard", "Singleton"), person("Ben", "Pfaff"), person("R Core Team")), year = year, note = note, url = "http://CRAN.R-project.org/package=RandomFields" ) bibentry(bibtype="Article", header="For multivariate features please refer to", footer ="", author = c(person("Martin", "Schlather"), person("Alexander", "Malinowski"), person("Peter", "Menck", middle="J"), person("Marco", "Oesting"), person("Kirstin", "Strokorb")), title = "Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}", journal = "Journal of Statistical Software", year = "2014", # key = "", # volume = "", # number = "", # pages = "", # month = "", note = "Submitted", ) RandomFields/inst/doc/0000755000175100001440000000000012412655465014373 5ustar hornikusersRandomFields/inst/doc/version2.pdf0000644000175100001440000065765312412741522016651 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3853 /Filter /FlateDecode /N 78 /First 646 >> stream x[s8~-[+þڢXdrfć&_c1'XjH%pBA$(IcF$a@FB& Q IXH Be O " $)"xH!Ld$2!2aH$ #"E)vJ{IdIMD):H̓:GbBHcN"RHQ '0HA$a1KHrF/Ph GapL1pK`0 a a!Y*hM/"&4#aȶHBOdQDBu$`3P07WA yeY+2 0[BRb@0`"PP(z4T(, ( P V@Y%`*R&_NAVJ H#GY ro]3BbvA?U.gݴȃ yϡ! a_mق lmjVgGa>ϕmGvmNJGvbNlI,K =LryM#J&vDY>Chɨە LlZP4b>ӝ6,At3V\@Q'GY9[.F@ <+teb9:*Iw'U$?:3]s{sx@n¾ILBOu>9[GYjMGq> vz^(還Q?9*%h=^U؍UoLquUGHͮ;`A 0B96b^iIxr2"-L?M87-w8B|֡$.~硊I [fC_"ƶy u?;yRPϳoApQL')ݥ}N_W􀾦o!=}OO'3:d1ͨ&D8-/9=[FAMlJstBtO3:3?sԮ";LnͳE>ӯˬu2*tAKZf|4+q}e~E+Z].VM5_r2 [%FwwhG!w>{yY׏^lֽe0=^ZڢŘW!D ǧOZ>.nw wU)=8EnVWJ6C!ZӫSYVQqNu۠]l\} ޽[k/ct5R.zFzs y۹:/,>X\k@GSt]1MQh9|:_~l9KG_l٬`ΖEUgE.ڐ}]ͮFE:聨6AjAg ˒~etqwcjy 7͡\ŹGIm!]F x3Ft'O^=|6-gĹ TqaGb=Hh5 JwQ.cA|%pl B& |ƤR%k&jSm:]{-Tdey'Boә.Dw<5!m6Wx4H?1HT?u/N{P`H-{͟Ҷ6\+֎l :Eڶwށ0n>`McA*uXFV Y'TC }t\?t{蒎bH~ކCK2y]SjZ;| pRC XA&@ȁx[!:@PidDu2UU},UpߨbKor;|to~x C%giV&TP pWP(0!)p7E9;NނJ7IR&F UPz@O9-YW (kXĎEMaLxn3ql|DZЪC1"Zpc)PJ*kM wvBW6[ |W/ϲ*qV= ":`)>0}I󔂻v6N+6Yqs~99xY IrU*G[8y0mе%pszK;;=} 5JXWn3PhbBUƭÝ#Twm[Av˘G a#JjFHmTgWtSdc cC܍qu23_*Fg)C"A/ʊ~ty}tROj^Jg\ag\o%哓'@?5gmX\Խ^iJZM?e^kϭRakf5tz|}klʠO꒞ 0rP2y>ͫkm!G| P?YU>/4=+Rk-aG&8\Novu-1 |KуoO jor5xw*h I "H"AJLPOo)Ԓj}U> '7Ĩ)g2@% sz&#Jn)j'@-澳+K^zS%2FT2ؔɇJWddZZ,y\ʖ\&@]==?^uwIZxd/f|0_ ^>S7$OPY PY:{ucut7A[$Mf+~ ⍓//nH0Xm!eڿFmi-MYnr"-y9/ZPwuUu{"w[_-SS. ՈD~ǗAKZ9nՒ܁׻/Q!|px_u TתS. c~desh7,Dc6wzw =n,Y[*6|zc1tMv_s-:,yS7Oh%F۝F n dv|n3((7p6[*./;rpyrG\TZv?ďm]l錇?3{zgOg*W-h~,Lǯ. t !.ram3vO<]u.Ӵ`d:@ZA[F_҈~pY.fL\HI+DM1jqhbcLq-*3$:hHL6!,&  F!= Bo*kq97xdx3 u58E-4ux> stream 2014-09-21T19:06:15+02:00 2014-09-21T19:06:15+02:00 GPL Ghostscript 910 (ps2write) Untitled endstream endobj 81 0 obj << /Type /ObjStm /Length 1091 /Filter /FlateDecode /N 78 /First 669 >> stream xXMoFW̱EܝıE+2G2Dp}PfEQakFArwf.Ȥ(Ҟ%m5EGEOF;ÌH^E<[Jb&P4hWO6!l#TAe"hav3LdÐl|'yʳxPOѵ<\l;X.XzNʦ0ӳ? XfX_ի%wzӴBܖj]o:[94w t_6nPx/Y.8-ouBOTHng7岁k?V_nʈi\=׶ǫM'Y4Р+#R=zywiv{.LVީ4Ov&++oCwS {@,[X{1C%Oa1<> stream xXj@+j0{9[$" ߧZxAƃvbJ鞩ꑶv1IQjh)Lf mVʒ6TmeI 5FU71(*.-1pCDfCD1E@AfO!x,!Hk Yq:fupL%827 -E82X;Ce5dP(df1HXƚ[YN A?@2&EdEqi RP9JPPBRZ%GRPlE5@HG`2t.VBc> stream xXr6ɥB+pb [mq{P )*$$+t3D8?~|,7j~ϒ˹(Okؠ"\nrؓiϥұu3{Vo"5+bc kU$M\UL;4{$v=+&k8c# srka[0Җyk;8-Ag&60-׳W_$'<%ͼIk3Գ/"?tD<ө,<ȗ۪9@o7)CHgĀ]EOFiY˛竗~aBɌ4q+O!yyqE\ھ=xp=_p:oE3pK3]Iz#4&[?xA߯/בWJȀ$MnZ]jus#ln7*@,FU_X3.9[`]F)jO ^Nqxyreȃ!282>&W2Lzgz yIJE㩐> stream xXy\W~#UU+P5I;Uq.ڊZ"ԕ’$@ؒ/-$@(( jqoՎVmjk.3vΜ| cg7/sss8ذx.M)Up&p]+#[]9;]Y3#=Fꦍ<{A},X^Mҩ"" ҥ+W%Iy"ݠЫ"ҹC"FU  !R!Ub$ٴ]&Z ćŨ*BW̗*5:i/RF24j"ziTUUK \J ]J'*4B6(¥Tćϓ+5jTӐXrB zN5HɋjիȱT$y<ͯgPZ/5(04\Ƅ&wUZj̅xJJuP]xB?v/ʿ[ԡZmLw5cV21E㉕̆$R>_%Uo5k7lԽ7lߒj ۞$ ߡWDDRne/|g _ZdOPoR/S;9\j75CKͧRSz ZDmSPKMRj3ZFm^^SoP~rj5b'EyS. ,j%&SsJC=OM<(KHP> j\.f'nxukWBoa,`&M:8k'w\s?Lry󇧺O]3zi=<"<>MM=cuЌwgT8>y4{>)#J䄵n`d0f/F̩2uJ UՔ;zAӷ:ţSzd~23:G恅rƹSsy܈px A)H.݁t!ffe0zvRsfN FtQ<^[sh4rAW ^X/(Svη]y@ bKx/'?>%H<Ŭ0ܰ H|†W%co`V'SȘ . CjAqNBi*T4Օ; ][ݙb` ϣ:ee&鉓^Y^0pԛj<=2Cp6́l_Qm֠-h{zX}.uCI~qxsT &0-b1 Z_8Tu1\|XS},CCz5]&_"ٺKy|wc6'j"2垔5f@ t"3L <bax H{j*av)\iLW|;5N?ʄcn $wkUvmY)Um]F b[z%% @RR9u{,TB^\T.0F9[YKwC0 ##!}Q@wM{$GtU팃Dɭ>.>caNgiCkW8du2mΞVKB1*..__p{0Goߺwb]U"%-yk,}8==e!hw JJ-t8g%1dLN[ǣIHAg`vnY8cQ=`g|#;}#p*91>jژAnI+O%@2M:-ØfNG_(jW3\D(鳹fh0**jOp>Yg)쾯lg/&%t ?@R,_Rc-gvxINc*)vҀivnvVe"21R3̪y woe d,)fؤ{s X^ƬZoGc3n)n>B6 a17]^B7q☇04 {MO+!4Ua@-5f0D_6lgTYiluE/hwH-`R" ~q&ԏm='x%Vh#&6ɓ7JSέ 8M)*ɪ>`<UJOWlRӓ5٩Ԅ\k^Iɸ~FuQLȵca:>Vj2v'}#Pk9sA]f4GUӲcx챚:9|7r~Ej^x*"pjŽE)!erRkb}ց 'cn ն~F#O#ȪQ1aI'@.Fwkk)!g}3?ST,2QKáv \8_h Wg!=gd6=^/=P7p kγY3Ppǧ&6 BTTX,),-,E%])d}Q:T76}]|Edy 24.- 1fصa[]*) 0;%Sa~9ɵb7VN3uNڷ2 }p;hI]m7Ji8Wl ogL$MRᑉ=U,ZvTC 7r*ȌS6VJsCYl6%,W.wNqz< ̗[NhGw1jJM[_^]<{kw_.|XIw_|Z XԇevbTԡ螨^} br<rḺJpapԆRcJEL*ƎAlbG>8ˉ[O{jژգ{Ym(ٞ8eƲfh`#%}C3q|ᙱ,1eL6#Tǯc^e}1 ;.@H x;$d`x]ipִ9 5YԦcZ_9 ǿsPh6'YKꊭJ[1C^ږ KVe) "}Ljޅb A/ S3rbc鬸dxXf *fY+VcemF8AwpQi1j *GUyMYgy5xܕvL~/މN{_=ssQy\iS۷2cjl[ X:O#N5}pc70d? ܆OfjF#R.\%VAX_YP\ȫB&dxμdԤq$rh!P+3Lo~rk A[PNqF5 ^O~i9|`3# pXtvJ}=~  MuՕE!ij)&L7 t{SxBXoƷ.+ϖc(U '01c?Q;ysNqN]F)y,_zaq0y溪RTSXWHzfUd:@^B0rp\.#g*xW?[@2ejX}ak/[g0I7xd iqR޸X"N0fj1+x ^dev) cE:HUܘvkA)2gg{>hF̵^- c%W*Ft]}8 2X87VzG!V!=گ$8{\y=-{ox #\>brV- 1q)M2(V 8W&ȯ馶6^%L ي ZG Dݳ⛣Jdfh-4bhXp7Fy~GP2heb^R\G9w߀xs~ 9 s.>u}՟bĈHqxxJi_n;P):\ (ظ'~P-a kD;j}vadut9o endstream endobj 239 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8846 >> stream xxyXS׾1{j[h"6V[:VuIE1 $$0-0 &0gt^͟`\rYj*I.Ia1.?2"ZZ-¥.2˦=2o.[1Ҹ`GaYD{D4F)}%T"xp PEc\6(]] iHH*؅. i\tRvPǨG\TrYx{֟GRY袉ĺǸ亸ٕ_ A~b|7lRnۢܪ=aGbNa]#{B=<ý"#}E_|E+_rj[/~uܢy?܀xM!Vs-e“XMBx\‡G%^#/X@ 6 ?XD7-bb+F,%ˈrb'p'$v+݄+!  BHL"DIL& 11AS3"XCL%b4BN#%#6NP/R.G1IAnqwpL>Gx?A$ҩ@S<%{OLޔ)Sߜ7M[; Qyܜ/lzaH0YP1ۦW0DDifgl_}1- ,qu%%%Kٯ^3}vճ?vN֜s`޴PK>P$6eItd,e'z5%?K~v?TW^` çxF/SXbN4ii5,D)iěd3,Ç!-(+)tSOr(efZn|e5e>Q'.AR 5ؗ(2pIׁ64;P\OhܥI(UMɪ0bv?Rp؊srvtVM]ɬI -%hҗ3|3:;噟TjV= vdcDv0d8ijKFlW+ecvu7[mw'0[ɷe5G}pqCI}FEَ꒺j/uτ U3w`8K??l q & QE%Nh?]qO᫶C$_KK \(261K8͟Ϲ0 #1rU7A/Hr ыwh#u}  coDG;&C&OgW%0j D`\ JE-7ڎr%8F ,7g _SKsue. QpLS1 1?qpqG f &HsBrJ"H'dȥSBmQ6}+5UI0Lt!<^̼((αb@wX%co0xiNUQs].:#O 'Ws?{;0noeݛш-纆oXh[WWxAIocBb2.PhTB2n̯6ՕZi:5yAl"G663F['3XQSVZ2@'JPL;S0 l< a<6x8X*ЕU6'8"0q|I{EӘw^?%L`IWX Xgef ؂Pv;6_Wn0B}*eokR"e|_g dVV) _Y&﶐GJ%2kZPZ?O'VRw/Y*MUल}O+Q4|%bi- K>>N$︣oTDfeR U FoRQʹnbxk8 kW(wӵd œfu.Ar^-A osQkyHN|Pf)VifJ]" [B,3MTQ䟜ALfSLE󯿃ΐ+[.;.֗&i@m|W{)'`x J!`7KKY0Զ{R4וƔ5l^[B:< ϡiO};JF[r,FyRNJ%[k˙eFpF)tE,%G:$JgkA hl\){~IGWr/awkP-a*1 К'\ UaUjJ-,@-՝Qfp쵨-¤_8gd.+omRYE_茾E A(5Yd~ B >V 88^#'pG3GW]J*S9ެ {z?w#Q]mdg Vw1fx7ҤIu ^>}I̷/Jww%zYzjBR'OMtcP N'[=2KFgʲK@>h*K ^6BLn5u\nlwک5,E=TC?"әiڟ+Y#ֶҒ<[7^3  7)1ZCHtG]VCh0H^T D 5sM ;,9( ަ h_Ek=SPS R&ٍxN@ 6[EL.ɏӭ),NujW3.ΚZ#̥`1^9-&t$N'5k<DO[6E$qx? *8aC.(sO*, 4{~k;5d(xXS6Ei>ZelpҹDZN ߓɔb4$%c!|NܾΉX 48Rـ9[6bc0Xm(z23l]qEϩ1ujrvQ|Y!c~ƴA,uA1;j9cjϺDKdcs\[tW@~pLFFM0Κ>x?<ɬCpHАU3%uۺ.`@ףhZ޴WE%ɯ`Vbי&:<-;2&ar/|uJ(q.s0Le"w-`%H(QAhæҫuRƜOē!,?m"~s~iqOkelCBܸbP흍Eٖ<`ϲfngkmlou9VF#LAC @Ѯ\wy6Z'%+Mt*,c_宣/U%hy嚵r՞/Uj_4QBSܖxCyGxm85.6L.$#A0őy%$ ~amESέp7.%[pKe/Oևm ? l5=;{KE: _ϼ 4d89yzЃEiA(,̩i{,4oRؒzْ7:.%tðP>A}wlߵ-fTMI+11؍)پo}_9-V1s0]$w̟y,h*-Ϗ-<Ćg>qMLr[7|xZ xe֜b pZ l2bQ J g|a@R5ښ&Um V p8x u?CC24XqqUDCC@&2&\ CpMb}APl\~N; V-(WC9e6gj3&/R=c+HxC2{$x\>:FVx`YG1ǽr^&@硒=0rm9%@T[ }2 f.MhT'ꊓMGISP0`>L-`,o <~23$AMR-Dבf7v4:rjpj|(WsMK nJ Š)tA{2r3s32EE<3HSS)b<=Z o\<\$b - ٛ]Y]ZN^Dӄ++MILE0!f L<)4-KK+\a$MVnNq,'eKM= 6| ;zuDsk1($Ksrn+R`N`Q)%,|ݯhDxt3 Vg3 @Mh4w+DjM%_iN9{gWS'uKaذF8fAiq̴F87/<~\;3[`+bo%M띍mQr-*Xk+;=TSLom=V4,Z۫}J*AaJK46*67:W_zE0>rqo^qƽ uʔ뫎0hE6qlT:$cr$cu* D/3SLU㗢5Sy,5u*ݖԽ`CY G r1wJlE'x u~"jR/z-JPqtR^.!|0{I7c15@;tX}<Ɓ@MT8Zc:. tӆIڭr1kN0>02,x $c?ރh{d" ~}]7s~ۙЗyτm1=DdĔ3d3L~1Bw_DjU%XRǔwl{(\QwZrr Ŗ\rpWӢ{C%Ь?Lt|?2^<7z7"b" 7.<xFy ?BT`I.iB'F'7Rtde{o*jr$ŝh`n0{q[6xz`4ƾ]!al1g G>ƄRP.:nL>*^UI\>ZUJYtM|K[mMK>z½iMNn }A J;smwc~yC e[g`+)t/8euaqЎu#W30rL̿w`H08G`/!/8=Lf&nE,QW$U%b4oAfrKxl=kv绗s:p)$@,}9i7߂فwćJuA bix @bF!U Շz JG}i3?=-h߳pY(X'K:L/g_'[!'lOIdCod$Fv(x}he8$COA"L!0r9p(5676DKoaO\f )\*)ȶ~7r7S#c#!  mhoШZZC 3RZ˺ۛ8HJq+h4̦WI08qD V]`{X-;̎a6:})3~C/ w ^#?[kW/0|ſ7{ ޽Z?=v N g^0tXv&D3'O;}rXW7􊔇g38 LE оңum*{ٔmh:\Xu[ї㏹8>ftlh=:B]y}]q-]7G7=hvBw˞>[-%Y{cxm\0G-wɢ&f;Mn9F!2%ehNثՅtXiBY2kR#Eʔ*@Wjɑ¨؊&eSh-t"A˕SuM PJW'W$&j)I PzJZJK)œZMNT:tS%ݦ]_jK6JӤ8:\_SQ\`7YJ-5lzri4CL씌.Z6(`k { saɷC9R\ (Pdl̫Fw!܃•VfKw\ 坯/~ sU7uW+x6 Ԁwh<)0&3-$P^kAe`oQ^T*k4]&>l5F;8[xH4d*Np1ƓO0j~ē ~|=ߵ1o $8dӥMƬ)i K>6y?KVj74mH1ԩTyTSt>#A#h7~=y&>9TSer5قITA9aPXcB.rJE]N/;~'80oy?FNwp'ps 7aiM>iLc< ,.M 0$;+\`0ZeukB= N;zww)8+:G@4 ^ _B3ęGI4eŊ~rK&;7y my:4??Rdu6J^FS`V4ۨsKq6Vwc.#/ ^CݦmWw}oݛ?>$TҸU v{\hR ڂGϴMjT^endstream endobj 240 0 obj << /Filter /FlateDecode /Length 223 >> stream x]=n!{N ׻k ؍DQ 3Xf^}ްvxiN%M6eu_/t_őtItmO,ӛ?$>Pܨ>u{ȭ8*&]I*-(qwZF C8q`wDZڊx #kJ f8q }:y׬=J 19%q/}mendstream endobj 241 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5795 >> stream xuW TSWIs %֩\ * (<%Edg`Efg" ZmYk蹬s[Y@9go}֣ Pzzz "D'}W]9]x?2X aAJ#K%(-J_O"&Ohh|Ojl$4 CC$ƢxT$ C"qbLXHx˦M;zѠ ? 6Vc, 2v5[ۆ %ACR.I@LX*( H7?d/%ň6 EH?I(EQ.B" ǁ1$RXx?Ā#IvA!Gܝ#EDؚmOgv}=MYks ^xo4I޼eE}@SQ(CʑM}DVSNǔ3:F\u+F6P A6RAʄ:Dm,͔eMmS(j;eKPRvNʛZNP zSs(CJz2ޥ8JKG(#J@ͥQS=ʔZHQ[qj)LOFLo^sqS>oo< z qrl9Cn*M<;^ZhD|@dL=b~ۈ & J4C3ęp ==D`hgzBZ2GY #Lut ?ٕπ&`Q<{P<O)Cܘqxp׷b 40ªK}&hgp<ͷy$\4*h_Ӣm yЭ]_hA?w]nV;ǁy턮MĨgV x~{X`tF<"^v6komZ`>}>tPlә!L!Mr> aqĠWƵym.S(#?tgBM@u[皡2T[E n`VaQɲ'1tb@n⸮7ƌe+?ho@sb0%EX $5˥' %A Y* 5;wFKn=Ӝ}Iڰз2,=5WoĖ2ȆL\)ז5ev-#)piLr!;kx1>%aIiGGjo 7 0F2YЛL^z\ni)«6Bd{bY;T BNղ2r X _(nhe{+rWͅy 'iIVMbq$,~$| FZcà<鐦LsCnۏsy*'|EHlOj6hQ`ߒ8=‹УQ̰jxLM9 YrFH߬.cxf-v0{˕$d! !e?zsn6 5hCH[qNYhzϭ3y>\U~Nv؏6Ϋ.5ǀ$tR ,qppF<2Z=`~@#okp=@(!χFMؑD. ON >DRqp"粮u_CTF8!.pIHR"G<Ҷ*UJVu!$ic.6)gmx;N<ZxJCkP%n|¼WsgP| S mHwABV(Բ<shhCE9PGEEٚ?ijJG@qq^`',@u S[-6GSp]FLp\xx3ѻoIƖW?F&+_J<¤=mldLWVBj,sথ7T붷C+_Ri6g8 .+UJs\ym>Ŭ?R`զx7bzX.A@gTo7h%p8hG0a)shæ8Aw#9XV[2~h,FL E7XTeDvR?n<ёקtrVE Yk{]x@褴D=.?g)N*hGtW9sLGzQ=Z NPhʯ76Mwh RY3h1 5PڙP I@ ~hvrvv6'lڽ{E \QPݐMșv숶!']FΙT'I'yROgW_eԥT {ODJ:3ejYUޮ˾yN .H O EA*C3jZkk ,%NO'X /'F2-U yɋީfD=B'\!jz\9xG6V9B"wsQ1<T*VIꫪU"ml7`[oI)>~5Pps 7Y?&a䷧ͧzǮn-=ژ=j:KIh[AH QTgN^v"?3~:75J tҬ)//4Dͤ-:8;vC<A4+JKQrF:HD"+u:A"#R ښ(|l?pVuZu<qhp㵱WN4j *=sɶjRxV;MsDl~]C@iN38xl JY1FP(.m8WPv &7^ 47M.T*J(O*H ]eg|cb0| :&!TAZk(%yi"=YH8ܣW 9܏g[ibQM1^C5Ԩ..dtydy$DIn$'V[~H\Y#m: R%h Jڹ0r[uܯ.5TWVJ7aC?XtLhUÛ=>.ARAz(h'^⬢'|8w *=sꌋ-X$M`RC/A/z_$uzi@ItȻ[`ۧ_7wxXF qnOb ;ZYg Ow }= jUaBdA:횙ǘ. 琹`i]DZa0/-G+v>z]t\$PB7Ū2!~p| 4^{ew.^iyYQ9/-<ҳa-FFkN} ޘ y(CYo=T}HtI1|ѫl}0ON@a}/ +59N'GۺJAFd #x ~48{cxi@ smx/֗Gz q,2[*WbqdJ{yAwe<"Oy%2㈱!O=xL{Ӟ6#`y&i6v`N ((;]I %ϧFoPxNdv<-z =qgH4:9ݔPV+G.SYD/.] q3Լ2g1e3.:F;.&57-dOmz#TB[fR$m커s/97}ww=lib|`nv+Sښ~Q^t{\^3݇ܜo ?2OQҨ fO3W|qf"% ݍtL sS`)쥷LY}?=e4u5U]{e2Y6dC&y2$BÈ!gz["=] 2@w _Kzj8jQ)ϩTs:x{f Pu,YbnX1`>|>d]hN]U0a!q}$2qyHMVB(?kV7)a] +t]icvЭףFA%D"U*ac^6Gm\V>윻LeV^92yiܫ?ܟwM~GlCd &Q-}0`NgJ&N/D+Q# jm+ -c%#줔"tr׉i2K}[rv'U6巩,79ojr )z=endstream endobj 242 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7580 >> stream xxgxS׶BIK@$%B%!@HB'tc0&¶,X}I$wȽ1`J0fH! $|}K&s}֞s9ƘF4hQ2ILV榬EfSek 5qFz% cp3'Ev68w,/6sigFSccv;}Y"X&]h/Qs/ ySE?#KJg%k:=}bH|@l"^'8"`lb<AL$2"KFD b)F3BN+=F }[3⍈sGWJF9ØcՋ"GE1^e*8cȨQ,Veq^ԁJOA~΂"zE.#0?׸B3b L8 E%c(~*vw~/3s)Ju.`L~Jqab8㦷*t|.yɜPhwslS NGYp^Ad@Y2Ѣp78{aϡΝWK$XLH |JߒQ _9G?{k8[ᇯȥ0b 2kUW 0KdY߫;1z{TUu [ 8 .]nw-ܦ_<8]N7 g,t90N4Kp.` X+|?~cB̒v{܆Oq:R@`ð08n5% .Wb{q_k8~8@ wZp}4.g AUr2aX^Z&zIܫ(/V_F=n9!'lp! ֋4rlU:ʋΎSTk KURX[T[[r,\"6P9VYʺ5<e45U ۮݬuj*nw,48ziq5ڼ|U5ȦEUTesI30^5:تZY]bP^]ssm ۪_[ic)El(@3|՗vVC,L~-Cg(@һo݉88>_wF :\8*  *5v(Na2z~[@-h%r{ل>9<߫n d[UU攏 9et M&[.0[k w^=W2`*;p셕aqӘAg, 7)/;Fj1s#Y`9F\UlXʕfPgXԫAɈˬP6  Ұ81~4JwqA+KmfU q:⼹8$6d1T2H}SaU;"W>!P*]M[,_8}WA'ٚݐ)hs>]S]V.Hgᛖ{o+0;Mvuo>e,?bQ:^ȯ_X%&3e!>KR/i<[Q'N vpZǪ<"XpxD zu5 ~~qL%yYdZ^q[lo>=jBw"yD ͲL \5i8eF?Ģ(A:ň.rx,VdNf̹w&`ڵ6Mb;`C֢`dcw7qJ#j6efh F@,>~ r=.am2ݦNaU<;֣y:_}•d ƌX]WQ>w>؉F^& TB@Iz~|okwH{f`JJb5Y[Q&ɶyь71n5?czuİ@jh#fJWYZ@U.AkKӀ 4tZxzrxƪ<6F<|zFMaLj1ꤙ:>$%FGG+, f#U*Ud??,>(l76V]ug,܄Ʋr-1~HF#[ .qZz7Qu+o I& b~ف :avV&9mҁsp:\ Wv}jG"sO^NcS QHÁkx)24E5=:pDȦ_p*b.T|/m(}JO~o" =uUME@|--_W^Ʋ5ʌDy^#ә}XRRՊ+]ހcd.S4SA.HJhzSIVHH0:S- X8^wP*Zp' >-:Y 1#iܦ lhk&af $[P?}36<4͙qvۏ>kypk?<~HGQpVMlamis"Y4cNŘ p$uqHx9MG̡r:3d"]R/xЄM `d;[ vިTPT Ǵ܆gU_{0dS-xQE|A:-qBGYvZѴWomW)(+zN{ÈC -f#$1 --4nq:+!IPvH:,8z)[8z_MUi++CunS JQsU<bT Wd tBfr0^|!":C!&lo6iU<߲{2wh.Z->? !2{Дu3ۖlL^^_b]ܣ%UQZ޹NN?-lKl_qy<^nϕ|d<'G EGÜ;n8}ሠ7q.)NʵX15՝)v%r2{3/FNxF9)x7A6>4r9_&Ž30Ugw_GZ:>]zM U2sE`X'ݻ?;ClڈI0*Piudgm E1ʠenہm*1z~˻Ψ/.2PS_v(uӿ|}tztawvz2:v[>pOוZ_yY% + 8쬔IW |Yc/r1ޮs-p׿#M\!gh4 ,j^s6>p0CB &QEYC' ܪ?][QRZߡ)bmݒXKIŎ=E)Cv'xszgaP.=$|0;<0cF^h.((,\~S=PKv׭\ޞŁmVmyR_ x.BӞk Cn8`ӏn\jdDa{nCI] cgN7|wb&#SJsG^8= :XmmM׏?.;c=Мo]Y%f z#Mf/hsϺjc@8JG3 + >_6u}zMwIbalv~C:Sn6*fح <;tGO}{BnOg0Xh-hKŒdJxg~Nu)K3+skj"<ەP[h z_.JҘpwcʰ{$c@͘0iwc ƒrET7*ҭ[/p|WϑH9_ST8`7W5XZw0ܧܹOX/٢Tqa~j MM4vp&թKkX⎔E\$ytxv.\~U<4GOӨy5 ^9 -M|F{=xY.+5;wZ *^団FpU] ,B!y} iOkM & =V߂~kBGZ~{7Ȧ :ML16˜ס.oխ~r+_*jj;Dv=H"?[ q | <%,xyAZ@cF=%V~).rԃxЬ;-v#1T7+;\zWCݥ u{e(Mj1k(B %"ijˡ,sf P9NL =M  bЙ v[Vj ;8W+bsc7rFٕ{5Q *vi`*L19!ު˱-԰u%f^:'1Ev6 r~s\8w+ߨ69SO;ȢY-HeL)Y=v 6wQDG_p݄+U=<ӑ_MkiHנYo \i۶dv,.ӨœA5V? .:8\ -Diyto]{4f4b^*zpT@ᚈst쪝`;hߝ̯rĕ?.DuˮE _/I榴-\OM5?èL4^ 1c@H0 Nt씦Ԭ&m澅+YFT̼utk$KRvp3M'|\x5;,L .:88i) zM,5ol(CaC?z0&FC8FwɄ#?n_-mMb-ի| b.N_< w Gb%J.ђy@;' @󣻪zC:t2UBXz~U^|KըpBB 8 $ZHSx.-}r4'ϡ޷sM;Hxb ] ?rUmH9^GrkZJުW*O:M/p֗[(F"3Ef< VۥʆZiol?8[f]F]jO6eq\KR${A,9&vs#s̄>Qy䤾%)MRlw:ST~%#H+1ߓ ޹|.L[3'=8U>mf8wv {>ZLUwQMpq m'qk&eooV.dtPt3 }ʄBԕcx2MWr/nh:}.,;yu դZD TG7Sߊb<,-ٔd=ۯP+@jy~lԶc?煥M/6Zf*>“R8p.Zu ;GHI\7Pc啹FՃff̶D4{;R\~@%l6).W֕oڼu$9G6ݜ +HKēttxp)^x9p"O_r_imi3Q=wC8:@Ʀ}i3nǕC-G)썃5}WNauA^E~ם'Qeyw;pD3W&Dk\a*gHҥ@bJm5r9X #R+po^3+5F5endstream endobj 243 0 obj << /Filter /FlateDecode /Length 2068 >> stream xXnܶzOwIP=EmA|*Z?[IqEuӤ "9~7u` o^-N6r-n'g[X1ۛH`MY/BpZ mYjMr~_9Go ^[\>85|Wg)v~L:!w2Ww jb 3 @T3uy)D6qZ#0QCyq*CӪq6ŰVqcd]_#!47Qhm G&}E;C -ȩGX÷"8IUFab͎,>p/ \lDz;R(u~H2襡O>jz(mH;B( Kh;_Bl;97zDzR$Bh)՜ZAzXkC,-Ͱ#Eߙ2؜'|>M4~_ZF{ CL<שּKͬ7h֜w7 91刀|xz#ר7j%Bx%s?XK_I^ +KRӂEP#i)?|yrRux L3a#nLEz"ѽ/0zjl9V"t IkOpBé@)m6.!ZԘڵ{$tP^ʝ5Փ䮶czjZ7kf)5ljP[|̴O1)^AC.' v*\sT޽pī~Oѫa+ |'6\9~x9Sendstream endobj 244 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4279 >> stream xWyTS׺?1}j[TR5ɳuU[+jEVDf @0$! @FH°!ddAԱ:T]}ۻֻX~YX"JQ˲BdׄsDHRU7zl2EL -pjśKL8w6o#3p.8TSKO1y8ZUVo5 qzJnӦMdw HKGH"gAH$PeibH}_h]BDRB($K)`qH,H)'RdTJ,*۔@)%:E$ V "EXRR*@,Mzɤ*\!,,Oʔ*eB,W РOlTeU^J1 did,%Ϳd*XDjWOH*V%B ֋+3&(?(DBEDy?B\+9/bR$I x. 0`zP%C %vyN.U\urQzF8B5+ P%"XJ,#"D$"~b5Kl'b xxxKl$B,b>"7b6˘8>+b'쥳}8)~"sO|>99<}jq睜|ckR%Ep$ d6RK8նHvit9F]L1E.S 9&ͧEcR] `$Ҁ%H8YJYTJ]f)m4C5tڇ /W.j;Y5RҬ3G 5z1\5ҹAXB}z5 5&qY14H5: t$GлWzWrq(LNF׷-٨$U4^2ЂW~eɋŴ{ e Ǔo|^эQ3:ɜ"hN!eYr yjmx JF+ ,н^3D>$5ۂvgBn0$ EKI?)üރ.]{@g57kP$ymsk`$Ԙ7C-${Y>{`k~Du?4I4{4-EfeD"*X*r3\r+[[hfm>VRnŻul HIF|4$S u|_ y5cn+z6sdXHR/BRΊ*sVHQ @iU,sr֨ˊ!Hꬮࡅ,Fi*A/Lwjpt(;twwAjjS='5 D>m0lc\1.[ 'Q=Q]g55u $\M}1Aq":']ytKgD0ѾM_5k`?L` ە:'DR| 7pNqM-ѷm]Er"#\ŵ@Sd7Tf/|+~%xPE5ρ}m"Ye6 \h)4DI I}bKKm$Cm}<}C"ߔiڎ(`-O=M:ߍIkYD)Osc >zD|pn$mPf! MLN80[bnmvpei@N7S 3rxްI d+p›$s1YIjpj7bb[u-QZVoTj*6KQYu\Po#]t ֘NVT.հDϡ[]WkmXA|ʿhŗ ǩO8:U I9Gvirܡ\-.Xkm;i,*֕exC t$QNN 3IvLX⥱c&.؎U͹CXD5JNV ّQ~%Nch9S gc&nj^V+awUVd 8 _V]]I̷wޞzDC]3APɅ:YVfF8.r]ڟhpzJc*voPybI`^d~;{˹.zt[ 9 btوt@CݰQ~ɟfћM-uQ]rxhA-3K1Mf5S9 V^J| @uy%p]?$3@,"<^'&L{6M(.F&ؑ =_ _8iZYnqqrc\L^z2?6Q E @Í=6&cj~̜zΙ@k;Uvޘ! Ξ :N0wSZ=_Hj9@'}3DԜNF7D?8hO#ДHaSp ?ô'[j˫a-$L|z-RpxZB?w54ܐLl6ۀ/"bGE9 w ^`H$=^(hU':*ɤ2)ѷAjrjlHl۾6CI&_[R}&lp,/h<w}o#l4?BQݥj8]=}~xvY[u$m~g2a[RiWúZk#U=yJFH3 <=aܜD!8C֡GMG!y=}pIfy2G[j5 ϼ*TKjE\v6Xڢ$Aj;=~r7Gd˫Qn{_Ga< G]cTbz?˛ɰ՛8+ UBbLp:jѳ ռ ˪Ro?y>~7vJ^(ܶK vqwA1z6T U*EթjY@=~7 /V1e|<#Wג>gZZI01?S!~Xh"]TʅJO >|cy*V7bNB<%pBWWh%c yvduz?31r33]MQmS@t%Q?55Mk `L&xDU{$7t:N+*(%4'÷bâx(e`6^Dcx.jYɃ~Dp]6pҟ>?,wJ}<*M]½UFD.[`k${u͇oN,׍9z8n}-w y2t~V1&k3zd)%vEWY|<AVOwΝ{y<_Ǻendstream endobj 245 0 obj << /Filter /FlateDecode /Length 2436 >> stream xYK۸ڣ~j/R#kNbo%5ȧh0H-Iٞn<!i6ۇ я_7͓o?~̷fz? &p6/"|a IsX.*R>4n.L4%g3`M/샊MAP4"!"敊@?r]v)E`藒9:o'xIGj/^<҄fd\|1g{@N- fr~IKm.w/JM쿯bSuOb_0UgP+řF"af\Ag@2Y RpjqH@J1$ۣ̉f~O xWAُJRa!Bʏ2껆j]_iH@8@acis 1B~n0"C`v<-e3h^{ef'tzu(<3 Vp#,2x ,ό|rs, `%؛&, W* Bd,I\ s@l aBP5H\3T`-fnTB]L5L'|]X:8T%B,Xbw:*WStBAQ("mV5 J;>)hzTC-*%]3.k0i^R!u:MdTsP"o;ݝ^O0 x;4 RKef=ǹ~LB ( GiQq]¢\089_Ii~SO4'$g,Ⱦcujp-wnj" b!wYB9U_b%0B!} ]#F|9u#W/D4&vIc>?$3%X”GL\FhVO7J>fs*M\CW%udfnznq 3/p*c׾zI7#;I ,Mp3>eoc$ 2W,P»'7<ވax:RPP^䣳G=.oՠcI* fɸ?\\ʾ 5()"jD]ݓ8n+LG+Rj Z!L*ϗÝ}Ρ(3O'ZPm%B4yX1Tw&H\3KG@T>K5cKp6*K-t5ne׮ M|LQ"?47e y7Ί" VE?O fݹ+Q[|~LJ+#mcꜜc8PqQL$)Lp805 f}8Ks?O~ `͏^P\ybf9F=g͘f>D׌dR埳E#e8_4RH+ǜ*$Tq(7,=v>QB7J(|AnaoK|4`Q1K `jw?΂5vEkJ3]s?_L['Oh=JnZ_GQAH;uijCn.A}h/6挺F L!&t׏C1~s@endstream endobj 246 0 obj << /Filter /FlateDecode /Length 3192 >> stream xZے|<3b$@o9U_r-e'#Z7oj!ͬ]V>}9o/]fwr3^d^ֻ?݀|ҪY@&KE^^JRT7$ 9;_eifyYyQ-V~wvw00;):T"-eI:+^Pi8,i.$aw/L&=|A*AvF+dꭄ*PO:Z _y. ͩɾn|yÏD.XȔ+Ni]e^2+3%S);SB&wک)} =+XQҘ+>)/W@ :|ЛvO:zxKz BDAWM ֵ2u12lħ.,*\+pw=4E"7.n>$ ˜%ziR1HFion.0a]g+uTUeQ>ߢ;)/=qnc%˴%L0'qɈL @$GDۺC8k5_P~rA !zHQ.T0cJ ݽ?G7*-+e͘WPN$ݚmg1 &j:2Zi+^i3==͓{}{3àajMV"f;}6Wʝߎtt n~|*-$ Bƒ)6\L"/PaCFrs0ݱ4Ko(OXj9bea0z]ЎA)T2bFA՗ٓU B* *g<lțOPSlJ,H c) $(9ߠ^?>c7H3 Zc֤R;*b l͂rRd "ct*1U' cGR]; m䁠ŹEL_(w6|yH,`Tda*JP2j2{=Ev-@Tn+KzіџN/}b*"\ΫX1_p(P>栳6 jD۹=^nyno0>\k\GJ q8=+<)okP JUhznbH5Nc c_@pzW}vRKBWhkCQPJ 4}ut4 q&lPA&^O-Y=4Ry96THu88|\~?if/j`~`gǺ g.KPn+(< g`FdVʂ"YxHq9~xA; {ޛqM/N ݌q7e$_QY^H4'U\A (A` tm*mpH fns?vZW20qo1b_&FU| ؕg> stream xY|TUa` ,{ (VDP"MCBHdR&dzIL2iR BJQ,oqumx$Ⱥ%$s˹\.{GKg=D.;i / [1cy0vdۤ)fޅG \n^`{jZ]$i☩Ibf͞|rv̋9)I1)9b옵yI)bIԹbhOL)W6o qz̚”Ey9)1[9Wl^HR}Oѽ Upߔ~n {`pN\0Io?hy;z}Y͜>؇gQJ00E% zQ PJilZ' aK N};uI͈ͅNq{o.Ir6K*P" {,/ӇBh3+F`-a9K Ft_~.3\zF ZJWVykm2{COA{`qUO T+5s&|o6F)6@NmL=t+ATK,\ 2!jt^4NPo뉝ix(MVH3*VR6vR@POef^^bK7-qf&6 ?@<ϐMD4z\%ؖ~`fsmW&<2z]Fcͧ` 0hV_ZzW65kz̗h4sCyJA(<`FGhУ\(*àNJ&RMdu+Xz].o/zb|-釁B =Ӓ3mCEVJ$+A\Wr]s^.p47Vu[5@4Z0 7g f܁&vʥzpFM:$ڠ5@މ$}?xQ`U^t@-.7dMVMgW*b5'mQo@xK#z]"٠KGj&sA>d4&?F1t_e v=AgeWٲ7?:-ХVo&vf4IRŃVĭeo k9j:1ҼF]L8t*f2[4h4e<5u Ov/<) @ 2uC'Z5.VeOQvMM@FWɺh2E.NĀAKi-jtLЋf-p/[w Ht`J=4TG5)y=:󱏰_>E3[;$ksGE{ײ1t6& G[TT 3՗6Ҫ-K`u4~ 4ȎKpIƚ]}vѩSKڪ(a/~bz6-TC8?xIgvq}]!\i$Qg(EavM~= 4 =d ɬyt%5#RRu~,֕Z3'"4ҨkmfUh4;5d/T 2zVTY#=<ȅ,}5ׁ5PIΠ\$, K vD|rX[.Y|AP3J(M̓Zf3oQ$?OIY@I Q웷4ss9.lP^;CfmH 銵 wv2-crV m A)|c.]ceqF]s ڠ>^ӛ:/{T1N-j'Eofq&z.}!A%-R'5ڦwhoHr?}l CD\*5D^X8| =hbG|#h^QDV9یJq^KY>x[d*]NBoȃQb[ooGp"ؠ+%P8Dڞ#2zw.PJt|{!T]ruvْTÔ/OOL  699YJ^hԮ@}s B(( :ɌY\H=Xc(!^H~TDf+ T|Ze JW0jeߓmԕCpz4O|.~{nv]2O`9Z_UP]9n9%i@ed6UukBMڜP畃ɄLȁiٰ2lRđ=m"@$L[3H|bDU`ޟ%[%:!SkJڠUe$|H#JLNmR^Ws:S;K|' W2I%k` ԹS:jZZ MIq)d@ZvU^MBYMOѨX/ɃzPưꊊr TaD,ɳNzovdJCϝ ӻwe'9F J~pꖔ TkHˈdףg c=hERY*]EW)5$@8L6Mb{Me&2B=6;u`?Kא ͼ mPnMqm9Q/N{m:V4J@b/vdbrP lkntD6|Y:]i(#ӬBi%+bXUU6WA9HmHD.< Z-mS^yw)Wv)\uo"|97aܨLquVFS> ro7nXq4˘?Zd ]u5U`% $ ĵ} 3^L͡5zE!Z eOn}WTQ oi~nQֽYKk@L,ٝOه+yl;N`"&LD-Iђ$"|Ҡ3.ڿfLd )3NR4\&u,I.{.E|qAQi$[BfHIbc3u?G%-^A5=t}yvzz -B8x"\+4QHEPVRY5tP[t*—V"mV\jpƻ ل8W/<xU\`+Pmڸ.#sV.Ȃ==;{z{ WHFɗ +}9'B=J )WtC: jF] ~2|$4۝;Lv+|9X#Q{'#m} `Tb-_:KegI{Нpz-W6gǧQP$?l}{]gq!%ă勒Y#(RUy>uOo /&lKpՎBw?].UekČ:OJsX+?jҠVTw퇭OwEn* ޡ>zjH/*565 D$_s?buNb|"2-H' ++^ !-\"^ oi yM 3ރ;9wycR-5{ƴeDm&;mLTj:Z\JƦL&>xb7*NM"I&!3"{[i2ZkgY: hh#(nJ XP+osN.gףW.*G;CAU=qBR[k1VN4]ԧ Eڝ9&DBhn~rqR;:Z-WɂڹglMa ]9~w>&} BI2贾Uo^*hl TVY PUcuܒd6x*O۶r} [$ŷXji ~nWuUhb) X'4=Kc<%CmLaԗո?%_x_Ԫlu*[ESf3,l&^ĿMF)h"ླྀqSxBJKl'| h(MQM]՝=qV={2=ۍĮ߁&Pw;wL]-Srswz'aڿ8z^j=azcIƫɟI: !;>xywj`HC\fo$|ҔAs?T/%rTCJTCޓEu[*:$]x&k;jۛjm1h >![C.]SڊUSū i2{VcokHSn_Y?03g<4:gT TOXNb0 J ' W9 &fMşP4n2F2q;}dq#ۢ+A'%& vϿE]Eh@%e$L#1?uy=$}|j4*bND wy;5~&2F|i|_t4C) 'ǓFܑlux,lzA8͜L,o:8ݵE @(<Lɕg.jos$hmj KRỸ" MCj{V+ $袞M{Ha#/at ]<}%HD.~<6h̃/qt$l_p*ۑM>VX4j^g$Hlxen1"j6:(I-%/7ONʜ^r/|*6?=DHšdDH`;OF^N +Dbhh-&X![.1^kdyG, U64[)޼K5?%7T2z[LTQx|('lj;c.Il`}X˵endstream endobj 248 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3583 >> stream xuWiXS׺1UD%Sw8:Ԫhbq@<+2aL|II H@@!2QrJuV*:tm\>g'k}k}~ma3x[gY}NkM)`;G83QH3B#S2ծaq@()S]\Mw=k2D+uZ/ HQC0@ITӔQQ fΌ!F/:)60*i$R"9 r J7c5L%9BWHBīR QhX,RO2̛hT/=f9q+6VbM V7b-CGb,1O0Pb# BSp"l\O~H fM_mzSRM>NaÞw^1pv&W#$#mX={ ̬% I Ah'=ƄNMfM"|s˅۷08]dV9!,H^[]nB [K#gr#;E5|6hwx= hL E#^=GBGུ7xd-p 8tUT뛠NDMް$ۣ=Bwewt;"3:Agh)kGwx:rӽD_>uT}Jc*TB2Nl 9p l#>[bhJKhI8 Ks-r2_9\5Mwз7 !zAhquĐ˔ "4|ayp3W* P&CO46ֆf[7w"#7ߔ;eߣ8c wh3bUA@Z%!0[./g4.o\d?>-I.8n_ojd;huJ>h*r+ rJH>(2d*$>m (  FTDYea7`s_r˽ntJO7,*q;PK~m%7A K7]˪kxSa(C-(l>Rx.J:@N<]fCJCt@=>'XzKcVZ3X55dرJ]MTRء9 !ʼ d_4vѫqPRܡZLث Ԫ/0=+<}&e !MG hmZ1HݥoN'/NtHII WQ!dF9|;ipnQ]_h/ٗreJyw-/EPcM_G1/ EvALW23&Jsma>RmQg5$\hk&Wvqmic?b OA0 5RHo$āR/uO7EhVfh\<Ҫ7z$= A qIZG ݤtAtzxxШV`ЂgQ3'".o!ٷ"~yA&#Ed&9A 5Q>h{*O@oԟ:(Sdh)5RזEyEM@U2QjrT/bF\'F5cժ^1Ft 1.(a?!s`o\_lCh؛I՛aސΊ1$Ct۱>W*G5^Fsne1Znϫ>VTrk2ctLn0W`~|-F>ƬSOc Ihثd۾%@'[n࿩s~ŒK u#'B"c.nLsrsHRU4HU %sim\=O\彴B>lcTC.428k5=ᎆnJhx#k_)_Ą8ihi̺:IHQ@r*/r RCmSGCup ݎUʇ: "AA\6'),mN#/tvS#ő~"sdT 2D%Xڣ&(QZ]uƐHq fM^lFӲ)Ln)͡sN?"'6[%f>&jF#Uo†q˖tC+37iWN¿=$>횣LKޑ2sdIt4ϭ7nGQ0>2`yz3>QbXJ30?/AMh_oq[uNA 2<9̀ZFVzTn6j,C1B< G_[TN6(mAZnшmv#9*7>gf+@Y'z>Xx>RPY9D L'Rp<kOoaM|tӴӟ5J$9PQkjX&>vCNpccap= `N凘O4?Ɵ>k4_* CXx/rot;w~xR*4|-k4 18$pmY}Q)xG'|{" }oYRP4ik~Bk7ix.EPQ9P@4'1  ~[v/T niY,f"澄4 DNz[Eirۙ97 Q`m`]PhaA}H0y:|;7T6endstream endobj 249 0 obj << /Filter /FlateDecode /Length 1817 >> stream xW[o6_aI]zX&^Ah,$;Dծ[-z9n>9ldУxɃS͟16f7  =Jlw/0111ۧaߣ)"lGr`O6Y@²:-OIi}MTT"CWMU^X\p4Fa'8 a zRSlR1Fibc|>00b ƞ`$=hSU7[SGA9QcJ\ku0=ai+sOgmD 8H+<}obAXGQN'?:P:aaG  ;&`F:l*DYe &bt-z l]-J[>Ez\@m.ƾMoEZXwښ GeB[Lj1YD}`y2 \C5t,t~3k0SUKy0ʊ5QIQ a8t0FsVh6K j3L ?j6*DTq0Um)/ U ]uM:yRU$0S@UNimF)D,)34F@ ȿnN`n7MWqbYu]+`1P:a{PMLveyyRr`=Bv!!K`B$.d؏#9ؗ_ V:9fc0:LC #5l,8 It#ͶK+QRvrMk0&To(WׅEQ66YIgfWoR܈nSA6ɒ+mrbMwk;1P`ѯiy&Vw{v6IAYQΪi9DxÁ=/$EY#<%7$G{^fw| #jITʈɝdgeЛ`lll Ր BFJߗ"9ZT)߁ &-Ȋ,ȣ"v`L/mę"Mr=pqRʹDmА†./Խν-F ԥ5]: ~l:-ڲ-~M^Yz/?Pw7|יn] Q[%rzm^52 tX򓅥/`uI7̙܉̜\bO~ndw{H_ecmLnKXP}YUJ C~0yh*"edT[]̾, QHi.Q@Uyid%883'2Kݾ&Ӷ)h8؋rpF*RBt@㒃JHyFp@4aprxI4_f5^:*֪naJ&#mzwbHQp3ej Kt]dVIDAaā[C3JF^Sqo&endstream endobj 250 0 obj << /Filter /FlateDecode /Length 1791 >> stream xXnFY&4mQ(}PVrlG7 \ Krvv3CLf썜 &'>|3np-&n"TL%!`z:L=%7c`3S*LY)z[˦--QLSZ&cN lBDrQ1FE]-7.WE)jybBh]k ;hUo/OB&4USxh!/amf?euO7NQt:5?=EΊ]]&fڝ.E]eu.`PSe !0`jϽ{uVMk]#>m3L8:ۮę'`rq4E@ =蔛_tAׇAj=j_-fCf|f_&JJ8mYmuȳhCٞ{뺪{0K1Sró/AQEh}aohQϟy6S$n GFhT;!UfE"ej!C2|(p]3m˚2TUlvv>bpnA[AY ֦ Is~* S) EymRa*ĵV&]L2Vq t+joCxٛqhD%E$h jP,!4i~2i2LMQȃͬ3hMȬ?vMCjCRn4: avs4` s:7Id]*=vhT)r ÙPa c+ "$5)~50}z^,\;x+@ cn&=sȉժh 7H jl*Ln粽!sh)H uǟ̺0WWv7YgAtu vUB][,ljJѩ/@ymCt؟wWl;^iڷRv6G**5֯#Yۭet)kZ-Mh`MMENpg5AŐ^!gO?3zhr.+&MhlL)ALcW Pbr%"4'%a+W\&R2`T& 4=G ür.1ВAc`]gRShXT`Ԭ[YN55cMdSuRJ >3ׂHa#J bAzVˣ+PZqf(y<՟|>wTAOЋhȰAHD9~ٙбR5#،n HS*MK1Z_͡E 뱖wˆio.Fy9;@9jOgX a7 mOcUU/mvř% ^X^Obendstream endobj 251 0 obj << /Filter /FlateDecode /Length 4668 >> stream x\[o#uȃiN/1fa; pY?pcIjg#9yZMi&>HVW:u.߹Tuj`zsOi ?.֛ſ\F>d5[pjr^Wpl׫cs} fpvW*8fU=wԮ,0n`1q0mukzj|uX'[XI=`sЭ u6JZGiq)B՞H菗@fnSUl߳Z)XrU /Kvڶq{ď NSMVq~lmD$Zp5Ṟ8qE.E-}o8i@nn۷w8POp+ FgX[77abiZ|ޫRc~Q+n~wag~LTKt_f{hw}|NWպhuEnn`ϫmg" X#.;Ү¾zXWfLU Ĝ^Gyݡ=BKLj^S\Z-KKUy1@WWa!fj7+ qyʞ xYw~Un:C{NYX_+^5MТNda I˜$Xf \Z>#'֗KpF]ؼ juj;O.n(HG$)J\vbXv&_bSO9#jc<9H-XwWpmOh%~M` c/DgjW ҈*p !}Y嫻HZ҅@ 8a/ע4IXU@ʒ#('aV;kYd/0\#)nɈ̜a8.- Fb@Ai=ЇK Rz/cwt'M֙ K[=?wϗ=IN򻅵L4Q:%@~2ZJвs]6]o( #ȅ4qE`*k{l1e+pcMR Wf( .!HZ<|@oW#'m{lH&)@5arR&5-D#9g,ggŘhR_6t(pUqːD!퇃0 v$\#O c1h1h}BCn*Tu]1"v XGɱ,) QvfLi?qeH &xV pd TSBuVAIHᔀ .SN7bw?jn~>&,Te,!(oPStn!cn#E,Frya޽)??3VXc+Sg-6XMdM4Zdy[-G6j tJ<2n,ƴ)2 晩w0[AuI >PY)?:!oՈA- s/{1Wm`ֳdj@R+?C1ĎSp,<%9?Z1])) <גc|a{BbZay-5́ft-]yԔ/XjVz[k\Lvb:j%&%ҵE>,H"UHN<:еԉZqzQw7CFǼ>05θTirܦXaI`(qEzऴd@(8{^&P/ fq Ƒ]"Y p\x IEˢTnUQg -5yHO- /^Zkj-耙箅_Q! )H92ӹ6i| 6A獕Gy; /.6nW}Qaѿjf f:fqꒇ-hjsHSa C\ !FqB-'*9MlI'5g5k)'OtL[r;G`zVD=GhH&$%@+75K n&A6>;ޜT̖B͖9#3J ,Lu+%`&yěy yHdV5`BS]S??S!#b=.zzeKƻrХfҼ8%.Ny*,l_~FbѼ+fN(sh˜9kl:Ă%9%D2u, ŕXXy z H0P΄nHNn`2fNdz66{1{b9XbeXRF+uണ}+<Չ_r?ğ&$lbF U.$xɍ]r0ޏ5f6Ê/-0cEĂc9_J`&L LA"/fl$oKUU{yQ\-zdQYw q.i%TC}YqTP@Rc^xe3 lŗ,L}ʋŧ?P֘'J#4B81E[8eջ%d5hG׼e}#W|F/Ϋj{Y6dnuQvKjl~MPX]K9 Wj3pS&HSCtסπ$mBSSn4G`Vnهvn&H to#Lإ[ Z}{սߚ!ѥiNݷf "*cQ\d_wom/\.m=XC(>BJ9k9%Lf A8|> sT?> stream x]An EkZɚMɢUE0"΢ $Uų4p:r^7)V=) mdH~[+b8]PRc7wc/݇ZŢ,1DcR ZVР0`O cgґa(t cAC)I-`m{c_~wB[V`+{I;.[)II>s+endstream endobj 253 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1586 >> stream xT{l[7~@v) J^VE U@AZAZML''}{o'n-E6BUE<$P7 hBj֝7unL}|$5I]MGHyc V.SAF$98ҳo^G!4>ֳؼc-Ɩ]fd359&bX=m|rLA{7o1,~f>b59ϙDnOCNݸwlYİj,Nɡq%hlR5l5mNА}յJf궚Lni5sZˮdqrqkV-!{8Ag;q@N#H&HL)^e?&xu/!L ?ճkvk"D}*{gHRtƇA_6"p$Hc!|+"4N B6ˠ׃{J!LeOlT[Qs׻Y^LrbbRA2sDG 2REtff0V~uUiE]7T}(F;l6fs3 cN%Thk]n7M `P]ΈIkB|8f*8?|"ʋ8I2pb4VfPT#'*ۤGV.h=#wHx7dҬY,9z}Kŗµmb2V!}a6o!~*C*xsjgzt> pbL R"@?гZ]TɗZYnM7i-nxކxoC(%ϖ~ r|L~.R0vFg:_x]D:~*Ί_|v2W} Obz'D|hrOT_^ݷ&_Koݠn ο]=T(dIL&*ziLT^<J> 4WJ,ʛi! NII'sk±0nm4r>]OL姚zYG5ȮBʇh1TOq| 0M$88"FZy0T!aq KUqZBUMY,n  sUJJwS/Vfx:g1ݡ_@Jy|Z?fE7#3ŠV jgcVPjg-0r۬?-ܵp7scڅ:e| gu endstream endobj 254 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3020 >> stream xWytSuNV1^`D :"2 " ,B)mZҽMM6{ei%RhY *08"qadGό{1ZI}7\).vÆO[2Nax0kjϽwމAۑt.Zo7ymkŒ:iIQL#+V,_,xtg*DҒa`PV,rVqAHV'XTL&%raaEbiѪ %bQHZ+-X/ 6 +DIO>WHjd"`xHZ[T. +*ŠaX/ 9ݕRPQ[T\RYʻSg9Yy<NgElKs\'Lg*g}g7Tz*sPʺsLvxcz Ì3wC%u2DWSD/4J(Do!R.\ -i.u㑃N[D]׈imhoόfoUK֝譆BŲݪT.cJ'BOݾaw's:;D_C6@,%8eZdw.priH\v Eڨ)YmT_GN!9$LpYRbL̩*:Je%٫<̝W`bf?}8@7uA:cm)p2Kf!UX9E5ŽXWi.X^)ӈ 7k5 ,¢ v)W@~Zkm*u|.1ʘkJJe*68p$MĔ!0gLv`P'ّuhY4'q IcjoھGE;4BToejȺ=g vgEu^>wW} &Wl^$c^efA\MDJ¤ВFCI^DZcu9{EkVv\{Vb4߶{ 9Z2}IM¦ !cj 3Ba4 jOaD_['--2K2OzNv_w=4T6%TA`6ZVq7o´i`t T@$?@{ ) x>dfzvC >Cj0+ӡM!?I5'hq}5ٕ}0s.xDaI櫃\F|o1e 8 ]i8+AmnզLi8z[PuM6EE5־>f3cLօ+&Oh1C)=v&sŦlZt!H5ZJ8 A%Ǟ쁄-nƁhABn+ ~hĂgG?DbnvD S2&0Yu%֝.у ɓ{3 ;OYAm_kё1 9`i%0P-wd‚|%YQ EE *jC. bGW׫GvVWWhi;XGۭef5gNE*M9/ոasz}@ku.2u42 v]nN6:I$| ctxۖ܁xݝa'9Fl":<7w V.G xMށX+IL"}Ƃ[n$he|O̻K4 4-Tphp$51cJֆhE:6wzˀX-ݘշq&UOJk/sgnK~~`~lEt 2a3d6fj2} LG:"]JKxY] Ǣ5k) ֩4x _j;FGё_;\7Z`YHMOvD Mts,Bl)vOnGDR^,+Mi|v0L3Bks٨%l܂fi( PWGt?pFߦ̴.r2Kvݍ5C޶FRa)6?QhdKzI lI4~4^4;zRbX' هU93[%h}(|D@&Xjdl!yo܏ʽ,9>:8F9vHԏJTި>Lvbe '׋xp|wqM>su/\Uyu, kp.K&My(")89'O{BvB)>Vt4iyIͻM @~zMr&:)J/O,Fs%ju'8!f 6!jb[фk|lOKԶC..XrU#{^C?@@keTyY$y͸:1uyd>,鯂:endstream endobj 255 0 obj << /Filter /FlateDecode /Length 196 >> stream x]1 EwN BKĒ.ZUm/@D !!MUuHoc|:isKy@`]d0@ZN7C4.:>_(ghݛba@a3z`,7+NU!J"κ cA-B?cH٢9֧fK BkK\b(c endstream endobj 256 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 912 >> stream x-[h#egn:W!5kv]W*U0"NLNM̴ɥ4i4tWE V|P*M2uqZ|8c]K'39\뒞Rm hT^Z|C]^. =3fgCC./ +kh+NuP β/|+p3/>k'ߣ3M.|JS)9=S,Ő#1qYJN( v:va4aچ<fZ؇zX7Vž?ºU)tKhKl( T:؄OŤP|R~ܼm5`('ѻq<x)6oy!w>nzAa D PߒFm,>~YiJMfMe6j:W[ǭ饿tPݭͻdV'O[. FYAO\^ܭxXa@P/~=&NZ<`qk D%M-QDP&`'[0W>/|*\ 5:ߩ(;ڿSnkb.5,$  O&4~~Ɉ)5Nr<1 \̄}{6d?O̖FwN~T/*J؎7& ?%6ObTK\Ƥ\}xccڒJzu!/`)k QK|.L( v("5}6J$\ы%Pn>‹F-:bM_ })9ubU٨,n8s.joXCx7"fJ֨6گ5ղsaa]QQ hendstream endobj 257 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1588 >> stream xM}PSgo!hDUQoXU"::iWqЊemb$\LYY> (&|E-Z Ri2t-ʮn;tl;{9=QJ$*b"a]+  2q:v9/CR<B"t:kkuffET\\VEtddbAcԫUDY1"CqW5泊:9kWDb WLQ{VEo)4&&M4+ <[ YfQȧiEo3nLKBPTdnjZA-GT% ҋt'=*^%!xL c0/J ^ ̍1*k yw()eE|E$WMB+d};Z싓!o 8G>Qǀc@ї%5i&e$]HW<bV! 7m\=m]uOd?'78Z ;NN>@^2gM;Ue@E 4p pp¨}ߔ +q-9Crtp%gp9xNBNל<Ѓn -t?U5VIԐ_u-wT/1zvJuUcUC?SrJn"{v8CjgpW-f.5ӈ?v@3O6 D)רop g* 6'(MD x~/urJZɐtoN7Scq}|k_ʚ=;?<=1ݫ q;:f{U~=-7YRFj~}y% F%/UOp#t,#IPI>]Q Y6 k78'kO gnST@ǐWI"Nϋ${B$cDdO)DT@BN֠,w&6=.gjA^~Xd-j M-99P”jfpwoH')`q~{"t+ ~!"M f\6AVؘw{K/rWtoIwJ+'‚BpF[܂3.%DU--Z-ǺeAJl^[-endstream endobj 258 0 obj << /Filter /FlateDecode /Length 184 >> stream x]O c^> stream xUTmpdBmQbMI!I IH`SHHEmHgaٲlXIeF6:CKp w>jS2 Ph`I! 3|ÞGӓMZ޻2,eٜ5_TV1aE>K,Tc>7Dz!W|K ŵ '|y#cgb~ˌ3Ǚ02oY dYkݒ-Kuez%u/Y-zzPc3 S`b.ݒU5PSˌuev%fP{8,fZ{{Xgl^(XvQ`tXkoiR9f},zւ4wXaf7ۜ F^Xhΰ#+{' ;E~!0al1 v]d &RYGeG짳b ?-~hW]ÊP5H,NZR`D{ Cܝ BpK{zR7 quh T5vAc!FF)Ii'_Ȱ#hzoa஫xjLdF f d_ꃤ6e# #q A?@vSm"33`T? BrH,M(6\I!WOwO0 AB?DCn.|q3O^-WeϠ?siW**|Kxξ~Hhh?Gj"Vw.}N$~G齥`wڃ5S2TyZʥdW`7k_h>\>|͍<#'5_U+KW=f8gj\LD=EWLL\#pmm ۭ/t$=Ht{LG$K2bJ*V\U]2QG1<Ѽrt3V<4]I MUTb |Gx0! ~-nQ٣T ^yCWޑm5gۨ8JGл8З ?Uk<8Ŏo|`97<<͓I%@( `;HC7^tChq{vˣr7R9S7?Gw])~wͦc3XjIWQ=xT~nhwFޝ8^bJMx)DYiVҺVWQE9X7$ Snde1Ve8pmqW6vN+<;ڻ5!#n=*y2|0i)]rs'a g叫endstream endobj 260 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 671 >> stream xmHq;첹,-!2Q9B(ktttssOj&Ieww=!Dt"ݛ/7 I  Uj{R(xΚkd .犏<~SIa`SFhkhlJ,_M{„ndn S@P3t_P9aL.8±4/MS_$*lZgɁDzye}Qp,pՅ7;:8璉@8Sx~2dDQ}|} .i줓e,r{Skt "z_DեظQ(s̺x  -߈wz"HthAGzݽ- _{}!skX$[^t}}+ u{#Jy#\'l"Q< E\X8?1ۧ2>u }fD> stream xcd`ab`dddu 21T~H3a!O=nn?G ~(Ș[_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\"s JKR|SR Ab :MӶosJ?DWvtgɹxf.樊öL%:s"?> OQɮ=m<ȴ~纶w˾1x=T4ѷռw=W_9[fVݲp~NGWxs'P> stream xɮqハA̗v7{a`ѕS;")6 '1bzJV-vtT!9a\2L' \䜶Fyf()KeX.R:CG)}ٟ!f(=4+eꖔ^ %Rc|`*뷵{ ,k6o%ؼqZdaD26m )IPdU}MM&>Ư̏lSLɼdF$P(T 9ѬH9bɄ9'VJN CuP?=|鄄߃`@)d6vO$kuԞYI8HЯl"U ^*8DsP^2W@c:I ?OQcYsH!rCq-R\qe:zPE|4? 7*OT Q t-M}"Ӯ-/m ֌H#jqw딭5C k7i1hdձzfJzl4IĖ?3y%`ؒ`a7 H(";&2&`C‰K(/,BXSR+jDү/ (zQ14)G&|%% #B}GTˡI, dBhc-SUK|QLՆ (\(@੘- `;cgh#r-AK2:k ARz& NR)1EoHe4g ^7 i-:טnW[?zIh0 P Z C[J0<82> *sklctַPEdX4$P%A.ţ9xs7?>w fj7"۹>wHpMGW,lKM!oD8ݠI@ {O/Ϻt\זU&w?hP[XuU51IɑQ j=6v_ 8kuvDg<]\o8<-#'h1qvzRy >67udz;<g8CA}hf6IBw& cCe%'N g5*Bk ǵ=R +\ޏPC|3dѩ4(t*G(,ڽ; PMf.C?/Rxt4dgz +N~Udpy P7Q]1V.gf|uTDK|D=rO\0jg..{'$Lao3M敹wSǮO#%#UBQZ5U`CgK_H-.=>IϺŜ}~ҭGve?6.>~Ne?E\*(3H32EG*qDe?i`h c6,.#31Y Ӓx8Lf82C aWYǰg م?aל?^ (mo ߭ntendstream endobj 263 0 obj << /Filter /FlateDecode /Length 3910 >> stream xrUCns";TtIJd$c^g!D:4߾EEOo=g?p.`% I _\ei-RBJf۳]+ۮ\]q\Q;M}]l.)mq3dzYb>[1)SbEXX`wswYƒL,.b-7M^>+6r GDr1l̓umۼkʇՇ%IGqu4&ʺk r_s(I&e_nXF/uUT]{hXRahNf*@)Mw;`l5a|ӛ`aúlI}ROP+ˑҔKyXMTMh Lzc[R+OB#O3W\-SDLnwE;փu㽝x/:[2`$fc}K* 2tsK{psqP;0A7&ZrDPDNXDNTpë `I;ܔyq`~pm`2#Npp6+P02kw ;%p@/ŀ*bj:Jom8#3ɗQW'T0F#;8~UP֭|O%GwSBpHfAXnY^`#d{ yۿz\LO dSBr`9Ry3#eI^Q q cHgKA1s5 ӯ\zj ߗ]} r mA|Ed=&Axw]zl 8m1"޳;D_^teDH#,AJ._r rAх0/6jn EkH1c(4|l*H}ƢO(Iꂑ1'q0 ׁq|,4f2xQ) QxD"D$(YRY# azWOBPE'1ZdBKkI.XXXhN'< fxdh]|r W*_ 'C3LO\ F !.! ?<6~5Yhm=AIFUuTӚ4e^@\2r V%H`v1{1LTйCϫ&$ ?5dރD3 tI Ě %G)õa1KE6X I)c2ɷsiu}&V$*~S=62_GAر!%Ll!.5h"nAcփAbСڀ'C@xS hRv^2j|f'}S u^H߫,v6d }eZKFNN݉[FX!?f0C)pfm$1F(J#FfPG'6D= VB"'z'% MOs/iDcoz~0q܉<]^J&`%Bl H%PӜGM|DL2JL /{",cԢ{Vc=H"\}+:R+!죜ǘ l_?FВnc#hzüR6b f;ݧTPT$հDBI9q$Jn}eqHc.3ŸGĤD=ľ1燑1 ~A@ q4Ogzl'?=Ќ=A鉵/1 "6ob*sU>/sHrE$Is<γ<ElNe]e݇#K 3Hb<<0/v\;xgc}y}q֡?eoΨ䠙tAt=cD0)Ed+ q:9Dz,ǻ0?g0d 鱟QZ#uk1B]4'TG{'TzvI:IQH ~EJLM,l…m\}ob{{OhJQ[^31F=3{\M/Uԁ#v"JDDS,?mLQĞS'?ܕ])Voh@.0Ys+-js$B+sӶUIdloE,^uU|aggeƒ/32 5: ۺ)mӻn(}or5hCMtSA-svjT7A尶jGyM:sXp1Sr.Yf7&iuUE/aq ףU/~(;8/2l;8J$hCAu v^ULL/v?sL$]^&nˮt5^6nڥvjʶlW `0A++SA `yb/Mj0|o U;+7c0?=H Q^8CM Uw*O&7찤Ep R8ԧ4-rןcp+(7i~]9|z: fڱkuQx+e*>UU|UmQ nN㟣5 4h@~B4~U$a㽖>+ k0( YO6g#"/g^!Mщ G+WU k)Ky= :j_JŖ6p?6AzS|~ӕMY\#Ur۰B%D!ʹ׽f( -&tlARkz(vŦWI/΅kG'/q0N8#@|{o ? Бν9@ߪpXמSnKEW= ~$?2ywg֊pEendstream endobj 264 0 obj << /Filter /FlateDecode /Length 4668 >> stream x\Iȕn1>`>:́rhF`wv%)13-Y$UY^l 2lwU۾c_e)Ye{{_꾿VW﯈~m^R%X]]d)b% ISUBw0لMf?ʩH3©7ɛz[nV(XMoxT(X*0 U_7N%6U3[~Jɱ dhǻ;5p>%unƵ/07@_@ݱuۤM.$L,q3~ v<'?_]f$ C37z쮿(4՚xt<_%vv ֟1ԇ C}pYfDz,uπF~HsV wWɻΨDy*Ir ]?kȀվsT߃vC(6Tm ^u84:Z's1g$\%vO8c_d& ɾns<``Z12ɒ{@g;oO8@^}\5سӸ j;5G o<"OMs?*}Ֆ]=~}IpVwUWPCAD)NJ~!*$3[ XbHWʜGm⇇!yn~9;_ *@)ɢj'q;hWc\>: G+u6ХW#\֦?;vU菷Zb)B,yC>܉O+2k'=u8VF%I://k?tpGLj x!,' łM`!Lbhƕi&KD6)m0x::ҪAwNMꎡ5I{WaBcj eoX`ғ:6@#gٰS~R_Ts"ПN\=rBk؁ۃ^%I һ$>}*L10Y8`á~#n_LIE׈wkATɸ?^T B埢y Z gu:9/Țw &Y@Ν+EJ/^ ̖& 08ty(/$cIJ,ĉzgSf`dP ZNf4󾌹VjgXԵj!ɹ ]@J*u|$+ bsRhy D y],6O0k9p|D -qDpF)_G=-קoГs]@$y]-{dVx~ W+hY)!"'RJGT")Wp'\ /7e)#LsA*x X9F-.'%_@ v݉cBYDk܂(_U| Znf"d5 EBF_&>GlO$0"D  q&7P3G2zuG ׊sj-x.P?yw?jv+"M@. c=`sܜ,QwA\t +2bbA`<%52"}Kgw 4Br*{;H]oD݁!D_Ž]yq.,Ϝ_Hb87&/~ڛKͮ!/]oLd'N1frzK06^SĜ#5'%_Et.19fT0Sh0[JN@oY>]5wm١9P{S,:y%P5XX,\TizD*-בeL1LX}4m uG<;Lm ˶$5`ORD;+ fMxv]UM?'2Q2z"02o&ezMZQRepJ9I0޻W;Du @Y|.22^YpR=Nؔp Q&6e&5^r X¯i,UpC}۲k@Z^Q2.f &ٖiưw:ۇjg ~ jjBcF4on*Amp!B"#ȇRaT3,!Y>pƨOy>%+`r0>IXF4UlM#͍/J 1}psģWo((̄.2oNS%;q@P6 P`Tv7L/s%|?4xn\US:yTX%~Qohu(+. u3I>B%  ^26<|3|bN~9<p/, >RTdyK>FE,T%"5;!A5;C2 _G3,Hr$ |Vr@/?;KPN7oyl^TQF6?SrV>=XgI?F. ]Z|.瘕D)7fibo_ %thmN<XyL 6f"K|X>;g"Ow0',ωMg _Qr, gvl; K$ <qlO}}s<(`d'iΉ Q ,Dֶ@雅@.|{!" b%_oTR1/ahX[##9,8!o..K]Ev$37p/u6ozk//JB3g PzLm@mz;]^vGL2!fsvl;@}|b}Cg3_%Zuu9ev6iBZ)Ӵmn2ܼxQMrj?B!QS )hs~g||צ،e3ֈ03kXv-,H eBAj!F4m0E } ^+|iƿyзmySa hɛr[mLJ y'SK}AP(|VC?P i*Z(x !֌iFIs !L.JgnF8YRlbv-NyLlbbY*mB2խG\U/zVN-"K?BWo_-jʾZ(IJpAaư+%ŏHtRotAxNY b7hY]x4W+rT>5~ fO} I{ojHJLIVwғzo^?n}Z{?.Yn 3mz]NfɫjޢRjz*, 4mw(`UPt4:|Z$*+EoM$܏Cߩ:a7~wk2n,_]l7ɉ?bpG}G^;t|/W/endstream endobj 265 0 obj << /Filter /FlateDecode /Length 3895 >> stream x[K#^87 0[ZɊiI/6 b0Cgm=f%M6!"d֬'AdX>VKj3wz~wu?V`sKbj~u;%)). j)%fv]=7cb`ov70-Nɒʒ JW?Ζ\:|dnfſES"ǻWpmv]-6c` &@dJjTv VE R"% Ѭn/\F41[JhSqb`rD s DԆGmDqMm,شU[,)i*IEAsY+xVi_GEL~_uŒz(GQt*ʃRg|IaZ)[i5V#`ךw "MYyq/=#~5g{$5^J Tv vR9[)o_OdY4z{hv.lZ޹N,V^val8W,cm*DA46Zڀ1dq څ5 ]JmH #Ybx/>RҲKDBmJx)nj4.(m Au}s<\B7!8t^mo “S;[Fd czA:D)j7*vӼ,_4UP^ssTჹk^)8LAB擜XىYC-LEƖMnbi_-%OuhRm2_JuZ% B) R(@4ftjK.503`Oc8.G<:p%,jx +\w{Twm\n-ui=ŝW )T+]2ɒ %9mQs5Hò o}|TpS`y-Os d}|l<ԽˬK'2C'S ƟM-c˗::}j=@ئӈ1(N]`!#ƨQBH?!S2O Dd,!pcxi+OlDOQMbCQdSynҡ/WoY9zD9x%73u6zf]I 0%A/8d<U- T؄\+BvyA+[|&d18+!wqL:u0EiBqYbb,^p$y%hyi!v u]UgN~ċl$ŅJtyXJ^gTi yU3i4" #.vA>좜B"]$buPUq%9H_Lٌ*ɳٿ_dcc8iOXk9+fJV!IRfh}Gjk iɕA-n 4-џewIY3V?aX@-@L&~e9U"$DY/d81+14axVqڑ>d $d<KS>io)Cޏpa_zwzU}-r>V ^C_V$a*xU?wJtvy~_¼վz_bxQl@1iNΡ:8Z"\\u5 [F>X뒪rVb-F}ҥ8dKH5FΗD[TC^Byzq>ZHˎF[."q'Mg\?{j Y`L D"bI>TdlY9l=K3A-;blT?6n_ hҢ?^"Lsif[ܛ:sZT.g+\9] j/BSJkڐ݇b@h3=yϷ8뺸r|+3OI cbw % ;'7Wۓ\iv.&>a10Nh;v"lj<7~Rf!NqXW2رaEUi%uF/x|iW$MRz6[!"(ӌKHlId f P$vxDmRhh:4juy蹻^[tÝԧzl v i՗^iۗWzRtw@fUKDdg`s1g\lw.bs20Ihaa 1Hcuh=ԉͪC6&a îOr~qgg\5Q,i?@O^mE /jjufB1#:+>P=fP/2R=.,&HxZM28k8 Dsx8iyRNĤH0^5owݶ]4fh8W:JgMFt .y X[}${9oJR/HXWCw#<7Ky܅}h'2 _ԈFy[jSVd8_5v)u oTB-CWژ{oղT[O݆Pl'.IJNg3_dpm!g#Y/J`#N9CZŹR]Kt \w'qm}5# +﹧[;zl2> %]x8䦁4K,\\M/&ZSs! J[Egnvs@G!!5YԖ4 ~pK.&O؉n [|O4`4OCjBHշ<>`,-6j "O?U>e5 VKNC>8o{|grz8fuH&WZėC ~ֿ[`_dE COwvz}srŢPp]-$ԻW?y@ f^\A {lc.|\oNoV tvB$CSNx| og(endstream endobj 266 0 obj << /Filter /FlateDecode /Length 3618 >> stream x[Kv97暔sJa,No."?WJV΁In$lZ[:,яn?MM+.<3ӗI5}9ig~q+zzbd0*SX^l'㳋z̫QuYq?zY<߿^rqgs.a+zs⟃VڊR_l-63ד8&'6f8a VdFL̕+8Let-LFo)Td2,@97t+KSJAW9++0S]:#lk]qG)޳|ܧnK8,bIS2'PΒA`3ƭN)Te`y>bF&K'9kF˻Y4n@ziI@&[YxJ1sL+&As zQ"w!eHi؉qp'0\\̓ެC RWX֔”+Ubׄ2@pƺwd5kdtXB2^,vה\RV5Ytˀ!4vCL±VZF ٸٜi[<,ߙEvfg8t) V A^z[![4y3t[^R` ^qAXYZt(xNz?-NVLMFJN7%&4(e ڜCuJ yXbAcxiG )9OV~;GNrK2^ l:aDP/؄[G|DLIVRHY5b)tʉJءj"[P: [z4 JNAyq<CY(v.ڻE 7h!R@tV07×ybx%UFы'>z(IP3 ]WE ]RUט:Y۟^X֋ݲR{`-`W3qP7/]|'lUf?\mLB>fbYub^޿\:h+ӊ[{Tc;?d" r, 8@M$Q* 0iStVdZo6x"9Ydx͢ xz1Tگk{f#-";z·ۛM= JZTƹv2i2~OUd&GFU@e U%pP7:R U0sW/-仝(O]do)gLgIl8H6MbKPzעz ؼkx}.8'1po%|o ^:ƇY JF/@Yę6SV$"ګÖ7$/ Q zƱUx&5Ů^# :sorp#Rި5._CB o`SǛ?nߘhd3orL(tѮ%|?Η vLe_/%׫u<43OuIۡF(q]xQ4  )Uى f5!uN{$Êp}T@9șp6m3\@Ybm0WhqKW.RBEB$~qX,O21CIREAޝZf>ιDG L<*6ԱF羪+@׋qiPE҇Hئ](سe}S` ԔQE .4;.8.&:&Nv8Q(ֿtZA݋uǔڣ0X\X0ZPVknPԧB\n<8xd-VZ'YrJWLC2Ӎ4nPkfy '%ihU-[ZzZ_ t q-PqƝ m|O=t8\B|3jvgԭ$w{F{"mnrqnj4U#^l~M]hcaJ)x6ċ{:@7cܾx}[Ri~@nL#_mg]$`y pٽ6Q kq'<?~Q/1;h*Պ`0-1~Єcj=v6vH7{zd÷z,ou]Aq3 ِ\{c8;xcz[Թnugb|r2endstream endobj 267 0 obj << /Filter /FlateDecode /Length 3373 >> stream xZrv 'a xcIUS(إ(=M,8 Ht Att_wUY3Uɸ)BJbsvYn.Y _5tY\LT$tXANL>[PYo'X"i#>Jqdi(!KRig Rr DIUJUl]oݰm B~ Ċws~ƋTX5/vPŦƅ]tuXDtżE^QA ]rI4nmv3^Q䤢3VJ"'ʭ2AĨd= ?99 ~r╺,{Ȣ^ö>u) +2Q%3Z8zK%T>.ڀ?8xPeTOQC?aa)}JN @U>wxqWX-)&@hk4[m߅+\P ;Sc݇p.։ RCc7YJiV o?!fOɅ#AQTq뷛zlŦ}?)N"XC+@p'ԭuq/2/q^{jZnMghqJeXNWm=U۹t! +sw!Zspɥ:*See5h,`Z Dn3R`p:ٔ.iADb|{q#lu%Ɵ8A!LUJ3ۜ1Nٛ!b%KKA*.\%GdMT`SXPtFt1hI 93_ .8ijc>VwdjQi= (*dSjCeCpk|< xez*NeYTkDn0:Zہ;D.VjHvw=]љjXۦԪӫftYfۍ4ǻk~ jd"RC|7=aІMSi $cIyvEc OfPbY$x IH&Pat2IpDg)KB8)zRQĩPiw$/@KKoⲸmFI!^,s+Ȉm/}:C?&0VlOݪގCkcӐF"Yk`?a}Dpd|FɐIVB\\qA<^v$"8j"];sQ)8e 4) BIk2y?O Y ׬1)?4}֌325XBZF$H-WW!5Dd_bBC&)c>fBa8|zLBlqdXR!!n:bšJ<9 MVliC}jYhT[q_"H( {&RvRN,h*kթtW}'ryKNY=V(O]+$$) WPIX, 6<GZq<[gH7SbP $$l* xBMA?h:;{.` i "wŐ$2Yx zESvUʙŦ$?%B/sfyK3 'δ 3<+Ş#/Dq)Q3R.{ptI|cX OҢn\j=~vg|U`I+I/njXJ ʙu1w-ĊwwqtO["-$"j§z;@q4t w tHkq)v]$G}DYN)3)kcͥk|8T#<R AD~js@5uM2{H[M,kL1Xm|5N_ڼ93ӱڴ`6þah 뷶O( 9uld,Vzw90!\Ze&a,| eY&`5TO:Wі+3N_L?αxl,! SqWZrJ(E p(\xZ]vv@jnϧ7D6vжxl0Sm_C)Ɵ׍Ny*m]$qGp;/<6M⩰~x"+CO/\YWn / 7?u.)s8\'MSy&Mup,C$ކWGV[T 6@_L8|=|`e|bf2ͤ$%,j!:LScaY%x4vdzJ'k\#]k׍H>5^@%5;|qrHyb+G | C$!*ҘLcOc5~@К ?R3:}N)K/F5&WBUv*Wx˽gB(w;vȜ&6 }{-: d,@ XؚOh"Q hwߝgivM~ HmŖuwK-x u9)+:]?$"a1Ou& /Dnvƈ~&a z֮9e@H:pՄ% "1龚c^bp# [ݾzܭr$TuNw3HGP3Q)&Ͽ >@ -iӞKP/z:RE=7M38bԼ*2'P( DhG Bsɩ>r{!SJF3BN:÷HWfn(lFm#DŽ8l[$4C*lៈk 6c:_Tz _ r_@Lfw7n gjvnFKK?đC Ǟ~PūjQ OG렱BNN/W<-hx@nendstream endobj 268 0 obj << /Filter /FlateDecode /Length 2344 >> stream xXm۶IW7909@`ZwjN44>MיPNb#2I?$x!;@`gx?)[5߶x18?rr Lr9_F41+ƨ|YK`g6,b?ؚpIc.[ߑ+ڮXD -țzcmga "RIm)bAj srlv|UG,aB>Į' 8'M"q2Oi҄EGKGˁ9}ڛ8KH5yulEn.b1ɛ۽3TuwE]5)Z7F+c6fC demjcm Ҕ͗?̖_#-ll` (_G:VLmyZ T@ra}>/{Ӻ IGI%ۘ͌\|}@D(Os)LRbYY.wBdn+ATm/#LX0NI,9ᰪm *Vy6vTc$-( F'=|A ۪a!c$0d5BJH*|C{؄\ǽ <Z!}˫--{$v6A*ܲZ%rR)D9I^-"M&;v᪕C$ |P{Kbo\AQmdAjP fݚy|=T.!qz=}]gU!1Ƃk7r1*6N 5XDI6x쳒il"EJ&Cx2犊L(t%YgANH+&J wE _'<7%sk!{k֝#ᭈ >sa֙__\EӁq㶧M|b2#{9 ~gy6 C\$KkX6fI|bhlؙ401aì5;k -3N(ѡ@0j,hڡ"ngx@8tAc$1'J!'k? kO,(u;3 49Ӕ噭lP{=J vWwacXXe3<\qʣ+ ۘ|Av9d')_>b]G*I15ztFeAN3GȇxL%hj$ލB-{F7 L J(i1Qfdʐ RǮzU)lRQkbjL~ D,z4;6UQYz]]o+{u&} hcןnC > w`v__Dcw썟o+'zՔ6! }۰%cU,ʼv(z9iS my%O<@ċTυ9cuo=+[ڟ K^S*vǾ5`"W: ~;VrU P.q7rML=Bi \8߸+ag0>Di,gsD$si'>?=O%de_ LϰTd#$UԂUpץ H ޺Wy늣cY%tS9Eo#˴X2)bL&>)_}1BA(.3BfTOLN#Cjtr; /CDzDp\_;VZ w+w<^ b%+oH/%dd$-62m7$9tZU$PV'ncF>MBcBzZCoکJ )B)[(M3.3A[w^hSYF ?Ɨ#lp5},3 &R(nAhZr)u(pIEe+Ȟ/tFrAlm>I[k\R..>P cL>V8<%,{I^ k:fjendstream endobj 269 0 obj << /Filter /FlateDecode /Length 2073 >> stream xXr6ʣbR)ʄ 7Ͳ.WRv@7CrBr҇3R9=.".U폢џG^` u*ܿWqȄҋU}-]UY f2 9lf>Y,K"Ʌ<0Ds QPf ְ_AHزÝ邘> l$\]rE}e2c5[ 2V"[ [.+hJ?+Ym5_=ڙlG)kڮ.6vj$b֗ƸavwR$i c5n;ܩ2^7vF7!ToƋDDآBNE4u²< 3ٳJ<4Rrmn:cЮPO@b{Gk1r(> [G+hY+`*Pt eFS5$}( J) Tx07 inmYQ)4eGŭٌ'&plU7R3(1P}C9;7m2{D"д$f@ 7Uq"',j4YWq%~*kG='Q94!mU-AjO8BKʫi>^ nz mv])/Ei¡ 5`ITjS@b,@ґ_ EFWVR}?i-ⴌP \$yN#ŀfi-96Duw0v(Z+C7L)@z0~&ΤKY fPO% QbyB)m;ۦ/9f`Z[Ә5 Ժ~×=TQ>V+e鲯V΃d~pKj67QI4iezlKh$+Ö{IΒ/a-@UJbjHEww##GI%"()24VLD=#mt]u!wv/\ƀ"oE!_X>^V,srg@Q<8\wʝ q:ew ӊF-.?XDPc`k5Y@rlne1E753cFV44mMe ߓb(+tmdj#nj'<3˷wؠF[]|[.^3]e> stream xYrܸqbN)0a`/[Z+JddS(CkccGyo g$Jk4_&1]&o7/x"Y//(~\ ,bjy)Ib.RS+nPm }aI[Sqt?ɺ>슶+˷ъ `8yFڼyVjPexBE*B.AX,-h%AJʋϢdi[K9aQ%Z}}%}ZQ27H/ 3qf994]zWEOͫ7ZL`5 GsDL pW10$x"bMJŝ.2n3D+N~qfz]΂Ӭ$\7"+TI\ }r`L,x% s` 6]niIS!`H"<Ӗ;Vֆ)LM?=Y}>*MtQƔQ3r>pLb%DpΌ]dS;-xb? v4i8U FٮL]D2lg w1:bڄ?K'<=@ThrYֻQWk@} y'@]@re=de}ȷE Hw Մ lb>"kY9Rċ]˛ pg9'EX=Da5 !Ä !dBjE(Pk42ѷhHr]7W̱˰yK"ǘZh*A(Ƒ;b!Y7.^}~?Ki | ŸDihH%?MU˲IqQqݯ<{I( Jdx0L_w6t/ zgk#O[ewi}@YBuK=8F-ƜzlmW_illױ@oi[nDPdn-O\%'{I'$㇤&چ ר\AK6~ hm\I.] \KtKa"Mlp|İ7+}NUcY>?¹=#Kr b kMC{#'as﬏w-OM5IXcك`? X_s_\!*PGJ|Z3JX|n+. ou2boAgC}; ]UӘm#0"+!M89O[cɃzײYhh}XW# æ-CP8@s3]:6(0oj"k:N…Z t SJS dﮓ)*cU=v>B3\TO^3B/a; W66iI%|a*2o 6I5Ku]S&/W+> stream xV[s4~ϯ0)3(FX$ ,]fvy:J*%l;Grc:tdZ9rxk^N\z;1nBK^!xkK8o?k/[Kr!yN%A+sa]v*0 `,grOr̓Z]r_0aI]j|0 #\mk+IzE6SkpHOWWl6|[o Í`wVvmJ?27BCģҢk*h<oz?|:_h>UIAhݫ闃(6/`CxQX/nyzm:䂎y@u;:^֍9ҼY|b~"ߋF f`#>(k0R,1HaϨU5{.ni9XĨ<$/q3f?&% P${ ( E/2tl-ȕsT!Xj2LȡBK^ =HaO ;!>Xiڻ]m7slŞ岡.xD-&$(qyHq},xyV;UIVnxͮםnz qc$ Z5?jO=)3 DB`lKhC6%UlǴ~rz̮qn6 έBhO2[[xq'"8\-]m]^HFGmy%+/҆ a%+Ⱥɦ= h`lSv0ʏU>҆*gos&>6ܓ niCK5u~Io`bpQ3:7BҠ 02wU-9>/ h2@T3idmD#&d4r57dqOHpNʼhІgVBY ?X Vk F/tU碖MSp%SG%ȍs~Ùӂ%bNkVٰ5S-sw2?o I)OnUI|O^33endstream endobj 272 0 obj << /Filter /FlateDecode /Length 1345 >> stream xVY6~ׯS]m!gb >(2mzCRuiJ"39&~g^z?}}G^/V )N#g 0#C$X8~pdr4Ct7FfU.vB4G|R0?JȪ0>^w5.kt/ LQYoDqec4:N9W=8 ߩ7$hn{^W*n#~5BL٣; n|ȪM]ب69 JUM}30mUʺr,wB:uAQf!:jӟ_CK[efpYiOġV@5Y)ZѨTg>"SEusl݁eb[҄L^K[ĉBD| ]vò}[@IQ|=_ͱ5  =a"7HDɓT+2' V|w/f٢3bL^y=?@D> p+O$GWYc3IL ڡp,Ѷ/2 ԌBr80\{4'0hAfHЮHHI譭+=4 #cT$T4 1#fAy00Pwcě;ENB:GiHmsXq7Eub$Tw6xdLpC]@(bii摩R,sOyM1Ē&?]NtN$O+՝ru/muc i ;i9RF)̝.:OϱqHvع҆COzȄƓ_YCmq7:hϒF8JǏ*ۉ6 -I *A_}^8sҰjJnWP$c~ׅ}#}a')78RCQmB+J NĹzkφdcmd*v!`hM@.s|+_n?x ?endstream endobj 273 0 obj << /Filter /FlateDecode /Length 2832 >> stream xZKsN|==ʳ6wyĥCl'N\6rRp$4Ms;tcKFՓQ-}2ڀ;d{Xn˝:TfM2\:/x mpBck%ppK^_tڵ~MH8((n& wӪmPu۔53ͰN {jv4zۨם+b ea*)62"EۦJڋsҔj\#}L(Bx'9RB·s,zU"I>"qg=oj>YKf{!KbFHl[Ds*FhsbqoH\x AK νa&MFa8Tdia^tVqFF9݌$ )V̘h9ɂϽo74t+ 60ƆpI9nɋT#a:r-4UӣF:cs"w6W eyf}|<фo1w~]c-8;K }WXYT!pC;sեu`dt %Vxa)ʹK\f,G}B1gg܆@CXzUOfWgsV*`t} *s S%M:wrC@M9n%a?iѺ#`} )0rzE2l9p>5dx TϾj_77P.KoAjrC+]Sy23x"O8 ncل' ыt<2'Ƹ|]9RЙrL|Eq kxCJ^} fҘKR@c֘KGpt<1L?`y6YB8L[I6w7*4?Îaf-悵B h6<@5O1´kqK@Ȱ-͎ Fa9F~~3ؔ uZJZ~S O]EsfPZyƌkC*#O_dȠ8װ|?=PX~-}Ԥm lj/Oæsō`u@3jQp.>jYb)(&9Pyk3/!ؼoJ̕g@dRG})G!FPhqsrK/ ɴ5o %yicCH]5J.aIS:IXV@͞/S 5eA9g!73jTjR:r Vf#PkBR^Xe [:8rsf3*|G V}<ze2WZ!R>9{ gapnϏRW8q& L5tJFx Dxⷙ-Zb*+-`ˤPF@SE\εM43= EM\3s"8vV*.9=J}9/{4v'N;`d e=SaP ^=7_ՏO" ,3 ,C. p*idtT#37+EBBjǕZQ/gfuB9)\ccc 1 jJ܄[B 燪rgƓ%d?0XL.'&]OжvPnăOÞƶJ:g<|nUH_vac;B77a8P̆ ;+ڮu'9M<ϐ9/¢O_27 u%o!ȱix3P C+3x% .y)Ȧ`0AK6@UZ#o4||ۓm$נ#V)lp#"#ݯzǜۀb YX9k?{+*>cy#-}44$/*7Xc/xwmAF﫦C^pkdZ> stream x[I|AnD.i&N^eCN$;023EiǒHoWK/dq#YY]ޫ|owd?~m&wjrw?N?WX[W:"Ȱ*X\/ ^M pYUJ%KaG^5S&K*r\YƊn9/$E8=VhO%Rj ޹(:bR97N)_,.TB"(V%4YV\/Knl*W<JRtL+& 眑?%GKPҕ\WޟdW%b>^*xbQti1`zyȒ1Yiì8 r)#={28oCY' e;&iF*-̌|}J m Kl/(h#·5D;tnzH"f>Už&qƲ+zƿ?8>\Ls-XUN澵mv9 w嶨dk^77*_:&fޥnz_6}fn:;ɨ-a ägU/O@ïAb [ K3bNƹe]oҍ.8/^w#‰u\wyQO!Y*^N9 OCuGv65=* /:qemg+ѡ׃em%(i,MQ4.1Y*Sլ]n̋C;L?.tf`EVټ%Iokou^~ơ6}r7m|2M su_E mSm@z LHK7:ZmXq7Ӎ{fId)S^Թ:gp6dх֑.pSj]z313spz`vj=H Ud1zubYFnERwEgG0n8EۤhUq(Q')E[6g$Lfn^ M@zjP0[moPvz1E˜%S:xav\tZǾ`?vT 2bAkS2fkE*H7B=F !-@8ֱp\?κE#9Z@=AeuLK!=*=yMa[4syIMfXF7y$TܝiG-`znހߥk4=]J )%]ņ~a)y(l5ď/!W)䕒" EOE,>]{êy.Od6].xMvFM.у]r5P.3?ArS/aJwo]]Sdthp~TDH7CUJt\{[v1 ٥n(Zz01#tˀS, AsN`s,?)`)1 W+McQFEhUvYt<:Nb::d|Ȧ7 @_$1"Q/G+թfEuAIZw7Ϥ2}~X[ZC)l' LT֊ɛ~1[`L^}όC&%=[|bs0f ?ݷmF01]MǓ ՔH:n w +\I )P!d2 +W/=ڈ#l»=h4~( 6Nᾊ3j pE @vqf_<8?]b'2%eG>)NHr9өϒG8CFp!j::={} B&zqr º*T?lPՏ3Kbo5>KUE% \ qC 1Ge<1],c;StbT"12AMR$_*UP`ʼn c&teWgiM(Ϊ",4ƬO> 1w]w S2؎/B#qK{1qBgJ-yQe܈ϨH}jgX\eseedeX,I'OncR-)8!NSUt":zyK{, :xp@Xױ`vCot4ZTuyxwxc3&Σ L߀ 7m_0H*0t%݂.xmY>ʙCX?&z{tFLU ]ю%`IOGͧ8M&uL &/ޢ%V}(\ImP >Ly{B`25Qa!fuqOuQ6_<XŦ٭b??~W5 Y8 ~Evj僿@}Msl7adz'E7)W+E0l/4ܱH> stream x[r#G?77}aT%f0`}iOFy48Z 1 *X:K1\^| EIn PZ"du!@0Oey# SsoLRTI Q0r]y> V ǡJRq`ak} (}nKqĒsN\E3;ptnx+0U&+31rmI-}Qq XRTH8Nźm˟/W>l;u$i߷۷]K3Dem?.JZ XplONWb7C+X$~Qjtۺ}\ሾ%ӄaMAٖ\C[ * 32'&H[#&UC6L$j@4Ahf\bQTRZ?ri`B1eNLFT7kԻ3 '-nvsOMYJ@tWwP`-j?QCX2q +v8E7KJo=P-v3ow0ݾ]sSnV==>ծ.ޫN6wOo }-<.zxf)vApMZòuF%ܗj7o雮mjE=AֳH[չ<8a7O %3:էۍ k`g0-9h FӃ!2GyU꾈ZԌTέJ1O|ƌ TDnvV#=D̹EШVV,T2}D .6Ö3)ӑ.t}oW+0}Bp}:`o:'o۞3$]Oqvn n3e0b5k%'EFHw38Sy:0PPZD mf/KFaI?)LEFYC"c~,{5HF*cS\ f^ ^;4X9U,<+l zQefz5GhLz*tDzthCG:$J#e'/RS |OR{㻼wISh~M)Эau#M{|8$;c@k|LYob=qw;Qd5QpG$Mįl$w3VML#XGu9{,DЯ]me GH&GrqQ926^M8Q V@yb"bL֎'_nWhCj!0)XޒZ(JtcT!iT2L{T=֨?(5֔8M00G0jԋf6D ! I6C8PҴ2Y=!dϛݔ g;|nl HYŭ];,}p1"ktګTC̊h iX/i)e:!}ٷݾ>7m{جo0 u0*!gD(aROmm7wȹa+`&NAl[ػDqCٵv)\z8o +,o똸Uڞ@D],ѓMdEe}CIR~>zuأkZ<.Gm,!XT~\@0.9 .\i1 IxuL1J祽w R 7wiR!m%A%\]wgyF[țDGĮqX|:FAه=ȏYQS]o W'NraR H~Xq)s<_M9'/*PVEwsѮ@)B3͌@0\DrE8 \S&RSc~yBW;qGzuZxxA0(Q+|:,/Xm69U+Aڥwcx إL=RvNܜƊ[?ga޼y\+}X;Wb?2tR`ԛ~jP?p"$T`E-K3 zJDKE^-xUTWnF ۛRSDCH Vjt/ eJ 1Vճ=8O[ 'Jjp,5KI ufW9;0Y4|aėZz: =s%+!5!na [pڈ\(Eg`𺨑~ώty 82GL3E-XAJqCTq$,#.zvu0z9O #\sA߯F!Ģ(2FGXQGX4-sV 8*c(}NAbvNIŠqIJH]C;7,EK$ ]xewJjsjOQ)n~Ҷ;1p IJ)?Il>!)/]{II.')a祿>BRD 6 Vz0%ka˅af["U݄5쑚m7N&S]}w8lʨnpZǶt (DKB⠞"]qV7+>yݵ-^xoJt #LмD@aʭog8`]D۶ :e]^jztq| ߔ%Qu3xM%! P.Bh©説Ɗ,Έu0nNá0@ҦvSGA>X֫@ۨS ]ojޙa5b݅o/eendstream endobj 276 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 411 >> stream xcd`ab`dddwu041U~H3a!O'nnM? ~.Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@ܦs JKR|SRY%ѽǓ]h?OSц]=e+c39]ՕQٝQöHtQU^]Sٛӽ|mM-{"ػ,[۽c.Ԏ>!1Kv۹&;_ôS-:w$]\ٸXpnm9o7endstream endobj 277 0 obj << /Filter /FlateDecode /Length 4222 >> stream x[KV|\:E0r9#|ҁ;KR\!ά$mX_U~\?=n3>s?miS7g~"1B4vv>+ LX`f4v;V9'CiQjϿdR[5SJ+oM)_כ͵`%gna ӥ@UKcaM,5Fū|)-ŋi5ڴ.4lfJe ]QJ-/ E1_#„F7-s8Dm5T8~@IMnI)(1-K3Sհl67|&JJQn ˈF)#9dX[y#5:tkqTH)3ƔF-U ϨZh:Q&Zƣ"(N9uMV`w /U qb0- ͳ@XB4$@8AD(5vw!|YuUW!%3lOms%U٦0 O!_;p5Ò\ CC.N\-~Xx/(I$bW5};@eq~1'4#&2mGsY*^˪}Xi~&XS,bvO gBf NX"ġFZ`ꁒb \Z@`:kӄwdVT&Ihͯ)ڱ%-UTMx"D$? 8L".NPNqk#Bo:rH<;SXkx 4 "W%12cʐe1bb@A{CVsf [ 4*ɵ$aq;57ZkNo"^1^Fg;;ʰssW~+|R">vп?Ÿ𔿛&??Vr?DQȅ ˘?&MEؓ E\=ӵ\+O͜ 8r $2,,.'6%Ath?Dz:>èc޺D9%UXw,>܃]=3w-}gH:=.CdI#r:QK12ۃAa)n|Ƙ=0k^zլ년/3| [ڵ}/ 8)!s4TWj@8+/koȣNb'8R,']>5Nwb' G+t x߶MԷ!?0>s6wyr\C]G6

(#g94\5:vj]E5Y籂OUI*:lAJFs5(OzMImX?M dpШ*is V|Q%ђRۉ$G?p&!3S?b u5j[G87Ͱ܆w"АMQxއw3'RP{CѷC*|nƙ. S%JٗA]#H[%J(9,ƈ#4|&1E\Ύ /"*m}WlN޾o8rydǦ[^6+ɓx Zޑs+;>G_|7XWnx?zw~]Y"'.=A`lm}ݸ71-̱U<5b&oLnfl*DwYY#]]` /64*p]\)!X>}(*X]_!j yzL]*lwaJ)$xĔ Un P.}wSt൹Q~#'x[ p`g3B}Dq!K!!Ite(53 O 4hp J;4<8Mq.N0=V6"B[9 &UW"_m?3ˢ:ـg'uZöQ?\"XR /LLjqxh~7oY)Mӧjendstream endobj 278 0 obj << /Filter /FlateDecode /Length 4111 >> stream x[Iw+&YV[JP5Wy,@s"䶭 Əo[]]-%Wߺuä*٤ÿ_\p'zs,lJ_ыU)J-|}vQ|L,Ӣqd+|?]o hL詊\L}6VɌz <+>5/Hq^r-HbEt&+W*ˋB+pkD:#LixX1\f6eN W ^ Z3xY1S,7LBi$ /<*eueJR[Ƴ$E xz,V [r.3{Yidfhʲ -q6#]j$]r]ovfߖ#WәP$f9LCz [ŋ(Jhа;=_Qż/Hvr3ž-ɳL@2%hfuAp8vMdir!\ Eeyw:P}9=9өSߙ,g$ƿeYȻrrl@*g@xTbr(\E6N w{nRJ!|qK|]Y眛FV(=2P:fl>~3@4[e~-qk}$!>Qgb\I-W4W7rQ\1ݺiڛM{TcBpْ&#] R򦉹@.!u~X\6s'nooO8IN,"<~C1@u|egY]ο[E0Q܌ :(|!dOܴ9B|AFXMfٶ:õ[ISBb# 9]Mֻf*}/zU/~֭r+=:na|b=t79$ 5ODFDvU&B pn1$+P"UE.>C u:I(I7ЋdPOmz7!8>B"(c8 #&1\TAAaa|0:_/oR (BF{.DKK08̴^HJ>*L! 0*[WIEASL/J&tO3{#ceZԳta6FtYK;Q$LN *=7kWc]磛Ոù';IFr$WX#܄Ihnt~UvMngkE?H!' 8bǦy{HcTtĮy``-}.)Mz:S4z|ȿPXy7ҽz`Ý:ym'8SBs_*nDXBs]aW_v7;G:ۃjsfP me͒S$ea^z Qc{"ZPIb }Tʃ$Ά a{{NXwG?Mخ[ݩi[UT(Mۆ rQLٯ']_Ѿ(~Znpw*F!dr״v!6ǟ:8,H[J y]*5>U^ve( Ϥ+M;^R]r)r_/^t /];P4>ý,C`p*q=/'$Njr?^FRA\ 0U%^4#Dt%";1֛vT7f[G˟҆|0TwZɮ|Baݡгy+CAOAdVh%B= hXD #P{R%7qfREĸ4"+;]d?Fz;p#iYHKQ.r"b͒qؠtϐyfOD}8֥'3t&NR T" 1  O"b𮧈Dۓ$o%NJ'n)oO$ ERt PVD:#dy xus=nyH_7Bf{AFeC8|d+ձq@0C^IKmIx{ @˔S Ud8vs{f)|LdTJ3za%O a)wc;ۃ  6|(D@GmWoƥ]+̰s d_^mm8PR_4bww{lXGp챸Csƭyk4H5NYr{482F]UI:~~ꠋ{Bk(AA;Ti4>bEŦO~~lfVumh57z'2xp,f0fѻ\eB΃=-z}SJe_yPߞcˎQ{ [64k,?ʨRُ:G|f"py'掺<1DT@8G78:L42dUj}Z;4S8㊖tzUGmpK>"hfhuy/"NY1z6Ú6߶+^:nûPKnpE6nT61!RDs IRӝ/IFwoQ B 7Gyl:6SރaǠ2(x43vI?0pD!0 GJn@4$<ː:6hP:aotUȋ%#<:o*&-êP",慦_d&5.R?rhrcuW'߀i*?غf:?d?y-DBT!{(<-ѵ 69<9BIcܲ0#ҡ*Pcv7\1y|쎗h~sYPYc菉`t=u$2EEG'X.=TJm b+ZLx=s> :R*"Q ), 5~qIC )fx੿8/bѵendstream endobj 279 0 obj << /Filter /FlateDecode /Length 3463 >> stream xZoO7嵀ѷ+P q6-[M(y>R.wZos:)<_WacRl9_PbE +%o24N2V/78ꊧXYTsp9T8*Ӛh "501>ʰh)J4qzdQ51I_I*Ƃp3œ+!eWpO.a\s[MWZ5HxO2GQu7PM$99"Iz(PʎidAs,XbQng!D3\NVB䋪&?'D*՛mTM_ qerAQ6K0 =Ⲽ:p -Y݁8-mيbYvUG<*Aǒ(a?a|WunD:ONO; a΢PmgZ2"kWu˲(cޕRI !Ax;u(gjgX> a& K8plcg D* ]7w1㭣 '=G:by}sA 0˨9P53efAc҃J{g/qqFqHĕ>>oU~/߶73FՁS{C|wF-~)ºnYJj=HۈWBE#<e" MAIH-:aY@FR),hr1`ϐp9`gz^O^5aѸ󙴐tHddF / O@V_@/ޅ3ℏC=Bß\ Wm6Wq6m_5!b:%TGWiȖ,>֫iϤs<dx0id.#t}P#HyEL4dI:.^-^^_p Xz,FM0zp.s"@6l@A[:`B^tڝk@n> ,e"snBAƅ"OPnF8d'qћA @`D Jz@ٵ9 {L Иp֡cX؂|&u>l 0SƤ@e/6FV}Ҳ}Ћњ0n<.G' "eʪqdmVgb]ܭP;4m_b^j?!@ӇܕVM_;] A@eRA8R!nNB&T,]lڬxi_/N_gt Iu;R侣;)6 0VCBLG z"H0sθ>zξ$ A#Z08vO#w`vX`iP}6> .S0ZAYx#8+J)y'tTeL^ +ݬʮ)W 1IR  1C~s<<*<d]X7jUcީ^s,@M#l$dm 31V@Lu ǘf0< K!j߂[:L3B^ڌ q"zE#0 TiF )ދQ$&Pd:fD\^l>iㅿ/EmIFgN@+RIS#0/C09DZB&ٮ˺ ^ʈnB7U*ͅGQnG{#=> stream xXrܸbVihF[TdK65[; avԒo(;~! 4OEE;Nɟ'>.Ÿ~l _"_Op2KoauJ/ i.b?yΛԹ\O_sVUQ} M%<<&t7lKR| 7ppv2#nfF1r eA5ߖd),S# ,E\M8Ú[AvߖJfLze<[CNL^ H-_AFsI?'z%ͦ͛fދo/ff=AB"sJR|&9i@,U\DyYf ?%T'ߛvSEO >9Å)lYKAQr)XŇ%_7iEe0 |aU##TW+BK"B}"r :YRO9NF']Cvñ>tB )e;$1[m(.r$(C) __yt$xnF \J=Q@jGB$b9 ,`Um~`j.k/ꨁdWo/9OZ_`6=r_:I ieiйJSmO]:,ɖ|}ԁ:|ڙccMZcߕ7H~J{@ -X~ʄ p*dK5A vvew r%{./3R )&>y{RGB}!f |׺#"pE̗e颇Q1Fd BAe. EUw]ZtDZ;TGm=ᙣn?<1coP`a Kr*MaiSEQL=˺ tnM,Ub-FEf brg+lv9,SXTf^EDlF8>W6lK24+]:n X8]c$/e.S ߧ޶o`U1iƎ10K`.Rس: FBSQ뛸Tۦo*Wܼ)U^8gHFeC1g,mM)&Hd]?,mާ P鱖!6X,ؓrflʵUcdHpz[{AVۦWxd-yFI%ʂqn(.섨 i@.L-@DRWC{0- "q|c9 4-Ôؐؐdr$;N Ɂ6z=ύ9r9/!~(FzYEv_:X-~RTC`fOcM,ETo0by4 ,jr޴`Qrq}7&#Fwsrwj.OϴV> 4> ]޳ ;ӖHyI*ik)_Җ&궅Hy=T,,QfcX"uqSw+*=H.stG#.ڊ>NPuszf^Gc' և_jC t^8;%rvwǂݔ2+b8M枾;Z6n:kͤu4.Nm>/ C\23j⛫Yo ˎ{aV̰_ź@/U{oqTQh1ǎաcx kg4J볋Zg>=@ =L08U2@ōx5J%8 :yqsw!~@3eӮ{H)=p**4| x:.Hl0ĆThCv؜7˾C''P)"dxZ=C8GTlT%e h Mڡ򋄶ެ&(\!Aa5?$KYC⣏+_b5٤eLskN^ =1MX7C6+ y OdH{$fΉD0Z}Wx2<$ȋ{"qH qW䖱7LPl ~^C9jg|> stream xXr#SC" }6uby<@Dus# hU$sN&1&otMzɩȫcb5q1IbTb N-~aĉ[g1U?MY71"s6/{cP4R8{\L0G?e]E AJJt_̢9% &RcI[ V(9La+Ӕ^Ef]4]Q*ek(.LR.X+ϬvuM݅!^: K6M[vM`b |un!i-R,@yIb.t7O9n?OHyo±TcyNĖ( `XeQ4ou{ݔE۸Y170vQͪan0>GZ7(7z Imڅ2ۑDwmV4]{m nv 6YyӶ BY7"mdpN(j^kow b&dd,Yv#X0uV;w1x%Ox$tN0>0S1q4U}VßEm;):?+"IBlF uCp $YmaBY]QfunlVvj(vR0~T]D ${Zel'<17yh)U:B3WrRX 8^D>7 f=&)w@Rv=E]Slq K U9YglkúYjd˳RiPx``tۺٕe16PHe[q̘JJ^8 :ʜTD&DJuz;{Wkژ&F"FX6c>b8Fîg6sF.&@R :mSh!7E96k^{  -Jםsl įuWپⳡ_1Mw`XVkݟXG~r?LPCcendstream endobj 282 0 obj << /Filter /FlateDecode /Length 1205 >> stream xVn6>PmĊ>0 %YYJkPQ,SΜ93oWO<{g}ڴG^ٿ;iD#{AcDvL^WWt]\<+8x8MC DV9Td*BbBX/y yljXe no7>EyS+ 6_Qoo޼QςoL9MakE׫'~H넱A MQͺ3N 5yS+L\C7U׸gyf=;yVuOqǧZL-d5^4-ǗhϦ8Hc$3R^q48<:|oFZQcZe^Hd J)H4`&t:%tR7qU,IX(m@ tZw;_4XdbHpK##`KhA@I@`#?{cfѡ?WEC&Յ54Vce1`eP%qI+US .۱K$Q'vLy盛a\Ex:x1`| @A HcP^ Ք| eKrgNHpH GɛAy)^\U1$4A,17(x-evL>؈F97$ġii??=]mHendstream endobj 283 0 obj << /Filter /FlateDecode /Length 3136 >> stream xZKsNQB&"2/c]>88媔$H vGo{fARkr====_?Yʯ ׻?}o+vxg `R^=\hX*6Z*v7Lń%KY*Rݾlua9KIޔc?b91%16क़mt꬀) ,ӂ+ۤXwuX $C|Βu]7ʻa.9Z"d,ޕF(gɺ모@bmT4en+DYX.uaѲ7&dP7^EAjjuݕ7#˘9co ]97^Fyu]᱇A^p<4lFb_\t'Qew dCS켂[H$4Pgfd[sT"d<*d:l!q ?yׇm4aVr#cz2\rmAx(\gsZm ": RfdycV*̈́dYx`2n,2fnkV蠑(S re%zw;ArR%HjCss:rk@=_ +7o y1uEo 4W29O C/9 %ev$}Y6i@ޮH1fC~9ьlHCUvczWA.?-=`XƲ3?"$d}~!˰(Q9y NVG{=9 X 1@0>gD2Cp~ʅg\K/4|ٙB60`n0@d$r-G;y݀@-f*/q x?1/yZjd CF n0@KAݖ=oda]3rSi z7Lgrv q^t_3>gqIo#-R< $Ě&Ƒ[%g¿y~oʛfvb7]lbJϩ l91 !M|#zN%.ʃ(HZn28/l%Y"_%7ŶOιI)2{eS7! 1u%#M2fؿA )L}1A]7ڔTQ)b)>ݱ|ӂ{ګct/83_Q(`=Ua$l]VǙcډHpv҅3PUB V 2ԻJ|}.߬Ldx@״oT)yš3Ti+c*wG}Q4D2)-Yi{ñ;N HȜwy~Xȋvj Xm10C!51m#d,ɝCVyBq犁G's-J.1;(?!DaQT۽tcC gMndҁ/ }Q5E-|Qb3kC,R 5F)EB;};aɘ G3cx]@ )]D;63h(GMiZ7p5?Tob NuiO $ PM@ӪH(y< ZnZכp|3_RO[ڊrjs ;dڣsVRXVkZ0Ω-]p0ݡ7HeAWx-!ʊy+rO uMiR[0!紴Pq%lvwn2DiMOkFwbICIIAJTU_kR >4y neg.T C؝OT1a.y #:weMvuWO[lqg}kt(>t3WkسUN;à822;/'(=P߉}zOT*$"HSaoN¹,JL2$D\;(^:%5$-bS TٔO]Ag[ܗ|$ܶeZe6C&ـշq2?u=OU!I=4(vT.yo@T_qDfD:߱T,jM7q]Gendstream endobj 284 0 obj << /Filter /FlateDecode /Length 1660 >> stream xXr6ɣBQ;(c1xن&3N'!ڗ y3/]\HbM*X {bXjn[xn?Wj˹ <'| ŕm3 m[[7 :+^f.10yyik;)lba2B$\n PX9cH&3ʺfia[a@~r儞ect$.H`J+aDzRF#HN AڳEHc|685e$YS*jTш+`yY}.ORS C23єmG4I:ҋKybt8<~O$ҏ/|>>UɋFᓈI QZ Wq!cBKnr졛~*{rd} `L'¹-qklĶ0Pț=vޗ`E,cېTެ;!@&6=,OZr+s\T\kPXJ"0M]OX^o#6--j G-GZCI9N3 P/].4'|[c+ynz_J૜Exn%fi&($8tVaG};l/{=H۶ի˕'` ]P hPFą>`ĞM֔&h^_{q}_-Ѯi.ލ!|)-|z;=N$j=;E=E}8`xgY< oh^=<P]F|1rOu?|G=R]A5bCoHT?G~f|>‘#va*-E?𼃺1noz:Dz4YOai=gl\,L ֐2+WлT{~q{7 Fx-Fx| ȶ< zy׋8||[y JYVmBoF rt2-)oی-Q7cu2܃眧H> stream xVKo6zԯС@bŗ(͡…=9ZWVrD] zFq>,)㛙ogę!F&cDa~C`iovW$ aXs!B,K6%g i\RL:Q ƚxE "~dapƹC$p/Mח5$90"c+ @/ @V}neΈDc?= )\" _^BZhVdX6U_? u'%*(L(<^') )Zg ?O҉eL`F/=谡gHUY mJc$P搙5xчQ=ѯhy9aYP#:$~ˀ~iT;Iʕm_õ~ˇ/z=%?aHmxL7"?̠oo}bBKAFw ߹XɷmFt|Q<̥Fr(9'`xAEջX\ 25YKLy1Eغ@~6M$0_2yB =ucVO%0TN{I =5,B~Ķ罌4w]*$r!]G\ g!S!x89QTڌPz])c3PK*SB][(]A@7G ==z{ua7 ׻pS_nSVJ .*8 L Dѻc3w#rNreECU@jGiEل^+ i16A~snjz[9ɭ3ΐ A;~P39 wrEtk&jbZܦ'4崦hkoȻg?BћIMfrP͚Ӕh6ҜH[3mU#jé㪜Sk*ꨄ >c!9طfWacJ0`ѥf9yBMPq©kf\@1Hq1H.C7Px5”] endstream endobj 286 0 obj << /Filter /FlateDecode /Length 1574 >> stream xW[o6_F 1+Ratɀ-{`$:榋Cʉ_CTٺm,wn̝`b9Wufu;si?ia+q@kiEX!!8pckU̮ыަ>1)*/ 4 |bB ث?@ /<044`үvLp|;;tlDH\ TG>V,;EǸ&m4 aVL߲l 5b 5D*9% M(EM`(,>``s˹LQ3Ϋ|EOBp?3O i$ЃMĔ&DgAupà;rͳP(!%}݋\vgdrBH.ec0h,{Zef'E,ďu PރPdX!O/gz( ?'?meBCZ2ƍ b$#[S$]^EVDkhعNa.h8hkze[5Rk{rkZ].L93EiC!U'c?x_ErE3l50☒wb9w \ '؉flzݫW½e{ab (`0>{g0JB.{J> 8(!חAY[Qߛuה7#\"],/?&ǎ7: }݆h)Q#mUn= "tjl62]s"󬓠꺂9ĤM ]Dccjla5>df*p45CpR yH#y{ /n"K*R]#l]vkO*m mߠcOyAar8qt  gm@dJMHA_:}sVdW/oxN߭[MN+w`;ob%٦9w& Idi/&ϕW ^,W)!^g`8ZV (Q:r-w[Jfb_2n$~x)֕L<˄wS k{nwTi' ~̺츍'&#!WH3`7AΚt792 vSC󑚑BFKWb^=aj48`F?XUބFWJfPO qW}I@4e]M.·5Fkk v>*զEWm]:I~?c4&棠t|uk4W<ߌ滜r>*칺5.|4'*â˒n<‡#8@endstream endobj 287 0 obj << /Filter /FlateDecode /Length 3235 >> stream xZKsґb9"7\>0rQlDĂ$b,_GU`[]]Eyt 3.bWCEFM]==o^\9i>Y΋D}{(n2H0k+vb.`Oï(b|ڋ3;f]Ӗnc]55Kʪw6c,nwA_h6 8]E_IWfcEWhPKu$HX0z 2i̴eKS< Z/ԐI|כ]ַK5'XEyӴ۲;_S4_:<؇5xy>YPf2OހH梪¤iT5y֗MR]o D7}u,pླྀrQtS=*Tm8>2/z7"<ђ_ jqZ0˥{, 3[|1D RK.AGs KX2Y:x{ʣ]uWX&~˵uAg\$1Agp i Lfet0W#Qh=bD5:DU|kEo~D )-0WEmUep9^J˴U5)gxr+EnԴPb8YDCV`/_a͔l>'kpe^5[)%fUt= ōϷT$dRegvӖ%[6s*\ Eghhl  :Zt.ʶ3ϪG<"3G?admOXћ D<|\j6#/OV@ =8Q@lv{Y*bx'Dgtiq"[{fBGb b6pb?j$+siБ8Ub%,hoߚۼ}b ΦFR6NG'@ic(L˧lrM:ft%Rp_9CK} %R@X*>$ yEEwE?b}=Mcf#8d|Z6րk OVmeA!'/Rs*$Ո9%i\͠tFRޜi,S TChG+.iCI*揄zhTϡLUz~}g!}&Tf{~iC †wK;21Ɉn͡ڎܸOdB),V,GE)7-$ipmVwwK UR?Ax{&~f\Xw ydW]7asZX'¾dZP]-$s"2BSqiY h٦}"V <8"d̼-tP<8NH vR$> cF+(ŕlxC5Fu?A< rʕʏMݎnK@("<ғ`~Gdqu5}쉑&'Nj!H JRƭ׭d¡nP`+w@DIw~AkY,`f{ U!8_bùEU<WOX#'q"\BwȺB hA8҇Gd=\:!#!X9g(VuZ2E-whw,:ӂsL?Ì՞,Tl֛j+}6^,2&!hDc#*Dd)Ma?]#+Ro6LMg4 nU!MxN$TX*8s@Z!'RƮ8ʵ1Ȓn%=&T!+&DOv AAQ̋xŏc @*(Dl ACZE a*,ٖ -D뜬aϗaw1EJEu݊K |jhMl1 Paq4V0rb&lJSUj [#c_dlP d}FO\x")yՉi\$W (y=p6/]xg:eͨ~Ͼ:.N')`_`yG{^ֈak7X|&llfpU3L\>5TCY&4> z͡p{?kE3r"^?,ah<s)x-A' V*tᙁѩgr̸|W4TE}Gdu"ůl&pVRv7t(kw*%?3GRLܵe;xeD,aPC!zgC(= /ˀAblzQ jIAc1lBF؄~*BĿC?+5kwhtb" \Ht4"1~ oڶ`g[W'3 Ot0\$`ze_?m13}ʺ]l _EpAL ;YpZL/} YW@&QSvٮCS Qʘ#a1rӍxykO;q %52ki%*:Qͮ+:y[1 iT.ˊTv6ܶ¤-~Lv7#H:7pGq> stream xZKN97}ȍ78`d%ʉu%U ra Zm~}{@y\bk N_??-SƗ)s7o_ť9,_^˂Z_\,u-9PLfzsδ,e~%I]ݮ3SV@q1aH_ ki$r-r(d[G35+@s\*ZK«oIUUZ +"ٴmrz%ɮ^ Jޯ8~&Ɨ# ;މ *~^$I7O"X|7iy"70\-Ι.8o_nɔsC.gy?}yޖ*u-i fhш2g7vLRsMrhΓnEDzOtzSz6U3#$>/nڮzvۓe ,.~{ (H$P>-ˉd}'QmG8CU<{$<]ywH@ڢ"&sʦ!/so-04d[Ƌ.y{bf 3h]8F.ЁD %| ~Ff6n_Y6Dt ey|/bB.58:\7Ż>ՂT28i\>#L(DeETqT+Ėxlq!g;ܞCB1u,.(2Ek(B(mG,{X,dJ(9&@f& 5W&| S$udmݑ`S6N .ͪjpj%.{rܵ,3{k B-Inv3I Eѧ@2R9Ϭy(ېluݞ혧nZ8v^̧& w{:IL+DJա+d,NޟrV+t/'z: ss('i΂rؽf8VI<9}__cH\U曶釲 MF[Jvn]yOV ^JPPWAf~HEP}E 3<.42`;Q/\= _?f T>A +AsLw2yΘ/٪RG֎&Փoj X䐬L&,ِ~R/xg ߨl}"hVwckԐ1JF$@5ZգJ' XAZ!ӂ8x8Oq%5}{JIe[Hz*sIXn[ӷ劣.t>ZJA>\ΕI.gڮ *_)g+͔NaƉ֞d WJVRڢ[Y:oXJ9 |; oQ^4N?g+ꂈ ڍL54*ҟC`>uR@yw?jN! v* PMw֚xB0]@'͌PC_2YFxYF9oLEX[\yRZv=3 dDyCfN5|epI@s2s9%IC\*H<%iPIxq@ cr %&p"C~=SHQxU0جcL>+[ OUC9yC0VEP7f6*+!U[QAI> 6@҇ '%%˕ ;WIh}>Ec:4#RϋQ7Jz^hTF[YBU<V<ǞG') ;Ǚ~~~ (()M=YV7i?y`CP`#׀CT+CDcfA@cγCvw[va9><{7!JPN _z3r/~\HRM<2gөg$Aa#`ӯ  AW, hNz)7QlbEJӮvg7, 9fjIՅ}p<rt_plgR^hf=>} D%P@le2F:lr֠޺-9G)2k2Ϝ@IocW8OQ`1,{iYȂWa\G Kg؄yJ`j\Eq~ۖN8mQ6mR${yS4 ڊȻPָ|v.BoAރ C7Udpk?&8e>(yU߃E56LXsc#۴P9O8'2ZW*Mnv](`_(]듹 31GUrJGJّVoM(={~wϘSƟpQ^e;'(A *<;pa@Z% &7vAɎOi{w]Cx؟jCx%nñBt[p7Rm eLI\uB:"? !j[7Ց/~TEG*Uvt93sL{}?7Ytt7K)fw!uzև{/hɕ|n~GE#+LGI"HuW!ZjA3=h7J+1$k(Fɕ!4gv4#KeCuϰ=eV]KB7PGqUɃ6Za/Wwm;t[H׀VvxX^hͅ9Lp1%-!o}{$*o!{g~V!r]9o @BRz7pJ wv97UW87;E"Z#r&L>gy?cY0ikKO/|5M:ƽt?nk__>y1Z,ΉU,Ed!XhgG0=G*cSۤ:&=yXIXЅ6 _`_y_/@L[9ˬA% 'J:\ X{)r6oSL,Am \!k塌BORS! W](s^ոn y]g~|"8p:oC5"8"R1>5V:zG`a.fu7/.F*B셒p~b BZoc_Aendstream endobj 289 0 obj << /Filter /FlateDecode /Length 2361 >> stream xY[sG uPb צyH'~hfݙάw&Kl(R!){NE{.AٲW6;|qrwt&t=q"sj,?]yՄ% %T b;:]#0(A~뙊Eі_\6is$i²fkjSA&Wb]TY/ :DcGgJtaW}er˾s䢹rSbݖ+ e$*SKRZRj".> bA\΂6h d32geĉ\D.bUv}Q/MpU,=2u MlMU뒱9hwbWMK? Yu2&ߘ(+:|j%SjۙV ON.9Y;Zohq7*yI,߿kYໞ5o<ӭ\5C1o"[: {Lf/&_isH&7g9iӕ_`@MC>.TETީ$ưSV~T){H`;eayHpv1SH0Iͦ\npXF+RXʾlꢢY,l~5sD ew3n˚pD\6s` 9U9P$j>9[xy6I(+ލSDdR\\T-g/w+uWL TBl GFb&+egՌhH,=3%˗oɪ7 NĖ(/g;>Y,'ʻuk}Pa?T)^R)n8_vuS(qr΅MӰ?eElښ~Y΍LGd /ۦ3<ǔrrӂ U[h v7ì3+nSc6qS`CơthG!vA\>MB!@6J٨pd:7~ Ʌ FVJgc>(R E3e1чaRw ׯSZ:8:P YoL}AݚfeGC֦PQ"#nhu%:8έ@4ncV> stream xZrڼ+&OIxI*vlWlʶ9Ufc9Kp?ߛ9HVt7Nn**櫝HVW~tHŪ,VW82g%wKr!Luf_4[ $EHg"WIeLsm[~qYw!M[v-T\]v0}[56wf b6UvA7Ʒ`ۮߛmXFz ~eua 4 i4(W~cGGWv3]]UkqQ1LP/ݘwM)gm1i@ANJxE4t;^N#`n;3xEg!iwGc-Z=ks=.Ա*7tK'j E; *zw7eFWd^ɁU_A& kDK?h-A?I[j<%Vǥ^o (OYbcHUvSvbΥt -Y³^G_5Qul?,&?|=i/E:ͩvxtCy i]aT)uWLg' 8GxL:/Q]mG"6@ي "+ˠYG]<0hȚB?b*nU^Cy-q`̯o!_*ܧ`A:#>MԲ.Yy %NB$_׈̙cQrhUtꆀJLU5MGˤ,_K>$Bey~ކs5oښ  ŗW\0g(XK]x'OJ̀t<#z9HZWSkB%5Lv.^  &hNktb'Jښ m&GL&1 rHҋnsNܓ /BAA|OFx!%%.cz_ 0Diζs=aawP7#-_2~h3Rfl] fne,*b&&@LjbX[ _:K +86R0.K@OCFOsk LR;³F(S҅3֨6Ә?(othӌyu=8R`Ę)漽MãcC)Fi & S-/Xk t! c wv!N's 9Pe[fc*;؏G86}Vln -Hߙ0CU75wTkߘէz܇6kZy^FndB0w|B/ՔsMYz]}膠{oZXG3z>[9{>ZI0E,EYJl3blؚs]\0KP2x/"$Khvǯ!sf ȉ_]solW/9~̏ "?dqm|̴5za4Rftr Ex$Q(JXM.9QjcU('.7]wy %qhp=+HZ"d5iM'ÂtWI/*IHء4.?)6bd vdAѠ^Y ęOgR\Ź(hsCݚ$< oǝTA|=@:YqRi:!*6Wi¹y Iɝ_[ 'CEv_5 TTpsZ?WnIuEkYmÒpod7U SH?ԹK'Ǯ&&k {r]+4݃60} ]B-u*Oُ1c` pDxm+c3ԇN'@qck#KWQT.W9vkNq\tl a(Iz^<.Qޗ)BJsTD#! ڒHZDnŏC4d)-' :rA9 ~csJC>c!OY`]T 4P{82~a\4]RZ~NP̨jI vkRUU{WX""pa໶ʃ!P> WN]\t«G_O5ָvI=S!vʼn +fVW+S6*)گWMJdA4#D^|ࡶOSec\G_ս~DF{@[^$W]^X041^^rC|nD}сVB 7ܛddAdy#oIgN.ncenF-g0+=-/ҬwU옊?=?{\UŞK뙷ļ% JU KɈF&p3ܕN=-> stream xZr6{-Ԯ!ImjJmd@q(1Iek$?8xry@F~$ W/_WIrzuDڝ~s `XE&(`M4;ͅ3UN" 8ذIQ֋ogӇ3rh_uXa hdy{>?ۤL4]gKMAįrduC FxJFTo݄.~)u9NnF}9sWO "zUۦWM}{v_@<E(CXԀϷ'Q;uVM NN`~daǕ"4M zM5'(Q.O용SP+MT;Vd CbFF8tl" U\Z5eɲXDnTQ%1]1NX]i lddlF~] u9$EױРcDo^׻rx7~РT5I7ͣ:Z#f+˩;KT_W#U :ȢqWm &Ӳ:7ٕx"1 ukWHQ';^)`f!"R K|*jߖX?@Ȭ2x6U3 ݡnk C`j)\;LxWV}cOK鶮;ɏ' DV#NR\IFZ Z)Sch|b~pAe!Ѳ2q{ n"i@"[r\14(ECQm J$0/H tίMfʄ,܂T c#N, A2+ʏns 6(v궹=&}C.!~-;.A][{*nInb-0NUY܂#!nb`ZPzl1%PRN~VzPݙJ=Ϲm|Ka!,:IrnWwhɨ YhU3?3_11 n$fgb"o]l汒.tI~?[p'XVU]^s"'s8}vZ9r]Nb@TuyT8:ȼ [0y-+QXCd=pیD3 ۶nʎ(/ڻI_U{0[: 3 4bG.p*A^3Ri zH D@!ŵC46lʹTO~F ϐҢ7>MDM 3m`tm/.᮶ˢُi]uQM7NuenmTOixc#q.𒣵,?qG\H:4JI.zoG 4kl\Lng-GGt) 9y$A\&b%At?L$oH(EYmmCШXGETeg縮AD -} D% nwѸ7RR)Hm,z`}g͖6`W|Rp,+PQ5ʹ_m]tZ\x-^^epyNɩ r8S9s($ 1"us9[wu&ST<sP~Y]=7',h w=ՅsƾIBS۪ixWp~[=%Ss'h)öt up]դ&z5I .K`LR6v`>ǜ I`nu!AsbseEQr׾*) HKщ )bs*s;;2X.\l}an*miGy n=KzV.|.2vTh{CdgAtqpȽUƇ ,xI96[]LPN~zk2i򣔓I@ԯsSU"6~ܶ-%kREǓW "s⑰d|{1y q?{.q;~,_f:7Q.\_#ghݫ\FȫO=G**2xT,֩zA\X뢅땗Y 17QZܟ >I@pL'2=b2>,<=bՇMlKO_{!uH)S<*}/X\*rģtU?Qc?eA ͩ߸$/cI5W{ ;w{ǫl "xMsEsb]ع~/%t- [AO NH-d0vrfQÉg]3nx/#_d*;ve.ntP|N˸:VPFo?0uC}%JCqΌs->Fs bx^`tg8wi<|χRbҎ5\? wjh łu> stream xYKb̈{Yd$hd3Ω'٦m-J*zvdТT"Y_U}E _ݕ."\-8}\?r_j,7N\,tC&drr1IdM^SU b j+LP#%:ZE/Ar\$鉣~hwYaؾPL& =Y_aL8N\);- Y3 (Y ykrxWkFL )ŭm_$)%<<fw@)Nn.|;Ȣ2 lw&~1ipavZ?1 ?sDC ]=.ORBcIkc> hF6$>Ar1{Bim$Cݔs0X}v>*zSBt%a/jFgU3bQLMBI ,cgҲĝj5y=/Pz5n  I6߂ H!խ>0veoBMv>asN8PP%PEj5ΰ a7*'8h MdTbp@.g6c):a D~,>-,WӀ48.A_Fa#G7Կr t?L*&G .7|,B9 {}́A^qG`OX)K8\仼sbyHXI0Ѯ"q˹iM4"x F Rnch-/a䑩$09ji!L>D?#< 8N=h=/p njsHta;\"zpr`TPjuo5S[ӓ HN;B$첼h?!u7N`͟MfۥLGlױ15rq1CZDPYTO *+`p4{6$stNzRz:e=1_0PZF!5.p-=//& m^ٖ`YI'JЯdA3 H207BW[٭ɤWŬ%A2d{27'V MO!(M*}MK}p sq¤vLi!pjcLz_G9A0F}qUX[QaC7W:b9q}:wrZ}sOrҋHP|n[l2*6w t@WƖƯ%6C=WEj-@$> stream xZK۸ ^B,.魽ևMyjד`@I IʏhP0$n_EZEoݮhuVW y ̉B+T|uw LhuA83aH7ÇN|uYBx6eͫ*8mPn۞}CQVQa$juor1xuY 'x([tphy,&*+])p`"vk4qT ˡUSz =MEyjQyh7q2̂Bmv_EtpTC6DCh& t0֬pz&e*=f^1qbOKE4m`O&A&E*6&*diJZ~Fۖ= ~ŀ6hRK|<4AEݏ#}Wn F޷,zl }U :qhum7ifަF5&hf37ѹ+AB0-srי5p!߄W|9!s*aVv6g<8~$4mfPur>:D6@H'J\e+fxʾ }N^TkA&B"Tք s=\&0E#lIxl$p8vC?/\1MYRg.?Y>T$**T6jI8h.KwE]Sؕu1TʯE\2z'ddQh̋kJXYV}vt9Xq嵛p>O*hC0(n? _5go2+ (swf'+0?i[yL;]Au<U`_!čXK%}u`٤ʆUOn Nm =DxLP'+!>o F mؙ *q"@jcƉ M %;L[DT-&! d,w4qȮ+{qʹݯPDuaRL*&9yLxA6Ed%"rB 6.L b!Aح]wgNS2fQ_(&CE?=ǜ 87?/e@_ s=kr=wZ\<=ssesI$ߦ(hi&O,5yRl1 y@]X:$%*˟Z@tQW" Ƌ(,Bu~GǞ^؆H^-*|QAC' 1 aH&Nb]8Pl.#j**.%g %ψt MT(F[R,JjY*`\@ZGKⴲ\, " ҰuD:Jrj)ԧ\1:Я?)!Ay1ȰӀJyJF@mQtB :jnw@|hJ b̎s#kjTsFbG5i(([ BbCDk."LdΔB`ٵ x7\tFTcSoUq`4i }Wz!~S hcz$C\UT' fߊ P桅0U~ZRa3R DMP, ƦB+zJkf}G!)E!)vf9V1G7n1zÃQLs&THAMS}3a'̽*m  qgKp`zvD/?q'1$ Q>zR/w U  ju07ChokBf+ Y+ @Ğ 犙0ֱX˩\}AF/^5k=EEjױi!NG4ٯc춟D +^X.&}&6xVr bci;9F¦[4h29}bʫ &]12:W\1m,0Β2܇UaQ&җ 4m%@x$=G}>+B~Nl1ˬq^?39O6Yb5LE>>f{ oGsɨ#8Zlguz5_ԜLW(AswϏzX|rx7{ԁv/<{IΓqwQNV~Fpɑ*ZZe$$m>YDBcͦjT,Rh]2=FwM-wřQԧəf[;ECSiϼEJzY46cXC W%Fq`)Dk> stream xYm۸ѿ8")T-z-E.n%)Pőu3CR7ڗ$8<#wS-..r-nyisT˿\,R.nxpGoɁ:d.5Q*U^+L fۢYo 8B*g VWfBJF8u7LYWԛ|_lLkefb% Ǖ0, K:[yw,p +nŽCmnÌx+Pk)ŝ6#3d$i9G>^`;q tE֊i|>m?.G I6?Wݗw*Nu0yөufM;2ɳ #L>7|>Ĥ6Y1pc~4ĝWo&f%LZJB:WҀmygS-x'Ŝ7ͱES{p?ĿvtWYt@x*}| SvӔeCAz4W.H:0oW/kSp0Nvj•?h} *P& T,#KTCN{sVoϹR^Ll' %ZQ l؋'WPe:u{KɊt\z/n rʺTyT F[vrN;8]qMy{rդT~aZ ;RP<67~ Ӗm7$x*< Q5y>ׁbH7{h  Jt ԥ謤*\rA `t It05|)CҤpp{SXef."@**ECCc>G55.PJDH ,0cEZ\N%Ý iZfT雰?^H@'}  nj%….ujta4W>֐zޜO%We웯 ~E9'(6g乺P|:\wM ~iʳztyysBTqS=WgzNLU9Z0$C:#xQF>&R^Bzqj2mٽ۷3c ♖)['3x)3({a< B08"3+\J t* w>[dx|FE}HB-m9`. v" 0K=sAB/SЧTXKoNV#}5_pHFVoDGkP]<Hb`5kHg]Oͫ cHO?n> ʼna.;vG0x֟2(DTϤq&Rfeqm$o=pž@9@T m1 Kʢ*j~gȩ w%PKj 0x8'WTF atf~:)[ vq7gg p FĸFg8bqޏ %$J;p"b|pe>w=AnxHhdwDZ{Xۍ\j`aOqcj*R Ekse}}*\BUL3g"_I@yJ 2+EupIAۂl2ouȊ^Pimqd8}"ǯ /ql&g< 0 ]Ƹ^Z]/"01".X]{ "U||J?~ƺL b!9}s,\ u8 %="!0Ƨ >ǹ. tDls}WS094"dpvMuW"1[j}i0jX,.3xqb]ٺEm?97@AsfOQ8]endstream endobj 295 0 obj << /Filter /FlateDecode /Length 1749 >> stream xWn60/Tk3"kP?d"dEoEmueɑ8C!)JTvn Dř9<3sH mL5x=8e5݀ȗ?`<87-ʐ3`zۚ <1n vݞ 2-_K|ONq0T*y4iY W` ̡pĉIF\f\@&mPv%.Agb0Q3.Z IPq)*0|4m۾ .~>4;`5꓈Wm^UZ]U: > `БP6\Qړz>aȃ=% ޜv;U(+xRXu&DZErm'ݘ@K2dUx!v!:kZp;_DS <;d|SqeΓqZ¡0ƫ#ڠKFesdaX1G^=9O+o޼ouͣ:BՅzqPkq:jiۊsrgiqņ4I0Ef@lNŶE־%D0 *c O[Ҵ  6=- N$>RJF!n,9+vĠ}wl7Zl_~[/ۃId8&{hZzV\btYELiY-:5{ᣭp"O!ޟԁJ+3Tx=Qb^7εb\Du~/m7.3!fUQTI̞.c*OFrP5K땲ҍRz\:֙` 2_4}ڭendstream endobj 296 0 obj << /Filter /FlateDecode /Length 1053 >> stream xV[o81+drjM}$9PbLԧ1_`z}wj7K` O0C1=#@|O(n 4l# 7EM{\mּc4~?ԉVD|3$P=YfyvЙ[oWo.JlJMmd\P[|\f86[ХzK`l>;eJyW1G jMD['w7h!b'D,"$$jQ 1rRkѸ!ǣ VQksi"c䵰Zh%wkyy{>k_b0tbF_CmHvPДgI" y.ݶ8?GΫ.-O:cQeFl8_ؼN*1zT2B/9]UͮCG:D -KF',j8k)dG!U ~|@p:H\VahC*.&< Y]:]W93 NR=zձ.\+݀ ݚ=}I'3VL&9 #<=3I9[nߥ>:}qCp)(]iqlE:3Nw vCz2;Xiզr[r1}0/ q+Tݨ#^z}=VXx?7"endstream endobj 297 0 obj << /Filter /FlateDecode /Length 1322 >> stream xV[OF_ҕ:ƳTU+l*}0\v,=s(ZDs9wngvO}zwkfliO^?-@ NBڋ% ȸC;"^b/j t(yUGl'ԎA?'& v}cQ((7iz1sm$껲)ҿY,d9{L`-'vqĶ{8j/ }kП9"@ZY_CP<Ԯ^Tv7{ Uf~WRk*ʦlcO_'UnP)kdBqr܎^ttH h{mnGJGG~%rF4cb­uDT_7GsK֥d4gz9YQZmxl͑ȭ>a PUݏl𕅦LIhU$h W&%o])U ( }^{?VLsQ8-Jy,yJF{0Գ<2(f^7n˙ muYmYŻZt`2SoپV2Z횜[YrPUvʥk 9c(O 7]= z{g'_SzW[*Qz7Zb@M~ZTΝn_k,},&L jتTjdT7uYX-co HQvҵ )c8K)ӧ a`;C5̋#oV@dXX@>HUA( em t6F*73> IxZyɑkޣ1~\*C\cҗ72\a(YܖԞrJW@$<WY׎m3zڸ'w[/9:!%6Uj/$F߈@*HamkI|PlA@t)n${eƻrp, НkpYW-H`h;Ը"\PV9K4xƢX.؁tT~bd1p^I+#ьx14%@qpVЙŸzdߘSWZq4|dH!&"qXBo%pF( GR"* "AUsDI;})!NR˺Zg޶4К2#>7#BMܛ<Q}pa. +Qx GWendstream endobj 298 0 obj << /Filter /FlateDecode /Length 4003 >> stream x[[oѿbPU"6iSl&u<3vFr%97ߞ IIciIY`w$C柛, wdz_}m7wY;癠 bSfsu{/4mR UlgǾa>Yy&S!糴d…r*ns!-j5i$ɷ[%nhȵN[&C})+pdkn_7P8ƥȓcD6qM5ttfPp,lҕ;=y:i"Wj?*llW\=5vڇz q-ᐊpLu`ZDrdOt!$",w oο-\i.LDa=tQ ;\Q?h_"?>n]DU>ސ軳 j1M\h'w]W~8T Xmˁtjf_=TW3d-si`'3e$C9԰YdBJkfN#5b3lVlf.sT)_C{W텲9񾯆;MK+ }&]_oT "# ,#Vhd΄́T-/-Pt@o1`ntՀ:&s €*/ԉI[^׊t]uۜ #S%> X&V2m5huR>3 ryC$. }lz`ˮ.]p>#0ue )Wg]Y'6zkg^\j21+(sn@eCz)\*wS$r&9 Ok7TϠ [Pчmgv6~,f e8q q׃f}@0:0RRB_a.| +pPX"X>%p=[;nGD K`xcjh. Ie*(v1~&5Cr5E?G"Հ&TrvF2!nThhƪa(i<0j61AZ3'0 ӸAο]ÇΣ86;X?QB&O#~O˭h`ԯPG11(# L{BD։ZF.5qM"ʚGBɊl7q>b郚<`PfV~~|oܸѓ.I3_OL^ b4+A}| 8ܷ@J[_/R(*$bǴV:dRn\XX "Ðo\ clEQ @(BO_1%%LFe%h3?I1#ZLiń=TLhJ`>狽J!jaY@Tш"k-3=_Tbˢ@)JOlϙ·ӱчYfJqs2h)w_ ܀$eZ)do*CJMPtCuEv4 .-#f#B !KBV-20Qg7@d21}TjAJl㭙:䚅f巜 v}rjAYmiZ>UԻ-(u % r7 ٚyՐx@JlPmP\f9LA}vݒiؗs#io14GUzXA"5j?hD loP?c,4n@#`C2?A&X2m]6oju0ISz2:6K(>H.w֚a͋%X(F'_W"L]abUwhle.|ηюwվFF-g(wDy~,1rڮOK&uӹ `]UTǒ[d2ٌp҂,:=/Jы='"4?ba0CݼC`9 9. EؠOeP**qk5!#S?wB@ǝaNl" >,؀ey tdӕ R*i^z%VHkZe l>w=ٟE>,)Dz `|R=goeIX ؗ.EhR[c~.1Vt#cT%:r~y~"Ԭ+ja&|x> | aD+$ew6Q*+.L'# BCQ1]K=C<܆'ÑdFPr2p >Mڛփv|  P_XZx&0uzr[-oe .F"5L%hXdϒ^GAڮm](5>@:w>G9 6w}, a [D!9xɮ!B'-c+ Py9 .pO yIլ0x!*=>~߬){AiJL|r$!#6́_X'R%!R/0ܽ Q>)vKqt MLJ^'IL)[cHYLFyXGp܏T厧q ԋbnEVZ~tFj>pC?5p;T0"0>EԼ+ B;@=ݺ"N>@_ : LjY#XyM$z& wM/΄ uXbd4! x UE9#Ho,҇*uUɷ]7Oa0c E H>զ8@QĠ7CFEj-g|!,5p;1SHz^kF_^'CxSiM ;l,$Ƥ٠7 5İi ^!?ICwK6:&ܕ9UX5GID㽕ihzauWeqoUvITXVƉ~ ꦌoϲtcy9M.H I_RpO.ܪa1>h)IXxHnFQ^u1%VkI?rXcb{HPo O̮7QOj|ӖqJ;endstream endobj 299 0 obj << /Filter /FlateDecode /Length 4350 >> stream x[usm,jcf]Ȫ@6ʑvb8N7V79K%s Xͺ\*M*?7oj]O>_߯*_]^pG mD|eLrWW aAɳ4I,ɲy{/Oeb}ʝNrcM Ie&yȉoj~^Eks<עJd:w'aa5̧ag0žleV[Cj/PKqlv塻\.\brjBY&WW;ԛIG-umc;^/EڅDzGAhiqStexA:NW}_U&ޯ(J4m FˮoEՁXӊ]^. jT:ߕ[XuxOmnp_] ƥur>a&j:q*ڜP+~ۼ/ڪm|jketlj4i%nl`R:p@@*XgT/RA|p>& ҕ=mNܝAo(trjyKFb[ckuqSagr[@ii7U(@?47` ˑ t9h#<" e >2! ha.H٤I&3)]WyZdJh]ژ:ކy ʺo)"W"AjU!uJ8T]?IX>bˢo}.L?lyT(榆O8V2CY0 I =>TqA4>>IOtb4Z|((DKĵ/0//߽$F{yLJ\>X7Ha%\3b ޔj}k!҄F \*x4>qDi(q3>e˅@2qWp5}SǕ:h7 A;4j('ɠX':7E&J/ 34hnl`]UO.Un7+b2ʊ2QނmJq[n[Ս57}QA ,z`͸vam ṇ.!|;@ᧇ2454}|hk4rЇ 0]SNc$`֢kmno!Dv*` kPM`>g&#PF5[/ ZqEB/[G$8 ,EvoIte:?EzF j#:e2wZ" rj=VїBW3N sCy$Z\o['CwD'ATɩ93:k^hu0F`2p[Dݑ\z>jQ&, ڛOQ 6.FE#LS4}[A0jTp<011o\ >aנܻR&Vu|߆8/0B5?VGcka>0!x:ہ.h'[H# XT`D[vpNKu#mvQŁ%瑏mɓo3Gq F !uIvgE8ʁ#! OX"HY.! FBQҒ9TA 3`hy6;$Lc=X: djN#@שfOX=êøa~!3T p stcm~ƎC9"0JR_>4qL\Qy s7F%=ҖF6df#_7?^˗WoYV)z2&%kÞoZ*dsc%c A)F/H +d?Z݃F z6#У">q|;1TS$icUw}[^ ơ;Hq*I@vxD=T>.LC. 4!\z@XXD*mcq) 9%!9?K ۦi!DRfM5 ŷ`3H4,7jc~ M j?qh2sVUj&JDj2R7(=*sYݙ3N9zL@K+U3mÞ]l;g!@sVtOޖFU!pD̹ځZ5;CR,, fljwSXMֳ<8b~iب "ʏ ;Qt?+ LqpX:'7YT'jþ9J s%Cp> ~; Xզć!Fd1ͨ`oeyG#):Xk"9գ_-cU%Nzv->~+ p g9!zVChm$HDۈnЍNW@<3z~J2 Q%e 9T>RjAx\lFCgu0PBכK 1K%3:.(_ Z86TcwuC0\spFvy ā/6&2*7+LP?M6;(qy|ؾ+z?pa!Qn.e5q9qXvҰ#QG5g1f<&>3 Gh't)ˣ@jt 8!<o!hAU)(NT6 Hw@WݍL i3y6ɵTg nC&w6r; v` #a㯄0HbXh4&'l3_%NcVȡ̭vG1T4L7F.;CZ7mW٤2GOO:P=o·؈CZ=?aIEԒqJgM9S ]LK%`IByJ\gMx0+hN}Cɑ2{pn t x01-xoZnWm=*Ĺr>cBw*>Vmc&̃op03>y% /EQ)m,YE۰ߡټm4j+iѵ-j+}LLjV:bfIh?<ii2H@1Ÿ  ԯҐ 1$m2(LڝiZ լ%w(*13TlYagDZ\{#soglnM2%ř:!86u6Cj[É7fiROK%s-([ Dz8upaR V8<v6xH>c'n$$́7 QI ,x@gq:Wx1#DjIY0r9ݎu3jlۦԵSێUE9(I>pv4 ,.f:#MׄjD)|΀Xb́z17Ly)"d7 :ӑ!(z|4-a"%Q! 8^gcGȘ)k kP4Ke 42TȉʥbQ6^ pOop7f00 Ayy,p/vNNk61 Uu8@׆!~JVle-F6) d"OO&8(X>YD@KC|)U%=AIU\ȑ>XuoɉˢK0mNe%#bŊ6x656mv n$qrZĆ FT͍(爜TUt"H ;DIi7,k"1ɞIţ DC`q` 2!c)FEރ t8—?_2endstream endobj 300 0 obj << /Filter /FlateDecode /Length 1939 >> stream xY[o7 }pu[R9hm@(M$($DfAZ\ݼG#fe<ߵh9Y9zVj;3GoN:ŒyLLW }b1ń0 K0'% lmf(zYt +"cK`WWod6`znK-}˻ZMDL\DiNG]e_ 7 G`SV6FyQWݍ %+].ƌ8DMȌzE|LsJ~?6A NYnWM6=XH6_0[0 qۅ]@w>FJiɄl_ 1jپ_ut  X'yr*  FA9yD#(ϛ $zC." 6%EM}1 mRDġ&-E(Xd@qx.'ct>œGb,g2Hb;!9#4Fԧ2X2"~\uu񨼦fJGyQ8b1jQor]cQ3/Ðgg[<pOY3*9Q8eqt{p5z>W[;9lܓvk{>ש,3s0tQ\go7=9ԕܼW.z9:ԍ?U2һQd/tp9w33O337$%8<WKYO[]Ƚm$ {yOuutwTi}_7NiqاUTnڃaFIoriA+5b>VAó=V{2:c%N̶Ii4p3 gDjw;ǰF77'&n/nʥŸHku`@^dk.{?d+H»192F_^; ~ ؂[:c_Sk^9~!u0=w굁 yO<ݗ- Gendstream endobj 301 0 obj << /Filter /FlateDecode /Length 997 >> stream xVYoF~_+`$<$R6iC48T 4]{'44]GUu=HnJ};-7ﶾth7tނ|" r22Y𢫌4W*kغaN.\ bhaк%x ~^%ʏ 7#nڄ@Gu rendstream endobj 302 0 obj << /Filter /FlateDecode /Length 1253 >> stream xW[s6~W0N;3lg:LOv5 q:oFNf/mc]wx?ϬL앰{e=ZZ#+6О1Ғ^c;xlOG3;--g0A]_^J䇨/O 0M#2=4J`gn͝7 'y.X ߇6,g#ϝ5 '[8ȍCX 0R ID^/ۮE`I*1' (r:!!?z56-k%=v$FsGb8|gy=]ax'p̝/ts?3vvYq'15p$W k^sZ% Ew0?v9+9L@^D? mx5kva+'h{U9#0r#ƌY^]t3\u;]7+ sR8#t}iM8)Na#J6yg?IGpl/ӔߒP&Pw,F!Opv= ,xK4;sIV!'+׆u,-7pJG KA+I$gqw@ڽM7 9c:@uƠ0(thzV7 wv?ݳݡ2ɔ8ѱ+Vy1P]5$WӒ$낚k\^砮Ht797]i4R3-𦎮`C2 2 Yj?= d+?SR]CdRv mF Mte|Pd >A٨B)t(ڎ8=1Bnif ՋGw*! g #d/]fTɒV]}DF;HQ˫]I+{$&ilJvHoIuglyTdT "E耱 i/I MmdQӲO "LCq!j&f:)^]TL#(/) Np.7Cښ+WfqmJ&hյẸ[?>Mesץq\+GC!~!!P !i4dMU}GVZs_B3x%il'{XVg\Z߸yfX<1Cy# A[=*ҀX%۳y}C^OQ^}=2~? endstream endobj 303 0 obj << /Filter /FlateDecode /Length 1064 >> stream xVKoFWLZiKdRj.P:́W6|K6rVvQ E7߼xoژ0~^{n޸7H/4e[8'07;C*8cc 5!8p#sS ?@!V6T}Kq~}%cx3!3]urYY (-"mvHPH|[6AD";Y$WqGqlkm,̇'\# ū OO+yU)Iatx PʭXT3@[*p 8QpVTQX\Kw8`N OաV y{}m:H" +.As!,°FGs;)AQui ɱcC]".0=xW5[䞶&Y3oGN)^n+endstream endobj 304 0 obj << /Filter /FlateDecode /Length 1276 >> stream xV[s6~N:ŝXf Ћi'mA 9# vm7Ilw{@f_?'JKĬ[PLGk6ù m qi"m>ѯl7؃Z2KKul#3@3|#C}ʎ|6_"#G4'7KV6eY8^'IYӁ_4 pv1 bfmX&͕mo&o?gHTm}425W𙓊.FJ!j :@o94e $@{TZO-dsL)\`@sm!ojc 1>r<ۇ7m| a_o&%L! y{8=;- w+ٗ#mL^ /O4 %BQqF2Q{FTxGIeӛ {y="~߮/U(%C+:_68(>!,8\0i =Uc%m_}$XM s`^}lgiY0G9L{\dPuu% WP@2$Y_c塊d*\,T-%i׶[ sZ} e"1+کUOG]{Ig -&ipZɧ%n(lfJ4fݹA=]\ĩ7QRcdZ2*ow궚 SE= ʐJFt FH t;ED )0|d -TV4?׊Po7}/=d*' P\m`ڌZh;:"}>.G\.]>c_}]!)< ֹ8RqŲcQB8@Aw;/gkە3fG)svM*X_r2d/T0M;Q:q`Wh4ȧRPP6B_u~%WT-J4IHEH[k/>endstream endobj 305 0 obj << /Filter /FlateDecode /Length 1284 >> stream xW[oF~@$Uf=6fU?Uj>y0&T=s@Js9;߹<1> 6e6ֳE@}$%9?X-yO]0#`[ȳG˿CN.Lll\ug/>qݞBO Gth6ت-"-{FF`:99ej8JbؿY[q%q,T|srSf[s}7BʉGSV{clmG,;'PQpM@Mdj%z5%YGl6^ /qL`uqSc$t }D-W8@;x滁Jq7y%hORN͐qϣDC\A3Yo$Y.{v[/}͂n+Z}SC8ZKJB\A+(# 1EY%5G Avt[e1B.N1ܞW dMKamhǎ"1/,C7ÁrC38k6$9NUи.sq8H΢'%sBdeMqT']xLI? b1wkZA}"ĨszʃpQOu5~^V䱀KK4L aOT[UAj@s?M#_e=I9j"D jʢ;m%; bs-u[r^0'ST F .$¸9S|ld3±>gY1GH٠qй4kM7»'iendstream endobj 306 0 obj << /Filter /FlateDecode /Length 1012 >> stream xUM6W!BbER)zhv\TUk;H}H ̼yzrCLP3w;u]+%P8i.7r BK:,݄]V5-gu\xH1. p#0p"܀&*X0DC6o+_}"t+T5kYoZCo~1j. ?;9vz|Zpn@Brmd^l:La]_ݕw7 !`h(oʦ; xzTPupZY?TTVw,9XfCQo2?ntY2]yُ&˥Dz"GK Nh >iezב<0}!à),I[9tZMx6 0,RSBrxYyDpgeπ(y:5;?*A5Z LDz/+Z%'$đHL;i Y@_ԇ'sP_HU-2EA 1IbLb} i#Ʃm'-TEnN@4({n?fw{6 b=2F<^@> stream xX[w>' D&-+3{@ "Defvyu9{s2ߴh:cvs_Vp> 51ۙLD c4f*gD?p ˈF\^{Sljb-hx=ypHFݶnnH{X{GBʙaUHK@2&vvۼYH\P\:|D'aT3c@ B؆[.WŲLj%?c^f?"SHyK*Uo^([s^,[bNF2G8NELJ^}J˻]:#nŲW mUۮJA5z~J N3xDWvcf*i-A,?(Iv_/HbrJSV l|릸늺BOG‰^d#Zۋ$r߆r[7Ɋ[{@6os ,Do_DḦ wm{EK=%FB>oiPrEmǦ)2P"dɨQʳ˯^~|sW.mr)>;K4|2ҁ$4n~qbg?'M훊~L"փ4:&ϊM=zrxI/Z*z&K^^6 l%࡝G<j>p]z} [A(p)1RW+`O.^-C $pY\⚶"pnJK.$@ァqMMw|c zooHQXE>A>͒gt0K%5'g'脠:Z#>1/M]O|5Ab>ĒlBEV&p<|be@d‰ d^#Ka#6*XM2a: ׵M+H@!QJ=਑cdǻ@C%h0D9r~8T%俈{=MSkr2: "Ԉ^U_B{M~ж:.a _`6/\jeA>l2{ͮt!echwySzPos[jÂYQǑF3P,ZQ`*k&Ni@9A(i|B,.h" HAȠDme^1ާo !o>3HV%DX(pdWUPrvi{&<?J=M~t`&hpV $֡&1t^U|%ZՔ%"Dᄼ& ҈>+'Cn4Rr55cU{gb9k8<Wh^Ht𳴱 xž}Q.e-&K c K(/.,/3u" d`q\OCJvޜglهl)uزCoKhAOR'}ʖ<,mgM C9vCm?!´]|YȝwK4Ɇ bAX}%lڵUpJ -N ߀Ap4!z|qzswu^aIP&PH;D&&|xWa{w»PEϙ 39fg T.xq˻3Pmg)n? ?{ K R/m,C,B*dI:mϏcCaL {.J)Z[}]ڶ s!*r4Ztqaj*H"P-o$],2z,FϚ!O%ML|Adn~#2%Ta|'dt:1V H:Ԅc6рe|a[^lVYqBfRa`TYaC]@6pmAig5WltT$[`E# Ֆ72n#"ךU( d&aݔFSK (]@l;0aY<6wFK6hN (yz0~S(x/;ݗ; Ɗvp9ДN$Qkfxendstream endobj 308 0 obj << /Filter /FlateDecode /Length 3116 >> stream xZےܶ~<C7t.T)VlSh@pgqɱo/v-EzX^@/O7nG|w{zY۫xzwWWi&"Y]ᇛ8q$U2GLW7+]Sj|Mǯt,"._i?6F|#wWkj73I XfuUޯ7B(M;4]sU ',oڬ ˪9笨b;L7RHY{Qb]x kkv^)VNEl° ;՚; -Hf^rM0i~Mbe&cY,3}ބ7ݲc]"+%AS5]7;-▽ eOpw]QWZPޤcʢȂ ^]|yHS G3ORt<@nYw{=0h5 *vpaXVJr[9V"a5L}FP{Ty{-]c 64 -M+ _'Oi=4ׯ~ԙ.L31 g7: l4G;@#{~YSdoʼ[Hլ j"}ʏc7AC>"{'b={(fK5< |Pl^ A Ky`ᚠ _; (:He4G&ODH؀ ;56ߝgRw碣;pYmc -!qWyX@?B 0,' !kmVKH<\zWKǀ` &O.Ԡ#)3$evב{!|`XkwStpR҉\lܔ*RFӳјfš 6Ii5T2Euۆk(Q/]#9+/ל!PyFzL(9qxA9p\rywk)B|)-Ewn.>n`.8tQT&ܾo;}a\]+}%urVf7My|Q$0c5Pej7F>19*Cߎk~do+AQ%p7D$ Ȥ*:rեQ҃_=ߤJ t)Y0W3!œRڧ߀KJR*# GFb*Z| JHajyoMcC@WbpˠikX^CB|$ʊw(5ΛRѨ{?Ffr_SlP<糐ӜrM U>K`6Ҧ3a`[÷~^H*M;faa7WnCk0)eJ{ʷ3WVn bJ7c.Zo*vxg":.벥Yɢ6Id@ ͎8:!=g{ {>wÊj]~q . <+JjM\I,3uba[.e0AP(㔊3WEؿu@2iYg{ o1.? Byz bdWupdtc&6.صM/K]}Us}TfZ)Z)6/EqdCw"ߏracPCpj0NCSBLv/9rž_Ohy `dqL&>skϨX`O^eSX}\!'fOQ0 Q(xJ؏t\NWP-oLˡ55)G3 jRz,=ʬ|!7R4R"G[AkX7B>! OH 0ԟD#. 䁯?.Ef*_:u r4!;Alnc( h)IsFcܝn"C:Iġ151J1ǕnHi}Q{^O-/!gG0p!G;hɵƮ]m]uYwْYVk$Ӟ(V"1g=BtXF< UĸALLyqb(9d :(RA(O p$'͎u vym7pkMݗܣ;~>6iFZp;i&Jbf:vf )=k nٹ;-kgNk銾j6K E^`Y _uU9fUuȋc8J@1x,kS,E %t9;}% =nendstream endobj 309 0 obj << /Filter /FlateDecode /Length 1455 >> stream xVr6飾B?P(x\d\mNFe6)# "uq&=x]=؛a@0w|r s/l9|45H.A&"C 'Bo8p0 hk ̮EHEԂJ%=WFlfKz8bJd~Ԗ7B/'X7P|р)gƘ<nXoZtfL 3LR؇2*x[sڼ*)dVBEܦ "+0nw뢊"@D8B@U%_Y&|jEɋNsCtJ;ObGs莨4o.lY&;A^ч1mkqLHE& Wyф=~%I\4{tF۲l0-<Vk6L X/;U^&Z@Ml R${JV>쬇wC!ܧ,/ΧMm.KY w I/ۤ\iR0Ñ;>p9M'kĩ,Oq$:`C 'K*Σ&Xu\`d3z4qLHaRnCѷ}@6[Tװ 5D> stream x}R=O0+ 1>'Z @ɆBZ&89 ;woTp"sl:r4tkF`:sh:z^!@uiiL"1\D ^ G~rU/[JH7SH)GD)d%)u%Upꏡ˟L8OW+R! ٲW.l aݮBX]t%1`5{Lͼ(K\wX86mRjH s  o1@0S= -H],a7W$aoG!sWɯ`~ܤ̲}l1ͦӕ2'hOrDSn[>;*hendstream endobj 311 0 obj << /Filter /FlateDecode /Length 2795 >> stream xYrF_A?NJdbM͔<5q= $LHXxPöb/q>=yyb%3F/j;04x6 sXl3aYfbgG IX*,VBomM93"TF 7u0>\KczaxdL+N=>uYݭM.yom~'\sX bI-ڛzpvQuʺQuٴE}Dir)N~]E6~#^z:ʠ"sv{wҞFݮ^UI~ &f:*VmBv ?p)^%K̐KEwO^YR}Z_F^х'Ua ku ᶬpRɢO7ڢ$E%F2Ӯ8;iE" S{$: T^j=%@Bɰt,Xºa:,oM'8 5 Z.^]u?k"hrG']AlWNt=엙K:If'R:fHu&L\.jUZ+? Hx35ܚoj@\nRB!Y oρϻ2Q1q߀ lwᲀfcp [jЩirH{)1v;ܮSպ{6SFiTaV93P4 'Y+5o[&)%3AX2B"HYYBO(oY{S6~KEM BWe|v|qp@@糋|p)h @]6_b&iZƗbCwFu콮ժ-vb3>)`jQY&r.BLDelnBGe*ˢ'sL2 t:9n%U+bD8T8pݶ.%Av<#> WS)7EH{Sz97nۺ替燦ya:bد6@3]~^ 2PfRܾl29?\Jnj>ž4>Pd1.sխϗIXLJ^(4Dŕ+ߝ%oJlN1/KdG;%to#&)lIJ#!Z }:ĽuO=$aI`ٴrOT+K!3Qz"ߔ iyԪQ%>4'J7HrWia 3ضXV9 \eEQLһ%q7Xu&'HwZM:%kX{ Y^uN)FU7D,']Q&6zx4U812@B1A]J0^32>nߚ͖dO󌧏󘑤Xf9%#@9F H=T۶WPs$ew=`+PPm2vVOJNzp yLc%É(Tu{qu(f©kz/5}ܤt0v_ â~=C܅d˄(S#,fGm.T? 4`J5,`_Mxie3~h{Cug *jBMT@@F=aԾ',)v$vpq¡̡X7 !װ"X gźu++wiHKqázjK[DikW_3)``ool`~]1M)(ăK'4EeknY &B[=oZ{I]B?E76IH;)XN-%)VkNs?θ2xvpv{6Y7UPH& J 0bp-]z$F)hI氺Wkʶ޸bXP҂gGP7yKv6X Wpq4\v' IMkv嫕BVv,?R}EC7I[)mh\.7qYt'NeA֎ټ\jOI(M]t"b "rCM4{>RVu0^6횉m) B+` x< ĸ#`G:MvkjzU;-5h8(W}op0@l N^ 5Aes\$y܇UGRG"b?.a:$@0TZMP,@Ǵ7\F.w:̵m\*awZq;wbz}R0M(4Mf0`>D+c"_Mw _~@^$o!!RX'઩'!q-oPxȃG)k`2j,!5٠GvOec)jti/Hli>~26o~hո쓇W(]Ҿ<._ r:}ѼbNa1}Q]~~G$h (_\77YA=>2?X=nendstream endobj 312 0 obj << /Filter /FlateDecode /Length 2664 >> stream xYmsܶGkTG/A7MJX@(3wLbww7k|[gŽ[_Yѻ#NR8YiWG8pG GREye8M_n˳0L9G&LRGFJ8 ޲]or%a@ivմ Aﻮk|#`m^}L۵XWۼ^ CC\G/Ώ~=2qh63*6 mdSM;;9tG( '}ˢJeis~)뢤Lƚz{/خYΛ/e&L[_$ԋ% y 0+F5h=dŏO٫O)Y_z;Ӕ4ഔG)M?繹=ù/r&@FO\@ 䲌Krhv7۲/5uOvp <?B39@ T^𖝓93`힤2R8n{_xE[5m1.2 vCxݷ&HRc2 yoׯWP[-^0_by&d ,exTFG"NN'Az^֖3dA)M๲u0q@*"!`4pF+Ĥk5YQK%K8FzuVe"DԠ w*ɀ?23Hljee&i?| 9̀.PN/V]M[؀`/W2 r\Ri.5H ViiA bQ, #•ProJ$_@&a<@}ڔp^Wr/2V˛ ՠ"g'-3)_x}oƑ]oC M ҀZV3^ -^*NRIϒro?Az_mU}=E:e4l_վ. W"]KxLpmoAΰu&:O\ڂyۖ*Tn{rF5F͈KaBn4MfB%n\ Fm0s-Bd@<sp2TΖRA-`Tr,j,jUDc61Ls7Td@4Zd&N,8vm]jt^(Eg2)(6pNHsr䎪k)7U9?IPc%]fŕsttY )%͇{4Po~A^gҫnƠ+۶2e)} T~L /Aѣa5Ւ 殶?f,^Ag$LJi#}]!5ϰ94 AZSg6oNkD"#N&nU0Q'jBbHh?L<\;d1@ O:o 9(}_uHbhH\y{Y. D4l~\0 {:_ Y~SIW0wF[QUT޳'[tМv 5&wrx+oɉz<,Z$a5"pñPQ~.b؈b0^Мb'YB z /EZW,R@k=f&8OŜLG AB-jô~x]X*ƥgtk0Db{Z"c3Tb#-%<'=<|"Av`{}i 9:PyۏؖM/Qޛ;_Cm":W7eOcidQDqbx,5Gyɮ+ڋ,!y 4q'gZe 5 41݇m=g݁N=IP@oNѳWf]O@!} ݮϦ\@BPi=/nv)ؖaEX8$s cCJp"%lkeJ8Kgo!P8{횯tTȹ!? tyjwأ~v b,'Szq??5ful *>jɿT9[ 8j2uо)J~gJM©(N*/5J4JKSh|Dh?@㱕|tiB7t Ir_畂Z&œ,~N.n(FqZ ?xh~\٫={*.Cc;:Rb2Yv*tw0橭eQr~ 1'-vPU;{?6wMSwIu$80d 8>V1 l0Nַn&T}fAU\ն.i]~]Vag&B֯Gendstream endobj 313 0 obj << /Filter /FlateDecode /Length 2003 >> stream xX[s~dcMIǛI'\ֲEKP7^d/L,~;Ĉ,_rx_|Yq7R MۅH` F,N0T߰ kIb!'[?ձL҈auAA/PB&j HMm$&LjxF 7AJlqMZSѨ1UX@Gc.H0T",Q(_\xA&Q6 6 '|ӻ]_yL<%8 RkD}HBK 8Q}AXSQ 8c[ȇhՇ[,WWەՑD x$#{ 6}[d zTnoWH#A @kNŹ7j5`@VgʻM6:κb{2X.~~N9; ^!l7ѻvehsU?Ѿ+KCW)s{NJGivXۊF]7|)wCbW@LL4YZQ-_FhH I-Cņ=LOQ6b"(ˡ֌A}$3KޚUor;v6TK% +R2 A36 aF-/sy!#Xf1RFzh} Q`MA8 lz24χw:wdKR3Dd&$  zE,e#aj\ pI՚(:o̧˚= 0|N@Slتּ `@K+h~^k0Pёhׯ Qwx+kbz5@dƁWpgΜl(Ldo#ZsV fi uw ჌˳SU - @ܸ#/v[)1SPQHn2{044eaBȓ)sňcC&Z6QƝv0} G^P Evr95'R[i]kIxew*`Ək LL4ĜJo!L}6ihq~>W8Uۥ^(qN֠#3 OatjW$ d`~ 6\ c,Mïw}LFҁ[?aQoWZjtBsO A[bT,Qlv̧0 ͎!Ac y{ 3!gK)&}~#gJK~M(Nԑ&Grbkr֘v9 t*].(?0X>wsq 4P<fhx* ;-btxK6Ot/\C'[ <8H3Cy:hq S =zn>Z'4JD"ջoo>9 cwBr_FbrN}c(H̡XkhZSeczI`;MΥWij#UBjsq.TB"GӴ]n P5{$0 &;77IynenH #3׎1#"w^,%A@>EN'{d=,>N.:ZƉ߻qMwM30QPrVb~g54rf/c~i ꬿ=ӯt>endstream endobj 314 0 obj << /Filter /FlateDecode /Length 2339 >> stream xY[۶~:L u$ΤtﺓoWbB I-&A$xpp.߹a^\cՋz߭~Jǵ)֖Tn<ct Se몢8cYUet#sSǒ 9ߩ '6(Ff8g)Fs xh Xs P[".˦R`)5IJ{OvŶwR5SLtXwY˺ذ ly/ q}kj!LǝրQ `ݍL\\Ir/Do{Shwn w^%-4h!MģD%xI(7ET zvi@x|㋰\U ]^uV*-TԖWNzܼxQ0wK:cgRK+IHfBATE4Q|uSoꂄNR t*jDcWÑ)<.vJOQsuvdg B;$1BG@ j0FLװ|<N#P1o O zyZ^!@&cQ5!s8̲C \i6~ܢgDFG}3FbYQT l>TB>J*c׿<+ &%G .s yN*:JK9:ȘxdM0i8_RE1sEh.A\|?aHC=x1ˡ3A]APT\Î)c]QvLM\N-U?"yX O3:] KXDȡEn)Rtd1>Zc;la9DR,^ZܶՑrzb j+AZ@Z9.2ƲSlU>q.;Sӕr =+Z]MSh_߆&Ns|o *b؋B3Mufb.1IBlЄˆ^o޼Yn&x2x L}HJ Ëiy>Tq d<2 ]Úm=/NK_q~!2OyJQ Z B°raطRmƜ.bi³1?IXbKT6 k3-,ә7WK68,AzE#F$.|L̓~4N@ӤdW /cՁpMvy3*A@R9]/M&z>{!D~dInZۏ %OӁ)Ȧz4o%Gz;}@p \0m(unxoHs:Act7MضG}/5N%gVܶeh;C٢ƘTbI-!('cǓq؟8T|SzzaxG(3d"@fEw8X˃P1%Y="_ Ɂ%}4>h)aB;و]OB q ѪYl*K+š|6 *\ω'ua#z?Dsh vm.o؊]mqHb=_J 0O]gxsT}(#_7^}9A),ݑ΋Q9"fb١O_xqp0)(y*D`pj ثbp`+h܈[EM4|Stq ,D s'~`TXq-2c2K:!zRx]p qp7Bp}\i!A;TOknĉ$_N Bͩ~55$WEmM^ 2dc$17< %7VHnps= ?MR?Wc~߯ 8]'endstream endobj 315 0 obj << /Filter /FlateDecode /Length 466 >> stream x}SM0+,2c㏪RE${@0Qذe,p ޼y~B0Dw^.}S'h^}*|?b$D 1dB"AK@R\P(FWꦩ#)uFpwƓytzX|d5F)DjPqJ`EyJQUݞqs_vv9P~/> stream x[Kso&~\m\Ivl-+9ZHHQ&M~~ozf1\{Vl/תpq7}Fn_HiEo㲐T"U__/ZdCF7 92bb|q3|P^s #@, o?ӺlIG^l~G^Ujط?a&=[wϳFacI֩I ,HjZaGv\§jM E$nmRM,ЦZA$V5FNpKЂ0J5|!jNs |Ud֩D"-$J)FTB`PnTrW-o˫CV#J2*;ӯ C5Zzyvrn 2wP"; UneLߪu=#n$ dZ܏U>ওg%9HOZYmW`+elN͜l؜lйNO,y*bD-/! !0\q!3e%H+"Lk@1o\vw>;k/nF몃'q㹓0%a!?6Ê0oUSIMMd19tGI+gX q4׉ɡh5u/D4#N|g|ߺi?ٱmc?K|`zo=vzS0 Z[V-kP9m)bL3Wץ4 %Y 3/yA?endstream endobj 317 0 obj << /Filter /FlateDecode /Length 353 >> stream xRMK@c _}{U+((T"ƶbM}I,IH[$%dfޛRۜqJ ]^y`Խ=TAKK]J-& XxBfsqdF Sd_MQnL WڀPnI`@]ƚ> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 319 /ID [<5922040cef93ae8072b587d3af9c0e44><42bb6ac91754f83a20c86f9e25b5e85b>] >> stream x푿+Eapr^I.eaFX HBP+1Ȣjt r^$8ߏ|> +q8tߗ侕JeFP>pZO%6mb8!fsbFL_RmŚ6QmLZ~&KƊXE&1,=5g龂E}CMG\}S\gf ݼ/ ' 6Wѿ#&yՎ 3.1 a:SeK~/D":<oKeV9;5%;: endstream endobj startxref 220506 %%EOF RandomFields/inst/doc/multivariate_jss.pdf0000644000175100001440000244266712412655465020500 0ustar hornikusers%PDF-1.5 % 39 0 obj << /Length 1909 /Filter /FlateDecode >> stream xXKs6WHD|vq@D7w_CV3mA&.vQ E$o/^_iSe 3J;4QN/:l- ~j 6-HR[mqx] My@>-~o#>渥O[Ջo+&h댥Bjg<^▸x׭W`] fPS ]!_Mۊ,D аp#`ʦ&XF%q|nd2 ޒ(vT8Ze A[ҰLFtv $eb1Nq! oHCdGm[MD׿K44U݉kuKⳄ~xIdoz ZH qsv5FBגLZz Ԧ*v,5!8 1:n(&;XmEG1oRH`\!N˖u 9"ئYU"ù+ҾI_d)bg-ODŔȦX%ҁ.{Z-.ΊTeu]|ۅ326TAx1 *YLT ~]<` S Yi\ցT8 Q fdRDY4.!],_!'친ܸP o ~8B(dՑSvH(ŤO@HOzمSNq=P5j|`h@ xl[x@00]6ۓ)  )6^Q=0֮nM+e&d@S|%Ar{1V#$J4mNqv[%ٱ^ )Bp33X]gr$8|c]aaCd"N g_v/F1sqchT> {9J ~)X{X{"#Mʌ Y%G)  ǹuƄ xԼg_k/xāeI& V[}wC|HI4'`J^3prc<>y(v'  .:SuX4U:v8ֲs3Mdi7hP7ɪ~&Z߫V5Ջfd9 11`OY,A;$9azvP!m `rszE=R C*\1jDGDdbbZ)LhFO~:MfC(a^l:Y?D.F:4,#T+'<Ղ ZK-LtQ^V< c+v`ib2)LJ<Zf*'|T$ټjY/m#$2 1Z'Ցcmvڍ#χ(a8}1B  endstream endobj 92 0 obj << /Length 4418 /Filter /FlateDecode >> stream xڽ[YsF~оU&S~qM*RmDBc !V~1D:ɖK`0gO_4ˋEy7W/>{+̅(lͅF9??{kUHPZv;ooW_ƪE:@mJIt| =Lڽ{kΔR[ixS3)LbLapwәah1$X/Ct,kbaqq*a/q=Z% huyiM)n˚-p9-|0ͅ$~)EsZ;O=LmgZp jL.mE?,lY)'d(Hov{7)dg)@j"'W^buC:챊ul׮};_;Vr8q)V +ia&?aE. [dUp@NgC6gu 8H0Hu.n.TјƳ!5]X`YK*'s8M!J[RJLa4Cdkok:P:lW/ʆ H2YDP]naFh|QlgHN\pٷN\n`p^՛CF}E>Xr)&[XOt"EkOԋ }ɝ0MQU, H؋$Y%΃^]]hv>oWV9bغjxnsBBT &6hogMKfíh!HEDT9. Zٴӷ# ǨBg5N`g8OgNTkHWדDhA:Ay yth! *!"yv@yHؗ*G,q0;b (4^2-Fօh6y_a.r_\,&{x~C.'<*RZ"` 81 nmٞ{t|A!<ٗ܇AaЛMl3mNӿk+~E2H./ґ{h\X~/ݮwe'k <=h{?bv6?㼀~D<6 Nw 4dP¢_*_4#*gUMt@rF "g|h]iH Z5aAoz9  URy1+1|",~ 6|zntۺ5ݖ_s6s=箬uS 7|ez$tPW5ߖo;? m{u4a=xXb'_n{BRcVi&(2̓\oYh!'mqM>Bwo5MDen8 +48jl&1Xd+;-%ze7S,v2z^3 ?Y7ES3񗻀QnN#28JdXW첓,feSP(u=Y ǔ/9lKqս30܈[ e@R e ^|ėMv=24QD'So>~!qn-j*R }Q-* ^^JPtZِsGU#ѢgΒjBxr]('MjPlo vF>h`>qOpb l427:q<hx%A!&\Pr&.rDܳ<%NzOP{N!BY}YM#>Ջu )S.#,K4a.˷F9csߴxrqJb;9-(_gwi\b0}&7ӮCUIm 9Ηx&iRfp'DJf(> \U)X9 é 5}qЭ]nr%euצPrx_:\JZ1fd87 wb=`g=YB4C0ab\@JA8 &TN^ #;¶U NFr`VUi\)Fk1pq81Z'_W5UС \RxZႬ”#8JDUρ?<wq=~wLA\07EL8 (} R#rhgdeQd7Ž ńuI[#cy+6m]4F08t=83n=diuM߽* \NMB\GyʞSQM*kV}1O=O!OՔ:i8݆+Ӽ0Q̟*8OΨY|,. jh63OD\7qy@]ˡg iv>>4ɂ;{xqxN1/? n\Bx>3)i}xPLt֨nwWn*P&\͙ܶ1Iɝ<~OxUS`>9#.EXJ2nFqiәZ6I7![ꬲT: *^#AUI 5;Z%"F3HFJM#p- +Cc*^*"LjQ}еp!57g!ud{]fh(:{%`KYYטѢt%J  R%x].Km6MaS/oIQµa}e^đ=׷"pLMhĽ#C-IS2eӿ ,ҨIRUj|kтkH/3x%icv$0 q̳ -)BN/ūUSNn`ec=V:T#dFBlHGsAXe`#(O`ijd%jtϯ^zi endstream endobj 157 0 obj << /Length 4424 /Filter /FlateDecode >> stream xڽ\sTjƼyIg;$m6L:y|Ę"}wwd,.6ξ8+'U9>XQi'FI=89ww 63)\ [ ժzssl'0=\[no}UWd,o}f{xe;ӷn⌗?_|W\|RU 1"cXd̤l]5\>qƯ!DF+fe\u .*i;z/-J\I"?1pqP$f}E-Pƹ5'Vژ8'Yi"U %9L;++d6-;H=D=6,NVN;?该E @ Ӱ=)8q7(9UX@fθ`.leᓾst%Q*a„f[?. c0W9/L[OD]i\wtz_$怬Ȋtpd"ʀJ3Q.U.ġvcErJHPҌ`kӨ`_)9s/J:te +z=Ԯ.(tѤxCf]+kr>e87]cSVJYq]u7=aDRC-;#k/:>ΨcK.YDV5RNQa~ٝ鯗 ^Y5W'D9ZW1$k%quu395/s195bC yP\Y j-qz@Ƴ{h}ԙek%j˲1p[,kVbC &HTLkBa rBp!tZznжe mGbCC/L>DcPzBEZYnco|u` 4#AJ5)'{\i3S?j@l5ғA_~M7d# \VFM[Mޞ]=ZL <qAQu ҷC}YXG“PEET~)#i;a4RwQ0Xq-ylw݉gﮨn ڎe`sA+/ũV# G}j|=_6el[ŸJQ`!:8YS+MKӡQ~ _( iw1AbrTCm";[P @ |`A "\ L`/!2F1  1L{ 2 aϽ>XDdZgy齫t6[i *abLWB袘߬iXy#F "<<~{IG} ?(vQnP4/b(bUR\'Ĉ? LKN$</\NP~_ cIow;:=ϭ_DuU7Z h}Jn?R=vHm3R'Gp4;EG,2}`/}:+?x97a5 Ai63 G6a4OA\*W֪-*9}MI NA97-LvSh;`Šш]R] iCfu`VhJ4HmGcΫzƞ]? i>q-wӄ9f/J~5n}:B~bB+#"ב`4Md fϱ^mE\Os՘5Җ'}qHEB+׹Xz&Ps }vMχA ņH$LH6`\[mVc?bobJhSho;oCj{]I U-w.:m>D+W،||An<(r!1M/*ieL8xq$-cR^k} Aow0J8!Ls$AypPto76ZB}|Q$|E" # L UL:AL.,شWWO na 산-GԙM|{ 4 AIQ3o]1>^s^ WfHfg5ɺW&Z ];Wef[ q2[\RX凹rC~Eeutgn'MKD'(T3>O@cчT UVR@1\)Zo mK#6]l\X۲hW!χ蟳`+`xkC2id*$cxvI8xMZ./tY) 1l[J/|k(&Cjh*mD @\]VˎZ R7Y"̲7RUMad#Rtj|ca om)ma=~GD@к~Vqwm5!ܮ¼e!6=NJ#cVU>&j5C'tx΋Cpk\v?-dM'x,={a `7E@/[=j2&3r-50aml8:E&#d/{C"9!,4!Dum)trtI0B~QJ]).%szmEy«Z٠\!ucS;.]qW` 2 28uPpw70/R'-yw]>"[O,*f,Gy qC@䯔Bh%T!rzK {*BZ|KLb4(恢 &<(/O u90 t@[!f"˖Rp!ch11 |u 7T \nC* 0BJ)L %1[jACY{/26& qcHb|&2 !`92d$8 8c#vdw_%emQR fN%í2?|42S۶@>4p?6ټGb"XBwQ &QIX(}qiSerXYӘ b$`<|w9ߴ/V>%nN RpETMS%DB! ]唑RHg.? endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 815 /Length 2604 /Filter /FlateDecode >> stream xŚm۸S݋>4C mӼPme׍--ovb%Yp8䐄NX'J$A RBk/qNPE4 Hka 7$\Rw5{|d0DƋL)ڑUE0$l >k@Q6p xﴠXKp " #"DZ+ր1lA5HyTИ(̿hB0` V%l!Oe"w&!r{t$YVwDf0L`b(S pguwD6ѳgb|#ƿ[1~.~'YH%kvɏx[W4?GY5Y՟&j9IͿ4]?TtWKj'[ARc)-6fͻzYCp_TWaF^zO_)|b|=뚵4BtV,E"]BM=RׇenS]~]iEDy/aN6f:knYԲ^T[^ Qo0ʔx%/fѳgn2u^ 4_իv+/tV]œGr}X$cz;ZMB\35_ގTޕ!h|.Fu<ko2Ұ F^I <[94,ks2[!Keӎz1BO׿ۇ]lJa0F*sTk ˓^1&Y>7xr徛{\:>!ƯO:~lI!DP8.ƸD[r\̗Td9>)KYR}4,gi!K YJRB,%BQfi!KYZb.,-fi1KYJLC\rr у/ãvÍZJAzz ďҢ΍alF Ҫ(Ck70Gؘ}˜$#IZqZ˔il^0I5r8B(J9|]??iimv@6JER = #uP VNmH hGbp[/7NS[>En(&mI. bGA 1̂ 14!1,q<Nc\=9l@L=x~ Gi0R=j@B 2BGfIwz>] ?XBxDF3ءAa bഺS u_>"$V.Ab@fb$ij=v>`Ycp!c e,&DlQ/ ³TaфEXx"(w-Ǹʟm}oI;1$#p,ߺ2Mv0w/ñfV`)U/:xf-)BKqGbJ$&i٥NшFrG"z??4hTMKD+AnV'γ GULŋOpN9u[ e0A< "D =xnWǹFia &ŰI"tp(r"A[.[yjXD솂eXΣ#sQB | Fj([2+J1@VYO)KFu>M>MQ&Z;it~㪯Oy(G1 'bAо\KVCr-ʕU)W[E^@RIA)Lg<[Q)ҢߡRw0'D,xq̱wE8xXb?.d-f)>BErVy^tȁ϶4 GX"Cl5I{,K2_9s7g(i;A刄=5F۱Hx:䮩?E2C#"ajD-ӘV{$׶]$;dy=cA4hz.’#g^ˈYGk%Mg:>ܞ~xwv;R0x)bi* X=Fyό9Ϫ4!K࣭{67c?;}A$vZN!X1=H29y20jS5ıt;+SH)1tIK`bB/MSA#s]6aȄGE=>8$缤߲}PL%(Gww0wI_>XrsoIC'/\M endstream endobj 193 0 obj << /Length 4566 /Filter /FlateDecode >> stream xڥ[IW̑S%nɶ"%R %_v7@p*jD-[loқw{[ߘ4mn*sSeRn}"ݏ߼\ȸ2q1͇xkkow_Ǣ(M<@Y%eOq6M/o K⭔{fyʾZZ'un.Oiy[0|8ئXZY}w OUgi< _:tهxX<|݆4':ZCya 7N:5m饎&K\d&xpxK<޷ olikDöj[g h-wH#k~Qt.|P~=6#V |p"TnjN#MlduǍp4w&'=,G&M0`!"8p% ~=ݴrATh%MΏ޽,~vK\ Sn ef3`*s/ .CU95+$Otۖ@nctu* S1 "+/1z%oi")b|]FCYדrroBBŝr24VK>utT>T|2u5B;@ȏ.-“UمAGC6#j~μ ! Gܭp{,qgN2qڠXFŠ(?TYN\ 5#:bȓ€_dlVgGEQQP .8bܠ?u?B(כG.~<yX! i}ߖu42ϗQ2ȿQ=~)/9'OB_?+8eQ7:ˬu65fV`[. [~)Z "am߉yUxi=#]/lY5SAkav՞0BC3g5b^2\S%/\@ByWfqZ[/3\#4^ Zc rG}UYbI( HoeY}NjT$K5VBHž;&ЍБ,[ZsRIZWC; !td ?%kla(Z/W180 ,6ܤmb]=vJSt2A2_9@*3ѥ?FV.+ƁCX+!(AqOQ÷sW$Vl`Le`Rv>AuDw܋/זP7nI+{G'N $أϠ,_+ 1(3=" "+PI#rOܒȦx^)~jTxb@ZZɢ9u ϗbQ o5#(4]WJU]l%K{SXF{k\ykG;3I^*Mқ2˔ZI 2SURT ͺ%bAXp=6sDqݣH(%k*AM=TGYMA˟Hi E@1{pxcm ϦH~~4p,u-QxO`%a~@5nU2go@{cծNSҝ9tx%Y`&-)gP9X_ Uq̿$+UB#xVǐLa5ekbedxsˬ.@?fƜ2tZ%Ȕ!jE~>xu S`z8Zu.fjkiFxz/KX3(K3ZlhC@g骉wȁ O &< Ѧ>M3ǗE6VuXҤɇ%{K[\cvne/fbSřee?gcoވLI}탽GE U۟αmh-0=r(LyU̦=(*gs8>ΉK[Iik6xni&eF5Dul5X#=8+L::A@uR**0u5(ɥ R:=i #4/ęMJIFvݲ2qSt~K |h #㹤( ږ^*oZWYDN={3Ei|1U>1M.PUnlPk dx#}j^\z:NTY72{\Z@&c `}Q-na`J"9q aEB⩔|-klRUUi<hE)f.p%2.cϼHsy76S+7,|~#9G{]Ssз& y `0c?sPW֫%wJh<çK,=JWQشel- F̬F~d͡I([9ɃǙJvi]La@H1:cndLBךE &0Wj0pn";$6G7_nBΝ3S;7maښa$( %7GΚ0s4=/vF]Ɇ&+X͝tAF%'{b822fwao K^#+b$PyR:;NrtDw;*q20 p,^ Fk(+遖̢,Z,y7RRIJ-KAN20pq##,HM|KÞ vYiUMhP^1vc\?c/ɚ|.|m/6rpu${췟|Ţ|+_9)nInk\CCG6FvWg拟Xrg D!./S⯥N(hkmMYm p z݊I ) vG>'#ԋkNP>X8Ng^ryLC[_ț=ju 'xmeٜ4m\oWJ*.;u䓕^q_t ō)Yo{tw>b0Ms޴5'G*4rm&(Ug 쫓k^L",,D^#ڝOcx.Jt pP#mS=((gl;pa:sfDe - +5q֑0uy]"^jJP"ae'Lq}!#MA|6O[+WW({6,yB9~5}|?{l3^CXN*dFF(vjβiou@Si_]R/ghCkPZ DZ_hz=7cHح)1"l곴NL,A G精vdξkl ;b}*6^LW3*}oJȉڤ:vGLgY{"~zdǻW6@ endstream endobj 224 0 obj << /Length 3961 /Filter /FlateDecode >> stream xڭ[[4~_t1d2T ,3lM];Iwz:8=~dQغIcM>\]|Rgu^:;lNӗj;^ΌӟMWkî-wϸz /{>j'bk&:xh #{[ng_}+- ;\vp*3Iv=."߯1 Sg4"c.rdVj236se me%aRMHnp|aW;.}g^Z˧Ɖ h;{KLYh #eX|VZeDz;ܧآIX$Ixo*KfC$?Infϧl}kR (]挞̔lQ3 WT wh)ϰq)Im&}t^hJ=3U`Pd:X]AyjȘ5-w<7|T}@-Pp4ӟ={ײBGp U0yywޫz޺<],齅Zg0<٦.*tF qyyS+^K[O.Td;~N@Wޞ3 L)9hdc $XH&71zA]bVCdܬ"BxU2Z> 2O߳jWO)bZ? 3Y*π9 集cU'Jl~9ed+h)2dϓ'2Yy~H>qj{A;!4~YEpMpNVӏF$nrZ^AUflٻg9-@2b"@I~\߂g? cx\ɀ;#).BK2`|/X܊$4dߊ{GU4ՈăpjTTDcPP_U*> q42"xa&L4$t4.|A\6w(WeZGk@sIPG=R>%2Σn!p7/f#?+DUxe2_pd(rߢZzo+)"ڞ,eJ'\Qz}'|2Š)jlW&mWWT"N4DdO4GɁX}x3naU\~Ll QG&i+.M̹I(87̒"IQ,%Ǎ)ޤ H4E &R (Q 2\ɏۣY:S,VtEZe2Zw,o[6.CzEVk(}*@_?N2C2FM4UZ?u㮣xI'p݂\'d]Lp6L-_4ww}15`=c.茡aM6)$I}9 |8sYu?/G~R?TbL41N;;Հ'ԃl%2GvqʬFb㡾0}%Kb&/둝kzOhCŠOPu% r[{oğUisyΔg9hI1kIXQ~SP7kJ(DRCStbHNTWO|6@iMYezA0-i^[BT~K~#g:{ᒋ-OJu}YJm4wtc2}T s~ ,^dd[cN\]T Q-OO$NR[ L0vRΧ@]t6\ Yf|'y"0ǶjėͭSNǪwĿ$\!?Yv+%[BH6ƂOAz /i2*ˎEܧ B /r:#y,]ú+;!A˥Xc.LW:X],(L*KMpTKP&+(1e|*f"ҍf[J|$LV๬GXV` c׭IH\q^B gv-KTԣuIqأ8vk dtMuwk{xSwJV`}}qt- 7:yjWq޸ʍ__BLŕ]fҁk uH빸pm1pQMGޙeF-MRbh)VaGLU*0{J¼x}YU(+B4U鄬*d Cpݴl }.K. X>qp2fXSP/5Qə:٤TT (1Zdc shy)FM`?.U\M)РdO% ݀J)e=?oF\İPOH>)1?@>@ɇwd>>$AW> 0/p؈ endstream endobj 238 0 obj << /Length 2944 /Filter /FlateDecode >> stream xZs⾙<\C*m2NDSOLO,}Am%3nk,s9?zFt J%_Pװ~vq>V8WJ.^q NrxlJk2$&ˋl Ͼ8Sp2+dJY"}֖Ya3-3$ UWՙ ]zUP/AD,ɷ?j % 1XlrQkv5HXUȡ4ЭFfڶAiJ &Ic3ԛG0#oinCw{$^Q*nstfANW.<Xy-t.wMz@!Q2YସukᙑvRJNU͌nN\}(E11H]U'hٝ-{vĔdX:ߓwȲ~5uԗk{m 1*H1Cc1sVNdv)k j/>q9r\e}TnuN:!V'qo/G !*Wfޜ&Kb,?GANIc[SNsWųp%8,s0'bRM0 ϧgNJ}'ynQ@`B&s7 @Rs$O#Wz&rq>S>)uL&nI-NwQ|_>87!QvoX,'ϋ-{83և&I7jwtBГ5 T2T)]EAOuw#k%됂Q '-Eڿ&*ݭWJ!̺NIK.}y"v˞ D 1~AtzMeͳ$yt'y_Z2/94le C Jb; -Ne۝b %5-J&s v4Jeiᙁ+ pLWc|2mO<+tL` 8KM(l meWL *cwDeGmx" ^6e+ =g=$g%/VA/2 L8"E`Fv2&IR@X٣)SfҼJbÂ&CkE>"΂xEnC0:Ϩ!; HeJƥݽ(uf_YSum3M3eu3̗)ЀqTp韛`^%Բjau.䨢UʜЦ=`G{P%ġ+Tpu~*寱,,S(:Xy?SZ,RxGZ]ImznI+8{ԹZF3}6 HGWAb F-6[d-р#gNyH wV+D9WӠnoބڱj)l`xѤ ɼ=t̘0C)ó>cz,32/j*aDN٬ "eQF~LO2JK1T=a2eUPXFќ5F5jeڰiH_.OmOq n._JP]S%x6LG<%VQ;> stream xr#]_R$|H79"i̡֒>}3Z+[T`Fwz"'^|=xR%E#5_Oj-\&DcdT8Ux-3ctn9u5\{/y^py5'dH_;lG)GxD&l1GYxoW?qDɩLO7Hri)"Bz7 9FTe=q %rw˅(Y0 ,/ߩ_@!7e['lUM̹2o GIB]Ngu]DpqՍSo k޲Ǖ_0uu <^0*ށmxĈ5] ̠BtQvO<`U*EAEo ,P_FUx,ʂU!/(LP.ԇ0}31b؛#apz> -_#feg$d5x7p*:Jx`FVI0]`tx{z],Um\ȭ6h.v~y߮^/4ޒN\]KୌS魯m8#j.>0  6Qb?q*F@wIgK5w߾őx`],Q7~[yw967˧Rm]RC;f'Y7 SK_c+8yzShu>?kQIx4yEnؾxJe $1mVٜױcKvB)Yͺ%+uO'jΉ% P8L,-<6?dhԅ#B! h('j02/kRC.; XCpD ]FZ$z eXTdDPSV6fP ?µEV(nҺŋ>n\\|2߲VVH>Sd @ЄjjoW*|]v)6}yv:xw +⛾XJ;d*͛ ]&4}Z PcHe4Z M=K -g z}yG~_Awȱr۳Tp׾T{ 9ׯpww m7v_x!h_>7 wmLᩄF7-2A.osZ!+.USɡ1e"B\D<k|:GeEb$ϿQ2ߌn}O.:jI&C;j]?}{| ӆ#wj1W$+b}z75u endstream endobj 232 0 obj << /Type /XObject /Subtype /Image /Width 342 /Height 240 /BitsPerComponent 8 /Length 17677 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( W1ۼQˑ+ylQ+bPȽ:t8=+MnuA-0p:qF$Q@eǬ8i'W <:Lj_ǣKc$N.ALߖ2rutw&ƧZ[\=ͼ#mS&PbhPc^ O4)`i8.`(@MlW?xFP5a-70ܤyw2j28Q8A\ilcDy3UɑNT6h/-AT =<ċÓk;j }=kDZ6ff… +TJ( ؙZm^Wi H- q[$meaAEs_\ 2R 7پι>gVUTfl'8`ZS^9# m'ҵ+'Q-/,o IJ9ǯSހ5_D;/ݱg QoBO#+^k33z-{WS2 px:PSկΗ_ iLaǦHr]Ŷtmg(,n~ۧ]lDmq3u,aXД?#vӞ6bwbXc8*bP.,~q4e!czS=#ր+蚴ښsk͕ɷb͌Vڤ8 `;Vc#9U'joaYqig;ذF>Xkt }Ur[9%<^uox]pˑ7|A65Ŝ6ٲ, :0$6ċyG'5X.u]^ {w<0^8<=I,L:` Vcx-GZ 8ά?)}r;VsOlt]rmF[GX\"w`(((((~ GNȻحʊx`GB{P8ɨMUl/f٥ܑ?5-ol,?EYߋ`-~dWf?3vR| }UlL6ys<=s ^/2;Z}Q qVGi$d_ګkx.n/a wf4|}~KU-(UK!-mU Ye$/G[kquyͿfcs(o¼sIJ!'ķqŽגgO_|nHPYzPWq< TzUIY(ߞˌcg^ukjEK.WĺDTvmy Iy?Η2^=.}R{-1C{8=~G.K4Eo}KmLM$k7kʩb$,[I+$Y(~o#YzVOO}o#j౷Io4Qc8*gݟ¼D$9j&А;@  a#SAxH_P{-Uԯޔ-yvg8^a?ԷWֳPhfFEmTy2^ =RX5RO5'Ժ _3KF/ QΝx5 >ns^wmglxRXaGjqW6k_4jĊBh/Էqy;UlߥZSTV?uk`.( mN~m?\qԤphOec~zgǷժ/-KTKh~i"#0"uL&EUQEQEQEW#>ޫ3y;c bT'rx]EF\R|@-WekZWX#F AS\۞z]/THm#S?/VIҵ ?_&xxu;#~}@GjCt#PtC rqx(>_U;# Yk@ϔMXʲl)*]Mdo<)v9*?)dqԿM^F階@/_@QX,_RvG[vv_& )+7yNύK5kըym7Ւ}B |j7a\mz89z*dwTQ]QE`QEQEQESSN-r<ϻպ'נQUb'%Ny6Dt nz9cf80ǜwg?ªMR-}ϹqׄgJofI6@6Rv2$vWuI)&XzsUKHB3I|=Ԛ^-;N/Dʦ z)"JIl?v~Eylnd3v< vGv63#Dcy㢝NY[Qnw3abk,BGPqN2E!b2I<}07{(qZ΃rEp$k;Qa$єsZUZj^z`]A_3?7 b+Ȟ*哱qE4t70BPQƬǮ2V9u& D 0vCpdErsT}n2])ug Z [_JzG jYB %tҫGnAǘr^^69'ta5eV*R iMWx/.Фw qW8Bs5܅qm+NqK`iF]@sT?efm/SkaO.GčJW vS;>wyg,7;FהCnGz ѻ-RFvg vtr0#97_"7ub qJ5X:/h Ģ)Oݱ< `֨M/9mJB bH9z5lڠyH~pGOT'/Q9#w`lWU*t[ٜ((N Ջ@AiX%8?/Q׏zoY扭\Xg8q\m]Gŕ,0@9?m~[Fy1fBw}ђq8_zkz2g+^fͯěۭ w*Rmwgۭ]o$6moqq˳s8m9NMr[̑̾gSfw;y'q[Z6sX żHbŻX90p񄽍K-{ץnd{-W4lmGpa OUV|Mzo Ұ(J-nHNx}W3wBWQ:h9r'LvĎʐ^7zw9mҒfDhCX?5T}d`=wWy^Eqa]ő[9M+kUNng}S m8C[p+8B(( ׌C1 +F;+:×.ƽO8Lx2mUdLǓUq1)wSXHI =PGyqvRKg$#Wܥj-1ܻ郑J|0jMem3K0j eľ`H23bKΛ؞TV*FW.[hY&m#[tm0*y~71UUM:GbFx1(Se?-09jm65߼ӧԳ26+gק҉c[N\.enk2)pp=Gˊ{h!Xu瑁DaeFO1O>r:cex,u[>kX!B<)J6}vxAuiR}7RQesfdLMU_/ֺ(@藗‰ki95wfnsq}Vh ʓ\K:v6L163V?XՑ_JVyAG\xi|A3AJ%S#oїOYSoeFh;GfbAv݌uH! VV.gq|HVעuV+9VT𩐬`/˒ҬI:HmyޠLhcې2IҜM![B(H]}ACn`dd;s?!Z6vy. 3psY}w6zzc_;QesvdrNEi䗐M_#9*=4R"(`Ìq)&%ۂrɷ+$]7.)/N,26ToK WhbSn2{RR&G|*,s>T347A }z:Km\Epmlwp0cVMqSjZ5,q&2U76:zW7lVIٛ[-ͣy4!qds-9?v<(f|Q^Qmw"n (y@sχW˭ʸoIm;wƛUnjR=.^srO3;zkЫEH5\BQsF6y7b>I$H0[i3ֲ;JRNߔv98w$a㠬IIk<͗|Ls#Ҵⷋt ?f-E% {/"x@IPTֹ[ݎ%'MA]6c`>=&`yVQk]<]lcR1%c!8JeSn|H۠i+~^Bk4G8⤈+Uh"dY$xǥpf#S気jegr-N9jynK"DQvp՛Y,j"wB9zu5miX_IWS~QEyFv:S\f$B|yUS k$I"wU-. 6v8HGVtPثp^DR1*0,;@#$EGHRye"KH.Q@:z( (2O E^QR_?Qz\<G#au)Wh\9U$f8-`HxxZ YGXz՟E%ǛrPO8=Exsߑ3SF-፷*qd*kIwTȭqaLMAgH'bYm2r;1QZNTg@-lՙ6r9tvNx9"uu3dvk6[N%xj5Qr,C|+G_ zdp;}^ic5Ỳ)OiE43Rc N1764~㨭9pAg;F:bf1*߳;NytSn*:- ;" 0GNkZ!11^^WLs7|@+L_qݣlWHD ]C;*A,@fx/YDEol'~S͒ 5eWRCt-Ldc,rfPG 5G¦euX\CbWWs,LC嘒P$eȠ~MnK9,nxk=B#$ۆ vn9tP4gn1` p}ֵ݌7p3&HaƬ@ ZPҲYZFx?;7z~!sWI)#×BQֳ9z3J_ď<-{h\m Pc-Wn pH\kt-T |ۓpN1ի}qxQ3xr] NVNqkB:8cz/)%gٜlϦz#ܻ0@$Y "tF~4{9 (ɸ?Z,uRgz$cQEjvx$՛J!0wnCf @O[pn2b#Ys{@CNN6si J =h9(GL~u[ 0+ J*E1ijDd\G۫52NoB'sI'E\"_nsZ"r?ZӃYw};*%Y>V BnN9s[Sb>TT5 LM:Q-L;rjd!iI >~㷍W;$+ֱ3GlsҮ(/J_Ԛ2L$'O X@:dk:×.ƽO<Y͚\|+^*t~]ڂ|8p}.$Q-|_ qS)ațL_2g8; Vl?#}>{I3ѿ p>I+vtss'FM#(mPH+~7ѥh zZȡ$YDlc3ynw2æWQ&fGn2"\3qvH޶'IQNe?.6U*۳sr]U7aӥD96KTxKcp+ qbsp+U:6%VqӎZKxmO6#.J"T9٬![=x l@X; ҦtfR vrqcGXl/?v{ZiܩM8\$r)ko_J%;~~u\ aFB䓍5xYo& ۏфSڤΦXY;ByL Y#ytZ 18.f&,IiGܑ9kleCp6]Isl}ZzS]bm1ĞwXʟ|{Uk k*r|1qZjcFwܬHE9X(AE,xιX_CvȎ#-N*vux6n3f!cV7*^Kw70z%*p#+;Yvozkwpжsz}i٣,{ZB2۳f4RHKk+6~*4`Xyw%^$ڂi!Q}r`/r;!zZ |/sۊ (S ( ּ7k~ܳXe43d&vJ֢2]1camKd.g>剫v»l6EY1h.a _.1c'5wV$iw ֫_?铌U/FT>$yш^I6;S饰|e2 =1ݠhZ0B0=y=ēHΞ+aQSjtjvݘ'ælc'jYDz@?ZdGq:l.ˎj5FdD~c<}S;_>B>x_m\R#ޣ^>SڴSR4RнD[yN|NN7(d, s֮~ʓ#$Yݑ iZR<#FS׏³RqS\9`WR0&H\V q6ՎA1z"Hʅ`OpW'2(%”ӸncR!!wv+JN"bs`#=fuxTYy^\]ww\SkBKܫ;,Cp,H'#=WY7^ܵӅFXGW17*D8'ڻs%(%Mv }O?nvRcǧ uU] x^ڪUp0i+FӷG=;$ Xr *:vV+L{SMp@.pU;C>aݎT7jj9y{oIB6{֛nK0z9=jQH{,%#iemfiN޿zjhppG~=j'zԀ1Os:XU:"+ 䞣Xi]! yާUT?(0nQ?,y#iEGTx.`ٝ7g9z]j9do)K5o%G(A=N:jS. +%tᷨ<_! e_%Zhܕt 1jƋSum&qOޗM:(n66o\^qvvcueѷ7<6EWyEPE]Z9,œ_Gfw]>([~|: +r= ـgP(fcm&2Ʒ/J_!LVM)QLҿ#<4!%t:9z2|q9K;)-rDiva@#5k4ɩyKG{IQ6:L>WtDd[%b2Hlq=ݑ)2e:tcYW^Xx;a}xZKfF}8p֩AƜ&̫"ƥqѱP)`%Uۅ(95pќLqxyҝC#Z;mKolҴ岻4-:.hl"_290 {V71ȱ$F@ ;CUVk;,-6Bzp\g9Bj@“>i?t$:Xc.y#=;㚭epڇCcϙv)#iݮBa]{k2n$ù"۲=l5 G{\J~u%Cc:do9Ss7wVGwgxII%cEػy~Okt 3ERԭG#G.v;V,/"6_mp1f+yo-RK2g/w>ڒV+TaKgʻq3c%bI!?0d^Zr$f=Ϳ#`+[+9Je6&JTdtfГY?7J+̵g*.߈c]#y(I&UX ;Vm"N0۹5"q@  ϾxoC{ sӄZвcseS? ͜Kۄ񎽪[ٞ{W;mb8= " ͖y9ڜ/Q8VrJ 17&-̸bC==q[Q!_xAs*W|mKgx۱*8ܷzE&V\Vf9$c>6)i 9VW8|T@l ocUo7v {Z&Lzu=!1f& | H\m%vCUu 1h`/G3\7Ux+Z<6VS!_$;.a`c8" piaRCFfe NAJ@U }f\?rE|~;qժ> stream xZ۸q_"#ç(e6K+z 4ŏw8|鵷MQ,pf83tr3Wg:{zԄQІM'5hI#j>y[߯1ɀ֮g|.[2,fkR 6-/@};J}kp7-ťnb:ՙN`r]%$aVgHP> į+>WlKϷͪjU+psZI DSY.fu7%\+-9EΦ.>ano:#4 ҽrJ\{fov{G0vv`8i.~y'@Kdo;Ǧ;HՐiO}2a$],%cDC%{XׄIY?7h,z'I-kO!}IO/TTN%\)@"T\ݒo\ \Tmw}c̽_ :}0A 56W,u'p}vT!jL%v釃opN!/Y~x1+{&J垸h^T9 Jru;"mwTܮF]83ƫ5{oO_G@[?&ۛ-Apխ s>T MCB7­1B66ܣPsy 6\̱T!>8QvJxwt&!Q5&_4v5|t汅 cF6Gw.qߵbl]x67hr+s~_Cvv47.XY0sV+jm|^`”vJHT1fSFG3 1ν1CʔE|dcw^ :5%VTNhs J^Iϲn֐`(R[Q `1Mm KFe9DڈSmĄF_s*…@]>ϪQ]{ U4!c-s!GUu#+X<(JTŋ&D>.]Eo758zm &g63 xJHbX '*@H!hsњ!/GϟdA*.|9L4eQ.榥:%HgC^Q Z%z/pOX!6ݑG+U 3$ \G=V+ww{".R*%u7ܴIpP]K6Դ's+xyr߾vLO~W#oKvlD͡J"Z_g g('؉!QMj)V wod P0<'\[D"*7NycPݢpO%ӀPTA")y*#R=P)J!s2sjH~XYcXD4;:AQ!P%T `\ddbCCHWp o\8(yc M#c7]Zsggd7.嫨QFdހ6i(Cq"L7ŕЍ=0q!Z[ݍiJ n𬝃  ~h x\chn^ t{q{zw=Ol.\.O5Έ-,F{v8kaV  ߲E! #AQ~tX=\]:#xkk+IiK 1)%5*8pD3`,*؁x޺I /7JҠXTڵ|A?8кqú`\ iFAIwn$gV-oܱ @PQ4(@tjă݋lN7N 7Vz=xHQ ATpˆm x]"c,;Zf~9dT/HF<]Nޜj521TM*~"IܣLE  >)WC ;|S&NXl`T"KƇU狼>;'#?Ds[@[O"Ƕfst)C4*Nsv45l ].$~ #_w-Ʌ ˝r#,Ȟᯖ8͝s;˪/ ߝ~o?- endstream endobj 241 0 obj << /Type /XObject /Subtype /Image /Width 342 /Height 240 /BitsPerComponent 8 /Length 14555 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ($r*0!Ax}7^k RB#7_.-zcs+=0k$\};`6=2@ n-lhc8q@ cs>f:%nsqƥMT'mŧZı3qSI-HeJBHWv@u]ies0ϱgpcvrF m4K K{+7$O#4]OϦV cAu*B5YdfŴT,r0pq]ajZ ޣ#O{VsîUw 88#5@P/Ӵ縷IR2%E/;$_KF}Oxl@W/]AnjB[mDD"BSFU7)A ֍g_>o9f@y$i 88ՋMB" r˚0 ;_ƟwEgc6)țFw^[#=oW=Q//5 +ϴ<-;PXPH 硠 [X:]Ɲq{rg@>թY7+8HBa cZ|Vkw{t#*f%uasW4]&Q !'0gkTY^%9I!T)Vw.{UGoLJҬ m`H䪨Q| Yzu{ֆ˘.9 p35Tt;<7M}mݎ:ӭ^S_u(/bfiy_`Ӽ) 0oW=u3x=]5 &5D '1UY#vzG b};N{{dE#"YQP2IUZ]"9D8ꮹB[mDD"BSFU7)A ֍g_>o9f@y$i 88օQEQEQEQEQ\ZC>p^\QO Oj5܎>=a]뽜c_VY~2r].4lUKOWoεb7lR| }x,mbMX>7gU񏊯xeG[[2}E?OpVNw lŌHɟnJUC%[Z"3JGl~gbyՉ2}o#j5H,d M?JuȄujooo_ƭ[pTx+=nWOJo3Tg: ڇ5%ֳQhfFEmFTC̗K9u\j]煯SmOkih!\^ofh*pQYIUU8UZ5uOii‹C$u7W1n#wϿVfiI90b1V\Ƶ4M]#Sv*D!E=zhCV7ಊ')̚8qc{ᚵ_5ZX`ch~]k[7t>m[C/ˌb|}%U>"Jj:3o>_ l˺m~jom! ʦl}ē?RkA<[E'ėy#?mƫ''>xTg/ M=01Z\Ey*- + g)-;񪇍 ǫj7Oӧ)Djy Ρ^[Io?)_"d~Uͨߋ_3P >dTz}Uot6zv9kI>'z.K)̏^[gOhy5VAyiowv~/vCF~-,z3T2BIV0句4R5b#* kyu7Ւ 5jķݐ}P*s>r5Tе&3c/5[G\v5'vu<֣(;RVR5z;;j9˔M}Eb}IөoCiڈ9) w+(&Pk(%5;#}>7/W<KVVKGCpU6ß݅rM|k˧ݐ}>j ?d0Av,T.1jTlV](PpZݯj߷ҡ տćDчVGM0Qpq։#;H"@_Bpy=txB\܉X#&xy;ORhw@k 08rz]7+̤VZꡈEsJ4G>Z70V8xԕlq5W@ V[k|¬8;88Fm+nptԇ7#@>r vcbqOkwõyZxX_c^א+l8*^yszUjr۰13M'Ԍ9[µi/8J-lzsxZ40ǂq_%(~%⫸:8Q^^_Zu9o%mŠ(H ( ( (*HҮ +*×.ƽNL+VԃwkkT~k|2i۩ѡ}-jUSOtDW1殏]b.||޵Fɕ[%n+il'NXQ*(Pv[S)7tQIMIh׊14g"J{(s=rjݽȏ=MIl9 7 x/.\s1ֲef޷|oX]fWҬNZQT$jxF&V |dqw}Nnjzg~j5b#J~FA,T2z=OVVe|た֪gNH|AP%YA#nI9DߴAqZѢ22{v fm ư¤:-]Q"p}x9z$)]-an}E ηrXf-0[e;\0'zJ@Yda{Rx< .t4"?>IT gRʉrڇ sI^ڮ)HB;CW}^g*#s׸ׯÚ_:"(Pʚi1H&X7$n!{YiF0,ąb= VVaמFOGY1<>fATQnb+m+7xc#=]QեIJ;9E͛y3q7wVY|Zh ˢ^^ v %^\js[D\֭ݙsY2c*O[q,HR 0=XtxЧ]+B:~K/?9z3J_ďY66 çz=F{qK$m\yʤ$rwnZɷӱ 8-ߟʮQpZچ$Pġ `~T1uxEA ӎ@Y3cnTqR*Gd-P8="ƣwP❬sFmC``Hz RºKsí@x*wƦz*_} u6"'sui?%&c֓gq\&ח9>cn^[SBpVg^3k4#prv)C y_ҵ28?N+'jj*#54FQدyjGl$HNٹ95WEk 4mԩm|=QWAinȫSlPs\W "ޅǥ6L:TorAf.80Qc u<'$4A x4Y2)$\1QbܐCc@FW0k0WP{koo8'X.ۚUU /A2zckcMR=H쌤ddPfy~7ǎK T2H.M<u EaӃ\K.prA>dYo9}PL$wQ9ǙtpDK]@NOo q)ܓ@' 5Xʽ #C j{xJP0ikLrmѓ;:}nDp.{Ex.|Yf5ccx<^R.4Wn~\,qjҡې@$S~v^=edEo+lc%e޻00ʂ99>3.{bb,Đ #(EukrYȩcpY v1˴~qk0<7ɣ=܎6p-O,ۆHfa%{ٜy7Ec 5fmZ6_/27{LIjθ4[!sWIV? ߲QYW%)+ԊGK'x3+> ;#[^؀I_6-X܉#QȘ ӊ r8R7Ssk+3PosD `XAT $䜚8cҋ"E!=aA"m팞fFڼua);؁+R"˂=?*ӖBFxBl>ݩͩj.g!`3dz8z-ĥLjztcJÓF6Nѷ.8^L})F屷EIH^kgEt$ySjJq&}}߁$'ė1O3oxmV%J3ǯ[֘8ڬna^<$G,Mw^NGgn3ψ/?ۮ|G_.YI{p?4p0̈< /T`T{Ww&z 0{bBAV& y[HsR<ܬ梀ncײ ]#,;t` зTr+nLaR1Gc)$z8FRܯХ9m)nk=,v=򩄬BV m#[*"9a^ށi芹n Î!v$ X9?+@MW.DL⽖hDϿzz2u/yy/ (S*:|\ثU+:*CK<h*=̛jnc#ZTPERSʺHȖ۽޿[nWEL H\15@zWu_'<5|c~!sWI᩵HYv'ˤ8=4Ipސ x+wsnc+c;}gKh9JӂasYġPG$[p32+j(`zԃ*VoXC;Lrmާiؼj(+E1{vN&BJ/\fsXwao|\+l~U(AZ3?rsV+]?O #mnxNQYt8Jg`I9;y>څ XzjBI={jjOBQ^"mx ڠyR~QHk͹Ԧ2>K %%U;?Zetg^z5>ql+w )n73J=ǎzMhk 0n֬'Y,Z7NOAYfɖO!=u%:9w|ˁhR2ei9 lM \W%OƣͺC(?0Ȫڪ On+nKb,FHd1 n@yj|$5Yr?Z-2H2t }C|k<}NlK6uz,ڽw`!k+-|B33ɯG3v}N< d EؤXTGi=OF1M[\$}׍ͭKnS_J[-hxESs)jىk YKoa[6^5H*ݴ SP͝}r8VAҮ[y1E^؋:qYsΫZWit6'Ԋ0*0xfn_Jj75yA&[V`swX 7OD#ՌgOR9" 'sӵ2Npp=k2k >ℛ.)M.@#hc,_ŏ// (S ( (f,;32E$.@F'4QXTo-6Om4^빎FqP@ar}i4DEaHWLpnhDQ ?*l {<ُrOBg%*>1O4cw֩E&ÃM\#=+#wFdxvEI'=Z$v+wii JӷO:2j5#t_,IMƻT 5uE@ϥa^*9*?Jqo@  vZ1 :H%=S}Ϫ۲>OOj[,T&+Q\uט:Mj1ܺ>ߙ~mnʑ$jA9p3>՟}{W;F[3y:rxS`85p}1VG uţEOdQz˒mj\1 <XX*:sZӳf.sMijwȉqN+U#*J@$١wxH@ryj/U@ozY.`-k}3ޮ0Ũbդ[g2:ItWS*:7?*kSՓR:\pd5ر8]I8Ңm=B9sXj&qF=~b{ZzS/~_QEzQEi3jê^Xd }jʟ>Ed>+Ȯ (Us # c知]Ӭu&v+\dqVh 6|Mѳne0Ie0J}v~s{*GoJʘBHƟ򯸿oWV 91lULam0??R: =M$:Udx/n>db-}Tt)=_xƎ-g]_j6&'V?/?;Guoh}3rx+Ҍ>]⩣p?鼟U^Լ-CkylZF*KۏOSUeA9@'L>vɦnAVuohԼ-5N Ug |7F>%BZ -fԼ-\O2qʁ 0gߚ%N&WʣCAȶiF`_}ȟi>i2gus5Ep|*”/(B(((VcP[񝻔UxsiF{崹' ߈ǽo\>!1f& | H\m%vCUu 1h`/G3\7Ux+Z<6VS!_$;.a`c8" piaRCFfe NAJ@U }f\?rE|~;qժ> stream xڍTKo0 W("Y-bM!u ۩KRr= dOGʒd7ULbJ /bՒ\XgYiKe՜/VfZNsǟhCEۻ`]4`#=m]5B/[E@ܖN !:[W?彊蟣cϪ.ntn'Se< yIdux_WA2zQY*9%9Jd0pܹA=hK3Ji+,#E14ِk '$$4*8a"p0T=qq>͜ -R[.ilϊ:[?F?; NߠDރGUguMM h@0Ե7 'P>jDr{KJLQ V!RialZ C0`RܣEСv\t-AfR8N= o q=]!F*_ǫcRS su9c_2i{ f`o]U|I$ endstream endobj 253 0 obj << /Type /XObject /Subtype /Image /Width 342 /Height 240 /BitsPerComponent 8 /Length 14239 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( мA&@ 9XRw\t?VGg ®vBF SO%і9% ~^8nQEEsmAH0ʁ@ͯG,& vm MFB^+.`淫Ӽ9{m@^ij"DlK !@Xڪ9:J+&F 9.;7,ӤFF6Wu^ t-p^}4{fxlwpvx7袊ujnei|p"tGT,u (RV"L,7 q1{s@VM}#uFY8 @"-OI-f)T0d =u S0 1훆q{md4% H݀jT;CHєKypOL Zjjk{ͬv6W&Uo62v+[j0ZiFsc+V@ZG%[<:V="|EiP,?,ʣ'#lW?FE&lT{eA%̲*ى܎wp1>(((((+_h~u:"+˓b3*) @&5Uo^.!Ivg;w(8_8UO~d(~np1攟.BG_?fs-mY~-yӵx"?kx.n/a wf4|}~j2/ '?]Ē\QUdǽ2}o#* ٓ,2K=62 c^[Y[R-W K5V-V*HUT<}OUEyf?ů?i׿gůC̗YEM81Z8x{ȔO]IH(ڌ2AS*m`StgC+еV{ ̛6~њM]C[ijI%0d0Dg=֊|K[[= S[wUI V/\߆Eۜ} jy Ρ]aw [At kjaG̗O+}ԓ}Gh-O.ѡKGs^ CM Oɷ9Fq^wmgk%Ԗ("/jpN͚ 4h!К;kx.n/a wf4|}~ʬ:POuOiivZ Y͑;~[jhUJNȇʊ5Yuk--v.ʩ#?κa5- ((((X-`y(]8&(*2咗cGuj/Zں:6P TR%e5zFCi9)N^R5U3өKj?/WR˔M{Abҩ1ΨCX|jFUe~yKׯPo%}>kϥKտӵץQO!f#ΡUB |jx ?_&(˧̇pW/][Mufng"Q_&7Iu o&L3]Nak=۸Wz5]TekHe v_VQ] ⥆U|akQMUsf_kF 'UYK}5Ee:jNyGQv@Kjvw5Lr)bS<* ӵs>R5fVPMyK׶QYVKjvG|o _&y>/^ECi0mo?/V! kףSO!&}/V?"7/]ex>Fb95Kpyr5QZC/Zi7Q֯е!DEr䒤k5 Š((((Y2< 'V$f]5ya.Pd*xC*ykX>HyeǙt{kxBWgҽE|պu{mZԶ,:|VƍH1ұ5$wonjc1 Muu~o橿ä/W G>Fy-y{⢟M%W \G0?1N8yb95Zm//guiS_QYCs[x^ztA>HmO/~IۻhsN9_jcF'̹G  Fn>ulHuH]1#;zlk`׵M}䲿¿m>'K oFZ7M7'בH>%=mJo1.AGAe!c)ϑ399?& .b/ 2F#WGdy< *b0-£m5eKeo7(|e\Z/tqZd4N#o*lkDgVT$rN? 򥋫e(R[߉zmI##1T⾮/om=?XA8`PBkHXZ'e Zg80㮫)5+tBd5 *;^`_@0Z<M^~0D ӧ'ωэ&+`Xo ߇gi&KՑɈ c֠⽵V_/淳8vQ-O{R[{Rp6I^G:UT18gr,#@$Z^IAu1 1!랃9ǯz| ߧ4n[x+^g[a67J*& ۻhl;uAwamm4Q.fo`a}95~wbKnA*Lmlt.Jxn.-Cnݣvn]e2Ot02#ڬv6\s֯jj J;s rM(6GUWRoʆ'lN\󹊃`w̄)d >STuF`1}+Z+q=*5mv'SȝpVsWO~+:0sVlc>7rAI|M lP|3RB!^Gq_n\gw=:Ux3H\Zb|㎆K3.8emmmN`;:g+_͎t}ZV$`+ 9s׮JHuqcЕ իVp&Aၢk''kzYa O>F9$u$LҾ8[Fá@5E`URXpNIus( ֫]ʴ\ýsN*)gs>k8+mLڽ/O~(L i1H&X7$n!{YiF0,ąb= VVaמFOGY1<>fATQnb+m+7xc#=]QեIJ;9E͛y3q7wVY|Zh ˢ^^ v %^\js[D\֭ݙsY2c*O[q,HR 0=Xu[ƀ` +G\xj?( _c4HBYQ;W<{VbțF޷K WGo$L{gT{J3m\$dc=j[oAr_+tVCsΥiTDP_Ȁ@e/˻Oֱo&TlmK}E|295* }zycKfy)؃PGn*qx1SU[Pq*̃+JkcʳΧ=ZyFFM:L8ۙ.RκpV߳v}eG#*=Xс_YjO?" Q\+J'Vx1ǖn9C 18lwm_J|5jiok4&0¬Σ C3M>Sv)ʥA^՛y'և%؅)>+.1h`Zm?(t5^٤ yi\)8یm[$b-Cf% ܌Jҷ'OM- ZE?@l KJe0 ՗Pd`dGg!yRocɛ?jM~ԋ*VK8s]-dX֜¥5|?!KJAA,GRdʷ~G\љJE;~>XuP{b:M1þ_ƽ'M#!=?jO72VqEWyv:S\f$B|yUS k$I"wU-. 6v8HGVtPثp^DR1*0,;@#$EGHRye"KH.Q@:z( (2O 7cG\xj}]W zm)їIiUkU.ڭkvܠ==*]~Jyj{֨.%(4/QZe3F@Юc*NNdVM ^%04]v1ښ: Q^Ƽn=]HY{V[ؖC۽sZ0(,Wm/~ꎥ[]+fЖL_uc۪HXaG<"^(JG׎k_OױגjGsP`F#~c]J*睗;JFČvg5R.,vvUhlfRI8V+A ?jmR9sZqmM* T@zb*ߛ;O#(ϔJ0Fc iZ5p23!T4Qx4֍U xFW5dlg>٨a{WE-{jźC1ViM6ف0<mee)++4ԾGf(@_qݣlWHD ]C;*A,@fx/YDEol'~S͒ 5eWRCt-Ldc,rfPG 5G¦euX\CbWWs,LC嘒P$eȠ~MnK9,nxk=B#$ۆ vn9tP4gn1` p}ֵ݌7p3&HaƬ@ ZPҲYZFx?[di.z!sWIR_o۞#Uzr^LJ8;˅p}+Ia +=&T$p{%}W.o#˂>;*p@&p'E1.=*OSK'WH\7I9_Nε(+zw3%:$T`XrsY=TԺ瞠t8# kCRX 3P?VD0zb ֋F- cMVY"?ҫmp1*jZh̹f.s9X34|MtfLq8duqo ;)$sVtJ _ɑϐGʤG:H굵*uϋH+5(wjeH\סן^1:>n e-K!ӭUdeeڨ&۹NX#whjW >/c) dQ'>Ư)"Ny85I82#$Y[ڂLFQx>wMjuە 7S^^i(bvKߟV>WEWy]GOT{K[`Qe`GB=W4htgWW3Y's\^ xkJ(]jvV2WW y{w= tV~his ]A8>(/J_Kf/*ƕ!sWIV/~cfTxSv}Isu RBQ4v3"[&PNOxϦУ5ǷjfDoo^eikt[ul1W["e#ƴ4{_qR5pp8= ܳˍ=jU,m%\lH6)皿V9{\'Րܻ28U\m]\9=Peb[WfiJK`Ӥު n'83XI hu̡Y+^,awtST֠2=7.@u P? [+H6xYj'vrͶ[ !ySǸ%L^^2@$:0lj6QMw9wx+>Q~ v538,ܟSYCH*yrÂ~ԗ*p85rCl'<֑J[imw O^8~z@ g׽T˒[#]K -R[mМ\OYR]FR??kmgszg9R)oN-xZ5ZwK ߯Mz-yƧV'G 8zm d>h=Gx={3&d!p}+EDp87L Sz^IH`իY2OP:<)0]*ۀߚ qп~ $UvEH !Ěv'ΧU*Xsnqj(h<kP'i>Z/̣5'kйL0A^,`7_Zη$zbSl?KVfN6FMgczsۥep_8w3#&QOl:m ZP>L:׶W[nF3݁_j??(O,((KG%k˧|YOϒAE`xn]RGa{0E6` T[e_?6Vҿ#<56 e[Res|Xw,:1T Vf,rz[SބyLJy$SmЉAqkMv;W yjwho͠戌;`vYғf|Qg:dv;VOԎdzE1Y7gDlc۶:M8n>qǭN `=OZP i7\cڮqKQ%y"iWs158R1~j Oc*1Zrg4Y`:t) ;ֻ@ߚ'EtѨcDVZL@} Ϋ7po k"s z6։-GWt;FGvj$fЍtf}O/,i~QҚ9YQi|ZM7vPuX${g=+|zcr]Uc}?Aˣ! OJSXĊ]Fzg5(ր7*Z.CU7e,J,IH9hTW12nV(ֵ:Vu)lK5}_Jm*rO˞VU~"'y^"Vf9힕,sOw__jWalP}k+˭p9^55es~f (C ( 4Cha/,D2n[>5HOミozԢ2t xƟWZwrɹ1Ү:A{gor;|284P{KM>& hٷ2@[d~U,q E*F#8>]ʮҲ7qMYv(twBa2??R: =M$:Udx/n>db-}Tz_ʾ5VO|!Ig5O.?鴟U]Լ-ڗ4}9<FOToӸO*j^QvgKt-Iq%գSUd +]?i?{x7@e*IUK?y@G[=?_p{zR> POtUJУ8_ڗ7qבX"YP8GoWg4t9[<Sai֍?WB?[xwJcktoJ(8CI)_QEdQ@Q@Q@UԬơ.!x;w)VP Y4ҍis2N' տzߢ|C'c͚M:0mJ:۞=b_gΏgoV7WLxl.BI4wP\)82q@ CE7D-w 6B A N~ f/6~vUx7TӋ,$nDXȈ~a ?r<tQEV]Kho;V6wv[4Mqsqr Dcf8QEQEU[+1f'<18zv`ַ:YVÒ+UNkcͬVҎv#>\xa?sxh*xC43ݏy}iAmBHrz o_յ;h4IJ]1;T`(u!F15>E,icHU$fЯΡkՅHI@K1H2y5*f4.>o Eݵ@? NIѼ-hyY(g3awkE7D-w 6B A N~((((((ijJξD: e> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( +}g.%$D͵buYvk uk.,cqC@$mnp%+*,8>!:V2hDֶwbgsu3:ǹAshը1<}Ikn8(_kJ^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5M[H\c~t Ae1g] p) v%x]ί<4п׎$`Arj޵Qiq-!6#؈aFG( ?>0 q =2yX|-d$2hcHJ>E9\#' yQ@wЮkOfGcgwؽ092^%`Ң[ Iq! ڥR'o@z'Iuio3wڙN8\ /!CUz5o(ކzc!q[P5a iE-"+Cq(BnNzO<]=>UΒh"is'8n{WME`^+M\1 rqڤ:LMu a .v GEbG$D_6_mn(((((((((((((R5i֖6I6 H4vd!8s*晫Aimj]K-w rwA2r\[|;3G5yE @e%}_;hSIRM(Io==@i)6yVʃ\8lvX}Qˁ>ݸوU(((((((+RX,~skdh"G\6F]b~u{fDcH:,4Zki互]8};vKPIl5tգ[YapCr0ʆb9 ;S=6-[kG ;*?i3{[\\Aq#>(Z62YܳuϠEPEPEPEPEPEPEPn4NH6yJяQIyAGMAGZyAG??=߻5ZtPg]oƨ˼~i@wݿ.ڏUEfe{Qvjj?VyAG??=߻5ZtPg]oƨ˼~i@wݿ.ڏUEfe{Qvjj?V5΍m-ĦYH! `aQjrk䶫1DX\җÿFi?Awݿ.ڏUEfe{Qvjj?VyAG??=߻5ZtPg]oƨ˼~i@wݿ.ڏUEfe{Qvjj?VyAG??=߻5ZtPg]oƨ˼~i@mXhX-7GnFUI׵t_u@5@Q@׉gBm_^Kz?ƫsx3\u:Q5($3 Ja;zWKQAoB+xc0I ''s@MlʰݜZ1뽗3O{y-mjÎrO O(+/_t_i֥QEQEQEQEQEQEQEQEew@6/}!'"/=oPQ@Q@Q@Q@Q@Q@Q@Q@~%WW)Z_u@5@Q@InR㑓m<8UHEvF}F{sQ"pBzmPҿ#<5YzWu_' AGZ:/҈R ( (n#I;xJ"FYMRmxf3-)UEi%ӭΠ*wGo^f;z^qF˟//zF%hM$4QǨ%UhIߧS='u|QJl]\.=i/bܰyQ-F0d~`n; E--6+ZԥyLnry2ۏZa%)א]1+RȎ Y11; v-[^Avc8t`UȩGmFHRh2 H*KKyU.g/u${袊dQ@Q@Q@Q@~%WW)Z_u@5@Q@s.\4F  $`AH9{s O 66U g$Mo@;)gn3Y wz6$Q e_?5E_QjV^ J#J(+:}?0B-bz4lu9-˺g1y3`wITc.l=qrq$`Sxo iRDR$l?WI$y# hAч?C8a@o_r异HyA&d\S')?ċŭq%==MV[>͂l/њ x1VOcՀoAV`PfbeMJÃtaH*"/M *;$FR\tޤc ՚&QE2; ohmGmЍ(mknR+kbpyts8Ul{[0mV)+ P}?έ\Ȳ$V!ܑ9>ח᠝᷶EL9V:37p&)bW@?@΍M >CN}А 2c:vH3pn![G$6!yXyu$S,,,vPs,cKD9X~jGU.#yjKw'r}S4qCs fPP\ =iU_ w"e QUFOЂ*z^^.金?\FrZQE2B((( ȫהJ/yMԠ(?ȥП#ԡ>rX^qp?C? +& ۿvKN.~).Kg}dYzP?%cn ZTgQE2L/=oQ#EmmRMBH ĠE@ $qs>ff`.Iy&+I b$1=9@̹Ǿ?j筩K HHLgzT6H/fX-f7r@!z3+\@bV@/,x{bI`H_1G} 'Dڣ{GcOC_TTY#|?DqC.CTe[Iפ}Ru t(_К؀Y}O񤊖Z?pNr-nhV~&o2^KoR3X$r13Ad'e?}F2Z[v(@QEQEQE_u@5Y~%WW)ZQEQEV^!sWIJҿ#<4km?:ԬAGZQEF6H>E$ &ym/QǮ +6m)imLu8{,?ef5 y90|w**Y^30`^Zgs3ǒ?# cK* 2Fp<%;s{UO5YBz[yÑ=N]fԆ s\;F_* GmՌwxbsF8ါmK[LgV#فnj #!tdSQZϴ2>6,7NM_u_śY,Y'2sm<8jL \C Jxjk7jeGv@ ǦH])BRl7!K‚sE3 iu=‚=]GH4$r2=7Yoi^݂HZaԯ/ }M'^_?j:t{P~z=k(f̒;Ij2ES$m_COE B4_{IJRܐxT#"{nV?leb1[#FH??)VD8!u d;Uz{뎡(R?4Lޏ_ ̻.?F]g`=z$[=͢P  5|N0j] Z1umSW?R ~E+<bh r''W%dцU ;(Q@~%WW)Z_u@5@Q@x42]6~.c6 6 l67|CjX-m-hıL099௖cר"FDfVeRTISldӭ{owWA3 ' n8՟Mxs[E"yc֋Ki1(0@=N@3,B@8yfrpoIvm`m;e+^ߠmk EI$$OznڒEFaEP_mЍ(m_COE%_kx[ݬl D[d:GC+.-JuQ1$d$ӯ-7]Y>~u?N=;*w)eJF|We{ Ils(ݷȅV2l/%"]>Ԝٙ,8SAb}AVPqIpLqǑNI?ڧتmX9d1[G 9TmHOl՘"K(Ṟ\}O?Ξ[G( TwP H0 e%m(F_Uo֥eE]_ jPEPEe^$д{5:vMDrF@b2>ƓD.8}R9Q A i #@G\xkRO O(+/_t_i֥QEQE2hb56 T{k!$da E+ I.tvEm$`RRr"7WQ=?oO=\D~ot}?3,-}zWmHXEDQUzNdQ@Q@~ B4_{IÿFi?A{Α^o2Fr`w sPiVTeY;s~!zhnр 1@!kCA;ATwRdʤ\R&9\ؑ{s۔{+4yr0Va'r:z瑜e/c_8][3W[&9.qkfn3=NM.$wBU =.uiY?:L-Ɉ߰ǝ͂z/GW7w$3-BDd;SN1ǻT($Hk X{?K|#W9O`0p>rQOMYFktG COe!@sHkY'WP"ӏӁN6U%vq&,#RZԞN$n0*d,I[0P *R#=9lP,r& 1qg"dGڣc vĬ錷թP}K;+H1?@ɩB\r!ӥլ7dsFj/Eg h~[Gy*7R3^)~%WW)Z_u@5@Q@ڮgm:wu ,' .xZVy^KfFc)VQ o@ ^kb#n<}K.f]U;01v~DuYzO((((((((((/ÿFi?Axw@6/}!'"5(dХC*E(U^}6/8AR{0jQΥ{nz9[0G椟u)kVč?B,HфN 6s7q} 3jG˨ZFas |?;[__e@WQ?gҤUYb0gc1D~CŦ N /"J$1FfaQ2˜_o& u88;ZN{K^H0:NX,"dk6 ߑƳg@O38<*qmstasi?,N ױ*/6Hs"`G KcIlD::jKZ64͔Yg}yv}778=%+M+ʭ/DS7'iB7tD?Ȋ4M i p~~Ga?GͦG/iظU#)lE(_u@5Y~%WW)ZQEQEQE4z,4VlR*#7R@MMs}Gպ(uGuV k?]k?][*}\Qt}\Quns}Gs}Gn^^%P|V$(ݵcnHȭ-2 6 m'Aθx}y#k?]k?][*}\Qt}\Quns}Gs}Gպ(uGuV k]rmH$eHL"OOHL22xӢ*}\Qt}\Quns}G}R.7@lŐU(e_2qY  @4NWWWh "VqN6eU9?^OiVyM.KAd]nzG?#Kk/9Hӽ*2quL2Il.?u>?5jasm$HJYr3%Qiҧm뵳ONLˍ2qY t?s(cp ,cUP܀ [*}\Qt}\Qun֚B-!nLIY~h ( ( ( *Z}]z Xsf  ߑ4Efl?z@tVg^~Gߑ4Efl?z@/b_V>18n-$x([kg 9V-X_hnJn83o?!l?z@FqG="=@̤~L(,$fl?z@tVg^~Gߑ4Efl?z@tVg^~Gߑ4EAewWP"cxQY&$"B4r? ??ƀ4@G`/Q#hN? ??ƀ4떛Js2ҔTbTh;I^sϦ^~Gߑ4\g;{ %(/_t_i֥em?:Ԡ(  Ŭ(3HCgT)$`ƒK6܍# >O;g 5Zy5W4Q*j2J @ZȪȱpdooK$0YEk erիhwsn@8px]Ok~gCJ 6e\8>8'`D cJʶ2J9>4=zգ;at欬$sɡ6L%{p%UJ2?y  }7ܑ'nyNkH[!v[z۷)TknU|`=chF}Oe(FڗQQ 1Jqf{ۛwc0}[vV M}ʜ˯*N׋]@$_+t&)E_שjᦖ'<2㺐 Y-mn`(OHrMQL/ÿFi?Axw@6/}!'"5((((((((/yMԬȫהJ(MCywilu u İ,nsцrO /<+ɣ|7w,eGd_\*NQ@- vٜmЊĶ:eEwf I$Ƶ/J_:/҈RE_QjPEP??w_F^HL=sci%Ƴ se5oMkqUIYC- ݱp.$V;?ސuS7QrHc"fHZ>vN@^^<R2̽}W]9Sg7s)' ?#DDEۈM¤dWmp:U`m h/O|WHCq`q_u#*P.,%O_X))"tM_Ȏ+HRU,d#O^9n]QmREcC_Xi$PTɷA8! K4Xqܬzq֙ݼpZdT;K(; ozԪ˨O#|" rqOң ݌K8M|}>TM8#*rJI=x$R S$EÓ:2qfS^/XLXLt:7Xۇ=zE[;OI,yɛ?5W;G\nI㊠ #X/&3LeP>R\H{y 怜8sښʾ B4_{IÿFi?AJ( (p2zVpͼ_#%SYajFѱaqB= Mw/U6YP%MT}G#Y3jEP#/Ŀ*7kRK"^S(((+B:~ZG\xh~DuYzO((((;iZWtKtl:]^cscv&xWٖLIs0]+~#)-= TQE2 ȫהJ/yMԠ( mO+c >Mԯ|3ChyhI :Vg?)㊗I%{;p-ҨuVʳ)k ~.D/ vӆ$u5.Zhs@9Ygid|g'MY nt7c2k;BZh.6  uEfi C[>ڽ?5E_QjV^ J#J((((϶Qa5U2B =Nlh;e4j,)XG{)݊s15Z2CjP1@)$wON9>эOM*]o#x?ܙwhEv"/gMŏ*Zo[< s) d:ͅ`ʛ_ܖ==Ei}}GB9u_CEe%D6"$G+#ެi Rv(=TQ)ijDщU$QP)ݷ;IeT(]=oҚ܉_]> B4_{IÿFi?AFfQ@Q&=Dʃ#CeHz L~E ۴'ͨadyri=Hi@WQ d ~"2?#پȒ!I\?"k!cP{s)#6휐?SZR@VV|6&*B=Bj=mؓCtVdW8#F9=3^8@$q#bͨv~Q#!CZibf0=deO,ZQh%c-ߓ?*/o-Jߞb_?? [q;RF}|/-*F?Bɪ:0oĂ LR>s'n}wzUECX$#7Wxx]qΝp$=4$̒Ibqc9qUbT\^JZ2zv&Xnȇ+o'\FtnK2;yl I(d hgu?b,&q֕Nӆkdn3+qs<߸@{욛MyƸz9?JhmmЍ(m_COEQEPT_10y?BX3 ^mqI'pB24QY W;wM~5Q#Yn=E_e2ǧNHzV20 zwSUgd7W˽+v:g)_tTrO6 9 ,;gsUy-%攃"2C&N7A#v3Ui{J#ʯeľ2X7ۨRhN|9~8'v4z_rIy1YZ]4QӧA{j"%t $oܸ9@p.T.و]@;@JH2aC-ж~Q$ _ #dNa#]7ˁʌ| Y"DyOҞL,ALHV(ٳmtuy) kI-²s # TtmBLws̚P~UXg֯#)==B(A_u@5Y~%WW)ZQE}x٭W.cgA iwK.ڐK'x䧚d&N yLVa#:nv> 5-ouF;X9g~+JTGSFF!u5N^p%UPӟrr>ӣVy8PK3`Χ}nw1kiJ#ԩsH-!N刅Qayخtm-hK1Cڥ7Dr\*xT_`Ru=Uv ?aјBHbK;znc֚DW[; ohmGmЍ)QEQEgM2i)?|{{7,kI&GC՞mgbZr֬p>Fԯ-˛IZ[ʹW<N1Ow)AbA9ri'~)R"5a=qQ>r\z֕mIge3|r#qܰ4sVd-H뇕}꾐2$V-"|OΫ6h^;\lɕ "HZP"79mIUxx2O!>\{gns$uÂ"x=d`?&oVe4Y1Vhͻ(_u@5Y~%WW)ZQEQ\׉ICrmP7sպ((/_t_i֥em?:Ԡ(((((((( /=oQ#EmԢ((((((((/Ŀ*7kRK"^S((((V1V$d RH#6QZtPg eqg=\uXֺA- ѬT76QG eqy@G[?/?;@ eqg=\u &_+Bԏ!{q寽My@G[?l綣+.?R: 복䖣BԼIoX&ڏ ??l綣+.K?y@G[?l綣+.?fg[xе `MMy@G[?l綣+.?R:ְ4MB8.N3)4' eqg=\uECii vV(,I'tm@ӉCDIFwF(AtPg eqg=\uU exc76N wh eqg=\tj^QvK?g=\t`mGW]ڗmul຃BԚYR2?寡 l綣+.?R:j^Qv?{j?2u8-HmхMy@G[?l綣+.?R:l6Z#1|Z{j?2ڏ ??/?;Guohڏ ??l綣+.5孽ƕ{m i$ ]vOD=R2e:f1qU5GW6WV[pFfv&R>r0^`]U,jɖَsUiZޯ._^z͠-Ee`7Hl2袊uf.n,/@wf7L{}j_k6-HbQD=%R>ʑ$Ӛ*f/%/H݌JY:.d٢ɨ7it߂K7*c1Ԋ֢<)}q;C̹ghԱrOJנ(bKb;`*cj'HnʡeiLpW9RIA@4V/Gk>,r_-2K?wq"g9mK ż)cv8)ZVR^G}pQ#k՗T-K_pkuql20_*arFPaE a m!Q8lŵ}a)FƭWOW:~/UP * wV(@%cvOךhcچ&Wk}'m$Rc{c Jb&0rDc N@PeEP[1sqe1}e31cUx7WZQP_T2$a7T S]mQEQEQEQEQE2XdY"J0`x JҼh4 XbDTU,r ޢ(mo]j YQnc}s++ ¶VZޥӤRK5RKw7R@ph7ho&nٵ{}{UE$<ȘI']uPYƚkz.!WOR28M Di춵cR@ `XI$Ѣ(*iůu++{7:t8=袀*xÚg,$I v-ghUkQEG<^uy+r:z"uJ(ӟ%bxINryߤeWR) Ѽ/i\,\p8ylsnQEmM$k(1I%9v訢{R .K6)C#X)bTGu$VU Q@ EPEP endstream endobj 290 0 obj << /Length 2998 /Filter /FlateDecode >> stream xڽ[Iw7W| aؓM4EIPMJQ Kwn69Ob ], _iu]oϞ`b8X2'Tz7at^XѦb40Dl2\-ϋZqhf`,тOgRɯ@}_w *=qcL1y_/U=c@+Y9bQ]-n>͓!AP֦g?ݪ_۳W/͐Ykr1Dr^)SNŧ\%ʨ7픛=݇ v_7Ȇ.e$o b,rU}[ghZ/埥MdKL AL%]\$` 1K_.@KߺBFxߩhjw]wlA\v`wICAOȎd~K|q]9+3jĠkh ˛MkosyqhNQ \ƭ SFų`ͼVE%Qv0ufU @l RZ>MTcFKVVVC@ƶKz{K6g8Hk 8KdL6[oR[-m"y׹.›9FS,}?  {<ۙyT$ߒ_>`~܁\L.rKf;I n{FnJ8RY^!H!'*L>!L81?VK^[di3C"-J }|98:ZcᬸDWrlgtwg퀭aZr!gjXȉU\Ki`#k̫TC<,Bg'1G& R.mc$9USE!-t9*j*Zq>1ڜr)"J;8z|Wx6|9YI 9U1W <)Ĝz+N5|Vϧ3ͤh00ҳS,C>LbKHJ^ޘ=rtFjħ\MJF L&YOWEӪ'.3a0o!-gPAI~\6 _5=y,1113VȪB2{5J^]SA%";meVhSQԝR(&J k%TD{dĹwQm=Nexk3e#W;}̲Dem>iSL4ۆ',L e8^eٜ>ƞ> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( мA&@ 9XRw\t?VGg ®vBF SO%і9% ~^8nQEQESe*'k6-FI`=iOPӠK-m4 1è=(]jWw6wr\ 3Y$]6#s[uB1 Ah#+cXkt }Ur[9%@Q@Q@3 zD%X2cfz?8/On7 .1[7V`)rN̗WZiDQ_; S-xYGq[o5R 6x;TmTbέ{x5 6&qԿMڗ/{Nd|A5?_&Kj?/^EG_U;#H麎/W|/^EKaS_5;#}>7/GkبΧ݋B}<;KԾkϥK׫QK2vOקS_MZK"m}|k(2v'4O;_M*ץQK.1}r}>j ' p_Pmv.Ni>?5I9oT~:էPd\.6qUn# 3 ZɞRvmEyI'5'r6>ʳ_qjq%ىD$Xn3S#ojQ^iB=KS/~!jm _R}?ڮKQxnNQV5]1ְw=#NF@ tixWklPѿX  N3㚺''aPa,UdROHSSEc<|^ݻ/ao"?5q .hBcq+NS2*Nsϥj׎i/tV-V;OOrWwJ"i'%OSojh+@ng]an@H@\m֩xhq#w~_zm;JBfK׌\4:0>gqo[u Z<ɮX݌Kᵏ텓=<>*-sקN4Q:z/|iwi[yv"1S?5vZ޽f ;gNJ1%WcN$Ѭ<֍Ԙka$cv*H|w\^1csFe69ڮZEnO#kxڽQɵ)-Do79 ?a^D֬malQa ;[PWef,JJ )89 p(2B5$loj8}W##0}?ޮ:ɮvՍ3w8ie$[Hm tꥊż5EW)-,w T!k,MTE6;vcZ< kr !՜ vq: V1of2rR>9X-,I']Ku>V1X˩\j#ܟힵor;kJ)vXǜLXIw\uiꈱpO2 gWgNM(8D6PO9Db#|'鈆307\Җ<< {ڹRVfH'&g q]}q$arwߍs͋Yav=@;+WS45s=yYgC.6IEwqb42 p=II&BvL:6ӵivqnT91֬ ~Unc@ ϥOh}t+`V2d>hF&]@Eu^ oY!6۝}7`PAL֟/[ x݈`8֘Kv9qdwj/3;s^^C wl̡b;G0"ɗ|R#ޛV 150xާ<})H~P*jsɭx̲0,ּ{YhzV毚e0XORhex|I (2穧6)I,1KϛI1oo&sM=oŴ 8%t5]2=be)_ mMsH-Wj>g9?G{iѢ`v~[ZYo]pH :=*ޓx$I獧Ķ[xKzGf%8?:{/Ydm s~n~ H" ?Z5VPZ"uo2Lrz2\Dc2 ܃ߚf\ޮP8aZQOZw{]ziۚ?o߽h$́Z0pxW4!rOfٔJvn|ޘ׺Wj"Ыg+e#.hQ^5 WNcI5[4#\Lo@I5:BnF",`YU zi?A ï<&c ,22y|+e.]oi WjHV nG${ĺJ麔vr+6"fo,R6|@:D-K[HՐ6>ɭ[3v 6K׊EehTTY  az&?J_x?޻(ί)>'<t*ڔfQ3U`SdV{0 !̲cjs_;6؁H#h4`֫Gus3?*),]6֤RkbӞ&KB; 8 Y[m垌ؐ5BU1M4L9v;QZ-MD_a\m^1:ViDEag1PW1c[<p#\3H*j)4rHc)In##W pFt;*X uU4KSXT;X^؟jQVmQ=I5.$䌂O#f%ڙ\yde?x`⒋e: %=K9cJg*'֫[O*BIwqO#ul9jz');V99x6oW-ٳd^㌞KO&,B:|taUcTNʼ76q.!^^C& RH?yG.XqҗL$g&HYWN0?Ɵq¨ tHو/'r[.8/889^La)=D<"y!n)vdo03'ɂpw}+:;szP8 vZhm:%\M%q~*_^Ү-drߐ~jH%b??)[7cօaWCzW8$wn`tzkll>ֱ"dRM* G#jI(tڱKRf8lk*RTΌ +|^pk(d$(U^kF+R銶4H##<yL9=/!e$RiqN:-+Oo9f![yEWyv:S\f$B|yUS k$I"wU-. 6v8HGVtPثp^DR1*0,;@#$EGHRye"KH.Q@:z( (2O /Am?ҿ#<5.ThE]uoїK^hSjڍ d rN:{U뛛0{`s\r8`_7ϠűfuʀCy ԓ$?6Ojc>aE>(,xlZZx%lw\ԷI/#~7\y͵Cu 튯}ZSp=jН[,Ni=1 NO@+&K[ lpϾkHa#L}20IGSbgE;Jjw^-ͻ5b+mtDrqIԯ{a/}h>ۢ'ikfHݗ$QkTz i`"1󭖊͚elXF\+ 15?CMcYb@Z;|$=Nkgм`IٖiIFCckTZ&!TKko jN ܵф_es-խ$gG#rJ*=p5K G`.ss'_ck%y>?°4"Cr#uP}4*HڪI?zu͈1(?ϭy8CG2ŬU, [0^г7'lc%e޻00ʂ99>3.{bb,Đ #(EukrYȩcpY v1˴~qk0<7ɣ=܎6p-O,ۆHfa%{ٜy7Ec 5fmZ6_/27{LIjͦ \Ϋi_?XfM"!x9zηʇĬymƑsnвȭI,?2ݼ'>;4w+#ҬK4!zt+x^l\wL*Z92Ȥt*ֶ4r] of!RkBj`O|TD%D] V+KvCT9a{z#2 qv]j S)jKs']uޠORӵmO:0J+ROn8or >jZF]>΃+=*'!\xU;3c+1hMXڳ!i# ֍av!<Ҵ?4pNRCarƱ1̇j3n=k]k6gܸ^-#&9 57cwFGk 7ͺ,k6N6e|5څ؋Rު@Mwɮł3B]F;bbb#U"U2I>n6QG*V]6ny^W*HRE[bmAeqSYw )u"$+Iҍ:TӰ#m WJ{{P<~b׭Dc3ԩin3.퀀 קUrVm&b(Hpă}ojrϹ|=xdvpBg 6Dg Е6Es85$IZC( †LԆf='b:"wcgXs|aO q[ZfMhW. 9G {r6HK+.uf5sDy T@cW;UN<ᇙ+'m^$DO_^^S5`J}ڽZWR~&`o?(4j/irb 1VVV CGf,p$2nbiQ@UKN_*"o"["n'ztn_0x{y!p;[k8888օe_?WbU} +B:~K/?9z2z=M*en)l) ^ߍt 2 /~j$x7',Nmh{ΖkK:sZVs5Y~e\sqVgsS麀 rpne ׯjHqޕO H8kNO^E"67xTpX$Cdi< IB94 f^;6񞙦_j]Ge}Х`aGen=:veFʞ8n?5R7\ ŹyP<ں"ԕԚjm/?|8\I|reʜҋfCr3yD+\cMs1em,<1;}jM3>Tzsp#'2MNvJw =+Wrq> ǧ5̺Ӏw ?7Nw-r/j$f6FH<V[aRUn>%%JGw^qn[nY'`W౯G0V܌~Q3ovgDLItV}9x22,kZ c0qcvzWPAcMћs+[|YSQO) Ny?Yfb&؋N3qVmE.Ka~bM%floˆeۼg9=sRCfImvk6}ݜ۱Ҵcf[>cxf3kgjS-=+-leoOƷ"#3ksKjHO#׹H~ͷ?j-S[2HU\lJ>gy\ܞQnu5s3ӂ5ňTۂ=kIb&Cp  a# ʺ& ذEZ4`瑎ԤʊŰws],wJMswЇ1bj;;ˈK\׫>x9G&Iwusҳ5+> J7 _1`B=ꩧ2̏'9-qTY]+xǗ W=*>{Uc9\UKy>!%߂܌ z֍"BL 7rz\g|UWi`T6c5~$!ZB8AM{yeRB9qP2Mf6).wpRj͛ܪmb[8:VoV5$wnAULЮ4cK2JFpkk %쌷p@z{cMI//~QEpQEQEs&VK1dٝiO)'Vv6$)Rx9.4Z8z׭DeSQv8 R?I9fɮPjw6?'<=54֒Iplaq]gCHm)iȐ嶁f e㜷~8ڴm;kO-ǘGerfvlqc&K?qX f&RY<9zG5$_ai㑏^kuia>i"F'@q4W˼ȓ0ӖlhCĶ9z IUSݓ#<͢b|,RSig8>sЧϪgM{kHٞ(|!II$񌎵zV mp.3='*1Yh {1q< 12kbL{;vďf<`T˒j2-Rĭc7)/ #syiUmji%}iܼ=uo HD+^Yqȁ-kIVMSו5'f#+t' zxp^Ԑ\ x7\^R.E#l6O#WB9 2 |梲=rxךbXɗ*s{rORe),%I=3o˧[ Ł0olcZyZcI%qn9zq.T^{21-.Sc@սF2Qc^Z~|^fr_-.jx#dM j6ITpxlyGr21:`梹}wh Ȁ'AYBJݛpһMpH\ch([Ҍ︧]\fAq"RTx U[YEW-fMS\[ďс*~bp3F)Y4+\abFܕv^D=fdd fb6 FpЛ0?zUXԼ- d[hn4qq'HЕ ;d'?_p_x&8y5%9{,[4R}?BcGC5jIo lݽ˜WhN*ufraXs?A[HGo9X޵YCYIgK}"uFȍRG\nҪQWg(|.? 1rt߾r߿zjaO9mV/?;Guoj]*oG3aWo{W  ezSj^QvgBԊ%̌U寪^— UƧt8Oº,9챞/?;Guoh}tpWt~i%Ə8Ė{s?Iy@G[چ].!е&TVaKW܅3I ϓK}NE?ƤԼ-ڗ{}%֑2i0QA ؓW?5XԼ-\O2qʁ 0gߚ^–ܫ3z#z4Ct}I?UE?cOW?oWcA=JejUF¬D)|NEUQEQEQEWRwd_`ߌܤgZ C%dӛJ6w-8o$/VF=~! !&6k4SHZBci(nz YC}:>qῥZ{!]2᰺: &&xAs d;t4U \7LۃK 633)`r=:U*HK4R+ۏƭW1oSN,cdQ)c"!X1EU[1u-yc;V\ߥZ_ޗCuoglI5Ɵ5ʨ cu%`PQEPEPUlŘt7_%Zvqf[oHMW:w6Z#J:Ȍwqp1089(bt˜cϏv? u{u9 M E2{?~V⻺PcO-%(w+(Qçp(cO>c<Nw}k$ю9!TlB:V_gy B&cI,q ֢(mK ż)cv8*5;'F%f{>Zͅp\U\7LۃK 633)`r=:P( ( ( ( ( ( }Ũ q+:밁^ҭQ@r=hBk[b,̞Yq%r:qآ*bu _%o.0tº}R=C[)ztZUBH$݋2Y EV>]jUy"-o2|lO<آ ( t[x^&x`BOuV Wk`k^`t((+kw$$zF8{ Y_Cm uEll@v7ʞpFMn@Q@dXjfQ.dV#fU!C^X k@Q@u5M:1t(Np{KK`'kL>>FTpU((bu _%o.0tº}R=C&EX-/$;JAyػ1%PEPEPEPEPEPEPEPEPEPEPEPEPEPwkm-($8蚷f9ynیu@H"tQR0GX D}$eMvSf1ԕ,H90ȂkYݢ/RHlN7 O ]Xi7km<4&xmՇ@5ȞXD#)S6Alцv桽E-mIm9vf*Sг`H^wksԕr6ph ]VJѝUF-rp*|о65+d"?g% Bݲ(=Y@%kw6唳 :P}n@úƭ]WdRzZWM#'O`=jQEQEQEQEQEQEQEQE endstream endobj 308 0 obj << /Length 2628 /Filter /FlateDecode >> stream xڽZo7b?HR kK]c$dYd9]'=~3!!Zv\aK17\jY_N RR4QyUkjWDc\u6MޜI+\NѓS]O.8CY8b/qrǨ#!5ٞ0C[O$z m%1-1#mc?p5|%S;vTfvۏ)~8dM#,t("p҉dwg' F_W"mN>@7MԤ {Y:u?W۞ 4m0@ 2>ڇKfGb#YSkLppƺMR۲1llsQ;d.<'^fYm7q&(MNWд9vEQ48:-,Jtڢj1ˋ^i6:j]·M0BfLprg'3_GOjRG8;\O^,V{mW)a@LM6D}9׵еNkK'&Z*9)gT>:shhE3>']I-n" c{WҌ AHߖT&E 8C 6q^mJbOg)r eoh&EM3qv zӖ{h*A<'2b]R<Uo󢼔p]#"FxI9a]t趡p)+Ss%H)Ba$|0ׂoi&BP-L˂45qA0_B[9UQ, *IAoڣvt ^Fw-!C'Vj du.]Z,d: {s:f34&bCI*B?)(5ŒRQVI+tB^gUь>BzJDds nn8Af⒢'(pIm4(Bԋ67nPXy:n"Z#h #Y<ak ZC9tEG⥐V8v~`W.|x"n_xQPLьU6xV???1.fH>-Gkih0}j^Z߇{eƾ[ǚ z>D5Aw/>/P޷:0;hvJ8ʌ,:1 q-քP8w{>1vwvS4hw_x|5 ciӂ{88qL-:87UJ:E?VQ`&|lB)taA]M]44 9Nc@R` @RmM e6jzHa} ?.y(dtksg2AAHfޅ0C8uF'a7 e$̀uَN rwp y*<چY#bb|3d-X.I;~t?W9! >!_0};B0q?A0 F.7Zyӑ-䝺Y|G̡qf?w/*qcJt)1"a7Wvp|xB]l 6U>U[y#4zf&=!#zRXU;][@ DǕlϘr "x4%+[*,Jbm(d<ƃD% /]wxtYrN5@]/ez-Vv=> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( мA&@ 9XRw\t?VGg ®vBF SO%і9% ~^8nQEKTgdo.E#߱FN73`P2IңCIx_̒'@4n[rSFo!{[+ي,-l]#m8qZ:]Zl jD0D}ШY0:P(9Lkdl죺r:Ddao qwUAXxmKg~W nޭ׀+~ Ies RƄVjguiVwb2p=N)鞄@MZmMocʱMN|mRF0AV 6Hw`|ejHrKg'R ( t.(ͷIK1&LG͍2սyciA^sCysFr:xbM+QK+x ImyʌrNhz oxha}'ϟq͠nFxD6EWF2 "n5!%YXkoM FӞ$k'Ě^u!i4cpҰRvN$խ\#[GnEU䚡諪Zm]Kh0 hښsk͕ɷb͌Vڤ8 `;VKq)q!w> 4ۍ#L[9ł1ŕ[S#-s #QB=A4kjK Ո`PKv6Q5X6$]_ UuQnّIm~?Aa6c{hnob2Ywn'85\xVP)؀d|qcO7j@' yt4Ei{H ΪOe]*;`xV>"+,r %TA&Ҩpyu(TE5€ǚR| }E|_,ew8Uf/ |GsNjuί{mಊ9 o4qc8 5j.~%EIEvʮ{aR?@dǽ2}o#(#\,I-\qokƪhO<}OUI,rs0??Z+ػkMCdm$'Ԛ{}GZ_4W1n#wϿ^ cko5RG6}K4hyj->vbW: .ly6w9kD50s>R5j ?QY+Rk+gS<  _&7B5O2)+'SM\_}/ _&Z}Y/7a T _&Cv6ףG.vCM<dɶOOt(fQ"p1f+9)5;<=E{g/5EhsT'ƺ80XUɤ, JjFXu%N]L6}67[5MAcTBdZs;\#y۵zDZ֘|EYUkЧm`\k1\%Qʌk~+?os]yYӌ\ 556mo84+1%9ȦI7M⼯fv,:Y..m8xd5R 9{Y/AR9˖,##oR:=;]߫@Ir#` }tN1俵wkmt}>^9ڷwR_=0br7lP7-p}+jwsoqMq˴9} 6&l|'4I C۝oSl㊷h:UZϒVwgfTƺb ^=Q3ɬ9knɎ.3ҧBom O?6Կ照UrӻxRK/!V"F I_j9Dz7]x`?{zԗ7;ߩ|ۅQ]QEQEP= V7:^E[=EOQ$}Qa69xX 5 Zk6a_5Q>o[֠$N6ҒVf8aVw]"6^1ZEZƗFnR2º D\0\=ϥm>ҕm^ z5SlP!8,۱+8;2pN)Jp|GzʹCXDv`ZB8*@#q9;\z]EX`jf00[Ȼ6*{ùwk"`8$uwʬgv{=C? ђҭ#J[>\q~R۹rҴw^^?ƻF[%ou;SJdzZTgq-uᵩF+Z-^]ތ.$kkA 5 L{82HU8>;ySPim;Wvz*sZ*D|njV TdimO|֕UnVJԖn0BU* -TNZzHn QdB~2f'p=*X'daH+0v=sYW ϯԳ:4sxdv s_$pfn?((jvI٤e3zHɩ{u6dhʬHV#ЕlOamy`tu3YaS`Y^K)uVO+{HbP FҰM|(p7p29 s%uZTMԣY\ٷ7ygza<<%imo?űEMjٛ\A?_n~U(+F2ΰ] S MՏRk~O)Wu_'m?^-{kpz[HOk@`p+&s՘珥JRAdNq>9539jMȍpAFVCvQ'}i}jǐ+V:& )០ʥIR5S0~U}*+9q (s5}'J{˘LѤ(O4r09=1՛v sWd$@ʼEN'ih.xxȊF%F'hd9Ȩ)O,Y:Ii`j"OEPEP^!sWI|*'o4O /e0Vu/F]=fO=e6WnIcծhrW0/ʎr2Hʼ\5'dwQG(9yq ^=kI&z^+~'ʄFOR+"Qm -zXҮ[`y67B50riiL_^IatXIj# 8fϤQt rX]@cdu5FKlݜdY݃ gQdqަbަkQ1l0%}?d]/"ɰF3]c6̣r̗%[xg]EdSFqP:u_&ϛ=U&]d8w<;9t]\adEW#.XUp}Acl\ddj[c޸%dfc!7Hx0:Tږ qR9j|nt0cRe[FyR[]Cn+tѸf\c=\-hjn]|ASs:IƵ32gn@.#Xg&SʣIܵфw|DIq~qFf 075ߚ|<3"'v0z8}v榐VW➢طl(ޫ,9֠83Qarݓ\]zw/y#svKOTO K+hSlͱ|UeI֭w Z-GFdz7N8+0ȐPh+?f%]n~`1Wfu?svo*[FC} S((:Ȭ$V#? @<֌7$+;X#i$|+Oֽ|KmxrQEz9WQ,^?XbXІqU2YEVIdW;WsҢ (ZUDD?7EO@v:-`/B6vPpppq ҿ#<5.tkp֢ҿ#<4x=QYt5yqˊ"Skb2ǯEߛ!*~P3¾mA`mFc5sOczq֥F3gӘoʔbg6 ћ#9H0+נ })%*b}nXF,cwn}M۾ ۸OjȷV'3Uu7mZ =*r_'f[\mS?(8V$ǯY$ tu{zjJI&rouk’'ұ-exk]8EjrpF۾jW 9^JÍW-vmYΙ-I*֎q9ְ-^-L;)+Rdtk+_c՜~aEWyEPY:׆|/ۖ} w۽Nx9ZPV5b7ͼ tL”_ܱ5r Wm:4P6m޵ ! f,+B:~Kߠ/^җ#)00SԐDcv{/ޭsԁ- ʯ+}-|r:sppINZtD{:sz9%s(;b:縩' AzV7[?8?gvFSbߛANyZ@=Bf<}5/^SGu2Fiq1OljydV%ć<ױb5/[ +BpOεKgMs6@[9#1S8Dؕ.6I|Ww"|VUD99 TRE+cJqr'ӱIaݞ;{֯@p?Ց,J@\[+z|["}Njj޼ZRz3kk5N{NF,̀^1$Fx$VH28j:m' "Տa1L_v<냁p2U*m; # H>Տwl\o=~5-ˉj,`3~XI'$5!h *&yvr~RθY"Νo+H}$(ֵ~UMsUs)[,|du=BD`2Ƭ[Z#*@r95=2+ϩWS";x…^~b3ZQAh{ү~\s̥!Q νRJ,SQEzǞQEQ\գY5vgeIվ], O h<7.#= yuvo~V0c*-k~2O X@m2p@#oCWu_' ]莻?^9 Bp{Z`]I qT+?֩ =_-cih[\M!nՋƬJr#'$LNRKObpqsMX($sVFӏz#2XRdƣqԎG0N:Ɱwx{{ak:(,Mh:u#da_Njx'R1gʶeD##'p#} 5ig~U S ~~mUy3Vb=x>z"~vY}[oGf,1}}SA\|矼HPcc50~6 j+GKVu`fudJ0j{qO*տ3}_F/'_2>8̇sP܏j A xy-T2ڪzdtLcЉ$T𦈣ڗR:Ɨ򯸿oWE>ƏE_ȯ5/uojmv{Ht-H^|[ZRUrT??ڗR:?_p{z30O*??uoj]v{dBԚ7R^Z=?_p{zF<i?zKCLOy@G[?/?;GoWD<-WxwJk4ڗ7qבX"YP8KRU!{j>Zo5E/E gm)M?ѿƵ($L)|NEUQEQEQEWRwd_`ߌܤgZ C%dӛJ6w-8o$/VF=~! !&6k4SHZBci(nz YC}:>qῥZ{!]2᰺: &&xAs d;t4U \7LۃK 633)`r=:U*HK4R+ۏƭW1oSN,cdQ)c"!X1EU[1u-yc;V\ߥZ_ޗCuoglI5Ɵ5ʨ cu%`PQEPEPUlŘt7_%Zvqf[oHMW:w6Z#J:Ȍwqp1089(bt˜cϏv? u{u9 M E2{?~V⻺PcO-%(w+(Qçp(cO>c<Nw}k$ю9!TlB:V_gy B&cI,q ֢(mK ż)cv8*5;'F%f{>Zͅp\U\7LۃK 633)`r=:P( ( ( ( ( ( }Ũ q+:밁^ҭQ@r=hBk[b,̞Yq%r:qآ*bu _%o.0tº}R=C[)ztZUBH$݋2Y EV>]jUy"-o2|lO<آ ( t[x^&x`BOuV Wk`k^`t((+kw$$zF8{ Y_Cm uEll@v7ʞpFMn@Q@dXjfQ.dV#fU!C^X k@Q@u5M:1t(Np{KK`'kL>>FTpU((bu _%o.0tº}R=C&EX-/$;JAyػ1%PEPEPEPEPEPEPEPEPEPEPEPEPEPwkm-($8蚷f9ynیu@H"tQR0GX D}$eMvSf1ԕ,H90ȂkYݢ/RHlN7 O ]Xi7km<4&xmՇ@5ȞXD#)S6Alцv桽E-mIm9vf*Sг`H^wksԕr6ph ]VJѝUF-rp*|о65+d"?g% Bݲ(=Y@%kw6唳 :P}n@úƭ]WdRzZWM#'O`=jQEQEQEQEQEQEQEQE endstream endobj 199 0 obj << /Type /ObjStm /N 100 /First 913 /Length 2790 /Filter /FlateDecode >> stream x[n9}Wq"7 `q hG<;ٯS͎8nv(!vHB/p,h .-&J0>8rDM!]` Y,0^tx<>:JB 9OĐS0DE/!aHB>Pr>;CyŞ'aΙ 1KepdSW%ȸ b$ ):BX$# }y1LhBtq@4}`*k @vedґ=hRHI/'$}HJK< ! HxoXAX1A=$e21LQ )W׋b f@љ ^ ЯbJ \!$K֑T\< **&VƔ۠Wqt`@a6{H"Xn޳JW5 _ۡJEZBtu瞼 W>V  6g5r/÷o3|=iËlVKR on1nJ~i'?;\0Culߵf'wmjSmҵOR8׵?:^:^:^:Nz_yK7w,x.݇U{d`rnºÿ ^ޫ(+i#>oI=g)9N}o^0+3avn_ƓUcNjf45 bd[$lQ/pv$0&=|[2,0cs,=I>LIV=m-Gb7pO)FJ9榙Fv9A$*h0gš@^@¹@xVEHπ8۠a-7G l6PR-DlpA(97j2Fpqº, Fq>hmi0G9;rugqb+,98r9֒¯0ۨ,X|{uiup A< H8b"%~9lQmaD1gA؎ %xJA8?N65]h$> $)6jR]|?VOr2']+`FaY gcMM ,kBN6D>"lZ GuKkPyAԚמj2nzGScj0rf0\<rKF%chq|_e5h㕆gA'hr[|.@`zZ+:uюlWBt,{]ނKTۂq` LvZC0tSV혗X}j>ˬ5z^kSKp/\;--5J _/s3ׯ.m~Y^H:֑6666׶cik},ƨj*0A IzLf=^Ay#v8"[ ̫i7w|qKz,{9Y|6{g Nw>{ ,E~~VKIsBt{f[C8V~sCʡhN&@s)?`8m%I OFݼ ZW?ow#n4܍zX2ux*C;R+tw4 b~׬uS)ǧSnv<-8[0Hw˭䢛4ݢW^Sf!+I P}2f1 =:}A5Hh68}vt&I4'0荄:M2~upH1fD_JBK~$ǶV!JS ˮ/ n;i 6ړVpA]t WԵ.Pn>@b=t3Im6?6:E:I:;Z{?[WYqIkt\ |qJœ5^dYCd #ۄe=/ gE!+P\]CAyBGTpt&C7(@JD(Kz):5w; ⇟>1ő 8ǚEi؏5{_,8Ė?=肘&OGSp?sܧ"n7"e󡯫mo{>Q/bъ|X_!K9bTrTOS^B srmא`M zs{L@* U=2Y.€GWwvℊ 6 )9\+M endstream endobj 330 0 obj << /Length 2934 /Filter /FlateDecode >> stream x[s7_[M"&ә^יkKYe%Jv_H.W\Kv:X],@Th1N=;yv*HpVZ.G^qVftv1zS 9_NR --0!WcQMwWxk8e[xN96KUDʦfў9Wf'0[sG K,] j*OvlN~$-0P.M 'uVGm:>KWjY#6i>]/&@,]o`v,a!نDXD`v4>+{4(؍Gwm!%SuBb6P,fg"IM$Io~6khvkΉ>cs:˫9osk]@|?vk^MXx>{xjI A;Ag):ODP)ftTK]O͔h +1}>u*F=Or䒥~BzN"qv%Qj(]bG]+IqbLjJlNt؈WT8{MeK)w%)rXw%A &4Q#Ύ7JkNtB$2z4P,i,m,{W~eJE2Cv>O5@f?@tzщƥ5놂&yIE3sf-; rw(K9&K1W TH%3[:{&Xt)Ph1 /P#}ur6dPCN9YM~pI'{=n l!q[ȝ|Qb23.z6PQάm_?aǰ(?<-"f?Xs򬄡i{^ւ1AHCU#?Mv8䡢J4 \^kO֩љQW]UDŒI, y﹦F̌Q|}ޛuC|wEaS׫d XԢAC{L[ڠp\cS)+C{m#ԓaAa?!9)ޅ.8Ae`#n~i0y:{h!5Y$4z|3]h:qpv5P9כFDƾ_nJo˦V2]wGF89OÏ(<~)Pl A/CH 6(hlb8~׺npt|[T0huK.q8{rq8gE~{L"T+s]״p}Ks& / g;Fsмi?D8>WшfXhL ^k1Q$0f(S % ~R,!j5y8*^̈́ Y{}XŪy1Yb@nA2g z| 5LUfb\ilv#D&3>:K7,wt@e0?;90`K!o|tL>ucϥ XS1^x㘆5\C58L{K(>A"A:Q9 U6DfV~gzo iCB!]n!R`Y΢FjQ3'TY!1D *`ݎcXW%g(|J)uD[K dѳ,R֦x~e2)(Rd# -q 8yPg bMT,]oN=Tu7MQu4TUƱJqxqa֛HS.PohEi3>1j D_/iQZ RfaÇK/z.%-+/ w3/߈i>}-^rdHnQeGjsXI uukѪ@n)\ |d~;DoGr,Đ{Dz.HP;X;a DZ,?J<}ivzlr4f'RF|edyQ6 4:XӥJ)L$tڦcI }i^k Ys/:XԖ PQKu=؀u,BDd: Q{ :&5ucI{ѽ#4+Lb,u^ϋwu)Г"C"ЖB] G62o}>.ĽHHFf^|>Qw yIyc9{k '8x!^~ωo/ endstream endobj 317 0 obj << /Type /XObject /Subtype /Image /Width 342 /Height 240 /BitsPerComponent 8 /Length 16769 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( 5  w,یy1Dwִ׼+{iok*^Q WBN #8ҵմ{-F84'T65nY%x`HEf$)$퓏SRP\ռ /m`!zkPu;#g4atMq.'[N# d[];ڭb1n6lu9Z;imT(@6$X9n`1Ka'hes[Si2I5𻝭WX|E[.ĞA۠ ;X:9 ovTmtjn﵈͸ٰ<5z0[_XM..wXV]ۉ8oW=g6(ե,v +?X4ګ rsy su+!I,3uw 988-QԑSۧ\=CcA*Ӝݠ x-;LG DVuVr{*Q޶+^Ye 1,72Ȓ 6GPs+x EQEQEQEQEs?ukO]yrlVeE<0#=bWSgo (#F:'".{}V[Ywddq͟Ƽ:-2ͮIh?VomMvpteT~O/.{?KUis[7Q)·W]4'%ۜ^oZmnV(F{ss_OI%H{[`ϭ{5ྶil4c92g۟ƭWk#ݒ/^*-,Řg)-;񪇍 GZ Bm,"sٍ>Z!Pנy#iI!-[jq¨*f?ůy2^ =;[0a9wq{yZ0q-$DXټ^UK1~ur9l]?煯C̗K[2fIwA{Z;hufRF[ɵX#O/W6k_4jĊBh뮯Ŕ%7}c9FƭW /B93Z6\b?ڻJNȇXۤ7(}3nVuH[ĺ?V/ι rWL&EUQEQEQEW#>ޫ3y;c bT'rx]EF\R|@-WekZWX#F AS\۞z]/THm#S?/VIҵ ?_&xxu;#~}@GjCt#PtC rqx(>_U;# Yk@ϔMXʲl)*]Mdo<)v9*?)dqԿM^F階@/_@QX,_RvG[vv_& )+7yNύK5kըym7Ւ}B |j7a\mz89z*dwTQ]QE`QEQEQESS{-:{ Z5ӭ[+7N N?1QUbrof)$vU}\`[pAqNԫ"yb>Tvqo&Bn*8ڱ$­?"ȎY@35$X"MВY xFZUZk-|?y/tg~$[Zc`HCnH88I&kmMb28<<2Y+], yHv|';ONi ,?-L0#'<MLNETmi}l| \a_3Sx ;{`ƮT234(pdPaO_~kBYi)$Q dA&m%m:>?Z򧊬d8hgNx& ,0=keW^Jf*FG|䚎znd\asuLVDM{o6T#^>I+E$`M# <񎿝dJ#1B bHIWjbym0$EoT<,&iη]y5K,컂2'nj퇎u,SiVƒۇ-ya}9Ni %d:۝vuqW4int+oq"[9,ʼn:~Yb14%'w{KmɄh6 Z?GFrlFq[#RUX0 rHIk(_J9?=zWKWM<,'mn@Lpr|Iy 9\k &|*_ӊ{%~a5?Z-Ѩ,q\Ȏn_J:5©>W/gr lpFGZIYZGX\6w/Gc_YNG|PYjW- Q{TNC~zVrՖ75%@U"mfx5KFY#\it.J:0P1C]BtĘH$O~+>_.Xd=k]E=в(,’ck6(@b8'V,()e9UHPN3L' j{ *ȉ,C  Jjr0+]Ed N[P?Mu> x֦ vvЖpjY"-)x޵w~cKcZ{X_v}@)?x5cϗ|R*I$nxgiyQ`z~}u ?tFsꞣy4qfSԔ$2]6PCv4KY>l~PgaIN3\8u9¢~mltVVYJINOzq #_hM!續⵴FBN=ҩ\dԥ'ΞJ0mۿqL4Ť[?>Y <;c`3J&՛"lalT3olGϗxh*y]%Iy )Z6Іl YВĞg֫d$-OAB#$f$U Ib2pr~_WPAֲ}>I9ncYJ]ߎ++QK z^^Yv=[QEqSPt&4QIb5fS/p4m2"цXG*=J4,:"f0#'qH91޲ R:ޟ5YVv`>Qo dr@;ZK:>Gg(o2&n&*k/] xytKaxDˍYn|yc苜ջ7anԾx4PVeIKy.%` JA`ǫάjꯥ\+i^s4O /d 0Vu/F]?zyr9HEBo2١V(鑚5{y -Tn0v~T$Ï㯵|+ٟAg4.>^@9|,q1.с_FB1zPDd2c/'\v#xQ'RU OƠCY>NT~CZ,PyHi`c>^Uz,E @9G]%̏|ÑWe;Fݹ:w%YIBxpN};ts{jL-.F2ˆKR$j!TA3grߧ[`hߏnYXťYz"`<0OHX(?ozS2R | 5XhUAwc޺6XOq黆M$?ԵA";/’F}k^a(v^Փu` NNG>hTˀO2~Z(VǾ1A.3EhB=y8cX?5|&Qĉ3c9`Ii&j{vy9QǦ̤O֣x^ehqY\QQ[2a[epxER)w`ztOalw|ȲX s,a`L⻩Qm]ju:hu""jѱYJ5z*R^goQ]gk=&hH'EU9bj2D X`hye^"p@m'kn4xoAi 튼qq UE#2HT~ou'[a$B0q Xz((/J_^+/c*]+B:~Uen~Ԡtޯ TT#GM[J^jF1d2}"^9)~5 P?lvQc%Nmm(;t&)sgo}o%I 1ֲl52A<<{~|IP{u%gd[d #א6sZ22ص& 㜧sVrJ0YIjբ"c 3 aY69Sq]16 .:sT21h*|g)yQZVN_8z_2O^3I19랴ܜs9t7,Bj֒ȥNӕX0`szV:W {Rq1rb+e͌לu87E^Mc*QUs'wy_tj7SQм:8q]'tijqfNzU<V-#ES,0zvu"N"O>ǠWkVrx8H]W׃M^%'' rK jŖ۞CͬAevvrۨ흻aٲW|uY,jHn) ez@*T̺ bBeb\B*t9W?_ɭg"[ gDd]p.ӂA9ރ&r:Xۭ@|F8#ۻ,Y~сmq\5m}>R{WXikzc#ڻ++n%1pEZ. 41U-7_w90]iU s1Z1%+fJ9@b=ԕRRV: K.(^iG s"T^5-eX<1\cƴF-gZqJJKJ'Gqe2ѐ=k gJ wQV25NkW}&c;ٙrtAc0(T(r8#қ,omxԐCL67+mY׹f8X=ոN0{t56BH$t1Gÿ*FQzO.?-#' 77-\̬@ QޛpܑjxPBu? r?2Nwѕyތμ^ҧ5 9+5-wdR/ֽÙF.'&_~iX/.դ 瑖ǧO G>ӎbF@/O~3\ U=wq>_Yy9QJ)Ȑ 9 SM7w+_V́y#ǖ0fU2`ӂ=+8w1VDki*Op9UoITTiB6;9S:.U?ZuJ[ ~uƾصw.FK'\)ճ`(/J_Ԛ.ҿ#<5>= Zʷ˧S"0 q09Ɗ|*2q֙sj 2u6%Uo_ƾcMrks4KV99O=j='P ha gp秵uwzbsGƱI#1U =sӽwBeYQjٶAX̫9MEp@Vn1\~ І09kum:,^o?cRё(% ֋%)͸܉@Cǭu3@, [͎k:f]nI*VWy4y~u^Ic9#g6{ֹi!"o;gTU3Dԇ6߼v6?1\¬ȿN3[ֺ[-sӡj&[ʓ牾S۟Z1E"khԬ߻oS}xޮh7yevr UoG P3$mg&Y6L3~]B:9( 1%<@N:ַVX-sP085uN[?q*pW`32k1CqM7,mN+|AbƽᏩˁ~3 U@2ǶO5P/nu#+F/=?ZRVU=RsՍHECy&|$sA6N1g5Д|1=*B1_Ұs TmһReG4&/e,z?\$&XgcO&~g=+XHϖڦeO88a>Eeeqorǀ8YatWܯc ֪m|ƞ%W~\Cۥhdt-NqnfBdwg<յfU)p-pY.bڽNuO<2q Ctdg޵R+FˍHg4!K;bm}? ao?uJm<݁ZPIb {61~5UglTZm*XO޵u{2Q8ݖM˚_ʟQEzQExoNgܰhgxɎM 0;EehcZ/niD\)E }W.- vٜmЊEch6Z]P \b=Nj毟쫌g;{}j +B:~Va2e[reAI}4XD1{zS=:O3tHBcT#i@(X#iF[gk|6IUR.! $t玕( A?L`HӁ#ebԺb1ԟlNm'r:].L#޳.^{BDjGFѕՙ<\+ 2ep ⓟMa)w7C3c)t\fGRK}wbGs~n1ExP =W\$Etj֕DeӪ+[Fɷ n;+DbS$`Kyrwg֯B^_#r̭Ji8i\2'#ڳզ@caT9''ojk5IDn")&e%UX>xHn 7ghUvzmxeǘ[v9k h)^q܄Ԯpϟ]:@>ݙ1sdêH68<:\ ӓH'cFipąT}:^C[0x  ԴS*L07 U; rskaQԔwBMe{i1hdoB qtxEvcӂOZ2'9栱0c뮇Qlm*G~|dc2Ֆ@o#l}klu+>Z53WHshɟϱqj;p]GNKsextaG|jBq2RF Pto~bj);wuݮA$'`5 &a򑞾ڲRd);إ"_ܮNaFO;+9$jn"Ibl1vF=A Ƅ[m-B+y*w7#xW^^])?Osn_QEzGQEQ\գY5vgeIվ], O h<7.#= yuvo~V0c*-k~2O IE1$ O /I]?^_9wf@q׾9֤hLXq޴wgqVz\ZNq# ?j_v{W-pI.sHM$fHRx>Ҩ NHfsp3Rޫ7#:ٿ+/%9Qeɜc>vn-#2F Ē q'eȫ6o$ssR\k]+$Xq[Vڍ[@ .xub`c+o~S4q~dRJHޟQ1@ƒߏj+/bHcc]wآ?6C$g(8 <7O݌`d|~bد{u$W[NR||߇ZXoFDH=GW.;_CUAGL`Vɦ5[lXh(+@U]Ban91juӑ[t'-`vեm!hާFǯQwDֲ; =+|f5mc9eGYx=9=k|zѫ};NkK)QrGןqxs6a7qp1@-֯&T!q!8ufJ< y~y>h@?cĘȼC,qC< ?J;жc=FƜBZ;+_[B;*t2[6^*R}FM^A y܌F2qd>RTY!_3XR6}ޜY0ddqZE(J-7m걶A;W[0᳂KV!l|l@@=Cw'l#ޜෲؕ5o*Gpz Ad@q۵$IxnWjWj|ݹ)$AdFB2( nT=joiذ9ߞ@Oz܄mےqtx%9sM[>wFssnEd>+Ȯ (Us # c知]Ӭu&v+\dqVh 6|Mѳne0VIopa$d~5WM?O]eLn!A$ (j1mQxLO h ezSj^QvK?)*Tgo i0֙ƠJ]*|8#UK?7:,hZV#=aBImTg?_o?7ZѿƏK?y@G[_WB?Fgݕ%z~O*<H/a}UK? fEIyk$ PKsBz)Ui*3~b F_i35E/aKW܅3Pvi\5ŝ+)Rs+FqN.)|ͫ6±.<#]=;v.''޵YCYIgK}"uFȍRG\nҪQ%qFrWGK'OKCٳ?/Sj^QvK?ʾ_y ~!me3ϟ|~?R: =M$:Udx/n>db-}T}?|)4͗-ϟE/?;Guoh}Gga2?봟UO4x"YGAԟڗmu- RheI{qhti=C?C/9y9ߍ߽~qڗR:*_pOyHx'J?U,^СRUK?kȃ,w,rF}e}#>A#_jEkFӢ*Oy't dUEqc U%?((((VcP[񝻔UxsiF{崹' ߈ǽo\>!1f& | H\m%vCUu 1h`/G3\7Ux+Z<6VS!_$;.a`c8" piaRCFfe NAJ@U }f\?rE|~;qժ> stream xڵksEAL'i.iLu3I>mkΒQG} Iscbߋ+gwr_^_}ҩ*lET3W5jk5=ay~O C/vh=0"5]k77ӛ8?DB -O1B#Zx8~@`Nl+3A71\O_*5maad)@W0vV*f\1icj*VS_/kaCG2NZ8Q*@@uX|avb I6hXWdbQ @lr_M,DvW`I+цw4ɳnǏG47 &Ae:t qr/;E[^  m/ނﶟPno I@jZ6w2UwGlI{ G泸bm9.X-j?ex Ou-u3q8>V mɲA7HT1`tQuq+xL.vbQ h%9OCON ,q3]MoXf7`f T)`KGj Zr=rTۢ* TB@u&@y}_Ǽ5(R*9ǕHk!V VFeГ6f.ƪX^OM'͵չVO9ʟoӜ?_ Hs(PFjܾ 6- 9A uM# =߬CmrBȮ ݯY-[ƫTVDf|1ҁ;×&|hö09tY6i@t(NojUͿ&%9^62qj9I˜~^-ɈY11'{6$54fn,XuP(=Ap7J-v])ͤW Hz5bƄ&rkU#yC `+F@ crYDAVPrJn$grHU.vG^!}Ǖے?*Z; yfvL:ϴ^nG<q,Z=>2Y) xGY~EWHhca~{ ;QF(UeoqA5p@. 4˜_ HdLaa+E{RmYnxYYjWTVE6βB2zZ~wdK+ Dƃ&L Z;SzD;6аj b)g8z41|Qp hu4 g\1˓ (i40^>I IpG,e3g#WʇA"):5Id.bwXzX'ٴ-G-%u1\5 `>\`VnnI-<1GX2P}`1#+%|F i/JӽZ: yGS(" hKl;bZJf g8a ڊ'цҍj_') K6+rI(iD(/I?a@jF+/_eٗj+FqiƹY5tH Q6PISb 32:= _e-,8͡n6#l +3sW?*>Mޜ]BuxFԐ2JIC`ei~ Aui~e>Y<>QBtܦ)iYWn '{#6Ei8sdNtt6"(i||^VEf߂R$IV4f /Mm$UVUZvk*T7AQRIk4dy׈i/\1I9XwEݘ3\4UL4g1X>enl $e5vokoKoNb|&+dB?w<<;nHWm|5C{lW0]tij܅^ԭ ځ=)$-7a9ڻ:#!e7(2a(k^ɭcL2g2:,v1_N!;W〻x*<.тcdזb@a}![]F8yjZ*ƭU%P3TzqZn'rm-Eb!9cw~JRd򗻔"zI>by =#[/y|cT -eXí.t33δ;)A{Y_H(e%- a{H#huoKSmH@Ccbqe |nrך\?:r%3ƺi"O g B{YT"2z}?ǎ=X endstream endobj 369 0 obj << /Length 4184 /Filter /FlateDecode >> stream xڵko7{~/h|+m IڻKK}臶m,%Zvo^|(I[rCr83'U\'oɗUuʢ+;ur:iIS5Eg3eO=Ǘ[C)azwff o^_?WlQvl5Q1b}jydC0{/leYcJD v'C} 5Fx:lo~1::  /B +xi\{ zos މ?7UB@Nm S 9{]C뮰u$%xfre/ ğKQ3#'W>n5PJzqD6uK)[5(>Y돉of+kQ`j|d4.hr#U3tٖݣ \-,o"3MM-6@7 @G:I>LDy@]aVUf Ը` E f-& Sa @L9mack>>gm5 67|OAVW5l0x>mQvr{#(]u!2b#(%i%զLۮVmon׿:Kj6kfBSv-ܹM @Gω0L/!u kA/'2th0=ǠkG-|j"x0TJCNǸp XϞ UESv8{xTr.j]r U'V6tOz O9?CU8EuՁN+wBV؉2w6TAx}E05=k ˦a;W{[y)<*e6ݔse+Gm#wN:e:'mL(Ә9!:uvJJTg>tz}W֗d`݆;D0ޫdߞ;G% op4- aC8Rx=PRL3YPZg7ʀ[1ْf¶E[z'42r>0{| `v0A,&!Gt1yڪNUe6gS#b\e[//ܔWy+ysXVGJF(;7.TUO)h;Z(|˦o>v'XU(Fz coK<:ō@l뾉 2C^`yH*:U5m?YXcF7y97'kpypΈEe7Se8)_].ʂ&zr8;Y>Mn/y|Ў4]tsAV}"e y !F'WK'NO /Bf>Bf%iJJ QD' j:cd㐉 稶=Pz`dplۘjcW qC AB:C\v,&"$$_+y(L@vqZœqzs- XW;z4#FGME!25C0Q]'Е!Dot|H;>_X)f ؠJOL8`Y+Q@bۘ+'"ݹlQ˹ BqMkIݕ;bzr.(@ql(W[5;.¿:a퐛<9ph#)Of0pO1=Œ`]D I7~;n\tROv}1:[-2r Hj N2vېi &kJb+:TIBmT Lq5 XZ"ĈU읯koSoB]:96] ۿ/Y*!.4C+2vt~HK$ãzT 'Qc\lJ$#*=?=U r,P$v퓊/}hq U '%u)9SxUd]]LUӢ,rU(w[T5rwRSU ,[ ~L-.P)H>XߺA[=n7I K$JD0FYQ ^mw$? B,qh2[T,DX\(ss肋؅k$䔉r2<쨦P!Ee2qcTF !]9[ zQ:W}Lѷl ::1\0 QV^}f?"6  r߿uشd|2ʥ Ex7h!. 3.Q"o\rY!sr4ytĭBG #LߘN447 Hu+{wp)T9Ul7^­L_u/'D47bW,}C]Q.rI3"3N8hKP4r\*%ϛA-܏C|qw)3 C^P57`gw`GI6&/Wvq}7)8[vNE2GL{7ԑurDO(^b3$ plbD/Wqk](]6Zw(n1<)2:}枯ΞSUT endstream endobj 374 0 obj << /Length 871 /Filter /FlateDecode >> stream xuUˎ0+L$Ʊ Mw"Mj i=4d*ʢOީHeϼ˨S[Yzm<MT\uGxoiyX'ywE7[͜c'Mr`ݜ~Gq0Ʃ nCo-{WݲΆ{%_񣸺v 8K~O&y2ڧ\S,&2!6 HEަ,#T&?zJ )dKd0Kܓ2Ў~/hbEn*[8>9.25h =V6OΤ{L$\rʂY:&^8]=wTLR.1Ǻ?àϦm0Q+WcVG^悍 P*rʔ j [Ӥ'!i.ql ?/ fE]\B6zQL$GV| ;cSk<VÍ5ƒ;b=.vZA&P< g!Б6q<6f;^Ra6tg+GCU8S In:ymlkjx> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ӵlizaYa{v3nrȨLl'z3ЌV卦{k9 up{7GH,>HOweCHe`UA (Pls( zm5ɂ2L8nmugɷ9@8P]i6jmDCF0ORgOcm->~&%v13€'(&F 9.;7,ӤFF6Wu^ t-p^}4{fxlwpvx(/Cos1rys$s&*gi{^zuU-R=y4~8̓@'JY>"$Z_%4di"i!]Cdw t=P:R^4$> 6ܤ dcZ5OKMY] 6SӷJ@Q@Q@Q@Q@Q@Q@Q@Q@SկΗ_ iLaǦHri6jmDCF0ORgcj^.{Xn#Q|3;ۖs8GM{k ߈T:08ߘlnj+׼K&i&eG}f2(U>;}kռ$MkIgY$7q%1>72+:á@3MH3 q`NhڗF I!-۶Inܧ"鍪ZDN tVM]Ny\2NVHdid۷|;H p2p;l,Qΐ$ɷn$v8dwQEQEQEQEQEs?ukO]yrlVeE<0#=bWS}࿳6ev?uJ6"ŰZ"C̈rEcԚR| }E|oKw8K[o5Vƞ-gP|Gsqjuί{}౵ߙcuLV.WCxG xUau>f< Sd Ae&hd~zldǿU;MC΍5o&ۅby>\_d |O _3KF?TzEͮ`R<-K[Rf2^;K;vn@MD\j(,Ks)ڢdZUYaSk0IVԯޔ-yvg8\T6fs7Z}U9ʵR0FD>*ћ[EX$%t((((;B[:.T#NuǾ(F@P _ZZ((((G/OxOuO"4~DM'Rz PyCs,oL6ys<=sFJ_3i<`%#פ]R3Z?|eC oe5fuYKmq;xr/l20FD^êM5f|x*J+̣8S}CZ: 5?4quHRTat´gku!%QZ(((+mqwU g…ٱ*9<k.Y)v>Gw]25j}EE)mRYWQM&F3rQIҵ,?_&xxo3Kj?/VbPt@sx(>_U;#`KrZP/VPI>R54T@mSk*%'s[*>qԿMZHm/R?/_BQX,_R?vGkz:nyKտ*K׷Y V/*h&\j "g~:˔Mzi,fm/9v9*)dr57keVfr+ۅjM.quy"$vS<eF+{p+qQ@Q@Q@Tdg)*^n]EgU 5ٗM^i3x-Q u[82ny1wogRSM]>UVo#ȴc24()y{+`Ug|WT#~dyxey5 Y1] 6}7]|G3~mir冧ov([ KڅRyA9遜ZH)޹5X*9 e'\eW%cBORyTuuV۸3ϿjWiU~O^cw_*yVSu"E v\ni-W4W%eTdytiW l![nMjNY:u6_s=[n9=~jыƷpa UpV}aݻny:ըhrvיMԗwoN O^:.bӅ=:;H:0Is[vX\]?櫆2rƝ7S?Y@<=g4:Z#IѮ3+(OOl^*gkt @h\,>Q@ۭ{F#5Mn-;Ò[%sޤO%ŝR=j-cW]?Ókʊ5Fy5MJ[0Zp,FFCQq:uOiR9.n"1&B:n8R[9y5Bm[/-v쎾g}e8*ON3Yn&׬ ©HFeː"K/ܰϓzs]Ni.-<Ċ/(,I$0&4$\[wrLC8~fT Ϸ pCM2 o  lo :5/ zT{%Nw@!VW עxY66F#ω:awדb[_[ Z$ +*bЊD"({ye, f=XvgxkSۥ%\,/wͰwR ;#+3jEZ5֍ɧ$*ZgNQF/o~MxO!x[KBFG`̫AQyc6!4t{kVು A$tֲn|'y&\}[#e,$"%Ay NUjTԬP $K[vc4{<M[ ȿy(o"}LIN67>p09K-^tgSQ݃zXRzF\ "VI!#k> w6ɩNW᾵//Şؼٻb\Cgn;s;|zw /,fyo%ʱ"JYXlpqmz|K ֋neޅ:`^wzϗi1Y wT j$bD|3zm$A= Kk{[%f<Ȍ޹k*)R/jI[!gE)7a_|煃P}zOn,>fDIG3djB#!w}:s/^^ML=TUPE'bjzLd1˂NIaWC\oPjFW&6JvgF1KH'$rJ7LRUs**z&A|*8G-'NmKxZ TR0ZUp^ [|I09sD _ K!yf>[Ϻ%~^  )=}FA q>[yWfm8۵AG9gуBwF?fsʌo,#;r`+t9ӻQC" UrA\ZTnNXeL:1&䓖Lsyz* 'zgNA/vz.xl۷fsS|E+;i UQU+spdBȥr3rc?h/n,GhR%yקR:䚏ou$^Z~DK+;E$3kWo[Gޥ/[įuV2EG7\}~;m4ҠWu[dpS'R03ǧ^kKBKX _˨6`|?]GĚĶp$Ine`I >c^pCv_g^ma^  2b{Q]'QEQEP= U iwh+e_zLe[re a}jʢAw^2^XPȭf\G֌RpC lǞ08zVummpzkJY`m p +S@+7@ORP e2Ot,7 _kk| у*8ö+](صrsڴwr6 # x= sN&3΢+ OZ̀x`vvCXٜGYѮˤ1r9Ϡ=*TԞ=:wakпI#}i^Ǣ+"-vJE栺TwvZprY|ݞ0p=גꫤﳵm@RLZ,\Twki#[Y>cեa 9HP__jhyeҊc%F#ʒ88=36s rXX}vDlBFOL棻YHmԿv%Fb|Q6n8R-M?M9=Drx&sflf"^1 rGoMN]N5:e̢o>RcW_B(֟(k[5,րOCqah v\eqDZ R]S;c?ʎ}q ͨ؍:+gi`?8rXc-ծ@ʸ9GNq .4[Oܹ9^=3J/K4]BF[FUvBgV5X .;HIxE6 h *"|+ǰRK1/.ҫb  ָo_V험A$WU N+<RYgֱmϑyn+fyLW8sJ)l'Z )UnMʧnsY8J)f8̇sVBBg֭MsJWDʹ>mQVT zs|t9Avuj6 ḳ՛6[v})ϕ.UVc8^+V+%gMI$QX|ZT^G=H1SN(`⦡Li&kf6k0 #&[^hdE *!XBU{>h!Xu瑁DaeFO1O>r:cex,u[>kX!B<)J6}vxAuiR}7RQesfdLMU_/ֺ(@藗‰ki95wfnsq}Vh ʓ\K:v6L163V?Z??֫i_?6e[reCG8:S@Q<'zU9iM$Fw}sYW7.z Π_b],_NO'܎tSn݃ϩRyFKnsY߆# ׂG#ȮJSFƚuz)v :kZG{}*%Uz>УccҬ$L=~ΞXXϚ[[}Dcۊ`[&q9קR53,ëCdc`^b+ p1i@MLjKuZea`!Cpf!S=8Ϩ5Z^AlZ Q#Wԟ6TƴE%ԝ6pQ9`$QoԶbZd ǒ@w=,vվcbk PI9F@#Im3UCN{;N*[n0p2ǧ=բ[mqzQ\ o (Fq}dE/jܸHbr7t ǽE[riæޤ7j4 `G@v40f]Eo*L''}i|yH9ԇ}sŝGZ]E/F,M.:3c8'#=#A ̑܀s#ӸKD`KfjK/}ڋ0 [f8ك>S+La$^`= 9 ۡPɭ.!%&="m8 sݎ=;Gkb0y"po/;fse_/07~]8==E5oYɦJ;@12@'x'&K5dTsG]ݎ-zݔL$KJň[=F1t4:$vr~"K*UOڥ\¶*\BђHHl:xQxglw#(wCt=F=99SޅHD+3qOwG !b$Wښg[Eib"2_5FYKuҖ+KKd`.1$ۨkyپBO\mӺ'̻ůg<3|ܜcqQF5FTtI#rG<̶mFo^+"HL;mU8p^?bEĶŏ/byw$ݗxIcI>)__Z=9[kFv? UEKK_ 1]E9N;qҤp ]-35֮jR3 :wun(Brqxp9ɮV9"v:k&O|U̫3U5SE H9U9MjJƭ)uڑÎ\gkݍ[u1})ej(ȅn3s}((m~v%T39JuU#YBd ~f^Zr!*rL+w~<3>ZW[#|hOʈ&'BriVڽM+LȌm 鎴t`\4%hX&8R9b' t]G i]O2%=v8㓞぀&մ˽6lu td 3o ?UkYl5' 7u n\^iZjwV@p,{?Mڦ5՜Ŋrd$N8Nhs̯0*wNy}Y+յHp3Ώ(9rHڒkCŮc1iݏ>_Odڃڤ &E7OAX/$/4J)'4B I'!B.\8p uO=:ZZ2,qGHˀzGa'٭6;E&l 3NTz]՟Grd'>S~P:ȟeG\XBFنLvFyW^O|Kg,oz̲cdC<׈(ot tK.IlGv?8ǃ 6bk$)/B2S JO ^hKƌwKchzGj4.1NOEv^ChȩY$ ז,sݧ|q@A~9=I RMzk"]:0pbTo2`( m"Gin rN@Q~S٩-l)5[F I8-؀fN=2QXԞ lV(]T#p@NS j?ڥNJu=zep^.?O J6 [6 h6sZATQ{֢q^ڸEzpt?ϭhO*]RHww)ۚr'<Ȏvk P`NH}u[#=0ҡ-NPq0ݐSipg2G4gg MQ8""ڕѷٟK9"o7\ӌ zkFnFQi(-7iTOzӧ E-;)g2{Vu!X,+#6xΫR c8a&!EHNkOm\ߖAֵ~/^u`H Q=~(pŸf5wh6PʼPK9!qY }F+hQ[;w9Iߔód8 iYaԐ fS/.܁%YT,1QuV7-Ĺf$`T Fr(ľ[EKP]s]Mt[m4pGvXyf2@ux5wc A+.ɸ.g4P6nz1yVbOVuFtG?O I+:×.ƽO"ԥ.q3qu$?r7nTӥy8TrŎX}I1 'Js>[.ۏ?ʮXyGif#v:'R<Ry_cH[ђ8ʀOYe]8?JֵCcysLжX~z ''94c$h+`èc>՘:ieSL.hIq!A Tk|>o6sa뫍&Tͯ?Ӓs+/7oa5j+61 7Np7q=y iH`23Z9b+sԁ^]*x]UᐮBV ōfX7N6qgNW֞wr> i"r)ڜ4 ~"wTEHaHYpH'{qL]&8<[UYfE$^QdLr@8 6~O~|\;w{2 <ϾxcAcӮuK?b#B9 8 `К]GImB[IWRىPL|AVFGg^_^~LԵ(uy1]DJ PR8\#8nեi6E=͢$ kyBq PovuV ](ǎ8'HuKYmyI2FON28ɧjZ4:Ť\]%3F`%>e} u{żee^'Mx;Uf-%vM9o{y{e:l ?L8895 _,_*[?T|k.;+3I21^>N@ >[Jo y{x 98aǽ%݄wldmAY.OlizrՙE3*I:t#=;u4V&W}㐪K>qր"f/  㹤׬oHCc9m9&mo5:RRrDc jɨDJsϦzs O}@_H[& ̤>zt'|^:_`Is`{cޤ]:_Q7Jfr>^y>>Ũ}4q4^HM7@[[lHDcL{5sQ '$W>X _HAlno1+_ *漏]+>pj/irb 1VVV CGf,p$2nbiQ@UKN_*"o"["n'ztn_0x{y!p;[k8888օe_?]%TzWu_'m?^<"T^^knۂ>?u1y7jĸ$}$$shoz=y nřrO9#Hc5궍n*bZ?UP <%SThһ U9.zS8f\wu! !d}brM5*BpjQI\ᔀ+ZO׬lŢ8&f29S]SF+Gd9SS@9iS7=_AZ=O!#ve=uYz\jhe*;m}rǮA⾈rСo惡RDispHϜܠa w]vMv+XΣ Fpqk >hz¯c$uݭ)nkMXok#209حتZej:m92J ;wRX6񞞕Tc}M(Ʉdʐ@e a]S궛ݻIo t&s+r02t>Tr䎇Krw2ש6q|lI4aԓYګ:'cՌ O[#۰w-U޺mExf"?Q]8I~62^h3 ( ּ7k~ܳXe43d&vJ֢2]1camKd.g>剫v»l6EY1h.a _.1c'5oXM֡ҿ#<5.tk;'oKїO^&N+*2W;V7v?Rg-{EbǕ1_zW?7vGcj+BZ E`3+0R~ G֯*T^Kf7gS[rr뎂VR@8o<6 45Ə,ztcq8Xmϡ݌Y[j uG A$HsڽGjChUn6@d9zmΓ4%#H#8 C>;5HcDүFqRks6z<>J.%Mːo˃qڀ#-^,H%e6 cv{Nʦsq2 ` F7 5k^JneGNP<,eԂq@$u9t+ hR$ET&>U ?M7J@ѵmA4"9ddc-2zUJ2cg(iL3o]qT595:Z&#x a cUD(I-7hUlFs@ [7c+kf,÷z/t&Ks<3fѥ 0/xjMRm1ZI"s4mX/lppzOI5ysnӰQ`6`@ &4/D9~c۶s}_In/Id lRy8^3iGLԱ[n/rv3s;R]>5}>;h07yҀ#`XNf=:/Շ$mCZwNw{ *OS۔:&d=j1fbIjM>7Ae?7`:u_mz&)rbjv\8`hj1 Yn6LZŦEgH'w;+_1s4E'WA܀0q𩨭.Akl/fV4TV@5g,S  :R 5^gdm.7c{{myFH>\i6zT(롸q n9 c&P1WCkONjƯMl+_GZu+S>jҮy 'H9AɝeQ_JyEPE]Z9,œ_Gfw]>([~|: +r= ـgP(fcm&2Ʒ/J_60F!sWIᨼX|-GEEUxIyQ$}QOw,^j,p%Ty>"hW'Ҩ&YL.#cڇvѷۦG85cʵ)+uk?JʅKJMmZ ˏVsUdH\W' ;EiqFY~")9^qZ c!u,f%ԟZVNSQ^:ut3X kUPc8ϭto9ϡ<]NISCfdgk~#|;j6ZN5-#~($[PӴo -^FXQPI}a;/Gs m18$EAg~yeh\[IqmOpp ~Xi#_^[XBS8Q:/-{c-NP뷖nom*Aܱ@@M5 3NӆġcC4a*$@kFKh0?( 7GQ4kf5 ^VC$0#AԜ v@ jZ]ަiR8D$~UvH9Y<[А HnYlo =pEx {IX-)` )8Pq>PkQ:M˝X yߊeՒ^X]&ne S#r)|Oԭ{f BO$pHPͣVHE–8zeem;D/I Xd NY@+,?I. :,[vRJ}q5;|:?6a9 |xrxQgVd6T12*)]&'Z/`ʑdOUL=2qϪCi_̅19c\qqC$tZ[{HfդEI̎AԀ t7TV.v68 @؎8qiz|2M}/pd#b̈́QPH%N}wm[ '2ݥc4NLqMgl.,xyi.ܗ +O9P(k6[G"M @Fp䁌_]F 0L#s2mƋo-,i=Q T{pItyzcƞ$cw>d*@N8vL8;Γߥsr]H2xߚ$9^O"牑= kZgE%eb*8Be++du9OskK82>TZq*:W?~%NtJ}LFl06jxE=PI=wuEd>+Ȯ (Us # c知]Ӭu&v+\dqVh 6|Mѳne0ol9m. aqQOUU;xVT@~(m; T¿?b_*/?;Guoj=;b?/@OxeWMUy@G[ڊ]k-Ib6{s'ZQ>W^C봟UL#X?_jaGj^QvM g{KC5* AQj^Qv&um#:UoZE"]Y-6zE `0#ǍPZ9еNqFG?/?;Tӎ_q-oV45WR:j^Qv'M#4v?RX^Dce@3OQz_ʾW4NbN|}Ɯ401j}^/Ƣ h},57uohԼ-?aKW܃Tg^s봟U*x30O*j^Qv:xBԼ獤Q_V?_p_{*K λd7 ٪,d]l~7[ڗR:qXiq|/t9|gL]^4cuoiګM%uݬʆc ?q۟iJĮY7n͇C?pŏQncOW/oWsx'?@C0\vl-dxwPQ{.S1`2^ x$8ޥsRVV\Z[WW1DҩdBǖ N io[(-nT݌g3@f="$[Rdr@% '֝QX(ϲ(phC6q=q@1vAxR-qU" piaRCFfe NAJ@Q@U7SYc;= ;w8 eªRO3GFdZwۡM0c\9j7Zil'mՕBMl9c3pG*ݘB~7gwˏ{?Z[~'6oom^ڛۨ& O&:* ֟mppĮ&a$rr~YB<8v8*s& 4;vK+ 522"a=Q@U }f\?rE|~;qժU^i)`N=J2݄A1>\LNB@ OYYbWB0dFN9?SSEPUc O{&hcf:lg9ϿS/-$;!y˅d)>¹&.!k[[}AO,qT'8u5=$Or 4`/  B@5@U[05G°L3V8IQܚSOm+ҙaoK:#UFp9$@uQ@Uk0ڤWf:e9UCa-뽐>_VijU64Y$f#< n(((((((|Z:Ne*-c֎&?k,RW#9'9(R\y>C꧱ +JM*9n.ΞjUUUQO\օPTM2-VA$"K7R ## ETtYB ;f8f$[*bu _%o.0tº}R=C[)ztZUBH$݋2Y EQEU)tys;[fC Eeh(qspp.K,Qb p77'$բ*>yZ턑"KGPH#Gdv"@ltke+KjNp09Q@c֥Y',,,O Z7<vɭ((Ej7Fĉ-A C)Q؊EWMm,Q9¨QEQE7mfMqKv/VT+)A#BRk^iv i ;;<wf,qIEVE2#٬ۑ*X`pk^(+?ZǭHMp| lY|27dG\rN2s[PEPYw\| f/nF aAz(((((((((((((((((((maٚ3uAyWan3OK!*#]/Q{3B UNr:KqKn^߭4% J̋ݻ# TqOD $]SQK3LYF͘ڨ0}z@7ZXcHL(Iȣ{/%C3t[8簺7WW(#>In'bX$ V%`'R*U R VIkml+#yҙK6S;ɴ4U\> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222-" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( u/VpPǠP9c9 ᮣKVp]x4FF,6qT~4xA$åj)4BHl{X|KW$:~lg _1`vW5:{mo"-Ȍ ~Tvj:2Mqr,{ڮPEPEPEPEPXZ|?uUܐ"<؀{\7Tv:[?ybjƟLsUzg4ob$FAA<4ZۑF`0 *yIMF[կ7W@h(Aª޹{4[WdY-|5ݜq@vXD#Q +lAp[yzCX$xQ]8,ᵇE-loIgYX嘣* 遌+rvTږ["- Oj*ۜpc^˼~D֓%[>spSP6(+/aMj_x$ *#ǡ(HԵ@5kx(!LmHNrǽX˼~iY cpӼ˷?IyAGђ46E kZUnltrOli4)H sAuwݿVW{a-CA;pq3#q( Z焬χh]\}3.|g|9?1${^9jzl~V{O9/qLIENQyAGmek_j 2UcRxEI6 ȇ!N9ڥj?QyAGӢh5*r]U*.ڏTEcBv RkY)2D0ADSڶh2+˝Qf[TR*A=bUbY^Զ 7EPbȠ,jX]Fd: p`\q;$5I+~b, f;:Y)0$Mpr3\5hbԴuw[(iB $j :䒖j/]˳fm\EfTԴlW+=E@c9giVjE7nʱEڣ\Ĺ$ )n8R܎Tc<"fC ĩ?X֢NLg^8(yAGӢചYX1dwe1ۃ{C@͊+/G{;SB8U@L1>Uթ@( /@ӴM ZtRAgaJ0~s@[9,vӷkum5 {d`~yZ`j [" c@9!Ԩ I- y#p}M0X$N˧5Ż|c'd2Gm\|n a QF#*CY1]:842r]  Ocz82j'or.Q9le?g-JP>W7c/o?M+˔HlPx889UGyC i( q@I2F8>o ȫה?O#V^W?ʮXR0AVe6+ i^EQr=UЀ}1$PMKf$Jq}^&لсձGK/V.H$G}EE<؛&1;{Kȫ!@VLGU]Dٜ1I,UtHm%em1/ Re__InB=֗B=~i&J$|Z<&?LGλsᶋI(K~fVR(9*1;+Xvkhq`_I~~ s]-dM$p{ؐv?쎧E:-c$wK+}oS@* '@ҬEi+ ڪY`h:O(+Vytx$ZmMh8=j XŵH.ubzGqw5 MeaЊҿ#<5#5=!rZ[ppA=Y;d^rI5nJ^;` H= ̈g av4[]Cw8#*}ާ څۭKS͇ҦٚM,0Hr== n%[3æz=RjK-i2@*'ISn! $$$H2}*-na",'߷AܓV&FfUIMuS23޵.Jdz\oBiXⳅfظ'YXc4z~-nQJ_}{@{Z tdI P@u粯3E{_f&8]s1Kg%O'qk e}S.>pCm|E%b0,&|҃-wj tIaAۈ}gКXv#fsi`ߥJSS1{9H9h\*$`I폘P{+jCstu)eh(iZpo>pgSϹNŲA >ifGIXrF?5·صDRt=@cu|`Z_שbRiP|Eqބ`> dҠGyC P?hN?@Et@ќ jC]ZwLr :{TgO+ ԦJv,n$}&z0#nGj`Gֈ%[UIu]_yPp?ߥEaOxgr F}:_Gnu&VRCȥUiz^eVwXK$?˛N#nZCO'&'%ImjG?5Sm^cEOKX_&Mbc,!܅&q!i8Qj9M ;MG;r>'//K,^VEThm(@XvQ̟3 #qo]KǨfN?UdlLAGZ:/҈R=o5#/S Tx{P <$z7MS`dpEd"?` sa#²[.>x in,!hǡ؂=,V2x.OIV7K7oO8ˊ3[;pg{_QF!fgZ$ǝ88UO\CwCYZ6҃͟A[ AEnwB Td4O[KMw Ke>jlJmscsVGrXF?p֭25~-.>ИA !]JxO̍ SFPO 8B Qig( -,ѩ2?ߕسԞqv_RfPp|)i'ڏfV?P 徱"$p>XSDzO(*>]7 $ tjɑĞ&]C7$REkS39.i:% V{HcFk },Ef;,ۍ>XuꨲE;n>,CǧO9-C7"v=MC£ҜٰH绸yۑяSA_jćb\?آ7C+-*0\Uoc9?7襉MAk-OٴQZP?='6bBǃGބLԫ&f<ej̓<$,֌OvA*I|KinwA`}=)$W ଑]^XyJcM+Kg> |7U{w?y|-"uۻ\|́!PP۬/ ?žЃR_Z3 Sx!`8eeIG}>|ˁ={  "]]XH.b[$}C} `43J_֥e_?Ԫ0 ()ZU`:|>Mq8.ۯLM\+/J_ջ{wcg,P. )S#4. J#jP"XR99*7_t_i飱9R)2kjA9 #Ek:Ek}˝s c؀[jKV)꒪~5oƩ i霆i%лjMi,3?_otQcnn\]J8S,PAd>`~kh-J}H@#oKѣ)8H"<w=u6w8UNMٝx` ]/b7WwZ}c?|~_7E]4'E XZxflmZE}ٷ~ )?L0BJڦNԔy\5;hL3Vɮ?奱?3HR+{og:f)#QU ȫה?, IA0|5"^P{4וi#Y RA*}8H?`<~є ~mpn]F^$X w큝OHHFRY?і%┙qɯӟ8]Jiz`?SE!ۿBQFA;4otA;];?'J] _rMA265ymi3e)ShT>Z]L)k}D5Q0dHLmv<춋o?vG,cP{Lb *FB@ t.I>\&4;' G0]%.ZDOcۦ#s,&]O`>Ev6DXYe=c隱){kh;V=PIn9$#`=~5uX2R# GMs5m77X){B?ފ;K4V #6Y&i8ei[K9n!GV='Ҵ݇k[nqEWM@r2YW2:O<`en"^Q 9XgR4J?}KAˉ`}CS]el"kc\Ï.U|]>3ˇ)o87 Zu[9#a ȫה?\[Юc$QWGyC h[.|S`O\pURxHT{"`g۞Vg6ϕiGEDUT`:LWeiHg?Re6~dn 6x?M_Ӟ,cटc&./>vթ2Ԏ|C'~M NE$KjFEmy!3 amB>#71JIL>r>x=Dz?aICk#~h58uh(Qosm${Rɕ+'Ck1pVd"Km6H])#|ZwE4 IaV*e-bs#YG 5 ]ϵ.KF0VORGc?*mn tUV7J0뤞EŰT,6vy*;\d>S@Sh-cNpb &\*Ook?h?.rZn(Df;fvǟk0>e5;K'9s"eU- !n{03-Smjʼnvfi# *X' Ag>jd>&ݤ`XB}ޑ{_AlԴZd`/ϧXY/w-bWԁ%ꦖ*N Ydfk27T.!sWIJҿ#<5V`QEdxjH_mkUvϕ'9z(O [lt>vҪn\dY ս޵=O_.$)G uE_QKsAu93__t_i%ԘNq >n&T7"Ku)s: tn݆ZveYP,zOʟX`г\3vg*`HC ;{4t~f]_ 7cFr z :YgX̮#/й$S6Jop37Kn=p[\{zM1]v5t?FSG֑,=J?4؎qA; Q{4G:e)a7}E31BgzDԞP&NVk&'\B@)kmP 3~0)þ*n5K`;._Vn6. o=vs3`P?4^Xyx_*_**{i^GTq{U?SFs'O+ ԬjCI' 0lq9^u}da)?ŕPy?A?ήFcPs>[RxϿW#>i^V$29@?BdڴJ"CM>X@.1U6rqLn[,QHz~:<]??ՋdwDU'bQ(AƔd[& ʩg?_s5\͟MTjn: EqJn"@@uSOp}?Jd`g<M2-ѕuE_QjVFM"-yhquL/J_Չu(RVu8h}*$U;R]M38m`  (:( ?"vs=_8 G\oզ*04^^>5?Bi㗛e=F}6 )A>[W#@g^'jړ4q@dtX+x芿T)]HpdžH?~tՓy![݃֩ɨZho/@*М~y#I/e8Q3#m%Cmwc=c`vo^0'6d}1V$%)<MV:i+m#>OAhktvo$iO$\c>Lk{dTB&:S&\[Cui܉ڎ$S׻\[ o+&uX󜎊O 85 YpzǠn?+~;B+_|xI}~0zwj{hnQLd-Yy{|s}w!8}y+% M2~mKbEe`da& F; :Suu50a'RԾ U8c?Cҫi^UPHz{WCɊ{ufU-`O4)7]m ^7MG+1)4rߑ5w[AwtBf}ͲmVu H?z ۀ_8φ_tCϾIsvӭ6Fo I{2)迦>4ϳ,+Ƨ}inEX?n7ccOOFOmȏJ_֥e_?Ԫ1 ( +̣{e5GwPV^VEmĐ8;f r>"Ѡg4>X~sq7΄FO@ݎV^!sWIW_[Z<< ZxZvS!q@m?:#r;zjb 0*#~uc;')_4W`60=ʊbRU"peRQ^A> )Jz{Tiw=ǻL {(խ˘-&y^WUb<ȁ92O\[tf{ [$jzy ~A/Vmn9ݢm̿/FshdmS}TKIO#\,?W#jIh]M-1Gy(לըFPv== ,oj~Ө˃,tAض:uښW绺*}&aann';'恷m%~TvHWH(S˺HH 2~{/Nm $&ޠs}n-b6}4 Zڶ>[}loʤG8IO8!@޿2W) (wZz8ף I#YSk}8*8̉+ 5Vm(3Ƕ~-AGZ:/҈R:kwERNjHmQ*Vn^O?v#"w!BW=q'n:wE'eY{E7L3=RݩD*~8$ _ 7^eHX&a EWqٶEwuXʿ,|dddNh؝dJbLhs+֜TX^GSLz:77(yzy#~tV}*9unO_߈4ԼT vp ~`98bx^)Q^7YXdJ݇s(e*#AIӉbE$S3;BG#r^3d~U2dF]d5isZbXCiNfҫn$r-݇蹨MŮ$|}u|Ķd ^\K}8_BzRDWsinaa`|m3FDlp-;طV*ɶ*XU=: zb"$-gnxspIuA=z㱥o V0$u#pb(.hmKGiKp '(~\$2; TH{(b;vԋJ_֥e_?Ԫ2 (9nxlàVu mmRIe;WIɭ;KMSP{n(YCl+,RyGWqNw='P}6]x?_e*K+wy%MܗkVx⭎Ƴvue%1т8PSjj4fƧ H*lߓV"Ul=cӧ9 +xp dkkfs=gs<E h.TlߓTO RMQ0;XuT_e*EWw='t:[‘+7RU(œɨ*mdr=GRlߓU(˿?U.Ub{~OTVHd6Zb+RZ]ukŤ7Qji! vIyn)$IXzw='M@#s\[]Gk\ܵHmX. i F:YƯ`tpny@o?Z{~OF˿?U> x-gx$X2pjZ{~OF˿?UX(X{E4Y䈂J:,{Q@bhg@.d!0ajmEWw='e*Q@]x?:^[+{IlmWTsR|Iˤx_VԠPYM:3T,?Q\߄I!jqysqIC3<'ڀ:[r݀1?Ucپ ͕`wWӤe'jZW:֕e%wZ\YgU2 ]x?w='P}6]x?Ml(fYHQ69BI?Q@,ln,,-⸌oą$>˿?UX+ߓQ{~OV( .UiX_5].wA \|'ĩeHtY`t%[m 0i3Z:Kk{i Az:M6]x?5. B->mJ/٧Q#P՗;hyC4q.2@qlߓQ{~OV( .TlߓU(V{%|.!0OdZ((:]im4 kb20ğ|2d9 kZkڍKLhMgE4r)(6Jw 彰|TݎP5m8$wXkWzx&iLYFU Nxi$4Eu$EeuA~z֣$ ?zr%֡yYx@Y" Cs GCZY=5T l\?!Z\zhP3/zr?w:84kk];( #8qswjf߈M{P|)u'uaTI7L ߗBHʭiA8ímKM l@Uo3U'緿.mwG y0!Ǔ,~o=mwÖ+qhy "H/U,f߾9b2IQ= C0jZiEAYjziejਬAi,u+MAgyf#;e@ EYMCjb;T3@*/۠{2ʤ(N@Qwt}Q'Wڞwpq.^PMYtN2$dXօZbu=48`,_Џ΀5hMj0 bB.2Oyt=@tVgGNyt=@tVvsw4^<Ikp" f0,ڴh(3JJ5;7mI*8lj|3oջno$]^]i% aG8(+B:~VY= &*d>Och !螣^Vwk$H:G<]J `2:qh[$|9-`={i sd(Ql{d{T<$6FPzBZ\"ξ>>'Rںn 7(3;~]Q_ rN9|WX\1xJ;GcUnt=B6XA I U6g;D$=D\eϷԊ)/Y5]ހ}?3Im6AMױm+h XrI*/}*]TSsј{A}PӬ04;УpWV_U?U{e]\`>B}q5S_*)[5isOZK׋`tw*LF?8)6op% e'{S&Tvb5ˋPp{xR@v=߫sRǘD(',g?Q [[NÀ;׀G=#F_䶭TaH)l;Dg? R4%7oq@Q?ӭ1gTbU~^ [ǢZ(GlA裐{o=䄲Q܉ Q6 k1J- 냃֬-IL9eJN3Q\kzCH J0E=;AȦJb7IjD(%i-')U[&9@70{ңs5z_+ Q* ">ATA.ceVe‹$[Z1NHVC t+ҩ}hA?jA9HQMA $I𮜿ܸO1+vĿ_G2,!{r9P:} VBEk^!sWIJdQ/<%*v4ڽ<rNwly1\r@dsrӼhC7 nf PFbKP4}w[mR+"{CKE~j*:"{CKEɪߧr`L_E~j?TtM8Q bIW݆U C#y@r<0G_[e X`ѹrF( A=陙/C]6(*%ʪ<Ve#V^W?@Q3eU,\FIi/PkE]#jR)4"ԭBᙺG2- f>`g2h"562 S䰸Ki \qcߡd.DO4Hpc;pGUt==@+()%FpJaSo,?֮pEV)?[F&XXJTeq|׫0;}x$|cztM'=%uKUb]m`#-L(b=-ɯ1m>„U펆OjyU8<>¢YApDW"8"qI%yλaAW昝a.çJڱJU ީ2npѕ>(W]+B:~ZG\xkR!EPErC>k[D>O?S>7}7g?kV^!sWIwz[:UM댞k?A֧)kđ8e?. J# d 5:/҈R($3×t]HdN/quix?O&O\?iuU1-Z7R|zT:xcaHF8x4'fF,H/T9;ӎr ֪^N:70衕 M7ݛ &3 F^<5'u_^-==k7W\1ǣւAkV_ypKjRid5I7z!j(gׇ*ۈZQhϡl& 5}= H/g=z(QSn3]5-?|},NVRϷ"$$ }zSl-FS99cOWEUE *<5"^P+/_*)5isUaa+5isU9}.qjY6F6uq.o3 %gYŝ,U_F KE]mP[F=#fbl0Lktg' ~/=iN/%F>n{ZFibdb$,l̪+cXU[ӣma@g a18DVbBy(<6"ب Hj,,dS(6jjU B#lQNG^;?.ȍ^[èsg|pEq8/_չ/mBQf`8ПRMZ;gv@~u&>O685TEit %oUggQ-~(YZ!Y?WE\º*&e_?dceb@?wqj!sWIp©%sݎ8i [Tc(yaÞx:ggLxmy[j =/SQKv nJtH$>v\L2tpFr}I?y4 Yӡ;vuljQq}{ء?Zy\pVe#V^W?LC[𶊖jl# >E$kY&$G\ިkE]#jP;dky ,m8FF2:ϑid~~Uϐ}SIWna +~ m?E'R yE߉@;x5fB?XQ_2?$j#ծa`v#?Ωڱ>r\?R/%i)& ']画mk)$oiW{dt _};,گ'nUIeSŇHJ0$%d#?0:;<`gCg$`GPH) J4Pm-~!0 uj( ,qF}TO}n 6dSOcW(e wWu_'+/J_֥2B( ]_txHILώA ֊aϕGT ԔP 5 ljxjݵSsq!sghq{,fpGm?:ЎxX0Wcgm?:Akp8M W/.(>Ih3뱊gW}dl[fke"Nq\BE.]7dJMq7v6%#GD7IүK!OB];?'J/m?o *"E{%~r:||g#@'@_wDUu[5=r @?Tf5=3? c1ћ .l';N8S?JGyC C{FLpz5W_*)5isU-l7^)j5isTPuK4vAv>Vyyn{ħ聣#xL?=AN*M^ב6goyȏVcMP 8~Zݾea.lE$TD#Ҵ1ўo1M-]pF@8&ulnc֨V_=ofRqcVck>$5Ŀ`!( jG")(-q QuvZȿT _o)OF?OuQj]B=`ԇFfS>6ZE?O.W;u %plsOf^!sWI s:]=4^[7J_xFZ#T\t)N2?BQ2q j֞HlFDF .н1@s DPK$sz'1ğr/~yf퓎:=.a?1@=."vХՕ85˓-n/J_2}{IZK{y'S$#I&H/S/#\Ka?ƗB-w{G5A9 оH3l 0rʕtGnZk.׹r0 +'O+ ԬY_s#ScrA V2NHy(YDZP?ՠErb^/PpYy^WH(Z;緷Dn[@2}Gv1`aа`U꣤_h50QGI%LffMLUH8:;Qm3tO@eԏjMmm?Jkп=Qړ:-j-J>7ܬy*/rKSxlEJ|o'gb4ԏQѥ\L~2?Afиj0FA͝%R-dp£$:ܞGNsFv!J^!sWIJҿ#<5LAEPEy΃HRNG{Ց{Y\xAao;w]۷(hZ[xgǝrcf¨xkQDUϩfi keX0j]AGSH|n`wb¿Pm?:ЎY~yX3sRcNĕGNܶ?*@; )3ؾ? uY cMs?7n5= IQ#w/e1vr@#VoFfh?ȧw *i(GtvТO(H~]WlOTdz/ڇq~\~?R(՛}I%5z?{+\o\¯SFodVkđpnj7;9PjU?V3r.6!L>?}k?_*)F?8* z?0էוT]B{TJ}91K$?5S8ѷ>Vwyn;GyQƙ(TJdҴFsgMFxŻ7뷏jӦXs?*i%Ҫ7I)B?2;ɼy&^Hb,O8# |nT,`l>Z \<}9Unf.Ͻ1.Oɑz ?b˰>ql#Bi-EIN->jG# (KQSd{/鹻 "H º*nO.UiLcIođޮC 6ّa3(?N*!sWIET=K1_˜[yB<+$wAGm?)@ !>iim`O @LR~daX?ؤ6gيmG9S;%>bpqv.mW1xIUP;L_?U"{CKWCw"?u;irjgieE>OE6ah1#Pٱzu*[#B@AHrͦh_{R?*ܱ"_i,!Q쫳UH9Z;T]B߭fۈy2e  \z䲊_R~?ߙIB~%.!O#EGKEȬ.e(qg~]}K1џΓ gEGyn6jr꥕O隖nu5=7 cl<$#F_NJ~}vLe ?,P4(k7W\>z3*Q .~7.+E V֙Eoq3\j;wX+U_˛]NKm$#DGw+@X aeBlu\4YFRU5JYV?=}??K:c(x>/J~dK5t@!` #t@ jCq=zݯ>UjCW#GԳHlp|`Ojr|(,l%zOY,J=U]U986ӌ}yk}_lI"4Q^")2Y%eo̪+F(U> 4@2rБǥP$.>u`/5< 4Ť[Hz)?nZ"W.y` ^ 4ws3gCϩZZ/q'D,jl;VH[m>G8q1KY'\-f#O-XaӋ]9.~> J7_Ζh??&6ܡp|9[ej(GV Iq}4Di) A标lІ@Kad]s__ ' 誖3G\xjid*!sWI᫳.YSIlv'=_2#\ 銈]דv#~qVP9I<ʻ?/CHiulv :=8#Qqf.Lrz{dd{IM$x#xߊ?2z=˟C@]/״?GmêzvХ]ΎW qE$Q HB_ibEc޻ӵ46(M>aS#_U}g]DTEDP]W'2HK =0;ҥb_0`85 zu=)< WPWV<~^zR4sZ">9'炵iekE]#[N̞$7q<-E"(wĩ?"n5O~avRR%`!$QU9u4y2-{XYv?O_Cҥo#Iت;՘Ě ^qVXA=*jÜ^r>tv;/l=aVdv m)ǧ֑_܊1sRE٪VXBF}gIpOQ4Wn~~tI:sQޯds^i0w`G̿R @ 4N7Pø5N{&XR~a1h{iynKIlozyCKoEQkĶבu3?~sypdn9ǡ>Wu_'+/J_֥2B(> .i|;yX4GuOO8V[5E5K-X+vGPAN ;{D=qg6wzEK|$ ¶k/J_:/҈RE_QjPVA!hcޣ] ΡI9PI'JP1y.I Xܞ"ؕY"ǰ8sL O5^BDAUC M%wiqH~銑y-v? jdS bA$Vnx^U,ѱ0q x5H.k&v 5z@'@zdtف mOVPəYp8zң3Y\ep8)­J%1m'|zGKO.aVceY%SSvynLg#F#ܭi ~q2"ƻT`VoU?VekE]#2BFJЪ[4UcYXe,sjCAgM1R`8${e{<0-`"G["Y[ܯX3|i_q^m"1&ߙzԶ}:38vɹfN7`;k?>][rq!hd[[1;R^7ѿ9WЅmb gXa'l1z*_-.?5CI4/dcNH^ZkH3!(zQ\Zٺ"2?*::v5)ixDh*p !0kavy>w}wf90ڑzĞ >v^,-F:D-R*vHNUms*6TK$?{zSϩu,d12 @I#ʢ{Acύr`Sq؊Tmw_.ov:E-Sַ*Ls]tM!CNz/_״T C->~=vХ?5?_0}}Y4{ourZ$}XC}HOGu鍱:ڿ[("F*j}ʊYU$332JyoFۑ.YOkP_U?Vu#= X'Ή$Q2Ў{sZ0XH2Kx$yUbI/Rx8#9'b÷휞xU`:wKiݎ^1d/Re:1R|}U~RKxӠo1 x9-ZKkW2$ع`*XD8[#:8@>t2>*ԋkgun@`:鴌7Iǜq'6ǃm#CE ƒ*OWo-~˞6zƖ䀵F uc烑R*F2y}=ILaUgU9R&InShlt7nF0yB!sWIJҿ#<5@(ZxHAY70!7JH đ۵jh>5g%lbY\++fbI?SZC 0{k:P/lBgoG64Vv[F͸1 wX)j,P(Hdd.)o] =+ g$|U(>E#{KV9<~[*3^k[R`;`= [`o7V-xRymE 2yiav.odFGearAr̿koo"7xsv}v^>GPI =*9u*Rm U(Q--UaUg >J_2}!EU/O,õ `0 U?[(]Z6k{PK#_ѐApu#-YX`GܫtP_2}!fۣV $pI9'=yP_2}!lh9la$6U}3DڗVK+-BM:ťa b,#,͞O@w-m'o"fiE c@N'ڍW6$%|鹉%snk e[C߿얻y=>[*)AQp'#rOť-眐3=V kc㷉Vxe,%,p+G]޴3#Qa L$ĒǔAH?pug}[Cj_ϵ7H rqHtPBoK6 <=ޗm-w@o<?*]ƋKT(Vm?űKc#Bu|Cn:Lp`ڀ;oCr@?ީb9?'V햣hvz𾽁6Irh'=֥TSzZ,D瓌dŒއ.--wo<}sպ(>E50Ӓ?%\3]^ ٖ(%*9b3@<ִ(2{;K4 9qk̿koo"Q@|)Ժ+Fz䫔P_2}!<+~ֱܽç |uڬ7 4+x|0izO##r |Aϭv*oPa--Td 䜓=hSzZ,D瓌d~UnՆAAZ_2}!EU/̿koo"Q@tI澚mBHP#DHޯQEQEW-Cx.X5d[-(;Jn3 <3;f[GM:v-ŸJ\e (ɧ“Je$G* nCҫ ?c' Z++ f?h4(VͿUa٬fD xVV=xg d} ?c'm#FYZIcFK422ٕڣ$rqPl,ii\V7LEdꏝ>TaN $}~կ*4/p?_?&zlOk@cd(ƀ $Oՠ39V_6w{UXf8F"9_:cՎ Z f?jY_h4(G?O1@VWi1P3Lbxg d\Xx6ǭiɼ0-A5_eb ?c' f?r7Kj^461j6r^(&F0FydYæ k#le͸+ e`[3\{m%֋Ѓ gK՚+|-!b@4cԅ>P:ƻT'.JĬz+v4MGIo;;pK4pVi1P3Lbxg dEbͩkb). ,_;0ꀀb=EmPEdGT ->He,Lhm^xg dEe} ?c' f?\,a˫ LP2kkҦx%m#ZI|Fȍ3 ?c' f?qᄷl^^ᵚqk2["r ?ÜK,5/.P-th77-a s>n9+^5MOúDەnńwu\Inܗ1I€: iְʥ+ =jZG?O1Gi1Q3Lb8YY Z;ט<4@C FFN*;]x4Ԡ.vX΋V$ cX( OY&w6I~d~ueƳ%wi 4A9 @}p(jG?O1G\=~җ+ovEkƒU!#<:/go;G@G,n .c-Tl~bŭF=gw8bmYdDGz. -n6r3q܁ՠPZiQ[;!d? Sxg'RŅ~t*8qmϴ]Tm l:`3.m>4Rxr T&4fO{gr%AbWJځrNsfhy?K>m6??x8ʶ*t@5eԯ? ? _**m?A;D?֓*;0 5vJԂ=l{⮀Bj}ǧLojE K۷FC$On9'cEa%$TFSMT-:VP-4 slJ|Ͻ,vCߡE2SeIh4r(eaj܃.?FΙOt5eAcVcKiZMzn`[Y`rBʅ:TztsO&<ljKc5fDюO!ҿ#<5YzWu_')QEU?}36Ʀ{fۍ[}q@ Ӭu&v+\dqY ޵A.#Gҿ#<4km?:/ 7FԾه!=W?x}:U-AGW緆#$y:,;Jk,dݜR9$~gФr4TlocKSd_2O4,RXbnci cm- k{hf̈?SޣUG1iG8.qOӝviN=U (h}YBQc͇ʯԖUkHmJw1˻ԓɨ>}7yc2@])%]<üQ.?${Pб\<?ʂUO=T5"^P8cXEDQU{ GyC d;t jC9c m#>OSէוiH#'=ʀEs42*+7+FGN8GC*"0Y$m,1\eImȻ\DS1ȫ7:RKV`C$?}C [jz|C4v9[HbP¨*MX">I(~GخW?0я*{Mm[Gpqqf<"Hz>>Ԗ wlǝ:{A#Sl~h?_Tk;(p2ۓ{7׃֏1["298ͶR2~|]*ʱ3ΛY&ӆgghC^l9O(+/_t_i֥2L{wV9,oS*0w-$tͺ }C7?(ډzdCfFS(W՛aϸRa#xʥ֣0k Tkn'eCIT&4X!nZt;?V m-ά ;-izDexc sSlc%rHH-JlMƋT_j{-~'vAώz񲧃0o:@?2T&sk)>zڍ<~ m2;I {qcOR}f3n?kb-,'cNӮVLwR~5wi;kՌACVnccnVL ے>|dzp>b u_p3z' 2MX܂N9kV?!Tq۾ cڶ*t@$Z\ 'arW붩hsI_5/26/*}G|֬r[j6и(GTHZj$a`瞙*s3ۘ%dv#|@9MʢJ+* gyxzD}?4 _t,iQGTmIvJ[8{dj_vCj+G[GO/jYui $LpN3tA@jr3DPQ?x w*"U; ih`/4y2c̓GerI5{4o\c*0yU=9DZWu_'+/J_֥2(@MM#GG RI&YٔrN!s]6w>ic~Ms2:Ԣ+]ZAyi LP63 ;jhc%\$jx{ ٬+B:~@ J#3ilho$.cf#?j J#2J:u$L “*.F}?:kU۷fkI@% S:tVyܯ4}~3kgAW^_נ}pU{x\Ң?cRJrk`<KO RWvG]3s㎆i;R)O `,\\Suʼn\7?>o7!79BA?Cϵ2u>UgJDb[#ҧ\ 2H1?Xe }XzryI$wM k~xȦ+ڤh_Gخ_"Ƨ}Rgc4@ @].%Y]lO ȫה?v0[Hd/gMTGyC w{5isZ`}^f9My\pT6&⩂R'ܚQ**!bZbI;494Bt8!w*%^]|}yi IH4UT`:N(_-dF?4o%^-Fkik-l.p``lq` ]^H[kI:m9 [&Q׭d;*.D!lN9AƟ2BUPc`}XWf7CgNsO(+/_t_i֥1:s"_k!PzKt[96ܯo!?ߟCklw:#_Ǹ SqjEVwN LI5֥5IA'.g{ON+f(O"y!?U-%7a! \c*} ezE_AnF4%rͅ'CsϹr{vgD~dSgKB2B4$Qd*o(Ƌ푂߉{°g퟽`QQJ ^CB]GβtEuq+yF^Lr2&g/nA>@%nAiqr}hmnId\ >$-lغanAcM\QV*%aU#=* tys#A%l'!U"`HM?LOQ۷2%đq`$/:I渰pxm/UƿgCc* 8:xW?X#4L!O]հr}bɘ/ h4i$PV` |w)'{{0e߈*1IX ;ǴC) >r&\Z]D~&KocmV +Zn?SͨGZ1 Ro}jZ,?<ջz 7׸RoWמl?Ϊg,Den˸Iv ,@szv-ia"8mMӊ i\rL~%L\#LFxɤX(&-.̶C9 m4KTݸ>hLnmVt™Eথd+7/<;S1ǎfP g!P1ߠ=Yim(HRBF*s|jr?MoaijB0c.V<ƙ-G\xkRO jS ((?Ҿ#ޝmbkY *aG]6:>#۳2Fnslc`u :P.goF35ZguAn#[䞶e_?5E_QYLVHػu"FmAGVfl'V=ZT ReES iIrGjv~I\gD՘|୤^aPЕMu=A3RRƑ O5U;T<0?F5V(џ( %h?k|71湴8-k(9i@T?!UҾF$I8\+VnKh#?v3Nk82 6㌉@qV pm\r$r?P Wg$4un#.ih,d`1TP_$_pO501s.y Y?D,Jch"#+ hfB+]WH(V;I E TGyC hNp68*ivh oէוi2`IlF"&hfiM#*,@ǒLahVr). x1")fEc:Om;}S552FN u u'<=O R$RBT8cGe_)K}x I[fH#\*7p?U. 'ISWJ "B@DuXŭ[(o X('l%̍:T[i(7' UϗxI#vU--_BB⌯U?g{ȩy,ʽ YGpr/#?4Qu[۪i >>&?f֖GWut,@C7H׶E/$N:2秹Fnc!g")dU7CibΣo%ŨeT1R ?|Wi-d;ІR:?WovGBYG8Vc֔;JHF̀4gk-KEYw7N??«_ <>HoO%inTIaeJ]Jr}IݕܶD:dhOD$${e4WKc4|јpr}0\ŶaQܪ.0;'f?N~(-%K*}Yw14y'}Ǹڧ*x0*&a 3MEy>K1=XI≂iYu<Lǐ={k]TĚlh啇B7kLxM5 ar⵪Mº7ɶgȵf]/J3$?jln|-M (w,LȽN2?*,ee[쥷@oQ_4M.-\udJ qCC~Z}A!A"rB}_E?Dzh7 ,`~|VA( #3ׇ#@4Zn#!ZI) 2@nd,@Fhtaf=֨,OלRHJğ{vi3ڗ6J^/%7S79XX>mCyy !$uǵAGW ^P~n+y첢:83Rd/s ym+?EVBrWU%ji6t@r<oM{Q1a7Q2=˦ [MqI7![ (V!sWIJҿ#<5TdQEakWxSBYbbS\:7d-~HT0G-U ; ys}}vƳ Xa߱og?v$e_?5E_QYMc,+U>I[_t_iՉ庙 YLi2.io'd*]!zsR4tHI$΅[[ cEo a}*+S{\e_ c@u'eȮ}sl IO"7*s둂;tn%V@Ke?Iϭe?d.lF< Ɵdc2yRofǫ@*J.WҫyݔLGw09XjO/hC G_G dJҦ? WCPmه.P8DZ?&R_>{|Xo޶>=m>;-@4<ta}EGjq=_Չ#Q4i"Tn[ZH^3#ALS_**յKKoeu?w\zt@"% jC e#ӡjCdHLEaQAHV8>\^IόUѽNzz̒SUԫ(ea"WQ$%VVƩRg#c1h'߂sޒ6ɧ%c$c/:O}{(ӮoD,FfqN0=Xx.I :8GcjvàyxRř uN[^:t wڃrs8ztI%X2 ,څ\(8?g=Gi7)3<u:CM q mSq[CfW)aW) 6l*71>8}7 >?`*F{ylm-IHGbэ+_F>PkёGTڒXfAPy(.LQj71w)lsM2\A 3H4EIJNw:O|N⯭ /*m=,W-uaI ma( *.Bk "_'.&؇&\I0Eu60(_.ۈI䥕}2K+;<(Cqr؁T _a<" [s\9RyϻiJYILoM=]qGmu˽֬z1 HGĚ7<0Xnǡs@3iՍt1MFv.|rqkV?!L`I$ u󭊣ahOH͸-N,ǰhꒋE8Od_MWGyC x"fMgS=b9Q}y5ԍ Jă(uF)X@PɒU>Tje tQUkkWE\8=^Uyu8D!;Ir ~ߘ5^n t %0~J[ĵءYϗ}SH H#$~4 +:9d́Guu iF?y1&,¦HU LDgX猤NB6rx' rYޫZ:}c8=1 R(eڭ]ZCwIW89V 6s%{; <`21G<(v,[@Jc'~"Y'Hv*L~d;i/3hGdt^끍ݗG\xkRO jS ((:]im4 kb20ğ|2d9 kZkڍKLhMgE4r)(6J ۻoB ^vgMđu?g6kwCJ/ei=&$YzWu_' AGW.0Ys8;z$=AGVR#dCӌO$ځu"Ťnoec\_ϦnY&gTFY s2b@$gFu Oh}sH{smu%c?{x>d)W U(AZzbU|,H>zqҘڵb#TἈ]i,c6o` Akieexc[X>?0{T{R+B,%.@C( d{ZI`Lz>i))}B3X+'hXRx# ֕b+{Ymޣv Gjt@m-|'*?JWg?4o%vТ B66UlW# x5V_[MEFo~ wH-{!5k )v ^M\0( ~DuYZLOV&eL»MxItI Kk,!Ilaf?]\wd'$,?@Rim?PzE Af. =?J OS}[Lq3TFؼCiC?)ENŞ$??v`{ua$jpP` xS Wn-͝9z@]f :w]= vg{tX19O$s/YvuG=*Km=d*-&Q@;/߳K'KGw6 #OKk[5y.-4I@$YAfR>f帒ܜ}[ ߨtOG ZC۶ߝ0xp?d^0ߕ&Tva2{(zVa5zGk;! ~@'U͹nXb_Q8>~ņ"ŽӆE>#Ԓ=3B pM w2xJ٣ .d~)&ނi|~k23(Iqƙ|< Lcc꬧!*{;qig\3siG] Vv.IK"GX])M*Ťv=pO [fTB@U$OHV]"԰!0bܑ:H4O jV^!sWIJdQ@<p_WOq"2dXג!K8χ|3oջno$]^]i% aG8[K{|#-$Pre8=qSPkoB ^vgMđu?%o,n%d,#3m 'U(;\y-iKy|* )iڗ:("k니^|?n6O'uokNԼ-G=0SxQh/޵%֣Zv>c1[$gcMJ"xPUQۀM{=M6YozOZǛ$Qb2A9IųXAԶnx&\wuokNɚ !G"e2[N `?֝y@G[ړD@ӭg]Ckr.AqW @]CY^Cc5iob@eBA?PY؜HIOcWCEFwq8#ɍ?PS#@H~֝/'}~FY_  (sl?(|Z|R, "n#+CVb4{JpLVNu*X* k^$ЭSzͦ}+{`r |39敐ύT]HIgy Lf8~çW5EMv0q5LWf!FS(K㕻E+!KrG<5xaj_K?ݿ:)sdnmahLDF( "OllЯK{xb[P3/N*o?ε o'ڃFU<ڨA԰9ZԢ2e&_߼l0nA͢"XA4 3.k;Z[C&ŧby ˑj8i6{RF{}J=oRq?ZR: wSE6n!kECZ>g$>4)Z;&Q;fC]j?ݿDzjIxV  `1qhK}%éE8ەVů5<~3qNgR:Efj^QvK?y@G[ڹewAw,`#>U L]Ak# A$(Qj^Qv4K?y@G[ӯ<|kPMjZ^Λ<2F9p<.R:j^Qv9$N#֢m;O4H7 uh I=[kYzpMw]0xP#н+NDY'm۟I"h(õڗ :+3R:j^Qv&4Lyo%0u+ָ:χ+}Us-K6(ڮ$ wcj^QvK?k#4/&kv֞%v#n"8n~V1݆m2kf}xXG :,vO0]p rMu׳>g=߆ `6E2[ .Ge~"Džu3VXesVp$QW5RW@ף:RU i/?;@tVguohԼ-iYګM~siv}Ož 4w[u{XACgg5j^QvK? *-~QKkRK19;A:`2~5W,:̷VY-ԠFp.:_Im%φo|/<1b]B3~nm'@6<}(~Լ-ڗ :+3R:j^Qv4z~/6o/$sm;UwQE򭾫Zi,Q=y[[7L\v5[º.iָP@hY8ԅ1'@oto vgE̐?R'խ7cyJ MIX^O O(0 $3u~s__t_iԷNwePN cx$ReGqyu G1#v2se!mYX.9#Hm:tƨ[{42fU?rx%'Pdd)n.N<Ȣm3~l..ml{hGɨ6-i|c>cW#)duKwq%%܃]6ϖXSkd@Oj԰&e @Df&Ƿ$1EI3To/0LJzЏ~R:lKa6ދV i-; W>?vVO~F[h K7Pu,3<U0YٱۿQ f.iw$H>Wz8͉HۭM猰#CV_"KQqo3[KXq)GcudGyC eq& ݌ SGcEWGyC hnէוh4P&Hֳ9My\pUt([d2WYOLJI '0ˎ[U=W>)1кGҫ2\i~&%z:I-n;c@#=Hn0Q21f@<=xuZ!}`Ɂ-r> ukos؎n w恵}EOUb`QHpEA2 @;'k*$\y0Ş؎݇'%{$"B:T0Y>.@ҭĒG;~ASimr'Ut ?Z5t:/҈Ru{htʆ.X<amS%zWu_'\HYTbIv}+B:~S7Y+g2LZdI85.QX,e\g9O;GTZos|93Wd{t .%m!8$ONV2J,ǁUMA^|*V wDֳ 1a9jbN+wn$ Q*QZRp.xh6~Ikƭ~7 )Aޙ>M.Y)"S]#02'l~fwRӝKP#tS"- 5isZ?Zy\pV2L ȫה?JGyC |9glΧF?r<Ϋ-vY(&P:J暶ܱSIeE ;~/iO+( /"ŽqTAzB;cI H99lgU6jr ̃A>SREw,%Pq0L {wZx bpc5%Q&mhGc{} 6[UF#A֗E +B:~ZG\xkR!EPEPkoB ^vgMđu?g6kwCJ/ei=&$YzWu_' AGRޱV[K\GqtIgQʨ3q=Qkm?:uȒwLRu;(?&bOғ.:A.A=2 'r޼ GK]Kgi?trqN {eܻ$gC1ƚ'sss8ys& n kt{8ٳQP[)^]5*O`)COlgu9\]*\l b)l8 f$:HI>>]+[ۇ@q<slA m]ď2|vSAM5e2*b}>H)IfՉYmY,O\sސ_^] hn&)0>pN\lUo ȫה?gPo@7O`J_** TEy\<_r_iޗWK{urub7O"!fsn$@ [(t<"K!՘sQ?X?|+T7[[W¯i%I (%뿫%Uh|^3vNH>"`~0ۓ|tV(Ck\}J2h?hCڬAGZf^!sWIu,a1xoˆ[6.ַEAz#nD9qҴn|Dv!#ʍ֣#FH#i0Ce;snzȿpEFM'H[ʃ-Y=#tHm(ceɊB88Yy {m$9ʭ$X}=b{c+$L ~Wv-展GRSN]GMag$b) \'jFQe$qҫK\Tm~}CHp =jz1EG??Kvd1yd71`*}eӓ{cC1Mǵ)#k4)[M< M&ؗ}͖w;G?1;,O4v<ҰXK1=lR%eh,a6/ lNyϠHV5 p6O8xG U yۇj0V}vJYu)ۖܞT{gzH].g`Kgo\R/cy#5Xo>^}P hZi3H:\J?!Jʻ~ߩv;R=e|E"$Q?\ځ20eEd%&W$ }j8D_.{Kd[?8=˨G:n<,;3lo[sdN$JwD;2OSh vk!Kc^ &xHx#ߧj(#.Ụ#PQZݿlg As'þq|%$Gm 9a/^? Og,ln\:s|>,Ë{ tVxSޘMGNY@HB~\F}5vbeCz%Qҿ#<5YzWu_')Q@s|([oI7M:Mgf5hӼ5=}n?1}ӯ[TPk$[L~Hg6kwD+|4ok/J_:/҈i[miُʿT:O(=v8|>qIwz ATuI̒,gꊨީ.3[U= n2SԠGczoUИX|S]Im4y$I2m̾m ~~c $}GTuAӮq Xj7I#OJjҴHWd av v9'ܚbw'S#HOԜT*}0!GA@Kpst~.O=y4k:5~bٺAzv$hngm>&E봎C/׸qQ,.lr0R8d=ގ/-̈.`8$ M,Xr М˽OᵿLkEZ 0>{-Re6OV̱H֗ 읙ǻcɴ*8k=AB㏦qEH=Az<-.oɢo-z."|5"^P&?]Ct@H['O+ 3E椃T18ϸ7>)sZ101XB-)rju@IB=P 9]&%\miC{5F.!nM4Z[0\?%s臘Ԯ34?P(XMJL3nd\ԑOܱV+$Tw! A:kj, D ~&z{IU7<ڟۉiZhGj 'hbncd4簒yʲ|gJGzVG;1u[ѠTu7Taq mVFq+_3 @µ} +B:~V,Ri|X={Fo5ا%ަU VL_{u1O I:u\quk(̡9@ZWҧ c)8V6أE忕2Y.䌥֗zs+8ZE/ˬI`AsUʶLO?<٭Ә;qo"GH*H^+yCwʺ_8L "s E}yO!_4B66BZF8}2TUtFnGkd$|~ϯ%ugRCO2#?&f5<q; Cch Ecc6g#qg.y?9=s܈ɜF9cCjl?̗DHcryXO4[D ugש &Hh\Hh= #[2}+ Yb:=C $yMcEf`s- ;,8C @1KMXi;G@Fp= f1,ĬZL[ǀX(CczQq$c ec5iVV\4wza1/A_?wqޘR?[Zt 'CT%t*V$ Z멏ml04OO:Wu_'+/J_֥QQEQ\-ŏ[-ťqls:@5K]B#nYݜmzwfnsq}Y g֢ecz٬+B:~@ J#gm k?A O(m]FK@>ܬ&JLқj:cQ9GLeҥ_281EI.y' 4-v 8OٴXpQǤX+ )%t ^4\'Tv~3$8$I)si2 +zSe 6twO }bo/&;x$V jYTl) r) {؂}E̊ҡe%!r:'Q{)܎UAqu*b"å3hCn~?*K">cFràSGs-36-hv,p}GpZ"4$T4j\à ŸO֒%V?Sw$W3~4_E]m&L&GyC ƑaPkE]#R1DէוjV]6sVl.x)P(?=Gb-<*glyZ۳9#y6]ԘՎnzA1c֨6Rc¯/u=Wl64[ ײ>%q#E_A.%ǏQ[Q+EO?rH Ƒf_qyxaN d|d@F+B>AU+,G<R `O/-Qyͺ1\e:{%v;,g QC_t_i֥ajSKs.P0!\tZ~rL; [C3ޕ3wrKBNN6)6,EHإ[k8)m(\/M`-sヂPz{p&sۯrrYp~R]@' MY/-|p~0m[n? ~zYy5+_UHTZ5Hhjbx9Ow0 .iY7#su?<kZdb|irKj,k/>[VR R*#zC:ke;R6= rWCdzxtS?,̴GߺGq!# hOIᇷ_P)n~*, 54QG،~]Ϡѩ Z[ gkB:šHz Xdq#QǠ!.u+haL2~AVt!6]}i(n!Iշy db{& W/a"щ,@CG\xkRO jUQ@3uHg$?:FhRF knOrGX@p2 efLF2$dMw!6'pSǒ=:@_ZZay٦u=A'8/PxkE]#If~y-X0?3ޣGyC h{5isVlus: $ќ0{ET8*Kn;7=G#:|ҍG*n@?o6("N*({-c.&$Q,IRZr:py =?Ol=^ Y-tA8F9q뀠\ҥwBԷ7cV?([ia>nu'U$F9f R*_6ݟPЉt/ԟIKi'2$'Ӥ֡fEC-Ƒo-=VP$l#ؿ&|Z{ߎ3 2dŖJ0L!'F.J0 "ScH,ՋM1"d"-+c!ӭAoApQ&+K;qS\][G\MI.GOB-$P~DuXȺңcցLD|ymS%GowM3/+Gml~*vr}OP#Q_Pè`/Fyjȴivnuv'~$LۑziH?sEZ{$Rl"y'uTzD,pA$ :LPwH&X_3 @@7}mJ*N[G$->q*}cS; G1@@%23眞 ^xHH .a8.Lr3inm`˞0T*}A*krw.dWϑ1>C@kBF[=N6FTF 4l?U=P,Wndz/Q=D^Z/Tcz }so"Sph켌Y_s+ScrA VeHE cr|LGyC [XfbeT3=1/W&&[8_b#ޯw!y!:(H`zLn`Yn,\802ܮzRHrq&z2F7Hh;/@$D͏#GH!@Xqi?,+'';i_L1#=n<7~cE70@.{GN*CK;NAgSqti[ >&3P _[@JTFԅ)ܣ߽#;d qX6kFD$R9=@ݩm#GadQM0h9'݈>ƀcHK728oA>(#8A%9'U#;zd8mcfopz3vW\bI.+m2%3ݛ9'"-%GV+"L߉,s鶦#uR\1\SjKag\cOUAji { 8!4O jV^!sWIJ0(Oxor]%2ahvAWqWAk2:iӵ]=n-ĢT*( Ek^MtC\L ލbd֣[˙e ҿ#<4km?:f3ͧݮՑwpHfSGCE_QO:mO 3=GQyʎwO=a{4ggQ `\xNL -35d8?ޣCؘnVc442rP˓;q;bz_A̲>5 gi'TpzӢi<Oi_x>˓LlYTf;`g:~l->{sB myGN,2A.cvHA^Op9JlUβMck+%IaZ[K3YA%NyN{b0[Hf.ݹ4>U2۵ 3I G_qO2u(nP|IchehVb'-< yϻi^V}NU˻pQuc#Zƚ}nӏ=0RA&BN<|廞?A(y}׉Aa{ t񠵷]`o u ȫה?p5aH;Fz'=y8'֪xkE]#4g- 3$}6sZ  Q.[?!LH+ >̰ZÍ.㴄;噎^ZF]OVmvF{{3NH#O,R q~B}Y¯4 `?>OzLv啒hk 0,# VeY#=U?mmY~ |! FFϤƿu'*>*hP;A?w)|f-7_|`qi}>E 9i*1-%kIWObOjxgj#ZqPOVLS xȃfuq r](a >O2'7G#wA psH.Fo&ֹK_t_i֥b9Gԓ[Tf^!sWIᩮYyXI\(+B:~S?ˮM-'*LKNmLvIkn[Jơrzsz:O>uCtl?Z qsDۣCdQ>NEާ Iȿl38c} ;o[|X5B l#V#E݄Q`uө*$L>5ňW Wv6?`)ڲ'a_:?Bi40 NDa2Y)ڳ}(Q.mՃKO9dx\q/E gjHHf(%lgO+ ԬjC)cPGu. FQa|{zcq!f#QN0%^>c`GyC wh.\Fj̞@wVkE1ȪF Dh5D̎k8HU?<iI5F1&2 ?,;xL_ۏ[";YMhGrS8 Gouۂ4u_Ő˟<-F+@?{S (%b tH'ջ94$Dّ9>V"[{EKxF}Ih%ebyԱ=5RI+\!Idc?O3@λb $OׯKݽL+B:~ZG\xkREP7?Gy0_0Q6A]QWjLq1Oχ.t{GP/ WQd7,"$U@B"&NZږi [̐chb28u9պ{i5Asg90,gwz7fgsIq/$;06*ajEewZ,.e6vڳ$*N'JmOOh4#iOzkj[ON,jAG]:27;8?,^5I!ԟΝp .̡ZbSS SρWGC+_M:T(bPz}$4}>t hd>yw1-V/; 32s}[fOSnй&=H\l:ljLM6i4-]R=N0~5m:mAz~$zע[]R2͹}:೷>_XgIFD]`v5Ef68ܼ̐"2.$d)SoYGEi@?zx?-+N]vQTǩ1>OoX=W 5eQqkbs]Zi ԁ̋:㓵1玣ۏ"W3?[qT6>LQj~X'b:;:bh/޳: n??玣ۏ"SԢ7XLYO'tQ@V^dFYȉrTGR˫XM,4Zh\N*W}0lQ@'c3zx?-*mZ/*8=:u˓٢哩VPe#6?SF4LY#m>yǶx[tP;X޳: n?qR!=Q^|덌{<~jܢM?fլ'xY 4w9[4P$foYGEEoX[FȑjGsqX埾>Es+-v#uwX,edVP;YmڊM QȿӜ0POZg DG(R6r23gi/rB P#ʨq*ZjƊʊXqiufu*+he_.҃,]˼~y$~'>"j 8d>k5̿~_2zWPrd..(^mr"LGoW5w.ڏU3spO²Qj:_n&UB]($p3 V-u y]z)s4ClvFQ,]˼~rq]x¾'дKYVd'Y gU$5~&&үisG!`@w+g9.#׵ƊHյI.-UFb+ (<3u/|J4-QnD$q@㓒:WxVB#O i1H!Fӂ9rOS[4PEP7ucQzyȰ%4peT h=yPtdO{nnPI #e F^ ( (<Z:Ś%]Nk뫍:bfkş*}1w<iϵ)@9Å\Sdbs@Y(|iO]GxİoK=nD6qg{tr,w#}AQ@Cw sC JUf)h0 ${*j(o/iWח՛*\ ă* OX>M ?1|_4l;͠.g((FFNm+!Aq/!()P\> stream xڅUK@Wp/R˃Vn6 ed7뿷_0Kohzq2id*uicT(OsU4Z}lU( H}iPýk­٣ʜ .]O{BeՀ m2q+n{uВUx~X/ ,td"uTޕѦ[^eJɒӫ-`6> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )#,rLz:HT3 `M.Yr"z(!EPEPEPEPEPEPEPEPEPEP;k.fL(IV8}T `z2>(!]ZVGI wTAEQEQEQEQEQEkm7FOyvmʃxcۦQ˷E}w {&{}wRi7+D,yKh{gL{Rd5\ ( 5%T"-%ʑ%BjO #2̉\>٬+B:~ZRhQ1p}q@YEFf]~tRH^3 }5[-!mwfpy⑟Pq5[f .bB9~Oxl$![oHe2r߱M6coOǎaskk!K~K$ 0y*qO5|Ayh Kp8;Wo Hκ֫[,okv03$^O Ğ⋏ b)mÒr_0)8#]8-=m~F>_M=&N+yܥh#T1V޻rH9-199&HP)2 *ÒqXMzkx`{e -F]7m -ׂda4򭦴YʡW\ G"=Zu_nM]N[(4mBfKedzx$pw8珤PC 5oN"K f AmlًyY#=:__M? /*S(Jdt?xusGKmh=߿W*Kd_/uG4嵽pI #_2dsH[uזr,7xTeUg6*px8^,Ee=MlDBr]sϵL k].3.`H'G\q]vK?{]vW^~=E[;slfda`cr0px=2핊A.v @%K`Ƀz o"9DCع_MEk-^ B2Y3hd* "6rr!8/'O>P}REu[oqa"!O2'bBFr _Xx>( yNV: S-iD <]9j_?Z})le d{v /cezckI.OT[WQysӚL}űmvo7q) ${lw϶'^O"&KWRns*Dbd%2dɠINi#ݿ/orrN˿6ش}vQ5i3*aQAϽ$6^9Pvv'iRC1;eg?9;Gz46rkQH#>lr}ȿ˨ze/v/ݭ.e?ev|E("Li&kf6k0 #&[^hdE *!XBU{>h!Xu瑁DaeFO1O>r:cex,u[>kX!B<)J6}vImpnX-q ucթEQӿylO/߇RݛInǝs21jw}bY~ܹW=i&1"ʹO iHѲb 8>5k t@#[8s$*_(4yLrfIF-\16+[@߻cܮ;C\54o3k&wlp/Lkjg Xg==lBr[t~_AqRb.[^P{u\mƋp AP4ۑL楝?&;)#fV+7f>/g!H NxP8[t~[̠$'']=Gk)RNpPCd?Z˨,r铋O(W9}oJG;GHm`q?U ~4.ۛxeb.w8Qߠ1Mݯ?סPj<>\xvclt=3g.mim]AX9]W?ja]8،+#~l{=@GmˀK8=myi&z}2ur"\n[?jHn"X42E1|fz֏o1kO վXYK"v=zT,J]&v(E 3qVn} ~q{cUd:zXڶ_;IU [9ۥ7̈򶖝:tQEYgk=&hH'EU9bj2D X`hye^"p@m'kn4xoAi 튼qq UE#2HT~ou'[a$B0q Xz((/J_֌4lX+ Tr+;J_֌3Tӹv# nfy]#$}F9@>֗Qa+j@I`q Ᏸ_V}0DmxV/# f##F[J {Ԛˏ1 { ~:Nyvݢc?)#n ^F/GOK9kpw+1:g[mXnCZC\Y3Sg4Hj0æ>qb=OGj"Oѳ26z=_Ι& ~ÜX4E{f+p;lX(c;ѧ7繡5 #fnjlJ-ڷ,Ak*<>Ա>um@DT_*'HB=+7O}s`kLc&gi՝dVV d0KH@#8>b݆bRF RW b$.+3~RϨm"+{gn);vl98A?K,>lc%e޻00ʂ99>3.{bb,Đ #(EukrYȩcpY v1˴~qk0<7ɣ=܎6p-O,ۆHfol#ۜ>o5j k{j'wx}mV^!sWIU&Xcc8?J0m&u4Zss)vy17v9=DKYCS9#2\.t lIe0A?OW?ʭ&v)ŀ_~9}bhg%͙2oz}U,q\xnSlY17ܒ矯V6k}BGZO4zhMDcjњZ*.mٝ"V\8J6::Ckw=;Չ J# Mqk;b\#ӟZ.-V_kӾh/k`0,sʜs׌KKKikV',G MT^\ڲgp6{6Fc4Qo[sƞZfIo~.5k5_cv0$RmD.ܼ#Fq{cėbᥖ&*J*yݸUJk?و{/2Qg ǯ#񧭌'7N_m{u߷i#{REYUt5KV++Vt!#U}3FLyuus8U{71UǁF+?T45YV; `q@U;XռϱLd19P= ^ +B:~Z2&A#FHG5G\xjɁm7;<|`ކ8Y.!:ظ 78d`£1ih֯ce}vxKqs~h)!Up#sҤZpX mf(H{72XnXml{ O/5g+-fӶfxaJd8 l=*[W %R໅-Ӓ+R'9AnXgQ,Hɛy$1#$LzQunfRxu.d{q e8LUxicM ۾a'5[Jiqflbej" 2HV=}s4oA_&m_>g^:֋.Y\Oo%ƥ^DZeEe۞3<'M2+"$ hNߙ _e{9⦞M/P4؜/O?8T1V'[T3 H sF2:{hD[qN]N Fvѐ9ǿꝿ2"ui:sEh (I S2ĎcmAޣy@R->;ٖkViUvp'&N ;{D=qY1[{;j X"%\GQaZ;$lH@EO$ֳtO h$hD 2@twڡQ&,)Ip{4uK-c U8UՃ[L^VѱEu`Cpsnqpwz{uY;t]4zu%$h4mH]E¦SG8{M1wa.sbx?;ѐ}j1 L6ai\gQpd0q#fWFASv_0^ڨdO bdSt`@ }{T)|las X2ߞ3Q [or+Nxa~[igm ev>ӻ' WI}:˧Sar`l7z*+WMoRۄO4Gt*n-]y-GbNc?,a$lޤnJcuV# >MumWO uqe6qngoB 2~VSl12IzM}8WlؼZ`G=@9?SN%wߢ~A}u,m[хlG 9Gr(W>s:~:sa rM m]rSKi`09 V;PM{|z7lؑ F9j#K=9~ѹZkgu#Y;żHWȋf҄gv[珦* aեcU|yGPO9##CM'2ۧ~Ѣ*`(RNͼ+ud6쌄e[s|l<EoQ\ _Xk_Z۴6坞a"<2@6{{C`̗-8-8h!sWI/ v5Ģ(r1>j$ծDSׁx KTRY(F UFHU,!ɡ;,4si;g%r>@QA$^ hVEd]eI)8 TD}Bt@Q1 ?PO}dT$'~B\ggkϢk߶%ᨙu-cllSn{{?$06-Mqm=1tGj&d~QVܪ`ms5!>'1^F(2v2q m>ETRNWOt~iQ[7PVe˜t =AJ BkK x}6R@>Mpn&[ J;Z (s{OK]j\kעjXmծ%i$v%cQUs1ӟBӣmJ X/#9#sӂՊ]FA<(cH pc>%#"X )ء#NXF9ߘs+{vvR/ sSޖ8B(( 6qi}x$rvd8b((ck}hY"1RFdS uohNԼ-Byе/:HEU*u +3R:j^Qv4%),`AN* :VT0!K1oZ"nf%MQ(N~;T3NN(qϭfj^QvK?#H3y4y%е/:8FV,F/?;@tVguoikrƍ o,qy(' kQEQEQEQEQEWn!|ɤ=OzmhC˜cϏv? \ޗjx]:ly2Lۂ^k#n!,0OtUY,^"َsj5Nm(O|3$ἒ{[ ("AoLQmav-3{P[1ڮcRȅ,@ ('8QSD(pMo/RJђ$ @tQEU&=-鱜>gV#K/5^(cx%qX:tk^ f/14R+ۏƭV?,kImbRZ qRIlgJآ7Sh7wV{x2WBqW(((((CХǫ+< ݷܑrǃPUon%g_"tv2:U((E$X$Ic"7AVudNtYB ;f8f$[ (*o]ޣ9 pHޭQEh#[{)?.䳔"8#5EGooRO$(g }%PEPEPEPEPEPY`Z]^\N[˷U.B|̣dӬ[EMUwVw-YC 2r I+b03#&3ʁ#9[4jQ -4$YU$@S s. -HјfX84*]JYgt,LiAf<D#X]E 4F(19ȵAU673[V y#knFr:fe2S-貨Basq*k_ g˧Ũ_,3 DLh]`YTNhQg4C閫-聮%lf2p$qEt,my\#qNa8((( endstream endobj 361 0 obj << /Type /XObject /Subtype /Image /Width 491 /Height 575 /BitsPerComponent 8 /Length 59557 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222?" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( (]i֯m 6ClG(6?tlh[d#wHT9$E AuKceA3.븓Ѥ^xgSiV4M|RC`tڀ:Z*aZRF9=*QEQEQEQEQEQEQEG%+ɒR?6 3i/̘0;u+ %Pe ) ݸow'N}Ju7[ii 2G4B;NPpppqZtQEQEQEQEQ^'.me^;ATCp\sƺ1GTe{Qvj0|0,5BqڛyH|RPvk3.Q-wݿ :+3.ڏTeQ-iYwݿ.ڏTEfe{QvjnC E|ʟ;jMLp@zFԶIrdG^$BO5nvq٫dPE25"^PjC ȫה?A5Ӽ́a>2 SGwdիx#(Ӓ4vUK'өޖATuoO{EJTu{{=fʬt=/U;i^QU/m?o *G5j'jRz?WP}FhE-'<E!ۿB'<CηxI4.=u [<z|RQԗF_MEW}dh 5ZB l'Ms69H}1֍ĝuX2>jNE‘ L*2BRI8}V d޳4O J{[Nq'&>Ai&_[,d0\)z0G 5V^-"zg~*K[IuR8 ~5gK=-v5TtO[sٚ w’?UTmuEUIǹO΀[4A5z??O:Wأ~– 5D~\'c "ѵ܋g!"L=ӹ;ail#]-$ry'ۥVM{1f(VV (S_5E#y}O9$ض$H^GTA՘ ͟F?8*xҬ}u9\$g9>5is@;-J(Q@\Y7WP5Csyo4roⵞ4[23YBjU >ڼw_t_iltTĕS뷦}-AGV#mXee^{7Cjye!nvap=.%q 'ǁV-!Fܼr}Xҫn:5z3qK_&NXCL?崄QẔXdk[ЕĊO{OK5,/"1,U@nOZiOSAF5Y޲zaGn8ӥƧk8=Zn=Hż&Έ? w6sh-s, m'#hPXfg, cf›4 ^,J_#RWu$l#ٔjɥ4,q&c$cS3Zu@IG[?ߛ xxKRE/۷G!V Lz2{k//iãO)֐X1N)V1ܰYQ>OB=E:J]FC=@>=h%O_*(F?8(GyC 'O+ dS$"#>O4yQVnqv$j9L}\_He KXYT1jGmC _ $2vТD]\c Cw$Ԇt&#TZeqԖQ>[I9?G=q '<[^ȿjȧǜoU_2I;B1#? ^/_bY:E9H<ޤ2 T wmk>-S$^YDrf>Z(vz <HօJBi̡:/҈RE_QjP#/J_֥e_?Ԡnma˙7.r8*}A*N`[6IÏ\wѤ 2`#RG ղ]uS0}*Ge㩷~wH@ P [TV{oހLs(uDZb*;jvx2$蚤s"RzqE.M<g?D`~4t)/y[k??O꣬ Pi?Vng[kYnDhN_bwq=n_&#32奬 V{XuE&Or=jM:mbDϫc桲J0<ghWoDBġ#E :8̨݂NeY]R4T)57\%9݆ 3佺xP2mSK<GZ$k [BCU%X+.J˟F?8)jQEQ\,ϧoB#]m,gT,=4_ԏe\?q}?7Re7 :d=@o?/}2}K) RKki"HqF9 ByD$S>LQ2*94Wi1G?/C>ϳ~c-yn:*n?#(څ#dH = D1 ٜ)={FYsk$s :B}ʞWH(D5isGU?Q?Zy\pS ђ$@pH$P"p7~t{]9yyy;}D<N ~XwDf'ori\[|Ϋ#>k֢<_z(w!"B"`: 7+V*EoKy:j.UZ:M]rUz (?'|5-?Oy_79[?c?0Q)]KWʹH2F`lqc?w0uQE[3O ],sf؀z5kdIhЛT 66q-dp>\Z2R"Ǽ>4yy;z>x3ڪp\~Zb~DuYZ㬚\,M9":ՠF^!sWIJ  Xu?izp_8_5J*uYp GsZz>2q2fJfXF=è,LQdohT7v[v%| 0꧱M7vN+?PK\t@O#V^W?xkE]#էו2KknfrPq wg<1~j"F[Zg-pq6Lu_t.ϿY[x//fpw?J`Um?gdXw䱓*3T3FX`;:7zdhm&[ZbFM6qq|;[ ,K`Ҹ{bNca,|zШⵄE A=OrOr}MKB"rz5h7fb]Tddapi?'|-'i69XH]VSA)EW lX14l}v3ތ걌m>Eʞ̽HUXTz:\>cTH `$ @Db( wd5ެ[[Ș9CC/7U;? o7Hvo]UM2U k#Z2&*Ll|Z2O jV^!sWIJ(j#l쒓e`ӭY5bdrU=Q7* X*A܎20ҷbY\۟21UFGjhM?QI>_5bq lN2{Aڨ<,lu]=>x}ˏgm~/yߜe?^o]Lf ?YBU FdVg-8LXP]$Kkr-g {3*.\5bckl|Ky'=j$jڅ Enbl|,~*K/llYs.My$ʼI+?22tؖEr7 Ȗ^vGE5b+XSlj8{~%;w!D(de#V^W?YsէוjQEQEVSBkPgSv:'.n." "pqoyVe_?5E_QMwjZzuO  J#~MCNJl7)2?T/eCHՈbH!DP=uLO,.*EIm:ZCpvTWB3GP%kQ|xƍK7C>?h5 FeTP] [H*)t+~ v%WVSQvaϠ=JD[,!ǜF LqɆa%8aU)J)9*:AmmvJ(D+O"zMgoqn %1rdd |yFB>`O-ƣoT{A;sKco$;T3%.k˩edFGPOIf:lHY- cն1L;sVg;x$VjYç%]d}f4u&yɷߝ=ԝO9~ xͻˏkSp 2f)|Q/U/'OoWZ'&?Q0u%|,_*(F?8(GyC 'O+ d$մdh-#NZeqgޓAK/ORԫǷ? YBZ71"zVR >ѣ PJjuHyeR; YB_B}//VƓkJ_Q^=u]>+G^NtdX W?t YM'<z{7gDZPnIRjjM~XHUЂ8ϧ"T1Ok$Tѫ,2WN4(m?? YB_B}F4s0K $m{hUс">Vem?:ԦIG\xkRO jPEPEP^yܣ)_ ۟q 1i }@OxP}qCl??nēDcu̷mW)9]\*WnYod?Mɟ7{/[ڽu"=Ե [##ЁD&x8N?>N{ umQ!} ~(QEV\5isZ?Zy\pPQ@:|Kx.3OM-]ɜnqЊ4 O{Uݷ5g]6s1@UG\xjޡg`|:~u޵5,Fpr<4. J#O%JZXʊ:Ro~5__t_i֥N!'9`ȡpyO`yM/xؒ?#Il~xle%`z~5-sە[rc-с}R*iё߫[IFKFz;#?MrjKe*#VqY+$mFބ`Nv{Dm孁S<OGBjH@f#\|ӯL%etXdrmmy2áY)~5iP+4NI{*OeKk sot l~u_Ll-1?*>Ϩk}ҏ+U?o9Gji~e`?.iD5pU5K*[x|>-69Vg4ISx_ ed!dG66 3A#$ˋmi[ I"%Voð86\NWC!P)Ov:W> 9'mo19Q~ժC;oH _՛ R^}lP\qc裹9$ uis$K!.ǩvy iɵTljĐ)֖ u%H8USZ {< /#OkB= ȫה?_*(F?8)Ywu+9(OL}Vb*]E%@\=j2~3b[[F^1?¢Kv;@ܬ#?Z^-WO8mFA@}Om4x؊)?CTJ?~, Dqݣ l!?8=zz>ymze/f [rzHPI 'ROImbyIyGkŊ;h[ ͈wWuHq>prGE;w̚ސD?^ *Cg,s,s(<{(V%vNF:?:C\E ƒfzIFȚ[i$5K(91;?atB$ y#Q0(e F2H?oq@h֑`Fa{ip2#~Yԫ6IVAcZf^!sWIJҿ#<5̨b&npFvlDe8Y(bJyx-R5ndȊ qE c ?UE5[K;̙cqKл% gkX Lc{+1f?=NWui,bb%,)v۴V沁<2Z*Gƣ @|$TK(@?{Oz&nnj8gɏU쿯&E$f$?|?ɂ ?F^<@T\wF[ު}p{U{;tNe]j0}B*Ɵp@R|}Xw`5]?"KK,$mFބ\ e`U =FN!0[&Z#OU`{wO-ȥhHY 4D z ia՗?Zy\pV9!Y[i f#V^W?EPGFt[n^ry{Ӛע+/J_֥e_?5E_QXTL26#ُ=q__t_i֡ENېGwLSr=5^H[K oz=_QJ2?;d` 躍}AE켈lE.`HC!QD_g?O.I7pg#bUxo-JY,HQ@tMik|$@J ,9s{tIHԭZn/ 5mǓ@ }?ZXh?aU_mg'dٚڮošʾ|G[!d?XLG?` [^,]eFDK ztOo⏱Rz1h JCoF}I=O -8^?^ ~ޥLE%_$de$šb} }HImlsni&|y?,=Ui'}EnT{V?$']cpO`v9[@ȍW{*a@u!>Gg, J\nu`z|{*z\HCEmp{3G`8y8#B]t@O#V^W?xkE]#էו2MJkHuVdgPei*32zހ4b@Xb3Ѥz pihsId<7 /&Էs8y㺷I9G?B;jُ&}pGT*PxfU?P*S՗~|tը|jޠ:(ǜqs,o ?I9?G=^Ha_Ch[">I&$1[v*o;s-] K)XdCH@m;W.sĒ Z+oaihšC<}XVhoqEb:dg$qǝ$KaC(m8`HnJS?_t_i֥dK` 0:֠FV9Qx{յXXwNAOnKOJ_֥!XJ G?\"Ζщ$W-^O5f,*+miNGaO`rOw"CI#"pQ7Kђ9;Au!Icur1s>7.s>9$2"x$Mpֶo$`4 AK%EV'h+VΗ֭1(lWQWK>^NQ#j k +R֬.,4؏uLj_^-]v#ǫ.IR;ԺYŁ2$Dާ#>>Զ wky "ޙ1ȓDpYNAVkIF- z8ȡ j"Kx#i!L2o>wVe1SSQLWd" ؝RT *?Zy\pVe#V^W? Q@Q@ kB[8 nb֦Fo?Z٬+B:~@ J#WV3f2lrLn=qU~DunZ:bBG3(ʡkzo}ߤ򟿺=6m=L=mpܳ ʿx>Tmn9l2؃*}k]$08>][qyjΣ[[O>w֤I58%x.8l{23V(kCʿ'2"{{J4ⷹNhVիd6OlGA (! [Lomh.!>ӗw3{M 7L*oI(Qw_wEY.}Eč"$}efD *+ƒs'幜'mꠅ*O .v?ƹ( lϾ[!- ?̌zT[ffySǠ*?#7vNWO=Os{q%Wy P~ZFAq:13z 榵xYi\>I敚O1[0 (7*Ky i}@P'5"^PjC ȫה?AQyY^G\3R@\,71A$]7,= Kkrv*`pA}Y pq>b`~eH)E&?孳ˏ /m?o *Gr]GAR[Ǭ?QjgUS@1cG}rz-/}_5Oy_79X#к5~tNIGΪCWqͿJGR_¿Ydڔ٣iSG)죦zc2rvL1YfeuR Q pġcBpW#1䞤Ԃ(Ճ]ÀqȧLWf^ J#J~Du@+B:~ZG\xkR yⶅF% FNX~D=j6rK2_yWSzG'(u V{1ۡ ub:;/nmѢܛKVW|3߰ɣ` [+?VO?K|Bh"#K 얩2',߉$'go9G&vcGBj'jܱмN2XzU5j'jI+Ty4c.|Y3~v蚌֧#VU24ep<FqJP{pc0NJc@﫿RZAjϧEh>{u^p45%dцU :kRq7rAi:8''i]k.J˟F?8(EP]4.G$Azo|'Ie$GbΜ#udBk[Ṱx|H,bv8Es(+B:~Vu,s8m䗧8j(9)o!D8#m?:ޞgwAGWnlцe VOXr? ԅFG[?)x>ߴ_='8?Rx TAql;/ "1gޟW2)N*"UA#hKC+Z%=eAթ#I1Ȋz U?U@=-h 4mnD}#I݉=J'b4۸s򨍄È;OG%uXP?#ԌbT٘|ʛj<ףʒL\I>v.5(@ᙲ8ϥAV?r^_/;"ፂ̈́ɓL2㿭GmE\mE f+?6 >ьC6MG# MH?TPZan'#c)B‿FDSrザeې?Ry܆;D;*p>ү:P3H H@]t1J'tc>UK.7yOq3yl's=˂$sc'zݔ<5"^PjC ȫה?I~+fX$GG{8YaY1Hz{z?T㕣xٗ%` "V$:Ss?U=MKDx?4=.U;i^QU"9m v-8xa4Km'jP=TՑѯK;[TdT*A(ǜqx.;?#jTV D#G̅NƷ# Oy]F|ԫOSGI&Qԗ5=>.M^r#f@bʥ% \AMD6GTEfc4a{38Iy''ށ8#c9lr@={նPUA5 /%]Pp봎8`sHA5zhƥ 2I*xr *"8<=H;xu^(" UFsV(+t!*H' zՊk&=7)QCo̘V`A8IE*<Ɛ08_YjC+.mԢ(eG n;6o^k(UPR@Q@KI/l(Yn8d~;qRoՊ(?M5bxAF?MX+ѾxAV+?]ƋKT(Vm?űKc 4o|:uj!M|n^&qps]l;@կ K@'i9g.oѾxAV( 4oՊ(?M5bxAF?MX*ivgO,Ûx"cv?2vխobEv+8??^+ѾxAV( 4oՊ(?M5bxAF?Ms?]OӴ5ts¯U5FᆙeoφM/[i7nYAo09}&EWw< }&Q@?hw< P}7?j}kupXHX+G]kF(> [[cHS*WcV7?j_}&EWw< }&Q@?hw< G<)q<6yo"B<0Āy;M7?k| Tkyl`I^X1Y^momol.HX # y==jߟ;N4Efy3G;N4Efy3G;N4Efy3G;N4EUo?t;/D 6n֠Pi&IIsPdlzt +3{A-xf+}q7as@]ӿ=~@;ӿ=~@;ӿ=~@;qk:u1޳03+b +'CR ;GQy ?Aq׵?{Ӣ,7:QHp>,m^+_9&l51B8F*x#"Ҁ)N-3z݄v0kya|%7H:tyIlN?F,g D8$?7P^ZY>OPEe18DtRy=O¢Kf lqy|IHrXe<,PqEK4%b8*FTRp͌tt R v5;=H4q"4#( S*,5t:EàORj)'gsQ\N{{:Z"kB%T<ϓ olQ XxyP߈R[Cia9===I4Ouoj'= ~ M#e9.[ўx>n#(NW1$Ei#G=&ROjz(e 2T[+2gg!v0`n}ǵ12Zz{t>$֡lȤGQЂ4k:I$HW|giqޣUv]))$yPX[L|[b}0Or=Mj(+ݿeO(-}}fD18a֧'viªdߏʪ7ql?@jKK"K?:|MkJO(+/_t_i֥2 +B:~Wo|HmOnAA}q-+B:~Z ;28'99E ԕB[3rx?N^~Q\-e fZ u4 v=8 V~[fkˠV0r"NrzaW)!˱GV8G%^: s?.jA(Ǵoƈ;w^RѥevХOy]BBZxm8Ʈʑ*,>5zL_RsX[xV. RE(U4n4K"U-$ʚd5~i)^FGnOOynD|+`:;=0n Qs 7<ЂKE1fаax$GyC 'O+ <5"^PjC'F3\:djn;T%ono!T®I"YOOEѢa1=2i{ă#Up}T隲Xm2~ Oj]<}IKe$`J6930z]Y㲷rL gcAվ85:6F`:;V$q]˞я?#ii۾,O?kDj?0g=01,v[ZZx`E˷Տ'4m"&}%`aUPjwUH(i.K Sc4Uu#ϧKX9&&#N٪YMǔSW[[JῘ/z2#Ǚu\#yuWi,񃙯^Pېpǀú7'E$:Jf)TٔhU-=y_d}p{S]GLaI 27dsŦ)aUH'47?h= m/2W@jDctKpúOiqt28a)#ȃ}o1.}o/S:rf wi[ԟk~E_QjS!zWu_'+/J_֥*ۼqyp}$bjK[IrHAT՝'K,7riV4j9$-]Jb]2S>g+}p3Vsjz;c=j%SQE Ii!?G`֯Uj66㢳NQ?S4P^ d dP9 s};@ Y KT1v.竱9f?RI to`=MhR]ʖ+.J˟F?8)jQEQEV^!sWIJҿ#<4km?:ѕ<ؙ3Vv J#J-RpcOOjT(D O~)P;uؗRgo<I{B?>)@?M^Vog!}<$jI]:W6[kD_h)h9Yd_H?CD_h)h] {j:qc*QNsVH"e(韻VCpc5z,7+}lF h@\-% W^єvOH@=FihAXb$``Q@۹t@O#V^W?xkE]#էו&>m*x>'Fii ??4j?3K35_3#oV45o[u72,$z??8T[QC<8j$'4IjBBio~3i.:1a x> >'/mh|9* }S۬pq(9!)_1ly>v 0ND*{ U.O2idQ0 'X&Y'3J{;Iw,T76]brAR:{Q&BcҐrF٭o*KC j5?mgx/9u'`Taߕmym?J/[>Nn QEɩiP~:O(+/_t_i֥33+L6o"mc#oON CG\xkFhb56eai 5M4'E C'Mv,Cgv⹉eE6r(V-%{YÖ8Ϙ?G>PZw)r20Amn~wndʿ_;}0I߽r~ɨw9%cүsC*E*Dx.LGf"=Qna0Tn7LsN H pzS$Z>3%K7Њmۛ[O ?U T`ږEpi\7qq%gfXq4GA۩ ڊ0_Ğލ{$/2w %}Tn5.nC[ڟ`'t\J=^Ú[LVv)ė,2ݽO+ DXQ*(ª=f#V^W?jQEEZs~IhI2om;6玹@᯴}wIq ڢ+]zJ 8n$k?AK[jVQ|+H1'ҿ#<4km?:qjgpx1TE_Q\قȓFw?58H\?^1*D#.2Pk[;be'1@[-  *{WN3XRG'$"}i|%`q5I\s?5R(/'f_ܛ[)$@ sđQ}i8_=LFNti4 sz&|G3,U&3q±KamIu#Ocv7. htr(u>q{a Ԭ Æ_*-,yTp{؟J~Eo>̠{}-֢܂4'&/_!<4-#[SIy?|0cKd3gU|( 0JJEuun,oK}?z3F򽔿ܹ_x2od,7uomjSbEC:/҈RE_QjS22O jVV AdxjqzM=1SkI>pxI}7jp}2bNA?!G|]$և02-: N"|'>LՋX <pޠ4hnʴsB2O>K^t 8o$"=D #l* @y Tkdx_!m[4(X1u3iٚ9Tzp{u4n}bC~h{{ ,QAem0DI5PM|e+9qLЏv˨NnB`r}ui"$ +ׯƂZI @"BFI'I9Qw8b{8ojx^|ġ>ѽ*I=Q7;Mz {_J=_:(uT#=`<) S?g?_گeb?E@iYsէוMO-v ⡟F?8)Ԣ(QEV^!sWIW|7r3"HzaƳ h.biYE+H1$t6 J#J~Dun+ #)1+ ԳEPȶ7GEZ}͑Bڈ)]- QA55g1PM@1S@lR4*_h)j!0 #RC- Q]K^ B+vŽM:m-%e,#RGV==*+CnIH{pfE%kOZk/Ī;Gϝuz,˱r0ǎ@\JRgX\ɓ]3U5#c)/7T;? o7V-}=r梟ǹWz@Z}!ekE]#էוWH(D5isLi;i^QQV~'qO-m&,U#NBԵdh2g.Eƹv=m??Y|eq1jh ctA``<'bҒΡᘣ' qfRi"]Bzs&G4#;ݧ''V%NxW`TU6c9韺I[yHQ|ˏ` KG]C;*&QPӞ4kc Re2йI43U$V/6q*GƗJVԇf9P}&?y껶Uio.̟V/wb/KZ~".X$2\}ٟ,Oxt^cS^_昫y_69(@w8 ,QE֍S?0o'vm?:ԬAGZFF^!sWIB@:YZ`-IQSlNO7 g/ [ZՉ[rM\gаAGOe?;aUS%8"ifcFY; E-4<  eM$_]hgy?l}-inSڂwwfU?(?vi~s/|j2 A5&vO UNQOp=r1R g-=>{lvK]8%o^nz 3+Ʋ\NN۹ne`,OH?1#9DBs@>q۷j,ϻ @/4J͸1>#V<\j䏮LUi4ؼƚՍr^!ߏ>RE{$s-,Rr/Odt(~~|fO ?;W1Ƕ(NU ttRJmpzoFAG#_,@/T=Hwogq~4o /?JpH`S'n5qY]C+V(tYe<FAZ˟F?8*o#`֯-l/rjjCQE0<),V11y).fU2?Zݤ*a#ޖ+]A|Lf3*w3~m޵ FBqHIҿ#<4km?:-LIX5G_t_i֥N+&rXǏå7tyBrzzSQ@]&ӠV;c&;ztDb U,Т[\w%NFpAv&im_|$O ȵz[ 9ыFʃQ~{;#s€Z!γsE5}|I>4gA*+~?#Fo|83nkj[whHznh";tʮɣQw*r@aոfWUe]۬ do:MO5[Y$aϩRϾ3@vn\j3h8\KϨܺwD"*0o kj0Q+G^oc#E9Y/ᓓ횊%#GoE{6IпkbV#:3`2Ɩ'PgչBp%v5^l!-&1 L{n=U!(aK~qHk}|czܧ;?J/W?"jQvDoaQ'Ϯ[;yjb]= J#J~DuLҿ#<5YzYP }&Ծ[71Z/\Џ +\_=f =  6+ҭu9A$g9?AOmm ^T sK>榥n涑 ڹ!8, O}嘝NwS;h{{ƀQPDXQ*(P0_T Vd8iuQ#}22;bܒ )}Յ[4$5 (UP0WD-!X(bAPi1NXv]7c=jZ)vg,7 mq#I LAy wS"l0ÃM;\uAq$g!c7)깑rɧʖ.[ rTG>ߡ)vU H?ڼNhDdQҠ{95^Z0ƇvAvOe{؁YȎ%}O S"Cu2|EX=-0}>ܵ1}GoaZn7Ԙ|q9(j"+P͍O֝E2n̿ ȫה?_*(F?8(r6 >[&)|?YxS}vRl3p*Kw:‘jzcV270eOt$d?ʕ6j@ uBG#)4uf唥F<$C'z^5$E/7}3£hKi12@?vy>܎gQt!$I:+iThʸP3ɑZJ&UF$t:ۿ0xŃ#,?wZI'Ȼ&2rz!U.FU87UT,9n Kd{[Cq,ӏ?k@3zw0e@8{;a@'Idл1/G@8*> $\\\6\`ޣ)oK1 ?A۩PV!XuG<{GV#l.ɋ''bP-;ˏM|GTwm?:ԬMNzݫ%'9=?m!;Zb5`7=^G\xkRRBgln& ^Vg;ky'jY3U$U{ 9??{}GmC >%$L.*[ga<ycԖO{QL KӕJE_:3 l,jLon.NJW^ÐbNڢΏ-'l:ه˨5j_[j)-ʣԯQyY]+V)!u@ʮX`85?Zy\pVe#V^W?5((:+ͳUMD{}T)nCT]c\~[BK:Jiuk/J_֥e_?5E_QjV^ J#7v~s &@8#;V[}̞\%a}:{z@5mOVF}&`̋x^T`Uu5u9VJ@`ATbNrMyE."j|GV8G%^?]:WzHE!ۿB'<E!ۿBЧyơj!UVCTLRU/eu)?xFMь(vf~Stnt=?E6[?jQЯy.Fk(TP@:)RHp[kwEa$3}v,9̒9?8O_*(F?8(GyC 'O+ XZT񬛀xN~giYa`Fe"@_ʖXdPB3~TI%]B,W?2&R|L$w#?CڥEKd‰G$/Lʟ<(O ^Hn#Pt=vevccFe,v~QO41\BLXdhqm ^\r3+VE[VDM@##DvĪ=M;Z׉D OMk-Q+A9HT13 3 ܼ`K3nar \CwwsťOG'?CF #ğyAvH3#򢎊3s$k$vݦav~| R$-6Dr%~/'A`2~zR]wfB:s>ɷ 3gM," ec:{_42-ѴѐYG*:0SlQя9 RtctobB'??jk)oCq٢@' ׬AGZ2O jV^!sWIW ik, XԶS=J+T7RK~[bY}x+B[g&#j*O Gz?5nQWHb$DEPTvzH3RS (Q~{$U꣬ޯw}X`~ب|HES$+>M<<O+<{T4e.R7G,ľғ*=k.$u520Xt jC&Q@6LqhnaBnJ#j|9jKm.IJWwiW?Ē~ ` m^8Lg)l=:&+tvOY2@-YcMV2vڳA'ǥ/[qVՂ:߆ln#L?:(3zx?-)Unv%j@Oȡ^P`l6Aw[qVWNo[l463PI? IƥRPPIl 6rNIb$2 }C{n2@?rzd~:.-M)*,g|đ3]oo G@l 鋋s P6b(w):md|ƝgJ[C t?rh ?zx?-+Nڰ<ϳٗǧܧoYGEi@H<7*4r%JH@#_ZFZw Z2*٢2[PdaSGܧ v u6:(3zx?-)v;P݌n͸=>j@QmH(UP 8i㕩EfoYGEQmTc ;$P%ƣwq2w +zq̎i"ބS u?QmG[qVZ(3zx?-)d2rqrԢ2[J{6?:(3zx?-)Z4; f\d=j@EoHo-氙 21$Oj(0O5uK$m+/2T¬>a"{{. ؀kV޳: n??玣ۏ" ?zx?-+NMn(8EUWM|?:|Kxm`px4g]BNq[qPgpwoN3W|TAzЪUB @ZB}i;Y1)CݛȮ)g*BٍjЬ+B:~@ J#J~Dunk

iv])U{mv?܉z[gY"H~D hϰ;;\t@O#V^W?xkE]#էו5* +ڤ6?*`p=A槪V#7iTs"e(!P[\}c~? _!ngѯHlES$(* ;>̹݅ЌjzǓKEz]JrQL?j#IZ4ln{5+q|1/߅OovqU)m.gm?:ԬAGZ2O [7{)ݏ>7VpqVL _js˻dM"TXXpO)TxQxڡݚ,{"4 ٹN׸^GUn'pQu2)7lS;FcEV8w,H29n$" nd6О98\cp#eET_nFpyJƧ'piKRǕ IDy4m=H=v9a$/q e$.YʒsǷ8?mYQFQO=d4 5 ciQJ?S]'I _?E6Whۧj˼hލĢ4 _יt(u8, t?j[QU}c6y2cuo~cEYbhR8n9$I7llb$Hdw0|`Iߡ,F,jwoݒyעa .<,9;b ?Zy\pUbQhbHfNq=ijCƥQL(+B:~V݄pok־b2sgo{@m?:ԬAGZV'O `M\z0P(+O;V(-25"^PjC ȫה?FAyl.^-G09S*z(vwE{+uldJJ:=X  r??kBTGLɟu,ȓ/ dQ@Q9"Gb֥gkm:Xք"1 T-6"@Ih_Ⱥ|,U}ϱ=61(1[P{օ5"cB`;S 2E_QjV^ J#Jb2O >h-ǺUdznY/u x2<5bgEԅ!}ǶF=Qfg{Hg)c<3۠8[yvv+\#*(scנ%x(᷏syv<2OIEI=ěbYv?  w3IA~7/glz~4[I )jx*^6TE?LZ[##20ôRxէוY_ZW1RLdm#QyQA"+V Aմwpe8eaЃ(2j~~:[%?ɸo|ݧ]Hd6{VA *y}&*e 0AQ|/Qhki1%ԯhSVaE v4ڽ'I +]փ_nGK y"gm`/`=Oz+Xij/I=';)d2m Tk2Oeje;qПAImݮHQg>J{tɽ@=T77PELFp,{$ d?]3G{E/nd0=vO\m*k.i4L׶JGf/_t_i֥2L/G\'WIt&n1gbwo;T:j,:VPAxjmKEcn[;xsXReG#퓶uaDgޒh "EcOpC.*xzu = ڋO[-3'\C#}sڑ{]0וXvG3幖yFV/`;Ab:;'Q12Lמ@48H+ ywyX$=(comGR+ugG&??4 })w1{K1Qq?٣="l c&Ki#Ek..?%F4[r|?]LT {u'1MZxrg4GR))QH㼏?$cHc-h#|dCte)K?YGцZkG_*>_3n#$SG=<`H~s#5~k)νꧧ>p;=S<=pJ!7?4m.=uD~k5è- X~ >[Ye{Kbnyt}l j%%7 cڣF?8*{'7v- Y$Ba08aǣ ঈfjQE<@Oz޳i#[I+3 :]fi_ojw?f09f~_=jvS[yBϟLaBH˖ /{ؓfO O(\YCr3p1TE_QjP4أϪgל}hˉ9V ^ܡnA19qj{kn*1YkZ;KG28tOc@]=-ݳBĮpUת00RӦPaU H =Z]HҵUA*0/؂Y7. G'%=+<6es&<"Y1>-Zk '-R͞MǠ+ 4I>pNB>]tTB0 7BY˳quo r=Ck1ƣ ko{Ÿ#~ti_j"I;GԹQ E*P\_JpFD1 =Oe䊎y.Ѷ2O@r9ְE˜9f>I4 ZQYOƗ&ݿs) QasTyIՋ{XR[MEBrovekE]#էוWH(D5isLFNHVx.# ϕ2chI ՔT6ߚW+2[9OuN}}Ԗ/"8ϓ'U={%?g]x#W;S-˞5u@=bc(}$6;¹ee;D8doP#!V*Jʣ /ѿ?yW$\#Yؐgn}Z+K {o<7dP4;#2)d9RG*qΣ9G9S%Iuz$: Yenv%9XZ\%qO!ÃTn$Msgu,L@mqs FYX8=O`=OTﳶ?ָ>7OD3\t9#GE@=Ӻƅ݂$@]-ᵈEas$>楪?qj$=ΛM)h_-E!~DuY4zL/m2'"?@k ҿ#<54f?vV$oj+B:~NHtg?rO$I?뻳ʆ#u>غ2\rTz;OMe@v4A7 m$[K]>5,;{lPYЪi jWJYxɏBt7_2v,EOsOHԭm`H=K}Rk՝1ٍ? M@ybӢkn!NOhzi~52jP?a_=i-.%S,_hxSsV0;<Loy K9"XmQ%#omِ`炣oI]yeGD< (UdIc2㷽+- mlT?iuٔLV=sJ{Ic"Ezq .&Q=sFS"tМ/>E>A Af^-$[o"6Cق!F;/#,5Hѡn>MVH\TwmhkӤPcU=~@G]]jcyn?f?Hbo,T1E%ؾn^z5 Kyp$ZQow#-_J֝Gܺ~?B?Rੵ/?ʃ17gO+ hj5(dQ@e_?{ ʹgnuYܥִ.Yܹx1G)f?M:/҈RE_QjPEPEP-N'6iI>l`ulu_jf65G~Dw+_ Yv8_ sM4>m"@}jy;mif#V6BI, ;?ԳX?x[CQ\Lұ ncXB~UY<Жb{UX0g.?\S!'Wcc5=U7wvQE (25"^PjC ȫה? J*F1Zg l@;*oUrk+[ żR2eAǵ_OȊ Zk?o9Ijeh_.uH#dBXw]ǔzfS)'^_r?[R_Z ]y0ve+v?g?εby|E7[BjK| o}a?T&x7ZZaMJL=E~y,a?vKYꂉ~}ru o#K E~i&J_?5-BSY @#hجyx۸i[ʮXΣLUVCKy mcP!vvq>ӯK 68T1>GzY;i^QQoß."?6?P ˞Zl\`Jj˗f$cRQTer`n4ɗk?^&xe{:5͆@Zcsg}j];o[ME~j*:[d3.,AF?{'ɏ?L߻b#[[8o}6)"ozB8S|jOP/eYТ榡\hsZM1Ʉ~9WzZ7e~E{džW)էוWJO#V^W?ЦR(fW' ?3O~$;k|ݳvqPe_?Ԭ+B:~@ J#J~Du@Q@UKg<2"SՏz#[nARGT܊5`-<-\R 32̓tP;('&o]s0OHWd uu'Ak`}ƪ~@_ij#R]~XMg m,j2ͧ"M#A[٩IH8Z!5m J-ABFA?1Fm:@S>~e_wGgX-2zX|ȡ'Vjլp*vʿ>l}WEdY :}Gq2cL,E (25"^PjC ȫה? J*K+*@2#Oyngm|p"_VR9|-A?R}_61s(_.8E `0As{ՑH7;}zD?ev[B* m6بY]G,.eB2Snj~&&n^I,4M?"1;, R=Ţl~;zzRi[뜪9p&VP@+߾zsE_锚}-$LRSeQAMl2}Yr#rܬ5+1Ɋ_3DZas_i~ڬ ŞpqRXP@:#qm\C{(P(exݎLrH HƐ6fݪC-nGr?;ڑVG*?(MGu/H ŷF_UbznȎṌI*J6gY1DD>S 6~Է(lR" C@TlrE2,/Ob1`IFٱL#ӡfr⸅eE6r 6Hٟjc%`R}WI呣x\$R[HNďMEr?=bO>>c<{F'drjZh\+w9.Dp~U*Pr#fcq 죮$0EouՎi%Dz>Ez^CnaHӴ皀znUJy?共mcEKSBke0B}yޙe2-֩)r(>(Ÿw ,~{B^OT_Ak?=-b\љ~P >f۹Il})Ф:\|vFW8?F [?XOK?Zy\pTڇ&$;d}jC"OEsR(A:9@,b3M7ʼz f(Q$y@Ai9v+#S [ i|>qo @guY -޴.Y~ܹh(śe_?5E_Q_ygHżU+~9P~Du@Ӄ(bg3R<6M#G).'}b6cCxϠy}kf9U?h` e$[soXY3seo1㵏V#.h)hcdY'@?ID_h)i IO L2eUc@=ʇ_;l5'||Џ7M~oErIigʆK&֭寺uC|3 $oսwVsFGJd=5EQ`xIܣ}jԮ譶2) (&U70JB^`1.Q`)P ~WH(D5isGU?Q?Zy\pP#RQ U$* ȭwi8ezg-ۉ A[)/ovrz>qŗ[^XǏ@¬CiƤ~W;.Xb B%v`I4 wx-"!LI=w?̐ -K] =av LKqHʾ;MO,/44RǰGm"Cww`e@w'lV"<_Pþ$*f ۅ+q8) }{r{bP DVJ<9u=;} { B(Oc69U q@]D>QȪ-oxs+=zpqK-=">թbx)Q^7YXdG+K$0 z[șamn=>EY-ó1ls{ZnЯky ڷHt87d>{UueY4W>I{*(odUUV8UW)oON zAGZ:/҈R&^!sWIcGf%_ ߧNq흫x¬_-W߼x0\rT{*=m\_@}'p6bnIۆ; m ^,Khr:{E70AYbI#ZrR/H7#pv ӟTU',#vפd_CSm d'~7q=1C,z۹"B/0=GЃ&5\u%b>V&Ў >4%*=/ސK >Uǜl0O`ƚ #7HvH_ƀ}YYwMVfʶ 5uM-UV ☯Kq&<6Au<yfy_v6DW|ŧȊ+Zw\zdpIv#7Oi ,!\}k'ma K 55XG4ȣ2p;!HP6.Ӭݔ `MFiu)6۴2gkr #AAGmsC p~ڮU+d.u!GCǸ>}]M wS"l0 A4wG4M92PjJb3#YC[-q#{ֽem?:ԠF^!sWI,?.$ۅ\o?wN=ZM`pN'=*_l̘ =@ʏf2񬛈d&Kswd:cif]g;HO+c$wέ`/g xdpi ^G-i<|'v_LN0=t(C~[̷|%u9s/`r=&۳ۓ+9Ǣn=\rHiqpORq{רuK|^#\z#ҋkoY#0ޓ6Wp@$ٱ➖2mf3߼~l'm_'گ4L?}?9ö+ 0bx0%ElLNgMe;*wm7Pۏi,ǗʑӓNyiO|{"^@>ɧ&x_*G~}Vv %#)gE3ےN:-^!B!?#w9X.Y&LQq}3=qqQmcM˧7$:v]m!'пr'ҟD(ѲOg/_Ӯs !g* 8B_`h,=1ጟǜԓ4l麔vmoBQ}05isVaHKG.<=էו4D5(dxK} j-3 D>ҿ(یº YQNqn%WGGeH (+B:~ZG\xh~DuK1:/҈AgbWq}sdDp'=?JiycS:Ub98#cԞ; B@H{yo) J:u+x縸K+`m豌_ԓƤ@TI=j`0L "-C ?CZIa%R@zcvХT(` n Zl5ڠïow~$e`M8Gh+ݑ?8@tc9q$ ՏR jIIBHңy V'7lov-ɪcy?0 }*j(+$Q!'76;rj bYWkCw;`Thۂ=y@݌ ȫה?_*(F?8(UZ1i܈CNzgu>՚f$瘭s~oaIՖ--!V-s؜>)Qhe=d?(?Ez\Z;]F^)QEGHNHDD>U꣤Ǔr>W"R(&|ZtaW n6D@==4[tz<"AGZ:/҈R&^!sWI!̺sh'1 fnb=3xjݭ_B"6anv0= &Tv"KY υ?vtCAżd\3Uw`؁,;Œ #R3֣[y^s-8Y}[ߡ{a\ı0#i%ʓuL߳\Ǒ?FB "L[QЏPz5[/EbUO y ov@ Ǡ<7d{fyuq"NbwaYvn ?=R.o5 v,[ ( Mu1#V'*k5^{!Q'E/T2Ot{%O[6DD˸ Re5-9O/n3NIk[*I1H~qZ`4X;S+g#Gp)0 m&љ1f1cZ[ekˠî@r"O~ H-\I$Tb}X} 086$ߧd;g >MAziէוYU'8GV>?u"O#V^W?"eQE2NokF_`"aml02bQT_h_ӿ?G4/ EĿb5[EQUCdп *h_ӿ?•Kl\zfSL*QG kQhQ? sB.9NT v{L r)63$Vw#tO wP#ERHTTьzsB.9NT A,eY[,z}ORMRF?8)п *OiiKyJ/ *GmܹEP ((BV[+;i|#kﳀ?jW%,~>Y$#\C;bK; zvmy3G;N5=2RxEV|FyXif<Y]i:YC+۳ZH;U;fjĻԵ1 }2V!5c{ui؈HXyR^=fy3NP!9As `t\uf 3N}<Ҷ3PI?&WcVӵSw}ZܛBH諸ǃQoY-# ,*dec Dqj_?]vk]i4}*qyvn7\d|KgBٷqcV˽ԵV}220_Vjǟ;N5r;(Z(id=˟ՍO@cm羙`˽ ~0Q,}MXif} ˫\+6[pQݴVP\mƯ9Fq@wwRֆ_ٖ#.﷾0S[u߭[X@g ~~@;ӿ=i/BZIyuupS, Džzh{%,+ YbdWIA۞\Kͫx{S$5FTJΒ$Y=:[@u+*>ͳ8ݵI{t~@;ԚGIhSpcw/eHU~ʰ&1$`e7؜ t~@;yu-j{SX9R/h>PKip\m 9;N4y3ZtP%\uK17حFc{񦉣xö [Sh>><=>^vk KKZ4KxVU|}ǟ;N5r; 9"h?:3>Όp2>h{kypܝ2S$qɽQU]KN۝:/63+HPt׼bH lqU(# |>o [AKN۝:/63+HTĐA1.P30(QEjvsE`5зfL)V g ?*Ӫ:twVA1A=G4hwZ'ũm/ugLu 5$yx\.-赏WEᙴI48w%lP7u1w:gk 44:/^X$n8c1ҹG4v(( BQ/t KtdZG?bK,#*A'#-Ķ:K|ې]O`8\9 UKDRP8*敤h|vevlq ܞM]( endstream endobj 382 0 obj << /Length 1513 /Filter /FlateDecode >> stream xZ[o6~ϯl,bDRaa˰n`p%1K ;I_?^Ρ$qf@?0s΅tp9H4>:9-LK>_ `JA VJ5>ߌpRoߙQ"~^ݺ2͟cj^/v{yܺ6p5~mf׳]mk3g ]:"Fg ,`%Hj~zumijѧS(N,YfR/,Q R'YTLgq(! ϿS=8[W^{ne LeeO:Xq{3MtMs(vYĶ'8(ÝވcdfxލB(5@$3A0[lS jE)Qtx61R28'mu6Ll޸<,*@U !2ȝ(`~7RʋuF"gI>{sId^\7i{nc&l%UWMU}`6åC-l"y S,rdWsH5 %b$zLǽ?y+Kh(^YR[~j*k36U+-bd?RzB-f&h%H*ogsǝhTM#E B z2%9iMB~̩|0H?;qS9e7=>o E8bw H^u"ͪ)5ѵLuITa(bd_"87mF"sQ6PFJQSbצ8jiG,%8Ī]\H"F3T wŅ*;2'T+얡KۋLJ^4mou({rJY8o ݓ6CC=4CC=4ԗPp=4C:Η{}}-_iw~oDFo0ڳ@lɌ st`iQ"yA-`o@Zć˶ 9d<͊an%۹A%)`F5YZ G6Cщy@'4tinrrsxNw-L>81*| > c RSvA .aXI-5rZ9[ )@F>%-t qamYEP |"H5F(wi†Uq!LC[V]uθoX1@O!fVYbRZk`j됾;'5(𗄦L$)) l][mrDEUT&V &~_F~Nf_ X($lY &b;@?j2G_ tjX?Xa4>t8חg74C4 J8I endstream endobj 391 0 obj << /Length 2982 /Filter /FlateDecode >> stream xڭ]o#~>DF#v ]rE/W}a-?PKr$+˯pfdkCrg8W|jfJ^jvy=5N]f?Uw˿~יJY-\$B͇ oYiO8O:w?='iοmXc{qWzZ -L#58ܺUw_d0axBI #i~:o=ހB؞#QSj7\8^'TҢ]_X{`vB/'d9e}"{6UɚI|dl.l$Ӻc]LLрk~̠WU5M0qjqjaBE~c}TYn7CsEeg >d=K2's!#>豠$*l>T'j'rM Y$9~R2*{LVUKB,.ƀMO}r>o v1 s @u6"V=s~_J/X| PsDeb5K%$֤"'4Sk c+`\:g!^e3lk=BZYc`4{!UѽlQ"LT ua.][rV6 j&Oօx{s3gApT I";Zoc~@m7~~[eGIo3{Kq* 3Nt YUAY2]k:ČjJET%^9GӸUޜ9Ȯ-$5- ڥK)S|8̉c4l|++ .AU;._9/_$j}Z l&n%ŭEۻSnnӈ.+ܶi!CYm^i÷ ȳe%]Y"8V8)uz]Uk9kU)kl%50Ų]$S! ^lb]>Keg+|(.Iƨtuc>P6XTvLItҍeOZZ]&CA~LBs%*fyp-%Vҿ]oS5RPU )ٓ+yn^'RSf0?]& -iF4Jd8.Un`RɩiGL*~֐Qaoٰի脩[/uA?J?Z_7[֌]Sc)pr1W'lwA ]+>`̨*q~K4?U2 ݕ%[7pX C2kb1㞿Rjct{.N}Rͩ(Z vcnYh3܊#44 {ԋw=~g <"/ |Ots( +r[9\pXI'B~X:'mB {⪇1wq3n>ж# !dˑu9"Q7Q|: >n dQ&w@K2]MXкV $xOd\:H kmJ:v6NB! |J)鞘)=<'gBovz$] C?N*jO$~ϨOeusI"T~}+jyŎX[937UO0ӢJNmxG\e^JeZ][N8 ."g[KdWBlf 9A LAłĖ9e!+O9Pes(~pBPLDé6[ܾڒ[8]>9d6 W endstream endobj 395 0 obj << /Length 1338 /Filter /FlateDecode >> stream xn7JhfuH!-6){j{%[6lI8ח#qLɒa>@ψ|>4&~>DъCJFjY)eu:be^5֜ѐխ;sGWv],W{ḃL ݑX!ws(dFa۵LrOpl3#l-7Q<}Jl'M# &0!V5nۀkڋZAkߍ].bK i5T-O)o0Sj< 9 F$i,>,$b)kaFW5S 1@ ]Cϼjɸ`nq7̃p֮=cJyIZAg`ZmTp.wB6SWcL3m_D7k\mh@.&KfU̖o$ٴ41zOVbdmVF֑\(/V#`2܋^gEC;;]r#Tf>w`]r>5eLkÂH&B8B(̀EQ ;kvYD5} |Hhd)lMN%;eM.-' k"=z6ڜxM=ɛ"LF٠iI23vT m/ebu"n ՞AbB> stream xZo߿@kDCq=82,g?חEd:q7CnO7\nVY7vV3|X7Y>7?n溶(M*0Ay[]u [ꉁ/4_g52բ,@ \5opja_5%^՛&k-)ԳuY]U'`.H*72\^ g2|fFKF g]4/)C9lrp#p ]\xJ]n2%gP[F :Fy@GjZ :ʨMeDP%粬Jl|)Va)A ; lUT4J}-)^YVSL,gy"Vތ:cBuR$B񯅢'$A* ?r¬yͷ( '/԰Ryߟ iEh`ܻ Ry4_#_9n]D~mmt"aa1C+UJj6М/_MꢘԺDQnh7K]XʿJ RjW6<:R_"EX;{"mTJR^2u_Rpm1VG82GVu4.g]wq.k"*qt2QQ.)fe)R\V' sQO.hPUAlcG%tht=u$;4}GJ+jNי38gV;^u 1*rɗϣFl,Cẃ&}FCIIm%ػWX|x|lDuC˳Q(>cSewf/GS d $ ^maPVE?D9EkF{@Z2"ܘzXg/5dZ2p|&bƺA>d8JR+*y:AV_S |ޯq݊Xl]$kv9lhHTTO0|0{"l 3X $uE bSpvG2`Ai?&L/fYhr`QL `@n{jx=@j_9_8 j͋Iޫ C`3j6/V35>dȼ U**3y5SUhUbC9G \1*h\͋:kv+Y{d" UU5K% 1 &)vV Mf*MaGᨺ;Ð:+:Jw 9p moBAJ;=?t{V;{ Gѯt߲r=znʩ';=HX`xm@xOS ,c攜jw1˸Pγ6ab@=n^Ӽ'QF '1=pnh8yE G2"=MZ~)n$ڑTmM5SVM: ;z- { nܽHgQJS1b{ Gr;QbpndŁ gڼ,Bk&GQN I9 1#r1D:.[j ]@{wgHm?$)yGpHBKt|gJE-? =uy'z `q~w"}'g\u4^ۂNYvBAحTx$1uI8mN+ƾ*c+vAa?͌"GcG=U%*@A!9ѦJ-|ث:U}Wv3mdR9\grȰirx-H*\ǟ<nՉ>e8G:ڈ||}x:zȩlb6‹G;٘󫷣C˾aA+Q$O(zy3B-m巭@UO=^UY?>E)*^EtI } Mַ<=+3k^pwΝ[PUDD)wp%i15ОҨ$GF3wAON.mn2(G yƛ:ʱ3ԇ#KO[Ggex; > ɯ5XjM-niQ/N=~7>Ѯ4.Rmd@]I+"kxY1O 0B-097O9dѸ-[i.HoN5S}0M/FeIWB| endstream endobj 408 0 obj << /Length 2402 /Filter /FlateDecode >> stream xێ۸=_XuWHѝ"E2EBc˗-y%y&幑,Of/"h$~H,}o7/^^gj 5YOd%_Df5轝+l{z mSW a?""50:usUVָLFoP0[?{ؿ*>pW `tk|uW@, E"Jugm);d XMdz{;{K#PZb_XrJ ? (Mqq MaLL Jc/ũܣ=X[ HvA*0$,0 $l;ןl`aY4"jN-MQ~Wb;Į ,UzD.kIČklf-qsP$Я#w<0kz=h$aGy^+?Y. `tύ\~])3EVz ( ^ ]yȔОC!JD1hy̋x$q=pY̅8h4ԙ[kL ] KIRvB#k#Yޗ!MͩY 4}׉GAU*G/Z1.\8 tiYLTG@EO0P0H,;hNAj-] N&;̕gKo LkA,Y0`ݲ[TOXHtF\ )LyBp\y}$e}Zb_1jG! Y,˚>dEP]Ȏ!!J $-MzC+%^]#RՓʄij*Nوz`/sA5; 5ls\4kpjƦSҴ!d5fQLNU$tHItFwS}I֞,M!$%^ô>_=X9Xl#hA. a09%Iͱp.&νIfn\,͎'l[oKZ:I 3[$RȠ^̃$ ͓oĆ)ق[3heWD,c!|&ٷLGg \-5CrQ~Hhg7LIIK~K%%LAo6$';4,i?28ƿkn˱ i(jI䞮Žg긛4D`U`19;&(i>1چ??MS/?өs_'G=89ر5'RՃ=%G1Uǧ=`ZUsdj%#sNtuCis8yV|-(ni\_>xPnx戝D/.{\&&^-:||Wmf)$ ; <#@nz]__^TI\Kr?2zD/9> stream xڽnF]_A@$i@4[Vޝr)юr0d.wg>)e gL)\2_ $rE:TjvE}((͍E@/2,]j [-!H "<ű[?@ah`Y^5i w\lGb"T}>v!K9ɣdAH Idr"@ƒ22>s#Uvc3F<0k5I,rߐX*ԠL8]7 Y-hnqӛbC;o+FixmnyfxIphԭZB :جi K6vֲQ4ˀ/Mx#*,l_WDFf;2%JhY:/y҃D+J}|zEIktFM[B#i=v(>.!Nfd8?Ũ w/gN"rJ |ǩdiX=3"OY3}ةt|#k4]W[t:3g_!2"|"/mUN~yH1dKCL:DZ|h!NWC~.aQ|)IΚBViA{`*4k,Mh%֗6Ύv8PT6*衄 Հk'Q$oPcђ"]2 z_1o*y whaJLScGT远웣;#3t.z@]~xKuBp-'qCA wo`W}]=Rϼ{rP^I~`/=[m^8Vٻ}~vtlf6mGۖ7tJc/DcuXa^NcۚoX~(YZ$PQ5}<ʌuh꺱%\Sy4RnΫldda2F nyR4,C0+] @ KLw". V `+=^Q}UX3FnnOCeNyEb4Y-`#&9ǡK0+aE bMm$ Qit2I8CЃqھ@]&\%zzu,[T21%pJFBpBdS0;Bp7WGCg"&ۃ 4i#3{%wf{Łviītф)_8S-}x @X8m48S [sz'ztA(o7[&4&;;ẃS\2N͹ S/#ZS}J]# 5ǭ{ 8kZ.]5y&HxQ<s2;fV|12`)߱DL9d@I3S!&‘}Ksqg 0coqTAƦl2. endstream endobj 411 0 obj << /Type /XObject /Subtype /Image /Width 342 /Height 240 /BitsPerComponent 8 /Length 13908 /ColorSpace /DeviceRGB /Filter /DCTDecode >> stream JFIF<<C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222V" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (#hVH]Ϡ&[?{V,C q_'ʹXa:Ql5hDW$adeI}s w6mRTؑb?N A^h Lm}AL rm;Ow+| d 뒟O%Cq_>zM!Mpw3 hTO&m[jzӪAqZiaY cP{:P>/_6FHuo&]nS ev1aL Lm}AL rm;Ow+| d [i?dRi⸎l]S<ۦc!aN3L, y,Ԃ'i lùn[EP-R=y4~8̓@'JӮ.KCqq| 7(BW/PxiwzΒl/њE244J2;Uׄno, /f}{v<,hd>[Xrx qxז@YtQ]yf"20ٷ¸ݻk6k٥m|3ccw+soV@ez4 e&89jNzVfkOŔQ,OIr2GPy@>4+ K9/-*&FYGː9f^[/g%Eutf vӡ;Cq}yLn)kF/ Z`6ity_2պoEQEdUlKNb }yXf$cճ<0쀰8 J4}Hk r%&ʑ`dg W>='Havx H A?[(_D;/ݱg QoBO#+^k33z-{WS2 px:VQEs>%?& iʙȎ-ysGSIMIbey 6^e`A zQEsI&幏L.~m$YXF 'w ,W.Pn#+nGhwV_:C$K&ݻG dncހ/QEQEUmN.ZٯuT0g=)lE1<)qJ@:kk}uQ]9'޾fs=qNpUoLS~颋ߑS?a$I7yn8#+.Oyg1)x8 Vb]N?a-iEo1* Etw=Ϡ-o!6a9Əo­WV^1R ˾B-f ~W^@w8?mƫ'^G tE3" *xeLjKuo]I=).W~'dR|Ky3jxH_d~0vcGϷ^[Y[R_kLKk$>E,.q¨*>'[&)tEȩv ͨߋ_3R\lF#ĺ(t&|ѡKTG^}O5.ԩ̓O4hyGekx.n/a wf4|}~j(H$HMĒ*傪O*­y :4aE!Ғ:cnߺhqT?Z.M7Q"Ȓm1Z2=TVɫsw714%H2r]0HjW:AA(eD_pF|4qC+?3~m\cz~.USIN:Y]v=[\YBSwڦ1mnjxnjxZ_4)?ͧ: =මLb8ۈ1ժ{mRNP>#ԥ9.!68g?w l@QE`j{_p4qa9'ϷP'TVΓ\x.8"آ)L\?s!kF v!F0T>NzGϵv4WG.Ts]$Td"YC)3.qy8 T){H>̑f ,ΡpX`98uTZ=CMY<= 8Kh]払6nj6[na;kH88O2u1Enw*CGuj/Zں:6P TW6,ޫ(K2HKը4EfRtH/N_3Q)?P\kh NuBP?/V"2+?_&~S}Y/0)_}/ _&_&.}7u mG?/S}n`>r5QG]?dTZXV)? U, ,{1Oƽ]:~gJ~{f=KP\?]HVE A^:/ XgY*-yXn*E\U mB!)Y[8~jkʵo ğuIӊqv1Sԕ͏M/i|7G&ڗn?1Z~[C?6Կ照USYMm[[; yRTڋ#,Xc;RuZ j|aK NQ&3&L rw} ؎ |Y!LifA^rq<ߊVٖ-nPyLڴ99)g1^J[= ~E||OiryB o-˂sd6hDdm[8ϵq_nhZERC%wJqR> P]1*dwJxE[_O[Ggk.6Y<E/Ĺ!}rCO=+M2X%҉#Ra-8$nA?Zq C-"Hi7ǷzT¹E׶Qÿ_m> ]ݩh*Dz ֔>+9 ^qlQG}EGAMt6x^v'8jۏO廎b *#k+Rf8mXUXHp2XZȚxz|ڢx|9Qǫ[%ٛ#jSZ;f4j׿QEnyEPEx YdӞ%ve9L 6 uW%-}A5o,6mg%A.@[?{h`klt>vҪn\d@4O /_sA֧)kđ8e?7_sη)>L4cVeO11L%`ʣq?S[HBs[pgV§>ur4ؾ)TxʞejP 1;Q0Ah- 1b]Aϧ ָI#U.nE4ʌrr' Kr@IuE6qI#$V̒q+&ݘ[ٚDN|Mzn @'ZKm>A~ t>+.(`G)ВtEecӫʵo ğU*տ3}_FeD2$`0VPtI:*x^y8 s*g$֍\kHZBw9ǽZ;ud\!\)5ez9-dGz$r+mi?xTu_G8#V+mϘϡ֪yP$w*Gjێc%ڟ}*=zƒ7H䞵n H!Cڳq`}˴ʭ59Jʲ z+@6 Q"'#g8e;bJJ]Iz~.6|х@+<򦡪Li&kf6k0 #&[^hdE *!XBU{>h!Xu瑁DaeFO1O>r:cex,u[>kX!B<)J6}vjZU'FU? B0v)r_k]8#FOu>,km-&Vg|^P2z-i&HcYe€ώ=RP^!sWIQIG\xiDη˥P jדZxP`WA68k{A@=*jC2mNF~5# 00OJ(5^iA裚 WmT.MQeܽGⲥIn u+^JYɪ>j_;FbX5AlRHD2Zn@j$Aq[yڢrB+ZgWskHcPٮt:<"+ 2?QK )δ_Cb/jV|IZ[C7'k2"cLEWzMu ϢWT=1#B#Zr 9oZ0n xrITg-8H7k]LӳDc8ǭ\(jqޤXqCNFcY8rqV! NZ e*DAW'u.KҴc 3D-9az;Hy$zצWHV_+/+(@+<;\m).a3FD>_* {Vou5_Q$G*ci;X cqƫx OgOlU8\J")@"w{hW}OnJ}mxZ$6Qj嘟jC nsڵshʑ@jksMkaT(AS7g7tu֮G57-aԕ/ AbO+RQvWj?#^^Uf$Ѝwf_GLEWzEPdb^ L0GKHW)n8D[O;%T9#WR=Q*Bzc]Yz&Lj7E4xF@Ƶ["sHH0*¨Q0*)TTR'aRe+UYl5qQPOR<sS(Wc+/QEzǞb݆bRF RW b$.+3~RϨm"+{gn);vl98A?K,>lc%e޻00ʂ99>3.{bb,Đ #(EuxVkԇNB]s-ygofK,n±!a$y<`tvf 7m۟SJ_nSAz^l~y[,Vk*—.ƽN&(=((C)5rXahv2gz9.w/^$E=֫5'8ecX[w=p*0d pHzƥSlnWBNAtzs+|RP]Owg r>ݿZ|"FX`}ۆ8{^WWǍzyV!B5ٙ|1yV!B5ԋ}$k2bp*P=#kɳ=[QE`LR3ROA@4{qMV~ۏ47~vO .a-gt9(WtF$S1k=MQVbU9&~:oбfgrmsRMd{qW:Ƌ,G踹1: 213^^Y_Ř}QEzQEQ\.K4xmy{Y.#T [,EtV{QwB`%'v ۅ Aҿ#<5gTlZG\xjΦ3N?oѕqn5`Fq tJ?1zR)uԫfTd r2*&֭UMSAk*×*0b8Y +:);gՁ( zwLNPG֐1ޘI'&Nwv+#Qګժ)gߊF@SAAБA!n& ϽOA X( ˀjt+kW@G@=@5 [#'gVW7ƵY5D7IZqJ뺆zz#˾9"9Eyz2 KJ\FM]E؁}g2d:$w[F* <\j&~W(/1Z6PQ *2@ÏQWRUe@jjFXRS`:Uy(OzHY&TZIZCN£$@ƚ5x5iWׂڣ^^[fe~QEXQEQEQES&'w#pFqOI0أa8hz ~?o/?;Pvv{Qj^rF _U4}^/ ϻ-"?]ǏK?y@G[>G܅.?!rGrO7q}JK* 0gQwQ_p9I ʛZEK-瑋1y=VB23~c|?3TχF*PwR$I+L@(b}^~Fj^QvU3GtP0,?/"/WkRApOoj;}n+-D*B^d-i{ _ʾ?g$O6*CUK?/6jBIی_qOU]`xݕ|@??ڗR:{ʾ+MFu[E?ImwIY2Kۏ_U57uoi{ _ʾ_h_i- 84:,hZV#=aSj^QvaKWگ? 5Gvy?y@G[ږRl=Ŭ,9 Qv4?_p{zfy?h1vV&U'?((((*+,x1W =I< cOӭMq\^7oBҢM,bpwhݞԑxZscrr@yQ˿,S~A]v;Zuf.n,/@wf7L{}[@f="$[Rdr@% '֝Q\pxiK݌-n={Ukֺ[ ťuePoX䩌 }FjZ$݌ժ(]R[ E6V/WG6+d"Hٶs.F# n~l7n5Vo^[jRK,0/sY*8>Kc;@*UYڅ} jk]Xh&וn%[őWM5I-_'AfMm1ULCp+*TsyErOG6k4SHZBci(nz*Yw>K.q#>? *CXOi,>β]ܟ™Fp2qQ@ًtͳE.q"?jprxWdPYkeqr7q rS ;5oqfN>ht.[v6vj*Vb-F~L苷6TPEPEPEPEPEPEPxZc{$/2"VύTrN3Ch~zErHVLJ.R[N*(ť%,Yݘ1K1'jPXNjQj74Q `Iı Vői|+G峁)'9t] Hcv8D (8rrMj@Q@NjQj74Q `Iı R1duGy'tyo_(JlcvJdc8Nkjt4Q!8\2X@nnNI5EQEVv-][h-\V2 zh~?Kh`+{tCl r1-8< cM宗|QMq&D)J[0`N608((3^c״g-ŲR]%N@!Ք©]RbKNy/oP瓞ǏÖGR\5_)fd̃+PY 9n-JFI*rgvEs~SA )av X)y~Z:زK3'dn\d(((((((((((((('[$Q!wc*Iz> stream xڥZ[o~_!b8{>n6qE@iK*Jqp(ћ!˙sE$\{LLQi&w†iN48-&?SToೝ-kz^su /bv}NLSOM?#ެ uJ,{ܾBi㲃S4G\E}I}>%q&1l^E,Idae<7׳/a, *oGG ~ܼ!CdIPW,~ 0@k[iGrҠ=dc|D3/Íw ~z9ƑDuA4))\0ݮuN1MoH긿rjEnv{ՂΔfΜAj%q77rg^;rP7c9a]"VeQ/TkRzZ_R,Wqn 3H :ň&LBGYs摓j)wOu&+N_3qG>x%=t4[\wF,k|\{.5܅8lj}+ݑ:p3 4Kc3>`ᘂ̆)ơ5ɨҾ-Qk.ggR{DݳAn$}V8 8>qSkYl/<"eޒ$s)%?el=/, 6"tuN*~-o+O䏷Nw ib,. Wd quqPy =1Ȫ(~1 b)R lc.[,K"2=oj/};SK FsZ170f+ihJVydfEfe2 5w"Xg\/J&&]^2DJ>߅hh~jDZkx/WZaPƞ3E]F82 uURmȡҢ1';?[8Grx N: 7d!til+k ~G%A|;WzU%L{p*A 9#]k{f?F=zkT_Rs 4=bs~Ht۱1SO$=v+ȬuR˪B')u״ka#^-3l"e$=)ryqHwAN^sXE3[z%]@$6wb0 Á\3遈 8x焑`ZTtxINrfxS F:̅Q,?q]n ϊu1ވ}Z1ӥ{)ɰpj CV"@<(,[j,O𕗴͇E.? &a7c 5a-'& $TH@h%EqoSPt v \bIA};EaPBb83V)8h?^ otpdg%(EA#ӡ$j̗=b <_D]BO:o4Pez t~-GYa@őT{ 4\Б"6[OjOqɒd:3i?8k؈$a{ ȅna0D6ւz1 l>?5feX,m5ScSf]R0Pn,k 0Kf)d'y5w!mT ϻX}QzI: }AsC aG 8lmC] Q-ur*㱠`T^D# 1D\p=hi,d|#:jux`@@[$&56)Eߤ*U0[[#|‡ Pf;nNâ;2^n=˝Gh+Ɠ|\!Hׇ "}P>W<+sn#klfP/UtgZNgR "Thߖ]`U~tL (kfj0m6lknh$=CAk.Ej^hvS7R9 9"N9$)=AW|$Wz.r:JSӕ9F3&Ƞz~7PZ>I޿ij` .)2?o+e}a4\ݣX*%ݞ7Du~C;G-8H[ْ%0l )ݏ$%$wQvHL$*D-1.Im. (WKg;Y:v!v.ιq9J2x)RA]cFomԖEQo=}!7ި۹P|40iѐlp+Y %Gs 6x?8 G5 ,-V!K(zn+>V+Τ!n^kb5cJq8v"}Q&I4UI4ϥt)%I5KX_=ͫz0aWSM#2.Ti^ofYӱ1DAʼnӘ% (MmId?|S?aJoл YcȜ S_K\]Cyo(3`hg;Y$PQf5~dRb(,5,bUFސUHE|YK'Zj0L=NJbTvr#aa o"u4{_ip`ƕ-,]OC(3EgpDow RʴGAi' m|ǗŔeu) Y?GWz^[ Tbn}~xh# W1ŧG54.&.*r.=us'?ozptwT0Dwhcѱ,<96KY~/ {_{ endstream endobj 311 0 obj << /Type /ObjStm /N 100 /First 901 /Length 2505 /Filter /FlateDecode >> stream xZn}WCzo/H6,-J% śHQluϰLUuթR39C>%Iвzb hh).ɐlQKI/$?abXB^_2BS[ \"FDE/ NVN@N>fX $&Ģc 2V3| &DƓDX! AEzGŝp]/avB}^'F'rJP A>:B":o9$՝$}~tZX+%}cLHY f@& |.tp&U$3@CdrRC9*sp !SXd Y@Pg#QB1xGO*> i/D+ BclaU j j.–DZ+0=.A{I7S.dP}]mWQ3Tgףu3R?9Tw^z_bP}/擈X5qH5ژ-RqɉLs1[?܏槟^ђB6`I6B P3N+ Bl\x bm)qV+zz=m3:2Fmna>yD'>- P'P|-6ƌ4X+a+8LwFG"B܎؈<;t!v v v v  PhS5KB,y!> j~RO H>h]G+{I4' }KV7C!Y^ނ}{4-m> /'52}`\1ԧ{e%kmУE7N"KH]VF C=g% kèekM5T~Y<ׯz5W=*_z$[:s<\?HM\( 2hӨ'd࢟'macuXukok v[p(Brm3R/˼%]-[+ mu9tDM]9'w I6'!uG2F8T: \bT ,cmصE zql"QBOMhu"GIŇq,7cjqODO.g졍EY.l⟴vML҇׽Y/Z^q[Z> stream xZ[o6~_P1+D>$d:z:gXlAMǍc3i:BR"ɢ( 샭 )<;߹P =x7gTi!.ryWI9or%`t~(ryw6oy'\dZ=1_~8C%e%ޛəobW_U]H))Fڊ!]YJ8^8YqZTkF$O.WY2s޷duhQl$-/Fsyim JZXi´JߒZ/- 7}˟`%N5שЩ>I<:[OwR.Kbf EalZY2oiq4 Q5i{?ctE#  >rS2痍u0ֆ9FW |ݔחsٶP+f9#]_igXμzuP/ӞڃՃMłf#PgxꂶTvL.w[ڒF(]Q\}>&(Y,Y`Uq( Tsyd*ꚏ%]#̫%"ĸ49fp<ɚx_*߷WD͗d4oxgQZ-p"dD3&/@ \` bzP9umWKGx?ķN~H|=BhP_=\3?-3? kE zR4:F-z^51 u޸G()Jdv4ɆyњTI"/!h1{ {_eDvǖDJeBl`x5` 'M4f qJ'V1/as9Lڏ|ǏzO6" 8w O8UM6rRXR=yZ|]$W#dq$@IUKb0nM^ H{!\d3$Y\_nʅ`v(Y<^4K abC$ChYőJnB^}p #?%!"5s.mW pb+?,GN iF9^28qS]h. uZ1 5 K!;7,٠Y\Ꞛ%MqӚG:?[րLv5@dG LNNc'G~0hHW{T@ #-c$@, K`A!sD\7Q2Bw$J"#1,UK?ѣ99Z;v2N':Ƨ YflȚUHEHI<_Db-"/?@;HmINগVÿOϧ{Lb NjZ1_B}\6m& O-};!)%e ;NaArVdJ Jcl_dfՠAA `Cfb9#LK_AoO:wucp^>rݣ&cVh|Z}x}T2k:=S TXQ8QS?AyF>pHYԿmoωy ,:f})[ާ(P}c?il/3 D";qyqC&-06i28r'Spo,LC Jfq]q<¦v)c 9I+)zDDw\[V_ RE"}Γ %/濄SrXǝ'jh.Iz* [jCc^cyGf7)kCNv &hأxQaZIԣHd'R7;#S h&ο%V@Ԣ(oZ)Q}}ٸ`oGm%Û hGlE[1ʧ>gwڛWp4pf8RI,A/*w2[>=8̋jgy ~|(?-$.kW%S(E)ӋWi} endstream endobj 446 0 obj << /Length 3770 /Filter /FlateDecode >> stream xZYs~ׯ@YT k@mYRRKaXZ>}H9T*ggIA28}v|ūL TI׃\.weqab2[vrs-#ct4FVÖE[Gmf*{m 65:NT}(WƄSKg}r-tl`⯆!*rRnld`|_y/A,@|dz<¹8ѹ Z D Op׷{d%^Nmω6CB]Nx@#;:isJrJeQqNJow46@T/6^!G LDy] !.E[(6%nˣS|A<#:ҠES͜NM ;fM,o*grA~Xr3~'xΠ]k M-4llz0{%T_R_%sAȣBecv ܜ`,r5X7eCusi@ |Yj@#='K}wSVd*Vhrh4mɍoUZM(igUMVً8WEKi+@Y JYm`\o%&ZkiuF߭E>zg]6bg$N&zk4P΂. Hm)2 )br5n*I%x—PY0"&" , E*&]!pM "oxcd )p)([TFk i) o_Jo~s%P{le{p:c-ׯ+ j,<,cET Ӵ> 6}I-:yܔjMILfʭ~x`Nf SLTbO~{מbO͉P(xV}-*邲L>92qe&Vִ@l1`(p~IZm{S^Y24N]``,ymk0Ϸyb Z8qMʫo9C ՟W8{Õ\ vX1"X"'hVo/pƦ幬@Z弖 `ZТ/] GSџu  v8(B`]t`s]Rv 6yĎ\@|8侼qBC5~4c6\= 7&, '@f{j2>m5v807"5-A( rٯoePDf n M[RSVڑKCtQą.Z(&?31#u0m9{DG6;fi}~WՀ,5n܈̶ugBٹ83L,`jYP~=b_xZJ[)?7ʕ[0O~4 zgob9JcSE?`\\TxC2I^%lM1fSgPRCOPŸ.ehjGbWw8?<-:JGױ:E) j_7Y aJ C\4(ˍA]t(eHr:Lxt%U&Ukrd"~{4.Z |WAw|RyiyEBzk4t{XH!mn";obJqd e}EYZʧ)1Ja5;>pip*pa)5cjv{: (2HܤM9O~I%;RxxQz**B00BM/Ǯ4=;ڠC$m7^XC;Ä rL%I$YaQ "BXB^41~lVq<Ġ:exTD -% O*7y\ŲY.&ko}GׯtF95e#X!e~lU'S0:|%M7i=izbp6:7Jq/k2I;f]u߫] @%Yi +׼oxD;lpJ]HE[{mzI /LƢn#:)bExV>{3h2i7V!gcJ xܟH\. .8sjT\j6yzh0!{0؃n'ɬZG~{[dsi}"QKcIx̷p>@qin>ڧr9 kՊE$i?>O@tf%ޭ%m,oIJղ=R`]S<fwQL h9a84J/ҭo*n>f.@bϑR-"k:#^*1/i>x`(}!r;`Ft9 : $o98_ʭ.RR}q*TH'G-]HtCw0K;xC,u9V1XI%bO!?'-ml~7BͩH!hQ>'| .&kpZC$Ps< ?zX^hIu{pw-_XA5,=1>Sy$DX%^1cj0ܶ(c}amfU[JT{z)ס}"\ o~,V|tr\nS;`t(1KjZhk:jv#{X%[Z> stream xڵZIsܺWLĩFN ɒvi{@K4hF5 őTfz(<;8XڑEWrt~5rrTRTڎ/Geq)4JULl,zq K4s|fLNZ_'s2:EVwxΎpqgUD))rOPU+^U®#xBeӮ9[:ZeillU|` ѹ0$bnM{.;AY"ixWUEe.B zT*Ȃ6*~ډA&0G)n&8va}2"[.yEP\eZޑ tElV,-" -&PEg墾ʸhm'R2a~y>-4aYO デ %wE6M! I1NNѪyܠȊW3QSV#2eF[_0~p>M "5}vd\>= \x=]3Y ̌/ۿoH{\M;WGnkVl:Lus1 '3^7Ay*b ˯HZ(#{pv[bJQ0zósJ4> nQNx#s]b)DeKfC0Se{|눆@Ɨ EQ}uU/.P$HG| xk腚 &ߕ7%}}HHG%GO/3B%B+Fsր'O2U5ĀxΠa@0`8E+`vPdnPy(R>2Oh6$dg$ .Cj_:0 ,W5? WSMIn2FWq$&,c1E6|rxU 4`^zХ>FeCKszI?I"/ѩkZÂKٷT*u-E] U+m,ra2ND_R9kSGgG(ro0'K[sejV݉.u~1GʑW-)S2?KZ11qu\ -Fn`,PAt1a Y' !H3t{'A3wl/WPtk$y?ptNR'vjz!O[} }bV;mFW$ċK ]loei=9M-s H0 &"%'4/:1t4 OF \c454p%mmM PPELvL:)m'l}oe*q6nZk/jVT[ay!kPVi+0H,Ui =/Nwse7M. m:pS҉褽g+HȁB{SRUAI !**WNzr0~)Y gUk^}e609T'iA0$WE;G[?ae} {}̪[h'*&?aq&f!xc^!8~Ssin}Hcg@I} =j>Җ-EMG[%SQ`ɖa.{z}Rm}V?l iW 4V?zb8 7%h;=m+QDz ˴uu~NQ|۞e!TV´m5C$/ħvM.ύEP9>s €2t ^2 rP#x\HE]WAfהGeYsA{ T%D]fV^%lR"9o4y*6͍OuD?QG iӅ 3YTɫ_-)Ũ ~ 9-QS/U Wk"1q3;)dZUo!.0eF!?&"lUHz|=;RtΌ+-\q!4) G7<眐O3u3 A9<?ߙ!7MRH$#//771Mciʐ-xKOPNo6lsQp%ir6jsQ/C=} K+9)ٯVUYdWg+b ] ) ^f YW* ڹs u2ǍYcpgQ$^|!Juݴ F_~tzmpjMy9*L P轙6J;<*^#qt쿒/ endstream endobj 461 0 obj << /Length 422 /Filter /FlateDecode >> stream xڕR=o06vS[ hVD@R5ξb8ǹwY5lܻI{Q"b+ab"Dؓw+oQ,Jkx^rů|a\[R^ۦ8>"tvhUM.qK}ӔheX {M䨱mf䪫 6N'2mB\IDԓ$,aFă˘#2kQȸa_d>*X"\&EiaU bUK#WBdlo(qoށBXkt Y :óJd[.PHըܗ4}@zN;A,nL)x+$k0 a}Ӏ9D bpin7d8מf#,Cw~ endstream endobj 425 0 obj << /Type /ObjStm /N 100 /First 897 /Length 3594 /Filter /FlateDecode >> stream x[[o\~ׯ8C~ ܠS# dhk"m%Ү*q}3WZIZCC\>r3n. < eH1YP+޽M)$ J3QM]GEWJdKbt4ba)`+dwj΃sQ: #K- + epQ)4kź"Hx`-[Sb|k{Nc|p7aqCdA|`E@^,0x"JIEPSLOz.@Bds%ɰRe?`xΕ#l#!JmN!SxEYB|<č1SIiAH1!fnc%r#*{%40l 6Vlm-V.+! 㐬 |Xq\'̵bEr٠)]aȑzs=CETP 쪨`D_v:/`8lzn0]3v)dP4J I8ИbZMyA.ޓ'{0{aGfGrZ[,ԯ/4cꙻҬ8aAz}ajf]ogst͞C{B|L<[:fT5Jޏl`_JtXk;qG=>iO+k ٳ\6of_;= Tb1ccA2i q1/sϳO _O//>͞?v|wß!%MqL  <(ba)ٳ2EF1ҕ#|1E}yvpy|pj͎SoʘK'swCg s 77PcHESz ^H(= l]Ň7E?f1iL5f4ShS c@^DX'ʀDha(d΍n H#4Z8RDDk)"cdO?mm.b4:F)(&`]A{zz*z@T \p aH <<!O!7hgz*`ms=M.uGw|qqz6=x?泳x9}WCs? Ύ>BIg>ÚkkCj7j5PNF^W? HcOO._?9Axǟ,ǧ|>&X"@U ǬӋqQl2{gew[QE r>á1V;[ˊr{:"ơt[?U{ik0S VJu׆wK;l+oOzm)IJ{ْ@ԊlE3fši&) tj+=keѺ1Rut(܆uJWņ(Ol}9q1Qˆ#m~; qᅫ%-yI7^-u4揿?h~et7Z7PILGJ-Q3r,,QW[qwY1lz1uX+/!K՚l]oFhTSխjas;u(#_I-cQ~"u$-Wp>&9 'n{7{6nPiR1ܪԷ[[1k -_\P2dxA2l\z؇ʧ/K~R[2zŕcfGIb1pL;qvV+\iKn4zeܬoJ7Wމ;lmODUM=Ki+ &IUz4FmJ)aJu5UKG|حNIyKXgQ(RR@A-;!u\y H pFZ˶"pq(eR>4o I{*NU"9H2@<'Fg kѩ$?&b,dNe-z(W"-tZ W]jǾ*.:VS !T*?lvO@ŭymTh"{X %xϟA$42׹Nlqʟ~+e$ezrIyҀ"QD<]SV(t jSNAŭQY;:JWX﷖WZ bc3n{/v3|ŪlEBX?wbo@>eK6X (3(,aڡQ>ٍ6E:zuT9_8'`+>_1YЍl#ZlI4ih䝄i栺LݞcKxz %Gm@܋ -u@5~ZICjDљixȶ@cb,R.4Iu=ٻIx %$fh5 ﴭ,o/p^A.W=Ujߧ)%_Q(}\1wQE1JD QE|tͳ,)8Uqm2q$}s*5\-zS^u {Mxk@muW<4콦V /GH__߫ lBÄPt2;$F[%[-ќ޽I(oRP6kqȋpC۳.JQWπqFhk ФuKe}V rqD/,J4rgo)[JLuFQ0i嚴XEIUZ&%ʱ7Ge.IgW\=dwzM<ɢyu>ѴH^؎5fpbCmV[^V5i LmnǰUwNwYNzǚ['PeUxBW n I3._ZmoGu 5 endstream endobj 488 0 obj << /Length1 1853 /Length2 11681 /Length3 0 /Length 12820 /Filter /FlateDecode >> stream xڍP\րBwwwָ6nA %_߫{}CsYɉU腍m 6 L<Q9f&+ 9o1:`nk/Q]&fn'gkv09x9y,LL1 ͍r i[=TFfnnN?@ @ h bkdttT|fv<...  Sj:@9 7U9@/xXm=l {r,@h_tp{Og##[k;7sS !H01ϕ$]с6Ƣ@G?'fo_'kicb7QPJow?2S#]fS/;[;{@/s3rzy[ 067rMm.2wh33t?ϗQSIX^FuxsYؙL977?)U40{q(ecb O#C P:LLF_O}G pSMGm`mn{+;9p_/FY އC꿛h a 4V4w42sm\5zf&{7#TߧS1v, ߉>@?`cx/ `b <9"? `b%N&? `cC1e(7Q`TcClF (F?v_ ` ߓIMlٙߊX^տ})l2}m%/|2U{"? zCNya@#9[#@*a<q/6G ?A C(+T7BKD/GMuCZ<(O-LbO ӫ |Th&϶wBREwt+] UCt>R-Bǯh<06 #= ͧsWٛۙOYoD1p^ǑZ,QWUY:qp n>NQx'Jc{Fgr}\ %C⭈ ,O@#r1JYM((ja<ȋ%M*If<jӶuvu2"?HO\!@IR+X4y\}zYrBS'o`(zkv-~Hu:=B)g NG0 gl,JI }M{Bכo~&aUD4C*ӳ֖`p{3vҵDeư z /Bap;r鋭I +9oanvZXGo3,/@,R|Qk >/Ȥ({G<̱ y7M?/b2{ di`h ׇ3'~x`EڐdӰxq EXϨ9L% IjU%eZD{w+#Vg56.1 I*pWaSi@q&=1֓"e)Wh^1]iRh9娬P9G M p׹yIg(Ꜳj-fUVI}f;Pme#TZ I‚|fB^5'vP>n cN;7Kou&qs q @\t Ct9)l͆>ﺋX"]T;eaU\o'iX[5c>yOˤ+i)mx̺IsbO l)N\(IK|P>45ŽBC}-O@y:w SDG0##fLsv/}LYԥPr/-<$+!b'cpDV%=k`p:{R}^Sure8߮Gƈ/6͙I)kPE1i ~~!..тFYda1$ގM?]j7pdKn=|F 6(=5??ꭑ!kbbMlu,().N8/'{uI:ꀎ1܅J zM$'c 4MVgC7K⯾70(ή,{K>ɽѪcR+ "Ҩ1B'4VgSQ K|?/: U|;II f hnFM Q=ô5t`iCJ Xy4f)ROn|6ӕ$ppkCj-]W3XDV#Vy':dRB }XEQ:=Ow~# .L`Lӌ NWp!z"M7tn-K>h̀eeZ.BUmf>ԍW-Bk{>{᫪ݨ% l@i'c;d&ҿx-+%C!lu[e]ҞTɄ7.嗸:xcLLzT8ha4ð;Pr/}Mmf۲X Çs-+ط&{ܸntj1).J R?ҫd)؟~N'y0]<MXRdR[ >9WQPTO!=Y>oT1L>p78>̌ ecAX%Asu\,-wEL-ܕ.=c(9 #]9Vazf@˂RyS/a<7$f= ܨNbZ=IVxlCX*&[Yͽ*Bbm3盬:b$3pH-( {0\ElH8\񿺵k,*z Ylzq)K+#Uh.9}Q_,- ' Ή%0Vt\p$c]b \WreS0L5>}7EEES"qԉ/F{N<v)KCb) IX;)5\ĝC'"7|=Hh1 F#.[; E|W>H(Ỹ8_C.By$(^n+suK^ÓI ɍjU\jLPE`vJUUQ Uw#!U5 9B;/rwpU&?̜ 2vUP9 CjXrQ:5ꗿ~=Iď B>T19A2w82b֝*nQ}"0ߖzgXw9:Q#xg>7@tC#%&k ?%|,7qU+yI Fil qPPHUxz[R:~@H6Y(㌪7A{D*; =q"!qSѽ$S]ocKJ$V>ATYO$uޏb"3 xcfy\w(ݬ݅ک b# KwhNöoO`#+b4qS {rjwVuvU]*b4öM^z䡣qShVBD#udȫJ (sB/ PċAϕRJȘffHI腢|:q 7U nZҬd܅< /nYnn G܆UxY3Eҷ]&R8c5GLUV>'O_sE);:Mf9LֶJhU2uğÉ|gW 4#z,~f;g|I=@ʠybI(C BCI8zᔵv$nZj诤DAuwKfJhϸӚbڍ+xT &ƄpYFE0WLtQP /gFfBdEOnIon[/4CEmaDչ e"xgC¾ꓘ9c+ Vp)هSo%rSX1cَx+LGKLY z$AߧU!5iW4 UV,<:= `so?iw_c%DǪ_4*!#`=C!3\"pE-oCDێq`Gc!K*:v̨m_.2/V ۳ YަOJ.t'"R{VӞa3%F22նi.nbE2e:D}XJ`-NGR@>oQ=' Zڼ¡q"BZ!y3-OPO<|v_udnr ^|&q_x8)ԱӮY}osįEVSeE 3BV\\pA$kTg0.19;Ep%zEv1HcKG2t}ዻTn.t2jc[5My|LˀќIx"iM1F DֆM. Mu "kE뚜{U2,ah`A34Ke^Y\Fz!t^J@sEF@HF#Y0^Gk6B h~P!αz_aRҥ6Ӱf:dCi>~u}4Svi0orkrۈ*̧MДٝ3 >P(\cCHbٞ*.\]fig4P ٥̴wh*o'ܽdb!L>`sBiT4}1bq҉u?^0'H0Цg~֠)_;n?+cPt*x.#5ݗ7qdJ(B1u;}f(ə`"O!d}ÒC\Xɰ!LbiTm#JgvB>1 [E2$Ik 1dYxD4 zi/;f:4=FvEHhb# VW7vPsAh8ud۟t!}0("5i4b3g۠Zam/?S?&Ӹ*g"%|P01M^HR,۪]Եb Nn>tetOMrunɬ+=#iJw%BPC7Q_ $gKmq&Ӣ^;Tyaھ=SpL1F ?qUoԴ~ŗGo7D`>ZaWۍx轌 ({SJKQ5x°=03 DMp Yz.V5w!cFHˡ40? #Nf^c ',Kv%r;1>kNyKZ&*̆16pJe)Wc3k@ XWUHvG]1Q/ۧIطLi'*Tn>34ԅF 5rʼnͩ'ݳVV +b97kW.Hu'd6eoa苌_ڵjU^9S09ژM,^5"w$r_AOȵ`  {-ҭz T|(S0Ff4fV_dp20ӺO;CDz Չ?[2-nWz=*-);N6s>inx+Wˮ!x=Q;y,=6GnTF 7qasci/M6ZOO/o%ƿr+4 y\A~li)IWKaSGHX5B`"e;]i“z;~Lj}G# ͉^r/( SqCs}{AǒsݶC*p~=[\kNԎH=Zki ٷQI Lg>wcLb1 Qn1Ofr>jg}V{mRZ:[| e_! 1fc^XO+( ( MA2$<]䨂MMV!=zn⹊gn¼Y2mU񕐩s8&Wޖavh8QsSys-DŽJp}oF 2 ,X+osA>{n<`hVauWg-"sh(B;Tarɟ~2l٪kF.N}3iaDXڬ?eEKn5@Bđdg1x!e(' 0@Ow}[UBh=znOg vDfShddbO#`2(b]qgl/Dg OЏ9GBceGk;rHa/ A@)1$KҬ& @nѯI.xԐ(gga^+/:CV!)]&jm' x '`[ݔxU\#z6HlJ 4bs+hac2!F4dZ4ho0bm͊^qtcnͣ)8 J+.QIq˾uD.f0J.eH斏ݿVr0=lxV`:EF6DڪF`!, +Do0ĚCsdbz>V9v~"«lQ~HZ N-8sݽɟ=m =ijmL ;JzRڬ_xq,@.؟:+  B}plOS˚hU±(%?tH&=:5N3^wF㒱ȉpT11J ó q` utѺf%y(5%tjĚ~۶2`bQ$dBSzi5} Q7< eͺ$_wթmq[bS>C$P(19@NuT`^PJ^E\"Z '*0H&?]a1R^ ʴ0=\_ ARV@Ip|kb(ϵj4dKޠnVv8_X\ImkGCεDT'Sːl)>tMo}Bld>>[{ I@q<[ M9ZDv)%̏o*r{RX)/ EI'aukMy.ĸ8Uӝť'7ML.aCH:F7q*[~^vԘ!չI*X=pZu8-є!#>EC4MxO,UćV@lu53GALK4ΒSpk&VIxYwLu"UJ"N|2Or*'i -m ׆!' C=jDn,xg&PahcSZ 9H|)t{Joqo]#bͪG^m<;{]ԃ} 2(jiԥSZ-'2RH:jewͼp)ݸͲ~M{d^ok)7rƌA`FkMe ed' ln?s[\~ ^$bv,~؆unDzHnzn yָ6+CFzGYgQܷjs7pmp UIq\5;XmQ^['QIsS,Dse7,5ڭ. j#Ww Uq߻5Tx>ь> "p%[GA?cD|(J'0*Ttp KCrefFK- 8hEYMqcr?`\ ?4"=ǫ\- RceoC]+ƶ9̍|2-xbkK]oYC<6WT́ȮT'3#ȔC҂p ^"kt 6<8qvVs!Cu GǻCBhڹ+M\dd [J'L[ıTETc8!+e&;3P^0`%7 !tpU"~7]_hXhR}P0!-bGw`LhZw]J'EkC]F+؏15"_T/Rڙk1uwYIyz> v+ +\ڏQJ/2y$y 柖3$j] m[P^ O#QT'dٯ~xWl?$G}مk@ dS$/~)$++gmwx(5fŔZS%qr&ĦL|Zt#c,𧃳I_ ë?8 mfalHRRT҉FJ.J{t9q<y ,L.H =Zu%pQ7 i%w=R31lV֦clt>ccbEُA_n(*@ٙK9VŖ.rЕ'Y5 fն_<. O%Y^2g`R.p0dhޜd\xuSdY[>krD4lz=sXp{12<"2+u\AJ D}AVg͂F!-H`oԠ WJxB$sʈL7^F_Q̠pg+\OU-fhך(z<}v?ɉ$($X+t9}3DZnShESBv8뗐por?>c{0ls{Sp^Vz0UI:ctϴ =B8wII[|āincI)&Id^U-b+t)IG6 ::`3\a +>6&=ckF< E\I7: z3MzA@xcZ҂`<*Hm U 퍁Ce7F\P@Ou;s߶}u}Z?Ը endstream endobj 490 0 obj << /Length1 1889 /Length2 13404 /Length3 0 /Length 14580 /Filter /FlateDecode >> stream xڍP!;nݭ]܂Cp w afϞ[uNQz|=BM$f` v01$uX̬H`-r$j- _ U& *:\ml6n~6~VV;++ @79@ `rAppt[ZA^@gF`a fr@5`A<' savpg!V5 d2@ h35@   lf {WW{s35;@@dc0jpyl3h XmAeif7htmH b v0mG6KٛK8ف!.H' vݓ;{Y-aȢivr}Upp@N 4<A*rvtpX-@]n o"$669 0Y*Yg}]?6?n?EW[][A_V;xL\66nNeTE`o_A7>t+/G#ߊ]mmGzeϮPtxk A;ؚ_B-mn#E2WC̬Dkp[=Hǃ`bce?כ3y}T\^g zRRc;:Wf{=Rsǟ `aw^,(7Eџ7,Z#>  `1F1_ -yjv _!8,VCW VV?2k}_o_Wfbҽ:;>U+k%.U*׫ kGՍ+gпZ-_ ruW?Hfί쟧e  iqL ĺ>VȝiwRhzW;{ѹ >sкXhʶݵٓq[#DՎGxxCSb $L{>ON>Z6oڠs\yTod<˗wUj˿1hF|3͚#0 0`]xʙz!{Q䭷{7ZCHEG@k|[ E8z]h!'"nd)d aN^O9I(3@',VlJ @CKրJ]*cXM9ZjE {$QOЁ6KsrG?iGz#%ˏ8#6jrIIۄzڨKLcKso&7}!vk**OEݟFjqq1oOC؟9y~0~`G;K[gñs!քўV79!'A}rZ.zuy RA6dNw7 {pߢεP2QO.݈e4?ϙd{90 Q!tWYb :YmdLXUЇ9Q~$=ՓWw-%_!@1ìw\5[넠 xzq &O2pEHWPuJ 6 oFKs$-'CQt'f9 ie"g d+ա(˓R\ `Ɋ-|.‡ 0r!w#KKkܳ?34}0!V|kȇ+} w[f4z&%3e9_jQ\eAũx .{ߦ57 0BcǁT)l𬇈<@)#LG|kLʯvk_7|^f4N +tJL^9eݱ+w}Tnŏ,W/Mmzk*K,bE(?R> 鳄ًd[;;M%AfTWAc/-"407T ?@Zm%g5 3x̲TZdKN}T$Pkb T=BV95æmI1t2wq{ \d7tW6&,#06tX q6i5hC[su~G7e_qͨ{pȗ\}ӆ7sð']&1CoiTi#h"iy10S z$>\Ɋ%\ A _jлINk'%c;.-'ş} }s3EۊMź"|0Ҩx)DFuޠs/ģ  4y6ξ (lc6>ⰙcVKWO㮘 ,JmT3l:Rnجq`̊N7c]6 ΋oyiۅ7xdsr;Lb;i1ڷ6Ȍ˔OEdEy;6edK ;.PQc|£ھO‰RΌq^` e7YX|"z=쎯GL- =~;/[gKg{7L#teb̓1UǸ)w"w"ܙ>.:?Yv ג3sHk~ &{$B;U>N΅v{^zɬuSl M:wkt&QmO^oY^3hhzw ˞2m+>K3s&,-)PMfʠeY?-#ȉC"RP#gx4wH,]5[st Eٷrjh2-tJqĭxwCj^-[ s![k֎ î5w%/!Z~lSހtŲڮ*%[X`$؍(a2\U 侅 xAsY],FRjN5v+Ra0r8\xs`9K[>hGAI/k 4?w`7:j<69}ZT_{B,49b U.C#,;>Y;Sh鴊(*X`>h[i /al6nw)O'LjC Š4QW٭UdWߔdJ8h$8$McCynG,ҋG^|] <H99-&\rόmwH4xP [{FK2*Ml;2 wDAP`$-!ۛ!+8ŽKv޷2{S _ɾds[w(u2B 9-D 7+}kXPȂ`G'(LOж{m ԗ3其3sғQn Gs1$WgqRg,kUy-̷Eu_S>idWT#0Qg'Ƥ`?D-NF'k#61\>[} iA^K ~аCy :" rj42pFCs{_>W ӑ_w \L(oĢʀVfӲmkrXQ=Ԡg/y/Ok|d:fY*E v9pGIfI SQn7>Ԉk nAAR!7֢*>67x'a. :O?䋭K/ y{D?q4Xg} NQd #lЯ3⸡0 \"|d̪Ta/?ikGEp$E7V"Bwwcߠ]#pXmgn`J &x"̞ $Rϧ~R500n17o)GnR\o˜$7Gt:ßȦeP9d‡Bި&$S~%S{jYA MMO(%odLCY=Y~<Ƈl /?mq;|Hn_>)r "C+4~d)۝ob X 4qv!U/NUZ(#e}PfA8bcrCЀe$`Q'J;aSy- q"䦮Dɖnv1+\\g!G;*'nSRrZ|vE0'ΟМac@''F΂W+y(3%'-5koww>h lg r߈`ZBaFSjɔc*(p]/BM+]F2Bs[ )9Iմ}o'9ޅ {wodLtc6dP"#K š>Z *,ss6gK{ddI:(]8D!ܬ`m"ʙmW'8Ka)NF\ iRk ?\7*{?[~MS[h<oCpfiϴ]$^/`å.J)OPIwe6K`yl֐"{b^QOOUc1)lE؜z;#&gv[doN3Wˍ䄉FDʥG/5,cSBQĘg юDEIA)'аU25|[$nr'4:/# ۏ'οOT`hU$ܫ6"kzE9(t6așB7!u~8S@ 1٩ ,8T" dCmgL06Y~ZJRj׻ R Ie?}'RA0)s|~0WaSnt~xAȹ%!.X1b\VIHg>EyvIFQ]Vtks3!*:džc#/cUt}EM< TyoYC3nd+* |\ꣾWXJSM.TR6ȾM[-2*"b5adj<%+ߠfj#ӷYߋN6i*i \G.;*<(m8md|3=#{,o9( J 4׷ #ûO,qq|WM?821xSoܭwG"A)㌖0)l  @9}N׬uLTE3K2DsP/:m+QI&Y+ٻKghbp$k# N g]fl0$RK͂PW;ϾapazYHzĹF&>UƹjpX.]!boõJGJ_fɷ 9"3Aw$~iKpfcN *g7k]Zn3yOR3DUI> 潶|%CK㾮&qDN헖\{xpswГUxPբc1".`?_8AZ}mIk[lckJw-WTHwk}h -H$]ﺊHpi(=WVRV=nZ+W2EU\o\{NZn%z y<h`jX8-_`jXt2ľ^EqE\m((H׊8;KdN'ҢŪNKb٧t^UhQax?zcŢ Or^/'(];Sthgp <ȨogQŒR _rwcFRU=+& Y'wT_;s.'$4^=|޵l&.bXm;`d1Koku}jtrzI;LG:ɹaK<Z/= k}ԷX*yJܢ:~/׆دAJI렺==07apba'|sXJbu:tE Rpq[j2Ҫeꁥ4j:@am$_F-CROiW"[PaX7ό4ы9R3sdM?!fKԐFu0]%׵[yU>4k\ 12>_Xz]y|.U,ۓO^2;a3)k=Fk;DX_8tDG!uISh{V Od0sy foQc hGg)} DhԬamHgJqe]"uY#[L sdBUYS$ 0}dHо{&ۖ[rjw5ݦjH"=_8vFN%'`W`T$K/&FW/23%N)ʬLPq g0a"` &K݊"{ .%Zh4[7VuSsT~c0l';CE#Κ@親_:6"jcH ~V`", 7>=(.f +ZGPkKG}Cl:a^nѭcL OTSטp1VAϣ3UԷ>3[稉/08T߳OR(3a#hElzi>)6{jE%FXVe2\L9vjv$q~g<*h X]F=Y8?xRhC.nFiػZ+B,~:FefI<[]/D .yͲ=dkx}ws<#P8VC+b:7= w!CB H(6)-"5O9  N-T~iP@Cѥ$RA!+ n~ i{?,`2P3jDN֦i;Bhݾ~%H?0L&jx(2eg00Zw3n%Fr`=XcT!v?pf5;.zEC]^+7bQZpe7DCz^Sί]5[ݮ(Z$j//uǐeX=܋ [[TB9yO+dO}7ea@~F_>8Uu0e'8pqVDA4Ч5ߵMW\7l]~|K)x4KM~wG^Ϣ?QwtEPdZ>ge0BbYatjYr:(,B:bDy+A $S!i3BSD%X Ch5 CN3Iuj CIymW~RApD^W\4rfPi] F"]z{H4`!xA-$!9GB n*bD[*>X#ZRN adDF^EG³ج4"5qܾ~KyR\ڦYT"q k؍c:c!]2±8Áhf ٹlR2䄮w 2Ma32L(TLu5eoi3Q.gf[v_i605i J=qKH!#yu DI}a ch~XFkMNU(GLȒ,/ynjq(Hk˪U{a.6pѝx>jeȄSFn_}Xj|B-E,rPz2ו{G0S$-ٴRTj]}ѴE0xG|Xyʮ%8tB=HIs|ΨJ~Ns45ooKL$lY |9+ ȧ67_OZGi N^d,mp8bIv 2e}8%#ڎTG ԔƂqĈߍ,{dKk')qW]#~RY]ʗQFp{;=ΣwD*G*Jt$DHh}oE_JJ >7_#tPI"sL-lPsQmr.Y#Sss -vNMS{ծ#[ ( ^+m7eG:,.k-Ua85;NhB Ǭ*RA%w(+$.i۷Y=^UGJc8vCJ<(~a7h˕wkq+N0Laq1ƢH~괖%=dlLxF#zӊ_c,g2-&}llCxMMmJ~礸+g~xX֏[E+t9:ZU4J4zZ8>N5{KPAX%+q[eNΉ*Z>)s-*^޸Bŭ*SX?h]:X.~図Qsnŭ,ȋE:Z/L3xvRӜ6뉋eɠØTH(`XZ}J3 hB.yQߠ5dqׅr:di Q2ƷECT!,>֐5KJJfp:@w |ڟ35xVej :0 @ S)Yi!~N! yۖr?\\L(&sLkqÞvi6e>}? *a({/vVS>?v{d؛z+"s~.jv'4]OAV241Z^ƙ#/BzlST S߇Y@ WEV[Ze8Ҕ~o )&B@ozkqROjt QZ)[|v XT[1)@jT-a1v*ܞqv֣jBZ+=#uɥ#i2㐗[7 BVkֹ.6iQ' ͷ$(>Xu(11p\b_/ޔg*^DTK:>[O'WPc{v0048sl,{iBb,/]uNlkޤo>ñ Ib0x?}&~3IL>VY ]w,MmY1(!͸w$O\Na#dR ЂIL(IKB8.1ҦxhBa z547|s@#BHqwE#wҚO|X3K4M}b" ve'y oVX"?!Gxi,J>k%7\jAs}2}=ݨ`?[ƶl >}?9,5 }% +`;"jJwT(g^!߅ipsS#Xpp>CLiSFsNpME%[/&炆Ck+]zMOLyo/OQ9'ΧEő5#z뎸JlE_-,*slb"dsIU$(mhG5%"oŎ ?kdRK,m9YdSU2|ZMCOtER`p6=T;gٝYA*(aevCXX1FQo{=oG4~XcX8d\^keu+eij乓qilxu ]Xě0~(:u̶ȲDzjJTj7cT6m-Y|<[0>"өcvF-熁I7j&.M ;(^ܼ?sd;9X*$ͦ"O9N]KubF=`i|{j7C]BeW}ʌBdz[,K$:D"v kƺ[zn;ѿL0-Rz*UZj|MuI f蕞kV冻Kdػ&➬{#E3(ս[/ 2֞/ñ,)gB+)$,$ co~ڥHONq2j.$<-5Dfk|$=KgY9Fm50ۏ#h S ʅLfa[jf%~iP~ $ %hC|Ǎ<^ͦLޓ4^~*NVvuF9̌yo½FxҲtjo8u\4Z[.L%o2hHF׀B!|D㳕X|FT5U"[FR[Vv8T^LW;z ňjZ^)e3ǒuu|v1rU3ĥD1y?n J /4~t$ȟ;7`*1??ZDci8OVet!Zzun}B+9yPH} rS\B?B(׸-#X:,0 ,҅ټnE 2@Km@"2yH J=ctfm5a l+^)4k8 9FjwZ@䓊D:[s+c,{ |q$dn/:ZңD%,*%.le4")F)4`QNH}C%Xdp?n5;'( ]X8"rF'@y ?SS}\XzןK;.ۓC?Giu`V$]ݞTX|-;)&0̸D}FQ:iԤ} |N'hq7MrRhd/*Xr|nWqCL KgntW]I24Q]K#ɇKMrSҭ(v 3$:T9R3e/s.*eO@D%FVe1e6eMp-f^;r!8]j T YG,̼D1Lp1gX]jL}k^I$(8$ ,@ zӓ K^yKzAL_;~:^-I4?Iozj/b1|ل=j vPdX~RFiqɏm/E`!?nϏWz|1oH0٩ڼ!j:3JG(DM(,0+5sQem[:x,Eϯ"ո J&}?dI W)6ӆV<6T\{9R&0Ej19C}2v l2N6 uUJ7zY%mi@>!k'1z"A6Td"e[%!c/? .T 'u[+of5\3i_ ڹt!F:7R(dY!YT%]癒0&NS幒' fh$#*~G& ^YH+-]i'e&h8+!=9CX Y9!D&Ll(XacCJ>LBLʺ2`{ywswVI?6R`.EL\p=\GhKWHcNjwe:] endstream endobj 492 0 obj << /Length1 2105 /Length2 14461 /Length3 0 /Length 15726 /Filter /FlateDecode >> stream xڍP\ Cp'݃;]@и; Awww.kp8J{Ls͹65:$ wffgaH(s8Y85mA#Sk NV`{XH@@@W$P lwsyyll1C@W+3 @lrB;x@,,_@gJ`e fXJ@gKkFS-@ljrtBnnn,@;'0B fl P9 3_@;п S4,P;! dbo^@2V7ܿ de3l[قYݝ@{ NW+hjw@*L!VN,NVqd+k$vv {g'ꓴL_õ{[ٛEŁU$'oW9@%pdK02!{9]Ag 럊E3+Sg OW1_!V}c넙m=}Ĭ:J_8 `fsx>*@W'9/Oݿ׆ 6n6%uoE.eYzu]_wC !Tۚ_3uC-lF+'i+w忆?v0Ιڼ^*Ng RRlqpu8^Kjr{,`W+99׉pX X ^`/eJAV? *fP^c*A1?T8jk?N"ט?jf0/~ՙm_ _;?? ;Znnn'kV2@5r^e` ū?+%Wv +zXھ~~- G3.쯥9tz_#8Q&wќpx^?8^{ gAL] ׏WAK`S`ර*1b7 zf%H:B}eFOȍXpʖeg:G'8VxߎjIH5z?;zk4CwSg;b߹ɸ QݭQ@y*feP8Kc9G@LȀu1{}35B&Lj3g:GjS!)5~A< `L`-Mw=Q9a' ]䯍R]g2yBSG;~nusP-%jI1W&wWj/+$;W65j8eǍ+# r} ڃ:XG`na-ђ7%Ge w oۊ'fSx56)pSJ5e&w>YQc7B1R `zyǸolHE"*>ߊoEwSRvHTsL!;mBoxUY"PNT<EөEcҢIW۽֋U>HoٮHp,&)P%#8jҒWz3%[g^{4LJ9~QT#w0֙]os4y*:%i N=Fj+E*2U)Y(_KϲA%1'ƌ+hΆמpekjoGGxJExsP n~C nh :.wC J!X`0Ƅb-3 q?)ےȕ[N| h=ڴ.!#71Mk+wnJ4b+%SFU[5:8**~NG?^`uP-[F]"Y`ڸ #(|Y͜D4rLciW5O]ȭnܲfB[KS[g!zp WTk)1)47 3QrU >$v Ԩ#vIHBXvIWeịzҤQ $}QzC(B]$E+_+ekc Gu#yX0Ɲ&z)TT誐З7G83A|T Xs6(k91QY(XŁu*nRדTʭBE/(uZu` DRu2(10CkMAerM>$|_Fڢ~|FNvǏ4mbM)YB U5(6h5Gue- Jckb-Vdso7lRkZ[4o-v SlCE1B?WVmKaZ]OY4M{P>= Ťvn1>]Fعr|^Y ْɚF` Ƕ ˷!2az%-g(LZcI4ɵ :;7uƅ-GaJCo;>9:|qIѴpm\_6M M(lf&@_/cYk\2Fce6t^{+Ȉ A&DIsYOc÷NX~N_k3IEVScuҜOYk4J>?8$m,?~6Ȃ<j#68 EKO\+Fޑ}p]HKMEys?to@Z6)J 2;E,q5o>, E|DͩF 5o2 sXp0S=qf|/ۏɬrC $F5܃J KȬғf vf?<&W\[@YnFf~#9o^;Bb ֒O)ks_`kv:]*M$>u`T/ ţ4$!jcJ=ĹOH9k*5\%xߩ4hD˔~cCrq|t5|*pzVg|'ʔSh\vƼ5>RZgڴ%}׾xzw}+>˫҉o毹voP uзp [(O1k?mλ³XsWzEZԎa3sn9ͩץ>^||c2c{-;{JRrv(Ej2u|=iw!Ey/ Ć}KEq#NhXnlTzPnQnط2m]E(ckd7ќ0)y_3̳S@ǚ#Th]Zx#~vq$,+4@1OΆv%Z+sK01 mR]1 ͷ/dk_A{H33&7rD934ItbVi|t+/ V<{3y7C.C[۴ $?JԯGڀJ̙DCG[_w,']p:J. I/``#}>Hj2C*p͊[|hy3t' Egp?/bKꞿ +\M8myИx֍fJEmb Mn>?26-HIx8U'L<5^wMc;^WƵ$m٦Ew"UAS@|@_i~v=7{ɛm;e䶣#=ytFA:"=g-gK*r+ %ow5{Z^iԣ^11eBE@9*1_W"Wx7CRf[L0Br i!'+m*RqArDUV"'{Fw2O+gvc%G7D<2{CGItNbqu|3CBvAXYlg7a}?rc@ʁRtpEnɝ Ahbdo? %a0voJ!^Bؠ꼛to%fWܡ85lff6T™?mEw5Șy.;ʟ?gūI)&{{o~81sFN#=Ev^BWN%P8Ič=ZzzcCFMijF_PBb'G`{|{‚ ڰT |;؋엋1a(C>)&r}.wG#vrG3a*͢z'U}4|V[HF B QnS BvtWSmbXwx ʔIMo.6xr@ yXSqFsԷ(/+-o!^9^] D4޷RAoKYJ^ >j!,+ۗ~Jp)[v Yiao:ө'XeWSW^Ϭ6de d#-\_X6l)NΟx!=OI2ln?ZGCT?_ssGy&{rv1ȥG}V8ѨD.P҃HvICf50snhbB-`تSBV=NX*~P60jYV2꺣"u}Jc9uʽsQMg6tOH91\B"Ŗ &MI˧C࿵' kCVL*9wyuz&X-Qp]ҹ+#Z2*&৛CTR+f@"'דX  9%!3)RLY% 4lz8> G%f 3^GsHi24_GehXACv>B=`2Iz_U\E+$-e75ա\bF!Ǻ9P/T{V*Ѱ6,CۮJiF&\n;#U0{$n# o[eQ^չ( fZ˺:눗 .e#}f`oE芯#>b=b(^A 1٤D֓T|(B4zUE~ 8':u@16ߌÑ8~T|-T_3POC̕NaxE1%z]4.0UծR`ua߁Cz'0ti:(6_{+OǠr݂sNyίOHY_89SN*qtUģa^ ƞ;s\I Po2>nuC Gp+pd3S8od t9ӹ+^Y#\Vשl5B$8kS eGr͞p'5fXއLvhz&~ڔ2ݪUݽ40:׍:e'J)! (m ϮmTp}Y&ϵvT e^0 b T =G5^}-=nu*3Mkeg&nrB3)%iN#9ʺ##Zy!3K6*fg\\%TvuY1 ؐq5R/<QXͤ)=-c oRnTМ7 UIH8?,az1U7Y *WvٗMM% FDpM)IOЋwf*7qD5~o땒7x3R$x~ÚG~{xQlVD]dqǽ]66(r@l:zO5a'_4{Xχ#j b| ?5>PuB ι{`:vK$ݷ3 "NIXG{4Q}Ň;\`Hz 7R5:鮆pYE4#4ϓM"ͯQ?܎C<]OZIz̋ӥS]%ٵ[4mh%7 S-/@9dڐ"67F{A&0,{ VKxN5058Qp IUoPu?>ka)U2&Xq.N 8scGא{59 &t3 TYU`ݲthFCvڲ,e+L*UW Fv''$nF9UBGXT0}Y_ҝՉJ oo&P+|<}qC2d" \'6"$C,ǎBÍČ'92CcYH^3dlT`w}f{OrZ % ⫷NΊ~Ȳl'#~J;eU3k?}y!pcD~EtGQw"{-rqKbXq{cPyIJ#jjԼSd2B~GT 7əb& /7+&D]x%u2RlW\뗛*=8i(CZw72-%FY3J]O|D=,hlEd4>Z0 CRiJcсVZHsw)WrMm RcP*GJ-]0ܽT 7T[QM e:.9| } R.V\\~&C0cVa=ۉ.QDN7zOҴpC48_~z~)]P‘yӘ7Mm'%_}~(oKKy~>lqZ2}e1(.Ӡe mH&|1u{c,Ka|4^=(dV>/ē5祥y謠D%O 2yE 9|KY9mc[W?ꝰc>/9R~Bqc"5ԇ\"a,♠gO^H,lMF]C8=:UW;<%vwVsv7>o}7ݹK-S!APJ=o\ f~0%kiW%x_  4 HُNÌջxss|(_T? iigKyO۝y/3?~ԏT*591=bX[GRgfLgI-$^Di:!ƪRm^wW}1gY&.AҗK-0X@};xZ40i0K&gx* H+O1}t5h]HaJ=8~0#ng&"<h38O#D$&gH{&F#ǤjN=DߪD ` dbBJ Z4M. xӠkm+B$\IntS:OC[$i7%unC#.W3p)rm`(Ì8򖪫]끑 e֙qG;.L*;BOFE!noqISfu]D (%H?2-z>~Of"4LW7ۇU}<Έ9 2,VKo261'i[ge΀m Ѳ X~Ṕ{Wh<)8Լ!U?5]7csfӧ痴}C 1_|恩%/3Gn=Cm&zj߶B0P[U-bƐ<ȲxbqZaAЀo 3l亘}o%o 0֜hsI@>Yj7j~9IHSquP> !ty-"?s=I﫹*$P~?p5X6O@v ( 

2*@p_jPD9GjoQ;6̋ȟHraiX6 c;A;?Q=eOEmi-596&1KNHtZ Lf$Zs7OB5..J`s=.YI`NX-&ȔT 0SHZãi92R'0[Bvtل=Yzwpho˓"YY}8LdJg9bLhZ>P Y.o/l@Wt f=OUygqX'>BtiO ^ӂ+/`dVّ\-&M鑑9 ᭏)Se%n7}r۫*fD&*ᷧtG|+^ۉ=-W/NgtԨzQJ_SӁػوS&ɰv+N 4??AlC/HU*xe/ {H,1Zr6jys \To [+Aj<1J< 7HvhR y6ll1 SoEʁ.b8TC=ȨS PŜ$Z\u 1U"v/zaNXSP^ᲵPL aJ45cKSubI`` x<̻ʮ'|6|H;XOUTJ a*kX Q ux472h(|>E=L{\Yvn^0\I\go<̭5b *v:}I!,n8CAr+7jL^}ĀiE! 2 WRWޣaX 8ot\PLKV綍,L$LTAl tQH?<)PfX;m˃,˱FbloTO`R[/Xn[ OVdF=+)l;ןJ̔F<#kI@A79oDz _%^@ ݒn(H gU996s*JNIh^NAcemx.$p7=s14e'm 3<Z6bu̟M/ԛ/ |VeF~X8%0O NTnIQ/Nr4JܪUS1J E"q}sƶfdOۂ.Y*; @rZv>Πikf+%%Rgk@خ-k]yL5Շ05dȼ{!+_S5-E;:U!w5ןMSp{]ޢi=?\O0 wt~av&ܼcoܡ4~\ P5MoM]pVQKwKݚn!bJȝu`eK-c .$Ur{s\Sa6s`\c-(m'tF+hT#Id}==%6dkt|ȴ4LIO__h,眾O*XKżoS HU&]EG$zEgsAڣ*yA>y8wXD2[ԽB!̝rV-yhCF(jd/1.m;K ^i]洄eO iY(:(m og3 HMDC&}7uPjo%v^ܬW|UtK{6\!uձ$poߚ($azUoyqئZi1Otd΄3;]gt`_bIg*#bÁ?|jr2Y_r<4y0۴etBx$"Y!˶[K8cXď&x'˫q ^9ximiaXĥCu.0zVUU%h׀ )5/ o_bdеmN X[ZϓC4/W6zzFYD]؏6tME;"eG<]|yUo[ꈥK~ЋYTEd3`?͠<8:,aI Zv-)-$E%{!!7 {J&QCk,c%ǽ,zNNDߡ@CtP1d:g]b,[tV-sۓKiU1C=vgf]ȩYD@M?#ҏHEY7(Hn?ruY9梷)\P+3sm#oz94FŅIJN8V@`^ad\5<ùdoS"_R&Ouv3o_8^ImVg?CuD9b7gʸz8X‡G{ܝB7F`yh~lI7 m -H?Zؖ1qVtKZdRKnSܠWxr)ԣ9A5ehSGN'D)ۺSW茅x{]M x' \2TPjxR$hvmqNDwe*䋇ʽG~4vpרl,(Z[xfPE'*ىs0|ۍtNrBj쾷W53R`>CDebf Z+/w jFGAsђ:o=f4]47w 9,zpWwq4} `k{f='h3-]C1RBI@B/]܅]ILik*㭊C;j«2@S>B7؇=`5Kb &͋n\K9{3)c{ovFP:45[:d[s@Sz/K@&-7/B<_V;eb>g63cLV[m :]V?f1[΂,ƂF *NLxިؽJGyVe!g&:jC[vr-4Vބ3J+sAm37SI_U1⃦垥m)Wf>Z_'f56[#?Y!7:5> stream xڍtw8.!55{:A$zQC{ރJwygޙ993QS[iG"ܸ< Q*x@ ^\]#.> G"DőA n6Y-U (;|(XH@"(Q,n P(#0W\7 nkv[%qH9Pp(Pn+B!$sO v1;77gQ ӓʃDJpp@GI CAVx` BN7a ;jB_6H2n/)oum_)Hwk~eݓo_q;zɹlw)QC ?[h>%7H!lo[_3UքAhn㶀#D=@n0? :>2wC@ֿ&W@A ޸-pۑyrt   Qn L0/7!_Z @ؿE@m\HP寮=Aq'!U! ?*h<x<1X ;?ˏj[8_$}s`4-Bbᮍ !WUwu&cK>-~v(%x斂kmY>6[7;Q|\.])5:֨z(9@'u+e Fr-*Hb9eYm{ptnڧ0ZY@# 糿}փ>wy.) 6eq,*=BKӰDKzJK" 'D6_UH| iOTs}8B3u(XgBf=ka*H!P2}zMJO +0`Dz[4O w% 8hBvevim?bjv q8XDW3ZMd-ԱwRu-$J^t~\(/ZeuPhEA߁hOWZRAX# 3$sb?;2b4Y_$ 􍳺/rruRȒI8 ;3W>rm:5Gv"Cq/u>.bXOUT9ٹyGWmKg!$-*pHzB0玵:ykctI^a}[] J lHȃ֎CFl.ٶ 6p>7ϨMtFj:{LA:~ls6\{5՞x 3Z/|8VD"Uz4i!7.}9!6.=X4^`x~E[Rҧ.tz{Jפ#a߉)/5m3^4'?3 {ڃ{ Jxm쭚# i9Qsz9o>|NNx14TKr5BqCHJǠg,7CoLNv& ,[KkR~.fݟaO&XE1,lh4?I넩}'+94ƝX θ1ɘ6Lk!ku)j\=3%wZCy)u+q[5[GбR`,ishE{;)zҖi!Ru9Q"YOAI]CAun{)ؑp43us&*=7}E?hӶnMrՎmD-\gC(D(,` Ued&Hw)F/| ~aIVW=iw1"7:EZMMI1[ٮU<.8Oi>a#ں8}|u%wqY尖.ct%Q;fؼO:#VNLs`ۻS4v ofwv. UI,.MnJUxw֓YH" `e;B+Qo GYYy js(1Gfǭr1 * Z`Et0ȅ{3yīcI ,k#rOC7y4w ҼS%ӬsË-U3Ƈ f #L SF GcڒjWOt]t&QRt-KQ~зiw:oלy"L|Lں cwpB0E׭#$~lX1[|BFUPuRcv%6/Ç,% g(EX&lf]*dDm46]츔6#WJcXəf@h# r6 #[*>>g:ϹeT&!R^BTGF tx`E{lJ-U혗tWIC͏B˟^h $W۠7w b[JE-g9?Q:w0 ?,{l+`RbdjMB$:C+YoH55Ph'[ /^{A 2=ㄖ.UuY}u5|쀢ҍD_DAFt4ChY«akEӈ:[b n?8HVd}k-3-&Ov( ?(3Xqަ L'TOލRXtb<͑pEۜ=9R)`NO=M%7Sc̚^ƫ\y^wQx9~ Meo3RS%nd?Pۖ9{rx<*ηSt{$Y]nI<=)Clu: _$ጛѺ@>wV`Ӓ\)GtÅxf/Ns:=5~dH4W>IExiFxMDjt L/2ү',d>i+ey X|R[m4J7f <=#L>gŦB{{߼E~7qjHzp>Q]Prh#t*H^ 9wBH KOS_u7kƞdFP^߆ I"QNTX+OU"cAr1nv^q.mq^FOծ!:,0}ǵLp-~+hGn労MK^?Ua=cYAw1) _zoRCc\w(9=%^,j8@At(\iu[7GZ6iGzx}G΅u=騕@/!On01 g_0ᩧw7s]5*4wUk bɂ]g(kJ)MM'<w2pQ~&})3mQT4B%s+,%uC*"HUluҦ!?5M;qw;&+\+" o_rwEJ6Ώov $,%"s 6)+qZ=ΩbCk7-2􆹄qK pI˺AFM瓦.|hx=ark?%Ax }MAKJ $g?rm%-nT8?McOܟhwFqM@y"?EΔuiɸɔ_eC~V~fگj)٧aϾsWqP!ܯN%Ŷ)5fୀɓFW{hOՈlPt $ۦ%*-n3s=>)y"$UֶT}s;W'SOׯ?`ȕ*=<_RRnn]sѢ2ҵQZ'[ʙt;u4`5CJ7Q *{tf'Waf1|rd3 >,*hsznm (En2#a\ɢL?"'-V*&ZBJ`of vyE,cq|`fߙ|3/rחhlSLf6[N8ف@<GBL- h-_Rvʓq 8zZ0vc5DlejQ}/9/5e P׃r~(~؄VlEܛ7j$#6Wf) w\jړɣr?y [V(}o H1n'<'KE.tx į.+{f__|ŭ3kfW If^ }VK)q$ ľb~\YYL{5G}8⊕F"Tk0ao6Ȧ×`kh]7";s&I>÷#CIdR-uH&v+p>W铇"^mo*Dp$.Wmo|e9zh !~{NZkzzJ5~" z5Ql|m9N$1ۜ%w@oSnb!Li=;Y0ar/C"]+\]OJЧg 8aBZQFE6Agsj "scC,l; ~nEqe"vS` b3G.KT8EO3|ZCԥ$vi貚Ytdm8'v/ꊱmhwv1bx%NJy[s޳KXH9/{q?y&;:RLXŢ+,nV&DJSq5U<,JŠ~؟"$VǢ4F_%Lȋ#m&|ICɲ91mZ 4ܬפW7֘ Ti?'|BUuc²$NszJXnח;~1 `wqϫ4sn6gwo<ԍևcS. -y(|>-?̵׼4V67E6,Pݱ0 Gq^hnNE;`8FY.'~Z uIOJ޺d3i1g%(xiϝ]yϦ]_7Zr^J5yQ~^>jWZʡVrX.Ipm?i!rlNWlcoJvRIJ|lN.3zQ!.j?*n2>MY]˒7Sh^VdSm_*Eϓ t[+SqgY]lL0;;I1]b^|ϫP^ms'!SZyE*9yJ8qKNFj/p\ B\≡JVϭxs iւ4y̻/ߔ乮Q0^T3X#<0Jj^ۺ֑V4SqF5lXy}/$KHٽظR"As_F1KL]rK}}tBW͠I|<l?9HQR 2*)/e8u&w>L⣯ZIkv}Ǵk8u t * _c`k}l,WmqSW9;w),q$3Ի1>w6@㪊TA3;L&?B4M|p1E3| f>H· y;ibUG6hD@[/*ŞUb?jF~N~-v*apY~*zd㌻~P,fb4~C(?v{쭬谈&;D.ݬ 6sf9'P"fT|Ć0ÎUj>t#m;1Gjʩ+O.9Re?wo ^]7r&bJ>~?3bZfl˴]s sb^B jԞ;⇹/]ҖC8[s<Jwm]Ģ uٺFlͬz+ZZt0nۈ$~!xd$Omn=x8 8Rˣ铳y%$)kw.4ޑ;y&ǿ$X0F21 ><@K'B]k2XA F햟ωYMhK,z f울bt%2ZqX8?;v g_Wp ,L@cq~ 2?(KQŊXލ;cP+k v|6piNO1Rͽ`bMP_3J"HTU16-?nkaOQtmgOkD#U 'G endstream endobj 496 0 obj << /Length1 1721 /Length2 10475 /Length3 0 /Length 11566 /Filter /FlateDecode >> stream xڍweT-n`k!7X w\kpw`ᑙ3s{?굺]ԩZMC @v6,;FjǃBrvCw$L]_#+`c,0u[Yr 8leR?zs;??/Q{3hj hnjPA^^QÃޅl% Z@. gww%S{ͱ4.! lrpy rs9^eʎ ? ]tENv#bhvX@e)WOWfo %lgjB)QUKub vtuaqwtۃ\]P~O 2y/ֿGlp[,,bȪvrJz1cxy 'ܚw /G?/}8B/Sw o#vv`; l3ߟ _`Aj(K)*1n11'rp9x\?*mZqk?+(A^Gll/_b#Y?dgrA0yyl7(B^TmПYOE+V/dbav{,TRR^"Asۗp^u%!0uv6Byف aѬ58@\_B/,!(G`mXFlVU `Uq߈%wWVпKZoտ 7^>ݿ ?VJ/]___0wsv~ym!AѺojb}6c7=N=N +Mj" NBMNXPaƣ# 8QaE3+jDg:d].EOISF8JGGhG)_y^˛LivJn 7sUI?H[9*7*%8ԕ_ ]i_Y-FdXC~!>q"e q+@_< )<po6Q CO5ے_nJm |JKWYx}:IZyVcNL\ T1²C@bׂT'h4p (k%?B=I~tQj.Wqb:+Z6{%Z ;Trza7@sxܘA,gBgyz>΁+bV*ۂA]Hs{z_|[My\__n} |pIF͵843 6ZCv; m0?hӚI#SF64k?P`6 ݨ/4sYiT լj6 f AM퓫Zh `lI$41/E3.a⃰X! ,aVin `.0oI/^*SBV]fT] AԄմl` D a)VHx5䕇(kl~"\JѠ*2 SaqRt|m"OsoΎD⾰ }ɵzj! _mFh@b<\I ˩n2I|* b;oIzZ [)j9%"'nQ b ]V.k4}G<~؋Τ:ns:A&R8^; ^ 3 /¶vL爵I4olas.:rlv# š/IUIN UﺪZ|n5g"%L M&\,35I3 1 |p짛+OOy UzZ QT4N)qGQYUK$}m{7de{4 r`o}3F?Poj!Mu9PΐmJ)R3ڪ2bp4ҕ['e\yn>U6K4}cY8Dt]#6RB;2P_83=C)PYU-gZ"I誙uzqS)ؑS&oAZs64ӂLAo-Ϩ9m91ŞL>HH*pcIq~{UE*mJK}rbκ':am@q$5h/ $Ҩ3E9FG,2T5hyƆ4o[̎n[; "#I[Jj]y(gP$1L0$ܲ֫+HR h\Qn''ž\~IE%!eNmun t>WZn q/@0M FjoG9q68#%Iަ\]/twTn&[9ep r <)F_e&3q[_ \3Wy×+/\o^/gObtF'ĸ$ϖWj8,3dBt':A $!}5N6ww,ThլtG ~ySTښ<_V:5 EGܲ_p߬ZBmJ-JgzQ$>]ϰbK:Qd'77ªv6Crogv28\EWMunfH>7mpaɆ))٦JGM(G>eg~]T}A<`~&~5L K`\Ō Zsш [ʴqt)q9#3 >cmٙe7lfeZ=x0sOa;7)e'q]4F^⅟BM5WNzxE8JJmH5mI*LJQNĒxz'ʊ`X{TPY-cf"x<;Sd)~hUv@q &u.d1mb@1?[}uWy+X"zhf 8"ё"܎-Ar8 wEvOX*Uw6c O {F8\1@v{Jp7e2FY(׎ͼwy{X܏>5S x ?]"Xv]Hlϓ*NnOT+h'_`.7ӽ #M`9P-tװ^RM{@I^laI|2kb%ĒԒ$6Z?fԞ !DA{OrS:SwA\ATIUt_,XS JYi[J62B/&m'M;cu#0<]Ȇ%=:NBti[k/,ƭYNn|´+a· P``t`Xgq0:U^vf[#h3Fo?X&J4r|eQr+?LG۲?%z ss1,ؘI1ؐ͝^Tת^3vQ[^.P;ܠ'W/46357=fG<߹dhօ%AqO l&gߦEvщ)ނ>,AMx*52"ֽg2]0$3Awx +;KX@ÅDFOR]?qDE.w4ϧEw9X}s g LQ\[bExP4L!,VoXu`鏭f*S:d;/\Lh{ OxaA*h7I~H鿾I#Z_Kad3+h@So~N!8?+,dxHA w--xs{R/1/VX?U"(7{d6"(Enb~b(ӄtgMҵ6R|xyCj"TR.=Jôaix GFxfWŢi/-k{<.Kq|,횵-U]-Bjɹ>|vY :}WN73W?Vk!XrP>vWX,<к&hʨZS e}+)1 F9B<5&3^s%Yy]d5/WG)N_dhAcjt%] &'(HTb4s$WQKX`"Lc(xhZ"(cF\L͈/_*ڐ;`hQ1p`8V KPX=)ޡo$C;αf_WѪK I"q°hxm2@);>x[#'&;5S1r\:\f$Kh5iS|j|X|3zcOv:9ʤx{Fb 2hZ멟sI61|K)=Vb]ek;罐,:Ȃ8A'AoyxՊ"]%ϒsktCw jVR(ء!/~'-$aMY9JI6>b|Pݲh*l@>sqW4[e<<%{~˿8eP $tP0yoQFZee GVk# @1ӪC>BM04T|&)`c[yIMKxpӮA*ə]CfDǃitoPxV;nb#]=aMPy~Cr-})?#6ݶMgu'޽C{{mdFջ(ѻtPƦX+*d&7%1^hcȿZE-R֡y̦nDY}U[.t"e3|hF)$KdC(T9VSoҹ9/Qt^c8 qqam QQCjnWA^'-F"]v!rS3¸v-8U}\jusI㖢M>[O9"oB UTy1!86%3[fi[jyGګ[N "Gcy*4B~0;"~C*]dxf1<-2 dz G_OXcL']>,#Xw4a>˲QYkO?Ŏ ./ʦg|m1. 3k@kE!+XJdPIJ(Z)JWvdYu[.woAm}UxaȦĭFJ+Q& QYÍ 62ʒ+IIj+Xe$蠣Q*/>%_S,)-gVc^k|y/%|>I,_"G 2@|Uk!;j+(ri|_S}MArG.E+Li sR>o'RW3`õ Cx2T䛽nD(Tۏ^Xg|e#&*zOX2rO@x7Ü f EcL5mYeL?AӚRȫ3~6ⵞ UA3:aP;㳉1i>E|HI)^UK+a)GByFj8LdyXVz8l5%(ݧ3q 5!1MAzh.TrykZkgUEN+H";wCL"b9HZg(?qrX 1*Q겣C/ܤn BQlX?-+"z[qx=4G)>c[Ϭ 7(:tfO>S [dCRF-m=uWpca,Nz3>]*!2YV3}*iς!ͣj< Mn5FQҜL'LHWYKsc@N%..;v5)[!/@ f&šïqRᅮ/<;W\0( ֻ^ Ju>l~*^-%ȔezJK7T ; bq:'XsQ|Qn7P ~r sUTkz~&9dKtfSf K"QD]+QG!ԍ-zh\>D1zv s|o܁LgqQ^\RMȧpR:Cn\pLɁ}cQl4Hu4"=@~F+F Xdcďbȯpҝ>kC}~Psnڮ1+O6AR`;vw1IV&4/mQ~zwl]m`Y{#IHw).CӅtr$ q̝S2V2bs$|-#԰,/tәz5J$X :I9^GAccv$./u瞕>3T=|ಥ S 1Ov#ZP\PR.uFTwEkI3dS&>m \ǦVxmFOlE!BIBlط\kNvՒ'K!L9EVmT㤧Nonx FBNF _| Vs>Şom=!| s3pj;cfR:~֞e`&6CFoRU-$·fљp'|G{OwZDoBZ-e wAtX5fb*▰gVܒJ8>DysI] 4*V#ě;ۆ䪙xv7vpJDEfO-(FVNfblJzio-H)]o;S W#%mX_qx O/( ^z<Dtbo 5\D#gVe IaB eQi'']!]DKkA1OH+2) Jݩ, ꨰOnZ$U%dEdӹZik˕ޡZ10,py/e&]!H-UEFTM,Fk2!z\ZGT#fq ZjL# 01Tt0`R#6 8ki$ڕ.d M1԰Y.zC% oYTvQJ( R se}y?+تl]x?l~{V3yǣ<&jg.9m(snX-YUT>=q2'ܻxtć*rDU-߅gLS0>CˍјZ4@5By/!'Mm|xe ۻ8i M[&=ǁ)sdz.[O% ^) L>TJ)xgX]㢈᱘(=œnϏYj-;_GH6nT}ʽLSW$oq;ؾ=&N1i`zV #>ȴLʪpK<;ENҟՄ+ kMe-qX{$HeA2`LH4HĀLYF{s,xF >a> stream xڍTT.L7H ]- 0 CKwHH JHJ7!ֺww?;gZMiH sprd y|ܼX `/9>BD! 29 AQ ^v8l2`;_oG_տ>?ȿX <@05c^`@_/9rɅ{Qۀ\Y{{@^ kIXCMhE4'7u7,3V+](w W}(ơXPO2Y5'ጦFe}4y&E\`>°tXLRQFw\35 삡;Ō##()hp:"s zS*Th7h&Žq2LfM@{yizjwB3K, I U~M\o{?tGx#IA$" ۞e{#Hxw>(# 8?7t|O<-C"Hc2`uqZ5g;# ^yfpa8YLhE#ZzlIdt/骝0CPu7ˢr>t(tᆜEU4U.Y*D}IH8Rx~ZpF?Xf=bRh%DS3B nG{mAZTmd@\)}Լ0T:Nj/Aa |ӹDGzp_f͗cjVVnp}RxkJϯ5qKthGlz7m*C]vr\ўKi3^TGڃb_ĒzתPJJٳM(0E Zi:Kmg2JkV}{Gw崼s-L;0AVq9!GW1H:?\aꐊ!Y;TSYH8\mFB6.]+ŵ\oE}~R&q 5R&fe4Y.ؗr6cV'bB92 $tΛGLT.K͙|co4YʰgpQ^Mĥ -B*^PdNPϳ_73T[5 1`_y%ݸ~Һ=$rZ%|g7}>oC"B.PMn_YsxG®Z!z0Rhp6KfnŇT&A)^ L^J?c In<#.k5 Z+"Uɿ]1$&SNx/AR@Ū1:|d t eqȭs|h"4k5SLnMOi SWCgr:h RL >qQ~H'n7CL Gb>Z7l Fzlbxdl,-SԖԐ@s~/7yĺR՚1[d xd*'|r1͡F\t]: sj?H' N}ahJ6#ېPiYk}+ޜz#v"wxP.MQI;Pw^/GٖJdyL/3tV1 )$>>5HrkƬ42s{SSmZy,T_ݣRp;g/Uѱ{,?R_BkX'#מQǰ9Q ҋFWyX:͐.Jfr0VD=ڗ/Pb_rΰ6F' GW4D$&{)lyNxYzFh'8V5< :̚GF\#z"b=3F8s­zelj5,gʫb+ӎ|a#VaUg8ߡ+cɲ={C ~J Nxf+-7]MO6dHdMz+XuU+Nwwoٞ2G9u \w]l=hY"#l&F~v[Kz6~y$6v jY\J)w:qW!EI'`˫ɊF'M?k}| txL>7`_ڴ5eOUWzb Ln7%X LBؚ?w[L%mjUĐO,wIKr>>X\I\#-I ^&cʣK6qj)&զЏ$U3ӳ\WM v0΄Q}hoqLK 1{.! 54qm4gڰrӜ-eۗFRP9M \h3?L:KdўMmdQq Fx: &~`um]d#M[gGr'$w'<6omf:$˄d^l{H3j;Y}}Y1Fj'B b&=g3e'u16ޕXid!xwP"=O fFBo'a!ZwZoӒ3;e5oǬ͚5'HoBKdPqΤx5P/H1.M x[{!w}SL"LK'v*;2ǀ^v&d.wLۑdHK3a (sBIl̉=K>E#̀?8Oyq$,-Iх5MN<߼e z" C@va#0Na'˶gT|[lWfTC\Ǯe*zNI'~g)XNXuNV FƒWK{Uݸ < g5VR_ i9u"ql%bg=\ ?ړ4*@+('CXuB؅uk{P$Q/&ǔGg|xygjJo M/m\ddҠu_Y,+j[R&*udN1Tq-K3>.R,8Xi.7+kF%<A Zq`vsdyFjrMQS9S-WaHNՆ-{R@ggj[.7#!mm#ޕ޼6Q(C(%vo~6"K>c_۠=}miO>9R:C5`fDd_S_+p°ozhm$"bxli.0i"hsyf~DZ}NqtztV"o""쓃y ( Ma/v7.TP#%pYfp,e3Akhhi1WIy?I5HA\O|PuZR"c5ʠkƐ3%@}e U+'_}@*ìYTJEygdCu^ml9Yщ.WmgA)|<.؍^;w,l>7n$Mq^G}pVsH`i+ N2ꏢs`™ UF?a"11ݒ3Y)W4XF(?b4b[箬 O\ f6\07yOВ}g}fYGo#>zĖևTJI"SY34Ư%odڛ(}b@?ig+~"H7"A JgnE'eSZnvSVQSi7`h*@Cד4X|k݉8W)pO=$6MXa@JDG[]FSkqS\rz|JD%+OڅeӚ%Cxz,1ƙ'rDP XOoԴ1e=ޘGt48Q].PuVdL ܆(,9j5L [:0ļQv@Lg#m(QqEv_]r:jlī0-vHꨶMMry-n|Vrk$v:B RdOx[<9!..b" w''[r2nϘ6J$^(f` P$Vǽf^I%R4;8J`,[y1GKCy5? dM@L&\tS Fqq!L[r vVN_5l`z|k;K#K'ԥww= û% v`+ ˼@fqB_4䫔2_T>99ypx67T` #.^`}CguB~8!瓳zrыiAn'Q@UKO3#Z@u dS,KĆxNhSY$h %zͲ1ؔt/;WZrB֭4sxe\?UƩQIc#qܦg$j SMeF#7?p7-ݡq?<ƭ[l?u|.# eJQ_ޘ$?uƎ<9|}Aq`[O|:UKv@=wh#z|5nI4Uh3Xj]vYH+ȍ5_ĤЇ{-V##7˹Dq.1:tl֥yi]WoX @vYߖ@;K-,|")ag[YNiڹd![b9+LXv~>'1|tm}cWe*4f:H'qm;#$rS 46e>ZҐ qke?YÚurlzLXȈ'F>O({fx6E&wJ>[mñ9ů8ZY44.+}I;6 @O/4""}4%IkqE,獖{q"$ LԘ-^0f|7m N3x`= j1X6K0ޘ,\1ke^rE_mImџI FM_,) "$BT?փ9YrU "oZُ h Þ_^Q"oGis4c6f Ѹ4:9+01q9rU*{IzYjܿl0(EPfu + /q=,?֗!p΢6| ى\-| ̸ )qu~1*zb⌥^`r1t)Q89cWJtZ8%=:cj<6TlfQhklyܺ$? HlJʂM_xp>޳Eu[;q J206O 9}o򃪀ĹF} S/-S!aPnd|ó̫s*4)CJ~l endstream endobj 500 0 obj << /Length1 2122 /Length2 15471 /Length3 0 /Length 16771 /Filter /FlateDecode >> stream xڌtk ǍmNF8$fcjlդAc6ߜZfߵ}{{f(I(3mXy"rrR,ff6FffVxJJ%?rxJ5ƚ"@w㻡5@`eef23ƞ j 21m"6n S3~,^}y0ckK?1SRX ```0s7;K]?"JYJG{C6 Pmff7[+ߊĝ,-SGo`t@;9/X_Su6Zh rZ)G%6}tvFfA Wٿ?d bybf?3x\_*EtxU:ĬlIVNH#]y 0 %0A<&".f>Iz)ǔLE~;IzSk/yEz4/z_F&K[HXL@?`FElFfbW?^11;-SF|//im@N?;IB, lm]bxa+tb?Zl A ?y?=] ,f ?7Gw^|?{89ov/!ߙ g3W+}m]F 6F|流mB. ;g) bSzqʙ2 },vYsWu$n $$1o3wd(`IļE`_Q>+Sx~흏w,j.ΐ&Q;Trl1Ri,F&R>82G'sN&7D(Jm99( PCȸl&VlH:L?$vS8>'7x)+iSZo*HgbB:$HmqwrI&Y@ 5\kWe{I0D$m1: C/ [u֯)fm*/j!9R*U?jz]utS-U[GG-{>0 DXmzVnZzUYqϡEEHJ;#q[C*C=^aicw.x4.gF_k5M1R𔛂}m_MfuOzjWJWDz@:ZwϤDucM`jprԚDtEna\ڹh h0!4#"48ʱzC-눭MSFY(d9ɺǯ$:*biJCaLtO؇Kmw8LIRe?FF_>c|B^GgLr#hY>: UH5Ov;,R-2TA~ |;4ii?7yh]ԻAMb 0_~HQ:'4wJX LINGշ.Lw k>a,n׫ٜ*Mo‡[.B[qݞNsBw5Zɸ|/Mw'h5p3Yt6ZQ)U3[=>D2WX٬0S{.ya C"\xmyh2֜]l kb#o">=^ BNU_z~V(%h}t+] ŀHU'4[ɡȪƋD0į)1rf&W Ig/GvdR*̪c2ظez8#imL[RfSz^3_(/̙Ë;Nu6A[=2P +K&TO{Gć1".PK o\V57%5#\1|( 1I-D  2-n+aR̅hMBKkjᨿU+"P{zyy7,$U2ڔ/b敻H J*⇆p~5 kjZY_ǘ̱?X֒jwt4ƪ&WߦoB,U$ ^oABPa6Al$:$*]JDߪ, L<|R ;|Ud -L8]sk]j%%h) -⫞5kl\5W&*@j5X|nRn#~#"0nG1㨄P3KXY57Kj-Y 9$g1p]xeVSO1*<1Kb- I(Ւ0d/=LSābj,W,c*5j/Sn2SW[瞋 ̅*Tfvv4fqyPESS/MedpOM9eu}Xϯ`ٷ0m7 ,L{H&S+jF*TjqSdC0ߦuUVgPJXKw_J ]VQ$1ٌ%rddIRB[d#*l5$b?hJh)BRY=faA8'|ugZk)m6Zql?OTVeǂ)mQ !A^БƛCCCż]Xc2MXםC,ϝdyB96]¬!>W1 1XA|J-ApmAxd%GcΪw| b;A6?T 7W:9:Y:>˸ڱ9UTƜ?&++X՚xƪn_WțMM$elnn~p.7J=AnChA+&+bסYS/ޡ "9kK[g BXOYi!1wAZ吮*F]Z֕4Yٛsgx+XQ!]bA>IʠϖFۯ`_ IK ,QLL/OL;k0 69? %(Bmۆ.x_z(}8HKZ6HEɹ}r/߮uLEbV>?͹Ӊo$Bz9EJ$LZR xQx(n>\ R6q<٣ܐG}$^R6 VY #]AajvcUe {.n:kvV eo8B6ueðI %$+t m̙wu5ؕAB2,(?_yuHڂ&Q^ړPiDOy0֙9{t-"Q"9՘+1IvԬ:+@L:ES,Iw)ȘXh_HdV>=S]kSQ|`re;T- nϱ !Tīr : > ZZ Z+])FXgŅMWa.4zؗ9QS /߈Jp̚3BG-9-?NРQr=[;sd\4+&m;^`0jn.D n>+䵃2sY|yYִ7qdLm0i۲9a/^B%u&Jya[ :JE/`Q:SŖmHHjM{sڟ &+Ɇ6q!n LrB^A%@n7GcdTM-׎ +5C7g Lj͖Swԙ ąulZҖix S J'E2%!\[dHAVH:8!,|vaEl\6}? ܈ʷT)UDO׃~el$t#x2TɢB^׫@e{Ad>sVHiuf GԬu 4Rpq{ĐLtZ&p`57I?5}!̣6|3ܡt 7gFgl:V>2pKBK-pPܻTn0T\Vg\*4BՋ?3PTp#~֢"?P%ֱ߰iuQE]A?pꜝQ5u"^/|Ԕ[FSoz(wF*YyVe.D̟~R6W]3-5eZZ k)"4BC:oSey^|쏦P`U?l(RN>-D4 DIS/+pD6iZL ģ`].@h^'"d!7T9gPʡTH;7U|<ͬmSé[_Kݬ?EI`;x:ݢ@L*oD*#3݊:2Y\|`A1./h=;B* lW/H+:x̣VT=J7EH[Bi8V/$9iE:lsҌ}\@">pIEQ ( Aq )6v-gr,Й'ΰ2-𬥟²BUq&|QkqHN&ʃ`޷DzУk-|! 8OOH%9px1,MxB~\ԧ* oERe'ǯGӈmkEQsn O{q ܫ#cpNq@BQy' \icRYqMk, ;جrH{H?Tʘ[!k 8asC:7#`22ִߊ%U?$`5]uKFmA ſ[t=pk}\LL~{C8/}ժYQ+dUy.p ) `q+'5tރ@ɡQFi5Ls*#b0bjYςvj~re,h5jq4:g YĐ[Xo =NgEywѩqoe0.9\~myԔE 9OSvu-Okukv([/[~.&H~ X%Ki=QzۅVk,M)T[*ןbhW>U'.hG($|v7orGMJ"4!j Y`W5["x9]gNr wl>]'k}934TN rOy,]cNe4ה-5C@mHQjq,V>vU<ǐ'8-KлعS 2_;ē7G=PfGՕ99k3AV 78*mے1's' P8ڠhq{p`.k'tTeCU!盒)X/խ(K{mV, < F@%[ٖf%s I}b\TY&hqWeQ_l:b'E}[ Wf  }U0i賙PVliwڴ>!˚*'-"("`IhU6b8OK'|#Ԑf7=;kR՚G#)8K?iQ"V{=x'Qʙꚝ7 G& -YcĂZ>1L0m]=kBk BS^`],ʖO"'d4:rRyBUz ZSN^MUpA9c9/La<Ћݙ&&T6J {E·|  |$ͫ"reRM[`zF:BFw ųz@"kSxq7+dM 2tPeZ?`j;聘U5K߼N]ZT@!w*v4@#1`(_Аl@H3!tqaZs874]՞m "\Szz ^M3M&J#ϖA{,DLu3`Zm#:? F>) CߝjǂY@=rpz8> "I6XH1ZַBэ3{+O+C[|OL{h֨{b\_{ț^7"tğa͛L*9 v?YX 4bO7)D1\v1 5HG.k42xHCw!mg\/wiUtX܇= k钯T I-{Z!mDv\DDpXNg2qk[9ws)4se&NmD5.2GQ=|Pi1#u0N,.5f c,a܁\׭kvx$$gwz8}֛Y"IA&^+2FMߦԡV?3Z4m?B!z~:Xv_C@ˑ 1`W$@_\fN Djdt.x5wttB Vz9\rM^|Ľ~m PI(6' 72nkcb}AX@9F7`XgR}ɼfۉ<&j.ElyrٿMJri[7}q[k\԰jUmd;+:]otVoEE%4>O(bc^%1-`.ߛΰ Tp? X1p-j#ZWoXW1 lo)^2bsv&9nziZ dGt_Է`/m8\RA,7 +[Vvz?a--Q~NWowyI .h|0AP363^S# 0R?qY V)cY)wr)D2d80BN@6a2r)K6LxyęĄwm dvuHL &~q |A%vb7% OdbblX+,y`w8ton2yX_.ݗ"UO 2JMxMVK7fGN{(1h ]+SG{ H2c"|\<[y i liXӇ5cG7Vl4}x IS 6۶:] 0&({ gO03s2!xMK 2t/1zozkQ~ P%Lpp,OvDn^"`>.18{+~wCsB WdDzOP6ݩM' +D:މJ"ԲOFab.k˦@^i)3g]OlÎU:>&QX-eCB tOȱn = K)]#3(E8dG M3Z6FvdaAy3&^ӞYMЂ3 bHeV/H0鋲R/%;AGLiv2?*咤eVm"xzPP>V'_.B8,`CzÉ%gߤX b1,ߐvƦ@3SVhpn_l/fRKaB%0X'upg,Kb63X!-o30Q֚^?_AT #VI⵭">g4DTxյb}9+ H8ҹDeu9.ud̔,n#F_!)mBE l@&.V("Qc>0¼"J'Qy`lWvyJ(ܫU\ChZT?T_YߵճGO9nΙM(,;5 BB`#% spJNi#'4kJiǽn"r(>Ek?\HW"[?M8yI5 ~H؝p%*u)] 1hsrFث緷ҳ_2wr@N'0g`cA#nJJ'I1{Q70MiX785}Y0b.]_/܌HCĝ ;ݍ(-2v:ɡ_bNR-Qы OjcZ{aK1JzNc)Y;ɮC79{@a`~9S7R%h4Nc㼱 3~",,ա6M+ζ~Ȩߓ0G+^ v[FٟG#)xPSMB<&QFت੆7{ȺjJI9mr|XswB$ft*QI4շ!飖UBDӦFG`š6=j5P:fIJTiP?gu'z*PB!Bz7!ǛWn0S_iP6噰d74K'vp/83wpРV֜A+ Aؼq[3?;Ή - %HoejQ=Y<"Bvk=($oBo$TY~sq`'>kmAesz eclgȏVC!1~37hv 3ܖȯ.> 3(23;`Ӿ1@S19FC 𨽏Z_B{(d*%ZFDD8XcT󺋖&#3B7Ŭ,tdiZ_'VJƄ+\i4XL)Nv_(=XUz .jKt榯ˈ"RNbq͚%7@ICՓɉ HuQUknms>ӱ^OcB-l8==CٍH2Gw+|Nt.|ǘ﫰'X6qbhb?>⥸w-٥O}-XCnuud啗wp7Qv,K ϸnPߠϞ{]ݾ 5DngF;ѓ>ƁSDhVEٌJ5QcǶ[]B36>%*TtƩ/L ޳p}H)22=M=TƥdRpJm1m 6.#4ʐi9nj4(H0_.hkw^u7n4-dGSе6|C#VA(fǰ_h-˂bbpkYOZ2Nʕz+2u!!cPc-ϯOTvS)ڡ[J;O0;QQn, 3DV%LʖN#%. eTVUx`%6򆿿 jM2Ir};nĺ$?H &Ayu'"B&@JcWQb_O76@MqWMٜGZ~F+B/y.ҷ C+ZڢHRý,*Hre ʇ3J=Wf,kB05Pϰ>)\ٮC/|+4T)\#[L`6xn:(XZ9;, k.O,[{t*vRc3KWK.{sTBE=֘d);IPeol7ѝMjMp~qeKRNLxaifΓșDȪ9ߓ+OiRpȡr":.wgB]_9+}DF0Gm_TV.u#5O~2 M>0"ߢr`fqRg t;4Ֆথ:CDz 8Z! p57YPH, .w_ɘـ55zuAmf#J'-Kgb\V ~+W֊h/;#]U~O6!g۬nRiYr 0,dU E']"!Ԕ{\ɽed2D1۵?b-|H9ks6vALQ H /tbv6xD *69c)t˲)o4)_L`mG1\6k Kj#[wܚk=/B,YөNT|;ҕM1Zc" 6<̠ɴN>ބ) h0NiCNև%n H|NV.KT% oc;=4AqT2|QKtFEO}ߐxڵC,l+6L @ą:(B8Mn b;kILW3|'5ԙЩV{R7dgE_~7t5ݮ&\f($hN0}QB8VC4ۤ:'f7Sk?TH7+,Q C%t ֨_/pYx~%Em=Xhkst!i0'0oaAtnЙpAW\꬯_h7*|Ȓk;#EKKDZڶ`, ;y-ydbbni2 Ulط4\K)G4Er<-MmZlƼ;LmLgW!J/S+Z 9|.F5VyAwP6ы(L9^N,‚>%ERm*+X$#,5]p/3X2LS{୓ϾE~lq󞳃1OZ%je(;4JETyQ]k[:S-3-Î1][ |>Jb )nN*|]W[w!rt3}(uNՊGaJ> ʪ Y֛- L.jwe tdLOYςv@}&" vSא 僲5}ϩG1yLv99,.Ŀ4wP3{6Ӯ??(M3;TyHQ4s¼Q۞1"ʋO>6db0VnHjмТd-Mbg7S2 ÌsΫ8R_7ZE=`ƛr$9&PiM bG!|RiPV4S|i$ endstream endobj 502 0 obj << /Length1 1422 /Length2 6329 /Length3 0 /Length 7290 /Filter /FlateDecode >> stream xڍtTk/t3H͐ ) 0 0 CR*-4H#%)(~u޿gŮ'CY($F$(ii@A PKq&2](rPB!NiuWHIHa PoGZ qCZuB¥rD#ll12as5[xӆ*jd1izlEVt7K(;0n=.rΙX;ԅ` fwi̒;0 V}kbܙBSnkȴĸS,-biWw XsKEYYp!Efv *V6#z>]z BcXmz򖜔<[ԳS{_ؼ,=kmb`xgwM{O+%AMT]wݡ@UPGF뽤`)[nl ԏ,,s(+)Si4a H"ưi4$f^==+<=}g4#xO-ʼEwtF8U~[+ vx&F8u> Na^2NH!L 0+>=J*ƹK#̞,]76P/ÌsB(<hM!H06g`vH 1X*W~"^ ?1e;.>a֍/:DZȼk\%{C HRIIX;i sy͌]2f7iaG6W*\Н3؜yK^8H"2kFLss"{V{۽o/Ӆ@Zʼn5e%4 ĸݦ] J=a@UN (nDEn9aڄ V~L|6z?"8*6 c:s{ѳCao.ʲs 1oG F#Liwy9}=%v] Opnb5,~O+fŬ!O%7G?9%(Q#^=v׎]| R$]Hq~_,[s4?Ahu-r.LE߾'fqF"?Ȟ} ?mL`歐ϗ:^aۯ8~X7*!p6:9ڹ } 11/FpKe^eĞ;Z7 w+˗p:eI ЃY)-UڋSj18̐5W.lenJM' !HkAUeiUkVE<<ܗI?lϘ_88}?vuS YKkoPɽ0֊nϼe/?沙a.&SruFӚtC?Ux'?e0:uЈnogXk?ΒiC_\gKd*J9cp͐m7\.x0xi)k,q6%­I8=ʘ7lTeo{U*'*ܟh#xtR3ܰH6XH0O{c(<'F|O`X0L-x'<`$۳ŝw`YIwΨ3'~Y'h]`=XC?`%? ry$rLN5Xo4uQWnW%~\ T}ϵW l`1SM O?UT>e-eMWb|K@E"vV_R(1:Z߈!krIdxU:LNsC!?2@9u2[-Sv1_z<7-nujawFfxf#vqbQEl,טdfU%ځ5=.%Ro}ajXvɒ2U((&yu%cVՅSܰ6Ө;N0Տў90N-JI'lACd>8FOr`ڴހn鉍 !IIކOujتPj8`xDN&UteTR,[^x} ɲ_Zsw<6W 1SX>9"|ϿTX34v"\kg-tﬦZӯBdRċH%q.|~N5+YkBj<5-^6F"O鶇U=-BigZ葻b%*"5ZM]u֥:![_ .얋sּql1 A<Xl_kݯ@$ ÿ8qjM|3v˄OK8'F Z\DjBp3+ (%v9LF|ZinoI3 KkT\9!Z0z}$}n GL8=W84OmU_tj%nt6'fxE`˳5pj>.6ejh{Qn7gǵ#hß#}s8bq FC)յKixi|q΀} 2Hs :cB(>-BX \Dі;;DŽh^N$e(O#_e]xX C,hQ:j^ބy(ή~^B-ǒRUpӍvhXbcJ;ޛݒLg܎?Jđw z9<4hki(}:IÐQ/b[z'4F&=^Ǟ yJd08EcVifX&ܝsA.HQ&g>RO9)U7"h:/p% T|*vЅ3_ ̺]ʘ%| 7ͯt\m!dv#hqՒA ZBzV}.W֖&]_kmlې XM5em;V$3 Yuږkj٦}lѬ[Sc.uL̢oڮ@xtcY`cW"ES8O#mg 7Iص[{v69kZ0HJtq<ʹPK?rg悥IH:ĿZq𔮋\SBPIīy9.3;oe:hJpD}\Ilt AixHB]A njB5GoU|f) 7@SV,qn WY6֬G]EH;_hbGc,&DM+!Cqަ{3'8fٌRrZ&$nIkfߓUI"\1DڞNYKPOo=*`xgп YlLJ?Π-:yǔ ;l+`EhnׁU, k^<_džg5lg?|4b.@rKDSZQS^D)ݏ4ݳuL='#@+zո}?x"Mj ea\rS}D[g Q 4="7Ig4^JCK#TGӭi[imR3z$U:n^VvSX~a+ZڐQUg{5St.P|d߶ޖyz50oVhn.n/ Hw)=Ds&. eˈso[FC*nD_nDJ   'Hsk5jA+ehj0Z66ޥRBAүgrilV<(KNWwѿ=ym>r8Y "~) Yu6ez.o}vPXKojl%˜!JnU:ӳƍe@, őGH!pǸY)q- Y* E{vrZMnY +ݻd[hhh+A#zvJ~OqҢ9~Wzy:'kNTΙ=w|^ MAX쫳bC4LDhdjf$5N:?ߗPT؏L.t{mʦ^viYx1{-j_4Q޼0 j*YXM7麲 0pX;=~NR_V*Dv5˫Y<fd+B6Nxcs:+PﺮtM5&/ʂ|JWd͜fZ~1spjXtRcmwBDpoTFlҦs`I{(p,t-+^?:c2NKD@d\AR6ISŅS}wƏ쉡,G9<.7N%7窬N>ٵ;-5}rk)QFeQ\[y;at痁83t2Y:q̣[ v b$H3~"H\/re1Mp>LQ+T=Ǿ4$khvK!~q5GbeUrβ-鋙BQx9U9Wgwb޵pp}~h"1wm*[gdw.@uH\ҙ8̎qܧ"Xl3Vvy+au t4óoUyQ)ok'g%'kO9i/ o?MzX!'nu>> xjaZHhJ- endstream endobj 504 0 obj << /Length1 1665 /Length2 9193 /Length3 0 /Length 10280 /Filter /FlateDecode >> stream xڍTk6LH7(! CI7Cww 0CKw#- (" )!%! -k׽}_f吶Z8'@V]]Y͋Ȩgwef4ȺApMGĩC!w'G@GP-@@ao P@!`6,8?f+ igPΈ@N]=_%p..OOON3f+t00@ '6#@]jCdCn]e5 gڟ쀿f_ٿ CHYYA]@o{- TP{ @ y@?: ]0No\ ,:;!pV{sy'/`cM݅KbV+af B|B|+ee 'o3 ` #a@`o#l` `Safx_fyYC!Nq\Fz Fl2'#r8xn =ê9**ClD?H "aPo B?o)]mH7lWBp^CPC🻬ww_2i-B<a ^`k-{ݟJ] p0O"|rD<+0č;rc0by: 7776B \(@p@ݰ_3B\ ';o^%AXe7FW e/(rp9 y WCDh O<ˋhބ!4迺A\C]fD? 1?1?=0 lmj%PZғcaƥ/bsLxjnNj·sv ܥߍZ:osm[ęsd *F4g"enHZ1Xֶj=?.WT Q]FJ%lsMdٯ <%g[sNY5JȤSkN@e3&H#xC8H^JB!m^^&",z9vlaJ!-=Cv]29Aka;h`+D(=o.6ZlQA'i6bpNX s6+wCҺ1UV&bVO+n&Et1㌶0};ZgT ʎ[Dyqq#ZTv1TO#N+EͬSo]Q°w7ːX&ޔP%ʪ)xk*lgmKashH6}{K",)գXݖ6BwvSBlJaYm~ƋT+ 7 5nywG% +'N ӯ߼[7Y>c ?GiŏA-kJ,~!3Sެ}jN݁~W,/{W6jΏ8:|'8Wcё2h{OLRI wbc'>[^zP^i m1;K4e]IeL)$*RԘ(TPXLQM"bl')iU죍WBY':R8e jSS4m%h|x<5̫sr37(Uށ1$GA7S6"86]6aRo;55F=+7*X LeaA9ULi1(_tzgKx;4d=_A?jF;IAK~vxU04!g75ɜ$8Qwq1mR< hdh,]Ay(t*dא_?+S#""Wsw@ 3c2S݃?0DiY)ё7mdNT _%`7WUcB1'~<(_HpH7|Ad-t"OHfmv2uDJrq[~t F]>LE6 e2-}CG^uVhbu~63|GhR[_7fo!L:wQ$lIzj05r Eˑ] WW~Y1. "SiG"aNf]N:^AŦ;wNl!%R;P@#J!95N3XVoYo%^aV#+z Fw ѵ=s9 ms}'H7Od&W~}bCw5 x և^X?!61}-͋sMmQ/g鼯t?ŅOKU*$ \ (Ҍa-Y@S x Bf0./(fR/[Ե?G<;pƧ]gKeu9OFxZn` ,8'vRڷƺw Ԓح4zON:e,"aKa!зwI[aΰY8.wՌB_q]p\\'dGř◪o(?F60M/B4&{8<)x_#,_ϬMC{mzVD PnзqU|4)Mb[?9o{>ޖ"ڐKgS+ylL9,VTKTR ]M*q[ed+egL_+n7mQ8wԟzPĖ,~q0X{鍄" )wsd_CZ|O\z3v9&%v=nz"W01/b&g_uSk(++va^B<^e]zcr0A CHp(s"ۣ)̼n=tlXEE078 COimFeVR}1-' [Z!WhB(^@GyZ*V6I U#v't?!U"N~W&gxPC!0"eb*K u_((#13Fܫyex|5 vM;{# 9ABuW[ 8'D_V üNLj=Mfv(?j* F7[o?vM8J2”M_VNBe$pZvSKh_{0,V?[{,N ?[ zc]@_./ǫ(~E;UL\`N#z2qO?3\QmD v S|Fc,(e=a[;:9] Z dV,qKty9=DY섐8P%=%ۦ$DrQN:V~)C/=՜ա?[iJ? +n}Vm%lJVysfG 'ٿYk{vL< dӅyj)<で@j'#r9H'E?8nK=Mߕ%eB9A\-/|],ktln.;Z,> psr#TELZb>aՇ `hGI Ϡ1m1b.A*RMUH鋋Hz qhg \uэgUHvxO뜦­42ѷݬ.NfԄT)|}١Rvq 7z]M̆5ҳո{l[IHq9ql\QZc,$o17kICG*˅sc^2U`Ye۷cԩSk0B/Eѧޓ 7.&9ք$'a\ ٳ#gImMxYTvDC5ŗF$@hs V~)mh;ub5/->=ږs'D.'RJSn#_\2g FĶ)A" ,*Ls;jy"#2 0Yjdf-sZ婨#77[-y֩_͓^HF;Ycdg tn]'Rq<6/;CXIk'b>S_MSS:t' JAKXꡰ뢍s< xݱDh4?E>pc5u%%p캗7lDGIPVGɦAE~:.r#~Mw%-gM㷮)߆3q%ƿ^uk؅ȿ]1%`%B{Cv^k>#Ӳw.u]Q*3̯S nF[хKxI9,})֧5b0r{ڟn}1;6H^'.ut=r"GABH)iu=܊ [3J{zoU"JL)d/nЬL"4 cu/kqRVN9!egjOJQӰbΑ5 H5 JI(8(`Qo b;< AvDzْ!$S1<Klo3!2W+?+]LRЍ:C<Ŷ6񺁛g+} ~ڃv|3(slX%vSY]Fv&I6,D#A!pMsy MhNfVկ8&5KQo Z #Q@H% J:}bOBF)fo`uH@•Mͯ+%o?EPx=ںN?Jw?3*;!X%7SDbFK:8hE %ћV5:BN DFnyVYQ8Ph-?xyj& F%{-TZ*B̩rDgŘc)v(86w&g6үs+g9 o2;0)"?J׺">5V_j p1^x;egiG5\TYkw; #bO#J>ꌋer&n,Lbz@VCd{)Vɳ U^cp(QW X`bv6NjfTy6%z/C%r毼wY\8Q ryb1/wY4Ϥ%`1-FZa `4CߦvɌ{{Q.YYc7ߎpd|^&Ԏgwz"wn#56b!yV\"OqkǤ>~zT>/dqdm㮓pz/$`HMڌBM}J^-pFُ py]˺#J(PuT}'Os>n ~?kƛ=tܾV/n&?eIvC0`)hPqU8.'mPKf[z[ }*lV.q.t;M]E9y mgCjJ$Hyᒣ|͔:un*[#W4E_u5m;]ݥ+JfT;:ђ91wwH$ c?]f/qF%+!Ǖ'*RIBh2#-XU(u%?wc W~sYg% w_,emܟ;Xaςk1/L0zua sxVI(:٣K80%Lgk8m:ɻۯ99kc@x2#W3LѝKK$4ݺ]^F Ofi2v*6lFˈcc!zO峊8UJ{ߠ$Q2VIr7{l!Ƅ)o"kZ-,b n5((RKPHd헣Cg\G"! R[㪼Sߖĥ;bύ;j!L1UsW˛GkVp83I7e0AfK7)\ $/_ $,F2DeQuQ`uP.Ba-(TLf8?\nH$Ee|v qZ9CgOmwFQnl4F E -CR]/Nң3,7,f endstream endobj 506 0 obj << /Length1 2869 /Length2 24562 /Length3 0 /Length 26159 /Filter /FlateDecode >> stream xڌPY A{!hN 84nAK[pw'ngf!սEUkY{u)ITMl@6֎ @Ff ̂HIfh njHw#@d:m2N +af03s/ƞ flagX)Eml-+Ƙ+ l06:'ZTm-@n)Aghhhhco&@Kpp4@  V;cD[8mW1ut1K c8dP(ڂ;l@F]dCcc+[Ck7 k3%(!H06hh`7t644 ! 07O{[d]?WlZh^l *o$,-rqZYX#Zۀ/ }A&NV+hfAddhlpyK k _8xW@#ŭmL~_<v"x`o /im)p{^S{`0 68L"/$Lb" , _&'3I%E`K*' I_Iʾ 0[f+l^⿈ @) 0\^ sxA`./ sqh p\HCc+ZقY` cdoh~˙:Y}'u14;cKFgae܊~ɽV,?\,``:(wR%0:6gndino327.3Klyq%B%ܺyhp+;HMЋ_]ҀoO]٢XDTdZC2gocC`/Mpr@ff` E4dRavM4s"#aF>36l1{YWyݩ·)YK ݀gɧ49irVyk@uSLk8b%n$rqsg}lҒ]۳a:n5[bIwEMv7Dl4N]BE8s>}SjwPL*ٜB0"?Rq&jFTn/|t/. ם+¯tRӦxK:m92"4~@U\r5ىM:Elݍ^hX*MԋU~'Ӱu괩^a6Vf,C)@~ u\L| {F +2~v-HU1P}Y9}ea[3 r,3S/7 |hI#LClMScD'`*2TS= ȠV2w׈ʌ@8BPuyppT#iuLHM_3 H̚I'DRxV>($#!xeK tBڄ,,m=䠬adf"1" J,up"FrFxܵxS۾7CT,f F!72C)N6_XWRC8ަ-DD.>R*؝'cLcf],˱Jd3jN-g+EhcZĄ̑P&+.D&́P)__9C+nϗ:Mi*BTc 8\: \ |IǍ H8OΚ]܅`2S{:nfW}ǖ"3Zx ֢Lpߪ[As:/jɈy3{ԃW9LW]mJ,9<´"rL?Jq1KE3Vo2,y+<~#ѐ7Ͻ# 2gѭKy e$#i#93Dۆ%[]vcI/oDE"M)qMfO;PtܾKJd5+;D }›{x':K77 囙}!S\7RJUYXe@ⷥ[}t}F˥C~ʬ8s9á(k\\e3]AfY:kBdkj9FciEYXUtd,MG.6N'MYugȦ ĭqoi4 >:DYv*!t׍B?-G +- pV./M!-gD/۵ic(T^Vx=[K1$XϜPlf,{V'CkCQo]bxi70K)IftϗXe1`ˉ‰xsB}vѦr5?L?>&Puxj7y`dYvU>AK\d|ށAr=Sh/ۺQK\xXj"D~S1Q!d*\ 2{7}*Oi.B"wmKd\90œ@RhBn:hdQq \󵶁nJlqҘ6qV%YCHHjrbC;~ɫ!8ӀzDAT,l.%H?)X4O0k\z 05J`.3F(W#$('vH-]P9S\R}Uh匮SI9|o_دuՃyej#|]~3t8".{xq:)>*A]S',4*=Hcuj=-Ez3w>S)L։2r98H4IB5;?RtZ{U/@6xvH8^~_r3puje$6O**Jk Ϩ]xBi6A øuTwFTKמMi\It#}n$5"!Y,SpPW!] HC\I_!rnK h zeAYڈ}G Ip&emHz\"j>VɕW*(sc-$ &%u)ɲp#cv[R[N_uLaf4%(+6%zxHT(u9B*h-Ü>t^kuZ~?p=S._T x$fTK9jOӇR1*MBҭwMpRE;C>ӌZgBseIhK~7`䐭“aWpͰ3qzy# ƎeEBVN9@K$ ߕmcߔLҶg3ERŧ~tų#SAh˵k8 H3TTI_G5L4L;-'?GK9Q`ndDn?1w*];a˛42Z&$0hIs6YGO PfU` Z[1 J*_ndsTӽuY 'xqG:) ?]P*WO8_ʃ FAtV3m"Z/͆ bj%S0ݻ-7~ ov&E3X*u87mmdQ`@螱P)7 mN7tXGaRh2HaqoObm?aËCU_ISUYV@A}Q؍M/MERF7B;ɻzo*pwd*Dx)fZ`5jv o 8"%Bn4ɌH-y$UJܟjB,Z=u8h& 9Qm4PRYtqunUu^H>"4Xݷ,XNG^ElR:aEFӁ _H.h5}U Jma}׺ꮮ L"V3Ke[ PaWJ͑6x)V&gP(tKl0tv5g(+ {`* ig@Pci6mOY/͞7/1g5P32H v8rU WAs#01)Oc6+3SMAZx+,]5l1lݯۮq!\&Խ!1lޗ d怯e\$&ʈw{e1'eC q%|4 @xqʥzuy {Cã&1$:%0W1\z_"vvT0BW씺׏zb*M\LL'>`,7n&737I,b0}IKEs.u:$b=oe>KFP KL.C@ّDoVvćc+>?թpK[}nxnLU W;@i&nY8y6OĨ*:<~ovvOo4JXT .BRJ s).*-MɭܔiUTq=ne(V`u:~Q9/8r\ΊR.]>."9!ގו2&bD*Ӧ;<m$\#gds/.nf1sBsQpÈjX7faSIjçә!Eq+ѹۋ^Nd]|3:;w1"=ԋVJ0,x#-n U)}| ?t4i\ts&D[Rt_]'Gs%a0aGӾ~ +kF]d2bY9I{Ǽ~U}̀UM4Ny+ Vch'F5F/)Ýtgܻ_W2b{_-xXPd%w{%ZEDuRuS5v1W]Iv ϥB~Kp|QxLt~Tb t(_kEf =-Ty3^j䓸+2?S V(w 'iv`TnVwG yFN7JJp}_/ p( Ky4p}[KLh^骡X RJ$쬏ih`Bώ~s* <YVٸ apt?Px^;-sP j@Q ᶋLmXVOV6 & h/YVGwDڕczneۄ2>-h{J F*tQ|䧃s(ܻeO1b+BC߉1H5RU'5~]$Z!80mBL| YGȱAɌwEN!?%6I=zgN\D8* Y4'W&N 3C=t}NwUuq(r*˛w4AFjΎa!u4Zw|p;'h|GǒV ׃ɂrV9n6]+[J:2 {mQ[`O%e)d-w dKܫF4y|ݖy`GɾI`j/iD2F*#:Dm"S"fӪ;H4UZ@,^78ՠM2āvgrZA:A[<27K=y$JJk6AT.Hq̸2c ڥo U-qqOtiajtz&K#*eT[IHz*QaHG/:jA?5Z%.X<7CR?کu }Rӯd8%s~aW?,' gXr&`AʐQ}DL#^H21&HJpStz .8 |z1C8).:01qR Z*+`Aoϝh#E`Oўl'!b&9a4GɠϺ`{$an燼P>aQvBͯYy*?C'8>9϶ 򁨱IqWf[̵ uC 3ű2w3@]i%wҎ!Sv6bCCb= |Otxi*ctk2r&3D}M4(|'s t;R@$2\rN\~yl);S&S?jޫ/qZT[KPU4u©lF'Ec}id}|'ŠscJO>m~.W[Ӱn9 T[Z~EC?~Xbk:=~P8¨MwY-ˣ<g{Ź8o'b; ۪ wHkh`PDTu!Ď[kU1܄П;|TɱW>{!Ni<SQ'p$1>){q)E*"Oblh1Ng 1$e>Z4Տ*!D7|42À0ۆZ5ZK t~N)c_ֵxNa!t{ ɥƦXIq[íj1$ \}A AF[6YZ{ Hfo| q/~0HA,}Br#Զ_̲a@8-.n@_iI:T+1EDl?v;'̬.Z'|Zl-DtEcR/T(*~ld:R̃24dؼMWJ)]Mpw1)bvO|M4bz9ƚYNC^IіFuG"-hʿݦL=Jk~?oJD)ex gKNf? CFC̋CFՑoAKqv42ӌ]'[)dH_ Uq^G}S[)~&~ v=h {堥&rfZ| u r$MWRA">/ ! |[p}Ua'ȸ>\ͫi7mׂgA2z?ĭbVQwhGц @O5uo\Zgٯ(ĘpS {ϴS9'qh%98r{8;վds?#"'n`B^Z] &Jz\jYj*iY#[&CQgNǃѓϒÇ~of|F+kΣ[kQg*c`/.ֻqϒ%m #ỳxYqτw99kd.+zjyw p) [W3+ůKcHr)GۗPZ2D_V3z-V3` &m]Co~zgsFT̷.W >$MIY~Uo4/5s*Fq٢ld%O [֤/ɗ1gM-{OȵE+}7P ퟚxAF 浲vUUŽ%1w$P@J&SLC|T+3p;&3 @jׁ ? ݚ?;NC|Cq18 ^6%|Jy_ ;%%ީ;Sٻ4ԩQInQUfaM[3%{SjoxK3i'+Lvk]`8etE0Φgs G)_#fol9c ͎ \G}VjxWt\Zpmr~C?yFFi8y( 4KTcnSX#o5s go f Q?26З`R~x͹tE8;r@T4}p3{guIF̜^DŨhh8 ,m]֐սү\~o2#+)g +NO^,V2,Ok z[<rXG&?fCv/Z̄jp`;ySq:/u4vޡx6 `5@)Zj/*~G3N:YE<ژ=-PSIU8MmNѮOggTx4@_0!iN<(DNeg2`d6;?/U& `Sd;D`G?:f~Gcr-j b˵ǂcۋec7+ PkNF &M#ʿMHz7]1)jߔLIcSR~y&4Hչ<4@Kĺ934hk xr|ÈYc%=!]9a҄<3 E>M_03 r:Xᕌt,ois߅N0J/AcAkdJ(ɌD9#Uܜnq>52M 1Z7 KLw8>Rcf,y܀(I C Vaڗx.cyP[[]7xL oѳY#ArPW%t?n,qcK7 gIq#ĝhffIxR&kn#}C* c[9Zt=,]b&!"LewkG;KО%M'w%} ƴ.E|Kl YX5]GWtϭwFE}_ CVכߔ5ن6i1yՏq!d"qC?xEtxKy)Wp\tczžr=d !MW9taҲy 'm]IA ItЀb'<\l B6ϭL'Хf/}Nw3rD Cq7Adp8=.d<. lV/xYdQBh߷+-?/ӱB%;unNުV"h"2a|3F'-bNMku.kV}/rȧ2J?ȴ\JkaMՖXTI#Jgej^ǡI¤@=b^+InEˤ|cI4E&\[9y{d2$7?{"F0=~jc;Д}b׿{w_ n ; zqj|u52Oz,‚ MК2 tj|F 4`ҍW+PPuQr]gT[o$8H!߫n .ŧoD|\G }o8~~PMߖ#(GOՐ&ub8s>XjG}A(d )c:nJA?Zh9a[U_)avaIPɰ ":QͲ|OR&@'}Q!6Ob>G+dNl(F0́ڨ{H4$8r_-o>L[6B^&AxMK Dn5뾃eVص!΢?5$hnx312n6&Uu\i;wdǸ(tE\_.{_OD3;'h7 Q!GOh` O$!;S:vo.?7leerp<6 t,% Ϭe.ЃL1^dx!_nۑ"H}Wr{5R7ޮLW[ ۅ.!)R1'LN5/k+fuju>uU|?V "~k>4 Zȿc l˂ymژh"Ps]?93lo9ʴ8lybJ؛Tf|)}'RD#4Pkqe}8h?%Fl}#nSO%n8\x GR== M陏 pOqhu:8,;sR.EK=EE$utmRzvڻGP&׋[!IA[m Ro 3zy')3A5Ux6jFsW*ʋ2V?RZ|+y^#2!M [R~) V{uAϾYCWL_V0:t[v{Abd=j~vN.+y$1ä rns6RyWq]=y}{SqO>%#i5bcrRO?ļd cRF99͇"BI03 hD &s}kb<ɇO/h7q³*¸D¤sȬ! V ʐP-.%"!%t?,_OI`LӦeousEs8>]^f֍v桶~=c 8/dՅ94eA}D(tj^nNC;:J+= P̈= Pfa+Fd?Y=$=\TFhՕG|:_tc=)hV7Mǟ6tGeSqَQ)AX۞rWl 7yGn_K 77AukEe&?p$Lh^]>;&^yxbSCTHHH)I`2/5=th!16^۠Y%ԜL 7LhW c탱,rR&n$\rΛdǚ#؟Y|pvz~VNur:+ksT]mjZ!^F0 7:kǗ6߻JE{]6rz8HJQ:̿_?֔Q S_ "}MBjrhe.!""&F(XRܘ( L7| m5,sL?#:Ҏkt Do}j3^ۻOGdKCxn8iqtum%hXx-'Di%\>lͼ NK\Ne($vWɱo&z2CZڧv턺hM; Uc$_'gU^3z>iU9G|p=O=F]䝄i}lkZC1{桪uDR&_d%2?0b=j@rj>#:wgֳG=B= PBGU_[ V 6F~1HRH&'IXtҫwy&W9źvFw LQ`:uGg֕t`nܝQzɼ`eD1!^XU[ t0Q#/wMݥ" ܅zcgιR!KIamO c^rr YI.YImlg`Qhrb$ܔv,ALVS.,T>)-ecœ#Cu}Fu.G&0j L܍J~r#^ZIb PppUB Q<&%aA4iO0y09V%ZDA/.0w %2#9 Ok +Rt{X Õ{X{u6c`!ْM+ޖJ A,E,wY0W TΥYy\Z`OihZAՌq[5,nJ6֧qI&Iu17Y;ð pB_} Çp"SWx,'|H1apOh{ެ\ sCx)͊ 7aE7s\Z# xJ*Tm R8v{^0mØB} E4^8,^zz}ָ`_K 2胂.8*@61G|ԋB3oj.M Mnٍؚ<*"T(֤1|oU_ma<.{pxkN̲ɪmې_#sA kXLƗFr"LW+];tCs^:<5$k TiIւB1s8L ۣ0E'_PӺ|19MLvz5ʇ`"ns`/Z DvYzfz 4 < 5:"spbsMpBcoHZ만wVT )~uc-eH$:Rv. }o鐍F] F~Bf)J{}`=z뗦10ɹXJʧѕ",wU+"4 Ԇq2cYSC*)T](GfcJvul$v fs{Lk#t3ri=s+?lB'-Z7E](/:fm2C|)S(-$/תDY?d?=< IdoG7;`~s.Dfybd9 IGcuß|iVgv=,zl=e{W6|꼹j;S)9~\ܨn:a@NhƟ_p)IFE7L{~zgy2)X(*"ro;1 ,:=ˎvgeC<ɑ$+=%y~@D@!IN|[إ8S3*dv-iLõp#9v~C[mW|弉tf?2igث*ȋ/ځB6 H:s'~;JP|&(6v#-Tx9H!>M¼Bk6y蹂{EF![iw'~2~F-g!y>Q%^$_yaR8Q/QiDI\a̼׉KEwbwEdM`]3S4J#؄E5qd nv)0(AfLܸ~Õ%&KҴ 6Id6ҖwY6a9(wdwK-]F>"(=DyZX*k&?#͖<Ϲ'mShc~ ](ЭhC֬6hɚ% fd^f2"w~CI]r},cha?*m\Kp4dm"[[ X[Qrc^R6|Z8NnU8tZq㡋Ew+:3<sdcQ 5m@`r A\g['V|#ѿE#?wnԙ?3V0 tâ _~tܾ ~Y\5u!so_U81&[:Y5{Hq3B|+}g+ 'Fe% iSvcܫai~Mg* E:zRSTO*džPN&ş϶HGay\pl9=jLY:wCKrN#03+ XY\/E|uGfQ-XRFV?-}9$ƶ i !vY\1wKWevMQ+';* 7d^<&3Y0H?^q63o1cٯ+t'Lzdڇ3B _Gi:f ]ckYHKyڨ+.׆Vrq3vsG@M\ ljC$;IAlin>e(L`Hk,ļ=ŵT,m7S  +SLK$c3:y4GwLv]ah2STtΚ>G_7Y'{wRZE3ݡ9l}5/w?78+ 4d,){&6A.iy$`, D Xݼ6ҡ[f}ޖ X ؄F0f#="M!yD~D/h4х}]8= }w]qꉱ€LޢRM9XG M9(AŃEgv"CsDMP+A<~t{檣%J[8?4Nr{z:Oinkap^1רSE88Nwc`rQlC{zKzUUaWCy8ꋄ:Rhz"*(,9 ȹ s/kȫ $B|_au (||xb?r+ej_!<ҽ3#B`7qpJcvX_}\3GmEb7i͉ :`+hThйYPy(&{>іuB_s}n0XD{("#xygd]G$դA1FOD~_f?A:1|{rbSYǭ71y tμ DX4Vc\YDb e tFޜŴ &;Iz|DƪeOPG'|Jqa+LtSv[;i=zEtD)lv_O:+zK13]ӣ0<85{+`ߵ-:&gY+-2j|=L_I F. 7~"LN(%zB^TۙSDv\&ƽ Rx5]Ps-gVv{ "B >׹b!rZRmѱ|g}_ YҌhdX5E7u1ĉ|jWU1(ac0zhF um ؍I&0_/_\Qn!!P;}f cxز†aJRmPv/ŹԆF"5(eÃ?bZMliW~j! y:u*zC#hݑW ;Z]-\JP:h">§ǀe˛y8ג4UQvo) l8xuﰚeM48Xcy)]yT^ 7cP+uI~OuvY5r&ՀԠ, I;Z9Xpl Fu\/獉- ҅s]{ z a@Li|X̸HNxh>7@$RzڑR(}+*mP`5U6E&M -0ch(?HէsW?}i AdOH%?B"`rQ7vO4M)rruϼQzv=hܔoUɲ5VMh)c +X[*X`.~hx8|dҎM&u+VhOQ5j~lGv}O 㵫p%B 6X[]!z~C& sq ]  DwIs2@#/aрͱo 9}aQyU>{㨳( ͽz р>K(s倸]DAC jG\bw=`v q1XyLυ$n QS\gR Edcf6(UJ8lŚ3$y.81!i&.J| VrAPP>Aʬ{w >HV^hեs Я.@-{'ztb5?g׀8cu @XfzFhu_vDpyn_iQbcVjfhqdc]`^ćCĐ- eY2+~&եK1t'|$.f4h 9/Vm5?˙)/s+8+U6-rv‹ʬ[pcKknV/nJ,FEf[q7~OaCc_,Ҩ]#5bPs֤k?:X5hO JVd;QLhgw[l!Fy}eXn6 BUgk1yWa \Hf̅h[} MfHGE@F}H9y sfhvҭb OZQ=6!WaREKxR8k1KCm2ݚcj *`ڴsVe6/鮪/ߒ&h@JLi iHl~ѹD3@?vxN/y!'D]nbg;r^D݋9Н ?_c1n]Wm ۶7sv$}Dvʋv3Ns=1ZOT*¦dCr <`K|8V=8 1#Ͱ_?|ͨ=%> stream xڍWT컧SQa] JL`1`t4 !tJJ7H! !q_9O?=9+9 p_H$ P5@" 0hEB O(&*֩h7]8 K IH@aH/G8B :tZpēwE@*\!)) %7jtHg=` BJ%DK <'yn> 0xB/=70" # jy`]`wpÁNgDP`= œPW@_]GB0_`WO8: ԕ `4?y#HOO/Ҡ/Y wsDS" [=V sp]hVs b HBR @P΂C~~h@#C /H7["8@;FOv<X~}>Y{M,Lyۤ GA~a1@HHJ >;[k蟌0G8@ s]GV 1=KM!e?h{r2+ b/$z#t轀9%օ8@Ӫ7C %B=ա(i:+1{B=3~!?l]wA?%I6AЫj0{ï/zhI /^N708@ 8D)*D?VetAB^z~_M@P{iLģ>k#r5s^9a+Jq(3_o4Gpil4hvgh[.~+P-`$A!ՙ T}wPz6eiUhG`]=+.ɏIʼfd^bU) aNv 'CZt3WCSo? np!6?Js1 bSkůKq+aI=XZAi~hOJTLdYGp{e}aKMT)/&z(X81{ѕO5ygwq|%1t< ҈=ոI{׈6F2QYT^k-*$WpO CP&ɸ>J򨞄l`sAYq 7q&%bs+UBA4nB^ atSV; ߨ,mQ7RV97Ou1[Uk9Kvɕtޏ5 %'&4,E߫r/N'+:o= L_ёc6nU%{c5q>^6]_Y65%ZyP,l#l~,m[-.ôioD d>pGgܚzڠ{AAStKl>Ny7OFIqxAx^4޷VM˳ڭ^l?gU>]\Ti=&F4J`;.Ya)_IP2L?`%N֯!)c奅y@/bV~^ώ,v[tFYYY>UNVLkV} 󦳓OάI>`n{~:9΃%]zm8儊][?̀9r iPS,Z/EtEHO*bT@{grW"{|wҰXyU{:JZ^K}[[Hڣ >}$"*\"׭1ƞN3̔^B5BIڣV9;̗%QI&[4K?rNpmcMJ<0DEKJ,ԍ=SZi ϺwgS0%KGC?祵_:/h%I\ eN'p:*sL M/{BEdO=Oosޛj{ā7f櫕(+=V*uo ͡2 ņ6\g%cݴL.C/mu>Ч`֟7V[gKe;X21a^;2_=pRL^ebQ* |m|J6KCWw笌\`f\%]En>xЖS>>Sus'xKVZVR'ԚM]5xK~Dt. VŊH#"NZϺ9*56,C6v= O:պ~zTۏyϴ_DIZj?5g #5+1 Z,Υ;ϓ9B A( !ƨU0I;Ytn6mu aeL #͆~&z٪߽{dʥ݃po&C5ܽ oxfbه"(L(n ]mh"#GE&5&ksMsForIqھ$-t2˾^V%'g]ؤVRr9F7o'x;lK}pgįdW~jɨD`;YZRpLGIS?w8$o{GZ[e41 CG2¤g}o+՛}2됻  nc򌬃l=5$ԉ&bZ,]X4' S=>U?a6~x:>_eM٘ YofxM\:tRUOVͭcȱ|Ch{9}pVx$}ӃzVD0ΉoRZ87.;fO=kJvjcRysJT@0h8,7:NFQ>e^wO<߅GFȴgU4Q?8)jΕm e'dTFv  h0S0ƫzMBմ=wcՌj ^7a,x}6TU4زsbon=== 6>(p%ew  euc\2έ®Boͨf_[v9Щ~${r^c΍npWCG{]zS<]asv^Ԗ&,SXVGIub2$sejV۰]X3 bWqci!Rܚ,_l?pmu5P%%e>fgxr ΥVTau2,Ѵlé<3QQCpE 0puZP+9?i>q"tmRk]U}# aǥ#c{ٛX/J&ǫ|(=KuN%jr=VqTn!D:$2hʕG@Sk2 (߶8ΜR-8|!K)F]l ksgsGUD",BW4/Lg I oh.rt\^ !ar& 0 \8FM4_y+B߾pkӘ(=1KXrL['D5F%i *usQfr@X+\y^$6"ׅ=G&Vol8fŃGXz6~[44aOvfxOy8 ^[Ow? s>K~UG9F98{dj*DR]Uޅ_ IP 0V4ke xgV8_5ei,$g`T8Lrc%٪=]Ivo)d D'p*m$dΣ$6۵b{^&W*8kmH+J*a>e - ΄G ? {p_vyI˿u%eQ΅X|3G}U^"1HQ|i&74}{H9>Ru.C+,MEp;߀$F JD*7I͟ m͹[ tc,;ҥH4]>2H^JO0aNRWwWhyRj쨨I;iֲrB%jPQ i^AF| g7C զ%wQZ~8U^S&6c8Sx2&2,`>G9K2"k G2&x Ԏ1ܟ8ef4(y1mYZwY"YAgof\-楶aU._C @֣x- fQR775͆RTn HV@#8:嘨@fwI #PdX3E.JT\;>ˁ 83rE0Jgj?˝UzFQ[ gm[_. MU ] }&Omղ6fz]zoÓ&e]l쨵~(rzі dˏeRfJ=[xZ#Í{ FS2{ΕE-9!oIW ȑ\[lo/'eNj$&:͛\3&H_( endstream endobj 510 0 obj << /Length1 1527 /Length2 7240 /Length3 0 /Length 8254 /Filter /FlateDecode >> stream xڍTT헦KBRR:SDf`E@D:K@:C@Z.ѯ{߼Ͻ, ~h[~c:P^pmAPwd k 4: Κ8p|w?%C[\\>` t5yn55Cm/n PX#vE!J|d%E"E:Ca^P?`/v|`7H?: /* o[G_ }\A\H=n  n  ';R CFv#}2Gr| \myxE< (?@ywVɨ|`x ?Dž 0$Aho/oqWye䷕X]?H{ C?]b-?jkdA ?"] #l _=@ ];ךÆ5[g*qGv T~͜C6) y5 C CHx{W?S@"$7dO aB>GBt2蘕f$"$,EoM6:I;h eϱDmZVԺƊwwz`SeX?Kɿf!މ|/4i~\,Ӵ`vPh7VVȍ6aX8f@L]O w;JdJf1F hǶH`ƚtt&ۭX+OAg/zB9 71 hU<\Il5)0ρ^ڗ>PG6*hi;F"d80e$[eH WUڍOD0t(>nAELS罳x~CDVW1T2G'sE2{h$jťs5ۣ#?z >4mJJ&>;X*;0&vڗLc[5^MsI僎u1"A.agFQ/tï] ;rPy :̶sSx$3oҏ1*>J,g8iO~]}эZ\14'J! P)-Ԭꚓb0מGXxl MJ*0X}jcCyH`8mrٚ^u8jyUc |,V.e[@T-iVBt.־%B=ܭ? [$Kgy&꾦G8}Ws:C\Co"*%Gc$v^Hݢ) >TlS]l:aS^9߼fR%&\*ܳc)䛤AKϔ UWUiìP2}fi؄WFQ7tN64S :NΩ ~4Mp5"XWmz8p:=3_A8%U%toUO^TҤ␬*[ಚ8k}װ*$3dSzlGydVrvت?Zdb(y] W[Pzi=/T9~둑etebZ1m3Re1r/JE")7ŢrӔm /y2FCܮgː{9j?VRd'g&}k5񔖸{l gw _bnJ]}&&89Dkl'/POX7ES&Pc%oNB.4fbl3igGTQC ʃ3n|(ef2;1gHIи'Tger%]^xmD,9-|gx 5JҟUcnpa)4V&쾍FYRtRDkBZM. ĩwkKv@-3$ِƖ7zB>7^ x)@0J -)f)ve?f~Gd}A[oAD1^{^7r{ul)58hG :pOIgM_ܚІNN8u>dhВb2"L ~K:2ݿχXS_X|~ ,}͙[Yk'%ʐ޷mVC0'|gYW^J؜V!8qBٽۜ&Ԙ0Y/(8AVz_;)5_j7z|&8{hxx U,b0JO+Ȕ6>ac`fՕ3Jйzˑ,_N桯u-&M?1691_h%cC۽HgBhNm*˼UO*nlLԷĊR(D9YPGGI.bY\XAvrH{kR6c_tv瘝(jŽyo_LhIJZd#~ *:{:|`b,">6+3h ܖsڎvHyݗ]=g=0+iT `FIv fĭ,cf6Y~F]"9/Kt#*˹ wR#`ƽٝU"e|XͲ+O"ĢXA=ZxwdN+ 륲pR=57?'C7͛4"֬c(v?=)tž%qj/pIEjQ{ٟ`K _[) PSf㑃0;J~sak|(LogO!UJ?`Rzj2I8=1"_#0|y"=z)u؏$![bPx@SdoGm(1&݅[mrc'Hmx9Wi\ୠ|y(GjvnLQ̡KR98sM(AuA𧣪G>luL:uE| >~ G?O0<롚dXH[%c P/Q0bEjOPQ}W/JRf5*% 'g~9Qjȷ~|3Ӧ$cCutwA+N ,b5"<.$Ֆ?I?F,[|5J":ăڸŪHtA 䙳Q81H0;*Lk+ڶ7>}>*G" 4MͲFVK ׽%[jGGL-,?h \t2ť7ƅqc8 \nw6sիC:jUul~<>WO Z"6O9e&g5=1a  bSzqVt)//! j@p0) ogHWp* XN`DBmGCN%GF JY`cX>>`1R<.,k$sBɊ!eRfq%d|+>SԞci&7غ]yt'/G]YE?4Gsx%Of6;OϓȚ־L"T{tR)m5}Cw:Y I6q %UPK.p*l].Dr=|vpGM6#*A3HI`Q( >ː\F;j2OmJlvoYGWÂTdR.:l57mN)eW~bGoNvoI:tێX`;d"$/,ApOO7_^/͓`հUlƥlDΎ]]WK=hxnQzoo,x\AB,-۫2E U]hi~V Φi":U#viLO{ 1?o$r`_R~\hS5"bMb!g4+=Ly&[:J4 i=aP2nΫ AG)k>.+%tՆ8jί"El?/@k^&^ɺC>F)\?^}Zp&i2j6w،MR뤭S7x$Nu ,kNX\6Cq',~,G x0Hّ0`miuǍyH;@G\yfybfF|Puu uێ69C 6lbSR  ,V7Is}9K=xJD pv룿Mu.C+Dxsucrv)5Q?픎]ZW]l:}A{KոK.KcND<|٢/Mܗ9gq=Nrzw:|X#&yX~φD9/4'-_0,,؛8^w5@*y[{?:%vWɿ1ܮ&?;q0*/$A endstream endobj 512 0 obj << /Length1 1832 /Length2 12095 /Length3 0 /Length 13237 /Filter /FlateDecode >> stream xڍPi.$8 nAwww5H7w  \pٝ{9sꏒTYQb YX j,v&6$JJu-r$JM#U&ajd]lV.>Vn> !| W9@ (! K+<~ИXyytAf&`5-@ b:{W+gg{>ff777&;'&- lP:]?Z(j nrB bf lAf@ӫ xP(2XX/?:AM %d (I39;3L:A^M\M@&nUvWNf {g'&'=2u̒`sqG} G=:\0 od[ц=U daa@w3+?{T!~bxm y9Ύ.@*!AfS%wW1_A=WXa1G q ZRL bb0qXYܯ>?wJM@U2` _MNߍ ֆ!|h> '?_IGob.ίyj @sjeM^wDlsF^&ANR w2_TY'tgfz8؟*bwZI d8:x qX_W'L` Es0!qFfٿѫ߈70+FQx_LF<fӿk Wu0pp!1-__VfomD 0ۿ2RX_9&s|p|u.nCR3G׻ύ}ɿ34CZ[U~pcܙ`@t-ﺧ(.p^ =y㈭Fp;=g$Ñ ۮ\W1;YuZdbGG 3xc&Hx<vѬJљN KD"Q62hFCT{C^.9I v$cMu{pӘ09iv=Tlؽ<r=/!xM[I}[a ^&{HN (U>+g&Xoog¸AUZ_''D*J@ `QCYt* q7 s"#%t?TP#A!jzbcr(*:; YtiϨGcA z%pJ,з-Шiq.`<(5nldkEW{drwB;Z5z9kyl^7mY'ž< UeV[HrS?V{Tn">5?>gG3Zѻ2X ڌ 7kM9OB0+>G HZ|Q%SO cdey eO]5ӫboJ(osټΫcgF*IQ830h*.*m/Cef,r&L~̳^g"@&44)-*,Z|_Ըt&%vq>JP7Js-lK;l'v@Ύꋝ/^HЋbQn{,Ad"(F !^iz!׳ZO^@4Nzd$R}VcdUNڙΧy!ܨ~IX7gA&f=7?^BU uXH|@3? HGo^MAѧ;P^0<.} [x^"| n3H1Q>hC@YM#IvNԵ5`Q\ H ;؍G+(!RE^ ߂Og\f:1LR䲩 .`oYŠ;Lz/Q6:@t䧦dlOgBPJԓ+k|dMuYj!; zs}E3u,aHFq tR-c7W~#rkeLto&bY ]Ty^W RUDL~ 18oOͅv.aV1vnlԗjv\ "=LQPF@m[:`U+15_28f`2]\<۱Ƽщ1%]O|fM䝴xg?)G&DzAt䱶LnHvo+t@u{*:e:͗sᶘeuQh58uubTgl3:Iܴ"[SMbR#d=Q+H+#WjS7q8/i I=aVhWR#E$!Xm?Xѽ_yOІ Q}q~e9=JUDa\!۳Fko*(&*@^)sF p,Tt[vE݌:|sȈZLONIwXᗭ6L4ևVzqѨ?2"Li/g{#ɜ۪1MD\1H(קgwP*<ʴEhI#NJ(|~D0 YoYbD*d7g(.኷|lJ &NmS:`s.~}|箼pw%Y[lRKj8l U' ĊR%Lg x!HYMpiRSwU&&i.Cvx,1Wv%r@!05Y7³NHXʼCV5H:,M5dͷ%5U>4"ڦs=1wax֫Ҹ=e Eo<i M*ZO \Cr~=T!MaU෴#}jNEZBBHZ=(sr|sEo^@:/Q:2~w[+:A3V3L3=R{|x&rj;@asT; rsC^sa.eϰibeܧ C 铪nu``\]eFBC4F\ w+ {c~* ]$Ri u.OEwcwI(,A3*:0)%9,O0wϓO"?-F^x˺a8xEnx[.ݥim,,jQ),~&F_\I2p3K).%GF]9<Ec%I+rDrh >}l>obZLƑkVΔtO8NS{1d3ĻP1XWnq<1>6Ag ZS;.lOOX2h1ڴցFl ʂmŹ1).8%yh(ه;,V<ң`lgƬ˹7tq[''2pQ+U6s5Q]x%:%Z>e}/G#iN 2SmA(oFuߖ2F@v}R^R!5~\6k/U?=ʐV.2:bLԌe%.2`ycbEWL?*2gLyH(J ˜;A[ :(~ZqNFB)ϸ:=cjk e~n鿝1j/l)6Y%PW 'B;2nF&f!?5FHD)?< 7/7T# :LCbW8c;ш8qnDO7! zFbn`jCs]|>|ɉWA݌VzI)>,1\J^eDզƧ H,o+$&?c?ZtW+$ v<.),:RTx}t:Ub^whW6?\Z[i[ܨp \3:+ <[#5A攈*(WAڂ4=%;Μ*h|7ߺ6I*ׂ KCByȒ$!Y-s"wQ@]QKy(jdc}K 1%WB;&_fvMx,e:)ܥ MMϝts<+ c,+.<+ODy`Uvn֡Rty ۫`/P9oh yĉ><Fl|F7d.ν H`(./(7? |qj‰zIN#6l7Ox.)k;.ߗTZƥ+w4gU[H J I'E' XNPgGUt^x^ 5M =tciD b}ewiB7۴tEa)-7`b!<!DMOq^ɋ"=?鹠: c)Og\>7jX6֓/jQI{r ShAnr0TeTؖ sg0dJF)9jfrْ:h Ω.3KJS>]6%%7owłIQnՆn#β8kk2'eLTXu(<cq %ڄ7R }P/I?ҋ9O'sx"!`"(#mpU2UekE߂=͒4xoo[=ow*Srg;>\ o!ʍBw ktFSi}w(غϸɹ:!OSr0/: ImՕ|J-Yӄ3w4 ur`kzbf}em7>3 a1N\wAeT7ۛ5oėbD0 vaNs#'ҔXNcӱThƤrL.bq&{LlV҄hRw7ID ɹlV ia)+ ^ьMDZ1Ed:Qb4Ǐ yܚ( <ß3PE!>+34*[e1K͕s6:`|U7H8b,6IԲV#Mo蹚_ qDC$WNRҌKRny oޗz=y,7N b43wJ2B7{2ic# S\\g L-i뒬 $ûl%.|Tj<\Cf;<áܖ 'c6]LȍdY 2Wx}mR4z * D&*vVq-CK _ַ'F7}&24NP;趻IG)-pi}Ov>2Ta$B-Nb l!Cm1i<,@bxZ ŋ0xfVѥaHVM;>*t;6Z!Һ;VIžd{8#,ז:3u= j )22|z {;L-į3&ۗRbw"F4KےS!MN>m|%>*&ZjYA&^L>;(&ZV+y±EvbC^ o,I늀c"RbD ŗ-wFZuhmDžEt0v:Y\򓜹 \ϓ'"޸F grrlc?&iPF|N'wpoU9ۣFR[!j^Xea ZģTqq#1fӗ1 y%f~ӡyJxJ%Q+cLI=֓c-a;! 1ՕrV3WZG[e#_Z4:ε:B l;yʴYBfS/d+ɟE ~}ZB$b/U1`aFdJQV(ە+K7|J, FOuh.0Joi}kcՄ}EOB(i=& zI*J)tvψahDFIՖ ]#b,$'a|w!')s;|zs\umK;=sD'DjohQ}8b-grh p:{DžaƲQW&5'*Z~9׆5gVŬs<бm !I z.sE&3&GNNƻ￝-yJonaVmaܾ@,eK(4+]ݨsT_ T`QdN ZiU%aj7M+[P~} w()fFuK EOk~ dA 5/A ? " ڙ_]Ü"p媫dH0P{-T]1z'w6թDA;73DGxч~fDþ[C0TT–;ya@żo&)&,VK5b*^ǨkkU Vm-=<,iG1& MtCQܽ!uXםGU'Najc$/M#iZ7"Nh0xo? `v eBy$n ,)cItJ9j(k$L̓bľ&@)%##4-PG&;mzٿp ["r 6ئA˴AwT ܙb A}Wo8f»oxV݀C̀~8QD+Q讁գS4̗gFW~ٶ0"H+i UBd G#6oߒNGT&#Bg,w[ݫlJp|x6I;@};[ gbmQED7GLD/}"NAC-b6x@dz.V1;hl/'ͶļјE՗}g7Ymj/ĪȤkQwK,ᘚ犰2acL8mzB =29 i@/@=hxbbC$'p[];=K,>YL' /Ć9$5T"XjSS|{-C.59˯z,z/biOE֜a0R t-Lρl1AQգ["Ox21/qWô&Qh{%w&$9(̙Hi7=ɇB=DE,>S8`!@rYզ;p}7jZyZƸ3pc*&3g:w= Vw( tN'֠*~)ol^]_W;Rc1(ކ?v% П^վG-111PB`K{^gv5~RG_*+Swa 曷H$O-o?;q0ɪ+ x[<ɘғ|a[Ee8mz;"JY'/X!b-}FVEŸBB./+C,'` ̔1ûR8oHjmD (/EJ B ѵq"vnPr=H/. rt {$w?莶8591k3G̅h!<ioy& 6)/}X'5PR_ wFQmI~]Ka2T27:=0s`BZRsru)=a,.]am;7!)|V'-`XC|kń|&ɝ:;=DžJ+q<$#SOɀ6 ^2Nһ| # ^탃GRom'e,T?ߕsޛfZ4kޙ'bZ%8DSZ~nX^S4,I2皪[S5Cq~*vxy=Sπ~\ M,[g"> [n 8Vɧo2e16)0dNWt'ڙ ʼn_N-; jDGMzF8Ȏy) =4(O8>0'I?Z?OU?,"xoT.-rrcWr~o}ޏf&ӧ > |'8H!&79: 5 `EwjƔ%*`9%ME?\ MUqGm- 3[k1u\mUk+"e\5SP7?W+{=3.Y7US(UX`Y68c[w5ɚ䆗FI;BGNҁ qAe!խA͖xF.W*&ăE5"sWD㕹o^J8^fLHU f5D$19}Q 0Ã6ڤILmCB Zkl򯒈.'Å)p}- J9g!KAͳ~W mp͖o.w3Ϣt[vIbqXZG[bVϕ`lC|h3 ˫6$d">pmRL|kr\k?Ԕ@e5x Hl`b}I> stream xڌeTXR8]w^ ܝ!Kd{8u2!PƉ ,,`bbe`bbP1wSmmxv8h"N QY[`ab@ :Sڹ;9<+ou5 kdy42(G3'';FFWWWkG[StWs'346@or 3sXʶ&N@`enq)9 eIa)_sːFFv66s+ @^L͉``c-H$w1AE(dh`nhnWZXhW|"@#PmolbnclW*v6@IHHi@';@{Ȍ/'*vAyx{L@M.@3O"xffhjn: 4 Bf_~͙oͨ"*Jol,LzVV3'-``0(icb ' Pƃ?lAc Pm&v&#][kc oLbVVKPW%a`mn`;;D*6W3ݖ;[_hYmLAOQ h`dd V6@[G =/FCԴY@ЂWQ#[6``5vv'3henO9 e 0uFH No`"N&o `Xȃo <@6~#o`T@6U#7ȃ dRsG" 3 (^C#2-N#/( g/b6X[A`4\[EU@yVfb򇍿ض(DL[M56)o6Ș~1 d:?D9nvVdzE06*F1ԘTALGE P$Vf(et2siPN(l8A]p @PM=~tRF:}N@~iֈ7Ȣ6Zߕ~wC͙ > |e >[-חL3J-HYH8|hNWKnvwhhx' ux/`'/zpR KiP )b>hUz 8Q䁙aMAlzDh8GhGӟBb w0(dy2kEWMMW0t$CFpT("6:r+-c?1K3jg\`&qYr<1#A} m|zTl\GIP͍'woVbzq46TQOt"3Zy^#қ>b*Z\mnITKys+:IQ0zTOf$5JG۠+RiW(0^QS'KPӖ\׏ȰOW Ī s&apM#xTi'n) "X ҍ<7:@&t1<]*o39k( OǾv'S<#= 5!o]7ر: vX)sdŨKQgfvGxq@<# lCma=)3+y)ojC]nJ%L'$;\e3xMM*'EaYlO(v9q#-0MxDdu4tg(-*u clj 9,4PushR0SUp\Oqx0K׀Giw%  r ~79.׷}3U?E'x2B uMG)t$1!)5X]˵7d4vE9:1k[E";h-< CMGsL/``wǗ HNcrw|t5u^gpo#%ThLf6⻜$FcI1QzK :ij&idbE|4e?ߐ¼c&;~/$qrއ}3U~5 7->oȔ1 Do\ӢAjVyiB:u^)K֚Iw5({o[L9F ܈^zs N~٤չcctҢ:QT #3/+wdt/."ȯ#Fb4#ibZZT qh/cz"5G¤.n VS%Ily]RֿSBUt.uNʈSuhֆbbeJ̓,+W$Tm^kS=[x;#qV̫rģc6Ӣ|nroJ.kư hmXېf8>l1ُY?>Cya DPiۤ)QfcoU0ĹF!>yȰRVQt5Lyҋ0p@D_|*'N=c?8 #<:9b[Kȼ^%S@ DlgTu~!=9F1Jv+d#ϟ .-Ú&d䰽uDSGREUFtYi&OfPr(0 ' ^qɩ\^Y0TQwl>0=;ۈ"\պOmuK,w,JC.zj[!0297+ӑOW}5 Myf-FE·~Ȗ5X 3u/i7 2wGG5ۤ_):+q^v5\ҋ6_zd" N(ۿ<)nRQgOc##|Q~'&k##3暟4i]B[nQԟdK FR{ m`cx3m2c#_MґfubD:C,_YgtsNe{t%P68t:8ʤ (0 ߩ l?|>۠(?f|Ũu3qZ{zӈl>; KA*K|Ni w_K+[etjA^;8]Qv3X[uJ:"ej:|ny[*0WyA]qBLfE' ە?$I,e~}U.6z/Mvr-}sb+LuiOlL/Jȏ#O|&3o}[vi$!jqGD "t ;Œnv&Pމ -;)(gu7e±g-Ḓi20Xܗ)ؼz^TT7uBHɆ7gdd;_tpn<'W&43`s0D{-;[' Ҁp8q@!UuFNT9<)+[>W0JWû"'@`韴qjG_/ J֍@$EYi@H([_ld21xwf4U؟_ 'sޛXmEb:amvmp6vݘpMhl\s3ݽ?hJ5ۆdZ.a}o4啕緺"tV] Έ 0yNWKC523$Uecwf% Ec9~noKaN>IL?#9Q`>oU6w75HAM/4'TOM_?c QEb/:&VI_im۲;Ѧ=6o+ BUu))q;`ag+gYZX͸.DϽV*_I\gcmp$jw=~qe1''CT@ir:8뫿9L9rJnEϦ0Í_'ȔN|mb>jӣB1^l^W9R3Vbvyi#l)̭,ӣ{!le38!4x!gz>M6/q,P,*cΰH|qƠcȬ)3Q<!lD1 e^ u5/b2Ɗw,t۹L<8"JvqwTn3?7XzzL<'n>c8қ?_E*Y0h!)w D_ P|N=HD2Wgl{Vۃ鴉#]0l2`g*{~?tϕqNZ6kjX [<I'?D|jRqEdg@u^l@nȚ2ӹY`SU[8ceI^g@|f,bOm〉5'?&?K*HRz8{WjJK1{K84Zr#Rip ͫ೺b|kӝpd18L D\e!!,s]Ҫ܈5RG+:ͨ:Uz2OҾTCc+[+`^K`q4drkGf3't]O 3S,&¯nLiҭGLDϾulXě]E*82.w/YGh W᫳v_Q9(߾=QdžN/]v3LD椮,v di5L}͗'NL⣓<=4M,}RauNޏHZWFl_k#d2^a?WlTR"eZ=Jˏ5:{nG/rbD1= m] 6/)z^jWUT- hf`iZ2 ͊c[qk5-rF|m^wbvW˒#3,o>7}R5hdq)cfL?JI@8Imx*lߝĭ΄d~7SOΓ AOb?qcM5"J7 L7XC5"FR%wc*Rh3=zԃ ;VIZ&7n dMuYi5<3-'g,ծrh$G"F(_5`'ی>Kaۢ# 5­.BW0"{~|'|Ir7"^=ۮ U$adjEk+8 T`'dWc!ҭ~b-~#*HFhe89AT/G> ,ֽ}hϸlDfi 9*zP`Ov&t2VbΌ͗[2ox~=H{{Exf8W(2SD|<]C60wa؅ 2@LubSCuU=+:[ '}nP]8@%Dwxk;7c#kX-e$?źKXiU\XBVΚ0# ~Q.#CmO[W8wNk,͕$Ym]|VXۦ UXPF,mۋDt{Ҕ7o (ĵ) 90dSɑ$v$ ١GAh.S<@F| &' J]o{!_R'F|$9S~Sq(`9V|Eґ+#,W='WnAN]LtkBqh˗5dx8,ϐ^2),'G3{G=>ƲQu9NR| s[T~i] 'BG=[DN{o}اR3$KZM2ҁ?Q2r2C vCʾ6BI5&2!cS,&V*ԹLl dn8]:J3ifjH,oе]͆?vq,]}/!!X.'% i|YpI?{ԙ!RNV79ϐ&R뚚r N !H~AYq@MR.'U9j*a Jθ[B̀*W ӹ=oOvtKYl(T=+8gGpL5+NX;}C*!L8{loF_ntJd54W_ Q( ԼQj)K; =qZ$b!%>Ty P0Ơn]ylJ4dYr m >o}OEh/4('5qVCy쟓!_%3&[o,]D֡Ībii}MIiY]n "@;<fƕ)838<h;$C|hW8IQ.'j!?1 %`a~mAbq?q~x>\_0}o(LB9r˦Fy+Hr-h|Y8W yH$Ld|fq˜B/ D,le{7F"\Ou,0YTrxzqOҹu/ʴ=fi-0_`Օzڼ[TUS*/>(ZA>EA( H1 _z~:=NW,ż@CP IxJ98bd#Jj޲ǫF{ԩpы!uF>H倣pS{Д~?YŻ#«r1S>="gnIm`-w.S~~o>cg7ՠx]M]K19ƻKy_:}ci/v4xDǕ0)m8@"l$s Q;+H˞!sVa <~DzK!Γg0\(ў煩bŒ>ˆ|eA>|9]+I˶K&'`Ȩz*C]ijJCFO&e3GKX`ye6˯Z V%G^!mÑ9UAW|դOښԄXq%P@wNLȥx04 KU#BRȫ$Vb>x(&4B.~!dӷ_EuH) 14HU;jVI:৐o>#9ǣe۳ - }s]%ƌgP9uV8ӅƚgFbsΗ<'j5,Jeg8y]瞊' OmP S9u!κps92`|/N?9i²ӷ-BIjc[Trs]Xq !GhMX"k׵oX~g^ m#N&vk^q8p=Wn2o$XGPG5 )ҍ*hy~ ߎܦm rimUtA7% h`2'; A8p$nN"7oCo<$w  R7TF*'lC Y&8qKwZ//rn!s]K+b?9I,V4RgGwԗfW_"xݻz㵊ņZ[nC sGEΣ,:܆+LT;zz]a[e CڴKYc-ʼnD}zȚ8>1AĪ5|<@oH x =_hG;6WU3}0(+7ȓ-'޿$=A?gF Se)ի6|і̂wI|\#V%jVK|G;<~)]9>YQo~ M5zUpKBJlvNC{y7;.%jyfoaÿ+i=w!7 sbZʋ9($u/ަyi+-^"#K~}Oz> KFԧ+4*A 4YC_? PQ"څA/n zc(-s{O%^ y&H>4;IsfF~o,lw(4!V =]zy GQ:)⒊<9f^쿂هk(Rj4W0 ݖb-H;eWSD|vޠ$'F8ױftݨYѸGaSRO-oװS]p> jsV1 zŒV3oz=_r'$a/Lad$04Tzz]ĨZ.H2ixQ=ii82^i34^Zb"r^ĴMZK9 5Y Ygc|&) 3R 4w+2!UW15Zu 9~J^ZۖB2|GHBT@cq *KWmgp(\*޲pRV[У( D?GxZndN̂%Cx!!%4_ĬTDu9Cu(/>]oZ}7/HV "sPVJ χy'8T{TЪ[f7%ǚS:} NwIbs?&8´v5FSiu_p*,\T!q~ev;oݮ0>F.?p%'FKm\#ZI= @ &qfa÷F)-hu"QEsa;}-)5n>'y݄50y}Qj0ƥT؃vR|YDt0>~}a*[PFNf>P8$3!]x{ېa:0 9#i8P77ċ,X]Mǃz$ğXqtL8BX,4^*J2&h&xtcs8/?c/s+sͰ.OY305)'O;M 2~O{p&EJy_%뿠8c s<6Wi/2"]˄RwR9F(7![C-}C=+x2^ ?]T>J }xJm`H -:^8!.Ó;#F HQk>~: <{F\]{0vGpjLZs+5&4J&eG>eӸŦihb2v:/X혧M' ߩ+WlB"09HrO*zܓx=kAk =#L2zZ|\ :Ilv`d9{Cn$F9JM‌~:j2|l:DWA3$)JWXf ̡m7~xw4ˊ/)ōM<"Kए$R&;8O:4 z_QM<ЀI@v;T$ =z%~ I7^G6!;pCA9+AɁٚ@-!{g1EO7Os K.ݾB}rVSe)4e\td&}[<ϲkv~ߋ? cqk#坊c9Z8V6-0.E 7Lhy/Z>93)J@Ja&:B%C]6;e8pLb#ip\A(w^O=BӋ DM3$ կ>ٕ(a X!܋O6G s0W^3L)J.|{&Hf4MVѷM 5W7nhJ'nd2 =ygM=mwf{ IHV(O~ |ޫG~f^P|9ùk$ 6'J|-rtrl>|Y'qWL6mL7"l+o-MW|!<`0iZꔍDdkbK ~Dg׿zտ7U QUvT>4%\2n.&@7wcXN*oᦾ+#ĹIgTEw Q;@`00]2$8%1B=/#Ƹ &SB%C7S0zPbUQ/ ܘ?:M^O3)z+CY[4sC^BglyTPLgbZt?:TK*:qrA > stream xڍwTT 6" ]attw03 %% t*JI H 4J ]R~5k͜gae㕵C@pH $ʪC@B=0\?<=ԍNq@UO@@AH/G$|*E#|=`:=ϯp@ zS!laPRpH;Pn|W$xP. ?!Woh|# Aax@  GބxMu@OErtVӁ=@Ot&Clmn/ \:@v?!.HM< s8j(!m=`n($#47cV#\]pg 0}/%v?ayaP>7*tP AB:,epo`@`Л\?$ <<~i+ lQ 'j|`av?V̯j@X7俍rrWT4/# HfxM W &PD@7_,+#%O_v?;Ξ@]޳VDd.T@a([?YnһPm @e9:[盷 f[LЛwIE- /.a""͕A}~#P7! sbO՟$v#i- HB?(oKWs7@7%zM@>P[ TSeXY,7bstIWm2QNQw9kR∑ ZAdbײo^6(aH,%zd7A Ì=h2\][jU3& 3&Ӣf7oǘ0,>Ǒzz ]Nb.ť}'+EZGhi]j}>P'd!DNv:r>bntdxݎ}睭mMڤXlqI}k"P[#FQtC\e2Ip={^~ رn9L%S "0VD).>a*%,ͥ/=$s7l,d֗,a!)e퍾iI}Pk3n\Bʢc{'BtQ*[k( R;B&I'0g[{1MerXh͗X-!b.dbƃ?bssngt`=)܌sd`o9+>u!T*k yu/`G9pggMNe/}ڄmI Ea&qZs@뿹l'o+EjE[m mvsL٣3W5suGwV{w0 woS'eSNqVY +nPllz ?^n^Y"3c XցkOL܊hB+Ak }]ZT]K r4; HrGY%u&tNiDe^nvۃ>(?c'_K U;S(d}Z{䚾ƖJ,H]WwR\>$o"ԲfFX6 2V^BLpRT;}bꑄ2lLA[1A4eGݺK o>#$NVija>eax T6UijC`plQ7r}_Fal.)gXwNf4!;fQDX~;/J j?ŋ$Ovn}79N ?*>><˕34оC1̣I>#]7}R8Tb2\+%Dӷph{$;Rw$?KxE'g8}j~u,NkPOޛۆ[8g^yCt[y,q;Tf"H=? 7^r,ۙZn1~ITʏ;S1su}3ވ7Vkz؝[437 _,%+oK(|LYVQnR[cse\$]njX/>d،0َ@rn3. >gJ,=zSuvH;Z,'CcC\ϟV c'#F/I_2..X: 78^QۖjŞb\vrPQuػNm 8J7h^QOIB&^t.:2N(5D(|ɛslٜ RwU[| ئSU}!v|yEyV|j>KSrܚcqpӳhshxzɸ'h._ogrz^~fت@B0Drݲ1kw&NR]rbd97 lxPfLiWj%pv hm\4XBNjQx<=}χuPɲtΩzHrX>_~ڎ6laswW;F_ R{0u˼',O; cDxOu-CәcDh%=!QHr#*ՠ"š:GjP Y2Wӊ X+w0uӉ}Ƕo`15}6Y*ґͼe(* {ԐLXňhÏJ5w]RD(# Rp$y߬K.M<8-Cz +Na_o0#*SmՏxHzXxbm×<`\7f` pkZ2V֡j5 vl#0w6":[\!>$ bV($>eytQ3Y՛gDpmsɡz(?Y pl)ڒ.)9[5"'x M>DJ{X&}ĕ7G֥n%p1&o I8̝_@=E#C0iZBkpZKԉG&Lw=*2U` Jʨ!,TG?$iؤih3]sNg^S@n YKz?$(b lcBUXbz/EB{0r4ld~kdz_sS:`5fE =ͱ "$y.ZxKFr urhB ĥe6㠪sa0uen(Ӄةh3i>FpKZyشԡ;Ȩ*T,rq;ϙ?vD}VPB%Irl_?UF ך^g^0㶰_Fn! 9]=dU=5\ȝ;쮱}7.B׮@>ŻY:\_Um#p& % efΝ4J$&jc&8gZ~D7;NIhD8juXjUu q\TW ݣ(0}3PSanI6d8E) b~}JgZ[9Y`JdMHHّQ~(,Ϩ_fJj"XNaBwS"#DpNݡ**.KG8m0CzW@)7!"3dK_FJĜ4o-+o=yO>4NUk $Q豐fpҜ+%T{9'^gtxY&]nJSL9Mo[DkNV\Mqcn'k9D£U\IyЫ"4̱-: 4jGkuDyGZ| Y00rmyL)tRyTe,8 fr2E_#}"9EuT v9Ѯ{flGeҹt|RUˣ(l N }cmIk }'¬4>Tɪ7Ucv<_X9 3 $l܇Jf 8PP8Ny1SecxSe5%-QbW_w48ꍜ’֮c~LHS9PQʦ3Jo-0 kշ0_9[\b/x)eQGեY2TIL*@١㏉zA?pUAO3޴}Qx:LR_reuosQڢ\iڹe Y1zsEfzT+ 7N :m}n!]h"VcVrX" YaǫݡA/mF\mt.6\>Dl!HpU7u;|3c1 uuʜ塯I^a ĨJ emĺ19": 7,E"B3Y5ƳL4ji,kh/T2ș-:ewvds.ދN/Ke7TN @%z;E:lo_U 740Snz#H|HbG#TI, T͝M(Š:|M.Y%Z5F`P:Lّa3DQG.Bu7lD}(k7FHLP'ƀZp]U%'+pBk28g] e{ R>}O.g75C eū^&-WD}-FSİL+.{v[^ezr}lQ/} #QVI| endstream endobj 518 0 obj << /Length1 1403 /Length2 5936 /Length3 0 /Length 6886 /Filter /FlateDecode >> stream xڍwTTm6!!=HP 9030 %HHIJ"-)!! %!SZ߷f3{׽uf;OiSA"| I6.@ vPp$B? ()A6p K I@@!H/ % Txm@ $`WDhLnP.p B@m悩8H(W Ni4UR@ˋΏDrh@\`q xH;b p( ᎉ@P@Ly X] C t3W"8w0 EB>p= hѼ@C'Aw( vw;")+ 朕H?%8 _uB /[_Dl=\p7ҟ @ qL :*a eưuE0D`p; (: mP4fGɎ1XcF>a&P3dH?]P6V4^7ЗOB '$  Āb@'۪ȨC%`9x9J :HLÀHH\B_Yw T<8D? Of=h#12A7ap!#1'(P?f^` 80=;ף#>o UF@D($zA >`V@_AZma޿G(@1!@ AWq!/_i(F{ۏa0o0>J:֝{-J $@)X'33&4T[U,uNfF.}b.9cVYg>J=f`!5IV`,@a1F6ڷI8ZQi\Sk j;{Aɕi,mfp\ LCgmy2c/]aڥuPQjk'^|0SfΨ+֔g`QUU6G85xOG's9(ܜ!scʻ:HE_+ ӟF4)27f5}ٌ4:ip#ilɖWcԟ..P E}Ǜ}i͟,BP9(ishv.ޱdz6ypnpҕ'M 5!9u,'LOQ "@ó;#/ϴ[zO옊40~kQ#*ES3 O nzڿO\#9%!≀i(9C,e,xg%ϭhIt d z< ,{:qI־[sT~u"Ă'ZFpf9)m0?m[^ \l9a]#%fǓT7vr+mjnۧHg]F>4xCEΦUÂ8ѹz}ڦ#kA~ͩa5 oqPeXq:)E}@ޗObqqRGAknyDby%(cjz'xw`r1G#rZ$ݺa, 2w/{r>oҎ=%^?t kZ;`x .x]-Nsf;S۳Y׃&r_, pxg6i;'UekZO)4|HW H@V:ZZ4y)Ѳd`9_S8`Y[Hub&Eaks%B)!r=ۨ hҞxSW] .V@0U 3i&nnc!wZmydyLs :?f̭<&*o Nlgʹxkl{BT*phxOL/{$ǰD&xE "K[6>Gf0'cC/?pgNт,gQ?:I*_hU+l\Ί?Ӂ$u5p^`/`~Zd^(<~KfRpqO۸|vR>جtI"{ۋ*s;VbO`@Ogɐ\oe=9NL":υ7Vm(J\,},4nkv{_| $Yh>QbH'dpGn9kOX&>YpOT /i92f-9= S.<D{_ei8Tг'#U'c$:g5AdlT_o_yj%Pl#"R,eBmda.D `|Q$/*q&:mx(k%/<1AwxC'&uQ-Rw_+ *U8 zN }?Z,a&ANhq}O.az =%rG#Ob#-߭ RO}݆CYZ-qVmJ!kA3aC}斦xߞ\T>?Xx`9iM>W|uRpT wu*ۢ`"xB77L5I +R'Ia!s,TFx^KѽpB^un3i&+L#SnH Qij8ihrl~QwpŮ+vOQӖ.Ɵf dǐvsH{%IA9 zgn֩tkEisNq; ө~mM8qgZq X`O&I5%|)yjy+ gO.y؞D9<']+Yxk[׏^Iv\ Vht٭.NXT Cׁe ݊s}6m7^@L}kЀ;ro&Y|yBjȻoVm7>SCfU;o4ZZRT 8 0ˡ/wݸw X!an`ȕ/S7ɨ _*B^Gg8H`^f%wHvJm1V"K<SX*o=e pICk(q;FKO)|3~wۋayy8s͎>3eK׃G<@n=9^5I"yȿ3:ޫ=p[m2[H4قdf6S Fy,ɛ7ePܥ?7,FA=5T#4\nwNɄ~y~.UՏMsP9>@b)lSC=Yh%X CzPЃ3f\H+e(@1\Z,&jj̢t'MrBH~]n,MOvժaARnIęgRf&B27f/]ͦ8 y.[LNO;=dHMirodpTܡU,tC'&t o?˱-a&2dJ>py:.VWA.:u"4^NfCFϣ> X748/}uk9Pޯ}UH2䒅12UE~Q .ʹ^ 7d bv~+;i;vWu(sq@Nb 9]^4c endstream endobj 520 0 obj << /Length1 1622 /Length2 7285 /Length3 0 /Length 8365 /Filter /FlateDecode >> stream xڍx8׾Uj;ޛI"!bS{Vkoj+j֨w)iW+<9s !<i UA"|@~A 9P ((/((DfCáDl&P " Bc0%CF"pPI ""Q% h P7"6E7 f x䝡(hPgLF00DaPBpJ9. g7~$^ C; nP%r) `s`C{PPPCu- Y/W 3 F:0=tU^h^Eݐb@s`.h7~7F_a0Ǭ("ѯ)PP0ܽ,keC@~ɀ#`Pu?9PW + 7tad@avP @ܡi@``4jCCXcꏂy,1zd0J <Jۨ E@ P &&wO/Q=GDu %slΠ3O?cހ!_Q;gw4f6 A7@kC!0wAGc_8M`?zb`ra x 3z`')o3YΫ#!FPHDB@DD@̬B^[ @1.FErala@0[¡&oLuBQPWw?d! Q CCp4#\0-`._ ŘPH  (wkul`w wck 榑`Pǚ֋*y:O+mQq="hZ 6{z%c~tܟ/ ZJQAc));yge iGR(l,p-8Mu o̿lsz$p3Сga?5gf]A?&~enn/W=23DvցΈ#$g8{ݻ "g&ʢjd5WlvDAN6^K#9QXa\##-4a䤔NK^ϗnN~(da膒~,y-oxVq#!B+͜G6E:q AGbK9 W֔O=ia|m#xTRx!zӧuwHR~{Di;*Z/iV\쥊2i6:O-%Xm(uUP& ^d%4 P"6 h.Xh`WO՜g1Y"es5F X=ᏟtE{#۫??۲4uS n4\tHg;5g|u)f-tKӿNׂ$8n`t\x;}=i- Τr}q5JŠ8%`0n c7r/K{.K^d\a`PiYN> + ,ά~+fֽW S/i}rKCE_f}P)$<-#G'wVJ2ϛ,^(6 1A֦.x4g'v&1I&eUK~ ]+*k{R>9z@1y7K_ɁtBΚ7`[w/Kk=2( !j>NsqAzv%hÈ?0l=x;bcQM7Wn/]-$<ԒsW SoXeOkdW]Cd ᓫ%mIq5R=zV6,'.VQRru;֙wJm+צ8.t,pOX Ͳ bwm&ہ9 'o(pA#í,r?%vݥ9[7YH,\_6r @͜@j?F,]0R6tw~ [_6} [Rj%  x2G=ƀN>P8_U|…[ue͔AU==v3Q]m(k{}V#ZO#=wn#UzOy^T?MVj|Ң9S:n,L>#A2H;iy֦(ě/Wlu-j}!}Vc4D/YU'SԔMhe] R-Hw*D͝j9>ycш>`HxdtgiMA7l`+67ɂ R9Nb/w{춟h.fiO, >+>&aJ#yƒ).< lU/T)fTe,ފlQ~$V}3c! cfW.DtD2ҕkA8mOHޢ{Qչp'7ka%dg>Oƞ1J6sJ~hvW'!- *,U2[ا<5'BiX&Ƥ,x!5,WfJ<.?D P噬S4Wtd5v x=]뽵1НH`(SejM.2W[M$yQt}av.In%2#5(dm@e$ rزG{^lY'L<??Tҏ-IέpK6тڰK{c$bJcX .ЮfξHﰎc]h{~rezWHjCJ/.>b$:F#DW.M;^=xi]X7>IvmXDj@PzI}CT\.ſ@>z]*/nu, /c)zy9n(߂jB+!mZYU}X^~nn^jR*kxn5=̻4`gv,)ΰ=:/jAR( ]eP.(ehf%AoWvʽ.,WvL'U)蛺߾ ,rIHm\.VVLѼTz|$kcZy'w# SP`ӔH*@~߆'L7NT(r]{|喷fuw)tI}SlJ^Gxr%Ʉ|\܅뻏:?`osbY!uW+I|tct w!zGCx`?zixْ2S ϴ=:lNSz]`O{J**rȸOW mA6h\ԭZz]~aJC + **N䑬&P?Aӱ% 26'\rPSYzֻ強MxXūy; u 4~PА^),=a,{XIb-/7TjUZId};p)Be ̃1⫥JSn%hZN뻢Mt򜶕~'r=/| s5`m;57 ' ?rYJөRw*8)oa=:ݫx0|z?,ęo%psH6y!/8-rrc%O ~TrBӜckuR9bWۖ:LM :nf+T~/Xݯad@Q/t2ֱ ~:V4z3*] &OD).%J7\a3^3O7;qk>xf ٻB*DA ц\n J'(r؏"Q98Q8Sפpy&٭Eg~EX^Bcb>7ɳQ?کZJD%sIJse"Fkjh*&:ʼ"V#Mx`v'CyĬ[+ ꦈ$@x!'LfS6 :oAMY 54>ժdm &+PaxiKsL΅k;w*_#^h Fۼu2lc?L_ .jw4Z& zg5:B:{iknj0^թ5^ s d,G!Mn=J\#/Miz40Z)_tB|2/oGZ2ލrq1XKZbq.LAQVCV9aQ%fQDJW5#A@G}5 endstream endobj 522 0 obj << /Length1 1475 /Length2 6664 /Length3 0 /Length 7669 /Filter /FlateDecode >> stream xڍuT6-Ni:#6FK %$DQi=9>q1??@ء=AH( 8P8 [@@Z@}W(O^_wO5`+v0g(P_]_ g[A؄'Օ ,H+ŏ9(  F~O׎3Y'8"qw0ܡZ`!?= B݀P/W/ Ò P? $h- CG¼X }dw{z*<'ĀBBb@ )߿&5:?v_2\p2/o.W@οÜGs;k =N5sw+q>!Q~A?8 B `h!= 08z`+u VAa;Ś/ AH$ĊL!M!P hl h@~U\(  zAP7wD A_Ec 7,pQ4h+xDb[RX"6P/(05˄: mAZƘcHmdq/!/he]ܾ6{(#Ao?,L`x%%30vՂfԚ&s RN&^93"խX e%^4,X1lan7+Ud/OB,6sNbUBv ]YH89K8<>cRu ˺t'@N@yrLgfNSPvd.8lnG{"Y<ַOT qAN| 1i.@WCQ=$R5Du_llfocC"JhP&X}?18@v!bgU~zҶ&_ b=3_8M￑"-Ţ+/Y*q߯fp!/@Hg{H7GY1d<@W ¼& ;0JDYO$t B41T0!^K^V^؇/U=b>`ZIck& ցkid0 巪_$#oX>a>38`P[+O:,z؈f ),)[,!z1o$>>l?ԒLMjeH%!Y(H3sh;%&}?/%L.A 8ژ5R!cѕ W;%nʪ@ 2ɨ*O;:j&wnL_Vv1Fđ5׏E/7gypGToz#g6K; 'w#(fg\//s-}%!F +nI覑ݧI7ngﳆ4LP6 $_Ysמ(9~&Yֻ/{/'x80wOGLoVjuI_KԕuLz|SH'6C΢ tahiH7SXaPwG,J4igOVVS*w߹ǽym nL_y)xSDƑDѹ*)غ'fsT=.z-"@sn\n3@HsİPg}^d7#~b("u4n d#J\kἺaK詸,`i]t5 $^jf_@y,2Q_|{0g(j;|X2vZ5X͙qLF+=-<ivP`f@ݹ>vdIgI,p:#[RVnϟϑ?9Z9rz&Y(OQ0.pu ,.F=/{Y*rluj;Zu;3 ,/9FME\ fH\&0`dv.dϕZXe2njFH7}:dV%9׿cl).ݜ;oRehɬUf6B<I("<,>R yQ(GͼPjZ۶7PoIIztÅf県Wd^GNmnCS@Quϻ2aR߻t:GEaO+>3|(:̈H,_2'kv㹂ʝ:̙e!ao_#?t~ %|QYh8qS\ed3lQW#Er:s7t^wrRg%*JX3KK䠤eף141(>dfQ<NZ]#6;a/q V[.xH.8+Lڮ܅}+F@Dx٥&tCPD/H}#f;q A¸k$eExؑ7|sycxUS:7? l9KZ˗Dl>hj8tXn1 ̍%#.;ْQpd &zրoVC0SRKW49ks~Kđc! N+b&Kw oNlT֤yflT&w/#8Mɲa9vdǻ}͏a`Ӱ][{6_a)[fS{2\2~ur@40Jrns$t#l^s 3M:IP{#[ňHeD{*VGR^w0y8)~WCxPޭu4T>`hmEs/Gѥ0g*U5k+4.Ə3RVw)K+y԰IshY8Es|g8?.$.<8S'Pc][K_D~T>U0ݬJ!0&<dFV_oC[5RSyD ;0WPf|cGtL͟O z}gH#MBD* a ڑyjZ= yzQW 9ŽMկ7_* [^9Jq}(Ξr}kW?=_taKK+a)swU;暹 a5)"b N&f`$`E6>VםT@55fsɟi|V6 sv)1ǎĬ I Ξ>ÔfZl(b7o>)Ke-a6iJCD|(Ȓ}ID? ];*A mV}ն"@Yd\-Enbd=O ȘO ]]?5O8;G"_m<{zyd2 1 =q3vRIxGeb?A}! `KnŴR Z@~W{KNvcШ<jNvOTx9<~A o{ˏ5;[3K;=c{z"[{(' :M!9vd3.UӠXܺ/梬=4|'U*H5ݐY'F-kӾf{K_2x>>e"MzES $B(NsDx(rW[. yL_KAt@Y][yIg㢹!j% 5"Y*G>q N҄趃gl憐-va&nDll^|c}՜)a/E5czzhzr@z%QeGfڰmTmg)7*1Ҥсצ4s=ChY|= Hi!RKeTl4h)ɟ9IpS P+ILATn==׀ӉG"D+ܪ KɼYP#3̜c~e1~+5MpN ]w?38Ofƒ?ϡޖV-K:J ܲX{u\G'G-k/rT0Mn`gV3b "+iun>23&$^Q+JBjvPEK:6NjdϿ$5².!>8sEkG1Py@Dfm;alܑՈvӅ~ CvW"/}%WgV E5yY <޹m%`Miȏ[sTC6JG^!=hĒ IJE] $d;ow@V|MwiFO+*C^B߂\īmCkivklI'bDyW]2pk7]?Dh0qVq'b&OU͛nf Rs,U$[:=V6A]3n\KP]ov7j; 0yms#$ KkZƔp|EV;z}vfBg9{ 6zGq JS{|&>nv]ۥHuFjey~Z ‰|{O.o7zLfMZk[=u_US}P~FkwG1VKƪ36!M*9tv~zai^`pǬ3PQM]j+%z2׻IJ2Va|\HJ2 ./霄^*LtHh9eKWL%~j>C/Ğ9#'yk{${r._\m?izUi9?ےSFHnYqZJXٓ=GxW_ -2DNۋArxMU>f0׾OomPV=ox+kNw;CkiChk~l S⻤"2Ab<b2LRq 8fBh'q~_tj6: o }Ve2\k$lt`Q<>+l9c][4vwpIJknΏlM)|Yzg$Y]24^U}w8LE Bb5E흂no}?TaEYM7=FS}cD~mYk g1 J%V,*]&ԆirIږ4(E\=(4ŜnȣvT]P)/sfL]ڨkq{9Hܲ+$IX7|m%':!n\:aw$*=O+C7tWZI]7&5Xuj1:;Ezx!d-="INZ$|RQӄ|?ο0om.N*o$Ϯad_iwbկFbrYZ:o8Up<U<ѱPs<+R9ܷg{P+-Ycic3`c`3LP|TDm5Ck[GWVe$jMƞZ;1^HH)!N*[_X7 \_Lѱ=0L 6>E8hl"E 7ss[Jfp& яjlXC[zc:*GQ[H2ߠE^q _ 2ʽnlAP\+C`Cth&=}*1+HVK\l>JRq~DbpI(aV.? endstream endobj 524 0 obj << /Length1 2314 /Length2 20243 /Length3 0 /Length 21598 /Filter /FlateDecode >> stream xڌP ݃$%[pנs+`V^wT?;@XX,v&6** k?v*-?"]&w =P f`errXXx0q6(2TN^.֖Vs@kF`f; jt63q('ͬ )A+`913{xx0ػ29X 1av^bf 5iUKSL~uہ۪bbov(`G'kC3,,fX?/)f*IWz E q-"zeA&;"`>X9X8evX̬5K3*;Y,,zfoo+`h qrL\\L'q|XwA)w~ G.,_ ,q  `/f0KAf? ,e EzsQ޹(A\x޹A\Tw.j;?蝋Ezs޹L}&N[דߘw쿈gh>ppeS9a6|S&Ol?/d'/G:r:#fwIvzwO)T]ߓ.]{w.\]^ho-ge}3y8#᝷?dSSirMJZgc'>107Ĉe>>5rg47Ym@d/r!tպ%OP[;c*-c*q/7èqϭi&)M뭦S,`2ŸYCЊ,M2x\|){\4cGI D6E_B5kO ErpNǝ^kԱ CΫ&?A>S )4'?bbj­MAp nV*!œUyE,8Eݱ(v{q%Uڙ?@P$7dUArn&Q|vN>(] C׼ʚG+29%-/SY^)""+u 73B UT8\9v)Qc۬iis@RLOAl#wOTqڴXn8湲yUmRGlWřZ(Sʷ/V:Ң;TƒȧZꣵ1*((S`5&&"AHP $-jj/9+~f~=W^>HW3[M9{RgX}cyμxRkˠ8c}X4+c>KBUԼ}XfO^f|p Ktm//l@2X$yL Tu|RKj.X'_z [-x(_Ro ;4ٯ{b$l.elY_ZKTp|LxN֨lq8.0:C;!CǎNwOvv]:2ɩl4r=Ewxz{{ibB3m@(}2,g7ouQ[ Te.< U7wzXG!fiqEo99./spu'(_;UT&FϺ= ZEl6D>ߗx*M7I58u>NbXd֛p̜sFtijJ π^jam Ep#j̐^3'ޤ(?KcS1JB<>]5;a.57 [QYer EsGk8h!]>Gw tK =(@B1;wwdg4쯂J*V@FZN1RWh¼]#.(N[}61[@ WZB(ڟ'[}YX68>U)̾2+Plʲ-@UV=}cZ30@"a`mK"ZYsf4o0 Z6NȎB(M,ЮFcgưlZWMӡV͚̂oNB[P{!(CPXjg,mA5 }|z%pZ6G; { Juxa-#UxkG?5>uxN;Y7[]FML8I>YhT.=at[n)~6v, {Q79O+U27s 7eF{#ױ:ŘQױLڏݛwb{du㺒^Oa_,)V]`тDBVBn5u3!.aT+?7880zq㌹{*g똰Q<"ECGH^7kH⦾xh); ܘqyoWɻr&k]#Up:2+6t잫T/4vyJ{5,5YN'kleNIK+ S=/M q,CuP<"(CHwU(ΉC=q͇Jb%npW];^ Io柅щL=S̫vzvkXjߴ=rob xd9=>ȸcִk&o~U^hJWZUĨ]%U)!mojI)|l9iM]>O Rs ,N@Lc^Ti-PafEwŠeA޽\jQ 8$`82I$>J[-g߸y I"Xq4.y~2-UpDZV+ϻ}ݏrI aMz7uҐWbRG+>^^Wъ0^^I's6n'ˈ`׍dD݉VS!ցjQAhj kL::$/} <=&m"w̐k;jv=ҭԀMD%.5\'W,P !}:z lOvP`13ڣAi|g ,ŔBWk6+AS,O-\uc1{QMeC;Z߹xS.ܤD| +RƓLWz2Px>g~:5xe€LF?rnFz?o-s􎰟`4FW4ʇ7 1$|:w,IC"ȺT5M9~>Wyk "|д]A >.fo!re{3Ti[jPN"o߻t'dRC,Py* <~F~sbe\˲({xMptz!esZ6I9;I6|Ɲ^oىQ6bv"p<SEV^D5nUW^9%_5u4C$w#^ Y! YT\MWS3AC\^x*10ʤiB2b/ E'iKJa?] PZΰl ";qj$5̹; ̀'ֈv;Et 9S9?aF[i+3:h./* Y2jו/C18רS?;e8!qZyUH3%䙮HpZdBK>a@]R&pT|?Q KCx;/\jJOr`9eG,ͨOy.gu7ɇ aBNalѸMHz&E3]ŷd@>A| =KlS"i`p8R'm}8]s2v?R6y+\fNd7k\#ݚ4U֨ yj__mվ+6+AGA!}bXsKa(ke3mW.wTm ᶁRyk$>z > k^mod﫻aMJd?&"=rWjV27fԧȽїv-Y[H&+(mJr՗k{~N6դ扛FyZ)PTZ>>liv}/l.O4B?-Mgj%JR W_eTw^teC&"cM{wW` S`:ÄELԖ78~ӗ^_Isg&Q/;O{jG@*Dy o"v;gu6­v?^`?C{S&K7 *i-ŗiL 56 X`šd}IbX^D_s+_Ts ]F,+ CY[;y(4)ǣkArÎ1Χ*LY(tU؍K!bĂYZL[C9:->LtQq]:Z63ɧdk|}4s`/+<J1?,k<5wSOdv+(ϓqO7۬_ipSfc,Ah?rfvI;$xXMP@E˝'*t;1N4 *m1GcLَ4K XsB@YkH5eyDa'3x/<?a)(t Hw.VHIqLEÉΞ麿:m zTxt_PՍJJb~I£8E7>4;Z82BT^2YtXBDNl#)[ʇH[e 3yt:s <4/iO2G|*bvEŘݏ<c8[OY^VۍPqM?6 #)LsUe(MH䃹:# ֙i_GqS3paay_Y9< ,s[8mf1$Q.6kdNVrA?6rί'\j4֋==1ɭa8ގp=tkjl~%hOH CЛvlzA~IFltAdQF7G}_~n*3:0ڙ.8ќ [Y$$L}-{KޑI͂r:nKkV8P!_vͺ'R࣭#Dyr*z0o8 pșc4\-_R_~^g7x~%_( 63`G'Dޜ 5̔y-Fˆ~:~Y@|n el\yKΤT6?hWQ~,TvF@,V}C:#+tsaO{XV? 8ǣ_ )Ot'B}!dwÖѿQMIaPGC*5pa"(-\!g/H0 &q:nECGy[mBKYL^:~v}(2(!=%iF=le{8d Q S}~Χfe JƖfм`QbS5G.V^i}wd#C" a' άɫ =+ c^Nх"Q 5ۛIFIq;PFy(!(H"V.x[tŨE_;|mu):R[x :>\OH?OWR*",WznF,. o˿|傣~+oni#=JgF#+h⤼F,ȴK"pAH7}k߄Q 9xk8Rڙu ;[_00:eօ^ET5:A[XYaݰ#MΤJ[Y#Dzp%Hۚ #9}oGq&- yW8w3=8Ʀ0ۚ|!#-:r&7|&~Bq)S3S0^](ƫe*bIX%BܧK̆*ExK>R'#iX!y "Ak .P*I_I Շy&7?cc5E$p7!EqcC;Cf#j!;՛)ieZUKn?Ӗ9]A{PcͧtĂWrds-Y|}yX%d3tq01ES 2ZP*+R˭W&4sO½l1,NQS˹ GqsXCkd>A!;vf5C}'v䣁784ĚDY9Gkdw)ib1 < =~g:rnfȅ4\1f*O;.T)dq0~0c̬uB}gD蟶h3WixS^!Y!v-Gt%"{.ƞ<xxo҈ނF~sL KL;xޟ{BuD\}AZg2K*;0y:hluB0mB[Űxmާ\٬1ZmuY+ٙzF%d1.߃y {g7PDqHUTzE 5"ZT-S]4lꙧ|i =f ']ϒ[zhK=K& :ijY4EŠ[I%5"#J#X2\클MH&(veu:K5BYe'Ȼ7h4+kDGX""X]G7^ݚ7?1Ӹy ooI1 Z0Ѓ!!dR4GV6U-̾U8 S5͛F#OHf񸅻klyz0 ͍.N;ǀƌRŎQ>U$8My/W'0س WtiVs"B\bMK iP0uyo@Ze~-Sl} sHP=նw= *iRJPiLR4fv$)}.b\u(^{|kMh>HJI_vgTvRLh9'@EenY  -ȕ\}TG/YELLp,;g"O/.t:WQpZI|*;Lg((e-|樒i`f} [D\nl|dg'̢e m//1EP@O >DTA!^ Ɲ#6Z5#SZFTMK܅;,m-Ց):>YQe(TbtnױH'Y]D",BT--fj'Je kJ͸MGzQ4 _/ 4nHmʢp#sXk,UfVLmt K; d(#XeY *ܕ:1?DZJ䌯MwE+>/I}ѝ5AtMUzb`?{jjbՠOq=ؼ%)?.7d{u*OFxh]0#@8:,,R psZx-B,w46翦nOYel͡  ̭`Fkvs*H#gi^0#fg*NJKˉA{o)ّ hA茚d$yTbw$rq{qk9 "RA;f8Kx0n 86cU(=Hq9Rupd=I:\Eg4>58멶 ׈&J'Y!NI(PW`mCoYtK RX L"g2y.XWU&,+!@]'Jm^:hD~+%Tikc8Dg1%E7=5W S y5طcR߉]C;er'sv žU .\t;B`ظ;)vP0Ax}; ͭI*[ Tk#}v;8!G'u=Rkkƾ*iIbxy(KNR Bpo,}b OzjS܈wqC˼̵ vz-F>0\{9 R|n@D" ?; Okeuy"3P>VΕcAy u+ךId$O};@JWw$LJBjTg(ϤzzgîH#EϷA{fzLey{.9\2qZ>`cܣuNLv0̥)EzA7O4ԊM;Nfr@:)M6SEܜ]OQ ZޙG` ]LDrd7={zX՗u2'[׫2I 5NFL}C+KLZі̖ M(0;`n"Z:"wd|VhIfd:md|jd`d&Zt^ce((5hڲuTxtʔD)El-&A1#3?;A4/GOc?F4-B/.P>\1^Ǽ6_ˡ^iU(On5l/v ^^ZJ:|m~B)9h<:y;F:=q|J;>-:%}L1tW3ցd4YF2qnbvAJg~gB+1 ̨k2{UE 3c#gyw^yĖ;|CFlqCҭ߱ a2A0QۃU-:?#,n#jUJC[BVk0fj%[bea ^aGsq؅%όԎDR m?Vp&Eqj-BSL^By :0PuAZWk Lțp;;gKh>/ 1 =O'0‘UVb#O֬Hd iԸ4 k8a ;uvZnb.(j'48eXcD|8=p7^i=Umɡ½ Q1Χa3 0y1Г+yQ-va~2!&8]ODqK4T!%8*<̄8BXKӞMɵO ArS_QuhW f"٧1 2lgn'ugFﻺ\-ИcrոdQnjH*7m Z-xk +2eDvEN5U &O!($r!hGoq@SJJl{P\hfUh)t*@]9͂J)}u~عf`"/˰<( ebؔ~9kDrcC1EQB{$kg;lԳ=&\X (!Ǻ`.oxp48 li$NE껴&^EYczQGmDs1o"#BrWʶdz1[KRJ`-S Fܶ{GpVbжH%N :)[UMNu<]ώJX3):~tJF"(SgK}B"ݪe D?meT}ɷW*ߠ o@ qg8;UZa~ןY!JlqhHoD_יj}lHvV^hchIpM ȟyfzY_noPRD5s.U]Y_z ^.f[=ZW0D5W֑D122(T-{Pâ9maͧ5F@I&][ 4nG_ |7I02sBk7\^DjƣZtgL9%w$'rOEN)NxC\ _VB y.7[NWi7e[IRØN~ΆoNs 2KJ&E{m#UFEڿٝ5JGDS(8GVkc}v"}G{(@Đ,|˧j?O:xvrV$)# SR= D2MB%ŮNj9dY1|V]x`-f"Nl"7p$,=Eˎ!ʲP9c\nْ[OperBgkYLv fK [QV͓e#m40=o:>OwZ%J!O1wVBpSjnY FcA3c_O&`Q@<ߨH:aNYONڣq;d]%z9 R[-’*{qҍ됺J6BP7*fl=@`c\H鱭Tg\ꔦ8';s_H~ aPJxW-Y-݊2o edƥkfT *,D{dQ!l6`r=즽"{E;Qhҳ%t} >5)qH0oFKMЊm"c 9GmTD+!t²@ 9}7M>8݃""G$pG)!+ؕFd$[]W HM.L\s,Xʀ[.tEv!hy-gLCU) 5nrvQ!~.{֎;= S͍ mVxrelXCxn7ɛLLIǠeFq+o3'&ra5YU;$9bzMRͺjV }:zIt%;"ǬAh IP; }y&SQłE D< #X/[L<%BLCnc@?I:N#< HHKP}$W26,RˏФ\X3'#h2dPQ.pci~J@c 1wBD`{pBYNl*>z) Oѱn㻈0.g>ZdGPϣ^3sx$#6sHc0 6 -v,:6A#WfgJ5Cn&>vo8JV+,茷a\(sNBmnuqO!9LW \@7}R=xҔC%Iq7_g @Nq3Q$|9Z'S[H6uѭr\p +՛3+e:2tz12> stream xڌP c'wwww\ww!Hp Aߜs=꽢 fջ:$wadeb+jhXXؙXXؐ()5\lA#Q99[w] 6 $PlsXXXXl,, ;$nVfE&D)vttG)-thPX Mu(h,]\ݙvL`' !Z%@ rr PځƄD аrClt [+S3$ T*@ VOXX'/"+`;PR`rpa :!@7-w@*Q>gS'+g&g+ۿ42E8dWVN S=9\{_2\5]A@LHm ' ;yZ2U@/3D`2A y;@'WEH3+S 7; 2@~~d03𿏘YASWQ]:oF#;;_WV?'koGdv^sih[A fpB~X_v$jk??~?mvu E0~P-"ze]"joa <@f*V.onkeR;[YYXrLm o3v 7+Jڛzl\_loV5yf&{ $Q 0;!u\fѿLA\f߈,%E,f߈,e~#voTxJ¢AX#oѠA8Ez+D 2q[3om>$oi_ m!_ _;?@bsb[/+d@ԛN7r/7HҔ!tY!]Y!sBTd$v! b I,vH%{W; ?:=B8dB4:vCj8@mA'y]2[W?!MB;!XY!c̬-98B ? w l o"菳(uqpu;=,>w&/: 2k O iilb]~W-Jθ3.8CJz*3hFP/ʖ$͵2ٓQK=BxkjۃϣQN$^Dh7DbF ]'G6-]rb^ƖhNE*Öh(pØ5K+X9vOOXpjCyd%򒂷=IK=1 5A2)uPsš"94ݴ/:Js'ƬYEx!oaX-oغ8rsٻD6Xh?41H; ҡn,=䌐2d옃7ُwgEyg0ɑ5όlF5+Y9J9(z(68r{ S&.As/{VUePH\LmֱMwJUgbZN {RNur^?WA+{OI~  |\,P}0:91,1RauVayZFx8aﻟ'bG{+"|_hw`ážI0:%j}ӱ Ccɂ-ޣ/$ph[q_b|&9ehL UOb.Y]~sZ(3Sw:4~a9C<RxL__\>KG*5ƾWTLW䭁6‘6q281 U! k4ħߪ?Ͻ-e!z!|/Flvc>fXe\c՛ԀUu1C: \kMه\ͮbcWHT!4o1[wy|cv۔|0$؉]j}LclӖddՑ @9zn+G1ҦydΟ=f̰0L?OX] $Z_0z<1ͧ3oQIg-ca&JvÈ/e&Ve.EhEQᮂm82tHܯF|dWEjb7v={ |,DY4Ř>e|t5 xϳrlO9E1a964&Jh/D w@{?`n^eF=vsN'ثEZĎ :cWNkqܓ|BP^2e;u)B>,A-*.x-]ఆ=-%6ƾ {pqQޗCIiڻ GSW4g~Vr5wY1s9`cSzO9/Bp렘#ChPLF#OU;Q4A Y$]nV5MǾ6"AQ77+OFi=#/_A)IUr}YFƌF}^_G-D$D+%>{4v! Cd"'D>eA;4sÁFX-R ԡ\09A/aqŞ0M$N0Ẁ{$G>R(<Qk8p>|!^z)Ctqy95h.=F 1S:PԊ O4NTD'hG nSP%uI!)Aq\[P21̃o>%oeh8whRNE%jc͵DQ(0i[V//|I$GiԇGXbYh] cu 5\Aw=|* ːL>(xe"31>]z"{mLUɾޔ-bʃL{'0 ̖O;x.HlhJA-iS%Q`C_+p]{ċ#F}C7_5vEԽG&{|Gb$:UPO7;:ƴS}o^Ev}4@S2԰8ϰ0ɖI2{DÇԳyVI= BYUSϿ\˃a0q)c \r7V""4?hdzI,-hXNA KwL. 9/CZ˴-Cߘbos6pE2kVFe`E5ȷ3/MxCS.(Gqy_$ Sфgߌ=9X~w:eW8٥7GG5LƮ/zDd _~RD=r9)ɑ5>GM\=JUؔ"׽TJ \_ޥGM:(νO-KtTBHOq7k;9V d0iŜkK4b|_J _Oġv@GWP;pxZKmҥr8)8$>mpVT0ᒠj?\Q`4`aӚWIVUj?g*:~RmRY* e{jܡҊʷa$ϡxaj+n?vxy޸Iƴ'rUdwq ܤ9Km:~WE4gW=!  x!2Y m7W{xa?Z[0yU+Mh _Zs@ՑE -sV4LMe AJVKz' Ǒq˸rDJh܍7>)NR.J+gd_@%!` S;BҜ/Ҕ=*N:LNn}̋swI;U }2>I5Mw׃]]_FHUw]J _s=tex-a  _㋧L)1͘)j}>.2wIfcG^/;2 ^M(+RS)IQ_P1#۳U:_3 /qp5 1B.?\n#]P"*m a;Z^" g7b LL:opQL&9Tu%/RQ`BڰίC0@~smνNH]s2y7ir/fK6x?b1z^#}q+ՙ8?4zl W$17tyl[.TקU<yGg??!hԆǍ¢:pƗZ/&z]_/樹 HVp~& :Iֆ7ܗٗ-[U֝PAG,k;F#g}C77oh`Na2351EL}W}B1i+4E,4ŵ4ǗQEcO_âLaaZĕWkW_7 wB1I'\#ܐBԅXtJI/ 0gɨf@<zķh?[b<-XxԓWeQԝ1d5f.@ ydjm6n>V,HPSN-{Ո47o砈 8QPmjp{*9.)J/@t_⎸,ND╻0Ӟ(zoX)911eeOXebRL|]o4kÄ/]Ҳ7 SPqM3Qm pK36PWqsꂧs`O{f"r0rS,l `$yaSsJ_7ج`]FiD|ŋ֡ N\[sר!Z 0QPPx7T?U 2xq̓rbKA|l/ä+HQ mϐݵ 7Y\'$u:cQߗBσe!|7װ3Zm0:#YPUL㎮A@/9LMy-B91O>|Nv]"F 88:Rǰإ:]<z~S~#+Vk0̞$i]&."|3c"119&4I-ަPBK\pG=pYGc;&3E}o >e! {OgQ-fY~+ _$o]ʛT&ұ );5vd&EeoNNM` @r;ԣ ;$i0uZ"mI!~A9Ϸ>8f-*_FKeh4H)T%} m ab6}wG9*'0ag²a+jBmqap0K8!_U| :R_QKcbn~0kP$~+0!vɓY-qw<0.2P~=.ÓM!Cm| c&j BVD@FOC) E-PZ.9C{nEɽl]>+L͕4 %E lI+r|۶Κ =Mx4ݱщ}z5uk75Lxՠ4@Lɧk{s¥SD3Sc`hd7 tKL mBey(#7"0Wo v0AYgU&_Υp wG\?.0tg :9qv7IR1)cT:ۤx{RVQiD}LV NEieh$3 {ГAKI3TCߍ'ߘϣ:*{/`TxT}tف:KP%[ɠ4xA`5L݋VL\QD cq͑}Z#eէt;x-%ؐziCg?u3rXr%+GRXk$7< 7wV dYh~)h\e A'ƝĥUUg(tC܊^_ӭ$ǹ+y9(`p) GMLbXHH(Ea՝\RD;|SV E%C/'_h=&j).jS+k ڇSѼT~j(Nc8M'^3*(UA\$FZe/dyң-SKSDM?~*}*/`r]7+{pEӜ0:Aׯ>]hCp+»jN c퇡J~Rskm@1]g FO_w5ɯnhLJdek#.!LrEw/jmw.pS,cx^.}ׅ-ֲIǶצ JOSm[Rӡc)Gq~ˈmkjX+NW&A<^`0(렞`.`4Ga9E{J ԊN>:lVP0JBxmɮ1t VwnZ|YpRÕ=Ck[>8 :b _:+wךx Ww1|ޕ!Sgӈ샊gC1yҠ7&eK6h<HIGcNnO[^`rOWq- OѽVmSG~i3/[[C},wmmoXx_X%j9H.ZSE# n,!ic\a֊WLhxy_onŠߟlסz_ޜ„h=R"K3}USɾ9xpj?Hdwﻆ"уc~K0]绀s~ _ǒB}aB%ȶy(>$$iI :vxv+r{u`N0dL /Dt^ә;*y&|ĊȍԶ y?͹'C&T'TOۤh4h1kgUYQzZY2ND=4ada"<W؇E{ b$\y c8ѧjQu娌7--thu#ԥy%ܫδ-?-1| M8ꮜE%w # JPjZ@f *u|uRl ,WK_HC+R14-&f<|e)&{9rcAvSF?槐2cRX08##a]-vV שx%*AKT# 9U2^|xT~iΈ?<|]M(gډqp,ÌfeM%q!K}$yz k ^5Vuf&M.&KbbjNã_Bi'KH^}јOEf^0.UXy4wuY]f^gIwW7S[(uJ?pWN>y1m7pS&ћwVcW2+B'N!:U5ϝq 2mrJB لsoQk$2W&^lmb_._Ѯ?5t7fNXj[2m/ b<+eg@*YpS&ӗrA"]^NtxE!Ҙ Lno@#=|csFY~tE\10%zC9TpaXW]?GĊ0P*f$%Ʊ7 [wf.aA2^MDq`0{f#2 Y⤻w `B-][=xBg~T*vΉV9  KP{IdcӉ;z%RU=Xv/ "q!<i=CA͖E/h"9dI]k8vx~^Et^m:mߣ Z1 CdT"6D Ŷڃ}xl3E>l" ɲ5*ےƴu 9F ѐrFj&4%Ӟv-&b $g"Pbs1Y"NT0*䡝-)9qC_/g#/7CSZ/H8Z{X/hyۆ/hI}+1_>(Xh}~feglL 1j$D ͏wEx:H܃ƁFdNfYJúXun [/C1l(7&n 蛾mj9jdicI# b.| ʏx{\thΓE΢荸mC >PͬSԱJ%_ QdҼԩS0Ɗ zk)lp[rQoy 4tu}Zt6erb-71 ѡCsɹ^*+8e>ZOi2) 1PΟXXr wK#@mCbIbqʎ4qwh_1 *)TTž.lVmGk%! !jQ(Mȵ( 75ydV4v \_妲)#c~γ++PZ-V*`A~[ž*}a-Swή\|OO>-_M~5Oү=ټ^tV]9WlH/ʹQԗSTВT-cto\ ?ܷ)>.:ۚ`F^\.]E k:|{4챷l&NM}ƈcVoԢC0Mۨ*qApwQYsX!hRWXS_-- WFX>VG-K| Lr|oW -DD֣X 1x@ OBWb)k\=NU@<@nEUgVAg>]`PM7gcł{c/q.<>OVnl fkrz _Vzo:I7<]x>u)zvl1/˟p>+FT /W[UHn#vh}ls6[Z{G~zd3PPUcpL=f/1j.=Rd9 խh r=vd41|[G(,!ovitĖ-?sq6)-V T"ႣnҪQ)V,ITXce+u2`O|,'!Ww `ޫ&ٕ0W1,;_*ꢚ ?nYIbs%i2žqhamHkae$('l,\i_5;MUދHൌHSɚ wrJ'BYHj)w_n_SGϥ wq/)H {GB"~f>]BA'kxڹdJaG7p1}[jMf9qd|g79񦘢5Ӡ?c7&BV fn^JMnr7j=/ekQIEAF,^2_˝ f50RB>:T0HbJ4$llq 02~ Y[yoΌBG$&`>/F%:`ȩ]udcަHE {5fyOA,L2 1Sʪs ]}\q?r{g3D Òp\ l;w,,0O*NE>]]2MtNUbhTKyQk".?.|W#PF?ah>Äe|SVC`4m6@偾UmnAgFG)1M.Iu0@BsIk( Oa#g:FvPeiU8ֿozw ayJ GIn@h+Pܵd ]I؝ǟįjs]ZfBf4r):!}(^nSv|ó4mfv{)oם=MN݆HIgdR_ƛY8ByD?Une"HY>]~QpOY;n^%ţןZa+.iMMl?G1"Ac2"ᐖZZtFSrfp<?nO0&-q_R4bBN0EVXځQr';߅1b~zm$+}GM=)0^&']e;aO\Nu5]9+G Ӯq!֗P%A_p0ߐKUrd+ H&POY˽zUm Kca|1#qjb8SX4}3Ϲ1-hizùp[fh[X0g苖p {]#z͢~v+!Q=XUDedYPzrit)s& e2ۘ6 Z5A-3ӌ#5RTR$U̙!@vB~YG$={uwQxXHTuowd>iNeptc{EH”vy2yG0/Mvӓ>]4quHG8?"2~dhsDe ((#Se-Noߵ9+T1][g +Ouriim=*cHDҪh;5ؑ|~ EZC7otk cuw'CV8 #[a"0 e-n Ɂk*0%2e,6'l~t%!XS;Uߪlz gz%6UMاF]ZhR@hl#LvrU,Yﭲ no\QSilXpE~QTIlw}|tFO,~JS2*o&[]zÆ"fr5K#Ae 9gR&Ū*g'޿n+n Υtk}Hb[w 8z#x)_6ExpT9QR M45w"9nhEcЫ1i:Sºl&ekRĖ7I"qs[zbGDZy" w {{d#jsj' 9"MXظiK<yHK*uݭ9^ e-mob뗛B;"Չ,G5D?_)O O=ŻVeJÝk觝FY)}DϹb[: :}0E|Ԉ]q݅3%kTT5_քPdiU =>:8tD9ƭ\r[HbdpclwEC$L+ G0^Il [gw(Kj;XyG?3 O,ipih&I?6"DH"csleSp^&zl{9؅lQD١SbTꮖ.Ԉ͹V(ؿܰ@'8fO$u[ǯAWf`WY1W\h?CESb=]t}(+7~ cR?ձHH̗ZH?@J`. Ԋ<xOzԄۘayNg@ޯ2j"?0Pʝ96lcO3za|(P]i{6Ϋb8 Ћ@W{9 dZHNz \fFB8® OlQZ]Ck| Y֊YW֞8]w+ɂ1b6N ,Tq%O)Mt״oQBXoJ/nMx>7R~yT+}cڜ;f.bo3M9a<}k۴/8\ %闊=D{'si;F~yCw /&9>j0牯_sGǒW{uiے`CC ޯ4\ULlŷwv׆~GzD}djyY$ V'cd?Ґ+ĕE V~}>Ԙ (ɠg}:7ep!K]5߸wBflvL|VZiAk2\0pbPp%`–V}MdVH,? CFyDŁ'P /D|7**!@Kճu=9*'.iP5'CN$,Jߒd8T2*;h;ҢOw+wBy/Ta3k2]!a} UƷo)JH'4RQfh xPbg5Q9J_ag nUٞ|!""=V(Q +jt8pA1xVr] DMTu~ߠ#jEăD†w),Cb;n'M% \p Ytvw?d[уUy='AIq~$\itQHzC[%TߍAH1_OhYNn1PjxhhI^#o؜1?]xlr?`ړfG(yNUBoA j➖Y/exy-Y/BU-:I&}<(! WF\=-W$w;-S+!-2|e}.pW SޡCYpVNRU>BpZD-ya^KIlq%.'S3؇ݦfbtL"NWw=!0ZZs"G*r-5({a-X_PN!Op J Ft| !1<݅;ƿ;iZ.چEwn \ 9$=pׯ)]\,. .AwZ$6.HMz }q@dےҌN]K#M6IJ #`0E(L$wHWՅ GFxf8лTt%; q,!!@HvQ|F*goV4?9De|4ZznC<_c\D',δ-{ n5Qh>\G2F2oF̍jJŪl~x^?`*{sa#FS$K{?eӢXϼVON'``TzyOjQs\B4뛲wENfp-W1PEѭ}:ԻR%HJ*ʒw+\IJq#BP1s,H-rZ bo7tO:YF+]:V׆sMԵuX]ƞk"]Ι>.'`F~#I]#ai,bWI8l gi ݴ8HP vHYJQxYdV*S_JSF Cimiu.u,nI㬅l|'yoQ_S endstream endobj 528 0 obj << /Length1 1342 /Length2 1898 /Length3 0 /Length 2764 /Filter /FlateDecode >> stream xڍS 8TkNqF:]*]1C *\P=f73{=D7IGz$;"J\II9DcB:߃ty޵]]< Yh @̀B$62@&d*A[x?A{$(b71gbr $ 872A2a~WB09$H _DDAVz8;$! S\@>4EH<9h21 ("S 퀇U! }`9HZn*[^F&A& @D #AA+c aɁ O`@0t`Xo@?S 0QI2x-C&"g !&w)ij\ a_,6r,bn |AȆ3S*P(C_)@A܍s&@G! ΰ [u 'm|B8%dW Exo\]VOQAC0 00:542|^7z*:!l0$w )eN .(g&?2?{ &RU"ǛN#ata/A5vXϨa1PcLΤx&#L%_*BPJ c [ƂB' )@ب )@r&,|$ Kbߠ9/bO+BLBird|T#ժ_kaKklLu㞘5~YcZX<ح0rhڳ-+H"z?^69WrTҹOX(FIpbduzIMu[NZk&k2JҞW+~*X?Ho @r{݈Ƚ:KwWni76 l9N5eap#WǨE}9͏p8{-I6Rxx1>Srr1V@dk~YCGo)fEӍQgmkN(:)Fd?&yi6#Kq;`:j~:{쏖zu64?|LxC! EҮhcwme8py{{:3Һۄ!G%ıG}U<܂+EkL16=Th8`I+yUqal7,w:wb{@;߻bDotڑ .8|%Y ={;jǡ餌ꇆ>Re%8 =Y-w噧Ă<={gd $Ҧ y*+F;*YQg,q-B5n[Q hF$ >y v5۔ur_*g͈DzTUJAP٪nRgBϿRtV@/zufgQVBHm滟x' ArK .ck{ҽlKKeONz#/"̘,TwnZzW+=#F|, 18\QSnLvkڻO/0e(Vָ6Wr|Xkv'v1A٫y OU$dv^sF?~R>{en 熆Q1RxW9XkedpxESHͷ.4i5,q+3tY7kӚLK\rKK/]Pv͙9'|^f_eBVزm9]&ͱW4RC#-Y.ߏWV1sFjKMfN}fzta]Sw|uiK4%n)QUC7z<_s3Yݟ%]Nx1 +Y xwdp>]CqMʡ9hJY'5<6Pd:rkR~sˬ6?x?6rnH]$KHJjLx }a}ˬѕl?D*k9$Z?%=g%U];:n><'mjwpaNbX[>_]z]STR媎ߔs{ endstream endobj 530 0 obj << /Length1 737 /Length2 13137 /Length3 0 /Length 13718 /Filter /FlateDecode >> stream xmysgn6~i۶mL۶m۶mO۶m[ӸssukuLBeچK4De&r<&'&]c3<.{0]0gBYRNJd?m"NH?E8,'fM?J%3iya7[֠J5& %m, kjPBC)d-]?w_-aw1aZ-qG fϝ"qظRSc6uf)A $Ya{pmsa3𕱲(^|m\C~-rݛ&e D.Om@ҼO[>2WGHQp%/=F$P_Yc GIf}xl}Q;=\[!z?ߒUrCwZ뗻St14<~;*S,> \'H:;ND1OL1ЎRvJOon69IP>h!M0@śd #SPb|1)b#0qP?݌JZz{&2ʐ"-rjg#&tQAf!Kh@ȚjbOpgNh;?°y~Z{vJ1nIȡzrKte]'@_Am~0{Ƅ̪++; ೎ْFh g߻g\ue4q0-l2H^QjSڊ@d0Z4@ce$Nh'T #OvqG*hFD%OU)f?u%U,@="l_=UtUP-tU)[땴=.3wB@:t:ufgpBpC.5 Y”D!ݓ Vǃy7iaԥZd~S}rBȼDh@|J)vn$Z˙h![,NvQ~&!dQqWNr1nBf?eDAqB EFj|^mٶvԥy^јA\R"CprgDfg&ZuqYqn 5r&n2rCͫVyL)U:{}|Kô8?^ħ DQ*(61dzo!q_=tXR'|bL -;dQhd0SʪiZO6.F]>sc&wBCciZI<iLu E|I IFy QidCKy25?צ:7|KR 5Mx{~HFɶs༧S9zz^y⣽Ժҽ8ela6ʃZnJl'/ 1'@IKǩ@LL-IWx6!uOp"ǝF䊯A3ʓt%9Y3 N.Ѳ+?;F<%1};XAGZa2' O"s1v~oN9Mѯ+S &.^|AkBn "K'%1d{a3(s͑cqhb,'Xl@2k?Xz %ΰ\c|4ś'/4ZDL40*DFyifoÒƌ9~%<`1)|mˀa֒N~JhѽHY#B -xǔXeT@\3^ {K/ X{b(yK8Iۗ5k@"6U gJVS]fA%(R$cR$!ѐULB#i۝|-6 [xL}y;uzK8Rlt{T_5ethv557K.Rɳ@P6#'QpJxhJ G_LjEZQv ;gsGF'U߸*UTƁPcHy1>zNH(׬oڵzn)u&QG@ T>\`[as{|BJq/bBK'ƥ*`_j/blvY2%}35K[joR% l CmNe2&^PkEQc!#5%(S?# #@$EV;gE`\lYԥCmhR~`K!ĄE b){Y4(k^C\ѡ b&t߱m"i )Zz ^k옐W+㪥iHE7& o~Gg?)D) %ȊgF ɘ zlTц&8Fj1qfVzhoiPgdQ3TI z1H3kȏs*o),PxBbwv_8`@!1mR4g)U6w VfIvnՓOxFeab^zޚv".&}#_Q|0<2*1!z-k#nG睨`b6CAqz9qfiJb5>R`_$clS#%F%u.S~v_GS,=4GA=a8/Yɵ#e9a.OXNpJ|Y9hnV=&2=ejcE?*KE9l7ȟ qJ:#ĦDrmF6%wwDkY5&oZb ]3PYmXztQT oZPn [cE0;pY`0[d ?aXۮ"jtI'TL@I nFP(˹^Y=^CªӶivGE >ur5;M#)ʽ=SZ3[<RhyctoXl X-!-ᥢzіcIB; 8cNnNk>rT +SfX@{6ͭTtC,OhP=$=߷_OI̩A\*=YurHFV`84{lI{)^:`ږ,:ʳ>x=\v bMpPGJtjLK`I='[vU>2W:5Lip^1d/UJN Ab_H\hCm> i^)K!O5 TkFKjr'i?}&}}2-*ztQNq V$<6+{gnA>꼫XY2藜qa* L[bj@b$O_diEZl7lꔎ?|;e _]ggJ*_po񒝯1^esVh:FQzzR8z) *waCm/ʗpBګ)'qt2>y-HJ%uEHX|픫Om%5ܗ| 5sdkMz wĥr`2l҈,jK @.Ïu4Og'Y*jnmvɫӶJp  @ϼիU0Uvof] dlFrEm&_1Yٔ`Wyks\(:TItt|O7}tu@ \p=+w2ݯ xp]pDAxs?x7]tr>"FfF՞\$ 'M4jѕz&G4KZ ҖqY;Eb1W٪{fqKVn7`O?KӢUwjFft _e[f?Doxxv1b.0{oICmpt@D஧Bc U ~8FT-Ϣ DJ{w0g]~JՊjR,O JH Ė]&:6'y=χ,AcHjA_b1hFiFLO6 /p^E1ZLrڐwR&obt„ʮի_)Ha۸hT=5X6٩{h90DH vgrI()^AOXǔSWRUt:vHK^u߻DGiL\6Gy3x'K7N4֝ pf2l* `x0k^J8)E >U#:C+6NXƞoZAGTD{qH LPnjȄw9Ÿ57$|h |%S/c}ΞW[%OǝX6#.-w{FRdHISۆ ~׭Qx&RD+p[Sd3_ˣٽ\(~Z5Uq"\ ԙuM_u?r[$IH뤮Z K1+M|;n!` ~Y\K󹐷}SXq㵞ݷʍtF}ȋāmOsnO7 T[inGq,yk}} %jG2b>.yoA}X nE7ۨP0UN%f%3+O8|N RgM?D "<"F7 lH~`P"is7ʭ:IZ3{>C eȇ{Ch/fs]]QDtX_D)`Z?Rb`j}EYNVdVf[f4Uy㼓\nVDx5zb\F HETY7%B-=63Ǚ[ay<ڿE&b1`U10᥺+J@*CeUᏢPK:"|\)tj'ӑ º ~rҵ5o~ xw2{Z_q aj%υ)uAf+rDNjx7ӫQD9bWB=\4i}PnOf];-^P/?[y5 B,53fq3!d|64D˲-`QOiJ2|WsI'N)mq΁:|#2f>&g6ʦv(ߢ\[h! 2_i5[yy Ne뫽y/b8P #m,+ g!uhw&azz~rej_mODK.V OxL_qāBozCqpOT' E r&kB<$# ƣQ+;#QLV_cx6Aq^ @RR ߱lUWD/uctsnPt#kkzTgX) ryZȠI{OU@,C k]c+UJD>B9edEG$ puTmB;vđ8OGZ/vG¡{KԖ렶GRA-6i-xՈY{oqre3H5zbOT~ ] !Gf=€ИBG*eօٴ+ OGl{ly󎇝2BP/)W 0iEb5-Ŏ:yϝe2O25/54KWp9M&!7 jP~p ow6~T Au6y#17x:SU^P HOO/EO4/i[_2flHB_b $2P{S^(p[3FG8nkz~<Ϋ^pnbru1HE;`60&zO 3#`I83]ͫѻXa1]=OFerF.zb{dNierWzX2$ Tjwgτ3"M w̃KSޠ!=ST[MʐދY+Ӑ կ[ MQs!>ѯ,kÉ .fWh28av-Ԡ.[QO* ;oCW7iF eOy .G15jG1fbڸ5"KW^{{N-) zj! !o}7ƥƽ;$>`7ۅ5/Gy.ʡbtwX(^dAÌp1,:d/2MQk(bXOCtȥs2XLDT.V1sM~(9'`mb u3aU߹$asZF_lqXtTkx0ӱrr&.hkh1ؓ@-+r-#%y_UN| \mZNrr6nA-֧Pa_ɧՄ;gkVY<*zZ~Mk G6 #Nz㲅'2gU~Rf?`W34Ak,$f0v8=kpv *rH?֑(XaV>(254fQuZn=Wu]"*1_]mͱ:dR: G_MЅ/X{ _u-niC"Ѱ}[Ҥ>€iy裆Ke: ZaN:Q*Qy_+OufNrI,[@<v;יNudC #zo#Pq|D6[giޖ]':&c9 2o0B01at3&O3(t*Y~ @z9:R'}83ݩYj\f]3ƁS%r RŻO!F9 FׯF+hՏOHlr"!JSO$>p~(?)ȽbXIy^ DdS[AI;0Y{ yY06פ>Cd􀅴lJluE(m&qO,)ҷ}`bՂ_K[b!4m?cיb}yS2hBEȧlv1eE0+7xI?-V[8^1³:(RjjW9rjdBMAUw!]ylBzQ_IlYtP~.%6/UQ?yw!BlCˁEqQRIDCQ+DBFu*Ontߛf Kٵ#2tC穚m7qJCdse2CZE^L, rtm,k'&&pē"4 }"1Ӫ?u"G >  ʓ.w3rQH.s۽x$M 6M'!UYC湃I`dm.fC ЛSd8#ϥيNd;PD_ s E"Ḅ\P+gxq'V.&B\V^GL{D̈́$H;fJ JZo.vgFubeY5cF7sBp Sx4]2I"If9 Pɻ ppX:K ]?Y/OfE P8eC/G: ԩ;*!zKF5EZLğlErl.ߚ(5 q"% {:҅R@uqN3T[f۵$Ө!ۅ{ľSʃ9DQqs'~WƀH&j}.Ie9JU+<E/Xh]y-b1-:,HeG A7("},Dw$3s(L~ ?ЊkP~Uf)6~MPiH #mL<,sRQS`msTTUAM=Bhb⌰EBN=EQXtH6m*LZ`Hɯ;p& i/`UF,,itiV* y*մMCdxy`"iwze[٠ŵR r$~^di|, ܥ`~k2]f)O48#ֿ*OhgShMAiQP% Kn9d\ V:ZvJT͞G;亅IV {. {J)gP_&sFT1%%xa+bM 7# VBdUWyO3 %hO[Mu\ (dMˊy׏9Aٯ6 Jn7ZvV.,1(>Q~w1-]h!Ok:cQwIvҧ4@&a3YS-&9o]Xgrf;{"YnvAxQw˹ԍȨ=xXG|L.r\<ם?Da^VeɟfA{Q)˻ki<vz<2|V:'++UǢyj3*ئ3]f9qtK>w U.@&G9&'C~Æg)\3DGBj/e9]a1X~PxwPkJ)[Ҕ[h.o"$[l^~VBvgY0kX);Ga zN19Z8JQjTw^ZTڥ`#YͰ5<8H0]1, sg}8 Gq|4rzbc Aף3l-g81t- SIq]^.ΈXϣCGKKhҭG͹5\vo C`vt s-+5^$3 LˑQq:*1klyZf5!LwbgUڀ:$V-tyT"Іf%w)9{LxDAbƣjʷ֐7z=LI/ex7Gf de@YP)*O ( _Z},i3+خDlM`҆(Bݪ;.Acu&ryd_ƊEuPJ{ '&S۩xG(sй.>wm$ߣm吗W? (v>IP5I-Klb%d)r)RhJE7Hʑ}X?<~ ,k8TTgpOk/Vnt=HMs-09|7} s^$n58T$QL.?v_ d2MΪ DІTM9J';"ޯMW#hu/pU߷6QU%R6ǁ^8h]:ѸpiDQ:VNr_XH(V?",0}݆pK$wQ6>:iW`'TuNl+ݻh((b'Ӽ a\E\0O(HXܐ E.Gڢ,>:ˊ) CMԤcrJɅ+XSOycҐ5/D8 d{끧2kvHɤwaaoldݹj7Hv+LӋoshS%d<dbUd5ݷ#\ G#F0zC\z^u,jYe(qQJqѽ@mEM(ߎvR17lԲ;K; pu]gR ڲ,?Ղmc!#9\QnIY rĒ~, zK4'g,p+k d^w4A ljpьw<i[ endstream endobj 532 0 obj << /Length1 725 /Length2 16161 /Length3 0 /Length 16663 /Filter /FlateDecode >> stream xlc.]-\ze۶m۶mۮe۶˶97g2XcȘ3V&)#-#@YLE@ CF&djbio'bbP75(:L 0da{O'Ks 1տ5CK[K'Mٕɕ$eSS) ,))'Sڙ:\l,2ƦvΦT3{'09?̜m*br*Qaza @Ft;gM]\_l W2_N`&.#SsK;&igf`\r&fDښ(m\]L&NvqdB m-m<O?dڙCLb& .jF?pϩxʿףQ"[N&k[??XW5tqh3D=iXlFfVF35vur2s71ƪ1wUzkXh|8**#L6尅5΃ N;\ɇbxSUR*s; z7`jضr`.A ,yyc *:v֗ĩt)P~Lhj-Bn7@ nɰ-*µ 5%0Evwݪㆷ!2Wt G!oywe syTwyY|#^fu(\f)twEa`l6W\d'9&Q+-O1ۣo΋>ym )e@l]ځmڝAK%U2=1['",ݚκpv8R [2g5 y &\5_Ү#K\TEzW<2ҷJ5< UxKʠzS!O,>8c;Oz^W/MrBFN*A81u_oݭ2̽췸ڪDP0 !e 3-GK^eGqsGx^䀍^R\D K$}u󾃬?FDsuVw(BVŏbqz6+?1w~*eM^n@wתJ.ޖD:cqtzgz -U<8#)-{íAi\y-!wY}ɖX7nkK Fvg(KI N94ġBFhvvyRC8EWW2?c}aagQxb]c~E990RFD4>:+=(s qwtUm[<8"\cX`FyCrPܪsmgSiTB'vk?q';-4^ܑ&l dr1CwDwPڋ.hutJ9Ro,eE Em\9͕Z%W OIo=2=Qg9'>cn G `1L7~&96zv3CCHl ȊFg-N"}РQDU*eԢB~Jmp!%+NIiAnWO%iwI0[9^<91N/ʏ,[<,gScjEj=Z9]= Ͳcsg呇Vz 9ۋoضUK(j0p0%$9uyV |ė֙2P)M:bswmc=N̩@^t{#2FF,8$Y;(>.A>I#ūN9_L}T(qGMhѧYu۷k^م|:u,RNoXXgQdt8|cAt${ A]c -(*n&@rwaP[O+o2\7:^uaBߘR2ͭt ܪ 5ߚ#S?j7L$IK3;SAsaɃ!fES%p3iid6aKu0U˙Yg*.MR?g&O'2sʻ!A]icԸ!Ʊ${r:\i_@torڏ&cf"쑫~5']>oF(G #C+_o&װ-9n ]LͫJ^]:$4{+]^$ +ug!guCK6I3(hցAzk~jp{G*TvJ@olR'תyN&x41q@L8 4\ڠ}C$`agY$ p{lr>֫-ҩbPL;&,^Up$cu K0JMȓig4ÚoR W?hY/[Ь&UOxOkh!=P7GeûQt.>ԕgd!P\ -@?' OP_v@HH:eY,P+{P?aM|}P+jo e[ BW3f!83Ecs^ʊ,RMr?%ˠiQw'X7zwMStBufNH6G[.(fVAng*~afɦ !ƨ;EuKoUH BCp,eZoy DODeAcCCf&T= @L>`';ͩ^7n45߹&.gt@[O ق&(DSDIP*:LB}eJܕdƯ*Hehq՚[pPe(=hejP'/ [XR@0'd}>,-BΉ{p3_tc.L[=ڣx!q :U >mx&܂EC)tk2U[-zaZ(k2nT 4^w%3K3̉{4!kjJ"nۦp2qo`k/?zH.T"*=2c4q&x2SOCb^Bq$t&ʃAZ̻N_,V/ty4~>2L+/{sRJ&/MK%/۳GBfKq)*XϪkGK8][LY/W~M>T^1gޟ!ø s$Ï22g"v|˔H 瘡܂YB$\ZXAs× pec(D g"Rmg۵J3 8+{KԒ~ O^FǓ::%*{bJw܂!.)O2~k{14f܋qy\'Zj*N:jnNelZ&VdC)tRޚh{fNLjܷ/B&a68={UXY q@F\ys\qa]sޞWihvP?9r@8K#=s?U3a3uA4<+dډB>'c8XTOPŀ14"c캱o kG@,K/t[*, W b͏KkvL-%DHqRe[]&sQr> thO&)U޸Fnsm4#GT.Ljkܑ/w%&"]#:F~$ o1 Uٓ_'`- AJl}~V|x.8슴vh/@Lq{E\V|HA[tsMf%0e65VxW P ^]g3!3źt r;NNjNFV[`Q Z,o1n0b>a?PtRձ%H坫}] ϫH.(9&o@K Sj<_$q_g!sI8nⅣRcf2+DT @*O"ѿFo!p6ST^”J:Ϙ4M88 ~M9|<1A F'h&r\S#K #޸jz^cY9ҝ,|=OB^0T!eq_"S4]ίSNdk8 !EBth㯎 ۪?0Gד-1t`,x្d;<$?65l\k<ۂ.c,L¿_?˱eӼSk/Rzs@Ҥ*H{u^2Е=m\Noµ--$R}ǒYxNHdRrlЃ]uaе!8&MQ,[ߜ3/}3)M65H"RvE$71IΟ6;7u][H} z!Mփ;H]_WQ@+OrjPU 1Re\Èe]qTдϟ*8WkaoM|DsDE8,{SPq=+:ÅmĚ~ö'ttMh,@_~ud[p *Ga3wP887;S޿FR`> LF헣正e!=.e_ yVRdxoqV}7P4P^vmt!ƥsMQL.6rYb[9^=xǪmeAqJP@CcXI`VqMv1΁;KZ52a$U[9G׆qN`F^䎥Th?:;n<9Ļ a& j$!d2jԇaZ,G)EL c kpIb(&{2":$<Ņ/ `r&_Q-l|tu{hf۪=.|pԶ*|U.# 0u臜bI>9G@'2;xˢd2z|*QabSUgM^Ò{Tp]1@AުiuXpٟ'?M-lwK!+gB1?LcJ,hƙ+B#^^.Iv]LO֟|Wa]}_H 7㖲5܏XV^P^ C{xt'ܳYb] m-Zrn7c]{Dj`O/X/~[-m'.s Gl]z(SriЮA̚Ź21\,fg~ⶤxb~6N*PY0'uU%|O QpϘ`=3h'Gj9ރ#6&H^Rݘ]t> æb`6  'nYL^55ӈQ:]ҍ֢L=r2,mf\ҷOړ,Ncyb"CHnpԛpqnaoUrsK+,-R Z-gohG=Bv!-ߔ/FZ>yo:ird,mO]Q&ri?1I bRI\Iłx5Ʒ)n.6j}%&4s6Bf'~UoCyLtR9lՠQ 12^˸,߈g SbJcv/)w 7pmA÷f&A.Ye#.'0&MBа,ƑkIne_Bˠy%W^q7 |L%*{meu RERxIfLsû块e[VxޗTOtk RtuY ATBj18O^S"9L__[)jYbM}V˹`W}X-f{aϺ\jͶbْnjϬTӚ|6o|cO%x!|ǹR$[tH*_~@e*"`;I KT>B`5IwlRz7dRDM8ږ17]fA!AĄ#NEH C#F/f`t ^>?ɓ\N"v x."r]U6vG;ԘmbaMY0(Nks9iE;^I(y)[ % q줦 e\yT]{xҊz]ن=_yB~܄e%Wj#$;"ߋs-jӽ@lLbl挵8h e?{_I |s^x/4rf;vEO_|_P]MH'3ZT@0K3';KyBNWtwC<;HXih/A)yc: gBT_&/#jxJMEw/F(h Rf#yYIrZvV^*+PivLǣIx y= ,r[Co3M#&F-}T*KM^45QjRЌE<;O'r[FpO{؄qfIHPDV&ErwQ<s#3cBuz9=s-7D~Q!V%m%s=N]4h52zxOĔ)S jK_8rFqZ_t[-%F݉dy˝>1 лUƷav$zjoĺn$"1h}95 #R]<32"%c#׵P~>4+k^-WY(gjNB%^oZ+?'鳯AB@t`cz.4;,>TT=x|;nl g$lY/1e{=xr_İ%9<}&%{lre1<7i4ʎUďs]Y.6\zD8̄ yn:'!͖EGѻX5:El.'KJ1j"Kc.a[uMk,G Yb^b7Gm8Ub f 9Ԏ|; w<~$ [V%ȑ~hnQ.A $yݱjeMkM?/xۻH~8кH,V808~>:A]R)78WNWBh4r7X }AM?:Ug-3vb@zv5XDPT'|K{kZIlGr&v1K⅞%!pVq3(xT[gu~G! <̨ys6uF2$ ȗk!3fpjUE_vTPԊ>~AW> ā;돉c[ǹr>1%lc:k dN@B8NpT@eq'x%sfw-G#P'q!ZfA  :d9w)K_s!-++,2{s3 Ԇ8lm=+}B>{ZoV`DKA#L9&%[V/5muC@-&]%%bgc1Yfc?ي+,)3(e7}.ʳqQN{kr}j.6GլҏGݟuDŽr!'S ٯqx,q͂=)ioyA<اxۂC]aU+˖}HJ&Ø\4u_w߿\v0uiwZ0zm85u\l2mَiđ58ȩ9R{ySTm+Z^9Ow򴥉2f+һb]obͦ>%] 2R5X3%z󙮴0)^\M]@S3=,Cro3tá٘ߐA3t<ȁh")gxB0~Or:,R*bD{srF͵ڍ&[I ,P\HWե֝]x/G} Zm|j r"'rQbⲄTA̜hq1OeYr^5Vط#Gd.tk׸tw">,Z,9'#d, cddGVOYJ˅Ey٣ptK 5m3}C-#Mi)EK³{ L,PӶI =D- ``Xx6>!LF]YQ23<`l ga:e`}3+o"}/FtR6vZ 8WGY:S6-07,%Ke2au?,V؞:i\K{Np&awN}sG$][8*8#yif\ji>WN/_g?ҁ3<aio?XMİDrc)@ zl}Ob؎ [؂SцͷN)=%h$]m=a,M]DK*E:! [yMKԸFd$F\ 1 0aYu6߁"W+zs &ۃUᴍ&5zٯKcuq+AuͩdDJ#A<:6'ZW 8705gnHN>4x[ yN-_d Gk&Q.|[K$l${"*5!qSNKOeKk׭1>cll!2 d398)-e-9x[Yz5(@_ɜL} 7Q`syl-wJw 6"/hGA/@Òάo=4Wt c?~;}ت뤍=3EAlq%~ ˡ2hA:S=$9d\`>\IUf}X(ŵA13eA0%Kcu5]Q}\{ث6ș1 WkXKjm__ޡ$fkD?m 7e. >`.}U8Fai!apww8h’ާK sRyXlu%fr~!.U-qIr] ro񻮊 #MX,1^  ʺg45WcFQ-JXܐ7z Fᚢ ƁzlV=x҄X/[!Skrw~N]8UDCcg\kr"z)[Ml{M]%iTxFL@r괛j5 W֫{y c[=g#m %;ۥWsF-T(t\Ae/A<s$QO IGQQ'H+Ri8aM]>):wvVE#GKڎ&&dH@V{"qù@Cw ;N"1= Dm֮{kavzY ~JDlCiK* ?ـ" }%Yto=$ ^o]7U9|2oZƒ >˚_X))ˠ h0$P}:/7w-!i/IbTV!)?@DLlrنb@G<CSU v(FbQ tmPGE^'?/fރy+?^+Q*zw]4h-~t+9ݮ[ zpn3j"5Y(S,kvmu9#X ä9À \#HYd5HDbԿԣhL`y"*iH34e)<Δ Zn(}?E;7_U{w]>[-Μ~c~)Lz>3> 6?/P}pMv\ hu,'%Be_$nJ' 'mer 5:FH@fOIhYHy)lM\-$LCi0:=s`+4ӈCz%v΀oJLMn:rpkP,}~͸eeWPv5c{D&[7硼fs刀~q~c}}*y-7-jv8⢜LyOvUKF+h>wyShQPeP}m?ҟ\AIAv[B$=#Cfׅ\gH{=:&Fӄ?X[_L8RU."`kF#'Da&[|U 4ץkdM}AM 4+"%[j;c;5 jQXlS(nfwZցgw aYL6ZU̢Upܱ/Ęc}b&Dqy{ 粖?m7?ඹe^ҿ9D(.j竼T9o6-,}H2SL((eMU+qQ6TGp4CPEp MA!YAEW#:PMg ] :OCnV:W=L ~9DnSt4hVU/& pE?˝i4#[K j=4> endobj 484 0 obj << /Type /ObjStm /N 92 /First 858 /Length 4928 /Filter /FlateDecode >> stream x\[~qRS1Ԯ]w;v'iwNشp.ZvRu& .ߺhI C 8$J2=8'0V2J !F9  05qCh@CQАB8{}z6(H`$(q/9 a0Hp4pByQ\x` }csXp_8 @:H$8=G>qd!y "M<39-(χQ^K!FT`*xAp((I"*U/X$$E38"4Thɐ Ba)CtS@31`J}5M<LPD( A|RPH`0)>(Ca `8* 4)@SARሸ#Z@LOc" a!!HEgF >:hXx##BS ('!j(@nh 9l 9Bx?=\APr٘Sü1!$cwhUz| y8_͔/=XpH3@݆C(8"0V3&$TZ u <:ji̴i0V.kf%7=Rٌ#xs<+VO0 +|uA@)Pm,-i+U#Hsec 򌲍h6=)#"o'?ړBSCCWAzAT,P㘏 ,=(4&}j]ڸ/4RW^S۲ PČ5e=۲)0zSƔgXo'|aOw6[AG)mwDOr z,^;j~_cR\ Gsԓ(4:G: Ci =juΏ[Ǎ*דn~b22TW+5=ชaP FiS&$ۻQ\=skEi!WCђLi⦮u D쵞0[j)DGK&a X <05OPJ%qu7jjTB9;[! [#0Sm'u'*,bo꒩|g5srpڻQFH??6^Yu"Ty1R|x՟g ?$PxLUʇ B}RgY,WnF.rw |^Ei2-*^|ޙI@crp=w/Kʽv_7̽u#w.ؽww~lVq&nݍ[[["s3"PjD=~W;A@ pW]0$2 ;S8voF7.\; ɋ. ɁOrBSry\v(K/i47q 8;'1hyr~yќ] F~4Dzz^x]m1*޾^OχT]j"F?YE iAe.4`Yo*5?[V:zs1T;ZgQM!8HiF~0HHWHVȇovOCz'I !T޷ v,zb?TopE|h G-^=s:Lϳ!p8d j;#wA1+ՓMwd9½HB,LhOժT_5A}:%b=;}G.{Ӟgա+ xDXx M+@p'{2ew?۱mg=iiO-'x縷˽}^=?<}瀶^VX܃s2sr|qabe9}we:.sT{V˾uA8u Lz~|QJXq+K?D2.Ϸ5s;5eB^ttՋSݢrOpk:w }ua'Nh \tFn\'6ăsC؁?3YEwZ^#GնJ )s8w6 v>q>xlu?qܽ7鈆mѩgj =3I=Ӝ`wg*35^a&?$;Vhh ca`LaZ:/(2 ܇6=`7XDĖ|xVEEbEx_ҟ#y2D/YzܛyY>_"y}L.!q8*_ѺDA6ϒ6U*Y3s"N9;>~=ZoX -U\`sUN&W::<̧.D1>˳y%:*(QY*QS N\"G͘P}¤vbR>Tv>WC^Ǣm0j=jq +dP\>_J 9Yx-aܫM=Qz99?j endstream endobj 563 0 obj << /Type /XRef /Index [0 564] /Size 564 /W [1 3 1] /Root 561 0 R /Info 562 0 R /ID [<344AC7BDE4111BBF5A39ADE407F73C83> <344AC7BDE4111BBF5A39ADE407F73C83>] /Length 1382 /Filter /FlateDecode >> stream x%KlUUϺRRޥ@[ʻݥַ9YY34Bdԃ Xobm/%Pfm k{8aXn<ֶ&0s q `heͺV_@Xz&,!^CR`XV5tu`=AA `v~0NU"!N9UUGwe9{eukOr1P}e7>iMYd}\>dYj>LD99J~^ԖmDeϱΑC05DhH#=DK< 4>i?oj ;:::ٳo*P`2N`: ⸏H>cb@ԁz, ٓ~m./P 8Ԑne:,)>,hdC1uFhIRCdEQda3,䁑A99 +5$:FDĈPɇ3+<>N^ȬG1Y/t[ڇaVx7qvZݿ//:t{,oݘ̗d aՋLOkJkT&Mq{~щ8N4?j)0msóڇpa\$ZWa{ M."\Da4?x_Fy;R5)w1?}RW7$;NrFa(Y$%qGk4E2IIBH %iwI<HS$'*9}4ZTsI_z?_&3TgϴVokr+YQъo}dw݀\Q(j=EtkHQh~yf+h)Zh;(Zd/ZX7Z[\*/*U[KiV]$})%lO؞oL}d6q@'jd2&T7J(YdIs%}JRDҌ5lxQ+զ endstream endobj startxref 671569 %%EOF RandomFields/configure.ac0000644000175100001440000000061412412655465015140 0ustar hornikusers# autoconf configure.ac > configure && chmod +x configure # Urversion vo 2.0.66 # ab 2.0.67 geaendert. AC_INIT([RandomFields], 1.3) dnl package name, version : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then echo "could not determine R_HOME" exit 1 fi CC=`"${R_HOME}/bin/R" CMD config CC` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` AC_CONFIG_FILES([src/Makevars]) AC_OUTPUTRandomFields/src/0000755000175100001440000000000012412655465013440 5ustar hornikusersRandomFields/src/Xempvario.cc0000644000175100001440000002401212412655466015721 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de a second library for calculating the empirical variogram Copyright (C) 2002 - 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "RF.h" // z coordinate run the fastest in values, x the slowest //#define debug_tools 1 #define TOOLS_MEMORYERROR 1 #define TOOLS_XERROR 2 #define TOOLS_BIN_ERROR 3 #define NEARBY 1e15 // naechste Zeile nur notwendig, weil atan2 in Windows nicht // ordentlich programmiert ist #define NEARBYINT(x) floor((x) * NEARBY + 0.5) / NEARBY // #define NEARBYINT(x) x void empvarioXT(double *X, double *T, int *lx, double *values, int *repet, int *grid, double *bin, int *nbin, double *phi, // vector of a real and an integer double *theta, // vector of a real and an integer int *dT, // in grid units, smallest positive value, for // the temporal lag of the emp. variogram // stepT * nstepT is the greatest time span double *sum, // \sum (a-b)^2 / 2 double *sq, // \sum (a-b)^4 / 4 int *n) /* X : matrix of coordinates, ### rows define points * lx : length of x,y, and z * values : (univariate) data for the points * repet : number of repetitions (the calculated emprical variogram will * be an overall average, see also EmpiricalVariogram in empvario.R) * grid : (boolean) if true lx must be 3 [ x==c(start,end,step) ] * bin : specification of the bins * sequence is checked whether it is strictly isotone * nbin : number of bins. i.e. length(bin)-1 * sum : empirical variogram * n : number of pairs for each bin */ { long rep; int i, halfnbin,gridpoints[4], err, totalbins, totalspatialbins, twoNphi, twoNphiNbin, Ntheta, nbinNphiNtheta, maxi[4], mini[4], ix, iy, iz, it, endX, startX, endY, startY, endZ, startZ, endT, low, cur, up, ktheta, kphi, nstepTstepT, vec[4], deltaT, x, y, z, t, j, stepT, nstepT; double *xx[4], *BinSq, maxbinsquare, step[4], delta[4], psq[4], dx[4], startphi, invsegphi, starttheta, invsegtheta, thetadata, phidata, zylinderradius; stepT = dT[0]; nstepT = dT[1]; nstepTstepT = stepT * nstepT; twoNphi = phi[1]==0 ? 1 : (2 * (int) phi[1]); twoNphiNbin = twoNphi * *nbin; Ntheta = theta[1]==0 ? 1 : (int) theta[1]; startphi = phi[0] - PI / (double) twoNphi; // [0, 2 pi] invsegphi = phi[1] / PI; // note that phi[1] can be zero! //starttheta = theta[0] - PIHALF / (double) Ntheta; // [0, pi] starttheta = theta[0] - PIHALF; // [0, pi] invsegtheta = theta[1] / PI; // note that theta[1] can be zero nbinNphiNtheta = twoNphiNbin * Ntheta; BinSq = NULL; for (rep=i=0; i<3; i++, rep+=*lx) xx[i]=&(X[rep]); xx[3] = T; if (xx[0]==NULL) {err=TOOLS_XERROR; goto ErrorHandling;} for (i=0; i<*nbin;i++) { if (bin[i]>=bin[i+1]) {err=TOOLS_BIN_ERROR; goto ErrorHandling;} } halfnbin = *nbin / 2; if ((BinSq = (double *) MALLOC(sizeof(double)* (*nbin + 1)))==NULL) { err=TOOLS_MEMORYERROR; goto ErrorHandling; } totalspatialbins = twoNphiNbin * Ntheta; totalbins = totalspatialbins * (nstepT + 1); //printf("total %d %d %d %d \n", nstepT, twoNphi, *nbin, Ntheta); for (i=0; i0) BinSq[i]=bin[i] * bin[i]; else BinSq[i]=bin[i]; } assert(NEARBYINT(atan2(-1.0, 0.0) + PIHALF) == 0.0); assert(atan2(0.0, 0.0) == 0.0); maxbinsquare = BinSq[*nbin]; //////////////////////////////////// GRID //////////////////////////////////// if (*grid) { error("use option 'fft' for space-time data on a grid"); int segmentbase[6]; segmentbase[0]=1; // here x runs the fastest; for (i=0; i<=3; i++) { step[i] = xx[i][XSTEP]; gridpoints[i] = (int) xx[i][XLENGTH]; maxi[i] = (int) (sqrt(maxbinsquare) / step[i] + 0.1); if (maxi[i] >= gridpoints[i]) maxi[i] = gridpoints[i] - 1; mini[i] = -maxi[i]; // if (maxi[i]==0) maxi[i] = 1; wrong 22.11.03 segmentbase[i+1] = segmentbase[i] * gridpoints[i]; } segmentbase[5] = segmentbase[4] * *repet; // sementbase: [0] : 1, [1] : length(x), [2] : length(x) * l(y), // [3] : l(x) * l(y) * l(z), [4] : l(x) * l(y) * l(z) * l(T) // [5] : l(x) * l(y) * l(z) * l(T) * repet for (ix=mini[0]; ix <= maxi[0]; ix++) { delta[0] = ix * step[0]; if ((psq[0] = delta[0] * delta[0]) > maxbinsquare) continue; vec[0] = ix; if (ix>=0) { endX = gridpoints[0] - ix; startX = 0; } else { endX = gridpoints[0]; startX = -ix; } for (iy= mini[1]; iy <= maxi[1]; iy++) { delta[1] = iy * step[1]; if ((psq[1] = delta[1] * delta[1] + psq[0]) > maxbinsquare) continue; vec[1] = vec[0] + iy * segmentbase[1]; // angles phidata = NEARBYINT(atan2(delta[1], delta[0]) - startphi); while (phidata < 0) phidata += TWOPI; while (phidata >= TWOPI) phidata -= TWOPI; kphi = *nbin * (int) (phidata * invsegphi); for (iz=mini[2]; iz <= maxi[2]; iz++) { delta[2] = iz * step[2]; if ((psq[2] = delta[2] * delta[2] + psq[1]) > maxbinsquare) continue; vec[2] = vec[1] + iz * segmentbase[2]; { low=0; up= *nbin; /* */ cur= halfnbin; while(low!=up){ if (psq[2] > BinSq[cur]) {low=cur;} else {up=cur-1;}/*( . ; . ]*/ cur=(up+low+1)/2; } } // low // angles thetadata = NEARBYINT(atan2(delta[2], sqrt(psq[1])) - starttheta); while (thetadata < 0) thetadata += PI; while (thetadata >= PI) thetadata -= PI; ktheta = (int) (thetadata * invsegtheta); low += kphi + ktheta * twoNphiNbin; for (deltaT=0, it=low; deltaT<=nstepTstepT; deltaT+=stepT, it+=nbinNphiNtheta) { vec[3] = vec[2] + deltaT * segmentbase[3]; assert(startX>=0); for (x=startX; x=0) { endY = gridpoints[1] * segmentbase[1] - vec[1]; startY = x; } else { endY = gridpoints[1] * segmentbase[1]; startY = x - iy * segmentbase[1]; } assert(startY>=0); for (y=startY; y=0) { endZ = gridpoints[2] * segmentbase[2] - vec[2]; startZ = y; } else { endZ = gridpoints[2] * segmentbase[2]; startZ = y - iz * segmentbase[2]; } assert(startZ>=0); for (z=startZ; z=0); x2 = values[rep] - values[rv]; x2 *= x2; sum[it] += x2; sq[it] += x2 * x2; } // repeat n[it]++; } // t } // z } // y } // x } // deltaT } // iz } // iy } // ix } else { //////////////////////////////////// ARBITRARY ///////////////////////////// // rows : x, columns : T long totalpoints, totalpointsrepet, spatial, jj; spatial = *lx; i = 3; step[i] = xx[i][XSTEP]; gridpoints[i] = (int) xx[i][XLENGTH]; totalpoints = spatial * gridpoints[i]; totalpointsrepet = totalpoints * *repet; for (i=0;iBinSq[0]) && (distSq<=BinSq[*nbin])) { low=0; up=*nbin; cur=halfnbin; while (low!=up) { if (distSq> BinSq[cur]) {low=cur;} else {up=cur-1;} // ( * ; * ] cur=(up+low+1)/2; } // angles phidata = NEARBYINT(atan2(dx[1], dx[0]) - startphi); while (phidata < 0) phidata += TWOPI; while (phidata >= TWOPI) phidata -= TWOPI; kphi = *nbin * (int) (phidata * invsegphi); thetadata = NEARBYINT(atan2(dx[2], zylinderradius) - starttheta); while (thetadata < 0) thetadata += PI; while (thetadata >= PI) thetadata -= PI; ktheta = (int) (thetadata * invsegtheta); low += kphi + twoNphiNbin * ktheta; assert(low>=0 && low #include #include #include "RF.h" #include "Covariance.h" #define SPECTRAL_LINES (COMMON_GAUSS + 1) #define SPECTRAL_GRID (COMMON_GAUSS + 2) #define SPECTRAL_METRO_FACTOR (COMMON_GAUSS + 3) #define SPECTRAL_SIGMA (COMMON_GAUSS + 4) int check_spectral(cov_model *cov) { #define nsel 4 cov_model *next=cov->sub[0], *key =cov->key, *sub = key==NULL ? next : key; int err, dim = cov->tsdim; // taken[MAX DIM], spectral_param *gp = &(GLOBAL.spectral); ROLE_ASSERT(ROLE_GAUSS); if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; kdefault(cov, SPECTRAL_LINES, gp->lines[dim]); // ok kdefault(cov, SPECTRAL_GRID, (int) gp->grid); //ok kdefault(cov, SPECTRAL_METRO_FACTOR, gp->prop_factor); kdefault(cov, SPECTRAL_SIGMA, gp->sigma); // ok if ((err = checkkappas(cov)) != NOERROR) return err; // APMI(cov); // printf("\n\ncheck_spectral %d %s %d\n", key==NULL, NICK(sub), cov->role); if (key == NULL) { #define loops 3 int i, err2[loops], iso[loops] = {ISOTROPIC, SPACEISOTROPIC, ZEROSPACEISO}; // for (i=0; irole)) == NOERROR) break; //PMI(cov); // printf("fhler hier %d\n", cov->role); } if (i >= loops) return err2[0]; if (cov->role != ROLE_BASE && sub->pref[SpectralTBM] == PREF_NONE) return ERRORPREFNONE; } else { // key != NULL // falls hier gelandet, so ruft SPECTRAL SPECTRALINTERN auf!! // eventuell mit dazwischenliegenden RMS's //PMI(cov, "here"); if ((err = CHECK(sub, dim, dim, ProcessType, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, ROLE_GAUSS)) != NOERROR) { return err; } } // APMI(cov); //printf("spectral role=%d %d\n", cov->role, ROLE_BASE); setbackward(cov, sub); return NOERROR; } void range_spectral(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[SPECTRAL_LINES] = 1; range->max[SPECTRAL_LINES] = RF_INF; range->pmin[SPECTRAL_LINES] = 1; range->pmax[SPECTRAL_LINES] = 1000; range->openmin[SPECTRAL_LINES] = false; range->openmax[SPECTRAL_LINES] = true; range->min[SPECTRAL_GRID] = 0; range->max[SPECTRAL_GRID] = 1; range->pmin[SPECTRAL_GRID] = 0; range->pmax[SPECTRAL_GRID] = 1; range->openmin[SPECTRAL_GRID] = false; range->openmax[SPECTRAL_GRID] = false; range->min[SPECTRAL_METRO_FACTOR] = 0; range->max[SPECTRAL_METRO_FACTOR] = RF_INF; range->pmin[SPECTRAL_METRO_FACTOR] = 0; range->pmax[SPECTRAL_METRO_FACTOR] = 1e-5; range->openmin[SPECTRAL_METRO_FACTOR] = false; range->openmax[SPECTRAL_METRO_FACTOR] = true; range->min[SPECTRAL_SIGMA] = 0; range->max[SPECTRAL_SIGMA] = RF_INF; range->pmin[SPECTRAL_SIGMA] = 0; range->pmax[SPECTRAL_SIGMA] = 1e-5; range->openmin[SPECTRAL_SIGMA] = false; range->openmax[SPECTRAL_SIGMA] = true; } int struct_spectral(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel) { if (cov->sub[0]->pref[SpectralTBM] == PREF_NONE) { return ERRORPREFNONE; } ROLE_ASSERT_GAUSS; return NOERROR; } int init_spectral(cov_model *cov, gen_storage *S){ cov_model *next = cov->sub[0], *key =cov->key, *sub = key == NULL ? next : key; int err=NOERROR; spec_properties *s = &(S->spec); location_type *loc = Loc(cov); // if ((meth->S=MALLOC(sizeof(spectral_storage)))==0){ // err=ERRORMEMORYALLOCATION; goto ErrorHandling; // } // s = (spectral_storage*)meth->S; // assert(false); printf("\n\nsdrfsjfd\n"); if (cov->role == ROLE_COV) { return NOERROR; } ROLE_ASSERT_GAUSS; cov->method = SpectralTBM; if (loc->distances) return ERRORFAILED; if (cov->tsdim > MAXTBMSPDIM) { err=ERRORMAXDIMMETH; goto ErrorHandling; } S->Sspectral.prop_factor = P0(SPECTRAL_METRO_FACTOR); s->sigma = P0(SPECTRAL_SIGMA); s->nmetro = 0; s->density = NULL; // 13.10. the following does not seem to be necessary, // since subsequently it checked for reduceddim<=2; // if (key->Time) {err=ERRORTIME NOTALLOWED; goto ErrorHandling;} if (cov->tsdim >= 4) { err = ERRORWRONGDIM; goto ErrorHandling; } if (cov->vdim2[0] > 1) { err = ERRORNOMULTIVARIATE; goto ErrorHandling; } //if (key == NULL) APMI(cov->calling); if ((err = INIT(sub, 0, S)) != NOERROR) goto ErrorHandling; err = FieldReturn(cov); ErrorHandling: cov->simu.active = err == NOERROR; return err; } void E1(spectral_storage *s, double A, double *e) { // ignore grid if (s->grid) warning("in 1d no spectral grid implemented yet"); e[0] = A * ((double) (UNIFORM_RANDOM < 0.5) * 2.0 - 1.0); } void E2(spectral_storage *s, double A, double *e) { double phi; if (s->grid) { phi = s->phi2d += s->phistep2d; } else { phi = TWOPI*UNIFORM_RANDOM; } // print("A=%f\n", A); // print("%f\n",phi); //print("%f\n", e[1]); e[0] = A * cos(phi); e[1] = A * sin(phi); // print("phi=%f A=%f grid=%d step=%f phi2d=%f %f %f\n", // phi, A, (int) s->grid, // s->phistep2d, s->phi2d, // e[0], e[1]); } void E12(spectral_storage *s, int dim, double A, double *e) { if (dim==2) E2(s, A, e); else { double e1[2]; E2(s, A, e1); e[0]=e1[0]; } } void E3(spectral_storage *s, double A, double *e) { // ignore grid if (s->grid) warning("in 3d no spectral grid implemented yet"); double phi, psi, Asinpsi; phi = TWOPI*UNIFORM_RANDOM; psi = PI*UNIFORM_RANDOM; Asinpsi = A * sin(psi); e[0] = A * cos(psi); e[1] = Asinpsi * cos(phi); e[2] = Asinpsi * sin(phi); } void E(int dim, spectral_storage *s, double A, double *e) { switch (dim) { case 1 : E1(s, A, e); break; case 2 : E2(s, A, e); break; case 3 : E3(s, A, e); break; default: BUG; } } void do_spectral(cov_model *cov, gen_storage *S) // in two dimensions only! { // gauss_param *dp = &(gp->gauss); double exact = GLOBAL.general.exactness; cov_model *next = cov->sub[0]; cov_fct *C = CovList + next->nr; // nicht gatternr location_type *loc = Loc(cov); //PMI(cov->calling->calling); assert(S != NULL); spec_properties *cs = &(S->spec); spectral_storage *s = &(S->Sspectral); int d, n, gridlenx, gridleny, gridlenz, gridlent, ntot = P0INT(SPECTRAL_LINES), origdim = loc->timespacedim, spatialdim = loc->spatialdim, every = GLOBAL.general.every, nthreshold = (every>0) ? every : MAXINT, deltathresh = nthreshold; double inct, *x = loc->x, E[MAXTBMSPDIM], // must always be of full dimension, even // if lower dimension is simulated -- simulation algorithm for e // might use higher dimensional components inc[MAXTBMSPDIM], VV, *res = cov->rf; long nt, nx, total = loc->totalpoints, spatialpoints = loc->spatialtotalpoints; bool loggauss = GLOBAL.gauss.loggauss; s->grid = P0INT(SPECTRAL_GRID); s->phistep2d = TWOPI/ (double) ntot; s->phi2d = s->phistep2d * UNIFORM_RANDOM; // print("%d %f %f\n", s->grid, s->phistep2d, s->phi2d); assert(false); for (d=0; dlength[3]; // no break; case 3 : gridlenz = loc->length[2]; // no break; case 2 : gridleny = loc->length[1]; // no break; case 1 : gridlenx = loc->length[0]; break; default: BUG; } for (n=0; nspectral(next, S, E); if (PL > 6) PRINTF("spect: %d %f %f %d %d sigma=%f nmetro=%d\n", n, E[0], E[1], loc->grid, loc->caniso != NULL, cs->sigma, cs->nmetro); //assert(n < 3); // if (meth->cscale != 1.0) { // double invscale = 1.0 / meth->cscale; // for (d=0; dtsdim; d++) E[d] *= invscale; //} if (loc->caniso != NULL) { double oldE[MAXTBMSPDIM], *A = loc->caniso; int m, k, j, nrow = origdim, nrowdim = nrow * cov->tsdim; for (d=0; dtsdim; d++) { oldE[d] = E[d]; E[d] = 0.0; } for (d=0, k=0; dgrid, meth->caniso != NULL, meth->cscale); VV = TWOPI * UNIFORM_RANDOM; if (loc->grid) { for (d = 0; d < origdim; d++) { // VV += meth->grani[d][XSTART] * E[d]; inc[d] = loc->xgr[d][XSTEP] * E[d]; // print("E[%d]=%f, inc=%f\n", d, E[d], inc[d]); } if (!ISNA(exact) && !exact) { double incx, incy, incz, segz, segy, segx; int ny, nz; long zaehler; incx = inc[0]; incy = inc[1]; incz = inc[2]; inct = inc[3]; zaehler = 0; for (nt=0; nt < gridlent; nt++) { for (segz = VV, nz = 0; nz < gridlenz; nz++) { for (segy = segz, ny = 0; ny < gridleny; ny++) { for (segx = segy, nx = 0; nx < gridlenx; nx++) { // print("zaehler=%d %f res=%f %f\n", zaehler, segx, res[zaehler], cos(segx) ); res[zaehler++] += (res_type) cos(segx); segx += incx; } segy += incy; } segz += incz; } VV += inct; } } else { // ! DECISION_PARAM.exactness double cix, ciy, six, siy, ciz, siz, cit, sit, ct, st, cz, sz, cy, sy, cx, sx, dummy; int ny, nz; long zaehler; cix = cos(inc[0]); six = sin(inc[0]); ciy = cos(inc[1]); siy = sin(inc[1]); ciz = cos(inc[2]); siz = sin(inc[2]); cit = cos(inc[3]); sit = sin(inc[3]); ct = cos(VV); st = sin(VV); zaehler = 0; for (nt=0; nt < gridlent; nt++) { for (cz=ct, sz=st, nz = 0; nz < gridlenz; nz++) { for (cy=cz, sy=sz, ny = 0; ny < gridleny; ny++) { for (cx=cy, sx=sy, nx = 0; nx < gridlenx; nx++) { //print("zaehler=%d res=%f %f\n", zaehler, res[zaehler], cx ); res[zaehler++] += (res_type) cx; dummy = cx * cix - sx * six; sx = cx * six + sx * cix; cx = dummy; } dummy = cy * ciy - sy * siy; sy = cy * siy + sy * ciy; cy = dummy; } dummy = cz * ciz - sz * siz; sz = cz * siz + sz * ciz; cz = dummy; } dummy = ct * cit - st * sit; st = ct * sit + st * cit; // 1.9.07: sz ct = dummy; // 1.9.07: cz } // cos(a + b) = cos(a) cos(b) - sin(a) sin(b) // sin(a + b) = cos(a) sin(b) + cos(b) sin(a) } } else { // no grid double psi, cit, sit; if (loc->Time) { int j; inct = loc->T[XSTEP] * E[spatialdim]; cit = cos(inct); sit = sin(inct); for (j=nx=0; nx= nthreshold) { /* PRINTF("\b\b\b\b%d%%", (int) (n * 100 / ntot)); */ PRINTF("%7d %3d%%\n", n, (int) (n * 100 / ntot)); nthreshold += deltathresh; } R_CheckUserInterrupt(); } // for k #include #include #include "RF.h" #include "randomshape.h" #include #include #include // MULT /*********************************************************************/ /* CIRCULANT EMBEDDING METHOD (1994) ALGORITHM */ /* (it will always be refered to the paper of Wood & Chan 1994) */ /*********************************************************************/ int fastfourier(double *data, int *m, int dim, bool first, bool inverse, FFT_storage *FFT) /* this function is taken from the fft function by Robert Gentleman and Ross Ihaka, in R */ { long int inv, nseg, n,nspn,i; int maxf, maxp, err; bool ok; if (first) { int maxmaxf,maxmaxp; nseg = maxmaxf = maxmaxp = 1; /* do whole loop just for err checking and maxmax[fp] .. */ for (i = 0; i 1) { fft_factor_(m[i], &maxf, &maxp); if (maxf == 0) {GERR("fft factorization failed")} if (maxf > maxmaxf) maxmaxf = maxf; if (maxp > maxmaxp) maxmaxp = maxp; nseg *= m[i]; } } if (FFT->work != NULL) free (FFT->work); if (FFT->iwork != NULL) free (FFT->iwork); if ((FFT->work = (double*) MALLOC(4 * maxmaxf * sizeof(double)))==NULL || (FFT->iwork = (int*) MALLOC(maxmaxp * sizeof(int)))==NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } FFT->nseg = nseg; // nseg = length(z); see loop above } inv = (inverse) ? 2 : -2; n = 1; nspn = 1; nseg = FFT->nseg; for (i = 0; i < dim; i++) { if (m[i] > 1) { nspn *= n; n = m[i]; nseg /= n; fft_factor_(n, &maxf, &maxp); ok = (bool) fft_work_(&(data[0]), &(data[1]), nseg, n, nspn, inv, FFT->work, FFT->iwork); if (!ok) GERR("error within Fourier transform"); } } return NOERROR; ErrorHandling: FFT_destruct(FFT); return err; } int fastfourier(double *data, int *m, int dim, bool first, FFT_storage *FFT){ return fastfourier(data, m, dim, first, !first, FFT); } #define LOCPROC_DIAM (CE_LAST + 1)// parameter p #define LOCPROC_A (CE_LAST + 2) // always last of LOCPROC_* #define LOCPROC_R LOCPROC_A // always last of LOCPROC_* int init_circ_embed(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *S){ int err=NOERROR; if (!Getgrid(cov)) SERR("circ embed requires a grid"); // cov_model *prev = cov; // while (prev->calling != NULL) prev = prev->calling; PMI(prev); int d, *sum = NULL, index[MAXCEDIM], dummy, j, l, *mm=NULL, *cumm=NULL, *halfm=NULL; // MULT added vars j,l; double hx[MAXCEDIM], realmtot, steps[MAXCEDIM], **c = NULL, // For multivariate *c->**c **Lambda = NULL, *tmp = NULL, *rwork=NULL, *tmpLambda=NULL, *smallest=NULL; complex optim_lwork, *R = NULL, *work=NULL; long int i,k,twoi,twoi_plus1, mtot, hilfsm[MAXCEDIM], *idx = NULL; bool cur_crit; CE_storage *s = NULL; cov_model *next = cov->sub[0]; location_type *loc = Loc(cov); double maxGB = P0(CE_MAXGB), tolRe = P0(CE_TOLRE), tolIm = P0(CE_TOLIM), *caniso = loc->caniso, *mmin = P(CE_MMIN); int dim = cov->tsdim, vdim = cov->vdim2[0], cani_ncol = loc->cani_ncol, cani_nrow = loc->cani_nrow, lenmmin = cov->nrow[CE_MMIN], vdimSQ = vdim * vdim, // PM 12/12/2008 maxmem = P0INT(CE_MAXMEM), trials = P0INT(CE_TRIALS), strategy = P0INT(CE_STRATEGY); bool isaniso = loc->caniso != NULL, force = (bool) P0INT(CE_FORCE), useprimes = (bool) P0INT(CE_USEPRIMES), dependent = (bool) P0INT(CE_DEPENDENT); ROLE_ASSERT_GAUSS; assert(cov->vdim2[0] == cov->vdim2[1]); cov->method = CircEmbed; if (loc->distances) return ERRORFAILED; NEW_STORAGE(SCE, CE, CE_storage); s = cov->SCE; if (dim > MAXCEDIM) { err=ERRORMAXDIMMETH ; goto ErrorHandling; } for (d=0; dnn[d]=loc->length[d]; steps[d]=loc->xgr[d][XSTEP]; } s->vdim = vdim; // PM 12/12/2008 // in case of multiple calls: possible to use imaginary part of // field generated in preceding run. If s->dependent is set, fields // are read off in the following order: // 1. real field 1st square // 2. imag field 1st square // 3. real field 2nd square // 4. imag field 2nd square // ... // 2k+1. real field (2k+1)th square // 2k+2. imag field (2k+1)th square // // i.e. read off imag fields in even calls. Generate new ones in // odd calls resp. read off real squares if s->dependent==1 s->cur_call_odd = 0; // first one is set to be odd at beginning of // do_circ_embed if( (tmp = (double *) MALLOC(vdimSQ * sizeof(double))) == NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } mtot=0; mm = s->m; halfm= s->halfm; cumm = s->cumm; if (PL>=PL_STRUCTURE) { LPRINT("calculating the Fourier transform\n"); } /* cumm[i+1]=\prod_{j=0}^i m[j] cumm is used for fast transforming the matrix indices into an index of the vector (the way the matrix is stored) corresponding to the matrix */ /* calculate the dimensions of the matrix C, eq. (2.2) in W&C */ // ("CE missing strategy for matrix entension in case of anisotropic fields %d\n) // for (i=0;ivdim2[0] > 1; assert(cov->vdim2[0] == cov->vdim2[1]); // multivariate = !true; // checken !! for (i=0;i 10000.0) { GERR1("maximimal modulus of mmin is 10000. Got %f", mmin[i % lenmmin]); } hilfsm_d = (double) s->nn[i]; if (mmin[i % lenmmin]>0.0) { if (hilfsm_d > (1 + (int) ceil(mmin[i % lenmmin])) / 2) { // plus 1 since // mmin might be odd; so the next even number should be used GERR3("Minimum size in direction %d is %f. Got %f\n", (int) i, hilfsm_d, ceil(mmin[i % lenmmin])); } hilfsm_d = (double) ( (1 + (int) ceil(mmin[i % lenmmin])) / 2); } else if (mmin[i % lenmmin] < 0.0) { assert(mmin[i % lenmmin] <= -1.0); hilfsm_d = ceil((double) hilfsm_d * - mmin[i % lenmmin]); } if (hilfsm_d >= MAXINT) return ERRORMEMORYALLOCATION; if (useprimes) { // Note! algorithm fails if hilfsm_d is not a multiple of 2 // 2 may not be put into NiceFFTNumber since it does not // guarantee that the result is even even if the input is even ! hilfsm_d = 2.0 * NiceFFTNumber((int) hilfsm_d); } else { hilfsm_d = multivariate ? round(pow(3.0, 1.0 + ceil(log(hilfsm_d) / LOG3 - EPSILON1000))) : pow(2.0, 1.0 + ceil(log(hilfsm_d) * INVLOG2 -EPSILON1000)); } if (hilfsm_d >= MAXINT) return ERRORMEMORYALLOCATION; hilfsm[i] = (int) hilfsm_d; } s->positivedefinite = false; /* Eq. (3.12) shows that only j\in I(m) [cf. (3.2)] is needed, so only the first two rows of (3.9) (without the taking the modulus of h in the first row) The following variable `index' corresponds to h(l) in the following way: index[l]=h[l] if 0<=h[l]<=mm[l]/2 index[l]=h[l]-mm[l] if mm[l]/2+1<=h[l]<=mm[l]-1 Then h[l]=(index[l]+mm[l]) % mm[l] !! */ /* The algorithm below is as follows: while (!s->positivedefinite && (s->trialstrials)++; calculate the covariance values "c" according to the given "m" fastfourier(c) if (!force || (s->trialspositivedefinite && (s->trialstrials=0; // print("trials %d strat=%d force=%d prim=%d dep=%d max=%f re=%f im=%f\n", // trials, strategy, force, useprimes, dependent, // maxmem, tol_re, tol_im); while (!s->positivedefinite && (s->trials < trials)) { // print("trials %d %d\n", trials, s->trials); (s->trials)++; cumm[0]=1; realmtot = 1.0; for(i=0; imtot = mtot = cumm[dim]; if (PL>=PL_SUBIMPORTANT) { INDENT; for (i=0;i maxmem)) GERR4("total real numbers needed=%.0f > '%s'=%d -- increase '%s'", realmtot * vdimSQ, CE[CE_MAXMEM], maxmem, CE[CE_MAXMEM]) else if (R_FINITE(maxGB) && realmtot * vdimSQ * 32e-9 > maxGB) GERR4("total memory needed=%4.4f GB > '%s'=%4.4f GB -- increase '%s'", realmtot* vdimSQ * 32e-9, CE[CE_MAXGB], maxGB, CE[CE_MAXGB]); if (c != NULL) { for(l=0; l= mm[k])) { index[k]=0; k++; } assert( (k=j) { //// martin 29.12. // just compute FFT for upper right triangle first = (l==0); if (PL>=PL_STRUCTURE) { LPRINT("FFT..."); } if ((err=fastfourier(c[l], mm, dim, first, &(s->FFT)))!=0) goto ErrorHandling; } if (false) { int ii; for (ii =0; ii=PL_STRUCTURE) { LPRINT("finished\n"); } // here the A(k) have been constructed; A(k) = c[0][k], c[1][k], ..., c[p-1][k] // c[p][k], ... c[2p-1][k] // ... ... // c[(p-1)*p][k], ..., c[p*p-1][k] // NOTE: only the upper triangular part of A(k) has actually been filled; A is Hermitian. // Now: // A(k) is placed into R (cf W&C 1999) // application of zheev puts eigenvectors // of A(k) into R if(Lambda!=NULL) { for(l = 0; lpositivedefinite = true; if (vdim==1) { // in case vdim==1, the eigenvalues we need are already contained in c[0] for(i = 0; ipositivedefinite &= fabs(c[0][2*i+1]) <= tolIm; c[0][2*i] = 1.0; c[0][2*i+1] = 0.0; } } else { int index1, index2, sign; for(i = 0; i=k) { index2=index1; sign=1; s->positivedefinite &= k!=l || fabs(c[index2][twoi_plus1])<=tolIm; // c[index2][twoi_plus1].r = 0.0; ?!!! } // obtain lower triangular bit of c as well with else{ index2= vdim * l + k; sign=-1;} // (-1) times imaginary part of upper triangular bit R[index1].r = c[index2][twoi]; R[index1].i = sign*c[index2][twoi_plus1]; /// if (i < 5) //print("%d %f %f; vdim=%d\n", index1, R[index1].r, R[index1].i, vdim); } } // if (i < 5) // print("2 : i=%d mtot=%d k=%d l=%d vdim=%d \n ", i, mtot, k, l, vdim); //for(k=1; k<2; k++) R[k].r = R[k].i = 7.0; // diagonalize R via Fortran call zheev // initialization if(i==0) { lwork = -1; // for initialization call to get optimal size of array 'work' F77_CALL(zheev)("V", "U", &vdim, R, // complex &vdim, // integer tmpLambda, // double &optim_lwork, // complex &lwork, rwork, &info); //// martin 29.12.: nur einmal aufrufen] //// ganz weit vorne, oder haengt //// optim_lwork.r von den Werten der Matrix ab ?? lwork = (int) optim_lwork.r; if (work != NULL) free(work); if( (work = (complex *) CALLOC(lwork, sizeof(complex))) == NULL ) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } } F77_CALL(zheev)("V", "U", &vdim, R, &vdim, tmpLambda, work, &lwork, rwork, &info); for(l=0;l= 0 (non-negative definiteness) // and do check this within this loop... in case of some lambda <0 there is no point in going // on diagonalizing if there are free trial... or not? Hmm. } } free(R); R = NULL; free(rwork); rwork = NULL; if (work!=NULL) free(work); work = NULL; free(tmpLambda); tmpLambda = NULL; // check if positive definite. If not: enlarge and restart if (!force || (s->trials 0: l=0; while( (lpositivedefinite &= Lambda[l][i]>=tolRe) ) // eigenvalues ARE real: drop former line {l++;} // s->positivedefinite = (lambda.real>=cepar->tol_re) && (lambda.imag<=cepar->tol_im) if ( !s->positivedefinite) { if (PL>=PL_SUBIMPORTANT) { INDENT; if (Lambda[l][i] < 0.0) {PRINTF("There are complex eigenvalues\n");} else if (vdim==1) { PRINTF("non-positive eigenvalue: Lambda[%d]=%e.\n", i, Lambda[l][i]); } else { PRINTF("non-pos. eigenvalue in dim %d: Lambda[%d][%d]=%e.\n", l, i, l, Lambda[l][i]); } } if (PL>=PL_ERRORS) { // just for printing the smallest // eigenvalue (min(c)) if( (sum = (int *) CALLOC(vdim, sizeof(int))) == NULL || (smallest = (double *)CALLOC(vdim, sizeof(double))) == NULL || (idx = (long int *) CALLOC(vdim, sizeof(long int))) == NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } char percent[]="%"; for(j=i; jpositivedefinite && (s->trialsFFT)); switch (strategy) { case 0 : for (i=0; i2) { LPRINT("%d cc=%e (%e)",i,cc,hx[i]); } if (cc>maxcc) { maxcc = cc; maxi = i; } hx[i] = 0.0; } assert(maxi>=0); hilfsm[maxi] *= multivariate ? 3 : 2; break; default: error("unknown strategy for circulant embedding"); } } } else {if (PL>=PL_SUBIMPORTANT) { INDENT; PRINTF("forced.\n");} } R_CheckUserInterrupt(); } // while (!s->positivedefinite && (s->trials0); if (s->positivedefinite || force) { // correct theoretically impossible values, that are still within // tolerance CIRCEMBED.tol_re/CIRCEMBED.tol_im double r; r = Lambda[0][0]; // MULT for(i=0,twoi=0;i 0.0) Lambda[l][i] = sqrt(Lambda[l][i]); else { if(Lambda[l][i] < r) r = Lambda[l][i]; Lambda[l][i] = 0; } } // now compute R[i]*Lambda^(1/2)[i] for(j=0;j=PL_SUBIMPORTANT) { if (r < -GENERAL_PRECISION) { INDENT; PRINTF("using approximating circulant embedding:\n"); INDENT; PRINTF("\tsmallest real part has been %e \n", r); } } s->smallestRe = (r > 0.0) ? RF_NA : r; s->largestAbsIm = 0.0; // REMOVE THIS } else { GERR("embedded matrix has (repeatedly) negative eigenvalues and approximation is not allowed (force=FALSE)"); } if (PL >= PL_SUBDETAILS) { for (i=0; i < 2 * mtot; i++) for (l=0; ldependent = dependent; s->new_simulation_next = true; for(i=0; icur_square[i] = 0; s->max_squares[i] = hilfsm[i] / s->nn[i]; s->square_seg[i] = cumm[i] * (s->nn[i] + (hilfsm[i] - s->max_squares[i] * s->nn[i]) / s->max_squares[i]); } if ( (s->d=(double **) CALLOC(vdim, sizeof(double *))) == NULL ) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } for(l=0; ld[l] = (double *) CALLOC(2 * mtot, sizeof(double))) == NULL) { err=ERRORMEMORYALLOCATION;goto ErrorHandling; } } if ((s->gauss1 = (complex *) MALLOC(sizeof(complex) * vdim)) == NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } if ((s->gauss2 = (complex *) MALLOC(sizeof(complex) * vdim)) == NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } s->c = c; err = FieldReturn(cov); ErrorHandling: if (Lambda != NULL) { for(l = 0; lc = c; else if (c!=NULL) { for(l=0;lsimu.active = err == NOERROR; return err; } void kappa_ce(int i, cov_model *cov, int *nr, int *nc){ // printf("kappa_ce %d %d %d\n", i , CE_MMIN, cov->tsdim); *nc = 1; *nr = (i==CE_MMIN) ? 0 : i < CovList[cov->nr].kappas ? 1 : -1; } int check_ce_basic(cov_model *cov) { // auf co/stein ebene ! // cov_model *next=cov->sub[0]; // location_type *loc = Loc(cov); int i, //err, dim = cov->tsdim ; // taken[MAX DIM], ce_param *gp = &(GLOBAL.ce); // ok ROLE_ASSERT(ROLE_GAUSS); if(cov->tsdim != cov->xdimprev) { //APMI(cov->calling); SERR2("time-space dimension (%d) differs from dimension of locations (%d)", cov->tsdim, cov->xdimown); } kdefault(cov, CE_FORCE, (int) gp->force); if (PisNULL(CE_MMIN)) { PALLOC(CE_MMIN, dim, 1); for (i=0; immin[i]; } } kdefault(cov, CE_STRATEGY, (int) gp->strategy); kdefault(cov, CE_MAXGB, gp->maxGB); kdefault(cov, CE_MAXMEM, (int) gp->maxmem); kdefault(cov, CE_TOLIM, gp->tol_im); kdefault(cov, CE_TOLRE, gp->tol_re); kdefault(cov, CE_TRIALS, gp->trials); kdefault(cov, CE_USEPRIMES, (int) gp->useprimes); kdefault(cov, CE_DEPENDENT, (int) gp->dependent); kdefault(cov, CE_APPROXSTEP, gp->approx_grid_step); kdefault(cov, CE_APPROXMAXGRID, gp->maxgridsize); return NOERROR; } int check_ce(cov_model *cov) { cov_model *next=cov->sub[0]; location_type *loc = Loc(cov); int err, dim = cov->tsdim; // taken[MAX DIM], if ((err = check_ce_basic(cov)) != NOERROR) return err; if ((err = checkkappas(cov, true)) != NOERROR) return err; if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if ((loc->timespacedim > MAXCEDIM) | (cov->xdimown > MAXCEDIM)) return ERRORDIM; // printf("here X\n"); if (cov->key != NULL) { if ((err = CHECK(cov->key, loc->timespacedim, cov->xdimown, ProcessType, XONLY, CARTESIAN_COORD, cov->vdim2, ROLE_GAUSS)) != NOERROR) { //PMI(cov->key); XERR(err); //printf("specific ok\n"); // crash(); return err; } } else { if ((err = CHECK(next, dim, dim, PosDefType, XONLY, SYMMETRIC, SUBMODEL_DEP, ROLE_COV)) != NOERROR) { // APMI(cov); // XERR(err); APMI(cov); if ((err = CHECK(next, dim, dim, NegDefType, XONLY, SYMMETRIC, SUBMODEL_DEP, ROLE_COV)) != NOERROR) { return err; } } if (next->pref[CircEmbed] == PREF_NONE) { //PMI(cov); // assert(false); return ERRORPREFNONE; } if (!isPosDef(next->typus)) SERR("only covariance functions allowed."); } setbackward(cov, next); return NOERROR; } void range_ce(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[CE_FORCE] = 0; range->max[CE_FORCE] = 1; range->pmin[CE_FORCE] = 0; range->pmax[CE_FORCE] = 1; range->openmin[CE_FORCE] = false; range->openmax[CE_FORCE] = false; range->min[CE_MMIN] = RF_NEGINF; range->max[CE_MMIN] = RF_INF; range->pmin[CE_MMIN] = -3; range->pmax[CE_MMIN] = 10000; range->openmin[CE_MMIN] = true; range->openmax[CE_MMIN] = true; range->min[CE_STRATEGY] = 0; range->max[CE_STRATEGY] = 1; range->pmin[CE_STRATEGY] = 0; range->pmax[CE_STRATEGY] = 1; range->openmin[CE_STRATEGY] = false; range->openmax[CE_STRATEGY] = false; range->min[CE_MAXGB] = 0; range->max[CE_MAXGB] = RF_INF; range->pmin[CE_MAXGB] = 0; range->pmax[CE_MAXGB] = 10; range->openmin[CE_MAXGB] = false; range->openmax[CE_MAXGB] = false; range->min[CE_MAXMEM] = 0; range->max[CE_MAXMEM] = MAXINT; range->pmin[CE_MAXMEM] = 0; range->pmax[CE_MAXMEM] = 50000000; range->openmin[CE_MAXMEM] = false; range->openmax[CE_MAXMEM] = false; range->min[CE_TOLIM] = 0.0; range->max[CE_TOLIM] = RF_INF; range->pmin[CE_TOLIM] = 0.0; range->pmax[CE_TOLIM] = 1e-2; range->openmin[CE_TOLIM] = false; range->openmax[CE_TOLIM] = false; range->min[CE_TOLRE] = RF_NEGINF; range->max[CE_TOLRE] = RF_INF; range->pmin[CE_TOLRE] = 1e-2; range->pmax[CE_TOLRE] = 0; range->openmin[CE_TOLRE] = false; range->openmax[CE_TOLRE] = false; range->min[CE_TRIALS] = 1; range->max[CE_TRIALS] = 10; range->pmin[CE_TRIALS] = 1; range->pmax[CE_TRIALS] = 3; range->openmin[CE_TRIALS] = false; range->openmax[CE_TRIALS] = true; range->min[CE_USEPRIMES] = 0.0; range->max[CE_USEPRIMES] = RF_INF; range->pmin[CE_USEPRIMES] = 0.5; range->pmax[CE_USEPRIMES] = 2.0; range->openmin[CE_USEPRIMES] = true; range->openmax[CE_USEPRIMES] = true; range->min[CE_DEPENDENT] = 0; range->max[CE_DEPENDENT] = 1; range->pmin[CE_DEPENDENT] = 0; range->pmax[CE_DEPENDENT] = 1; range->openmin[CE_DEPENDENT] = false; range->openmax[CE_DEPENDENT] = false; range->min[CE_APPROXSTEP] = 0.0; range->max[CE_APPROXSTEP] = RF_INF; range->pmin[CE_APPROXSTEP] = 1e-4; range->pmax[CE_APPROXSTEP] = 1e4; range->openmin[CE_APPROXSTEP] = true; range->openmax[CE_APPROXSTEP] = true; range->min[CE_APPROXMAXGRID] = 1; range->max[CE_APPROXMAXGRID] = RF_INF; range->pmin[CE_APPROXMAXGRID] = 100; range->pmax[CE_APPROXMAXGRID] = 5e7; range->openmin[CE_APPROXMAXGRID] = false; range->openmax[CE_APPROXMAXGRID] = false; } void do_circ_embed(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *S){ assert(cov != NULL); assert(Getgrid(cov)); int i, j, k, l, pos,HalfMp1[MAXCEDIM], HalfMaM[2][MAXCEDIM], index[MAXCEDIM], dim, *mm, *cumm, *halfm, // MULT added vars l, pos vdim; double invsqrtmtot, **c=NULL, **d=NULL, *dd=NULL, *res = cov->rf; // MULT *c->**c bool vfree[MAXCEDIM+1], noexception, // MULT varname free->vfree loggauss = GLOBAL.gauss.loggauss; long mtot, start[MAXCEDIM], end[MAXCEDIM]; CE_storage *s = cov->SCE; location_type *loc = Loc(cov); complex *gauss1 = s->gauss1, *gauss2 = s->gauss2; if (s->stop) XERR(ERRORNOTINITIALIZED); /* implemented here only for rotationsinvariant covariance functions for arbitrary dimensions; (so it works only for even covariance functions in the sense of Wood and Chan,p. 415, although they have suggested a more general algorithm;) */ dim = cov->tsdim; mm = s->m; cumm = s->cumm; halfm = s->halfm; c = s->c; d = s->d; mtot= s->mtot; vdim = s->vdim; // so p=vdim for (i=0; i=PL_STRUCTURE) { LPRINT("Creating Gaussian variables... \n"); } /* now the Gaussian r.v. have to defined and multiplied with sqrt(FFT(c))*/ for (i=0; icur_call_odd = !(s->cur_call_odd); s->new_simulation_next = (s->new_simulation_next && s->cur_call_odd); if (s->new_simulation_next) { // MULT // martin: 13.12. check //for(k=0; k=10) { LPRINT("cumm..."); } i <<= 1; // since we have to index imaginary numbers j <<= 1; // print("ij %d %d (%d)\n", i, j, noexception); if (noexception) { // case 3 in prop 3 of W&C for(k=0; k endfor==mm[] */ k=0; if (++index[k]>HalfMaM[vfree[k]][k]) { // in case k increases the number of indices that run over 0..m increases vfree[k] = true; index[k]= 0; k++; while((kHalfMaM[vfree[k]][k])) { vfree[k] = true; index[k]= 0; k++; } if (k>=dim) break; // except the very last (new) number is halfm and the next index is // restricted to 0..halfm // then k decreases as long as the index[k] is 0 or halfm if (!vfree[k] && (index[k]==halfm[k])){//index restricted to 0..halfm? // first: index[k] is halfm? (test on ==0 is superfluent) k--; while ( (k>=0) && ((index[k]==0) || (index[k]==halfm[k]))) { // second and following: index[k] is 0 or halfm? vfree[k] = false; k--; } } } } // MULT for(k=0; kFFT)); } } // if ** simulate ** /* now we correct the result of the fastfourier transformation by the factor 1/sqrt(mtot) and read the relevant matrix out of the large vector c */ for(i=0; icur_square[i] * s->square_seg[i]; end[i] = start[i] + cumm[i] * s->nn[i]; // print("%d start=%d end=%d cur=%d max=%d seq=%d cumm=%d, nn=%d\n", // i, (int) start[i], (int) end[i], // s->cur_square[i], s->max_squares[i], // (int) s->square_seg[i], cumm[i], s->nn[i]); } long L, totpts = loc->totalpoints; // MULT /* for(l=0; lcur_call_odd)] * invsqrtmtot; res[i] += d[l][2 * j] * invsqrtmtot; for(k=0; (k= end[k]); k++) { index[k]=start[k]; } } } */ // for(k=0; kcur_call_odd)] * invsqrtmtot); } for(k=0; (k= end[k]); k++) { index[k]=start[k]; } } if (loggauss) { long vdimtot = loc->totalpoints * cov->vdim2[0]; for (L=0; Lnew_simulation_next = true; if (s->dependent && !(s->cur_call_odd)) { //if (s->dependent) { // if MaxStableRF calls Cutoff, c and look uninitialised k=0; while(kcur_square[k]) >= s->max_squares[k])) { s->cur_square[k++]=0; } s->new_simulation_next = k==dim; } // // print("dep=%d odd=%d squ=%d %d\n", s->dependent, s->cur_call_odd, // s->cur_square[0],s->cur_square[1]); s->stop |= s->new_simulation_next && s->d == NULL; } int GetOrthogonalUnitExtensions(double * aniso, int dim, double *grid_ext) { int k,i,j,l,m, job=01, err, dimsq, ev0, jump, endfor; double *s=NULL, G[MAXCEDIM+1], e[MAXCEDIM], D[MAXCEDIM], *V=NULL; dimsq = dim * dim; assert(aniso != NULL); s = (double*) MALLOC(dimsq * sizeof(double)); V = (double*) MALLOC(dimsq * sizeof(double)); for (k=0; k aniso_k // s = aniso %*% aniso_k // s hat somit mindestens Eigenwert der 0 ist. //der zugeheorige EVektor wird miit der k-ten Spalte von aniso multipliziert // und ergibt dann den Korrekturfaktor for (i=0; itsdim, err=NOERROR; //dim = cov->tsdim; // timespacedim -- needed ?; // double //*q, // //q2[LOCAL_MAX], // d=RF_NA; cov_model *key = cov->key, *next = cov->sub[0], *sub = key != NULL ? key : next; location_type *loc = Loc(cov); bool cutoff = cov->nr == CE_CUTOFFPROC_USER || cov->nr==CE_CUTOFFPROC_INTERN; if (!cutoff && cov->nr!=CE_INTRINPROC_USER && cov->nr!=CE_INTRINPROC_INTERN) BUG; //localinfotype li; // print("entering check local from %d:%s\n", cov->calling->nr, // CovList[cov->calling->nr].name); // PMI(cov); if ((err = check_ce_basic(cov)) != NOERROR) return err; if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if ((loc->timespacedim > MAXCEDIM) | (cov->xdimown > MAXCEDIM)) return ERRORDIM; // printf("check intern dim=%d\n", dim); // if (key != NULL) { // falls nicht intern muessen die parameter runter und rauf kopiert // werden, ansonsten sind die kdefaults leer. // falls hier gelandet, wird RP*INTERN von RP* aufgerufen. // oder RP*INTERN wird Circulant aufrufen cov_model *intern = cov, *RMintrinsic = key->sub[0]; while (intern != NULL && intern->nr != CE_INTRINPROC_INTERN && intern->nr != CE_CUTOFFPROC_INTERN) { // normalerweise ->key, aber bei $ ist es ->sub[0] intern = intern->key == NULL ? intern->sub[0] : intern->key; } if (intern == NULL) { //APMI(key); BUG; } else if (intern != cov) paramcpy(intern, cov, true, true, false, false, false); // i.e. INTERN else { if (RMintrinsic->nr != CUTOFF && RMintrinsic->nr != STEIN) BUG; //PMI(cov); printf("%s %d\n", NICK(cov), !PisNULL(LOCPROC_DIAM)); if (!PisNULL(LOCPROC_DIAM)) kdefault(RMintrinsic, pLOC_DIAM, P0(LOCPROC_DIAM)); if (!PisNULL(LOCPROC_R)) kdefault(RMintrinsic, pLOC_DIAM, P0(LOCPROC_R)); } if ((err = CHECK(sub, dim, dim, ProcessType, KERNEL, CARTESIAN_COORD, SCALAR, ROLE_GAUSS)) != NOERROR) { return err; } if (intern == cov) { // all the other parameters are not needed on the // upper levels if (PisNULL(LOCPROC_DIAM)) kdefault(cov, LOCPROC_DIAM, PARAM0(RMintrinsic, pLOC_DIAM)); } } else { if ((err = CHECK(sub, dim, 1, cutoff ? PosDefType : NegDefType, XONLY, ISOTROPIC, SCALAR, ROLE_COV)) != NOERROR) { if (isDollar(next) && PARAM(next, DANISO) != NULL) { // if aniso is given then xdimprev 1 does not make sense err = CHECK(sub, dim, dim, cutoff ? PosDefType : NegDefType, XONLY, ISOTROPIC, SCALAR, ROLE_COV); } // if (err != NOERROR) return err; // PMI(cov, "out"); //assert(false); } } //printf("check intern end\n"); // no setbackward ?! setbackward(cov, sub); return NOERROR; } int init_circ_embed_local(cov_model *cov, gen_storage *S){ // being here, leadin $ have already been put away // so a new $ is included below cov_model //*dummy = NULL, *key = cov->key; location_type *loc = Loc(cov); // simu_type *simu = &(cov->simu); int instance, i, d, timespacedim = loc->timespacedim, cncol = cov->tsdim, rowcol = timespacedim * cncol, err = NOERROR; localCE_storage *s=NULL; double grid_ext[MAXCEDIM], old_mmin[MAXCEDIM]; int first_instance; double *mmin = P(CE_MMIN); double sqrt2a2; bool is_cutoff = cov->nr == CE_CUTOFFPROC_INTERN; // APMI(cov); // printf("init_circ_embed_local\n");assert(false); // static pref_type pref = // {5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // CE CO CI TBM Sp di sq Ma av n mpp Hy - any ROLE_ASSERT_GAUSS; cov->method = is_cutoff ? CircEmbedCutoff : CircEmbedIntrinsic; if (loc->distances) return ERRORFAILED; NEW_STORAGE(SlocalCE, LOCAL, localCE_storage); s = cov->SlocalCE; if (loc->caniso != NULL) { if (loc->cani_ncol != loc->cani_nrow || loc->cani_ncol != timespacedim) return ERRORDIM; err = GetOrthogonalUnitExtensions(loc->caniso, timespacedim, grid_ext); if (err != NOERROR) goto ErrorHandling; } else { for (i=0; isub[0], LOCPROC_R)) kdefault(key, pLOC_DIAM, P0(LOCPROC_R)); kdefault(key, CE_FORCE, P0INT(CE_FORCE)); PARAMFREE(key, CE_MMIN); PARAMALLOC(key, CE_MMIN, cov->tsdim, 1); PCOPY(key, cov, CE_MMIN); kdefault(key, CE_STRATEGY, P0INT(CE_STRATEGY)); kdefault(key, CE_MAXGB, P0(CE_MAXGB)); kdefault(key, CE_MAXMEM, P0INT(CE_MAXMEM)); kdefault(key, CE_TOLIM, P0(CE_TOLIM)); kdefault(key, CE_TOLRE, P0(CE_TOLRE)); kdefault(key, CE_TRIALS, P0INT(CE_TRIALS)); kdefault(key, CE_USEPRIMES, P0INT(CE_USEPRIMES)); kdefault(key, CE_DEPENDENT, P0INT(CE_DEPENDENT)); // APMI(key); assert(cov->vdim2[0] == cov->vdim2[1]); err = CHECK(key, cov->tsdim, cov->xdimprev, GaussMethodType, cov->domown, cov->isoown, cov->vdim2[0], ROLE_GAUSS); if ((err < MSGLOCAL_OK && err != NOERROR) || err >=MSGLOCAL_ENDOFLIST // 30.5.13 : neu ) { // PMI(cov);AERR(err); goto ErrorHandling; } first_instance = err != NOERROR; for (d=0; dsub[0], *local; local = key->sub[0]; q = local->q; assert(err == NOERROR); for (instance = first_instance; instance < 2; instance++) { //printf("model =%s instance %d %d err=%d %f %d\n", CovList[model->nr].name, // instance, first_instance, err, q[LOCAL_MSG], MSGLOCAL_OK); if (instance == 1) { if (q[LOCAL_MSG] != MSGLOCAL_OK) { if (!CovList[local->nr].alternative(local)) break; } else { if (first_instance == 0 && err != NOERROR) goto ErrorHandling; else BUG; } } else assert(instance == 0); for (d=0; dlength[d] - 1) * loc->xgr[d][XSTEP]); if (mmin[d] > -1.0) mmin[d] = -1.0; } } if ((err = init_circ_embed(key, S)) == NOERROR) break; } if (err != NOERROR) goto ErrorHandling; if (cov->nr == CE_INTRINPROC_INTERN) { sqrt2a2 = sqrt(2.0 * q[INTRINSIC_A2]); // see Stein (2002) timespacedim * cncol if (loc->caniso == NULL) { if ((s->correction = MALLOC(sizeof(double)))==NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } ((double *) s->correction)[0] = sqrt2a2; } else { if ((s->correction = MALLOC(sizeof(double) * rowcol))==NULL){ err = ERRORMEMORYALLOCATION; goto ErrorHandling; } double *stein_aniso = (double*) s->correction; for (i=0; icaniso[i]); stein_aniso[i] = sqrt2a2 * loc->caniso[i]; } } } else { assert(cov->nr == CE_CUTOFFPROC_INTERN); } assert(err == NOERROR); ErrorHandling: for (d=0; dfieldreturn = true; cov->origrf = false; cov->rf = cov->key->rf; cov->simu.active = err == NOERROR; return err; } int struct_ce_local(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel) { cov_model *next = cov->sub[0]; int err; bool cutoff = cov->nr == CE_CUTOFFPROC_INTERN; if (cov->role != ROLE_GAUSS) BUG; if (next->pref[cutoff ? CircEmbedCutoff : CircEmbedIntrinsic] == PREF_NONE) { return ERRORPREFNONE; } if (cov->key != NULL) COV_DELETE(&(cov->key)); if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; addModel(&(cov->key), cutoff ? CUTOFF : STEIN); addModel(&(cov->key), CIRCEMBED); // crash(cov); // da durch init die relevanten dinge gesetzt werden, sollte // erst danach bzw. innerhalb von init der check zum ersten Mal //APMI(cov); return NOERROR; } void do_circ_embed_cutoff(cov_model *cov, gen_storage *S) { // localCE_storage *s = (localCE_storage*) cov->SlocalCE; // assert(s->correction == NULL); do_circ_embed(cov->key, S); } void kappa_localproc(int i, cov_model *cov, int *nr, int *nc){ *nc = 1; *nr = (i==CE_MMIN) ? 0 : i < CovList[cov->nr].kappas ? 1 : -1; // CE_MMIN = cov->tsdim will go wrong in the sequence // $(proj=1) ->intrinsicinternal as $ copies the parameters // to intrinsicinternal and at the same time proj=1 reduces // the tsdim } void range_co_proc(cov_model *cov, range_type *range){ range_ce(cov, range); range->min[LOCPROC_DIAM] = 0.0; // CUTOFF_DIAM range->max[LOCPROC_DIAM] = RF_INF; range->pmin[LOCPROC_DIAM] = 1e-10; range->pmax[LOCPROC_DIAM] = 1e10; range->openmin[LOCPROC_DIAM] = true; range->openmax[LOCPROC_DIAM] = true; range->min[LOCPROC_A] = 0.0; // cutoff_a range->max[LOCPROC_A] = RF_INF; range->pmin[LOCPROC_A] = 0.5; range->pmax[LOCPROC_A] = 2.0; range->openmin[LOCPROC_A] = true; range->openmax[LOCPROC_A] = true; } void range_intrinCE(cov_model *cov, range_type *range) { range_ce(cov, range); range->min[LOCPROC_DIAM] = 0.0; // CUTOFF_DIAM range->max[LOCPROC_DIAM] = RF_INF; range->pmin[LOCPROC_DIAM] = 0.01; range->pmax[LOCPROC_DIAM] = 100; range->openmin[LOCPROC_DIAM] = true; range->openmax[LOCPROC_DIAM] = true; range->min[LOCPROC_R] = 1.0; // stein_r range->max[LOCPROC_R] = RF_INF; range->pmin[LOCPROC_R] = 1.0; range->pmax[LOCPROC_R] = 20.0; range->openmin[LOCPROC_R] = false; range->openmax[LOCPROC_R] = true; } void do_circ_embed_intr(cov_model *cov, gen_storage *S) { cov_model *key = cov->key; assert(key != NULL); location_type *loc = Loc(cov); double x[MAXCEDIM], dx[MAXCEDIM], *res = cov->rf; long index[MAXCEDIM], r; int i, l, k, row = loc->timespacedim, col = cov->tsdim, rowcol = row * col; localCE_storage *s = cov->SlocalCE; bool loggauss = GLOBAL.gauss.loggauss; do_circ_embed(key, S); for (k=0; kcorrection; if (loc->caniso == NULL) { for (l=0; lxgr[k][XSTEP]; for(r=0; ; ) { if (loggauss) { for (k=0; k=loc->length[k])) { index[k]=0; x[k] = 0.0; k++; } if (k>=row) break; x[k] += dx[k]; } } int struct_ce_approx(cov_model *cov, cov_model **newmodel) { assert(cov->nr==CE_CUTOFFPROC_INTERN || cov->nr==CE_INTRINPROC_INTERN || cov->nr==CIRCEMBED); cov_model *next = cov->sub[0]; bool cutoff = cov->nr == CE_CUTOFFPROC_INTERN; if (next->pref[cov->nr==CIRCEMBED ? CircEmbed : cutoff ? CircEmbedCutoff : CircEmbedIntrinsic] == PREF_NONE) { return ERRORPREFNONE; } //PMI(cov); if (cov->role != ROLE_GAUSS) BUG; // assert(!Getgrid(cov)); if (!Getgrid(cov)) { ASSERT_NEWMODEL_NOT_NULL; location_type *loc = Loc(cov); double max[MAXCEDIM], min[MAXCEDIM], centre[MAXCEDIM], x[3 * MAXCEDIM], approx_gridstep = P0(CE_APPROXSTEP); int k, d, len, err, maxgridsize = P0INT(CE_APPROXMAXGRID), // totpts = loc->totalpoints, spatialdim = loc->timespacedim; // vdim = cov->vdim, // vdimSQ = vdim * vdim if (approx_gridstep < 0) SERR("approx_step < 0 forbids approximative circulant embedding"); if (cov->xdimown != loc->timespacedim) SERR("the dimensions of the coordinates and those of the process differ"); GetDiameter(loc, min, max, centre); if (loc->Time) { if (loc->T[XLENGTH] > maxgridsize) SERR("temporal grid too long"); spatialdim--; d = spatialdim; maxgridsize /= loc->T[XLENGTH]; } // printf("app %f %d\n", approx_gridstep, maxgridsize); assert(false); if (ISNA(approx_gridstep)) { double size = loc->spatialtotalpoints * 3; if (size > maxgridsize) size = maxgridsize; for (k=d=0; d maxgridsize) SERR("userdefined, approximate grid is too large"); } if (cov->key!=NULL) COV_DELETE(&(cov->key)); err = covcpy(&(cov->key), cov, x, loc->T, spatialdim, spatialdim, 3, loc->Time, true, false); if (err != NOERROR) return err; cov->key->calling = cov; if ((err = CHECK(cov, cov->tsdim, cov->xdimprev, cov->typus, cov->domprev, cov->isoprev, cov->vdim2[0], cov->role) ) != NOERROR) return err; } if (cov->nr == CIRCEMBED) return NOERROR; else return struct_ce_local(Getgrid(cov) ? cov : cov->key, newmodel); } int init_ce_approx(cov_model *cov, gen_storage *S) { if (Getgrid(cov)) { return cov->nr==CIRCEMBED ? init_circ_embed(cov, S) : init_circ_embed_local(cov, S); } ROLE_ASSERT_GAUSS; location_type *loc = Loc(cov), *keyloc = Loc(cov->key); assert(keyloc != NULL); double //max[MAXCEDIM], //min[MAXCEDIM], cumgridlen[MAXCEDIM]; long i, totpts = loc->totalpoints; int d, err, // maxgridsize = P0INT(CE_APPROXMAXGRID), dim = loc->timespacedim; if (cov->xdimown != loc->timespacedim) SERR("dimensions of the coordinates and those of the process differ"); cov->method = cov->nr==CIRCEMBED ? CircEmbed : cov->nr== CE_CUTOFFPROC_INTERN ? CircEmbedCutoff : CircEmbedIntrinsic; if (loc->distances) return ERRORFAILED; NEW_STORAGE(SapproxCE, CE_APPROX, ce_approx_storage); ce_approx_storage *s = cov->SapproxCE; if ((s->idx = (int*) MALLOC(totpts * sizeof(int)))==NULL) return ERRORMEMORYALLOCATION; cumgridlen[0] = 1; for (d=1; dlength[d-1]; } double *xx = loc->x; for (i=0; ixgr[d][XSTART]); // printf("%f\n", keyloc->xgr[d][XSTEP]); dummy += ((int) ((*xx - keyloc->xgr[d][XSTART]) / keyloc->xgr[d][XSTEP])) * cumgridlen[d]; // printf("i=%d %d d=%d\n", i, dummy, d); } // // printf("i=%d idx=%d\n", i, dummy); s->idx[i] = dummy; } if ((err = cov->nr==CIRCEMBED ? init_circ_embed(cov->key, S) : init_circ_embed_local(cov->key, S)) != NOERROR) return err; if ((err = FieldReturn(cov)) != NOERROR) return err; cov->key->initialised = cov->simu.active = err == NOERROR; return NOERROR; } void do_ce_approx(cov_model *cov, gen_storage *S){ if (Getgrid(cov)) { if (cov->nr==CIRCEMBED) do_circ_embed(cov, S); else if (cov->nr== CE_CUTOFFPROC_INTERN) do_circ_embed_cutoff(cov, S); else do_circ_embed_intr(cov, S); return; } // PMI(cov); cov_model *key=cov->key; location_type *loc = Loc(cov); ce_approx_storage *s = cov->SapproxCE; //cov_model *cov = meth->cov; long i, totpts = loc->spatialtotalpoints, gridpoints = loc->totalpoints; int t, j, instances = loc->T[XLENGTH], *idx = s->idx; double *res = cov->rf, *internalres = key->rf; // APMI(key); DO(key, S); if (key->ownloc->Time) { // time separately given for (j=t=0; tx[i], idx[i]); // print(" %d %d %f %f", i, idx[i], loc->x[i*2], loc->x[i*2 +1]); // print(" %f\n", internalres[idx[i]]); res[i] = internalres[idx[i]]; // assert(i < 70); } } } RandomFields/src/randomshape.h0000644000175100001440000003722712412655466016126 0ustar hornikusers#ifndef RandomShape_H #define RandomShape_H 1 //----------------------------------------------------------------- // MPP operator void kappamppplus(int i, cov_model *cov, int *nr, int *nc); int checkmppplus(cov_model *cov); void rangempplus(cov_model *cov, range_type *range); int struct_mppplus(cov_model *plus, cov_model **newmodel); int init_mppplus(cov_model *cov, gen_storage *s); void do_mppplus(cov_model *cov, gen_storage *s); void mppplus(double *x, cov_model *cov, double *v); //void logmppplus(double *x, cov_model *cov, double *v, double *sign); void pts_given_shape(double *x, cov_model *cov, double *v); void logpts_given_shape(double *x, cov_model *cov, double *v, double *sign); int check_pts_given_shape(cov_model *cov); int struct_pts_given_shape(cov_model *cov, cov_model **newmodel); int init_pts_given_shape(cov_model *cov, gen_storage *S); void do_pts_given_shape(cov_model *cov, gen_storage *S); void range_pts_given_shape(cov_model *cov, range_type *range); void standard_shape(double *x, cov_model *cov, double *v); void logstandard_shape(double *x, cov_model *cov, double *v, double *sign); int check_standard_shape(cov_model *cov); int struct_standard_shape(cov_model *cov, cov_model **newmodel); int init_standard_shape(cov_model *cov, gen_storage *S); void do_standard_shape(cov_model *cov, gen_storage *S); void stationary_shape(double *x, cov_model *cov, double *v); void logstationary_shape(double *x, cov_model *cov, double *v, double *sign); int check_stationary_shape(cov_model *cov); int struct_stationary_shape(cov_model *cov, cov_model **newmodel); int init_stationary_shape(cov_model *cov, gen_storage *S); void do_stationary_shape(cov_model *cov, gen_storage *S); //----------------------------------------------------------------- // Trends void mixed(double *x, cov_model *cov, double *v); void MLEmixed(double *x, cov_model *cov, double *v); void mixed_nonstat(double *x, double *y, cov_model *cov, double *v); void MLEmixed_nonstat(double *x, double *y, cov_model *cov, double *v); void kappamixed(int i, cov_model *cov, int *nr, int *nc); int checkmixed(cov_model *cov); void rangemixed(cov_model *cov, range_type* ra); int initmixed(cov_model *cov, gen_storage *s); void domixed(cov_model *cov, gen_storage *s); void covmatrix_mixed(cov_model *cov, double *v); char iscovmatrix_mixed(cov_model *cov); void trend(double *x, cov_model *cov, double *v); void trend_nonstat(double *x, double *y, cov_model *cov, double *v); int checktrend(cov_model *cov); int checktrendproc(cov_model *cov); void rangetrend(cov_model *cov, range_type* ra); int init_trend(cov_model *cov, gen_storage *s); void do_trend(cov_model *cov, gen_storage *s); void GetInternalMean(cov_model *cov, int vdim, double *mean); void kappatrend(int i, cov_model *cov, int *nr, int *nc); //----------------------------------------------------------------- // shapes void kappa_ave(int i, cov_model *cov, int *nr, int *nc); void ave(double *x, cov_model *cov, double *v); int checkave(cov_model *cov); void rangeave(cov_model *cov, range_type* ra); //void sd_standard(mpp_storage *s, cov_model *cov); int structAve(cov_model *cov, cov_model **newmodel); int check_shapeave(cov_model *cov); int init_shapeave(cov_model *cov, gen_storage *s); void do_shapeave(cov_model *cov, gen_storage *s); void logshapeave(double *x, cov_model *cov, double *v, double *sign); void ball(double *x, cov_model *cov, double *v); int init_ball(cov_model *cov, gen_storage *s); void do_ball(cov_model *cov, gen_storage *s); int struct_ball(cov_model *cov, cov_model **newmodel); void Inverseball(double *x, cov_model *cov, double *v); void kappa_EAxxA(int i, cov_model *cov, int *nr, int *nc); void EAxxA(double *x, cov_model *cov, double *v); int checkEAxxA(cov_model *cov); void rangeEAxxA(cov_model *cov, range_type* ra); void minmaxEigenEAxxA(cov_model *cov, double *mm); void kappa_EtAxxA(int i, cov_model *cov, int *nr, int *nc); void EtAxxA(double *x, cov_model *cov, double *v); int checkEtAxxA(cov_model *cov); void rangeEtAxxA(cov_model *cov, range_type* ra); void minmaxEigenEtAxxA(cov_model *cov, double *mm); void Polygon(double *x, cov_model *cov, double *v); int check_polygon(cov_model *cov); void range_polygon(cov_model *cov, range_type *range); int init_polygon(cov_model *cov, gen_storage *s); int struct_polygon(cov_model *cov, cov_model **newmodel); void Inversepolygon(double *x, cov_model *cov, double *v); void InversepolygonNonstat(double *v, cov_model *cov, double *x, double *y); void kappa_rotat(int i, cov_model *cov, int *nr, int *nc); void rotat(double *x, cov_model *cov, double *v); int checkrotat(cov_model *cov); void rangerotat(cov_model *cov, range_type* ra); void minmaxEigenrotat(cov_model *cov, double *mm); void kappa_Rotat(int i, cov_model *cov, int *nr, int *nc); void Rotat(double *x, cov_model *cov, double *v); int checkRotat(cov_model *cov); void rangeRotat(cov_model *cov, range_type* ra); void kappa_rational(int i, cov_model *cov, int *nr, int *nc); void minmaxEigenrational(cov_model *cov, double *mm); void rational(double *x, cov_model *cov, double *v); int checkrational(cov_model *cov); void rangerational(cov_model *cov, range_type* ra); void kappa_stp(int i, cov_model *cov, int *nr, int *nc); void stp(double *x, double *y, cov_model *cov, double *v); int checkstp(cov_model *cov); void rangestp(cov_model *cov, range_type* ra); int structStp(cov_model *cov, cov_model **newmodel); int check_shapestp(cov_model *cov); int init_shapestp(cov_model *cov, gen_storage *s); void do_shapestp(cov_model *cov, gen_storage *s); void logshapestp(double *x, double *u, cov_model *cov, double *v, double *); void truncsupport(double *x, cov_model *cov, double *v); int checktruncsupport(cov_model *cov); void truncsupportInverse(double *x, cov_model *cov, double *v); void rangetruncsupport(cov_model *cov, range_type *range); int struct_truncsupport(cov_model *cov, cov_model **newmodel); int init_truncsupport(cov_model *cov, gen_storage *s); void do_truncsupport(cov_model *cov, gen_storage *s); void randomsign(double *x, cov_model *cov, double *v); void lograndomsign(double *x, cov_model *cov, double *v, double *sign); void randomsignInverse(double *x, cov_model *cov, double *v); void randomsignNonstatInverse(double *v, cov_model *cov, double *x, double *y); int check_randomsign(cov_model *cov); void range_randomsign(cov_model *cov, range_type *range); int init_randomsign(cov_model *cov, gen_storage *s); int struct_randomsign(cov_model *cov, cov_model **newmodel); void do_randomsign(cov_model *cov, gen_storage *s); //----------------------------------------------------------------- // Gauss Methods void kappa_ce(int i, cov_model *cov, int *nr, int *nc); int check_ce(cov_model *cov); void range_ce(cov_model *cov, range_type *range); int init_circ_embed(cov_model *cov, gen_storage *s); void do_circ_embed(cov_model *cov, gen_storage *s); int struct_ce_approx(cov_model *cov, cov_model **newmodel); int init_ce_approx(cov_model *cov, gen_storage *S); void do_ce_approx(cov_model *cov, gen_storage *S); void kappa_localproc(int i, cov_model *cov, int *nr, int *nc); int check_co_proc(cov_model *cov); int check_co_intern(cov_model *cov); void range_co_proc(cov_model *cov, range_type* ra); void distrD(double *x, cov_model *cov, double *v); void distrP(double *x, cov_model *cov, double *v); void distrQ(double *x, cov_model *cov, double *v); void distrR(double *x, cov_model *cov, double *v); void kappa_distr(int i, cov_model *cov, int *nr, int *nc); int check_distr(cov_model *cov); int init_distr(cov_model *cov, gen_storage *s); void do_distr(cov_model *cov, gen_storage *s); void range_distr(cov_model *cov, range_type *range); void range_intrinCE(cov_model *cov, range_type* ra); int check_local_proc(cov_model *cov); int check_directGauss(cov_model *cov); void range_direct(cov_model *cov, range_type *range); int init_directGauss(cov_model *cov, gen_storage *s); void do_directGauss(cov_model *cov, gen_storage *s); int check_hyperplane(cov_model *cov); int check_hyperplane_intern(cov_model *cov); void range_hyperplane(cov_model *cov, range_type *range); int struct_hyperplane(cov_model *cov, cov_model **newmodel); int init_hyperplane(cov_model *cov, gen_storage *s); void do_hyperplane(cov_model *cov, gen_storage *s); int check_nugget_proc(cov_model *cov); void range_nugget_proc(cov_model *cov, range_type *range); int init_nugget(cov_model *cov, gen_storage *s); void do_nugget(cov_model *cov, gen_storage *s ); int struct_nugget(cov_model *cov, cov_model **newmodel); int check_randomcoin(cov_model *cov); void range_randomcoin(cov_model *cov, range_type *range); //void coin(double *x, cov_model *cov, double *v); int init_randomcoin(cov_model *cov, gen_storage *s); int struct_randomcoin(cov_model *cov, cov_model **newmodel); //void coinInverse(double *x, cov_model *cov, double *v); int struct_randomcoin_extract(cov_model *cov, cov_model **newmodel); int check_sequential(cov_model *cov) ; void range_sequential(cov_model *cov, range_type *range) ; int init_sequential(cov_model *cov, gen_storage *s); void do_sequential(cov_model *cov, gen_storage *s); int check_spectral(cov_model *cov) ; void range_spectral(cov_model *cov, range_type *range) ; int init_spectral(cov_model *cov, gen_storage *s); void do_spectral(cov_model *cov, gen_storage *s ); int struct_spectral(cov_model *plus, cov_model **newmodel); int check_specificGauss(cov_model *cov); int struct_specificGauss(cov_model *cov, cov_model **newmodel); int init_specificGauss(cov_model *cov, gen_storage *S); void do_specificGauss(cov_model *cov, gen_storage *S); void tbm_kappasproc(int i, cov_model *cov, int *nr, int *nc); int checktbmproc(cov_model *cov); void rangetbmproc(cov_model *cov, range_type* ra); int struct_tbmproc(cov_model *cov, cov_model **newmodel); int init_tbmproc(cov_model *cov, gen_storage *s); void do_tbmproc(cov_model *cov, gen_storage *s); //void tbm2num(double *x, cov_model *cov, double *v); //----------------------------------------------------------------- // MPP Methods int init_BRorig(cov_model *cov, gen_storage *s); void do_BRorig(cov_model *cov, gen_storage *s); int init_BRshifted(cov_model *cov, gen_storage *s); void do_BRshifted(cov_model *cov, gen_storage *s); int check_BRmixed(cov_model *cov); int init_BRmixed(cov_model *cov, gen_storage *s); void do_BRmixed(cov_model *cov, gen_storage *s); void range_BRmixed(cov_model *cov, range_type *range); void kappaBRmixed(int i, cov_model *cov, int *nr, int *nc); int initBRuser (cov_model *cov, gen_storage *S); int structBRuser(cov_model *cov, cov_model **newmodel); int structBRintern(cov_model *cov, cov_model **newmodel); //----------------------------------------------------------------- // Processes // checkSproc by checkS int structSproc(cov_model *cov, cov_model **newmodel); int initSproc(cov_model *cov, gen_storage *s); void doSproc(cov_model *cov, gen_storage *s); int checkplusproc(cov_model *cov); int structplusproc(cov_model *cov, cov_model **newmodel); int initplusproc(cov_model *cov, gen_storage *s); void doplusproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) ; int checkmultproc(cov_model *cov); int structmultproc(cov_model *cov, cov_model **newmodel); void rangemultproc(cov_model *cov, range_type *range); int initmultproc(cov_model *cov, gen_storage *s); void domultproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) ; void kappa_binaryprocess(int i, cov_model *cov, int *nr, int *nc); void binary(double *x, cov_model *cov, double *v); int checkbinaryprocess(cov_model *cov); void rangebinaryprocess(cov_model *cov, range_type *range); int struct_binaryprocess(cov_model *cov, cov_model **newmodel); int init_binaryprocess(cov_model *cov, gen_storage *s); void do_binaryprocess(cov_model *cov, gen_storage *s); void BrownResnick(double *x, cov_model *cov, double *v); int checkBrownResnickProc(cov_model *cov); int structBrownResnick(cov_model *cov, cov_model **newmodel); int initBrownResnick(cov_model *cov, gen_storage *s); void doBrownResnick(cov_model *cov, gen_storage *s); void loglikelihoodBR(double *data, cov_model *cov, double *v); void range_likelihood(cov_model *cov, range_type* range); int checkgaussprocess(cov_model *cov); void rangegaussprocess(cov_model *cov, range_type *range); int struct_gaussprocess(cov_model *cov, cov_model **newmodel); int init_gaussprocess(cov_model *cov, gen_storage *s); void do_gaussprocess(cov_model *cov, gen_storage *s); void gaussprocessDlog(double *x, cov_model *cov, double *v); int struct_extractdollar(cov_model *cov, cov_model **newmodel); int check_poisson(cov_model *cov); int struct_poisson(cov_model *cov, cov_model **newmodel); void range_poisson(cov_model *cov, range_type *range); int init_poisson(cov_model *cov, gen_storage *S); void extremalgaussian(double *x, cov_model *cov, double *v); int check_schlather(cov_model *cov); int struct_schlather(cov_model *cov, cov_model **newmodel); void loglikelihoodSchlather(double *data, cov_model *cov, double *v); int struct_smith(cov_model *cov, cov_model **newmodel); int check_smith(cov_model *cov); int struct_smith_pts(cov_model **Key, cov_model *shape, cov_model *calling, int tsdim, int vdim); int checkchisqprocess(cov_model *cov) ; void rangechisqprocess(cov_model *cov, range_type *range) ; int struct_chisqprocess(cov_model *cov, cov_model **newmodel) ; int init_chisqprocess(cov_model *cov, gen_storage *s) ; void do_chisqprocess(cov_model *cov, gen_storage *s); void rangetprocess(cov_model *cov, range_type *range) ; void do_tprocess(cov_model *cov, gen_storage *s); int init_opitzprocess(cov_model *cov, gen_storage *s); void range_opitz(cov_model *cov, range_type *range); void dompp(cov_model *cov, gen_storage *S); int init_mpp(cov_model *cov, gen_storage *S); void range_mpp(cov_model *cov, range_type *range); int SetGEVetc(cov_model *cov, int type); //----------------------------------------------------------------- // Interfaces void simulate(double *x, cov_model *cov, double *v); int check_simulate(cov_model *cov); void range_simulate(cov_model *cov, range_type *range); int struct_simulate(cov_model *cov, cov_model **newmodel); int init_simulate(cov_model *cov, gen_storage *S); // void do_simulate(cov_model *cov, gen_storage *S); void range_simulate(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range); void likelihood(double *data, cov_model *cov, double *v); int check_likelihood(cov_model *cov); int struct_likelihood(cov_model *cov, cov_model **newmodel); void Cov(double *x, cov_model *cov, double *value) ; int check_cov(cov_model *cov) ; int struct_cov(cov_model *cov, cov_model **newmodel); void Fctn(double *x, cov_model *cov, double *value); int check_fctn(cov_model *cov); void CovMatrix(double *x, cov_model *cov, double *value) ; int check_covmatrix(cov_model *cov) ; void EvalDistr(double *x, cov_model *cov, double *v); void kappa_EvalDistr(int i, cov_model *cov, int *nr, int *nc); int check_EvalDistr(cov_model *cov); void range_EvalDistr(cov_model *cov, range_type *range); int struct_EvalDistr(cov_model *cov, cov_model **newmodel); int init_EvalDistr(cov_model *cov, gen_storage *S); // void do_EvalDistr(cov_model *cov, gen_storage *S); void RFget(double *x, cov_model *cov, double *v); int SearchParam(cov_model *cov, get_storage *s) ; int check_RFget(cov_model *cov) ; void range_RFget(cov_model *cov, range_type* range); int struct_RFget(cov_model *cov, cov_model **newmodel); void Variogram(double *x, cov_model *cov, double *value) ; void Pseudovariogram(double *x, cov_model *cov, double *value) ; int check_vario(cov_model *cov); int struct_variogram(cov_model *cov, cov_model **newmodel); void Dummy(double *x, cov_model *cov, double *value); int check_dummy(cov_model *cov); int struct_dummy(cov_model *cov, cov_model **newmodel); //----------------------------------------------------------------- // unsorted #endif /* RandomShape_H */ RandomFields/src/kriging.cc0000644000175100001440000006021412412655466015405 0ustar hornikusers/* Authors Marco Oesting, Martin Schlather, schlather@math.uni-mannheim.de Kriging methods Copyright (C) 2001 -- 2010 Martin Schlather, Copyright (C) 2011 -- 2014 Marco Oesting & Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* PRINTING LEVELS =============== error messages: 1 forcation : 2 minor tracing information : 3--5 large debugging information: >10 */ /* calculate the transformation of the points only once and store the result in a register (indexed by ncov) of key, not of s->. Advantages: points have to calculated only once for several tries; if zonal anisotropy then specific methods may be called; */ #include #include #include #include #include "RF.h" #include #include #include #include #include #define KRIGE_TOLERANCE -1e-10 // Marco: bitte die Definitionen in die RF.h schreiben void matmult(double *A, double *B, double * C, int l, int m, int n); void matmulttransposed(double *A, double *B, double *C, int m, int l, int n); void poly_basis_extern(int *Dim, int *Deg, int *powmatrix); #define STANDARDKRIGING \ double *xx = REAL(X), \ *krig = REAL(Krig), \ *C = NULL, \ *invcov = REAL(Invcov), \ *tgiven = REAL(Tgiven); \ int *notna = LOGICAL(Notna); \ int VARIABLE_IS_NOT_USED d, \ i, j, k, r, s, v, krigi, \ reg = INTEGER(Reg)[0], \ dim = INTEGER(Dim)[0], \ ngiven = INTEGER(Ngiven)[0], \ rep = INTEGER(Rep)[0], \ nx = INTEGER(Nx)[0], \ err = NOERROR, \ vdim = KEY[reg]->vdim2[0], \ vdimng = vdim * ngiven, \ /* len_tgiven = dim * ngiven, */ \ divachtzig = (nx<79) ? 1 : (nx / 79), \ divachtzigM1 = divachtzig - 1; \ bool pr=PL > 0 && GLOBAL.general.pch!='\0' && GLOBAL.general.pch!=' ';\ if ((C = (double*) MALLOC(sizeof(double) * vdimng * vdim))==NULL \ /* || (dist = (double*) MALLOC(sizeof(double) * len_tgiven))==NULL */ \ ) { \ err = ERRORMEMORYALLOCATION; \ goto ErrorHandling; \ } \ #define STANDARDKRIGING2 \ double origin[MAXSIMUDIM], \ *var = NULL, \ *lambda = NULL, \ *data = REAL(Data), \ *sigma2 = REAL(Sigma2); \ int vari; \ STANDARDKRIGING; \ if ((lambda = (double*) MALLOC(sizeof(double) * vdimng))==NULL || \ (var = (double*) MALLOC(sizeof(double) * vdim * vdim))==NULL) { \ err = ERRORMEMORYALLOCATION; \ goto ErrorHandling; \ } \ for (i=0; i NOERROR) goto ErrorHandling; //Calculating the variance CovIntern(reg, origin, var); //Kriging for each kriging point for (i=0; i NOERROR) { // AERR(err); goto ErrorHandling; } /* int invertMethod[MAXINVERSION]; for (i=0; i deg) { dimi[i] = 0; if (i < dim-1) { i++; (dimi[i])++; } powsum = 0; for(d=0; d #include #include #include #include #include #include "RF.h" #include "primitive.h" #include #include "Covariance.h" void addkappa(int i, const char *n, SEXPTYPE t, Types ParamType) { cov_fct *C = CovList + currentNrCov - 1; // printf("%s %s\n", C->name, n); assert(n[0] != '\0' && (n[0] != ONEARGUMENT_NAME || n[1] != '\0') // reserved for standard parameter names && (n[0] != DEFAULT_SUBNAME || (n[1] != '\0' && (n[1] < '1' || n[1] > '9'))) // reserved for standard submodel names ); assert(i < C->kappas); assert(strcmp(n, ELEMENT) || C->check == checkconstant || C->check == checkmixed); strcopyN(C->kappanames[i], n, PARAMMAXCHAR); C->kappatype[i] = t; C->kappaParamType[i] = ParamType; assert(strcmp(n, FREEVARIABLE) || C->internal); if (t >= LISTOF) assert(strcmp(C->kappanames[0], ELEMENT) == 0 || C->check == checkselect ); } void addkappa(int i, const char *n, SEXPTYPE t) { addkappa(i, n, t, RandomType); } void kappanames(const char* n1, SEXPTYPE t1) { assert({cov_fct *C = CovList + currentNrCov - 1; C->kappas == 1;}); addkappa(0, n1, t1); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2) { assert({cov_fct *C = CovList + currentNrCov - 1; C->kappas == 2;}); addkappa(0, n1, t1); addkappa(1, n2, t2); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3) { assert({cov_fct *C = CovList + currentNrCov - 1; C->kappas == 3;}); addkappa(0, n1, t1); addkappa(1, n2, t2); addkappa(2, n3, t3); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 4;}); addkappa(0, n1, t1); addkappa(1, n2, t2); addkappa(2, n3, t3); addkappa(3, n4, t4); } void kappanamesX(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5) { addkappa(0, n1, t1); addkappa(1, n2, t2); addkappa(2, n3, t3); addkappa(3, n4, t4); addkappa(4, n5, t5); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 5;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 6;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5); addkappa(5, n6, t6); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7) { assert({ cov_fct *C = CovList + currentNrCov - 1; C->kappas == 7;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5); addkappa(5, n6, t6); addkappa(6, n7, t7); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 8;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5); addkappa(5, n6, t6); addkappa(6, n7, t7); addkappa(7, n8, t8); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 9;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5); addkappa(5, n6, t6); addkappa(6, n7, t7); addkappa(7, n8, t8); addkappa(8, n9, t9); } void kappanamesX(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10) { kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5); addkappa(5, n6, t6); addkappa(6, n7, t7); addkappa(7, n8, t8); addkappa(8, n9, t9); addkappa(9, n10, t10); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 10;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11) { assert({ cov_fct *C = CovList + currentNrCov - 1; C->kappas == 11;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10); addkappa(10, n11, t11); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11, const char* n12, SEXPTYPE t12) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 12;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10); addkappa(10, n11, t11); addkappa(11, n12, t12); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11, const char* n12, SEXPTYPE t12, const char* n13, SEXPTYPE t13) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 13;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10); addkappa(10, n11, t11); addkappa(11, n12, t12); addkappa(12, n13, t13); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11, const char* n12, SEXPTYPE t12, const char* n13, SEXPTYPE t13, const char* n14, SEXPTYPE t14) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 14;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10); addkappa(10, n11, t11); addkappa(11, n12, t12); addkappa(12, n13, t13); addkappa(13, n14, t14); } void kappanamesX(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11, const char* n12, SEXPTYPE t12, const char* n13, SEXPTYPE t13, const char* n14, SEXPTYPE t14, const char* n15, SEXPTYPE t15) { kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10); addkappa(10, n11, t11); addkappa(11, n12, t12); addkappa(12, n13, t13); addkappa(13, n14, t14); addkappa(14, n15, t15); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11, const char* n12, SEXPTYPE t12, const char* n13, SEXPTYPE t13, const char* n14, SEXPTYPE t14, const char* n15, SEXPTYPE t15) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 15;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10, n11, t11, n12, t12, n13, t13, n14, t14, n15, t15); } void kappanames(const char* n1, SEXPTYPE t1, const char* n2, SEXPTYPE t2, const char* n3, SEXPTYPE t3, const char* n4, SEXPTYPE t4, const char* n5, SEXPTYPE t5, const char* n6, SEXPTYPE t6, const char* n7, SEXPTYPE t7, const char* n8, SEXPTYPE t8, const char* n9, SEXPTYPE t9, const char* n10, SEXPTYPE t10, const char* n11, SEXPTYPE t11, const char* n12, SEXPTYPE t12, const char* n13, SEXPTYPE t13, const char* n14, SEXPTYPE t14, const char* n15, SEXPTYPE t15, const char* n16, SEXPTYPE t16) { assert({ cov_fct *C = CovList + currentNrCov - 1;C->kappas == 16;}); kappanamesX(n1, t1, n2, t2, n3, t3, n4, t4, n5, t5, n6, t6, n7, t7, n8, t8, n9, t9, n10, t10, n11, t11, n12, t12, n13, t13, n14, t14, n15, t15); addkappa(15, n16, t16); } sortsofparam standard_paramtype(int k, int VARIABLE_IS_NOT_USED row, int VARIABLE_IS_NOT_USED col) { // for MLE // k non-negative: k-th parameter // k negative: (i-1)th submodel return k<0 ? VARPARAM : CRITICALPARAM; // k<0: varparam used to indicate that variance is allowed for submodel, // see recursive call getnaposition; E.g. not allowed for second submodel // of nsst: the variance parameter is something between scale and variance } sortsofparam ignoreall_paramtype(int VARIABLE_IS_NOT_USED k, int VARIABLE_IS_NOT_USED row, int VARIABLE_IS_NOT_USED col) { // for MLE // k non-negative: k-th parameter // k negative: (i-1)th submodel return IGNOREPARAM; // k<0: varparam used to indicate that variance is allowed for submodel, // see recursive call getnaposition; E.g. not allowed for second submodel // of nsst: the variance parameter is something between scale and variance } sortsofparam uncritical_paramtype(int k, int VARIABLE_IS_NOT_USED row, int VARIABLE_IS_NOT_USED col) { // for MLE // k non-negative: k-th parameter // k negative: (i-1)th submodel return k<0 ? VARPARAM : ANYPARAM; // k<0: varparam used to indicate that variance is allowed for submodel, // see recursive call getnaposition; E.g. not allowed for second submodel // of nsst: the variance parameter is something between scale and variance } void add_paramtype(paramtype_fct paramtype) { cov_fct *C = CovList + currentNrCov - 1; C->paramtype = paramtype; } void addsub(int i, const char *n) { cov_fct *C = CovList + currentNrCov - 1; int j; assert(n[0] != ONEARGUMENT_NAME && n[0] != DEFAULT_SUBNAME); assert(i < MAXSUB); strcopyN(C->subnames[i], n, PARAMMAXCHAR); C->subintern[i] = false; for (j=0; jkappas; j++) { if (C->kappanames[j] == NULL) error("give all names for the parameters first"); if ((C->subintern[i] = strcmp(C->kappanames[j], C->subnames[i]) == 0)) break; } } void subnames(const char* n1) { addsub(0, n1); } void subnames(const char* n1, const char* n2) { addsub(0, n1); addsub(1, n2); } void subnames(const char* n1, const char* n2, const char* n3) { addsub(0, n1); addsub(1, n2); addsub(2, n3); } void subnames(const char* n1, const char* n2, const char* n3, const char* n4) { addsub(0, n1); addsub(1, n2); addsub(2, n3); addsub(3, n4); } void subnames(const char* n1, const char* n2, const char* n3, const char* n4, const char* n5) { addsub(0, n1); addsub(1, n2); addsub(2, n3); addsub(3, n4); addsub(4, n5); } void subnames(const char* n1, const char* n2, const char* n3, const char* n4, const char* n5, const char* n6) { addsub(0, n1); addsub(1, n2); addsub(2, n3); addsub(3, n4); addsub(4, n5); addsub(5, n6); } int xxx(int x) {return (int) pow(10, (double) x);} void crash(int i) { PRINTF("crash!!!!\n"); #ifdef LOCAL_MACHINE char m[1]; m[i] = m[i-9] + 4; PRINTF("%s\n", m); // not MEMCOPY #endif } void crash() { crash(10); } void ErrCovX(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double VARIABLE_IS_NOT_USED *v, const char *name) { // PRINTF("\nErr%s %s [%d] gatter=%d:\n", name, NICK(cov), cov->nr, cov->gatternr); // ok if (PL >= PL_ERRORS){ PMI(cov, "ErrCov");// crash(); } ERR("unallowed or undefined call of function"); } void ErrCov(double *x, cov_model *cov, double *v) { ErrCovX(x, cov, v, "Cov");} void ErrD(double *x, cov_model *cov, double *v) { ErrCovX(x, cov, v, "D");} void ErrRnd(double *x, cov_model *cov, double *v) { ErrCovX(x, cov, v, "Rnd");} void ErrLogCov(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double VARIABLE_IS_NOT_USED *v, double VARIABLE_IS_NOT_USED *sign) { // PRINTF("\nErrlogCov %s:\n", NICK(cov)); if (PL >= PL_ERRORS) { PMI(cov, "ErrlogCov");// crash(); } ERR("unallowed or undefined call of function (log)"); } void ErrCovNonstat(double VARIABLE_IS_NOT_USED *x, double VARIABLE_IS_NOT_USED *y, cov_model *cov, double VARIABLE_IS_NOT_USED *v) { PRINTF("\nErrCovNonstat %s: (%d)\n", NICK(cov), cov->nr); // APMI(cov->calling); if (PL >= PL_ERRORS) { PMI(cov->calling, "ErrCovNonstat"); // crash(); } ERR("unallowed or undefined call of non-domain function"); } void ErrLogCovNonstat(double VARIABLE_IS_NOT_USED *x, double VARIABLE_IS_NOT_USED *y, cov_model *cov, double VARIABLE_IS_NOT_USED *v, double VARIABLE_IS_NOT_USED *sign) { PRINTF("\nErrlogCovNonstat %s: (%d)\n", NICK(cov), cov->nr); if (PL >= PL_ERRORS) { PMI(cov->calling, "ErrLogCovNonstat"); // crash(); } ERR("unallowed or undefined call of non-domain function (log)"); } void Errspectral(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s, double VARIABLE_IS_NOT_USED *e) { PRINTF("\nErrlogCovNonstat %s: (%d)\n", NICK(cov), cov->nr); if (PL >= PL_ERRORS) { PMI(cov->calling, "Errspectral"); // crash(); } ERR("unallowed or undefined call of spectral function"); } void ErrInverseNonstat(double VARIABLE_IS_NOT_USED *v, cov_model *cov, double *x, double *y) { x[0] = y[0] = RF_NAN; return; PRINTF("\nErrCovNonstat %s: (%d)\n", NICK(cov), cov->nr); // APMI(cov->calling); if (PL >= PL_ERRORS) { PMI(cov->calling, "ErrCovNonstat"); // crash(); } ERR("unallowed or undefined call of non-domain function (inverse)"); } void ErrInverse(double VARIABLE_IS_NOT_USED *v, cov_model VARIABLE_IS_NOT_USED *cov, double *x) { x[0] = RF_NAN; return; } char InternalName[]="-"; void kappasize1(int VARIABLE_IS_NOT_USED i, cov_model VARIABLE_IS_NOT_USED *cov, int *nrow, int *ncol) { *nrow = *ncol = 1; } void rangeOK(cov_model VARIABLE_IS_NOT_USED *cov, range_type VARIABLE_IS_NOT_USED *range) { assert(CovList[cov->nr].kappas == 0); } int structOK(cov_model VARIABLE_IS_NOT_USED *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ return NOERROR;} int struct_statiso(cov_model *cov, cov_model **newmodel) { cov_fct *C = CovList + cov->nr; // printf("struct_statiso %s role=%s\n", NICK(cov), ROLENAMES[cov->role]); ASSERT_NEWMODEL_NOT_NULL; if (hasAnyShapeRole(cov)) { int i, vdim = cov->vdim2[0]; for (i=0; impp.maxheights[i] = 1.0; } switch (cov->role) { case ROLE_POISSON_GAUSS : SERR1("Unexpected call of 'struct' by '%s'", NICK(cov)); break; case ROLE_POISSON : if (C->finiterange == true) { return addUnifModel(cov, 1.0, newmodel); } else SERR2("The function '%s' has inifinite support use '%s' to truncate the support.", NICK(cov), CovList[TRUNCSUPPORT].nick); break; // case MAX_STABLE : to do: numerisch die Funktion integrieren default : ILLEGAL_ROLE_STRUCT; } return NOERROR; } int struct_failed(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel) { // PMI(cov); // printf("%ld %ld %ld\n", CovList[cov->nr].Struct, CovList[DISTRIBUTION].Struct, struct_failed); crash(); SERR3("initialization failed -- model '%s' (%d) does not fit (yet) the properties required by '%s'.", NICK(cov), cov->nr, cov->calling == NULL ? "" : NICK(cov->calling)); } int initOK(cov_model *cov, gen_storage *s) { cov_fct *C = CovList + cov->nr; // nicht gatternr int i, err = NOERROR, nk = C->kappas; bool random = false; for (i=0; ikappasub[i]; if (ks != NULL) { if (isRandom(C->kappaParamType[i])) { random = true; if ((err = INIT(ks, cov->mpp.moments, s)) != NOERROR) return err; } else { SERR2("%s : parameter %s is not of random type", NICK(cov), C->kappanames[i]); } } } if (random) SERR("'initOK' not programmed yet for 'random'"); return err; } int init_failed(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { if (PL >= PL_ERRORS) PRINTF("init failed cov=%s:\n", NICK(cov)); SERR("Init failed. Compound Poisson fields are essentially only programmed for simple and isotropic shape functions (not kernels)"); return ERRORFAILED; } int init_statiso(cov_model *cov, gen_storage *s) { // only domain and isotropic models cov_fct *C = CovList + cov->nr; // nicht gatternr int err; if (cov->finiterange == true) { if (C->finiterange == true) { // ?? to do ?? // cov->mpp.refradius = 1.0; // jetzt ueber Inverse abgefangen } } if ((err = initOK(cov, s)) == NOERROR) return err; if (cov->role == ROLE_POISSON) { return NOERROR; } if (PL >= PL_ERRORS) PRINTF("init failed cov=%s:\n", NICK(cov)); // PMI(cov); SERR("Call of init: Compound Poisson fields are essentially only programmed for domain and isotropic functions"); return NOERROR; } void standard_likelihood(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *v){ int i, nsub = cov->nsub, kappas = CovList[cov->nr].kappas; cov_model *sub; double dummy; *v = 0.0; for (i=0; ikappasub[i]) != NULL) { if (TypeConsistency(ProcessType, sub) && !TypeConsistency(TrendType, sub)) error("Baysian modelling currently only works with simple models"); if (TypeConsistency(RandomType, sub)) { if (CovList[sub->nr].kappatype[i]!=REALSXP) error("currently only real-valued parameters can be random"); VTLG_DLOG(P(i), sub, &dummy); *v += dummy; } else { VTLG_DLOG(NULL, sub, &dummy); *v += dummy; } } } for (i=0; isub[i]; if (sub->deterministic) continue; if (TypeConsistency(RandomType, sub)) { error("Baysian modelling only works with simple models."); } VTLG_DLOG(NULL, sub, &dummy); *v += dummy; } } void doOK(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VARIABLE_IS_NOT_USED *s){ } void do_failed(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { //PMI(cov->calling); if (PL >= PL_ERRORS) PRINTF("do failed for %s:\n", NICK(cov)); ERR("call of do: compound Poisson fields are essentially only programmed for isotropic shape functions (not kernels)"); } void do_random_failed(cov_model *cov, double VARIABLE_IS_NOT_USED *v) { if (PL >= PL_ERRORS) PRINTF("do_random failed for %s:\n", NICK(cov)); ERR("Call of do: Compound Poisson fields are essentially only programmed for isotropic shape functions (not kernels)"); } void do_random_ok(cov_model VARIABLE_IS_NOT_USED *cov, double VARIABLE_IS_NOT_USED *v) { } void do_statiso(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { if (cov->role == ROLE_POISSON || cov->role == ROLE_MAXSTABLE) return; if (PL >= PL_ERRORS) { // PMI(cov); PRINTF("do_statosp failed for '%s' and role='%s':\n", NICK(cov), ROLENAMES[cov->role]); if (PL >= PL_ERRORS) ERR("Call of do_statiso: compound Poisson fields are essentially only programmed for isotropic shape functions (not kernels)"); } } static int badname = -1; void nickname(const char *name, int nr) { char dummy[MAXCHAR]; cov_fct *C = CovList + nr; // nicht gatternr int sl = strlen(CAT_TYPENAMES[C->Type]); strcopyN(dummy, name, MAXCHAR-sl); sprintf(C->nick, "%s%s", CAT_TYPENAMES[C->Type], dummy); strcpy(CovNickNames[nr], C->nick); if ((int) strlen(name) >= (int) MAXCHAR - sl) { badname = nr; } else { if (badname >= 0 && badname != nr) PRINTF("Warning! Nick name is truncated to `%s'.\n", CovList[badname].nick); badname = -1; } } void insert_name(int curNrCov, const char *name) { cov_fct *C = CovList + curNrCov; char dummy[MAXCHAR]; strcopyN(dummy, name, MAXCHAR); strcpy(CovNames[curNrCov], dummy); strcpy(C->name, dummy); if (strlen(name)>=MAXCHAR) { PRINTF("Warning! Covariance name is truncated to `%s'.\n", C->name); } assert(strcmp(InternalName, name)); nickname(name, curNrCov); } void StandardCovariance(cov_model *cov, double *v){ CovVario(cov, true, false, v); } void StandardCovMatrix(cov_model *cov, double *v) { CovarianceMatrix(cov, v); } void StandardInverseCovMatrix(cov_model *cov, double *v) { InverseCovMatrix(cov, v); } void StandardVariogram(cov_model *cov, double *v) { //assert(false); CovVario(cov, false, false, v); } void StandardPseudoVariogram(cov_model *cov, double *v) { CovVario(cov, false, true, v); } void StandardSelectedCovMatrix(cov_model *cov, int *sel, int nsel, double *v) { SelectedCovMatrix(cov, sel, nsel, v); } void StandardInverseNonstat(double *v, cov_model *cov, double *left, double *right) { assert(CovList[cov->nr].inverse != NULL); double x; int d, dim = cov->tsdim; // !! und nicht cov->xdimown, xdimprev !! INVERSE(v, cov, &x); for (d=0; dnr].inverse != NULL); double x, w = exp(*v); int d, dim = cov->tsdim; // PMI(cov); printf("%d %d\n", dim, cov->tsdim); INVERSE(&w, cov, &x); for (d=0; d 1, just take the first component. // Of course also mea over all components might be passible as well #define step 2.0 #define tol 1e-8 #define max_it 30 if (cov->vdim2[0] != cov->vdim2[1]) BUG; int vdim = cov->vdim2[0], vdimSq = vdim * vdim; if (cov->Sinv == NULL) NEW_STORAGE(Sinv, INV, inv_storage); ALLOC_NEW(Sinv, v, vdimSq, v); ALLOC_NEW(Sinv, wert, vdimSq, wert); double left, right, middle, leftinverse, x = 0.0, u = *U; bool greater; int i; COV(&x, cov, v); greater = *v > u; *wert = *v; x = step; for (i=0; i= u)) break; x *= step; } if (i >= max_it) { *inverse = fabs(*v - u) <= fabs(*wert - u) ? 0.0 : RF_INF; return; } *inverse = *wert; right = x; left = x == step ? 0 : x / step; for (i=0; i= u)) { right = middle; } else { left = middle; leftinverse = *wert; } } *inverse = leftinverse == u ? left : right; // if (PL > 1) {PMI(cov); PRINTF("inverse: %f -> %f\n", u, *inverse);} } void InverseIsoMon(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double VARIABLE_IS_NOT_USED *v){ searchInverse(CovList[cov->nr].cov, cov, 1.0, *x, 0.001); } void createmodel(const char *name, Types type, int kappas, size_fct kappasize, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, int vdim, pref_shorttype pref, int maxdim, ext_bool finiterange, int monotone) { int i; cov_fct *C = CovList + currentNrCov; bool stat_iso = domain == XONLY && isotropy == ISOTROPIC; assert(domain >= 0 && isotropy >= 0); if (currentNrCov==-1) InitModelList(); assert(CovList!=NULL); assert(currentNrCov>=0); if (currentNrCov>=MAXNRCOVFCTS) { char msg[150]; sprintf(msg, "maximum number of covariance models reached. Last included model is '%s'.", CovList[MAXNRCOVFCTS-1].name); warning(msg); } if (PL >= PL_DETAILS) PRINTF("%d %s vdim=%d statiso=%d iso=%d\n", currentNrCov, name, vdim, stat_iso, isotropy); C->Type = type; // ganz vorne // printf("%d %s vdim=%d statiso=%d iso=%d\n", currentNrCov, name, vdim, stat_iso, isotropy); // printf("type = %d\n", type); assert(type >=0 && type <= OtherType); C->TypeFct = NULL; insert_name(currentNrCov, name); //if (domain == PARAM_DEP) printf("%s\n", C->nick); // nachfolgendes unbedingt lassen, da sonst vor Aufruf von Interface // reduzierende Gatter gesetzt werden koennten assert(type != InterfaceType || (domain == XONLY && isotropy==UNREDUCED)); C->kappas = kappas; assert(kappas >= 0 && kappas <= MAXPARAM); C->minsub = C->maxsub = 0; C->domain = domain; C->isotropy = isotropy; C->vdim = vdim; assert(vdim != MISMATCH); // if (vdim == SUBMODEL_DEP) printf("SUBMODELDEP %s\n", name); // if (vdim == PREVMODEL_DEP) printf("prevMODELDEP %s\n", name); C->maxdim = maxdim; C->maxmoments = 0; assert(maxdim != MISMATCH); for (i=0; ikappanames[i], "k%d", i); // default (repeated twice) C->kappatype[i] = REALSXP; } C->kappasize = (kappasize == NULL) ? kappasize1 : kappasize; C->paramtype=standard_paramtype; if (kappas==0) { assert(range == NULL); C->range=rangeOK; } else { assert(range != NULL); C->range= range; } C->check = check; assert(check != NULL); for (i=0; iimplemented[i] = NOT_IMPLEMENTED; C->internal = false; C->Specific = MISMATCH; assert(finiterange != MISMATCH); assert(finiterange != PARAM_DEP || check==checktbmop); C->finiterange = finiterange; assert(monotone != MISMATCH || (monotone == MISMATCH && (type==RandomType || type== PointShapeType || type== InterfaceType || type== GaussMethodType || type== BrMethodType || type==ProcessType))); assert(monotone != PARAM_DEP); C->Monotone = monotone; MEMCOPY(C->pref, pref, sizeof(pref_shorttype)); C->cov = ErrCov; C->logD = C->D = C->D2 = C->D3 = C->D4 =C->tbm2 = C->nabla = C->hess = ErrD; C->random = ErrRnd; C->inverse = finiterange == true ? InverseFiniteRange : stat_iso ? InverseIsotropic : ErrInverse; C->nonstat_inverse = C->nonstat_loginverse = C->nonstat_inverse_D = ErrInverseNonstat; C->density = MISMATCH; C->log = ErrLogCov; C->F_derivs = C->RS_derivs = isProcess(type) ? 0 : MISMATCH; C->nonstat_cov = C->nonstat_D = C->nonstat_random = ErrCovNonstat; C->nonstatlog = ErrLogCovNonstat; C->aux_cov = NULL; C->coinit = C->ieinit = NULL; C->alternative = NULL; C->spectral=Errspectral; C->drawmix = NULL; C->logmixdens = NULL; if (isNegDef(type) || isShape(type)) C->logD = standard_likelihood; C->Struct = stat_iso ? struct_statiso : struct_failed; C->Init = stat_iso ? init_statiso : init_failed; // !!!! see isDummyInit below // printf("%s failed=%d\n", C->nick, !stat_iso); C->Do = stat_iso ? do_statiso : do_failed; C->DoRandom = do_random_failed; C->minmaxeigenvalue = NULL; C->hyperplane=NULL; C->primitive = true; C->covariance = StandardCovariance; C->covmatrix = StandardCovMatrix; C->inversecovmatrix = StandardInverseCovMatrix; C->variogram = StandardVariogram; C->pseudovariogram = StandardPseudoVariogram; C->selectedcovmatrix = StandardSelectedCovMatrix; C->is_covariance=C->is_covmatrix=C->is_inversecovmatrix=C->is_variogram = C->is_pseudovariogram = isFalse; C->TaylorN = C->TailN = MISMATCH; currentNrCov++; } bool isDummyInit(initfct Init) { return Init == init_statiso || Init == init_failed; } int CopyModel(const char *name, int which) { memcpy(CovList + currentNrCov, CovList + which, sizeof(cov_fct)); insert_name(currentNrCov, name); currentNrCov++; return currentNrCov - 1; } int CopyModel(const char *name, int which, Types type) { CopyModel(name, which); int nr = currentNrCov - 1; CovList[nr].Type = type; return nr; } int CopyModel(const char *name, int which, checkfct check) { CopyModel(name, which); int nr = currentNrCov - 1; CovList[nr].check = check; return nr; } /* int CopyModel(const char *name, int which, checkfct check) { CopyModel(name, which); int nr = currentNrCov - 1; CovList[nr].check = check; } */ void nickname(const char *name) { int nr = currentNrCov - 1; nickname(name, nr); } int IncludePrim(const char *name, Types type, int kappas, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, NULL, domain, isotropy, check, range, SCALAR, PREF_ALL, maxdim, finiterange, monotonicity); return currentNrCov - 1; } int IncludePrim(const char *name,Types type, int kappas, size_fct kappasize, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, kappasize, domain, isotropy, check, range, SCALAR, PREF_ALL, maxdim, finiterange, monotonicity); return currentNrCov - 1; } int IncludePrim(const char *name, Types type, int kappas, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, int vdim, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, NULL, domain, isotropy, check, range, vdim, PREF_ALL, maxdim, finiterange, monotonicity); return currentNrCov - 1; } int IncludePrim(const char *name,Types type, int kappas, size_fct kappasize, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, int vdim, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, kappasize, domain, isotropy, check, range, vdim, PREF_ALL, maxdim, finiterange, monotonicity); return currentNrCov - 1; } int IncludePrim(const char *name,Types type, int kappas, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, pref_type pref, int vdim, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, NULL, domain, isotropy, check, range, vdim, pref, maxdim, finiterange, monotonicity); return currentNrCov - 1; } int IncludePrim(const char *name,Types type, int kappas, size_fct kappasize, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, pref_type pref, int vdim, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, kappasize, domain, isotropy, check, range, vdim, pref, maxdim, finiterange, monotonicity); return currentNrCov - 1; } void make_internal() { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr C->internal = true; } // extern ?! int IncludeModel(const char *name, Types type, int minsub, int maxsub, int kappas, size_fct kappasize, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, pref_type pref, bool internal, int vdim, int maxdim, ext_bool finiterange, int monotonicity) { createmodel(name, type, kappas, kappasize, domain, isotropy, check, range, vdim, pref, maxdim, finiterange, monotonicity); // assert(maxsub > 0); // check deleted 25. nov 2008 due to nugget assert(maxsub >= minsub && maxsub <= MAXSUB); assert(check != checkOK || maxsub==0); int i, nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr C->minsub = minsub; C->maxsub = maxsub; /* if (maxsub == 0) printf("not primitive: %s \n", name); // not primitive: biWM not primitive: constant not primitive: epsC not primitive: matern not primitive: nugget not primitive: trend not primitive: whittle (and others?) */ assert(minsub <= maxsub); if (PL>=PL_SUBDETAILS && maxsub == 0) PRINTF("note: %s has no submodels\n", C->name); C->primitive = false; // muss falls sein, sonst wird kappacheck // aufgerufen C->internal = internal; // if (internal) printf("internal: %s %s\n", C->nick, C->name); if (maxsub <= 2) { if (maxsub >= 1) { addsub(0, "phi"); if (maxsub >= 2) { addsub(1, "psi"); } } } else { for (i=0; isubnames[i], "C%d", i); // default (repeated twice) C->subintern[i] = false; } } return nr; } int IncludeModel(const char *name, Types type, int minsub, int maxsub, int kappas, domain_type domain, isotropy_type isotropy, checkfct check, rangefct range, pref_type pref, int maxdim, ext_bool finiterange, int monotonicity) { return IncludeModel(name, type, minsub, maxsub, kappas, NULL, domain, isotropy, check, range, pref, false, SCALAR, maxdim, finiterange, monotonicity); } #define IMPLEMENTED_SEQUENTIAL C->vdim <= 1 && \ (C->domain == PREVMODELD || \ ((isPosDef(C->Type) || isUndefinedType(C->Type)) && C->domain == XONLY)) #define IMPLEMENTED_CE \ (((isPosDef(C->Type) || isUndefinedType(C->Type)) && C->domain == XONLY) \ || C->domain == PREVMODELD) void addCov(int F_derivs, covfct cf, covfct D, covfct D2, covfct inverse, nonstat_inv nonstat_inverse) { int nr = currentNrCov - 1; assert(nr>=0 && nrdomain == XONLY && C->isotropy == ISOTROPIC; C->cov = cf; if (C->RS_derivs < 0) C->RS_derivs = 0; assert(C->nonstat_cov == ErrCovNonstat); if (D != NULL) { assert(cf != NULL); if (C->cov!=NULL && C->RS_derivs < 1) C->RS_derivs = 1; C->D=D; assert(C->isotropy == ISOTROPIC || C->isotropy == SPACEISOTROPIC || C->isotropy == PREVMODELI || C->isotropy == PARAM_DEP); // C->implemented[TBM2] = NUM_APPROX; C->implemented[TBM] = true; } if (D2 != NULL) { assert(D != NULL); C->D2 = D2; if (C->cov!=NULL && C->D != NULL && C->RS_derivs < 2) C->RS_derivs = 2; } if (inverse != NULL) C->inverse = inverse; else if (isMonotone(C->Monotone) && C->isotropy == ISOTROPIC && C->inverse==ErrCov) C->inverse = InverseIsoMon; if (stat_iso && C->inverse != ErrInverse) C->nonstat_loginverse = StandardLogInverseNonstat; // if (nonstat_inverse != NULL) printf("nonstat %s\n", C->nick); C->nonstat_inverse = nonstat_inverse!=NULL ? nonstat_inverse : stat_iso && inverse != NULL ? StandardInverseNonstat : ErrInverseNonstat; C->implemented[Direct] = cf != NULL; C->implemented[CircEmbed] = cf != NULL && IMPLEMENTED_CE; // printf("%s %d %d\n", C->nick, C->implemented[CircEmbed], C->pref[CircEmbed]); C->implemented[Sequential] = IMPLEMENTED_SEQUENTIAL; C->F_derivs = F_derivs >= 0 ? F_derivs : C->RS_derivs; assert(C->F_derivs <= C->RS_derivs); } void addCov(covfct cf, covfct D, covfct D2, covfct inverse) { addCov(MISMATCH, cf, D, D2, inverse, NULL); } void addCov(covfct cf, covfct D, covfct D2, nonstat_inv inverse) { addCov(MISMATCH, cf, D, D2, NULL, inverse); } void addCov(covfct cf, covfct D, covfct D2, covfct inverse, nonstat_inv nonstat_inverse) { addCov(MISMATCH, cf, D, D2, inverse, nonstat_inverse); } void addCov(int F_derivs, covfct cf, covfct D, covfct inverse) { addCov(F_derivs, cf, D, NULL, inverse, NULL); } void addCov(covfct cf, covfct D, covfct inverse) { addCov(MISMATCH, cf, D, inverse); } void addCov(int F_derivs, covfct cf, covfct D, covfct D2, covfct D3, covfct D4, covfct inverse, nonstat_inv nonstat_inverse) { int nr = currentNrCov - 1; assert(nr>=0 && nrD3 = D3; assert(C->RS_derivs == 2 && D3 != NULL); if (D4 == NULL) { C->RS_derivs = 3; } else { C->RS_derivs = 4; C->D4 = D4; C->F_derivs = F_derivs >= 0 ? F_derivs : C->RS_derivs; assert(C->F_derivs <= C->RS_derivs); } } void addCov(covfct cf, covfct D, covfct D2, covfct D3, covfct D4, covfct inverse) { addCov(-1, cf, D, D2, D3, D4, inverse, NULL); } void addCov(covfct cf, covfct D, covfct D2, covfct D3, covfct D4, covfct inverse, nonstat_inv nonstat_inverse) { addCov(-1, cf, D, D2, D3, D4, inverse, nonstat_inverse); } void addCov(int F_derivs, nonstat_covfct cf) { int nr = currentNrCov - 1; assert((nr>=0) && (nrnonstat_cov = cf; C->implemented[Direct] = true; C->implemented[CircEmbed] = IMPLEMENTED_CE; C->implemented[Sequential] = IMPLEMENTED_SEQUENTIAL; if (C->RS_derivs < 0) { C->RS_derivs = 0; C->F_derivs = F_derivs >= 0 ? F_derivs : C->RS_derivs; assert(C->F_derivs <= C->RS_derivs); } } void addCov(nonstat_covfct cf) { addCov(-1, cf); } void addCov(aux_covfct auxcf){ int nr = currentNrCov - 1; assert((nr>=0) && (nrcov == ErrCov && C->nonstat_cov==ErrCovNonstat); C->aux_cov = auxcf; } void addCov(covfct distrD, covfct logdistrD, nonstat_inv Dinverse, covfct distrP, nonstat_covfct distrP2sided, covfct distrQ, covfct distrR, nonstat_covfct distrR2sided) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr assert(nr>=0 && nrdomain == STAT_MISMATCH); assert(C->isotropy == ISO_MISMATCH); assert(distrD != NULL && logdistrD!=NULL && Dinverse != NULL && distrP != NULL && distrQ != NULL && distrR != NULL); assert(C->Struct != struct_failed && C->Init !=init_failed); C->RS_derivs = 1; C->F_derivs = 0; C->cov = distrP; C->D = distrD; C->logD = logdistrD; C->nonstat_inverse_D = Dinverse; C->inverse = distrQ; C->random = distrR; if (distrP2sided != NULL || distrR2sided !=NULL) { assert(distrP2sided != NULL && distrR2sided !=NULL); C->nonstat_cov = distrP2sided; C->nonstat_random = distrR2sided; C->domain = PREVMODELD; } else { assert(distrP2sided == NULL && distrR2sided ==NULL); C->domain = XONLY; } C->isotropy = CARTESIAN_COORD; } void addlogD(covfct logdistrD) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr assert(nr>=0 && nrType)); assert(C->domain == XONLY); assert(C->isotropy == UNREDUCED); assert(logdistrD!=NULL); assert(C->Struct != struct_failed); assert( C->Init !=init_failed); C->RS_derivs = 1; C->F_derivs = 0; C->logD = logdistrD; C->D = StandardNonLogDistrD; } /* void addlogD(covfct logD) { int nr = currentNrCov - 1; assert((nr>=0) && (nrlogD = logD; } */ void addlogCov(logfct log, nonstat_logfct nonstatlog, nonstat_inv nonstat_loginverse) { int nr = currentNrCov - 1; assert((nr>=0) && (nrlog = log; else assert(nonstatlog != NULL); if (nonstatlog != NULL) C->nonstatlog = nonstatlog; if (nonstat_loginverse!=NULL) C->nonstat_loginverse = nonstat_loginverse; } void addlogCov(logfct log) { addlogCov(log, NULL, NULL); } void addlogCov(nonstat_logfct nonstatlog) { addlogCov(NULL, nonstatlog, NULL); } int addFurtherCov(int F_derivs, covfct cf, covfct D, covfct D2) { assert(currentNrCov > 0); cov_fct *C = CovList + currentNrCov; MEMCOPY(C, C - 1, sizeof(cov_fct)); assert(C->vdim == SCALAR || C->vdim == SUBMODEL_DEP || C->vdim == PARAM_DEP || D == NULL); strcopyN(CovNames[currentNrCov], InternalName, MAXCHAR); C->name[0] = InternalName[0]; strcopyN(C->name + 1, CovList[currentNrCov-1].name, MAXCHAR - 1); if (cf != NULL) { C->cov = cf; C->RS_derivs = 0; } if (D != NULL) { assert(cf != NULL); C->D = D; C->RS_derivs = 1; assert(C->isotropy == ISOTROPIC || C->isotropy == SPACEISOTROPIC || C->isotropy == ZEROSPACEISO || C->isotropy == PREVMODELI); //C->implemented[TBM2] = NUM_APPROX; C->implemented[TBM] = IMPLEMENTED; } if (D2 != NULL) { assert(D != NULL); C->D2 = D2; C->RS_derivs = 2; } C->F_derivs = F_derivs >= 0 ? F_derivs : C->RS_derivs; assert(C->F_derivs <= C->RS_derivs); C->internal = true; // addCov is used without previous call of IncludeModel currentNrCov++; return currentNrCov - 1; } int addFurtherCov(covfct cf, covfct D, covfct D2) { return addFurtherCov(-1, cf, D, D2); } int addFurtherCov(covfct cf, covfct D) { return addFurtherCov(cf, D, NULL); } int addFurtherCov(int F_derivs, covfct cf, covfct D) { return addFurtherCov(F_derivs, cf, D, NULL); } int addFurtherCov(int F_derivs, nonstat_covfct cf) { assert(currentNrCov > 0); cov_fct *C = CovList + currentNrCov; MEMCOPY(C, C - 1, sizeof(cov_fct)); strcopyN(CovNames[currentNrCov], InternalName, MAXCHAR); C->name[0] = InternalName[0]; strcopyN(C->name + 1, CovList[currentNrCov-1].name, MAXCHAR - 1); C->RS_derivs = -1; if (cf != NULL) { C->nonstat_cov = cf; C->RS_derivs = 0; } C->F_derivs = F_derivs >= 0 ? F_derivs : C->RS_derivs; assert(C->F_derivs <= C->RS_derivs); C->D = ErrCov; C->internal = true; // addCov is used without previous call of IncludeModel currentNrCov++; return currentNrCov - 1; } int addFurtherCov(nonstat_covfct cf) { return addFurtherCov(-1, cf); } void addTypeFct(type_fct TypeFct) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr C->TypeFct = TypeFct; } //int addFurtherCov(nonstat_covfct cf, covfct D, covfct D2) { // return addFurtherCov(-1, cf, D, D2); //} void nablahess(covfct nabla, covfct hess) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr assert((nr>=0) && (nrvdim == SCALAR || C->vdim == SUBMODEL_DEP || C->vdim == PARAM_DEP || nabla==NULL); assert(C->cov != NULL && nabla!=NULL && hess != NULL); C->nabla=nabla; C->hess = hess; } void addLocal(getlocalparam coinit, getlocalparam ieinit) { int nr = currentNrCov - 1; assert(nr>=0 && nr < currentNrCov) ; cov_fct *C = CovList + nr; // nicht gatternr int *pref = C->pref; assert(C->D!=ErrCov); if ((C->implemented[CircEmbedIntrinsic] = ieinit != NULL)) { assert(C->D2 != NULL); C->ieinit = ieinit; if (pref[CircEmbedCutoff] == PREF_NONE) pref[CircEmbedCutoff] = PREF_BEST; } if ((C->implemented[CircEmbedCutoff] = coinit != NULL)) { C->coinit = coinit; if (pref[CircEmbedIntrinsic] == PREF_NONE) pref[CircEmbedIntrinsic] = PREF_BEST; } } void addCallLocal(altlocalparam alt) { int nr = currentNrCov - 1; assert(nr>=0 && nr < currentNrCov) ; cov_fct *C = CovList + nr; // nicht gatternr C->alternative = alt; } #define ASSERT_TBM \ assert(C->domain == PREVMODELD || \ ((isPosDef(C->Type)|| isUndefinedType(C->Type)) && C->domain == XONLY)); \ assert(C->vdim == SCALAR || C->vdim == SUBMODEL_DEP || \ C->vdim == PARAM_DEP) int addTBM(covfct tbm2) { // must be called always AFTER addCov !!!! int nr = currentNrCov - 1; assert((nr>=0) && (nrtbm2=tbm2; if (tbm2 != NULL) { // addTBM is called from the other addTBM's -- so tbm2 might // be NULL assert(C->isotropy==ISOTROPIC || C->isotropy==SPACEISOTROPIC || C->isotropy==PREVMODELI); assert(C->D != ErrCov); C->implemented[TBM] = IMPLEMENTED; if (C->pref[TBM] == PREF_NONE) C->pref[TBM] = PREF_BEST; } // IMPLEMENTED must imply the NUM_APPROX to simplify the choice // between TBM2 and Tbm2Num return nr; } void addTBM(covfct tbm2, initfct Init, spectral_do spectralDo) { int nr = addTBM(tbm2); cov_fct *C = CovList + nr; // nicht gatternr ASSERT_TBM; C->spectral=spectralDo; C->Init=Init; C->implemented[SpectralTBM] = true; if (C->pref[SpectralTBM] == PREF_NONE) C->pref[SpectralTBM] = PREF_BEST; } void addTBM(initfct Init, spectral_do spectralDo) { addTBM((covfct) NULL, Init, spectralDo); } void addSpecific(int cov) { int nr = currentNrCov - 1; assert((nr>=0) && (nrkappas) || ( X->check == checkmal && CovList[nr].check==checkmultproc)); // to do ... und die namen sollten auch gleich sein... while (true) { assert(X->Specific == MISMATCH); X->Specific = nr; if (X->pref[Specific] == PREF_NONE) X->pref[Specific] = PREF_BEST; X->implemented[Specific] = IMPLEMENTED; X++; if (X->name[0] != InternalName[0]) break; } // assert(false); } void addHyper(hyper_pp_fct hyper_pp) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr assert((nr>=0) && (nrhyperplane=hyper_pp; C->implemented[Hyperplane] = hyper_pp!=NULL; if (C->pref[Hyperplane] == PREF_NONE) C->pref[Hyperplane] = PREF_BEST; } //void addSpecialMeth(initstandard initspecial, dometh special) { /// int nr = currentNrCov - 1; // cov_fct *C = CovList + nr; // nicht gatternr // C->initspecial=initspecial; // C->special=special; // if ((special!=NULL) || (initspecial!=NULL)) // assert((special!=NULL) && (initspecial!=NULL)); // C->implemented[Special] = true; //} void addMarkov(int *variable) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr C->implemented[Markov] = true; *variable = nr; } void RandomShape(int maxmoments, structfct Struct, initfct Init, dofct Do, do_random_fct DoRandom, bool average, bool randomcoin, bool specific){ // rein auf shape-Function bezogen, ohne Kenntnis von irgendeinem // Kovarianzmodell // // init and do der elementaren shape-Funktion // insbesondere notwendig wenn die elementare shape-Function zufaellig ist. // Erst dann koennen werte abgefragt werden int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr assert(Init != NULL && Do != NULL && DoRandom != NULL && Struct!=NULL); C->maxmoments = maxmoments; C->Struct = Struct; C->Do = Do; C->DoRandom = DoRandom; C->Init = Init; C->implemented[Average] = average; C->implemented[RandomCoin] = randomcoin; C->implemented[Specific] = specific; } void RandomShape(int maxmoments, structfct Struct, initfct Init, dofct Do, bool average, bool randomcoin, bool specific){ RandomShape(maxmoments, Struct, Init, Do, do_random_failed, average, randomcoin, specific); } void RandomShape(int maxmoments, structfct Struct, initfct Init, dofct Do){ RandomShape(maxmoments, Struct, Init, Do, do_random_failed, false, false, false); } void RandomShape(int maxmoments, structfct Struct, initfct Init, do_random_fct DoRandom){ RandomShape(maxmoments, Struct, Init, do_failed, DoRandom, false, false, false); } void RandomShape(int maxmoments, initfct Init, dofct Do, bool average){ RandomShape(maxmoments, structOK, Init, Do, do_random_failed, average, !average, false); } void RandomShape(int maxmoments, initfct init, dofct Do){ RandomShape(maxmoments, structOK, init, Do, do_random_failed, false, true, false); } void RandomShape(structfct Struct, bool average){ RandomShape(-1, Struct, initOK, doOK, do_random_failed, average, !average, false); } void RandomShape(structfct Struct){ RandomShape(-1, Struct, initOK, doOK, do_random_failed, false, true, false); } void addSpecial(minmaxfct minmaxeigen){ int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr C->minmaxeigenvalue = minmaxeigen; } void addGaussMixture(draw_random drawmix, log_mixdens logmixdens) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr assert(drawmix != NULL && logmixdens != NULL); C->drawmix = drawmix; C->logmixdens = logmixdens; } void addReturns(return_fct Covariance, ext_bool_ret_fct isCovariance, return_fct CovMatrix, ext_bool_ret_fct isCovMatrix, return_fct InverseCovMatrix,ext_bool_ret_fct isInverseCovMatrix, return_fct Variogram, ext_bool_ret_fct isVariogram, return_fct PseudoVariogram, ext_bool_ret_fct isPseudoVariogram, returnX_fct SelectedCovMatrix, ext_bool_ret_fct isSelectedCovMatrix) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr if (Covariance!=NULL) { C->covariance=Covariance; C->is_covariance = isCovariance==NULL ? isTrue : isCovariance; } else assert(isCovariance==NULL); if (CovMatrix!=NULL) { C->covmatrix=CovMatrix; C->is_covmatrix = isCovMatrix==NULL ? isTrue : isCovMatrix; } else assert(isCovMatrix==NULL); if (InverseCovMatrix!=NULL) { C->inversecovmatrix=InverseCovMatrix; C->is_inversecovmatrix = isInverseCovMatrix==NULL ? isTrue : isInverseCovMatrix; } else assert(isInverseCovMatrix==NULL); if (Variogram!=NULL) { C->variogram=Variogram; C->is_variogram = isVariogram==NULL ? isTrue : isVariogram; } else assert(isVariogram==NULL); if (PseudoVariogram!=NULL) { C->pseudovariogram=PseudoVariogram; C->is_pseudovariogram = isPseudoVariogram==NULL ? isTrue : isPseudoVariogram; } else assert(isPseudoVariogram==NULL); if (SelectedCovMatrix!=NULL) { C->selectedcovmatrix=SelectedCovMatrix; C->is_selectedcovmatrix = isSelectedCovMatrix==NULL ? isTrue : isSelectedCovMatrix; } else assert(isSelectedCovMatrix==NULL); } void Taylor(double c, double pow) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr C->TaylorN = 0; if (isPosDef(C->Type) || isUndefinedType(C->Type)) { assert(pow != 0.0); C->Taylor[C->TaylorN][TaylorConst] = 1.0; C->Taylor[C->TaylorN][TaylorPow] = 0.0; C->TaylorN++; } C->Taylor[C->TaylorN][TaylorConst] = c; C->Taylor[C->TaylorN][TaylorPow] = pow; C->TaylorN++; assert(C->TaylorN <= MAXTAYLOR); if (C->finiterange == true) TailTaylor(0, 0, 0, 0); } void Taylor(double c, double pow, double c1, double pow1) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr Taylor(c, pow); C->Taylor[C->TaylorN][TaylorConst] = c1; C->Taylor[C->TaylorN][TaylorPow] = pow1; C->TaylorN++; assert(C->TaylorN <= MAXTAYLOR); } void Taylor(double c, double pow, double c1, double pow1, double c2, double pow2) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr Taylor(c, pow, c1, pow1); C->Taylor[C->TaylorN][TaylorConst] = c2; C->Taylor[C->TaylorN][TaylorPow] = pow2; C->TaylorN++; assert(C->TaylorN <= MAXTAYLOR); } void TailTaylor(double t, double tpow, double texpc, double texppow) { int nr = currentNrCov - 1; cov_fct *C = CovList + nr; // nicht gatternr if (C->finiterange == true) { assert(t == 0 && tpow==0 && texpc==0 && texppow==0); } C->TailN = 0; C->Tail[C->TailN][TaylorConst] = t; C->Tail[C->TailN][TaylorPow] = tpow; C->Tail[C->TailN][TaylorExpConst] = texpc; C->Tail[C->TailN][TaylorExpPow] = texppow; C->TailN++; assert(C->TailN <= MAXTAYLOR); } RandomFields/src/operator.cc0000644000175100001440000031716012412655466015613 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de Definition of correlation functions and derivatives of hypermodels Copyright (C) 2005 -- 2014 Martin Schlather This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "RF.h" #include "Covariance.h" #include #include #include #define BINARY_P 0 #define BINARY_CORR 1 #define BINARY_CENTRED 2 /* Felix' integral + trafo v = (1-r) / (1+r) + taylor + GR 2.211/2 V ~ 25 : Grenze zur Asymptoic GR 8.357 fctn = function(rho, t) exp(-t^2 / (1+rho)) / sqrt(1-rho^2) C = function(r, t) (2*pi)^(-1) * integrate(fctn, 0, r, t=t)$value fctn1 = function(rho, t) exp(-t^2 * rho / 2) / sqrt(rho) / (1 + rho) C1 = function(r, t) exp(-t^2 / 2) / (2*pi) * integrate(fctn1, (1-r)/(1+r), 1, t=t)$value deltaC = function(r, t) C(r,t) - C1(r,t) deltaC(0.5, 0.5) for (r in seq(0, 1, len=10)) for (t in seq(0.1, 2, len=10)) print(deltaC(r,t))# // for (r in seq(0.1, 1, len=10)) for (t in seq(0.1, 2, len=10)) { print(deltaC(r,t))# // a = t^2 /2 n = 10 d = 0:n fak = c(1, cumprod(d[-1])) s = cumsum(a^d / fak) v = (1-r) / (1+r) (U = 2 * sqrt(v) * sum((-v)^d / (2 * d + 1) * s)) v = 1 (O = 2 * sqrt(v) * sum((-v)^d / (2 * d + 1) * s)) (O - U) / (2 * pi) C(r, t) v = (1-r) / (1+r) (U = 2 * atan(sqrt(v)) + 2 * sqrt(v) * sum((-v)^d / (2 * d + 1) * (exp(-a) * s - 1)) ) v = 1 (O = 2 * atan(sqrt(v)) + 2 * sqrt(v) * sum((-v)^d / (2 * d + 1) * (exp(-a) * s - 1)) ) (O - U) / (2 * pi) C(r, t) print( (O - U) / (2 * pi) - C1(r,t))# // model = RMexp() x = seq(0.1, 1, len=10) t = 1.67 for (r in x) print(C1(r,t=t))# // RFcov(model, log(x)) RFcov(RMbernoulli(model, t=t), log(x)) for (r in x) print(C1(r,t=t)) # // */ #define Binary_Eps 1e-13 void binary(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; double a, var, V, r, expMa, Vd, s, Oned, sum, sumOne, summand, summandOne, d, factor, t = P0(BINARY_P), p = pnorm(t, 0, 1.0, true, false); COV(ZERO, next, &var); COV(x, next, &r); if (t == 0.0) { *v = ((M_1_PI * asin(r / var) + 0.5) - p) * p; } else { a = 0.5 * t * t / var; expMa = exp(-a); r /= var; // als BA-Arbeit if (r < -0.9) ERR("correlation of submodel must be >= -0.9 for numerical reasons"); V = (1 - r) / (1 + r); double ad = expMa; d = 0.0; sum = sumOne = 0.0; Vd = 1; Oned = 1; s = ad; factor = (s - 1.0) / (2.0 * d + 1.0); summand = Vd * factor; summandOne = Oned * factor; while (fabs(summand) > Binary_Eps || fabs(summandOne) > Binary_Eps) { sum += summand; sumOne += summandOne; d += 1.0; ad *= a / d; s += ad; Vd *= -V; Oned *= -1; factor = (s - 1.0) / (2.0 * d + 1.0); summand = Vd * factor; summandOne = Oned * factor; } sum += summand; sumOne += summandOne; // 0.25 = 2 atan(sqrt(1)) / 2pi *v = 0.25 + INVPI * (sumOne - (atan(sqrt(V)) + sqrt(V) * sum)); } if (!P0INT(BINARY_CENTRED)) { *v += p * p; } if (P0INT(BINARY_CORR)) { *v /= p; } } int checkbinary(cov_model *cov) { // to do extend to multivariate WARN_NEWDEFINITIONS; cov_model *next = cov->sub[0]; double v; int i, vdim = cov->vdim2[0], err = NOERROR; if (cov->vdim2[0] != cov->vdim2[1]) BUG; kdefault(cov, BINARY_P, 0.0); // if (P0(BINARY_P) != 0.0) SERR("currently only threshold=0 is possible");//todo kdefault(cov, BINARY_CORR, 1); kdefault(cov, BINARY_CENTRED, 1); if ((err = CHECK(next, cov->tsdim, cov->xdimprev, PosDefType, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) return err; setbackward(cov, next); for (i=0; impp.maxheights[i] = 1.0; COV(ZERO, next, &v); return NOERROR; } void rangebinary(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[BINARY_P] = RF_NEGINF; range->max[BINARY_P] = RF_INF; range->pmin[BINARY_P] = -4.0; range->pmax[BINARY_P] = 4.0; range->openmin[BINARY_P] = false; range->openmax[BINARY_P] = false; range->min[BINARY_CORR] = 0; range->max[BINARY_CORR] = 1; range->pmin[BINARY_CORR] = 0; range->pmax[BINARY_CORR] = 1; range->openmin[BINARY_CORR] = false; range->openmax[BINARY_CORR] = false; range->min[BINARY_CENTRED] = 0; range->max[BINARY_CENTRED] = 1; range->pmin[BINARY_CENTRED] = 0; range->pmax[BINARY_CENTRED] = 1; range->openmin[BINARY_CENTRED] = false; range->openmax[BINARY_CENTRED] = false; } ////////////////////////////////////////////////////////////////////// // extremal gaussian void extrgauss(double *x, cov_model *cov, double *v) { // BrownResnick to binary Gaussian cov_model *next = cov->sub[0]; double var, z; COV(ZERO, next, &var); COV(x, next, &z); *v = 1.0 - sqrt(0.5 * (1.0 - z / var)); } int check_extrgauss(cov_model *cov) { // to do extend to multivariate cov_model *next = cov->sub[0]; double v; int i, vdim = cov->vdim2[0], err = NOERROR; if (cov->vdim2[0] != cov->vdim2[1]) BUG; if ((err = CHECK(next, cov->tsdim, cov->xdimprev, PosDefType, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) return err; setbackward(cov, next); for (i=0; impp.maxheights[i] = 1.0; COV(ZERO, next, &v); if (v != 1.0) SERR("only correlation functions allowed"); return NOERROR; } ////////////////////////////////////////////////////////////////////// // Brown Resnick #define BR_FACTOR 0.25 // KSH: '/ 4' #define BR_SEMI_FACTOR (2 * BR_FACTOR) // hier Semi-Variogram void brownresnick(double *x, cov_model *cov, double *v) { // BrownResnick to binary Gaussian cov_model *next = cov->sub[0]; double z; assert(cov->role == ROLE_COV); COV(ZERO, next, &z); COV(x, next, v); *v = 2.0 * pnorm(sqrt((z - *v) * BR_SEMI_FACTOR), 0.0, 1.0, false, false); } void Dbrownresnick(double *x, cov_model *cov, double *v) { // b = BR_SEMI_FACTOR // gamma(h) = C(0) - C(h) // varphi(sqrt(gamma * b)) * (b C') / sqrt(gamma * b) // varphi density standard normal // BrownResnick to binary Gaussian cov_model *next = cov->sub[0]; double z, abl, s; // if ((cov->role != ROLE_COV && cov->role != ROLE_MAXSTABLE) || cov->taylorN <= 1) BUG; if (cov->taylor[1][TaylorPow] == 0.0) { // const?? *v = 0.0; return; } if (*x != 0.0) { COV(ZERO, next, &z); COV(x, next, v); // A PMI(cov); // printf("%ld %ld %s\n", CovList[next->gatternr].D, D_2, // CovList[next->gatternr].name); assert(CovList[next->gatternr].D != NULL); assert(CovList[next->gatternr].D != ErrCov); Abl1(x, next, &abl); // Vorsicht: abl = -\gamma' abl *= BR_SEMI_FACTOR; s = sqrt((z - *v) * BR_SEMI_FACTOR); // sqrt(c * gamma) *v = dnorm(s, 0.0, 1.0, false) * abl / s; // -\varphi * \gamma' / sqrt\gamma // =-2 \varphi * (-C') / (2 sqrt\gamma) // mit C= c_0 -\gamma // printf("dbrown %f %f %f %e\n", *x, abl, s, v); //assert(false); // assert(*v <= 0); } else { if (cov->taylor[1][TaylorPow] < 1.0) { *v = RF_NEGINF; } else if (cov->taylor[1][TaylorPow] == 1.0) { *v = fabs(cov->taylor[1][TaylorConst]); assert(*v > 0.0); } else BUG; } // 2 * c * varphi(s) * gamma' / s } void DDbrownresnick(double *x, cov_model *cov, double *v) { // D = \varphi * b C' / sqrt(\gamma b) // b = BR_SEMI_FACTOR // gamma(h) = C(0) - C(h) // varphi(sqrt(gamma * b)) [(b C')^2 / [2 sqrt (gamma * b)] // +(b C'') / sqrt (gamma * b) // +1/2 * (b C')^2 / sqrt (gamma * b)^3 ] // varphi density standard normal cov_model *next = cov->sub[0]; double z, abl, abl2, s0, s; if (cov->role != ROLE_COV && cov->role != ROLE_MAXSTABLE) BUG; if (cov->taylor[1][TaylorPow] == 0.0) { *v = 0.0; return; } if (*x != 0.0) { COV(ZERO, next, &z); COV(x, next, v); Abl1(x, next, &abl); Abl2(x, next, &abl2); s0 = (z - *v) * BR_SEMI_FACTOR; s = sqrt(s0); // sqrt(c * gamma) abl *= BR_SEMI_FACTOR; abl2 *= BR_SEMI_FACTOR; *v = dnorm(s, 0.0, 1.0, false) / s * (abl2 + abl * abl * 0.5 * (1/s0 + 1)); //printf("br x=%f v=%e s=%f abl=%f s0=%f abl2=%f\n", *x, *v, s, abl, s0, abl2); assert(*v >= 0); } else { *v = cov->taylor[1][TaylorPow]==1 ? 0.0 : RF_INF; } } void D3brownresnick(double *x, cov_model *cov, double *v) { // D = \varphi * b C' / sqrt(\gamma b) // b = BR_SEMI_FACTOR // gamma(h) = C(0) - C(h) // varphi(sqrt(gamma * b)) [(b C')^3 / [4 sqrt (gamma * b)] // +3 (b C') (b C'')/ [2 sqrt (gamma * b)] // + (b C''') / [sqrt (gamma * b)] // + (b C')^2 / [2 sqrt (gamma * b)] // +3(b C') (b C'') / [2 sqrt (gamma * b)^3] // +3(b C')^3 / [4 sqrt (gamma * b)^5] cov_model *next = cov->sub[0]; double z, abl, abl2, abl3, s0, s; if (cov->role != ROLE_COV && cov->role != ROLE_MAXSTABLE) BUG; if (cov->taylor[1][TaylorPow] == 0.0) { *v = 0.0; return; } if (*x != 0.0) { COV(ZERO, next, &z); COV(x, next, v); Abl1(x, next, &abl); Abl2(x, next, &abl2); Abl3(x, next, &abl3); s0 = (z - *v) * BR_SEMI_FACTOR; s = sqrt(s0); // sqrt(c * gamma) abl *= BR_SEMI_FACTOR; abl2 *= BR_SEMI_FACTOR; abl3 *= BR_SEMI_FACTOR; *v = dnorm(s, 0.0, 1.0, false) / s * (abl3 + 1.5 * abl2 * abl * (1/s0 + 1) + abl * abl * abl * (0.25 + 0.5 / s0 + 0.75 / (s0 * s0))); // printf("br x=%f v=%e s=%f abl=%f s0=%f abl2=%f\n", *x, *v, s, abl, s0, abl2); // assert(*v >= 0); } else { *v = cov->taylor[1][TaylorPow]==1 ? 0.0 : RF_NEGINF; // da zweite Ableitung im Ursprung Pol +\infty hat. } } int TaylorBrownresnick(cov_model *cov) { cov_model *next = cov->sub[0]; int idx = isPosDef(next->typus); // Taylorentw. in 2 Glieder falls pos def. assert(idx == 0); // assert(!idx); if (next->taylor[idx][TaylorPow] >= 2.0) {//for pos/neg def only == 2 possible cov->full_derivs = 1; } else cov->full_derivs = 0; cov->rese_derivs = next->rese_derivs; if (cov->rese_derivs > 3) cov->rese_derivs = 3; // else if (next->taylor[idx][TaylorPow] == 2) { // if (next->taylorN < 2 + idx) cov->rese_derivs = 0; // else if (cov->rese_derivs > 2) cov->rese_derivs = 2; // } if (next->taylorN >= 1 + idx && next->taylor[idx][TaylorConst] < 0.0) { // 2 \Phi(sqrt(gamma * br_f)) = //1+ 2 * phi(0) * sqrt(gamma * br_f) - 2 phi(0) / 6 *sqrt(gamma*br_f)^3 //sei gamma(x) = c x^alpha + d x^beta, beta > alpha. Dann gilt // also 2 \Phi(sqrt(gamma * br_f)) ~ // 1 + 2 * phi(0) * sqrt((c x^alpha + d x^beta)* br_f) // - 2 * phi(0) / 6 * sqrt((c x^alpha + d x^beta) *br_f)^3 // = 1 + 2 * phi(0)[ (c f x^a)^{1/2} (1 + 0.5 d / c * x^{b-a}) // (c f x^a)^{3/2} (1 + 1.5 d / c * x^{b-a}) ] // ~ 1 + 2 * phi(0) (c f x^a)^{1/2} // + phi(0)(c f)^{1/2} d / c * x^{b - a/2}) (*) // + 2 * phi(0) (c f x^a)^{3/2} (**) // // // da a <= 2 und b > a gilt: // 1. Abltg ~ phi(0) (c f)^{1/2} x^{a/2 - 1} // + phi(0) (c f)^{1/2} d / c * (b - a/2) x^{b - a/2 - 1} // + 3 phi(0 (c f)^{3/2} a x^{3/2 * a - 1} // 2. Abltg ~ phi(0) (c f)^{1/2} (a/2 - 1) x^{a/2 - 2} ~ infty, a != 2 // und fuer a=2 gilt folgendes: da gamma neg def ist e^{-\gamma} pos def // und mit sasvari folgt aus der Taylor entwicklung dass (a=2) < b <= 4). // Andererseits dominiert x{3/2 a} den Term x^{b - a/2} falls // 3/2 a < b - a/2 <=> b > 2a = 4. // Also ist b=4 ein Grenzfall, wo beide (*) und (**) eine Rolle spielen. // Ansonsten nur (*). // assert(next->taylor[idx][TaylorConst] <= 0.0); cov->taylorN = 2; cov->taylor[0][TaylorConst] = 1.0; cov->taylor[0][TaylorPow] = 0.0; double next_taylor_const = - next->taylor[idx][TaylorConst], g = sqrt(next_taylor_const * BR_SEMI_FACTOR * 0.5 / M_PI); cov->taylor[1][TaylorConst] = - 2 * g; cov->taylor[1][TaylorPow] = 0.5 * next->taylor[idx][TaylorPow]; if (next->taylor[idx][TaylorPow] == 2) { if (next->taylorN >= 2 + idx) { cov->taylorN = 3; if (next->taylor[idx + 1][TaylorConst] != 0) { cov->taylor[2][TaylorConst] = g * next->taylor[idx + 1][TaylorConst] / next_taylor_const; cov->taylor[2][TaylorPow] = next->taylor[idx + 1][TaylorPow] - 0.5*next->taylor[idx][TaylorPow]; } else { // Spezialfall:L fractionelle BR cov->taylor[2][TaylorConst] = 0.0; cov->taylor[2][TaylorPow] = 4.0; } if (next->taylor[idx + 1][TaylorPow] == 4) { cov->taylor[1][TaylorConst] += 2 * g * next_taylor_const * BR_SEMI_FACTOR; } } else cov->taylorN = 0; } } else cov->taylorN = 0; if (next->tailN >= 1) { cov->tailN = 1; cov->tail[0][TaylorPow] = -0.5 * next->tail[0][TaylorPow]; if (next->tail[0][TaylorPow] > 0) { assert( next->tail[0][TaylorConst] < 0.0); double next_tail_const = - next->tail[0][TaylorConst]; cov->tail[0][TaylorConst] = 2.0 / sqrt(2.0 * M_PI * BR_SEMI_FACTOR * next_tail_const); cov->tail[0][TaylorExpConst] = 0.5 * BR_SEMI_FACTOR * next_tail_const; cov->tail[0][TaylorExpPow] = next->tail[0][TaylorPow]; } else { cov->tail[0][TaylorConst] = 2.0 / sqrt(2.0 * M_PI * BR_SEMI_FACTOR * next->tail[0][TaylorConst]) * exp(-0.5 * BR_SEMI_FACTOR * next->tail[0][TaylorConst]); cov->tail[0][TaylorPow] = cov->tail[0][TaylorExpConst] = cov->tail[0][TaylorExpPow] = 0.0; } } else cov->tailN = 0; if (cov->taylorN < 1) cov->rese_derivs = 0; return NOERROR; } int checkbrownresnick(cov_model *cov) { // to do extend to multivariate cov_model *next = cov->sub[0]; int i, err, vdim = cov->vdim2[0], dim = cov->tsdim; if (cov->vdim2[0] != cov->vdim2[1]) BUG; if ((err = CHECK(next, dim, dim, NegDefType, cov->domown, cov->isoown, SUBMODEL_DEP, hasMaxStableRole(cov) ? ROLE_MAXSTABLE : ROLE_COV)) != NOERROR) { return err; } setbackward(cov, next); cov->monotone = isBernstein(next) ? GNEITING_MON : isMonotone(next) ? MONOTONE : NOT_MONOTONE; if ((err = TaylorBrownresnick(cov)) != NOERROR) return err; for (i=0; impp.maxheights[i] = 1.0; MEMCOPY(cov->pref, CovList[cov->nr].pref, sizeof(pref_shorttype)); return NOERROR; } int struct_brownresnick(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel) { cov_model *next = cov->sub[0]; if (cov->role == ROLE_SMITH) { if (1 > next->taylorN || 1 > next->tailN) SERR2("role '%s' not possible for submodel '%s'", ROLENAMES[cov->role], NICK(next)); BUG; // shape ist somit die Ableitung, falls d=1 und i.w. die // zweifache Ableitung, falls d=3 // hier ist auch Taylor zu setztn fuer den neuen Shape } else ILLEGAL_ROLE; return NOERROR; } int init_brownresnick(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VARIABLE_IS_NOT_USED *s) { int err; // cov_model *next = cov->sub[0]; if ((err = TaylorBrownresnick(cov)) != NOERROR) return err; return NOERROR; } void do_brownresnick(cov_model *cov, gen_storage *s) { cov_model *next = cov->sub[0]; DO(next, s); // nicht gatternr } void BR2EG(double *x, cov_model *cov, double *v) { // BrownResnick to binary Gaussian cov_model *next = cov->sub[0]; double z; COV(ZERO, next, &z); COV(x, next, v); z = 2.0 * pnorm(sqrt( (z - *v) * BR_SEMI_FACTOR), 0.0, 1.0, true, false) -1.0; *v = 1.0 - 2.0 * z * z; } int check_BR2EG(cov_model *cov) { // to do extend to multivariate cov_model *next = cov->sub[0]; double v, t, alpha; int err, i, vdim = cov->vdim2[0]; if (cov->vdim2[0] != cov->vdim2[1]) BUG; if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, SCALAR, cov->role)) != NOERROR) return err; setbackward(cov, next); for (i=0; impp.maxheights[i] = 1.0; if (next->pref[Nothing] == PREF_NONE) return ERRORPREFNONE; // erfc(x) = 2(1 - Phi(x * sqrt(2))) // erf(x) = 2 Phi(x * sqrt(2)) - 1 // erf^{-1}(x) = Phi^{-1}( (y + 1) / 2 ) / sqrt(2) // Sei c = 1-2 * erf(sqrt(semivario / 4))^2 . // Also c = 1 - 2 [ 2 Phi(sqrt(semivario / 2)) - 1]^2 // Umgekehrt semivario = 4 * { erf^{-1} (sqrt[0.5 (1 - c)]) } ^2 // mit c = 0 folgt sqrt(0.5 (1-c)) = 1 / sqrt(2) // semivario = 2 * {Phi^{-1}( (1 / sqrt(2) + 1) / 2 ) } ^2 alpha = 0.0; COV(ZERO, next, &v); t = qnorm(0.5 * (1.0 + INVSQRTTWO), 0.0, 1.0, true, false); t *= t / (BR_SEMI_FACTOR * (1.0 - alpha)); // 1/2 wegen erf->qnorm if (v > t) SERR2("variance equals %f, but must be at most 4(erf^{-1}(1/2))^2 = %f", v, t); return NOERROR; } void BR2BG(double *x, cov_model *cov, double *v) { // BrownResnick to binary Gaussian cov_model *next = cov->sub[0]; double z; COV(ZERO, next, &z); COV(x, next, v); z = 2.0 * pnorm(sqrt( (z - *v) * BR_SEMI_FACTOR), 0.0, 1.0, true, false) -1; *v = cos(M_PI * z); } int check_BR2BG(cov_model *cov) { // to do extend to multivariate cov_model *next = cov->sub[0]; double v, t, alpha; int err, i, vdim = cov->vdim2[0]; if (cov->vdim2[0] != cov->vdim2[1]) BUG; if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, SCALAR, cov->role)) != NOERROR) return err; setbackward(cov, next); for (i=0; impp.maxheights[i] = 1.0; if (next->pref[Nothing] == PREF_NONE) return ERRORPREFNONE; // erfc(x) = 2(1 - Phi(x * sqrt(2))) // erf(x) = 2 Phi(x * sqrt(2)) - 1 // erf^{-1}(x) = Phi^{-1}( (y + 1) / 2 ) / sqrt(2) // Sei c = cos(pi * erf(sqrt(semivario / 4))) . // Also c = cos(pi * [2 * Phi(sqrt(semivario / 2)) - 1] ) // Umgekehrt semivario = 2 * { Phi^{-1}(0.5 * [arccos( c ) / pi + 1]) }^2 // mit c = 0 folgt arccos(c)/ pi + 1 = 3/2 // semivario = 2 * { Phi^{-1}( 3 / 4) }^2 COV(ZERO, next, &v); alpha = 0.0; // to do t = qnorm(0.75, 0.0, 1.0, false, false); t *= t / (BR_SEMI_FACTOR * (1.0 - alpha)); // 1/2 wegen erf->qnorm if (v > t) { SERR2("variance equals %f, but must be at most 4(erf^{-1}(1 / 2))^2 = %f", v, t); } return NOERROR; } // #define UNIF_LOGREFAREA dim #define SIGN_P 0 void randomsign(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; assert(next != NULL); COV(x, next, v); (*v) *= cov->q[0]; // printf("%f ", cov->q[0]); } void lograndomsign(double *x, cov_model *cov, double *v, double *sign) { cov_model *next = cov->sub[0]; assert(next != NULL); LOGCOV(x, next, v, sign); (*sign) *= cov->q[0]; } void randomsignInverse(double *v, cov_model *cov, double *x){ cov_model *next = cov->sub[0]; INVERSE(v, next, x); } void randomsignNonstatInverse(double *v, cov_model *cov, double *x, double *y){ cov_model *next = cov->sub[0]; NONSTATINVERSE(v, next, x, y); } int check_randomsign(cov_model *cov) { cov_model *next = cov->sub[0]; int err, size = 1; if (cov->q == NULL) { if ((cov->q = (double*) CALLOC(sizeof(double), size)) == NULL) return ERRORMEMORYALLOCATION; cov->qlen = size; } kdefault(cov, 0, 0.5); if ((err = checkkappas(cov)) != NOERROR) return err; if ((err = CHECK(next, cov->tsdim, cov->xdimown, ShapeType, cov->domown, cov->isoown, SCALAR, cov->role)) != NOERROR) return err; setbackward(cov, next); return NOERROR; } void range_randomsign(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[SIGN_P] = 0; range->max[SIGN_P] = 1; range->pmin[SIGN_P] = 0.0001; range->pmax[SIGN_P] = 0.9999; range->openmin[SIGN_P] = false; range->openmax[SIGN_P] = false; } int init_randomsign(cov_model *cov, gen_storage *s) { cov_model *next = cov->sub[0]; int err; double Eminus; assert(next != NULL); if ((err=INIT(next, cov->mpp.moments, s))!= NOERROR) return err; if (next->fieldreturn && next->loggiven) SERR("log return is incompatible with random sign"); if (cov->mpp.moments >= 1) { cov->mpp.mM[0] = next->mpp.mM[0]; cov->mpp.mMplus[0] = next->mpp.mMplus[0]; Eminus = cov->mpp.mMplus[1] - cov->mpp.mM[1]; cov->mpp.mMplus[1] = P(SIGN_P)[0] * (cov->mpp.mMplus[1] - Eminus) + Eminus; cov->mpp.mM[1] = 0.0; } cov->mpp.maxheights[0] = next->mpp.maxheights[0]; cov->fieldreturn = next->fieldreturn; cov->origrf = false; cov->rf = next->rf; // assert(cov->mpp.maxheights[0] == 1.00); return err; } void do_randomsign(cov_model *cov, gen_storage *s) { cov_model *next = cov->sub[0]; assert(next != NULL); DO(next, s); // nicht gatternr cov->q[0] = 2.0 * (UNIFORM_RANDOM <= P0(SIGN_P)) - 1.0; if (cov->q[0] != 1.0 && next->fieldreturn) { assert(cov->q[0] == -1.0); if (next->loggiven) ERR("log return is incompatible with random sign"); int i, endfor = Loc(next)->totalpoints; double *rf = cov->rf; for (i=0; irole == ROLE_GAUSS || hasPoissonRole(cov)) { int err = STRUCT(cov->sub[0], newmodel); // assert(cov->sub[0]->mpp.maxheights[0] == 1.0); return err; } SERR1("'%s' not allowed in this context.", NICK(cov)); } #define MASTEIN_NU 0 #define MASTEIN_DELTA 1 void MaStein(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; double nuG, gammas, v1, v2, nu = P0(MASTEIN_NU), delta = P0(MASTEIN_DELTA); COV(ZERO, next, &v1); COV(x + 1, next, &v2); nuG = nu + v1 - v2; if (nuG >= 80.0) { ERR("Whittle Matern function cannot be evaluated with parameter value b+g(t) greater than 80."); } gammas = lgammafn(nu + delta) - lgammafn(nu) -lgammafn(nuG + delta); double s = *x; *v = (s==0.0) ? exp(lgammafn(nuG) + gammas) : 2.0 * exp(nuG * log(0.5 * s) + gammas + log(bessel_k(s, nuG, 2.0)) - s); } int check_MaStein(cov_model *cov) { cov_model *next = cov->sub[0]; int err; if (cov->xdimown != 2) SERR("reduced dimension must be 2"); if ((err = checkkappas(cov)) != NOERROR) return err; if ((err = CHECK(next, 1, 1, NegDefType, XONLY, SYMMETRIC, SCALAR, ROLE_COV)) != NOERROR) return err; if (cov->ncol[MASTEIN_NU] != 1 || cov->nrow[MASTEIN_NU] != 1) SERR("nu not scalar"); if (cov->ncol[MASTEIN_DELTA] != 1 || cov->nrow[MASTEIN_DELTA] != 1) SERR("d not scalar"); // no setbackward cov->maxdim = next->maxdim; return NOERROR; // no setbackward ! } void range_MaStein(cov_model *cov, range_type *range){ range->min[MASTEIN_NU] = 0.0; // range->max[MASTEIN_NU] = RF_INF; range->pmin[MASTEIN_NU] = 1e-2; range->pmax[MASTEIN_NU] = 10.0; range->openmin[MASTEIN_NU] = true; range->openmax[MASTEIN_NU] = true; range->min[MASTEIN_DELTA] = 0.5 * (double) (cov->tsdim - 1); // d range->max[MASTEIN_DELTA] = RF_INF; range->pmin[MASTEIN_DELTA] = range->min[MASTEIN_DELTA]; range->pmax[MASTEIN_DELTA] = 10; range->openmin[MASTEIN_DELTA] = false; range->openmax[MASTEIN_DELTA] = true; } /* bivariate shift model */ #define SHIFT_DELAY 0 void kappashift(int i, cov_model *cov, int *nr, int *nc){ *nc = 0; *nr = i < CovList[cov->nr].kappas ? cov->tsdim : -1; } void shift(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; double y[ShiftMaxDim], z[ShiftMaxDim], *jh, *ih, *pv = v, *h = P(SHIFT_DELAY); int i, j, d, tsdim = cov->tsdim, vdim = cov->vdim2[0], vdimM1 = vdim - 1, vdimSq = vdim * vdim, vdimP1 = vdim + 1; COV(x, next, v); for (i=vdimP1; icalling); for (jh=h-tsdim, j=-1; jsub[0]; int err, dim = cov->tsdim; if (cov->xdimown > ShiftMaxDim) SERR2("For technical reasons max. dimension for ave is %d. Got %d.", StpMaxDim, cov->xdimown); if ((err = checkkappas(cov)) != NOERROR) return err; if ((err = CHECK(next, dim, dim, PosDefType, XONLY, (dim > 1) ? SYMMETRIC : ISOTROPIC, SCALAR, ROLE_COV)) != NOERROR) return err; setbackward(cov, next); cov->vdim2[0] = cov->vdim2[1] = cov->ncol[SHIFT_DELAY] + 1; return NOERROR; } void rangeshift(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[SHIFT_DELAY] = RF_NEGINF; range->max[SHIFT_DELAY] = RF_INF; range->pmin[SHIFT_DELAY] = -1000; range->pmax[SHIFT_DELAY] = 1000; range->openmin[SHIFT_DELAY] = true; range->openmax[SHIFT_DELAY] = true; } /* Vector - Delta Delta^T */ #define VECTOR_A 0 #define VECTOR_D 1 void vector(double *x, cov_model *cov, double *v) { /* r = \| x\| d/d x_i f(r) = f'(r) x_i / r d^2/d x_i^2 f(r) = f''(r) x_i^2/r^2 + f'(r) (r^2 - x_i^2) / r^3 d^2/d x_i x_j f(r) = f''(r) x_i x_j/r^2 + f'(r) (- x_i x_j) / r^3 r = 0: d/d x_i f(r) |_0 = 0 d^2/d x_i^2 f(r) |_0 = f''(0) d^2/d x_i x_j f(r) = 0 Vector (n = dimension of spatial field) r=0 L = n * f''(0) operator: -0.5 * (a + 1) laplace + a * hessian, a in [-1,1]; a=1 */ cov_model *next = cov->sub[0]; double norm[2], normSq0, normL2, normT2, D, D2, diag, a = P0(VECTOR_A), b = - 0.5 * (1.0 + a); int i, td = cov->tsdim, dim = P0INT(VECTOR_D), dimP1 = dim + 1, dimsq = dim * dim; normL2 = normT2 = 0.0; for (i=0; iisoown == ISOTROPIC) { normSq0 = normL2 + normT2; } else { normSq0 = normL2; norm[1] = sqrt(normT2); } norm[0] = sqrt(normSq0); Abl1(norm, next, &D); Abl2(norm, next, &D2); if (normSq0 == 0.0) { diag = (b * dim + a) * D2; for (i=0; isub[0]; double laplace, a = P0(VECTOR_A), b = - 0.5 * (1.0 + a); int i, j, k, endfor, dim = P0INT(VECTOR_D), dimP1 = dim + 1, dimsq = dim * dim, tsxdim = cov->tsdim, xdimsq = tsxdim * tsxdim, xdimP1 = tsxdim + 1, dimxdim = dim * tsxdim; ALLOC_EXTRA(D, xdimsq); // should pass back the hessian HESSE(x, next, D); laplace = 0.0; // print("return matrix %d\n", xdimsq); // for (i=0; i> %d %d %f %f %f\n", k, j, D[j], a, laplace ); v[k++] = D[j] * a; } } for (i=0; isub[0]; int err, i, dim = cov->tsdim; isotropy_type isotropy = cov->domown; kdefault(cov, VECTOR_A, 0.5); // a kdefault(cov, VECTOR_D, (isotropy==SPACEISOTROPIC || isotropy==ZEROSPACEISO) ? dim - 1 : dim); // Dspace if ((err = checkkappas(cov)) != NOERROR) return err; if ( (isotropy==SPACEISOTROPIC || isotropy==ZEROSPACEISO) && P0INT(VECTOR_D) != dim - 1) { SERR1("for spatiotemporal submodels '%s' must be applied to spatial part", NICK(cov)); } if (cov->tsdim != cov->xdimown || cov->tsdim != cov->xdimprev) return ERRORDIM; cov->nr = VECTOR; // wegen nr++ unten; if ((err = CHECK(next, dim, 1, PosDefType, cov->domown, ISOTROPIC, SCALAR, ROLE_COV)) != NOERROR) { // print("err=%d\n", err); if ((err = CHECK(next, dim, dim, PosDefType, cov->domown, ZEROSPACEISO, SCALAR, ROLE_COV)) != NOERROR) { // print("err2=%d\n", err); if ((err = CHECK(next, dim, dim, PosDefType, cov->domown, SYMMETRIC, SCALAR, ROLE_COV)) != NOERROR) { // print("err3=%d\n", err); return err; } } } setbackward(cov, next); for (i=0; impp.maxheights[i] = RF_NA; if (next->full_derivs < 2 && !next->hess) { // print("%s (%d): full_derivs %d %d\n", NICK(to), // next->nr, next->full_derivs, CovList[next->nr].F_derivs); // PMI(next); SERR("2nd derivative of submodel not defined (for the given paramters)"); } isotropy = next->isoown; if (isotropy != ISOTROPIC && isotropy != SPACEISOTROPIC) { if (!next->hess) SERR("hess matrix not defined"); cov->nr++; } cov->vdim2[0] = cov->vdim2[1] = P0INT(VECTOR_D); next->delflag = DEL_COV; EXTRA_STORAGE; return NOERROR; } void rangevector(cov_model *cov, range_type *range){ range->min[VECTOR_A] = -1.0; range->max[VECTOR_A] = 1.0; range->pmin[VECTOR_A] = -1.0; range->pmax[VECTOR_A] = 1.0; range->openmin[VECTOR_A] = false; range->openmax[VECTOR_A] = false; range->min[VECTOR_D] = 1.0; range->max[VECTOR_D] = cov->tsdim; range->pmin[VECTOR_D] = 1.0; range->pmax[VECTOR_D] = cov->tsdim; range->openmin[VECTOR_D] = false; range->openmax[VECTOR_D] = false; } int zzz=0; /* Rot - Delta Delta^T */ void curl(double *x, cov_model *cov, double *v) { /* r = \| x\| d/d x_i f(r) = f'(r) x_i / r d^2/d x_i^2 f(r) = f''(r) x_i^2/r^2 + f'(r) (r^2 - x_i^2) / r^3 d^2/d x_i x_j f(r) = f''(r) x_i x_j/r^2 + f'(r) (- x_i x_j) / r^3 r = 0: d/d x_i f(r) |_0 = 0 d^2/d x_i^2 f(r) |_0 = f''(0) d^2/d x_i x_j f(r) = 0 Rot (n = dimension of spatial field) r=0 L = n * f''(0) operator: -0.5 * (a + 1) rot + a * hessian, a in [-1,1]; a=1/2 */ cov_model *next = cov->sub[0]; cov_fct *N = CovList + next->nr; // !!! nicht gatternr !!!! double norm[2], normSq0, normL2, normT2, D, D2, D3, diag, a = -1.0, // curl free b = - 0.5 * (1.0 + a); int i, td = cov->tsdim, dim = td, // currently no space-time allowed -> BA thesis dimP1 = dim + 1, dimP2 = dim + 2, dimP3 = dim + 3, dimP2sqM1 = dimP2 * dimP2 -1; // for three dimensions much // more complicated normL2 = normT2 = 0.0; for (i=0; iisoown == ISOTROPIC) { normSq0 = normL2 + normT2; } else { normSq0 = normL2; norm[1] = sqrt(normT2); } norm[0] = sqrt(normSq0); N->D(norm, next, &D); N->D2(norm, next, &D2); // printf("next %s\n", N->name); N->D3(norm, next, &D3); if (normSq0 == 0.0) { for (i=0; i<=dimP2sqM1; i++) v[i] = 0.0; N->cov(norm, next, v); // v[0] diag = (b * dim + a) * D2; for (i=dimP3; iD2(norm, next, v + dimP1); v[dimP1] *= 2.0; v[dimP2 * dimP1] = v[dimP1]; N->D4(norm, next, v + dimP2sqM1); v[dimP2sqM1] *= (8.0 / 3.0); } else { double z[2], D2nsq = D2 / normSq0, D1n = D / norm[0], D3n = D3 / norm[0], D1n3 = D / (norm[0] * normSq0), delta = a * (D2nsq - D1n3), div = b * ((D2nsq - D1n3) * normL2 + dim * D1n); int k,l; N->cov(norm, next, v); // v[0] z[0] = x[0]; z[1] = x[1]; for (i=1; i<=dim; i++) { // kante links und oben v[i] = -(v[i * dimP2] = z[i-1] * D1n); } diag = div + a * D1n; for (i= dimP3, k=0; kD4(norm, next, v + dimP2sqM1); // rechts unten v[dimP2sqM1] += 2.0 * D3n - D2nsq + D1n3; } // for (i=0; i<=15; i++) { // if (i!=15) v[i] = 0.0; // } } /* Div - Delta Delta^T */ void div(double *x, cov_model *cov, double *v) { // div -free !! /* r = \| x\| d/d x_i f(r) = f'(r) x_i / r d^2/d x_i^2 f(r) = f''(r) x_i^2/r^2 + f'(r) (r^2 - x_i^2) / r^3 d^2/d x_i x_j f(r) = f''(r) x_i x_j/r^2 + f'(r) (- x_i x_j) / r^3 r = 0: d/d x_i f(r) |_0 = 0 d^2/d x_i^2 f(r) |_0 = f''(0) d^2/d x_i x_j f(r) = 0 Div (n = dimension of spatial field) r=0 L = n * f''(0) operator: -0.5 * (a + 1) div + a * hessian, a in [-1,1]; a=1 */ cov_model *next = cov->sub[0]; cov_fct *N = CovList + next->nr; // gatter oder keine gatter?? double norm[2], normSq0, normL2, normT2, D, D2, D3, diag, a = 1.0, // divergenz free b = - 0.5 * (1.0 + a); int i, td = cov->tsdim, dim = td, // currently no space-time allowed -> BA thesis dimP1 = dim + 1, dimP2 = dim + 2, dimP3 = dim + 3, dimP2sqM1 = dimP2 * dimP2 -1; // for three dimensions much // more complicated normL2 = normT2 = 0.0; for (i=0; iisoown == ISOTROPIC) { normSq0 = normL2 + normT2; } else { normSq0 = normL2; norm[1] = sqrt(normT2); } norm[0] = sqrt(normSq0); N->D(norm, next, &D); N->D2(norm, next, &D2); N->D3(norm, next, &D3); if (normSq0 == 0.0) { for (i=0; i<=dimP2sqM1; i++) v[i] = 0.0; N->cov(norm, next, v); // v[0] diag = (b * dim + a) * D2; for (i=dimP3; iD2(norm, next, v + dimP1); v[dimP1] *= 2.0; v[dimP2 * dimP1] = v[dimP1]; N->D4(norm, next, v + dimP2sqM1); v[dimP2sqM1] *= (8.0 / 3.0); } else { double z[2], D2nsq = D2 / normSq0, D1n = D / norm[0], D3n = D3 / norm[0], D1n3 = D / (norm[0] * normSq0), delta = a * (D2nsq - D1n3), div = b * ((D2nsq - D1n3) * normL2 + dim * D1n); int k,l; N->cov(norm, next, v); // v[0] z[0] = -x[1]; z[1] = x[0]; for (i=1; i<=dim; i++) { // kante links und oben v[i] = -(v[i * dimP2] = z[i-1] * D1n); } diag = div + a * D1n; for (i= dimP3, k=0; kD4(norm, next, v + dimP2sqM1); // rechts unten v[dimP2sqM1] += 2.0 * D3n - D2nsq + D1n3; } // for (i=0; i<=15; i++) { // if (i!=15) v[i] = 0.0; // } } int checkdivcurl(cov_model *cov) { cov_model *next = cov->sub[0]; // been programmed yet int err, i, dim = cov->tsdim, spacedim; isotropy_type isotropy; // statt STATIONARY : VARIOGRAM ?? s. Paper mit Scheuerer if ((err = CHECK(next, dim, 1, PosDefType, cov->domown, ISOTROPIC, SCALAR, ROLE_COV)) != NOERROR) { if ((err = CHECK(next, dim, 1, PosDefType, cov->domown, SPACEISOTROPIC, SCALAR, ROLE_COV)) != NOERROR) return err; } // PMI(next); if (next->full_derivs < 4) SERR("4th derivative of submodel not defined"); if (cov->tsdim != 2) SERR("currently coded only for dim=2"); isotropy = next->isoown; spacedim = dim - (isotropy == SPACEISOTROPIC); if (isotropy != ISOTROPIC && isotropy != SPACEISOTROPIC) SERR("submodel must be spaceisotropic"); if (spacedim != 2) SERR("model currently only defined for the plane"); setbackward(cov, next); for (i=0; impp.maxheights[i] = RF_NA; cov->vdim2[0] = cov->vdim2[1] = spacedim + 2; // only correct for spacedim == 2!!! assert(spacedim == 2); next->delflag = DEL_COV; return NOERROR; } // void rangedivcurl(cov_model *cov, range_type *range){ } /* #define LP_P 0 void lp(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; double z, p = P0(LP_P); int d, dim = cov->tsdim; for (z=0.0, d=0; dsub[0]; int err; kdefault(cov, 0, 1.0); if ((err = checkkappas(cov)) != NOERROR) return err; if ((err = CHECK(next, cov->tsdim + 1, 1, PosDefType, XONLY,ISOTROPIC, SCALAR, ROLE_COV)) != NOERROR) return err; next->delflag = DEL_COV; // no setbackward double p =P0(LP_P); if (p==1) { cov->maxdim = next->maxdim - 1; // true for p==1 if (cov->maxdim == 0) cov->maxdim = 1; } else if (p==2) { cov->maxdim = next->maxdim; } else if (!skipchecks) SERR("p must be 1 or 2."); cov->monotone = next->monotone; cov->semiseparatelast = false; updatepref(cov, next); assert(false); // nicht verwendete Fkt return NOERROR; } void rangelp(cov_model *cov, range_type *range){ range->min[LP_P] = 0.0; range->max[LP_P] = 2.0; range->pmin[LP_P] = 0.01; range->pmax[LP_P] = 2.0; range->openmin[LP_P] = true; range->openmax[LP_P] = false; } */ #define MA1_ALPHA 0 #define MA1_BETA 1 void ma1(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; double z, alpha = P0(MA1_ALPHA), theta = P0(MA1_BETA); COV(x, next, &z); *v = pow(theta / (1 - (1-theta) * z), alpha); } int checkma1(cov_model *cov) { // bool skipchecks = GLOBAL.general.skipchecks; cov_model *next = cov->sub[0]; // double p; int err; kdefault(cov, 0, 1.0); kdefault(cov, 1, 0.5); if ((err = checkkappas(cov)) != NOERROR) return err; if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; //cov->semiseparatelast = cov->separatelast =false; cov->logspeed = 0.0; // updatepref(cov, next); setbackward(cov, next); cov->mpp.maxheights[0] = 1.0; return NOERROR; } void rangema1(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[MA1_ALPHA] = 0.0; range->max[MA1_ALPHA] = RF_INF; range->pmin[MA1_ALPHA] = 0.01; range->pmax[MA1_ALPHA] = 10; range->openmin[MA1_ALPHA] = true; range->openmax[MA1_ALPHA] = true; range->min[MA1_BETA] = 0.0; range->max[MA1_BETA] = 1.0; range->pmin[MA1_BETA] = 0.0; range->pmax[MA1_BETA] = 1.0; range->openmin[MA1_BETA] = true; range->openmax[MA1_BETA] = true; } void ma2(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; double z, z0; COV(ZERO, next, &z0); COV(x, next, &z); z = z0 - z; *v = (z == 0) ? 1.0 : (1.0 - exp(-z)) / z; } int checkma2(cov_model *cov) { // bool skipchecks = GLOBAL.general.skipchecks; cov_model *next = cov->sub[0]; // double p; int err; if ((err = checkkappas(cov)) != NOERROR) return err; if ((err = CHECK(next, cov->tsdim, cov->xdimown, NegDefType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; // cov->semiseparatelast = cov->separatelast =false; cov->logspeed = 0.0; // updatepref(cov, next); setbackward(cov, next); cov->mpp.maxheights[0] = 1.0; return NOERROR; } #define M_M 0 void kappaM(int i, cov_model *cov, int *nr, int *nc){ *nc = SIZE_NOT_DETERMINED; *nr = i < CovList[cov->nr].kappas ? SIZE_NOT_DETERMINED : -1; } void M(cov_model *cov, double *Z, double *V) { // M C M^t cov_model *next = cov->sub[0]; int *ncol = cov->ncol, *nrow = cov->nrow; double alpha = 1.0, beta = 0.0, *M = P(M_M); // SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K, ALPHA,A,LDA,B,LDB, BETA,C,LDC) // C := alpha*op( A )*op( B ) + beta*C, // M : rows of op(A) // N : cols of op(B) // K : cols of op(A)= rows of op(B) // LD-X : first dimension of X if (next->vdim2[0] == 1) { F77_CALL(dgemm)("N", "T", nrow, nrow, ncol, Z, M, nrow, M, nrow, &beta, V, nrow); } else { ALLOC_EXTRA2(MZ,*nrow * *ncol); F77_CALL(dgemm)("N", "N", nrow, ncol, ncol, &alpha, M, nrow, Z, ncol, &beta, MZ, nrow); F77_CALL(dgemm)("N", "T", nrow, nrow, ncol, &alpha, MZ, nrow, M, nrow, &beta, V, nrow); } } void Mstat(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; int ncol = cov->ncol[M_M]; // PMI(cov); // printf("%s %d\n", NICK(cov), cov->Sextra !=NULL); assert(cov->Sextra != NULL); ALLOC_EXTRA(z, ncol * ncol); COV(x, next, z); M(cov, z, v); } void Mnonstat(double *x, double *y, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; int ncol = cov->ncol[M_M]; ALLOC_EXTRA(z, ncol * ncol); NONSTATCOV(x, y, next, z); M(cov, z, v); } int checkM(cov_model *cov) { cov_model *next = cov->sub[0]; int err, i, nrow = cov->ncol[M_M]; // if (cov->isoown < SYMMETRIC) SERR("sdfkjaskfj"); printf("hh"); // PMI(cov, 1); if (nrow > MAXMPPVDIM) SERR2("the maximum multivariate dimension is %d, but %d is given by the user", MAXMPPVDIM, nrow); if ((err = checkkappas(cov)) != NOERROR) return err; cov->vdim2[0] = cov->vdim2[1] = cov->nrow[M_M]; // zwingend vor C-HECK if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, cov->ncol[M_M], ROLE_COV)) != NOERROR) { // MERR(err); printf("x"); return err; } //APMI(next); setbackward(cov, next); for (i=0; impp.maxheights[i] = RF_NA; EXTRA_STORAGE; return NOERROR; } sortsofparam paramtype_M(int k, int row, int col) { return k<0 ? VARPARAM : (row==col) ? SDPARAM : SIGNEDSDPARAM; } void rangeM(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[M_M] = RF_NEGINF; range->max[M_M] = RF_INF; range->pmin[M_M] = -1e5; range->pmax[M_M] = 1e5; range->openmin[M_M] = true; range->openmax[M_M] = true; } #define SCHUR_M 0 #define SCHUR_DIAG 1 #define SCHUR_RED 2 void kappaSchur(int i, cov_model *cov, int *nr, int *nc){ double *M = P(SCHUR_M); int vdim = cov->nrow[M != NULL ? SCHUR_M : SCHUR_DIAG]; *nc = i == SCHUR_M ? vdim : 1; *nr = i == SCHUR_RED ? vdim * (vdim-1) / 2 : i < CovList[cov->nr].kappas ? vdim : -1; } void SchurMult(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *v){ double *M = P(SCHUR_M); int i, vdim = cov->vdim2[0]; if (!PisNULL(SCHUR_M)) { int nrow2 = cov->nrow[SCHUR_M] * cov->nrow[SCHUR_M]; for (i=0; iq, *diag=P(SCHUR_DIAG), *red=P(SCHUR_RED); for (i=0; isub[0]; COV(x, next, v); SchurMult(x, cov, v); } void Schurnonstat(double *x, double *y, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; NONSTATCOV(x, y, next, v); SchurMult(x, cov, v); } int checkSchur(cov_model *cov) { cov_model *next = cov->sub[0]; double *C, *M=P(SCHUR_M), *diag=P(SCHUR_DIAG), *red=P(SCHUR_RED); int i,j, k, l, err = NOERROR, vdim = cov->nrow[M != NULL ? SCHUR_M : SCHUR_DIAG], vdimP1 = vdim + 1, bytes = vdim * vdim * sizeof(double), *nrow = cov->nrow, *ncol = cov->ncol; cov->vdim2[0] = cov->vdim2[1] = vdim; if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, nrow[SCHUR_M], ROLE_COV)) != NOERROR) return err; setbackward(cov, next); if (M == NULL) { if (diag == NULL || red == NULL) SERR3("either '%s' and '%s' or '%s' must be given", KNAME(SCHUR_DIAG), KNAME(SCHUR_RED), KNAME(SCHUR_M)); for (i=0; iq = (double*) MALLOC(vdim * sizeof(double)); cov->qlen = vdim; } else { if (diag != NULL || red != NULL) SERR3("if '%s' is given, neither '%s' nor '%s' might be given.", KNAME(SCHUR_M), KNAME(SCHUR_DIAG), KNAME(SCHUR_RED)) C = (double*) MALLOC(bytes); MEMCOPY(C, M, bytes); F77_CALL(dpofa)(C, ncol, ncol, &err); // C i s now cholesky if (err != 0) SERR3("%d x %d matrix '%s' is not (strictly) positive definite", nrow[SCHUR_M], ncol[SCHUR_M], KNAME(SCHUR_M)); } free(C); for (i=0; impp.maxheights[i] = 1.0; /* Check symmetry?? for (vdiag = i=0; imin[SCHUR_M] = RF_NEGINF; range->max[SCHUR_M] = RF_INF; range->pmin[SCHUR_M] = -1e5; range->pmax[SCHUR_M] = 1e5; range->openmin[SCHUR_M] = true; range->openmax[SCHUR_M] = true; range->min[SCHUR_DIAG] = 0; range->max[SCHUR_DIAG] = RF_INF; range->pmin[SCHUR_DIAG] = 0; range->pmax[SCHUR_DIAG] = 1e5; range->openmin[SCHUR_DIAG] = false; range->openmax[SCHUR_DIAG] = true; range->min[SCHUR_RED] = 0; range->max[SCHUR_RED] = 1; range->pmin[SCHUR_RED] = 0; range->pmax[SCHUR_RED] = 1; range->openmin[SCHUR_RED] = false; range->openmax[SCHUR_RED] = false; } #define ID_VDIM 0 void IdStat(double *x, cov_model *cov, double *v) { // cov_model // *key = cov->key; // if (key != NULL) CovList[key->nr].cov(x, key, v); // else { cov_model *next = cov->sub[0]; COV(x, next, v); // } } void IdNonStat(double *x, double *y, cov_model *cov, double *v){ // cov_model // *key = cov->key; // if (key != NULL) CovList[key->nr].nonstat_cov(x, y, key, v); // else { cov_model *next = cov->sub[0]; NONSTATCOV(x, y, next, v); // } } int checkId(cov_model *cov) { cov_model *next = cov->sub[0]; int err; cov->vdim2[0] = cov->vdim2[1] = !PisNULL(ID_VDIM) ? P0INT(ID_VDIM) : SUBMODEL_DEP; if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, cov->vdim2, cov->role)) !=NOERROR) return err; if (cov->vdim2[0] == SUBMODEL_DEP) { cov->vdim2[0] = next->vdim2[0]; cov->vdim2[1] = next->vdim2[1]; } cov->logspeed = next->logspeed; setbackward(cov, next); return NOERROR; } void DId(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; Abl1(x, next, v); } void DDId(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; Abl2(x, next, v); } void TBM2Id(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; TBM2CALL(x, next, v) } void IdInverse(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; INVERSE(x, next, v); } int initId(cov_model *cov, gen_storage *S) { cov_model *next = cov->sub[0]; return INIT(next, cov->mpp.moments, S); } void spectralId(cov_model *cov, gen_storage *S, double *e) { // spectral_storage *s = &(S->Sspectral); cov_model *next = cov->sub[0]; SPECTRAL(next, S, e); // nicht nr } void coinitId(cov_model *cov, localinfotype *li) { cov_model *next = cov->sub[0]; CovList[next->nr].coinit(next, li); // nicht nr } void ieinitId(cov_model *cov, localinfotype *li) { cov_model *next = cov->sub[0]; CovList[next->nr].ieinit(next, li); // nicht nr } void rangeId(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[ID_VDIM] = 1.0; range->max[ID_VDIM] = RF_INF; range->pmin[ID_VDIM] = 1.0; range->pmax[ID_VDIM] = 10; range->openmin[ID_VDIM] = false; range->openmax[ID_VDIM] = true; } #define EXP_N 0 #define EXP_STANDARDISED 1 void Exp(double *x, cov_model *cov, double *v, int n, bool standardize){ double v0, s = 0.0, w = 1.0; cov_model *next = cov->sub[0]; int k, vdim = cov->vdim2[0], vdim2q = vdim * vdim; COV(x, next, v); if (vdim == 1) { for (k=0; k<=n; k++) { s += w; w *= *v / (double) (k+1); } *v = exp(*v) - s; if (standardize) { Exp(ZERO, cov, &v0, n, false); *v /= v0; } } else { int i; BUG; // fehlt die multiplication von links und rechts mit C(0)^{-1/2} for (i=0; isub[0]; double v0, s = 0.0, w = 1.0; int k, vdim = cov->vdim2[0], vdim2q = vdim * vdim; NONSTATCOV(x, y, next, v); if (vdim == 1) { for (k=0; k<=n; k++) { s += w; w *= *v / (double) (k+1); } *v = exp(*v) - s; if (standardised) { nonstatExp(ZERO, ZERO, cov, &v0, n, false); *v /= v0; } } else { int i; BUG; // fehlt die multiplication von links und rechts mit C(0)^{-1/2} for (i=0; isub[0]; int n = P0(EXP_N); assert(cov->vdim2[0] == 1); Abl1(x, next, &D); Exp(x, cov, v, n - 1, false); *v *= -D; if (P0INT(EXP_STANDARDISED)) { double v0; Exp(ZERO, cov, &v0, n, false); *v /= v0; } } // Hier fehlt die multidim variante (Hesse matrix) void DDExp(double *x, cov_model *cov, double *v){ double D, Abl2, w; cov_model *next = cov->sub[0]; int n = P0INT(EXP_N); assert(cov->vdim2[0] == 1); Abl1(x, next, &D); Abl2(x, next, &Abl2); Exp(x, cov, v, n - 2, false); Exp(x, cov, &w, n - 1, false); *v = D * D * *v + Abl2 * w; // Achtung + D2 nicht - D2, da D2 Ableitung einer Cov. if (P0INT(EXP_STANDARDISED)) { double v0; Exp(ZERO, cov, &v0, n, false); *v /= v0; } } int checkExp(cov_model *cov) { cov_model *next = cov->sub[0]; int err, i, vdim = cov->vdim2[0]; kdefault(cov, EXP_N, -1); if (!isPosDef(next->typus) && P0INT(EXP_N) != -1) SERR("for variograms only n=-1 allowed"); kdefault(cov, EXP_STANDARDISED, 1); if ((err = CHECKPD2ND(next, cov->tsdim, cov->xdimown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; next->delflag = DEL_COV - 10; setbackward(cov, next); if (cov->vdim2[0] > 1 && P0INT(EXP_N) != -1) SERR1("'%s' must be '-1' in the multivariate case", KNAME(EXP_N)); if (cov->vdim2[0] > 1) SERR("multivariate case not programmed yet"); if (next->domown == XONLY) { cov_fct *C = CovList + cov->nr; cov->pref[CircEmbed] = C->pref[CircEmbed]; cov->pref[Direct] = C->pref[Direct]; cov->pref[Sequential] = C->pref[Sequential]; if (!isNegDef(cov->typus)) SERR1("negative definite function expected -- got '%s'", TYPENAMES[cov->typus]); } else { if (!isPosDef(cov)) SERR1("positive definite function expected -- got '%s'", TYPENAMES[cov->typus]); } double height= isNegDef(next->typus) && !isPosDef(next->typus) ? 1.0 : RF_NA; for (i=0; impp.maxheights[i] = height; cov->monotone = (isBernstein(next)) ? NORMAL_MIXTURE : isMonotone(next->monotone) ? MONOTONE : NOT_MONOTONE; cov->logspeed = 0.0; return NOERROR; } void rangeExp(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[EXP_N] = -1; range->max[EXP_N] = RF_INF; range->pmin[EXP_N] = -1; range->pmax[EXP_N] = 5; range->openmin[EXP_N] = false; range->openmax[EXP_N] = true; range->min[EXP_STANDARDISED] = 0; range->max[EXP_STANDARDISED] = 1; range->pmin[EXP_STANDARDISED] = 0; range->pmax[EXP_STANDARDISED] = 1; range->openmin[EXP_STANDARDISED] = false; range->openmax[EXP_STANDARDISED] = false; } #define POW_ALPHA 0 void Pow(double *x, cov_model *cov, double *v){ double v0, v1, alpha = P0(POW_ALPHA); cov_model *next = cov->sub[0]; COV(ZERO, next, &v0); COV(x, next, &v1); *v = pow(v0, alpha) - pow(v0 - v1, alpha); // print("Pow %f %f %f v=%f\n", v0, v1, alpha, *v); } void DPow(double *x, cov_model *cov, double *v){ double v0, v1, gamma, alpha = P0(POW_ALPHA); cov_model *next = cov->sub[0]; Abl1(x, next, v); if (alpha == 1.0) return; COV(ZERO, next, &v0); COV(x, next, &v1); gamma = v0 - v1; *v *= - alpha * pow(gamma, alpha -1.0); // Achtung "-" , da covarianzfunktion angenommen } void DDPow(double *x, cov_model *cov, double *v){ double D, v0, v1, gamma, alpha = P0(POW_ALPHA); cov_model *next = cov->sub[0]; Abl2(x, next, v); if (alpha == 1.0) return; Abl1(x, next, &D); COV(ZERO, next, &v0); COV(x, next, &v1); gamma = v0 - v1; *v *= - alpha * pow(gamma, alpha - 2.0) * ((alpha - 1.0) * D + gamma * (*v)); // Achtung "-" , da covarianzfunktion angenommen } void InversePow(double *x, cov_model *cov, double *v) { // invPow only defined for submodel having variance 1 !!!! cov_model *next = cov->sub[0]; double alpha = P0(POW_ALPHA); COV(x, next, v); double y = 1.0 - *v; if (y < 0.0 || y > 1.0) { if (y > -1e-14 && y < 0.0) y=0.0; else if (y < 1.0 + 1e-14) y=1.0; else { //PRINTF("covariance value %e (1 - %e = %e) at %e\n", *v, *v, 1.0-*v, *x); ERR("invPow valid only for non-negative covariance models with variance 1"); } } *v = 1.0 - pow(y, 1.0 / alpha); // print("%f %f %f\n", y, *v, P0(POW_ALPHA)); // print("Inv %f %f %f v=%f\n", *x, P0(POW_ALPHA),y, *v); } int checkPow(cov_model *cov) { cov_model *next = cov->sub[0]; int err; //print("OK %d %d\n", cov->domown, cov->isoown); if ((err = checkkappas(cov)) != NOERROR) return err; if (!isNegDef(cov) || cov->domown != XONLY) return ERRORSTATVARIO; if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR){ // print("OK %d\n",err); return err; } // print("xOK %d\n",err); setbackward(cov, next); assert(cov->vdim2[0] == 1); cov->mpp.maxheights[0] = RF_NA; cov->monotone = isMonotone(next->monotone) ? MONOTONE : NOT_MONOTONE; return NOERROR; } void rangePow(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[POW_ALPHA] = 0.0; range->max[POW_ALPHA] = 1.0; range->pmin[POW_ALPHA] = 0.01; range->pmax[POW_ALPHA] = 1.0; range->openmin[POW_ALPHA] = true; range->openmax[POW_ALPHA] = false; } /* qam */ #define QAM_THETA 0 void kappaqam(int i, cov_model *cov, int *nr, int *nc){ *nc = 1; *nr = i < CovList[cov->nr].kappas ? cov->nsub-1 : -1; } void qam(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; int i, nsub = cov->nsub; double sum, s, w, *theta = P(QAM_THETA); sum = 0.0; for (i=1; isub[i]; COV(x, sub, &s); INVERSE(&s, next, &w); sum += theta[i - 1] * w * w; } sum = sqrt(sum); COV(&sum, next, v); } int checkqam(cov_model *cov) { cov_model *next = cov->sub[0], *sub; int i, err, nsub = cov->nsub, nsubM1 = nsub - 1; double v, sum; if ((err = checkkappas(cov)) != NOERROR) return err; // cov->monotone = NORMAL_MIXTURE; sum = 0.0; for (i=0; i 1e-14) SERR("theta must sum up to 1"); if ((err = CHECK(next, 1, 1, PosDefType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; if (!isNormalMixture(next->monotone)) SERR("phi is not a normal mixture"); for (i=1; isub[i]; if ((err = CHECK(sub, cov->tsdim, cov->tsdim, PosDefType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; COV(ZERO, sub, &v); if (v != 1.0) SERR("unit variance required"); setbackward(cov, sub); } INVERSE(ZERO, next, &v); if (ISNAN(v)) SERR1("inverse function of '%s' unknown", NICK(next)); cov->logspeed = 0.0; return NOERROR; } sortsofparam paramtype_qam(int k, int VARIABLE_IS_NOT_USED row, int VARIABLE_IS_NOT_USED col) { return k==0 ? CRITICALPARAM : ANYPARAM; } void rangeqam(cov_model *cov, range_type *range){ double pmax = 2.0 / (double) (cov->nsub-1); range->min[QAM_THETA] = 0.0; range->max[QAM_THETA] = 1.0; range->pmin[QAM_THETA] = 0.0; range->pmax[QAM_THETA] = pmax; range->openmin[QAM_THETA] = false; range->openmax[QAM_THETA] = false; } /* mqam */ void kappamqam(int i, cov_model *cov, int *nr, int *nc) { int nsub = cov->nsub - 1; *nc = (i==QAM_THETA) ? 1 : -1; *nr = i == QAM_THETA ? nsub : -1; // print("kappa %d nsub=%d %d %d\n", i, nsub, *nc, *nr); } void mqam(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; int i, j, k, l, vdim = cov->vdim2[0], vdimP1 = vdim + 1; double s0, *theta = P(QAM_THETA), s[MAXSUB]; for (i=0; isub[i+1]; COV(x, sub, &s0); INVERSE(&s0, next, s + i); s[i] *= theta[i] * s[i]; } for (j=0; jnsub, vdim = nsub - 1; // NotProgrammedYet(""); if ((err = checkqam(cov)) != NOERROR) return err; cov->vdim2[0] = cov->vdim2[1] = vdim; return NOERROR; } void rangemqam(cov_model *cov, range_type *range){ //double pmax = 2.0 / (double) (cov->nsub-1); rangeqam(cov, range); } /////////////// NATSC void natsc(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; double invscale, y; INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); y = *x * invscale; // letzteres darf nur passieren wenn dim = 1!! COV(&y, next, v); } void Dnatsc(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim; double invscale, y; assert(CovList[next->nr].inverse != NULL); INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); y = *x * invscale; Abl1(&y, next, v); for (i=0; isub[0]; int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim; double invscale, y, invScSq; assert(CovList[next->nr].inverse != NULL); INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); y = *x * invscale; invScSq = invscale * invscale; Abl2(&y, next, v); for (i=0; isub[0]; double invscale, modelinv; assert(CovList[next->nr].inverse != NULL); INVERSE(x, next, &modelinv); INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); *v = modelinv / invscale; } int checknatsc(cov_model *cov) { cov_model *next = cov->sub[0]; int err; assert(isNatsc(cov)); if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, SUBMODEL_DEP, ROLE_COV)) != NOERROR) { return err; } if (next->domown == cov->domown && next->isoown == cov->isoown) { next->delflag = DEL_COV - 12; } if (CovList[next->nr].inverse == NULL) { sprintf(ERRORSTRING, "natural scaling is not defined for %s", NICK(next)); return ERRORFAILED; } double invscale; INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); // PMI(cov); printf("%f %f\n", GLOBAL.gauss.approx_zero, next, invscale); if (invscale == RF_NAN) SERR1("inverse function of '%s' unknown", NICK(next)); cov->logspeed = 0.0; setbackward(cov, next); cov->vdim2[0] = next->vdim2[0]; cov->vdim2[1] = next->vdim2[1]; return NOERROR; } int initnatsc(cov_model *cov, gen_storage *s){ // location_type *loc = Loc(cov); if (cov->role == ROLE_GAUSS) { cov_model *next = cov->sub[0]; return INIT(next, cov->mpp.moments, s); } else if (cov->role == ROLE_BROWNRESNICK || cov->role == ROLE_SMITH || cov->role == ROLE_SCHLATHER || cov->role == ROLE_POISSON || cov->role == ROLE_POISSON_GAUSS) { SERR("natsc for max-stable processes and poisson process not programmed yet"); } else ILLEGAL_ROLE; return NOERROR; } void donatsc(cov_model *cov, gen_storage *s){ cov_model *next = cov->sub[0]; DO(next, s); } void spectralnatsc(cov_model *cov, gen_storage *S, double *e) { // spectral_storage *s = &(S->Sspectral); cov_model *next = cov->sub[0]; int d, dim = cov->tsdim; double invscale; INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); SPECTRAL(next, S, e); for (d=0; dsub[0]; cov_fct *C = CovList + next->nr; // not gatternr if ( C->coinit == NULL) ERR("# cannot find coinit -- please inform author"); C->coinit(next, li); // not gatternr } void ieinitnatsc(cov_model *cov, localinfotype *li) { cov_model *next = cov->sub[0]; cov_fct *C = CovList + next->nr; // not gatternr if ( C->ieinit == NULL) // not gatternr ERR("# cannot find ieinit -- please inform author"); C->ieinit(next, li); // not gatternr } void tbm2natsc(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[0]; double invscale, y; INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); y = x[0] * invscale; TBM2CALL(&y, next, v) } //////////////////////////////////////////////////////////////////// void truncsupport(double *x, cov_model *cov, double *v){ // truncsupport erwartet dass vorher $ kommt, sofern skalenmischung cov_model *next = cov->sub[0]; int xdimown = cov->xdimown; double dist, radius = P0(TRUNC_RADIUS); // default -1 if (xdimown > 1) { int i; dist = 0.0; for (i=0; i=0 && dist > radius) { *v=0.0; return; } FCTN(x, next, v); // printf("ts %f %f\n", x, v); } int checktruncsupport(cov_model *cov) { cov_model *next=cov->sub[0]; int err, dim = cov->tsdim; // taken[MAX DIM], cov->maxdim=INFDIM; cov->monotone = isMonotone(next->monotone) ? MONOTONE : NOT_MONOTONE; if (cov->tsdim != cov->xdimown || cov->tsdim != cov->xdimprev) return ERRORDIM; if ((err = CHECK(next, dim, dim, ShapeType, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) { // print("error !!\n"); return err; } next->delflag = DEL_COV - 20; setbackward(cov, next); return NOERROR; } void truncsupportInverse(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *v){ *v = P0(TRUNC_RADIUS); } void rangetruncsupport(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[TRUNC_RADIUS] = 0; // < 0 : unset range->max[TRUNC_RADIUS] = RF_INF; range->pmin[TRUNC_RADIUS] = 0.00001; range->pmax[TRUNC_RADIUS] = 100.0; range->openmin[TRUNC_RADIUS] = true; range->openmax[TRUNC_RADIUS] = true; } int struct_truncsupport(cov_model *cov, cov_model **newmodel) { int err; ASSERT_NEWMODEL_NOT_NULL; if (hasPoissonRole(cov) || hasMaxStableRole(cov)) { if ((err = addUnifModel(cov, P0(TRUNC_RADIUS), newmodel)) != NOERROR) return err; } else ILLEGAL_ROLE_STRUCT; switch (cov->role) { case ROLE_POISSON_GAUSS : BUG; // was denn das da? double invscale; addModel(newmodel, GAUSS); addModel(newmodel, DOLLAR); kdefault(*newmodel, DSCALE, INVSQRTTWO); addModel(newmodel, TRUNCSUPPORT); InverseGauss(&GLOBAL.mpp.about_zero, cov, &invscale); kdefault(*newmodel, TRUNC_RADIUS, invscale); break; case ROLE_POISSON : // optimierte density return addUnifModel(cov, 1.0, newmodel); case ROLE_MAXSTABLE : case ROLE_SMITH : return addUnifModel(cov, 1.0, newmodel); default : ILLEGAL_ROLE_STRUCT; } return NOERROR; } int init_truncsupport(cov_model *cov, gen_storage *s) { int i, err, vdim = cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); if (cov->role == ROLE_BROWNRESNICK || cov->role == ROLE_SMITH || cov->role == ROLE_SCHLATHER || cov->role == ROLE_POISSON || cov->role == ROLE_POISSON_GAUSS) { cov_model *next = cov->sub[0]; // double // radius = P0(TRUNC_RADIUS); // default -1 if ((err = INIT(next, cov->mpp.moments, s)) != NOERROR) return err; // if (radius>=0 && radius < cov->mpp.refradius) cov->mpp.refradius = radius; // Eplus, M2 are assumed to be still precise !! for (i=0; impp.maxheights[i] = next->mpp.maxheights[i]; return NOERROR; } else ILLEGAL_ROLE; } void do_truncsupport(cov_model *cov, gen_storage *s) { // mppinfotype *info = &(s->mppinfo); cov_model *next = cov->sub[0]; int i, vdim = cov->vdim2[0]; // double // radius = P0(TRUNC_RADIUS); // default -1 assert(cov->vdim2[0] == cov->vdim2[1]); DO(next, s); for (i=0; impp.maxheights[i] = next->mpp.maxheights[i]; // if (radius>=0 && radius < info->radius) info->radius = radius; } void tbm3(double *x, cov_model *cov, double *v, double tbmdim){ cov_model *next = cov->sub[TBMOP_COV]; int i, vdim = cov->vdim2[0], vdim2 = vdim * vdim; assert(cov->vdim2[0] == cov->vdim2[1]); double v1[MAXTBMVDIM * MAXTBMVDIM]; COV(x, next, v); // x has dim 2, if turning planes // print(" cov=%4.4f %f %f %f %f\n ", x[0], v[0], v[1], v[2], v[3]); if (x[0] != 0.0) { //I(next); Abl1(x, next, v1); // print(" D=%4.4f ", v1); for (i=0; icov; double *x = info->x; for (i=0; isub[TBMOP_COV]; int fulldim = P0INT(TBMOP_FULLDIM), tbmdim = P0INT(TBMOP_TBMDIM); //vdim2 = cov->vdim * cov->vdim; // print("x=%4.4f t=%4.4f ", x[0], x[1]); if (cov->role != ROLE_COV) COV(x, next, v) else if (fulldim == tbmdim + 2) tbm3(x, cov, v, (double) tbmdim); else if (fulldim == 2 && tbmdim == 1) { if (CovList[next->nr].tbm2 != NULL) TBM2CALL(x, next, v) else tbm2num(x, cov, v); } else XERR(ERRORTBMCOMBI); } void Dtbm(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[TBMOP_COV]; int i, fulldim = P0INT(TBMOP_FULLDIM), vdim = cov->vdim2[0], vdim2 = vdim * vdim; assert(cov->vdim2[0] == cov->vdim2[1]); double v1[MAXTBMVDIM * MAXTBMVDIM], tbmdim = (double) P0INT(TBMOP_TBMDIM), f = 1.0 + 1.0 / tbmdim; BUG;// to do : Taylor-Entwicklung im Ursprung if (fulldim == tbmdim + 2) { Abl1(x, next, v); // x has dim 2, if turning planes Abl2(x, next, v1); for (i=0; isub[TBMOP_COV]; tbm_param *gp = &(GLOBAL.tbm); int err; // printf("here\n"); kdefault(cov, TBMOP_FULLDIM, PisNULL(TBMOP_TBMDIM) || gp->tbmdim >= 0 ? gp->fulldim : P0INT(TBMOP_TBMDIM) - gp->tbmdim); kdefault(cov, TBMOP_TBMDIM, gp->tbmdim > 0 ? gp->tbmdim : P0INT(TBMOP_FULLDIM) + gp->tbmdim); kdefault(cov, TBMOP_LAYERS, gp->layers); if ((err = checkkappas(cov)) != NOERROR) return err; int tbmdim = P0INT(TBMOP_TBMDIM), fulldim = P0INT(TBMOP_FULLDIM), vdim = cov->vdim2[0]; double storedlayer = P0(TBMOP_LAYERS); bool layers = !ISNAN(storedlayer) ? storedlayer : cov->xdimown == tbmdim + 1 && cov->isoown == SPACEISOTROPIC; if(cov->vdim2[0] != cov->vdim2[1]) BUG; if (tbmdim >= fulldim) SERR4("'%s' (=%d) must be less than '%s' (=%d)", KNAME(TBMOP_TBMDIM), tbmdim, KNAME(TBMOP_FULLDIM), fulldim); if (cov->tsdim > fulldim + layers) return ERRORWRONGDIM; //printf("%d %d %d %d\n",cov->xdimown,tbmdim,layers, cov->isoown); if (cov->xdimown > tbmdim + layers) { // APMI(cov); SERR("dimension of coordinates does not match reduced dimension of tbm"); } if ((err = CHECK(next, cov->tsdim, cov->xdimown, PosDefType, cov->domown, cov->isoown, SUBMODEL_DEP, ROLE_COV)) != NOERROR) { // PMI(cov); printf("errr=%d %d %d\n", err, cov->tsdim, cov->xdimown); //XERR(err); // if (cov->xdimown != 1) XERR(err); return err; } if (next->pref[TBM] == PREF_NONE) return ERRORPREFNONE; if (cov->isoown != ISOTROPIC && cov->isoown != SPACEISOTROPIC) { return ERRORANISO; } if (!isNegDef(cov->typus) || cov->domown != XONLY) { return ERRORSTATVARIO; } cov->maxdim = 0; setbackward(cov, next); cov->monotone=NOT_MONOTONE; cov->maxdim = fulldim + layers; cov->rese_derivs = next->rese_derivs - 1; cov->finiterange = ((fulldim - tbmdim) % 2 == 0) && next->finiterange == true; if (vdim > MAXTBMVDIM) SERR2("vdim (%d) exceeds max. value of vdim in tbm3 (%d)", vdim,MAXTBMVDIM); // printf("gp=%f sto=%d %d %d\n", gp->layers, storedlayer, // layers, P0INT(TBMOP_LAYERS)); // APMI(cov); // only after being sure that the subsequent model does not cause // problems. So the time dimension should be fixed. // This is not absolutely safe programming, but should be OK. // But difficult to get around for MLE calls that do not allow // for NAs values in integer variables. P(TBMOP_LAYERS)[0] = layers; return NOERROR; } void rangetbm_common(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range, bool tbmop ){ int TBMDIM = tbmop ? TBMOP_TBMDIM : TBM_TBMDIM, FULLDIM = tbmop ? TBMOP_FULLDIM : TBM_FULLDIM, LAYERS = tbmop ? TBMOP_LAYERS : TBM_LAYERS; range->min[FULLDIM] = 1.0; range->max[FULLDIM] = RF_INF; range->pmin[FULLDIM] = 1.0; range->pmax[FULLDIM] = 100; range->openmin[FULLDIM] = false; range->openmax[FULLDIM] = true; range->min[TBMDIM] = RF_NEGINF; range->max[TBMDIM] = RF_INF; range->pmin[TBMDIM] = RF_NEGINF; range->pmax[TBMDIM] = 100; range->openmin[TBMDIM] = false; range->openmax[TBMDIM] = true; range->min[LAYERS] = 0.0; range->max[LAYERS] = 1.0; range->pmin[LAYERS] = 0.0; range->pmax[LAYERS] = 1.0; range->openmin[LAYERS] = false; range->openmax[LAYERS] = false; } void rangetbmop(cov_model *cov, range_type *range){ rangetbm_common(cov, range, true); } int set_stein_q(cov_model *next, double r, double d, double *q) { double C0, phi0, phi1, phi2, zero = 0.0, rP1 = r + 1.0, rM1 = r - 1.0, dsq = d * d; COV(&zero, next, &C0); COV(&d, next, &phi0); Abl1(&d, next, &phi1); // derivative of phi1 *= d; // scaled fctn at 1 Abl2(&d, next, &phi2); // 2nd derivative of phi2 *= dsq; // scaled fctn at 1 q[LOCAL_R] = r * d; q[INTRINSIC_A2] = (phi2 - phi1) / (3.0 * r * rP1) ; q[INTRINSIC_B] = (r == 1.0) ? 0.0 : q[INTRINSIC_A2] / (rM1 * dsq); q[INTRINSIC_A2] = (q[INTRINSIC_A2] - phi1 / 3.0 - phi2 / 6.0) / dsq; q[INTRINSIC_A0] = 0.5 * rM1 / rP1 * phi2 + phi1 / rP1 - phi0; //print("check: %f %e r=%f intr:%f %f %f\n", // phi2, phi1, r, q[INTRINSIC_B], q[INTRINSIC_A0], q[INTRINSIC_A2]); // assert(false); // printf("%f %f %f+%f \n", q[INTRINSIC_B], q[INTRINSIC_A2], q[INTRINSIC_A0], C0); if ((q[INTRINSIC_B] < 0.0) || (q[INTRINSIC_A2] < 0.0) || (q[INTRINSIC_A0] + C0 < 0.0)) { // printf("%f %f %f+%f \n", q[INTRINSIC_B], q[INTRINSIC_A2], q[INTRINSIC_A0], C0); return MSGLOCAL_INITINTRINSIC; } return NOERROR; } int set_cutoff_q(cov_model *cov, double a, double d, double *q) { // auf modell ebene, d.h. co->sub[0] oder stein->sub[0] double phi0, phi1, a2; //, one=1.0; a2 = a * a; // cov_model *neu = NULL; //int err; // if ((err = covcpy(&neu, cov)) != NOERROR) return err; // CovList[cov->gatternr].cov(&d, neu, &phi0); // CovList[cov->gatternr].D(&d, neu, &phi1); //free(neu); COV(&d, cov, &phi0); Abl1(&d, cov, &phi1); phi1 *= d; // print("dphi0ph1 %e %e %e\n", d, phi0, phi1); if (phi0 <= 0.0) return MSGLOCAL_SIGNPHI; if (phi1 >= 0.0) return MSGLOCAL_SIGNPHIFST; // print("check_co phi0=%f phi1=%f a=%f d=%f a2=%f\n", phi0, phi1, a, d, a2); // assert(false); // print("p %f\n", phi1); // print("a2 %f\n", a2); // print("p0 %f\n", phi0); // print("a %f\n", a); // print("d %f\n", d); q[CUTOFF_B] =//sound qconstant even if variance of submodel is not 1 pow(- phi1 / (2.0 * a2 * phi0), 2.0 * a) * phi0 / pow(d, 2.0 * a2); // assert(false); q[CUTOFF_THEOR] = pow(1.0 - 2.0 * a2 * phi0 / phi1, 1.0 / a); q[LOCAL_R] = d * q[CUTOFF_THEOR]; q[CUTOFF_ASQRTR] = pow(q[LOCAL_R], a); // print("phi0=%f %f %f %f\n", phi0, phi1, a, d); // print("%f\n", d); assert(false); // print("%f %f %f %f\n", q[CUTOFF_B], q[CUTOFF_THEOR], q[LOCAL_R], q[CUTOFF_ASQRTR]); //assert(false); return NOERROR; } int check_local(cov_model *cov, Methods method, int maxq, getlocalparam init, // next->coinit set_local_q_type set_local) { location_type *loc = Loc(cov); int i, msg, dim = cov->tsdim, err=NOERROR; //dim = cov->tsdim; // timespacedim -- needed ?; double *q, q2[LOCAL_MAX], d=RF_NA; cov_model *next = cov->sub[0]; localinfotype li; //ce_param *gp = &(GLOBAL.localce); // ok // print("entering check local from %d:%s\n", cov->calling->nr, // CovList[cov->calling->nr].name); if ((err = CHECK(next, dim, 1, method == CircEmbedCutoff ? PosDefType : NegDefType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; // no setbackward ?! setbackward(cov, next); if (next->pref[method] == PREF_NONE) return ERRORPREFNONE; // PMI(cov); if (init == NULL){ return ERRORUNKNOWNMETHOD; } // PMI(cov); // assert(p[pLOC_DIAM] != NULL) ; // cov->variogram = false; // no changing in pref by submodel !! if (cov->q != NULL) { free(cov->q); // ERR("q not NULL in check_local -- ask author"); } cov->qlen = maxq; q = cov->q = (double*) CALLOC(maxq, sizeof(double)); for (i = 0; i < maxq; i++) q2[i] = RF_NA; // q2 will be copied to cov->q; // {int i; print("%d %f\n", cov->qlen); for(i=0;i<9;i++)print("%f ", cov->q[i]); print("\n"); assert(false);} if (PisNULL(pLOC_DIAM)) { double diameter = GetDiameter(loc); if (PL>=PL_DETAILS) { LPRINT("diameter %f\n", diameter); } kdefault(cov, pLOC_DIAM, diameter); } else { d = P0(pLOC_DIAM); } if (PisNULL(pLOC_A)) { if (CovList[next->nr].implemented[method]) { assert(init != NULL); init(next, &li); if (li.instances == 0) { SERR("parameter values do not allow for finding second parameter"); } q[LOCAL_R] = RF_INF; // print("%f\n", d); assert(false); msg = MSGLOCAL_FAILED; for (i=0; iq[LOCAL_MSG] = msg; // print("msg %d %d\n", msg, MSGLOCAL_FAILED); if (msg == MSGLOCAL_FAILED) err = ERRORFAILED; } else { SERR("2nd parameter is neither given nor can be found automatically"); } // APMI(cov); } else { if (cov->ncol[pLOC_A] != 1 || cov->nrow[pLOC_A] != 1) SERR1("'%s' must be a scale", KNAME(pLOC_A)); // print("here 2\n"); err = set_local(next, P0(pLOC_A), d, q2); MEMCOPY(q, q2, sizeof(double) * maxq); } cov->pref[CircEmbed] = 5; // APMI(cov); // print("pdq %f %f %f %d\n", p[pLOC_A]==NULL ?RF_NA :p[pLOC_A][0],d,q2, rr); // //if (err != NOERROR) { X ERR(err) // char Msg[255]; // err orMessage(err); // err or(Msg); //} return err; } void co(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; double y=*x, *q=cov->q, diameter = P0(pLOC_DIAM), a = P0(pLOC_A); assert(cov->role == ROLE_COV); if (y <= diameter) COV(x, next, v) else { *v = (y >= q[LOCAL_R]) ? 0.0 : q[CUTOFF_B] * pow(q[CUTOFF_ASQRTR] - pow(y, a), 2.0 * a); } } int check_co(cov_model *cov) { cov_model *next = cov->sub[0]; return check_local(cov, CircEmbedCutoff, CUTOFF_MAX, CovList[next->nr].coinit, set_cutoff_q); } bool alternativeparam_co(cov_model VARIABLE_IS_NOT_USED *cov){ return false; } void range_co(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[pLOC_DIAM] = 0.0; // CUTOFF_DIAM range->max[pLOC_DIAM] = RF_INF; range->pmin[pLOC_DIAM] = 1e-10; range->pmax[pLOC_DIAM] = 1e10; range->openmin[pLOC_DIAM] = true; range->openmax[pLOC_DIAM] = true; range->min[pLOC_A] = 0.0; // cutoff_a range->max[pLOC_A] = RF_INF; range->pmin[pLOC_A] = 0.5; range->pmax[pLOC_A] = 2.0; range->openmin[pLOC_A] = true; range->openmax[pLOC_A] = true; } void Stein(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; double y=*x, z, *q=cov->q, diameter = P0(pLOC_DIAM); // printf("diameter %f\n", diameter); assert(cov->role == ROLE_COV); if (y <= diameter) { COV(x, next, v); *v += q[INTRINSIC_A0] + q[INTRINSIC_A2] * y * y; // print("%f %f %f %f %d %d \n ", // y, v[0], q[INTRINSIC_A0], q[INTRINSIC_A2], INTRINSIC_A0, INTRINSIC_A2); } else { z = q[LOCAL_R] - y; *v = (z <= 0.0) ? 0.0 : q[INTRINSIC_B] * z * z * z / y; } } int check_Stein(cov_model *cov) { cov_model *next = cov->sub[0]; // dito return check_local(cov, CircEmbedIntrinsic, INTRINSIC_MAX, CovList[next->nr].ieinit, set_stein_q); } bool alternativeparam_Stein(cov_model *cov) { P(pLOC_A)[0] *= 2.0; return true; } void range_Stein(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[pLOC_DIAM] = 0.0; range->max[pLOC_DIAM] = RF_INF; range->pmin[pLOC_DIAM] = 0.01; range->pmax[pLOC_DIAM] = 100; range->openmin[pLOC_DIAM] = true; range->openmax[pLOC_DIAM] = true; range->min[pLOC_R] = 1.0; // stein_r range->max[pLOC_R] = RF_INF; range->pmin[pLOC_R] = 1.0; range->pmax[pLOC_R] = 20.0; range->openmin[pLOC_R] = false; range->openmax[pLOC_R] = true; } void strokorb(double *x, cov_model *cov, double *v) { // BrownResnick to strokorb Gaussian cov_model *next = cov->sub[0]; int dim = cov->tsdim; double u; int idx = 0; u = 2 * *x; switch (dim) { case 1 : Abl1(&u, next, v); *v = - *v; //printf("u=%f %e\n", u, *v); break; case 3 : if (*x == 0.0) { while (idx < next->taylorN && (next->taylor[idx][TaylorPow] ==0.0 || next->taylor[idx][TaylorPow] ==1.0)) idx++; if (idx >= next->taylorN) BUG; double p = next->taylor[idx][TaylorPow]; if (p > 3.0) BUG; // > 3 ist mathematisch vermutlich nicht moeglich, da bei strokorb // das submodel die entwicklung 1 - c x (oder rauher) hat *v = p < 3.0 ? RF_INF : next->taylor[idx][TaylorConst] * p * (p - 1) * pow(2, p-2)/ M_PI;//3.0 } else { Abl2(&u, next, v); *v /= (M_PI * *x); } break; default: BUG; } if (*v<0) { BUG; } assert(*v >= 0); assert(*x >= 0); // assert(false); } int checkstrokorb(cov_model *cov) { cov_model *next = cov->sub[0]; int dim = cov->tsdim, err = NOERROR; if ((err = CHECK(next, cov->tsdim, cov->xdimprev, TcfType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; if (!next->deterministic) SERR("only deterministic submodels allowed"); if (!isGneiting(next)) SERR("member of the Gneiting-Schaback class as submodel needed"); switch(dim) { case 1: if (next->rese_derivs < 1) SERR("submodel must be once differentiable"); break; case 3: if (next->rese_derivs < 2) SERR("submodel must be twice differentiable"); break; default: SERR("only dimensions 1 and 3 are allowed"); } // PMI(cov); if (!(hasMaxStableRole(cov) || hasNoRole(cov) || hasDistrRole(cov))) { SERR1("'%s' may be used only as a shape function with max-stable field simulation", NICK(cov)); } if (next->tailN < 1) SERR2("%d members of the Taylor expansion at infinity of '%s', but at least order 1 required.", next->tailN, NICK(next)); cov->taylorN = cov->tailN = 1; cov->tail[0][TaylorExpConst] = next->tail[0][TaylorExpConst]; cov->tail[0][TaylorExpPow] = next->tail[0][TaylorExpPow]; switch(dim) { case 1 : cov->taylor[0][TaylorConst] = -next->taylor[1][TaylorConst] * next->taylor[1][TaylorPow]; cov->taylor[0][TaylorPow] = next->taylor[1][TaylorPow] - 1.0; if (next->tail[0][TaylorExpPow] != 0.0) { if (next->tail[0][TaylorExpConst] == 0.0) BUG; cov->tail[0][TaylorConst] = next->tail[0][TaylorConst] * next->tail[0][TaylorExpConst] * next->tail[0][TaylorExpPow]; cov->tail[0][TaylorPow] = next->tail[0][TaylorPow] + next->tail[0][TaylorExpPow] - 1; } else { if (next->tail[0][TaylorExpConst] != 0.0) BUG; if (next->tail[0][TaylorPow] >= 0) { if (next->tail[0][TaylorConst] == 0) SERR("trivial submodel"); //APMI(next); SERR1("'%s' is not integrable", NICK(next)); } cov->tail[0][TaylorConst] = - next->tail[0][TaylorConst] * next->tail[0][TaylorPow]; cov->tail[0][TaylorPow] = next->tail[0][TaylorPow] - 1.0; } break; case 3 : int idx; idx = 1; //PMI(next, -1); if (next->taylorN <= 1) SERR2("%d members of the Taylor expansion of '%s' known, but at least 2 members required.", next->taylorN, NICK(next)); if (next->taylor[idx][TaylorPow] == 1.0) { if (next->taylorN <= idx + 1) SERR3("%d members of the Taylor expansion of '%s' known, but at least %d members required.", next->taylorN, NICK(next), idx + 1); idx++; } else assert(next->taylor[idx][TaylorPow] < 1.0); cov->taylor[0][TaylorPow] = (next->taylor[idx][TaylorPow] - 2.0) - 1.0; cov->taylor[0][TaylorConst] = next->taylor[idx][TaylorConst] / M_PI * next->taylor[idx][TaylorPow] * (next->taylor[idx][TaylorPow] - 1) * pow(2.0, cov->taylor[0][TaylorPow]); // if (next->tail[0][TaylorExpPow] != 0.0) { if (next->tail[0][TaylorExpConst] == 0.0) BUG; // Achtung ! Reihenfolge der Berechnung! double f = next->tail[0][TaylorExpConst] * next->tail[0][TaylorExpPow]; cov->tail[0][TaylorPow] = next->tail[0][TaylorPow] + 2.0 * (next->tail[0][TaylorExpPow] - 1.0); cov->tail[0][TaylorConst]= next->tail[0][TaylorConst] * f * f * pow(2.0, cov->tail[0][TaylorPow]); cov->tail[0][TaylorPow] -= 1.0; cov->tail[0][TaylorExpConst] *= pow(2.0, cov->tail[0][TaylorExpPow]); } else { // Achtung ! Reihenfolge der Berechnung! if (next->tail[0][TaylorExpConst] != 0.0) BUG; cov->tail[0][TaylorPow] = next->tail[0][TaylorPow] - 2.0; cov->tail[0][TaylorConst] = next->tail[0][TaylorConst] / M_PI * next->tail[0][TaylorPow] * (next->tail[0][TaylorPow] - 1.0) * pow(2.0, next->tail[0][TaylorPow] - 2.0); cov->tail[0][TaylorPow] -= 1.0; } break; default: BUG; } setbackward(cov, next); return NOERROR; } int init_strokorb(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { if (cov->role == ROLE_MAXSTABLE || hasNoRole(cov) || hasDistrRole(cov)) { //cov_model *next = cov->sub[0]; // double // radius = P(TRUNC_RADIUS)[0]; // default -1 // if ((err = INIT(next, 0, s)) != NOERROR) return err; //if (radius>=0 && radius < cov->mpp.refradius) cov->mpp.refradius = radius; // Eplus, M2 are assumed to be still precise !! assert(cov->vdim2[0] == 1 && cov->vdim2[1] == 1); cov->mpp.maxheights[0] = RF_NA; } else ILLEGAL_ROLE; /* if ((err = CHECK(cov->sub[0], cov->tsdim, cov->xdimprev, ShapeType, // cov->domown, cov->isoown, SCALAR, ROLE_MAXSTABLE// otherwise do will fail )) != NOERROR) return err; */ cov->mpp.maxheights[0] = 1.0; // all with be covered by pgs if (cov->mpp.moments >= 1) { cov->mpp.mM[1] = cov->mpp.mMplus[1] = 1; } return NOERROR; } void do_strokorb(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VARIABLE_IS_NOT_USED *s) { BUG; } ////////////////// strokorbBall #define STROKORBBALL_DIM 0 // Inner int checkstrokorbBall(cov_model *cov) { cov_model //*key = cov->key, *next = cov->sub[0]; int dim = cov->tsdim, err = NOERROR; assert(cov->key == NULL); if ((err = CHECK(next, dim, cov->xdimprev, TcfType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; if (!isGneiting(next)) SERR("member of the Gneiting-Schaback class as submodel needed"); switch(dim) { case 1: if (next->rese_derivs < 2) SERR("submodel must be twice differentiable"); break; case 3: if (next->rese_derivs < 3) SERR("submodel must be three times differentiable"); break; default: SERR("only dimensions 1 and 3 are allowed"); } if (!(hasMaxStableRole(cov) || hasNoRole(cov) || hasDistrRole(cov))) SERR1("'%s' may be used only as a shape function with max-stable field simulation", NICK(cov)); if (next->tailN < 1) SERR2("%d members of the Taylor expansion at infinity of '%s' found, but at least 1 is required.", next->tailN, NICK(next)); if (next->taylorN < 2) SERR2("%d members of the Taylor expansion of '%s' found, but at least 2 is required.", next->taylorN, NICK(next)); setbackward(cov, next); return NOERROR; } void ScaleToVar(cov_model *local, cov_model *remote, int VARIABLE_IS_NOT_USED variant) { // ACHTUNG!! from and to sind hier vertauscht!! assert(local->nr==POWER_DOLLAR && remote->nr==LOC); // int dim = local->tsdim; double scale = PARAM0(local, POWSCALE); // scale im entfernten model setzen PARAM(remote, LOC_SCALE)[0] = scale; remote->deterministic = false; } int struct_strokorbBall(cov_model *cov, cov_model **newmodel) { int err, dim = cov->tsdim; ASSERT_NEWMODEL_NOT_NULL; //PMI(cov, "strokorbBall"); if (cov->role == ROLE_MAXSTABLE) { addModel(newmodel, BALL, cov); addModel(newmodel, POWER_DOLLAR); kdefault(*newmodel, POWSCALE, 1.0); kdefault(*newmodel, POWPOWER, -dim); kdefault(*newmodel, POWVAR, 1.0 / VolumeBall(dim, BALL_RADIUS)); cov_model *pts=NULL, *scale=NULL; if ((err = covcpy(&pts, *newmodel)) != NOERROR) return err; if (CovList[cov->nr].kappas < 2) { if ((err = covcpy(&scale, cov)) != NOERROR) return err; // !! inverse scale gegenueber paper scale->nr = STROKORB_BALL_INNER; kdefault(scale, STROKORBBALL_DIM, dim); addModel(&scale, RECTANGULAR, *newmodel); kdefault(scale, RECT_APPROX, false); kdefault(scale, RECT_ONESIDED, true); (*newmodel)->kappasub[POWSCALE] = scale; } else { // for testing only addModelKappa(*newmodel, POWSCALE, UNIF); kdefault((*newmodel)->kappasub[POWSCALE], UNIF_MIN, P0(0)); kdefault((*newmodel)->kappasub[POWSCALE], UNIF_MAX, P0(1)); } // printf("%f %f %d\n", P0(0), P0(1), dim); // assert(false); addModel(&pts, RECTANGULAR); addModel(&pts, LOC); kdefault(pts, LOC_SCALE, 1.0); kdefault(pts, LOC_POWER, -dim); addModelKappa(pts, LOC_SCALE, NULL_MODEL); kdefault(pts->kappasub[LOC_SCALE], NULL_TYPE, RandomType); addSetParam(newmodel, pts, ScaleToVar, true, 0); addModel(newmodel, PTS_GIVEN_SHAPE); // to do : unif better ?! (*newmodel)->sub[PGS_LOC] = pts; pts->calling = *newmodel; // APMI(*newmodel); } else ILLEGAL_ROLE_STRUCT; return NOERROR; } void rangestrokorbball(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[0] = RF_NEGINF; range->max[0] = RF_INF; range->pmin[0] = -4.0; range->pmax[0] = 4.0; range->openmin[0] = false; range->openmax[0] = false; range->min[1] = RF_NEGINF; range->max[1] = RF_INF; range->pmin[1] = -4.0; range->pmax[1] = 4.0; range->openmin[1] = false; range->openmax[1] = false; } /* int init_strokorbBall(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { if (cov->role == ROLE_MAXSTABLE) { //cov_model *next = cov->sub[0]; // double // radius = P(TRUNC_RADIUS)[0]; // default -1 // if ((err = INIT(next, 0, s)) != NOERROR) return err; //if (radius>=0 && radius < cov->mpp.refradius) cov->mpp.refradius = radius; // Eplus, M2 are assumed to be still precise !! cov->mpp.maxheight = RF_NA; } else ILLEGAL_ROLE; cov->mpp.maxheight = 1.0; // all with be covered by pgs if (cov->mpp.moments >= 1) { cov->mpp.mM[1] = cov->mpp.mMplus[1] = 1; } return NOERROR; } void do_strokorbBall(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VA// RIABLE_IS_NOT_USED *s) { // assert(false); // } // */ void strokorbBallInner(double *x, cov_model *cov, double *v) { // only proportional to a density !!! cov_model *next = cov->sub[0]; int dim = cov->nr != STROKORB_BALL_INNER || PisNULL(STROKORBBALL_DIM) ? cov->tsdim : P0INT(STROKORBBALL_DIM); if (*x <= 0) { *v = 0.0; return; } double y = 2 * *x; switch (dim) { case 1 : // \chi''(s)*s [ diameter ] -> 4\chi''(2 s)*s Abl2(&y, next, v); *v *= 2.0 * y; //printf("u=%f %e\n", u, *v); break; case 3 : double w; //[chi''(s)-chi'''(s) * s] * s/3 //printf("y=%f\n", y); Abl2(&y, next, v); Abl3(&y, next, &w); *v = 2.0 * (*v - w * y) * y / 3.0; break; default: BUG; } if (*v<0) { BUG; } // assert(*v >= 0); } int check_strokorbBallInner(cov_model *cov) { cov_model *next = cov->sub[0]; int err; ROLE_ASSERT(ROLE_DISTR); if ((err = checkkappas(cov)) != NOERROR) return err; if (cov->tsdim != 1) SERR("only dimension 1 allowed"); if ((err = checkstrokorbBall(cov)) != NOERROR) return err; switch(P0INT(STROKORBBALL_DIM)) { case 1: if (next->rese_derivs < 2) SERR("submodel must be twice differentiable"); break; case 3: if (next->rese_derivs < 3) SERR("submodel must be three times differentiable"); break; default: SERR("only dimensions 1 and 3 are allowed"); } if (next->tailN < 1 || next->taylorN < 2) SERR1("taylor expansions of '%s' not programmed yet", NICK(next)); double tep = next->tail[0][TaylorExpPow], tp = next->tail[0][TaylorPow]; cov->taylorN = cov->tailN = 1; cov->tail[0][TaylorExpConst] = pow(2.0, tep) * next->tail[0][TaylorExpConst]; cov->tail[0][TaylorExpPow] = tep; int idx = 1; if (next->taylor[1][TaylorPow] == (int) next->taylor[1][TaylorPow]) { assert(next->taylor[1][TaylorPow] == 1.0); // 2 sollte nie auftreten, laeuft aber gleich if (next->taylorN >= 3) idx++; else SERR1("%s does not have a long enough taylor development programmed", NICK(next)); } double TP = next->taylor[idx][TaylorPow]; switch(P0INT(STROKORBBALL_DIM)) { case 1 : if (tep != 0.0) { cov->tail[0][TaylorPow] = tp + 2 * (tep - 1.0) + 1.0;// !! +1, da noch ein x drauf-multipliziert wird cov->tail[0][TaylorConst] = next->tail[0][TaylorExpConst] * tep; cov->tail[0][TaylorConst] *= cov->tail[0][TaylorConst]; } else { cov->tail[0][TaylorConst] = tp * (tp -1.0); cov->tail[0][TaylorPow] = tp - 1.0; // !! nicht -2.0, da noch ein x drauf-multipliziert wird } cov->taylor[0][TaylorConst] = TP * (TP - 1.0); cov->taylor[0][TaylorPow] = TP - 1.0; break; case 3 : if (tep != 0.0) { double dummy = next->tail[0][TaylorExpConst] * tep; cov->tail[0][TaylorConst] = dummy * dummy * dummy / 3.0; cov->tail[0][TaylorPow] = tp + 3 * tep - 1.0; } else { cov->tail[0][TaylorConst] = tp * (tp - 1.0) * (3.0 - tp) / 3.0; cov->tail[0][TaylorPow] = tp - 1.0; // !! nicht -2.0, da noch ein x drauf-multipliziert wird } cov->taylor[0][TaylorConst] = TP * (TP - 1.0) * (3.0 - TP) / 3.0; cov->taylor[0][TaylorPow] = TP - 2.0; break; default: BUG; } cov->tail[0][TaylorConst] *= 2.0 * next->tail[0][TaylorConst] * pow(2.0, cov->tail[0][TaylorPow]); cov->taylor[0][TaylorConst] *= 2.0 * next->taylor[idx][TaylorConst] * pow(2.0, cov->taylor[0][TaylorPow]); return NOERROR; } int init_strokorbBallInner(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VARIABLE_IS_NOT_USED *s) { // cov_model *next = cov->sub[0]; // int err, // dim = cov->tsdim; //printf("ball inner\n"); /* if ((err = CHECK(cov->sub[0], dim, cov->xdimprev, ShapeType, cov->domown, cov->isoown, SCALAR, ROLE_MAXSTABLE )) != NOERROR) return err; */ if (!next->deterministic) SERR("only deterministic submodels allowed"); // u.a. Taylor fehlt assert(cov->vdim2[0] == 1 && cov->vdim2[1] == 1); cov->mpp.maxheights[0] = 1.0; cov->mpp.mM[0] = cov->mpp.mMplus[0] = 1; if (cov->mpp.moments >= 1) { cov->mpp.mM[1] = cov->mpp.mMplus[1] = 1; } return NOERROR; } void do_strokorbBallInner(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VARIABLE_IS_NOT_USED *s) { //cov_model *next = cov->sub[0]; //DO(next, s); // nicht gatternr } void range_strokorbBallInner(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[STROKORBBALL_DIM] = 1; range->max[STROKORBBALL_DIM] = 3; range->pmin[STROKORBBALL_DIM] = 1; range->pmax[STROKORBBALL_DIM] = 3; range->openmin[STROKORBBALL_DIM] = false; range->openmax[STROKORBBALL_DIM] = false; } void strokorbPoly(double *x, cov_model *cov, double *v) { // only proportional to a density !!! cov_model *next = cov->sub[0]; COV(x, next, v); } int checkstrokorbPoly(cov_model *cov) { cov_model // *key = cov->key, *next = cov->sub[0]; int dim = cov->tsdim, err = NOERROR; assert(cov->key == NULL); if ((err = CHECK(next, dim, cov->xdimprev, TcfType, cov->domown, cov->isoown, SCALAR, ROLE_COV)) != NOERROR) return err; if (!isGneiting(next)) SERR("member of the Gneiting-Schaback class as submodel needed"); if (dim != 2) SERR("only dimension 2 currently programmed"); if (!(hasMaxStableRole(cov) || hasNoRole(cov))) { // PMI(cov->calling->calling); SERR1("'%s' may be used only as a shape function with max-stable field simulation", NICK(cov)); } setbackward(cov, next); return NOERROR; } void poly2unif(cov_model *local, cov_model *remote, int VARIABLE_IS_NOT_USED variant) { assert(local->nr==POLYGON && remote->nr==UNIF && local->Spolygon != NULL && local->Spolygon->P != NULL); polygon *P = local->Spolygon->P; assert(P->e != NULL); int d, dim = local->tsdim; assert(dim == 2); for (d=0; dbox0[d], P->box1[d], (long int) P); PARAM(remote, UNIF_MIN)[d] = P->box0[d]; PARAM(remote, UNIF_MAX)[d] = P->box1[d]; } remote->deterministic = false; } int struct_strokorbPoly(cov_model *cov, cov_model **newmodel) { cov_model *sub = cov->sub[0]; int dim = cov->tsdim; double var = 1.0; cov_model *pts=NULL, *shape=NULL; ASSERT_NEWMODEL_NOT_NULL; //PMI(cov, "strokorbPoly"); if (cov->role == ROLE_MAXSTABLE) { if (sub->nr != BROWNRESNICK) SERR1("only tcf '%s' allowed", CovList[BROWNRESNICK].nick); sub = sub->sub[0]; if (isDollar(sub)) { var = PARAM0(sub, DVAR); sub = sub->sub[0]; } if (sub->nr != BROWNIAN || PARAM0(sub, BROWN_ALPHA) != 1.0) { //APMI(sub); SERR2("Numerical inverse Laplace transform has not been implemented yet. Currently, only '%s' with parameter %s=1 is a valid submodel", CovList[BROWNIAN].nick, CovList[BROWNIAN].kappanames[BROWN_ALPHA]); } addModel(&pts, UNIF, NULL, true); kdefault(pts, UNIF_NORMED, (int) false); PARAMALLOC(pts, UNIF_MIN, dim, 1); PARAMALLOC(pts, UNIF_MAX, dim, 1); addModel(&shape, POLYGON, NULL, true); addModelKappa(shape, POLYGON_BETA, ARCSQRT_DISTR); kdefault(shape->kappasub[POLYGON_BETA], ARCSQRT_SCALE, 1.0 / var); addSetParam(&shape, pts, poly2unif, true, 0); addModel(newmodel, PTS_GIVEN_SHAPE); kdefault(*newmodel, PGS_NORMED, false); kdefault(*newmodel, PGS_ISOTROPIC, false); shape->calling = *newmodel; pts->calling = *newmodel; (*newmodel)->sub[PGS_LOC] = pts; (*newmodel)->sub[PGS_FCT] = shape; } else ILLEGAL_ROLE_STRUCT; // APMI(*newmodel); return NOERROR; } void mult_inverse(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; FCTN(x, next, v); *v = 1.0 / *v; } void mult_inverseNonstat(double *x, double *y, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; NONSTATCOV(x, y, next, v); *v = 1.0 / *v; } int checkmult_inverse(cov_model *cov) { cov_model *next = cov->sub[0]; assert(cov->vdim2[0] == 1 && cov->vdim2[1] == 1 ); int err = NOERROR; if ((err = CHECK(next, cov->tsdim, cov->xdimprev, ShapeType, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) return err; setbackward(cov, next); cov->mpp.maxheights[0] = RF_NA; return NOERROR; } //////////////////// void addSetParam(cov_model **newmodel, cov_model* remote, param_set_fct set, bool performdo, int variant, int nr) { set_storage *S; assert(SETPARAM_LOCAL == 0); addModel(newmodel, nr); kdefault(*newmodel, SET_PERFORMDO, performdo); NEW_COV_STORAGE(*newmodel, Sset, SET, set_storage); S = (*newmodel)->Sset; // S->from wird unten gesetzt ! S->remote = remote; S->set = set; S->variant = variant; } void addSetParam(cov_model **newmodel, cov_model * remote, param_set_fct set, bool performdo, int variant) { addSetParam(newmodel, remote, set, performdo, variant, SETPARAM); } void addSetDistr(cov_model **newmodel, cov_model * remote, param_set_fct set, bool performdo, int variant) { addSetParam(newmodel, remote, set, performdo, variant, SET_DISTR); } void setparamStat(double *x, cov_model *cov, double *v){ COV(x, cov->sub[SETPARAM_LOCAL], v); } void setparamNonStat(double *x, double *y, cov_model *cov, double *v){ NONSTATCOV(x, y, cov->sub[SETPARAM_LOCAL], v); } void Dsetparam(double *x, cov_model *cov, double *v){ Abl1(x, cov->sub[SETPARAM_LOCAL], v); } void DDsetparam(double *x, cov_model *cov, double *v){ Abl2(x, cov->sub[SETPARAM_LOCAL], v); } void D3setparam(double *x, cov_model *cov, double *v){ Abl3(x, cov->sub[SETPARAM_LOCAL], v); } void D4setparam(double *x, cov_model *cov, double *v){ Abl4(x, cov->sub[SETPARAM_LOCAL], v); } void Inverse_setparam(double *v, cov_model *cov, double *x){ cov_model *next = cov->sub[SETPARAM_LOCAL]; INVERSE(v, next, x); } void NonstatInverse_setparam(double *v, cov_model *cov, double *x, double *y){ cov_model *next = cov->sub[SETPARAM_LOCAL]; NONSTATINVERSE(v, next, x, y); // printf("nonstatinvere %f %f\n", x[0], y[0]); } void LogNonstatInverse_setparam(double *v, cov_model *cov, double *x, double *y){ cov_model *next = cov->sub[SETPARAM_LOCAL]; NONSTATLOGINVERSE(v, next, x, y); // printf("nonstatinvere %f %f\n", x[0], y[0]); } int checksetparam(cov_model *cov) { cov_model *next = cov->sub[SETPARAM_LOCAL]; int err, dim = cov->tsdim, xdim = cov->xdimown, role = cov->role; Types type = cov->typus; domain_type dom = cov->domown; isotropy_type iso = cov->isoown; kdefault(cov, SET_PERFORMDO, true); if (type == RandomType || next->typus== RandomType) { //PMI(cov); BUG; } if ((err = CHECK(next, dim, xdim, type, dom, iso, SUBMODEL_DEP, role)) != NOERROR) return err; setbackward(cov, next); cov->vdim2[0] = next->vdim2[0]; cov->vdim2[1] = next->vdim2[1]; cov->deterministic = false; TaylorCopy(cov, next); //if (cov->xdimown == 1) crash(); // ACHTUNG ! weder SETPARAM_FROM (da nur link) noch SETPARAM_SET (da // i.a. keine echten Modelle) werden ueberprueft! return NOERROR; } bool Typesetparam(Types required, cov_model *cov) { return TypeConsistency(required, cov->sub[SETPARAM_LOCAL]); } void spectralsetparam(cov_model *cov, gen_storage *s, double *e){ SPECTRAL(cov->sub[SETPARAM_LOCAL], s, e); // nicht gatternr } int initsetparam(cov_model *cov, gen_storage *s){ cov_model *next= cov->sub[SETPARAM_LOCAL]; set_storage *X = cov->Sset; // APMI(cov); crash(); assert(X != NULL); int err, i, vdim = cov->vdim2[0]; if (cov->vdim2[0] != cov->vdim2[1]) BUG; if ((err = INIT(next, cov->mpp.moments, s)) != NOERROR) return err; if (X->remote != NULL) { assert(X->set != NULL); X->set(cov->sub[0], X->remote, X->variant); } TaylorCopy(cov, next); for (i=0; impp.maxheights[i] = next->mpp.maxheights[i]; return NOERROR; } void dosetparam(cov_model *cov, gen_storage *s) { bool performDo = P0INT(SET_PERFORMDO); if (performDo) DO(cov->sub[SETPARAM_LOCAL], s); } void covmatrix_setparam(cov_model *cov, double *v) { cov_model *next = cov->sub[SETPARAM_LOCAL]; CovList[next->nr].covmatrix(next, v); } char iscovmatrix_setparam(cov_model *cov) { cov_model *next = cov->sub[SETPARAM_LOCAL]; return CovList[next->nr].is_covmatrix(next); } void range_setparam(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[SET_PERFORMDO] = 0; range->max[SET_PERFORMDO] = 1; range->pmin[SET_PERFORMDO] = 0; range->pmax[SET_PERFORMDO] = 1; range->openmin[SET_PERFORMDO] = false; range->openmax[SET_PERFORMDO] = false; } RandomFields/src/auxiliary.cc0000644000175100001440000007363212412655466015772 0ustar hornikusers//#define DEBUG 1 /* Authors Martin Schlather, schlather@math.uni-mannheim.de Collection of auxiliary functions Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "auxiliary.h" //#include #include "RandomFields.h" #include #include #include "RF.h" #include // important check !! #ifndef LOCAL_MACHINE #ifdef SHOW_ADDRESSES SHOW_ADRESSES IS NOT ALLOWED #endif #ifdef RANDOMFIELDS_DEBUGGING RANDOMFIELDS_DEBUGGING IS NOT ALLOWED #endif #endif double intpow(double x, int p) { double res = 1.0; if (p < 0) { p = -p; x = 1.0 / x; } while (p != 0) { if (p % 2 == 1) res *= x; x *= x; p /= 2; } return res; } void AtA(double *a, int nrow, int ncol, double *A) { // A = a^T %*% a int i, k, j, m, dimSq = ncol * ncol; for (k=i=0; i0; i+=dimP1, ii--) { // filling lower half endfor = i + ii; for (ve = i + 1, ho = i + dim; ve < endfor; ve++, ho += dim) { C[ve] = C[ho]; } } } */ int invertMatrix(double *M, int size, int* Methods, int nMeth) { // http://www.nag.com/numeric/fl/nagdoc_fl23/xhtml/F01/f01intro.xml int err, m, i, method = -1, sizeSq = size * size; long j; double *SICH = NULL; if (nMeth > 1) { if ((SICH = (double*) MALLOC(sizeof(double) * sizeSq)) == NULL) { return ERRORMEMORYALLOCATION; } memcpy(SICH, M, sizeSq); } for (m=0; m0) { memcpy(M, SICH, sizeSq); } switch(method) { case Cholesky : // cholesky F77_CALL(dpotrf)("Upper", &size, M, &size, &err); if (err != 0) { if (PL >= PL_COV_STRUCTURE) PRINTF("cholesky decomposition failed; the matrix does not seem to be strictly positive definite\n"); continue; } F77_CALL(dpotri)("U", &size, M, &size, &err); if (err != 0) { if (PL >= PL_COV_STRUCTURE) PRINTF("Cholesky decomposition failed; matrix does not seem to be strictly positive definite\n"); continue; } long i2, i3; for (i2=i=0; iPL_ERRORS) PRINTF("Error code F77_CALL(dgesdd) = %d\n", err); err=ERRORDECOMPOSITION; goto ErrorHandling2; } /* calculate SQRT of covariance matrix */ for (k=0, j=0; j=nMeth) SERR("matrix inversion failed"); return NOERROR; // -method; } int invertMatrix(double *M, int size) { return invertMatrix(M, size, GLOBAL.general.matrix_inversion, MAXINVERSIONS); } //void solveMatrix(int method, double *M, double *v, double *res, int size) { // // alles symmetrische matrizen!! // // http://www.nag.com/numeric/fl/nagdoc_fl23/xhtml/F01/f01intro.xml // int i,j, k // err, // //sizeSq = size * size // ; // // double *U; // // for (i=k=0; i 256) len = 256; for (i=0; i nline) m = nline; for (i=0; istart) { j--; PRINTF("\b \b"); continue; } for (i=0; i 1) { n--; strncpy(dest, src, n); } dest[n] = '\0'; } void I0ML0(double *x, int *n) { int i; for (i=0; i<*n; i++) x[i] = I0mL0(x[i]); } double I0mL0(double x){ /* Bessel I_0 - Struve L_0 for non-negative arguments x */ /* see J. MacLeod, Chebyshev expansions for modified {S}truve and related functions, Mathematics of Computation, 60, 735-747, 1993 */ static double g2[24] = { 0.52468736791485599138e0, -0.35612460699650586196e0, 0.20487202864009927687e0, -0.10418640520402693629e0, 0.4634211095548429228e-1, -0.1790587192403498630e-1, 0.597968695481143177e-2, -0.171777547693565429e-2, 0.42204654469171422e-3, -0.8796178522094125e-4, 0.1535434234869223e-4, -0.219780769584743e-5, 0.24820683936666e-6, -0.2032706035607e-7, 0.90984198421e-9, 0.2561793929e-10, -0.710609790e-11, 0.32716960e-12, 0.2300215e-13, -0.292109e-14, -0.3566e-16, 0.1832e-16, -0.10e-18, -0.11e-18 }; static double g3[24] = { 2.00326510241160643125e0, 0.195206851576492081e-2, 0.38239523569908328e-3, 0.7534280817054436e-4, 0.1495957655897078e-4, 0.299940531210557e-5, 0.60769604822459e-6, 0.12399495544506e-6, 0.2523262552649e-7, 0.504634857332e-8, 0.97913236230e-9, 0.18389115241e-9, 0.3376309278e-10, 0.611179703e-11, 0.108472972e-11, 0.18861271e-12, 0.3280345e-13, 0.565647e-14, 0.93300e-15, 0.15881e-15, 0.2791e-16, 0.389e-17, 0.70e-18, 0.16e-18 }; double r, x2, ac; int i; if (x < 0.0) {return RF_NA;} if (x < 16.0) { r = 0.5 * g2[0]; ac = acos((6.0 * x - 40.0) / (x + 40.0)); for (i=1; i<24; i++) { r += g2[i] * cos(i * ac); } } else { r = 0.5 * g3[0]; x2 = x * x; ac = acos((800.0 - x2) / (288.0 + x2)); for (i=1; i<24; i++) { r += g3[i] * cos(i * ac); } r *= T_PI /* 2/pi */ / x; } return r; } void StruveH(double *x, double *nu) {*x=struve(*x, *nu, -1.0, false);} void StruveL(double *x, double *nu, int * expScaled) { *x=struve(*x, *nu, 1.0, (bool) *expScaled); } double struve(double x, double nu, double factor_sign, bool expscaled) { double sign, value, epsilon=1e-20; double dummy, logx, x1, x2; if ((x==0.0) && (nu>-1.0)) return 0.0; if (x<=0) return RF_NA; // not programmed yet logx = log(0.5 * x); x1=1.5; x2=nu+1.5; sign=1.0; if (x2 > 0.0) { dummy = (nu + 1.0) * logx - lgammafn(x1) - lgammafn(x2); if (expscaled) dummy -= x; value = exp(dummy); } else { if ( (double) ((int) (x1-0.5)) != x1-0.5 ) return RF_NA; value=pow(0.5 * x, nu + 1.0) / (gammafn(x1) * gammafn(x2)); if (expscaled) value *= exp(-x); if ((dummy= value) <0) { dummy = -dummy; sign = -1.0; } dummy = log(dummy); } logx *= 2.0; do { if (x2<0) { sign = -sign; } dummy += logx - log(x1) - log(fabs(x2)); value += sign * exp(dummy); x1 += 1.0; x2 += 1.0; sign = factor_sign * sign; } while (exp(dummy) > fabs(value) * epsilon); return value; } SEXP vectordist(SEXP V, SEXP DIAG){ bool notdiag = !LOGICAL(DIAG)[0]; int d, dr, rows = nrows(V), cols = ncols(V), rescols = (int) (cols * (cols - 1 + 2 * (int) !notdiag) / 2); double *v1, *v2, *end, *Dist, *v = REAL(V); end = v + cols * rows; SEXP DIST; PROTECT(DIST = allocMatrix(REALSXP, rows, rescols)); Dist = REAL(DIST); for (dr=0, v1=v; v1 y[d]; return false; } bool smallerInt(int i, int j) { int *x, *y; int d; x = ORDERDINT + i * ORDERDIM; y = ORDERDINT + j * ORDERDIM; for(d=0; d y[d]; return false; } int is_positive_definite(double *C, int dim) { int err, bytes = sizeof(double) * dim * dim; double *test; test = (double*) MALLOC(bytes); MEMCOPY(test, C, bytes); F77_CALL(dpofa)(test, &dim, &dim, &err); free(test); return(err == 0); } void order(int *pos, int start, int end) { int randpos, pivot, left, right, pivotpos, swap; if( start < end ) { //Get RNGstate();randpos = start + (int) (UNIFORM_RANDOM * (end-start+1)); PutRNGstate(); // use Get/Put RNGstate with great care !! randpos = (int) (0.5 * (start + end)); pivot = pos[randpos]; pos[randpos] = pos[start]; pos[start] = pivot; pivotpos=start; left = start; right=end+1; while (left < right) { while (++left < right && SMALLER(pos[left], pivot)) pivotpos++; while (--right > left && GREATER(pos[right], pivot)); if (left < right) { swap=pos[left]; pos[left]=pos[right]; pos[right]=swap; pivotpos++; } } pos[start] = pos[pivotpos]; pos[pivotpos] = pivot; order(pos, start, pivotpos-1 ); order(pos, pivotpos + 1, end ); } } void ordering(double *d, int len, int dim, int *pos) { /* quicksort algorithm, slightly modified: does not sort the data, but d[pos] will be ordered NOTE: pos must have the values 0,1,2,...,start-end ! (orderdouble is a kind of sorting pos according to the variable d) */ int i; for (i=0; i= x --- sollte das gleiche sein // wie searchFirstGreater int mitte, min = 0, max = size - 1; while (min < max) { mitte = 0.5 * (min + max); if (cum[mitte] >= x) max = mitte; else min = mitte + 1; } // printf("%f < %f <= %f\n", cum[min-1], x, cum[min]); assert((min==0) || x > cum[min-1]); assert(x <= cum[min] && (min==0 || x > cum[min-1])); return min; } /* int searchFirstGreater(double *v, int len, double z) { // assumes the list has non decreasing values int firsti = 0, lasti = len - 1, i = len / 2; if (z > v[lasti]) { BUG; } if (z <= v[firsti]) return firsti; while (firsti < lasti) { if (v[i] < z) { firsti = i + 1; i = i + (int) ((lasti - i + 1) / 2); } else { // v[i] <= z lasti = i; i = i - (int) ((i - firsti + 1) / 2); } } assert((i==0) || z > v[i-1]); assert(z <= v[i]); // printf("%f < %f <= %f\n", v[i-1], z, v[i]);// } */ /* double searchInverse(isofct fct, double start, double *value, double releps) { while (fct(start, cov) > value) start *= 2.0; while (fct(start, cov) < value) start *= 0.5; double x = start, step = start; releps *= start; while (step > releps) { step *= 0.5; if (fct(step, cov) < value) x -= step; else x += step; } } */ double searchInverse(covfct fct, cov_model *cov, double start, double value, double releps) { double v; fct(&start, cov, &v); while (v > value) {start *= 2.0; fct(&start, cov, &v);} while (v < value) {start *= 0.5; fct(&start, cov, &v);} double x = start, step = start; releps *= step; while (step > releps) { step *= 0.5; fct(&step, cov, &v); if (v < value) x -= step; else x += step; } return x; } double searchInverse(covfct fct, cov_model *cov, double start, double min, double value, double releps) { double v; assert(start > min); fct(&start, cov, &v); while (v > value) {start = 2.0 * (start - min) + min; fct(&start, cov, &v);} while (v < value) {start = 0.5 * (start - min) + min; fct(&start, cov, &v);} double x = start, step = start - min; releps *= step; while (step > releps) { step *= 0.5; fct(&step, cov, &v); if (v < value) x -= step; else x += step; } return x; } //double gamma(double x) { BUG; } // use gammafn instead double incomplete_gamma(double start, double end, double s) { // int_start^end t^{s-1} e^{-t} \D t // print("incomplete IN s=%f e=%f s=%f\n", start, end, s); double v = 0.0, w = 0.0; if (s <= 1.0) { if (start == 0.0) return RF_NA; } double e_start = exp(-start), e_end = exp(-end), power_start = pow(start, s), power_end = end < RF_INF ? pow(end, s) : 0, factor = 1.0; while (s < 0.0) { factor /= s; v += factor * (power_end * e_end - power_start * e_start); power_start *= start; if (end < RF_INF) power_end *= end; s += 1.0; } w = pgamma(start, s, 1.0, false, false); // q, shape, scale, lower, log if (R_FINITE(end)) w -= pgamma(end, s, 1.0, false, false); // print("incomplete s=%f e=%f s=%f v=%f g=%f w=%f\n", start, end, s, v, gammafn(s), w); return v + gammafn(s) * w * factor; } int addressbits(void VARIABLE_IS_NOT_USED *addr) { #ifndef RANDOMFIELDS_DEBUGGING return 0; #else double x = (intptr_t) addr, cut = 1e9; x = x - trunc(x / cut) * cut; return (int) x; #endif } RandomFields/src/win_linux_aux.cc0000644000175100001440000000312612412655466016643 0ustar hornikusers /* Authors Martin Schlather, schlather@math.uni-mannheim.de Collection of system specific auxiliary functions Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef WIN32 // #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include #endif // achtung! windows.h zusammen mit // gibt warnung, da ERROR mehrfach definiert ! // deshalb auch in auxiliary.h nicht basic.h einbinden // obsolette ?!! #include #include #include "win_linux_aux.h" void sleepMilli(int *milli) { #ifdef WIN32 Sleep((long) *milli); #else usleep(1000 * (unsigned long) *milli); #endif } void sleepMicro(int *micro) { #ifdef WIN32 Sleep((long) ((*micro + 500) / 1000)); #else usleep((unsigned long) *micro); #endif } void pid(int *i) { #ifndef WIN32 *i = getpid(); #else *i = 0; #endif } void hostname(char **h, int *i){ #ifdef WIN32 *h[0]=0; #else gethostname(*h, *i); #endif } RandomFields/src/variogramAndCo.cc0000644000175100001440000010107712412655466016652 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de main library for unconditional simulation of random fields Copyright (C) 2001 -- 2003 Martin Schlather Copyright (C) 2004 -- 2004 Yindeng Jiang & Martin Schlather Copyright (C) 2005 -- 2014 Martin Schlather s This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include //#include #include #include "RF.h" //#include #include "Covariance.h" void genuineStatOwn(cov_model *cov, domain_type *stat, Types *type) { cov_model *sub = cov; while (isGaussMethod(sub)) sub = sub->sub[0]; *stat = sub->domown; *type = sub->typus; } #define STANDARDSTART \ cov_model *prev = cov->calling; \ assert(prev != NULL); \ cov_fct *P = CovList + prev->nr; \ if (prev->nr != COVFCTN && prev->nr != VARIOGRAM_CALL && \ P->check != check_cov && prev->nr != COVMATRIX && \ P->check != check_fctn && prev->nr != DIRECT && \ P->check != checkS) BUG; \ assert(prev->Spgs != NULL); \ pgs_storage *pgs= prev->Spgs; \ assert(pgs->x != NULL); \ location_type *loc = Loc(cov); \ assert(loc != NULL); \ bool grid =loc->grid && !loc->Time && loc->caniso==NULL; \ bool trafo = (loc->Time || loc->caniso != NULL) && !loc->distances; \ bool VARIABLE_IS_NOT_USED dist = loc->distances; \ long cumgridlen[MAXMPPDIM +1], \ err = NOERROR; \ int d, \ tsdim VARIABLE_IS_NOT_USED = loc->timespacedim, \ vdim VARIABLE_IS_NOT_USED = cov->vdim2[0], \ VARIABLE_IS_NOT_USED vdimSq = vdim * vdim, \ *gridlen=pgs->gridlen, \ *end=pgs->end, \ *endy VARIABLE_IS_NOT_USED =pgs->endy, \ *start=pgs->start, \ *startny VARIABLE_IS_NOT_USED =pgs->startny, \ *nx=pgs->nx, \ *ny VARIABLE_IS_NOT_USED = pgs->delta, \ VARIABLE_IS_NOT_USED xdimOZ = loc->xdimOZ, /* weicht u.U. von tsdim bei dist=true ab */ \ tsxdim = cov->xdimprev; /* weicht u.U. von tsdim bei dist=true ab */ \ long tot = loc->totalpoints, \ VARIABLE_IS_NOT_USED totM1 = tot - 1, \ VARIABLE_IS_NOT_USED vdimP1 = vdim + 1, \ vdimtot = vdim * tot, \ VARIABLE_IS_NOT_USED vdimSqtot = vdim * vdimtot, \ VARIABLE_IS_NOT_USED vdimtotSq = vdimtot * tot, \ VARIABLE_IS_NOT_USED vdimSqtotSq = vdimtot * vdimtot; \ assert(cov->vdim2[0] == cov->vdim2[1]); \ double *x = pgs->x, \ *xstart= pgs->xstart, \ *inc=pgs->inc, \ *y = pgs->supportmin, \ *ystart VARIABLE_IS_NOT_USED =pgs->supportmax, \ *yy = NULL, /* set by Transform2NoGrid; freed */ \ *xx = NULL, /* dito */ \ *x0 VARIABLE_IS_NOT_USED = NULL, /* never free it */ \ *incy VARIABLE_IS_NOT_USED =pgs->supportcentre, \ *z VARIABLE_IS_NOT_USED = pgs->z; \ bool ygiven = loc->y != NULL || loc->ygr[0] != NULL;/* might be changed !*/ \ if (grid) { \ cumgridlen[0] = 1; \ for (d=0; dxgr[d][XSTEP]; \ gridlen[d] = loc->length[d]; \ cumgridlen[d+1] = gridlen[d] * cumgridlen[d]; \ \ start[d] = 0; \ end[d] = gridlen[d]; \ nx[d] = start[d]; \ x[d] = xstart[d] = loc->xgr[d][XSTART]; \ } \ } \ loc->i_col = loc->i_row = 0 // ny wird nur inv CovMatrix verwendet! Stattdessen dort weder // ystart noch incy! #define STANDARDSTART_Y_SUPPL \ for (d=0; dygr[d]==NULL ? loc->xgr[d][XSTEP] : loc->ygr[d][XSTEP]; \ y[d] = ystart[d] = \ loc->ygr[d]==NULL ? loc->xgr[d][XSTART] : loc->ygr[d][XSTART]; \ endy[d] = loc->ygr[d]==NULL ? loc->xgr[d][XLENGTH]:loc->ygr[d][XLENGTH]; \ startny[d] = 0; \ ny[d] = startny[d]; \ } #define STANDARDINKREMENT \ d = 0; \ nx[d]++; \ x[d] += inc[d]; \ while (nx[d] >= end[d]) { \ nx[d] = start[d]; \ x[d] = xstart[d]; \ if (++d >= tsxdim) break; \ nx[d]++; \ x[d] += inc[d]; \ } \ if (d >= tsxdim) break; // end define StandardInkrement // Achtung hier *nicht* incy, starty #define STANDARDINKREMENT_Y \ d = 0; \ ny[d]++; \ y[d] += incy[d]; \ while (ny[d] >= endy[d]) { \ ny[d] = startny[d]; \ y[d] = ystart[d]; \ if (++d >= tsxdim) break; \ ny[d]++; \ y[d] += incy[d]; \ } \ // end define StandardInkrement_Y #define RECYCLE_Y \ if (d>tsxdim) \ for (d=0; dygr[d][XSTART]; \ ny[d] = startny[d]; \ } // loc->grid bei SelectedCovMatrix notwendig #define STANDARD_ENDE \ if (xx != NULL) free(xx); \ if (yy != NULL) free(yy); \ loc->i_col = loc->i_row = 0; // standard ende void CovVario(cov_model *cov, bool is_cov, bool pseudo, double *value) { STANDARDSTART; domain_type domown; Types type; long i, ii, v, j, m, n; bool stat, kernel; double *C0x = pgs->C0x, *C0y = pgs->C0y, **Val= pgs->Val, *cross=pgs->cross; // if(isCartesian(prev->isoown) || ygiven); genuineStatOwn(cov, &domown, &type); kernel = cov->domown != XONLY; stat = !kernel && isNegDef(type); if (is_cov) { assert(({/*PMI(cov, "Cov/vario"); */ cov->pref[Nothing] != PREF_NONE && isShape(type);})); // } else { if (cov->pref[Nothing] == PREF_NONE || !isNegDef(type)) { assert(({PMI(cov, "cov/Vario"); true;})); // ERR("given model is not a variogram"); } if (stat && isCartesian(prev->isoown)) { COV(ZERO, cov, C0y); // PMI(cov->calling); //printf("C0y %f %f %f %f\n", C0y[0], C0y[1], C0y[2], C0y[3]); //assert(false); } else { if (vdim > 1 && !stat) ERR("multivariate variogram only possible for stationary models"); NONSTATCOV(ZERO, ZERO, cov, C0y); } } if (vdim > 1) { for (v = i = 0; icalling); #define UNIVAR COV(x, cov, value + loc->i_row) #define UNIVAR_Y NONSTATCOV(x, y, cov, value + loc->i_row * vdimSq) #define MULT { \ COV(x, cov, cross); \ for (v = 0; vi_row] = cross[v]; \ /* printf("v=%d\n", v); // */ \ } \ } #define MULT_Y { \ NONSTATCOV(x, y, cov, cross); \ for (v = 0; vi_row] = cross[v]; \ /* printf("MULT_Y %d %f\n", v, cross[v]); // */ \ } \ } #define VARIO_UNIVAR { \ COV(x, cov, cross); \ value[loc->i_row] = *C0y - *cross; \ } \ #define VARIO_UNIVAR_Y { \ NONSTATCOV(x, x, cov, C0x); \ NONSTATCOV(y, y, cov, C0y); \ NONSTATCOV(x, y, cov, cross); \ value[loc->i_row] = 0.5 * (*C0x + *C0y) - *cross; \ } \ #define VARIO_MULT { \ COV(x, cov, cross); \ /* printf("vdim =%d\n", vdim);// */ \ for (v=0, m=0; mi_row] = \ /* 0.5 * (C0x[v] + C0y[v] - cross[m*vdim+n] -cross[n*vdim+m]); */ \ C0y[v] - 0.5 * (cross[v] + cross[n*vdim+m]); \ /* printf("v=%d %d: %f %f\n", v, n, cross[v], C0y[v]);// */ \ } \ } \ } \ \ #define PSEUDO_MULT { \ COV(x, cov, cross); \ for (v=0; vi_row] = C0y[v] - cross[v]; \ } \ } \ #define VARIO_MULT_Y { \ NONSTATCOV(x, x, cov, C0x); \ NONSTATCOV(y, y, cov, C0y); \ NONSTATCOV(x, y, cov, cross); \ for (v=m=0; mi_row] = \ 0.5 * (C0x[v] + C0y[v] - cross[v] -cross[n*vdim+m]); \ } \ } \ } \ #define PSEUDO_MULT_Y { \ NONSTATCOV(x, x, cov, C0x); \ NONSTATCOV(y, y, cov, C0y); \ NONSTATCOV(x, y, cov, cross); \ for (v=0; vi_row] = 0.5 * (C0x[v] + C0y[v]) - cross[v]; \ } \ } \ if (grid && (!kernel || ygiven)) { // Notbremse ! if (ygiven) { STANDARDSTART_Y_SUPPL; if (vdim == 1) { assert(loc->i_row==0); while (true) { if (is_cov) UNIVAR_Y else VARIO_UNIVAR_Y; loc->i_row++; STANDARDINKREMENT_Y; RECYCLE_Y; STANDARDINKREMENT; } } else { assert(Val != NULL && loc->i_row==0); while (true) { if (is_cov) MULT_Y else if (pseudo) PSEUDO_MULT_Y else VARIO_MULT_Y; loc->i_row++; STANDARDINKREMENT_Y; RECYCLE_Y; STANDARDINKREMENT; } } } else { // grid, y not given if (vdim == 1) { //printf("Val = %d %d\n", Val, loc->i_row); assert(loc->i_row==0); while (true) { //assert(!is_cov); if (is_cov) UNIVAR else VARIO_UNIVAR; //printf("%d\n", loc->i_row); //printf("x= %f %d %d v=%f \n", *x,loc->i_row, vdimSq, // (double) value[ loc->i_row * vdimSq] ); loc->i_row++; STANDARDINKREMENT; } } else { assert(loc->i_row==0); while (true) { if (is_cov) MULT else if (pseudo) PSEUDO_MULT else VARIO_MULT; loc->i_row++; STANDARDINKREMENT; } } } } else { // not a grid // PMI(cov); if (trafo) { Transform2NoGrid(cov, &xx, &yy); x = xx; y = yy; } else { x=loc->x; y=loc->y; } assert(ygiven xor (y==NULL)); if (ygiven || kernel) { double *y0, *yend; if (ygiven) { yend = y + tsxdim * loc->ly; } else { y = yend = ZERO; if (PL > 0) PRINTF("The covariance '%s' is called with a single variable although it is not stationary. The second variable is set to zero, here.\n", NICK(cov)); } y0 = y; if (vdim == 1) { // hier for (loc->i_row=0; loc->i_rowi_row++, x+=tsxdim, y +=tsxdim){ if (y >= yend) y = y0; if (is_cov) UNIVAR_Y else VARIO_UNIVAR_Y; // printf("tsxdim=%d %f %f, %f %f\n", // tsxdim, x[0], x[1], y[0], y[1], value[loc->i_row]); } //assert(false); } else { for (loc->i_row=0; loc->i_rowi_row++, x+=tsxdim, y +=tsxdim){ if (y >= yend) y = y0; // printf("xdimOZ=%d %f %f\n", xdimOZ, x[0], y[0]); //print("tsxdim = %d %d y=%ld y0=%ld end=%ld ly=%d\n", // tsxdim, loc->i_row, (long int) y, (long int) y0, (long int) yend, // loc->ly); if (is_cov) MULT_Y else if (pseudo) PSEUDO_MULT_Y else VARIO_MULT_Y; } } } else { if (vdim == 1) { for (loc->i_row=0; loc->i_rowi_row++, x+=tsxdim) { if (is_cov) UNIVAR else VARIO_UNIVAR; } } else { for (loc->i_row=0; loc->i_rowi_row++, x+=tsxdim) { if (is_cov) MULT else if (pseudo) PSEUDO_MULT else VARIO_MULT; } } } } STANDARD_ENDE; if (err != NOERROR) XERR(err); } void CovarianceMatrix(cov_model *cov, double *v) { domain_type domown; Types type; genuineStatOwn(cov, &domown, &type); if (cov->pref[Nothing] == PREF_NONE || (!isPosDef(type) && (!isNegDef(type) || domown!=XONLY))) { // Variogramme sind hier definitiv erlaubt, da durch Addition einer // Konstanten, das Zeug zu einer Kovarianzmatrix gemacht werden kann // siehe direct.cc assert(({PMI(cov, "cov matrix"); true;})); // error("covariance matrix: given model is not a covariance function"); } long l,n,m, VDIM, NEND, NINCR, MINCR, ENDFORINCR; double *C = NULL; bool vdim_closetogether = GLOBAL.general.vdim_close_together; //assert(false); STANDARDSTART; if (grid) { STANDARDSTART_Y_SUPPL; } if (ygiven && (loc->x != loc->y || loc->xgr[0] != loc->ygr[0])) { //printf("%d x=%ld y=%ld xgr=%ld ygr=%ld\n", // ygiven, (long int) loc->x, (long int) loc->y, (long int) loc->xgr[0], (long int) loc->ygr[0]); // ein Paerchen ist NULL; GERR("for the covariance matrix, no y-value may be given"); } if (vdim_closetogether) { // v-dimensions close together VDIM = vdim; NEND = vdimSqtot; NINCR = vdimtot; ENDFORINCR = vdim; MINCR = 1; } else { // values of any single multivariate component close together // default in GLOBAL.CovMatrixMulti VDIM = 1; NEND = vdimSqtotSq; NINCR = vdimtotSq; ENDFORINCR = vdimtot; MINCR = tot; } #define MULTICOV \ C = v + VDIM * (loc->i_col + loc->i_row * vdimtot); \ for (l=n=0; ni_col + loc->i_row * vdimtot) + m ; printf("MULTICOV %d,%d k=%d z=%d s=%d l=%d %f\n", loc->i_row,loc->i_col, k, k % vdimtot, (int) (k / vdimtot), l, z[l]); assert(R_FINITE(C[0])); // */ \ C[m] = z[l++]; \ } \ } \ \ if (loc->i_col != loc->i_row) { \ C = v + VDIM * (loc->i_row + loc->i_col * vdimtot); \ for (l=m=0; mi_row + loc->i_col * vdimtot) + n ; printf("MULTICOV %d,%d k=%d z=%d s=%d l=%d %f\n", loc->i_row,loc->i_col, k, k % vdimtot, (int) (k / vdimtot), l, z[l]); // */ \ C[n] = z[l++]; \ } \ } \ } if (grid) { loc->i_col = 0; while (true) { loc->i_row = loc->i_col; for (d=0; di_row++; STANDARDINKREMENT_Y; if (d >= tsxdim) break; } loc->i_col++; STANDARDINKREMENT; } } else { if (trafo) { Transform2NoGrid(cov, &xx); x0 = xx; } else x0 = loc->x; x = x0; for (loc->i_col=0; loc->i_coli_col++, x+=tsxdim) { for (y=x, loc->i_row=loc->i_col; loc->i_rowi_row++, y+=tsxdim) { if (dist) { // here x and y are ignored if (loc->i_row==loc->i_col) { COV(ZERO, cov, z); // !! Achtung; wegen der Mixed models // koennen hier verschiedene Werte auftreten // aufgrund von loc->i_col und loc->i_row !! } else { COV(x0 + (loc->i_col * totM1 - (loc->i_col * (loc->i_col + 1)) / 2 + loc->i_row -1) * tsxdim , cov, z); // PMI(cov->calling->calling->calling); // int idx = (loc->i_col * totM1 - (loc->i_col * (loc->i_col + 1)) / 2 + loc->i_row -1) * tsxdim; // printf("loc=%d %f %f %f\n", idx, x[idx], x[idx +1], z); } if (false) { if (loc->i_col < 10 && loc->i_row<10) printf("cm %d %d totM1=%d %ld %f %f \n", (int) loc->i_row, (int)loc->i_col, (int) totM1, (loc->i_col * totM1 - (loc->i_col * (loc->i_col + 1)) / 2 + loc->i_row -1) * tsxdim, x0[ (loc->i_col * totM1 - (loc->i_col * (loc->i_col + 1)) / 2 + loc->i_row -1) * tsxdim] , *z); // else assert(false); } } else { // printf("%d %s\n", cov->gatternr, NICK(cov)); //assert(cov->gatternr == 5); // PMI(cov->calling); NONSTATCOV(x, y, cov, z); // printf("x=%f %f y=%f %f z=%f\n", x[0], x[1], y[0], y[1], z[0]); //PMI(cov); assert(R_FINITE(z[0])); } MULTICOV; } } } if (false) { for (m=0; m<27; m++) { for (n=0; n<27; n++) { //printf("%+2.2f ", v[n * 27 + m]); } //printf("\n"); } } //assert(false); ErrorHandling: STANDARD_ENDE; if (err!=NOERROR) XERR(err); // int i,j,k; // for (k=i=0; i= step + tot) ptr[v] = -1; for (v=1; v=0 && selected[i] >= step) i--; ptr[v] = i+1; /// if (ptr[v]>=nsel || selected[ptr[v]] >= step + tot) ptr[v] = -1; else { newstart = selected[ptr[v]] % tot; if (newstart < start) start = newstart; } } // for (v=0; v= nsel || selected[ptr[v]] >= step) { ptr[v] = -1; continue; } } int newmin = selected[ptr[v]] % tot; if (newmin < *min) *min = newmin; } // for (v=0; v=0; k--) { j = i / cum[k]; i -= j * cum[k]; x[k] = (double) j * inc[k]; } } void SelectedCovMatrix(cov_model *cov, int *selected /* nr! */, int nsel, double *v) { bool vdim_close_together = GLOBAL.general.vdim_close_together; domain_type domown; Types type; int l,vrow, vcol, oldCMC = NA_INTEGER, oldCMR = NA_INTEGER; // vdimselrow, vdimselcol, selrow, selcol, genuineStatOwn(cov, &domown, &type); if (cov->pref[Nothing] == PREF_NONE || !isPosDef(type)) { assert(({PMI(cov, "cov matrix"); true;})); // error("cov. matrix: given model is not a covariance function"); } if (vdim_close_together) { NotProgrammedYet("vdim_closetogether for selected access on covariance matrices"); } STANDARDSTART; int *ptrcol = pgs->ptrcol, *ptrrow = pgs->ptrrow; oldCMC = loc->i_col; oldCMR = loc->i_row; if (ygiven && (loc->x != loc->y || loc->xgr[0] != loc->ygr[0])) { // ein Paerchen ist NULL; //printf("%d x=%ld y=%ld xgr=%ld ygr=%ld\n", // ygiven, (long int) loc->x, (long int) loc->y, (long int) loc->xgr[0], (long int) loc->ygr[0]); GERR("for the covariance matrix, no y-value may be given"); } if (!grid) { if (trafo) { Transform2NoGrid(cov, &xx); x0 = xx; } else x0 = loc->x; } loc->i_col = ptrStart(ptrcol, selected, nsel, tot, vdim); while (loc->i_col < tot) { // print("col=%d\n", loc->i_col); if (grid) split(loc->i_col, tsxdim, cumgridlen, inc, x); else x = x0 + tsxdim * loc->i_col; MEMCOPY(ptrrow, ptrcol, sizeof(int) * vdim); loc->i_row=loc->i_col; while (loc->i_row < tot){ // print("row=%d\n", loc->i_row); // print("col=%d row=%d\n", loc->i_col, loc->i_row); if (dist) { if (loc->i_row==loc->i_col) { COV(ZERO, cov, z); // Achtung aufgrund loc->i_row und loc->i_col // koennen hier verschiedene Werte auftreten (mixed models) !! } else { COV(x0 + (loc->i_col * totM1 - (loc->i_col * (loc->i_col + 1)) / 2 + loc->i_row -1) * tsxdim , cov, z); } } else { // assert(false); if (grid) split(loc->i_row, tsxdim, cumgridlen, inc, y); else y = x0 + tsxdim * loc->i_row; NONSTATCOV(x, y, cov, z); } // print("hello\n"); for (vcol=l=0; vcol> %d %d sel=%d tot=%d i=%d %d j=%d\n", // vcol, ptrcol[vcol], selected[ptrcol[vcol]], // tot, loc->i_col, selected[ptrcol[vcol]] % tot == loc->i_col, // loc->i_row); if (ptrcol[vcol] >= 0 && selected[ptrcol[vcol]] % tot == loc->i_col) { for (vrow=0; vrowi_row, // selected[ptrrow[vrow]] % tot == loc->i_row, // z[l], l, // ptrcol[vcol] * nsel + ptrrow[vrow], // ptrcol[vcol] + ptrrow[vrow] * nsel ); if (ptrrow[vrow] >= 0 && selected[ptrrow[vrow]] % tot == loc->i_row) { v[ptrcol[vcol] * nsel + ptrrow[vrow]] = v[ptrcol[vcol] + ptrrow[vrow] * nsel] = z[l++]; // print("%d %d %d %d \n", loc->i_col, loc->i_row, // ptrcol[vcol], ptrrow[vrow]); } } // for vrow } } // for vcol ptrNext(ptrrow, selected, nsel, tot, vdim, &loc->i_row); } // while loc->i_row < tot ptrNext(ptrcol, selected, nsel, tot, vdim, &loc->i_col); // assert( loc->i_col < 5); } // while loc->i_col < tot if (cov->domown==XONLY && isNegDef(cov->typus) && !isPosDef(cov->typus)) { double first=v[0]; for (l=0; li_col=oldCMC; loc->i_row=oldCMR; if (err!=NOERROR) XERR(err); } void partial_loc_set_matrix(cov_model *cov, double *x, long lx, bool dist, bool grid){ location_type *loc = Loc(cov); int err; bool ygiven = !dist && loc->ly != 0; if ((err = partial_loc_set(loc, x, ygiven ? x : NULL, lx, ygiven ? lx : 0, dist, loc->xdimOZ, NULL, grid, false)) != NOERROR) XERR(err); } void partial_loc_set_matrixOZ(cov_model *cov, double *x, long lx, bool dist, int *xdimOZ){ // *xdimOZ to distinguish from the previous partial_loc_set definition location_type *loc = Loc(cov); int err; bool ygiven = !dist && loc->ly != 0; if ((err = partial_loc_set(loc, x, ygiven ? x : NULL, lx, ygiven ? lx : 0, dist, *xdimOZ, NULL, loc->grid, false)) != NOERROR) XERR(err); } void partial_loc_set(cov_model *cov, double *x, long lx, bool dist, bool grid){ location_type *loc = Loc(cov); int err; bool cartesian = isCartesian(cov->isoown); if (!cartesian && loc->ly==0) add_y_zero(loc); if ((err = partial_loc_set(loc, x, cartesian ? NULL : ZERO, lx, !cartesian, dist, loc->xdimOZ, NULL, grid, false)) != NOERROR) XERR(err); } void partial_loc_setOZ(cov_model *cov, double *x, double *y, long lx, long ly, bool dist, int *xdimOZ){ // *xdimOZ to distinguish from the previous partial_loc_set definition location_type *loc = Loc(cov); int err; // printf("partial_loc_set dist = %d %d \n", dist, loc->ly); if ((err = partial_loc_set(loc, x, y, lx, ly, dist, *xdimOZ, NULL, loc->grid, false)) != NOERROR) XERR(err); } void partial_loc_setOZ(cov_model *cov, double *x, long lx, bool dist, int *xdimOZ){ // *xdimOZ to distinguish from the previous partial_loc_set definition location_type *loc = Loc(cov); int err; bool cartesian = isCartesian(cov->isoown); if (!cartesian && loc->ly==0) add_y_zero(loc); // printf("partial_loc_set dist = %d %d \n", dist, loc->ly); if ((err = partial_loc_set(loc, x, cartesian ? NULL : ZERO, lx, !cartesian, dist, *xdimOZ, NULL, loc->grid, false)) != NOERROR) XERR(err); //PMI(cov); } void partial_loc_setXY(cov_model *cov, double *x, double *y, long lx, long ly) { location_type *loc = Loc(cov); int err; // if (y == NULL) crash(); // assert(y != NULL); if ((err = partial_loc_set(loc, x, y, lx, ly, false, loc->xdimOZ, NULL, loc->grid, false)) != NOERROR) XERR(err); } void partial_loc_setXY(cov_model *cov, double *x, double *y, long lx) { location_type *loc = Loc(cov); int err; // PMI(cov); if ((err = partial_loc_set(loc, x, y, lx, y == NULL ? 0 : lx, false, loc->xdimOZ, NULL, loc->grid, false)) != NOERROR) XERR(err); } void partial_loc_null(cov_model *cov) { location_type *loc = Loc(cov); loc->lx = loc->ly = 0; loc->x = NULL; loc->y = NULL; } void InverseCovMatrix(cov_model *cov, double *v) { location_type *loc = Loc(cov); long vdimtot = loc->totalpoints * cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); CovList[cov->nr].covariance(cov, v); invertMatrix(v, vdimtot); } ////////////////////////////////////////////////////////////////////// // Schnittstellen #define STANDARDINTERN \ if (reg < 0 || reg > MODEL_MAX) XERR(ERRORREGISTER); \ if (currentNrCov==-1) InitModelList(); \ cov_model *cov = KEY[reg]; \ if (cov == NULL) { ERR("register not initialised") } \ cov_model *truecov = !isInterface(cov) ? \ cov : cov->key == NULL ? cov->sub[0] : cov->key #define STANDARDINTERN_SEXP \ if (INTEGER(reg)[0] < 0 || INTEGER(reg)[0] > MODEL_MAX) XERR(ERRORREGISTER); \ if (currentNrCov==-1) InitModelList(); \ cov_model *cov = KEY[INTEGER(reg)[0]]; \ if (cov == NULL) { ERR("register not initialised") } \ cov_model VARIABLE_IS_NOT_USED *truecov = !isInterface(cov) ? \ cov : cov->key == NULL ? cov->sub[0] : cov->key // if (cov->pref[Nothing] == PREF_NONE) { PMI(cov); XERR(ERRORINVALIDMODEL) } SEXP Delete_y(SEXP reg) { STANDARDINTERN_SEXP; int d; location_type *loc = Loc(cov); if (loc->y != NULL) { if (loc->y != loc->x) free(loc->y); loc->y = NULL; } if (loc->ygr[0] != NULL) { if (loc->ygr[0] != loc->xgr[0]) free(loc->ygr[0]); for (d=0; dygr[d] = NULL; } loc->ly = 0; return NULL; } SEXP CovLoc(SEXP reg, SEXP x, SEXP y, SEXP xdimOZ, SEXP lx, SEXP result) { STANDARDINTERN_SEXP; // PMI(cov); partial_loc_setXY(cov, REAL(x), TYPEOF(y) == NILSXP ? NULL : REAL(y), INTEGER(lx)[0]); CovList[truecov->nr].covariance(truecov, REAL(result)); // PMI(cov, "covloc"); printf("xdimOZ %d \n", INTEGER(xdimOZ)[0]); partial_loc_null(cov); if (Loc(cov)->xdimOZ != INTEGER(xdimOZ)[0]) BUG; return NULL; } SEXP CovMatrixSelectedLoc(SEXP reg, SEXP x, SEXP dist, SEXP xdimOZ, SEXP lx, SEXP selected, SEXP nsel, SEXP result) { STANDARDINTERN_SEXP; partial_loc_set_matrixOZ(cov, REAL(x), INTEGER(lx)[0], LOGICAL(dist)[0], INTEGER(xdimOZ)); CovList[truecov->nr].selectedcovmatrix(truecov, INTEGER(selected), INTEGER(nsel)[0], REAL(result)); partial_loc_null(cov); if (Loc(cov)->xdimOZ != INTEGER(xdimOZ)[0]) BUG; return NULL; } SEXP CovMatrixSelected(SEXP reg, SEXP selected, SEXP nsel, SEXP result) { STANDARDINTERN_SEXP; CovList[truecov->nr].selectedcovmatrix(truecov, INTEGER(selected), INTEGER(nsel)[0], REAL(result)); return NULL; } /* .C("setListElements",Reg, nteger(1), as.integer(1), PACKAGE="RandomFields"); */ void CovIntern(int reg, double *x, double *y, long lx, long ly, double *value) { STANDARDINTERN; partial_loc_setXY(cov, x, y, lx, ly); CovList[truecov->nr].covariance(truecov, value); partial_loc_null(cov); } void CovIntern(int reg, double *x, double *value) { STANDARDINTERN; location_type *loc = Loc(cov); bool cartesian = isCartesian(cov->isoown); if (!cartesian && loc->ly==0) add_y_zero(loc); // PMI(cov); partial_loc_setXY(cov, x, cartesian ? NULL : ZERO, 1, !cartesian); CovList[truecov->nr].covariance(truecov, value); partial_loc_null(cov); } SEXP CovMatrixLoc(SEXP reg, SEXP x, SEXP dist, SEXP xdimOZ, SEXP lx, SEXP result) { STANDARDINTERN_SEXP; partial_loc_set_matrixOZ(cov, REAL(x), INTEGER(lx)[0], LOGICAL(dist)[0], INTEGER(xdimOZ)); // // PMI(cov, "covmatrixloc"); CovList[truecov->nr].covmatrix(truecov, REAL(result)); // printf("***************************************************\n"); // { int i,j,k, tot=Loc(cov)->totalpoints; // printf("covmatrixloc %ld %ld %d\n", CovList[cov->nr].covmatrix, covmatrix_select, INTEGER(lx)[0]); // for (k=i=0; ixdimprev == 2); CovList[truecov->nr].covmatrix(truecov, REAL(result)); partial_loc_null(cov); return(NULL); } SEXP VariogramIntern(SEXP reg, SEXP x, SEXP lx, SEXP result) { STANDARDINTERN_SEXP; location_type *loc = Loc(cov); // printf("vario intern dist=%d\n", false); partial_loc_setOZ(cov, REAL(x), INTEGER(lx)[0], false, &(loc->xdimOZ)); CovList[truecov->nr].variogram(truecov, REAL(result)); partial_loc_null(cov); //PMI(truecov->calling, -1); //assert(false); return(NULL); } void PseudovariogramIntern(int reg, double *x, double *y, long lx, long ly, double *value) { STANDARDINTERN; location_type *loc = Loc(cov); partial_loc_setOZ(cov, x, y, lx, ly, false, &(loc->xdimOZ)); CovList[truecov->nr].pseudovariogram(truecov, value); partial_loc_null(cov); } void PseudovariogramIntern(int reg, double *x, double *value) { STANDARDINTERN; location_type *loc = Loc(cov); bool cartesian = isCartesian(cov->isoown); if (!cartesian && loc->ly==0) add_y_zero(loc); partial_loc_setOZ(cov, x, cartesian ? NULL : ZERO, 1, !cartesian, false, &(loc->xdimOZ)); CovList[truecov->nr].pseudovariogram(truecov, value); partial_loc_null(cov); } // bool close = GLOBAL.general.vdim_close_together; void Fctn(double VARIABLE_IS_NOT_USED *X, cov_model *cov, double *value){ if (value==NULL) return; // EvaluateModel needs information about size // of result array cov_model *sub = cov->sub[0]; assert(cov->key == NULL); int vdim12 = cov->vdim2[0] * cov->vdim2[1]; assert(cov->Spgs != NULL); pgs_storage *pgs= cov->Spgs; assert(pgs->x != NULL); location_type *loc = Loc(cov); assert(loc != NULL); bool grid =loc->grid && !loc->Time && loc->caniso==NULL; bool trafo = (loc->Time || loc->caniso != NULL) && !loc->distances; bool ygiven = loc->y != NULL || loc->ygr[0] != NULL; long cumgridlen[MAXMPPDIM +1], err = NOERROR; int d, *gridlen=pgs->gridlen, *end=pgs->end, *endy =pgs->endy, *start=pgs->start, *startny =pgs->startny, *nx=pgs->nx, *ny = pgs->delta, tsxdim = cov->xdimown; /* weicht u.U. von tsdim bei dist=true ab */ long tot = loc->totalpoints; double *x = pgs->x,/* freed only if grid */ *xstart= pgs->xstart, *inc=pgs->inc, *y = pgs->supportmin, /* freed only if grid */ *ystart =pgs->supportmax, *yy = NULL, /* set by Transform2NoGrid */ *xx = NULL, /* dito */ *incy =pgs->supportcentre; if (grid) { cumgridlen[0] = 1; for (d=0; dxgr[d][XSTEP]; gridlen[d] = loc->length[d]; cumgridlen[d+1] = gridlen[d] * cumgridlen[d]; start[d] = 0; end[d] = gridlen[d]; nx[d] = start[d]; x[d] = xstart[d] = loc->xgr[d][XSTART]; } } loc->i_col = loc->i_row = 0; // assert(false); #define FUNCTION FCTN(x, sub, value) #define FUNCTION_Y NONSTATCOV(x, y, sub, value) if (grid) { if (ygiven) { STANDARDSTART_Y_SUPPL; assert(loc->i_row==0); while (true) { FUNCTION_Y; loc->i_row ++; value += vdim12; STANDARDINKREMENT_Y; RECYCLE_Y; STANDARDINKREMENT; } } else { // grid, y not given assert(loc->i_row==0); while (true) { FUNCTION; loc->i_row ++;; value += vdim12; STANDARDINKREMENT; } } } else { // not a grid // PMI(cov); if (trafo) { Transform2NoGrid(cov, &xx, &yy); x = xx; y = yy; } else { x=loc->x; y=loc->y; } if (ygiven) { double *y0, *yend; y0 = y; yend = y + tsxdim * loc->ly; for (; loc->i_rowi_row++){ // todo loc->i_row besser long int if (y >= yend) y = y0; FUNCTION_Y; } } else { for (; loc->i_row < tot; value+=vdim12, x+=tsxdim, loc->i_row++) { FUNCTION; //printf("x=%f %f %d\n", x[0], x[1], tsxdim, *value); // assert(loc->i_row < 5); } } } STANDARD_ENDE; if (err != NOERROR) XERR(err); } RandomFields/src/error.h0000644000175100001440000001106112412655466014742 0ustar hornikusers#ifndef RFerror_H #define RFerror_H 1 // Error codes & messages // positive values are error codes // negative values are messages #define NOERROR 0 #define ERRORNOTPROGRAMMEDYET 1 #define ERRORFAILED 2 /* method didn't work for the specified parameters */ #define ERRORVDIMNOTPROGRAMMEDYET 3 #define ERRORTYPECONSISTENCY 4 #define ERRORM 10 /* a single error message */ #define ERRORMEND 11 /* a single error message -- und alles dazwischen */ #define ERRORWRONG 13 /* same as ERRORMSG, but showing only ERRORSTRING_WRONG */ #define ERRORWRONGVDIM 15 #define ERRORBADVDIM 16 #define ERRORNOTDEFINED 20 /* the specification for the covariance and method is not given/known, e.g. TBM2 for many covariance functions */ #define ERRORCOVFAILED 21 /* covariance model not defined for specified parameters and method -- NOTE: ERRORSTRING_OK and ERRORSTRING_WRONG must be set*/ #define ERRORUNKOWNSXPTYPE 22 /* parameter value of unknown SXP type */ #define ERRORSTATVARIO 23 /* only stat or variogram allowed as submodel */ #define ERRORANISO_T 24 /* anisoT' may not be given at the same time with 'Aniso' or 'proj' */ //#define ERRORVARIOGRAMONLY 25 /* attempt to get the covariance whereas only the variogram is defined */ #define ERRORPREFNONE 27 #define ERRORSUBMETHODFAILED 30 /* aufsplitten der Modelle bringt nichts */ #define ERRORMAXDIMMETH 31 /* max dimension of method exceeded */ #define ERRORPREVDOLLAR 32 /* one of the prev method was dollar, but cannot be taken into account */ #define ERRORINVALIDMODEL 33 /* no gauss method available, including 'Nothing'*/ #define ERRORODDMODEL 34 /* no gauss method available */ #define ERROROUTOFMETHODLIST 35 /* no further method we can try is available */ #define ERRORREGISTER 36 #define ERRORINCORRECTSTATISO 37 #define ERRORKERNEL 38 #define ERRORWRONGDIM 40 /* (tbm) dimension couldn't be reduced to be appropriate for the respective method */ #define ERRORTOOMANYLINES 41 /* Hyperplane tesselation: estimated simulated lines passes given threshold*/ #define ERRORDECOMPOSITION 42 /* direct simulation; matrix inversion failed */ #define ERRORNOVARIOGRAM 43 /* variogram models not allowed in ci and direct */ #define ERRORSPECTRAL 44 #define ERRORTBMCOMBI 45 #define ERRORONLYISOTROPIC 48 /* only isotropic random fields -- only for Markov implementation */ #define ERRORMARKOVPARAMETER 49 /*parameter set not available for GMRF method */ // for getnaturalscaling !! #define ERRORWAVING 50 /* numerical determination of practical range fails */ #define ERRORRESCALING 51 /* attempt to rescale where not possible */ #define NOERROR_REPEAT 97 #define NOERROR_ENDOFLIST 98 #define ERRORDUMMY 99 /* no error, only for tracing purposes */ // *** severe errors #define ERRORNORMALMIXTURE 101 /* normal mixture required */ #define ERRORNOMULTIVARIATE 102 /* vdim > 1 not allowed */ #define ERROR_MATRIX_SQUARE 103 #define ERROR_MATRIX_VDIM 104 #define ERROR_MATRIX_POSDEF 105 //#define ERROR_MATRIX_ 10 #define ERRORMEMORYALLOCATION 106 /* MALLOC returned NULL pointer */ #define ERRORNOTINITIALIZED 107 /* key.active==false in DoSimulateRF; is only checked there !!! */ #define ERRORDIM 119 /* dim<1 or dim>MAXDIM */ #define ERRORANISO 127 /* anisotropic call not allowed */ #define ERRORDIAMETERNOTGIVEN 128 #define ERRORUNKNOWNMETHOD 131 #define ERRORNOSTATMATCH 134 /* no matching ISO/STAT found in check2 */ // **** extremes #define ERRORTREND 203 /* extremes: no trend allowed */ #define ERRORUNKNOWNMAXTYPE 204 //#define ERRORONLYATOMS 250 /* Poisson distribution */ #define ERRORANISOnDOLLARNOTALLOWED_YET 251 //#define ERRORATOMNOTPROGRAMMED_YET 252 #define ERRORATOMP 253 // *** kriging #define ERRORKRIGETOL 350 // messages and strategies for local methods // ENDOFLIST also used for any kind of error appearing in getparam // never change order of the message numbers up to ENDOFLIST #define MSGLOCAL_OK 400 /* do not change ordering! (the less the better) */ #define MSGLOCAL_NUMOK 401 #define MSGLOCAL_JUSTTRY 402 #define MSGLOCAL_ENDOFLIST 403 #define MSGLOCAL_SIGNPHI 404 #define MSGLOCAL_SIGNPHIFST 405 #define MSGLOCAL_SIGNPHISND 406 #define MSGLOCAL_INITINTRINSIC 407 #define MSGLOCAL_FAILED 408 #define ERRORUNSPECIFIED 999 /* do not use numbers 800 -- 900 : reserved to MPP package */ #endif RandomFields/src/Brown.cc0000644000175100001440000014435112412655466015047 0ustar hornikusers/* Authors Marco Oesting, Martin Schlather, schlather@math.uni-mannheim.de simulation of Brown-Resnick processes Copyright (C) 2009 -- 2010 Martin Schlather Copyright (C) 2011 -- 2014 Marco Oesting & Martin Schlather This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "RF.h" #include "Covariance.h" #define BR_MESHSIZE LAST_MAXSTABLE + 1 #define BR_VERTNUMBER LAST_MAXSTABLE + 2 #define BR_OPTIM LAST_MAXSTABLE + 3 #define BR_OPTIMTOL LAST_MAXSTABLE + 4 #define BR_OPTIMMAX LAST_MAXSTABLE + 5 #define BR_LAMBDA LAST_MAXSTABLE + 6 #define BR_OPTIMAREA LAST_MAXSTABLE + 7 #define BR_VARIOBOUND LAST_MAXSTABLE + 8 ////////////////////////////////////////////////////////////////////// // Brown Resnick int checkBrownResnickProc(cov_model *cov) { cov_model *key = cov->key, *sub = key != NULL ? key : cov->sub[cov->sub[MPP_SHAPE] != NULL ? MPP_SHAPE: MPP_TCF]; int err, role, dim = cov->tsdim; isotropy_type isoprev; Types type; ASSERT_ONE_SUBMODEL(cov); if ((err = SetGEVetc(cov, ROLE_BROWNRESNICK)) != NOERROR) return err; role = isNegDef(sub) ? ROLE_COV : (isGaussProcess(sub) && isPointShape(cov)) ? ROLE_GAUSS : isBrownResnickProcess(sub) ? ROLE_BROWNRESNICK : isPointShape(sub) ? ROLE_BROWNRESNICK : ROLE_UNDEFINED; type = isProcess(sub) || isPointShape(sub) ? CovList[sub->nr].Type : NegDefType; ASSERT_ROLE_DEFINED(sub); isoprev = role == ROLE_COV ? SYMMETRIC : CARTESIAN_COORD; if ((err = CHECK(sub, dim, dim, type,//Martin: changed 27.11.13 CovList[cov->nr].Type, XONLY, isoprev, 1, role)) != NOERROR) { return err; } setbackward(cov, sub); if (cov->vdim2[0] != 1) SERR("BR only works in the univariate case"); return NOERROR; } #define ORIG_IDX 0 int init_BRorig(cov_model *cov, gen_storage *s){ cov_model *key = cov->key; location_type *keyloc = NULL; int err, d, dim = cov->tsdim; bool keygrid; BR_storage *sBR = NULL; if (cov->role != ROLE_BROWNRESNICK) ILLEGAL_ROLE; if (key == NULL) BUG; if ((err = alloc_cov(cov, dim, 1, 1)) != NOERROR) return err; pgs_storage *pgs = cov->Spgs; for (d=0; dsupportmin[d] = RF_NEGINF; // 4 * for debugging... pgs->supportmax[d] = RF_INF; pgs->supportcentre[d] = RF_NA; } pgs->log_density = 0.0; keyloc = Loc(key); keygrid = keyloc->grid; GLOBAL.gauss.loggauss = false; key->simu.active = true; key->simu.expected_number_simu = cov->simu.expected_number_simu; assert(cov->mpp.moments >= 1); if ((err = INIT(key, 1, s)) != NOERROR) goto ErrorHandling; cov->loggiven = true; assert(key->nr == GAUSSPROC); assert(key->mpp.moments >= 1); cov->mpp.mM[0] = cov->mpp.mMplus[0] = 1.0; cov->mpp.mM[1] = cov->mpp.mMplus[1] = 1.0; cov->mpp.maxheights[0] = exp(GLOBAL.extreme.standardmax); pgs->zhou_c = 1.0; sBR = cov->SBR; sBR->trendlen = 1; if ((sBR->trend = (double**) MALLOC(sizeof(double*)))==NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } if ((sBR->trend[ORIG_IDX] = (double*) MALLOC(keyloc->totalpoints*sizeof(double)) ) == NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } if ((err = loc_set(keygrid ? keyloc->xgr[0] : keyloc->x, NULL, NULL, dim, dim, keygrid ? 3 : keyloc->totalpoints, 0, false, keygrid, keyloc->distances, &Loc(cov->SBR->vario))) > NOERROR) goto ErrorHandling; if (sBR->vario->sub[0] != NULL) SetLoc2NewLoc(sBR->vario->sub[0], Loc(sBR->vario)); // assert(false); Variogram(NULL, sBR->vario, sBR->trend[ORIG_IDX]); if ((err = FieldReturn(cov)) != NOERROR) // must be later than INIT ! goto ErrorHandling; ErrorHandling: if (err != NOERROR) BR_DELETE(&(cov->SBR)); return err; } void do_BRorig(cov_model *cov, gen_storage *s) { cov_model *key = cov->key; assert(key != NULL); BR_storage *sBR = cov->SBR; assert(sBR != NULL && sBR->trend != NULL); res_type *res = cov->rf; #define ORIG_IDX 0 int i, zeropos = sBR->zeropos[ORIG_IDX]; long totalpoints = Loc(cov)->totalpoints; assert(totalpoints > 0); assert(zeropos >= 0 && zeropos trend[ORIG_IDX]; assert(cov->origrf); DO(key, s); // nicht gatternr, res_type *lgres = key->rf; double lgreszeropos = (double) lgres[zeropos]; // wird durch DO veraendert! for (i=0; ikey; location_type *keyloc = NULL; int d, dim, err; long j, shiftedloclen, keytotal, trendlenmax, trendlenneeded; bool keygrid; BR_storage *sBR = NULL; if (cov->role == ROLE_BROWNRESNICK) { if (key != NULL) { dim = cov->tsdim; if ((err = alloc_cov(cov, dim, 1, 1)) != NOERROR) return err; pgs_storage *pgs = cov->Spgs; for (d=0; dsupportmin[d] = RF_NEGINF; // 4 * for debugging; pgs->supportmax[d] = RF_INF; pgs->supportcentre[d] = RF_NA; } pgs->log_density = 0.0; keyloc = Loc(key); keygrid = keyloc->grid; keytotal = keyloc->totalpoints; GLOBAL.gauss.loggauss = false; key->simu.active = true; key->simu.expected_number_simu = cov->simu.expected_number_simu; assert(cov->mpp.moments >= 1); if ((err = INIT(key, 1, s)) != NOERROR) return err; cov->loggiven = true; assert(key->nr == GAUSSPROC); assert(key->mpp.moments >= 1); cov->mpp.mM[0] = cov->mpp.mMplus[0] = 1.0; cov->mpp.mM[1] = cov->mpp.mMplus[1] = 1.0; cov->mpp.maxheights[0] = exp(GLOBAL.extreme.standardmax); pgs->zhou_c = 1.0; sBR = cov->SBR; shiftedloclen = keygrid ? 3 : keytotal; if ((sBR->shiftedloc = (double*) MALLOC(dim*shiftedloclen*sizeof(double))) == NULL || (sBR->locindex = (int*) MALLOC(sizeof(int) * dim))==NULL ) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } trendlenmax = (int) ceil((double) GLOBAL.br.BRmaxmem / keytotal); trendlenneeded = MIN(keytotal, cov->simu.expected_number_simu); sBR->trendlen = MIN(trendlenmax, trendlenneeded); //PMI(cov->calling); // printf("len=%d %d %d mem=%d %d exp=%d %d\n", sBR->trendlen, trendlenmax, trendlenneeded, GLOBAL.br.BRmaxmem, keytotal, cov->simu.expected_number_simu, GLOBAL.general.expected_number_simu); assert(sBR->trendlen > 0); sBR->memcounter = 0; if ((sBR->loc2mem=(int*) MALLOC(sizeof(int)*keytotal))==NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } for (j=0; jloc2mem[j] = -1; if ((sBR->mem2loc=(int*) MALLOC(sizeof(int)*sBR->trendlen))==NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } if ((sBR->trend=(double**) MALLOC(sizeof(double*)*sBR->trendlen)) ==NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } for (j=0; jtrendlen; j++) { sBR->mem2loc[j] = -1; if ((sBR->trend[j] = (double*) MALLOC(keytotal*sizeof(double)))==NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } } if ((err = loc_set(keygrid ? keyloc->xgr[0] : keyloc->x, NULL, NULL, dim, dim, keygrid ? 3 : keytotal, 0, false, keygrid, keyloc->distances, &Loc(sBR->vario))) > NOERROR) return err; if (sBR->vario->sub[0] != NULL) SetLoc2NewLoc(sBR->vario->sub[0], Loc(sBR->vario)); if ((err = FieldReturn(cov)) != NOERROR) // must be later than INIT ! return err; } return NOERROR; } else ILLEGAL_ROLE; ErrorHandling: BR_DELETE(&(cov->SBR)); return err; } void do_BRshifted(cov_model *cov, gen_storage *s) { BR_storage *sBR = cov->SBR; cov_model *key = cov->key; assert(cov->key != NULL); location_type *keyloc = Loc(key); long i, k, zeropos, zeroposMdim, keytotal = keyloc->totalpoints; int d, trendindex, dim = cov->tsdim, trendlen = sBR->trendlen, *locindex = sBR->locindex, *mem2loc = sBR->mem2loc, *loc2mem = sBR->loc2mem; bool keygrid = keyloc->grid; double *shiftedloc = sBR->shiftedloc, **trend = sBR->trend; assert(cov->origrf); res_type *res = cov->rf; res_type *lgres = cov->key->rf; DO(key, s); zeropos = (long) floor(UNIFORM_RANDOM * keytotal); if (loc2mem[zeropos] > -1) { trendindex = loc2mem[zeropos]; if (mem2loc[trendindex] != zeropos) BUG; } else { if (sBR->memcountermemcounter; sBR->memcounter++; } else { trendindex = trendlen - 1; loc2mem[mem2loc[trendlen-1]] = -1; mem2loc[trendlen-1] = -1; } if (keygrid) { indextrafo(zeropos, keyloc->length, dim, locindex); // to do: ersetzen for (d=0; dxgr[d][XSTEP]; shiftedloc[3*d+XLENGTH] = keyloc->xgr[d][XLENGTH]; shiftedloc[3*d+XSTEP] = keyloc->xgr[d][XSTEP]; } } else { zeroposMdim = zeropos*dim; for (k=i=0; ix[k] - keyloc->x[zeroposMdim+d]; } } } partial_loc_set(Loc(sBR->vario), shiftedloc, NULL, keygrid ? 3: keytotal, 0, keyloc->distances, dim, NULL, keygrid, true); if (sBR->vario->sub[0] != NULL) SetLoc2NewLoc(sBR->vario->sub[0], Loc(sBR->vario)); //assert(false); Variogram(NULL, sBR->vario, sBR->trend[trendindex]); mem2loc[trendindex] = zeropos; // todo ? long instead of int loc2mem[zeropos] = trendindex; } for (i=0; ilogspeed) SERR("BrownResnick requires a variogram model as submodel that tends to infinity [t rate of at least 4log(h) for being compatible with BRmixed"); kdefault(cov, BR_MESHSIZE, bp->BRmeshsize); kdefault(cov, BR_VERTNUMBER, bp->BRvertnumber); kdefault(cov, BR_OPTIM, bp->BRoptim); kdefault(cov, BR_OPTIMTOL, bp->BRoptimtol); kdefault(cov, BR_OPTIMMAX, bp->BRoptimmaxpoints); kdefault(cov, BR_VARIOBOUND, bp->variobound); if (cov->nr == BRMIXED_USER && cov->key == NULL && P0INT(BR_OPTIM) > 0) { if (!PisNULL(BR_LAMBDA)) { if (PisNULL(BR_OPTIMAREA)) SERR1("'%s' not given", KNAME(BR_OPTIMAREA)); if (PL > 0) PRINTF("'%s' set to '0'", KNAME(BR_OPTIM)); PINT(BR_OPTIM)[0] = 0; } else if (P0INT(BR_OPTIM) == 2 && !PisNULL(BR_OPTIMAREA)) if (PL > 0) PRINTF("'%s' set to '1'", KNAME(BR_OPTIM)); } kdefault(cov, BR_LAMBDA, RF_NA); if (PisNULL(BR_OPTIMAREA)) //necessary as areamat might not be scalar kdefault(cov, BR_OPTIMAREA, 1.0); if ((err = checkBrownResnickProc(cov)) != NOERROR) return err; if ((err = checkkappas(cov, true)) != NOERROR) return err; if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if (cov->vdim2[0] != 1) SERR("BR only works in the univariate case"); return NOERROR; } void kappaBRmixed(int i, cov_model *cov, int *nr, int *nc){ // i nummer des parameters int dim = cov->tsdim; switch(i) { case GEV_XI: case GEV_MU: case GEV_S: case BR_MESHSIZE: case BR_VERTNUMBER: case BR_OPTIM: case BR_OPTIMTOL: case BR_OPTIMMAX: case BR_LAMBDA: case BR_VARIOBOUND: *nr = 1; *nc = 1; break; case BR_OPTIMAREA: switch(dim) { case 1: *nr = 1; *nc = SIZE_NOT_DETERMINED; break; case 2: *nr = SIZE_NOT_DETERMINED; *nc = SIZE_NOT_DETERMINED; break; default: *nr = 1; *nc = 1; } break; default: *nr = -1; *nc = -1; } } void OptimArea(cov_model *cov, int idx) { // side effect auf P(BR_OPTIMAREA) !! BR_storage *sBR = cov->SBR; cov_model *key = sBR->sub[idx]; location_type *keyloc = Loc(key); int d, i, j, k, l, //maxind, // totalcount = 0, // limit, zeroxpos, zeroypos, cellcounter, *len = keyloc->length, radius = (int) floor(keyloc->length[0] / 2.0), vertnumber = P0INT(BR_VERTNUMBER), radiusP1 = radius+1, //err = NOERROR, dim = cov->tsdim, //totalpoints = keyloc->totalpoints, optimmax = P0INT(BR_OPTIMMAX) //zeropos = sBR->zeropos[idx] ; double dummy, //maxval, Error, maxErrorbound, Errorbound, Errorboundtmp, Errortol = P0(BR_OPTIMTOL), step = P0(BR_MESHSIZE), stepdim= intpow(step, dim), **am = sBR->areamatrix //*trend = sBR->trend[idx] ; // MARCO: ok?? // zwingend eine Kopie erstellen, da Vertauschen durchgefuehrt werden for (j=0; jcountvector[j]; for (d=0; d Error matrix for (j=0; j Errorbound) { Errorboundtmp = fmin(Errorboundtmp, am[j][d]); } } } Error = 0.0; cellcounter = 0; for (d=0; dnrow[BR_OPTIMAREA], cov->ncol[BR_OPTIMAREA]); double invvertnumber = 1.0 / vertnumber; PFREE(BR_OPTIMAREA); PALLOC(BR_OPTIMAREA, (int) (dim==1) ? 1 : len[1], len[0]); double *optimarea = P(BR_OPTIMAREA); for (l=i=0; inrow[BR_OPTIMAREA]; i++) { for (k=0; kncol[BR_OPTIMAREA]; k++, l++) { d = abs(k-zeroxpos) + abs(i-zeroypos); // abs OK optimarea[l] = 0.0; for (j=0; j 0) printf("%4.2f ", P(BR_OPTIMAREA][l]); } //printf("\n"); } // return newlambda / cellcounter; // not used } int prepareBRoptim(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { BR_storage *sBR = cov->SBR; int idx = 0; // first is the largest cov_model *key = sBR->sub[idx]; location_type *keyloc = Loc(key); int i, j, d, sum_directions, radius = (int) floor(keyloc->length[0] / 2.0), radiusP1 = radius+1, vertnumber = P0INT(BR_VERTNUMBER), // totalpoints = keyloc->totalpoints, *len = keyloc->length, dim = cov->tsdim; // if (PL >= PL_STRUCTURE) PRINTF("starting BR optimiation with %d simulations [optim=%d]...\n", optimmax, optim); APMI(cov); assert(false); switch(P0INT(BR_OPTIM)) { case 0: if (ISNAN(P0(BR_LAMBDA))) P(BR_LAMBDA)[0] = 1.0; break; case 1: // nothing to do break; case 2: if (dim > 2) BUG; sBR->vertnumber = vertnumber; sum_directions = 0; for (d=0; dcountvector != NULL || sBR->areamatrix != NULL) BUG; if ((sBR->countvector = (int**) CALLOC(vertnumber, sizeof(int*))) == NULL || (sBR->areamatrix = (double**) CALLOC(vertnumber, sizeof(double*))) == NULL|| (sBR->logvertnumber = (double *) MALLOC(vertnumber * sizeof(double))) ==NULL ) return ERRORMEMORYALLOCATION; for (i=0; i< vertnumber; i++) { if ((sBR->countvector[i] = (int*) CALLOC(sum_directions, sizeof(int))) == NULL || (sBR->areamatrix[i] = (double*) CALLOC(radiusP1, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; } for (j=0; jlogvertnumber[j] = - log((double) (j+1)/vertnumber); break; default: SERR("optimization might not be used here\n"); } if (PL >= PL_STRUCTURE) PRINTF("BR optimisation finished...\n"); return NOERROR; } void indextrafo(long onedimindex, int *length, int dim, int *multidimindex) { int d; for (d=0; dSBR; assert(sBR != NULL); assert(sBR->sub[0] != NULL); double *optimarea = P(BR_OPTIMAREA); // assert(optimarea[0] == 1.0); Marco: wann ist dies erfuellt ??? int i, l, ii, xbound = (int) floor(cov->ncol[BR_OPTIMAREA] * 0.5), ybound = (int) floor(cov->nrow[BR_OPTIMAREA] * 0.5); //printf("lowerbounds: xy= %d %d\n", xbound, ybound); for (i=0; i<=sBR->maxidx; i++) { cov_model *key = sBR->sub[i]; location_type *keyloc = Loc(key); long j, k, keytotal = keyloc->totalpoints, len = keyloc->length[0]; for (j=0; jlowerbounds[i][j] = RF_INF; for (l=0, ii=-ybound; ii<=ybound; ii++) { k = sBR->zeropos[i] + ii*len - xbound; for (j=-xbound; j<=xbound; j++, l++, k++) { if (optimarea[l]>1e-5) { sBR->lowerbounds[i][k] = -log(optimarea[l]); // printf("-> idx=%d ii=%d j=%d lower=%f\n", i, ii,j, // sBR->lowerbounds[i][k] ); } // printf("k=%d i=%d %d %f l=%d %f %f\n", k, i, sBR->zeropos[i] , optimarea[l], l, sBR->lowerbounds[i][k], P0(BR_OPTIMAREA)); } } } } int init_BRmixed(cov_model *cov, gen_storage *s) { //printf("entering init_brmixed\n"); location_type *loc = Loc(cov); //*keyloc = Loc(key) int i, d, err, //keytotal = keyloc->totalpoints, //*lglength = keyloc->length, dim = cov->tsdim, // optim = P0INT(BR_OPTIM), bytes = sizeof(double) * dim; BR_storage *sBR = cov->SBR; assert(sBR != NULL); assert(sBR->sub[0] != NULL); // step = P0(BR_MESHSIZE); pgs_storage *pgs = NULL; assert(isPointShape(cov)); if (cov->role != ROLE_BROWNRESNICK) ILLEGAL_ROLE; assert(dim > 0); sBR->idx = -1; sBR->trendlen = sBR->maxidx + 1; if ((err = alloc_cov(cov, dim, 1, 1)) != NOERROR) goto ErrorHandling;; // nur pgs pgs = cov->Spgs; // nach alloc_cov !! if ((sBR->suppmin = (double*) MALLOC(bytes))==NULL || (sBR->suppmax = (double*) MALLOC(bytes))==NULL || (sBR->locmin = (double*) MALLOC(bytes))==NULL || (sBR->locmax = (double*) MALLOC(bytes))==NULL || (sBR->loccentre = (double*) MALLOC(bytes))==NULL || (sBR->locindex = (int*) MALLOC(sizeof(int) * dim))==NULL || (sBR->trend == NULL && (sBR->trend = (double**) CALLOC(sBR->trendlen, sizeof(double*)))==NULL) ) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } GetDiameter(loc, sBR->locmin, sBR->locmax, sBR->loccentre); assert(pgs->supportmin != NULL); for (d=0; dsupportmin[d] = RF_NEGINF; pgs->supportmax[d] = RF_INF; //printf("support %f %f radius=%f %f \n", sBR->locmax[d], sBR->locmin[d], sBR->radius, step ); //assert(false); // woer kommt sBR->radius // support funktioniert nicht } for (d=0; d<=cov->mpp.moments; d++) { cov->mpp.mM[d] = cov->mpp.mMplus[d] = 1.0; } if ((err = prepareBRoptim(cov, s)) != NOERROR) { //printf("err %d\n", err); goto ErrorHandling; } for (i=0; i<=sBR->maxidx; i++) { cov_model *key = sBR->sub[i]; location_type *keyloc = Loc(key); int keytotal = keyloc->totalpoints; // *lglength = keyloc->length; //bool keygrid = keyloc->grid; assert(keyloc->grid); assert(key->nr == GAUSSPROC); GLOBAL.gauss.loggauss = false; key->simu.expected_number_simu = cov->simu.expected_number_simu; assert(cov->mpp.moments >= 1); if ((err = INIT(key, 1, s)) != NOERROR) goto ErrorHandling; key->simu.active = true; cov->loggiven = true; assert(key->mpp.moments >= 1); cov->mpp.mM[0] = cov->mpp.mMplus[0] = 1.0; cov->mpp.mM[1] = cov->mpp.mMplus[1] = 1.0; if (sBR->trend[i] == NULL && (sBR->trend[i] =(double*) MALLOC(keytotal*sizeof(double)))==NULL){ err = ERRORMEMORYALLOCATION; goto ErrorHandling; } //printf("i=%d\n", i); if ((err = loc_set(keyloc->xgr[0], NULL, NULL, dim, dim, 3, 0, false, true, keyloc->distances, &Loc(sBR->vario))) > NOERROR) goto ErrorHandling; if (sBR->vario->sub[0] != NULL) SetLoc2NewLoc(sBR->vario->sub[0], Loc(sBR->vario)); Variogram(NULL, sBR->vario, sBR->trend[i]); if ((sBR->lowerbounds[i] = (double*) MALLOC(keytotal*sizeof(double))) == NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } assert(keyloc != NULL); key->simu.active = true; } // for i<=maxid2 set_lowerbounds(cov); // assert(false); //printf("keytotal=%d\n", 45); cov->rf = sBR->sub[0]->rf; cov->origrf = false; cov->fieldreturn = HUETCHEN_OWN_GRIDSIZE; pgs->estimated_zhou_c = ISNAN(P0(BR_LAMBDA)); pgs->zhou_c = pgs->estimated_zhou_c ? 0.0 : P0(BR_LAMBDA); pgs->logmean = true; pgs->sq_zhou_c = pgs->sum_zhou_c = 0.0; pgs->n_zhou_c = 0; sBR->next_am_check = GLOBAL.br.deltaAM; return NOERROR; ErrorHandling: BR_DELETE(&(cov->SBR)); return err; } int IdxDistance(int maxind, int zeropos, int *length, int dim) { int d, delta = 0, x = maxind, y = zeropos; for (d=0; dkey!=NULL); BR_storage *sBR = cov->SBR; int d, dim = cov->tsdim; pgs_storage *pgs = cov->Spgs; assert(pgs != NULL); bool changedIdx; double area = 1.0, step = P0(BR_MESHSIZE), invstepdim = intpow(step, -dim); // printf("unif %f\n", UNIFORM_RANDOM); if ((changedIdx = pgs->currentthreshold == RF_NEGINF && sBR->idx != 0)) { sBR->idx = 0; // um zu gewaehrleisten, // dass insbesondere bei mehreren Simulationen wieder von vorne angefangen // wird } else if ((changedIdx = sBR->idx < sBR->maxidx && //pgs->currentthreshold < 0 ! pgs->currentthreshold >= sBR->thresholds[sBR->idx + 1])) { (sBR->idx)++; } assert(sBR->idx <= sBR->maxidx && sBR->maxidx < MAXSUB); cov_model *key = sBR->sub[sBR->idx]; // ! location_type //*loc = Loc(cov), *keyloc = Loc(key); double *lowerbounds = sBR->lowerbounds[sBR->idx], delta = sBR->radii[sBR->idx] + step; if (changedIdx) { if (PL > 5) PRINTF("current level in BRmixed is %d", sBR->idx); cov_model *prev = cov; while (prev->fieldreturn && !prev->origrf) { prev->rf = key->rf; prev = prev->calling; if (prev == NULL) break; } int *cumsum = pgs->own_grid_cumsum, *lglength = keyloc->length; cumsum[0] = 1; for (d=0; down_grid_length[d] = keyloc->xgr[d][XLENGTH]; pgs->own_grid_step[d] = keyloc->xgr[d][XSTEP]; cumsum[d + 1] = cumsum[d] * lglength[d]; } for (d=0; dsuppmin[d] = sBR->locmin[d] - delta; sBR->suppmax[d] = sBR->locmax[d] + delta; area *= sBR->suppmax[d] - sBR->suppmin[d]; } pgs->log_density = - log(area); cov->mpp.maxheights[0] = area; assert(cov->vdim2[0] == 1 && cov->vdim2[1] == 1); // MARCO lambda verstehe ich nicht -- wo/wie taucht lambda // in den einzelnen Huetchen auf? // @MARTIN: s. Zeile 957 } if (PL > 5) PRINTF("idx=%d %d %d zhou_n=%d %d %d\n", sBR->idx, changedIdx, P0INT(BR_OPTIM), pgs->n_zhou_c, sBR->next_am_check, GLOBAL.br.deltaAM); if (P0INT(BR_OPTIM) == 2 && pgs->n_zhou_c >= sBR->next_am_check) { sBR->next_am_check += GLOBAL.br.deltaAM; // assert(false); OptimArea(cov, sBR->idx); set_lowerbounds(cov); } res_type // *res = cov->rf, *lgres = key->rf; // == cov->rf assert(cov->rf == key->rf); assert(keyloc->grid); int i, j, maxind, hatnumber, lgtotalpoints = keyloc->totalpoints, zeropos = sBR->zeropos[sBR->idx], vertnumber = P0INT(BR_VERTNUMBER); double maxval, u[MAXMPPDIM], *trend = sBR->trend[sBR->idx], radius = sBR->radii[sBR->idx]; for (d=0; dsuppmin[d] + UNIFORM_RANDOM*(sBR->suppmax[d] - sBR->suppmin[d]); pgs->supportmin[d] = u[d] - radius; pgs->supportmax[d] = u[d] + radius; pgs->own_grid_start[d] = keyloc->xgr[d][XSTART] + u[d]; } hatnumber=0; while(true) { // printf("while unif %f\n", UNIFORM_RANDOM); DO(key, s); // printf("while unif 2 %f\n", UNIFORM_RANDOM); maxval = RF_NEGINF; maxind = 0; for (i=0; i maxval) { maxval = lgres[i]; maxind = i; } } if (maxind == zeropos) { pgs->sq_zhou_c += invstepdim * invstepdim; pgs->sum_zhou_c += invstepdim; } // printf("maxind = %d %d\n", maxind, lgtotalpoints); //printf("here\n"); if (P0INT(BR_OPTIM) == 2) { int idxdist; double uplusmaxval = maxval - lgres[zeropos] - log(UNIFORM_RANDOM); // for(j=0; jlogvertnumber[j]); printf("uplus=%f\n", uplusmaxval); for (j=0; j sBR->logvertnumber[j]); if (uplusmaxval > sBR->logvertnumber[j]) { // printf("%f %f %d\n", uplusmaxval, sBR->logvertnumber[j], j); // MARCO: ok? Warum wird die Schleife nach 1x abgebrochen? // ('first' braucht es somit eigentlich nicht. idxdist = IdxDistance(maxind, zeropos, keyloc->length, dim); (sBR->countvector[j][idxdist])++; if (false && PL > 5) { int dd; for (dd=0; dd<75; dd++) { int value = sBR->countvector[j][dd]; if (value < 0) BUG; // memory zugriffs-fehler ueber valgrind sichtbar if (value<=9) PRINTF("%d", value); else if (value<=50) { PRINTF(value<=20 ? "A" : value<=30 ? "B" : value<=40 ? "C" : "D" ); } else PRINTF("#"); } PRINTF("j=%d\n", j); // if (maxind == zeropos) { // PRINTF("%d %d %d %d\n", maxind, zeropos, idxdist, j); assert(false); // } } // printf("idxdist=%d %d dist=%d val=%d len=%d %d %f %f %d %d hat=%d\n", maxind, zeropos, // idxdist, sBR->countvector[j][idxdist], // keyloc->length[0], keyloc->length[1], // maxval, lowerbounds[maxind], sBR->idx, pgs->n_zhou_c, hatnumber ); break; } // else assert(maxval <= lowerbounds[maxind]); // nicht korrekt. } } else { assert(UNIFORM_RANDOM > -1.0); // nur umvergleichbarkeit von optim 1 und // optim 2 herzustellen } // printf("while unif 3 %f\n", UNIFORM_RANDOM); assert(false); // assert(maxind != zeropos); if (maxind == zeropos && PL > 5 && false) { PRINTF("zeropos maxval=%f lower=%f hat=%d zhou_n=%d optim=%d\n", maxval, lowerbounds[maxind], hatnumber, pgs->n_zhou_c, P0INT(BR_OPTIM)); //assert(false); } // MARCO, dann es sein, dass die folgende Bedingung erfuellt ist, // aber uplusmaxval > sBR->logvertnumber[j] nicht erfuellt ist? if (maxval > lowerbounds[maxind]) break; hatnumber++; } pgs->n_zhou_c += hatnumber; if (PL >= PL_STRUCTURE && hatnumber > 300) PRINTF("note: large hat number (%d) might indicate numerically suboptimal framework\n", hatnumber); //shifting maximum to origin is not necessary because of stationarity //(conditional on T=t, the "correct" shape function is shifted which yields //the same stationary max-stable process; OK because there is a finite number //of values for t! for (i=0; imin[BR_MESHSIZE] = 0; range->max[BR_MESHSIZE] = RF_INF; range->pmin[BR_MESHSIZE] = 0; range->pmax[BR_MESHSIZE] = RF_INF; range->openmin[BR_MESHSIZE] = true; range->openmax[BR_MESHSIZE] = true; range->min[BR_VERTNUMBER] = 1; range->max[BR_VERTNUMBER] = RF_INF; range->pmin[BR_VERTNUMBER] = 1; range->pmax[BR_VERTNUMBER] = 50; range->openmin[BR_VERTNUMBER] = false; range->openmax[BR_VERTNUMBER] = false; range->min[BR_OPTIM] = 0; range->max[BR_OPTIM] = 2; range->pmin[BR_OPTIM] = 0; range->pmax[BR_OPTIM] = 2; range->openmin[BR_OPTIM] = false; range->openmax[BR_OPTIM] = false; range->min[BR_OPTIMTOL] = 0; range->max[BR_OPTIMTOL] = 1; range->pmin[BR_OPTIMTOL] = 0; range->pmax[BR_OPTIMTOL] = 0.1; range->openmin[BR_OPTIMTOL] = true; range->openmax[BR_OPTIMTOL] = true; range->min[BR_LAMBDA] = 0; range->max[BR_LAMBDA] = RF_INF; range->pmin[BR_LAMBDA] = 0; range->pmax[BR_LAMBDA] = RF_INF; range->openmin[BR_LAMBDA] = true; range->openmax[BR_LAMBDA] = true; range->min[BR_OPTIMAREA] = 0; range->max[BR_OPTIMAREA] = 1; range->pmin[BR_OPTIMAREA] = 0; range->pmax[BR_OPTIMAREA] = 1; range->openmin[BR_OPTIMAREA] = false; range->openmax[BR_OPTIMAREA] = false; range->min[BR_OPTIMMAX] = 1; range->max[BR_OPTIMMAX] = RF_INF; range->pmin[BR_OPTIMMAX] = 1000; range->pmax[BR_OPTIMMAX] = 1000000000; range->openmin[BR_OPTIMMAX] = false; range->openmax[BR_OPTIMMAX] = true; range->min[BR_VARIOBOUND] = 0; range->max[BR_VARIOBOUND] = RF_INF; range->pmin[BR_VARIOBOUND] = 2; range->pmax[BR_VARIOBOUND] = 25; range->openmin[BR_VARIOBOUND] = false; range->openmax[BR_VARIOBOUND] = true; } int structBRuser(cov_model *cov, cov_model **newmodel) { location_type *loc = Loc(cov); cov_model *sub = cov->sub[cov->sub[MPP_SHAPE] != NULL ? MPP_SHAPE: MPP_TCF]; int i, d, err, model_intern, dim = sub->tsdim, newxlen; bool grid; double *newx= NULL, centreloc[MAXMPPDIM], minloc[MAXMPPDIM], maxloc[MAXMPPDIM]; // SERR("Brown Resnick not available in version 3.0.34"); ASSERT_NEWMODEL_NULL; if (cov->role != ROLE_BROWNRESNICK) BUG; assert(isBRuserProcess(cov)); if (loc->Time || (loc->grid && loc->caniso != NULL)) { Transform2NoGrid(cov, false, GRIDEXPAND_AVOID); SetLoc2NewLoc(sub, Loc(cov)); } loc = Loc(cov); grid = loc->grid; model_intern = (cov->nr == BRORIGINAL_USER) ? BRORIGINAL_INTERN : (cov->nr == BRMIXED_USER) ? BRMIXED_INTERN : (cov->nr == BRSHIFTED_USER) ? BRSHIFTED_INTERN : BRORIGINAL_USER; if (cov->key != NULL) COV_DELETE(&(cov->key)); if (cov->stor == NULL) NEW_STORAGE(stor, STORAGE, gen_storage); GetDiameter(loc, minloc, maxloc, centreloc); newxlen = loc->lx; if ((newx = (double*) MALLOC(dim * newxlen * sizeof(double))) == NULL) { GERR("Memory allocation failed.\n"); } if (grid) { for (d=0; dxgr[d][XSTART] - centreloc[d] + (((int) loc->xgr[d][XLENGTH]) % 2 == 0) * loc->xgr[d][XSTEP]/2; newx[3 * d + XSTEP] = loc->xgr[d][XSTEP]; newx[3 * d + XLENGTH] = loc->xgr[d][XLENGTH]; } } else { for (i=0; ilx; i++) for(d=0; dx[i*dim+d] - centreloc[d]; } if ((err = loc_set(newx, NULL, dim, dim, newxlen, false, loc->grid, loc->distances, &(cov->ownloc))) > NOERROR) goto ErrorHandling; SetLoc2NewLoc(sub, cov->ownloc); if ((err=covcpy(&(cov->key), sub)) > NOERROR) goto ErrorHandling; if (cov->sub[MPP_TCF] != NULL) { if ((err = STRUCT(sub, &(cov->key))) > NOERROR) goto ErrorHandling; assert(cov->key->calling == cov); } addModel(&(cov->key), model_intern); kdefault(cov->key, GEV_XI, P0(GEV_XI)); kdefault(cov->key, GEV_MU, P0(GEV_MU)); kdefault(cov->key, GEV_S, P0(GEV_S)); if (cov->nr == BRMIXED_USER) { kdefault(cov->key, BR_MESHSIZE, P0(BR_MESHSIZE)); kdefault(cov->key, BR_VERTNUMBER, P0INT(BR_VERTNUMBER)); kdefault(cov->key, BR_OPTIM, P0INT(BR_OPTIM)); kdefault(cov->key, BR_OPTIMTOL, P0(BR_OPTIMTOL)); kdefault(cov->key, BR_VARIOBOUND, P0(BR_VARIOBOUND)); kdefault(cov->key, BR_OPTIMMAX, P0INT(BR_OPTIMMAX)); kdefault(cov->key, BR_LAMBDA, P0(BR_LAMBDA)); if (!PisNULL(BR_OPTIMAREA)) { if ( cov->nrow[BR_OPTIMAREA] % 2 == 0 || cov->ncol[BR_OPTIMAREA] % 2 == 0 ) { SERR("number of rows and columns of areamat need to be odd") } PARAMALLOC(cov->key, BR_OPTIMAREA, cov->nrow[BR_OPTIMAREA], cov->ncol[BR_OPTIMAREA]); //PMI(cov); PCOPY(cov->key, cov, BR_OPTIMAREA); } } cov->key->calling = cov; if ((err = CHECK(cov->key, dim, dim, PointShapeType, cov->domown, cov->isoown, 1, ROLE_BROWNRESNICK)) == NOERROR) { // printf("Kopie erstellen\n"); if ((err = STRUCT(cov->key, NULL)) <= NOERROR) { err = CHECK(cov->key, dim, dim, PointShapeType, cov->domown, cov->isoown, 1, ROLE_BROWNRESNICK); } } assert(cov->key->calling == cov); ErrorHandling: if (newx != NULL) free(newx); newx = NULL; return err; } // new int structBRintern(cov_model *cov, cov_model **newmodel) { cov_model *sub = cov->sub[cov->sub[MPP_SHAPE] != NULL ? MPP_SHAPE: MPP_TCF]; location_type *loc = Loc(cov); int i, d, j, err, *length, dim = sub->tsdim, totaldim = loc->totalpoints*dim, zeropos = 0, // default, mostly overwritten newxlen = 3; // default (grid) bool grid = loc->grid; double //\00covval, norm, step, mindist, dist; BR_storage *sBR = NULL; //printf("xxxxxxxxxxx\n\n\nxxxxxxxxxxxxxx\n"); ASSERT_NEWMODEL_NULL; if (cov->role != ROLE_BROWNRESNICK) BUG; assert(isPointShape(cov)); if (cov->key != NULL) COV_DELETE(&(cov->key)); if (cov->stor == NULL) NEW_STORAGE(stor, STORAGE, gen_storage); NEW_STORAGE(SBR, BR, BR_storage); sBR = cov->SBR; if (cov->sub[MPP_TCF] != NULL) { if ((err = STRUCT(sub, &(cov->key))) > NOERROR) goto ErrorHandling; cov->key->calling = cov; } else if ((err=covcpy(&(cov->key), sub)) > NOERROR) goto ErrorHandling; if ((err = CHECK(cov->key, dim, dim, NegDefType, cov->domown, SYMMETRIC, 1, ROLE_COV)) != NOERROR) goto ErrorHandling; if ((err = covcpy(&(sBR->submodel), cov->key)) != NOERROR) goto ErrorHandling; if ((err = CHECK(sBR->submodel, 1, 1, NegDefType, XONLY, ISOTROPIC, 1, ROLE_COV)) != NOERROR) goto ErrorHandling; if ((err = newmodel_covcpy(&(sBR->vario), VARIOGRAM_CALL, cov->key))!=NOERROR) goto ErrorHandling; if ((err = alloc_cov(sBR->vario, dim, 1, 1)) != NOERROR) goto ErrorHandling; addModel(&(cov->key), GAUSSPROC, cov); assert(cov->key->ownloc == NULL); if (cov->nr == BRORIGINAL_INTERN) { if (!grid) { zeropos = loc->lx; for (i=0; ilx; i++) { norm = 0.0; for (d=0; dx[i*dim+d]*loc->x[i*dim+d]; } if (norm<1e-8) zeropos = i; } newxlen = loc->lx + (zeropos == loc->lx); if ((sBR->newx = (double*) MALLOC(dim*newxlen*sizeof(double))) == NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } for(d=0; dlx; i++) sBR->newx[i*dim+d] = loc->x[i*dim+d]; if (zeropos == loc->lx) sBR->newx[loc->lx*dim+d] = 0.0; } } } else if (cov->nr == BRMIXED_INTERN) { step = P0(BR_MESHSIZE); mindist = RF_INF; if (grid) { for (d=0; dxgr[d][XSTEP] < mindist) mindist = loc->xgr[d][XSTEP]; } else { int maxtotal = totaldim; if (maxtotal > 1000) { warning("minimal distance is only estimated"); maxtotal = 1000; // to do } for (i=0; ix[i+d] - loc->x[j]); if (dist > 1e-15 && dist < mindist) mindist = dist; } } if (mindist < step) { PRINTF("Warning! meshsize is larger than resolution of simulation! meshsize is automatically decreased to %f.\n", step); P(BR_MESHSIZE)[0] = step = mindist; } if (!PisNULL(BR_OPTIMAREA)) { sBR->minradius = floor(fmax(cov->nrow[BR_OPTIMAREA], cov->ncol[BR_OPTIMAREA])*0.5) * step; } double alpha = -1, yy, C0, gammamin, min_radius, //factor = 0.1, xx=step * 1e-6; COV(ZERO, sBR->submodel, &C0); COV(&xx, sBR->submodel, &yy); alpha = log(C0 - yy) / log(xx); // printf("alpha = %f %e %e\n", alpha, xx, C0-yy); if (alpha > 2.0) alpha = 2.0; gammamin = 4.0 - 1.5 * alpha; INVERSE(&gammamin, sBR->submodel, &min_radius); xx = gammamin + P0(BR_VARIOBOUND); INVERSE(&xx, sBR->submodel, sBR->radii); sBR->radii[0] = ceil(sBR->radii[0] / step) * step; if (sBR->minradius > sBR->radii[0]) sBR->radii[0] = sBR->minradius; sBR->thresholds[0] = RF_INF; newxlen = 3; grid = true; double smallest_grid_lengths = 3.0, //kleinestes Feld, dass simuliert werden // soll, in step Einheiten in 1 koordinaten richtung min_radius_step = floor(min_radius / step), onesided = (double) (smallest_grid_lengths - 1) * 0.5; // printf("onesided %f %f %f\n", onesided, smallest_grid_lengths, min_radius_step); if (onesided < min_radius_step) onesided = min_radius_step; double corrected_minradius = sBR->minradius + GLOBAL.br.corr_factor * (sBR->radii[0] - sBR->minradius); if (onesided * step < corrected_minradius) onesided = floor(corrected_minradius / step); // MARCO: @MARTIN: um sicherzugehen, dass man den durch areamat abgedeckten // Bereich komplett simuliert double min_reduction_factor = 2.0, max_reduction_factor = 3.0, rel_steps = (sBR->radii[0] / step) / onesided, reduction_factor = pow(rel_steps, (double) dim / ((double) MAXSUB -1.0)); if (reduction_factor < min_reduction_factor) reduction_factor = min_reduction_factor; else if (reduction_factor > max_reduction_factor) reduction_factor = max_reduction_factor; sBR->maxidx = (int) ((double) dim * log(rel_steps) / log(reduction_factor)); if (sBR->maxidx < 0) sBR->maxidx = 0; // to do!! else if (sBR->maxidx >= MAXSUB) sBR->maxidx = MAXSUB - 1; // printf("maxidx %d %f r=%f step=%f red=%f %f relste=%f red=%f %f %f\n", sBR->maxidx, smallest_grid_lengths, sBR->radii[0], step, reduction_factor, min_reduction_factor, rel_steps, pow(rel_steps, (double) dim / ((double) MAXSUB - 1.0)), (sBR->radii[0] / step) / smallest_grid_lengths, sBR->radii[0] / step); for (i=1; i<=sBR->maxidx; i++) { // to do gleichmaessige reduktion ist vermutlich nicht optimal // mitte vermutlich groessere Schritte und dafuer kleiner runter // bis zum minimum. // to do optimale groesse fuer reduction_factor z.Zt. in [2,3]?! //printf("i=%d %d %f\n", i, sBR->maxidx, sBR->radii[i-1]); assert(false); sBR->radii[i] = round(sBR->radii[i-1] * pow(2.0, -1.0/dim) / step) * step; // printf("radii %f \n", sBR->radii[i] /step); COV(sBR->radii + i, sBR->submodel, sBR->thresholds + i); } //xassert(false); if ((sBR->newx = (double*) MALLOC(newxlen*dim*sizeof(double))) == NULL) { err = ERRORMEMORYALLOCATION; goto ErrorHandling; } for (i=0; i<=sBR->maxidx; i++) { if ((err = covcpy(sBR->sub + i, cov->key)) != NOERROR) goto ErrorHandling; for (d=0; dnewx[3*d+XSTART] = -sBR->radii[i]; sBR->newx[3*d+XLENGTH] = 2 * ((int) round(sBR->radii[i] / step)) + 1; sBR->newx[3*d+XSTEP] = step; // printf("dim=%d %f %f %f radii=%f step=%f\n", dim, sBR->newx[3*d+XSTART], // sBR->newx[3*d+XLENGTH], sBR->newx[3*d+XSTEP], // sBR->radii[i], step // ); } // assert(false); err = loc_set(sBR->newx, NULL, dim, dim, newxlen, false, grid, false, &(sBR->sub[i]->ownloc)); length = Loc(sBR->sub[i])->length; for (zeropos = 0, d = dim; d > 0; d--) zeropos = zeropos * length[d-1] + (int) ceil(length[d-1] * 0.5) - 1; sBR->zeropos[i] = zeropos; //printf("i=%d\n", i);assert(false); if ((err = CHECK(sBR->sub[i], dim, dim, ProcessType, cov->domown, cov->isoown, 1, ROLE_GAUSS)) == NOERROR) { if ((err = STRUCT(sBR->sub[i], NULL)) <= NOERROR) { err = CHECK(sBR->sub[i], dim, dim, ProcessType, cov->domown, cov->isoown, 1, ROLE_GAUSS); } } if (err > NOERROR) goto ErrorHandling; assert(sBR->sub[i]->calling == cov); } goto ErrorHandling; // ueberspringe immer den shifted & original teil ! } else { // END BRMIXED; START SHIFTED assert(cov->nr == BRSHIFTED_INTERN); } if (sBR->newx == NULL) { if ((err = loc_set(grid ? * loc->xgr : loc->x, NULL, dim, dim, grid ? 3 : loc->totalpoints, false, grid, loc->distances, &(cov->key->ownloc))) != NOERROR) goto ErrorHandling; } else { if ((err = loc_set(sBR->newx, NULL, dim, dim, newxlen, false, grid, false, &(cov->key->ownloc))) != NOERROR) goto ErrorHandling; } // ONLY SHIFTED AND ORIGINAL if (grid) { length = Loc(cov->key)->length; for (d=dim; d>0; d--) zeropos = zeropos*length[d-1] + (int) ceil(length[d-1] * 0.5) - 1; } sBR->zeropos[0] = zeropos; if ((err = CHECK(cov->key, dim, dim, ProcessType, cov->domown, cov->isoown, 1, ROLE_GAUSS)) == NOERROR) { if ((err = STRUCT(cov->key, NULL)) <= NOERROR) { err = CHECK(cov->key, dim, dim, ProcessType, cov->domown, cov->isoown, 1, ROLE_GAUSS); } } if (err > NOERROR) goto ErrorHandling; assert(cov->key->calling == cov); ErrorHandling: if (err != NOERROR) BR_DELETE(&(cov->SBR)); return err; } int structBrownResnick(cov_model *cov, cov_model **newmodel) { int d, err, meth, role, dim = cov->tsdim; double maxcov, minloc[MAXMPPDIM], maxloc[MAXMPPDIM], centreloc[MAXMPPDIM], maxdist[MAXMPPDIM]; cov_model *next = cov->sub[0]; location_type *loc = Loc(cov); if (cov->role != ROLE_BROWNRESNICK) BUG; if (loc->Time || (loc->grid && loc->caniso != NULL)) { Transform2NoGrid(cov, false, GRIDEXPAND_AVOID); SetLoc2NewLoc(next, Loc(cov)); } loc = Loc(cov); if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if (cov->key != NULL) COV_DELETE(&(cov->key)); if (cov->role == ROLE_SMITH) { if (!cov->logspeed) SERR2("'%s' requires a variogram model as submodel that tends to infinity with rate of at least 4log(h) for being compatible with '%s'", NICK(cov), CovList[SMITHPROC].nick); cov_model *calling = cov->calling; double newscale, factor = INVSQRTTWO; ASSERT_NEWMODEL_NULL; if (next->full_derivs < 0) SERR("given submodel does not make sense"); while (isDollar(next)) { addModel(&(cov->key), DOLLAR); newscale = 1.0; if (!PARAMisNULL(next, DSCALE) ) newscale *= PARAM0(next, DSCALE); if (!PARAMisNULL(next, DVAR) ) newscale /= sqrt(PARAM0(next, DVAR)); if (factor != 1.0) { newscale *= factor; factor = 1.0; } // print("here3\n"); return ERRORNOTPROGRAMMEDYET; kdefault(calling, DSCALE, newscale); next = next->sub[0]; // ok // print("here4\n"); } if (cov->sub[MPP_TCF] != NULL) { // print("here4\n"); return ERRORNOTPROGRAMMEDYET; } // PMI(atom->sub[ATOMSHAPE]); PMI(*shape); assert(false); // print("here5\n"); if (next->nr == BROWNIAN && PARAM0(next, BROWN_ALPHA) == 2.0) { addModel(&(cov->key), GAUSS); // ?? if (factor != 1.0) { addModel(&(cov->key), DOLLAR); kdefault(cov->key, DSCALE, factor); // (newmod->calling = atom; } } else { //COV_DELETE(atom->sub + ATOMSHAPE); SERR("Smith process with BrownResnick tcf only possible for fractal Brownian motion with alpha=2"); } } else if (cov->role == ROLE_BROWNRESNICK) { if (next->role == ROLE_BROWNRESNICK) { SERR1("submodel of '%s' must be a covariance model or tcf", NICK(cov)); } else { role = isNegDef(next) ? ROLE_COV : ROLE_UNDEFINED; ASSERT_ROLE_DEFINED(next); // PMI(next); if (((err = covcpy(&(cov->key), next)) != NOERROR) || ((err = CHECK(cov->key, dim, dim, NegDefType, XONLY, SYMMETRIC, 1, role)) != NOERROR)) { // XERR(err); printf("xx"); //assert(false); return err; } GetDiameter(loc, minloc, maxloc, centreloc); for (d=0; dkey); // PMI(K); if ((err = newmodel_covcpy(&K, VARIOGRAM_CALL, cov->key, maxdist, NULL, NULL, dim, dim, 1, 0, false, false, false)) != NOERROR) return err; if ((err = alloc_cov(K, dim, 1, 1)) != NOERROR) return err; if (K->sub[0] != NULL) SetLoc2NewLoc(K->sub[0], Loc(K)); // PMI() Variogram(NULL, K, &maxcov); COV_DELETE(&K); //printf("maxcov: %f\n", maxcov); if (isPosDef(next) || maxcov <= 4.0) { meth = BRORIGINAL_USER; } else if (!next->logspeed || next->logspeed <= 4.0 || maxcov <= 10.0) { meth = BRSHIFTED_USER; } else { meth = BRMIXED_USER; } addModel(&(cov->key), meth, cov); cov_model *key = cov->key; key->prevloc = loc; kdefault(key, GEV_XI, P0(GEV_XI)); kdefault(key, GEV_MU, P0(GEV_MU)); kdefault(key, GEV_S, P0(GEV_S)); if ((err = CHECK(key, dim, dim, BrMethodType, cov->domown, cov->isoown, 1, ROLE_BROWNRESNICK)) == NOERROR) { if ((err = STRUCT(key, NULL)) <= NOERROR) { err = CHECK(key, dim, dim, BrMethodType, cov->domown, cov->isoown, 1, ROLE_BROWNRESNICK); } } if (err > NOERROR) return(err); } } else { ILLEGAL_ROLE; } // need check to be called? // PMI(atom); assert(false); return NOERROR; } int initBrownResnick (cov_model *cov, gen_storage *S) { cov_model *sub = cov->key != NULL ? cov->key : cov->sub[cov->sub[MPP_SHAPE] != NULL ? MPP_SHAPE: MPP_TCF]; int err; assert(cov->nr == BROWNRESNICKPROC); if (cov->role == ROLE_BROWNRESNICK) { if (cov->key != NULL) { sub->simu.active = true; sub->simu.expected_number_simu = cov->simu.expected_number_simu; if ((err = INIT(sub, 0, S)) != NOERROR) return err; cov->fieldreturn = true; cov->origrf = false; cov->rf = sub->rf; } } else ILLEGAL_ROLE; return NOERROR; } void doBrownResnick(cov_model *cov, gen_storage *s) { assert(!cov->origrf); assert(cov->key != NULL); cov_model *key = cov->key; PL++; DO(key, s); // nicht gatternr PL--; } int initBRuser (cov_model *cov, gen_storage *S) { location_type *loc = Loc(cov); cov_model *sub = cov->key != NULL ? cov->key : cov->sub[cov->sub[MPP_SHAPE] != NULL ? MPP_SHAPE: MPP_TCF]; int err, maxpoints = GLOBAL.extreme.maxpoints; assert(isBRuserProcess(cov)); if (cov->role == ROLE_BROWNRESNICK) { if (loc->distances) return ERRORFAILED; if (cov->key != NULL) { sub->simu.active = true; double ens = ((double) cov->simu.expected_number_simu) * maxpoints; sub->simu.expected_number_simu = (int) MIN(ens, (double) MAXINT); if ((err = INIT(sub, 1, S)) != NOERROR) return err; FieldReturn(cov); } return NOERROR; } else ILLEGAL_ROLE; } RandomFields/src/Huetchen.cc0000644000175100001440000013547012412655466015525 0ustar hornikusers /* Authors Martin Schlather, schlather@math.uni-mannheim.de simulation of max-stable random fields Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "RF.h" #include "Covariance.h" #define POISSON_INTENSITY 0 #define RANDOMCOIN_INTENSITY (COMMON_GAUSS + 1) #define PGS_VOXEL 0 #define PGS_CORNER 1 #define PGS_SIDES PGS_CORNER + 1 #define PGS_2D_SIDE1 PGS_SIDES #define PGS_2D_SIDE2 PGS_SIDES + 1 #define PGS_3D_SIDE1 PGS_SIDES #define PGS_3D_SIDE2 PGS_SIDES + 1 #define PGS_3D_SIDE3 PGS_SIDES + 2 #define PGS_3D_EDGE1 PGS_SIDES + 3 #define PGS_3D_EDGE2 PGS_SIDES + 4 #define PGS_3D_EDGE3 PGS_SIDES + 5 int addUnifModel(cov_model *cov, double radius, cov_model **newmodel) { addModel(newmodel, UNIF, cov); kdefault(*newmodel, UNIF_MIN, -radius); kdefault(*newmodel, UNIF_MAX, radius); return NOERROR; } void pts_given_shape(double *x, cov_model *cov, double *v) { cov_model *shape = cov->sub[PGS_FCT]; NONSTATCOV(x, cov->q, shape, v); //printf("x = %f %f %v\n", *x, cov->q[0], *v); } void logpts_given_shape(double *x, cov_model *cov, double *v, double *sign) { cov_model *shape = cov->sub[PGS_FCT]; LOGNONSTATCOV(x, cov->q, shape, v, sign); // printf("x = %f %f log=%f\n", *x, cov->q[0], *v, *sign); } int check_pts_given_shape(cov_model *cov) { cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; location_type *loc = Loc(cov); int err, role, dim = cov->tsdim; if (loc->Time) SERR("Time component not allowed yet"); // todo kdefault(cov, PGS_RATIO, GLOBAL.extreme.density_ratio); kdefault(cov, PGS_FLAT, GLOBAL.extreme.flat); kdefault(cov, PGS_INFTY_SMALL, !PINT(PGS_FLAT)); kdefault(cov, PGS_NORMED, true); kdefault(cov, PGS_ISOTROPIC, true); //PMI(cov, "checking"); if ((err = checkkappas(cov)) != NOERROR) return err; if (cov->q == NULL) { // zwingend CALLOC ! if ((cov->q = (double*) CALLOC(sizeof(double), dim)) == NULL) return ERRORMEMORYALLOCATION; cov->qlen = dim; } if (cov->xdimprev != cov->xdimown || cov->xdimprev != cov->tsdim) return ERRORDIM; if (cov->role == ROLE_GAUSS) { role = isShape(shape) ? cov->role //Marco, 29.5.13 : isGaussProcess(shape) ? ROLE_GAUSS : shape->nr == BINARYPROC ? ROLE_GAUSS : ROLE_UNDEFINED; ASSERT_ROLE_DEFINED(shape); } else if (hasPoissonRole(cov)) { role = ROLE_POISSON; } else if (hasMaxStableRole(cov)) { role = ROLE_MAXSTABLE; } else ILLEGAL_ROLE; // printf("here %d\n"); // isotropy is the property -- user should not define unisotropic functions! // so !isotropic only for special, internal definitions, e.g. // strokorbPoly // int err2 = NOERROR; // if (P0INT(PGS_ISOTROPIC)) // err2 = CHECK(shape, dim, dim, ShapeType, XONLY, ISOTROPIC, // SCALAR, role); // printf("here2\n"); // PMI(shape); // but it must be treated in any case as if it was non-isotropic if ((err = CHECK(shape, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, role)) != NOERROR) { if (P0INT(PGS_ISOTROPIC)) BUG; XERR(err); return err; } // if (err2 != NOERROR) SERR("isotropic shape function expected."); setbackward(cov, shape); //if (!shape->deterministic) return ERRORNOTPROGRAMMED; // Dichte muss nicht normiert sein und stattdessen durch das mittlere Volumen dividiert werden. if (pts != NULL) { //printf("pts %s %s\n", CovList[pts->nr + 1].nick, CovList[pts->nr + 1].name); //PMI(pts); // assert(dim == 2); print("x"); // printf("dim=%d\n", dim); // APMI(pts); if ((err = CHECK_R(pts, dim)) != NOERROR) return err; } // printf("done\n"); return NOERROR; } int struct_pts_given_shape(cov_model *cov, cov_model **newmodel){ cov_model *shape = cov->sub[PGS_FCT]; // location_type *loc = Loc(cov); int err = NOERROR; ASSERT_NEWMODEL_NULL; if (cov->Spgs != NULL) PGS_DELETE(&(cov->Spgs)); if (shape->role != ROLE_POISSON && shape->role != ROLE_MAXSTABLE) ILLEGAL_ROLE; if (cov->sub[PGS_LOC] == NULL) { // COV_DELETE(cov->sub + PGS_LOC); // assert(cov->sub[PGS_LOC] == NULL); if ((err = STRUCT(shape, cov->sub + PGS_LOC)) != NOERROR) return err; if (cov->sub[PGS_LOC] == NULL) SERR1("no intensity found for '%s'", NICK(shape)); assert(cov->sub[PGS_LOC]->calling != NULL); // printf("here %s\n", NICK(cov->sub[PGS_LOC])); //if ((err = CHECK_R(cov->sub[PGS_LOC], cov->tsdim)) != NOERROR) return err; } return NOERROR; } int calculate_mass_gauss(cov_model *cov) { /* erste Idee bei Gitter --- diese ist aber viel zu kompliziert, insbesondere beim Auswerten der Dichtefunktion bei der Simulation: jeweils von der Seite wird mit konstanter, groesserer Schrittweite (newstep) ins zentrum gegangen. Das Verfahren waere schoen wenn nicht in der mitte etwas Chaos gegeben wuerde, sofern die Schrittweite nicht aufgeht (!addingup[d]): (a) die Massen um die Punkte am naechsten zum Zentrum ueberlappen sich sehr (oldmass > reference) dann weiss nicht so richtig was ich tun soll; hier wird einfach alles so gelassen wie es ist (b) die Massen ueberlappen sich nicht genug. Dann werden zusaetzliche Punkte aufgenommen (und zwar fuer alle 2^d bzw. 2^d -1 Moeglichkeiten einzeln, ob die Punkte dem Zentrum am naechsten in einer Richtung sind (fixed[d]=true) oder nicht. Zweite Idee (ab V.2.1.31): die Dichten werden auf einem "beliebigen" Gitter (pgs->xgr) definiert. Dies vereinfacht die Berechnung der Dichten. Ob dieses Gitter auf den zu simulierenden Punkten liegen muss oder nicht sei dahingestellt (auch wenn Felix' Resultate zeigen, dass dies aus theoretischen Gruenden so sein muss). Was letztendlich die kleinste reale Rechenzeit verursacht ist nicht klar. Auch sind die Gewichte voellig unklar. Insbesondere wo/wieviele Nullen auftreten und die Schwere der Randeffekte bei ueberall konstantem Gewicht. Um hier den ersten Algorithmus einfach zu halten werden konstante Gewichte genommen und (dafuer das Gebiet eher etwas groesser gemacht) TODO! */ pgs_storage *pgs = cov->Spgs; location_type *loc = Loc(cov); cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; double zx, zy, **xgr = pgs->xgr, // out *v = pgs->v, // dummy *x = pgs->x, // dummy *y = pgs->y; // dummy int d, dim = cov->tsdim; if (loc->grid) { // int size = pgs->size; COV(ZERO, shape, v); v[0] *= intpow(0.5, dim); NONSTATINVERSE_D(v, shape, x, y); if (ISNAN(x[0]) || x[0] > y[0]) SERR1("inverse function of '%s' unknown", NICK(shape)); // is the underlying point distribution uniform? Then // no safety division by sqrt(dim) seems to be necessary // todo // unif might be modified by $. So a check on the equality // of three values is done VTLG_D(ZERO, pts, v); VTLG_D(x, pts, &zx); VTLG_D(y, pts, &zy); //printf("> x=%f %f; %f %f %f\n", x[0], x[1], zx, zy, v[0]); for (d=0; d 0); } if (zx != v[0] || zy != v[0] || true) { for (d=0; d 1 pgs->totalmass = 1; for (d=0; dxgr[d][XLENGTH] > 1) { double range = loc->xgr[d][XSTEP] * (loc->xgr[d][XLENGTH] - 1.0); xgr[d][XLENGTH] = ceil(range / y[d] + 1.0); if (xgr[d][XLENGTH] >= loc->xgr[d][XLENGTH]) { BUG; memcpy(xgr[d], loc->xgr[d], 3 * sizeof(double)); } else { xgr[d][XSTART] = loc->xgr[d][XSTART] - 0.5 *((xgr[d][XLENGTH] - 1.0) * y[d] - range); xgr[d][XSTEP] = y[d]; } pgs->totalmass *= xgr[d][XLENGTH]; // printf("%d %f %f %f \n", d,xgr[d][XSTART], xgr[d][XSTEP], xgr[d][XLENGTH] ); assert(xgr[d][XSTEP] >= 0); } else { int i; assert(XSTART == 0 && XLENGTH == 2); for (i=XSTART; XLENGTH; i++) xgr[d][i] = loc->xgr[d][i]; } } //for (d=0; d<=1; d++) // printf("%d %f %f %f \n", d,xgr[d][XSTART], xgr[d][XSTEP], xgr[d][XLENGTH] ); assert(false); } else { // not grid pgs->totalmass = loc->totalpoints; } // PMI(cov, "ccccc"); // assert(false); return NOERROR; } int calculate_mass_maxstable(cov_model *cov) { pgs_storage *pgs = cov->Spgs; location_type *loc = Loc(cov); cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; double voxels, value_orig, *single = pgs->single, // out *total = pgs->total, // out *halfstepvector = pgs->halfstepvector, //out *x = pgs->x; // bool flat = false; int d, dim = cov->tsdim, flat =P0INT(PGS_FLAT); if (shape->role == ROLE_POISSON) { BUG; // to do : felix's paper; derzeit einfach wie max-stable // if (pts->nr != SERR("currently, only simple domain fields are allowed that are based on Poisson processes"); } // else { assert(dim <= MAXSIMUDIM); VTLG_D(ZERO, pts, &value_orig); // PMI(cov, "calculate max"); // printf("%s %d %d %f\n",NICK(cov), PGS_FLAT, P0INT(PGS_FLAT), value_orig );// APMI(cov); assert(false); // VOXEL for (d=0; dxgr[d][XSTEP]; if (flat == FLAT_UNDETERMINED) { // flat == im Kerngebiet wird konstant simuliert; ausserhalb dann // abfallend if (loc->grid) { double v; VTLG_D(halfstepvector, pts, &v); double threshold = value_orig == RF_INF//&& cov->p[PGS_RATIO][0] == 0.0 ? RF_INF : value_orig * P0(PGS_RATIO); pgs->flat = threshold < v && cov->deterministic; // sicherheitshalber //printf("thres %f %f %f\n", threshold, v, value_orig); } else { // not grid BUG; // long term project: to do pgs->flat = true; /* Bei letzterem und nicht Gitter wird dann wird eine maximale Kaestchengroesse bestimmt so dass gerade noch beruehrt wird und der Rest ausserhalb aller Kaestchen auf einen konstanten wert gesetzt, etwas niedriger als der hoechste Grenzwert. Was "hoch" bedeutet ist hier unklar. */ } } else pgs->flat = flat; if (pgs->flat) { if (P0INT(PGS_INFTY_SMALL)) { //PMI(cov); SERR2("'%s' and '%s' may not be positive at the same time", KNAME(PGS_FLAT), KNAME(PGS_INFTY_SMALL)); } single[PGS_VOXEL] = value_orig; for (d=0; dxgr[d][XLENGTH] - 1.0; total[PGS_VOXEL] = single[PGS_VOXEL] * voxels; // CORNER for (d=0; d= 2) { for (d=0; dflat) for (i=0; iflat) single[PGS_SIDES + d] *= loc->xgr[i][XSTEP]; nr *= loc->xgr[i][XLENGTH] - 1.0; } } // //PMI(cov); // printf(" single d=%d %d x=(%f %f %f) val=%f %d\n", d, PGS_SIDES + d, // x[0], x[1], x[2], single[PGS_SIDES + d], nr); assert(false); total[PGS_SIDES + d] = total[PGS_SIDES + d - 1] + nr * single[PGS_SIDES + d]; } if (dim == 3) { // Kanten for (d=0; dflat ? 0.0 : halfstepvector[d]; VTLG_P2SIDED(NULL, x, pts, single + PGS_SIDES + dim + d); if (pgs->flat) single[PGS_SIDES + dim + d] *= loc->xgr[d][XSTEP]; nr *= loc->xgr[d][XLENGTH] - 1.0; // printf(" single d=%d %d x=(%f %f %f) val=%f %d\n", d, PGS_SIDES + dim + d, x[0], x[1], x[2], single[PGS_SIDES + dim + d], nr); //assert(false); total[PGS_SIDES + dim + d] = total[PGS_SIDES + dim + d - 1] + nr * single[PGS_SIDES + dim + d]; } } else if (dim > 3) BUG; } // APMI(cov); pgs->totalmass = total[pgs->size - 1]; if (!R_FINITE(pgs->totalmass)) { // int i; for (i=0; isize; i++) printf("i=%d total=%f\n", i, total[i]); SERR("the total intensity mass is not finite"); } return NOERROR; } cov_model *prunecov(cov_model *newmodel, cov_model *cov) { //printf("names= %s %s\n", NICK(newmodel->calling), NICK(cov->calling)); cov_model **sub = NULL, *next = NULL, *calling = cov->calling; if (calling == newmodel->calling) { return newmodel; } if (calling == NULL) BUG; prunecov(newmodel, calling); if (calling->key == cov) sub = &(newmodel->key); else if (calling->sub[0] == cov) sub = newmodel->sub + 0; else if (calling->sub[1] == cov) sub = newmodel->sub + 1; else BUG; next = *sub; *sub = NULL; COV_DELETE(&newmodel); return next; } int complete_copy(cov_model **newmodel, cov_model *cov) { cov_model *prev = NULL, *start = cov; int err; while (start->calling != NULL) start = start->calling; if (start->typus != InterfaceType) BUG; // nur zur Sicherheit, derzeit; kann erweitert werden if (start == cov) BUG; prev = start->key != NULL ? start->key : start->sub[0]; if (prev->typus != ProcessType) BUG; if ((err = covcpy(newmodel, prev)) != NOERROR) return err; (*newmodel)->calling = cov; int role = prev->role ;// role_of_process(prev->nr); if ((err = CHECK(*newmodel, prev->tsdim, prev->xdimprev, prev->typus, prev->domprev, prev->isoprev, prev->vdim2, role)) != NOERROR) return err; if ((err = STRUCT(*newmodel, NULL)) != NOERROR) { return err; } if (!(*newmodel)->initialised) { if ((err = CHECK(*newmodel, prev->tsdim, prev->xdimprev, prev->typus, prev->domprev, prev->isoprev, prev->vdim2, role)) != NOERROR) return err; NEW_COV_STORAGE(*newmodel, stor, STORAGE, gen_storage); //APMI(*newmodel); if ((err = INIT(*newmodel, 0, cov->stor)) != NOERROR) { //APMI(cov); // !!! ?? hier weitermachen return err; } } ///APMI(cov); (*newmodel)->calling = start; *newmodel = prunecov(*newmodel, cov); (*newmodel)->calling = NULL; return NOERROR; } int init_pts_given_shape(cov_model *cov, gen_storage *S) { cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; cov_fct *Cshape = CovList + shape->nr; location_type *loc = Loc(cov); int d, i, err = NOERROR, dim = shape->xdimprev; pgs_storage *pgs = cov->Spgs; bool grid = Loc(cov)->grid, pgsnull = pgs == NULL; //PMI(cov); assert(cov->sub[PGS_LOC] != NULL); assert(dim == cov->sub[PGS_LOC]->xdimprev); assert(dim == Loc(cov)->timespacedim); if (Cshape->inverse == ErrCov) // && Cshape->nonstat_inverse == ErrCovNonstat) SERR1("support of the model is unknown. Use '%s' to determine the support", CovList[TRUNCSUPPORT].nick); if (pgsnull) { if ((err = alloc_pgs(cov)) != NOERROR) return err; pgs = cov->Spgs; if ((pgs->v = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->y = (double*) CALLOC(dim, sizeof(double))) == NULL ) return ERRORMEMORYALLOCATION; pgs->zhou_c = 1.0; pgs->sum_zhou_c = pgs->sq_zhou_c = 0.0; pgs->n_zhou_c = 0; } // PMI(cov, "hi"); assert(pts == cov->sub[PGS_LOC]); // selbst wenn zufaelliger Shape: 1x laufen lassen, ob // Fehler auftauchen. Unter "Do" lassen sie sich nicht mehr // schoen abfangen. // printf("A moments=%d\n", cov->mpp.moments); // APMI(cov); if ((err = INIT(shape, cov->mpp.moments, S)) != NOERROR) return err; //gatter? // APMI(shape); assert(cov->mpp.moments >= 1); assert(shape->mpp.moments >= 1); // printf("AB moments=%d\n", cov->mpp.moments); //APMI(pts->calling); if ((err = INIT(pts, 0, S)) != NOERROR) { // , 0, S statt ,1,S return err; } // printf("AC moments=%d\n", cov->mpp.moments); if (!grid) { // todo SERR("non-grid not programmed yet"); // meiste da; fehlt noch // welche Vektoren ich wirklich brauche } pgs->size = grid ? intpow(2, dim) : loc->totalpoints; if (cov->role == ROLE_POISSON_GAUSS) { if (pgsnull && ( (pgs->xgr[0] = (double*) CALLOC(dim * 3, sizeof(double))) == NULL || (pgs->pos = (int *) CALLOC(dim, sizeof(int))) ==NULL || (pgs->min = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->max = (int*) CALLOC(dim, sizeof(int))) == NULL )) return ERRORMEMORYALLOCATION; for (i=3, d=1; dxgr[d] = pgs->xgr[0] + i; // printf("%d\n", pgs->xgr[1] - pgs->xgr[0]); assert(false); if ((err = calculate_mass_gauss(cov)) != NOERROR) return err; } else if (hasMaxStableRole(cov)) { if (pgsnull && ( (pgs->single = (double*) CALLOC(pgs->size, sizeof(double)))==NULL || (pgs->total = (double*) CALLOC(pgs->size, sizeof(double))) ==NULL || (pgs->halfstepvector = (double*) CALLOC(dim, sizeof(double)))==NULL )) return ERRORMEMORYALLOCATION; // APMI(cov); assert(!cov->deterministic || P0INT(PGS_NORMED)); // printf("init %f zhou=%f\n", pgs->totalmass, cov->mpp.zhou_c); if (P0INT(PGS_NORMED)) { if (R_FINITE(pts->mpp.unnormedmass)) { // APMI(pts); // TO DO !! Richtig nur falls Huetchen derministisch ist !!! cov->mpp.maxheights[0] = pts->mpp.unnormedmass / shape->mpp.mMplus[1]; // korrekt, da pts * mass >= shape !! //APMI(cov); // } else { //PMI(pts->calling); // // BUG; // not programmed yet // to do: funktioniert nur bei ausgewaehlten funktionen. Z.B. Gauss cov->mpp.maxheights[0] = shape->mpp.maxheights[0] * pts->mpp.maxheights[0]; // APMI(cov); } } else { if (R_FINITE(pts->mpp.maxheights[0])) { // eigentlich ein 1.0 / pts->mpp.minheight cov->mpp.maxheights[0] = pts->mpp.maxheights[0] * shape->mpp.maxheights[0]; } else { BUG; } } // f_raw,rectangular must be always >= the shape function. // this is the fundamental condition if (!R_FINITE(cov->mpp.maxheights[0])) BUG; if ((cov->deterministic = shape->deterministic)) { if ((err = calculate_mass_maxstable(cov)) != NOERROR) return err; pgs->zhou_c = pgs->totalmass / shape->mpp.mMplus[1]; // printf("%f %f %f\n", pgs->zhou_c, pgs->totalmass, shape->mpp.mMplus[1]);assert(false); } else { // currently both cases are identical ... pgs->zhou_c = RF_NA; if (pgs->cov == NULL) { cov_model *start=cov->calling; if (start == NULL) BUG; // APMI(start); while (start->calling != NULL && start->nr != PTS_GIVEN_SHAPE) start = start->calling; if (start->nr != PTS_GIVEN_SHAPE) { if ((err = complete_copy(&(pgs->cov), cov)) != NOERROR) return err; pgs->cov->calling = cov->calling; pgs->cov->Spgs->cov = cov; //PMI(cov); APMI(pgs->cov); } } pgs->old_zhou = 0.0; } pgs->estimated_zhou_c = !cov->deterministic; // PMI(cov); assert(!pgs->estimated_zhou_c); } else { // APMI(cov); BUG; } if (CovList[shape->nr].nonstat_inverse == ErrInverseNonstat) { if (pts->nr != RECTANGULAR) { // PMI(pts); // APMI(shape); warning("Inverse of shape function cannot be determined. Simulation speed might be heavily decreased."); } } for (i=0; i<=cov->mpp.moments; i++) { // printf("%d %f %f %d\n", i, pts->mpp.mM[i], shape->mpp.mMplus[i], cov->mpp.moments); //assert(pts->mpp.mMplus[0] == 1.0); cov->mpp.mM[i] = shape->mpp.mM[i] * pts->mpp.mMplus[0]; cov->mpp.mMplus[i] = shape->mpp.mMplus[i] * pts->mpp.mMplus[0]; } cov->rf = shape->rf; cov->origrf = false; // APMI(cov); return err; } int DrawCathegory(int size, double *single, double *total, bool calculate_elements, int *elmts) { int i; double mass; mass = UNIFORM_RANDOM * total[size - 1]; if (calculate_elements) { //printf("mass=%f\n", mass); for (i = 0; mass > total[i]; i++); if (i > 0) mass -= total[i-1]; *elmts = floor(mass / single[i]); //printf("draw: i=%d tot=%f mass=%f sing=%f elm=%d\n", i, total[i], mass, single[i], *elmts); return i; } else { // falls nicht calculate_elements, so sind letztere unwichtig, // d.h. zu single wird nur der Faktor 1.0 multipliziert. // dies ist aber der Fall nur falls !grid return CeilIndex(mass, total, size); } } static double gauss_eps = 1e-10; void do_pgs_gauss(cov_model *cov, gen_storage *S) { pgs_storage *pgs = cov->Spgs; cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; location_type *loc = Loc(cov); // window_info *w = &(S->window); long i; int d, *min = pgs->min, // dummy *max = pgs->max, // dummy *pos = pgs->pos, // dummy dim = shape->xdimprev; double value, total = 0.0, *x = pgs->x, // dummy or (future) static local *y = pgs->y, // dummy or (future) static local // *supportmin = pgs->supportmin, // *supportmax = pgs->supportmax, // *pgstotal = pgs->total, // in //*single = pgs->single, // in **xgr = pgs->xgr, // in *v = pgs->v; bool grid = Loc(cov)->grid; if (!cov->deterministic) { DO(shape, S); DORANDOM(pts, cov->q); // cov->q nur dummy. Wird ueberschrieben if (cov->role == ROLE_POISSON_GAUSS || !grid) { if (calculate_mass_gauss(cov) != NOERROR) error("unexpected error in 'do_pts_given_shape' (maxstable)"); } else BUG; } // printf("name = %s\n", CovList[pts->nr].name); // APMI(pts); VTLG_R(NULL, pts, v); i = UNIFORM_RANDOM * pgs->totalmass; // to determine the points that contribute to the value of the // random field by the shape function centered at cov->q //printf("cat=%d el=%d\n", i, elmts); if (loc->grid) { NONSTATINVERSE_D(&gauss_eps, pts, x, y); if (ISNAN(x[0]) || x[0] > y[0]) BUG; // printf("extremes %f %f %f\n", eps, x[0], y[0]); for (d=0; dq[d] = xgr[d][XSTART] + xgr[d][XSTEP] * which + v[d]; // to determine the points that contribute to the value of the // density function at cov->q min[d] = ceil((cov->q[d] - y[d] - xgr[d][XSTART]) / xgr[d][XSTEP]); max[d] = (cov->q[d] - x[d] - xgr[d][XSTART]) / xgr[d][XSTEP]; // printf("%d %d delat=%f %f y=%f %f step=%f\n", min[d], max[d], // cov->q[d] - y[d] - xgr[d][XSTART], // cov->q[d] - x[d] - xgr[d][XSTART], // y[d], x[d], xgr[d][XSTEP]); // PMI(cov); assert(xgr[d][XSTEP] > 0); if (min[d] < 0) min[d] = 0; if (max[d] >= xgr[d][XLENGTH]) max[d] = xgr[d][XLENGTH] -1; if (min[d] > max[d]) { // no point contributed to cov->q -- this might be possible if // the simulating grid goes beyond the actual grid and //printf("redo d=%d x=%f y=%f q=%f i=%d d=%d range=%d %d\n", // d, x[d], y[d], cov->q[d], i, d, min[d], max[d]); do_pgs_gauss(cov, S); pgs->log_density = RF_INF; return; } // else printf("ok q=%f i=%d\n", cov->q[d], i, d, min[d], max[d]); pos[d] = min[d]; y[d] = x[d] = cov->q[d] - (xgr[d][XSTART] + pos[d] * xgr[d][XSTEP]); } while (true) { VTLG_D(y, pts, &value); total += value; //printf("y=%f v=%f q=%f val=%f tot=%f min=%d max=%d pos=%d xgr.len=%d\n", // y[0], v[0], cov->q[0], value, total, min[0], max[0], pos[0], //(int) loc->xgr[0][XLENGTH]); d = 0; while(d < dim && pos[d] == max[d]) { pos[d] = min[d]; y[d] = x[d]; d++; } if (d >= dim) break; pos[d] ++; y[d] -= xgr[d][XSTEP]; // !! nicht '+' !! } } else { // not grid if (loc->timespacedim != dim) BUG; double *xx = loc->x + dim * i; for (d=0; dq[d] = v[d] + xx[d]; // todo : mit Unterteilung des Feldes viel schneller xx = loc->x; long endfor = loc->totalpoints; for (i=0; iq[d] - xx[d]; VTLG_D(y, pts, &value); total += value; } } pgs->log_density = log(total / pgs->totalmass); //printf("total=%f %f grid=%d dim=%d\n", total, pgs->totalmass,loc->grid,dim); assert(R_FINITE(pgs->log_density)); // assert(false); } #define SET_COV \ pgs = cov->Spgs; \ shape = cov->sub[PGS_FCT]; \ pts = cov->sub[PGS_LOC]; \ loc = Loc(cov); \ single = pgs->single; \ total = pgs->total; \ halfstepvector = pgs->halfstepvector; \ x = pgs->x; \ v = pgs->v; \ dim = shape->xdimprev; \ flat = pgs->flat; \ assert(pgs != NULL); \ assert(cov->deterministic || \ (pgs->cov!=NULL && pgs->cov->Spgs!=NULL \ && pgs->cov->Spgs->cov==cov)); #define SWAP_PGS \ cov = cov->Spgs->cov; \ SET_COV //static double sumArea = 0.0; void do_pgs_maxstable(cov_model *cov, gen_storage *S) { pgs_storage *pgs = NULL; cov_model *shape = NULL, *pts = NULL; location_type *loc = NULL; int i, d, elmts, mcmc, dim, err; double *single = NULL, // in *total = NULL, // in *halfstepvector = NULL, // in *x = NULL, // dummy *v = NULL; // dummy bool flat; assert(cov->calling != NULL); if (cov->deterministic) { SET_COV; } else { // assert(PARAM0(shape->sub[0], POWSCALE) == PARAM0(pts, LOC_SCALE)); double cmaxDmu; SWAP_PGS; for (mcmc=0; mcmcmpp.moments, S)) != NOERROR) BUG; DO(shape, S); if (calculate_mass_maxstable(cov) != NOERROR) error("unexpected error in 'do_pts_given_shape' (maxstable)"); cmaxDmu = pgs->totalmass / shape->mpp.mMplus[1]; if (pgs->n_zhou_c < GLOBAL.extreme.max_n_zhou) { pgs->n_zhou_c++; pgs->sum_zhou_c += cmaxDmu; pgs->sq_zhou_c += cmaxDmu * cmaxDmu; // sumArea += getArea( shape->sub[0]->Spolygon->P); //if (pgs->n_zhou_c % 1000 == 0) printf("mean area = %f\n", sumArea / (double) pgs->n_zhou_c); } // PMI(cov); // PMI(pts); if (false) printf("//cmaxDmu %4.1f; mass=%4.1f m1=%4.1e beta=%4.1f (%4.6f, %4.6f) (%4.6f, %4.6f) %4.3f %e\n", cmaxDmu, (double) pgs->totalmass, shape->mpp.mMplus[1], PARAM0(shape->sub[0], 0), shape->sub[0]->Spolygon->P->box0[0], shape->sub[0]->Spolygon->P->box0[1], shape->sub[0]->Spolygon->P->box1[0], shape->sub[0]->Spolygon->P->box1[1], 101 * 101 * shape->sub[0]->Spolygon->P->box1[0]* shape->sub[0]->Spolygon->P->box1[1] * 4, 101 * 101 * shape->sub[0]->Spolygon->P->box1[0]* shape->sub[0]->Spolygon->P->box1[1] * 4 - pgs->totalmass); //assert( shape->sub[0] != NULL); //assert(shape->sub[0]->Spolygon != NULL); //assert(shape->sub[0] ->Spolygon->P != NULL); //assert(false); // if (!(shape->mpp.mMplus[1] > 0.0001 || pgs->totalmass < 100)) APMI(cov); // assert( pgs->totalmass <= 101 * 101 * shape->sub[0]->Spolygon->P->box1[0]* shape->sub[0]->Spolygon->P->box1[1] * 4 + 1e-12); //PMI(cov); //assert( shape->sub[0]->Spolygon->P->box0[0] == PARAM(pts, 0)[0]); double old_zhou = pgs->cov->Spgs->old_zhou; if (old_zhou < cmaxDmu || UNIFORM_RANDOM * old_zhou < cmaxDmu) { //printf(". %f %f\n", old_zhou, cmaxDmu); pgs->old_zhou = cmaxDmu; SWAP_PGS; } //else printf("* %f %f\n", old_zhou, cmaxDmu); } // mcmc SWAP_PGS; cov_model *prev=cov->calling; assert(prev != NULL); if (prev->key != NULL) prev->key = cov; else if (prev->sub[0] != NULL) prev->sub[0] = cov; else if (prev->sub[1] != NULL) prev->sub[1] = cov; else error("structure mismatch"); // APMI(cov); // printf("\n"); //PMI(pts); // printf("%f %f\n", PARAM(pts, 1)[0] *PARAM(pts, 1)[1] * 4 , pts->mpp.mMplus[0]); //assert(fabs(PARAM(pts, 1)[0] *PARAM(pts, 1)[1] * 4 - pts->mpp.mMplus[0]) < 1e-14 * pts->mpp.mMplus[0]); // PMI(save_pts); //APMI(pts); DORANDOM(pts, cov->q); // cov->q ist hier nur dummy // if (!newshape) printf("failed\n"); //printf("old %f %f %f\n", (double) pgs->old_zhou, (double) pgs->totalmass, PARAM0(shape->sub[0], POWSCALE)); // assert(pgs->old_zhou == pgs->totalmass); // if (pgs->old_zhou > 1e6 && PARAM0(shape->sub[0], POWSCALE)>1) APMI(cov); // assert(shape->sub[0]->nr == POWER_DOLLAR && pts->nr == LOC); // assert(PARAM0(shape->sub[0], POWSCALE) == PARAM0(pts, LOC_SCALE)); // if (false) printf("//zhou %4.1f %4.3f %ld mean=%4.3f, shape=%s %f \n", (double) pgs->sum_zhou_c, pgs->totalmass, pgs->n_zhou_c, (double) pgs->sum_zhou_c / (double) pgs->n_zhou_c, NICK(shape->sub[0]), PARAM0(shape->sub[0], POWSCALE) ); // assert(pgs->n_zhou_c <= 500); } i = DrawCathegory(pgs->size, single, total, loc->grid, &elmts); if (flat) for (d=0; dxgr[d][XSTEP] * UNIFORM_RANDOM - halfstepvector[d]; } else { // printf("here %f %f %f\n", x[0], x[1], x[2]); // double xx[3]; /* print */ // xx[0] = xx[1] = 0.5; xx[2] = RF_INF; bad // xx[0] = 0.5; xx[1] = xx[2] = RF_INF; badd // xx[0] = xx[1] = xx[2] = RF_INF; ok //xx[0] = 0.5; xx[1] = xx[2] = RF_INF; VTLG_R2SIDED(NULL, x, pts, v); } // v[0] = (2 * UNIFORM_RANDOM - 1) * PARAM0(shape->sub[0], POWSCALE) ; // v[1] = (2 * UNIFORM_RANDOM - 1) * PARAM0(shape->sub[0], POWSCALE); // v[2] = (2 * UNIFORM_RANDOM - 1) * PARAM0(shape->sub[0], POWSCALE); // if (v[0] * v[0] + v[1] * v[1] + v[2] * v[2] > 0.1001 * 0.1001 * 2) // printf("i=%d %f %f %f v=%f %f %f\n", i, x[0], x[1], x[2], v[0], v[1], v[2]); // APMI(cov); //printf("i=%d %f %f v=%f %f\n", i, x[0], x[1], v[0], v[1]); for (d=0; dq[d] = loc->xgr[d][XSTART] + v[d]; // // printf("q=%f %f %f %d\n", cov->q[d], loc->xgr[d][XSTART], v[d], flat); //APMI(pts->calling); if (R_FINITE(x[d])) { int len = (int) loc->xgr[d][XLENGTH] - 1, nr = elmts % len; elmts /= len; cov->q[d] += loc->xgr[d][XSTEP] * (nr + (v[d] > 0.0)); // simuliert von VTLF_R2SIDED ist die abgeschnittene Dichte symmetrisch // um 0; in Ursprung muss die Dichtekurve aufgeschnitten werden und // versetzt wieder zusammengesetzt werden, so dass in der Mitte i.a. // der kleinste Werte ist und aussen die groessten, ehemaligen Werte // in der Naehe des Ursprungs. Dies bewirkt gerade (v>0) und "+ v" } else { if (v[d] > 0.0) cov->q[d] += loc->xgr[d][XSTEP] * (loc->xgr[d][XLENGTH] - 1.0); // dichte function der pts muss "zerschnitten" werden; der negative // Teil wird vor den Beginn des Gitters gesetzt, der positive Teil // ans Ende des Gitters. Somit immer "+v", nie "-v"; // loc->xgr[0][XSTEP] * (loc->xgr[0][XLENGTH] - 1.0) schiebt den // Punkt ans Ende des Gitters. x[d] = v[d]; } // printf("D=%d %f %f %d\n", d, cov->q[d], v[d], elmts); } if (flat) for (d = 0; dnr].logD != ErrCov) { // printf("log!\n"); VTLG_DLOG(v, pts, &(pgs->log_density)); // hier muss allgemein die nicht-normierte Dichte stehen und stattdessen durch das Mittel des Volumens geteilt werden //printf("log density v=%f, %f, %f %e\n", v[0],v[1],v[2], pgs->log_density); //printf("log_dens %f\n", pgs->log_density); // pgs->log_density -= log(pgs->totalmass); // ueberprueft: normierung // zu einer WK'Dichte. } else { double density; VTLG_D(v, pts, &density); // printf("dens %f\n", density); // printf("density %e v=%f %f %f\n", density, v[0], v[1], v[2]); pgs->log_density = log(density); } if (!R_FINITE(pgs->log_density)) { //PMI(cov); BUG; } //assert(pgs->log_density == 0); // PMI(cov); } void do_pts_given_shape(cov_model *cov, gen_storage *S) { // muss zu allerst stehen, da cov sich aendern kann! if (cov->role == ROLE_POISSON_GAUSS) { do_pgs_gauss(cov, S); } else if (hasMaxStableRole(cov)) { // todo: sauber trennen, wann do_pgs_maxstable(cov, S); } else { PMI(cov); BUG; // } // do_gs_maxstable might break links of the cov structure: cov_model *prev=cov->calling; assert(prev != NULL); if (prev->key != NULL) cov = prev->key; else if (prev->sub[0] != NULL) cov = prev->sub[0]; else if (prev->sub[1] != NULL) cov = prev->sub[1]; else error("structure mismatch"); cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; pgs_storage *pgs = cov->Spgs; int d, dim = shape->xdimprev; double eps, *x = pgs->x, *y = pgs->y; if (cov->role == ROLE_POISSON_GAUSS) { eps = GLOBAL.mpp.about_zero * exp(pgs->log_density); } else if (hasMaxStableRole(cov)) { // todo: sauber trennen, wann // max-stable, smith etc eps = pgs->currentthreshold; //printf("eps= %f\n", eps); if (!R_FINITE(pgs->log_density)) { //PMI(cov->Spgs->cov); PMI(cov); BUG; } if (cov->loggiven) eps += pgs->log_density; else eps *= exp(pgs->log_density); } else BUG; //printf("here %f %d\n", eps, cov->loggiven); // APMI(cov); if (cov->loggiven) { NONSTATLOGINVERSE(&eps, shape, x, y); } else NONSTATINVERSE(&eps, shape, x, y); // assert(false); // warum fkt obiges nicht bei gauss?? // PMI(shape); //printf("eps=%f x=%f %d %f %f\n", eps, *x, cov->loggiven, // // pgs->currentthreshold, pgs->log_density); if (ISNAN(x[0]) || x[0] > y[0]) { //double eps_neu = eps / cov->mpp.maxheights[0]; // warum ?? 29.12.2013 double eps_neu = eps; // 29.12.2013 if (cov->loggiven) { BUG; } else NONSTATINVERSE_D(&eps_neu, pts, x, y); if (ISNAN(x[0]) || x[0] > y[0]) BUG; //printf("eps=%f %f %f x=(%e %e %e) y=(%e %e %e) q=(%f %f %f)\n", // eps, pgs->currentthreshold, exp(pgs->log_density), // x[0], x[1], x[2], y[0], y[1], y[2], // cov->q[0], cov->q[1], cov->q[2]); } // printf("Xx=%f %d %d %f %f\n", *x, ISNAN(x[0]),cov->loggiven, pgs->currentthreshold, pgs->log_density); //APMI(cov); for (d=0; dsupportmin[d] = cov->q[d] - y[d]; // 4 * for debugging... pgs->supportmax[d] = cov->q[d] - x[d]; // printf("do d=%d q=%f x=%f y=%f eps=%e thr=%e %f %f\n", // d, cov->q[d], x[d], y[d], eps, pgs->currentthreshold, pgs->supportmin[d], pgs->supportmax[d]); if (ISNAN(pgs->supportmin[d]) || ISNAN(pgs->supportmax[d]) || pgs->supportmin[d] > pgs->supportmax[d]) { // printf("do d=%d q=%f min=%f max=%f eps=%e thr=%e supp=(%e, %e)\n", d, cov->q[d], x[d], y[d], eps, pgs->currentthreshold, pgs->supportmin[d], pgs->supportmax[d]); // APMI(shape); // BUG; } //assert(pgs->supportmin[d] <= pgs->supportmax[d]); } // assert(false); // BUG; // APMI(cov); cov->fieldreturn = shape->fieldreturn; cov->origrf = false; } void range_pts_given_shape(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[PGS_RATIO] = 0; range->max[PGS_RATIO] = 1; range->pmin[PGS_RATIO] = 0; range->pmax[PGS_RATIO] = 1; range->openmin[PGS_RATIO] = false; range->openmax[PGS_RATIO] = false; range->min[PGS_FLAT] = -1; range->max[PGS_FLAT] = 1; range->pmin[PGS_FLAT] = -1; range->pmax[PGS_FLAT] = 1; range->openmin[PGS_FLAT] = false; range->openmax[PGS_FLAT] = false; range->min[PGS_INFTY_SMALL] = 0; range->max[PGS_INFTY_SMALL] = 1; range->pmin[PGS_INFTY_SMALL] = 0; range->pmax[PGS_INFTY_SMALL] = 1; range->openmin[PGS_INFTY_SMALL] = false; range->openmax[PGS_INFTY_SMALL] = false; range->min[PGS_NORMED] = 0; range->max[PGS_NORMED] = 1; range->pmin[PGS_NORMED] = 0; range->pmax[PGS_NORMED] = 1; range->openmin[PGS_NORMED] = false; range->openmax[PGS_NORMED] = false; range->min[PGS_ISOTROPIC] = 0; range->max[PGS_ISOTROPIC] = 1; range->pmin[PGS_ISOTROPIC] = 0; range->pmax[PGS_ISOTROPIC] = 1; range->openmin[PGS_ISOTROPIC] = false; range->openmax[PGS_ISOTROPIC] = false; } void standard_shape(double *x, cov_model *cov, double *v) { cov_model *shape = cov->sub[PGS_FCT]; NONSTATCOV(x, cov->q, shape, v); } void logstandard_shape(double *x, cov_model *cov, double *v, double *sign) { cov_model *shape = cov->sub[PGS_FCT]; LOGNONSTATCOV(x, cov->q, shape, v, sign); } int check_standard_shape(cov_model *cov) { cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; int err, role, dim = cov->tsdim; if (cov->q == NULL) { // zwingend CALLOC ! if ((cov->q = (double*) CALLOC(sizeof(double), dim)) == NULL) return ERRORMEMORYALLOCATION; cov->qlen = dim; } if (cov->xdimprev != cov->xdimown || cov->xdimprev != cov->tsdim) return ERRORDIM; if (hasPoissonRole(cov)) { role = ROLE_POISSON; } else if (hasMaxStableRole(cov)) { role = ROLE_MAXSTABLE; } else ILLEGAL_ROLE; if ((err = CHECK(shape, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, role)) != NOERROR) return err; setbackward(cov, shape); if (!shape->deterministic) SERR1("random shapes for '%s' not allowed yet", NICK(cov)); if (pts != NULL) { if ((err = CHECK_R(pts, dim)) != NOERROR) return err; } return NOERROR; } int struct_standard_shape(cov_model *cov, cov_model **newmodel){ cov_model *shape = cov->sub[PGS_FCT]; // int err = NOERROR; //dim = shape->xdimprev; // printf("ttt\n"); ASSERT_NEWMODEL_NULL; if (shape->role != ROLE_POISSON && shape->role != ROLE_MAXSTABLE) ILLEGAL_ROLE; // printf("here %s\n", NICK(cov->sub[PGS_LOC])); // APMI(cov); //if ((err = CHECK_R(cov->sub[PGS_LOC], cov->tsdim)) != NOERROR) return err; return NOERROR; } int init_standard_shape(cov_model *cov, gen_storage *S) { cov_model *shape = cov->sub[PGS_FCT]; // location_type *loc = Loc(cov); //APMI(cov); assert(cov->sub[PGS_LOC] != NULL); location_type *loc = Loc(cov); int d, dim = shape->xdimprev, err = NOERROR; pgs_storage *pgs = cov->Spgs; //APMI(cov); assert(shape->xdimprev == Loc(cov)->timespacedim); if (pgs == NULL) { if ((err = alloc_pgs(cov)) != NOERROR) return err; pgs = cov->Spgs; if ((pgs->localmin = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->localmax = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->minmean = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->maxmean = (double*) CALLOC(dim, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; } // selbst wenn zufaelliger Shape: 1x laufen lassen, ob // Fehler auftauchen. Unter "Do" lassen sie sich nicht mehr // schoen abfangen. // ROLE_ASSERT(ROLE_POISSON || cov->role == ROLE_MAXSTABLE); //PMI(cov->calling, -1); assert(cov->mpp.moments == hasMaxStableRole(cov)); if ((err = INIT(shape, cov->mpp.moments, S)) != NOERROR) return err; //gatter? cov_model *u = cov->sub[PGS_LOC]; //PMI(cov); assert(u->nr == UNIF); double *min = PARAM(u, UNIF_MIN), *max = PARAM(u, UNIF_MAX), *x = pgs->minmean, // !! wird gespeichert *y = pgs->maxmean; // !! // try out whether it works: NONSTATINVERSE(ZERO, shape, x, y); if (ISNAN(x[0]) || x[0] > y[0]) SERR1("inverse of '%s' unknown", NICK(shape)); GetDiameter(loc, pgs->localmin, pgs->localmax, pgs->supportcentre); // last is only a dummy pgs->totalmass = 1.0; for (d=0; dlocalmin[d] - y[d]; max[d] = pgs->localmax[d] - x[d]; if (!(R_FINITE(min[d]) && R_FINITE(max[d]))) SERR1("simulation window does not have compact support. Should '%s' be used?", CovList[TRUNCSUPPORT].nick); pgs->totalmass *= max[d] - min[d]; } if (cov->role == ROLE_POISSON) { pgs->log_density = 0.0; } else { pgs->log_density = 0.0; pgs->zhou_c = pgs->totalmass / shape->mpp.mMplus[1]; cov->mpp.maxheights[0] = shape->mpp.maxheights[0]; pgs->estimated_zhou_c = !cov->deterministic; if (pgs->estimated_zhou_c) SERR("random shapes in standard approach not coded yet -- please contact author"); } cov->rf = shape->rf; cov->origrf = false; cov->fieldreturn = shape->fieldreturn; // APMI(cov); return NOERROR; } void do_standard_shape(cov_model *cov, gen_storage *S) { cov_model *shape = cov->sub[PGS_FCT], *pts = cov->sub[PGS_LOC]; assert(cov->sub[PGS_LOC] != NULL); pgs_storage *pgs = cov->Spgs; double *x = pgs->x, *y = pgs->xstart; int d, dim = shape->xdimprev; DO(shape, S); DORANDOM(pts, cov->q); //printf("q=%f\n", cov->q[0]); // APMI(cov->calling); assert(!shape->fieldreturn); //PMI(shape, "standard"); NONSTATINVERSE(ZERO, shape, x, y); if (ISNAN(x[0])|| x[0] > y[0]) BUG; for (d=0; dq[d], x[d], y[d], pgs->currentthreshold); pgs->supportmin[d] = cov->q[d] - y[d]; // 4 * for debugging... pgs->supportmax[d] = cov->q[d] - x[d]; assert(pgs->supportmin[d] != NA_INTEGER && pgs->supportmax[d] != NA_INTEGER); assert(pgs->supportmin[d] <= pgs->supportmax[d]); } pgs->log_density = 0.0; } #define STAT_SHAPE_FCT 0 void stationary_shape(double *x, cov_model *cov, double *v) { cov_model *shape = cov->sub[STAT_SHAPE_FCT]; FCTN(x, shape, v); // if (cov->q[0] < 1) { // printf("x=%f q=%f v=%f\n", x[0], cov->q[0], v[0]); // assert(false); // } // APMI(cov); } void logstationary_shape(double *x, cov_model *cov, double *v, double *sign) { cov_model *shape = cov->sub[STAT_SHAPE_FCT]; LOGCOV(x, shape, v, sign); } int check_stationary_shape(cov_model *cov) { cov_model *shape = cov->sub[STAT_SHAPE_FCT]; int err, role, dim = cov->tsdim; if (cov->xdimprev != cov->xdimown || cov->xdimprev != cov->tsdim) return ERRORDIM; if (cov->role == ROLE_GAUSS) { role = isGaussProcess(shape) ? ROLE_GAUSS : shape->nr == BINARYPROC ? ROLE_GAUSS : ROLE_UNDEFINED; ASSERT_ROLE_DEFINED(shape); } else if (hasPoissonRole(cov)) { role = ROLE_POISSON; } else if (hasMaxStableRole(cov)) { role = ROLE_MAXSTABLE; } else ILLEGAL_ROLE; //printf("here\n"); if ((err = CHECK(shape, dim, dim, ProcessType, XONLY, CARTESIAN_COORD, SCALAR, role)) != NOERROR) return err; setbackward(cov, shape); return NOERROR; } int struct_stationary_shape(cov_model *cov, cov_model **newmodel){ cov_model *shape = cov->sub[STAT_SHAPE_FCT]; // location_type *loc = Loc(cov); ASSERT_NEWMODEL_NULL; if (shape->role != ROLE_POISSON && shape->role != ROLE_MAXSTABLE) ILLEGAL_ROLE; //printf("here\n"); return NOERROR; } int init_stationary_shape(cov_model *cov, gen_storage *S) { cov_model *shape = cov->sub[STAT_SHAPE_FCT]; int d, i, err = NOERROR, dim = shape->xdimprev; //PMI(cov); assert(dim == Loc(cov)->timespacedim); if ((err = alloc_pgs(cov)) != NOERROR) return err; pgs_storage *pgs = cov->Spgs; // selbst wenn zufaelliger Shape: 1x laufen lassen, ob // Fehler auftauchen. Unter "Do" lassen sie sich nicht mehr // schoen abfangen. assert(cov->mpp.moments >= 1); if ((err = INIT(shape, 1, S)) != NOERROR) return err; //gatter? assert(shape->mpp.moments >= 1); for (i=0; i<=cov->mpp.moments; i++) { cov->mpp.mM[i] = shape->mpp.mM[i]; cov->mpp.mMplus[i] = shape->mpp.mMplus[i]; } pgs->zhou_c = 1.0 / cov->mpp.mMplus[1]; // passt fuer binary, und auch fuer if (!R_FINITE(pgs->zhou_c)) SERR1("max height of '%s' not finite", NICK(shape)); pgs->estimated_zhou_c = false; if (!cov->deterministic) SERR("not deterministic shapes in stationary modelling -- please contact author"); pgs->log_density = 0; // printf("dims %d %d\n", cov->xdimown, shape->xdimprev); for (d=0; dsupportmin[d] = RF_NEGINF; // 4 * for debugging... pgs->supportmax[d] = RF_INF; } cov->mpp.maxheights[0] = shape->mpp.maxheights[0]; cov->rf = shape->rf; cov->origrf = false; cov->fieldreturn = shape->fieldreturn; if (!cov->fieldreturn) BUG; // APMI(cov); return NOERROR; } void do_stationary_shape(cov_model *cov, gen_storage *S) { cov_model *shape = cov->sub[STAT_SHAPE_FCT]; DO(shape, S); cov->mpp.maxheights[0] = shape->mpp.maxheights[0]; assert(shape->fieldreturn); } RandomFields/src/direct.cc0000644000175100001440000003047212412655466015230 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de Simulation of a random field by Cholesky or SVD decomposition Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "RF.h" #include "randomshape.h" #include //#include bool debug=false; int check_directGauss(cov_model *cov) { #define nsel 4 cov_model *next=cov->sub[0]; location_type *loc = Loc(cov); int j, err ; // taken[MAX DIM], direct_param *gp = &(GLOBAL.direct); // ROLE_ASSERT(ROLE_GAUSS); kdefault(cov, DIRECT_METHOD, (int) gp->inversionmethod); kdefault(cov, DIRECT_SVDTOL, gp->svdtolerance); kdefault(cov, DIRECT_MAXVAR, gp->maxvariables); if ((err = checkkappas(cov)) != NOERROR) return err; if ((cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) && (!loc->distances || cov->xdimprev!=1)) { return ERRORDIM; } Types type = PosDefType; for (j=0; j<=1; j++) { if ((err = CHECK(next, cov->tsdim, cov->xdimprev, type, KERNEL, SYMMETRIC, SUBMODEL_DEP, ROLE_COV)) == NOERROR) break; type = NegDefType; } if (err != NOERROR) return err; if (next->pref[Direct] == PREF_NONE) return ERRORPREFNONE; setbackward(cov, next); return NOERROR; } void range_direct(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[DIRECT_METHOD] = Cholesky; range->max[DIRECT_METHOD] = NoFurtherInversionMethod; range->pmin[DIRECT_METHOD] = Cholesky; range->pmax[DIRECT_METHOD] = NoFurtherInversionMethod; range->openmin[DIRECT_METHOD] = false; range->openmax[DIRECT_METHOD] = true; range->min[DIRECT_SVDTOL] = 0; range->max[DIRECT_SVDTOL] = 1; range->pmin[DIRECT_SVDTOL] = 1e-17; range->pmax[DIRECT_SVDTOL] = 1e-8; range->openmin[DIRECT_SVDTOL] = false; range->openmax[DIRECT_SVDTOL] = true; range->min[DIRECT_MAXVAR] = 0; range->max[DIRECT_MAXVAR] = 10000; range->pmin[DIRECT_MAXVAR] = 500; range->pmax[DIRECT_MAXVAR] = 5000; range->openmin[DIRECT_MAXVAR] = false; range->openmax[DIRECT_MAXVAR] = false; } int init_directGauss(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *S) { cov_model *next = cov->sub[0]; double //*xx, svdtol = P0(DIRECT_SVDTOL), *G=NULL, *Cov=NULL, *U=NULL, *VT=NULL, *work=NULL, *D=NULL, *SICH=NULL; int err, maxvariab = P0INT(DIRECT_MAXVAR), *iwork=NULL; int dim=cov->tsdim; direct_storage* s=NULL; InversionMethod method = (InversionMethod) P0INT(DIRECT_METHOD); location_type *loc = Loc(cov); bool storing = GLOBAL.internal.stored_init; // // nonstat_covfct cf; long vdim = cov->vdim2[0], locpts = loc->totalpoints, // loctot = locpts *dim, vdimtot = vdim * locpts, // vdimSqtot = vdim * vdimtot, // vdimtotSq = vdimtot * locpts, vdimSqtotSq = vdimtot * vdimtot; ROLE_ASSERT_GAUSS; assert(cov->vdim2[0] == cov->vdim2[1]); cov->method = Direct; if ((err = alloc_cov(cov, dim, vdim, vdim)) != NOERROR) return err; if (vdimtot > maxvariab) { sprintf(ERRORSTRING_OK, "number of columns less than or equal to %d", maxvariab); sprintf(ERRORSTRING_WRONG,"%ld", vdimtot); err=ERRORCOVFAILED; goto ErrorHandling; } //printf("vdim = %d %d %d %d\n", vdim, locpts, vdimtot, vdimSqtotSq); // PMI(cov); if ((Cov =(double *) MALLOC(sizeof(double) * vdimSqtotSq))==NULL || (U =(double *) MALLOC(sizeof(double) * vdimSqtotSq))==NULL || //for SVD/Chol intermediate r esults AND memory space for do_directGauss: (G = (double *) CALLOC(vdimtot + 1, sizeof(double)))==NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } NEW_STORAGE(Sdirect, DIRECT, direct_storage); s = cov->Sdirect; /* ********************* */ /* matrix creation part */ /* ********************* */ CovarianceMatrix(next, Cov); assert(R_FINITE(Cov[0])); if (false) { long i,j; PRINTF("\n"); for (i=0; i=PL_STRUCTURE) { LPRINT("method for the root=Cholesky\n"); } row=vdimtot; // dchdc destroys the input matrix; upper half of U contains result! MEMCOPY(U, Cov, sizeof(double) * vdimSqtotSq); if (debug) { err = ERRORDECOMPOSITION; goto ErrorHandling; } F77_CALL(dpotrf)("Upper", &row, U, &row, &Err); if (false) { double *sq = (double *) MALLOC(sizeof(double) * vdimtot * vdimtot); AtA(U, vdimtot, vdimtot, sq); long i,j; PRINTF("AtA \n"); for (i=0; i=PL_SUBIMPORTANT) { INDENT; PRINTF("Error code F77_CALL(dpotrf) = %d\n", Err); } err=ERRORDECOMPOSITION; } else break; // try next method : // most common error: singular matrix if (svdtol <= 0.0) break; case SVD : // works for any positive semi-definite matrix double sum; method = SVD; // necessary if the value of method has been Cholesky. // originally if (vdimtot>maxvariab * 0.8) { sprintf(ERRORSTRING_OK, "number of points less than 0.8 * RFparameters()$direct.maxvariables (%d) for SVD", maxvariab); sprintf(ERRORSTRING_WRONG,"%ld", vdimtot); err=ERRORCOVFAILED; goto ErrorHandling; } if (PL>=PL_STRUCTURE) { LPRINT("method to the root=SVD\n"); } if ((VT =(double *) MALLOC(sizeof(double) * vdimSqtotSq))==NULL || (D =(double *) MALLOC(sizeof(double) * vdimtot))==NULL || (iwork = (int *) MALLOC(sizeof(int) * 8 * vdimtot))==NULL || (SICH =(double *) MALLOC(sizeof(double) * vdimSqtotSq))==NULL) { err=ERRORMEMORYALLOCATION; goto ErrorHandling; } MEMCOPY(SICH, Cov, sizeof(double) * vdimSqtotSq); row=vdimtot; // dsvdc destroys the input matrix !!!!!!!!!!!!!!!!!!!! // DGESDD (or DGESVD) // dgesdd destroys the input matrix Cov; // F77_NAME(dsvdc)(Cov, &row, &row, &row, D, e, U, &row, V, &row, G, // &jobint /* 11 */, &err); double optim_lwork; int lwork; lwork = -1; F77_CALL(dgesdd)("A", &row, &row, SICH, &row, D, U, &row, VT, &row, &optim_lwork, &lwork, iwork, &Err); if ((err=Err) != NOERROR) { err=ERRORDECOMPOSITION; goto ErrorHandling; } lwork = (int) optim_lwork; if ((work = (double *) MALLOC(sizeof(double) * lwork))==NULL) goto ErrorHandling; F77_CALL(dgesdd)("A", &row, &row, SICH, &row, D, U, &row, VT, &row, work, &lwork, iwork, &Err); err = Err; if (err==NOERROR && ISNAN(D[0])) err=9999; if (err!=NOERROR) { if (PL>PL_ERRORS) { LPRINT("Error code F77_CALL(dgesdd) = %d\n", err); } err=ERRORDECOMPOSITION; goto ErrorHandling; } int i,j; /* calculate SQRT of covariance matrix */ for (k=0,j=0;j=0) { for (i=0; i svdtol) { if (PL > PL_ERRORS) { LPRINT("difference %e at (%d,%d) between the value (%e) of the covariance matrix and the square of its root (%e).\n", Cov[i * vdimtot +k] - sum, i, k, Cov[i* vdimtot +k ], sum); } GERR1("required precision not attained: probably invalid model.\nSee also parameter '%s'.", direct[DIRECT_SVDTOL]); goto ErrorHandling; } } } } break; default : BUG; } // switch err = FieldReturn(cov); ErrorHandling: // and NOERROR... if (s != NULL) s->method = method; if (!storing && err!=NOERROR) { if (U!=NULL) free(U); if (G!=NULL) free(G); U = G = NULL; } else { if (s != NULL) { s->U=U; s->G=G; } } if (SICH!=NULL) free(SICH); SICH = NULL; if (Cov!=NULL) free(Cov); if (D!=NULL) free(D); if (work!=NULL) free(work); if (iwork!=NULL) free(iwork); if (VT!=NULL) free(VT); return err; } void do_directGauss(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *S) { location_type *loc = Loc(cov); direct_storage *s = cov->Sdirect; long i, j, k, locpts = loc->totalpoints, vdim = cov->vdim2[0], vdimtot = locpts * vdim; double dummy, *G = NULL, *U = NULL, *res = cov->rf; // int m, n; bool loggauss = GLOBAL.gauss.loggauss; // bool vdim_close_together = GLOBAL.general.vdim_close_together; // APMI(cov); U = s->U;// S^{1/2} G = s->G;// only the memory space is of interest (stored to avoid // allocation errors here) for (i=0; imethod) { case Cholesky : // if (vdim_close_together) { for (k=0, i=0; i #include #include "convhull2D.h" int ccw(double **P, int i, int j, int k) { double a = P[i][0] - P[j][0], b = P[i][1] - P[j][1], c = P[k][0] - P[j][0], d = P[k][1] - P[j][1]; return a*d - b*c <= 0; /* true if points i, j, k counterclockwise */ } int cmpl(const void *a, const void *b) { double v; v = (*(double**)a)[0] - (*(double**)b)[0]; if (v>0) return 1; if (v<0) return -1; v = (*(double**)b)[1] - (*(double**)a)[1]; if (v>0) return 1; if (v<0) return -1; return 0; } int cmph(const void *a, const void *b) {return cmpl(b,a);} int make_chain(double** V, int n, int (*cmp)(const void*, const void*)) { int i, j, s = 1; double* t; qsort(V, n, sizeof(double*), cmp); for (i=2; i=1 && ccw(V, i, j, j-1); j--){} s = j+1; t = V[s]; V[s] = V[i]; V[i] = t; } return s; } int ch2d(double **P, int n) { int u = make_chain(P, n, cmpl); /* make lower hull */ if (!n) return 0; P[n] = P[0]; return u+make_chain(P+u, n-u+1, cmph); /* make upper hull */ } RandomFields/src/fftVario.cc0000644000175100001440000004472712412655466015546 0ustar hornikusers/* Authors Sebastian Engelke Johannes Martini library for simulation of random fields -- init part and error messages Copyright (C) 2011 -- 2013 Sebastian Engelke, Johannes Martini Copyright (C) 2014 Sebastian Engelke, Johannes Martini, Martin Schlather This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "RF.h" #include "RandomFields.h" // z coordinate run the fastest in values, x the slowest //#define debug_tools 1 #define TOOLS_MEMORYERROR 501 #define TOOLS_XERROR 502 #define TOOLS_BIN_ERROR 503 #define NEARBY 1e15 // naechste Zeile nur notwendig, weil atan2 in Windows nicht // ordentlich programmiert ist #define NEARBYINT(x) floor((x) * NEARBY + 0.5) / NEARBY // #define NEARBYINT(x) x int GetAngleBin(double angle, double startangle, double SegPerPI, double maxAngle){ double phi; int kphi; phi = angle - startangle; while (phi < 0) phi += maxAngle; while (phi >= maxAngle) phi -= maxAngle; kphi = (int) (phi * SegPerPI / PI); return(kphi); } static int maxjj = 0; double get(double *sumvals, int jj) { if (jj > maxjj) { maxjj = jj; //printf("jj=%d\n", jj); } return sumvals[jj]; } SEXP fftVario3D(SEXP Coord, SEXP Sumvals, SEXP Nbvals, SEXP Bin, SEXP Nbin, SEXP LenT, SEXP StepT, SEXP NstepT, SEXP Phi, SEXP Theta, SEXP Repet, SEXP Vdim, SEXP SegmentEmpVario, SEXP Pseudo ) { /* coord : 3x3 matrix of coordinates of the 3 space dimension * in (new) gridtriple notation, (start,by,length) * sumvals : matrix of non-averaged values of the empirical variogram * as a function of the distance vector * nbvals : number of values contributing to the respective direction * sumvals / nbvals = meanvals * bin : vector of bin boundaries for the radial space part * nbin : number of bins of the radial space part * stepT : stepsize in temporal direction (must be multiple of the time stepsize) * nstepT : number of steps in temporal direction * phi : 2-dim vector, first component gives the starting angle and * second component the number of angles / PI (all in the xy-plane) * theta : 2-dim vector, first component gives the starting angle and * repet : number of repetitions (the calculated emprical variogram will * be an overall average, see also EmpiricalVariogram in empvario.R) * second component the number of angles / PI (all orthogonal to xy-plane) * empvario: vector of bins filled with averaged empirical variogram * n : number of pairs in each bin * pseudo : if pseudo == 1, then the pseudo (cross)-variogram is computed */ long rep; int i, binidx, halfnbin, totalbinsvdimSq, Nphi, NphiNbin, Ntheta, nbinNphiNtheta, Nphihalf, maxi[3], ix, iy, iz, startX, startY, startZ, startT, startrep, low, cur, ktheta, kthetaz, kphi, kphixy, kphix, kphiy, kT, nstepTstepT, deltaT, x, y, z, v1, v2, timecomp, k, err = NOERROR, nbin = INTEGER(Nbin)[0], vdim = INTEGER(Vdim)[0], repet = INTEGER(Repet)[0], segmentEmpVario = INTEGER(SegmentEmpVario)[0], totalbins = segmentEmpVario * vdim * vdim, nstepT = INTEGER(NstepT)[0], stepT = INTEGER(StepT)[0], lenT = INTEGER(LenT)[0] ; bool pseudo = LOGICAL(Pseudo)[0]; double tolerance, *xx[3], maxbinsquare, step[3], d0, d1, d2, // delta0 psq0, psq1, psq2, startphi, starttheta, thetadata, phidata, phixdata, phiydata, phixydata, binshift, *phi = REAL(Phi), *theta = REAL(Theta), *BinSq = NULL, *sumvals = REAL(Sumvals), *nbvals= REAL(Nbvals), *bin = REAL(Bin), *coord = REAL(Coord); SEXP back; back = PROTECT(allocMatrix(REALSXP, totalbins, 2) ); double *emp_vario = REAL(back), *n = emp_vario + totalbins ; #define SUMVALS_JJ sumvals[jj] //#define SUMVALS_JJ get(sumvals, jj) kphix = 0; kphixy = 0; kphiy = 0; Nphihalf = 0; nstepTstepT = stepT * nstepT; timecomp = nstepTstepT==0 ? 1 : 2; if((!pseudo) && (timecomp==1)){ Nphi = phi[1]==0 ? 1 : (int) phi[1]; } else{ Nphihalf = phi[1]==0 ? 0 : (int) phi[1]; Nphi = phi[1]==0 ? 1 : 2 * ((int) phi[1]); } Ntheta = theta[1]==0 ? 1 : (int) theta[1]; //print("1,.."); NphiNbin = Nphi * nbin; startphi = ((!pseudo) && (timecomp==1)) ? (phi[0] - PI / (double) (2*Nphi)) : (phi[0] - PI / (double) (Nphi) ); // [0, 2 pi] //invsegphi = phi[1] / PI; // note that phi[1] can be zero! //starttheta = theta[0] - PI / (double) (2*theta[1]); // [0, pi] starttheta = 0; // invsegtheta = theta[1] / PI; // note that theta[1] can be zero nbinNphiNtheta = NphiNbin * Ntheta; //print("2,.."); for (rep=i=0; i<3; i++, rep+=3) xx[i] = coord + rep; if (xx[0]==NULL) {err=TOOLS_XERROR; goto ErrorHandling;} for (i=0; i=bin[i+1]) {err=TOOLS_BIN_ERROR; goto ErrorHandling;} } halfnbin = nbin / 2; if ((BinSq = (double *) MALLOC(sizeof(double)* (nbin + 1))) ==NULL) { err=TOOLS_MEMORYERROR; goto ErrorHandling; } //print("3,.."); totalbins = nbinNphiNtheta * (nstepT + 1); totalbinsvdimSq = totalbins * vdim * vdim; for (i=0; i0 ? bin[i] * bin[i] + binshift : bin[i]; } assert(NEARBYINT(atan2(-1.0, 0.0) + PIHALF) == 0.0); assert(atan2(0.0, 0.0) == 0.0); maxbinsquare = BinSq[nbin]; int segmentbase[10]; segmentbase[0]=1; // here x runs the fastest; for (i=0; i<=2; i++) { step[i] = xx[i][1]; maxi[i] = xx[i][2]; segmentbase[i+1] = segmentbase[i] * maxi[i]; } segmentbase[4] = segmentbase[3] * lenT; if (!pseudo) { segmentbase[5] = 4 * segmentbase[4]; segmentbase[6] = segmentbase[5] * timecomp; } else { segmentbase[5] = 8 * segmentbase[4]; segmentbase[6] = segmentbase[5]; } segmentbase[7] = segmentbase[6] * repet; segmentbase[8] = segmentbase[7] * vdim * vdim; // sementbase: [0] : 1, [1] : length(x), [2] : length(x) * l(y), // [3] : l(x) * l(y) * l(z), [4] : l(x) * l(y) * l(z) * l(T) // [5] : 4 (or 8) * l(x) * l(y) * l(z) * l(T) // [6] : 4 (or 8) * l(x) * l(y) * l(z) * l(T) * timecomp // [7] : 4 (or 8) * l(x) * l(y) * l(z) * l(T) * timecomp * repet // for pseudo variogram we need the whole sphere (not only half-sphere) for (v1=0; v1> ... %d %d %d\n", v1, v2, segmentEmpVario); startX = 0; binidx = 0; for (x=startX, ix=0; x < segmentbase[1]; x++, ix++) { d0 = ix * step[0]; startY = x; if ((psq0 = d0 * d0) > maxbinsquare) continue; for (y = startY, iy=0; y < segmentbase[2]; y+=segmentbase[1], iy++){ d1 = iy * step[1]; startZ = y; if ((psq1 = d1 * d1 + psq0) >maxbinsquare) continue; // angles if(!pseudo){ phidata = NEARBYINT(atan2(d1, d0) - startphi); kphi = GetAngleBin(phidata, 0, phi[1], PI); phixdata = NEARBYINT(atan2(d1, -d0) - startphi); kphix = GetAngleBin(phixdata, 0, phi[1], PI); if((d0 == 0) && (d1 == 0)) kphi = 0;// points on the z-axes } else{ phidata = NEARBYINT(atan2(d1, d0) - startphi); kphi = GetAngleBin(phidata,0, phi[1], TWOPI); phixdata = NEARBYINT(atan2(d1, -d0) - startphi); kphix = GetAngleBin(phixdata, 0, phi[1], TWOPI); phiydata = NEARBYINT(atan2(-d1, d0) - startphi); kphiy = GetAngleBin(phiydata, 0, phi[1], TWOPI); phixydata = NEARBYINT(atan2(-d1, -d0) - startphi); kphixy = GetAngleBin(phixydata, 0, phi[1], TWOPI); } //if(d1 == d0) //print("kphi: %d and kphix: %d, phidata: %lf, startphi: %lf", kphi, kphix, phidata, startphi); // kphi is index of angle bin in x,y > 0 plane // kphix is index of angle bin if phi // is mirrored along the x-axis (in the xy-plane) // kphiy and kphixy similar for (d2=0.0, z=startZ, iz=0; z < segmentbase[3]; z+=segmentbase[2], iz++, d2 += step[2]){ startT = z; if ((psq2 = d2 * d2 + psq1) > maxbinsquare) continue; //print("5,.."); { /* finds the bins for the radial space part */ int up = nbin; low=0; cur= halfnbin; while(low!=up){ if (psq2 > BinSq[cur]) {low=cur;} else {up=cur-1;}/*( . ; . ]*/ cur=(up+low+1) / 2; } } // low // angles thetadata = NEARBYINT(PIHALF - atan2(d2, sqrt(psq1))); ktheta = GetAngleBin(thetadata, starttheta, theta[1], PI); kthetaz = GetAngleBin(PI - thetadata, starttheta, theta[1], PI); for (deltaT=0, kT=0; deltaT<=nstepTstepT; deltaT += stepT, kT += nbinNphiNtheta) { //print("kT %d, stepT %d, nsteptT %d, deltaT %d", kT, *stepT, *nstepT, deltaT); //print("kT %d --", kT); //timecomp = x==0 ? 1 : 2; startrep = startT + deltaT * segmentbase[3]; for (k=1; k <= timecomp; k++, startrep += segmentbase[5]){ //if a time component is given, then, for statistical efficiency, the data is reflected also along the time component binidx = cur + kT; assert( binidx < totalbins && binidx >= 0 ); //print("ix = %d -- k = %d", ix, k); //for (i=0, T=(startT+(deltaT+i)*segmentbase[3]); i < endT; T+=segmentbase[3], i++) { for (rep = startrep; rep < segmentbase[7]; rep += segmentbase[6]) { //print("6,.."); //print("ix: %d, iy: %d, iz: %d, kphi: %d, ktheta: %d, kphix: %d, kthetaz: %d, \n", ix, iy, iz, kphi, ktheta, kphix, kthetaz); //if(binidx == 0) print("rep: %d , sumvals[rep]: %lf \n", rep, sumvals[rep]); if(!pseudo) { int basX = NA_INTEGER, jj = rep, kM1 = k - 1, TkM2 = 2 - k, base = binidx + (kphi + Nphihalf * kM1) * nbin, Idx = ((Ntheta - 1 - ktheta) * kM1 + ktheta * TkM2) * NphiNbin; //printf("rep =%d [%d %d; %d] v1=%d %d [%d] x=%d %d %d deltaT=%d %d\n", //rep, startrep, segmentbase[7], segmentbase[6], //v1, v2, vdim, x, y, z, deltaT, k); emp_vario[base + Idx] += SUMVALS_JJ; n[base + Idx] += nbvals[jj]; jj += segmentbase[4]; if (ix > 0 && (iy > 0 || iz > 0)) { basX = binidx + (kphix + Nphihalf * kM1) * nbin; emp_vario[basX + Idx] += SUMVALS_JJ; n[basX + Idx] += nbvals[jj]; } if (iy > 0 && iz > 0){ Idx = ((Ntheta -1 - kthetaz) * kM1 + kthetaz * TkM2) * NphiNbin; jj += segmentbase[4]; emp_vario[base + Idx] += SUMVALS_JJ; n[base + Idx] += nbvals[jj]; if (ix > 0){ jj += segmentbase[4]; emp_vario[basX + Idx] += SUMVALS_JJ; n[basX + Idx] += nbvals[jj]; } } } else { // not pseudo int jj = rep, knbin = binidx + kphi * nbin, kxnbin = binidx + kphix * nbin, kN = ktheta * NphiNbin, kzN = kthetaz * NphiNbin, Idx = knbin + kN; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; jj += segmentbase[4]; if (ix > 0) { Idx = kxnbin + kN; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; } if (iz > 0) { Idx = knbin + kzN; jj += segmentbase[4]; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; if (ix > 0) { Idx = kxnbin + kzN; jj += segmentbase[4]; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; } } if(iy > 0) { int kxynbin = NA_INTEGER, kynbin = binidx + kphiy * nbin; Idx = kynbin + kN; jj = rep + 4 * segmentbase[4]; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; jj += segmentbase[4]; if (ix > 0){ // vor ix>0 && iz > 0 ! kxynbin = binidx + kphixy * nbin; Idx = kxynbin + kN; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; } if (iz > 0){ Idx = kynbin + kzN; jj += segmentbase[4]; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; if (ix > 0) { Idx = kxynbin + kzN; jj += segmentbase[4]; emp_vario[Idx] += SUMVALS_JJ; n[Idx] += nbvals[jj]; } } // iz > 0 } // iy > 0 } // else (not pseudo) } // repet } // k timecomponent } // deltaT ; time bin } // z } // y } //x tolerance = GLOBAL.empvario.tol * segmentbase[3]; // to do. Warum? for(i=0; i < totalbins ;i++){ if (fabs(emp_vario[i]) < tolerance) emp_vario[i] = 0.0; } } // vdim1 } // vdim2 // print("C SCRIPT END !!!!!!!!! \n"); ErrorHandling: if (err != NOERROR) { switch (err) { case TOOLS_MEMORYERROR : error("Memory alloc failed in empiricalvariogram.\n"); case TOOLS_XERROR : error("The x coordinate may not be NULL.\n"); break; case TOOLS_BIN_ERROR : error("Bin components not an increasing sequence.\n"); break; default : BUG; } } if (BinSq!=NULL) free(BinSq); UNPROTECT(1); return back; } /* coord : 3xd matrix of coordinates of d dimensional space in gridtriple notation, * last row is number of gridpoints * S : array of non-averaged values of the empirical variogram * as a function of the distance vector * N : number of values contributing to the respective direction * sumvals / nbvals = meanvals * bounds : vector of bin boundaries for the radial space part * nBounds : length of the bounds vector * stepT : stepsize in temporal direction (must be multiple of the time stepsize) * nstepT : number of steps in temporal direction * repeat : number of repetitions */ // void fftVarioIsotrop( // double* spaceStepLength, // int* nSpaceSteps, // int* dim, // int* nTimeSteps, // double* S, // int* W, // double* spaceBounds, // int* nSpaceBounds, // int* timeBounds, // int* nTimeBounds, // int* repeat, // double* matrix // ) // { // /* // * ******************************************************************************************** // * DEKLARATION // * ******************************************************************************************** // */ // // die bin-Matrix fuer die aufsummierten werte // double sumBins[*nSpaceBounds][*nTimeBounds]; // // die bin-Matrix fuer die gewichte // int weightBins[*nSpaceBounds][*nTimeBounds]; // // der cache fuer die quadrierten werte der bin grenzen // double sqrBoundCache[*nSpaceBounds]; // // der cache fuer die quadrierten werte der koordinatenpunkte // double sqrCache[*dim]; // // der koordinatenvektor // int coord[*dim]; // // der dazugehoerige index // int index; // // die dazugehoerige norm quadriert (so spart man sich das staendige wurzelziehen, denn man will ja nur distanzen vergleichen) // double sqrNorm; // // der zeit index // int time; // // der wiederholungsindex // int rep; // // die bin nummer im raum // int spaceBin; // // die bin nummer in der zeit // int timeBin; // // die anzahl der koordinatenpunkte // int nPoints; // // die anzahl der zeit + koordinatenpunkte // int nSpaceTimePoints; // // die dimension, in die gerade gegangen wird // int current; // // flag, das anzeigt ob in der "wandernden" dimension ein wraparound stattfand // int wrap; // /* // * ******************************************************************************************** // * INITIATION // * ******************************************************************************************** // */ // for (int i= 0; i < *nSpaceBounds; i++) // { // sqrBoundCache[i]= spaceBounds[i] * spaceBounds[i]; // for (j= 0; j < *nTimeBounds; i++) // { // sumBins[i][j]= 0; // weightBins[i][j]= 0; // } // } // nPoints= 1; // for (int i= 0; i < *dim; i++) // { // nPoints*= nSpaceSteps[i]; // sqrCache[i]= 0; // coord[i]= 0; // } // nSpaceTimePoints= nPoints* *nTimeSteps; // sqrNorm= 0; // // wir starten mit der x richtung // current= 0; // wrap= FALSE; // /* // * ******************************************************************************************** // * MAIN LOOP // * ******************************************************************************************** // */ // for (index= 0; index < nPoints; index++) // { // sqrNorm= sqrCache[1]+ coord[0]* spaceStepLength[0]* coord[0]* spaceStepLength[0]; // spaceBin= getSpaceBin(sqrBoundCache, nSpaceBounds, sqrNorm); // // wenn der abstand > maxbin ist, koennen wir mit dem naechsten punkt weitermachen // if (spaceBin == -1) // { // for (time= 0; time < *nTimeSteps; time++) // { // int timeOffset= time* nPoints; // timeBin= getTimeBin(timeBounds, nTimeBounds, time); // // selbes argument wie oben, wir koennen hier auch mit dem naechsten raumpunkt weitermachen // if (timeBin == -1) // break; // for (rep= 0, int repOffset= 0; rep < repeat; rep++; repOffset+= nSpaceTimePoints) // { // sumBins[spaceBin][timeBin]= S[index+ timeOffset+ repOffset]; // weightBins[spaceBin][timeBin]= W[index+ timeOffset+ repOffset]; // } // } // } // //TODO // //update coord and caches // } // } // int getSpaceBin(double *sqrBoundCache, int* nSpaceBounds, double sqrNorm) // { // int bin= -1; // if (sqrNorm > sqrBoundCache[*nSpaceBounds- 1]) // return bin; // for (bin= 0; (bin < *nSpaceBounds) && (sqrNorm > sqrBoundCache[bin]); bin++) // { // } // return bin; // } // int getTimeBin(*timeBounds, *nTimeBounds, time) // { // int bin= -1; // if (*timeBounds * *nTimeBounds < time) // return bin; // bin= (time- 1)/ *timeBounds; // return bin; // } RandomFields/src/Gneiting.cc0000644000175100001440000012334212412655466015521 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de Gneiting's space-time covariance models and related models Copyright (C) 2006 -- 2014 Martin Schlather This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "RF.h" #include "Covariance.h" #include #include // #define AVERAGE_YPHASE 0 // #define AVERAGE_YFREQ 1 #define AVESTP_MINEIGEN 2 #define AVESTP_LOGDET 3 #define AVESTP_V 4 #define AVESTP_LOGV 5 #define AVESTP_LOGMIXDENS 6 #define TOTALAVESTP AVESTP_LOGMIXDENS + 1 #define AVE_A 0 #define AVE_Z 1 #define AVE_SPACETIME 2 #define AVE_PHI 0 #define AVE_GAUSS 1 void kappa_ave(int i, cov_model *cov, int *nr, int *nc){ bool spacetime = (bool) (PisNULL(AVE_SPACETIME) || P0INT(AVE_SPACETIME)); int dim = spacetime ? cov->tsdim-1 : cov->tsdim; *nr = (i==AVE_A || i==AVE_Z) ? dim : 1; *nc = (i==AVE_A) ? dim : i < CovList[cov->nr].kappas ? 1 : -1; } void ave(double *h, cov_model *cov, double *v) { // f = uAu +zu; bool spacetime = (bool) (PisNULL(AVE_SPACETIME) || P0INT(AVE_SPACETIME)); cov_model *next = cov->sub[0]; int i,j,k,d, dim = spacetime ? cov->tsdim - 1 : cov->tsdim; // dimP1 = dim + 1; double detEplus2B, Ah[AveMaxDim], Eplus2B[AveMaxDim], dummy, hh, *A = P(AVE_A), *z = P(AVE_Z), c = spacetime ? h[cov->tsdim-1] : 0.0; // Sockelwert fuer c hh = 0.0; for (k=d=0; dsub[0]; bool spacetime = (bool) (PisNULL(AVE_SPACETIME) || P0INT(AVE_SPACETIME)); int i, j, err, dim = cov->tsdim, spdim = spacetime ? dim - 1 : dim; double *A = P(AVE_A); char msg[2][4] = {"d", "d-1"}; if (cov->xdimown < 2) SERR("The spatial dimension must be at least 2."); if (dim > AveMaxDim) SERR2("For technical reasons max. dimension for ave is %d. Got %d.", AveMaxDim, dim); if (cov->ncol[AVE_A] != spdim || cov->nrow[AVE_A] != spdim) SERR5("A not %sx%s matrix, but %dx%d (dim=%d)", msg[spacetime], msg[spacetime], cov->ncol[AVE_A], cov->nrow[AVE_A], spdim); if (cov->ncol[AVE_Z] != 1 || cov->nrow[AVE_Z] != spdim) SERR1("z not (%s)-dim vector", msg[spacetime]); for (i=0; ixdimprev != cov->tsdim || cov->xdimprev != cov->tsdim) return ERRORDIM; if ((err = CHECK(next, dim, 1, PosDefType, XONLY, ISOTROPIC, SCALAR, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; next->delflag = DEL_COV; // set gatternr=nr, since non-negativity ensured if (!isNormalMixture(next->monotone)) return ERRORNORMALMIXTURE; if (CovList[next->nr].spectral == NULL) return ERRORSPECTRAL; // nicht gatter // updatepref(cov, next); ## gute idee? if (next->pref[SpectralTBM] == PREF_NONE) cov->pref[RandomCoin] = cov->pref[Average] = PREF_NONE; // kein setbackward?? // no setbackard return NOERROR; } void rangeave(cov_model VARIABLE_IS_NOT_USED *cov, range_type* ra){ int i; for (i=0; i<=1; i++) { ra->min[i] = RF_NEGINF; ra->max[i] = RF_INF; ra->pmin[i] = -10.0; ra->pmax[i] = 10.0; ra->openmin[i] = true; ra->openmax[i] = true; } ra->min[2] = 0; ra->max[2] = 1; ra->pmin[2] = 0; ra->pmax[2] = 1; ra->openmin[2] = false; ra->openmax[2] = false; } void sd_avestp(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *S, int dim, double *sd){ ///// window_info *w = &(S->window); int d; double b, alphamin, x2, InvSqrt2a, EmA, *q = cov->q; // see article/GEOSTATS/simuspacetime/simuspacetime2008/simuspacetime.tex // for the reasoning of these calculations BUG; assert(cov->role == Average); q[AVESTP_LOGV] = log(q[AVESTP_V]); for (x2=0.0, d=0; dmax[d] - w->min[d]; x2 += lensimu * lensimu; } // x2 *= 0.25; b = 3.0 * q[AVESTP_V] * x2 / dim; alphamin = (4.0 + 4.0 * b - 2.0 * sqrt(4 * b * b + 8.0 * b + 1.0)) / 3.0; InvSqrt2a = 1.0 / sqrt(2.0 * alphamin * 6.0 * q[AVESTP_V]); *sd = InvSqrt2a; EmA = 1.0 - alphamin; cov->mpp.maxheights[0] = exp(-0.5 * log(EmA) - 0.25 * log(alphamin) + b / EmA - 2 * x2); // proportional zum dritten Moment ! /* double radius = sqrt((-9 // so e^{-9} as threshold - 0.25 * dim * (q[AVESTP_LOGV] - 1.14473) // log pi - 0.25 * q[AVESTP_LOGDET] //+ 0.5 * cov_a->logdens - q[AVESTP_LOGMIXDENS] ) / ( - q[AVESTP_MINEIGEN] * q[AVESTP_V]) ); // ??? assert(radius > 0); */ // if (cov->mpp.refradius<0 || radius < cov->mpp.refradius) // cov->mpp.refradius = radius; } int structAve(cov_model *cov, cov_model **newmodel) { cov_model *shape, *gaussmix; int err; ASSERT_NEWMODEL_NOT_NULL; if (cov->role != Average) ILLEGAL_ROLE; if ((err = covcpy(newmodel, cov)) != NOERROR) return err; shape = *newmodel; shape->nr = SHAPEAVE; addModel(shape, AVE_GAUSS, GAUSS); gaussmix = shape->sub[AVE_GAUSS]; gaussmix->tsdim = 1; gaussmix->role = ROLE_GAUSS; gaussmix->method = SpectralTBM; return NOERROR; } void logshapeave(double *x, cov_model *cov, double *v, double *sign) { // nur stationaer bool spacetime = (bool) (PisNULL(AVE_SPACETIME) || P0INT(AVE_SPACETIME)); int d, j, k, dim = spacetime ? cov->tsdim - 1 : cov->tsdim; double f, dummy, r2, *A = P(AVE_A), *z = P(AVE_Z), t = spacetime ? x[cov->tsdim-1] : 0.0, *q = cov->q; f = r2 = 0.0; for (k=d=0; dnr].logmixdens(x, q[AVESTP_LOGV], phi); /* g */// nicht gatternr ; sign[0] = 1.0; double phase = q[AVERAGE_YPHASE] + q[AVERAGE_YFREQ] * (f - t); // Y sign[1] = phase > 0.0 ? 1.0 : phase < 0.0 ? -1.0 : 0.0; v[1] = log(fabs(phase)); } int check_shapeave(cov_model *cov) { if (cov->sub[AVE_GAUSS] == NULL) SERR1("both submodels must be set to '%s'", CovList[GAUSS].nick); cov->mpp.maxheights[0] = RF_NA; return checkave(cov); // !! not next } int init_shapeave(cov_model *cov, gen_storage *s) { ASSERT_GAUSS_METHOD(Average); cov_model *gaussmix = cov->sub[AVE_GAUSS]; double sd, *q = cov->q; bool spacetime = (bool) (PisNULL(AVE_SPACETIME) || P0INT(AVE_SPACETIME)); int err = NOERROR, dim = spacetime ? cov->tsdim - 1 : cov->tsdim; q[AVESTP_V] = 0.0; q[AVESTP_MINEIGEN] = 1.0; q[AVESTP_LOGDET] = 0.0; sd_avestp(cov, s, dim, &sd); // sd->gauss assert(cov->vdim2[0] == 1); assert(cov->vdim2[0] == cov->vdim2[1]); if (cov->mpp.moments >= 0) { cov->mpp.mM[0] = cov->mpp.mMplus[0] = 1.0; if (cov->mpp.moments >= 1) { if ((err = INIT(gaussmix, cov->mpp.moments, s)) != NOERROR) return err; if (cov->mpp.moments >= 2) { cov->mpp.mM[2] = 1.0; } } } //cov->mpp.loc_done = true; //cov->mpp.refsd = sd; return err; } void do_shapeave(cov_model *cov, gen_storage *S) { // Simulation of V; sopee Bernoulli Sec. 4.2 cov_model *aveGAUSS = cov->sub[AVE_GAUSS], *phi = cov->sub[AVE_PHI]; double spec_ret[StpMaxDim], sd, *q = cov->q; bool spacetime = (bool) (PisNULL(AVE_SPACETIME) || P0INT(AVE_SPACETIME)); int dim = spacetime ? cov->tsdim - 1 : cov->tsdim; CovList[phi->nr].drawmix(phi, q + AVESTP_V); // nicht gatternr sd_avestp(cov, S, dim, &sd); // sd->gauss BUG; SPECTRAL(aveGAUSS, S, spec_ret); // nicht gatternr q[AVERAGE_YFREQ] = *spec_ret * q[AVESTP_V]; q[AVERAGE_YPHASE] = TWOPI * UNIFORM_RANDOM; BUG; // what to do with the next line? // info->logdens = CovList[phi->nr].logmixdens(ZERO, q[AVESTP_LOGV], phi); } /* coxgauss, cmp with nsst1 !! */ // C = 2 (C + 4 M H M), H = h h^t // a = t - h M h - zh // exp(- 0.5 * (h *h + 2 a^2 - mu C mu)) // stimmen die Vorzeichen?? // mu = h - 2 a M h /* cox, cmp with nsst1 !! */ // coxisham #define COX_MU 0 #define COX_D 1 #define COX_BETA 2 void GetEu2Dinv(cov_model *cov, double *x, int dim, double *det, double *Eu2Dinv, double *newxsq, double *newx, double *z) { double y[CoxMaxDim], *V = P(COX_MU), *D= P(COX_D), beta = P0(COX_BETA), t = x[dim], t2 = pow(fabs(t), beta); // standard t^2 int d, dimP1 = dim + 1, dimsq = dim * dim; for (d=0; dtsdim - 1; break; case COX_D : *nc = *nr = cov->tsdim - 1; break; case COX_BETA : *nc = *nr = 1; break; default: *nc = *nr = -1; } } void cox(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; int dim = cov->tsdim - 1, dimsq = dim * dim; double det, newx, newxsq; //PMI(cov, "cox"); ALLOC_EXTRA(Eu2Dinv, dimsq); GetEu2Dinv(cov, x, dim, &det, Eu2Dinv, &newxsq, &newx, NULL); COV(&newx, next, v); *v /= sqrt(det); } void coxhess(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; int tsdim = cov->tsdim, dim = tsdim - 1, dimsq = dim * dim; double z[CoxMaxDim], det, newx, newxsq, phiD, phiD2; ALLOC_EXTRA(Eu2Dinv, dimsq); GetEu2Dinv(cov, x, dim, &det, Eu2Dinv, &newxsq, &newx, z); Abl2(&newx, next, &phiD2); if (newxsq == 0.0) { cpyUf(Eu2Dinv, phiD2 / sqrt(det), dim, tsdim, v); } else { Abl1(&newx, next, &phiD); cpyUf(Eu2Dinv, phiD / (sqrt(det) * newx), dim, tsdim, v); addzzT(v, (phiD2 - phiD/newx) / (sqrt(det) * newxsq), z, dim, tsdim); } } void coxnabla(double *x, cov_model *cov, double *v) { cov_model *next = cov->sub[0]; int d, tsdim = cov->tsdim, dim = tsdim - 1, dimsq=dim * dim; double z[CoxMaxDim], det, newx, newxsq, phiD, factor; ALLOC_EXTRA(Eu2Dinv, dimsq); GetEu2Dinv(cov, x, dim, &det, Eu2Dinv, &newxsq, &newx, z); if (newxsq == 0.0) { for (d=0; d<=dim; d++) v[d] = 0.0; } else { newx = sqrt(newxsq); Abl1(&newx, next, &phiD); factor = phiD / (det * newx); for (d=0; dsub[0]; int err, i, dim = cov->tsdim - 1, dimsq = dim * dim; // APMI(cov); //printf("AAAAAAAAAAAA\n"); if (cov->xdimown < 2) SERR("The space-time dimension must be at least 2."); if (cov->ncol[COX_MU] != 1 || cov->nrow[COX_MU] != dim) { // print("%d %d %d\n", cov->nrow[COX_MU], dim,cov->nrow[COX_MU] != dim); if (cov->ncol[COX_MU] == dim && cov->nrow[COX_MU] == 1) { cov->nrow[COX_MU] = dim; cov->ncol[COX_MU] = 1; } else { SERR3("mu is not given or not a vector of dimen. %d (nrow=%d ncol=%d)", dim, cov->nrow[COX_MU], cov->ncol[COX_MU]); } } // is matrix positive definite? if (PisNULL(COX_D)) { PALLOC(COX_D, dim, dim); for (i=0; irole // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; if (cov->tsdim != 3) cov->pref[SpectralTBM] = PREF_NONE;; next->delflag = DEL_COV; // set gatternr=nr, since non-negativity ensured if (!isNormalMixture(next->monotone)) return ERRORNORMALMIXTURE; if (CovList[next->nr].spectral == NULL) return ERRORSPECTRAL; // nicht gatternr // no setbackard updatepref(cov, next); if (P0(COX_BETA) != 2.0) cov->pref[SpectralTBM] = 0; cov->hess = true; EXTRA_STORAGE; return NOERROR; } void rangecox(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[COX_MU] = RF_NEGINF; range->max[COX_MU] = RF_INF; range->pmin[COX_MU] = -100.0; range->pmax[COX_MU] = +100.0; range->openmin[COX_MU] = true; range->openmax[COX_MU] = true; range->min[COX_D] = RF_NEGINF; range->max[COX_D] = RF_INF; range->pmin[COX_D] = -100.0; range->pmax[COX_D] = +100.0; range->openmin[COX_D] = false; range->openmax[COX_D] = false; range->min[COX_BETA] = 0.0; range->max[COX_BETA] = 2.0; range->pmin[COX_BETA] = 0.1; range->pmax[COX_BETA] = 2.0; range->openmin[COX_BETA] = true; range->openmax[COX_BETA] = false; } int initcox(cov_model *cov, gen_storage *s) { // PMI(cov); ASSERT_GAUSS_METHOD(SpectralTBM); cov_model *next = cov->sub[0]; return INIT(next, 0, s); } void spectralcox(cov_model *cov, gen_storage *s, double *e) { cov_model *next = cov->sub[0]; int d, dim = cov->tsdim - 1; double t, v[CoxMaxDim], *V = P(COX_MU), rho= P0(COX_D); SPECTRAL(next, s, e); // nicht gatternr v[0] = rnorm(0.0, INVSQRTTWO); v[1] = rho * v[0] + sqrt(1 - rho * rho) * rnorm(0.0, INVSQRTTWO); for (t = 0.0, d=0; dtsdim : 1; *nr = i < CovList[cov->nr].kappas ? cov->tsdim : -1; } void stp(double *x, double *y, cov_model *cov, double *v) { int d, j, k, dim =cov->tsdim, dimsq = dim * dim; double h[StpMaxDim], Mh[StpMaxDim], hSx[StpMaxDim], Syh[StpMaxDim], xi2x, xi2y, detA, hMh, cxy, zh, Q, Amux[StpMaxDim], Amuy[StpMaxDim], // Q2, Q3, *Sc = P(STP_S), *M = P(STP_M), *z = P(STP_Z); cov_model *phi = cov->sub[STP_PHI], *Sf = cov->kappasub[STP_S], *xi2 =cov->sub[STP_XI2]; ALLOC_EXTRA(Sx, dimsq); ALLOC_EXTRA2(Sy, dimsq); ALLOC_EXTRA3(A, dimsq); if (Sf != NULL) { FCTN(x, Sf, Sx); // symmetric, pos definite !! FCTN(y, Sf, Sy); // // if (false) { // int ii; // printf("x=%f %f y=%f %f\n", x[0], x[1], y[0], y[1]); //for (ii=0; ii<4; ii++) printf("%f ", Sx[ii]); // printf("\n"); // for (ii=0; ii<4; ii++) printf("%f ", Sy[ii]); // printf("\n"); // } //APMI(Sf); } else { int bytes = sizeof(double) * dimsq; MEMCOPY(Sx, Sc, bytes); MEMCOPY(Sy, Sc, bytes); } if (xi2 != NULL) { FCTN(x, xi2, &xi2x); FCTN(y, xi2, &xi2y); } else { xi2x = xi2y = 0.0; } for (k=0, d=0; dgatternr].aux_cov) != NULL) auxcf(x, y, Q, phi, v); else FCTN(&Q, phi, v); double dx = detU(Sx, dim), dy = detU(Sy, dim); *v *= pow(2.0, 0.5 * double(dim)) * pow(dx * dy / (detA * detA), 0.25); } int checkstp(cov_model *cov){ cov_model *phi = cov->sub[STP_PHI], *Sf = cov->kappasub[STP_S], *xi2 =cov->sub[STP_XI2]; int err; int dim = cov->tsdim; if (dim > StpMaxDim) SERR2("For technical reasons max. dimension for ave is %d. Got %d.", StpMaxDim, cov->xdimprev); if (PisNULL(STP_S) && Sf==NULL) { // Sc if ((cov->px[STP_S] = EinheitsMatrix(dim)) == NULL) return ERRORMEMORYALLOCATION; cov->ncol[STP_S] = cov->nrow[STP_S] = dim; } if (PisNULL(STP_M)) { // M if ((cov->px[STP_M] = EinheitsMatrix(dim)) == NULL) return ERRORMEMORYALLOCATION; cov->ncol[STP_M] = cov->nrow[STP_M] = dim; } if (PisNULL(STP_Z)) { // z PALLOC(STP_Z, dim, 1); } if (cov->xdimprev != cov->tsdim || cov->xdimprev != cov->tsdim) return ERRORDIM; if ((err = CHECK(phi, dim, 1, PosDefType, XONLY, ISOTROPIC, SCALAR, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; if (!isNormalMixture(phi->monotone)) return ERRORNORMALMIXTURE; cov->pref[Average] = 5; if (Sf != NULL) { if ((err = CHECK(Sf, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, dim, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; } if (xi2 != NULL) { if ((err = CHECK(xi2, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; } // kein setbackward?? EXTRA_STORAGE; cov->mpp.maxheights[0] = RF_NA; return NOERROR; } void rangestp(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ int i; for (i=0; i<=2; i++) { /* S, M, z */ range->min[i] = RF_NEGINF; range->max[i]= RF_INF; range->pmin[i] = -1e10; range->pmax[i] = 1e10; range->openmin[i] = true; range->openmax[i] = true; } } int structStp(cov_model *cov, cov_model **newmodel) { cov_model *shape; int err; ASSERT_NEWMODEL_NOT_NULL; if (cov->role != Average) ILLEGAL_ROLE; if ((err = covcpy(newmodel, cov)) != NOERROR) return err; shape = *newmodel; shape->nr = SHAPESTP; addModel(shape, STP_GAUSS, GAUSS); shape->sub[STP_GAUSS]->tsdim = 1; return NOERROR; } int check_shapestp(cov_model *cov) { if (cov->sub[AVE_GAUSS] == NULL) SERR1("both submodels must be set to '%s'", CovList[GAUSS].nick); EXTRA_STORAGE; return checkstp(cov); // !! not next } int init_shapestp(cov_model *cov, gen_storage *s) { ASSERT_GAUSS_METHOD(Average); cov_model *Sf = cov->kappasub[STP_S], *gaussmix = cov->sub[STP_GAUSS]; double sd, *q = cov->q; int err = NOERROR; if (Sf != NULL) { double minmax[2]; assert(CovList[Sf->nr].minmaxeigenvalue != NULL); CovList[Sf->nr].minmaxeigenvalue(Sf, minmax); if (minmax[0] <= 0.0) error("neg eigenvalue in shape function of 'stp'"); q[AVESTP_MINEIGEN] = minmax[0]; q[AVESTP_LOGDET] = (double) cov->xdimprev * log(minmax[1]); } else { #define dummyN 5 * StpMaxDim double value[StpMaxDim], ivalue[StpMaxDim], dummy[dummyN], det, min = RF_INF; int i, Ferr, dim = cov->tsdim, ndummy = dummyN; F77_NAME(dgeev)("No", "No", &dim, P(STP_S), &dim, value, ivalue, NULL, &dim, NULL, &dim, dummy, &ndummy, &Ferr); if (Ferr != 0) SERR("error in F77 function call"); det = 1.0; for (i=0; i v) min = v; //if (max < value[i]) max = v; } q[AVESTP_MINEIGEN] = min; q[AVESTP_LOGDET] = log(det); } q[AVESTP_LOGV] = 0.0; q[AVESTP_LOGMIXDENS] = 0.0; sd_avestp(cov, s, cov->tsdim, &sd); // sd->gauss assert(cov->vdim2[0] == 1); assert(cov->vdim2[0] == cov->vdim2[1]); if (cov->mpp.moments >= 0) { cov->mpp.mM[0] = cov->mpp.mMplus[0] = 1.0; //// ??? notwendig if (cov->mpp.moments >= 1) { if ((err = INIT(gaussmix, 2, s)) != NOERROR) return err; if (cov->mpp.moments >= 2) cov->mpp.mM[2] = 1.0; } } //cov->mpp.loc_done = true; //cov->mpp.refsd = sd; return err; } void do_shapestp(cov_model *cov, gen_storage *s) { // Simulation of V; see Bernoulli Sec. 4.2 cov_model *stpGAUSS = cov->sub[STP_GAUSS], *phi = cov->sub[STP_PHI]; double spec_ret[StpMaxDim], sd, *q = cov->q; CovList[phi->nr].drawmix(phi, &(q[AVESTP_V])); sd_avestp(cov, s, cov->tsdim, &sd); // sd->gauss BUG; SPECTRAL(stpGAUSS, s, spec_ret); // nicht gatternr q[AVERAGE_YFREQ] = *spec_ret * sqrt(q[AVESTP_V]); q[AVERAGE_YPHASE] = TWOPI * UNIFORM_RANDOM; BUG; /// what to do with the next line? // info->logdens = CovList[phi->nr].logmixdens(ZERO, q[AVESTP_LOGV], phi); //info->radius = RF_INF; // info-sd s.o. } void logshapestp(double *x, double *u, cov_model *cov, double *v, double *sign){ // kann um ca. Faktor 2 beschleunigt werden, wenn // Sx , logdetU, Hx fuer alle x abgespeichert werden // und die Werte dann aus dem Speicher gelesen werden // jedoch sehr Speicherintensiv. MEMCOPY braucht man auch nicht cov_model *Sf = cov->kappasub[STP_S], *xi2 =cov->sub[STP_XI2]; int j, k, d, dim= cov->xdimprev, dimsq = dim * dim, bytes = sizeof(double) * dimsq; double h[StpMaxDim], hSxh, hSx, xi, Mhd, *Sc = P(STP_S), *M = P(STP_M), *z = P(STP_Z), *q = cov->q; ALLOC_EXTRA(Sx, dimsq); if (Sf == NULL) { MEMCOPY(Sx, Sc, bytes); } else { FCTN(x, Sf, Sx); // symmetric, pos definite !! } if (xi2 == NULL) { xi = 0.0; } else { FCTN(x, xi2, &xi); } for (k=0, d=0; dnr].logmixdens(x, q[AVESTP_LOGV], phi) // g //nicht gatternr // - 0.5 * cov_a->logdens // f ; // 1 / sqrt(f) if (!(exponent < 5.0) && PL >= PL_DETAILS) { if (!(exponent < 6.0)) // could be NA, too PRINTF("\n%f logDetU=%f %f expon=%f", 0.25 * dim * (// M_LN2 + ??? !!! Rechnung!!! q[AVESTP_LOGV] - 2.0 * M_LN_SQRT_PI) // (2V/pi)^{d/4} , 0.25 * log(detU(Sx, dim)) /// Sx ^1/4 , -q[AVESTP_V]* hSxh // exp(-V(U-x) S (U-x)) // , CovList[phi->nr].logmixdens(x, q[AVESTP_LOGV], phi)// g //, - 0.5 * cov_a->logdens // f , exponent); else PRINTF("!"); }; assert(exp(exponent) < 10000000.0); double cos_value = cos(q[AVERAGE_YPHASE] + q[AVERAGE_YFREQ] * xi); *v = exponent + log(fabs(cos_value)) ; // Y *sign = cos_value > 0.0 ? 1.0 : cos_value < 0.0 ? -1.0 : 0.0; } /* Whittle-Matern or Whittle or Besset */ #define RATIONAL_A 0 #define RATIONAL_a 1 void kappa_rational(int i, cov_model *cov, int *nr, int *nc){ *nc = (i == RATIONAL_A) ? cov->tsdim : 1; *nr = (i == RATIONAL_A) ? cov->tsdim : (i==RATIONAL_a) ? 2 : -1; } void minmaxEigenrational(cov_model *cov, double *mm) { double *a = P(RATIONAL_a); if (a[0] < a[1]) { mm[0] = a[0]; mm[1] = a[1]; } else { mm[0] = a[1]; mm[1] = a[0]; } } double maxEigenrational(cov_model VARIABLE_IS_NOT_USED *cov, double VARIABLE_IS_NOT_USED *mm) { double *a = P(RATIONAL_a); return (a[0] > a[1]) ? a[0] : a[1]; } void rational(double *x, cov_model *cov, double *v) { int i, k, j, dim = cov->tsdim; double nu, *A = P(RATIONAL_A), *a = P(RATIONAL_a); nu = 0.0; for (k=0, i=0; inrow[RATIONAL_a] == 1) { double dummy = P0(RATIONAL_a); free(P(RATIONAL_a)); PALLOC(RATIONAL_a, 2, 1); P(RATIONAL_a)[0] = dummy; P(RATIONAL_a)[1] = 0.0; } if ((err = checkkappas(cov)) != NOERROR) return err; cov->mpp.maxheights[0] = P(RATIONAL_a)[0] > P(RATIONAL_a)[1] ? P(RATIONAL_a)[0] : P(RATIONAL_a)[1]; return NOERROR; } void rangerational(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[RATIONAL_A] = RF_NEGINF; range->max[RATIONAL_A] = RF_INF; range->pmin[RATIONAL_A] = -1e10; range->pmax[RATIONAL_A] = 1e10; range->openmin[RATIONAL_A] = true; range->openmax[RATIONAL_A] = true; range->min[RATIONAL_a] = 0.0; range->max[RATIONAL_a] = RF_INF; range->pmin[RATIONAL_a] = 0.0; range->pmax[RATIONAL_a] = 10; range->openmin[RATIONAL_a] = false; range->openmax[RATIONAL_a] = true; } // Sigma(x) = diag>0 + A'xx'A #define EAXXA_E 0 #define EAXXA_A 1 #define ETAXXA_ALPHA 2 void kappa_EAxxA(int i, cov_model *cov, int *nr, int *nc){ *nc = (EAXXA_A == i) ? cov->tsdim : 1; *nr = i < CovList[cov->nr].kappas ? cov->tsdim : -1; } void EAxxA(double *x, cov_model *cov, double *v) { int d, k, j, dim = cov->tsdim; double xA[EaxxaMaxDim], *E = P(EAXXA_E), *A = P(EAXXA_A); for (k=0, d=0; dtsdim; for (mm[0] = RF_INF, mm[1]=RF_NEGINF, i=0; i mm[1]) mm[1] = E[i]; } } int checkEAxxA(cov_model *cov){ int err; // pref_type pref = // {5, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5}; // CE CO CI TBM Sp di sq Ma av n mpp Hy any // MEMCOPY(cov->pref, pref, sizeof(pref_type)); if (cov->xdimown > EaxxaMaxDim) SERR2("For technical reasons max. dimension for ave is %d. Got %d.", EaxxaMaxDim, cov->xdimown); if ((err = checkkappas(cov)) != NOERROR) return err; cov->vdim2[0] = cov->vdim2[1] = cov->tsdim; cov->mpp.maxheights[0] = RF_NA; return NOERROR; } void rangeEAxxA(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[EAXXA_E] = 0.0; range->max[EAXXA_E] = RF_INF; range->pmin[EAXXA_E] = 0.0001; range->pmax[EAXXA_E] = 10; range->openmin[EAXXA_E] = true; range->openmax[EAXXA_E] = true; range->min[EAXXA_A] = RF_NEGINF; range->max[EAXXA_A] = RF_INF; range->pmin[EAXXA_A] = -1e10; range->pmax[EAXXA_A] = 1e10; range->openmin[EAXXA_A] = true; range->openmax[EAXXA_A] = true; } // Sigma(x) = diag>0 + A'xx'A void kappa_EtAxxA(int i, cov_model VARIABLE_IS_NOT_USED *cov, int *nr, int *nc){ int tsdim = 3; // cov->tsdim *nc = (i == EAXXA_A) ? tsdim : 1; *nr = (i == EAXXA_E || i==EAXXA_A) ? tsdim : (i==ETAXXA_ALPHA) ? 1 : -1; } void EtAxxA(double *x, cov_model *cov, double *v) { int d, k, j, dim = cov->tsdim, time = dim - 1; double xAR[EaxxaMaxDim], R[9], *E = P(EAXXA_E), *A = P(EAXXA_A), phi = P0(ETAXXA_ALPHA), c = cos(phi * x[time]), s = sin(phi * x[time]); R[0] = R[4] = c; R[1] = s; R[3] = -s; R[2] = R[5] = R[6] = R[7] = 0.0; R[8] = 1.0; { double xA[EaxxaMaxDim]; for (k=0, d=0; dtsdim; for (mm[0] = RF_INF, mm[1]=RF_NEGINF, i=0; i mm[1]) mm[1] = E[i]; } } int checkEtAxxA(cov_model *cov){ int err; // pref_type pref = // {5, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5}; // CE CO CI TBM Sp di sq Ma av n mpp Hy any // MEMCOPY(cov->pref, pref, sizeof(pref_type)); if (cov->xdimown != 3) SERR("The space-time dimension must be 3."); cov->vdim2[0] = cov->vdim2[1] = cov->tsdim; if ((err = checkkappas(cov)) != NOERROR) return err; cov->mpp.maxheights[0] = RF_NA; return NOERROR; } void rangeEtAxxA(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ int i; for (i=0; i<=2; i++) { range->min[i] = RF_NEGINF; range->max[i] = RF_INF; range->pmin[i] = -1e10; range->pmax[i] = 1e10; range->openmin[i] = true; range->openmax[i] = true; } range->min[EAXXA_E] = 0.0; range->max[EAXXA_E] = RF_INF; range->pmin[EAXXA_E] = 0.0001; range->pmax[EAXXA_E] = 10; range->openmin[EAXXA_E] = true; range->openmax[EAXXA_E] = true; } // Sigma(x) = diag>0 + A'xx'A #define ROTAT_PHI 0 // both rotat and Rotat #define ROTAT_SPEED 1 void kappa_rotat(int i, cov_model *cov, int *nr, int *nc){ *nc = 1; *nr = i < CovList[cov->nr].kappas ? 1 : -1; } void rotat(double *x, cov_model *cov, double *v) { int dim = cov->tsdim, time = dim - 1; double speed = P0(ROTAT_SPEED), phi = P0(ROTAT_PHI), absx = sqrt(x[0] * x[0] + x[1] * x[1]); *v = (absx == 0.0) ? 0.0 : speed * (cos(phi * x[time]) * x[0] + sin(phi * x[time]) * x[1]) / absx; // print("%f\n", *v); } void minmaxEigenrotat(cov_model VARIABLE_IS_NOT_USED *cov, double *mm) { mm[0] = -1; mm[1] = 1; } int checkrotat(cov_model *cov){ int err; // if (cov->tsdim != 3) return("only 3-d allowed for rotat!"); // pref_type pref = // {5, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 5}; // CE CO CI TBM Sp di sq Ma av n mpp Hy any // MEMCOPY(cov->pref, pref, sizeof(pref_type)); if (cov->xdimown != 3) SERR("The space-time dimension must be 3."); if ((err = checkkappas(cov)) != NOERROR) return err; cov->mpp.maxheights[0] = RF_NA; return NOERROR; } void rangerotat(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ int i; for (i=0; i<2; i++) { range->min[i] = RF_NEGINF; range->max[i] = RF_INF; range->pmin[i] = -1e10; range->pmax[i] = 1e10; range->openmin[i] = true; range->openmax[i] = true; } } // Sigma(x) = diag>0 + A'xx'A void kappa_Rotat(int i, cov_model *cov, int *nr, int *nc){ *nc = 1; *nr = i < CovList[cov->nr].kappas ? 1 : -1; } void Rotat(double *x, cov_model *cov, double *v) { int d, k, j, dim = cov->tsdim, time = dim - 1; double phi = P0(ROTAT_PHI), c = cos(phi * x[time]), s = sin(phi * x[time]), R[9]; assert(dim ==3); R[0] = R[4] = c; R[1] = s; R[3] = -s; R[2] = R[5] = R[6] = R[7] = 0.0; R[8] = 1.0; for (k=0, d=0; dxdimown != 3) SERR("The space-time dimension must be 3."); if ((err = checkkappas(cov)) != NOERROR) return err; cov->vdim2[0] = cov->vdim2[1] = cov->tsdim; cov->mpp.maxheights[0] = RF_NA; return NOERROR; } void rangeRotat(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[ROTAT_PHI] = RF_NEGINF; range->max[ROTAT_PHI] = RF_INF; range->pmin[ROTAT_PHI] = -1e10; range->pmax[ROTAT_PHI] = 1e10; range->openmin[ROTAT_PHI] = true; range->openmax[ROTAT_PHI] = true; } /* Whittle-Matern or Whittle or Besset */ // statt 0 Parameter: 2 Parameter, M und z fuer xi void kappaNonStWM(int i, cov_model *cov, int *nr, int *nc){ *nc = 1; *nr = i < CovList[cov->nr].kappas ? 1 : -1; } void NonStWMQ(double *x, double *y, double sqrtQ, cov_model *cov, double *v){ // check calling functions, like hyperbolic and gneiting if any changings !! double loggamma, nuxy, nux, nuy; cov_model *nu = cov->kappasub[WM_NU]; if (nu == NULL) { nuxy = P0(WM_NU); loggamma = lgammafn(nuxy); } else { FCTN(x, nu, &nux); FCTN(y, nu, &nuy); nuxy = 0.5 * (nux + nuy); loggamma = 0.5 * (lgammafn(nux) + lgammafn(nuy)); } if (sqrtQ == 0.0) { *v = 1.0; return; } *v = 2.0 * exp(nuxy * log(0.5 * sqrtQ) - loggamma + log(bessel_k(sqrtQ, nuxy, 2.0)) - sqrtQ); } void NonStWM(double *x, double *y, cov_model *cov, double *v){ // check calling functions, like hyperbolic and gneiting if any changings !! int d, dim = cov->tsdim; double Q=0.0; // assert(false); for (d=0; dkappasub[WM_NU]; int err, dim = cov->tsdim; NotProgrammedYet(""); if (PisNULL(WM_NU) && nu==NULL) SERR1("'%s' is missing", KNAME(WM_NU)); if (isRandom(CovList[cov->nr].kappaParamType[WM_NU])) SERR1("only deterministic models for '%s' are allowed.\nHowever these models can have random parameters.", KNAME(WM_NU)); if (nu != NULL) { if ((err = CHECK(nu, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; if (nu->tsdim != cov->tsdim) return ERRORWRONGDIM; } //PMI(cov); // no setbackard !! return NOERROR; } sortsofparam paramtype_nonstWM(int VARIABLE_IS_NOT_USED k, int VARIABLE_IS_NOT_USED row, int VARIABLE_IS_NOT_USED col) { return CRITICALPARAM; } void rangeNonStWM(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[WM_NU] = 0.0; range->max[WM_NU] = RF_INF; range->pmin[WM_NU] = 1e-2; range->pmax[WM_NU] = 10.0; range->openmin[WM_NU] = true; range->openmax[WM_NU] = true; } // using nu^(-1-nu+a)/2 for g and v^-a e^{-1/4v} as density instead of frechet // the bound 1/3 can be dropped // static double eM025 = exp(-0.25); //void DrawMixNonStWM(cov_model *cov, double *random) { // inv scale // // V ~ F in stp // cov_model *nu = cov->sub[WM_NU]; // double minnu; // double alpha; // // if (nu == NULL) { // minnu = P(WM_NU][0]; // } else { // double minmax[2]; // CovList[nu->nr].minmaxeigenvalue(nu, minmax); // minnu = minmax[0]; // } // alpha = 1.0 + 0.5 /* 0< . < 1*/ * (3.0 * minnu - 0.5 * cov->tsdim); // if (alpha > 2.0) alpha = 2.0; // original choice // if (alpha <= 1.0) ERR("minimal nu too low or dimension too high"); // // error("logmixdensnonstwm not programmed yet"); /* double beta = GLOBAL.mpp.beta, p = GLOBAL.mpp.p, logU; if (UNIFORM_RANDOM < p){ cov_a->WMalpha = beta; logU = log(UNIFORM_RANDOM * eM025); cov_a->WMfactor = -0.5 * log(0.25 * p * (beta - 1.0)) + 0.25; } else { cov_a->WMalpha = alpha; logU = log(eM025 + UNIFORM_RANDOM * (1.0 - eM025)); cov_a->WMfactor = -0.5 * log(0.25 * (1.0 - p) * (alpha - 1.0)); } logmix!! *random = log(-0.25 / logU) / (cov_a->WMalpha - 1.0); //=invscale */ //} //double LogMixDensNonStWM(double *x, double logV, cov_model *cov) { // // g(v,x) in stp // double z = 0.0; // error("logmixdensnonstwm not programmed yet"); // wmfactor ist kompletter unsinn; die 2 Teildichten muessen addiert werden /* cov_model *calling = cov->calling, *Nu = cov->sub[0]; if (calling == NULL) BUG; double nu, alpha = cov_a->WMalpha, logV = cov_a->logV, V = cov_a->V; if (Nu == NULL) nu = P(WM_NU][0]; else FCTN(x, Nu, &nu); z = - nu * M_LN2 // in g0 // eine 2 kuerzt sich raus + 0.5 * ((1.0 - nu) // in g0 + alpha // lambda - 2.0 //fre* ) * logV - 0.5 * lgammafn(nu) // in g0 + cov_a->WMfactor // lambda - 0.125 / V // g: Frechet + 0.125 * pow(V, 1.0 - alpha); // lambda: frechet if (!(z < 7.0)) { static double storage = 0.0; if (gen_storage != logV) { if (PL >= PL_DETAILS) PRINTF("alpha=%f, is=%f, cnst=%f logi=%f lgam=%f loga=%f invlogs=%f pow=%f z=%f\n", alpha,V, (1.0 - nu) * M_LN2 , + ((1.0 - nu) * 0.5 + alpha - 2.0) * logV ,- 0.5 * lgammafn(nu) , -cov_a->WMfactor ,- 0.25 / V , + 0.25 * pow(V, - alpha) , z); storage = logV; } //assert(z < 10.0); } */ // return z; // //} /* nsst */ /* Tilmann Gneiting's space time models, part I */ #define NSST_DELTA 0 void nsst(double *x, cov_model *cov, double *v) { cov_model *subphi = cov->sub[0]; cov_model *subpsi = cov->sub[1]; double v1, v2, psi, phi, y; COV(ZERO, subpsi, &v1); COV(x + 1, subpsi, &v2); psi = sqrt(1.0 + v1 - v2); // C0 : C(0) oder 0 // Cx : C(x) oder -gamma(x) y = x[0] / psi; COV(&y, subphi, &phi); *v = pow(psi, -P0(NSST_DELTA)) * phi; } void TBM2nsst(double *x, cov_model *cov, double *v) { cov_model *subphi = cov->sub[0]; cov_model *subpsi = cov->sub[1]; double v1, v2, psi, phi, y; COV(ZERO, subpsi, &v1); COV(x + 1, subpsi, &v2); psi = sqrt(1.0 + v1 - v2); // C0 : C(0) oder 0 // Cx : C(x) oder -gamma(x) y = x[0] / psi; TBM2CALL(&y, subphi, &phi); *v = pow(psi, -P0(NSST_DELTA)) * phi; } void Dnsst(double *x, cov_model *cov, double *v) { cov_model *subphi = cov->sub[0]; cov_model *subpsi = cov->sub[1]; double v1, v2, psi, phi, y; COV(ZERO, subpsi, &v1); COV(x + 1, subpsi, &v2); psi = sqrt(1.0 + v1 - v2); // C0 : C(0) oder 0 // Cx : C(x) oder -gamma(x) y = x[0] / psi; Abl1(&y, subphi, &phi); *v = pow(psi, -P0(NSST_DELTA) - 1) * phi; // print("(%f %f %f)", psi, y, *v); } int checknsst(cov_model *cov) { cov_model *subphi = cov->sub[0]; cov_model *subpsi = cov->sub[1]; int err; if (cov->xdimown != 2) SERR("reduced dimension must be 2"); if ((err = checkkappas(cov)) != NOERROR) return err; cov->finiterange = false; if ((err = CHECK(subphi, cov->tsdim, 1, PosDefType, XONLY, ISOTROPIC, SCALAR, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; if (!isNormalMixture(subphi->monotone)) return(ERRORNORMALMIXTURE); setbackward(cov, subphi); assert(cov->finiterange != true); // if ((err = CHECK(subpsi, 1, 1, NegDefType, XONLY, ISOTROPIC, SCALAR, cov->role // ROLE_COV changed 20.7.14 wg spectral )) != NOERROR) return err; subphi->delflag = subpsi->tsdim = DEL_COV-20; // kein setbackward(cov, subpsi); return NOERROR; } sortsofparam paramtype_nsst(int k, int VARIABLE_IS_NOT_USED row, int VARIABLE_IS_NOT_USED col) { return k==-1 ? VARPARAM : k==0 ? CRITICALPARAM : ANYPARAM; } void rangensst(cov_model *cov, range_type* range){ // print("dim min=%d\n", cov->tsdim - 1); range->min[NSST_DELTA] = cov->tsdim - 1; range->max[NSST_DELTA] = RF_INF; range->pmin[NSST_DELTA] = cov->tsdim - 1; range->pmax[NSST_DELTA] = 10.0; range->openmin[NSST_DELTA] = false; range->openmax[NSST_DELTA] = true; } RandomFields/src/plusmalS.cc0000644000175100001440000027053112412655466015560 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de Definition of auxiliary correlation functions Note: * Never use the below functions directly, but only by the functions indicated in RFsimu.h, since there is gno error check (e.g. initialization of RANDOM) * VARIANCE, SCALE are not used here * definitions for the random coin method can be found in MPPFcts.cc * definitions for genuinely anisotropic or nonsta tionary models are in SophisticatedModel.cc; hyper models also in Hypermodel.cc Copyright (C) 2001 -- 2003 Martin Schlather Copyright (C) 2004 -- 2004 Yindeng Jiang & Martin Schlather Copyright (C) 2005 -- 2014 Martin Schlather This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "RF.h" #include "Covariance.h" #include //#include //#include //#include // $ void kappaS(int i, cov_model *cov, int *nr, int *nc){ switch(i) { case DVAR : case DSCALE : *nr = *nc = 1; break; case DANISO : *nr = cov->xdimown; *nc = SIZE_NOT_DETERMINED; break; case DAUSER : *nr = SIZE_NOT_DETERMINED; *nc = cov->xdimown; break; case DPROJ : *nr = SIZE_NOT_DETERMINED; *nc = 1; break; default : *nr = *nc = -1; } } // simple transformations as variance, scale, anisotropy matrix, etc. void Siso(double *x, cov_model *cov, double *v){ // printf("call Siso %s %s %s\n", NAME(cov), NAME(cov->calling), // isDollar(cov) ? NAME(cov->sub[0]) : "-"); //PMI(cov); cov_model *next = cov->sub[DOLLAR_SUB]; int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim; double y, *aniso=P(DANISO), *scale =P(DSCALE), var = P0(DVAR); // printf("\nSiso\n"); y = *x; if (aniso != NULL) y = fabs(y * aniso[0]); if (scale != NULL) y = scale[0]>0.0 ? y / scale[0] : (y == 0.0 && scale[0]==0.0) ? 0.0 : RF_INF; // letzteres darf nur passieren wenn dim = 1!! COV(&y, next, v); //printf("end isoS\n"); // PMI(cov); // PMI(cov->calling->calling); // print("$ %f %f %f %d\n", *x, var, v[0], vdimSq); for (i=0; isub[DOLLAR_SUB]; int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim; double y, *aniso=P(DANISO), *scale =P(DSCALE), logvar = log(P0(DVAR)); y = *x; if (aniso != NULL) y = fabs(y * aniso[0]); if (scale != NULL) y = scale[0]>0.0 ? y / scale[0] : (y == 0.0 && scale[0]==0.0) ? 0.0 : RF_INF; LOGCOV(&y, next, v, sign); for (i=0; isub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER]; double var = P0(DVAR), *scale =P(DSCALE), *aniso=P(DANISO); int i, nproj = cov->nrow[DPROJ], vdim = cov->vdim2[0], vdimSq = vdim * vdim; if (nproj > 0) { int *proj = PINT(DPROJ); ALLOC_DOLLAR(z, nproj); if (scale == NULL || scale[0] > 0.0) { if (scale == NULL) for (i=0; ivdim2[0]; ALLOC_DOLLAR(z, dim); FCTN(x, Aniso, z); if (sign == NULL) COV(z, next, v) else LOGCOV(z, next, v, sign); } else if (aniso==NULL && (scale == NULL || scale[0] == 1.0)) { if (sign==NULL) COV(x, next, v) else LOGCOV(x, next, v, sign); } else { int xdimown = cov->xdimown; double *xz; ALLOC_DOLLAR(z, xdimown); if (aniso!=NULL) { xA(x, aniso, cov->nrow[DANISO], cov->ncol[DANISO], z); xz = z; } else xz = x; if (scale != NULL) { if (scale[0] > 0.0) { double invscale = 1.0 / scale[0]; for (i=0; i < xdimown; i++) z[i] = invscale * xz[i]; } else { for (i=0; i < xdimown; i++) z[i] = (xz[i] == 0.0 && scale[0] == 0.0) ? 0.0 : RF_INF; } } if (sign==NULL) COV(z, next, v) else LOGCOV(z, next, v, sign); } if (sign==NULL) { for (i=0; isub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER]; double *z1, *z2, var = P0(DVAR), *scale =P(DSCALE), *aniso=P(DANISO); int i, nproj = cov->nrow[DPROJ], vdim = cov->vdim2[0], vdimSq = vdim * vdim; // PMI(cov, "$$$$"); if (nproj > 0) { int *proj = PINT(DPROJ); ALLOC_DOLLARY(Z1, Z2, nproj); z1 = Z1; z2 = Z2; if (scale==NULL || scale[0] > 0.0) { double invscale = scale==NULL ? 1.0 : 1.0 / scale[0]; for (i=0; ivdim2[0]; ALLOC_DOLLARY(Z1, Z2, dim); z1 = Z1; z2 = Z2; FCTN(x, Aniso, z1); FCTN(y, Aniso, z2); if (sign == NULL) NONSTATCOV(z1, z2, next, v) else LOGNONSTATCOV(z1, z2, next, v, sign); } else if (aniso==NULL && (scale==NULL || scale[0] == 1.0)) { z1 = x; z2 = y; } else { int xdimown = cov->xdimown; double *xz1, *xz2; ALLOC_DOLLARY(Z1, Z2, xdimown); z1 = Z1; z2 = Z2; if (aniso != NULL) { xA( x, y, aniso,cov->nrow[DANISO], cov->ncol[DANISO], z1, z2); xz1 = z1; xz2 = z2; } else { xz1 = x; xz2 = y; } if (scale != NULL) { double s = scale[0]; if (s > 0.0) { double invscale = 1.0 / s; for (i=0; isub[DOLLAR_SUB]; location_type *locnext = Loc(next); assert(locnext != NULL); int i, err, tot, totSq, dim = loc->timespacedim, vdim = cov->vdim2[0]; double var = P0(DVAR); assert(dim == cov->tsdim); if ((err = alloc_cov(cov, dim, vdim, vdim)) != NOERROR) error("memory allocation error in 'covmatrixS'"); if ((!PisNULL(DSCALE) && P0(DSCALE) != 1.0) || !PisNULL(DANISO) || !PisNULL(DPROJ) || cov->kappasub[DSCALE] != NULL || cov->kappasub[DAUSER] != NULL || cov->kappasub[DPROJ] != NULL ) { CovarianceMatrix(cov, v); return; } if (next->xdimprev != next->xdimown) { //printf("%d %d\n", !PisNULL(DANISO), DANISO); // PMI(cov, -1); BUG; // fuehrt zum richtigen Resultat, sollte aber nicht // vorkommen! CovarianceMatrix(cov, v); return; } int next_gatter = next->gatternr, next_xdimgatter = next->xdimgatter, next_xdim = next->xdimprev; next->gatternr = cov->gatternr; next->xdimprev = cov->xdimprev; next->xdimgatter = cov->xdimgatter; CovList[next->nr].covmatrix(next, v);//hier wird uU next->totalpoints gesetzt next->gatternr = next_gatter; next->xdimgatter = next_xdimgatter; next->xdimprev = next_xdim; if (var == 1.0) return; // PMI(cov, "covmatrix S"); // if (locnext==NULL) loc_set(cov, locnext->totalpoints); tot = cov->vdim2[0] * locnext->totalpoints; totSq = tot * tot; for (i=0; isub[DOLLAR_SUB]; return (int) ((PisNULL(DSCALE) || P0(DSCALE) ==1.0) && cov->kappasub[DAUSER]==NULL && PARAMisNULL(sub, DPROJ) && PARAMisNULL(sub, DANISO)) * CovList[sub->nr].is_covariance(cov); } void DS(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[DOLLAR_SUB]; assert(cov->kappasub[DAUSER] == NULL); int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim, nproj = cov->nrow[DPROJ]; double y[2], varSc, *scale =P(DSCALE), *aniso=P(DANISO), spinvscale = 1.0; if (aniso != NULL) { spinvscale *= aniso[0]; // was passiert, wenn es aniso nicht vom TypeIso ist ?? } if (scale != NULL) spinvscale /= scale[0]; varSc = P0(DVAR) * spinvscale; if (nproj == 0) { y[0] = x[0] * spinvscale; y[1] = (cov->isoown==ISOTROPIC || cov->ncol[DANISO]==1) ? 0.0 : x[1] * aniso[3]; // temporal; temporal scale } else { BUG; // for (i=0; isub[DOLLAR_SUB]; assert(cov->kappasub[DAUSER] == NULL); int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim, nproj = cov->nrow[DPROJ], *proj = PINT(DPROJ); double y[2], varScSq, *scale =P(DSCALE), *aniso=P(DANISO), spinvscale = 1.0; if (aniso != NULL) { spinvscale *= aniso[0]; // was passiert, wenn es aniso nicht vom TypeIso ist ?? } if (scale != NULL) spinvscale /= scale[0]; varScSq = P0(DVAR) * spinvscale * spinvscale; if (nproj == 0) { y[0] = x[0] * spinvscale; y[1] = (cov->isoown==ISOTROPIC || cov->ncol[DANISO]==1) ? 0.0 : x[1] * aniso[3]; // temporal; temporal scale } else { BUG; for (i=0; isub[DOLLAR_SUB]; assert(cov->kappasub[DAUSER] == NULL); int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim, nproj = cov->nrow[DPROJ], *proj = PINT(DPROJ); double y[2], varScS3, *scale =P(DSCALE), *aniso=P(DANISO), spinvscale = 1.0; if (aniso != NULL) { spinvscale *= aniso[0]; // was passiert, wenn es aniso nicht vom TypeIso ist ?? } if (scale != NULL) spinvscale /= scale[0]; varScS3 = P0(DVAR) * spinvscale * spinvscale * spinvscale; if (nproj == 0) { y[0] = x[0] * spinvscale; y[1] = (cov->isoown==ISOTROPIC || cov->ncol[DANISO]==1) ? 0.0 : x[1] * aniso[3]; // temporal; temporal scale } else { BUG; for (i=0; isub[DOLLAR_SUB]; assert(cov->kappasub[DAUSER] == NULL); int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim, nproj = cov->nrow[DPROJ], *proj = PINT(DPROJ); double y[2], varScS4, *scale =P(DSCALE), *aniso=P(DANISO), spinvscale = 1.0; if (aniso != NULL) { spinvscale *= aniso[0]; // was passiert, wenn es aniso nicht vom TypeIso ist ?? } if (scale != NULL) spinvscale /= scale[0]; varScS4 = spinvscale * spinvscale; varScS4 *= varScS4 * P0(DVAR); if (nproj == 0) { y[0] = x[0] * spinvscale; y[1] = (cov->isoown==ISOTROPIC || cov->ncol[DANISO]==1) ? 0.0 : x[1] * aniso[3]; // temporal; temporal scale } else { BUG; for (i=0; isub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER]; if (Aniso != NULL) BUG; int i, endfor, dim = cov->nrow[DANISO],// == ncol == x d i m ? xdimown = cov->xdimown, nproj = cov->nrow[DPROJ]; double *xy, *vw, *scale =P(DSCALE), *aniso=P(DANISO), var = P0(DVAR); if (nproj != 0) BUG; if (dim != xdimown) BUG; if (aniso != NULL) { ALLOC_DOLLAR(z, xdimown); ALLOC_DOLLAR2(w, xdimown); xA(x, aniso, xdimown, xdimown, z); xy = z; vw = w; } else { xy = x; vw = v; } if (scale != NULL) { ALLOC_DOLLAR3(y, xdimown); assert(scale[0] > 0.0); double spinvscale = 1.0 / scale[0]; var *= spinvscale; if (!nabla) var *= spinvscale; // gives spinvscale^2 in case of hess for (i=0; isub[DOLLAR_SUB]; int i, idx[2] = {DAUSER, DPROJ}; double scale; for (i=0; i<2; i++) { if (cov->kappasub[idx[i]] != NULL) { char Msg[100]; sprintf(Msg, "inverse can only be calculated if '%s' is not an arbitrary function", KNAME(idx[i])); ERR(Msg); } } if (cov->kappasub[DSCALE] != NULL) { double left; NONSTATINVERSE(ZERO, cov->kappasub[DSCALE], &left, &scale); if (left < 0.0) ERR("scale not defined to be non-negative."); } else scale = PisNULL(DSCALE) ? 1.0 : P0(DSCALE); int dim = cov->xdimown, nproj = cov->nrow[DPROJ]; // *proj = (int *)P(DPROJ]; double y, s = 1.0, *aniso=P(DANISO), var = P0(DVAR); if (dim != 1) BUG; if (aniso != NULL) { if (isMiso(Type(aniso, cov->nrow[DANISO], cov->ncol[DANISO]))) s /= aniso[0]; else NotProgrammedYet(""); // to do } s *= scale; if (nproj == 0) { y= *x / var; // inversion, so variance becomes scale } else { BUG; //ERR("nproj is not allowed in invS"); } if (CovList[next->nr].inverse == ErrCov) BUG; //PMI(next); INVERSE(&y, next, v); for (i=0; isub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER]; int i, dim = cov->tsdim, nproj = cov->nrow[DPROJ]; // *proj = (int *)P(DPROJ]; double y, s = 1.0, *scale =P(DSCALE), *aniso=P(DANISO), var = P0(DVAR); if (nproj == 0) { y= *x / var; // inversion, so variance becomes scale } else { BUG; //ERR("nproj is not allowed in invS"); } if (CovList[next->nr].nonstat_inverse == ErrInverseNonstat) BUG; if (log) { NONSTATLOGINVERSE(&y, next, left, right); } else { NONSTATINVERSE(&y, next, left, right); } if (aniso != NULL) { if (isMiso(Type(aniso, cov->nrow[DANISO], cov->ncol[DANISO]))) s/=aniso[0]; else { dollar_storage *S = cov->Sdollar; int ncol = cov->ncol[DANISO], nrow = cov->nrow[DANISO], ncnr = ncol * nrow, bytes = ncnr * sizeof(double), size = ncol * sizeof(double); bool redo; if (ncol != nrow) BUG; if ((redo = S->save_aniso == NULL)) { S->save_aniso = (double *) MALLOC(bytes); S->inv_aniso = (double *) MALLOC(bytes); } ALLOC_DOLLAR4(LR, ncol); double *save = S->save_aniso, *inv = S->inv_aniso; if (!redo) { for (i=0; inr].inverse == ErrInverse) error("inverse of anisotropy matrix function unknown"); int nrow = Aniso->vdim2[0], ncol = Aniso->vdim2[1], size = nrow * sizeof(double); // printf("ncol %d %d\n", ncol, nrow); if (cov->xdimown != ncol || ncol != 1) error("anisotropy function not of appropriate form"); ALLOC_DOLLAR4(LR, nrow); MEMCOPY(LR, right, size); INVERSE(LR, Aniso, right); // printf("right %f->%f %f->%f", LR[0], right[0], LR[1], right[1]); MEMCOPY(LR, left, size); INVERSE(LR, Aniso, left); } if (scale != NULL) s *= scale[0]; if (s != 1.0) { for (i=0; icalling); } void nonstatinverseS(double *x, cov_model *cov, double *left, double*right) { nonstatinverseS(x, cov, left, right, false); } void nonstat_loginverseS(double *x, cov_model *cov, double *left, double*right){ nonstatinverseS(x, cov, left, right, true); } void coinitS(cov_model *cov, localinfotype *li) { cov_model *next = cov->sub[DOLLAR_SUB]; if ( CovList[next->nr].coinit == NULL) ERR("# cannot find coinit -- please inform author"); CovList[next->nr].coinit(next, li); } void ieinitS(cov_model *cov, localinfotype *li) { cov_model *next = cov->sub[DOLLAR_SUB]; if ( CovList[next->nr].ieinit == NULL) ERR("# cannot find ieinit -- please inform author"); CovList[next->nr].ieinit(next, li); } void tbm2S(double *x, cov_model *cov, double *v){ cov_model *next = cov->sub[DOLLAR_SUB]; cov_fct *C = CovList + next->nr; // kein gatternr, da isotrop double y[2], *xy, *scale =P(DSCALE), *aniso = P(DANISO); assert(cov->kappasub[DAUSER] == NULL); assert(cov->nrow[DPROJ] == 0); if (aniso!=NULL) { if (cov->ncol[DANISO]==2) { // turning layers y[0] = x[0] * aniso[0]; // spatial y[1] = x[1] * aniso[3]; // temporal assert(aniso[1] == 0.0 && aniso[2] == 0.0); if (y[0] == 0.0) C->cov(y, next, v); else C->tbm2(y, next, v); } else { assert(cov->ncol[DANISO]==1); if (cov->nrow[DANISO] == 1) { // turning bands y[0] = x[0] * aniso[0]; // purely spatial C->tbm2(y, next, v); } else { // turning layers, dimension reduction if (P0(DANISO) == 0.0) { y[0] = x[1] * aniso[1]; // temporal C->cov(y, next, v); } else { y[0] = x[0] * aniso[0]; // temporal C->tbm2(y, next, v); } } } xy = y; } else xy = x; if (scale != NULL) { double s = scale[0]; if (s > 0) { double invscale = 1.0 / s; if (cov->xdimown == 2){ y[0] = xy[0] * invscale; // spatial y[1] = xy[1] * invscale; // temporal if (y[0] == 0.0) C->cov(y, next, v); else C->tbm2(y, next, v); } else { y[0] = xy[0] * invscale; // purely spatial C->tbm2(y, next, v); } } else { y[0] = (s < 0.0 || xy[0] != 0.0) ? RF_INF : 0.0; if (cov->xdimown == 2) y[1] = (s < 0.0 || xy[1] != 0.0) ? RF_INF : 0.0; C->tbm2(y, next, v); } } *v *= P0(DVAR); } // TODO : Aniso=Matrix: direkte implementierung in S, // sodass nicht ueber initS gegangen werden muss, sondern // e < - e^\top Aniso int TaylorS(cov_model *cov) { cov_model *next = cov->sub[DOLLAR_SUB], *sub = cov->key == NULL ? next : cov->key; int i; if (PisNULL(DPROJ) && PisNULL(DANISO)) { double scale = PisNULL(DSCALE) ? 1.0 : P0(DSCALE); cov->taylorN = sub->taylorN; for (i=0; itaylorN; i++) { cov->taylor[i][TaylorPow] = sub->taylor[i][TaylorPow]; cov->taylor[i][TaylorConst] = sub->taylor[i][TaylorConst] * P0(DVAR) * pow(scale, -sub->taylor[i][TaylorPow]); } cov->tailN = sub->tailN; for (i=0; itailN; i++) { cov->tail[i][TaylorPow] = sub->tail[i][TaylorPow]; cov->tail[i][TaylorExpPow] = sub->tail[i][TaylorExpPow]; cov->tail[i][TaylorConst] = sub->tail[i][TaylorConst] * P0(DVAR) * pow(scale, -sub->tail[i][TaylorPow]); cov->tail[i][TaylorExpConst] = sub->tail[i][TaylorExpConst] * pow(scale, -sub->tail[i][TaylorExpPow]); } } else { cov->taylorN = cov->tailN = 0; } return NOERROR; } int checkS(cov_model *cov) { // hier kommt unerwartet ein scale == nan rein ?!! cov_model *next = cov->sub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER], *sub = cov->key == NULL ? next : cov->key; int i, err, xdimown = cov->xdimown, xdimNeu = xdimown, *proj = PINT(DPROJ), nproj = cov->nrow[DPROJ]; // bool skipchecks = GLOBAL.general.skipchecks; matrix_type type = TypeMany; assert(isAnyDollar(cov)); if (!isDollarProc(cov)) cov->nr = DOLLAR; // wegen nr++ unten ! // cov->q[1] not NULL then A has been given // if (cov->method == SpectralTBM && cov->xdimown != next->xdimprev) // return ERRORDIM; if ((err = checkkappas(cov, false)) != NOERROR) { return err; } kdefault(cov, DVAR, 1.0); bool angle = Aniso!=NULL && CovList[Aniso->nr].check == checkAngle; if (angle && PisNULL(DANISO) && PisNULL(DAUSER) && cov->xdimown == cov->tsdim) { int dim = cov->tsdim; if ((err = CHECK(Aniso, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, cov->role)) == NOERROR) { if (verysimple(Aniso)) { PALLOC(DAUSER, dim, dim); AngleMatrix(Aniso, P(DAUSER)); COV_DELETE(cov->kappasub + DAUSER); Aniso = cov->kappasub[DAUSER] = NULL; angle = false; //PMI(cov, -1); } } } if (cov->kappasub[DANISO] != NULL) SERR1("'%s' may not be a function.", KNAME(DANISO)); if (!PisNULL(DAUSER)) { if (GLOBAL.internal.warn_Aniso) { PRINTF("NOTE! Starting with RandomFields 3.0, the use of '%s' is different from\n the former 'aniso' insofar that '%s' is multiplied from the right by 'x'\n(whereas 'aniso' had been multiplied from the left by 'x').\n", KNAME(DAUSER), KNAME(DAUSER), RFOPTIONS, internals[INTERNALS_NEWANISO]); } GLOBAL.internal.warn_Aniso = false; // here for the first time if (!PisNULL(DANISO)) return ERRORANISO_T; int k, lnrow = cov->nrow[DAUSER], lncol = cov->ncol[DAUSER]; long j, total = lncol * lnrow; double *pA = P(DAUSER); PALLOC(DANISO, lncol, lnrow); // !! ACHTUNG col, row gekreuzt for (i=k=0; idomown = KERNEL; if (!PisNULL(DANISO) || !PisNULL(DPROJ) || !PisNULL(DSCALE)) SERR2("if '%s' is an arbitrary function, only '%s' may be given as additional parameter.", KNAME(DAUSER), KNAME(DVAR)); if (cov->isoown != SYMMETRIC && cov->isoown != CARTESIAN_COORD) { // printf("iso = %d\n", cov->isoown); //PMI(cov, -1); // assert(false); return ERRORANISO; } //else printf("OK iso = %d\n", cov->isoown); cov->full_derivs = cov->rese_derivs = 0; cov->loggiven = true; if ((err = CHECK(Aniso, cov->tsdim, cov->xdimown, ShapeType, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, cov->role)) != NOERROR) { return err; } if (Aniso->vdim2[1] != 1) SERR4("'%s' returns a matrix of dimension %d x %d, but dimension %d x 1 is need.", KNAME(DANISO), Aniso->vdim2[0], Aniso->vdim2[1], cov->xdimown); // PMI(cov); if (cov->key==NULL) { if ((err = CHECK(sub, Aniso->vdim2[0], Aniso->vdim2[0], cov->typus, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) { return err; } } cov->pref[Nugget] = cov->pref[RandomCoin] = cov->pref[Average] = cov->pref[Hyperplane] = cov->pref[SpectralTBM] = cov->pref[TBM] = PREF_NONE; sub->pref[CircEmbed] = sub->pref[CircEmbedCutoff] = sub->pref[CircEmbedIntrinsic] = sub->pref[Sequential] = sub->pref[Markov] = sub->pref[Specific] = PREF_NONE; } else if (!PisNULL(DANISO)) { // aniso given int nrow = cov->nrow[DANISO], ncol = cov->ncol[DANISO]; if (nrow==0 || ncol==0) SERR("dimension of the matrix is 0"); if (!PisNULL(DPROJ)) return ERRORANISO_T; if (xdimown < nrow) { if (PL >= PL_ERRORS) {LPRINT("xdim=%d != nrow=%d\n", xdimown, nrow);} SERR("#rows of anisotropy matrix does not match dim. of coordinates"); } if (xdimown != cov->tsdim && nrow != ncol) SERR("non-quadratic anisotropy matrices only allowed if dimension of coordinates equals spatio-temporal dimension"); type = Type(P(DANISO), nrow, ncol); cov->full_derivs = cov->rese_derivs = 0; cov->loggiven = true; switch (cov->isoown) { case ISOTROPIC : if (cov->tsdim != 1) return ERRORANISO; cov->full_derivs = cov->rese_derivs = 2; break; case SPACEISOTROPIC : cov->full_derivs = cov->rese_derivs = isMdiag(type) ? 2 : 0; if (nrow != 2 || !isMdiag(type)) { // printf("nrow %d %d %d\n", nrow, type, isMdiag(type)); // int h; for (h = 0; hnrow[DANISO] * cov->ncol[DANISO]; h++) // printf("h=%d %f %d\n", h, P(DANISO)[h], P(DANISO)[h]==0); SERR("spaceisotropy needs a 2x2 diagonal matrix"); } break; case ZEROSPACEISO : if (!isMdiag(type)) return ERRORANISO; break; case VECTORISOTROPIC : if (!isMiso(type)) return ERRORANISO; break; case SYMMETRIC: break; case PREVMODELI : BUG; case CARTESIAN_COORD : if (!isProcess(cov->typus)) return ERRORANISO; break; default : BUG; } // printf(" A hiere\n"); if (!isMdiag(type)) cov->pref[Nugget] = cov->pref[RandomCoin] = cov->pref[Average] = cov->pref[Hyperplane] = PREF_NONE; if (cov->isoown != SPACEISOTROPIC && !isMiso(type)) cov->pref[SpectralTBM] = cov->pref[TBM] = PREF_NONE; if (cov->key==NULL) { if ((err = CHECK(next, ncol, ncol, cov->typus, cov->domown, ncol==1 && !isProcess(cov->typus) ? ISOTROPIC : cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) { return err; } if (next->domown == cov->domown && next->isoown == cov->isoown && xdimown > 1) next->delflag = DEL_COV - 7; } else { if ((err = CHECK(cov->key, ncol, ncol, cov->typus, cov->domown, ncol==1 && !isProcess(cov->typus) ? ISOTROPIC : cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) return err; } } else { // PisNULL(DANISO) int tsdim = cov->tsdim; if (nproj > 0) { if (cov->ncol[DPROJ] != 1) SERR("proj must be a vector"); if (cov->xdimprev != cov->xdimown) return ERRORANISO; for (i=0; i= xdimown) SERR3("%d-th value of '%s' (%d) out of range", i, KNAME(DPROJ), proj[i]); } xdimNeu = nproj; tsdim = nproj; switch (cov->isoown) { case ISOTROPIC : if (cov->tsdim != 1) return ERRORANISO; break; case SPACEISOTROPIC : if (nproj != 2 || xdimown != 2 || tsdim != 2) SERR("spaceisotropy needs a 2x2 diagonal matrix"); break; case ZEROSPACEISO : return ERRORANISO; // ginge z.T.; aber kompliziert break; case VECTORISOTROPIC : return ERRORANISO; break; case SYMMETRIC: case CARTESIAN_COORD: break; case PREVMODELI : BUG; break; default : BUG; } } if (cov->key==NULL) { //PMI(next); if ((err = CHECK(next, tsdim, xdimNeu, cov->typus, cov->domown, cov->isoown, cov->vdim2[0], // SUBMODEL_DEP; geaendert 20.7.14 cov->role)) != NOERROR) { return err; } if (next->domown == cov->domown && next->isoown == cov->isoown) // darf nicht nach C-HECK als allgemeine Regel ruebergezogen werden, u.a. nicht wegen stat/nicht-stat wechsel !! // hier geht es, da domown und isoown nur durchgegeben werden und die Werte // bereits ein Schritt weiter oben richtig/minimal gesetzt werden. next->delflag = DEL_COV - 8; } else { if ((err = CHECK(cov->key, tsdim, xdimNeu, cov->typus, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) return err; } } // end no aniso // printf("tsdim = %d\n", cov->tsdim); if (( err = checkkappas(cov, false)) != NOERROR) { return err; } // printf("here %d\n", cov->maxdim); setbackward(cov, sub); if ((Aniso != NULL || !PisNULL(DANISO) || !PisNULL(DPROJ)) && cov->maxdim < cov->xdimown) cov->maxdim = cov->xdimown; if (cov->isoown != ISOTROPIC && !isDollarProc(cov)) { // multivariate kann auch xdimNeu == 1 problematisch sein cov->nr++; } if (xdimNeu > 1) { cov->pref[CircEmbedCutoff] = cov->pref[CircEmbedIntrinsic] = 0; } // printf("cov-Nr = %d\n", cov->nr); // 30.10.11 kommentiert: // cov->pref[CircEmbedCutoff] = cov->pref[CircEmbedIntrinsic] = // cov->pref[TBM] = cov->pref[SpectralTBM] = 0; if ( (PisNULL(DANISO) || isMiso(type)) && PisNULL(DPROJ)) { // print("logspeed %s %f\n", NICK(sub), sub->logspeed); cov->logspeed = sub->logspeed * P0(DVAR); } //////////////// if (sub->pref[Nugget] > PREF_NONE) cov->pref[Specific] = 100; if (nproj == 0) cov->matrix_indep_of_x = sub->matrix_indep_of_x; if ((err = TaylorS(cov)) != NOERROR) return err; // printf("here2\n"); DOLLAR_STORAGE; if (isProcess(cov->typus)) { MEMCOPY(cov->pref, PREF_NOTHING, sizeof(pref_shorttype)); } if (GLOBAL.coords.coord_system == earth && isCartesian(CovList[next->nr].domain) && GLOBAL.internal.warn_scale && P0(DSCALE) < (strcmp(GLOBAL.coords.newunits[0], "km") == 0 ? 10 : 6.3)) { char msg[300]; // printf("%d %d\n", P0(DSCALE), strcmp(GLOBAL.general.newunits[0], "km") == 0 ? 100 : 63); assert(false); sprintf(msg, "value of scale parameter equals '%4.2f',\nwhich is less than 100, although models defined on R^3 are used in the\ncontext of earth coordinates where larger scales are expected.\n(This warning appears only ones per session.)\n", P0(DSCALE)); GLOBAL.internal.warn_scale = false; warning(msg); } // PMI(cov, 1); // printf("here XX\n"); //PMI(cov->calling); return NOERROR; } bool TypeS(Types required, cov_model *cov) { cov_model *sub = cov->key==NULL ? cov->sub[0] : cov->key; // printf("\n\n\nxxxxxxxxxxxx %d %s %s\n\n", TypeConsistency(required, sub), TYPENAMES[required], NICK(sub)); // if (required == ProcessType) crash(); //assert(false); return (required==TcfType || required==PosDefType || required==NegDefType || required==ShapeType || required==TrendType || required==ProcessType || required==GaussMethodType) && TypeConsistency(required, sub); } void spectralS(cov_model *cov, gen_storage *s, double *e) { cov_model *next = cov->sub[DOLLAR_SUB]; int d, ncol = PisNULL(DANISO) ? cov->tsdim : cov->ncol[DANISO]; double sube[MAXTBMSPDIM], *scale =P(DSCALE), invscale = 1.0; SPECTRAL(next, s, sube); // nicht gatternr // Reihenfolge nachfolgend extrem wichtig, da invscale auch bei aniso // verwendet wird if (scale != NULL) invscale /= scale[0]; // print("sube %f %f %f %d %d\n", sube[0], sube[1], invscale, cov->tsdim, ncol); if (!PisNULL(DANISO)) { int nrow = cov->nrow[DANISO]; long j, k, m, total = ncol * nrow; double *A = P(DANISO); for (d=0, k=0; dmin[DVAR] = 0.0; range->max[DVAR] = RF_INF; range->pmin[DVAR] = 0.0; range->pmax[DVAR] = 100000; range->openmin[DVAR] = false; range->openmax[DVAR] = true; range->min[DSCALE] = 0.0; range->max[DSCALE] = RF_INF; range->pmin[DSCALE] = 0.0001; range->pmax[DSCALE] = 10000; range->openmin[DSCALE] = true; range->openmax[DSCALE] = true; for (i=DANISO; i<= DAUSER; i++) { range->min[i] = RF_NEGINF; range->max[i] = RF_INF; range->pmin[i] = -10000; range->pmax[i] = 10000; range->openmin[i] = true; range->openmax[i] = true; } range->min[DPROJ] = 1; range->max[DPROJ] = cov->tsdim; range->pmin[DPROJ] = 1; range->pmax[DPROJ] = cov->tsdim; range->openmin[DPROJ] = false; range->openmax[DPROJ] = false; } void ScaleDollarToLoc(cov_model *to, cov_model *from, int VARIABLE_IS_NOT_USED depth) { assert(!PARAMisNULL(to, LOC_SCALE)); assert(isDollar(from)); assert(!PARAMisNULL(from, DSCALE)); PARAM(to, LOC_SCALE)[0] = PARAM0(from, DSCALE); } bool ScaleOnly(cov_model *cov) { return isDollar(cov) && PisNULL(DPROJ) && cov->kappasub[DPROJ] == NULL && PisNULL(DANISO) && cov->kappasub[DAUSER] == NULL && (PisNULL(DVAR) || P0(DVAR)==1.0) && cov->kappasub[DVAR] == NULL; } int addScales(cov_model **newmodel, double anisoScale, cov_model *scale, double Scale) { // cov_model *calling = (*newmodel)->calling; if (anisoScale != 1.0) { addModel(newmodel, LOC); kdefault(*newmodel, LOC_SCALE, anisoScale); } if (scale != NULL) { if (!isRandom(scale)) SERR("unstationary scale not allowed yet"); addModel(newmodel, LOC); addSetDistr(newmodel, scale->calling, ScaleDollarToLoc, true, MAXINT); // assert((*newmodel)->Sset != NULL); // APMI(*newmodel); } else { if (Scale != 1.0) { addModel(newmodel, LOC); kdefault(*newmodel, LOC_SCALE, Scale); } } return NOERROR; } int structS(cov_model *cov, cov_model **newmodel) { cov_model *local = NULL, *dummy = NULL, *next = cov->sub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER], *scale = cov->kappasub[DSCALE]; int err = NOERROR; bool generalAniso = Aniso != NULL && CovList[Aniso->nr].check != checkAngle; // cov_model *sub; // printf("%s %d %s\n", ROLENAMES[cov->role], cov->role, TYPENAMES[cov->typus]); // if (cov->role != ROLE_GAUSS) { // APMI(cov->calling); //crash(); // } // assert(false); if (cov->kappasub[DVAR] != NULL) { GERR1("models including arbitrary functions for '%s' cannot be simulated yet", KNAME(DVAR)); } switch (cov->role) { case ROLE_SMITH : if (generalAniso) GERR1("complicated models including arbitrary functions for '%s' cannot be simulated yet for Smith models", KNAME(DAUSER)); ASSERT_NEWMODEL_NOT_NULL; if (!PisNULL(DANISO)) GERR("anisotropy parameter not allowed yet"); if (!PisNULL(DPROJ)) GERR("projections not allowed yet"); if ((err = STRUCT(next, newmodel)) > NOERROR) return err; addModel(newmodel, DOLLAR); if (!PisNULL(DVAR)) kdefault(*newmodel, DVAR, P0(DVAR)); if (!PisNULL(DSCALE)) kdefault(*newmodel, DSCALE, P0(DSCALE)); if (!next->deterministic) GERR("random shapes not programmed yet"); break; case ROLE_MAXSTABLE : // eigentlich nur von RPSmith moeglich ! ASSERT_NEWMODEL_NOT_NULL; if (generalAniso) GERR1("complicated models including arbitrary functions for '%s' cannot be simulated yet for Smith models", KNAME(DAUSER)); if (!next->deterministic) GERR("random shapes not programmed yet"); if (!PisNULL(DPROJ)) GERR("projections not allowed yet"); // P(DVAR) hat keine Auswirkungen if (!PisNULL(DANISO)) { if (!isMonotone(next) || !isIsotropic(next->isoown) || PisNULL(DANISO) || cov->ncol[DANISO] != cov->nrow[DANISO]) GERR("anisotropy parameter only allowed for simple models up to now"); } //APMI(cov); assert(cov->calling != NULL); double anisoScale; if (!PisNULL(DANISO)) { anisoScale = 1.0 / getMinimalAbsEigenValue(P(DANISO), cov->nrow[DANISO]); if (!R_FINITE(anisoScale)) GERR("singular anisotropy matrices not allowed"); } else anisoScale = 1.0; if (cov->calling->nr == SMITHPROC) { if ((err = STRUCT(next, newmodel)) == NOERROR && *newmodel != NULL) { assert( (*newmodel)->calling == cov); // PMI(shape); //APMI(*newmodel); Types type = TypeConsistency(PointShapeType, *newmodel) ? PointShapeType : TypeConsistency(RandomType, *newmodel) ? RandomType : TypeConsistency(ShapeType, *newmodel) ? ShapeType : OtherType; double Scale = PisNULL(DSCALE) ? 1.0 : P0(DSCALE); if (type == RandomType) { // random locations given; // so, it must be of pgs type (or standard): if ((err = CHECK_R(*newmodel, cov->tsdim)) != NOERROR) { goto ErrorHandling; } dummy = *newmodel; if ((err=addScales(&dummy, anisoScale, scale, Scale))!=NOERROR){ goto ErrorHandling; } *newmodel = NULL; assert(cov->vdim2[0] == cov->vdim2[1]); //APMI(dummy); if ((err = addPointShape(newmodel, cov, dummy, cov->tsdim, cov->vdim2[0])) != NOERROR) { goto ErrorHandling; } ASSERT_NEWMODEL_NOT_NULL; (*newmodel)->calling = cov; // APMI(cov); } else { if (type == PointShapeType && (err = addScales((*newmodel)->sub + PGS_LOC, anisoScale, scale, Scale)) != NOERROR) goto ErrorHandling; if ((err = CHECK(*newmodel, cov->tsdim, cov->xdimprev, type, cov->domprev, cov->isoprev, cov->vdim2, ROLE_MAXSTABLE)) != NOERROR) { goto ErrorHandling; } if (type==PointShapeType) { if ((err = PointShapeLocations(*newmodel, cov)) != NOERROR) goto ErrorHandling; } else if (type == ShapeType) { dummy = *newmodel; *newmodel = NULL; // suche nach geeigneten locationen if ((err = addScales(&local, anisoScale, scale, Scale))!=NOERROR) goto ErrorHandling; if ((err = addPointShape(newmodel, dummy, NULL, local, cov->tsdim, cov->vdim2[0])) != NOERROR) goto ErrorHandling; //printf("e ddd\n"); } else BUG; } // ! randomtype } else { // S TRUCT does not return anything int err2; //assert(false); // XERR(err); // APMI(*newmodel); if ((err2 = addPointShape(newmodel, cov, NULL, cov->tsdim, cov->vdim2[0])) != NOERROR) { if (err == NOERROR) err = err2; goto ErrorHandling; } err = NOERROR; } } else { // not from RPsmith BUG; // if ((err = STRUCT(next, newmodel)) > NOERROR) return err; } // PMI(cov); // APMI(*newmodel); break; case ROLE_GAUSS : if (isProcess(cov->typus)) { cov->nr = DOLLAR_PROC; return structSproc(cov, newmodel); // kein S-TRUCT !! } ASSERT_NEWMODEL_NOT_NULL; if (Aniso!= NULL) { GERR1("complicated models including arbitrary functions for '%s' cannot be simulated yet", KNAME(DAUSER)); } if (cov->key != NULL) COV_DELETE(&(cov->key)); if (cov->prevloc->distances) GERR("distances do not allow for more sophisticated simulation methods"); if ((err = STRUCT(next, newmodel)) > NOERROR) return err; addModel(newmodel, DOLLAR); if (!PisNULL(DVAR)) kdefault(*newmodel, DVAR, P0(DVAR)); if (!PisNULL(DSCALE) ) kdefault(*newmodel, DSCALE, P0(DSCALE)); if (!next->deterministic) GERR("random shapes not programmed yet"); break; default : // PMI(cov, "structS"); GERR1("changes in scale/variance not programmed yet for '%s'", ROLENAMES[cov->role]); } ErrorHandling: if (dummy != NULL) COV_DELETE(&dummy); if (local != NULL) COV_DELETE(&local); return err; } int initS(cov_model *cov, gen_storage *s){ // am liebsten wuerde ich hier die Koordinaten transformieren; // zu grosser Nachteil ist dass GetDiameter nach trafo // grid def nicht mehr ausnutzen kann -- umgehbar?! cov_model *next = cov->sub[DOLLAR_SUB], *varM = cov->kappasub[DVAR], *scaleM = cov->kappasub[DSCALE], *anisoM = cov->kappasub[DAUSER], *projM = cov->kappasub[DPROJ]; int vdim = cov->vdim2[0], nm = cov->mpp.moments, nmvdim = (nm + 1) * vdim, err = NOERROR; bool angle = anisoM != NULL && CovList[anisoM->nr].check == checkAngle, maxstable = hasExactMaxStableRole(cov);// Realisationsweise if (hasAnyShapeRole(cov)) { // Average !! ohne maxstable selbst !! double var[MAXMPPVDIM], scale = PisNULL(DSCALE) ? 1.0 : P0(DSCALE); int i, dim = cov->tsdim; if (!PisNULL(DPROJ) || !PisNULL(DANISO) || projM!= NULL || (anisoM != NULL && (!angle || !anisoM->deterministic))){ // APMI(cov); SERR("(complicated) anisotropy ond projection not allowed yet in Poisson related models"); } // Achtung I-NIT_RANDOM ueberschreibt mpp.* !! if (varM != NULL) { int nm_neu = nm == 0 && !maxstable ? 1 : nm; if ((err = INIT_RANDOM(varM, nm_neu, s, P(DVAR))) != NOERROR) return err; int nmP1 = varM->mpp.moments + 1; for (i=0; impp.mM[idx + 1]; } } else for (i=0; impp.mM[1]; } if ((err = INIT(next, nm, s)) != NOERROR) return err; for (i=0; i < nmvdim; i++) { cov->mpp.mM[i] = next->mpp.mM[i]; cov->mpp.mMplus[i] = next->mpp.mMplus[i]; } if (varM != NULL && !maxstable) { for (i=0; i < nmvdim; i++) { cov->mpp.mM[i] *= varM->mpp.mM[i]; cov->mpp.mMplus[i] *= varM->mpp.mMplus[i]; } } else { int j, k; double pow_var; for (k=j=0; jmpp.mM[k] *= pow_var; cov->mpp.mMplus[k] *= pow_var; } } } if (scaleM != NULL && !maxstable) { if (scaleM->mpp.moments < dim) SERR("moments can not be calculated."); int j, k, nmP1 = scaleM->mpp.moments + 1; for (k=j=0; jmpp.mM[dim + j * nmP1]; for (i=0; i <= nm; i++, k++) { cov->mpp.mM[k] *= pow_scale; cov->mpp.mMplus[k] *= pow_scale; } } } else { double pow_scale = pow(scale, dim); for (i=0; i < nmvdim; i++) { cov->mpp.mM[i] *= pow_scale; cov->mpp.mMplus[i] *= pow_scale; } } if (!PisNULL(DANISO)) { if (cov->nrow[DANISO] != cov->ncol[DANISO]) SERR("only square anisotropic matrices allowed"); double invdet = fabs(1.0 / getDet(P(DANISO), cov->nrow[DANISO])); if (!R_FINITE(invdet)) SERR("determinant of the anisotropy matrix could not be calculated."); for (i=0; i < nmvdim; i++) { cov->mpp.mM[i] *= invdet; cov->mpp.mMplus[i] *= invdet; } } if (anisoM != NULL) { double invdet; if (angle) { int ncol = anisoM->vdim2[0], nrow = anisoM->vdim2[1]; if (nrow != ncol) SERR("only square anisotropic matrices allowed"); double *diag = PARAM(anisoM, ANGLE_DIAG); if (diag != NULL) { invdet = 1.0; for (i=0; impp.mM[i] *= invdet; cov->mpp.mMplus[i] *= invdet; } } if (R_FINITE(cov->mpp.unnormedmass)) { if (vdim > 1) BUG; cov->mpp.unnormedmass = next->mpp.unnormedmass * var[0]; } else { for (i=0; impp.maxheights[i] = next->mpp.maxheights[i] * var[i]; } // printf("inis %f %f %d %f\n", cov->mpp.maxheights[0] , next->mpp.maxheights[0] , varM == NULL, varM == NULL ? P0(DVAR) : 1.0); // cov->mpp.refradius *= scale; //cov->mpp.refsd *= scale; } else if (cov->role == ROLE_GAUSS) { cov_model *key = cov->key, *sub = key == NULL ? next : key; assert(sub != NULL); assert(key == NULL || ({PMI(cov);false;}));// if ((err=INIT(sub, 0, s)) != NOERROR) return err; } else if (cov->role == ROLE_BASE) { cov_model *key = cov->key, *sub = key == NULL ? next : key; assert(sub != NULL); assert(key == NULL || ({PMI(cov);false;}));// if ((err=INIT(sub, 0, s)) != NOERROR) return err; } else SERR("initiation of scale and/or variance failed"); if ((err = TaylorS(cov)) != NOERROR) return err; // APMI(cov); return NOERROR; } void doS(cov_model *cov, gen_storage *s){ cov_model *varM = cov->kappasub[DVAR], *scaleM = cov->kappasub[DSCALE]; int i, vdim = cov->vdim2[0]; if (varM != NULL && !varM->deterministic && !isRandom(varM)) { assert(!PisNULL(DVAR)); DO(varM, s); } if (scaleM != NULL && !scaleM->deterministic && !isRandom(scaleM)) { assert(!PisNULL(DSCALE)); DO(scaleM, s); } // PMI(cov); if (hasAnyShapeRole(cov)) { cov_model *next = cov->sub[DOLLAR_SUB]; DO(next, s);// nicht gatternr for (i=0; impp.maxheights[i] = next->mpp.maxheights[i] * P0(DVAR); return; } else if (cov->role == ROLE_GAUSS) { double *res = cov->rf, sd = sqrt(P0(DVAR)); int totalpoints = Gettotalpoints(cov); assert(res != NULL); if (cov->key == NULL) BUG; DO(cov->key, s); // PMI(cov); // printf("totalpoints"); if (sd != 1.0) for (i=0; icalling->calling); //crash(); BUG; } int checkplusmal(cov_model *cov) { cov_model *sub; int i, j, err, dim, xdim, role; assert(cov->Splus == NULL); dim = cov->tsdim; xdim = cov->xdimown; role = cov->role; for (i=0; insub; i++) { sub = cov->sub[i]; if (sub == NULL) SERR("+ or *: named submodels are not given in a sequence!"); Types type = cov->typus; domain_type dom = cov->domown; isotropy_type iso = cov->isoown; // printf("start\n"); err = ERRORTYPECONSISTENCY; for (j=0; j<=1; j++) { // nur trend als abweichender typus erlaubt // //printf("type = %s %s %d\n", TYPENAMES[type], NICK(sub), j); // if (dom == XONLY) { printf("loeschen\n");continue;} if (TypeConsistency(type, sub) && (err = CHECK(sub, dim, xdim, type, dom, iso, i == 0 ? SUBMODEL_DEP : cov->vdim2[0], role)) == NOERROR) break; //assert(err == ERRORTYPECONSISTENCY); type = TrendType; dom = XONLY; iso = CARTESIAN_COORD; } // printf("OK err=%d\n", err); // MERR(err); if (err != NOERROR) { //printf("sub %d %s\n", i, NICK(sub)); // APMI(cov); return err; } // printf("A OK err=%d\n", err); if (cov->typus == sub->typus) { //printf("cov->iso = %d %d\n", cov->isoown, sub->isoprev); setbackward(cov, sub); } else { updatepref(cov, sub); cov->tbm2num |= sub->tbm2num; if (CovList[cov->nr].vdim == SUBMODEL_DEP && (sub==cov->sub[0] || sub==cov->key)) { // strange todo cov->vdim2[0] = sub->vdim2[0]; cov->vdim2[1] = sub->vdim2[1]; } cov->deterministic &= sub->deterministic; }; // printf("C OK err=%d\n", err); if (i==0) { cov->vdim2[0]=sub->vdim2[0]; // to do: inkonsistent mit vorigen Zeilen !! cov->vdim2[1]=sub->vdim2[1]; // to do: inkonsistent mit vorigen Zeilen !! if (cov->vdim2[0] <= 0) BUG; cov->matrix_indep_of_x = sub->matrix_indep_of_x; } else { cov->matrix_indep_of_x &= sub->matrix_indep_of_x; if (cov->vdim2[0] != sub->vdim2[0] || cov->vdim2[1] != sub->vdim2[1]) { SERR4("multivariate dimensionality is different in the submodels (%s is %d-variate; %s is %d-variate)", NICK(cov->sub[0]), cov->vdim2[0], NICK(sub), sub->vdim2[0]); } } } // !! incorrect !! // cov->semiseparatelast = false; //cov->separatelast = false; // printf("OK err=%d ende\n", err); // PMI(cov, -1); return NOERROR; } // see private/old.code/operator.cc for some code including variable locations void select(double *x, cov_model *cov, double *v) { int len, *element = PINT(SELECT_SUBNR); cov_model *sub = cov->sub[*element]; assert(cov->vdim2[0] == cov->vdim2[1]); if (*element >= cov->nsub) error("select: element out of range"); COV(x, sub, v); if ( (len = cov->nrow[SELECT_SUBNR]) > 1) { int i, m, vdim = cov->vdim2[0], vsq = vdim * vdim; ALLOC_EXTRA(z, vsq); for (i=1; isub[element[i]]; COV(x, sub, z); for (m=0; mnrow[SELECT_SUBNR]; if (len == 1) { int element = P0INT(SELECT_SUBNR); cov_model *next = cov->sub[element]; if (element >= cov->nsub) error("select: element out of range"); CovList[next->nr].covmatrix(next, v); // { int i,j,k, tot=Loc(cov)->totalpoints; printf("\nXcovmat select\n"); // for (k=i=0; iSplus == NULL); kdefault(cov, SELECT_SUBNR, 0); if ((err = checkplus(cov)) != NOERROR) return err; if ((err = checkkappas(cov)) != NOERROR) return err; EXTRA_STORAGE; return NOERROR; } void rangeselect(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[SELECT_SUBNR] = 0; range->max[SELECT_SUBNR] = MAXSUB-1; range->pmin[SELECT_SUBNR] = 0; range->pmax[SELECT_SUBNR] = MAXSUB-1; range->openmin[SELECT_SUBNR] = false; range->openmax[SELECT_SUBNR] = false; } void plusStat(double *x, cov_model *cov, double *v){ cov_model *sub; int i, m, nsub=cov->nsub, vdim = cov->vdim2[0], vsq = vdim * vdim; assert(cov->vdim2[0] == cov->vdim2[1]); ALLOC_EXTRA(z, vsq); //PMI(cov->calling); //print("%d %s %s\n", vsq, NICK(cov->sub[0])), for (m=0; msub[i]; if (cov->typus == sub->typus) { COV(x, sub, z); for (m=0; mcalling != NULL) printf("stat i=%d %f %f\n", i, v[m], z[m]); // crash(cov); // APMI(cov); } // printf("plus x=%f %f\n", *x, *v); } void plusNonStat(double *x, double *y, cov_model *cov, double *v){ cov_model *sub; int i, m, nsub=cov->nsub, vdim = cov->vdim2[0], vsq = vdim * vdim; assert(cov->vdim2[0] == cov->vdim2[1]); ALLOC_EXTRA(z, vsq); for (m=0; msub[i]; if (cov->typus == sub->typus) { NONSTATCOV(x, y, sub, z); for (m=0; mnsub, i; *v = 0.0; for (i=0; isub[i]; if (cov->typus == sub->typus) { Abl1(x, sub, &v1); (*v) += v1; } } } void DDplus(double *x, cov_model *cov, double *v){ cov_model *sub; double v1; int n = cov->nsub, i; *v = 0.0; for (i=0; isub[i]; if (cov->typus == sub->typus) { Abl2(x, sub, &v1); (*v) += v1; } } } int checkplus(cov_model *cov) { int err, i; if ((err = checkplusmal(cov)) != NOERROR) { return err; } if (cov->domown == STAT_MISMATCH) return ERRORNOVARIOGRAM; if (cov->nsub == 0) cov->pref[SpectralTBM] = PREF_NONE; if (isPosDef(cov) && cov->domown == XONLY) cov->logspeed = 0.0; else if (isNegDef(cov) && cov->domown == XONLY) { cov->logspeed = 0.0; for (i=0; insub; i++) { cov_model *sub = cov->sub[i]; if (cov->typus == sub->typus) { if (ISNAN(sub->logspeed)) { cov->logspeed = RF_NA; break; } else cov->logspeed += sub->logspeed; } } } else cov->logspeed = RF_NA; EXTRA_STORAGE; return NOERROR; // spectral mit "+" funktioniert, falls alle varianzen gleich sind, // d.h. nachfolgend DOLLAR die Varianzen gleich sind oder DOLLAR nicht // auftritt; dann zufaellige Auswahl unter "+" } bool Typeplus(Types required, cov_model *cov) { // assert(false); bool allowed = TypeConsistency(ShapeType, required) || required==TrendType; //||required==ProcessType ||required==GaussMethodType; not yet allowed;to do // printf("allowed %d\n", allowed); if (!allowed) return false; int i; for (i=0; insub; i++) { //printf("type plus %s %s\n",TYPENAMES[required], NICK(cov->sub[i])); if (TypeConsistency(required, cov->sub[i])) return true; } // printf("none\n"); return false; } void spectralplus(cov_model *cov, gen_storage *s, double *e){ int nr; double dummy; spec_properties *cs = &(s->spec); double *sd_cum = cs->sub_sd_cum; nr = cov->nsub - 1; dummy = UNIFORM_RANDOM * sd_cum[nr]; if (ISNAN(dummy)) BUG; while (nr > 0 && dummy <= sd_cum[nr - 1]) nr--; cov_model *sub = cov->sub[nr]; SPECTRAL(sub, s, e); // nicht gatternr } int structplus(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ int m, err; switch(cov->role) { case ROLE_COV : return NOERROR; case ROLE_GAUSS : if (isProcess(cov->typus)) { //assert(cov->calling != NULL && (isInterface(cov->calling->typus) || /// isProcess(cov->calling->typus))); assert(cov->nr != PLUS_PROC); assert(cov->nr == PLUS); //cov->nr = PLUS_PROC; BUG; //return structplusproc(cov, newmodel); // kein S-TRUCT !! } if (cov->Splus != NULL) BUG; for (m=0; mnsub; m++) { cov_model *sub = cov->sub[m]; if ((err = STRUCT(sub, newmodel)) > NOERROR) { // PMI(cov->Splus->keys[m]); // assert(false); //printf("end plus\n"); return err; } } break; default : SERR2("role '%s' not allowed for '%s'", ROLENAMES[cov->role], NICK(cov)); } return NOERROR; } int initplus(cov_model *cov, gen_storage *s){ int i, err, vdim = cov->vdim2[0]; if (cov->vdim2[0] != cov->vdim2[1]) BUG; for (i=0; impp.maxheights[i] = RF_NA; if (cov->role == ROLE_GAUSS) { spec_properties *cs = &(s->spec); double *sd_cum = cs->sub_sd_cum; for (i=0; insub; i++) { cov_model *sub = cov->Splus == NULL ? cov->sub[i] : cov->Splus->keys[i]; //print("initplus %d %d initialised=%d\n",i,cov->nsub, sub->initialised); //PMI(sub); if (sub->pref[Nothing] > PREF_NONE) { // to do ?? // for spectral plus only COV(ZERO, sub, sd_cum + i); if (i>0) sd_cum[i] += sd_cum[i-1]; } cov->sub[i]->stor = (gen_storage *) MALLOC(sizeof(gen_storage)); if ((err = INIT(sub, cov->mpp.moments, s)) != NOERROR) { // AERR(err); return err; } sub->simu.active = true; } // assert(false); cov->fieldreturn = cov->Splus != NULL; cov->origrf = false; if (cov->Splus != NULL) cov->rf = cov->Splus->keys[0]->rf; return NOERROR; } /* pref_type pref; for (m=0; mcov->user[0] == 0 || meth->cov->user[1] == 0) { // i.e. user defined pref_type pref; pref[CircEmbed] = pref[TBM] = pref[Direct] = pref[Sequential] = PREF_NONE; for (m=0; mcov->user[m]); if (pref[m] > 0 && meth->cov->user[m] > 0) { break; } } if (m == Nothing) return ERRORSUBMETHODFAILED; } */ else if (cov->role == ROLE_COV) { return NOERROR; } return ERRORFAILED; } void doplus(cov_model *cov, gen_storage *s) { int i; if (cov->role == ROLE_GAUSS && cov->method==SpectralTBM) { ERR("error in doplus with spectral"); } for (i=0; insub; i++) { cov_model *sub = cov->Splus==NULL ? cov->sub[i] : cov->Splus->keys[i]; DO(sub, s); } } void covmatrix_plus(cov_model *cov, double *v) { location_type *loc = Loc(cov); // cov_fct *C = CovList + cov->nr; // nicht gatternr long i, totalpoints = loc->totalpoints, vdimtot = totalpoints * cov->vdim2[0], vdimtotSq = vdimtot * vdimtot; int nsub = cov->nsub; bool is = iscovmatrix_plus(cov) >= 2; double *mem = NULL; if (is && nsub > 1) { ALLOC_EXTRA2(MEM, vdimtotSq); mem = MEM; is = mem != NULL; } if (is) { // APMI(cov); //cov_model *sub = cov->sub[0]; int j; if (PisNULL(SELECT_SUBNR)) PALLOC(SELECT_SUBNR, 1, 1); P(SELECT_SUBNR)[0] = 0; CovList[SELECT].covmatrix(cov, v); for (i=1; isub[i])->totalpoints != totalpoints) BUG; P(SELECT_SUBNR)[0] = i; CovList[SELECT].covmatrix(cov, mem); for (j=0; jnsub; for (i=0; isub[i]; is = CovList[sub->nr].is_covmatrix(sub); if (is > max) max = is; } return max; } void malStat(double *x, cov_model *cov, double *v){ cov_model *sub; int i, m, nsub=cov->nsub, vdim = cov->vdim2[0], vsq = vdim * vdim; ALLOC_EXTRA(z, vsq); assert(x[0] >= 0.0 || cov->xdimown > 1); for (m=0; msub[i]; COV(x, sub, z); for (m=0; mnsub, vdim = cov->vdim2[0], vsq = vdim * vdim; ALLOC_EXTRA(z, vsq); ALLOC_EXTRA(zsign, vsq); assert(cov->vdim2[0] == cov->vdim2[1]); assert(x[0] >= 0.0 || cov->xdimown > 1); for (m=0; msub[i]; LOGCOV(x, sub, z, zsign); for (m=0; mnsub, vdim = cov->vdim2[0], vsq = vdim * vdim; ALLOC_EXTRA(z, vsq); assert(cov->vdim2[0] == cov->vdim2[1]); assert(cov->vdim2[0] == cov->vdim2[1]); for (m=0; msub[i]; NONSTATCOV(x, y, sub, z); for (m=0; mnsub, vdim = cov->vdim2[0], vsq = vdim * vdim; assert(cov->vdim2[0] == cov->vdim2[1]); ALLOC_EXTRA(z, vsq); ALLOC_EXTRA(zsign, vsq); for (m=0; msub[i]; LOGNONSTATCOV(x, y, sub, z, zsign); for (m=0; mnsub, i; for (i=0; isub[i]; COV(x, sub, c + i); Abl1(x, sub, d + i); } *v = 0.0; for (i=0; isub[0]; cov_model *next2 = cov->sub[1]; int err; if (next2 == NULL) next2 = next1; if ((err = checkplusmal(cov)) != NOERROR) return err; if (cov->domown == STAT_MISMATCH || !isPosDef(cov)) { return ERRORNOVARIOGRAM; } // to do istcftype und allgemeiner typ zulassen cov->logspeed = cov->domown == XONLY ? 0 : RF_NA; if (cov->xdimown >= 2) cov->pref[TBM] = PREF_NONE; if (cov->xdimown==2 && cov->nsub == 2 && isAnyDollar(next1) && isAnyDollar(next2)) { double *aniso1 = PARAM(next1, DANISO), *aniso2 = PARAM(next2, DANISO); if (aniso1 != NULL && aniso2 != NULL) { if (aniso1[0] == 0.0 && next1->ncol[DANISO] == 1) { cov->pref[TBM] = next2->pref[TBM]; } else if (aniso2[0] == 0.0 && next2->ncol[DANISO] == 1) { cov->pref[TBM] = next1->pref[TBM]; } } } EXTRA_STORAGE; return NOERROR; } bool Typemal(Types required, cov_model *cov) { bool allowed = required==PosDefType || required==ShapeType; //||required==NegDefType ||required==TcfType; to do; ist erlaubt unter // gewissen Bedingungen if (!allowed) return false; int i; for (i=0; insub; i++) { if (!TypeConsistency(required, cov->sub[i])) return false; } return true; } int initmal(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s){ // int err; // return err; return ERRORFAILED; int i, vdim = cov->vdim2[0]; if (cov->vdim2[0] != cov->vdim2[1]) BUG; for (i=0; impp.maxheights[i] = RF_NA; } void domal(cov_model VARIABLE_IS_NOT_USED *cov, gen_storage VARIABLE_IS_NOT_USED *s){ BUG; } ////////////////////////////////////////////////////////////////////// // mpp-plus #define PLUS_P 0 // parameter int CheckAndSetP(cov_model *cov){ int n, nsub = cov->nsub; double cump = 0.0; if (PisNULL(PLUS_P)) { assert(cov->nrow[PLUS_P] == 0 && cov->ncol[PLUS_P] == 0); PALLOC(PLUS_P, nsub, 1); for (n=0; n 1.0 && n+1nsub; *nc = i < CovList[cov->nr].kappas ? 1 : -1; } void mppplus(double *x, cov_model *cov, double *v) { int i, n, vdim = cov->vdim2[0], vdimSq = vdim * vdim; cov_model *sub; ALLOC_EXTRA(z, vdimSq); if (cov->role == ROLE_COV) { for (i=0; insub; n++, sub++) { sub = cov->sub[n]; COV(x, sub, z); // urspruenglich : covlist[sub].cov(x, cov, z); ?! for (i=0; imaxdim = MAXMPPDIM; if ((err = checkplusmal(cov)) != NOERROR) { // printf("checkmppplus error %d %s\n", err, ERRORSTRING); return err; } if ((err = CheckAndSetP(cov)) != NOERROR) return(err); if (cov->q == NULL) { if ((cov->q = (double*) CALLOC(sizeof(double), size)) == NULL) return ERRORMEMORYALLOCATION; cov->qlen = size; } EXTRA_STORAGE; return NOERROR; } void rangempplus(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range){ range->min[PLUS_P] = 0.0; range->max[PLUS_P] = 1.0; range->pmin[PLUS_P] = 0.0; range->pmax[PLUS_P] = 1.0; range->openmin[PLUS_P] = false; range->openmax[PLUS_P] = false; } int struct_mppplus(cov_model *cov, cov_model **newmodel){ int m, //nsub = cov->nsub, err = NOERROR; //if (cov->calling == NULL || cov->calling->ownloc == NULL) // SERR("mppplus does not seem to be used in the right context"); if (!hasMaxStableRole(cov) && !hasPoissonRole(cov)) { SERR("method is not based on Poisson point process"); } return ERRORNOTPROGRAMMEDYET; // Ausnahme: mppplus wird separat behandelt: // if (nr == MPPPLUS) return S TRUCT(shape, NULL); ASSERT_NEWMODEL_NOT_NULL; NEW_STORAGE(Splus, PLUS, plus_storage); plus_storage *s = cov->Splus; for (m=0; mnsub; m++) { cov_model *sub = cov->sub[m]; if (s->keys[m] != NULL) COV_DELETE(s->keys + m); if ((err = covcpy(s->keys + m, sub)) != NOERROR) return err; if ((err = addShapeFct(s->keys + m)) != NOERROR) return err; s->keys[m]->calling = cov; } return NOERROR; } int init_mppplus(cov_model *cov, gen_storage *S) { cov_model *sub; double M2[MAXMPPVDIM], M2plus[MAXMPPVDIM], Eplus[MAXMPPVDIM], maxheight[MAXMPPVDIM]; int i,n, err, vdim = cov->vdim2[0]; if (cov->vdim2[0] != cov->vdim2[1]) BUG; if (vdim > MAXMPPVDIM) BUG; ext_bool loggiven = SUBMODEL_DEP, fieldreturn = SUBMODEL_DEP; pgs_storage *pgs = NULL; for (i=0; iSpgs; pgs->totalmass = 0.0; for (n=0; nnsub; n++) { sub = cov->sub[n]; //if (!sub->mpp.loc_done) //SERR1("submodel %d of '++': the location of the shapes is not defined", // n); if ((err = INIT(sub, cov->mpp.moments, S)) != NOERROR) return err; //if (!sub->mpp.loc_done) SERR("locations are not initialised"); if (n==0) { loggiven = sub->loggiven; fieldreturn = sub->fieldreturn; } else { if (loggiven != sub->loggiven) loggiven = SUBMODEL_DEP; if (fieldreturn != sub->loggiven) fieldreturn = SUBMODEL_DEP; } pgs->totalmass += sub->Spgs->totalmass * P(PLUS_P)[n]; for (i=0; impp.maxheights[i] > maxheight[i]) maxheight[i] = cov->mpp.maxheights[i]; loggiven &= cov->loggiven; // Achtung cov->mpp.mM2 und Eplus koennten nicht direkt gesetzt // werden, da sie vom CovList[sub->nr].Init ueberschrieben werden !! if (cov->mpp.moments >= 1) { int nmP1 = sub->mpp.moments + 1; for (i=0; impp.mMplus[idx + 1]; } if (cov->mpp.moments >= 2) { for (i=0; impp.mM[idx + 2]; M2plus[i] += PARAM0(sub, PLUS_P) * sub->mpp.mM[idx + 2]; } } } //assert(sub->mpp.loc_done); } for (i=0; impp.maxheights[i] = maxheight[i]; //cov->mpp.refsd = RF_NA; // cov->mpp.refradius = RF_NA; if (cov->mpp.moments >= 1) { int nmP1 = cov->mpp.moments + 1; for (i=0; impp.mMplus[idx + 1] = Eplus[i]; cov->mpp.mM[idx + 1] = RF_NA; } if (cov->mpp.moments >= 2) { for (i=0; impp.mM[idx + 2] = M2[i]; cov->mpp.mMplus[idx + 2] = M2plus[i]; } } } cov->loggiven = loggiven; cov->fieldreturn = fieldreturn; //cov->mpp.loc_done = true; cov->origrf = false; cov->rf = NULL; return NOERROR; } void do_mppplus(cov_model *cov, gen_storage *s) { cov_model *sub; double subselect = UNIFORM_RANDOM; int i, subnr, vdim = cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); for (subnr=0; (subselect -= PARAM0(cov->sub[subnr], PLUS_P)) > 0; subnr++); cov->q[0] = (double) subnr; sub = cov->sub[subnr]; CovList[sub->nr].Do(sub, s); // nicht gatternr for (i=0; impp.maxheights[i] = sub->mpp.maxheights[i]; cov->fieldreturn = sub->fieldreturn; cov->loggiven = sub->loggiven; // PrintMPPInfo(cov, s); } ////////////////////////////////////////////////////////////////////// // PROCESSES ////////////////////////////////////////////////////////////////////// int structSproc(cov_model *cov, cov_model **newmodel) { cov_model *next = cov->sub[DOLLAR_SUB], *Aniso = cov->kappasub[DAUSER]; int dim, err; // cov_model *sub; // printf("%d\n", cov->role); assert(cov->role == ROLE_GAUSS); // assert(false); // assert(false); assert(isDollarProc(cov)); //printf("her %d %d\n", cov->role, ROLE_GAUSS); if (Aniso != NULL && !Aniso->deterministic) { SERR1("complicated models including arbitrary functions for '%s' cannot be simulated yet", KNAME(DAUSER)); } switch (cov->role) { case ROLE_GAUSS : ASSERT_NEWMODEL_NULL; if (cov->key != NULL) COV_DELETE(&(cov->key)); if (cov->prevloc->distances) SERR("distances do not allow for more sophisticated simulation methods"); if (Aniso!= NULL) { //A // crash(); Transform2NoGrid(cov, false, true); location_type *loc = Loc(cov); dim = loc->timespacedim; int bytes = dim * sizeof(double); long i, total = loc->totalpoints; if (dim != Aniso->vdim2[0]) BUG; double *v = NULL, *x = loc->x; assert(x != NULL); assert(!loc->grid); if ((v = (double*) MALLOC(bytes)) == NULL) return ERRORMEMORYALLOCATION; for (i=0; ixgr[0][0], Loc(cov)->xgr[0][1], Loc(cov)->xgr[0][2]); // assert(false); if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; if (!isGaussProcess(next)) addModel(&(cov->key), GAUSSPROC); SetLoc2NewLoc(cov->key, Loc(cov)); // APMI(cov);assert(false); cov_model *key; key = cov->key; assert(key->calling == cov); dim = key->prevloc->timespacedim; if ((err = CHECK(key, dim, dim, ProcessType, XONLY, CARTESIAN_COORD, cov->vdim2, cov->role)) != NOERROR) return err; err = STRUCT(cov->key, NULL); // cov->initialised = err==NOERROR && key->initialised; // APMI(cov); return err; default : // PMI(cov, "structS"); SERR1("changes in scale/variance not programmed yet for '%s'", ROLENAMES[cov->role]); } return NOERROR; } int initSproc(cov_model *cov, gen_storage *s){ // am liebsten wuerde ich hier die Koordinaten transformieren; // zu grosser Nachteil ist dass GetDiameter nach trafo // grid def nicht mehr ausnutzen kann -- umgehbar?! //cov_model *next = cov->sub[DOLLAR_SUB]; //mppinfotype *info = &(s->mppinfo); // location_type *loc = cov->prevloc; int err = NOERROR; // assert(false); cov_model *key = cov->key; //*sub = key == NULL ? next : key; location_type *prevloc = cov->prevloc; assert(key != NULL); if ((err = INIT(key, 0, s)) != NOERROR) { return err; } key->simu.active = true; assert(s != NULL); cov->fieldreturn = true; if ((cov->origrf = cov->ownloc != NULL && cov->ownloc->totalpoints != prevloc->totalpoints)) { assert(prevloc->grid); int dim = prevloc->timespacedim; if (cov->vdim2[0] != cov->vdim2[1]) BUG; cov->rf = (res_type*) MALLOC(sizeof(res_type) * cov->vdim2[0] * prevloc->totalpoints); DOLLAR_STORAGE; int d, *proj = PINT(DPROJ), bytes = dim * sizeof(int), *cumsum = cov->Sdollar->cumsum = (int*) MALLOC(bytes), *total = cov->Sdollar->total = (int*) MALLOC(bytes), *len = cov->Sdollar->len = (int*) MALLOC(bytes); cov->Sdollar->nx = (int*) MALLOC(bytes); for (d=0; dxgr[d][XLENGTH]; } if (proj != NULL) { int nproj = cov->nrow[DPROJ]; d = 0; cumsum[proj[d] - 1] = 1; for (d = 1; d < nproj; d++) { cumsum[proj[d] - 1] = cumsum[proj[d - 1] - 1] * prevloc->xgr[d - 1][XLENGTH]; } for (d=0; dxgr[d][XLENGTH]; } else { int i, iold = 0, nrow = cov->nrow[DANISO], ncol = cov->ncol[DANISO]; double *A = P(DANISO); for (d=0; d 0) { cumsum[i] = cumsum[iold] * prevloc->xgr[d - 1][XLENGTH]; } else { // d ==0 cumsum[i] = 1; } iold = i; for (i++; i < nrow; i++) if (A[i] != 0.0) BUG; // just a check } } } else { cov->rf = cov->key->rf; } // PMI(cov,-1); assert(false); return NOERROR; } void doSproc(cov_model *cov, gen_storage *s){ if (hasMaxStableRole(cov) || hasPoissonRole(cov)) { cov_model *next = cov->sub[DOLLAR_SUB]; cov_model *varM = cov->kappasub[DVAR], *scaleM = cov->kappasub[DSCALE]; int i, vdim = cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); if (varM != NULL && !varM->deterministic) { assert(!PisNULL(DVAR)); VTLG_R(NULL, varM, P(DVAR)); } if (scaleM != NULL && !scaleM->deterministic) { assert(!PisNULL(DSCALE)); VTLG_R(NULL, scaleM, P(DSCALE)); } DO(next, s);// nicht gatternr for (i=0; impp.maxheights[i] = next->mpp.maxheights[i] * P0(DVAR); } else if (cov->role == ROLE_GAUSS) { assert(cov->key != NULL); double *res = cov->key->rf, sd = sqrt(P0(DVAR)); int i, totalpoints = Gettotalpoints(cov); DO(cov->key, s); if (sd != 1.0) for (i=0; iorigrf) { assert(cov->prevloc->grid); int i, zaehler, d, dim = cov->prevloc->timespacedim, *cumsum = cov->Sdollar->cumsum, *nx = cov->Sdollar->nx, *len = cov->Sdollar->len, *total = cov->Sdollar->total; assert(cov->key != NULL); res_type *res = cov->rf, *rf = cov->key->rf; assert(nx != NULL && total != NULL && cumsum != NULL); for (d=0; d= len[d]) { nx[d] = 0; zaehler -= total[d]; if (++d >= dim) break; nx[d]++; zaehler += cumsum[d]; } if (d >= dim) break; } } } int checkplusmalproc(cov_model *cov) { cov_model *sub; int i, err, dim = cov->tsdim, xdim = cov->xdimown, role = cov->role; Types type = ProcessType; domain_type dom = cov->domown; isotropy_type iso = cov->isoown; //PMI(cov); assert(cov->Splus != NULL); for (i=0; insub; i++) { sub = cov->Splus->keys[i]; if (sub == NULL) SERR("named submodels are not given in a sequence."); if (!TypeConsistency(type, sub)) return ERRORTYPECONSISTENCY; if ((err= CHECK(sub, dim, xdim, type, dom, iso, SUBMODEL_DEP, role)) != NOERROR) return err; if (i==0) { cov->vdim2[0]=sub->vdim2[0]; // to do: inkonsistent mit vorigen Zeilen !! cov->vdim2[1]=sub->vdim2[1]; // to do: inkonsistent mit vorigen Zeilen !! } else { if (cov->vdim2[0] != sub->vdim2[0] || cov->vdim2[1] != sub->vdim2[1]) { SERR("multivariate dimensionality must be equal in the submodels"); } } // printf("OK plusprocess\n"); } return NOERROR; } int checkplusproc(cov_model *cov) { int err; if ((err = checkplusmalproc(cov)) != NOERROR) { return err; } return NOERROR; } int structplusmalproc(cov_model *cov, cov_model VARIABLE_IS_NOT_USED**newmodel){ int m, err; switch(cov->role) { case ROLE_GAUSS : { location_type *loc = Loc(cov); NEW_STORAGE(Splus, PLUS, plus_storage); plus_storage *s =cov->Splus; for (m=0; mnsub; m++) { cov_model *sub = cov->sub[m]; if (s->keys[m] != NULL) COV_DELETE(s->keys + m); if ((err = covcpy(s->keys + m, sub)) != NOERROR) { return err; } assert(s->keys[m] != NULL); assert(s->keys[m]->calling == cov); if (PL >= PL_STRUCTURE) { LPRINT("plus: trying initialisation of submodel #%d (%s).\n", m+1, NICK(sub)); } addModel(s->keys + m, GAUSSPROC); s->keys[m]->calling = cov; // cov_model *fst = cov; while (fst->calling != NULL) fst = fst->calling; // assert(false); err = CHECK(s->keys[m], loc->timespacedim, loc->timespacedim, ProcessType, XONLY, CARTESIAN_COORD, cov->vdim2, ROLE_GAUSS); if (err != NOERROR) { // return err; } //APMI(s->keys[m]); //if (m==1) APMI(s->keys[m]); if ((s->struct_err[m] = err = STRUCT(s->keys[m], NULL)) > NOERROR) { // PMI(s->keys[m]); // assert(false); //printf("end plus\n"); // AERR(err); return err; } //AERR(err); // printf("structplusmal %d %d\n", m, cov->nsub); // PMI(s->keys[m]); } //assert(false); return NOERROR; } default : SERR2("role '%s' not allowed for '%s'", ROLENAMES[cov->role], NICK(cov)); } return NOERROR; } int structplusproc(cov_model *cov, cov_model **newmodel){ assert(cov->nr == PLUS_PROC); return structplusmalproc(cov, newmodel); } int structmultproc(cov_model *cov, cov_model **newmodel){ assert(CovList[cov->nr].check == checkmultproc); return structplusmalproc(cov, newmodel); } int initplusmalproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s){ int i, err, vdim = cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); for (i=0; impp.maxheights[i] = RF_NA; if (cov->Splus == NULL) BUG; if (cov->role == ROLE_GAUSS) { for (i=0; insub; i++) { //printf("i=%d\n", i); cov_model *sub = cov->Splus == NULL ? cov->sub[i] : cov->Splus->keys[i]; assert(cov->sub[i]->stor==NULL); cov->sub[i]->stor = (gen_storage *) MALLOC(sizeof(gen_storage)); if ((err = INIT(sub, 0, cov->sub[i]->stor)) != NOERROR) { return err; } sub->simu.active = true; } cov->simu.active = true; return NOERROR; } else { BUG; } return ERRORFAILED; // assert(false); } int initplusproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s){ int err; if ((err = initplusmalproc(cov, s)) != NOERROR) return err; if (cov->role == ROLE_GAUSS) { cov->fieldreturn = cov->Splus != NULL; cov->origrf = false; if (cov->Splus != NULL) cov->rf = cov->Splus->keys[0]->rf; return NOERROR; } else { BUG; } return ERRORFAILED; } void doplusproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { int m, i, total = cov->prevloc->totalpoints * cov->vdim2[0]; double *res = cov->rf; assert(cov->vdim2[0] == cov->vdim2[1]); if (cov->role == ROLE_GAUSS && cov->method==SpectralTBM) { ERR("error in doplus with spectral"); } assert(cov->Splus != NULL); for (m=0; mnsub; m++) { cov_model *key = cov->Splus->keys[m], *sub = cov->sub[m]; double *keyrf = key->rf; DO(key, sub->stor); if (m > 0) for(i=0; irole == ROLE_GAUSS) { FieldReturn(cov); return NOERROR; } else { BUG; } return ERRORFAILED; } void domultproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *s) { int m, i, total = cov->prevloc->totalpoints * cov->vdim2[0]; double *res = cov->rf; assert(cov->vdim2[0] == cov->vdim2[1]); if (cov->role == ROLE_GAUSS && cov->method==SpectralTBM) { ERR("error in do_mult with spectral"); } assert(cov->Splus != NULL); for(i=0; insub; m++) { cov_model *key = cov->Splus->keys[m], *sub = cov->sub[m]; double *keyrf = key->rf; DO(key, sub->stor); for(i=0; imin[MULTPROC_COPIES] = 1.0; range->max[MULTPROC_COPIES] = RF_INF; range->pmin[MULTPROC_COPIES] = 1.0; range->pmax[MULTPROC_COPIES] = 1000; range->openmin[MULTPROC_COPIES] = false; range->openmax[MULTPROC_COPIES] = true; } // $power void PowSstat(double *x, cov_model *cov, double *v){ logPowSstat(x, cov, v, NULL); //printf("powscale %f %f\n", x[0], v); } void logPowSstat(double *x, cov_model *cov, double *v, double *sign){ cov_model *next = cov->sub[POW_SUB]; double factor, var = P0(POWVAR), scale =P0(POWSCALE), p = P0(POWPOWER), invscale = 1.0 / scale; int i, vdim = cov->vdim2[0], vdimSq = vdim *vdim, xdimown = cov->xdimown; assert(cov->vdim2[0] == cov->vdim2[1]); ALLOC_DOLLAR(z, xdimown); // if (cov->calling->nr != RECTANGULAR) // printf("%s\n", NICK((cov->calling->calling->sub[PGS_LOC]))); // assert(cov->calling->nr == RECTANGULAR || // (cov->calling->calling->sub[PGS_LOC]->nr == LOC && // scale == PARAM0(cov->calling->calling->sub[PGS_LOC], LOC_SCALE))); for (i=0; i < xdimown; i++) z[i] = invscale * x[i]; if (sign==NULL) { COV(z, next, v); factor = var * pow(scale, p); //printf("pows=%f %f %f\n", scale, var, factor); for (i=0; isub[POW_SUB]; double factor, var = P0(POWVAR), scale =P0(POWSCALE), p = P0(POWPOWER), invscale = 1.0 / scale; int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim, xdimown = cov->xdimown; assert(cov->vdim2[0] == cov->vdim2[1]); ALLOC_DOLLARY(z1, z2, xdimown); for (i=0; isub[POW_SUB]; int i, vdim = cov->vdim2[0], vdimSq = vdim * vdim; double y, scale =P0(POWSCALE), p = P0(POWPOWER), var = P0(POWVAR); assert(cov->vdim2[0] == cov->vdim2[1]); y= *x / (var * pow(scale, p)); // inversion, so variance becomes scale if (CovList[next->nr].inverse == ErrCov) BUG; INVERSE(&y, next, v); for (i=0; isub[POW_SUB]; int i; double scale = PisNULL(POWSCALE) ? 1.0 : P0(POWSCALE); cov->taylorN = next->taylorN; for (i=0; itaylorN; i++) { cov->taylor[i][TaylorPow] = next->taylor[i][TaylorPow]; cov->taylor[i][TaylorConst] = next->taylor[i][TaylorConst] * P0(POWVAR) * pow(scale, P0(POWPOWER) - next->taylor[i][TaylorPow]); //printf("TC %f %f\n", cov->taylor[i][TaylorConst], next->taylor[i][TaylorConst]); } cov->tailN = next->tailN; for (i=0; itailN; i++) { cov->tail[i][TaylorPow] = next->tail[i][TaylorPow]; cov->tail[i][TaylorExpPow] = next->tail[i][TaylorExpPow]; cov->tail[i][TaylorConst] = next->tail[i][TaylorConst] * P0(POWVAR) * pow(scale, P0(POWPOWER) - next->tail[i][TaylorPow]); cov->tail[i][TaylorExpConst] = next->tail[i][TaylorExpConst] * pow(scale, -next->tail[i][TaylorExpPow]); } return NOERROR; } int checkPowS(cov_model *cov) { // hier kommt unerwartet ein scale == nan rein ?!! cov_model *next = cov->sub[POW_SUB]; int err, tsdim = cov->tsdim, xdimown = cov->xdimown, xdimNeu = xdimown; kdefault(cov, POWVAR, 1.0); kdefault(cov, POWSCALE, 1.0); kdefault(cov, POWPOWER, 0.0); if ((err = checkkappas(cov)) != NOERROR) { return err; } if ((err = CHECK(next, tsdim, xdimNeu, cov->typus, cov->domown, cov->isoown, SUBMODEL_DEP, cov->role)) != NOERROR) { return err; } setbackward(cov, next); if ((err = TaylorPowS(cov)) != NOERROR) return err; DOLLAR_STORAGE; return NOERROR; } bool TypePowS(Types required, cov_model *cov) { cov_model *next = cov->sub[0]; // printf("\n\n\nxxxxxxxxxxxx %d %s %s\n\n", TypeConsistency(required, next), TYPENAMES[required], NICK(next)); // if (required == ProcessType) crash(); //assert(false); return (required==TcfType || required==PosDefType || required==NegDefType || required==ShapeType || required==TrendType || required==ProcessType || required==GaussMethodType) && TypeConsistency(required, next); } void rangePowS(cov_model *cov, range_type* range){ range->min[POWVAR] = 0.0; range->max[POWVAR] = RF_INF; range->pmin[POWVAR] = 0.0; range->pmax[POWVAR] = 100000; range->openmin[POWVAR] = false; range->openmax[POWVAR] = true; range->min[POWSCALE] = 0.0; range->max[POWSCALE] = RF_INF; range->pmin[POWSCALE] = 0.0001; range->pmax[POWSCALE] = 10000; range->openmin[POWSCALE] = true; range->openmax[POWSCALE] = true; range->min[POWPOWER] = RF_NEGINF; range->max[POWPOWER] = RF_INF; range->pmin[POWPOWER] = -cov->tsdim; range->pmax[POWPOWER] = +cov->tsdim; range->openmin[POWPOWER] = true; range->openmax[POWPOWER] = true; } void PowScaleToLoc(cov_model *to, cov_model *from, int VARIABLE_IS_NOT_USED depth) { assert(!PARAMisNULL(to, LOC_SCALE) && !PARAMisNULL(from, POWSCALE)); PARAM(to, LOC_SCALE)[0] = PARAM0(from, POWSCALE); } int structPowS(cov_model *cov, cov_model **newmodel) { cov_model *next = cov->sub[POW_SUB], *scale = cov->kappasub[POWSCALE]; int err; // cov_model *next; // printf("%s %d %s\n", ROLENAMES[cov->role], cov->role, TYPENAMES[cov->typus]); // if (cov->role != ROLE_GAUSS) { // APMI(cov->calling); //crash(); // } if (!next->deterministic) SERR("random shapes not programmed yet"); switch (cov->role) { case ROLE_SMITH : case ROLE_GAUSS : ASSERT_NEWMODEL_NOT_NULL; if ((err = STRUCT(next, newmodel)) > NOERROR) return err; addModel(newmodel, POWER_DOLLAR); if (!PisNULL(POWVAR)) kdefault(*newmodel, POWVAR, P0(POWVAR)); if (!PisNULL(POWSCALE)) kdefault(*newmodel, POWSCALE, P0(POWSCALE)); if (!PisNULL(POWPOWER)) kdefault(*newmodel, POWPOWER, P0(POWPOWER)); break; case ROLE_MAXSTABLE : { ASSERT_NEWMODEL_NOT_NULL; if ((err = STRUCT(next, newmodel)) > NOERROR) return err; if (!isRandom(scale)) SERR("unstationary scale not allowed yet"); addModel(newmodel, LOC); addSetDistr(newmodel, scale, PowScaleToLoc, true, MAXINT); } break; default : // PMI(cov, "structS"); SERR1("changes in scale/variance not programmed yet for '%s'", ROLENAMES[cov->role]); } return NOERROR; } int initPowS(cov_model *cov, gen_storage *s){ // am liebsten wuerde ich hier die Koordinaten transformieren; // zu grosser Nachteil ist dass GetDiameter nach trafo // grid def nicht mehr ausnutzen kann -- umgehbar?! cov_model *next = cov->sub[POW_SUB], *varM = cov->kappasub[POWVAR], *scaleM = cov->kappasub[POWSCALE]; int vdim = cov->vdim2[0], nm = cov->mpp.moments, nmvdim = (nm + 1) * vdim, err = NOERROR; bool maxstable = hasExactMaxStableRole(cov);// Realisationsweise assert(cov->vdim2[0] == cov->vdim2[1]); assert(cov->key == NULL || ({PMI(cov);false;}));// if (hasAnyShapeRole(cov)) { // !! ohne maxstable selbst !! double var[MAXMPPVDIM], p = P0(POWPOWER), scale = P0(POWSCALE); int i, intp = (int) p, dim = cov->tsdim; // Achtung I-NIT_RANDOM ueberschreibt mpp.* !! if (varM != NULL) { int nm_neu = nm == 0 && !maxstable ? 1 : nm; if ((err = INIT_RANDOM(varM, nm_neu, s, P(POWVAR))) != NOERROR) return err; int nmP1 = varM->mpp.moments + 1; for (i=0; impp.mM[idx + 1]; } } else for (i=0; impp.moments == 1); scale = maxstable ? P0(DSCALE) : scaleM->mpp.mM[1]; } if ((err = INIT(next, nm, s)) != NOERROR) return err; for (i=0; i < nmvdim; i++) { cov->mpp.mM[i] = next->mpp.mM[i]; cov->mpp.mMplus[i] = next->mpp.mMplus[i]; //printf("%s I=%d %f %f\n", NICK(cov->calling), i, cov->mpp.mMplus[i], cov->mpp.mM[i]); } if (varM != NULL && !maxstable) { int j, nmP1 = varM->mpp.moments + 1; for (j=0; jmpp.mM[i] *= varM->mpp.mM[idx + i]; cov->mpp.mMplus[i] *= varM->mpp.mMplus[idx + i]; } } } else { int j, k; double pow_var; for (k=j=0; jmpp.mM[k] *= pow_var; cov->mpp.mMplus[k] *= pow_var; //printf("%s i=%d %f p=%f %f\n", NICK(cov->calling), i, var, pow_var, cov->mpp.mM[i]); } } } if (scaleM != NULL && !maxstable) { if (dim + nm * intp < 0 || dim + intp * nm > scaleM->mpp.moments) SERR("moments cannot be calculated"); assert(scaleM->vdim2[0] == 1 && scaleM->vdim2[1] == 1 ); for (i=0; i <= nm; i++) { int idx = dim + i * intp; cov->mpp.mM[i] *= scaleM->mpp.mM[idx]; cov->mpp.mMplus[i] *= scaleM->mpp.mMplus[idx]; } } else { int j,k; double pow_scale, pow_s = pow(scale, dim), pow_p = pow(scale, p); for (k=j=0; jmpp.mM[k] *= pow_scale; cov->mpp.mMplus[k] *= pow_scale; } //printf("%s i=%d s=%e %e\n", NICK(cov->calling), i, pow_scale, cov->mpp.mM[i]); } } if (R_FINITE(cov->mpp.unnormedmass)) { if (vdim > 1) BUG; cov->mpp.unnormedmass = next->mpp.unnormedmass * var[0] / pow(scale, p); } else { double pp = pow(scale, -p); for (i=0; impp.maxheights[i] = next->mpp.maxheights[i] * var[i] * pp; } // printf("ini pows %f %f %d %f\n", // cov->mpp.maxheight , next->mpp.maxheight , // varM == NULL, varM == NULL ? P0(POWVAR) : 1.0); // cov->mpp.refradius *= scale; //cov->mpp.refsd *= scale; } else if (cov->role == ROLE_GAUSS) { if ((err=INIT(next, 0, s)) != NOERROR) return err; } else if (cov->role == ROLE_BASE) { if ((err=INIT(next, 0, s)) != NOERROR) return err; } else SERR("initiation of scale and/or variance failed"); if ((err = TaylorPowS(cov)) != NOERROR) return err; return NOERROR; } void doPowS(cov_model *cov, gen_storage *s){ if (hasAnyShapeRole(cov)) { cov_model *next = cov->sub[POW_SUB]; DO(next, s);// nicht gatternr double factor = P0(POWVAR) / pow(P0(POWSCALE), P0(POWPOWER)); int i, vdim = cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); for (i=0; impp.maxheights[i] = next->mpp.maxheights[i] * factor; return; } BUG; } RandomFields/src/auxiliary.h0000644000175100001440000000105612412655466015623 0ustar hornikusers #ifndef AUXILIARY_H #define AUXILIARY_H 1 #include "basic.h" double I0mL0(double x); extern "C" { SEXP vectordist(SEXP V, SEXP diag); void sleepMilli(int *milli); void I0ML0(double *x, int *n); double struve(double x, double nu, double factor_sign, bool expscaled); void StruveH(double *x, double *nu); void StruveL(double *x, double *nu, int * expScaled); void ordering(double *d, int len, int dim, int *pos); void Ordering(double *d, int *len, int *dim, int *pos); } bool is_diag(double *aniso, int dim); #endif /* AUXILIARY_H */ RandomFields/src/Specific.cc0000644000175100001440000001057312412655466015503 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de Simulation of a random field by Cholesky or SVD decomposition Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "RF.h" #include "Covariance.h" #include //#include int check_specificGauss(cov_model *cov) { #define nsel 4 cov_model *key = cov->key, *next=cov->sub[0]; int err ; // taken[MAX DIM], // direct_param *gp = &(GLOBAL.direct); // ROLE_ASSERT(ROLE_GAUSS); if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if (CovList[next->nr].Specific == MISMATCH) SERR1("specific method for '%s' not known", NAME(next)); // APMI(cov); //assert(false); if (key == NULL) { #define SPEC_TYPES 4 Types type[SPEC_TYPES] = {PosDefType, PosDefType, NegDefType, TrendType}; int i, iso[SPEC_TYPES] = {SYMMETRIC, SYMMETRIC, SYMMETRIC, CARTESIAN_COORD}, dom[SPEC_TYPES] = {XONLY, KERNEL, XONLY, XONLY}; // APMI(cov->calling); for (i=0; itsdim, cov->tsdim, type[i], dom[i], iso[i], SUBMODEL_DEP, ROLE_COV)) == NOERROR) break; } if (err != NOERROR) return err; if (next->pref[Specific] == PREF_NONE) return ERRORPREFNONE; } else { if ((err = CHECK(key, cov->tsdim, cov->tsdim, ProcessType, XONLY, cov->isoown, SUBMODEL_DEP, ROLE_GAUSS)) != NOERROR) { return err; } //APMI(key); } cov_model *sub = cov->key == NULL ? next : key; setbackward(cov, sub); cov->vdim2[0] = sub->vdim2[0]; cov->vdim2[1] = sub->vdim2[1]; //PMI(cov); return NOERROR; } int struct_specificGauss(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel) { cov_model *next = cov->sub[0]; location_type *loc = cov->prevloc; int err; // PMI(cov); //assert(false); if (next->pref[Specific] == PREF_NONE) { return ERRORPREFNONE; } ROLE_ASSERT_GAUSS; if (cov->key != NULL) COV_DELETE(&(cov->key)); if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; if ((err = CHECK(cov->key, next->tsdim, next->xdimprev, next->typus, next->domprev, next->isoprev, next->vdim2, next->role))!= NOERROR) { //PMI(cov->key); XERR(err); //printf("specific ok\n"); // crash(); return err; } assert(CovList[next->nr].Specific >= 0); cov->key->nr = CovList[cov->key->nr].Specific ; cov->key->role = ROLE_GAUSS; cov->key->typus = ProcessType; //PMI(cov->key); // APMI(cov->key); if ((err = STRUCT(cov->key, NULL)) != NOERROR) { return err; } // APMI(cov->key); if ((err = CHECK(cov->key, loc->timespacedim, cov->xdimown, ProcessType, XONLY, CARTESIAN_COORD, cov->vdim2, ROLE_GAUSS)) != NOERROR) { //PMI(cov->key); XERR(err); //printf("specific ok\n"); // crash(); return err; } //APMI(cov->key); // if (next->nr == PLUS) AERR(err); return err; } int init_specificGauss(cov_model *cov, gen_storage *S) { cov_model *key = cov->key; int err; assert(key != NULL); if (cov->role == ROLE_COV) { return NOERROR; } ROLE_ASSERT_GAUSS; cov->method = Specific; if ((err = INIT(key, 0, S)) != NOERROR) return err; key->simu.active = true; cov->fieldreturn = true; cov->origrf = false; cov->rf = key->rf; return err; } void do_specificGauss(cov_model *cov, gen_storage *S) { cov_model *key = cov->key; location_type *loc = Loc(cov); bool loggauss = GLOBAL.gauss.loggauss; double *res = cov->rf; assert(key != NULL); DO(key, S); if (loggauss) { long i, vdimtot = loc->totalpoints * cov->vdim2[0]; for (i=0; i #include #include "RF.h" #include "Covariance.h" #define POISSON_INTENSITY 0 #define RANDOMCOIN_INTENSITY (COMMON_GAUSS + 1) /* not used double GetTotal(cov_model* cov) { cov_fct *C = CovList + cov->nr; double v = 1.0; int i, nsub = cov->nsub, kappas = C->kappas; if (C->Type == RandomType) { if (cov->total_n >= 0) { int VARIABLE_IS_NOT_USED old_n = cov->total_n; if (cov->total_n < GLOBAL.distr.repetitions) { double *r = (double*) MALLOC(cov->xdimown * sizeof(double)); while(cov->total_n < GLOBAL.distr.repetitions) { DORANDOM(cov, r); assert(cov->total_n > cov->total_n); } free(r); } v *= cov->total_sum / (double) cov->total_n; } } else { for (i=0; isub[i]); } for (i=0; ikappasub[i] != NULL) v *= GetTotal(cov->kappasub[i]); } } return v; } */ int addStandard(cov_model **Cov) { cov_model *cov = (*Cov)->calling, *next = *Cov; int i, err, dim = next->xdimprev, vdim = next->vdim2[0], role = next->role; assert(cov->vdim2[0] == cov->vdim2[1]); addModel(Cov, STANDARD_SHAPE); cov_model *key = *Cov; SetLoc2NewLoc(key, Loc(cov)); assert(key->calling == cov); assert(key->sub[PGS_LOC] == NULL && key->sub[PGS_FCT] != NULL); for (i=0; i<2; i++) { if ((err = CHECK(key, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, vdim, role)) != NOERROR) return err; if (i==0) { if (hasPoissonRole(cov)) { addModel(key, PGS_LOC, UNIF); key->sub[PGS_LOC]->calling = cov; } else { if ((err = STRUCT(key, key->sub + PGS_LOC)) != NOERROR) return err; key->sub[PGS_LOC]->calling = key; } } } return NOERROR; } int addPGS(cov_model **Cov, bool addRandomSign) { // for m3 & random coin cov_model *shape = *Cov; assert(shape->calling != NULL); //domain_type dom = shape->domprev; // isotropy_type iso = shape->isoprev; int err, dim = shape->xdimprev, vdim = shape->vdim2[0], role = shape->role; assert(shape->vdim2[0] == shape->vdim2[1]); //PMI(shape); assert(dim == shape->tsdim); assert(vdim == 1); // most models split into a shape function and location distribution // given the shape function, see oesting, schlather, chen // // for anisotropic models also the reverse modelling could be of interest: // first the location_type aere modelled. Then conditional on the locations // the shape functions are modelled. Um diese Option zu ermoeglichen muesste // noch ein Schalter programmiert werden, oder es ist implizit dadurch // gegeben, dass das Modell eben als ganzen gegeben ist. // // Or the model is given as a whole. This is the first if-condition: // if (isPointShape(shape)) return NOERROR; // else: model is given by the shape and then conditional on the // location assert(!isPointShape(*Cov)); addModel(Cov, PTS_GIVEN_SHAPE); cov_model *cov = *Cov; assert(cov->sub[PGS_LOC] == NULL && cov->sub[PGS_FCT] != NULL); if (addRandomSign) { if (cov->sub[PGS_FCT]->nr != RANDOMSIGN) addModel(cov->sub + PGS_FCT, RANDOMSIGN); } if ((err = CHECK(cov, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, vdim, role)) != NOERROR) return err; // APMI(cov); if ((err = STRUCT(cov, cov->sub + PGS_LOC)) != NOERROR) return err; /* alloc_pgs(cov, dim); pgs_storage *pgs = cov->Spgs; location_type *loc = Loc(cov); if (pgs->minmean == NULL && (pgs->minmean = (double*) CALLOC(dim, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; if (pgs->maxmean == NULL && (pgs->maxmean = (double*) CALLOC(dim, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; if (pgs->localmin == NULL && (pgs->localmin = (double*) CALLOC(dim, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; if (pgs->localmax == NULL && (pgs->localmax = (double*) CALLOC(dim, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; double *x = pgs->minmean, // !! wird gespeichert *y = pgs->maxmean; NONSTATINVERSE(ZERO, shape, x, y); if (ISNAN(x[0]) || x[0] > y[0]) SERR1("inverse of '%s' unknown", NICK(shape)); addModel(cov, PGS_LOC, UNIF); cov_model *loc_model = cov->sub[PGS_LOC]; PARAMALLOC(loc_model, UNIF_MIN, dim, 1); PARAMALLOC(loc_model, UNIF_MAX, dim, 1); assert(shape->vdim2[0] == 1); if (shape->mpp.moments < 2) SERR1("not enough moments known for '%s'", NICK(shape)); pgs->totalmass = shape->mpp.mM[2]; GetDiameter(loc, pgs->localmin, pgs->localmax, pgs->supportcentre); for (d=0; dlocalmin[d] + x[d]; PARAM(loc_model, UNIF_MAX)[d] = pgs->localmax[d] + y[d]; pgs->totalmass *= PARAM(loc_model, UNIF_MAX)[d] - PARAM(loc_model, UNIF_MIN)[d]; } if (!R_FINITE(pgs->totalmass)) { SERR("infinite extension not programmed yet.") } // if ((err = STRUCT(cov, NULL)) != NOERROR) return err; */ cov->sub[PGS_FCT]->calling = cov; if ((err = CHECK(cov, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, vdim, role)) != NOERROR) return err; // APMI(*Cov); return NOERROR; } void range_mpp(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { // assert(cov != NULL); range->min[GEV_XI] = RF_NEGINF; range->max[GEV_XI] = RF_INF; range->pmin[GEV_XI] = -10; range->pmax[GEV_XI] = 10; range->openmin[GEV_XI] = true; range->openmax[GEV_XI] = true; range->min[GEV_MU] = RF_NEGINF; range->max[GEV_MU] = RF_INF; range->pmin[GEV_MU] = -1000; range->pmax[GEV_MU] = 1000; range->openmin[GEV_MU] = true; range->openmax[GEV_MU] = true; range->min[GEV_S] = 0; range->max[GEV_S] = RF_INF; range->pmin[GEV_S] = 0.001; range->pmax[GEV_S] = 1000; range->openmin[GEV_S] = true; range->openmax[GEV_S] = true; } int init_mpp(cov_model *cov, gen_storage *S) { cov_model *sub = cov->key != NULL ? cov->key : cov->sub[0] != NULL ? cov->sub[0] : cov->sub[1]; if (sub == NULL) SERR("substructure could be detected"); location_type *loc = Loc(cov); //window_info *w = &(S->window); int err, // dim = cov->tsdim, role = cov->role, maxstable = hasMaxStableRole(cov); pgs_storage *pgs; if (!maxstable && !hasPoissonRole(cov)) ILLEGAL_ROLE; if (!isPointShape(sub)) SERR1("%s is not shape/point function", NICK(sub)); if (loc->distances) return ERRORFAILED; // printf("%d \n", 1 + (role == ROLE_POISSON_GAUSS));APMI(sub->calling); // print("nr =%d gatter=%d \n", sub->nr, sub->gatternr); // assert(sub->gatternr >= 0); // print("Init=%ld %ld\n", CovList[sub->gatternr].Init, init2); // print("S=%ld\n", S); // // print("end list\n"); if ((err = INIT(sub, maxstable ? 1 : role == ROLE_POISSON ? 0 : 2, S)) != NOERROR) return err; pgs = sub->Spgs; //assert(false); //PMI(cov); assert(pgs != NULL); GetDiameter(loc, pgs->supportmin, pgs->supportmax, pgs->supportcentre); if (maxstable) { if (!R_FINITE(sub->mpp.mMplus[1]) || sub->mpp.mMplus[1] <= 0.0) { // APMI(sub); // printf("mplus %s %f\n", NICK(sub), sub->mpp.mMplus[1]); // crash(); SERR("integral of positive part of submodel unkown"); } //PMI(sub, "sub"); if (!R_FINITE(pgs->zhou_c) && !R_FINITE(pgs->sum_zhou_c)) SERR("maximal height of submodel unkown or the set of locations exceeds possibilities of the programme"); } else if (role == ROLE_POISSON_GAUSS) { if (ISNAN(sub->mpp.mM[2]) || !R_FINITE(sub->mpp.mM[2] || sub->mpp.mM[2] <=0.0)){ SERR("second moment unkown"); } } // else role == ROLE_POISSON -- nothing to do if ((err = FieldReturn(cov)) != NOERROR) { // must be later than INIT ! return err; } cov->simu.active = err == NOERROR; return err; } #define SET_SUB { \ sub = (cov->key != NULL) ? cov->key : /* if changed, change do_max_pgs! */ \ cov->sub[0] != NULL ? cov->sub[0] : cov->sub[1]; \ if (sub == NULL) ERR("substructure could be detected"); \ pgs = sub->Spgs; \ assert(pgs != NULL); \ gridlen = pgs->gridlen; \ end = pgs->end; \ start = pgs->start; \ delta = pgs->delta; \ nx = pgs->nx; \ xstart = pgs->xstart; /* nach DO gesetzt */ \ x = pgs->x; /* nach DO gesetzt */ \ inc = pgs->inc;} void dompp(cov_model *cov, gen_storage *s, double *simuxi) { // printf("here\n"); assert(cov->simu.active); location_type *loc = Loc(cov); if (loc->caniso != NULL) BUG; cov_model *sub = NULL; pgs_storage *pgs = NULL; long spatial = loc->totalpoints; int d, err, *gridlen = NULL, *end = NULL, *start = NULL, *delta = NULL, *nx = NULL, dim = cov->tsdim, every = GLOBAL.general.every, // nthreshold = (every>0) ? every : MAXINT, // covrole = cov->role, subrole = ROLE_FAILED, deltathresh = nthreshold; double logdens, factor, summand, sign[2], value[2], logthreshold, *xstart = NULL, // nach DO gesetzt *x = NULL, // nach DO gesetzt *inc = NULL, *rf = NULL, //M1 = RF_NA, logM2 = RF_NA, gumbel = RF_NA, frechet = RF_NA, threshold = RF_NA, poisson=0.0; res_type *res = cov->rf; assert(res != NULL); ext_bool fieldreturn; bool compoundpoisson, poissongauss, maxstable = hasMaxStableRole(cov), simugrid = loc->grid, partialfield = false, // AVERAGE braucht Sonderbehandlung: randomcoin = cov->method == RandomCoin //only for ROLE_POISSON_GAUSS ; long k, i, zaehler, n, cumgridlen[MAXMPPDIM +1], Total_n, total_pts = loc->totalpoints, vdim = cov->vdim2[0], vdimtot = total_pts * vdim, control = 0; assert(cov->vdim2[0] == cov->vdim2[1]); cov_model *key = cov->key; ext_bool loggiven; double Minimum = RF_NEGINF; // -10 // TO DO if (vdim != 1) error("Poisson point process based methods only work in the univariate case"); SET_SUB; if (!isPointShape(sub)) BUG; subrole = sub->role; compoundpoisson = subrole == ROLE_POISSON; poissongauss = subrole == ROLE_POISSON_GAUSS; Total_n = maxstable ? -1 : rpois(pgs->intensity); assert(maxstable || Total_n > 0); loggiven = key == NULL ? cov->sub[0]->loggiven : key->loggiven; if (!loggiven) Minimum = exp(Minimum); // assert(covrole != ROLE_POISSON_GAUSS || subrole == ROLE_POISSON_GAUSS); // assert(loc->caniso == NULL); // assert(covrole != ROLE_POISSON_GAUSS || sub->mpp.moments >= 2); // assert(covrole == ROLE_POISSON_GAUSS || covrole == ROLE_POISSON || // sub->mpp.moments >= 1); if (simugrid) { cumgridlen[0] = 1; for (d=0; dxgr[d][XSTEP]; gridlen[d] = loc->length[d]; cumgridlen[d+1] = loc->length[d] * cumgridlen[d]; // printf("set d=%d inc=%f gridlen=%d cum=%d\n", d, inc[d], gridlen[d], // (int) cumgridlen[d]); } } if (maxstable) { if (loggiven) { for (i=0; impp.moments < 1 || !R_FINITE(sub->mpp.mMplus[1]) || sub->mpp.mMplus[1] == 0.0) ERR("integral of positive part of the submodel is unknown or not finite"); // M1 = sub->mpp.mMplus[1]; threshold = logthreshold = RF_INF; pgs->globalmin = Minimum; pgs->currentthreshold = loggiven ? pgs->globalmin - threshold : pgs->globalmin / threshold; if (simuxi != NULL) { // to do : RPstudent, extremal t process } } else if (compoundpoisson){ assert(simuxi == NULL); for (i=0; impp.mM[2]); pgs->currentthreshold = 1e-8; } // APMI(sub); for(n=0; ; n++) { // if (n % 1000 == 0) printf("n=%d tot=%d mh=%f, contr=%d: %f < %f; res[0]=%f\n", (int) n, (int) Total_n, sub->mpp.maxheight, (int) control, res[control], threshold, res[0]);// assert(n <= 10); // printf("n=%d\n", n); // assert(n < 1200); // assert(res[0] < 1e-4); // assert(res[0] < 80); if (!maxstable && (n >= Total_n)) break; // for (d=0; dmin[d] = info->max[d] = 0.0; //assert(n < 2 ); // printf("XX.\n"); APMI(sub); if (!sub->deterministic && (err = REINIT(sub, sub->mpp.moments, s)) != NOERROR) BUG; DO(sub, s); //printf("PL =%d\n", PL); // APMI(sub); if (!sub->deterministic) SET_SUB; // printf("here!!!\n"); // PMI(sub); fieldreturn = sub->fieldreturn; // MARCO: hattest Du dies reingenommen? // if (subrole == ROLE_BROWNRESNICK) { // assert(sub->SBR != NULL); // n += sub->SBR->hatnumber; // } // PMI(sub, -1); //printf("log_den %f\n", pgs->log_density); logdens = pgs->log_density; // PMI(sub, -1); if (!R_FINITE(logdens)) { // PMI(sub); BUG; // get_shape = CovList[sub->gatternr].cov; // get_logshape = CovList[sub->gatternr].log; } if (compoundpoisson) { summand = 0.0; } else if (poissongauss) { summand = -0.5 * (logdens + logM2); } else { // max-stable field assert(subrole == ROLE_SMITH || subrole == ROLE_SCHLATHER || subrole == ROLE_BROWNRESNICK); if (n >= GLOBAL.extreme.maxpoints) { PRINTF("'maxpoints' (= %d) exceeded. Simulation is likely to be a rough approximation only. Consider increasing 'maxpoints'.\n", GLOBAL.extreme.maxpoints ); // printf("break1 %d %d\n", n, ((int*) cov->p[MAXSTABLE_POINTS])[0]); break; } poisson += rexp(1.0); frechet = pow(poisson, - 1.0 / pgs->alpha); gumbel = log(frechet); // MARCO, habe ich am 17.11.13 geaendert // pgs->log_zhou_c = 0.0; // wrong! to do summand = gumbel - logdens; // threshold = sub->loggiven ? GumbelThreshold : FrechetThreshold; threshold = logthreshold = (res_type) (gumbel + log(sub->mpp.maxheights[0])); //Gumbel // if (!loggiven) { threshold = exp(threshold); // Frechet } // // APMI(sub); // printf("Max = %f gumbel=%f %f %d logdens=%f\n", sub->mpp.maxheights[0], gumbel, threshold, loggiven, logdens); //printf("for thres=%e %d res=%e zhou=%f(%f) logden=%f gumbel=%f loggiven=%d summand=%f\n", threshold, (int) control, res[control], pgs->zhou_c, sub->mpp.maxheights[0], logdens, gumbel, loggiven, summand);// assert(false); // assert(R_FINITE(threshold )); // { int i; for (i=0; i=threshold)) { // print("control: %d %f %f\n", control, res[control], threshold); assert(false); control++; } if (control >= total_pts) { //printf("break2\n"); break; } //printf("n=%d every =%d %d %d\n", n, GLOBAL.extreme.check_every, PL, PL_STRUCTURE); if (n % GLOBAL.extreme.check_every == 0) { pgs->globalmin = res[control]; for (i=control + 1; iglobalmin) pgs->globalmin = res[i]; if (pgs->globalmin < Minimum) pgs->globalmin = Minimum; // APMI(cov); if (PL >= PL_STRUCTURE) PRINTF("control: %d %f %f global=%f n=%d every=%d %f log.max=%f\n", control, res[control], threshold, pgs->globalmin, n, GLOBAL.extreme.check_every, sub->mpp.maxheights[0], log(sub->mpp.maxheights[0])); } // Marco: pgs->currentthreshold = loggiven ? pgs->globalmin - gumbel : pgs->globalmin / frechet; //printf("loggiven =%d %e %f cur.thr=%e\n", // loggiven, pgs->globalmin, gumbel, pgs->currentthreshold); } factor = exp(summand); // APMI(cov); // //printf("factor %4.4f sumd=%4.4f logdens=%4.4f logM2=%4.4f th=%4.4f %d<%d \n", factor, summand, logdens, logM2, threshold, control, total_pts); // assert(false); // printf("dim=%d loggiven=%d maxstable=%d simugrid=%d randomcoin=%d\n", // dim, loggiven, maxstable, simugrid, randomcoin);// assert(false); //printf("A=%d\n", n); zaehler = 0; if (simugrid) { partialfield = false; for (d=0; dsupportmin[d] - loc->xgr[d][XSTART]) / step); start[d] = dummy < 0 ? 0 : dummy > gridlen[d] ? gridlen[d] : (int)dummy; partialfield |= start[d] > 0; dummy = 1.0 + ((pgs->supportmax[d] - loc->xgr[d][XSTART]) / step); end[d] = dummy < 0 ? 0 : dummy > gridlen[d] ? gridlen[d] : (int) dummy; partialfield |= end[d] < gridlen[d]; //printf("dummy %f %d %d len=%d\n", dummy, gridlen[d], end[d], loc->length[d]); // printf("window [%f %f] [%d %d] %d %d\n", pgs->supportmin[d], pgs->supportmax[d], start[d], end[d], gridlen[d], partialfield); //assert(n < 150); //APMI(cov); if (start[d] >= end[d]) { // //PMI(cov); // printf("broken %d %d %d supp=%f %f, loc.start=%f %f\n", d, // start[d], end[d], // pgs->supportmin[d], pgs->supportmax[d], // loc->xgr[d][XSTART], inc[d]); break; } delta[d] = (end[d] - start[d]) * cumgridlen[d]; nx[d] = start[d]; zaehler += start[d] * cumgridlen[d]; x[d] = xstart[d] = loc->xgr[d][XSTART] + (double) start[d] * inc[d]; if (false || zaehler < 0) { PRINTF("d=%d start=%d, end=%d xstart=%f %f pgs=[%4.3f, %4.3f] xgr=%f %f %f inc=%3.2f\n", // d, start[d], end[d], xstart[d], pgs->xstart[d], pgs->supportmin[d], pgs->supportmax[d], loc->xgr[d][XSTART], loc->xgr[d][XSTEP], loc->xgr[d][XLENGTH], inc[d]); // assert(false); } } // APMI(cov); if (d < dim) { //printf("cont: d=%d\n", d); continue; } } // //printf("simugrid %d\n", simugrid); // assert(false); // APMI(cov); #define STANDARDINKREMENT_ZAEHLER \ d = 0; \ nx[d]++; \ x[d] += inc[d]; \ zaehler += cumgridlen[d]; \ while (nx[d] >= end[d]) { \ nx[d] = start[d]; \ x[d] = xstart[d]; \ zaehler -= delta[d]; /* delta is positive */ \ if (++d >= dim) break; \ nx[d]++; \ x[d] += inc[d]; \ zaehler += cumgridlen[d]; \ } \ if (d >= dim) { break;} // end define StandardInkrement #define GET SHAPE(x, sub, value); /*printf("%f : %f fctr=%f %ld \n", x[0], *value, factor, zaehler); // */ #define LOGGET LOGSHAPE(x, sub, value, sign); #define LOGGETPOS LOGGET if (sign[0] > 0) #define GETRF *value = (res_type) (rf[zaehler]); // printf("%d\n", total_pts); assert(false); #define RFMAX(OP) { \ rf = sub->rf; \ for (i=0; irf; \ for (i=0; i=0 && zaehler=total_pts) { PMI(cov); printf("//z=%d n=%d\n", zaehler, n); } */ \ GET { \ OP; \ /* assert( {if (*value > sub->mpp.maxheights[0] * exp(gumbel) * (1+1e-15)) { printf("//r=%f %f delta=%e %d %e\n", *value / exp(gumbel), sub->mpp.maxheights[0], *value / exp(gumbel) - sub->mpp.maxheights[0], loggiven, factor); };true;}); */ \ /*assert(loggiven || *value <= sub->mpp.maxheights[0] * exp(gumbel) * (1+1e-15)); */ \ if (res[zaehler] < *value) res[zaehler]=*value; \ } #define SUMAPPLY(GET,OP) GET; res[zaehler] += OP; #define APPLY(GET, OP, WHAT) { \ if (simugrid) { \ while(true) { \ WHAT(GET, OP); \ STANDARDINKREMENT_ZAEHLER; \ } \ } else { \ for(x=loc->x; zaehler=0 && zaehler < total_pts); \ int jj, idx, index=0; \ for (jj=0; jj= pgs->own_grid_length[jj]) break; \ index += pgs->own_grid_cumsum[jj] * idx; \ } \ if (jj >= dim) { OP; } else if (false) printf("%d %f %f %f len=%f %d %d\n", jj, x[jj], ogstart[jj], ogstep[jj], pgs->own_grid_length[jj], pgs->own_grid_cumsum[jj], idx); /* // */ \ #define OG_MAXAPPLY(NONE, OP) \ rf = sub->rf; \ OG_BASIC(*value = rf[index]; \ OP; if (res[zaehler] < *value) res[zaehler]=*value;) #define OG_SUMAPPLY(NONE, OP) \ rf = sub->rf; \ OG_BASIC(*value = rf[index]; res[zaehler] += OP;) // OWNGRIDAPPLY(OP, OG_SUMAPPLY_BASIC) #define OWNGRIDAPPLY(NONE, OP, WHAT) { \ double *ogstart = pgs->own_grid_start, \ *ogstep = pgs->own_grid_step; \ APPLY(NONE, OP, WHAT); \ } #define ALL_APPLY(APPLY, MGET, MAPPLY, SGET, SAPPLY, NONLOGGET) \ if (loggiven == true) { \ if (maxstable) APPLY(MGET, (*value) += summand, MAPPLY) \ else APPLY(SGET, sign[0] * exp(*value + summand), SAPPLY); \ } else { /* not loggiven */ \ if (sub->loggiven){ \ if (maxstable) \ APPLY(MGET, *value=sign[0] * exp(*value+summand), MAPPLY) \ else APPLY(SGET, sign[0] * exp(*value + summand), SAPPLY); \ } else { \ assert(R_FINITE(factor)); \ if (maxstable) APPLY(NONLOGGET, (*value) *= factor, MAPPLY) \ else APPLY(NONLOGGET, *value * factor, SAPPLY); \ } \ } #define AVEAPPLY(G,OP0,OP1) { \ warning(" * timescale ?!"); \ if (simugrid) { \ while (true) { \ long zt; \ double zw,inct, segt, ct, st, A, cit, sit; \ inct = sub->q[AVERAGE_YFREQ] * loc->xgr[dim][XSTEP]; \ cit = cos(inct); \ sit = sin(inct); \ G; \ segt = OP1; \ A = OP0; \ ct = A * cos(segt); \ st = A * sin(segt); \ for (zt = zaehler; zt < total_pts; zt += spatial) { \ res[zt] += (res_type) ct; \ zw = ct * cit - st * sit; \ st = ct * sit + st * cit; \ ct = zw; \ res[zaehler] += zw; \ } \ STANDARDINKREMENT_ZAEHLER; \ } \ } else { /* not a grid */ \ x=loc->x; \ /* the following algorithm can greatly be improved ! */ \ /* but for ease, just the stupid algorithm */ \ for (; zaehlerloggiven); // *atomdependent rfbased/not; (( recurrent/dissipative: min/max gesteuert)) if (poissongauss && !randomcoin) { // AVERAGE if (sub->loggiven) { AVEAPPLY(LOGGET, sign[0] * exp(value[0] + summand), sign[1] * exp(value[1])); } else AVEAPPLY(GET, value[0] * factor, value[1]); } else { assert(subrole == ROLE_SMITH || subrole == ROLE_SCHLATHER || subrole ==ROLE_BROWNRESNICK || subrole==ROLE_POISSON || subrole==ROLE_POISSON_GAUSS); if (fieldreturn == HUETCHEN_OWN_GRIDSIZE) { // atomdependent rfbased/not; ALL_APPLY(OWNGRIDAPPLY, NULL, OG_MAXAPPLY, NULL, OG_SUMAPPLY, NULL); } else if (fieldreturn == true) { // extended boolean // todo : !simugrid! && Bereiche einengen!! // note ! no sign may be given currently when fieldreturn and loggiven!! if (partialfield) { if (!simugrid) BUG; ALL_APPLY(APPLY, GETRF, MAXAPPLY, GETRF, SUMAPPLY, GETRF); } else { // !partialfield if (sub->loggiven) { if (maxstable) RFMAX(rf[i] + summand) else RFSUM(exp(rf[i] + summand)); } else { if (maxstable) RFMAX(rf[i] * factor) else RFSUM(rf[i] * factor); } } } else if (fieldreturn == false) { // not field return ALL_APPLY(APPLY, LOGGETPOS, MAXAPPLY, LOGGET, SUMAPPLY, GET); } else BUG; // neither HUETCHEN_OWN_GRIDSIZE, nor true nor false } // printf("B=%d\n", n); if (n >= nthreshold) { if (maxstable) { LPRINT("%d-th pos.: value=%1.3f threshold=%1.3f gu=%1.3f %1.3f %d (%d %d)\n", control, (double) res[control], (double) threshold, gumbel, logdens, loggiven, n, nthreshold); //, deltathresh); nthreshold += deltathresh; } else { PRINTF("n=%d Total=%d\n", (int) (n / 1000), (int)(Total_n)); } } R_CheckUserInterrupt(); //printf("n=%d %f %f %f 0:%f\n", n, res[0], res[1], res[2], res[3]); // assert(res[0] < 80); }// for(n,... -- while control < total_pts //printf("n=%d %f %f %f 3::%f\n", n, res[0], res[1], res[2], res[3]); // Trafo to margins // printf("%d frechet %d \n", sub->loggiven, ev_p->Frechet); if (maxstable){ double meansq, var, mean = RF_NA, n_min = RF_INF, eps = GLOBAL.extreme.eps_zhou; // APMI(cov); if (pgs->alpha != 1.0) { if (loggiven) for (k=0; kalpha; else for (k=0; kalpha); } if (pgs->estimated_zhou_c) { if (PL > 5) PRINTF("zhou_c: %ld %d",pgs->n_zhou_c, GLOBAL.extreme.min_n_zhou); while (pgs->n_zhou_c < GLOBAL.extreme.min_n_zhou) { if ((err = REINIT(sub, sub->mpp.moments, s)) != NOERROR) BUG; DO(sub, s); SET_SUB; } while (pgs->n_zhou_c < n_min) { for (k=0; k<10; k++) { if ((err = REINIT(sub, sub->mpp.moments, s)) != NOERROR) BUG; DO(sub, s); SET_SUB; } mean = (double) (pgs->sum_zhou_c / (long double) pgs->n_zhou_c); meansq = mean * mean; var = (double) (pgs->sq_zhou_c / (long double) pgs->n_zhou_c - meansq); n_min = var / (meansq * eps * eps); if (n_min > GLOBAL.extreme.max_n_zhou) n_min =GLOBAL.extreme.max_n_zhou; // if (PL > 5) PRINTF(" n=%ld, min=%f %f mean=%f zhou=%f eps=%f\n", pgs->n_zhou_c, n_min, (double) pgs->sum_zhou_c, mean, pgs->zhou_c, eps); } // } else { mean = pgs->zhou_c; } // mean /= M1; //printf(" n=%ld, min=%f %f mean=%f zhou=%f eps=%f %f max=%f\n", pgs->n_zhou_c, n_min, (double) pgs->sum_zhou_c, mean, pgs->zhou_c, eps, M1, sub->mpp.maxheights[0]); // printf("loggiven = %d %f %f\n", loggiven, mean, pgs->zhou_c); // APMI(cov); // mean = 250; // 2 statt 11 double xi = P0(GEV_XI); // printf("xi=%f %d logmean=%d %f\n", xi, loggiven, pgs->logmean, mean); if (loggiven) { // 3.6.13 sub->loggiven geaendert zu loggiven if (!pgs->logmean) mean = log(mean); for (k=0; kkappasub[GEV_S] != NULL) { error("'s' cannot be chosen as a function yet."); // check whether s is positive !! } else { double ss = xi == 0 ? P0(GEV_S) : (P0(GEV_S) / xi); //printf("s=%f\n", ss); if (ss != 1.0) for (k=0; kkappasub[GEV_MU] != NULL) { error("mu cannot be chosen as a function yet."); } else { double mu = P0(GEV_MU); // printf("mu=%f xi=%f %f\n", mu, xi, s); //printf("mu=%f\n", mu); if (mu != 0.0) for (k=0; k= PL_SUBIMPORTANT) { PRINTF("number of shape functions used: %d\n", n); } return; } // end dompp void dompp(cov_model *cov, gen_storage *s) { dompp(cov, s, NULL); } //void calculate_integral(int d, double R, cov_model *cov, // integral_type *integral) { // //} //////////////////////////////////////////////////////////////////// // Poisson int check_poisson(cov_model *cov) { cov_model *next=cov->sub[0], *key = cov->key, *sub = key == NULL ? next : key; int err, dim = cov->tsdim; // taken[MAX DIM], mpp_param *gp = &(GLOBAL.mpp); Types type = sub == key ? PointShapeType : ShapeType; //print("eee\n"); cov->role = ROLE_POISSON; kdefault(cov, POISSON_INTENSITY, gp->intensity[dim]); if ((err = checkkappas(cov, true)) != NOERROR) return err; if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if ((err = CHECK(sub, dim, dim, type, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, cov->role)) != NOERROR) return err; setbackward(cov, sub); return NOERROR; } void range_poisson(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[POISSON_INTENSITY] = RF_NEGINF; range->max[POISSON_INTENSITY] = RF_INF; range->pmin[POISSON_INTENSITY] = -10; range->pmax[POISSON_INTENSITY] = 10; range->openmin[POISSON_INTENSITY] = true; range->openmax[POISSON_INTENSITY] = true; } int struct_poisson(cov_model *cov, cov_model **newmodel){ cov_model *next=cov->sub[0]; location_type *loc = Loc(cov); ASSERT_NEWMODEL_NULL; if (cov->role != ROLE_POISSON) SERR1("'%s' not called as random coin", NICK(cov)); if (cov->key != NULL) COV_DELETE(&(cov->key)); if (loc->Time || (loc->grid && loc->caniso != NULL)) { Transform2NoGrid(cov, false, GRIDEXPAND_AVOID); } if (!isPointShape(next)) { int err; if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; if ((err = addStandard(&(cov->key))) != NOERROR) return err; } return NOERROR; } int init_poisson(cov_model *cov, gen_storage *S) { // location_type *loc = Loc(cov); // mpp_storage *s = &(S->mpp); cov_model *key=cov->key; int err; if ((err = init_mpp(cov, S)) != NOERROR) { return err; } //APMI(cov); if (!isPointShape(key)) SERR("no definition of a shape function found"); key->Spgs->intensity = key->Spgs->totalmass * P0(POISSON_INTENSITY); return err; } ////////////////////////////////////////////////////////////////////// // Random Coin ////////////////////////////////////////////////////////////////////// /* void coin(double *x, cov_model *cov, double *v){ cov_model *shape = cov->sub[COIN_SHAPE], *next = cov->sub[COIN_COV]; if (shape == NULL) COV(x, next, v); else { int i, d, vdim = cov->vdim; for (i=0; ixdimown; d++) { if (x[d] != 0.0) { return; } } v[0] = 1.0; // only in the univariate case well defined } } void coinInverse(double *v, cov_model *cov, double *x){ cov_model *shape = cov->sub[COIN_SHAPE], *next = cov->sub[COIN_COV]; if (shape == NULL) INVERSE(v, next, x); else { int i, vdim = cov->vdim; for (i=0; isub[COIN_COV], *shape = cov->sub[COIN_SHAPE], *key = cov->key; int err, dim = cov->tsdim; // taken[MAX DIM], mpp_param *gp = &(GLOBAL.mpp); //extremes_param *ep = &(GLOBAL.extreme); //PMI(cov->calling, "check_randomcoin!"); //PMI(cov, "check random coins"); //APMI(cov); #ifdef LOCAL_MACHINE static bool warn = true; if (warn) warning("coin running only locally"); warn = false; #else return ERRORNOTPROGRAMMEDYET; #endif ROLE_ASSERT(ROLE_POISSON_GAUSS || (cov->role==ROLE_GAUSS && cov->key!=NULL)); ASSERT_ONE_SUBMODEL(cov); if (cov->sub[COIN_COV] != NULL && cov->sub[COIN_SHAPE]!=NULL) SERR2("either '%s' or '%s' must be given", SNAME(COIN_COV), SNAME(COIN_SHAPE)); kdefault(cov, RANDOMCOIN_INTENSITY, gp->intensity[dim]); if ((err = checkkappas(cov, true)) != NOERROR) { //AERR(err); return err; } if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) { //AERR(1); return ERRORDIM; } if (key == NULL) { //printf("SHAPE %ld\n", shape); if (shape == NULL) { if ((err = CHECK(next, dim, dim, PosDefType, XONLY, SYMMETRIC, SCALAR, ROLE_COV)) != NOERROR) { return err; } if ((next->pref[Average] == PREF_NONE) + (next->pref[RandomCoin] == PREF_NONE) !=1){ //APMI(next); //assert(false); return ERRORPREFNONE; } } else { // shape != NULL if (next != NULL) SERR("phi and shape may not be given at the same time"); if ((err = CHECK(shape, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, ROLE_POISSON)) != NOERROR) { return err; } // APMI(cov); } //print("ok\n"); } else { // key != NULL // note: key calls first function to simulate the points // if this is true then AverageIntern/RandomCoinIntern calls Average/RandomCoin cov_model *intern = cov; while (intern != NULL && intern->nr!=AVERAGE_INTERN && isAnyDollar(intern)) intern = intern->key != NULL ? intern->key : intern->sub[0]; if (intern == NULL) { //APMI(key); BUG; } //else if (intern != cov) { // printf("Here\n"); // APMI(cov); // paramcpy(intern, cov, true, false); // } if ((err = cov->role == ROLE_BASE || cov->role == ROLE_GAUSS ? CHECK(key, dim, dim, ProcessType, XONLY, CARTESIAN_COORD, //err SUBMODEL_DEP, ROLE_POISSON_GAUSS) : cov->role == ROLE_POISSON_GAUSS ? CHECK(key, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, //err SUBMODEL_DEP, ROLE_POISSON_GAUSS) : ERRORFAILED ) != NOERROR) { // APMI(cov) return err; } // APMI(cov) } cov_model *sub = key != NULL ? key : shape != NULL ? shape : next; setbackward(cov, sub); // APMI(cov); return NOERROR; } void range_randomcoin(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { range->min[RANDOMCOIN_INTENSITY] = RF_NEGINF; range->max[RANDOMCOIN_INTENSITY] = RF_INF; range->pmin[RANDOMCOIN_INTENSITY] = -10; range->pmax[RANDOMCOIN_INTENSITY] = 10; range->openmin[RANDOMCOIN_INTENSITY] = true; range->openmax[RANDOMCOIN_INTENSITY] = true; } int struct_randomcoin(cov_model *cov, cov_model **newmodel){ cov_model *next = cov->sub[COIN_COV], *shape = cov->sub[COIN_SHAPE]; location_type *loc = Loc(cov); int err, dim = cov->tsdim; // taken[MAX DIM], ROLE_ASSERT(ROLE_POISSON_GAUSS); if (cov->key != NULL) COV_DELETE(&(cov->key)); if (loc->Time || (loc->grid && loc->caniso != NULL)) { Transform2NoGrid(cov, true, GRIDEXPAND_AVOID); SetLoc2NewLoc(next == NULL ? shape : next, Loc(cov)); } ASSERT_NEWMODEL_NULL; if (shape != NULL) { if ((err = covcpy(&(cov->key), shape)) > NOERROR) { return err; } if ((err = CHECK(cov->key, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, ROLE_POISSON)) != NOERROR) { return err; } } else { // shape == NULL, i.e. covariance given if (next == NULL) BUG; if (next->pref[Average] == PREF_NONE && next->pref[RandomCoin]==PREF_NONE) { // if (next->nr > LASTDOLLAR) AERR(ERRORPREFNONE); return ERRORPREFNONE; } if ((err = CHECK(next, dim, dim, PosDefType, XONLY, SYMMETRIC, SCALAR, ROLE_POISSON_GAUSS)) != NOERROR) { return err; } if ((err = STRUCT(next, &(cov->key))) > NOERROR) return err; if (cov->key == NULL) SERR("no structural information for random coins given"); cov->key->calling = cov; } if ((err = addPGS(&(cov->key), cov->pref[Average] == PREF_NONE)) != NOERROR) return err; return NOERROR; } int init_randomcoin(cov_model *cov, gen_storage *S) { cov_model *covshape = cov->sub[ cov->sub[COIN_SHAPE] != NULL ? COIN_SHAPE : COIN_COV], *key = cov->key, *sub = key == NULL ? covshape : key; char name[] = "Poisson-Gauss"; location_type *loc = Loc(cov); //mpp_storage *s = &(S->mpp); int err = NOERROR; sprintf(ERROR_LOC, "%s process: ", name); if (cov->role != ROLE_POISSON_GAUSS) { // PMI(cov->calling, "init_randomcoin"); ILLEGAL_ROLE; } cov->method = covshape->pref[Average] == PREF_NONE ? RandomCoin : Average; if (cov->method == Average && loc->caniso != NULL) { bool diag, quasidiag, semiseparatelast, separatelast; int idx[MAXMPPDIM]; assert(loc->timespacedim <= MAXMPPDIM); analyse_matrix(loc->caniso, loc->cani_nrow, loc->cani_ncol, &diag, &quasidiag, idx, &semiseparatelast, &separatelast); if (!separatelast) SERR("not a model where time is separated"); } if ((err = init_mpp(cov, S)) != NOERROR) { //PMI(cov); AERR(err); return err; } sub->Spgs->intensity = sub->Spgs->totalmass * P0(RANDOMCOIN_INTENSITY); sub->Spgs->log_density = log(P0(RANDOMCOIN_INTENSITY)); // PMI(cov, "randmcoin"); assert(sub->mpp.moments >= 2); if (!R_FINITE(sub->Spgs->totalmass) || !R_FINITE(sub->mpp.mM[2])) SERR("Moments of submodels not known"); sub->role = ROLE_POISSON_GAUSS; return NOERROR; } void do_randomcoin(cov_model *cov, gen_storage *s) { assert(cov->simu.active); bool loggauss = GLOBAL.gauss.loggauss; location_type *loc = Loc(cov); double *res = cov->rf; dompp(cov, cov->stor==NULL ? s : cov->stor);// letzteres falls shape gegeben if (loggauss) { long i, vdimtot = loc->totalpoints * cov->vdim2[0]; for (i=0; isub[0]; if (cov->role == ROLE_SCHLATHER) COV(x, next, v) else { COV(x, next, v); *v = 1.0 - sqrt(0.5 * (1.0 - *v)); } } //#define MPP_SHAPE 0 //#define MPP_TCF 1 int SetGEVetc(cov_model *cov, int role) { int err; extremes_param *ep = &(GLOBAL.extreme); if (cov->role != ROLE_COV) cov->role = role; if (cov->sub[MPP_TCF] != NULL && cov->sub[MPP_SHAPE]!=NULL) SERR2("either '%s' or '%s' must be given", SNAME(MPP_TCF), SNAME(MPP_SHAPE)); if ((err = checkkappas(cov, false)) != NOERROR) return err; kdefault(cov, GEV_XI, ep->GEV_xi); kdefault(cov, GEV_S, P0(GEV_XI) == 0.0 ? 1.0 : fabs(P0(GEV_XI))); kdefault(cov, GEV_MU, P0(GEV_XI) == 0.0 ? 0.0 : 1.0); // print("xi s mu %f %f %f\n", P0(GEV_XI), P0(GEV_S), P0(GEV_MU)); assert(false); if ((err = checkkappas(cov, true)) != NOERROR) return err; if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) { return ERRORDIM; } return NOERROR; } int check_schlather(cov_model *cov) { //print("check schlather\n"); if (!((cov->sub[MPP_TCF] == NULL) xor (cov->sub[MPP_SHAPE] == NULL))) SERR("two submodels given instead of one."); cov_model *key = cov->key, *next = cov->sub[cov->sub[MPP_TCF] != NULL ? MPP_TCF : MPP_SHAPE]; int err, dim = cov->tsdim; // taken[MAX DIM], // mpp_param *gp = &(GLOBAL.mpp); double v; bool schlather = CovList[cov->nr].Init == init_mpp; // printf("A \n"); ASSERT_ONE_SUBMODEL(cov); /// printf("B A \n"); if ((err = SetGEVetc(cov, ROLE_SCHLATHER)) != NOERROR) return err; // printf("CA \n"); cov_model *sub = cov->key==NULL ? next : key; // printf("GA \n"); if (key == NULL) { // printf("key=NULL\n"); int role = isNegDef(sub) ? ROLE_COV //Marco, 29.5.13 : isShape(sub) && schlather ? ROLE_SCHLATHER : isGaussProcess(sub) ? ROLE_GAUSS : isBernoulliProcess(sub) && schlather ? ROLE_BERNOULLI : ROLE_UNDEFINED; ASSERT_ROLE_DEFINED(sub); if ((err = isPosDef(next) ? CHECK(next, dim, dim, PosDefType, XONLY, ISOTROPIC, //err SCALAR, role) : CHECK(next, dim, dim, ProcessType, XONLY, CARTESIAN_COORD, //err, SCALAR, role)) != NOERROR) return err; if (sub->vdim2[0] != 1) SERR("only univariate processes are allowed"); assert(cov->vdim2[0] == cov->vdim2[1]); setbackward(cov, sub); if (role==ROLE_COV) { if (next->pref[Nothing] == PREF_NONE) return ERRORPREFNONE; COV(ZERO, next, &v); if (v != 1.0) SERR2("a correlation function is required as submodel, but '%s' has variance %f.", NICK(next), v); } } else { // key != NULL //printf("key!=NULL\n"); if ( (err = CHECK(key, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, ROLE_SCHLATHER)) != NOERROR) { //APMI(cov); return err; } setbackward(cov, sub); } //print("end check schlather\n"); return NOERROR; } int struct_schlather(cov_model *cov, cov_model **newmodel){ cov_model *sub = cov->sub[cov->sub[MPP_TCF] != NULL ? MPP_TCF : MPP_SHAPE]; int err, role, ErrNoInit; bool schlather = CovList[cov->nr].Init == init_mpp; // else opitz if (cov->role != ROLE_SCHLATHER) BUG; ASSERT_NEWMODEL_NULL; if (cov->key != NULL) COV_DELETE(&(cov->key)); if (cov->sub[MPP_TCF] != NULL) { if ((err = STRUCT(sub, &(cov->key))) > NOERROR) return err; cov->key->calling = cov; } else { if ((err = covcpy(&(cov->key), sub)) != NOERROR) return err; } assert(cov->key->calling == cov); if (cov->key->nr != GAUSSPROC && !isBernoulliProcess(cov->key)) { if (isNegDef(cov->key)) addModel(&(cov->key), GAUSSPROC); else { if (isGaussProcess(cov->key)) { SERR("invalid model specification"); } else SERR2("'%s' currently only allowed for gaussian processes %s", NICK(cov), schlather ? "and binary gaussian processes" : ""); } } assert(cov->key->calling == cov); role = cov->key->nr == GAUSSPROC ? ROLE_GAUSS //Marco, 29.5.13 : isBernoulliProcess(cov->key) ? ROLE_BERNOULLI : ROLE_UNDEFINED; //PMI(cov->key, "role "); ASSERT_ROLE_DEFINED(cov->key); if ((err = CHECK(cov->key, cov->tsdim, cov->xdimown, ProcessType, cov->domown, cov->isoown, cov->vdim2, role)) != NOERROR) return err; // APMI(cov->key); if ((ErrNoInit = STRUCT(cov->key, NULL)) > NOERROR) return ErrNoInit; //err addModel(&(cov->key), STATIONARY_SHAPE); if ((err = CHECK(cov->key, cov->tsdim, cov->xdimown, PointShapeType, cov->domown, cov->isoown, cov->vdim2, ROLE_SCHLATHER)) != NOERROR) return err; return ErrNoInit; } #define OPITZ_ALPHA (LAST_MAXSTABLE + 1) int init_opitzprocess(cov_model *cov, gen_storage *S) { int err; if ( (err = init_mpp(cov, S)) != NOERROR) return err; cov_model *key = cov->key; assert(key != NULL); assert(key->mpp.moments == 1); pgs_storage *pgs = key->Spgs; assert(pgs != NULL); key->mpp.mMplus[1] = INVSQRTTWOPI * pow(2, 0.5 * P0(OPITZ_ALPHA) - 0.5) * gammafn(0.5 * P0(OPITZ_ALPHA) + 0.5); pgs->zhou_c = 1.0 / key->mpp.mMplus[1]; pgs->alpha = P0(OPITZ_ALPHA); return NOERROR; } void range_opitz(cov_model VARIABLE_IS_NOT_USED *cov, range_type *range) { // assert(cov != NULL); range_mpp(cov, range); range->min[OPITZ_ALPHA] = 0; range->max[OPITZ_ALPHA] = RF_INF; range->pmin[OPITZ_ALPHA] = 0.1; range->pmax[OPITZ_ALPHA] = 5; range->openmin[OPITZ_ALPHA] = true; range->openmax[OPITZ_ALPHA] = true; } //////////////////////////////////////////////////////////////////// // Smith int check_smith(cov_model *cov) { cov_model *shape = cov->sub[MPP_SHAPE], *TCF = cov->sub[MPP_TCF], *next = shape != NULL ? shape : TCF, *key = cov->key, *sub = (key==NULL) ? next : key; ; int err, role, dim = cov->tsdim; // taken[MAX DIM], //Types type; ASSERT_ONE_SUBMODEL(cov); if ((err = SetGEVetc(cov, ROLE_SMITH)) != NOERROR) return err; if (key != NULL) { if ((err = CHECK(key, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, ROLE_SMITH)) != NOERROR) return err; } else { // key == NULL if (next == cov->sub[MPP_TCF]) { // PMI(cov); if ((err = CHECK(next, dim, dim, TcfType, XONLY, ISOTROPIC, SCALAR, ROLE_SMITH)) != NOERROR) { return err; } if ((dim == 1 && next->rese_derivs < 1) || (dim >= 2 && dim <= 3 && next->rese_derivs < 2) || dim > 3) { //printf("dim = %d\n", dim); //APMI(next); SERR("submodel does not have enough derivatives (programmed)."); } } else { // shape role = // (isNegDef(sub) && !isPosDef(sub)) ? ROLE_COV //Marco, 29.5.13 isShape(sub) ? ROLE_MAXSTABLE // 23.4.14 : isPointShape(sub) ? ROLE_SMITH : isGaussProcess(sub) ? ROLE_GAUSS : isBernoulliProcess(sub) ? ROLE_BERNOULLI : ROLE_UNDEFINED; ASSERT_ROLE_DEFINED(sub); if ((err = CHECK(next, dim, dim, ShapeType, XONLY, CARTESIAN_COORD, SCALAR, role)) != NOERROR) { return err; } if (next->full_derivs < 0) SERR1("'%s' requires an explicit submodel.", NICK(cov)); } } setbackward(cov, next); return NOERROR; } void param_set_identical(cov_model *to, cov_model *from, int depth) { assert(depth >= 0); assert(to != NULL && from != NULL); assert(strcmp(NICK(from), NICK(to)) == 0); // minimal check int i; assert(from->qlen == to->qlen); if (from->q != NULL) MEMCOPY(to->q, from->q, sizeof(double) * from->qlen); for (i=0; i 0) { for (i=0; isub[i] != NULL) param_set_identical(to->sub[i], from->sub[i], depth - 1); } } } int PointShapeLocations(cov_model *key, cov_model *shape) { assert(key != NULL); // printf("fx \n"); int err, nr = key->nr; assert(isPointShape(key)); if (key->sub[PGS_LOC] != NULL) return NOERROR; if ((err = covcpy(key->sub + PGS_FCT, shape)) != NOERROR) return err; if (nr == PTS_GIVEN_SHAPE) { //PMI(shape, -1); //printf("here %ld %d %d %d\n", key->sub[PGS_LOC], ScaleOnly(shape), // !shape->deterministic, shape->sub[0]->deterministic); if (key->sub[PGS_LOC] == NULL) { if (ScaleOnly(shape) && !shape->deterministic && shape->sub[0]->deterministic) { // pure scale mixture if ((err = covcpyWithoutRandomParam(key->sub + PGS_LOC, shape->sub[0])) != NOERROR) return err; addModel(key, PGS_LOC, RECTANGULAR); addModel(key, PGS_LOC, LOC); addSetDistr(key->sub + PGS_LOC, shape, ScaleDollarToLoc, true, 0); } else { if ((err = covcpyWithoutRandomParam(key->sub + PGS_LOC, shape)) != NOERROR) return err; if (!shape->deterministic) { //APMI(key); addSetDistr(key->sub + PGS_LOC, key->sub[PGS_FCT], param_set_identical, true, MAXINT); } addModel(key, PGS_LOC, RECTANGULAR); } } } else if (nr == STANDARD_SHAPE) { assert(key != NULL && shape != NULL); if ((err = STRUCT(shape, key->sub + PGS_LOC)) != NOERROR) return err; key->sub[PGS_LOC]->calling = key; if (key->sub[PGS_LOC] == NULL) SERR("simple enlarging of the simulation window does not work"); } else BUG; // APMI(key); return NOERROR; } int addPointShape(cov_model **Key, cov_model *shape, cov_model *pts, cov_model *local_pts, int dim, int vdim) { #define PGS_N 2 int i, err = NOERROR, pgs[PGS_N] = {PTS_GIVEN_SHAPE, STANDARD_SHAPE}; char msg[PGS_N][200]; assert(shape != NULL); assert(*Key == NULL); // to do: strokorbball: raeumlich waere Standard/Uniform besser; // praeferenzen programmieren? for (i=0; i 0) { errorMSG(err, msg[i-1]); // XERR(err); } // if (i > 0) XERR(err); assert(i ==0); if (*Key != NULL) { COV_DELETE(Key); // (*Key)->sub + PGS_LOC, pts } assert(shape->calling != NULL); addModel(Key, pgs[i], shape->calling); assert((*Key)->sub[PGS_LOC] == NULL && (*Key)->sub[PGS_FCT] == NULL); // PMI(shape); // PMI(pts); if (pts != NULL) { if ((err = covcpy((*Key)->sub + PGS_FCT, shape)) != NOERROR || (err = covcpy((*Key)->sub + PGS_LOC, pts)) != NOERROR ) return err; Ssetcpy((*Key)->sub[PGS_FCT], (*Key)->sub[PGS_LOC], shape, pts); Ssetcpy((*Key)->sub[PGS_LOC], (*Key)->sub[PGS_FCT], pts, shape); // PMI((*Key)->sub[PGS_FCT]); // APMI((*Key)->sub[PGS_LOC]); } else { // if ((err = PointShapeLocations(*Key, shape)) != NOERROR) continue; if (local_pts != NULL) { // only in plusmalS.cc if ((*Key)->nr != PTS_GIVEN_SHAPE) continue; cov_model *local, *dummy; if ((err = covcpy(&local, false, local_pts, shape->prevloc, NULL, true)) != NOERROR) return err; local->calling = (*Key)->calling; dummy = local; while (dummy->sub[DOLLAR_SUB] != NULL) dummy = dummy->sub[DOLLAR_SUB]; if (dummy->nr != LOC) BUG; dummy->sub[DOLLAR_SUB] = *Key; (*Key)->calling = dummy; } } (*Key)->calling = shape->calling; (*Key)->sub[PGS_FCT]->calling = (*Key)->sub[PGS_LOC]->calling = *Key; //PMI((*Key)->calling); assert((*Key)->sub[PGS_LOC] != NULL && (*Key)->sub[PGS_FCT] != NULL); // APMI(*Key); // printf(">>>>>>> KEY start %d %s \n", i, NICK((*Key))); if ((err = CHECK(*Key, dim, dim, PointShapeType, XONLY, CARTESIAN_COORD, vdim, ROLE_MAXSTABLE)) != NOERROR) { // printf(">>>>>>> KEY break %d %s %d\n", i, Nick(*Key), dim); //PMI(*Key); XERR(err); continue; } NEW_COV_STORAGE(*Key, stor, STORAGE, gen_storage); if ((err = INIT(*Key, 1, (*Key)->stor)) == NOERROR) break; } // for i_pgs if (err != NOERROR) { errorMSG(err, msg[i-1]); sprintf(ERRORSTRING, "no method found to simulate the given model:\n\tpgs: %s\n\tstandard: %s)", msg[0], msg[1]); return ERRORM; } return NOERROR; } int addPointShape(cov_model **Key, cov_model *shape, cov_model *pts, int dim, int vdim) { return addPointShape(Key, shape, pts, NULL, dim, vdim); } int struct_smith_pts(cov_model **Key, cov_model *shape, cov_model *calling, int tsdim, int vdim) { cov_model *dummy = NULL; int err = NOERROR; if ((err = STRUCT(shape, Key)) == NOERROR && *Key != NULL) { (*Key)->calling = calling; // PMI(shape); //APMI(*Key); Types type = TypeConsistency(PointShapeType, *Key) ? PointShapeType : TypeConsistency(RandomType, *Key) ? RandomType : TypeConsistency(ShapeType, *Key) ? ShapeType : OtherType; //PMI(*Key); //PMI(*Key); if (type == RandomType) { // random locations given; // so, it must be of pgs type (or standard): if ((err = CHECK_R(*Key, shape->tsdim)) != NOERROR) { goto ErrorHandling; } dummy = *Key; *Key = NULL; if ((err = addPointShape(Key, shape, dummy, tsdim, vdim)) != NOERROR) goto ErrorHandling; if (*Key == NULL) BUG; (*Key)->calling = calling; // APMI(cov); } else { if ((err = CHECK(*Key, shape->tsdim, shape->xdimprev, type, shape->domprev, shape->isoprev, shape->vdim2, ROLE_MAXSTABLE)) != NOERROR) { goto ErrorHandling; } if (type==PointShapeType) { if ((err = PointShapeLocations(*Key, shape)) != NOERROR) goto ErrorHandling; } else if (type == ShapeType) { dummy = *Key; *Key = NULL; // suche nach geeigneten locationen if ((err = addPointShape(Key, dummy, NULL, tsdim, vdim)) != NOERROR) goto ErrorHandling; //printf("e ddd\n"); } else BUG; } // ! randomtype } else { // S-TRUCT does not return anything int err2; //assert(false); // XERR(err); // APMI(*Key); if ((err2 = addPointShape(Key, shape, NULL, tsdim, vdim)) != NOERROR) { if (err == NOERROR) err = err2; goto ErrorHandling; } err = NOERROR; } ErrorHandling: if (dummy != NULL) COV_DELETE(&dummy); return err; } int struct_smith(cov_model *cov, cov_model **newmodel){ cov_model *tmp_shape = NULL, *shape = cov->sub[MPP_SHAPE], *tcf = cov->sub[MPP_TCF], *tcf_shape = NULL, *sub = shape != NULL ? shape : tcf; location_type *loc = Loc(cov); int err = NOERROR; ASSERT_NEWMODEL_NULL; //APMI(shape); if (cov->role != ROLE_SMITH) BUG; if (loc->Time || (loc->grid && loc->caniso != NULL)) { Transform2NoGrid(cov, false, GRIDEXPAND_AVOID); SetLoc2NewLoc(sub, Loc(cov)); } if (cov->key != NULL) COV_DELETE(&(cov->key)); assert(cov->key == NULL); if (tcf != NULL) { // to do: ausbauen if ((err = covcpy(&tcf_shape, sub)) != NOERROR) return err; addModel(&tcf_shape, STROKORB_MONO); if ((err = CHECK(tcf_shape, tcf->tsdim, tcf->xdimprev, ShapeType, tcf->domprev, tcf->isoprev, tcf->vdim2, ROLE_MAXSTABLE)) != NOERROR) goto ErrorHandling; tmp_shape = tcf_shape; } else { tmp_shape = shape; } // APMI(tmp_shape); if ((err = struct_smith_pts(&(cov->key), tmp_shape, cov, cov->tsdim, cov->vdim2[0])) != NOERROR) goto ErrorHandling; // APMI(cov); err = NOERROR; ErrorHandling: if (tcf_shape != NULL) COV_DELETE(&tcf_shape); return err; } typedef double (*logDfct)(double *data, double gamma); double HueslerReisslogD(double *data, double gamma) { double g = sqrt(2.0 * gamma), logy2y1 = log(data[1] / data[0]); return -pnorm(0.5 * g + logy2y1 / g, 0.0, 1.0, true, false) / data[0] -pnorm(0.5 * g - logy2y1 / g, 0.0, 1.0, true, false) / data[1]; } double schlatherlogD(double *data, double gamma) { double sum = data[0] + data[1], prod = data[0] * data[1]; return 0.5 * sum / prod * (1.0 + sqrt(1.0 - 2.0 * (2.0 - gamma) * prod / (sum * sum))); } #define LL_AUTO 0 #define LL_FULL 1 #define LL_COMPOSITE 2 #define LL_SELECTION 3 #define LL_UNKNOWN error("unknown value for 'likelihood' -- please contact author"); void loglikelihoodMaxstable(double *data, cov_model *cov, logDfct logD, double *v) { cov_model *sub = cov; while (isProcess(sub)) sub = sub->key != NULL ? sub->key : sub->sub[0]; if (cov->q == NULL) { location_type *loc = Loc(cov); long len = loc->totalpoints; cov->qlen = len; // transform everything towards standard Frechet if ((cov->q = (double*) MALLOC(sizeof(double) * len)) == NULL) error("memory allocation error"); if (loc->grid || loc->Time) Transform2NoGrid(sub, false, true); } location_type *loc = Loc(cov); double *x, *y; int dim = cov->xdimown; long i, j, len = loc->totalpoints; if (data != NULL) { double xi = P0(GEV_XI), mu = P0(GEV_MU), s = P0(GEV_S); if (xi == 0) { for (i=0; iq[i] = exp((data[i] - mu) / s); } else { double xiinv = 1.0 / xi, xis = xi / s; for (i=0; iq[i] = pow(1.0 + xis * (data[i] - mu), xiinv); } } switch(GLOBAL.fit.likelihood) { case LL_AUTO: case LL_COMPOSITE: double z[2], gamma, gamma0; COV(ZERO, sub, &gamma0); x = loc->x; for (i=0; iq[i]; z[1] = cov->q[j]; *v += logD(z, gamma0 - gamma); } } break; case LL_FULL: error("full MLE not available for Brown Resnick"); break; case LL_SELECTION: NotProgrammedYet("LL_SELECTION"); default : LL_UNKNOWN; } } void loglikelihoodBR(double *data, cov_model *cov, double *v) { loglikelihoodMaxstable(data, cov, HueslerReisslogD, v); } void loglikelihoodSchlather(double *data, cov_model *cov, double *v) { loglikelihoodMaxstable(data, cov, schlatherlogD, v); } RandomFields/src/metropolis.cc0000644000175100001440000001121212412655466016142 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de Metropolis-Hasting for drawing from the spectral density Copyright (C) 2000 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "RF.h" void metropolis(cov_model *cov, gen_storage *S, double *x) { spec_properties *s = &(S->spec); spectral_density density = s->density; int i,d, dim = cov->tsdim, n = s->nmetro; double p, proposal[MAXTBMSPDIM], dx, *E = s->E, sigma = s->sigma; if (dim >= MAXTBMSPDIM) BUG; //ERR("too high dimension for metropolis."); for (i=0; i=1 || UNIFORM_RANDOM < p) { for (d=0; dspec); double Sigma[maxSearch], x[MAXTBMSPDIM], oldx[MAXTBMSPDIM], log_s, p, prop_factor = S->Sspectral.prop_factor, factor = Factor; int n, i, j, d, ungleich, zaehler, //Z[maxSearch], D[maxSearch], min, mintol, minzaehler, optzaehler, maxzaehler, err=NOERROR, dim = cov->tsdim; s->nmetro = 1; if (s->sigma <= 0.0) { s->sigma = 1.0; optzaehler = (int) (nBase1 * percent); minzaehler = (int) (optzaehler * nBase1percent); if (minzaehler < 10) GERR("internal variables insufficient. Please contact author."); // GERR("please increase 'spectral.percent' and/or nBase1"); maxzaehler = nBase1 - minzaehler; if (maxzaehler < minzaehler) GERR("Internal variables insufficient. Please contact author."); //GERR("please decrease 'spectral.percent'"); min = nBase1 + 1; for (i=0; i < maxSearch; i++) { Sigma[i] = s->sigma; for (d=0; dE[d] = oldx[d] = 0.0; zaehler = 0; for (j=0; j= PL_DETAILS) PRINTF("s=%f: z=%d < %d [%d, %d] fact=%f D=%d %d\n", Sigma[i], zaehler, minzaehler, maxzaehler, optzaehler, factor, D[i], min); if (zaehler < minzaehler || zaehler > maxzaehler) { if (factor > 1.0) factor = 1.0 / factor; else break; s->sigma = factor; } else { s->sigma *= factor; } } if (i >= maxSearch) GERR("Metropolis search algorithm for optimal sd failed\n -- check whether the scale of the problem has been chosen appropriately"); n = 0; log_s = 0.0; mintol = (int) (bestfactor * min); for (j =0; j= PL_DETAILS) PRINTF("%d. sigma=%f D=%d %d\n", j, Sigma[j], D[j], mintol); n++; log_s += log(Sigma[j]); } } s->sigma = exp(log_s / (double) n); if (PL >= PL_DETAILS) PRINTF("optimal sigma=%f \n", s->sigma); } // ****** searching for optimal n for (d=0; dE[d] = oldx[d] = 0.0; zaehler = 0; for (j=0; jnmetro = 1 + (int) fabs(prop_factor / log(p)); if (PL >= PL_DETAILS) for (d=0; dE[d]); if (PL >= PL_DETAILS) PRINTF("opt.sigma=%f opt.n=%d (p=%f, id=%e, zaehler=%d, dim=%d)\n", s->sigma, s->nmetro, p, prop_factor, zaehler, cov->tsdim); ErrorHandling: return err; } RandomFields/src/getNset.cc0000644000175100001440000026561012412655466015373 0ustar hornikusers /* Authors Martin Schlather, schlather@math.uni-mannheim.de (library for simulation of random fields) Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "RF.h" #include "primitive.h" #include void LOC_NULL(location_type *loc) { int d; loc->spatialdim = loc->timespacedim = loc->lx = -1; for (d=0; dxgr[d] = loc->ygr[d] = NULL; loc->length[d] = -1; } loc->totalpoints = loc->spatialtotalpoints = 0; loc->grid = loc->distances = loc->Time = false; loc->delete_x = true; loc->x = loc->y = loc->caniso = NULL; loc->T[0] = loc->T[1] = loc->T[2] = 0.0; loc->i_row = loc->i_col = loc->cani_ncol = loc->cani_nrow = -1; } void LOC_DELETE(location_type **Loc) { // print("LKOC DELETE!"); location_type *loc = *Loc; if (loc == NULL) return; if (loc->x != NULL) { if (loc->delete_x) { if (loc->y != NULL && loc->y != loc->x) free(loc->y); free(loc->x); } } if (loc->caniso != NULL) free(loc->caniso); // it may happen that both are set ! Especially after calling // partial_loc_set in variogramAndCo.cc if (loc->xgr[0] != NULL && loc->spatialdim>0) { if (loc->ygr[0] != NULL && loc->ygr[0] != loc->xgr[0]) free(loc->ygr[0]); free(loc->xgr[0]); /// } free(*Loc); *Loc = NULL; } //void GLOBAL_NULL() { // ReSetGlobal(); //} // //void SetTemporarilyGlobal(globalparam *gp) { // if (!GLOBALORIG.set) { // MEMCOPY(&(GLOBALORIG.param), &GLOBAL, sizeof(globalparam)); // GLOBALORIG.set = true; // } // MEMCOPY(&GLOBAL, gp, sizeof(globalparam)); //} // //void ReSetGlobal() { // if (GLOBALORIG.set) { // MEMCOPY(&GLOBAL, &(GLOBALORIG.param), sizeof(globalparam)); // GLOBALORIG.set = false; // } //} // Achtung! removeonly muss zwingend mit dem originalen SUB + i aufgerufen // werden. Der **Cov ueberschrieben wird. Ansonsten muessen die // Kommentarzeilen geloescht werden ! void removeOnly(cov_model **Cov) { cov_model *cov = *Cov, *next = cov->sub[0]; if (cov->calling == NULL) next->calling = NULL; else { cov_model *calling = cov->calling; // for (i=0; isub[i] == cov) break; // assert (isub[i] = cov->sub[0]; next->calling = calling; } *Cov = next; COV_DELETE_WITHOUTSUB(&cov); } void MPPPROPERTIES_NULL(mpp_properties *Mpp) { // Mpp->refradius= int i; for (i=0; imaxheights[i] = RF_INF; Mpp->unnormedmass = RF_NA; Mpp->mM = Mpp->mMplus = NULL; // Mpp->refsd = //Mpp->totalmass = RF_NA; //Mpp->methnr = -1; //Mpp->loc_done = false; } void MPPPROPERTIES_DELETE(mpp_properties *Mpp) { if (Mpp->mM != NULL) free(Mpp->mM); Mpp->mM = NULL; if (Mpp->mMplus != NULL) free(Mpp->mMplus); Mpp->mMplus = NULL; } void COV_DELETE_WITHOUTSUB(cov_model **Cov) { cov_model *cov = *Cov; assert(cov != NULL); int i, j, last = (cov->nr < 0) ? MAXPARAM : CovList[cov->nr].kappas; for (i=0; inr].kappatype[i] == LANGSXP) { sexp_type *S = PSEXP(i); if (S->Delete) R_ReleaseObject(S->sexp); } else if (CovList[cov->nr].kappatype[i] >= LISTOF) { listoftype *list = PLIST(i); if (list->deletelist) { for (j=0; jnrow[i]; j++) { free(list->p[j]); } } } PFREE(i); cov->ncol[i] = cov->nrow[i] = SIZE_NOT_DETERMINED; // ==0 } } MPPPROPERTIES_DELETE(&(cov->mpp)); if (cov->ownkappanames != NULL) { int kappas = CovList[cov->nr].kappas; for (j=0; jownkappanames[j] != NULL) free(cov->ownkappanames[j]); free(cov->ownkappanames); cov->ownkappanames = NULL; } if (cov->q != NULL) { free(cov->q); cov->qlen = 0; } // important check in combination with above; can be easily removed or // generalised !!!! if (cov->MLE != NULL) free(cov->MLE); //MPPPROPERTIES_DELETE(&(cov->mpp)); cov->prevloc = NULL; LOC_DELETE(&(cov->ownloc)); if (cov->key != NULL) { // printf("deleting key %s\n", CovList[cov->key->nr].name); COV_DELETE(&(cov->key)); } if (cov->rf != NULL && cov->origrf) free(cov->rf); CE_DELETE(&(cov->SCE)); LOCAL_DELETE(&(cov->SlocalCE)); CE_APPROX_DELETE(&(cov->SapproxCE)); DIRECT_DELETE(&(cov->Sdirect)); HYPER_DELETE(&(cov->Shyper)); MIXED_DELETE(&(cov->Smixed)); NUGGET_DELETE(&(cov->Snugget)); PLUS_DELETE(&(cov->Splus)); SEQU_DELETE(&(cov->Sseq)); // SPECTRAL_DELETE(&(cov->Sspectral)); TREND_DELETE(&(cov->Strend)); TBM_DELETE(&(cov->Stbm)); BR_DELETE(&(cov->SBR)); PGS_DELETE(&(cov->Spgs)); SET_DELETE(&(cov->Sset)); POLYGON_DELETE(&(cov->Spolygon)); RECT_DELETE(&(cov->Srect)); DOLLAR_DELETE(&(cov->Sdollar)); GATTER_DELETE(&(cov->S2)); EXTRA_DELETE(&(cov->Sextra)); BIWM_DELETE(&(cov->Sbiwm)); INV_DELETE(&(cov->Sinv)); GET_STORAGE_DELETE(&(cov->Sget)); // SELECT_DELETE(&(cov->Sselect)); STORAGE_DELETE(&(cov->stor)); simu_type *simu = &(cov->simu); simu->active = simu->pair = false; simu->expected_number_simu = 0; free(*Cov); *Cov = NULL; } void COV_DELETE_WITHOUT_LOC(cov_model **Cov) { cov_model *cov = *Cov; int i, nsub = CovList[cov->nr].maxsub; if (cov == NULL) { warning("*cov is NULL in COV_DELETE"); return; } // PMI(cov, "delete"); assert(cov != NULL); for (i=0; isub[i] // seit 1.10.07: luecken erlaubt // bei PSgen ! if (cov->kappasub[i] != NULL) { // printf("%d %d %ld\n",i, MAXPARAM, cov->kappasub[i]); //PMI(cov); //assert(false); COV_DELETE_WITHOUT_LOC(cov->kappasub + i); } } for (i=0; isub[i] // seit 1.10.07: luecken erlaubt // bei PSgen ! // Achtung nach nsub koennen "blinde" Untermodelle kommen, die // nicht geloescht werden duerfen!! if (cov->sub[i] != NULL) COV_DELETE_WITHOUT_LOC(cov->sub + i); } COV_DELETE_WITHOUTSUB(Cov); } void COV_DELETE(cov_model **Cov) { cov_model *cov = *Cov; // if (*Cov == NULL) crash(*Cov); assert(*Cov != NULL); // BUG;PMI(cov); // printf("del %s\n", NAME(cov)); if (cov->calling == NULL) LOC_DELETE(&(cov->prevloc)); COV_DELETE_WITHOUT_LOC(Cov); *Cov = NULL; } void SIMU_NULL(simu_type *simu) { simu->pair = simu->active = false; simu->expected_number_simu =0; } static int CovZaehler = 0; void COV_ALWAYS_NULL(cov_model *cov) { cov->zaehler = CovZaehler++; cov->calling = NULL; cov->prevloc = cov->ownloc = NULL; cov->checked = false; cov->MLE = NULL; cov->key = NULL; cov->rf = NULL; cov->mpp.mM = cov->mpp.mMplus = NULL; cov->mpp.moments = MISMATCH; cov->SCE = NULL; cov->SlocalCE = NULL; cov->SapproxCE = NULL; cov->Sdirect = NULL; cov->Shyper = NULL; cov->Smixed = NULL; cov->Snugget = NULL; cov->Splus = NULL; cov->Sseq = NULL; cov->Stbm = NULL; cov->Strend = NULL; cov->SBR = NULL; cov->Sget = NULL; cov->Spgs = NULL; cov->Sset = NULL; cov->Spolygon = NULL; cov->Srect = NULL; cov->Sdollar = NULL; cov->S2 = NULL; cov->Sextra = NULL; cov->Sbiwm = NULL; cov->Sinv = NULL; //cov->Sselect = NULL; //cov->Sselect = NULL; cov->stor = NULL; cov->fieldreturn = cov->origrf = false; cov->initialised = false; } void COV_NULL(cov_model *cov) { int i, j; COV_ALWAYS_NULL(cov); cov->nr = cov->gatternr = cov->secondarygatternr = MISMATCH; for (i=0; ipx[i] = NULL; cov->ncol[i] = cov->nrow[i] = 0; cov->kappasub[i] = NULL; } for (i=0; itaylor[i][j] = cov->tail[i][j] = 0.0; for ( ; j<=(int) TaylorExpPow; j++) cov->tail[i][j] = 0.0; } cov->q = NULL; cov->qlen = 0; for (i=0; isub[i] = NULL; cov->nsub = 0; cov->user_given = ug_internal; // to know which models are given by the // user and which ones have been added internally cov->role = ROLE_UNDEFINED; cov->typus = UndefinedType; cov->method = Forbidden; cov->tsdim = cov->xdimprev = cov->xdimown =cov->maxdim = cov->xdimgatter = UNSET; cov->vdim2[0] = cov->vdim2[1] = MISMATCH; cov->ownkappanames = NULL; cov->domown = cov->domprev = STAT_MISMATCH; cov->isoown = cov->isoprev = ISO_MISMATCH; cov->logspeed = RF_NA; cov->delflag = 0; cov->full_derivs = cov->rese_derivs = MISMATCH; cov->deterministic = true; cov->monotone = MISMATCH; // cov->total_n = MISMATCH; // cov->total_sum = 0.0; cov->finiterange = cov->loggiven = // cov->diag = cov->semiseparatelast = cov->separatelast = cov->matrix_indep_of_x = false; cov->hess = cov->tbm2num = NOT_IMPLEMENTED; for (i=0; i<=Nothing; i++) cov->pref[i] = PREF_BEST; // mpp und extrG muessen auf NONE sein ! for (; i<=Forbidden; i++) cov->pref[i] = PREF_NONE; cov->taylorN = cov->tailN = 0; MPPPROPERTIES_NULL(&(cov->mpp)); SIMU_NULL(&(cov->simu)); // cov->localcov=NULL; } void FFT_NULL(FFT_storage *FFT) { if (FFT == NULL) return; FFT->work = NULL; FFT->iwork = NULL; } void FFT_destruct(FFT_storage *FFT) { if (FFT->iwork!=NULL) {free(FFT->iwork);} if (FFT->work!=NULL) {free(FFT->work);} FFT_NULL(FFT); } void CE_DELETE(CE_storage **S) { CE_storage *x = *S; if (x != NULL) { int l, vdim = x->vdim, vdimSQ = vdim * vdim; if (x->c!=NULL) { for(l=0; lc[l]!=NULL) free(x->c[l]); free(x->c); } if (x->d!=NULL) { for(l=0; ld[l]!=NULL) free(x->d[l]); free(x->d); } FFT_destruct(&(x->FFT)); if (x->aniso != NULL) free(x->aniso); if (x->gauss1 != NULL) free(x->gauss1); if (x->gauss2 != NULL) free(x->gauss2); free(*S); *S = NULL; } } void CE_NULL(CE_storage* x){ if (x == NULL) return; FFT_NULL(&(x->FFT)); x->positivedefinite = FALSE; x->trials = -1; x->c = x->d = NULL; x->smallestRe = x->largestAbsIm = RF_NA; x->aniso = NULL; x->stop = false; x->gauss1 = x->gauss2 = NULL; // int i; //for (i=0; i[i] = NULL; } void LOCAL_DELETE(localCE_storage**S) { localCE_storage* x = *S; if (x!=NULL) { if (x->correction != NULL) free(x->correction); free(*S); *S = NULL; } } void LOCAL_NULL(localCE_storage* x){ // int i; for (i=0; icorrection = NULL; } void CE_APPROX_DELETE(ce_approx_storage **S) { ce_approx_storage* x = * S; if (x != NULL) { if (x->idx != NULL) free(x->idx); free(*S); *S = NULL; } } void CE_APPROX_NULL(ce_approx_storage* x){ if (x == NULL) return; x->idx = NULL; } void DIRECT_DELETE(direct_storage ** S) { direct_storage *x = *S; if (x!=NULL) { if (x->U!=NULL) free(x->U); if (x->G!=NULL) free(x->G); free(*S); *S = NULL; } } void DIRECT_NULL(direct_storage *x) { if (x == NULL) return; x->U = NULL; x->G = NULL; } void HYPER_DELETE(hyper_storage **S) { hyper_storage *x = *S; if (x != NULL) { free(*S); *S = NULL; } } void HYPER_NULL(hyper_storage* x) { if (x == NULL) return; } void MIXED_DELETE(mixed_storage ** S) { mixed_storage *x = *S; if (x!=NULL) { if (x->Xb != NULL) free(x->Xb); if (x->mixedcov != NULL) free(x->mixedcov); free(*S); *S = NULL; } } void MIXED_NULL(mixed_storage* x) { x->Xb = NULL; x->mixedcov = NULL; x->initialized = false; } void NUGGET_NULL(nugget_storage *x){ if (x == NULL) return; x->pos = NULL; x->red_field = NULL; } void NUGGET_DELETE(nugget_storage ** S) { nugget_storage *x = *S; if (x != NULL) { if (x->pos!=NULL) free(x->pos); if (x->red_field!=NULL) free(x->red_field); free(*S); *S = NULL; } } void PLUS_NULL(plus_storage *x){ if (x != NULL) { int i; for (i=0; ikeys[i] = NULL; } } void PLUS_DELETE(plus_storage ** S){ plus_storage *x = *S; if (x != NULL) { int i; for (i=0; ikeys[i] != NULL) COV_DELETE(x->keys + i); free(*S); *S = NULL; } } void SEQU_NULL(sequential_storage *x){ if (x == NULL) return; x->U11 = NULL; x->U22 = NULL; x->MuT = NULL; x->G = NULL; x->Cov21 = NULL; x->Inv22 = NULL; x->res0 = NULL; } void SEQU_DELETE(sequential_storage ** S){ sequential_storage *x = *S; if (x!=NULL) { if (x->U11!=NULL) free(x->U11); if (x->U22!=NULL) free(x->U22); if (x->MuT!=NULL) free(x->MuT); if (x->G!=NULL) free(x->G); if (x->Cov21!=NULL) free(x->Cov21); if (x->Inv22!=NULL) free(x->Inv22); if (x->res0!=NULL) free(x->res0); free(*S); *S = NULL; } } void SPECTRAL_DELETE(spectral_storage **S) { spectral_storage *x = *S; if (x!=NULL) { // do NOT delete cov --- only pointer // spectral_storage *x; x = *((spectral_storage**)S); free(*S); *S = NULL; } } void SPECTRAL_NULL(spectral_storage *x) { if (x!=NULL) { } } void TREND_DELETE(trend_storage ** S) { trend_storage *x = *S; if (x!=NULL) { if (x->x!=NULL) free(x->x); if (x->xi!=NULL) free(x->xi); if (x->evalplane!=NULL) free(x->evalplane); if (x->powmatrix!=NULL) free(x->powmatrix); free(*S); *S = NULL; } } void TREND_NULL(trend_storage* x) { x->x = NULL; x->xi = NULL; x->evalplane = NULL; x->powmatrix = NULL; } void TBM_DELETE(TBM_storage **S) { TBM_storage *x = *S; if (x!=NULL) { free(*S); *S = NULL; } } void TBM_NULL(TBM_storage* x) { if (x == NULL) return; x->ce_dim = 0; x->err = ERRORFAILED; } void BRTREND_DELETE(double **BRtrend, int trendlen) { int j; if (BRtrend == NULL) return; for (j=0; jtrend != NULL) { BRTREND_DELETE(brS->trend, brS->trendlen); free(brS->trend); } if (brS->shiftedloc != NULL) free(brS->shiftedloc); if (brS->loc2mem != NULL) free(brS->loc2mem); if (brS->countvector != NULL) { for (i=0; ivertnumber; i++) { if (brS->countvector[i] != NULL) free(brS->countvector[i]); } free(brS->countvector); } if (brS->areamatrix != NULL) { for (i=0; ivertnumber; i++) { if (brS->areamatrix[i] != NULL) free(brS->areamatrix[i]); } free(brS->areamatrix); } if (brS->logvertnumber != NULL) free(brS->logvertnumber); if (brS->locindex != NULL) free(brS->locindex); if (brS->suppmin != NULL) free(brS->suppmin); if (brS->suppmax != NULL) free(brS->suppmax); if (brS->locmin != NULL) free(brS->locmin); if (brS->locmax != NULL) free(brS->locmax); if (brS->loccentre != NULL) free(brS->loccentre); if (brS->mem2loc != NULL) free(brS->mem2loc); if (brS->newx != NULL) free(brS->newx); if (brS->vario != NULL) COV_DELETE(&(brS->vario)); for(i=0; ilowerbounds[i] != NULL) free(brS->lowerbounds[i]); if (brS->sub[i] != NULL) COV_DELETE(brS->sub + i); } if (brS->submodel != NULL) COV_DELETE(&(brS->submodel)); free(*S); *S = NULL; } } void BR_NULL(BR_storage *brS) { brS->trend = NULL; brS->trendlen = 0; brS->next_am_check = NA_INTEGER; brS->shiftedloc = NULL; brS->mem2loc = brS->locindex = brS->loc2mem = NULL; brS->memcounter = 0; brS->newx = brS->suppmin = brS->suppmax = brS->locmin = brS->locmax = brS->loccentre = NULL; int i; for (i=0; ilowerbounds[i] = NULL; brS->radii[i] = RF_NA; brS->thresholds[i] = RF_INF; brS->sub[i] = NULL; brS->zeropos[i] = NA_INTEGER; } brS->vario = brS->submodel = NULL; brS->idx = 0; brS->countvector = NULL; brS->areamatrix = NULL; brS->logvertnumber = NULL; } void PGS_DELETE(pgs_storage **S) { pgs_storage *x = *S; if (x!=NULL) { if (x->own_grid_start != NULL) free(x->own_grid_start); if (x->own_grid_step != NULL) free(x->own_grid_step); if (x->own_grid_length != NULL) free(x->own_grid_length); if (x->supportmin != NULL) free(x->supportmin); if (x->supportmax != NULL) free(x->supportmax); if (x->supportcentre != NULL) free(x->supportcentre); if (x->gridlen != NULL) free(x->gridlen); if (x->end != NULL) free(x->end); if (x->start != NULL) free(x->start); if (x->delta != NULL) free(x->delta); if (x->nx != NULL) free(x->nx); if (x->x != NULL) free(x->x); if (x->xgr[0] != NULL) free(x->xgr[0]); if (x->xstart != NULL) free(x->xstart); if (x->inc != NULL) free(x->inc); if (x->v != NULL) free(x->v); if (x->y != NULL) free(x->y); if (x->localmin != NULL) free(x->localmin); if (x->localmax != NULL) free(x->localmax); if (x->minmean != NULL) free(x->minmean); if (x->maxmean != NULL) free(x->maxmean); if (x->single != NULL) free(x->single); if (x->total != NULL) free(x->total); if (x->pos != NULL) free(x->pos); if (x->len != NULL) free(x->len); if (x->min != NULL) free(x->min); if (x->max != NULL) free(x->max); if (x->halfstepvector != NULL) free(x->halfstepvector); // variogramAndCo.cc: if (x->endy != NULL) free(x->endy); if (x->startny != NULL) free(x->startny); if (x->ptrcol != NULL) free(x->ptrcol); if (x->ptrrow != NULL) free(x->ptrrow); if (x->C0x != NULL) free(x->C0x); if (x->C0y != NULL) free(x->C0y); if (x->z != NULL) free(x->z); if (x->cross != NULL) free(x->cross); if (x->Val != NULL) free(x->Val); if (x->cov != NULL) { cov_model *dummy = x->cov; if (x->cov->Spgs != NULL && x->cov->Spgs->cov != NULL && x->cov->Spgs->cov->Spgs == x) { x->cov->Spgs->cov = NULL;// um "Unendlich"-Schleife zu vermeiden! } else { assert(x->cov->Spgs == NULL || x->cov->Spgs->cov == NULL || x->cov->Spgs->cov->Spgs == x); } x->cov = NULL; // Sicherheitshalber COV_DELETE(&(dummy)); } free(*S); *S = NULL; } } void PGS_NULL(pgs_storage* x) { if (x == NULL) return; x->log_density = x->intensity = x->globalmin = x->currentthreshold = RF_NEGINF; x->flat = x->estimated_zhou_c = x->logmean = false; x->totalmass = RF_NA; x->alpha = 1.0; // !! standard x->size = -1; x->zhou_c = RF_NA; x->sq_zhou_c = x->sum_zhou_c = 0; x->n_zhou_c = 0; x->single = x->total = x->v = x->x = x->xstart = x->inc = x->localmin = x->localmax =x->minmean = x->maxmean = x->own_grid_start = x->own_grid_step = x->own_grid_length = x->supportmin = x->supportmax = x->supportcentre = NULL; x->xgr[0] = NULL; x->gridlen = x->end = x->start = x->delta = x->nx = NULL; x->y = NULL; x->pos = x->len = x->min = x->max = NULL; x->halfstepvector = NULL; // variogramAndCo.cc x->endy = x->startny = x->ptrcol = x->ptrrow = NULL; x->C0x = x->C0y = x->cross = x->z = NULL; x->Val = NULL; x->param_set = NULL; x->cov = NULL; } void SET_DELETE(set_storage **S) { set_storage *x = *S; if (x!=NULL) { // if (x->valueRemote != NULL) free(x->valueRemote); // if (x->valueLocal != NULL) free(x->valueLocal); //if (x->bytes != NULL) free(x->bytes); free(*S); *S = NULL; } } void SET_NULL(set_storage* x) { if (x == NULL) return; x->remote = NULL; x->set = NULL; // x->valueRemote = x->valueLocal = NULL; //x->bytes = NULL; x->variant = 0; } void POLYGON_DELETE(polygon_storage **S) { polygon_storage *x = *S; if (x != NULL) { if (x->vdual != NULL) { int i; for (i=0; in_vdual; i++) free(x->vdual[i]); free(x->vdual); } if (x->vprim != NULL) free(x->vprim); if (x->P != NULL) { freePolygon(x->P); free(x->P); } } free(*S); *S = NULL; } void POLYGON_NULL(polygon_storage* x) { if (x == NULL) return; x->vprim = NULL; x->vdual = NULL; x->n_vdual = x->n_vertex = x->n_v = 0; polygon *P = x->P; if (P == NULL) BUG; P->e = NULL; P->v = NULL; P->n = 0; } void RECT_DELETE(rect_storage **S){ rect_storage *x = *S; if (x!=NULL) { if (x->value != NULL) free(x->value); if (x->weight != NULL) free(x->weight); if (x->tmp_weight != NULL) free(x->tmp_weight); if (x->right_endpoint != NULL) free(x->right_endpoint); if (x->ysort != NULL) free(x->ysort); if (x->z != NULL) free(x->z); if (x->squeezed_dim != NULL) free(x->squeezed_dim); if (x->assign != NULL) free(x->assign); if (x->i != NULL) free(x->i); free(*S); *S = NULL; } } void RECT_NULL(rect_storage* x) { if (x == NULL) return; x->tmp_n = x->nstep = -999; x->value = x->weight = x->tmp_weight = x->right_endpoint = x->ysort = x->z = NULL; // for PMI // x->inner = x->inner_const = x->inner_pow = x->outer = // x->outer_const = x->outer_pow = x->outer_pow_const = x->step = RF_NA; x->squeezed_dim = x->assign = x->i = NULL; } void DOLLAR_DELETE(dollar_storage **S) { dollar_storage *x = *S; if (x!=NULL) { if (x->z != NULL) free(x->z); if (x->z2 != NULL) free(x->z2); if (x->y != NULL) free(x->y); if (x->y2 != NULL) free(x->y2); if (x->save_aniso != NULL) free(x->save_aniso); if (x->inv_aniso != NULL) free(x->inv_aniso); if (x->nx != NULL) free(x->nx); if (x->len != NULL) free(x->len); if (x->total != NULL) free(x->total); if (x->cumsum != NULL) free(x->cumsum); free(*S); *S = NULL; } } void DOLLAR_NULL(dollar_storage* x) { if (x == NULL) return; x->z = x->z2 = x->y = x->y2 = x->save_aniso = x->inv_aniso = NULL; x->cumsum = x->nx = x->total = x->len = NULL; } void GATTER_DELETE(gatter_storage **S) { gatter_storage *x = *S; if (x!=NULL) { if (x->z != NULL) free(x->z); free(*S); *S = NULL; } } void GATTER_NULL(gatter_storage* x) { if (x == NULL) return; x->z = NULL; // x->zsys = NULL; } void EXTRA_DELETE(extra_storage **S) { extra_storage *x = *S; if (x!=NULL) { if (x->a != NULL) free(x->a); if (x->b != NULL) free(x->b); if (x->c != NULL) free(x->c); free(*S); *S = NULL; } } void EXTRA_NULL(extra_storage* x) { if (x == NULL) return; x->a = x->b = x->c = NULL; } void BIWM_DELETE(biwm_storage **S) { biwm_storage *x = *S; if (x!=NULL) { free(*S); *S = NULL; } } void BIWM_NULL(biwm_storage* x) { if (x == NULL) return; } void INV_DELETE(inv_storage **S) { inv_storage *x = *S; if (x!=NULL) { if (x->v != NULL) free(x->v); if (x->wert != NULL) free(x->wert); free(*S); *S = NULL; } } void INV_NULL(inv_storage* x) { if (x == NULL) return; x->v = NULL; x->wert = NULL; } void GET_STORAGE_NULL(get_storage *s){ s->orig = s->get_cov = NULL; s->idx = NULL; s->param_nr = -1; } void GET_STORAGE_DELETE(get_storage **S){ get_storage *x = *S; if (x != NULL) { if (x->idx != NULL) free(x->idx); free(*S); *S = NULL; } } void STORAGE_NULL(gen_storage *x) { int d; if (x == NULL) return; // x->mpp.newx = NULL; // for (d=0; dwindow.min[d] = x->window.max[d] = x->window.centre[d] = RF_NA; x->check = true; x->Sspectral.phistep2d = x->Sspectral.phi2d = x->Sspectral.prop_factor = RF_NA; x->Sspectral.grid = x->Sspectral.ergodic = false; x->spec.nmetro = -1; x->spec.sigma = -1.0; x->spec.density = NULL; for (d=0; dspec.E[d] = x->spec.sub_sd_cum[d] = RF_NA; } } void STORAGE_DELETE(gen_storage **S) { gen_storage *x = *S; if (x!=NULL) { free(*S); *S = NULL; } } void addModel(cov_model **pcov, int covnr, cov_model *calling, bool nullOK) { cov_model *cov; int i; // printf("addmodel: %s %ld\n", CovList[covnr].name, (long int) *pcov); cov = (cov_model*) MALLOC(sizeof(cov_model)); COV_NULL(cov); //assert(cov->calling == NULL); cov->nr = covnr; if (*pcov != NULL) { cov->nsub = 1; cov->calling = (*pcov)->calling; (*pcov)->calling = cov; cov->sub[0] = *pcov; for (i=0; i<=Forbidden; i++) { // cov->user[i] = cov->sub[0]->user[i]; cov->pref[i] = cov->sub[0]->pref[i]; } } if (calling != NULL) cov->calling = calling; else if (!nullOK && *pcov == NULL) { PRINTF("Missing link for model '%s'.\n", NICK(cov)); BUG; } *pcov = cov; } void addModel(cov_model **pcov, int covnr) { addModel(pcov, covnr, NULL, false); } void addModel(cov_model *pcov, int subnr, int covnr) { assert(pcov != NULL); addModel(pcov->sub + subnr, covnr, pcov, false); } void addModelKappa(cov_model *pcov, int subnr, int covnr) { assert(pcov != NULL); addModel(pcov->kappasub + subnr, covnr, pcov, false); } void addModel(cov_model **pcov, int covnr, cov_model *calling) { addModel(pcov, covnr, calling, false); } int setgrid(coord_type xgr, double *x, long lx, int spatialdim) { if (lx!=3) { // PRINTF("%d\n", lx); // crash(); SERR("Problem with the coordinates (non-integer number of locations or non-positive step)") } int d; unsigned long totalBytes = sizeof(double) * lx * spatialdim; if (xgr[0] == NULL && (xgr[0] =(double*) MALLOC(totalBytes))==NULL) return ERRORMEMORYALLOCATION; //printf("setgrid %d\n", totalBytes); MEMCOPY(xgr[0], x, totalBytes); // folgende Zeile nur beim ersten Mal zu setzen, aber egal for (d=1; dly > 0) BUG; if (loc->distances) { SERR("distances are allowed only for cartesian systems"); } if (loc->grid) { loc->ly = 3; double *ygrid = (double*) MALLOC(sizeof(double) * loc->ly *loc->spatialdim); int i; for (i=d=0; dspatialdim; d++) { ygrid[i++] = 0.0; ygrid[i++] = 0.0; ygrid[i++] = 1.0; } setgrid(loc->ygr, ygrid, loc->ly, loc->spatialdim); } else { loc->ly = 1; if ((loc->y=(double*) CALLOC(loc->ly * loc->xdimOZ, sizeof(double) ))==NULL) return ERRORMEMORYALLOCATION; } if (loc->Time) { if (loc->grid) loc->ygr[loc->spatialdim] = loc->T; } return NOERROR; } int partial_loc_set(location_type *loc, double *x, double *y, long lx, long ly, bool dist, int xdimOZ, double *T, bool grid, bool cpy){ int d, err; unsigned long totalBytes; if (((loc->x != NULL) && ((loc->y == NULL) xor (ly==0))) || ((loc->xgr[0] != NULL) && ((loc->ygr[0] == NULL) xor (ly==0)))) { // 28783440 51590192 0; 0 0 0 dist=0 //printf("%ld %ld %d; %ld %ld %d dist=%d\n", // (long int) loc->x, (long int)loc->y, ly, // (long int) loc->xgr[0], (long int) loc->ygr[0], ly, loc->distances); // assert(false); // //crash(); SERR("domain structure of the first and second call do not match"); } assert(x != NULL); loc->xdimOZ = xdimOZ; // ohne Zeit !! loc->lx = lx; loc->ly = ly; if (ly > 0) { //crash(); if (dist) { SERR("distances are not allowed if y is given"); } } loc->grid = grid; loc->distances = dist; if (loc->delete_x) { if (loc->y != NULL) { if (loc->y != loc->x) free(loc->y); loc->y = NULL; } if (loc->x != NULL) { free(loc->x); loc->x = NULL; } } loc->delete_x = cpy; if (grid) { if ((err = setgrid(loc->xgr, x, lx, loc->spatialdim)) !=NOERROR) return err; if (ly>0) { if (x == y) for(d=0; dspatialdim; d++) loc->ygr[d] = loc->xgr[d]; else { if ((err = setgrid(loc->ygr, y, ly, loc->spatialdim)) !=NOERROR) return err; } } for (d=0; dspatialdim; d++) loc->length[d] = (int) loc->xgr[d][XLENGTH]; for (loc->spatialtotalpoints=1, d=0; dspatialdim; d++) { loc->spatialtotalpoints *= loc->length[d]; } loc->totalpoints = loc->spatialtotalpoints; } else if (dist) { // lx : anzahl der Puntke involviert, d.h. x muss die Laenge lx ( lx -1) / 2 // haben. if (cpy) { totalBytes = sizeof(double) * lx * (lx - 1) / 2 * xdimOZ; if ((loc->x=(double*) MALLOC(totalBytes))==NULL){ return ERRORMEMORYALLOCATION; } MEMCOPY(loc->x, x, totalBytes); } else { loc->x = x; } loc->totalpoints = loc->spatialtotalpoints = loc->length[0] = lx; // (int) (1e-9 + 0.5 * (1.0 + sqrt(1.0 + 8.0 * lx))); // if (0.5 * (loc->totalpoints * (loc->totalpoints - 1.0)) != lx) { //printf("tot=%d %d %d\n", loc->totalpoints, (int) ( 0.5 * (loc->totalpoints * (loc->totalpoints - 1.0))), (int) lx); assert(false); // SERR("distances do not have expected size"); //} } else { // not grid, not distances if (cpy) { totalBytes = sizeof(double) * lx * loc->xdimOZ; // printf("totalbyets %d %ld %d\n", totalBytes, lx, loc->xdimOZ); if ((loc->x=(double*) MALLOC(totalBytes))==NULL){ return ERRORMEMORYALLOCATION; } //printf("%d %d\n", loc->x==NULL, x==NULL); MEMCOPY(loc->x, x, totalBytes); if (loc->ly>0) { if (x == y) { loc->y = loc->x; } else { totalBytes = sizeof(double) * ly * loc->xdimOZ; //printf("totalbytes y %d %ld %d\n", totalBytes, ly, loc->xdimOZ); if ((loc->y=(double*) MALLOC(totalBytes))==NULL){ return ERRORMEMORYALLOCATION; } MEMCOPY(loc->y, y, totalBytes); } } } else { loc->x = x; loc->y = y; } //printf("getnset %d\n", lx); loc->totalpoints = loc->spatialtotalpoints = loc->length[0]= lx; // just to say that considering these values does not make sense for (d=1; dspatialdim; d++) loc->length[d]=0; // correct value for higher dimensions (never used) } if ((loc->Time) xor (T!=NULL)) { //cov_model *cov; crash(cov); // AERR(1); SERR("partial_loc: time mismatch"); } if (loc->Time) { MEMCOPY(loc->T, T, sizeof(double) * 3); if (grid) { loc->xgr[loc->spatialdim] = loc->T; if (ly>0) loc->ygr[loc->spatialdim] = loc->T; } loc->length[loc->spatialdim] = (int) loc->T[XLENGTH]; if (loc->length[loc->spatialdim]<=0) { SERR1("The number of temporal points is not positive. Check the triple definition of 'T' in the man pages of '%s'.", CovList[SIMULATE].nick) } loc->totalpoints *= loc->length[loc->spatialdim]; } return NOERROR; } int loc_set(double *x, double *y, double *T, int spatialdim, /* spatial dim only ! */ int xdimOZ, long lx, long ly, bool Time, bool grid, bool distances, location_type **Loc) { int d, err; //unsigned long totalBytes; // preference lists, distinguished by grid==true/false and dimension // lists must end with Nothing! if (*Loc != NULL) LOC_DELETE(Loc); location_type *loc = *Loc = (location_type*) MALLOC(sizeof(location_type)); LOC_NULL(loc); loc->timespacedim = spatialdim + (int) Time; loc->spatialdim = spatialdim; loc->Time = Time; if (spatialdim<1 || loc->timespacedim>MAXSIMUDIM) return ERRORDIM; //printf("loc %ld %d\n", lx, xdimOZ); assert(x != NULL); if ((err = partial_loc_set(*Loc, x, y, lx, ly, distances, xdimOZ, Time ? T : NULL, grid, true)) != NOERROR) XERR(err); for (d=loc->timespacedim; dlength[d] = -1;// 1 return NOERROR; } int loc_set(cov_model *cov, long totalpoints) { location_type *loc; if (cov->ownloc == NULL) { loc = cov->ownloc = (location_type*) MALLOC(sizeof(location_type)); LOC_NULL(loc); loc->delete_x = false; } else { loc = Loc(cov); if (loc->xgr[0] != NULL || loc->x != NULL) BUG; } cov->ownloc->totalpoints = totalpoints; return NOERROR; } int loc_set(double *x, double *T, int spatialdim, /* spatial dim only ! */ int xdimOZ, /* original ! */ long lx, bool Time, bool grid, bool distances, location_type **Loc) { return loc_set(x, NULL, T, spatialdim, xdimOZ, lx, 0, Time, grid, distances, Loc); } void analyse_matrix(double *aniso, int row, int col, bool *diag, bool *quasidiag, int *idx, bool *semiseparatelast, bool *separatelast) { // diag, falls durch einfuegen von spalten diag-Matrix erhalten // werden kann // see also Type -- can it be unified ???? /* -> i | * 0 0 j 0 0 * 0 * 0 */ bool notquasidiag=true, *taken=NULL; int j, k, startidx, i, last; if (aniso == NULL) { *diag = *quasidiag = *separatelast = *semiseparatelast = true; for (i=0; i= row; } if (!(*semiseparatelast = *diag)) { /* * * 0 * * 0 * * * */ last = col * row - 1; for (k=last - row + 1; k= 0) return match; return Match(name, CovNames, currentNrCov); } int Match(char *name, name_type List, int n) { // == -1 if no matching name is found // == -2 if multiple matching fctns are found, without one matching exactly unsigned int ln; int Nr; Nr=0; ln=strlen(name); // print("Match %d %d %s %s %d\n", Nr, n, name, List[Nr], ln); while ( Nr < n && strncmp(name, List[Nr], ln)) Nr++; if (Nr < n) { if (ln==strlen(List[Nr])) // exactmatching -- take first -- changed 1/7/07 return Nr; // a matching function is found. Are there other functions that match? int j; bool multiplematching=false; j=Nr+1; // if two or more covariance functions have the same name // the last one is taken while (jxdimprev, vdim = cov->vdim2[0], err = NOERROR; double y, yold, x[MAXGETNATSCALE], threshold, natsc, factor, sign, newx, xsave, newy, *dummy = NULL, rel_threshold = 0.05; bool domain = cov->domown ==XONLY; // covfct cf=NULL; // nonstat_covfct ncf=NULL; assert(MAXGETNATSCALE <= MAXCOVDIM); // ZERO redxdim = cov->xdimown; if (redxdim > MAXGETNATSCALE) { err = -1; goto ErrorHandling; } if ((dummy = (double*) MALLOC(sizeof(double) * vdim * vdim)) == NULL) { err = -2; goto ErrorHandling; } if (cov->full_derivs < 0) { err=ERRORNOTDEFINED; goto ErrorHandling; } if (domain) { COV(ZERO, cov, dummy); } else { NONSTATCOV(ZERO, ZERO, cov, dummy); } threshold = rel_threshold * dummy[0]; for (d=0; d threshold); if (yold > threshold) { factor = 2.0; sign = 1.0; } else { factor = 0.5; sign = -1.0; } double otherx; x[idx] *= factor; if (domain) COV(x, cov, dummy) else NONSTATCOV(ZERO, x, cov, dummy); y = dummy[0]; // print("%f %f : y=%f diff=%f %f\n", x[0], x[1], y, y - threshold, // sign * (y - threshold)); while (sign * (y - threshold) > 0) { if (yold10) { err=ERRORWAVING; goto ErrorHandling; } } yold = y; x[idx] *= factor; if (x[idx]>1E30) { err=ERRORRESCALING; goto ErrorHandling; } if (domain) COV(x, cov, dummy) else NONSTATCOV(ZERO, x, cov, dummy); y = dummy[0]; } otherx = x[idx] / factor; // print("%f %f : y=%f diff=%f %f\n", x[0], x[1], y, y - threshold, // sign * (y - threshold)); for (i=0; i<3 /* good choice?? */ ;i++) { // print("%d %f %f; other=%f\n", i, x[0], x[1], otherx); if (y==yold) { err=ERRORWAVING; goto ErrorHandling; } newx = x[idx] + (x[idx]-otherx)/(y-yold)*(threshold-y); // print("newx=%f xidx=%f, oth=%f y=%f yold=%f, thr=%f\n", // newx, x[idx], otherx, y, yold, threshold); // print("thres %f\n", threshold); xsave = x[idx]; x[idx] = newx; if (domain) COV(x, cov, dummy) else NONSTATCOV(ZERO, x, cov, dummy); newy = dummy[0]; x[idx] = xsave; if (sign * (newy - threshold) > 0) { otherx = newx; yold = newy; } else { x[idx] = newx; y = newy; } } // print("%f %f\n", y, threshold); if (y==yold) { err=ERRORWAVING; goto ErrorHandling; } natsc = 1.0 / ( x[idx] + (x[idx]-otherx)/(y-yold)*(threshold-y) ); if (redxdim == xdimprev || d==0) { natscale[d] = natsc; } else { int beg, end; if (redxdim == 2) { if (d==0) { beg = 0; end = xdimprev-1; } else { beg = end = xdimprev-1; } } else { beg = 0; end = xdimprev; } for (i=beg; inr; // nicht gatternr *natscale = 0.0; if (C->maxsub!=0) XERR(ERRORFAILED); if (C->isotropy != ISOTROPIC || C->domain != XONLY || !isPosDef(C->Type) || C->vdim != SCALAR) ERR("anisotropic function not allowed"); if (C->finiterange == true) { *natscale = 1.0; return; } if (C->inverse!=NULL) { C->inverse(&GLOBAL.gauss.approx_zero, cov, natscale); *natscale = 1.0 / *natscale; if (ISNAN(*natscale) || *natscale != 0.0) { return; } } if (NS != NATSCALE_ORNUMERIC) XERR(ERRORRESCALING); if ((C->cov)==nugget) XERR(ERRORRESCALING); // already calculated ? // parami=KAPPA; // do not compare mean,variance, etc. // if (oldcovnr==*covnr) { // for (; parami<=LASTKAPPA; parami++) { // if (oldp[parami]!=p[parami]) { // break; // } // } // if (parami > LASTKAPPA) { // *natscale=OldNatScale; // return; // } // } // for (; parami<=LASTKAPPA; parami++) {oldp[parami]=p[parami];} /* ************************************** Now, find a quick and good solution for NewInvScale -- */ assert(cov->xdimown == 1); MultiDimRange(cov, natscale); } void Getxsimugr(coord_type x, double *aniso, int timespacedim, double **xsimugr) { // bisher nur fuer Diagonalmatrizen int n, i, w; if (aniso == NULL) { for(w=0; wtaylorN = from->taylorN; to->tailN = from->tailN; for(i=0; itaylorN; i++) { for (j=0; j<=TaylorPow; j++) to->taylor[i][j] = from->taylor[i][j]; } for(i=0; itailN; i++) { for (j=0; j<=TaylorExpPow; j++) to->tail[i][j] = from->tail[i][j]; } } void paramcpy(cov_model *to, cov_model *from, bool freeing, bool allocating, bool copy_lists, bool recursive, bool copy_mpp) { cov_fct *C = CovList + from->nr; // nicht gatternr double **pto = to->px, **pfrom = from->px; int i, v, n = -1, *to_col = to->ncol, *to_row = to->nrow, *from_col = from->ncol, *from_row = from->nrow; bool same_model = abs(to->nr - from->nr) <= 1 || (isDollar(to) && isDollar(from)); if (!same_model) { BUG; } if (freeing && !allocating) BUG; for (i=0; ikappanames[i], from->kappanames[i]) != 0 || // type != from->kappatype[i]) return false; if (pto[i] != NULL) free(pto[i]); pto[i] = NULL; to_col[i] = from_col[i]; to_row[i] = from_row[i]; } if (C->kappatype[i] >= LISTOF) { if (allocating) pto[i] = (double*) MALLOC(sizeof(listoftype)); int j, len = from_row[i]; listoftype *p = PARAMLIST(from, i), *q = (listoftype*) (pto[i]); if ((q->deletelist = copy_lists)) { for (j=0; jkappatype[i]== LISTOF + REALSXP) { n = sizeof(double); } else BUG; n *= p->nrow[j] * p->ncol[j]; q->nrow[j] = p->nrow[j]; q->ncol[j] = p->ncol[j]; if (allocating) q->p[j] = (double*) MALLOC(n); MEMCOPY(q->p[j], p->p[j], n); } } else { for (j=0; jnrow[j] = p->nrow[j]; q->ncol[j] = p->ncol[j]; q->p[j] = p->p[j]; } } } else if (C->kappatype[i]==LANGSXP) { n = sizeof(sexp_type); if (allocating) pto[i] = (double*) MALLOC(n); MEMCOPY(pto[i], pfrom[i], n); ((sexp_type *) pto[i])->Delete = false; } else { if (C->kappatype[i]==CLOSXP) { BUG; // Marco brauchen wir CLSXP ?? n = sizeof(SEXP); } else { if (C->kappatype[i]==REALSXP) { n = sizeof(double); } else if (C->kappatype[i]==INTSXP) { n = sizeof(int); } else BUG; n *= from_row[i] * from_col[i]; } // printf("i=%d to=%s %s from=%s %s %d\n", i, //NICK(to), CovList[to->nr].kappanames[i], // NICK(from), CovList[from->nr].kappanames[i], n); if (allocating) pto[i] = (double*) MALLOC(n); MEMCOPY(pto[i], pfrom[i], n); } } if (copy_mpp) { // PMI(to); PMI(from); if (to->mpp.moments < 0 && alloc_mpp_M(to, from->mpp.moments)!=NOERROR) error("error in allocating memory for Poisson point process data"); if (to->mpp.moments != from->mpp.moments) BUG; //printf("size = %d\n", sizeof(mpp_properties)); assert(sizeof(mpp_properties) == 96); mpp_properties *To = &(to->mpp), *From=&(from->mpp); assert(To != NULL && From != NULL); // To->sum_zhou_c = From->sum_zhou_c; // To->sq_zhou_c = From->sq_zhou_c; int vdim = from->vdim2[0]; for (v=0; vmaxheights[v] = From->maxheights[v]; To->unnormedmass = From->unnormedmass; // To->zhou_c = From->zhou_c; assert(To->mM != NULL && To->mMplus != NULL); int nmP1 = To->moments + 1; MEMCOPY(To->mM, From->mM, nmP1 * sizeof(double)); MEMCOPY(To->mMplus, From->mMplus, nmP1 * sizeof(double)); if (to->qlen != from->qlen) BUG; if (from->qlen > 0) { assert(to->q != NULL); MEMCOPY(to->q, from->q, (to->qlen)* sizeof(double)); } } if (recursive) { for (i=0; isub[i] != NULL) { assert(to->sub[i] != NULL); paramcpy(to->sub[i], from->sub[i], freeing, allocating, copy_lists, recursive, copy_mpp); } } //PMI(to, "to"); } int covcpy(cov_model **localcov, bool sub, cov_model *cov, // err location_type *prevloc, location_type *ownloc, bool copy_lists, bool copy_randomparam) { return covcpy(localcov, sub, cov, prevloc, ownloc, copy_lists, // err copy_randomparam, false); } int covcpy(cov_model **localcov, bool sub, cov_model *cov, // err location_type *prevloc, location_type *ownloc, bool copy_lists, bool copy_randomparam, bool allowCopyingInterface) { assert(cov != NULL); int i, n = -1; //cov_fct *C = CovList + cov->nr; // nicht gatternr //PMI(cov); if ((*localcov = (cov_model*) MALLOC(sizeof(cov_model)))==0) return ERRORMEMORYALLOCATION; cov_model *current = *localcov; MEMCOPY(current, cov, sizeof(cov_model)); // replaces COV_NULL(*localcov); COV_ALWAYS_NULL(current); current->calling = NULL; paramcpy(current, cov, false, true, copy_lists, false, false); if (cov->ownkappanames != NULL) { int nkappas = CovList[cov->nr].kappas; current->ownkappanames = (char**) CALLOC(nkappas, sizeof(char*)); for (i=0; iownkappanames[i] != NULL) { current->ownkappanames[i] = (char*) MALLOC(sizeof(char) * (1 + strlen(cov->ownkappanames[i]))); strcpy(current->ownkappanames[i], cov->ownkappanames[i]); } } } // PMI(current, "err = covcpy"); if (cov->q != NULL) { n = sizeof(double) * current->qlen; current->q = (double*) MALLOC(n); MEMCOPY(current->q, cov->q, n); } else assert(current->qlen==0); current->prevloc = ownloc != NULL ? ownloc : cov->prevloc == prevloc ? prevloc : NULL; if (current->prevloc == cov->prevloc && cov->calling==NULL) { if (!isInterface(cov)) { BUG; } if (!allowCopyingInterface) {PRINTF("\n\n***** unallowed copying ******\n"); BUG;} } for (i=0; ikappasub[i] = NULL; if (cov->kappasub[i] == NULL || !copy_randomparam) continue; err = covcpy(current->kappasub + i, true, cov->kappasub[i], prevloc, ownloc, copy_lists, copy_randomparam); if (err != NOERROR) return err; current->kappasub[i]->calling = current; } if (sub) { for (i=0; isub[i] = NULL; if (cov->sub[i] == NULL) continue; err = covcpy(current->sub + i, sub, cov->sub[i], prevloc, ownloc, copy_lists, copy_randomparam); if (err != NOERROR) return err; current->sub[i]->calling = current; } } else { for (i=0; isub[i] = NULL; } // PMI(*localcov, "end err=covcpy"); return NOERROR; } int covcpy(cov_model **localcov, bool sub, cov_model *cov, // err location_type *prevloc, location_type *ownloc, bool copy_lists) { int err =covcpy(localcov, sub, cov, prevloc, ownloc, copy_lists, true); //err return err; } int covcpy(cov_model **localcov, cov_model *cov) { //err bool cov2key = &(cov->key)==localcov; // PMI(cov); int err = covcpy(localcov, true, cov, cov->prevloc, NULL, true, true);//err // PMI(*localcov); if (err == NOERROR) (*localcov)->calling = cov2key || cov->calling==NULL ? cov : cov->calling; // falls !cov2key && cov->calling == NULL; dann gibt es nur einen Verweis // rueckwaerts! Muss aber sein, da sonst LOC_DELETE bei cov->calling==NULL // versucht cov->prevloc zu loeschen. oder es muesste prevloc auf NULL // gesetzt zu werden. Dies scheint eher contraproduktiv zu sein. return err; } int covcpyWithoutRandomParam(cov_model **localcov, cov_model *cov) {//err bool cov2key = &(cov->key)==localcov; int err = covcpy(localcov, true, cov, cov->prevloc, NULL, true, false); if (err == NOERROR) (*localcov)->calling = cov2key || cov->calling==NULL ? cov : cov->calling; // falls !cov2key && cov->calling == NULL; dann gibt es nur einen Verweis // rueckwaerts! Muss aber sein, da sonst LOC_DELETE bei cov->calling==NULL // versucht cov->prevloc zu loeschen. oder es muesste prevloc auf NULL // gesetzt zu werden. Dies scheint eher contraproduktiv zu sein. return err; } int covcpy(cov_model **localcov, cov_model *cov, bool copy_lists) {//err bool cov2key = &(cov->key)==localcov; int err = covcpy(localcov, true, cov, cov->prevloc, NULL, copy_lists, true); if (err == NOERROR) (*localcov)->calling = cov2key || cov->calling==NULL ? cov : cov->calling; // falls !cov2key && cov->calling == NULL; dann gibt es nur einen Verweis // rueckwaerts! Muss aber sein, da sonst LOC_DELETE bei cov->calling==NULL // versucht cov->prevloc zu loeschen. oder es muesste prevloc auf NULL // gesetzt zu werden. Dies scheint eher contraproduktiv zu sein. return err; } int covcpy(cov_model **localcov, cov_model *cov, //err double *x, double *T, int spatialdim, int xdimOZ, long lx, bool Time, bool grid, bool distances) { bool cov2key = &(cov->key)==localcov; int err; location_type *loc= NULL; err = loc_set(x, T, spatialdim, xdimOZ, lx, Time, grid, distances, &loc); if (err != NOERROR) return err; if ((err = covcpy(localcov, true, cov, loc, NULL, true, true)) != NOERROR) return err; (*localcov)->prevloc = cov->prevloc; (*localcov)->ownloc=loc; (*localcov)->calling = cov2key || cov->calling==NULL ? cov : cov->calling; (*localcov)->ownloc->totalpoints = loc->totalpoints; return NOERROR; } cov_model *getRemote(cov_model *remotecov, cov_model *rmt, cov_model *target) { cov_model *found; int i; if (rmt == target) return remotecov; for (i=0; ikappasub[i] != NULL) { if (remotecov->kappasub[i] == NULL) BUG; found = getRemote(remotecov->kappasub[i], rmt->kappasub[i], target); if (found != NULL) return found; } } for (i=0; isub[i] != NULL) { if (remotecov->sub[i] == NULL) BUG; found = getRemote(remotecov->sub[i], rmt->sub[i], target); if (found != NULL) return found; } } return NULL; } void Ssetcpy(cov_model *localcov, cov_model *remotecov, cov_model *cov, cov_model *rmt) { int i; if (cov->Sset != NULL) { localcov->Sset = (set_storage*) MALLOC(sizeof(set_storage)); MEMCOPY(localcov->Sset, cov->Sset, sizeof(set_storage)); localcov->Sset->remote = getRemote(remotecov, rmt, cov->Sset->remote); if (localcov->Sset->remote == NULL) BUG; } for (i=0; ikappasub[i] != NULL) { if (localcov->kappasub[i] == NULL) BUG; Ssetcpy(localcov->kappasub[i], remotecov, cov->kappasub[i], rmt); } } for (i=0; isub[i] != NULL) { if (localcov->sub[i] == NULL) BUG; Ssetcpy(localcov->sub[i], remotecov, cov->sub[i], rmt); } } } int newmodel_covcpy(cov_model **localcov, int model, cov_model *cov, //err double *x, double *y, double *T, int spatialdim, /* spatial dim only ! */ int xdimOZ, long lx, long ly, bool Time, bool grid, bool distances) { int i, err; assert(*localcov == NULL); addModel(localcov, model, NULL, true); cov_model *neu = *localcov; Types type; loc_set(x, y, T, spatialdim, xdimOZ, lx, ly, Time, grid, distances, &(neu->ownloc)); if ((err = covcpy(neu->sub + 0, cov)) != NOERROR) return err; // PMI(neu, "hier"); neu->sub[0]->calling = neu; // PMI(neu); //printf("newmodel %s %s\n", NICK(cov), TYPENAMES[CovList[cov->nr].Type]); type = CovList[neu->nr].Type; assert(type == InterfaceType); // anderes z.zt nicht benutzt for (i=0; i<2; i++) { //print("i=%d %s\n", i, TYPENAMES[cov->typus]); if ((err = CHECK(neu, cov->tsdim, cov->xdimprev, // CovList[cov->nr].Type,Martin:changed 27.11.13 //cov->typus,// auch nicht 20.5.14 type, type == InterfaceType ? XONLY : cov->domprev, type == InterfaceType ? CARTESIAN_COORD : cov->isoprev, cov->vdim2, ROLE_BASE)) != NOERROR) { return err; } if (i==0 && (err = STRUCT(neu, NULL)) != NOERROR) return err; } return NOERROR; } int newmodel_covcpy(cov_model **localcov, int model, cov_model *cov) {//err int err; location_type *loc = Loc(cov); err = newmodel_covcpy(localcov, model, cov, loc->grid ? loc->xgr[0] : loc->x, loc->grid ? loc->ygr[0] : loc->y, loc->grid ? loc->xgr[0] + 3 * loc->spatialdim : loc->T, loc->spatialdim, loc->xdimOZ, loc->grid ? 3 : loc->totalpoints, loc->ly == 0 ? 0 : loc->grid ? 3 : loc->totalpoints, loc->Time, loc->grid, loc->distances); return err; } double *getAnisoMatrix(cov_model *cov, bool null_if_id, int *nrow, int *ncol) { int origdim = cov->prevloc->timespacedim; if (!isAnyDollar(cov) && null_if_id) { *nrow = *ncol = origdim; return NULL; } double *ani, *aniso = P(DANISO), a = PisNULL(DSCALE) ? 1.0 : 1.0 / P0(DSCALE); int i, total, *proj = PINT(DPROJ), dimP1 = origdim + 1; if (aniso != NULL) { total = origdim * cov->ncol[DANISO]; int bytes = total * sizeof(double); ani = (double *) MALLOC(bytes); MEMCOPY(ani, aniso, bytes); for (i=0; inrow[DANISO]; *ncol = cov->ncol[DANISO]; // printf("A %d %d\n", *nrow, *ncol); } else if (proj != NULL) { total = origdim * cov->nrow[DPROJ]; // // print("origdim %d %f %d\n", origdim, a, proj[0]); ani = (double *) CALLOC(total, sizeof(double)); for (i=0; inrow[DPROJ]; // printf("BA %d %d\n", *nrow, *ncol); assert(false); } else { if (a == 1.0 && null_if_id) { *nrow = *ncol = origdim; return NULL; } total = origdim * origdim; ani = (double *) CALLOC(total, sizeof(double)); for (i=0; itimespacedim, spatialdim = loc->spatialdim; double distsq, dummy, *lx=NULL, *sx=NULL, diameter=0.0; if (loc->grid) { double *origmin = (double*) MALLOC(origdim * sizeof(double)), *origmax = (double*) MALLOC(origdim * sizeof(double)), *origcenter = (double*) MALLOC(origdim * sizeof(double)); for (d=0; dxgr[d][XSTEP] > 0) { origmin[d] = loc->xgr[d][XSTART]; origmax[d] = loc->xgr[d][XSTART] + loc->xgr[d][XSTEP] * (double) (loc->length[d] - 1); } else { origmin[d] = loc->xgr[d][XSTART] + loc->xgr[d][XSTEP] * (double) (loc->length[d] - 1); origmax[d] = loc->xgr[d][XSTART]; } origcenter[d] = 0.5 * (origmin[d] + origmax[d]); } if (loc->caniso == NULL) { for (d=0; dcaniso, origdim, spatialdim, center); for (d=0; dcaniso, origdim, spatialdim, sx); // suche maximale Distanz von center zu transformierter Ecke distsq = 0.0; for (d=0; d sx[d]) min[d] = sx[d]; if (max[d] < sx[d]) max[d] = sx[d]; dummy = center[d] - sx[d]; distsq += dummy * dummy; // print("%d sx=%f %f %f diam=%f\n", d, sx[d], min[d], max[d], distsq); } if (distsq > diameter) diameter = distsq; } free(j); free(lx); free(sx); } free(origmin); free(origmax); free(origcenter); } else { // not loc->grid if (loc->caniso != NULL) BUG; double *xx=loc->x; int i, endfor = loc->length[0] * loc->timespacedim; for (d=0; dmax[d]) max[d] = xx[i]; } } if (loc->Time) { assert(d == origdim - 1); if (loc->T[XSTEP] > 0) { min[d] = loc->T[XSTART]; max[d] = loc->T[XSTART] + loc->T[XSTEP] * (double) (loc->length[d] - 1); } else { min[d] = loc->T[XSTART] + loc->T[XSTEP] * (double) (loc->length[d] - 1); max[d] = loc->T[XSTART]; } } for (diameter=0.0, d=0; dtimespacedim; dummymin = (double*) MALLOC(origdim * sizeof(double)); dummymax = (double*) MALLOC(origdim * sizeof(double)); dummycenter = (double*) MALLOC(origdim * sizeof(double)); diam = GetDiameter(loc, dummymin, dummymax, dummycenter); free(dummymin); free(dummymax); free(dummycenter); return diam; } bool ok_n(int n, int *f, int nf) // taken from fourier.c of R { int i; for (i = 0; i < nf; i++) while(n % f[i] == 0) if ((n /= f[i]) == 1) return TRUE; return n == 1; } int nextn(int n, int *f, int nf) // taken from fourier.c of R { while(!ok_n(n, f, nf)) { n++; } return n; } #define F_NUMBERS1 3 #define F_NUMBERS2 3 bool HOMEMADE_NICEFFT=false; unsigned long NiceFFTNumber(unsigned long n) { unsigned long i,ii,j,jj,l,ll,min, m=1; if (HOMEMADE_NICEFFT) { int f[F_NUMBERS1]={2,3,5}; if (n<=1) return n; for (i=0; i10000)) { m*=f[i]; n/=f[i]; } if (n>10000) { while (n>10000) {m*=10; n/=10;} n++; } min = 10000000; for (i=0, ii=1; i<=14; i++, ii<<=1) { // 2^14>10.000 if (ii>=n) { if (ii10.000 if (jj>=n) { if (jj10.000 //if (kk>=n) { if (kk10.000 // instead of (if 7 is included) for (l=0, ll=jj; l<=6; l++, ll*=5) {// 5^5>10.000 if (ll>=n) { if (ll=len[i]) { yi[i]=0; y[i] = xgr[i][XSTART]; if (i=len[i]) { yi[i]=0; y[i] = xgr[i][XSTART]; if (inrow ? aniso[n] : 0.0; // hier zwingend diag !! pgr[XSTART] = xgr[i][XSTART] * *A; pgr[XSTEP] = xgr[i][XSTEP] * *A; pgr[XLENGTH] = xgr[i][XLENGTH]; } } } void xtime2x(double *x, int nx, double *T, int timelen, double **newx, int timespacedim) { double *y, // umhaengen zwingend notwendig, da u.U. **xx und *newx // der gleiche aufrufende Pointer ist, d.h. es wird "ueberschrieben" *z, t; int j, k, i, d, spatialdim = timespacedim - 1; z = *newx = (double*) MALLOC(sizeof(double) * timespacedim * nx * timelen); for (k=j=0, t=T[XSTART]; j nrow) { for (i=ncol * ncol; i < endfor; i++) if (m[i]!= 0.0) return TypeMany; ncol = nrow; // !! } // for(i=0; i type) type = newtype; k++; m += nrow; continue; TimeInvestigation: if (k == ncol - 1) return TypeMany; type = TypeMtimesep; k = ncol - 1; m = M + k * nrow; } return type; } void Transform2NoGridExt(cov_model *cov, bool timesep, int gridexpand, double **grani, double **SpaceTime, double **caniso, int *Nrow, int *Ncol, bool *Time, bool *grid, int *newdim, bool takeX) { // this function transforms the coordinates according to the anisotropy // matrix location_type *loc = Loc(cov); bool isdollar = isAnyDollar(cov); matrix_type type; int nrow = -1, ncol = -1, origdim = loc->caniso == NULL ? loc->timespacedim : loc->cani_nrow, dim = (isdollar ? (!PisNULL(DANISO) ? cov->ncol[DANISO] : !PisNULL(DPROJ) ? cov->nrow[DPROJ] : origdim ) : origdim ), *length = loc->length; double *aniso, *T = loc->T, *x = takeX ? loc->x : loc->y; coord_type *xgr= takeX ? &(loc->xgr) : &(loc->ygr); if (x==NULL && (*xgr)[0] ==NULL) ERR("locations are all NULL"); *newdim = dim; *caniso = NULL; *Nrow = *Ncol = -1; // print("newdim dim %d %d\n", *newdim, dim); aniso = getAnisoMatrix(cov, true, &nrow, &ncol); // null if not dollar // //printf("bb NCOL %d %d %ld loc->cani_nrow %d %d aniso=%f %f \n", // nrow, ncol, aniso, loc->cani_nrow, loc->cani_ncol, aniso[0], aniso[1]); // assert(false); if (loc->caniso != NULL) { if (aniso == NULL) { unsigned long bytes = sizeof(double) * loc->cani_nrow * loc->cani_ncol; aniso =(double*) MALLOC(bytes); MEMCOPY(aniso, loc->caniso, bytes); nrow = loc->cani_nrow; ncol = loc->cani_ncol; } else { double *aniso_old = aniso; assert(loc->cani_ncol == nrow); aniso = matrixmult(loc->caniso, aniso_old, loc->cani_nrow, nrow, ncol); nrow = loc->cani_nrow; free(aniso_old); } } //print("transfor\n"); type = aniso == NULL ? TypeMiso : Type(aniso, origdim, dim); *Time = loc->Time; *grid = loc->grid && !gridexpand; //print("grid %d %d %d\n", *grid, loc->grid, gridexpand); // printf("nrow %d origdim=%d dim=%d %d type=%d grid=%d type=%d\n", // nrow, origdim, dim, ncol, type, loc->grid, isMproj(type)); // assert(false); //PMI(cov); if (origdim != nrow) crash(cov); assert(origdim == nrow); assert(dim == ncol); if (loc->grid) { assert(*xgr != NULL); if (isMproj(type)) { if (gridexpand == true) { expandgrid(*xgr, length, SpaceTime, aniso, nrow, ncol); *Time = false; } else { // nur aniso auf grid multipliziert grid2grid(*xgr, grani, aniso, nrow, ncol); *grid = true; } } else if (gridexpand) { if (!loc->Time) { // grid no time expandgrid(*xgr, length, SpaceTime, aniso, nrow, ncol); } else { // grid and time if (timesep && isMtimesep(type)) { // space expandgrid(*xgr, length, SpaceTime, aniso, nrow, ncol - 1); // time grid2grid(*xgr + loc->spatialdim, grani, aniso + nrow * nrow - 1, 1, 1); } else { expandgrid(*xgr, length, SpaceTime, aniso, nrow, ncol); *Time = false; } } } else { // assert(false); // crash(); int i,d,k; (*grani) = (double *) MALLOC(sizeof(double) * 3 * origdim); for (k=d=0; dTime) { // no grid no time x2x(x, length[0], SpaceTime, aniso, nrow, ncol); } else { // no grid but time if (timesep && isMtimesep(type)) { x2x(x, length[0], SpaceTime, aniso, nrow, ncol-1); grid2grid((*xgr) + loc->spatialdim, grani, aniso + nrow * nrow - 1, 1, 1); } else { xtime2x(x, length[0], T, length[dim-1], SpaceTime, aniso, nrow,ncol); *Time = false; } } } if (aniso != NULL) free(aniso); // printf("NCOL %d\n", *ncol); } void Transform2NoGrid(cov_model *cov, bool timesep, int gridexpand) { location_type *loc = cov->prevloc; // transform2nogrid assert(loc != NULL); bool Time, grid; int err, spacedim=-1, nrow=-1, ncol=-1; double *xgr=NULL, *x = NULL, *caniso = NULL; if ((loc->y != NULL && loc->y != loc->x) || (loc->ygr[0] != NULL && loc->ygr[0] != loc->xgr[0])) { //printf("ly=%d %ld %ld %ld\n", loc->ly, loc->y, loc->ygr, loc->xgr); // PMI(cov->calling->calling); ERR("unexpected y coordinates"); } // APMI(cov->calling); //print("spacedim %d time=%d %f\n", spacedim, Time, (double) loc->totalpoints); assert(cov->prevloc != NULL); Transform2NoGridExt(cov, timesep, gridexpand, &xgr, &x, &caniso, &nrow, &ncol, &Time, &grid, &spacedim, true); // print("spacedim %d time=%d %ld %d\n", spacedim, Time, loc->totalpoints, grid); assert(false); //APMI(cov->calling); // PMI(cov, "trafo"); if (Time) spacedim--; assert(cov->ownloc == NULL); err = loc_set(grid ? xgr : x, grid ? xgr + 3 * spacedim : xgr, spacedim, spacedim, grid ? 3 : loc->totalpoints, Time, grid, false, &(cov->ownloc)); //print("AA spacedim %d time=%d\n", spacedim, Time); assert(cov->ownloc->caniso == NULL); cov->ownloc->caniso = caniso; cov->ownloc->cani_nrow = nrow; cov->ownloc->cani_ncol = ncol; // printf("nrow %d %d %ld %ld\n", nrow, ncol, caniso, cov->ownloc); // PMI(cov, "transform to no grid"); //nrow 0 256501392 256504320 256504528 // assert(ncol < 10); caniso = NULL; if (x != NULL) free(x); if (xgr != NULL) free(xgr); if (err != NOERROR) ERR("error when transforming to no grid"); } void Transform2NoGrid(cov_model *cov, double **xx) { bool Time, grid; int newdim, nrow, ncol; double *caniso = NULL; Transform2NoGridExt(cov, false, true, NULL, xx, &caniso, &nrow, &ncol, &Time, &grid, &newdim, true); assert(caniso == NULL); } void Transform2NoGrid(cov_model *cov, double **xx, double **yy) { location_type *loc = Loc(cov); bool Time, grid; int newdim, nrow, ncol; double *caniso = NULL; Transform2NoGridExt(cov, false, true, NULL, xx, &caniso,&nrow, &ncol, &Time, &grid, &newdim, true); assert(caniso == NULL); if (loc->y == NULL && loc->ygr[0] == NULL) *yy = NULL; else Transform2NoGridExt(cov, false, true, NULL, yy, &caniso, &nrow, &ncol, &Time, &grid, &newdim, false); assert(caniso == NULL); } double *selectlines(double *m, int *sel, int nsel, int nrow, int ncol) { // selects lines in matrix m according to sel int j; double *red_matrix, *Red_Matrix = (double *) MALLOC(sizeof(double) * nsel * ncol), *endfor = Red_Matrix + nsel * ncol; for (red_matrix=Red_Matrix; red_matrixnr; // nicht gatternr if (C->Type == UndefinedType) { assert(C->TypeFct != NULL); // printf("consist %s\n", NICK(cov)); return C->TypeFct(requiredtype, cov); } // printf("not consist %s type=%d, %d; %s %d\n", NAME(cov), C->Type, cov->typus, CovList[150].name, CovList[150].Type); return TypeConsistency(requiredtype, C->Type); } int change_coordinate_system(isotropy_type callingprev, isotropy_type isoprev, int *nr, isotropy_type *newisoprev, int *newtsdim, int *newxdim) { switch(callingprev) { case EARTH_COORD : if (isCartesian(isoprev)) { if (strcmp(GLOBAL.coords.newunits[0], UNITS_NAMES[units_km]) == 0) { *nr = EARTHKM2CART; } else if (strcmp(GLOBAL.coords.newunits[0], UNITS_NAMES[units_miles]) == 0) { *nr = EARTHMILES2CART; } else { SERR4("only units '%s' and '%s' are allowed. Got '%s' (user's '%s').", UNITS_NAMES[units_km], UNITS_NAMES[units_miles], GLOBAL.coords.newunits[0], GLOBAL.coords.curunits[0]); } *newisoprev = CARTESIAN_COORD; *newtsdim = *newxdim = 3; } else if (isSpherical(isoprev)) { NotProgrammedYet(""); } else { NotProgrammedYet(""); } break; default: NotProgrammedYet(""); } return NOERROR; } int SetGatter(domain_type domprev, domain_type statnext, isotropy_type isoprev, isotropy_type isonext, int *nr, int *delflag) { // printf("gatter %d %d %d %d\n", domprev, statnext, isoprev,isonext); if (domprev < statnext) SERR2("Cannot call more complex models ('%s') from simpler ones ('%s')", STATNAMES[(int) statnext], STATNAMES[(int) domprev]); bool isoOK = (isoprev == VECTORISOTROPIC && isonext == VECTORISOTROPIC) || isoprev >= isonext; if (!isoOK) SERR2("cannot call more complex models ('%s') from simpler ones ('%s')", ISONAMES[(int) statnext], ISONAMES[(int) domprev]); if (isoprev == SPHERICAL_COORD || isonext == SPHERICAL_COORD || isoprev == CYLINDER_COORD || isonext == CYLINDER_COORD) SERR("general sphericaUNREDUCED,UNREDUCED,UNREDUCED,l coordinates not programmed yet"); if (domprev == XONLY) { switch(isoprev) { case ISOTROPIC : *nr = ISO2ISO; break; case SPACEISOTROPIC : *nr = (isonext == ISOTROPIC) ? SP2ISO : SP2SP; break; case ZEROSPACEISO: case VECTORISOTROPIC: case SYMMETRIC : case CARTESIAN_COORD: switch (isonext) { case ISOTROPIC : *nr = S2ISO; break; case SPACEISOTROPIC : *nr = S2SP; break; case ZEROSPACEISO: case VECTORISOTROPIC: case SYMMETRIC: case CARTESIAN_COORD: *nr = S2S; *delflag = DEL_COV - 5; /// break; default : BUG; } break; case EARTH_COORD: if (isonext != EARTH_COORD) BUG; *nr = S2S; *delflag = DEL_COV - 8; /// break; default: PRINTF("GetGatter %d %d\n", domprev, isoprev); BUG; } } else { // KERNEL if (statnext == XONLY) { switch(isonext) { case ISOTROPIC : *nr = S2ISO; break; case SPACEISOTROPIC : *nr = S2SP; break; case ZEROSPACEISO: case VECTORISOTROPIC: case SYMMETRIC: case CARTESIAN_COORD: *nr = S2S; break; case EARTH_COORD: if (isonext != EARTH_COORD) BUG; *nr = S2S; *delflag = DEL_COV - 8; /// break; default: BUG; } } else { // still non-domain: cannot be simplified *nr = SId; *delflag = DEL_COV - 4;// } } // printf("prev %d %d ; next %d %d nr = %d\n", domprev, isoprev, statnext, isonext, *nr); return NOERROR; } int get_internal_ranges(cov_model *cov, cov_model *min, cov_model *max, cov_model *pmin, cov_model *pmax, cov_model *openmin, cov_model *openmax) { cov_fct *C = CovList + cov->nr; // nicht gatternr int err = NOERROR, k = 0, i = 0, // compiler dummy values kappas = C->kappas ; range_type range; rangefct getrange = C->range; SEXPTYPE *type = C->kappatype; // print("entry\n"); //PMI(cov, "gir"); if (kappas > 0) { getrange(cov, &range); // PMI(cov); assert (cov->maxdim >= cov->tsdim); err = NOERROR; for (i=0; incol[i] * cov->nrow[i]; double dmin, dmax, dpmin, dpmax, dopenmin, dopenmax, value = RF_NA; dpmin = range.pmin[i]; dpmax = range.pmax[i]; dmin = range.min[i]; dmax = range.max[i]; dopenmin = (double) range.openmin[i]; dopenmax = (double) range.openmax[i]; if (type[i] == INTSXP) { if (dmin < -MAXINT) { #ifdef RANDOMFIELDS_DEBUGGING PRINTF("%s MAXINT) { #ifdef RANDOMFIELDS_DEBUGGING PRINTF("%s >max %s\n", NICK(cov), KNAME(i)); BUG; #else dmax = (double) MAXINT; #endif } } // print("i=%d %d %s %f %d %d\n", i, len, C->name, // PisNULL(i) ? RF_NA : P0(i][0], type[i], REALSXP); for (k=0; kdeletelist) { int j, lenj = p->nrow[k] * p->ncol[k]; double *qmin = PARAMLIST(min, i)->p[k], *qmax = PARAMLIST(max, i)->p[k], *ppmin = PARAMLIST(pmin, i)->p[k], *ppmax = PARAMLIST(pmax, i)->p[k], *omin = PARAMLIST(openmin, i)->p[k], *omax = PARAMLIST(openmax, i)->p[k]; for (j=0; j dmax || (range.openmin[i] && value == dmin) || (range.openmax[i] && value == dmax) ) { sprintf(ERRORSTRING, "value (%f) of '%s' in '%s' not within interval %s%f,%f%s", value, C->kappanames[i], NICK(cov), range.openmin[i] ? "(" : "[", dmin, dmax, range.openmax[i] ? ")" : "]" ); return ERRORM; } } // for k } // for i in kappas; } // if (kappa > 0) for (i=0; ikappasub[i] != NULL) { err = get_internal_ranges(cov->kappasub[i], min->kappasub[i], max->kappasub[i], pmin->kappasub[i], pmax->kappasub[i], openmin->kappasub[i], openmax->kappasub[i]); if (err != NOERROR) return err; } } for (i=0; isub[i] != NULL) { err = get_internal_ranges(cov->sub[i], min->sub[i], max->sub[i], pmin->sub[i], pmax->sub[i], openmin->sub[i], openmax->sub[i]); if (err != NOERROR) return err; } } return NOERROR; } void strround(double x, char *s){ if (x==RF_INF) sprintf(s, "Inf"); else if (x==RF_NEGINF) sprintf(s, "-Inf"); else if (x == floor(x + 0.5)) sprintf(s, "%d", (int) x); else sprintf(s, "%f", x); } void addmsg(double value, const char *sign, double y, char *msg) { char str1[30], str2[30]; strround(value, str1); strround(y, str2); sprintf(msg, "%s %s %s", str1, sign, str2); } void addone(char *str, double x) { char str2[30]; strround(x, str2); sprintf(str, "%s, %s", str, str2); } void addpair(char *str, double x, double y) { if (x == floor(x + 0.5) && y==floor(y + 0.5)) sprintf(str, "%s, (%d,%d)", str, (int) x, int(y)); else sprintf(str, "%s, (%f,%f)", str, x, y); } int check_within_range(cov_model *cov, bool NAOK) { // sets also maxdim and finiterange in cov ! cov_fct *C = CovList + cov->nr; //nicht gatternr int len, err = NOERROR, k = 0, i = 0, // compiler dummy values kappas = C->kappas; range_type range; SEXPTYPE *type = C->kappatype; rangefct getrange = C->range; char Msg[255] = ""; double min, max, value= RF_NA; if (GLOBAL.general.skipchecks) return NOERROR; getrange(cov, &range); // printf("maxdim = %d %d %s\n", cov->maxdim, cov->tsdim, Nick(cov)); if (cov->maxdim >=0 && cov->maxdim < cov->tsdim) { GERR2("Max. dimension is %d. Got %d", cov->maxdim, cov->tsdim); } for (i=0; ikappanames[i], FREEVARIABLE)) { // i.e. equal if (PisNULL(i)) continue; } if (type[i] >= LISTOF) { // to simplify things -- otherwise in simu.cc // code must also be changed. assert(range.min[i] == RF_NEGINF && range.max[i]==RF_INF); continue; } // full range !! len = cov->ncol[i] * cov->nrow[i]; min = range.min[i]; max = range.max[i]; // print("%s i=%d [%f, %f] size=%d %s\n", // C->name, i, range.min[i], range.max[i], len, C->kappanames[i]); for (k=0; kkappanames[i], k+1); if (ISNAN(value)) { if (NAOK) { continue; } else GERR2("%s[%d] is not finite.", C->kappanames[i], k+1); } // print("k=%d %f\n", k, value); // print("range %d %d %d op=%d %f %f %f\n", // kappas, i, k, range.openmin[i], value, min, max); err = ERRORUNSPECIFIED; if (range.openmin[i] && value <= min) { //crash(); addmsg(value, ">", min, Msg); goto ErrorHandling; } else if (value < min) { addmsg(value, ">=", min, Msg); goto ErrorHandling; } if (range.openmax[i] && value >= max) { addmsg(value, "<", max, Msg); goto ErrorHandling; } else if (value > max) { addmsg(value, "<=", max, Msg); goto ErrorHandling; } err = NOERROR; } } // kappas ErrorHandling: // PMI(cov, "range"); if (err != NOERROR) { // printf("i=%d\n", i); if (PL>PL_ERRORS) PRINTF("error in check range: %s kappa%d err=%d ('%s' does not hold.)\n", C->name, i+1, err, Msg); if (err == ERRORUNSPECIFIED) SERR4("%s[%d] = %s does not hold (dim=%d).", C->kappanames[i], k+1, Msg, cov->tsdim); // + return } // print("done %s\n", NICK(cov)); return err; } int get_ranges(cov_model *cov, cov_model **min, cov_model **max, cov_model **pmin, cov_model **pmax, cov_model **openmin, cov_model **openmax) { int err; // returns a reliable value only in the very first // entry of each parameter vector/matrix int err; if ((err = covcpy(min, cov, false)) != NOERROR) return err; if ((err = covcpy(max, cov, false)) != NOERROR) return err; if ((err = covcpy(pmin, cov, false)) != NOERROR) return err ; if ((err = covcpy(pmax, cov, false)) != NOERROR) return err; if ((err = covcpy(openmin, cov, false)) != NOERROR) return err; if (( err = covcpy(openmax, cov, false)) != NOERROR) return err; (*min)->calling = (*max)->calling = (*pmin)->calling = (*pmax)->calling = (*openmin)->calling = (*openmax)->calling = cov; // (*min)->calling = NULL; ja nicht auf NULL setzen, da sonst angenommen // wird, dass prevloc ein Original ist return get_internal_ranges(cov, *min, *max, *pmin, *pmax, *openmin, *openmax); } int FieldReturn(cov_model *cov) { location_type *loc = Loc(cov); if (cov->rf != NULL) { //PMI(cov, "fieldreturn"); assert(cov->fieldreturn && cov->origrf); if (cov->origrf) { free(cov->rf); } } // printf("FieldReturn %d %d (%d %d) %s\n",sizeof(res_type), loc->totalpoints, cov->vdim2[0], cov->vdim2[1], NICK(cov)); if ((cov->rf = (res_type*) MALLOC(sizeof(res_type) * loc->totalpoints * cov->vdim2[0])) == NULL) return ERRORMEMORYALLOCATION; cov->fieldreturn = cov->origrf = true; return NOERROR; } void SetLoc2NewLoc(cov_model *cov, location_type *loc) { int i, maxsub = CovList[cov->nr].maxsub; // printf("s2n %s %ld\n", NICK(cov), (long int) loc); if (cov->ownloc != NULL) { // printf("ownloc not null %s\n", NICK(cov)); return; } for (i=0; ikappasub[i] != NULL) SetLoc2NewLoc(cov->kappasub[i], loc); } cov->prevloc = loc; for (i=0; isub[i] != NULL) SetLoc2NewLoc(cov->sub[i], loc); } if (cov->key != NULL) SetLoc2NewLoc(cov->key, loc); } bool verysimple(cov_model *cov) { assert(cov != NULL); cov_fct *C = CovList + cov->nr; // kein gatternr, da isotrop int i, k, total, kappas = C->kappas; for (k=0; kkappasub[k] != NULL) return false; total = cov->ncol[k] * cov->nrow[k]; if (C->kappatype[k] == REALSXP) { for (i=0; ikappatype[k] == INTSXP) { for (i=0; i #include #include //#include #include #include #include "RF.h" #include "Covariance.h" //#include "Covariance.h" #include "win_linux_aux.h" #include #define MAXNN 100000000.0 /* max number of points simulated on a line */ #define TBM_LINES (COMMON_GAUSS + 4) #define TBM_LINESIMUFACTOR (COMMON_GAUSS + 5) #define TBM_LINESIMUSTEP (COMMON_GAUSS + 6) //#define TBM_GRID (COMMON_GAUSS + 7) #define TBM_CENTER (COMMON_GAUSS + 7) #define TBM_POINTS (COMMON_GAUSS + 8) #define TBM_COV 0 #define BUFFER 4.0 void unitvector3D(int projectiondim, double *deltax, double *deltay, double *deltaz) { switch (projectiondim) { // create random unit vector case 1 : *deltax= UNIFORM_RANDOM; *deltaz = *deltay = 0.0; break; case 2 : *deltaz = 0.0; *deltax= UNIFORM_RANDOM;// see Martin's tech rep for details *deltay= sqrt(1.0 - *deltax * *deltax) * sin(UNIFORM_RANDOM*TWOPI); break; case 3 : double dummy; *deltaz = 2.0 * UNIFORM_RANDOM - 1.0; dummy = sqrt(1.0 - *deltaz * *deltaz); *deltay = UNIFORM_RANDOM * TWOPI; *deltax = cos(*deltay) * dummy; *deltay = sin(*deltay) * dummy; break; default : BUG; } } cov_model* get_user_input(cov_model *cov) { // loc_user sind nicht die prevloc data, sondern, die die der Nutzer // eingegeben hatte !! Zumindest in erster Naehrung // Problem hier falls intern aufgerufen wurde -- Abhilfe: layer muss // zwingend gesetzt sein cov_model *user=cov; while (user->calling != NULL) user = user->calling; return user; } int get_subdim(cov_model *cov, bool Time, bool *ce_dim2, int *ce_dim, int *effectivedim) { int fulldim = P0INT(TBM_FULLDIM); double layers = P0(TBM_LAYERS); *effectivedim = cov->tsdim; if (Time) { *ce_dim2 = (!ISNA(layers) && layers) || cov->isoown==SPACEISOTROPIC || *effectivedim == 1 + fulldim; *effectivedim -= *ce_dim2; if (*ce_dim2 && !ISNA(layers) && !layers) { SERR1("value of '%s' does not match the situation", KNAME(TBM_LAYERS)) } } else { *ce_dim2 = false; } if (*effectivedim > fulldim) return ERRORWRONGDIM; *ce_dim = 1 + (int) *ce_dim2; return NOERROR; } void tbm_kappasproc(int i, cov_model *cov, int *nr, int *nc){ int dim = cov->tsdim; // printf("tbm kappas %d %d %d\n", i, TBM_CENTER, dim); *nr = (i==TBM_CENTER) ? dim : 1; *nc = i < CovList[cov->nr].kappas ? 1 : -1; } void rangetbmproc(cov_model *cov, range_type *range){ rangetbm_common(cov, range, false); range->min[TBM_LINES] = 1.0; range->max[TBM_LINES] = RF_INF; range->pmin[TBM_LINES] = 1.0; range->pmax[TBM_LINES] = 10000; range->openmin[TBM_LINES] = false; range->openmax[TBM_LINES] = true; range->min[TBM_LINESIMUFACTOR] = 0.0; range->max[TBM_LINESIMUFACTOR] = RF_INF; range->pmin[TBM_LINESIMUFACTOR] = 0.0; range->pmax[TBM_LINESIMUFACTOR] = 10.0; range->openmin[TBM_LINESIMUFACTOR] = false; range->openmax[TBM_LINESIMUFACTOR] = true; range->min[TBM_LINESIMUSTEP] = 0.0; range->max[TBM_LINESIMUSTEP] = RF_INF; range->pmin[TBM_LINESIMUSTEP] = 0.0; range->pmax[TBM_LINESIMUSTEP] = 10.0; range->openmin[TBM_LINESIMUSTEP] = false; range->openmax[TBM_LINESIMUSTEP] = true; // range->min[TBM_GRID] = 0; //range->max[TBM_GRID] = 1; // range->pmin[TBM_GRID] = 0; // range->pmax[TBM_GRID] = 1; // range->openmin[TBM_GRID] = false; // range->openmax[TBM_GRID] = false; range->min[TBM_CENTER] = RF_NEGINF; range->max[TBM_CENTER] = RF_INF; range->pmin[TBM_CENTER] = -1000000; range->pmax[TBM_CENTER] = 1000000; range->openmin[TBM_CENTER] = false; range->openmax[TBM_CENTER] = true; range->min[TBM_POINTS] = 0; range->max[TBM_POINTS] = RF_INF; range->pmin[TBM_POINTS] = 0; range->pmax[TBM_POINTS] = 1000; range->openmin[TBM_POINTS] = false; range->openmax[TBM_POINTS] = true; } int checktbmproc(cov_model *cov) { #define NSEL 2 cov_model *next=cov->sub[0], *key =cov->key, *sub = key==NULL ? next : key; int i, err = NOERROR, isoselect[NSEL+1]={ISOTROPIC, SPACEISOTROPIC, SYMMETRIC}, nsel = NSEL, dim = cov->tsdim; // taken[MAX DIM], tbm_param *gp = &(GLOBAL.tbm); if (cov->tsdim != cov->xdimprev || cov->tsdim != cov->xdimown) return ERRORDIM; if (GLOBAL.general.vdim_close_together && cov->vdim2[0] > 1) SERR1("TBM only allowed if '%s=FALSE'", general[GENERAL_CLOSE]); ROLE_ASSERT(ROLE_GAUSS); // printf("%s fulldim %d %d\n", NICK(cov), fulldim, 0); // printf("%s fulldim %d %d\n", NICK(cov), // fulldim, gp->lines[fulldim-1]);assert(false); //PMI(cov); kdefault(cov, TBM_FULLDIM, gp->fulldim); kdefault(cov, TBM_FULLDIM, PisNULL(TBM_TBMDIM) || gp->tbmdim >= 0 ? gp->fulldim : P0INT(TBM_TBMDIM) - gp->tbmdim); kdefault(cov, TBM_TBMDIM, gp->tbmdim > 0 ? gp->tbmdim : P0INT(TBM_FULLDIM) + gp->tbmdim); kdefault(cov, TBM_LAYERS, gp->layers); int tbmdim = P0INT(TBM_TBMDIM), fulldim = P0INT(TBM_FULLDIM); if (tbmdim >= fulldim) { SERR4("'%s' (=%d) must be less than '%s' (=%d)", KNAME(TBMOP_TBMDIM), tbmdim, KNAME(TBM_FULLDIM), fulldim); } kdefault(cov, TBM_LINES, gp->lines[fulldim-1]); kdefault(cov, TBM_LINESIMUFACTOR, gp->linesimufactor); kdefault(cov, TBM_LINESIMUSTEP, gp->linesimustep); // kdefault(cov, TBM_GRID, gp->grid); // if ( P0INT(TBM_GRID)) // warning("grid parameter for tbm not programmed yet"); if (PisNULL(TBM_CENTER)) { PALLOC(TBM_CENTER, dim, 1); for (i=0; icenter[i]; } } else { if (cov->nrow[TBM_CENTER] < dim) SERR1("vector for '%s' too short", KNAME(TBM_CENTER)); } // PMI(cov); kdefault(cov, TBM_POINTS, gp->points); // printf("%d\n", gp->points); // PMI(cov); if ((err = checkkappas(cov)) != NOERROR) return err; // PMI(cov); //printf("key/next/sub %ld %ld %ld\n", key, next, sub);// assert(false); if (key == NULL && isNegDef(sub)) { // Abfolge Tbm $(Aniso) iso-model braucht Moeglichkeit des // anisotropen Modells if (cov->role == ROLE_BASE) nsel++; for (i=0; irole == ROLE_BASE ? KERNEL : XONLY); // PMI(sub); if ((err = CHECK(sub, dim, dim, NegDefType, cov->role == ROLE_BASE ? KERNEL : XONLY, // wegen // nutzer eingabe aniso und dem allerersten check isoselect[i], SUBMODEL_DEP, ROLE_COV)) == NOERROR) break; } // assert(false); if (i==nsel) { // // printf("%d %d %d\n", cov->role, ROLE_BASE, nsel); //APMI(cov); // sprintf(ERROR_LOC, "%s: ", NICK(cov)); XERR(err); SERR("Its submodel coudl not be identified as isotropic or space-isotropic and positive definite function."); } } else { // sub->nr > FIRSTGAUSSPROC || key != NULL bool dummy; int dummydim, newdim; if (key != NULL) { // falls hier gelandet, so ruft TBMINTERN TBM auf!! if (cov->nr == TBM_PROC_USER) { cov_model *intern = sub; while (intern != NULL && //intern->nr != TBM_PROC_INTERN && (isAnyDollar(intern) || intern->nr == TBM_PROC_USER // )) intern = intern->key != NULL ? intern->key : intern->sub[0]; if (intern == NULL) { // APMI(key); BUG; } else if (intern != cov) paramcpy(intern, cov, true, true, false, false, false); } } if (cov->nr == TBM_PROC_USER) newdim = dim; else if ((err = get_subdim(cov, get_user_input(cov)->prevloc->Time, &dummy, &newdim, &dummydim)) != NOERROR) return err; //PMI(sub); printf("nd %d\n", newdim); assert(newdim == 1); //PMI(sub); if ((err = CHECK(sub, newdim, newdim, ProcessType, XONLY, CARTESIAN_COORD, SUBMODEL_DEP, cov->role == ROLE_BASE ? cov->role : ROLE_GAUSS)) != NOERROR) { return err; } } setbackward(cov, sub); cov->vdim2[0] = next->vdim2[0]; cov->vdim2[1] = next->vdim2[1]; // PMI(cov); // //printf("OK\n"); return NOERROR; } int struct_tbmproc(cov_model *cov, cov_model **newmodel) { cov_model *next = cov->sub[TBM_COV]; ASSERT_NEWMODEL_NULL; if (next->pref[TBM] == PREF_NONE) { return ERRORPREFNONE; } // PMI(cov, "start struct tbmproc"); assert(false); assert(cov->nr == TBM_PROC_INTERN); cov_model *user = get_user_input(cov); location_type *loc_user = user->prevloc; double linesimufactor, diameter, min[MAXTBMSPDIM], max[MAXTBMSPDIM], Center[MAXTBMSPDIM], user_min[MAXTBMSPDIM], user_max[MAXTBMSPDIM], user_Center[MAXTBMSPDIM], tbm_linesimustep = P0(TBM_LINESIMUSTEP), tbm_linesimufactor = P0(TBM_LINESIMUFACTOR), *tbm_center = P(TBM_CENTER); int d, err=NOERROR, // tbm_lines = P0INT(TBM_LINES), fulldim = P0INT(TBM_FULLDIM), tbmdim = P0INT(TBM_TBMDIM), // endaniso = origdim * origdim - 1, *points = PINT(TBM_POINTS), user_dim = loc_user->timespacedim; long user_spatialpoints = loc_user->spatialtotalpoints, user_spatialdim = loc_user->spatialdim // the isotropic part (i.e. time might be not considered) ; bool ce_dim2=false; // char errorloc_save[nErrorLoc]; if (cov->role != ROLE_GAUSS && cov->role != ROLE_BASE){ return ERRORFAILED; } /****************************************************************/ /* Determination of the dimensions */ /****************************************************************/ // einfache checks // extraktion von covarianzfunktion mit gleichartiger anisotropie // time-komponente wird nicht ge-checked da letzter parameter true // bereitstellung von param, quotient, multiply /* in tbm, time component must be ALWAYS alone, i.e. matrix looks like * * 0 * * 0 * * x -- this is checked late on here x may be any constant. In case x is zero (for all matrices (0..actcov-1), the last dimension vanishes (performed in the next step) the asterixes build submatrices for (v=1..actcov-1) that are multiple of the submatrix for v=0, already checked by Check */ if (tbmdim != 1 || (fulldim != 2 && fulldim != 3)) SERR5("'%s' only works for %s =1 and %s=2 or 3. Got %d %d", NICK(cov), KNAME(TBM_TBMDIM), KNAME(TBM_FULLDIM), tbmdim, fulldim); if (cov->tsdim > MAXTBMSPDIM) return ERRORMAXDIMMETH; // in theory it works also for variograms! if (!isNegDef(next->typus) || next->domown != XONLY) return ERRORNOVARIOGRAM; if (user_dim == 1) SERR("dimension must currently be at least 2 and at most 4 for TBM"); NEW_STORAGE(Stbm, TBM, TBM_storage); TBM_storage *s = cov->Stbm; // nutzer can ueber tbm_center den centre vorgeben. // tbm_center muss auch wieder zurueckgegeben werden. // tbm_center/user_centre muss dann noch in caniso-Koordinaten // transformiert werden, siehe unten GetDiameter(loc_user, user_min, user_max, user_Center); if (false) { int i,j; double xmin[2] = {RF_INF, RF_INF}, xmax[2] = {RF_NEGINF, RF_NEGINF}; // PMI(cov); for (i=0; itotalpoints; i++) { for (j=0; j<2; j++) { //printf("i=%d j=%d\n", i, j); if (loc_user->x[2*i + j] < xmin[j]) xmin[j] = loc_user->x[2*i + j]; if (loc_user->x[2*i + j] > xmax[j]) xmax[j] = loc_user->x[2*i + j]; } } // for (j=0; j<2; j++) { // printf("d=%d xmin=%f min=%f; xmax=%f max=%f\n", // j, xmin[j], user_min[j], xmax[j], user_max[j]); // } } if (!ISNAN(tbm_center[0])) { for (d=0; d < user_dim; d++) { if (!R_FINITE(tbm_center[d])) { SERR("center contains non finite values"); } } for (d=0; dTime, &ce_dim2, &(s->ce_dim), &(s->simuspatialdim))) != NOERROR) return err; /****************************************************************/ /* determine grid distance for the line */ /****************************************************************/ // sort out which finer grid should be used in the spatial domain for // low dimensional simulation if (PL>=PL_STRUCTURE) PRINTF("\ndetermining the length of line segment..."); // PrintMethodInfo(meth); // minimum distance between the points linesimufactor = -1.0; if (tbm_linesimustep > 0.0) linesimufactor = 1.0 / tbm_linesimustep; else if (tbm_linesimufactor > 0) { double mindelta = RF_INF; int spDim = user_dim - (int) ce_dim2; // eigentlich muesste man // es das Urbild der Zeitachse abziehen... Egal. Fuer den Ausbau reicht es. if (loc_user->grid) { // if linesimufactor, the fine grid scale is proportional to smallest // distance in the grid. for (d=0; dxgr[d][XSTEP]xgr[d][XSTEP]>0)) { mindelta=loc_user->xgr[d][XSTEP]; } } } else { long j, i, k0, k1, k2; if (user_spatialpoints > 10000) { SERR("too many points to determine smallest distance between the points in a reasonable time; try TBM*.linesimustep with a positive value"); /* algorithmus kann verbessert werden, so dass diese Fehlermeldung nicht mehr notwendig ist! */ } double diff, dist; for (k0=i=0; ix[k1++] - loc_user->x[k2++]; dist += diff * diff; } if (dist>0 && distTime) { mindelta += loc_user->T[XSTEP] * loc_user->T[XSTEP]; } mindelta = sqrt(mindelta); } linesimufactor = tbm_linesimufactor / mindelta; } else { // both, tbm_linesimustep and tbm_linesimufactor are zeror or negative if (*points < BUFFER) { SERR("if linesimufactor and linesimustep are naught then TBM.points must be at least 4 (better between 100 and 10000)"); } } /****************************************************************/ /* switch to transformed data */ /****************************************************************/ // printf("XXXuserCenter %f %f %d\n", user_Center[0], user_Center[1], loc_user->timespacedim); // printf("XXxCenter %f %f\n", Center[0], Center[1]); // printf("XXx Min %f %f\n", user_min[0], user_min[1]); // printf("XXx Max %f %f\n", user_max[0], user_max[1]); // transform the center { cov_model *sub = user; double dummy[MAXTBMSPDIM], *aniso; int nrow, ncol; if (loc_user->timespacedim > MAXTBMSPDIM) SERR("cannot determine centre as dimensions too large"); MEMCOPY(Center, user_Center, sizeof(double) * loc_user->timespacedim); while (true) { if (isDollar(sub)) { aniso = getAnisoMatrix(sub, true, &nrow, &ncol); if (aniso != NULL) { MEMCOPY(dummy, Center, sizeof(double) * ncol); xA(dummy, aniso, nrow, ncol, Center); free(aniso); } } if (sub->sub[0] == NULL || sub == cov) break; sub = sub->sub[0]; } } // printf("userCenter %f %f %d\n", user_Center[0], user_Center[1], // loc_user->timespacedim); /// printf("Center %f %f\n", Center[0], Center[1]); /// printf("usermin %f %f\n", user_min[0], user_min[1]); // printf("usermax %f %f\n", user_max[0], user_max[1]); // A PMI(cov, "vorher"); location_type *prevloc = Loc(cov); assert(prevloc == cov->prevloc); if ((prevloc->Time && !ce_dim2) || (prevloc->grid && prevloc->caniso != NULL)) { Transform2NoGrid(cov, ce_dim2, false); // APMI(cov); //SetLoc2NewLoc(next, Loc(cov)); } location_type *loc = Loc(cov); int // totalpoints = loc->totalpoints, dim = loc->timespacedim //spatialpoints = loc->spatialtotalpoints, // spatialdim = loc->spatialdim ; // multiplication der x-skalenparameter so dass letztendlich // auf der TBM-Geraden mit Abstand 1 der Punkte simuliert werden kann // mit dem Vorteil des einfachen Zugriffs auf die simulierten Werte /****************************************************************/ /* determine length and resolution of the band */ /****************************************************************/ double dummy_center[MAXTBMSPDIM], min_center, max_center; // print("%ld\n", loc); APMI(cov); GetDiameter(loc, min, max, dummy_center); min_center = max_center = 0.0; for (d=0; dtimespacedim; d++) { double dummy; dummy = Center[d] - min[d]; min_center += dummy * dummy; //printf("d=%d Center=%f min=%f ", d, Center[d], min[d]); dummy = Center[d] - max[d]; max_center += dummy * dummy; //printf("max=%f\n ", max[d]); } diameter = 2.0 * sqrt(min_center > max_center ? min_center : max_center); //assert(false); for (d=0; dcenter[d] = user_Center[d]; if (loc->grid || (loc->Time && d==loc->timespacedim-1)) s->center[d] -= loc->xgr[d][XSTART]; } // print("diam %f pts=%d %f %f\n", diameter, *points, BUFFER, linesimufactor ); //assert(false); // 4.231878 0 3.000000 1054.407676 if (linesimufactor < 0) { // i.e. points given directly by user linesimufactor = (*points - BUFFER) / diameter; } s->linesimufactor = linesimufactor; diameter = trunc(BUFFER + diameter * linesimufactor); // in pts // print("diam %f %f\n", diameter, linesimufactor); if ( *points > 0) { if (diameter > *points) { // never happens if linesimufactor has been < 0 PRINTF("tbm points minimum=%f, but tbm_points is %d.\n", diameter, *points); SERR( "given number of points to simulate on the TBM line is too small"); } else diameter = (double) *points; } // print("diam %f %f %d %d\n", diameter, linesimufactor, *points, GLOBAL.tbm.points); if (diameter > MAXNN) { // printf("diamter = %f %d\n", diameter, MAXNN); // PMI(cov); SERR("The number of points on the line is too large. Check your parameters and make sure that none of the locations are given twice"); } else if (diameter < 10) { SERR2("too few points on the line -- modify '%s' or '%s'", KNAME(TBM_LINESIMUFACTOR), KNAME(TBM_LINESIMUSTEP)); } // only needed for nongrid ! s->spatialtotalpts = loc->totalpoints; if (s->ce_dim == 2) { s->spatialtotalpts /= loc->length[dim - 1]; } /****************************************************************/ /* set up the covariance function on the line */ /****************************************************************/ if (PL>=PL_STRUCTURE) { PRINTF("\nrestructing tbm "); PRINTF(ce_dim2 ? "plane...\n" : "line...\n"); } cov_model *modelB1; if (cov->key != NULL) COV_DELETE(&(cov->key)); if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; modelB1 = cov->key; while (isGaussProcess(modelB1)) modelB1 = modelB1->sub[0]; if (modelB1 == cov->key) { addModel(&(cov->key), GAUSSPROC); modelB1 = cov->key; } else { modelB1 = modelB1->calling; } addModel(modelB1, 0, DOLLAR); if (modelB1->nr==BROWNIAN){ // &(cov->key))->calling = key; kdefault(cov, DVAR, 1.0 + PARAM0(next, BROWN_ALPHA) / tbmdim); } else { cov_model *dollar = modelB1->sub[0]; dollar->tsdim = dollar->xdimprev = s->ce_dim; kdefault(dollar, DVAR, 1.0); PARAMALLOC(dollar, DANISO, s->ce_dim, s->ce_dim); PARAM(dollar, DANISO)[0] = 1.0 / linesimufactor; if (s->ce_dim == 2) { PARAM(dollar, DANISO)[1] = PARAM(dollar, DANISO)[2] = 0.0; PARAM(dollar, DANISO)[3] = loc->T[XSTEP]; } addModel(modelB1, 0, TBM_OP); if (!PisNULL(TBMOP_TBMDIM)) kdefault(modelB1->sub[0], TBMOP_TBMDIM, P0INT(TBM_TBMDIM)); if (!PisNULL(TBMOP_FULLDIM)) kdefault(modelB1->sub[0], TBMOP_FULLDIM, P0INT(TBM_FULLDIM)); if (!PisNULL(TBMOP_LAYERS)) kdefault(modelB1->sub[0], TBMOP_LAYERS, P0(TBM_LAYERS)); } /****************************************************************/ /* set up the process on the line */ /****************************************************************/ if (PL>=PL_STRUCTURE) { PRINTF("\nsetting up the process on the "); PRINTF(ce_dim2 ? "plane..." : "line..."); } // xline[XEND]: number of points on the TBM line double xline[3]; xline[XSTART] = 1.0; xline[XSTEP] = 1.0; s->xline_length = xline[XLENGTH] = (double) diameter;// diameter > MAXNN must be first since // risk of overflow ! // printf("length %f %f\n", diameter, 1.0 / linesimufactor); assert(false); // 4465 0.000948 //printf("xline %f %f %f\n", xline[XSTART], xline[XSTEP], xline[XLENGTH]); double T[3]; if (ce_dim2) { T[XSTART] = loc->T[XSTART]; T[XSTEP] = loc->T[XSTEP]; T[XLENGTH] = (double) loc->length[dim-1]; } else T[XSTART] = T[XSTEP] = T[XLENGTH] = RF_NA; loc_set(xline, T, 1, 1, 3, ce_dim2 /* time */, true /* grid */, false, &(cov->key->ownloc)); //APMI(cov); int ens = GLOBAL.general.expected_number_simu; cov_model *key = cov->key; GLOBAL.general.expected_number_simu = 100; if ((err = CHECK(key, 1 + (int) ce_dim2, 1 + (int) ce_dim2, ProcessType, XONLY, CARTESIAN_COORD, cov->vdim2, ROLE_GAUSS)) != NOERROR) { goto ErrorHandling; } //printf("dims %d %d\n", cov->key->xdimown, s->ce_dim); assert(key->xdimown == s->ce_dim); if ((err = STRUCT(key, NULL)) != NOERROR) goto ErrorHandling; if (!key->initialised) { if (key->key != NULL && (err = CHECK(key, 1 + (int) ce_dim2, 1 + (int) ce_dim2, PosDefType, XONLY, SYMMETRIC, SUBMODEL_DEP, ROLE_GAUSS)) != NOERROR) { // PMI(key); goto ErrorHandling; } if (PL >= PL_DETAILS) { PRINTF("\n\nCheckModelInternal (%s, #=%d), after 2nd check:", NICK(key), key->gatternr); // ok } } NEW_STORAGE(stor, STORAGE, gen_storage); if ((err = INIT(key, 0, cov->stor)) != NOERROR) goto ErrorHandling; s->err = err; ErrorHandling : //cov->initialised = err==NOERROR && key->initialised; GLOBAL.general.expected_number_simu = ens; return err; } // aufpassen auf ( * * 0 ) // ( * * 0 ) // ( 0 0 1 ) int init_tbmproc(cov_model *cov, gen_storage *S) { location_type *loc = Loc(cov); int err=NOERROR; char errorloc_save[nErrorLoc]; cov_model *key = cov->key; // == NULL ? cov->sub[0] : cov->key; assert(key != NULL); TBM_storage *s = cov->Stbm; // PMI(cov); // crash(); assert(s != NULL); strcpy(errorloc_save, ERROR_LOC); sprintf(ERROR_LOC, "%s TBM: ", errorloc_save); cov->method = TBM; ROLE_ASSERT_GAUSS; if (s->err==NOERROR) { err = INIT(key, 0, S); } else { assert(s->err < NOERROR); } strcpy(ERROR_LOC, errorloc_save); if (err != NOERROR) return err; if (loc->distances) return ERRORFAILED; err = FieldReturn(cov); // APMI(cov); cov->simu.active = err == NOERROR; if (PL>= PL_STRUCTURE) PRINTF("\ntbm is now initialized.\n"); return err; } void GetE(int fulldim, TBM_storage *s, int origdim, bool Time, double *phi, double deltaphi, double *aniso, double *offset, double *ex, double *ey, double *ez, double *et) { double sube[MAXTBMSPDIM], e[MAXTBMSPDIM]; int d, j, idx, k, spatialdim = s->simuspatialdim; // total = spatialdim * dim; // dim is the users's dim of the field // this might be reduced by zonal anisotropies leading to spatialdim // printf("gete fulldim=%d %d %d\n", fulldim, origdim, spatialdim); // for debugging only for(d=0; d= spatialdim); if (fulldim == 2) { // no choice between random and non-random (*phi) += deltaphi; sube[0] = sin(*phi); sube[1] = cos(*phi); } else if (fulldim == 3) { unitvector3D(spatialdim, sube, sube +1, sube + 2); // print("spatdim=%d %d sube=%f %f %f\n", // spatialdim, s->simuspatialdim, sube[0], sube[1], sube[2]); } else ERR("wrong full dimension"); *offset = 0.5 * s->xline_length; // print("offset %f %f\n", *offset, s->xline_length); if (aniso == NULL) { for (d=0; dlinesimufactor; *offset -= s->center[d] * e[d]; // printf("d=%d %f sube=%f %f %f\n", d, e[d], sube[d],s->linesimufactor, s->center[d]); // } // for (d=0; dcenter[d], s->linesimufactor, s->ce_dim); // } idx = spatialdim; if (Time && s->ce_dim==1) { *et = e[--idx]; } switch (idx) { case 4 : BUG; case 3 : *ez = e[--idx]; case 2 : *ey = e[--idx]; case 1 : *ex = e[--idx]; break; default: BUG; } } void do_tbmproc(cov_model *cov, gen_storage VARIABLE_IS_NOT_USED *S) { cov_model *key = cov->key; assert(key != NULL); // == NULL ? cov->sub[0] : cov->key; location_type *loc = Loc(cov), *keyloc = Loc(key); TBM_storage *s = cov->Stbm; int vdim = cov->vdim2[0]; long nn = keyloc->length[0], ntot = keyloc->totalpoints * vdim, totvdim = loc->totalpoints * vdim; //printf("%d\n", ntot);// assert(false); // assert(ntot > 4000); // APMI(cov->key); int origdim = loc->caniso == NULL ? cov->tsdim : loc->cani_nrow, tsdim = cov->tsdim, spatialdim = s->simuspatialdim, // for non-grids only every = GLOBAL.general.every, tbm_lines = P0INT(TBM_LINES); res_type *res = cov->rf, *simuline = key->rf; assert(res != NULL); assert(simuline != NULL); double phi, deltaphi, stepx, stepy, stepz, stept, incx=0.0, incy=0.0, incz=0.0, inct=0.0; long n, totpoints; int v, nt, idx, gridlent, fulldim = P0INT(TBM_FULLDIM); bool loggauss = GLOBAL.gauss.loggauss; assert(cov->stor != NULL); // printf("%d %d\n", P0INT(TBM_FULLDIM), s->ce_dim); // APMI(cov); for (n=0; ngrid) { int nx, ny, nz, gridlenx, gridleny, gridlenz; long zaehler; double xoffset, yoffset, zoffset, toffset; stepx = stepy = stepz = stept = 0.0; gridlenx = gridleny = gridlenz = gridlent = 1; idx = origdim; if (s->ce_dim==2) { gridlent = loc->length[--idx]; // could be one !! stept = loc->xgr[idx][XSTEP]; inct = (double) nn; // wegen assert unten } else if (loc->Time) { gridlent = loc->length[--idx]; // could be one !! stept = loc->T[XSTEP]; } switch (idx) { case 4 : BUG; case 3 : gridlenz = loc->length[--idx]; stepz = loc->xgr[idx][XSTEP]; // no break; case 2 : gridleny = loc->length[--idx]; stepy = loc->xgr[idx][XSTEP]; // no break; case 1 : gridlenx = loc->length[--idx]; stepx = loc->xgr[idx][XSTEP]; break; default: BUG; } for (n=0; n0 && n > 0 && (n % every == 0)) PRINTF("%d \n",n); GetE(fulldim, s, origdim, loc->Time, &phi, deltaphi, loc->caniso, &inittoffset, &incx, &incy, &incz, &inct); incx *= stepx; incy *= stepy; incz *= stepz; if (s->ce_dim == 1) inct *= stept; inittoffset += UNIFORM_RANDOM - 0.5; // PMI(key); // printf("%ld %ld\n", (long int) S, (long int) cov->stor);assert(false); DO(key, cov->stor); // if (n<5) { // int i; // for (i=0; i<8; i++) print("%2.3f ", simuline[i]); // print("%d \n", ntot); // } zaehler = 0; for (v=0; v=0))) { PRINTF("xx ntot %ld %ld %ld -- offsets %f %f %f %f\n x:%d %d y:%d %d z:%d %d t:%d %d\n", ntot, longxoffset, zaehler, xoffset, yoffset, zoffset, toffset, nx, gridlenx, ny, gridleny, nz, gridlenz, nt, gridlent ); // continue;# //APMI(key); assert((longxoffset=0) ); } res[zaehler++] += simuline[longxoffset]; xoffset += incx; } yoffset += incy; } zoffset += incz; } toffset += inct; } inittoffset += s->xline_length; } // vdim } // n } else { // assert(false); // not grid, could be time-model! // both old and new form included double offset, offsetinit; long xi; int i, end; // PrintMethodInfo(s->key.meth); #define TBMST(INDEX) { \ for (n=0; n0 && (n % every == 0)) PRINTF("%ld \n",n); \ GetE(fulldim, s, origdim, loc->Time, &phi, deltaphi, \ loc->caniso, &offsetinit, &incx, &incy, &incz, &inct); \ offset += UNIFORM_RANDOM - 0.5; \ DO(key, cov->stor); \ i = 0; \ end=totpoints; \ for (v=0; v=0))) { \ PRINTF("\n%f %f %f (%f %f %f))\n", \ loc->x[xi], loc->x[xi+1] , loc->x[xi+2], incx, incy, incz); \ PRINTF("n=%ld index=%ld nn=%ld ntot=%ld xi=%ld nt=%d\n OFF=%f IDX=%f inct=%f e=%d\n", \ n, index, nn, ntot, xi, (int) nt, offset, INDEX, inct, (int) end); \ } \ assert((index=0)); \ res[i] += simuline[index]; \ xi += tsdim; \ } \ offset += inct; \ } \ offsetinit += s->xline_length; \ } \ } \ } if (s->ce_dim == 1) { gridlent = 1; totpoints = loc->totalpoints; inct = RF_NA; // should be set by GetE } else { // ce_dim==2 nur erlaubt fuer echte Zeitkomponente assert(s->ce_dim==2); gridlent = keyloc->length[1]; totpoints = s->spatialtotalpts; inct = (double) nn; } // printf("%d %ld %ld\n", gridlent, nn, ntot); assert(gridlent * nn * vdim == ntot); switch (spatialdim) { case 1 : //see Martin's techrep f. details TBMST(loc->x[xi] * incx); break; case 2: TBMST(loc->x[xi] * incx + loc->x[xi+1] * incy); // break; case 3: TBMST(loc->x[xi] * incx + loc->x[xi+1] * incy + loc->x[xi+2] * incz); break; default : BUG; } } // end not grid // {double z; int i; for(i=0, z=0.0; itotalpoints; i++) z+=res[i]*res[i]; // print("%f %f %f\n", // simuline[0], z /loc->totalpoints , res[10] ); // } } RandomFields/src/D.H.cc0000644000175100001440000002213012412655466014317 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de calculation of the Hurst coefficient and the fractal dimension of the graph of a random field Copyright (C) 2002 - 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "RF.h" SEXP boxcounting(SEXP Z, // data SEXP LX, // basic length of data SEXP Repet, // "independent" repetitions of data SEXP Factor, // rescalin of data values by factor SEXP Eps // box lengths ) { // in sum, the boxcounting result for the first lx data values is given // according to the box lengths given by eps; then the boxes are counted // for the next lx data values, etc. Hence, sum must have dimension int *eps = INTEGER(Eps), leps = length(Eps), repet = INTEGER(Repet)[0], lx = INTEGER(LX)[0]; long i, k, j, e, r, lastbox, s, // 0 to leps * repet -1 truelx = 2 + lx, total = repet * truelx; double zz, min, max, f, *sum, factor = REAL(Factor)[0], *z = REAL(Z); SEXP Sum; PROTECT(Sum = allocVector(REALSXP, leps * repet)); sum = REAL(Sum); // boxcounting expects that the first and the last values are repeated // in the first dimension, see D.H.R; accordingly the total length in // the first direction is increased by 2: for (s=r=0; r max) max = z[i]; assert(i <= r + lx + 1); if ((zz = 0.5 * (z[i-1] + z[i])) < min) min = zz; else if (zz > max) max = zz; f = factor / (double) e; sum[s] += floor(max * f) - floor(min * f) + 1.0; } } } UNPROTECT(1); return Sum; } SEXP periodogram(SEXP Dat, // data SEXP Len, // basic length of data SEXP Repet, // # of "independent" repetitions SEXP FFTM, // fftm[0] >=1 not >=1 (R indexing assumed) // interval of the vector given by fft of part SEXP Part, // not the basic length but only a part is // transformed SEXP Shift // part is then shifted by shift until end of // vector is reached; fft values are averaged // over all these parts ){ int *fftm = INTEGER(FFTM), part = INTEGER(Part)[0]; assert((fftm[0]>=1) && (fftm[1] <=part) && (fftm[1] >= fftm[0])); long seg_dat, k, j, total_seg, segment_r, repet = INTEGER(Repet)[0], start_k = 2 * (fftm[0] - 1), // of complex numbers end_k = 2 * (fftm[1] - 1), // of complex numbers segm_l, r, delta_l = fftm[1] - fftm[0] + 1, end_l = delta_l * repet, err = ERRORFAILED, len = INTEGER(Len)[0], lenMpart = len - part, shift = INTEGER(Shift)[0]; assert(lenMpart >= 0); assert(shift>=1); double taper_fact = sqrt( 2.0 / (3.0 * ((double) part + 1.0)) ), cos_factor = 2.0 * PI / ((double) part + 1.0), *compl_number = NULL, *taper = NULL, *lambda = NULL, n_inv = 1.0 / (double) ((int) (1.0 + lenMpart / (double) shift)), *dat = REAL(Dat), factor = log(2 * PI * len) ; FFT_storage FFT; SEXP Lambda; PROTECT(Lambda = allocVector(REALSXP, end_l)); lambda = REAL(Lambda); for (j=0; j 1); double var, a, b, residual, Yt, realm, sumt, meanY, t, VarMeth_old, VarMeth_mean, VarMeth_var, delta, realnbox, *lvar, *dat = REAL(Dat); SEXP Lvar; // ## rbind(l.varmeth.var, l.dfa.var) 2 * (repet * ldfa) PROTECT(Lvar = allocMatrix(REALSXP, 2, ldfa * repet)); lvar = REAL(Lvar); for (e = r = 0; r < total; r += lx, e+=ldfa) { last = r + lx; for (j=r+1; j 1) { VarMeth_mean = dat[ex - 1] / (realnbox); VarMeth_old = 0; VarMeth_var = 0; for (j=r+m-1; j max) max = dat[idx]; } count[cb] += max - min; } count[cb] = log(count[cb] / (double) epsilon); } // b } // r UNPROTECT(1); return Count; } RandomFields/src/MLE.cc0000644000175100001440000007466312412655466014405 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de library for simulation of random fields Copyright (C) 2001 -- 2014 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. RO This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include "RF.h" #include "primitive.h" // #include "Covariance.h" bool is_top(cov_model *cov) { if (cov == NULL) BUG; return isInterface(cov); } void GetNAPosition(cov_model *cov, int *NAs, naptr_type mem, int *elmnts, elptr_type mem_elmnts, NAname_type names, sortsofparam *sorts, bool *isnan, covptr_type covModels, int *covzaehler, int allowforintegerNA, int SHORTlen, int printing, int depth, bool no_variance, bool excludetrends ) { /* printing <= 0 nothing 1 only NA, NaN 2 others as "*" 3 others as value mem[0..NAs] : addresse wo (neue) NA position im Speicher sorts[0..NAs] : see sortsofparam in RF.h isnan[0..NAs] : NA or NaN */ // PMI(cov); // if (SHORTlen < 2) BUG; int i, c, r, namenr = 1, *nrow = cov->nrow, *ncol = cov->ncol; // double *lastmem = NULL; char shortname[255], shortD[255]; cov_fct *C = CovList + cov->nr, // nicht gatternr *CC = C; SEXPTYPE *type = C->kappatype; if (isRandom(cov)) { error("Random functions not allowed in models of RFfit, yet"); } //printf("depth =%d %s %d\n", depth, C->name, *elmnts); // C is pointer to true model; CC points to the first model passed // in initNerror.cc by IncludeModel or IncludePrim while(strncmp(CC->name, InternalName, strlen(InternalName)) ==0) CC--; covzaehler[cov->nr]++; // // print("SHORT %d %s\n", SHORTlen, CC->name); strcopyN(shortname, CC->nick + 2, SHORTlen); if (covzaehler[cov->nr] >= 2) { char dummy[255]; strcopyN(dummy, shortname, SHORTlen-1); sprintf(shortname, "%s%d", dummy, covzaehler[cov->nr]); } if (printing>0) PRINTF("%s\n", CC->name); // CC needed below for the kappa.names which are given // print("%d:%s %d %s\n", cov->nr, CC->name, covzaehler[cov->nr], shortname); depth++; for (i=0; ikappas; i++) { if (nrow[i] == 0 || ncol[i] == 0) continue; if (printing > 0) { leer(depth); PRINTF("%s\n", C->kappanames[i]); } if (i==0 && type[i] == INTSXP && strcmp(C->kappanames[i], ELEMENT) == 0){ if (*elmnts >= MAX_MLE_ELMNTS ) ERR("maximum number of models with variable elements reached"); if (P0INT(i) == NA_INTEGER) ERR1("'%s' may not be NA", ELEMENT); mem_elmnts[(*elmnts)++] = PINT(i); // to do!! covModels[*NAs] hierher uebertragen !! s.u. //printf("elmnts %s %d %s %d\n", CC->name, i, C->kappanames[i], *elmnts); continue; } for (r=0; r= MAX_NA) ERR("maximum number of NA reached"); // print("NAs=%d, %d %d %s\n", *NAs, i, idx, C->kappanames[i]); if (type[i] == REALSXP) { v = P(i)[idx]; mem[*NAs] = P(i) + idx; covModels[*NAs] = cov; } else if (type[i] == INTSXP) { v = PINT(i)[idx] == NA_INTEGER ? RF_NA : (double) PINT(i)[idx]; if (ISNAN(v) && !allowforintegerNA) { // crash(cov); ERR("integer variables currently do not allow for NA"); // !!! } // mem[*NAs] = (*double) &(P0INT(i])[idx]); } else if (type[i] == LISTOF + REALSXP) { listoftype *q; int j, end; double *p; q= PLIST(i); p = q->p[r]; end = q->nrow[r] * q->ncol[r]; for (j=0; j 0) { if (nv>1 || (c>0 && printing > 1)) PRINTF(", "); else leer(depth+1); } if (isDollar(cov)) { // shortD partial name for R level cov_model *next = cov->sub[0]; while(isDollar(next) || isNatsc(next)) next = next->sub[0];// ok if (covzaehler[next->nr] == 0) { // next wurde noch nicht // untersucht, somit ist covzaehler[next->nr] um 1 niedriger // als covzaehler[cov->nr] ! strcopyN(shortD, NICK(next) + 2, SHORTlen); } else { char dummy[255]; strcopyN(dummy, NICK(next) + 2, SHORTlen-1); sprintf(shortD, "%s%d", dummy, covzaehler[next->nr]+1); // print("$$ > %d:%s %d %s\n", next->nr, NICK(to), // covzaehler[next->nr], shortD); } // assert(DANISO == DSCALE + 1); if (i==DVAR) { cov_model *call = cov->calling; if (call == NULL) BUG; if (!is_top(call) && call->nr == MIXEDEFFECT) { sorts[*NAs] = !is_top(call->calling) && (call->calling->nr == PLUS || call->calling->nr == SELECT) && is_top(call->calling->calling) ? MIXEDVAR : ANYPARAM; } else { while (!is_top(call) && (call->nr == PLUS || call->nr==SELECT)) call = call->calling; if (call == NULL) BUG; sorts[*NAs] = is_top(call) ? (next->nr == NUGGET ? NUGGETVAR : VARPARAM) : ANYPARAM; } if (no_variance && sorts[*NAs] <= SIGNEDSDPARAM) sorts[*NAs] = ANYPARAM; sprintf(names[*NAs], sorts[*NAs] <= SIGNEDSDPARAM || sorts[*NAs] == NUGGETVAR || sorts[*NAs]==MIXEDVAR ? "%s.var" : "%s.vx", shortD); // for R level only } else { if (i==DSCALE) { // lastmem = mem[*NAs]; // used for all diagonal elements of // aniso sorts[*NAs] = SCALEPARAM; sprintf(names[*NAs], "%s.s", shortD);// for R level only } else { assert(i == DANISO); // no lastmem here ! if (cov->q != NULL && cov->q[0] != 0.0) { // print("sdfasdf\n"); ERR("naturalscaling only allowed for isotropic setting"); } if (r==c) { sorts[*NAs] = DIAGPARAM; sprintf(names[*NAs], "%s.d.%d", shortD, r);// R level only } else { sorts[*NAs] = ANISOPARAM; sprintf(names[*NAs], "%s.d.%d.%d", shortD, r, c);// R level } } } } else { // standard setting ! if (cov->nr==MIXEDEFFECT || cov->nr==TREND) { // || cov->nr==MLEMIXEDEFFECT) if (excludetrends) continue; assert(type[i] == REALSXP); sorts[*NAs] = cov->nr==TREND ? TRENDPARAM : MIXEDPARAM; } else { if (type[i] == INTSXP) sorts[*NAs] = INTEGERPARAM; else { // r)ow, c)olumn; i:kappa, cov->nr, C sorts[*NAs] = C->paramtype(i, r, c); // ANYPARAM; if (sorts[*NAs] == IGNOREPARAM || sorts[*NAs] == DONOTRETURNPARAM) continue; // print("%s k=%d no_var=%d, %d \n", C->name, i, // no_variance, sorts[*NAs]); if (no_variance && sorts[*NAs] <= SIGNEDSDPARAM) sorts[*NAs] = ANYPARAM; } } char kappashort[255]; strcopyN(kappashort, CC->kappanames[i], SHORTlen); sprintf(names[*NAs], "%s.%s", shortname, kappashort); if (*NAs > 0 && 0== strncmp(names[*NAs], names[*NAs-1], strlen(names[*NAs]))){ if (namenr == 1) { sprintf(names[*NAs-1], "%s.%s.%d", shortname, kappashort, namenr); } namenr++; sprintf(names[*NAs], "%s.%s.%d", shortname, kappashort,namenr); } else namenr=1; } if (printing > 0) { if (printing <= 2) PRINTF("%d",*NAs + 1); else PRINTF("!%d", *NAs + 1); } // print("%d %ld\n", *NAs, mem[*NAs]); (*NAs)++; nv++; } else { // not is.na(v) // kein NA an der Position; somit nur Anzeige if (printing > 1) { if (c>0) PRINTF(", "); else leer(depth+1); if (printing <= 2) PRINTF("*"); else { if (type[i]== REALSXP) PRINTF("%6.2e", v); else PRINTF("%5d", (int) v); } } } // else kein NA } //c if ((printing > 0 && nv > 0) || (printing > 1 && ncol[i] > 0)) PRINTF("\n"); } // r } // i cov_model *sub; for (i=0; isub[i]; if (sub != NULL) { if (printing > 0) { leer(depth); PRINTF("%s = ", C->subnames[i]); } GetNAPosition(sub, NAs, mem, elmnts, mem_elmnts, names, sorts, isnan, covModels, covzaehler, allowforintegerNA, SHORTlen, printing, depth, C->paramtype(-i-1, 0, 0) != VARPARAM, excludetrends ); } } } /* wird (derzeit) nicht verwenden !! */ SEXP GetNAPositions(SEXP model_reg, SEXP model, SEXP spatialdim, SEXP Time, SEXP xdimOZ, SEXP integerNA, SEXP Print) { int i, NAs, elmnts, covzaehler[MAXNRCOVFCTS]; naptr_type mem; elptr_type mem_elmnts; covptr_type covModels; sortsofparam sorts[MAX_NA]; bool isnan[MAX_NA]; NAname_type names; bool skipchecks = GLOBAL.general.skipchecks; GLOBAL.general.skipchecks = true; CheckModelInternal(model, ZERO, ZERO, ZERO, INTEGER(spatialdim)[0], INTEGER(xdimOZ)[0], 1, 1, false, false, LOGICAL(Time)[0], KEY + INTEGER(model_reg)[0]); sprintf(ERROR_LOC, "getting positions with NA: "); // print("global=%d\n", GLOBAL.fit.lengthshortname); GLOBAL.general.skipchecks = skipchecks; NAs = 0; for (i=0; inrow, *ncol = cov->ncol; cov_fct *C = CovList + cov->nr; // nicht gatternr SEXPTYPE *type = C->kappatype; if (cov->nr == MIXEDEFFECT && level==0) { // || cov->nr == MLEMIXEDEFFECT ) if (cov->nrow[MIXED_BETA] > 0) return 0; // b is given } if (cov->nr == TREND && level==0) return 0; count= 0; for (i=0; ikappas; i++) { if (nrow[i] == 0 || ncol[i] == 0 || C->paramtype(i, 0, 0) == IGNOREPARAM || C->paramtype(i, 0, 0) == DONOTRETURNPARAM ) continue; endfor = nrow[i] * ncol[i]; if (type[i] == REALSXP) { double *p = P(i); for (r=0; rsub[i]; if (sub == NULL) continue; count += countnas(sub, level + 1); } return count; } void Take21internal(cov_model *cov, cov_model *cov_bound, double **bounds_pointer, int *NBOUNDS) { /* determine the bounds for the parameters that are to be estimated */ int i, c, r, nv=0, // zaehlt NAs *nrow = cov->nrow, *ncol = cov->ncol, *nrow2 = cov_bound->nrow, *ncol2 = cov_bound->ncol; cov_fct *C = CovList + cov->nr; // nicht gatternr SEXPTYPE *type = C->kappatype; if (strcmp(Nick(cov), Nick(cov_bound)) != 0) { // print("%s %s\n", CovList[cov->nr].nick, CovList[cov_bound->nr].nick); ERR("models do not match."); } // print("\n\n\n ======================= \n"); // print("%s %d %s\n", C->name, C->kappas, CovList[cov_bound->nr].name); for (i=0; ikappas; i++) { // print("i=%d %s %s alt=%s\n", i, C->name, C->kappanames[i], //CovList[cov_bound->nr].name); if (C->kappatype[i] >= LISTOF || C->paramtype(i, 0, 0) == IGNOREPARAM || C->paramtype(i, 0, 0) == DONOTRETURNPARAM) continue; if (nrow[i] != nrow2[i] || ncol[i] != ncol2[i]) { PRINTF("%s i: %d, nrow1=%d, nrow2=%d, ncol1=%d, ncol2=%d\n", C->name, i, nrow[i], nrow2[i], ncol[i], ncol2[i]); ERR("lower/upper/user does not fit the model (size of matrix)"); } for (r=0; rq == NULL) || // ! natscaling i == DANISO) && (cov->nr != MIXEDEFFECT && cov->nr != TREND) ) // aniso ?? ABfrage OK ?? { // print("%s %s, r=%d, c=%d: %d name, C->kappanames[i], r, c, nv, *NBOUNDS); if (nv >= *NBOUNDS) { PRINTF("%s %s, r=%d, c=%d: %d >= %d\n", C->name, C->kappanames[i], r, c, nv, *NBOUNDS); ERR("lower/upper/user does not fit the model (number parameters)"); } (*bounds_pointer)[nv] = w; nv++; } } //ISNA } //c } // r } // i *NBOUNDS = *NBOUNDS - nv; (*bounds_pointer) += nv; for (i=0; isub[i] != NULL) { Take21internal(cov->sub[i], cov_bound->sub[i], bounds_pointer, NBOUNDS); } } } SEXP Take2ndAtNaOf1st(SEXP model_reg, SEXP model, SEXP model_bound, SEXP spatialdim, SEXP Time, SEXP xdimOZ, SEXP nbounds, SEXP skipchecks) { // MAXMLEDIM double *bounds_pointer; int m, NBOUNDS_INT =INTEGER(nbounds)[0], *NBOUNDS= &NBOUNDS_INT, nr[2] = {INTEGER(model_reg)[0], MODEL_BOUNDS}; SEXP bounds, models[2] = {model, model_bound}; bool oldskipchecks = GLOBAL.general.skipchecks; if (nr[0] == nr[1]) error("do not use register 'model bounds'"); NAOK_RANGE = true; if (LOGICAL(skipchecks)[0]) GLOBAL.general.skipchecks = true; for (m=1; m>=0; m--) { // 2er Schleife !! // assert(m==1); CheckModelInternal(models[m], ZERO, ZERO, ZERO, INTEGER(spatialdim)[0], INTEGER(xdimOZ)[0], 1, 1, false, false, LOGICAL(Time)[0], KEY + nr[m]); GLOBAL.general.skipchecks = oldskipchecks; } NAOK_RANGE = false; PROTECT(bounds = allocVector(REALSXP, *NBOUNDS)); bounds_pointer = NUMERIC_POINTER(bounds); // PMI(KEY[nr[0]]); // PMI(KEY[nr[1]]); Take21internal(KEY[nr[0]], KEY[nr[1]], &bounds_pointer, NBOUNDS); if (*NBOUNDS != 0) ERR("lower/upper does not fit to model"); UNPROTECT(1); return bounds; } void GetNARanges(cov_model *cov, cov_model *min, cov_model *max, double *minpile, double *maxpile, int *NAs) { /* determine the ranges of the parameters to be estimated */ int i, r, *nrow = cov->nrow, *ncol = cov->ncol; cov_fct *C = CovList + cov->nr; // nicht gatternr SEXPTYPE *type = C->kappatype; double v, dmin, dmax; // print("\ngetnaranges\n"); for (i=0; ikappas; i++) { int end = nrow[i] * ncol[i]; if (end == 0) continue; if (type[i] == REALSXP) { dmin = PARAM0(min, i); dmax = PARAM0(max, i); } else if (type[i] == INTSXP) { dmin = PARAM0INT(min, i) == NA_INTEGER ? RF_NA : (double) PARAM0INT(min, i); dmax = PARAM0INT(max, i) == NA_INTEGER ? RF_NA : (double) PARAM0INT(max, i); } else if (type[i] == LISTOF + REALSXP) { dmin = PARAM0(min, i); dmax = PARAM0(max, i); } else if (type[i] == CLOSXP) { dmin = 0.0; dmax = 0.0; } else if (type[i] == LANGSXP) { dmin = 0.0; dmax = 0.0; } else { BUG; dmin = dmax = RF_NA; } for (r=0; rparamtype(i, 0, 0) != IGNOREPARAM && C->paramtype(i, 0, 0) != DONOTRETURNPARAM && cov->nr!=MIXEDEFFECT && cov->nr!=TREND) {// cov->nr!=MLEMIXEDEFFECT if (!isDollar(cov) || (i!=DANISO && i!=DPROJ)) { minpile[*NAs] = dmin; maxpile[*NAs] = dmax; // print("%s %d %f %f\n", C->kappanames[i],r, dmin, dmax); (*NAs)++; } else { // maybe NAs and internpile should be set here continue; } } // isna } // r } // kappas for (i=0; isub[i] != NULL) { GetNARanges(cov->sub[i], min->sub[i], max->sub[i], minpile, maxpile, NAs); } } } int check_recursive_range(cov_model *cov, bool NAOK) { /* called by SetAndGetModelInfo */ int i, err; if ((err = check_within_range(cov, NAOK)) != NOERROR) return err; for (i=0; isub[i] != NULL) { if ((err = check_recursive_range(cov->sub[i], NAOK)) != NOERROR) return err; } } return NOERROR; } int CheckEffect(cov_model *cov) { int i,j,end, nr; bool na_var = false; double *p; cov_model *next; if (cov->nr == MIXEDEFFECT) { // cov->nr = MLEMIXEDEFFECT; if (cov->nsub == 0) { return (cov->nrow[MIXED_BETA] > 0 && ISNAN(P0(MIXED_BETA))) ? fixedeffect : deteffect; } next = cov->sub[0]; if (isDollar(next)) { if (next->ncol[DVAR] == 1 && next->nrow[DVAR] == 1) { na_var = ISNAN(PARAM0(next, DVAR)); } for (i=0; i<=DMAX; i++) { if (i!=DVAR) { end = next->ncol[i] * next->nrow[i]; p = PARAM(next, i); for (j=0; jnr == CONSTANT ? eff_error : na_var ? spvareffect : spaceeffect; // NA in e.g. scale for constant matrix -- does not make sense } } } } next = next->sub[0]; // ok } int xx = next->nr == CONSTANT ? (cov->nrow[CONSTANT_M] > cov->ncol[CONSTANT_M] ? (na_var ? rvareffect : randomeffect) : (na_var ? lvareffect : largeeffect) ) : (na_var ? spvareffect : spaceeffect); if (xx == spvareffect || xx == spaceeffect) { BUG; //APMI(next); } return next->nr == CONSTANT ? (cov->nrow[CONSTANT_M] > cov->ncol[CONSTANT_M] ? (na_var ? rvareffect : randomeffect) : (na_var ? lvareffect : largeeffect) ) : (na_var ? spvareffect : spaceeffect); } if (cov->nr == TREND) { int trend, effect = eff_error; bool isna ; for (j=0; j<2; j++) { trend = (j==0) ? TREND_MEAN : TREND_LINEAR; // print("trend %d %d\n", j, trend); if ( (nr = cov->nrow[trend] * cov->ncol[trend]) > 0) { p = P(trend); isna = ISNAN(p[0]); if ((effect != eff_error) && ((effect == fixedtrend) xor isna)) SERR1("do not mix deterministic effect with fixed effects in '%s'", NICK(cov)); for (i = 1; inrow[trend] > 0) { if (effect != eff_error) SERR("polynomials and free functions in trend may not be mixed with other trend definitions. Please use a sum of trends."); nr = cov->nrow[param] * cov->ncol[param]; if (nr > 0) { p = P(param); isna = ISNAN(p[0]); for (i = 1; isub[0]; } if (isNatsc(sub)) sub = sub->sub[0]; cov_fct *C = CovList + sub->nr; // nicht gatternr if (C->maxsub == 0) { if (isPosDef(C->Type) && C->domain == XONLY && C->isotropy == ISOTROPIC && (C->vdim == 1 || C->cov==nugget) && Simple) { return simple; } return primitive; } return remaining; } static naptr_type MEMORY[MODEL_MAX+1]; static covptr_type MEM_COVMODELS[MODEL_MAX+1]; static elptr_type MEMORY_ELMNTS[MODEL_MAX+1]; int MEM_NAS[MODEL_MAX+1], MEM_ELMNTS[MODEL_MAX+1]; SEXP SetAndGetModelInfo(SEXP model_reg, SEXP model, SEXP spatialdim, SEXP distances, SEXP ygiven, SEXP Time, SEXP xdimOZ, SEXP shortlen, SEXP allowforintegerNA, SEXP excludetrend) { // ex MLEGetNAPos sortsofparam MEM_SORTS[MAX_NA]; bool anyeffect, MEM_ISNAN[MAX_NA]; /* basic set up of covariance model, determination of the NA's and the corresponding ranges. */ cov_model *cov, *key, *min=NULL, *max=NULL, *pmin=NULL, *pmax=NULL, *openmin=NULL, *openmax=NULL; // bool skipchecks = GLOBAL.general.skipchecks; NAname_type names; double mle_min[MAX_NA], mle_max[MAX_NA], mle_pmin[MAX_NA], mle_pmax[MAX_NA], mle_openmin[MAX_NA], mle_openmax[MAX_NA]; int i, covzaehler[MAXNRCOVFCTS], effect[MAXSUB], nas[MAXSUB], newxdim, neffect, NAs, err = NOERROR, modelnr = INTEGER(model_reg)[0]; const char *colnames[8] = {"pmin", "pmax", "type", "is.nan", "min", "max", "openmin", "openmax"}; SEXP trans_inv, isotropic, Sxdim, matrix, nameAns, nameMatrix, RownameMatrix, ans=NULL; #define total 7 PROTECT(trans_inv=allocVector(LGLSXP, 1)); LOGICAL(trans_inv)[0] = false; PROTECT(isotropic=allocVector(LGLSXP, 1)); LOGICAL(isotropic)[0] = false; NAOK_RANGE = true; CheckModelInternal(model, ZERO, ZERO, ZERO, INTEGER(spatialdim)[0], INTEGER(xdimOZ)[0], 1, LOGICAL(ygiven)[0] ? 1 : 0, // lx, ly false, //grid LOGICAL(distances)[0], //distances LOGICAL(Time)[0], KEY + modelnr); // APMI(KEY[modelnr]); //, "setandget"); cov = key = KEY[modelnr]; if (isInterface(cov)) { cov = cov->key == NULL ? cov->sub[0] : cov->key; } if (key->prevloc->timespacedim > MAXMLEDIM) ERR("dimension too high in MLE"); NAOK_RANGE = false; if (cov->pref[Nothing] == PREF_NONE) { err = ERRORINVALIDMODEL; goto ErrorHandling; } // print("here returnx tsdim %d %d %d\n", // INTEGER(tsdim)[0], LOGICAL(domain)[0], LOGICAL(isotropic)[0]); // print("here\n"); // PMI(cov); newxdim = INTEGER(xdimOZ)[0]; if (cov->domprev == XONLY && isPosDef(cov->typus)) { LOGICAL(trans_inv)[0] = true; if (cov->isoown==ISOTROPIC) { LOGICAL(isotropic)[0] = true; newxdim = 1; // removeOnly(KEY + modelnr); nicht wegnehmen // da derzeit negative distanczen in GLOBAL.CovMatrixMult auftreten -- obsolete ?! } } // print("SD here returnx tsdim %d\n", INTEGER(tsdim)[0]); // GLOBAL.general.skipchecks = skipchecks; check_recursive_range(cov, true); // print("AS here returnx tsdim %d\n", INTEGER(tsdim)[0]); if ((err = get_ranges(cov, &min, &max, &pmin, &pmax, &openmin, &openmax)) != NOERROR) goto ErrorHandling; // print("hier %d\n", INTEGER(shortlen)[0]); MEM_ELMNTS[modelnr] = MEM_NAS[modelnr] = 0; for (i=0; i= PL_COV_STRUCTURE) + (PL >=PL_DETAILS) + (PL >= PL_SUBDETAILS), 0, false, LOGICAL(excludetrend)[0]); // print("XX modelnr=%d\n", modelnr); NAs = 0; GetNARanges(cov, min, max, mle_min, mle_max, &NAs); //print("XXz modelnr=%d\n", modelnr); NAs = 0; GetNARanges(cov, pmin, pmax, mle_pmin, mle_pmax, &NAs); //print("XX-------- amodelnr=%d\n", modelnr); NAs = 0; GetNARanges(cov, openmin, openmax, mle_openmin, mle_openmax, &NAs); anyeffect=false; if (cov->nr == PLUS || cov->nr == SELECT) { for (i=0; insub; i++) { // print("checkeffect: %d %d\n", i, cov->nsub); effect[i] = CheckEffect(cov->sub[i]); nas[i] = countnas(cov->sub[i], 0); // print("i=%d nsub=%d eff=%d remain=%d nas=%d\n", i, cov->nsub, effect[i], remaining, nas[i]); if (effect[i] == eff_error) GERR("scaling parameter appears with constant matrix in the mixed effect part"); anyeffect |= (effect[i] != remaining && effect[i] != primitive); } } else { effect[0] = CheckEffect(cov); nas[0] = countnas(cov, 0); } anyeffect = true; // always bring back effects!! if (anyeffect) { if (cov->nr == PLUS || cov->nr == SELECT) neffect = cov->nsub; else neffect = 1; } else neffect = 0; // print("There returnx tsdim %d\n", INTEGER(tsdim)[0]); PROTECT(Sxdim=allocVector(INTSXP, 1)); INTEGER(Sxdim)[0] = newxdim; // print("hYere returnx tsdim %d\n", INTEGER(tsdim)[0]); PROTECT(matrix = allocMatrix(REALSXP, MEM_NAS[modelnr], 8)); PROTECT(RownameMatrix = allocVector(STRSXP, MEM_NAS[modelnr])); PROTECT(nameMatrix = allocVector(VECSXP, 2)); for (i=0; imatrix_indep_of_x)); setAttrib(ans, R_NamesSymbol, nameAns); assert(i==total); UNPROTECT(8); // print(" J here returnx tsdim %d\n", INTEGER(tsdim)[0]); ErrorHandling: if (min != NULL) COV_DELETE(&min); if (max != NULL) COV_DELETE(&max); if (pmin != NULL) COV_DELETE(&pmin); if (pmax != NULL) COV_DELETE(&pmax); if (openmin != NULL) COV_DELETE(&openmin); if (openmax != NULL) COV_DELETE(&openmax); if (err != NOERROR) XERR(err); return ans; } void expliciteDollarMLE(int* ModelNr, double *values) { // // userinterfaces.cc int i, un, modelnr = *ModelNr, NAs = MEM_NAS[modelnr]; // first get the naturalscaling values and devide the preceeding // scale model by this value if (NS==NATSCALE_MLE) { iexplDollar(KEY[modelnr], true); } // Then get the values out of the model for (un=i=0; unsub[0]; // print("%s %d\n", NICK(cov), *reg); ///assert(isDollar(cov)); //print("%ld %f %ld %f\n", cov->p[DVAR], cov->p[DVAR][0], // cov->p[DSCALE], cov->p[DSCALE][0]); // printf("putvaluesatna\n"); for (un=i=0; i MODEL_MAX) XERR(ERRORREGISTER); MEMORY[*reg][i][0] = values[un++]; } if (init) for (i=0; inr; if (i==0 || cov != MEM_COVMODELS[*reg][i-1]) { if (!isDummyInit(C->Init)) { // print("i=%d %s initalising (%f)\n", i, NICK(MEM_COVMODELS[*reg][i]), MEMORY[*reg][i][0]); C->Init(cov, &s); //print("i=%d %s initalised (%f)\n", i, NICK(MEM_COVMODELS[*reg][i]), // MEMORY[*reg][i][0]); } } // } //printf("done\n"); int one = 1; setListElements(reg, &one, &one, &one); } void PutValuesAtNA(int *reg, double *values){ PutValuesAtNAintern(reg, values, true); } void PutValuesAtNAnoInit(int *reg, double *values){ PutValuesAtNAintern(reg, values, false); } void setListElements(int *reg, int *i, int *k, int* len_k) { int len = *len_k; if (*reg < 0 || *reg > MODEL_MAX) XERR(ERRORREGISTER); cov_model *cov = KEY[*reg]; if (cov==NULL) ERR("register is not initialised by 'RFfit'"); if (isInterface(cov)) { cov = cov->key == NULL ? cov->sub[0] : cov->key; } if (cov->nr == SELECT) { int j; if (len != cov->nrow[SELECT_SUBNR]) { PFREE(SELECT_SUBNR); PALLOC(SELECT_SUBNR, len, 1); } for (j=0; j10 */ /* calculate the transformation of the points only once and store the result in a register (indexed by ncov) of key, not of s->. Advantages: points have to calculated only once for several tries; if zonal anisotropy then specific methods may be called; */ #include #include #include //#include #include #include "RF.h" #include #include #include "Covariance.h" /* in CheckCovariance and other the following dimensions are used: xdimOZ : dimension of the points given by the user. value is <= spacedim since in case of isotropy only the distances might be given by the user timespacedim : (= kc->dim = key->timespacedim) the true dimension for the location (if necessary by explicite parameter, e.g. in CovarianceFct.) */ SEXP getListElement(SEXP list, char *str) { SEXP elmt = R_NilValue, names = getAttrib(list, R_NamesSymbol); int i; if (names == R_NilValue) { return R_NilValue; } for (i = 0; i < length(names); i++) { if(strcmp(CHAR(STRING_ELT(names, i)), str) == 0) { elmt = VECTOR_ELT(list, i); break; } } return elmt; } int getListEltNr(SEXP list,const char *str) { // == -1 if no matching name is found // == -2 if multiple matching fctns are found, without one matching exactly SEXP names = getAttrib(list, R_NamesSymbol); if (names == R_NilValue) return NOMATCHING; unsigned int ln; int Nr=0, i, n=length(names); ln=strlen(str); while ( Nr < n && strncmp(str, CHAR(STRING_ELT(names, Nr)), ln)) Nr++; if (Nr < n) { if (ln==strlen(CHAR(STRING_ELT(names, Nr)))) { for (i=Nr+1; i < n; i++) { if (strncmp(str, CHAR(STRING_ELT(names, i)), ln) == 0) { return MULTIPLEMATCHING; } } return Nr; } // a matching function is found. Are there other functions that match? int j; bool multiplematching=false; j=Nr+1; // if two or more covariance functions have the same name // the last one is taken while (jncol[i] != 1 || next->nrow[i] != 1) { char msg[255]; sprintf(msg, "%s is not a scalar", name); ERR(msg); } if (PisNULL(i)) kdefault(cov, i, PARAM0(next, i)); else P(i)[0] = P0(i) * PARAM0(next, i); } } void includeparam(void **qq, // px SEXPTYPE type, // internal type int len, // future internal length SEXP p, // user's values int base, char *param_name // name used in error messages ) { int j; switch(type) { case REALSXP : { *qq = MALLOC(sizeof(double) * len); double *q = (double *) *qq; for (j=0; jDelete = true; q->sexp = p; R_PreserveObject(q->sexp); } break; case LISTOF + REALSXP : // list // vector and matrix are turned into a list of 1 matrix { assert(base == 0); int i, locallen; SEXP pi; listoftype *q; bool list = TYPEOF(p) == VECSXP; if (!list && TYPEOF(p) != REALSXP) { PRINTF("type %d != %d", TYPEOF(p), REALSXP); BUG; } locallen = list ? len : 1; // print("type=%d,%d %d %d %d\n", // TYPEOF(p), VECSXP, locallen, MAXELEMENTS, type,length(p)); if (locallen > MAXELEMENTS) PERR("too many list elements"); *qq = MALLOC(sizeof(listoftype)); q=(listoftype*) (*qq); q->deletelist = true; for (i=0; ip[i] = NULL; q->ncol[i] = 0; q->nrow[i] = 0; } for (i=0; ip + i), REALSXP, length(pi), pi, base, param_name); if (isMatrix(pi)) { // Achtung isVector ist true falls isMatrix true q->ncol[i] = ncols(pi); q->nrow[i] = nrows(pi); } else if (isVector(pi)) { q->ncol[i] = 1; q->nrow[i] = length(pi); } else { PERR("list element(s) neither vector nor matrix"); } } } break; default : PERR("unmatched internal type of parameter"); } } void CMbuild(SEXP model, int level, cov_model **Cov) { int covnr, i, j, nkappas, //, meth, // methNr, // old elt=0, len = length(model); #define NLEER 80 char leer[NLEER], name[MAXCHAR], param_name[PARAMMAXCHAR], ERR_LOC[nErrorLoc]; // methname[METHODMAXCHAR], // msg[200]; SEXP m, p, names = getAttrib(model, R_NamesSymbol); cov_fct *C; cov_model *cov; bool subleft[MAXSUB]; //, True=true, False=false; // print("hier\n"); if (TYPEOF(model) != VECSXP) { // not list8 ERR("list expected") } PROTECT(m = VECTOR_ELT(model, elt++)); if (!isString(m)) { ERR("first element must be the name of a covariance model"); } if (length(m) != 1) ERR("model name must be a single word"); strcopyN(name, (char*) CHAR(STRING_ELT(m, 0)), MAXCHAR); // printf("%d\n", (2 * level < NLEER) ? 2 * level : NLEER); assert(false); strcopyN(leer, " ", (2 * level < NLEER) ? 2 * level : NLEER); sprintf(ERR_LOC, "%s\n%s%s... ", ERROR_LOC, leer, name); strcpy(ERROR_LOC, ERR_LOC); covnr = getmodelnr(name); // if (covnr == NATSC && NS) ERR("natsc model and RFparameters(PracticalRange=TRUE) may not be given at the same time"); if (covnr == -2) { ERR("multiple matching of covariance name") } else if (covnr == -1) { ERR("unknown covariance model. 'RFgetModelNames()' yields the list of models"); } *Cov = NULL; addModel(Cov, covnr, NULL, true); cov = *Cov; cov->user_given = ug_explicit; if (!isDollar(cov)) { cov_model *calling = cov->calling; if (calling != NULL && !isDollar(calling)) calling->user_given = ug_implicit; } cov->nsub = 0; cov->gatternr = S2S; C=CovList + cov->nr; // nicht gatternr nkappas = C->kappas; for (i=0; imaxsub; i++) subleft[i] = true; for ( ; elt < len; elt++) { // if (elt == methNr) continue; // former definition, 26.8.2011 p = VECTOR_ELT(model, elt); strcopyN(param_name, names == R_NilValue ? "" : CHAR(STRING_ELT(names, elt)), PARAMMAXCHAR); if (strcmp(param_name, "") && nkappas != 0) { if ((i = Match(param_name, C->kappanames, nkappas)) < 0) { i = Match(param_name, STANDARDPARAM, nkappas); } // printf("i=%d %s %s kappas=%d %s\n", i, name, param_name, nkappas, C->kappanames[nkappas - 1]); if (i<0 && !strcmp(C->kappanames[nkappas - 1], FREEVARIABLE)) { //print("free variable\n"); if ((j = Match(param_name, C->subnames, C->maxsub)) < 0) { j = Match(param_name, STANDARDSUB, MAXSUB); } if (j < 0) { if (cov->ownkappanames == NULL) { cov->ownkappanames = (char**) CALLOC(nkappas, sizeof(char*)); } // ein FREEVARIABLE-Zeichen wird nie verwendet -- Puffer fuer einfachen Algorithmus; deshalb "i-1" i = nkappas - 1; //PMI(cov); //printf("i=%d\n", i); // printf("%s %d\n", C->kappanames[i - 1] // , !strcmp(C->kappanames[i - 1], FREEVARIABLE)); // printf("i=%d %s\n", 0, cov->ownkappanames[i] ); while(i>0 && !strcmp(C->kappanames[i - 1], FREEVARIABLE) && cov->ownkappanames[i] != NULL) { //printf("i=%d %s %ld\n", i, C->kappanames[i - 1], // cov->ownkappanames[i] ); i--; } if (i <= 0 || cov->ownkappanames[i-1] != NULL) ERR("too many free parameters"); cov->ownkappanames[i] = (char*) MALLOC(sizeof(char) * (1 + strlen(param_name))); strcpy(cov->ownkappanames[i], param_name); } } } else { //print("nothing\n"); i = NOMATCHING; } // printf("%s %s i=%d %d %d \n", name, param_name, i, isVectorList(p), isVectorList(p) && isString(VECTOR_ELT(p, 0))); if (i<0 // so, no parameter name recognised && isVectorList(p) && isString(VECTOR_ELT(p, 0))) { // submodels if (strcmp(param_name, "") != 0) { // named submodel if ((i = Match(param_name, C->subnames, C->maxsub)) < 0) { i = Match(param_name, STANDARDSUB, MAXSUB); } if (i < 0) { if (PL >= PL_IMPORTANT) { int s; PRINTF("allowed submodel names are: "); if (C->maxsub == 0) PRINTF("(none)"); else for (s=0; smaxsub; s++) { if (s>0) PRINTF(", "); PRINTF("%s", STANDARDSUB[s]); if (strcmp(STANDARDSUB[s], C->subnames[s]) != 0) { PRINTF("%s", C->subnames[s]); } } PRINTF("\n"); } if (i == MULTIPLEMATCHING) { #define MMERR(X) {sprintf(MSG,"%s\n%s: %s",ERROR_LOC, param_name, X); \ error(MSG);} MMERR("multiple matching of submodel names") } else { MMERR("unmatched covariance name for submodel") } } } else { for (j=0; j < C->maxsub; j++) { if (subleft[j]) { i = j; break; } } if (j == C->maxsub) { // PRINTF("%d %d\n", j, C->maxsub); ERR("too many submodels"); } // internal if (C->subintern[i]) { char msg[200]; sprintf(msg, "submodel could not be identified. Please give the names of the parameters and the submodels explicitely. Did you mean '%s' ?", C->subnames[i]); MMERR(msg); } } if (!subleft[i]) MMERR("submodel given twice"); subleft[i] = false; CMbuild(p, level + 1, cov->sub + i); strcpy(ERROR_LOC, ERR_LOC); cov->sub[i]->calling = cov; (cov->nsub)++; } else { // parameter (not list) // parameter identification int l = length(p); // if (param_name[0]==ONEARGUMENT_NAME && strlen(param_name) == 1) { // if (strcmp(param_name, "k") == 0) { if (param_name[0] == ONEARGUMENT_NAME && param_name[1] == '\0') { if (TYPEOF(p) != REALSXP && TYPEOF(p) != INTSXP && TYPEOF(p) != LGLSXP) PERR1("if '%c' is used as parameter name then only a numerical vector is allowed as value", ONEARGUMENT_NAME); if (l != C->kappas) PERR1("length of vector does not match number of parameters. Do not use short name '%c' in complex situtations either.", ONEARGUMENT_NAME); // if (C->maxsub!=0) // ERR("short form k of parameter name not allowed for sophistacted models"); for (j=0; jkappatype[j] != INTSXP || Integer(p, param_name, j) != NA_INTEGER) { cov->ncol[j] = cov->nrow[j] = 1; if ( C->kappatype[j] != INTSXP && C->kappatype[j] != REALSXP) PERR("model has too complicated arguments to allow abbreviations"); // printf("include %s %d %s\n", Nick(cov), j, KNAME(j)); includeparam((void**) (cov->px + j), C->kappatype[j], 1, p, j, param_name); } } continue; } if (strcmp(param_name, "") == 0) { //printf("XX name %s\n", NICK(cov)); if (nkappas == 1) i = 0; else ERR("parameters must be named"); } else { // i set before the submodels if (i < 0) { if (PL >= PL_IMPORTANT) { int s; PRINTF("allowed parameter names are: "); if (C->kappas == 0) PRINTF(""); else for (s=0; skappas; s++) { if (strcmp("", C->kappanames[s]) != 0) PRINTF("'%s', ", C->kappanames[s]); PRINTF("'%s', ", STANDARDPARAM[s]); } PRINTF("allowed sub names are: "); if (C->maxsub == 0) PRINTF(""); else for (s=0; smaxsub; s++) { PRINTF("%s, ", C->subnames[s]); } PRINTF("\n"); } if (i == MULTIPLEMATCHING) PERR("multiple matching of parameter"); if (i == NOMATCHING){ PERR("recognized as parameter, but unknown"); } else { BUG; } } } // printf("model %d %s %d %s %d %d = %f\n", elt, C->nick, i, C->kappanames[i], cov->p[i] != NULL, cov->kappasub[i] != NULL, Real(p, C->kappanames[i], 0)); if (isVectorList(p) && isString(VECTOR_ELT(p, 0))) { PFREE(i); CMbuild(p, level + 1, cov->kappasub + i); strcpy(ERROR_LOC, ERR_LOC); cov->kappasub[i]->calling = cov; } else { // first the fixed one for the dimensions !! if (!PisNULL(i) || cov->kappasub[i] != NULL) ERR("parameter given twice"); //printf("Include %s %d %s\n", Nick(cov), i, KNAME(i)); includeparam((void**) (cov->px + i), C->kappatype[i], l, p, 0, param_name); // print("danach %d %d %s %ld %ld\n", i, C->kappatype[i], param_name, cov->p[i], cov->p[i+1]); // print(">>>>> %s %d\n", param_name, isEnvironment(p)); if (C->kappatype[i] > LISTOF && TYPEOF(p) != VECSXP) { if (isMatrix(p) || isVector(p)) { cov->ncol[i] = cov->nrow[i] = 1; } else { PERR("not a list of vectors or matrices"); } } else { if (isMatrix(p)) { // Achtung isVector ist true falls isMatrix true cov->ncol[i] = ncols(p); cov->nrow[i] = nrows(p); } else if (isVector(p)) { cov->ncol[i] = 1; cov->nrow[i] = length(p); } else if (isFunction(p) || isLanguage(p) || isEnvironment(p)) { cov->ncol[i] = 1; cov->nrow[i] = 1; } else { //print("type=%d\n", TYP PERR("neither vector nor matrix"); } } } } } for (j=0; j < C->maxsub; j++) if (subleft[j]) break; if (j < C->maxsub) { bool shape_process = isMaxStable(cov) || covnr == RANDOMCOIN_USER || cov->nr == AVERAGE_USER; if (j < C->minsub) { if (!shape_process || subleft[C->maxsub - 1]) { //APMI(cov); cov_model *prev = cov->calling; while (prev != NULL && prev->nr != RFGET) prev = prev->calling; if (prev == NULL) ERR("not enough submodels"); } if (PL >= PL_SUBIMPORTANT && !shape_process) { // da darf von 2 untermodellen nur 1 angegeben werden warning("not all submodels are given"); } } } // print("ns=%d %d %d %s\n", NS, NATSCALE_MLE, C->inverse != NULL, C->name); cov_model *next = cov->sub[0]; if (next != NULL) { cov_fct *N = CovList + next->nr; if (NS > 0 && N->maxsub == 0 && N->inverse != ErrInverse && N->cov != nugget && N->cov != constant) { // printf("here\n"); if (NS == NATSCALE_MLE && isDollar(cov)) { // natsc wird nur dann eingeschoben, wenn davor scale=NA war bool natsc= !PisNULL(DSCALE) && ISNAN(P0(DSCALE)); int idx = DANISO; while (!natsc) { int ii, total = cov->ncol[idx] * cov->nrow[idx]; double *pp = P(idx); for (ii=0; iicalling == NULL ? "none" : NICK(cov->calling)); addModel(Cov, NATSC_USER); } } } UNPROTECT(1); } /* void CheckModelInternal(SEXP model, SEXP x, SEXP y, SEXP T, int spatialdim, // spatial dim only ! int xdimOZ, int *lx, // int domprev, bool grid, bool distances, bool Time, cov_model **Cov) { // int err = NOERROR, // // len = length(x), //tsdim = spatialdim + (int) Time; error("currently 'x' may not be a list"); } */ bool CallingSet(cov_model *cov) { int i; for (i=0; insub; i++) { cov_model *sub = cov->sub[i]; if (sub == NULL) { if (CovList[cov->nr].range != range_randomcoin) { PMI(cov, "Calling point A error"); // return false; } } else { if (sub->calling != cov) { PMI(cov, "Calling point B error"); // return false; } if (!CallingSet(sub)) { return false; } } } if (cov->key != NULL && !CallingSet(cov->key)) return false; if (cov->Splus != NULL) { for (i=0; insub; i++) { cov_model *sub = cov->Splus->keys[i]; if (sub == NULL) { PMI(cov, "plus A error");// return false; } else { if (sub->calling != cov) { PMI(cov, "plus B error"); // return false; } if (!CallingSet(sub)) return false; } } } return true; } void CheckModelInternal(SEXP model, double *x, double *Y, double *T, int spatialdim, /* spatial dim only ! */ int xdimOZ, int Lx, int Ly, bool grid, bool Distances, bool Time, cov_model **Cov) { int err, zaehler = 0, tsdim = spatialdim + (int) Time, ly = Ly; double *y = Y; cov_model *cov; char EM2[500 + 100 * Nothing] = ""; GetRNGstate(); // some parts use monte carlo to determine internal values if (currentNrCov==-1) InitModelList(); // printf("start checkmodelinternal\n"); while (true) { strcpy(ERROR_LOC, "Building the model:"); cov = NULL; if (*Cov != NULL) COV_DELETE(Cov); assert(*Cov == NULL); CMbuild(model, 0, Cov); strcpy(ERROR_LOC, "Having built the model:"); cov = *Cov; if (cov == NULL) ERR("no model is given"); assert(cov->calling == NULL); int lx = Lx; bool distances = Distances; if (distances) { if (cov->nr == COVMATRIX || CovList[cov->nr].check == check_simulate) { lx = (int) (1e-9 + 0.5 * (1 + sqrt(1. + 8 * lx))); if (Lx != lx * (lx - 1) / 2) ERR("distance length not of form 'n * (n - 1) / 2'"); } else { distances = false; } } else if (xdimOZ < spatialdim) { PRINTF("xdimOZ=%d, spatialdim=%d Time=%d\n", xdimOZ, spatialdim, Time); GERR("dimension of 'x' does not fit the space-time dimension"); } cov->tsdim = spatialdim + (int) Time; cov->xdimprev = xdimOZ; // cov->domprev = ly == 0 ? XONLY : KERNEL; cov->domprev = XONLY; // formal sind alle Interface Modelle nur von // einer (dummy) Variablen abhaengig switch (GLOBAL.coords.coord_system) { case coord_auto: case cartesian: cov->isoprev = CARTESIAN_COORD; break; case earth: if (spatialdim != 2) GERR1("an earth coordinate consists of two angles. Got %d components.", spatialdim); cov->isoprev = EARTH_COORD; break; default: GERR("unknwon coordinate system"); } if (xdimOZ < spatialdim) { if (xdimOZ != 1) GERR("reduced dimension is not one"); //if (isCov(cov)) cov->isoprev = ISOTROPIC; //assert(false); } else if (xdimOZ > spatialdim) { PRINTF("xdimOZ=%d, spatialdim=%d Time=%d\n", xdimOZ, spatialdim, Time); GERR("mismatch of dimensions"); } cov->calling=NULL; cov->prevloc = NULL; if ((err = loc_set(x, y, T, spatialdim, xdimOZ, lx, ly, Time, grid, distances, &(cov->prevloc))) != NOERROR) goto ErrorHandling; strcpy(ERROR_LOC, "Checking the model:"); if (PL >= PL_DETAILS) { // assert(cov->isoprev != 6); PMI(cov, "\nCheckModelInternal, before checking:");//OK } if ((err = CHECK(cov, tsdim, xdimOZ + Time, InterfaceType, cov->domprev, cov->isoprev, SUBMODEL_DEP, ROLE_BASE)) != NOERROR) { //// if (PL >= PL_ERRORS) { PMI(cov, "CheckModelInternal has failed:"); // PRINTF("err =%d\n", err); } goto ErrorHandling; } if (PL >= PL_DETAILS) { PMI(cov, "CheckModelInternal, after checking:"); // OK } sprintf(ERROR_LOC, "%s process: ", ROLENAMES[cov->role]); strcpy(PREF_FAILURE, ""); PrInL=-1; if (PL >= PL_DETAILS) PRINTF("CheckModelInternal A\n"); // APMI(cov); assert(CallingSet(cov)); err = STRUCT(cov, NULL); // APMI(cov); ErrorHandling: // printf("\n>> %d ly=%d zaehler=%d lx=%d\n\n", err, ly, zaehler, lx); if (err == NOERROR || zaehler>=1) { break; } // printf("err=%dn",err); // APMI(cov); char EM[500]; errorMSG(err, EM); sprintf(EM2, "%s%s", PREF_FAILURE, EM); if (lx == 0 || distances) break; // printf(">> %d '%s'\n", err, EM2); y = x; ly = lx; zaehler++; } //printf("end checkmodelinternal\n"); PutRNGstate(); // AERR(err); //PMI(cov); // Fehlermeldung vom ersten Durchgang wird angezeigt. if (err != NOERROR) { // printf("%d '%s'\n", err, EM2); // APMI(cov); error(EM2); } // muss ganz zum Schluss stehen, da Fehler zu einer unvollstaendigen // Struktur fuehren koennen assert(CallingSet(cov)); //APMI(cov); } SEXP Init(SEXP model_reg, SEXP model, SEXP x, SEXP y, SEXP T, SEXP spatialdim, SEXP Grid, SEXP Distances, SEXP Time, SEXP NA_OK) { // MAXSIMUDIM bool naok = (bool) LOGICAL(NA_OK)[0], grid = LOGICAL(Grid)[0], distances = LOGICAL(Distances)[0], time = LOGICAL(Time)[0]; int xdimOZ = grid ? ncols(x) : nrows(x), lx = grid ? 3 : ncols(x), ly = length(y) == 0 ? 0 : grid ? 3 : ncols(y); SEXP ans; currentRegister = INTEGER(model_reg)[0]; NAOK_RANGE = naok; PROTECT (ans = allocVector(INTSXP, 2)); // print("real x %d grid=%d %d time=%d lx=%d %d ncols nc=%d nr=%d xdimOZ%d\n", isReal(x), grid, distances, time, lx, ly, ncols(x), nrows(x), xdimOZ); // printf("key = %d\n", currentRegister); if (isReal(x)) CheckModelInternal(model, REAL(x), REAL(y), REAL(T), INTEGER(spatialdim)[0], xdimOZ, lx, ly, grid, distances, time, KEY + currentRegister ); else { BUG; // todo not programmed yet /* CheckModelInternal(model, x, y, T, INTEGER(spatialdim)[0], xdimOZ, &lx, grid, distances, time, KEY + INTEGER(model_reg)[0] ); */ } cov_model *cov = KEY[currentRegister]; NAOK_RANGE = false; if (PL >= PL_COV_STRUCTURE) { PMI(cov);// OK } INTEGER(ans)[0] = (cov)->vdim2[0]; INTEGER(ans)[1] = (cov)->vdim2[1]; UNPROTECT(1); // APMI(KEY[INTEGER(model_reg)[0]]); return ans; } SEXP EvaluateModel(SEXP X, SEXP Covnr){ if (currentNrCov==-1) InitModelList(); int d, mem, len, err = NOERROR; cov_model *cov = KEY[INTEGER(Covnr)[0]]; SEXP result=NULL, dummy=NULL; // {double x[5]={1,2,3,6,5}; // return evaluate(x, 5); // } strcpy(ERROR_LOC, ""); if (cov == NULL) GERR("register not initialised"); if ( (len = cov->qlen) == 0) { BUG; if (cov->fieldreturn) GERR("model cannot be evaluated"); mem = cov->vdim2[0] * cov->vdim2[1]; } else { // // printf("ende %f\n", REAL(X)[0]); //PMI(cov); FCTN(REAL(X), cov, NULL); if (len > 1 && cov->q[len-1] == 1) len--; // last is for n=#{simulations} for (mem=1, d=0; dq[d]; } // printf("len =%d mem=%d %f %f %f=%f\n", len, mem, cov->q[0], cov->q[1], cov->q[2], *REAL(X));//assert(false); if (len == 1) PROTECT(result = allocVector(REALSXP, mem)); else if (len == 2) PROTECT(result = allocMatrix(REALSXP, cov->q[0], cov->q[1])); else { PROTECT(dummy=allocVector(INTSXP, len)); for (d=0; dq[d]; // printf("q[%d]=%d %d\n", d, (int) cov->q[d], (int) cov->q[0] * (int) cov->q[1] * (int) cov->q[2]); } PROTECT(result=allocArray(REALSXP, dummy)); } // printf(">> %d %ld %d\n", len, REAL(result), length(result)); // printf("len =%d %f %f %f=%f\n", len, cov->q[0], cov->q[1], cov->q[2], *REAL(X)); //APMI(cov); //PMI(cov, "last"); GetRNGstate(); FCTN(REAL(X), cov, REAL(result)); PutRNGstate(); //printf("done\n"); // APMI(cov); ErrorHandling: if (result != NULL) UNPROTECT(1 + (int) (len > 2)); if (err != NOERROR) XERR(err); return result; } #define SIMU_CHECKONLY 0 #define SIMU_SEED 1 #define SIMU_ENV 2 void simulate(double *N, cov_model *cov, double *v){ assert(!P0INT(SIMU_CHECKONLY)); cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; char errorloc_save[nErrorLoc], format[20], back[]="\b\b\b\b\b\b\b\b\b\b\b", prozent[]="%", pch = GLOBAL.general.pch; int ni, digits, //n, nn, err = NOERROR, each = 0; double *res, realeach=0.0; simu_type *simu = NULL; location_type *loc = cov->prevloc; long vdimtot; vdimtot = loc->totalpoints * cov->vdim2[0]; assert(cov->vdim2[0] == cov->vdim2[1]); cov->q[cov->qlen - 1] = nn = (int) *N; if (v==NULL) return; // EvaluateModel needs information about size // of result array strcpy(errorloc_save, ERROR_LOC); simu = &(cov->simu); if (!simu->active) { err=ERRORNOTINITIALIZED; goto ErrorHandling; } if (nn>1 && pch != '\0') { if (pch == '!') { digits = (nn<900000000) ? 1 + (int) trunc(log((double) nn) / log(10.0)) : 9; back[digits] = '\0'; each = (nn < 100) ? 1 : nn / 100; sprintf(format, "%ss%s%dd", prozent, prozent, digits); } else if (pch == '%') { back[4] = '\0'; realeach = (double) nn / 100.0; each = (nn < 100) ? 1 : (int) realeach; sprintf(format, "%ss%s%dd%ss", prozent, prozent, 3, prozent); } else each = 1; } else each = nn + 1; // size = cov->vdim * nn * loc->totalpoints; res = v; sub->simu.pair = false; for (ni=1; ni<=nn; ni++, res += vdimtot) { if (GLOBAL.general.seed != NA_INTEGER && nn > 1) { if (PisNULL(SIMU_SEED) || PisNULL(SIMU_ENV)) { BUG; } else { PutRNGstate(); double simu_seed = GLOBAL.general.seed + (ni - 1); addVariable((char*) "seed", &simu_seed, 1, 1, PENV(SIMU_ENV)->sexp); eval(PSEXP(SIMU_SEED)->sexp, PENV(SIMU_ENV)->sexp); GetRNGstate(); } } sprintf(ERROR_LOC, "%s %d: ", errorloc_save, ni); R_CheckUserInterrupt(); if (PL > 0) { if (ni % each == 0) { if (pch == '!') PRINTF(format, back, ni / each); else if (pch == '%') PRINTF(format, back, (int) (ni / realeach), prozent); else PRINTF("%c", pch); } } // //printf("here %d %s %d\n", ni, NICK(cov), sub->stor != NULL); // A PMI(cov); // PSTOR(cov, cov->stor); // assert(false); // crash(cov); assert(cov->stor != NULL); DO(sub, cov->stor); if (sizeof(double) == sizeof(res_type) && false) { // printf("\n\n\n\n\n ********** %ld %ld !!\n", vdimtot, res); // APMI(cov); MEMCOPY(res, cov->rf, sizeof(res_type) * vdimtot); //printf("!!! ********** !!\n"); } else { // printf("heredd \n"); // printf("++ %d %ld %ld\n", vdimtot, res, cov->rf); int i; for (i=0; irf[i]); res[i] = cov->rf[i]; } // assert(false); // APMI(cov); } if (!sub->simu.active) GERR1("could not perform multiple simulations. Is '%s == FALSE'?", general[GENERAL_STORING]); } if (nn>1 && pch != '\0') { if (pch == '!' || pch == '%') PRINTF("%s", back); else PRINTF("\n"); } assert(simu != NULL); sub->simu.active = simu->active = sub->simu.active && GLOBAL.general.storing; ErrorHandling: PutRNGstate(); if (err > NOERROR) { if (simu != NULL) sub->simu.active = simu->active = false; XERR(err); } } int check_simulate(cov_model *cov) { cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; location_type *loc = cov->prevloc; int j, d, err, role, iso; Types type; bool vdim_close_together = GLOBAL.general.vdim_close_together; if (loc == NULL) SERR("locations not initialised."); kdefault(cov, SIMU_CHECKONLY, false); cov->simu.expected_number_simu = GLOBAL.general.expected_number_simu; if (cov->simu.expected_number_simu > 1 && GLOBAL.general.expected_number_simu <= 1) SERR("expected number of simulations inconsistent"); GLOBAL.internal.stored_init = GLOBAL.general.storing || GLOBAL.general.expected_number_simu > 1; if (cov->key == NULL) { domain_type dom = KERNEL; //char msg[200]; if (isProcess(sub)) { role = ROLE_GAUSS; type = ProcessType; iso = UNREDUCED; } else { role = ROLE_COV; type = PosDefType; iso = SYMMETRIC; } if (cov->role == ROLE_BASE) role = ROLE_BASE; err = ERRORTYPECONSISTENCY; //printf("\n\nrole= %s\n", ROLENAMES[role]); for (j=0; j<=2; j++) { if ((TypeConsistency(type, sub) && (err = CHECK(sub, loc->timespacedim, cov->xdimown, type, dom, iso, cov->vdim2, role)) == NOERROR) || isProcess(sub)) break; //printf("inconsistent '%s' %s '%s'\n", TYPENAMES[type], NICK(sub), // TYPENAMES[CovList[sub->nr].Type]); if (j==0) type = NegDefType; else { type = TrendType; dom = XONLY; iso = CARTESIAN_COORD; } } if (err != NOERROR) return err; } else { BUG; role = role_of_process(sub->nr); if (role == ROLE_FAILED) BUG; if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, ProcessType, XONLY, isCartesian(cov->isoprev) ? CARTESIAN_COORD : cov->isoprev, cov->vdim2, role)) != NOERROR) { return err; } } setbackward(cov, sub); int subvdim = sub->vdim2[0]; cov->vdim2[0]=subvdim; cov->vdim2[1]=sub->vdim2[1]; if (cov->q == NULL) { int len=1; if (loc->grid) len += loc->timespacedim; else len++; if (subvdim > 1) len++; cov->qlen = len; cov->q = (double *) MALLOC(sizeof(double) * len); cov->q[--len] = 1.0; // number of simulations if (subvdim > 1 && !vdim_close_together) cov->q[--len]=(double) subvdim; if (loc->grid) { for (d=loc->timespacedim-1; d>=0; d--) cov->q[--len] = loc->xgr[d][XLENGTH]; } else { cov->q[--len] = loc->totalpoints; } if (subvdim > 1 && vdim_close_together) { assert(len == 1); cov->q[--len]=(double) subvdim; } assert(len==0); } // APMI(cov); return NOERROR; } int struct_simulate(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ cov_model *next = cov->sub[0], *sub = next; location_type *loc = cov->prevloc; int err, subrole = ROLE_FAILED, nr = next->nr; //APMI(next); if (isNegDef(next) || isTrend(next)) { if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; addModel(&(cov->key), GAUSSPROC); sub = cov->key; if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, ProcessType, XONLY, isCartesian(cov->isoprev) ? CARTESIAN_COORD : cov->isoprev, cov->vdim2, ROLE_GAUSS)) != NOERROR) { return err; } subrole = ROLE_GAUSS; } else if (isBernoulliProcess(next)) subrole = ROLE_BERNOULLI; else if (isGaussBasedProcess(next)) subrole = ROLE_GAUSS; else if (isBrownResnickProcess(next)) subrole = ROLE_BROWNRESNICK; else if (nr == POISSONPROC) subrole = ROLE_POISSON; else if (nr == SCHLATHERPROC) subrole = ROLE_SCHLATHER; else if (nr == EXTREMALTPROC) subrole = ROLE_SCHLATHER; else if (nr == SMITHPROC) subrole = ROLE_SMITH; else { //PMI(cov, -1); // PMI(sub, -1); // printf("next %d %s %d %d %d\n", nr, NICK(next), isNegDef(next), isPosDef(next), CovList[nr].Type); ILLEGAL_ROLE; } sub->role = subrole; // ansonsten muesste hier C-HECK aufgerufen werden // hoffentlich gut gehende Abkuerzung, dass S-TRUCT aufgerufen wird, // und danach C-HECK (was auf jeden Fall gemacht werden muss) cov->simu.active = next->simu.active = false; sub->simu.expected_number_simu = cov->simu.expected_number_simu; if (P0INT(SIMU_CHECKONLY)) return NOERROR; if (PL >= PL_DETAILS) PRINTF("Struct Simulate\n"); // print("%s %ld %ld %ld\n", NICK(sub), (long int) CovList[sub->nr].Struct, (long int)struct_gaussprocess, (long int)struct_spectral); // A // PMI(sub, "Internal"); assert(false); if ((err = STRUCT(sub, NULL)) != NOERROR) { return err; } if (PL >= PL_DETAILS) PRINTF("Checking Simulate\n"); // APMI(sub); assert(cov->stor == NULL); NEW_STORAGE(stor, STORAGE, gen_storage); if (!sub->initialised) { if (PL >= PL_DETAILS) PRINTF("Struct Simulate C\n"); // APMI(cov); //, "struct simu"); print("key=%ld\n", cov->key); if (//cov->key != NULL && // bei sub==next waere der falsche role gesetzt // irgenwie komisch, cov->key abzufragen und check(sub aufzurufen // aufgrund von Beispiel in RTpoisson geloescht (err = CHECK(sub, loc->timespacedim, cov->xdimown, ProcessType, cov->domprev, cov->isoprev, cov->vdim2, subrole)) != NOERROR) { // // XERR(err); // APMI(sub); // assert(false); return err; } if (PL >= PL_DETAILS) { PRINTF("\n\nStruct Simulate (%s, #=%d), after 2nd check:", NICK(sub), sub->gatternr); // OK PMI(sub); // OK } if ((err = INIT(sub, 0, cov->stor)) != NOERROR) { //APMI(cov); // !!! ?? hier weitermachen return err; } } cov->initialised = true; cov->fieldreturn = true; cov->origrf = false; cov->rf = sub->rf; cov->simu.active = sub->simu.active = true; return NOERROR; } void range_simulate(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[SIMU_CHECKONLY] = RF_NEGINF; range->max[SIMU_CHECKONLY] = RF_INF; range->pmin[SIMU_CHECKONLY] = -1e8; range->pmax[SIMU_CHECKONLY] = 1e8; range->openmin[SIMU_CHECKONLY] = true; range->openmax[SIMU_CHECKONLY] = true; } //void do_simulate(cov_model *cov, gen_storage *s){ // assert(false); //} ///////////////////////////////////////// #define LIKELIHOOD_DATA 0 #define LIKELIHOOD_LEN 1 void likelihood(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *v){ cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; int j; double value, *data = P(LIKELIHOOD_DATA); location_type *loc = cov->prevloc; long vdimtot = loc->totalpoints * cov->vdim2[0], len = P0INT(LIKELIHOOD_LEN), repet = len / vdimtot; if (repet * vdimtot != len || repet == 0) ERR("data and coordinates do not match"); if (v==NULL) return; // EvaluateModel needs information about size // of result array for (*v=0.0, j = 0; j < repet; j++, data += vdimtot) { VTLG_DLOG(data, sub, &value); *v += value; } } int check_likelihood(cov_model *cov) { cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; location_type *loc = cov->prevloc; int j, err, role, iso; Types type; if (loc == NULL) SERR("locations not initialised."); domain_type dom = KERNEL; //char msg[200]; if (isProcess(sub)) { role = ROLE_GAUSS; type = ProcessType; iso = UNREDUCED; } else { role = ROLE_COV; type = PosDefType; iso = SYMMETRIC; } if (cov->role == ROLE_BASE) role = ROLE_BASE; err = ERRORTYPECONSISTENCY; for (j=0; j<=2; j++) { if ((TypeConsistency(type, sub) && (err = CHECK(sub, loc->timespacedim, cov->xdimown, type, dom, iso, cov->vdim2, role)) == NOERROR) || isProcess(sub)) break; //printf("inconsistent '%s' %s '%s'\n", TYPENAMES[type], NICK(sub), // TYPENAMES[CovList[sub->nr].Type]); if (j==0) type = NegDefType; } if (err != NOERROR) return err; setbackward(cov, sub); cov->vdim2[0]=sub->vdim2[0]; cov->vdim2[1]=sub->vdim2[1]; if (cov->q == NULL) { cov->qlen = 1; cov->q = (double *) MALLOC(sizeof(double)); cov->q[0] = 1; } return NOERROR; } int struct_likelihood(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ cov_model *next = cov->sub[0], *sub = next; location_type *loc = cov->prevloc; int err, subrole = ROLE_FAILED, nr = next->nr; //APMI(next); //printf("PL %d \n", PL); //ssert(PL == 20); if (isNegDef(next)) { if ((err = covcpy(&(cov->key), next)) != NOERROR) return err; addModel(&(cov->key), GAUSSPROC); sub = cov->key; if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, ProcessType, XONLY, isCartesian(cov->isoprev) ? CARTESIAN_COORD :cov->isoprev, cov->vdim2, ROLE_GAUSS)) != NOERROR) { return err; } subrole = ROLE_GAUSS; } else if (isBernoulliProcess(next)) subrole = ROLE_BERNOULLI; else if (isGaussBasedProcess(next)) subrole = ROLE_GAUSS; else if (isBrownResnickProcess(next)) subrole = ROLE_BROWNRESNICK; else if (nr == POISSONPROC) subrole = ROLE_POISSON; else if (nr == SCHLATHERPROC) subrole = ROLE_SCHLATHER; else if (nr == SMITHPROC) subrole = ROLE_SMITH; else { //PMI(cov, -1); // PMI(sub, -1); // printf("next %d %s %d %d %d\n", nr, NICK(next), isNegDef(next), isPosDef(next), CovList[nr].Type); ILLEGAL_ROLE; } if (CovList[sub->nr].logD == ErrCov) SERR1("log likelihood undefined for '%s'", NICK(sub)); sub->role = subrole; // ansonsten muesste hier C-HECK aufgerufen werden // hoffentlich gut gehende Abkuerzung, dass S-TRUCT aufgerufen wird, // und danach C HECK (was auf jeden Fall gemacht werden muss) return NOERROR; } void range_likelihood(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[LIKELIHOOD_DATA] = RF_NEGINF; range->max[LIKELIHOOD_DATA] = RF_INF; range->pmin[LIKELIHOOD_DATA] = -1e8; range->pmax[LIKELIHOOD_DATA] = 1e8; range->openmin[LIKELIHOOD_DATA] = true; range->openmax[LIKELIHOOD_DATA] = true; range->min[LIKELIHOOD_LEN] = 1; range->max[LIKELIHOOD_LEN] = INFDIM; range->pmin[LIKELIHOOD_LEN] = 1; range->pmax[LIKELIHOOD_LEN] = INFDIM; range->openmin[LIKELIHOOD_LEN] = false; range->openmax[LIKELIHOOD_LEN] = false; } #define EVALDISTR_X 0 // d #define EVALDISTR_Q 1 // p #define EVALDISTR_P 2 // q #define EVALDISTR_N 3 // r #define EVALDISTR_DIM 4 // r void kappa_EvalDistr(int i, cov_model VARIABLE_IS_NOT_USED *cov, int *nr, int *nc){ *nc = *nr = i <= EVALDISTR_N ? 0 : i == EVALDISTR_DIM ? 1 : -1; } void EvalDistr(double VARIABLE_IS_NOT_USED *N, cov_model *cov, double *v){ char errorloc_save[nErrorLoc]; cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; double *xqp; int i, j, dim = cov->tsdim, n = (int) (cov->q[cov->qlen - 1]); if (v==NULL) return; // EvaluateModel needs information about size strcpy(errorloc_save, ERROR_LOC); if (!PisNULL(EVALDISTR_X)) { // d xqp = P(EVALDISTR_X); for (j=i=0; inr; cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; // location_type *loc = cov->prevloc; int size_idx, err, //type, nr = sub->nr, *nrow = cov->nrow, *ncol = cov->ncol, dim = cov->tsdim, zaehler=0; ROLE_ASSERT(ROLE_DISTR); if (cov->q == NULL) { cov->qlen = 1; // !! 1 obwohl 2 reserviert werden !! Wg EvaluateModel if (dim > 1 && ((!PisNULL(EVALDISTR_N) && P0(EVALDISTR_N) > 1) || (!PisNULL(EVALDISTR_Q) && P0(EVALDISTR_Q) > 1))) cov->qlen++; cov->q = (double *) MALLOC(sizeof(double) * (cov->qlen + 1)); cov->q[0] = dim; // is overwritten if not a matrix is returned size_idx = cov->qlen - 1; if (PisNULL(EVALDISTR_N)) { if (!PisNULL(EVALDISTR_X)) { // d if (dim > 1 && nrow[EVALDISTR_X] != dim) SERR2("dimenson of '%s' does not match '%s' ", C->kappanames[EVALDISTR_X], C->kappanames[EVALDISTR_DIM]); cov->q[size_idx] = nrow[EVALDISTR_X] * ncol[EVALDISTR_X] / dim; zaehler++; } if (!PisNULL(EVALDISTR_Q)) { // p if (dim > 1 && nrow[EVALDISTR_Q] != dim) SERR2("dimension of '%s' does not match '%s' ", C->kappanames[EVALDISTR_Q], C->kappanames[EVALDISTR_DIM]); cov->q[size_idx] = nrow[EVALDISTR_Q] * ncol[EVALDISTR_Q] / dim; zaehler++; } if (!PisNULL(EVALDISTR_P)) { // q if (ncol[EVALDISTR_P] != 1) SERR1("'%s' must be a vector", C->kappanames[EVALDISTR_P]); cov->q[size_idx] = nrow[EVALDISTR_P]; zaehler++; } }// kein else wegen zaehler !! if (!PisNULL(EVALDISTR_N)) { // r cov->q[size_idx] = P0(EVALDISTR_N); zaehler++; } if (zaehler != 1) SERR("exactly one of the parameters must be given"); //printf("+ %d, %d -> %s\n", (int) cov->q[EVALDISTR_Q_TYPE], sub->nr, // NICK(sub)); // printf("= %d, %d -> %s\n", (int) cov->q[EVALDISTR_Q_TYPE], sub->nr, // NICK(sub)); } if (!isRandom(sub)) { SERR1("'%s' is not a distribution", NICK(sub)); } // PMI(sub); if ((err = CHECK_R(sub, dim)) != NOERROR) return err; setbackward(cov, sub); return NOERROR; } // S TRUCT(!isCovariance(cov) ? NULL : &(cov->key)); void range_EvalDistr(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[EVALDISTR_X] = RF_NEGINF; range->max[EVALDISTR_X] = RF_INF; range->pmin[EVALDISTR_X] = -1e8; range->pmax[EVALDISTR_X] = 1e8; range->openmin[EVALDISTR_X] = true; range->openmax[EVALDISTR_X] = true; range->min[EVALDISTR_Q] = RF_NEGINF; range->max[EVALDISTR_Q] = RF_INF; range->pmin[EVALDISTR_Q] = -1e8; range->pmax[EVALDISTR_Q] = 1e8; range->openmin[EVALDISTR_Q] = true; range->openmax[EVALDISTR_Q] = true; range->min[EVALDISTR_P] = 0; range->max[EVALDISTR_P] = 1; range->pmin[EVALDISTR_P] = 0; range->pmax[EVALDISTR_P] = 1; range->openmin[EVALDISTR_P] = false; range->openmax[EVALDISTR_P] = false; range->min[EVALDISTR_N] = 1; range->max[EVALDISTR_N] = RF_INF; range->pmin[EVALDISTR_N] = 1; range->pmax[EVALDISTR_N] = 1e8; range->openmin[EVALDISTR_N] = false; range->openmax[EVALDISTR_N] = false; range->min[EVALDISTR_DIM] = 1; range->max[EVALDISTR_DIM] = RF_INF; range->pmin[EVALDISTR_DIM] = 1; range->pmax[EVALDISTR_DIM] = 10; range->openmin[EVALDISTR_DIM] = false; range->openmax[EVALDISTR_DIM] = true; } int struct_EvalDistr(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ cov_model *next = cov->sub[0], *sub = next; // location_type *loc = cov->prevloc; int err, dim = cov->tsdim; cov->simu.active = next->simu.active = false; if (PL >= PL_DETAILS) PRINTF("Struct EvalDistr\n"); if ((err = STRUCT(sub, NULL)) != NOERROR) { return err; } if (PL >= PL_DETAILS) PRINTF("Checking EvalDistr\n"); if ((err = CHECK_R(sub, dim)) != NOERROR) return err; if (PL >= PL_DETAILS) { PRINTF("\n\nStruct EvalDistr (%s, #=%d), after 2nd check:", NICK(sub), sub->gatternr); // OK } assert(cov->stor == NULL); NEW_STORAGE(stor, STORAGE, gen_storage); if ((err = INIT(sub, 0, cov->stor)) != NOERROR) { //APMI(cov); // !!! ?? hier weitermachen return err; } // assert(false); // APMI(cov); if (cov->rf == NULL) { int size = cov->q[0]; if (cov->qlen > 1) size *= cov->q[1]; if ((cov->rf = (res_type*) MALLOC(sizeof(res_type) * size)) == NULL) return ERRORMEMORYALLOCATION; cov->fieldreturn = cov->origrf = true; } cov->simu.active = sub->simu.active = true; return NOERROR; } //void do_EvalDistr(cov_model *cov, gen_storage *s){ // assert(false); //} void Dummy(double VARIABLE_IS_NOT_USED *x, cov_model VARIABLE_IS_NOT_USED *cov, double VARIABLE_IS_NOT_USED *value) { BUG; //error("unexpected call of dummy function"); } int check_dummy(cov_model *cov) { cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; location_type *loc = cov->prevloc; int i, err; if (loc == NULL) SERR("locations not initialised ."); for (i=0; i<=1; i++) { if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, NegDefType, i==0 ? XONLY : KERNEL, SYMMETRIC, SUBMODEL_DEP, ROLE_COV)) == NOERROR) break; } if (err != NOERROR) return err; setbackward(cov, sub); cov->vdim2[0] = sub->vdim2[0]; cov->vdim2[1] = sub->vdim2[1]; return NOERROR; } int struct_dummy(cov_model VARIABLE_IS_NOT_USED *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ return NOERROR; } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// cov_model *get_around_gauss(cov_model *cov) { cov_model *nxt= cov; if (nxt->nr == SCHLATHERPROC) nxt = nxt->sub[0]; // kein else if (nxt->nr == GAUSSPROC) nxt = nxt->sub[0]; if (isGaussMethod(nxt) || isBernoulliProcess(nxt)) { if (nxt->nr == AVERAGE_USER){ if (nxt->sub[0] == NULL) error("covariance cannot be calculated (yet) for arbitrary shape functions."); nxt = nxt->sub[nxt->sub[0] == NULL]; if (nxt->nr == AVERAGE_INTERN) nxt = nxt->sub[nxt->sub[0] == NULL]; } else if (nxt->nr == CE_CUTOFFPROC_USER) { nxt = nxt->sub[0]; if (nxt->nr == CE_CUTOFFPROC_INTERN) nxt = nxt->sub[0]; } else if (nxt->nr == CE_INTRINPROC_USER) { nxt = nxt->sub[0]; if (nxt->nr == CE_INTRINPROC_INTERN) nxt = nxt->sub[0]; } else if (nxt->nr == CE_INTRINPROC_USER) { nxt = nxt->sub[0]; if (nxt->nr == CE_INTRINPROC_INTERN) nxt = nxt->sub[0]; } else if (nxt->nr == HYPERPLANE_USER) { nxt = nxt->sub[0]; if (nxt->nr == HYPERPLANE_INTERN) nxt = nxt->sub[0]; } else if (nxt->nr == RANDOMCOIN_USER) { if (nxt->sub[0] == NULL) error("covariance cannot be calculated (yet) for arbitrary shape functions."); nxt = nxt->sub[nxt->sub[0] == NULL]; if (nxt->nr == AVERAGE_INTERN) nxt = nxt->sub[nxt->sub[0] == NULL]; } else { } } return nxt; } cov_model *get_around_max_stable(cov_model *cov) { cov_model *nxt = cov; if (isBrownResnickProcess(nxt)) { nxt = nxt->sub[0]; if (nxt->calling->nr == BROWNRESNICKPROC && isBRuserProcess(nxt)) { nxt = nxt->sub[0]; } } return nxt; } int alloc_pgs(cov_model *cov) { if (cov->xdimown != cov->tsdim) BUG; return alloc_pgs(cov, cov->xdimown); } int alloc_pgs(cov_model *cov, int dim) { // all what is necessary for dompp pgs_storage *pgs = NULL; assert(cov->Spgs == NULL); // NIE PGS_DELETE(&(cov->Spgs)) in Huetchen, da sonst dompp durcheinander kommt; NEW_STORAGE(Spgs, PGS, pgs_storage); pgs = cov->Spgs; // printf("here dim=%d\n", dim); //assert(dim == 2); //assert(false); if ((pgs->supportmin = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->supportmax = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->own_grid_start = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->own_grid_step = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->own_grid_length = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->supportcentre = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->gridlen = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->end = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->start = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->delta = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->nx = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->xstart = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->x = (double*) CALLOC(dim, sizeof(double))) == NULL || (pgs->inc = (double*) CALLOC(dim, sizeof(double))) == NULL) return ERRORMEMORYALLOCATION; // printf("here end\n"); return NOERROR; } int alloc_cov(cov_model *cov, int dim, int rows, int cols) { // all what is necessary for dompp int err; if (cov->Spgs != NULL) PGS_DELETE(&(cov->Spgs)); if ((err = alloc_pgs(cov, dim)) != NOERROR) return err; // erst danach!!! pgs_storage *pgs = cov->Spgs; int max, rowscols = rows * cols; max = rows; if (cols > max) max = cols; assert(pgs != NULL && pgs->x!=NULL && pgs->endy==NULL && pgs->ptrrow==NULL); if ( (pgs->endy = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->startny = (int*) CALLOC(dim, sizeof(int))) == NULL || (pgs->ptrcol = (int*) CALLOC(max, sizeof(int))) == NULL || (pgs->ptrrow = (int*) CALLOC(max, sizeof(int))) == NULL) return ERRORMEMORYALLOCATION; if ( (pgs->C0x = (double*) CALLOC(rowscols, sizeof(double))) == NULL || (pgs->C0y = (double*) CALLOC(rowscols, sizeof(double))) == NULL || (pgs->cross= (double*) CALLOC(rowscols, sizeof(double))) == NULL || (pgs->z = (double*) CALLOC(rowscols, sizeof(double))) == NULL || (pgs->Val= (double**) CALLOC(rowscols, sizeof(double*))) == NULL ) return ERRORMEMORYALLOCATION; // printf("here end\n"); return NOERROR; } void Cov(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *value){ if (value==NULL) return; // EvaluateModel needs information about size // of result array cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; CovList[sub->nr].covariance(sub, value); } int check_cov_intern(cov_model *cov, Types type, bool close) { cov_model *next = cov->sub[0], *sub = cov->key == NULL ? next : cov->key; location_type *loc = Loc(cov); if (loc == NULL) SERR("locations not initialised!"); int err, i, iso, dim = loc->timespacedim; assert(dim == cov->tsdim); bool ygiven = loc->ly > 0; if (!ygiven && isNegDef(type) && !isCartesian(cov->isoown)) { add_y_zero(loc); ygiven = true; //PMI(cov); } // PMI(cov); // printf("ygiven %d %d %d\n", !ygiven, isNegDef(type), !isCartesian(cov->isoown)); iso = type == ShapeType ? CARTESIAN_COORD : SYMMETRIC; //PMI(cov); //printf("type = %s\n", TYPENAMES[type]); for (i=0; i<=1; i++) { if ((err = CHECK(sub, dim, cov->xdimown, type, i==0 ? XONLY : KERNEL, iso, SUBMODEL_DEP, sub!=next || isNegDef(sub) ? ROLE_COV : ROLE_BASE)) == NOERROR) break; } if (err != NOERROR) return err; setbackward(cov, sub); //PMI(cov); // printf("%ld %ld\n", CovList[sub->nr].check, checkcox); //APMI(cov); if (sub->pref[Nothing] == PREF_NONE) SERR("given model cannot be evaluated") if (cov->q == NULL) { int d, len=1; // # of "simulations" if (loc->grid) len += dim; else len ++; for (i=0; i<2; i++) len += (int) (cov->vdim2[i] > 1); cov->qlen = len; cov->q = (double *) MALLOC(sizeof(double) * len); #define VDIMS for (i=0; i<2; i++) if (cov->vdim2[i] > 1) cov->q[d++] = cov->vdim2[i] #define LOCS if (loc->grid) { \ for (i=0; iq[d++] = loc->xgr[i][XLENGTH]; \ } else { \ cov->q[d++] = loc->totalpoints; \ } d = 0; if (close) { VDIMS; LOCS; } else { LOCS; VDIMS; } cov->q[d] = 1; assert(d == len-1); } if ((err = alloc_cov(cov, dim, cov->vdim2[0], cov->vdim2[1])) != NOERROR) return err; return NOERROR; } int check_cov(cov_model *cov) { return check_cov_intern(cov, PosDefType, GLOBAL.general.vdim_close_together); } int struct_cov(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ int err; cov_model *sub, *next = cov->sub[0]; location_type *loc = cov->prevloc; sub = get_around_gauss(next); // fehlt : Poisson if (sub != next) { if ((err = covcpy(&(cov->key), sub)) != NOERROR) return err; sub = cov->key; if (!isPosDef(sub->typus)) SERR("covariance model cannot be determined"); if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, PosDefType, loc->y == NULL && loc->ygr[0] == NULL ? XONLY : KERNEL, SYMMETRIC, cov->vdim2, ROLE_COV)) != NOERROR) { return err; } } return NOERROR; } void CovMatrix(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *value){ if (value==NULL) return; // EvaluateModel needs information about size // of result array cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; CovList[sub->nr].covmatrix(sub, value); } int check_covmatrix(cov_model *cov) { cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; location_type *loc = cov->prevloc; int err, rows, cols; if (loc == NULL) SERR("locations not initialised"); if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, PosDefType, KERNEL, SYMMETRIC, SUBMODEL_DEP, ROLE_GAUSS)) != NOERROR) { if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, NegDefType, XONLY, SYMMETRIC, SUBMODEL_DEP, ROLE_GAUSS)) != NOERROR) { return err; } } setbackward(cov, sub); rows = cov->vdim2[0] = sub->vdim2[0]; cols = cov->vdim2[1] = sub->vdim2[1]; if (cov->q == NULL) { int len=2; // if (loc->grid) len += 2; // if (vdim > 1) len += 2; cov->qlen = len; cov->q = (double *) MALLOC(sizeof(double) * len); // printf("len %d\n", len); cov->q[0] = loc->totalpoints * rows; cov->q[1] = loc->totalpoints * cols; } int dim = loc->timespacedim; assert(dim == cov->tsdim); if ((err = alloc_cov(cov, dim, rows, cols)) != NOERROR) return err; return NOERROR; } void Pseudovariogram(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *value){ if (value==NULL) return; // EvaluateModel needs information about size // of result array cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; CovList[sub->nr].pseudovariogram(sub, value); } void Variogram(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *value){ if (value==NULL) return; // EvaluateModel needs information about size // of result array cov_model *sub = cov->key == NULL ? cov->sub[0] : cov->key; // printf("Variogram %s %ld %ld\n", NICK(sub), // CovList[sub->nr].variogram, CovList[sub->nr].covariance); // assert(false); CovList[sub->nr].variogram(sub, value); } int check_vario(cov_model *cov) { return check_cov_intern(cov, NegDefType, GLOBAL.general.vdim_close_together); } int struct_variogram(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ int err; cov_model *sub, *next = cov->sub[0]; location_type *loc = Loc(cov); // APMI(cov); // assert(loc != NULL); if ((sub = get_around_max_stable(next)) == next) sub = get_around_gauss(next); if (sub != next) { if ((err = covcpy(&(cov->key), sub)) != NOERROR) return err; sub = cov->key; sub->calling = cov; if (!isNegDef(sub->typus)) SERR("variogram model cannot be determined"); } else { if (!isNegDef(sub->typus)) SERR("not a variogram model"); } // APMI(sub); if ((err = CHECK(sub, loc->timespacedim, cov->xdimown, NegDefType, loc->y == NULL && loc->ygr[0] == NULL ? XONLY : KERNEL, SYMMETRIC, cov->vdim2, ROLE_COV)) != NOERROR) { return err; } return NOERROR; } int check_fctn(cov_model *cov) { return check_cov_intern(cov, ShapeType, true); } #define RFGET_UP 0 #define RFGET_REGISTER 1 #define RFGET_SUB 0 void RFget(double VARIABLE_IS_NOT_USED *x, cov_model *cov, double *v){ get_storage *s = cov->Sget; cov_model *get_cov = s->get_cov; int i, nr = s->get_cov->nr, param_nr = s->param_nr, *idx = s->idx, size = s->size; if (CovList[nr].kappatype[param_nr] == REALSXP) { double *p = PARAM(get_cov, param_nr); if (s->all) { for (i=0; iall) { for (i=0; icalling; if (orig == NULL) SERR("register not given"); for (i=0; icalling; while (orig != NULL && orig->user_given == ug_internal) orig = orig->calling; if (orig == NULL) SERR1("value of '%s' too high", KNAME(RFGET_UP)); } } else { int nr = P0INT(RFGET_REGISTER); if (nr<0 || nr>MODEL_MAX) SERR("invalid register number"); if (up != 0) SERR1("'%s' may not be given.", KNAME(RFGET_UP)); orig = KEY[nr]; } s->orig = orig; while (true) { while (CovList[orig->nr].maxsub > 0 && orig != NULL && orig->user_given == ug_internal) orig = (orig->nr == PLUS || orig->nr == MULT || orig->nr==MPPPLUS) && orig->Splus != NULL ? orig->Splus->keys[0] : orig->key != NULL ? orig->key : orig->sub[0]; if (orig == NULL || CovList[orig->nr].maxsub == 0) SERR("model does not match the request or is too complicated"); if (cov->nr != orig->nr) SERR2("(sub)models (%s, %s) do not match", NICK(cov), NICK(orig)); for (subcov=0; subcov < orig->nsub; subcov++) if (cov->sub[subcov] != NULL) break; if (subcov < orig->nsub) { // submodel found if (orig->sub[subcov] == NULL) SERR2("(sub)models (%s; %s) do not match", NICK(cov), NICK(orig)); cov = cov->sub[subcov]; orig = orig->sub[subcov]; } else { int kappas = CovList[orig->nr].kappas; for (i=0; i < kappas; i++) if (cov->kappasub[i] != NULL) break; if (i < kappas) { // param submodel found if (orig->kappasub[i] == NULL) SERR2("parameter models of %s and %s do not match", NICK(cov), NICK(orig)); cov = cov->kappasub[i]; orig = orig->kappasub[i]; } else { for (i=0; i < kappas; i++) if (cov->kappasub[i] != NULL) break; if (i >= kappas) SERR("no parameter given"); cov_fct *C = CovList + cov->nr; if (C->kappatype[i] == REALSXP) s->all = P(i)[0] == 0; else if (C->kappatype[i] == INTSXP) s->all = PINT(i)[0] == 0; else SERR("only numeric parameters are allowed"); if (s->all) { s->vdim2[0] = orig->nrow[i]; s->vdim2[1] = orig->ncol[i]; s->size = s->vdim2[0] * s->vdim2[1]; } else { int k; s->size = s->vdim2[0] = cov->nrow[i]; s->vdim2[1] = cov->ncol[i]; if (cov->ncol[i] != 1) SERR("only vectors of indices are allowed"); assert(s->idx == NULL); s->idx = (int *) MALLOC(sizeof(int) * s->size); if (C->kappatype[i] == REALSXP) for (k=0; ksize; k++) s->idx[k] = ((int) P(i)[k]) - 1; else for (k=0; ksize; k++) s->idx[k] = PINT(i)[k] - 1; } s->get_cov = orig; s->param_nr = i; return NOERROR; } } } // while true BUG; return ERRORFAILED; // nur fuer compiler } int check_RFget(cov_model *cov) { BUG; /// todo: Code ist noch nicht ausgegoren !! //cov_model *orig, *sub; int i, err; // len = ((idx != NULL) ? cov->nrow[RFGET_IDX] // : get->get_cov->ncol[param_nr] * get->get_cov->nrow[param_nr]); if (cov->Sget != NULL) return NOERROR; kdefault(cov, RFGET_UP, 0); NEW_STORAGE(Sget, GET_STORAGE, get_storage); get_storage *s = cov->Sget; if ((err = SearchParam(cov, s)) != NOERROR) return err; for (i=0; i<2; i++) cov->vdim2[i] = s->vdim2[i]; return NOERROR; } void range_RFget(cov_model VARIABLE_IS_NOT_USED *cov, range_type* range){ range->min[RFGET_UP] = 0; range->max[RFGET_UP] = RF_INF; range->pmin[RFGET_UP] = 0; range->pmax[RFGET_UP] = 100; range->openmin[RFGET_UP] = false; range->openmax[RFGET_UP] = true; range->min[RFGET_REGISTER] = 0; range->max[RFGET_REGISTER] = MODEL_MAX; range->pmin[RFGET_REGISTER] = 0; range->pmax[RFGET_REGISTER] = MODEL_USER; range->openmin[RFGET_REGISTER] = false; range->openmax[RFGET_REGISTER] = false; } int struct_RFget(cov_model *cov, cov_model VARIABLE_IS_NOT_USED **newmodel){ int i, err; NEW_STORAGE(Sget, GET_STORAGE, get_storage); get_storage *s = cov->Sget; if ((err = SearchParam(cov, s)) != NOERROR) return err; for (i=0; i<2; i++) { if (cov->vdim2[i] != s->vdim2[i]) SERR("mismatch of dimensions when constructing the model"); } cov->fieldreturn = cov->origrf = false; return NOERROR; } //void do_Rfget(cov_model *cov, gen_storage *s){ // assert(false); //} RandomFields/src/basic.h0000644000175100001440000000456212412655466014702 0ustar hornikusers#ifndef GSL_VS_R_H #define GSL_VS_R_H 1 #include #include #include #include #include // Formerly in void fft_factor_(int n, int *pmaxf, int *pmaxp); Rboolean fft_work_(double *a, double *b, int nseg, int n, int nspn, int isn, double *work, int *iwork);/* TRUE: success */ #define LENGTH length // safety, in order not to use LENGTH defined by R #define complex Rcomplex #define DOT "." #define print Rprintf #define PRINTF Rprintf #define DOPRINTF if (DOPRINT) Rprintf #define KPRINT leer(PrInL);Rprintf #define LPRINT {cov_model *lprint_z=cov; int lprint_i=0; while (lprint_z->calling != NULL && lprint_i<10) {lprint_z=lprint_z->calling; if (DOPRINT) {Rprintf(DOT); Rprintf(" ");} lprint_i++;} if (lprint_i==100) {Rprintf("LPRINT i=%d\n", lprint_i);PMI(cov); assert(false);}} if (DOPRINT) Rprintf #define RF_NA NA_REAL #define RF_NAN R_NaN #define RF_NEGINF R_NegInf #define RF_INF R_PosInf #define GAUSS_RANDOM(SIGMA) rnorm(0.0, SIGMA) #define UNIFORM_RANDOM unif_rand() #define POISSON_RANDOM(x) rpois(x) #define SQRT2 M_SQRT2 #define SQRTPI M_SQRT_PI #define INVPI M_1_PI #define PIHALF M_PI_2 #define T_PI M_2_PI #define ONETHIRD 0.333333333333333333 #define TWOTHIRD 0.66666666666666666667 #define TWOPI 6.283185307179586476925286766559 #define INVLOG2 1.442695040888963 #define INVSQRTTWO 0.70710678118654752440084436210 #define INVSQRTTWOPI 0.39894228040143270286 #define SQRTTWOPI 2.5066282746310002416 #define SQRTINVLOG005 0.5777613700268771079749 //#define LOG05 -0.69314718055994528623 #define LOG3 1.0986122886681096913952452369225257046474905578227 #define LOG2 M_LN2 #define EPSILON 0.00000000001 #define EPSILON1000 0.000000001 #define MAXINT 2147483647 #define INFDIM MAXINT #define INFTY INFDIM extern double EIGENVALUE_EPS; // used in GetTrueDim // // // # define LOCAL_MACHINE 1 // 1 extern char BUG_MSG[250]; #ifdef LOCAL_MACHINE // __extension__ unterdrueckt Fehlermeldung wegen geklammerter Argumente #define assert(X) if (!__extension__ (X )) { \ sprintf(BUG_MSG, \ "'assert(%s) failed in function '%s' (file '%s', line %d).", \ #X,__FUNCTION__, __FILE__, __LINE__); \ error(BUG_MSG); \ } #define VARIABLE_IS_NOT_USED __attribute__ ((unused)) #define SHOW_ADDRESSES 1 #else #define assert(X) {} #define VARIABLE_IS_NOT_USED #endif #endif /* GSL_VS_R_H */ RandomFields/src/fft.cc0000644000175100001440000004627012412655466014540 0ustar hornikusers/* * R : A Computer Language for Statistical Data Analysis * Copyright (C) 1995--2013 R Core Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, a copy is available at * http://www.r-project.org/Licenses/ */ #include /* for abs */ #include #include /* for imax2(.),..*/ /* Fast Fourier Transform * * These routines are based on code by Richard Singleton in the * book "Programs for Digital Signal Processing" put out by IEEE. * * I have translated them to C and moved the memory allocation * so that it takes place under the control of the algorithm * which calls these; for R, see src/library/stats/src/fourier.c * * void fft_factor(int n, int *maxf, int *maxp) * * This factorizes the series length and computes the values of * maxf and maxp which determine the amount of scratch storage * required by the algorithm. * * If maxf is zero on return, an error occured during factorization. * The nature of the error can be determined from the value of maxp. * If maxp is zero, an invalid (zero) parameter was passed and * if maxp is one, the internal nfac array was too small. This can only * happen for series lengths which exceed 12,754,584. * * PROBLEM (see fftmx below): nfac[] is overwritten by fftmx() in fft_work() * ------- Consequence: fft_factor() must be called way too often, * at least from do_mvfft() [ ../main/fourier.c ] * * The following arrays need to be allocated following the call to * fft_factor and preceding the call to fft_work. * * work double[4*maxf] * iwork int[maxp] * * int fft_work(double *a, double *b, int nseg, int n, int nspn, * int isn, double *work, int *iwork) * * The routine returns 1 if the transform was completed successfully and * 0 if invalid values of the parameters were supplied. * * Ross Ihaka * University of Auckland * February 1997 * ========================================================================== * * Header from the original Singleton algorithm: * * -------------------------------------------------------------- * subroutine: fft * multivariate complex fourier transform, computed in place * using mixed-radix fast fourier transform algorithm. * -------------------------------------------------------------- * * arrays a and b originally hold the real and imaginary * components of the data, and return the real and * imaginary components of the resulting fourier coefficients. * multivariate data is indexed according to the fortran * array element successor function, without limit * on the number of implied multiple subscripts. * the subroutine is called once for each variate. * the calls for a multivariate transform may be in any order. * * n is the dimension of the current variable. * nspn is the spacing of consecutive data values * while indexing the current variable. * nseg nseg*n*nspn is the total number of complex data values. * isn the sign of isn determines the sign of the complex * exponential, and the magnitude of isn is normally one. * the magnitude of isn determines the indexing increment for a&b. * * if fft is called twice, with opposite signs on isn, an * identity transformation is done...calls can be in either order. * the results are scaled by 1/n when the sign of isn is positive. * * a tri-variate transform with a(n1,n2,n3), b(n1,n2,n3) * is computed by * call fft(a,b,n2*n3,n1, 1, -1) * call fft(a,b,n3 ,n2,n1, -1) * call fft(a,b,1, n3,n1*n2,-1) * * a single-variate transform of n complex data values is computed by * call fft(a,b,1,n,1,-1) * * the data may alternatively be stored in a single complex * array a, then the magnitude of isn changed to two to * give the correct indexing increment and a(2) used to * pass the initial address for the sequence of imaginary * values, e.g. * call fft(a,a(2),nseg,n,nspn,-2) * * nfac[15] (array) is working storage for factoring n. the smallest * number exceeding the 15 locations provided is 12,754,584. * */ static void fftmx(double *a, double *b, int ntot, int n, int nspan, int isn, int m, int kt, double *at, double *ck, double *bt, double *sk, int *np, int *nfac) { /* called from fft_work() */ /* Design BUG: One purpose of fft_factor() would be to compute * ---------- nfac[] once and for all; and fft_work() [i.e. fftmx ] * could reuse the factorization. * However: nfac[] is `destroyed' currently in the code below */ double aa, aj, ajm, ajp, ak, akm, akp; double bb, bj, bjm, bjp, bk, bkm, bkp; double c1, c2=0, c3=0, c72, cd; double dr, rad; double s1, s120, s2=0, s3=0, s72, sd; int i, inc, j, jc, jf, jj; int k, k1, k2, k3=0, k4, kk, klim, ks, kspan, kspnn; int lim, maxf, mm, nn, nt; a--; b--; at--; ck--; bt--; sk--; np--; nfac--;/*the global one!*/ inc = abs(isn); nt = inc*ntot; ks = inc*nspan; rad = M_PI_4;/* = pi/4 =^= 45 degrees */ s72 = rad/0.625;/* 72 = 45 / .625 degrees */ c72 = cos(s72); s72 = sin(s72); s120 = 0.5*M_SQRT_3;/* sin(120) = sqrt(3)/2 */ if(isn <= 0) { s72 = -s72; s120 = -s120; rad = -rad; } else { #ifdef SCALING /* scale by 1/n for isn > 0 */ ak = 1.0/n; for(j=1 ; j<=nt ; j+=inc) { a[j] *= ak; b[j] *= ak; } #endif } kspan = ks; nn = nt - inc; jc = ks/n; /* sin, cos values are re-initialized each lim steps */ lim = 32; klim = lim*jc; i = 0; jf = 0; maxf = nfac[m - kt]; if(kt > 0) maxf = imax2(nfac[kt],maxf); /* compute fourier transform */ L_start: dr = (8.0*jc)/kspan; cd = sin(0.5*dr*rad); cd = 2.0*cd*cd; sd = sin(dr*rad); kk = 1; i++; if( nfac[i] != 2) goto L110; /* transform for factor of 2 (including rotation factor) */ kspan /= 2; k1 = kspan + 2; do { do { k2 = kk + kspan; ak = a[k2]; bk = b[k2]; a[k2] = a[kk] - ak; b[k2] = b[kk] - bk; a[kk] += ak; b[kk] += bk; kk = k2 + kspan; } while(kk <= nn); kk -= nn; } while(kk <= jc); if(kk > kspan) goto L_fin; L60: c1 = 1.0 - cd; s1 = sd; mm = imin2(k1/2,klim); goto L80; L70: ak = c1 - (cd*c1+sd*s1); s1 = (sd*c1-cd*s1) + s1; /* the following three statements compensate for truncation error. */ /* if rounded arithmetic is used (nowadays always ?!), substitute c1=ak */ #ifdef TRUNCATED_ARITHMETIC c1 = 0.5/(ak*ak+s1*s1) + 0.5; s1 = c1*s1; c1 = c1*ak; #else c1 = ak; #endif L80: do { k2 = kk + kspan; ak = a[kk] - a[k2]; bk = b[kk] - b[k2]; a[kk] += a[k2]; b[kk] += b[k2]; a[k2] = c1*ak - s1*bk; b[k2] = s1*ak + c1*bk; kk = k2 + kspan; } while(kk < nt); k2 = kk - nt; c1 = -c1; kk = k1 - k2; if( kk > k2) goto L80; kk += jc; if(kk <= mm) goto L70; if(kk >= k2) { k1 = k1 + inc + inc; kk = (k1-kspan)/2 + jc; if( kk <= jc+jc) goto L60; goto L_start; } s1 = ((kk-1)/jc)*dr*rad; c1 = cos(s1); s1 = sin(s1); mm = imin2(k1/2,mm+klim); goto L80; /* transform for factor of 3 (optional code) */ L100: k1 = kk + kspan; k2 = k1 + kspan; ak = a[kk]; bk = b[kk]; aj = a[k1] + a[k2]; bj = b[k1] + b[k2]; a[kk] = ak + aj; b[kk] = bk + bj; ak = -0.5*aj + ak; bk = -0.5*bj + bk; aj = (a[k1]-a[k2])*s120; bj = (b[k1]-b[k2])*s120; a[k1] = ak - bj; b[k1] = bk + aj; a[k2] = ak + bj; b[k2] = bk - aj; kk = k2 + kspan; if( kk < nn) goto L100; kk = kk - nn; if( kk <= kspan) goto L100; goto L290; /* transform for factor of 4 */ L110: if( nfac[i] != 4) goto L_f_odd; kspnn = kspan; kspan /= 4; L120: c1 = 1.0; s1 = 0; mm = imin2(kspan,klim); goto L150; L130: c2 = c1 - (cd*c1+sd*s1); s1 = (sd*c1-cd*s1) + s1; /* the following three statements compensate for truncation error. */ /* if rounded arithmetic is used (nowadays always ?!), substitute c1=c2 */ #ifdef TRUNCATED_ARITHMETIC c1 = 0.5/(c2*c2+s1*s1) + 0.5; s1 = c1*s1; c1 = c1*c2; #else c1 = c2; #endif L140: c2 = c1*c1 - s1*s1; s2 = c1*s1*2.0; c3 = c2*c1 - s2*s1; s3 = c2*s1 + s2*c1; L150: k1 = kk + kspan; k2 = k1 + kspan; k3 = k2 + kspan; akp = a[kk] + a[k2]; akm = a[kk] - a[k2]; ajp = a[k1] + a[k3]; ajm = a[k1] - a[k3]; a[kk] = akp + ajp; ajp = akp - ajp; bkp = b[kk] + b[k2]; bkm = b[kk] - b[k2]; bjp = b[k1] + b[k3]; bjm = b[k1] - b[k3]; b[kk] = bkp + bjp; bjp = bkp - bjp; if( isn < 0) goto L180; akp = akm - bjm; akm = akm + bjm; bkp = bkm + ajm; bkm = bkm - ajm; if( s1 == 0.0) goto L190; L160: a[k1] = akp*c1 - bkp*s1; b[k1] = akp*s1 + bkp*c1; a[k2] = ajp*c2 - bjp*s2; b[k2] = ajp*s2 + bjp*c2; a[k3] = akm*c3 - bkm*s3; b[k3] = akm*s3 + bkm*c3; kk = k3 + kspan; if( kk <= nt) goto L150; L170: kk = kk - nt + jc; if( kk <= mm) goto L130; if( kk < kspan) goto L200; kk = kk - kspan + inc; if(kk <= jc) goto L120; if(kspan == jc) goto L_fin; goto L_start; L180: akp = akm + bjm; akm = akm - bjm; bkp = bkm - ajm; bkm = bkm + ajm; if( s1 != 0.0) goto L160; L190: a[k1] = akp; b[k1] = bkp; a[k2] = ajp; b[k2] = bjp; a[k3] = akm; b[k3] = bkm; kk = k3 + kspan; if( kk <= nt) goto L150; goto L170; L200: s1 = ((kk-1)/jc)*dr*rad; c1 = cos(s1); s1 = sin(s1); mm = imin2(kspan,mm+klim); goto L140; /* transform for factor of 5 (optional code) */ L_f5: c2 = c72*c72 - s72*s72; s2 = 2.0*c72*s72; L220: k1 = kk + kspan; k2 = k1 + kspan; k3 = k2 + kspan; k4 = k3 + kspan; akp = a[k1] + a[k4]; akm = a[k1] - a[k4]; bkp = b[k1] + b[k4]; bkm = b[k1] - b[k4]; ajp = a[k2] + a[k3]; ajm = a[k2] - a[k3]; bjp = b[k2] + b[k3]; bjm = b[k2] - b[k3]; aa = a[kk]; bb = b[kk]; a[kk] = aa + akp + ajp; b[kk] = bb + bkp + bjp; ak = akp*c72 + ajp*c2 + aa; bk = bkp*c72 + bjp*c2 + bb; aj = akm*s72 + ajm*s2; bj = bkm*s72 + bjm*s2; a[k1] = ak - bj; a[k4] = ak + bj; b[k1] = bk + aj; b[k4] = bk - aj; ak = akp*c2 + ajp*c72 + aa; bk = bkp*c2 + bjp*c72 + bb; aj = akm*s2 - ajm*s72; bj = bkm*s2 - bjm*s72; a[k2] = ak - bj; a[k3] = ak + bj; b[k2] = bk + aj; b[k3] = bk - aj; kk = k4 + kspan; if( kk < nn) goto L220; kk = kk - nn; if( kk <= kspan) goto L220; goto L290; /* transform for odd factors */ L_f_odd: k = nfac[i]; kspnn = kspan; kspan /= k; if(k == 3) goto L100; if(k == 5) goto L_f5; if(k == jf) goto L250; jf = k; s1 = rad/(k/8.0); c1 = cos(s1); s1 = sin(s1); ck[jf] = 1.0; sk[jf] = 0.0; for(j = 1; j < k; j++) { /* k is changing as well */ ck[j] = ck[k]*c1 + sk[k]*s1; sk[j] = ck[k]*s1 - sk[k]*c1; k--; ck[k] = ck[j]; sk[k] = -sk[j]; } L250: k1 = kk; k2 = kk + kspnn; aa = a[kk]; bb = b[kk]; ak = aa; bk = bb; j = 1; k1 = k1 + kspan; L260: k2 = k2 - kspan; j++; at[j] = a[k1] + a[k2]; ak = at[j] + ak; bt[j] = b[k1] + b[k2]; bk = bt[j] + bk; j++; at[j] = a[k1] - a[k2]; bt[j] = b[k1] - b[k2]; k1 = k1 + kspan; if( k1 < k2) goto L260; a[kk] = ak; b[kk] = bk; k1 = kk; k2 = kk + kspnn; j = 1; L270: k1 += kspan; k2 -= kspan; jj = j; ak = aa; bk = bb; aj = 0.0; bj = 0.0; k = 1; for(k=2; k < jf; k++) { ak += at[k]*ck[jj]; bk += bt[k]*ck[jj]; k++; aj += at[k]*sk[jj]; bj += bt[k]*sk[jj]; jj += j; if(jj > jf) jj -= jf; } k = jf - j; a[k1] = ak - bj; b[k1] = bk + aj; a[k2] = ak + bj; b[k2] = bk - aj; j++; if( j < k) goto L270; kk = kk + kspnn; if( kk <= nn) goto L250; kk = kk - nn; if( kk <= kspan) goto L250; /* multiply by rotation factor (except for factors of 2 and 4) */ L290: if(i == m) goto L_fin; kk = jc + 1; L300: c2 = 1.0 - cd; s1 = sd; mm = imin2(kspan,klim); do { /* L320: */ c1 = c2; s2 = s1; kk += kspan; do { /* L330: */ do { ak = a[kk]; a[kk] = c2*ak - s2*b[kk]; b[kk] = s2*ak + c2*b[kk]; kk += kspnn; } while(kk <= nt); ak = s1*s2; s2 = s1*c2 + c1*s2; c2 = c1*c2 - ak; kk += -nt + kspan; } while(kk <= kspnn); kk += -kspnn + jc; if(kk <= mm) { /* L310: */ c2 = c1 - (cd*c1+sd*s1); s1 = s1 + (sd*c1-cd*s1); /* the following three statements compensate for truncation error.*/ /* if rounded arithmetic is used (nowadays always ?!), they may be deleted. */ #ifdef TRUNCATED_ARITHMETIC c1 = 0.5/(c2*c2+s1*s1) + 0.5; s1 = c1*s1; c2 = c1*c2; #endif continue/* goto L320*/; } if(kk >= kspan) { kk = kk - kspan + jc + inc; if( kk <= jc+jc) goto L300; goto L_start; } s1 = ((kk-1)/jc)*dr*rad; c2 = cos(s1); s1 = sin(s1); mm = imin2(kspan,mm+klim); } while(1); /*------------------------------------------------------------*/ /* permute the results to normal order---done in two stages */ /* permutation for square factors of n */ L_fin: np[1] = ks; if( kt == 0) goto L440; k = kt + kt + 1; if( m < k) k--; np[k+1] = jc; for(j = 1; j < k; j++, k--) { np[j+1] = np[j]/nfac[j]; np[k] = np[k+1]*nfac[j]; } k3 = np[k+1]; kspan = np[2]; kk = jc + 1; k2 = kspan + 1; j = 1; if(n == ntot) { /* permutation for single-variate transform (optional code) */ L370: do { ak = a[kk]; a[kk] = a[k2]; a[k2] = ak; bk = b[kk]; b[kk] = b[k2]; b[k2] = bk; kk += inc; k2 += kspan; } while(k2 < ks); L380: do { k2 -= np[j]; j++; k2 += np[j+1]; } while(k2 > np[j]); j = 1; do { if(kk < k2) goto L370; kk += inc; k2 += kspan; } while(k2 < ks); if( kk < ks) goto L380; jc = k3; } else { /* permutation for multivariate transform */ L400: k = kk + jc; do { ak = a[kk]; a[kk] = a[k2]; a[k2] = ak; bk = b[kk]; b[kk] = b[k2]; b[k2] = bk; kk += inc; k2 += inc; } while( kk < k); kk += ks - jc; k2 += ks - jc; if(kk < nt) goto L400; k2 += - nt + kspan; kk += - nt + jc; if( k2 < ks) goto L400; do { do { k2 -= np[j]; j++; k2 += np[j+1]; } while(k2 > np[j]); j = 1; do { if(kk < k2) goto L400; kk += jc; k2 += kspan; } while(k2 < ks); } while(kk < ks); jc = k3; } L440: if( 2*kt+1 >= m) return; kspnn = np[kt+1]; /* permutation for square-free factors of n */ /* Here, nfac[] is overwritten... -- now CUMULATIVE ("cumprod") factors */ nn = m - kt; nfac[nn+1] = 1; for(j = nn; j > kt; j--) nfac[j] *= nfac[j+1]; kt++; nn = nfac[kt] - 1; jj = 0; j = 0; goto L480; L460: jj -= k2; k2 = kk; k++; kk = nfac[k]; L470: jj += kk; if( jj >= k2) goto L460; np[j] = jj; L480: k2 = nfac[kt]; k = kt + 1; kk = nfac[k]; j++; if( j <= nn) goto L470; /* determine the permutation cycles of length greater than 1 */ j = 0; goto L500; do { do { k = kk; kk = np[k]; np[k] = -kk; } while(kk != j); k3 = kk; L500: do { j++; kk = np[j]; } while(kk < 0); } while(kk != j); np[j] = -j; if( j != nn) goto L500; maxf *= inc; goto L570; /* reorder a and b, following the permutation cycles */ L_ord: do j--; while(np[j] < 0); jj = jc; L520: kspan = imin2(jj,maxf); jj -= kspan; k = np[j]; kk = jc*k + i + jj; for(k1= kk + kspan, k2= 1; k1 != kk; k1 -= inc, k2++) { at[k2] = a[k1]; bt[k2] = b[k1]; } do { k1 = kk + kspan; k2 = k1 - jc*(k+np[k]); k = -np[k]; do { a[k1] = a[k2]; b[k1] = b[k2]; k1 -= inc; k2 -= inc; } while( k1 != kk); kk = k2; } while(k != j); for(k1= kk + kspan, k2= 1; k1 > kk; k1 -= inc, k2++) { a[k1] = at[k2]; b[k1] = bt[k2]; } if(jj != 0) goto L520; if( j != 1) goto L_ord; L570: j = k3 + 1; nt = nt - kspnn; i = nt - inc + 1; if( nt >= 0) goto L_ord; } /* fftmx */ static int old_n = 0; static int nfac[15]; static int m_fac; static int kt; static int maxf; static int maxp; /* At the end of factorization, * nfac[] contains the factors, * m_fac contains the number of factors and * kt contains the number of square factors */ /* non-API, but used by package RandomFields */ void fft_factor_(int n, int *pmaxf, int *pmaxp) { /* fft_factor - factorization check and determination of memory * requirements for the fft. * * On return, *pmaxf will give the maximum factor size * and *pmaxp will give the amount of integer scratch storage required. * * If *pmaxf == 0, there was an error, the error type is indicated by *pmaxp: * * If *pmaxp == 0 There was an illegal zero parameter among nseg, n, and nspn. * If *pmaxp == 1 There we more than 15 factors to ntot. */ int j, jj, k; /* check series length */ if (n <= 0) { old_n = 0; *pmaxf = 0; *pmaxp = 0; return; } else old_n = n; /* determine the factors of n */ m_fac = 0; k = n;/* k := remaining unfactored factor of n */ if (k == 1) return; /* extract square factors first ------------------ */ /* extract 4^2 = 16 separately * ==> at most one remaining factor 2^2 = 4, done below */ while(k % 16 == 0) { nfac[m_fac++] = 4; k /= 16; } /* extract 3^2, 5^2, ... */ for(j = 3; (jj= j*j) <= k; j += 2) { while(k % jj == 0) { nfac[m_fac++] = j; k /= jj; } } if(k <= 4) { kt = m_fac; nfac[m_fac] = k; if(k != 1) m_fac++; } else { if(k % 4 == 0) { nfac[m_fac++] = 2; k /= 4; } /* all square factors out now, but k >= 5 still */ kt = m_fac; maxp = imax2(kt+kt+2, k-1); j = 2; do { if (k % j == 0) { nfac[m_fac++] = j; k /= j; } j = ((j+1)/2)*2 + 1; } while(j <= k); } if (m_fac <= kt+1) maxp = m_fac+kt+1; if (m_fac+kt > 15) { /* error - too many factors */ old_n = 0; *pmaxf = 0; *pmaxp = 0; return; } else { if (kt != 0) { j = kt; while(j != 0) nfac[m_fac++] = nfac[--j]; } maxf = nfac[m_fac-kt-1]; /* The last squared factor is not necessarily the largest PR#1429 */ if (kt > 0) maxf = imax2(nfac[kt-1], maxf); if (kt > 1) maxf = imax2(nfac[kt-2], maxf); if (kt > 2) maxf = imax2(nfac[kt-3], maxf); } *pmaxf = maxf; *pmaxp = maxp; } Rboolean fft_work_(double *a, double *b, int nseg, int n, int nspn, int isn, double *work, int *iwork) { int nf, nspan, ntot; /* check that factorization was successful */ if(old_n == 0) return FALSE; /* check that the parameters match those of the factorization call */ if(n != old_n || nseg <= 0 || nspn <= 0 || isn == 0) return FALSE; /* perform the transform */ nf = n; nspan = nf * nspn; ntot = nspan * nseg; fftmx(a, b, ntot, nf, nspan, isn, m_fac, kt, &work[0], &work[maxf], &work[2*maxf], &work[3*maxf], iwork, nfac); return TRUE; } RandomFields/src/initNerror.cc0000644000175100001440000030453312412655466016113 0ustar hornikusers/* Authors Martin Schlather, schlather@math.uni-mannheim.de library for simulation of random fields -- init part and error messages Copyright (C) 2001 -- 2014 Martin Schlather This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // to do: V3.1+: Randverteilungen der RPs in cov, D etc implementieren; // do -> random part; init wird innerhalb von do aufgerufen, // falls nicht initialisiert oder random submodels?? // to do: MLE: random parameters einsammeln #include #include #include //#include #include #include "RF.h" #include "Covariance.h" #include int gaussmethod[Forbidden+1]; cov_model *KEY[MODEL_MAX+1]; double ZERO[MAXSIMUDIM], ONE = 1, // *userdefinedCovMatrix[MAXDEFMATRIX][MAXMAKEEXPLICITE], *OutX=NULL, *OutY=NULL; int NATSC_INTERN,NATSC_USER, GENERALISEDCAUCHY, STABLE, BROWNIAN, CAUCHY, GAUSS, NUGGET, PLUS, TBM2NR, BALL, ECF, MULT, DISTRIBUTION, DETERM_DISTR, GAUSS_DISTR, SETPARAM, COVFCTN, COVMATRIX, RFGET, STROKORB_MONO, STROKORB_BALL_INNER, RECTANGULAR, POLYGON, MULT_INVERSE, TRUNCSUPPORT, SHAPESTP, SHAPEAVE, BROWNRESNICK, UNIF, MPPPLUS, CUTOFF, STEIN, BRSHIFTED_USER, BRMIXED_USER, BRORIGINAL_USER, BRSHIFTED_INTERN, BRMIXED_INTERN, BRORIGINAL_INTERN, EXTREMALGAUSSIAN, RANDOMSIGN, ARCSQRT_DISTR, PTS_GIVEN_SHAPE, STATIONARY_SHAPE, STANDARD_SHAPE, LOC, SET_DISTR, SCALESPHERICAL, TBM_OP, USER,TREND, TREND_PROC,CONSTANT, MIXEDEFFECT, // MLEMIXEDEFFECT, VARIOGRAM_CALL, SIMULATE, MISSING_COV, NULL_MODEL, POWER_DOLLAR, DOLLAR_PROC, LASTDOLLAR, DOLLAR, PLUS_PROC, BINARYPROC, BROWNRESNICKPROC, GAUSSPROC, POISSONPROC, SCHLATHERPROC, SMITHPROC, CHI2PROC, EXTREMALTPROC, TPROC, NUGGET_USER, NUGGET_INTERN, CIRCEMBED, SPECTRAL_PROC_USER, SPECTRAL_PROC_INTERN, DIRECT, SEQUENTIAL, SPECIFIC, SELECT, AVERAGE_USER, AVERAGE_INTERN, HYPERPLANE_USER, HYPERPLANE_INTERN, RANDOMCOIN_USER, CE_CUTOFFPROC_USER, CE_CUTOFFPROC_INTERN, CE_INTRINPROC_USER, CE_INTRINPROC_INTERN, TBM_PROC_USER, TBM_PROC_INTERN, VECTOR, ISO2ISO, SP2SP, SP2ISO, S2ISO, S2SP, S2S, SId, EARTHKM2CART, EARTHMILES2CART, FIRST_TRAFO, LAST_TRAFO; // userdefinedCM_RC[MAXDEFMATRIX][MAXMAKEEXPLICITE], bool NAOK_RANGE=false; char CovNames[MAXNRCOVFCTS][MAXCHAR], CovNickNames[MAXNRCOVFCTS][MAXCHAR]; char MSG[LENERRMSG], MSG2[LENERRMSG], NEWMSG[LENERRMSG], BUG_MSG[250]; cov_fct *CovList=NULL; int currentNrCov=-1; int currentRegister=-1; int True=1; // never change int False=0; // never change char *FREEVARIABLE= (char*) "..."; #define MAX_CE_MEM 16777216 #define R_PRINTLEVEL 1 #define C_PRINTLEVEL 1 #define NAT_SCALE 0 int PL=C_PRINTLEVEL, NS=NAT_SCALE; globalparam GLOBAL = { {'.', false, false, false, false, false, true, false, true, normal, R_PRINTLEVEL, C_PRINTLEVEL, NAT_SCALE, 1, 0, {0, 2} /* chol, SVD */, NA_INTEGER, NA_INTEGER, 1e-6, 1e-6, RF_NA, },// general; {RF_NA, 0.05, false, false, 800}, // gauss {'A', false, false, true, 8000, {5000, 200, 1000}, 2}, // krige {false, true, false, TRIVIALSTRATEGY, 3, MAX_CE_MEM, MAXINT, 0.5, -1e-7, 1e-3, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, RF_NA}, //ce_param ce, 13 NULLEN {true, false, 50, 0.0, {2500, 2500, 2500, 2500}}, // spectral_param {false, -2, 3, 0, {1, 60, 500}, RF_NA, 2.0, 0.0, {RF_NA, RF_NA, RF_NA, RF_NA}}, // TBM {Cholesky, 1e-12, 8192 },// direct_param direct; {5000, 5, -10}, //sequ_param sequ; {2, false, 250000, 1.0}, //markov_param markov; {}, // ave {0.0}, // nugget_param nugget; {50000, // mpp, n_estim_E {1.0, 1.0, 1.0, 1.0}, // intens; 1e-4 /* about zero */ }, //mpp_param mpp; {700, 1000, HYPER_UNIFORM, RF_NA}, // hyper_param hyper; {MAXINT, 30, FALSE /* FLAT_UNDETERMINED */, 1000, 10000000, 20, // int 4.0, // standardmax; oder 5 !; jedoch ist 3 zu wenig 1.0, 0.0, 0.01},//extremes_storage extremes; maxstable {10000000, 7, 10000, 2, 300, 0.1, 0.01, 8.0, 0.1}, // br (BrownResnick) {0.08, 0, 1e-20, 1e5, 1000, 8, 20, 15, 1000}, // distr (rectangular) // todo should be 500 and better algorithm for approximation! {0.5, 3.0, 5.0, 3.0, 10.0, 1e4, // 6 1E-10, 1000.0, 0.001, 0.02, 1/1000, 1000, // 12 false, -10.0, 10.0, RF_NA, RF_NA, 0.1, // 18 1e-7, 50, 20, 1, 1, 20, 0 /* critical */, // 6 5 /* ncrit */ , 5000, {3000, 200, 1000}, 2, 2000, // 12 0, -1 /* algorithm */, 2 /* optim_var(_estim) , besser 3, 0, 2 */, 0, true, !true, false, true, true, true, true, false, 12}, // fit {0.0, 0.0, 1e-13, false, true}, // empvario (automatically chosen as -pi/n/2)) {true, CircEmbed, {1024, 64}}, // gui {false, 6.0, 72, 1, {3, 4}, true, false, 0, ""}, // graphics {0, MODEL_KRIGE, MODEL_COND, MODEL_ERR, MODEL_GUI}, // registers {true, true, true, false, true, true, false, true, true, true, true, true}, // warnings {RF_NA, coord_auto, {""}, {""}, {""}, {""}, {""}, 0, 0, {NA_INTEGER, NA_INTEGER}, {NA_INTEGER, NA_INTEGER}}, // coords {10}, // special }; //globalorig GLOBALORIG = {false, {}}; int PrInL=-1; pref_type PREF_ALL = {PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_BEST, PREF_NONE, // specific PREF_BEST, PREF_BEST}, PREF_NOTHING = {PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_BEST, // nothing PREF_NONE}, PREF_AUX = {PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE, PREF_NONE}; /* record containing all user specified directions for choosing a simulation method. Currently only one element is contained. */ double GENERAL_PRECISION = 5e-15; double EIGENVALUE_EPS = 1e-15; char ERRORSTRING[MAXERRORSTRING], ERRORSTRING_OK[MAXERRORSTRING], ERRORSTRING_WRONG[MAXERRORSTRING], ERROR_LOC[nErrorLoc]=""; int ERRORMODELNUMBER = -1; char PREF_FAILURE[100 * Nothing]; const char *METHODNAMES[Forbidden+1]={"circulant", //0 "cutoff", "intrinsic", "tbm", "spectral", //4 "direct", "sequential", "markov", "average", "nugget", //9 "coins", "hyperplane", "specific", "any method", // nothing "forbidden"}, *STATNAMES[LAST_STAT + 1] = { "single variable", "kernel", "framework dependent", "mismatch"}, *ISONAMES[LAST_ISO + 1] = { "isotropic", "space-isotropic", "zero-space-isotropic", "vector-isotropic", "symmetric", "cartesian system", "earth system", "spherical system", "cylinder system", "non-dimension-reducing", "parameter dependent", ""}, *ROLENAMES[ROLE_LAST + 1] = { "", // 0 "covariance model", "Gauss", "max-stable", "BrownResnick", "Smith", // 5 "Schlather", "Poisson", "PoissonGauss", "Bernoulli", "distribution", // 10 "", ""}, *TYPENAMES[OtherType + 1] = { "tail correlation function", "positive definite", "negative definite", "process", "method for Gauss processes", "method for Brown-Resnick processes", "point-shape function", "distribution family", "shape function", "trend", "interface", "undefined", "other type"}, *MONOTONE_NAMES[BERNSTEIN + 1 - (int) MISMATCH] = { "mismatch in monotonicity", "submodel dependent monotonicity", "previous model dependent monotonicity", "parameter dependent monotonicity", "not monotone", "monotone", "Gneiting-Schaback class", "normal mixture", "completely monotone", "Bernstein" }, *CAT_TYPENAMES[OtherType + 1] = { // TcfType, PosDefType, NegDefType, ProcessType, GaussMethodType, // BrMethodType, PointShapeType, RandomType, ShapeType, TrendType, // InterfaceType, // UnDefinedType, OtherType "RM", "RM", "RM", "RP", "RP", "RP", "RM", "RR", "RM", "RM", "RF", "RM", "RO"}, *REGNAMES[MODEL_MAX+1] = {"reg0", "reg1", "reg2", "reg3", "reg4", "reg5", "reg6", "reg7", "reg8", "reg9", "user", "unused", "intern", "split", "gui", "mle", "mlesplit", "mletrend", "mlebounds", "kriging", "conditional", "error model"}, *MODENAMES[nr_modes] = {"careless", "sloppy", "easygoing", "normal", "precise", "pedantic", "neurotic"}, *UNITS_NAMES[nr_units] = {"", "km", "miles", "