rgenoud/0000755000176200001440000000000013422437303011716 5ustar liggesusersrgenoud/inst/0000755000176200001440000000000013171743040012672 5ustar liggesusersrgenoud/inst/CITATION0000644000176200001440000000273213171743040014033 0ustar liggesuserscitHeader("To cite 'rgenoud' in publications use:") citEntry(entry = "Article", title = "Genetic Optimization Using Derivatives: The {rgenoud} Package for {R}", author = personList(person(c("Walter", "R."), "Mebane, Jr."), as.person("Jasjeet S. Sekhon")), journal = "Journal of Statistical Software", year = "2011", volume = "42", number = "11", pages = "1--26", url = "http://www.jstatsoft.org/v42/i11/", textVersion = paste("Walter R. Mebane, Jr., Jasjeet S. Sekhon (2011).", "Genetic Optimization Using Derivatives: The rgenoud Package for R.", "Journal of Statistical Software, 42(11), 1-26.", "URL http://www.jstatsoft.org/v42/i11/.") ) citEntry(header="To refer to the theory on which this package is based, also cite:", entry="Article", title = "Genetic Optimization Using Derivatives: Theory and Application to Nonlinear Models", author = personList(as.person("Jasjeet S. Sekhon"), person(c("Walter", "R."), "Mebane, Jr.")), journal = "Political Analysis", year = "1998", volume = "7", pages = "189--213", textVersion = paste("Jasjeet S. Sekhon, Walter R. Mebane, Jr. (1998).", "Genetic Optimization Using Derivatives: Theory and Application to Nonlinear Models", "Political Analysis, 7, 189-213.") ) citFooter("BibTeX entries for LaTeX users: use\n", sQuote('toBibtex(citation("rgenoud"))')) rgenoud/inst/doc/0000755000176200001440000000000013171743040013437 5ustar liggesusersrgenoud/inst/doc/Figures/0000755000176200001440000000000013171743040015043 5ustar liggesusersrgenoud/inst/doc/Figures/fig1.pdf0000644000176200001440000002366713171743040016402 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 425 /Filter /FlateDecode /N 11 /First 66 >> stream x]k0+޻>=J` l&BLJGwԉVA:}#!! $/"Jdyq@ $ RAH|sy ^5+1Rsiko nRyBGqgg]5TkZ8W1:խy︼8z!nMj F\s uőCе9ֺԝۚHq+ sZW'$jŵOj Z:n^٧Fp!7,[MxŪ>Ptp~ݺ$LPf hd: S2q qZYM"Y5:4qdlߝ^gxƾvt7OLѐV|endstream endobj 13 0 obj << /Subtype /XML /Type /Metadata /Length 1319 >> stream 2012-06-03T12:02:44-07:00 2012-06-03T12:02:44-07:00 UnknownApplication Untitled endstream endobj 14 0 obj << /Filter /FlateDecode /Length 7608 >> stream x|Ku9n;[F]@AcThAõu*6IHjI___y~;՟~ï_֏?Vd}>eԯAُX|LǗ9˳~qUUbH {VҒmrjqHs/k\PvR)9רmQЎYZ) {c3˞YcQy*%FN4F=55vʵfP4 ZdoCe!{(<8O[ikOh^yJT:H 4Ϟ4~V)_%"7c:j9VZTmU5{BBC,5"pm)-z~/rsQoZ>5gh^:=,eLi3JjNh %'}}ԙ3K2/\KPJ~,IYVWKVYU\o9[7r:)5۫'jeΑ֎\A q>e($c`+}o3!st(+ј)nUjhk?:hUe!/dRI!qL) %ʆ;MI;? jeHɻأ^%ZV!.Bb!G"!*-l zQYvzkAg*V=46QtghDÉj1, T1|`LS$ߺJCQaDo9kMc@-lm_m, N_hȲBDЯ!RN) mwQ AbANtgΛ>/{*ztzt#(I| IUˢKZ>/TS룅-ޒ;$ }fO&tkPtYA!蚯 <ƮsSl|}GvCH=)-n¶WiRap,(}o۬kAZK;Eњut{ˆ>5d'g0žxVa 65[ il<jkfG8e.7L68]Vy[kI9Gˠ;mZa_[Eev(ʠP/'tjlyS"RFj2(:֑y48L@PSIPXՒܛ|دd :-ԘS0UN{8|)0/DBa5'i=IRiЇσ߹$8,U8ФY}yȽS2?C`6xVѰ6 kT%iyR!wú&Z6R/Jny?liI/tN?`M]av'~`J|R; j Ծ J7 rOi+gQ5Zv+5M tZIt]-X:wL<}Y۶?tӡ看$∦N]nn(Q7IdZ&8G}J#n{'d iZY(O'ܠ$R֪TZٹ*z:kls,L|Qԩ M+;g+ڥwM 4jy[gfNujivW:+\nPQ76˳84 Jy:MrbS^O-=C?iZWN3Yٲ@i[ҳ&N[^X͝&[vYUuYBkNGjik ݴ608W*kv坲Z:ee=W<h6VH(8z?I~I<$ͱ^;s4t+mTŶ}3`rgh4le=Չt⧕&|+yKml1Ԟ%h̃ɲĦK6vӫ.hyجhvXX˶wYYFjŖM+b>[v33JV-ZYZ';v<'ɿig]N֦dؖ-PZP@[wS-#)tYcN,<(ZV5m^Ҁo&k`[DO^x~glֆzwIҶDc_jvRWnVbsMro=s}Ė&R_g=(TI+*:udWY̞ҴRFmzh95JPVmBԚCɠm͸M".$挢ii2bbt z9a44Zg'MVhgc<] ze=N;185]U*'xޤ  k J%Oק4 :A,lZMcC2qiaE/,&mBj7-,N'5ɽ_(-Z'+*.ZF]`<13an>ͻ;gypgqJɒ`_I)NxJOjWZ]9>V/IDckZ:}w|vr }WsCr®.giUhZD%:5ihTN8(iPNsnKgn>\VtEwOt8gw2uXSI=YCVu?.(SV=iU.{ߋ6?i/oAtZU7Iz7PAe%H7G?‡ѵNC>`yU!9@z,)jQhS<*wNe Z;'}Ѵw9ƃ L+hSWI4(ZԭQmN{zJsQ4Ԫɻ*AAP=//h_lݰwpk4!syL?s nޠF'+w,}*?~lHЙ-m#Hn-T{{fG{t:mb랼㘫nG,|J/k%l/J)4"yyR.-:M5Ӏ/M8sg86]8`5@NX Qtz&1)ُs 0O܄ [ZX& |ţ"C0F\}_ pODRԤuO[\=RϯIۺT\՗Ez =]0MC1><}y_G޴D8ɟgiăƸmLCbDQγaۄFn6*N֊4-7pǶZmIV2u,ent:<礱5Vi#C&b ^4w*0cjs}ΛbvxT>&#['ֳ(]WK@yeEA[z::YTڴdSMto:SS 7 ZK3UIv8HvnV8(ٶI;FLGS*}R g*#ns5k)xd^orILu竬CiH0p,ѩ({vx-[^裳;Ewt/].JwX&:IPիAJ'*c7{W6t.=c nmM4m=KZt M:Os}ZO&p+EdIԤ]r& >-?vj3P:K9RsCTn^|o86wSM ]X2wxxq^.C#~z+@AWێ(F5ʒU J;[Ȕ=mtI<iUFc1˗4 Q !1jotki"oҞ+8@FSu4[֥w8ElmUO.Tm!e}y׮ȌG/lgHahGDKzsksK$A󺌵&z-/jv\M'ϓz18c6=cdxPNut7,iau?:tcDv'K 8WۭvȺuDOZC}%7/@Ѻ;77d[y~ek8^P: ޜt޳_3xA1hq!./{vћ={׍W`s  7:sM>#/>I33tw}O@oA1B7ݸ{܎;A;O; !wxsAwQww Sw܃Txw <|Py>0owf;{w'4w Ko\;wڍK+n|@ݸy߾"wqoTEPq_1+"ÝJN8#0*ā~Ċ8o$<<~cMET w❓ƸnLP%ӌnύ +;]7.q}ܸG߸m7 Υ q{nLQДBs1IAD,.L޹xWB9n8)ToUмg_qVA+z-㰼/EGחv__[5KkKoE2nYЊ^4Gk溼ƶy?_#frn\\Њ^˸9jGkw}qy>2n/hů=V6z1k {c Cq-}U #V8Gsuxi{y}$yz1®= !&a|>]Qv&nO[ը"G OXk}ñ][퓷inPw#;Hb#nq;@F! Kw@#r'vm>yJr}*Fo3]!+#'On~|X~/ćDz/E |)6%z_/Ô/B _+I/ߧ|1F |-|Ek>]*~.E|6OW!}W, _(76xJ>N}O FH0_<_o>>C⋗ K%:^ m[/s +1ߌćENc_OćKP e/ń{߼E|о<_榫޽00o $}7IGz½m>yrq G3Ai\KByӮ͈o fL}7Gyr_EpR|"o+R|3fpy=ןz>&cRW wɕٗ)?G}{ɣq|w߾/_|_˗銎BWA?ga?l~n;O蜟i32/7\s^\!F_cjw_>b G2On,(?gG>y8c`?:w1 eكh}^D ˑy[/Cj[%?ZQnF}_?_QÐ%2ASGQ/0/9*}l+'rX 4]H_ Xaipendstream endobj 15 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 @N. 2D! }I:gׁm_Xց$i,Ÿ> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 17 /ID [<20e64486ba37077a5e4b9042ec501bc4><8345504475fa09f0547d855970b7a974>] >> stream xcb&F~ c$$󍉁WH0`~2 endstream endobj startxref 9855 %%EOF rgenoud/inst/doc/Figures/lqdxmpl2B.pdf0000644000176200001440000011453713171743040017416 0ustar liggesusers%PDF-1.3 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 3 0 obj << /Type /Page /Parent 2 0 R /Resources << /XObject << /Im0 8 0 R >> /ProcSet 6 0 R >> /MediaBox [0 0 207.367 207.367] /CropBox [0 0 207.367 207.367] /Contents 4 0 R /Thumb 11 0 R >> endobj 4 0 obj << /Length 5 0 R >> stream q 207.367 0 0 207.367 0 0 cm /Im0 Do Q endstream endobj 5 0 obj 39 endobj 6 0 obj [ /PDF /Text /ImageC ] endobj 7 0 obj << >> endobj 8 0 obj << /Type /XObject /Subtype /Image /Name /Im0 /Filter [ /DCTDecode ] /Width 864 /Height 864 /ColorSpace 10 0 R /BitsPerComponent 8 /Length 9 0 R >> stream JFIF++ExifMM*JR(iZ,,``C  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ| ``J !1AQ"2aqcsDTtB#4Rr356Cb$%S?z~Ju0NrҘ1i8Jjdeu\I>+8lqܒWmxO+º rvZ_X$rpU'CɋQΔkfJi4[o0XJՕ(ŷhJɛczF Ursъ#T1)5gcj6,9uNXt}/(?!+F0˪z~:pDcZ .mӸJsmVy]>JCyIJ.sܰ8w&t|tE1!C[rъgW#\Rj (7mo/JJy5(SpcG0RMΣVE8εJE҃m.vt >gw= lc,UKSVo-ҐNTԅjrY4ޛUhʗs+9S=CB}ʽ\ΒV:gerMEk@x_Ylfo ?*PO盫2ҴaJ5uQ]/Gf_UUWydݑ4JIB.YM)GWZ%0T7)7J;Rad:oy ?iG+Z2eO*ߩLlO 8xqs<"KץFw(uwiCNjR̠I=FS$sN?ðL&&)YC SG]%޿B J'Q$:Hi*b#VqVQO%i^ kX%brbjz3zw-K8xy1W Ib:Cְv>jڊ|H;biWb,`*y}~.|FE^Ju<%N5pN. F#ap0IA?)Q-)G {I]j :P"ĺ*Bp3%*t^gWMxiL<-QZNsYTz.<-HԌa+2NlS{WKz98JZwM:oz+AN/8И}OCXv`Q'{JN1RTwpphC$df@ԭd7ѺJX:5|:)MjK[ld%kBit~eZ Y4JH4!Iݫ)[؊ʵZwMC B׍;Uwہzjmm{WGaV/͗3oNiB0bR䑖/CRhΟF`JA/38⥚;IٲT)PRQ$Ԓ~0zXjJw(ac(ІE'wRx9t+m8 b vi٢9p(kt~YVNɵjxZ43B5iJ_wN gZ_CjVR*P3D`SwWmwX|MHTO4wj¶ Z+TBewG FW?gS DzV{G FW?qx,>-EW.ڵo)Ɲ8ӂbK:3RsJ*RiCL&T }tTq\UjsZ좵;= w/Rp^VJ2nonRG`,Fz I+UT'&i?tyhyǐs/cP*TZu*RURFk}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ9Yaybk+ Mb+澾gRՠVS+RVghTO ZY97eI3C<˞{qR*ӭ)Ved4___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___ku)ʍZ5j2)]5fv l=Zi)8iRxT:(*2kE%z'W:r JYD(SV2sWNe&\MU\{WMfJnZE6--zQ=ϙ1fW,=tЬܤ⸓NĈ{(%%$ۻ nfVI#J2"zJ,}1pexΈ_&k^܄ܮZXQ&m4];Ͳ#|7HOEʜڪ/^1̓ę7m~FzxjE3֯̒%RQZ$7du$J\dݖ2|[ K 2)[bA1̹3.kM+}*]1}?_FtUX'WWܵG*M%w- 4O;(oV0JQIYسQKFїʻ9uMbfxrc'}r&io2٬rK4f;'w{]>"M]_]i8ߍ(ڽ[,ryj2Q{^<ɕ²9)Md|uk*jMX{Q IJVV]E.'}*qJgIEEyD],TMNM=iJRWZmfw/mݷ#Ug@8z/퟉vdENRKbH-HQbKwb3."l$ Sn2k.q59atIF:MMwQ\윫 E"2re]ϛ'/mՆdOc _oWѝ迶~&V.I$c,+:|d'F֖nUn`$V-Qnwj'U)vkv7bJ.K-Y.JQy}yjS$׹STx)8fygd kԦd٥vл재v&I;~)kѤ*,$Đݕ|6wII"@]sDf^>W:ܑ7|R./M/]H4)$sxjree%ühP2M?#Ө[F2 URT<12(,XV;kH%ѸȆh(8KєtcT㪱i48vvKE+'fOٗ4QVj܉qkf\9ZIve{wPZ2(yE8Ipzu6zkM9p{NiVz_kø8+I_%)ȜYmԜZi8+}*nh>-ػE&GfQj&eVw{xEMϼLV˺/xdKt*˫w}Mvm;?q7u.W3}ggd-)[bJVD<m+HTwrK^g͌߉`!W$W*ᧀBo)/΀p_??$6iAZUS(v LDۓ쯡(9Ǭ/И^q6{2ZV٦8^IFXZeiopjǒIWь*;'yQI 쭺Me,m~򒊺KԻ&xگ:6-*4#[c䪵IKT\8L1P'"%N;(K, HlLcZs, ;, [~^ l_,!~R nWy]7m5rejvzFhRrѤIݦn|_oWѝ MBN]k~GGUZ$okGEF&PƓn{]nԔRQI%ݤH迶~&&խ(}%,CZ긓d9}Yg֎jQBTs?OM rG $NKGd4=KrT&TbiijaI6wwnD+m$Ekk^Um_y^ɽlRIk$cQIvr\r&/˞7uiZ:fj=<_oWѝ 4ԩ%x.M.)#<- j2ҩIYo}gA<>SJ)gnq!Z ]'2thyx\?Fף֜j֒뺕:5*T򥄞j>NJY_K?e[d&{=K#>͓.8}ıلؒ-V[xX׫̰DedHs+cJTGiK4c+g yld罿Crdgb]ZU&7s4&kf67g'kd6KnBVF!K}bqk^Dm<gbe[Q,TV4 R_54~GxlLc[xCWA;Uh!&"AU{^RI!nFDXKwb3rM1rSĂԍWy)ܓUg@9J FYdՓuo?DQZLҎ 1J|S\RtҵE3Rt&6jNeOM\$$F[{mT]f=\R{_ikYW ]%JBܼ컑HgkzX՞BoJw-94oeRyot5\tz;{|Ȟ%LogF"w-/ݹyɨ+]+4,ު˸+v]*vd[Z[N%2}ggIX,WŁXnE M9{Cv!&!lKdwؐU_S0}ggv[_Z.KbɦOb$sxj -q.=I p6*RJ8`=;Hj=anU<ѲVm]o+vŠ7gI;lޗZ -S[n3Zo3[xrr8iɄVċ^2]%5{^ ͷȬ:[bUtWF4Z6Mܖ{_D+\uDf!V6vk&i}̱}?_Ft tVFRugݦCXN5!2WOiԄ3R*I}N9}_>r1NQ'mA+rAI]~zGbHee ksаc!nˑ >L>/΀9N5ݨNk Ƥ#8J2:jTYI/8ϸKbg.R)9d>D-4 x\&WѰyYlTvWk^6YYY$Yvb.D]+_tW௣-j땊U_f۽-;do6Z$hŢvdDIUc'wbJQK2t[MXz%dHxٻxMMEJM4ZJJ-JWZƐw1}6?'K`Pqp_??+tWXMsرYp|`Uq,CXwX/$>DQ kus.d^~H! I|_oWѝsc}gE3<+ueF&2Rʹ[o*oVZm&ެw[rWeU7-~ey;[K܄o_)M2nr.ŵKEfws_6V\yB Z14wHrm7KǸUÄZIxn"n/4ͥJҦR̴M-}̼/ҝ[41}ggWVފPM;]w4*i-S TI]XdF׼*X>/΀p_??앯*Kiɻifȴ]l$ݕ{.n۷"sdӶ&RiVfr![3wYKT[2zo߸qYeGi+[n [eBF[EZ=/ȋp^#v_dڒdE^fie[wzJ姥|KV|6-%'/)e{Ǝ)ɥ*r-Oe3=:擃s+mU&fQ:S8ilH+b% ie,{HlnDL9mwI&pg9F7^CPW7-I$ݼHJ]xjE3^Ee5Ve_D+tBm;;۝[-['+ފ+aM&ܸܙZwnκY,+w~zU;$LE-DekJ͠O[4̛(+Z=vŔyAԖn:{;9Z̲m]7'"ma˧rSYAtk]nzI(̱}?_FtqHӌ[qVej'}ՙ%^Oܱ ]X'I ]X'uI ]XE) eg,1pZ1k,E\(vUzNP&x%W#*,\RR'>/΀p_??뚋g.b6$'m#kZѵ ˗"iz6!B[KKXv k}.Qߕ-9'dEaIEk%ݡ -׍kk!DmU6e-5kq%Y5{dD;;?ddk+MF|"WI_ȼmʸtZYw-лZu}--Y&ԼS4Kc_oWѝ't9F)>ITJkaeKQӵmpG[߬>]'S5ұlLc {U~j頝dz;K>XNBm%4ݸ[6ϋ3RN7h6q*Bl,a4S:vͮuˣfzV:8z/퟉v7kh߁Zz܆K{Rb-Vɟgm{(Ů<6EJ6rR6kERۼ}ޛ2r*ڻnYϭfBWibFyirVލ[\a,wY6E$w}oY4V+ GDzضY(I+pFzwd.-oDkTՑE.|js)sS#Qj/Gdfբe3gVjҝ9vgJ4' ,'NtTr%g)WZ!Vi8BkW=#Uy'=mhE =!b"E:)G'G6"m)+>J3,CJp$j-{>B{nMc%|윽H /{%+q/΀ZqJtٜ\_9(М09Qʤ^Ц ^.5jTZq WM\kUTip'0~Le؉m.V،[YK,lߩ)49dI%kq(JZr+8˭߱*&2K{pk(ֵԌwj_UFYWVjZݷBQ[m#m [%㔈v[TMYBrmkmHTfrӦmrP>Dewi駉%~\dIIs.+hM^8گ:q)}lJ?Cp*U ֌UwcufE^9J4#+x_s~H3GW=""Rm(ȏH?$zE}#+x_s~H3GW="Hٰv;]yoH?$zE}#+x_s~H3GW="IXLZI]K`MI&j>_s~H3GW=";#K[ ֏#6>WTCi%?G`ф«hEx;CPƵVPSIsOC`έ5V˳4ɓ*t.Q 1a{99;nh5UWQ$׷dUU4"cZ+()$չgVJtٚqvɄ:qvI х0sP4c*樒~j V"Z4ڏ|uHׅ,NT|u$'tᨵQܤ*JVieͲpSJo,έZt)ff,\1:}?hNujF)ԛ`*RTi*j]p= + - VmGݾ:k–' *>WHK:ow :F\lpZnROHrbqNXQIի4ڊv8LR)¥7pzgV:JPݳ .T>fZX:#FM0NOHd[ *tj4L}%ZظTiH-RrJ4jT8+2gܹV+kӭJ)-]ɞ؊m*,պ6"\UJj(ʩ~28_g?yۧ%~8uaz-(Ept_o}ʻk:i7,9H*jJ;m~H9*¤OAm/*3"QR7 6qY>b_^lJTMIjL@USiPd֭QjTWC^UKun9xN9+ì6 llB-xU8МYIfWV8|^GSRPikG0abi:k_q>Sg rR~RO;)Q*Ьy5}ωĨXdM{j)aݛTӢRNrljPJTі^9DMR_b04hfkʟFa)39)E?)'ӕhVqjhT|[q2M RX̀*Tisto)'9wjʵ(W*uVhFkˢpiKOY/w*3RxVwۋKҥZ(P5~OJַqyYt⳷v".lU)(ө(Pqz`p}%FxjO^j[qixTZ]% OI^7Z3x]o+<5:>NVvNT՞ %u%7z=OLt T/yo[~(̄R5de|cN,<($kSQa@Mg_VmR;_:O*SXaFN-Yܑ:4F5;Hgy+Dz- PB^O'rRn/8F?-b'T Pdֳ#gy+Dz- PB^O'rRn/8F?-b'T Pdֳ#J5%QZ-P%jʔ\۴e%dͱ#C⪹9h]*JFqWqzo 5yLҖU,:][e=?{8YA"1VSQwUjT%968^ź&#̩9)GW+3j/ZjS=&4GVjUԅn(TItTZHԢiA6W;:rFNO3ջL^:t[2UIVE-FRVL40N*U.O4gw;GQ)eQ˯råyE Z1]SӅL#e5xIuVmENSj-U:MZQv{ù6ۥ) *۔Ujڊ|H;biWb,`*y}~.|FE^Ju<%N5pN. F#ap0IA?)Q-)G {I]j :P"ĺ*Bp3%*t^gWMxiL<-QZNsYTz.<-HԌa+2NlS{WKz<~R+kF+sE`5m/qlWG᱓SO4M Z5jTT'd{x(a#(ІE'vԥnb+*iޢY6- %bg^4Vjҕޫn| j9 e5]XgTo6\:q ъQKFX dTkJ;٣:}(JTex7 j?'fSPBTaIFRK4a*tc oW BޭJ<^WW|T1*3e٧fC0t ŠZlEeZ;V&ũhZե+}186*QjJr} ӅZnHBZ4J]UNz]sWa5!R<Ӈeݫ ,=jR eޖw-5b%^0JW{LL1Z2-5b%^0JW{^|jվЧtN ъI.rIu(J}] 0<>-PwgQaqU S%jϲ'G}|J#N )y[(ɻiJU=jJجJnj3yΪ]WS֪ű]MN+SН+Ў :x,,n&J5(t|aVggZ:]B.Vc,n&joΔ)M$jx7N5sA5r׼++eykks\=/1d\eZUi{KJNZJQH}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}yԧ*5h8ժTԥtՙ2OѩN򳂍:qpmC9ViJTG+$8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___3NTjqU橕J3Ok#HEEXw(u&3sLfݭwZޞfv]&Iދ]_&kw؋z1{i/m%_z~nvٚ'}Ʒds _oWѝpϥpprk|rKދauה'}2KC#𕙇ޱ)8)K."i9;eY8wRSpdJ);~3osg%ͫk4Km]\Fwtq>)򒽖ԗ9' wo ݤ"[mJ~f= nWJ"Rz[pյ3}[3IJm[]wOCԚJ[&Sv˂ m%aܯxmq}?_Ft dtAײ*%%_CF%m! VWމMh๲a%+7?/t/MktE\Iݹ$V _gqCJqǒ˜گ:uB"o Bka+PJ/%<}w* *Spե7uÒ= gg5-oЌ6RM5 Y4a{V2̣~#V U"o;&L"pe,q_fZi^D jfnYM~uKT&4ijNE܊_}VY$߁Ymv2f(ZfݵԳVIZ+N7ۑ2bnV>HMe;s,_oWѝY%ZSOg2G2nfo%^dj[$BW[imy>8|]5k{!/2X7km .?+tB6\$@QZCq|uMv[n3>oqeĀCۙEn)Ⱥi }>6N8,Djk EpmUetḤmɹE6Ȯ.O]w-;m&+ҺЙ)enxRJz3Z6bWE4i[]BYuZs!jŶop&y S,ޥE[]xZ>N7CZ]w(n6/^v+m/.u%+>B[dFRSqO]m[_mTyW[;kldWr~7VkUg@9GCb\6Zn"ۼPon%sI-iYIn7̯k>&8گ:e]Ս;Єg;)YyNЯFԝHbHWi;kܯwpnDd'MTIFZ1jYӖ+#R"_zp['h!hTغdoMt]%8iEcMGWy=6_~)dHSRPNO]^Se;uM;kvW JVUg@ ӝJyiՕ'~Ro0\G|]b)95mZ_b4OMݭZҳm&|Q9 *U.)Y;6׉ 2K*ӗI$e[!=븉Y>TVN]'nQ{8IEG|[<Ku!<|Yg+_2BGhLmN+|Yy7C%Z/n^}ritVMg+)-4ni!unJM2}ggU&-G8ơFU*p%&"T[ZJl[Z tуyNnNI&n2voUɖJ!'t"67d:ܓ"Oq&'.)hN*Ro2mk2S)8'z5'')-nI|%n^c3=:;5uղtK7n:n-4sYތUi<-Lof-%{&-%k]ݬWv2=$/"mit&4La-^[I_Mݶ+i~dNΨ>i4@RwwDm< 6Yt\H`nVԸhԭ\qڢRw5:_^a'%i;xlDVae۶b~fXگ:lLcV䦞đ+[R{.Ei=IFIzí| y%}.Rj:k\k+=n;noI{i+=1yrmx#:JPu,㳾#xQqK4W9Tg'[MR+u,{w\>/΀p_??먓Wjlg%gm lF-([^,W3ڄ\b-v5s׫UkmXk*HExQj]mZ+jDl,;rDI[_%74_+~L]&ӿR+%KRBI__mWexk\I-t"Q㣳)9eE'U!'d]|4{4l=Ug@3\&\$\l6**9SK~ktp_??왔({m>d#n 2{7Ë }s&wM]NUe\}qmwט~M}ЎK^AKi|kMnȎ$S0[IY}Iz^õGik.M $Bl$t'>/΀p_??먛Z;39l}%}+Kj>%\V]"MYk]fI_E)&x]nYJC\Zn3sIsPVp\Z"ӞV"o%QI$w4r--EEVr%ٻ*[| m%w.WܬҩM5*)Ź1Z]vl2/΀h9Щ9Ehy|[ЅJO4_zhʿH@8z/퟉vIR{0ݼHsHeDRSZyokBY{[t9-9$ݭ3ݭV| NB"eKk&[_%g,r#)gQ[uaS:eB3AJJߪ5+-Q-Q-ɉ刎rm$^].mWqRrYuj=]q%;Ug@έEJ"o;-]7Xkk[Z\i).E/~|:Wqi"[egd \fYenBKyk=g'm*+]n(X+;-Xi+iKX2}ʵEFJ6&r9(8?y_~Fq8xVj3WIlS𒛒ۻ'8jJ-7ήkngiiS*e4u_̇2S\[Nnd}Dfbm(S;e uf0N)-o]X8'kFSѶ"Z$%[*Am/:CgVqi>ʥ9MNQQqM%{TʔUkCŁ[eUl-6 7c:RJR"ѧ6)Zگ:VѩU"G4q%WZG>O?V' MFj=́j~V٢~W<_5[>ouQ*lju)ΜbISwwp_??Iԫ%IŮ<ƣ&J%d]-oZR-;߫z;_g3M[\Veɮ{䴶Rʒ uIוgiE[M޶'f?~eMuv墕|x;&Y^ۡNY+W. mI~-1nO^|N6芴ﮚX$*ԜsΦKV Yў/΀&'.͵#}#X*FR7## T(bIH SNjJ)(rPn 47kΣjzr+JtbTkTck*Z:8z/퟉vKK.e,4p!nFDC\V:[E''1xxV|\ELsʌQ8kd!9bQcUg@qPfߑ徑Fky|VI)jG*1q[[s%RIpEu7B7kmhBhMUZu)QHJhy;M匥},z=:y.-NZrD]uJmڵs| VmJ\m+5~!$Z;t2- vmr5ummEer-|nZ;"2nJʛvZku̾s ]]?أźOKhWk)?2.\r4tBMuE[{m#RqRZSmybxje^qFI+1riqI89hSQ6JJx{#:q'QO߫;p MFj=̀0(V+Bgh¥*VthlLcZDMĽZ^ՓkB4ԯ }+]ǵÐӊ[,o++nV5(^ -%\GeiD7\SEBwѯp]E[27~Bi&d;/=Ɋ/΀UTjTc&Ã5ciT 73qWBynI%Z8f*[Qs|M562a=% DfɊϗ?Nv|rf7˚"]Wku~XFCݷm5i&N*'w9BWRn-Jϓ[vj{"vI.d]^ɬ16ߋ"VӉd춵r"R-5weV)$̵գv$xiZ۾ĥŭ/f$ջbxjU$Ԓiyw,6 RɞR MnPaJ9ngQQ%k O ^W%؜4\0ԡ%iF 5c`ggtC~/LvY%[ ]ر _r.++ecrStulBzj2Sji$iGj7T`ӒJؐBiۄH0e0q+crK_;;X^IZ.گ:iI5$z4f"K agCDedF&1X|,n[F1TbbIZŁI,)[Ks͡WJӛyXeUJidmʯggg8)'+4Z_7MTM--+$wȋ~lٵk{v!n"{_}$W IM־%Gȕ{Q]JuIY.obTETK*'xOU%M?3_Gy k$sIeÙ1wMYt$gWYlR9.KIu5/΀sRɫ'k8*je\hbzYk;ggx[2y}7xb4߂ۼ|D-4Wq=nkO[%/2w\z/xkؔWn̹Qh5R$ 1}?_Ft3eMY;^ϙYVTK-(C:E'M+_0tp,Ѓ4PBk)wPgguvo{oI$$N2辤\zd4׶(.)74*W%=u禶"Y۵2twŬ&e%oYi_bh%Bo+{nKqQJϸںZp'.XkWh=6Mo~vL5RV[&Q[D8i63r'<"iA *hnM-w1}gg_mձVz܍kψ￿{k%a|}NU{!H;깖+[vV%$.dm^%WD%ȋE9}?_Ft&84މN8J׌RvF=:-%5Y}Iޮ񰒽fg-oإ޺x"UޭŗRom!j-"]Fqvn[칓%dM+s(+Ts5ei+){ h#i%kqdr=mZVw̄tih] v+gQ7ؘRcge|Ik&[4+yf$Kg3U4Nzfq%*VojwCWVeZz(Y I5P-wI b-E VDur%v읉Z}Gk!;a3UR4ۣMT.YSC>rq9,&wIdR6E+Ynm[l4npeIf" Y棪m]ɽӾiiܙK쟸̞[t~H+{+< WfܙJ9igy✓nUE b:L[(j+k߽wó[-MY5kbxjE3Y&w!v˙݋-ձ)\W2Ee9Rǃs]n-I[jKr%ceK1؈Gx\ĸsNje/΀p_??n6[9۳DwːKK۸W!B!D+/΀p_??읭n7m~>FWO=ȋ'~x6t읭[+miue{[DZ.d8Rn,\SMjY+4컶ؙ5ۿ|J-\cFZ<*yi 9fZ7jm̪]Y-zÃ}x8zZĪJZ9IǓzkɾ7߀&Fֳ1}=LfR%sJu!V938@ggܖNlR˗4F;+j_q(^B)R44onnNE:+-dYFt,~x'fZRqnZ|BN2\uKIK vѿxG#7%pUg@8z/퟉vIfZ;w'%v _^Y|2,ދk"o()Y&4_]xiˮDIunNvkב7v6eP_٧T_EZr&VͨbYnוĒjIe]YJZ+nTDuoН~\[wkLkYE' F)s"5mL+q/΀u7B7kmhBhMUZu)QHJhy;M匥},z=;[*v$ +vVJ-dx/#Ns;x ߋ٢SOfD| *Q4~:qyK$dJMiE&y7yqѫw$V]hIh٥O v'z-}.FEϋ35*tB;ck>y_1]'(b&m;'Z ͶfS]i=ZSSz]qVеT~(z4̭w~/nx%V(uVZ ҿĎ6|6`IIx iŕ,Vwq~$AI'm7;w. 5{VoinWIfׂA۸B\%\KG+Nd2Jp'U{6Wu۶}L}?_Ft NYa)(Y^vyHỤO,NϖFͫI^!eup_??jEk%v܍e܉"HW܎Y{rZ5mX9'SvM.XuNhBfwx+'ho獡Eo}֜\i/} =Bw`|_oWѝsaiK-LE(prW4Rc84迶~&4QwRm%*̝KMZ7hUu}JƢDⴌZomvwρ%u.-/wh~WE4mk+)M4N\ RYFm'n*6jQINjZܘZ{ܝTksmu~V*ѲzÌ{OC#QI=%5vwViϻٴ|5׈U%vɻY]g)F?s[Zn YE8c3 J77YZ_\^52Z y,oksSD5!],D}p%lt-Ż\Z[BWb]ES v+r 5 ]X'}!d*rJҒjif ۵-rE>/΀u7B7kmhBhMUZu)QHJhy;M匥},z=:6K&lV munkF3v h։E+WU&(7$RѴb!EWCKoDbr{,[]:iklJ_^iJmuY.-wgvȲZc:z%̳c)Wr3vZO{jq۾䤔u^ lJqZ=ó[$m6- '^}?_Ft NJsWvW8Lդr1lUW3r֞usa?H!l#*㯉`Uv vZ8C||ߏв=ICW܎z[c*1u3{4ӓhSXE;]j`/΀zFJH[fSVkSiNtr._'uƻI0teA%y]G2e_w>%^[ۛ&*˪Ax]ՈʮO;g-'Z pU)]ER3qf]WOWwZknODVMI^eytj&/ȝ2+_3^Z譭IZp+8]M;ЉZ1jZ{CoI[5߇"{QZjh{iݟ#UUg@O ne'V}k5R]%tsa?~ZMB,֋YpL$5_[~mnگrSVrWo^VCwWT;=w}@"JMN knlK$ob|BVVFگ:ZRM5tia)F-)]GhEj~IKXE6_LkUTip'0~Le؉qЪSm]mĖg*-%E/2%*;ei괹{<Ͷī~Ҍj7h=eV׶k٧Ɍ5ҷ6D'v{%$|YFVjԌLT▜,2IHQvV#$Ɍ%{bm;IĴ{gTںp2I?~:)Yzj,_oWѝsc}g*FTrN15l}%T~oiA6.X,DbnK E4Pi1F(Ɣ/7nlε(֣:RYۼbV,ʵVP~չPTc:榚^_jFcZU|O{}M@:~VqZ4ݧ%$.lZB5trQ֩O o'e>J|8IN1KW-('*zI&RRK}W:ʍ.W)(i 5 BN33%JhQVse̢FxZeNQoTҾ'Rq́p;@1zPvSX4k(Rn؜^&8hErQc ciQEѪ'$^&^yL+Zt0r:|NRU!ֱ4dbݒWl,V*th9:ZPrsOM֟8\ThuiIEEwL&&8IJqeY*F9TbqJtUiBnIvԜiSIF)N\4ШҍG$ٵҶ2qРԊRYEE=|MphH[DpԼNMo&Hʎ2rנԒne%$q5ba7k%odcK7FЕDe%+nUʥH7/(R\M&gbqtp֚{w9ӭ.u{^+,2RnтݕZZV 3wMsLO'is-k{wWD4pPyڕK]BjLF.T*4h\s4؆:Uӥ<RN9.v^h ^OORs}t#PmJi('LpЋqsy3<>.U+:55rK2g`t\i┚Ry_OC)_Dܚ]L!^#8yps˃O4)6ZLuONr}ǠR otaJjExT]"NU]+NWkr| N+R6 yZ%u$r=P8zWO_21yI+e SӍ=gzC?nV}0qRPI @8:/LMҍJ8UaYשOYfrʢey04TnZvӧ+{NtmgP-N>78DZR}ɾ_tSm?)8([F0RY`ԟ%m'T1Ro$c8VӇ3XYGEs]b%n@IrDoݣuONr}Fja(.ٓ媱S`wN-Mmm1©Q^:4q;p_JEiJ7gH3Jg/Dʰ]W3IbTu=e$6A7{y [zxF[$k/;GN)o*pq% TNaI&^*`ja MjR(Tԓ@8:Kۯ;HsˏNT5g)IۖH># G*y'4y5M+(qrRRe8Qha(C*kɽHԌ$#NY|/0BC].*jO%nN G Ӌ.ԥ&5UW*z͗3~vRNyI9˽Rji뙳: 5 Ӄ̕M]؊RSps(K#8(A(*.24wYGIG+wDhSiՌm:);m>Fy|(^1J8T8FhӡIS-4VM5tLj5HSwfmG=R^JmKʗG3%*RmG2،D+f]hmJ(Ӎ:qQUFε*uJXB[eʜ^f)9;ry#RY*II|FFճNNNܵ3FNRpk3dF)$\ M4fQ҆(ڞW{<NVvNT՞ %u%7z=OLt T/yo[~(̄R5de|cN,<($kSQa@Mg_VmR;_:O*SXaFN-Yܑ:4F5;Hgy+Dz- PB^O'rRn/8F?-b'T Pdֳ#gy+Dz- PB^O'rRn/8F?-b'T Pdֳ# endstream endobj 9 0 obj 36787 endobj 10 0 obj /DeviceGray endobj 11 0 obj << /Filter [ /DCTDecode ] /Width 106 /Height 106 /ColorSpace 10 0 R /BitsPerComponent 8 /Length 12 0 R >> stream JFIF++C  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ| jj-!1QA"a2qRr#3?8B–^$j Z%sźupnxʺE#&d_R[j- w[4Fsg>xa\Znt+4fԓ%{^J}]hoW%mMOO܎<"U ;lI;iUg [kV]YU8t%y^Tm&s{Kgri/lo2&ؚ f&ک5OUiMWIֻrV 6ֵ_1M6ܛ&nME7niw my40)_,H9k[˦4.ֹmVƅ_U[o>i(8ѓ)/eG`f_U{A +WF|&vZft\ٸ9)\9֍6.k_h{x&.'n)KM;`Utٙ> endobj 16 0 obj 905 endobj 17 0 obj << /Title (lqdxmpl2B.pdf) /CreationDate (D:20120603155857) /ModDate (D:20120603155857) /Producer (ImageMagick 6.5.7-8 2012-04-30 Q16 http://www.imagemagick.org) >> endobj xref 0 18 0000000000 65535 f 0000000010 00000 n 0000000059 00000 n 0000000118 00000 n 0000000316 00000 n 0000000407 00000 n 0000000425 00000 n 0000000463 00000 n 0000000484 00000 n 0000037451 00000 n 0000037472 00000 n 0000037500 00000 n 0000038545 00000 n 0000038565 00000 n 0000038581 00000 n 0000038601 00000 n 0000038623 00000 n 0000038643 00000 n trailer << /Size 18 /Info 17 0 R /Root 1 0 R >> startxref 38823 %%EOF rgenoud/inst/doc/rgenoud.R0000644000176200001440000001317313421760172015235 0ustar liggesusers### R code from vignette source 'rgenoud.Rnw' ################################################### ### code chunk number 1: rgenoud.Rnw:488-495 ################################################### claw <- function(xx) { x <- xx[1] y <- (0.46*(dnorm(x,-1.0,2.0/3.0) + dnorm(x,1.0,2.0/3.0)) + (1.0/300.0)*(dnorm(x,-0.5,.01) + dnorm(x,-1.0,.01) + dnorm(x,-1.5,.01)) + (7.0/300.0)*(dnorm(x,0.5,.07) + dnorm(x,1.0,.07) + dnorm(x,1.5,.07))) return(y) } ################################################### ### code chunk number 2: rgenoud.Rnw:498-500 ################################################### library("rgenoud") claw1 <- genoud(claw, nvars=1, max=TRUE, pop.size=3000) ################################################### ### code chunk number 3: rgenoud.Rnw:855-877 (eval = FALSE) ################################################### ## source("supplemental.R") ## gradcheck <- rep(TRUE,23) ## gradcheck[6:7] <- FALSE ## sizeset <- c(5000,10000) ## genset <- c(30,100) ## nreps <- 50 ## gsarray <- array(NA, dim=c(length(sizeset), length(genset), 23, nreps)) ## asc <- function(x) { as.character(x) } ## dimnames(gsarray) <- list(asc(sizeset), asc(genset), NULL, NULL); ## for (gsize in sizeset) { ## for (ngens in genset) { ## for (i in 1:23) { ## for (j in 1:nreps) { ## gsarray[as.character(gsize), as.character(ngens),i,j] <- ## genoud(testfuncs[[i]], nvars=testNparms[i], pop.size=gsize, ## max.gen=ngens, hard.gen=TRUE, Domains=testbounds[[i]], ## solution.tol=1e-6, boundary=1, gradient.check=gradcheck[i], ## print=0)$value ## } ## } ## } ## } ################################################### ### code chunk number 4: rgenoud.Rnw:1020-1027 (eval = FALSE) ################################################### ## LQDxmpl <- function(b) { ## logistic <- function(x) { 1/(1+exp(-x)) } ## sIQR <- function(y, yhat, n) { ## IQR((y-yhat)/sqrt(yhat*(n-yhat)), na.rm=TRUE) ## } ## sIQR(y, m*logistic(x %*% b), m) ## } ################################################### ### code chunk number 5: rgenoud.Rnw:1032-1038 (eval = FALSE) ################################################### ## m <- 100 ## x <- cbind(1,rnorm(1000),rnorm(1000)) ## b1 <- c(.5, 1, -1) ## b2 <- c(0, -1, 1) ## logistic <- function(x) { 1/(1+exp(-x)) } ## y <- rbinom(1000, m, logistic(c(x[1:900,] %*% b1, x[901:1000,] %*% b2))) ################################################### ### code chunk number 6: rgenoud.Rnw:1047-1048 (eval = FALSE) ################################################### ## summary(glm1 <- glm(cbind(y,m-y) ~ x[,2] + x[,3], family="binomial")) ################################################### ### code chunk number 7: rgenoud.Rnw:1070-1073 (eval = FALSE) ################################################### ## suby <- y[1:900] ## subx <- x[1:900,] ## summary(glm2 <- glm(cbind(suby,m-suby) ~ subx[,2] + subx[,3], family="binomial")) ################################################### ### code chunk number 8: rgenoud.Rnw:1115-1132 (eval = FALSE) ################################################### ## dLQDxmpl <- function(b) { ## eps <- 1e-10 ## logistic <- function(x) { 1/(1+exp(-x)) } ## sIQR <- function(y, yhat, n) { ## IQR((y-yhat)/sqrt(yhat*(n-yhat)), na.rm=TRUE) ## } ## dsIQR <- vector() ## for (i in 1:length(b)) { ## beps <- b ## beps[i] <- b[i]+eps ## dsIQR <- ## c(dsIQR, ## (sIQR(y, m*logistic(x %*% beps), m)- ## sIQR(y, m*logistic(x %*% b), m))/eps) ## } ## return(dsIQR) ## } ################################################### ### code chunk number 9: rgenoud.Rnw:1136-1151 (eval = FALSE) ################################################### ## blen <- 3 ## lenbseq <- length(bseq <- seq(-2,2,length=200)) ## bseq3 <- seq(-1.2,-.9,length=200) ## bseq2 <- seq(.89,1.1,length=200) ## IQRarr <- IQRarrA <- array(NA, dim=c((1+blen), lenbseq, lenbseq)) ## dimnames(IQRarrA) <- list(NULL, as.character(bseq), as.character(bseq)) ## dimnames(IQRarr) <- list(NULL, as.character(bseq2), as.character(bseq3)) ## for (i in 1:lenbseq) { ## for (j in 1:lenbseq) { ## IQRarrA[1,i,j] <- LQDxmpl(c(.5, bseq[i], bseq[j])) ## IQRarrA[-1,i,j] <- dLQDxmpl(c(.5, bseq[i], bseq[j])) ## IQRarr[1,i,j] <- LQDxmpl(c(.5, bseq2[i], bseq3[j])) ## IQRarr[-1,i,j] <- dLQDxmpl(c(.5, bseq2[i], bseq3[j])) ## } ## } ################################################### ### code chunk number 10: rgenoud.Rnw:1154-1165 (eval = FALSE) ################################################### ## par(mfrow=c(2,2), lwd=.1) ## contour(bseq,bseq, IQRarrA[1,,], main="IQR", xlab="b[2]", ylab="b[3]") ## contour(bseq,bseq, IQRarrA[3,,], main="partial derivative w/r/t b[2]", ## xlab="b[2]", ylab="b[3]") ## loc2 <- (150:160)-5 ## loc3 <- (40:50)+5 ## contour(bseq[loc2],bseq[loc3], IQRarrA[3,loc2,loc3], ## main="partial derivative w/r/t b[2]", ## xlab="b[2]", ylab="b[3]") ## contour(bseq2,bseq3, IQRarr[3,,], main="partial derivative w/r/t b[2]", ## xlab="b[2]", ylab="b[3]") ################################################### ### code chunk number 11: rgenoud.Rnw:1221-1224 (eval = FALSE) ################################################### ## LQD1 <- ## genoud(LQDxmpl, nvars=3, max=FALSE, pop.size=2000, max.generations=300, ## wait.generations=100, gradient.check=FALSE, print=1) ################################################### ### code chunk number 12: rgenoud.Rnw:1292-1295 (eval = FALSE) ################################################### ## LQD1 <- ## genoud(LQDxmpl, nvars=3, max=FALSE, pop.size=10000, max.generations=1000, ## wait.generations=300, gradient.check=FALSE, print=1) rgenoud/inst/doc/rgenoud.bib0000644000176200001440000017213713171743040015573 0ustar liggesusers@string{aer = "American Economic Review"} @string{ajps= "American Journal of Political Science"} @string(apq = "American Politics Quarterly") @string{apsr= "American Political Science Review"} @string{ams = "Annals of Mathematical Statistics"} @string{aos = "Annals of Statistics"} @string{bjps= "British Journal of Political Science"} @string{ec = "Econometrica"} @string{ier = "International Economic Review"} @string{jasa= "Journal of the American Statistical Association"} @string{je = "Journal of Econometrics"} @string{jel = "Journal of Economic Literature"} @string{jep = "Journal of Economic Perspectives"} @string{jet = "Journal of Economic Theory"} @string{jmcb= "Journal of Money, Credit, and Banking"} @string{jme = "Journal of Monetary Economics"} @string{jpe = "Journal of Political Economy"} @string{jop = "Journal of Politics"} @string{jrsa= "Journal of the Royal Statistical Society, Series A"} @string{jrssb= "Journal of the Royal Statistical Society, Series B"} @string{lsq = "Legislative Studies Quarterly"} @string{pa = "Political Analysis"} @string{pm = "Political Methodology"} @string{pop = "Perspectives on Politics"} @string{ps = "PS: Political Science and Politics"} @string{qje = "Quarterly Journal of Economics"} @string{c-h = "Chapman \& Hall"} @string{cup = "Cambridge University Press"} @string{cornell.up = "Cornell University Press"} @string{hup = "Harvard University Press"} @string{mit = "MIT Press"} @string(pup = {Princeton University Press}) @string{s-v = "Springer-Verlag"} @string(sup = "Stanford University Press") @string{ucp = "University of California Press"} @string{uchp = "University of Chicago Press"} @string{ump = "University of Michigan Press"} @string{yup = "Yale University Press"} @string{cq = "Congressional Quarterly"} @string{aa = "Ann Arbor"} @string{berk= "Berkeley"} @string{bos = "Boston"} @string{cam = "Cambridge, MA"} @string{camUK = "Cambridge, UK"} @string{chic= "Chicago"} @string{dc = "Washington, D.C."} @string{nh = "New Haven"} @string{nj = "New Jersey"} @string{ny = "New York"} @string{sf = "San Francisco"} @string{st = "Stanford"} @article( abadie2002, author= {Abadie, Alberto}, title= {Bootstrap Tests for Distributional Treatment Effect in Instrumental Variable Models}, journal= jasa, volume=97, number=457, pages= {284--292}, year= 2002 ) @article( AbadieGardeazabal2003, author= {Abadie, Alberto and Javier Gardeazabal}, title= {The Economic Costs of Conflict: a Case-Control Study for the Basque Country}, journal= aer, volume=92, number=1, year= 2003 ) @article( AbadieImbens_largesample, author= {Abadie, Alberto and Guido Imbens}, title= {Large Sample Properties of Matching Estimators for Average Treatment Effects}, journal= ec, year= "forthcoming" ) @Article{Abadie+Diamond+Hainmueller:2011, author = {Alberto Abadie and Alexis Diamond and Jens Hainmueller}, title = {\pkg{Synth}: An \proglang{R} Package for Synthetic Control Methods in Comparative Case Studies}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @book( adams1805, author= {Adams, John}, title= {Discourses on Davila: A Series of Papers on Political History}, publisher= {Da Capo Press}, address= {New York}, year= {1973 [1805]} ) @book( alesina1995, author= {Alesina, Alberto and Howard Rosenthal}, title= {Partisan Politics, Divided Government, and the Economy}, publisher= cup, address= ny, year= 1995 ) @article( alesina1989, author= {Alesina, Alberto and Howard Rosenthal}, title= {Partisan Cycles in {C}ongressional Elections and the Macroeconomy}, journal= apsr, volume=83, pages= {373-398}, year= 1989 ) @article( AlesinaLondregan1993, author= {Alesina, Alberto and John Londregan and Howard Rosenthal}, title= {A Model of the Political Economy of the United States}, journal= apsr, volume=87, number= 1, pages= {12--33}, year= 1993 ) @book( AltmanGillMcDonald2003, author= {Altman, Micah and Jeff Gill and Michael McDonald}, title= {Numerical Issues in Statistical Computing for the Social Scientist}, publisher= {John Wiley and Sons}, address= {New York}, year= 2003 ) @book( alvarez1997, author= {Alvarez, R. Michael}, title= {Information and Elections}, publisher= {University of Michigan Press}, address= {Ann-Arbor}, year= 1997 ) @book( AlvarezBrehm2002, author= {Alvarez, R. Michael and John Brehm}, title= {Hard Choices, Easy Answers: Values, Information, and American Public Opinion}, publisher= pup, address= nj, year= 2002 ) @article( AlvarezBrehm1998, author= {Alvarez, R. Michael and John Brehm}, title= {Speaking in Two Voices: American Equivocation about the Internal Revenue Service}, journal= ajps, volume=42, number= 2, pages= {418--452}, year= 1998 ) @article( AlvarezBrehm1997, author= {Alvarez, R. Michael and John Brehm}, title= {Are Americans Ambivalent Toward Racial Policies?}, journal= ajps, volume=41, pages= {345--374}, year= 1997 ) @article( AlvarezBrehm1995, author= {Alvarez, R. Michael and John Brehm}, title= {American Ambivalence Toward Abortion Policy: A Heteroskedastic Probit Method for Assessing Conflicting Values}, journal= ajps, volume=39, pages= {1055--1082}, year= 1995 ) @book( althaus2003, author= {Althaus, Scott L.}, title= {Collective Preferences in Democratic Politics: Opinion Surveys and the Will of the People}, publisher= cup, address= ny, year= 2003 ) @article( althaus1998, author= {Althaus, Scott L.}, title= {Information Effects in Collective Preferences}, journal= apsr, volume=92, number= 3, pages= {545--558}, year= 1998 ) @article( AldrichMcKelvey1977, author= {Aldrich, John H. and Richard D. McKelvey}, title= {A Method of Scaling with Applications to the 1968 and 1972 Presidential Elections}, journal= apsr, volume=71, number=1, pages= {111--130}, year= 1977 ) @book( amemiya1985, author= {Amemiya, Takeshi}, title= {Advanced Econometrics}, publisher= hup, address={Cambridge, MA}, year= {1985} ) @article( atkinson86, author= {Atkinson, A. C.}, title= {Masking Unmasked}, journal= {Biometrika}, volume=73, pages= {533--541}, year= 1986, month= {Dec.} ) @article( austen-smith1996, author= {Austen-Smith, David and Jeffrey S. Banks}, title= {Information Aggregation, Rationality, and the Condorcet Jury Theorem}, journal= apsr, volume=90, pages= {34--45}, year= 1996 ) @unpublished( bartels2003, author= {Bartels, Larry M.}, title= {Homer Gets a Tax Cut: Inequality and Public Policy in the American Mind}, note= {Annual Meeting of the American Political Science Association, Philadelphia, August}, year= 2003 ) @article( bartels1999, author= {Bartels, Larry M.}, title= {Panel Effects in the National Election Studies}, journal= pa, volume=8, number= 1, year= 1999 ) @article( bartels1996b, author= {Bartels, Larry M.}, title= {Uninformed Votes: Information Effects in Presidential Elections}, journal= ajps, volume=40, number= 1, pages= {194--230}, year= 1996 ) @article( bartels1986, author= {Bartels, Larry M.}, title= "Issue Voting Under Uncertainty: An Empirical Test", journal= ajps, volume=30, number= 4, pages= {709--728}, year= 1986 ) @unpublished( battistin2004, author= {Battistin, Erich and Andrew Chesher}, title= {Measurement Error Bias and Propensity Score Methods}, year= 2004, note= "Working Paper" ) @article( bennett1988, author= {Bennett, Stephen Earl}, title= {Know-nothings' Revisited: The Meaning of Political Ignorance Today}, journal= {Social Science Quarterly}, volume=69, pages= {476--490}, year= 1988 ) @article( berg1993, author= {Berg, Sven}, title= {Condorcet's Jury Theorem, Dependency Among Jurors}, journal= {Social Choice and Welfare}, volume=10, pages= {87--95}, year= 1993 ) @book( berelson1954, author= {Berelson, Bernard R. and Paul F. Lazarsfeld and William N. McPhee}, title= {Voting: A Study of Opinion Formation in a Presidential Campaign}, publisher= uchp, address= chic, year= 1954 ) @article( BertsimasTsitsiklis1993, author= {Bertsimas, Dimitris and John Tsitsiklis}, title= {Simulated Annealing}, journal= "Statistical Science", volume=8, number=1, pages= {10--15}, year= 1993 ) @book( billingsley1986, author= {Billingsley, Patrick}, title= {Probability and Measure}, publisher= "Wiley", address= "New York", year= 1986 ) @book( bollen1989, author= {Bollen, Kenneth A.}, title= {Structural Equations with Latent Variables}, publisher= "Wiley", address={New York}, year= {1989} ) @unpublished( BowersHansen2005, author= {Bowers, Jake and Ben Hansen}, title= {Attributing Effects to a Get-Out-The-Vote Campaign Using Full Matching and Randomization Inference}, note= "Working Paper", year= 2005 ) @article(braumoeller2003, author= {Braumoeller, Bear F.}, title= {Causal Complexity and the Study of Politics}, journal= pa, volume=11, number=3, pages= {209-233}, year= 2003 ) @Manual{BraumoellerGoodrichKline2006, author = {Braumoeller, Bear F. and Ben Goodrich and Jacob Kline}, title = {\pkg{Boolean}: Boolean Binary Response Models}, note = {\proglang{R}~package version~2.0-2}, url = {http://polisci.osu.edu/faculty/braumoeller/custom/Booleanbatch.html}, year = {2010}, } @article( BrunellNiNardo2004, author= {Brunell, Thomas L. and John DiNardo}, title= {A Propensity Score Reweighting Approach to Estimating the Partisan Effects of Full Turnout in American Presidential Elections}, journal= pa, volume=12, number=1, pages= {28--45}, year= 2004 ) @book( bryce1888, author= {Bryce, James}, title= {The American Commonwealth}, publisher= {Liberty Fund}, address= {Indianapolis}, year= "1995 [1888]" ) @article( bunce2000, author= {Bunce, Valerie}, title= {Comparative Democratization: Big and Bounded Generalizations}, journal= {Comparative Political Studies}, volume=33, number={6/7}, pages= {703--724}, year= 2000 ) @incollection( camp2004, author= {Camp, Ai Roderic}, title= {Citizen Attitudes toward Democracy and Vicente Fox's Victory in 2000}, booktitle= {Mexico's Pivotal Democratic Election}, editor= {Jorge I. Dom\'{i}nguez and Chappell Lawson}, publisher= sup, address= "Stanford", pages= {25--46}, year= 2004 ) @book( campbell1960, author= {Campbell, Angus and Philip E. Converse and Warren E. Miller and Donald E. Stokes}, title= {The {A}merican Voter}, publisher= {John Wiley \& Sons}, address= ny, year= 1960 ) @article( CantoniRonchetti2001, author= {Cantoni, Eva and Elvezio Ronchetti}, title= {Robust Inference for Generalized Linear Models}, journal= jasa, volume=96, pages= {1022--1030}, year= 2001 ) @article( CarrollPederson1993, author= {Carroll, R. J. and Pederson, Shane}, title= {On Robustness in the Logistic Regression Model}, journal= jrssb, volume=84, number= 3, pages= {693--706}, year= 1993 ) @article{ cerny1985, author = "Cerny, V.", title = "Thermodynamical Approach to the Traveling Salesman Problem: An Efficient Simulation Algorithm", journal = "Journal of Optimization Theory and Applications", number = "1", volume = "45", pages = "41--51", year = "1985" } @article( ChristakisIwashyna2003, author= {Christakis, Nicholas A. and Iwashyna, Theodore I.}, title= "The Health Impact of Health Care on Families: A matched cohort study of hospice use by decedents and mortality outcomes in surviving, widowed spouses.", journal= "Social Science \& Medicine", volume=57, number=3, pages= {465--475}, year= 2003 ) @article( CochranRubin1973, author= {Cochran, William G. and Donald B. Rubin}, title= "Controlling Bias in Observational Studies: A Review", journal= {Sankhya, $\mathrm{Ser.\ A}$}, volume=35, pages= {417--446}, year= 1973 ) @book( collier_christopher1971, author= {Collier, Christopher}, title= {Roger Sherman's Connecticut: Yankee Politics and the American Revolution}, publisher= "Wesleyan University Press", address= "Middletown, Conn.", year= 1971 ) @book( conover1971, author= {Conover, William J.}, title= {Practical Nonparametric Statistics}, publisher= {John Wiley \& Sons}, address= {New York}, year= {1971} ) @incollection( converse1964, author= {Converse, Phillip}, title= {The Nature of Belief Systems in Mass Publics}, booktitle= {Ideology and Discontent}, editor= {David Apter}, publisher= {Free Press}, address= ny, pages= {240--268}, year= 1964 ) @article( cornfield1959, author= {Cornfield, J. and W. Haenszel and E. Hammond and A. Lilienfeld and M. Shimkin and E. Wynder}, title= {Smoking and lunch cancer: Recent evidence and a discussion of some questions}, journal= {Journal of the National Cancer Institute}, volume=22, pages= {173--203}, year= 1959 ) @article( copas1988, author= {Copas, J. B.}, title= {Binary Regression Models for Contaminated Data}, journal= jrssb, volume=50, number= 2, pages= {225--265}, year= 1988 ) @book( cox1958, author= {Cox, David R.}, title= {Planning of Experiments}, publisher= "Wiley", address= ny, year= 1958 ) @book( davis1991, editor= {Davis, Lawrence}, title= {Handbook of Genetic Algorithms}, publisher= {Van Nostrand Reinhold}, address= {New York}, year= {1991} ) @article( dawid1979, author= {Dawid, A. Phillip}, title= {Conditional Independence in Statistical Theory}, journal= jrssb, volume=41, pages= {1--31}, number= 1, year= 1979 ) @incollection( dejong1993, author= {De Jong, Kenneth A.}, title= {Genetic Algorithms Are Not Function Optimizers}, booktitle= {Foundations of Genetic Algorithms 2}, editor= {L.~Darrell Whitley}, publisher= {Morgan Kaufmann}, address= {San Mateo, CA}, year= 1993 ) @Article{Dehejia2005, author = {Rajeev Dehejia}, title = {Practical Propensity Score Matching: A Reply to Smith and Todd}, journal = {Journal of Econometrics}, year = {2005}, volume = {125}, number="1--2", pages = {355--364}, } @Article{DehejiaWahba2002, author = {Rajeev H. Dehejia and Sadek Wahba}, title = {Propensity Score Matching Methods for Nonexperimental Causal Studies}, journal = {Review of Economics and Statistics}, year = {2002}, volume = {84}, number = {1}, pages = {151--161}, month = {February}, } @article( DehejiaWahba1999, author= {Dehejia, Rajeev and Sadek Wahba}, title= {Causal Effects in Non-Experimental Studies: Re-Evaluating the Evaluation of Training Programs}, journal= jasa, volume=94, number= 448, pages= {1053--1062}, year= 1999 ) @unpublished( DehejiaWahba1997, author= {Dehejia, Rajeev and Sadek Wahba}, title= {Causal Effects in Non-Experimental Studies: Re-Evaluating the Evaluation of Training Programs}, note= {Rejeev Dehejia, \textit{Econometric Methods for Program Evaluation}. Ph.D. Dissertation, Harvard University, Chapter 1}, year= 1997 ) @book( delli1996, author= {Delli Carpini, X. Michael and Scott Keeter}, title= {What Americans Know about Politics and Why It Matters}, publisher= {Yale University Press}, address= {New Haven}, year= 1996 ) @article( delli1993, author= {Delli Carpini, X. Michael and Scott Keeter}, title= {Measuring Political Knowledge: Putting First Things First}, journal= ajps, volume=37, number = 4, pages= {1179-1206}, year= 1993 ) @Manual{DiceOptim, author = {Ginsbourger, D. and O. Roustant}, title = {\pkg{DiceOptim}: Kriging-based optimization for computer experiments}, note = {\proglang{R}~package version~1.0}, url = {http://cran.r-project.org/package=DiceOptim}, year = {2010}, } @article( DipreteEngelhardt2004, author= {Diprete, Thomas A. and Henriette Engelhardt}, title= {Estimating Causal Effects With Matching Methods in the Presence and Absence of Bias Cancellation}, journal= "Sociological Methods \& Research", volume=32, number=4, pages= "501--528", year= "2004", ) @incollection( dominguez2004, author= {Dom\'{i}nguez, I. Jorge}, title= {Why and How Did Mexico's 2000 Presidential Election Campaign Matter?}, booktitle= {Mexico's Pivotal Democratic Election}, editor= {Jorge I. Dom\'{i}nguez and Chappell Lawson}, publisher= sup, address= "Stanford", pages= {321--344}, year= 2004 ) @article( drake1993, author= {Drake, Christiana}, title= {Effects of Misspecification of the Propensity Score on Estimators of Treatment Effect}, journal= {Biometrics}, volume=49, number= 4, pages= {1231--1236}, year= 1993 ) @article( DrukkerWiggins2004, author= {Drukker, David M. and Vince Wiggins}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Comment}, journal= aer, volume=94, number=1, pages= {397--399}, year= 2004 ) @book( EfronTibshirani1994, author= {Efron, Bradely and Robert J. Tibshirani}, title= {An Introduction to the Bootstrap}, publisher= {Chapman \& Hall}, address= {New York}, year= {1994} ) @article( EpsteinHoKing2005, author= {Epstein, Lee and Daniel E. Ho and Gary King and Jeffrey A. Segal}, title= {The Supreme Court During Crisis: How War Affects only Non-War Cases}, journal= "New York University Law Review", volume=80, number=1, pages= "1--116", year= "2005", ) @article( erikson1988, author= {Erikson, Robert S.}, title= {The Puzzle of Midterm Loss}, journal= jop, volume=50, number = 4, pages= {1012--1029}, year= 1988 ) @book( FahrmeirTutz1994, author= {Fahrmeir, Ludwig and Gerhard Tutz}, title= {Multivariate Statistical Modeling Based on Generalized Linear Models}, publisher= "Springer-Verlag", address= "New York", year= 1994 ) @book( fechner1860, author= {Fechner, Gustav Theodor}, title= {Elements of psychophysics, Vol 1.}, note = {Translated by Helmut E. Adler and edited by D.H. Howes and E.G. Boring}, publisher= {Rinehart \& Winston}, address= ny, year= "1966 [1860]" ) @book( feller1970, author= {Feller, William}, title= {An Introduction to Probability Theory and Its Applications}, publisher= "Wiley", address= "New York", note= "Vol.\ 1, 3d ed., revised printing", year= 1970 ) @article( FilhoTreleavenAlippi1994, author= {Filho, Jose L. Ribeiro, Philip C. Treleaven and Cesare Alippi}, title= {Genetic Algorithm Programming Environments}, journal= {Computer}, volume=27, pages= {28--43}, year= 1994 ) @book( fiorina1996, author= {Fiorina, Morris P.}, title= {Divided Government}, publisher= {Allyn \& Bacon}, address= "Boston", edition= "2nd", year= 1992 ) @book( fisher1935, author= {Fisher, Ronald A.}, title= {Design of Experiments}, publisher= {Hafner}, address= {New York}, year= {1935} ) @book( fishkin1997, author= {James S. Fishkin}, title= {The Voice of the People: Public Opinion and Democracy}, edition= {2nd}, publisher= {Yale University Press}, address= {New Haven, CT}, year= {1997} ) @article( franklin1991, author= {Franklin, Charles H.}, title= {Eschewing Obfuscation? Campaigns and the Perception of U.S. Senate Incumbents}, journal= apsr, volume=85, number = 4, pages= {1193--1214}, year= 1991 ) @book( gallant1987, author= {Gallant, A. Ronald}, title= {Nonlinear Statistical Models}, publisher= "Wiley", address= ny, year= 1987 ) @article( GalianiGertlerSchargrodsky2005, author= {Galiani, Sebastian and Paul Gertler and Ernesto Schargrodsky}, title= {Water for Life: The Impact of the Privatization of Water Services on Child Mortality}, journal= jpe, volume=113, number=1, pages= {83--120}, year= 2005 ) @article( geddes1999, author= {Geddes, Barbara}, title= {What Do We Know about Democratization}, journal= "Annual Review of Political Science", volume=2, pages= {129--148}, year= 1999 ) @book( GillMurrayWright1981, author= {Gill, Philip E. and Walter Murray and Margaret H. Wright}, title= {Practical Optimization}, publisher= "Academic Press", address= "San Diego", year= 1981 ) @incollection( GrefenstetteBaker1989, author= {Grefenstette, John J. and James E. Baker}, title= {How Genetic Algorithms Work: A Critical Look at Implicit Parallelism}, booktitle= {Proceedings of the Third International Conference on Genetic Algorithms}, publisher= "Morgan Kaufmann", address= "San Mateo, CA", pages= {20--27}, year= 1989 ) @article( GeyerThompson1995, author= {Geyer, Charles J. and Elizabeth A. Thompson}, title= {Annealing Markov Chain Monte Carlo with Applications to Ancestral Inference}, journal= jasa, volume=90, number=431, pages= {909--920}, year= 1995 ) @book( goldberg1989, author= {Goldberg, David E.}, title= {Genetic Algorithms in Search, Optimization, and Machine Learning}, publisher= "Addison-Wesley", address= "Reading, MA", year= 1989 ) @Manual{goodrich.fair, author = {Goodrich, Ben}, title = {\pkg{FAiR}: Factor Analysis in \proglang{R}}, note = {\proglang{R}~package version~0.4-7}, url = {http://cran.r-project.org/package=FAiR}, year = {2011}, } @incollection( grefenstette1993, author= {Grefenstette, John J.}, title= {Deception Considered Harmful}, booktitle= {Foundations of Genetic Algorithms 2}, editor= {L.~Darrell Whitley}, publisher= {Morgan Kaufmann}, address= {San Mateo, CA}, year= 1993 ) @book( habermas1964, author= {Habermas, J\"{u}rgen}, title= {The Structural Transformation of the Public Sphere: An Inquiry into a Category of Bourgeois Society}, note = {Translated by Thomas Burger}, publisher= mit, address= cam, year= "1996 [1964]" ) @book( hall1992, author= {Hall, Peter}, title= {The Bootstrap and Edgeworth Expansion}, publisher= {Springer-Verlag}, address= {New York}, year= {1992} ) @book( hampel1986, author= {Hampel, Frank R. and Elvezio M. Ronchetti and Peter J. Rousseeuw and Werner A. Stahel}, title= {Robust Statistics: The Approach Based on Influence Functions}, publisher= {Wiley, John and Sons}, address= {New York}, year= 1986 ) @article( HausmanWise1979, author= {Hausman, Jerry A. and David A. Wise}, title= {Attrition Bias in Experimental and Panel Data: The Gary Income Maintenance Experiment}, journal= ec, volume=47, pages= {455--473}, year= 1979 ) @article( hirnao1998, author= {Hirano, Keisuke and Guido W. Imbens and Geert Ridder and Donald B. Rubin}, title= {Combining Panel Data Sets with Attrition and Refreshment Samples}, journal= ec, volume=69, pages= {1645--1659}, year= 1998 ) @article( heckman1979, author= {Heckman, James J}, title= {Sample Selection Bias as a Specification Error}, journal= ec, volume=47, pages= {153--161}, year= 1979 ) @article( heckman1998, author= {Heckman, James J. and Hidehiko Ichimura and Jeffrey Smith and Petra Todd}, title= {Characterizing Selection Bias Using Experimental Data}, journal= ec, volume=66, number = 5, pages= {1017-1098}, year= 1998 ) \item , ed. 1985. \textit{.} New York: Cambridge University Press. @book( HeckmanSinger1985, editor= {Heckman, James J. and Burton Singer}, title= {Longitudinal Analysis of Labor Market Data}, publisher= cup, address={New York}, year= {1985} ) @unpublished{HerronWand2004, author = {Herron, Michael C. and Jonathan Wand}, title = {Assessing Partisan Bias in Voting Technology: The Case of the 2004 New Hampshire Recount}, note = "Working Paper", year = {2004}, } @article( hersh1982, author= {Hersh, Seymour M.}, title= {The Price of Power: Kissinger, Nixon, and Chile}, journal= {The Atlantic Monthly}, month=12, url= {http://www.theatlantic.com/issues/82dec/hersh.htm}, year= 1982 ) @book( hettmansperger1984, author= {Hettmansperger, T}, title= {Statistical Inference Based on Ranks}, publisher= "Wiley", address= ny, year= 1984 ) @article( holland1986, author= {Holland, Paul W.}, title= {Statistics and Causal Inference}, journal= jasa, volume=81, number=396, pages= {945--960}, year= 1986 ) @book( holland1975, author= {Holland, John H.}, title= {Adaptation in Natural and Artificial Systems}, publisher= "University of Michigan Press", address= "Ann Arbor", year= 1975 ) @article( HorvitzThompson1952, author= {Horvitz, D. G. and D. J. Thompson}, title= {A Generalization of Sampling without Replacement from a Finite Universe}, journal= jasa, volume=47, pages= {663--685}, year= 1952 ) @book( huber1981, author= {Huber, Peter J.}, title= {Robust Statistics}, publisher= {Wiley, John and Sons}, address= {New York}, year= 1981 ) @book( huntington1968, author= {Huntington, Samuel P.}, title= {Political Order in Changing Societies}, publisher= {Yale University Press}, address= {New Haven}, year= 1968 ) @book( huntington1991, author= {Huntington, Samuel P.}, title= {The Third Wave: Democratization in the Late Twentieth Century}, publisher= {University of Oklahoma Press}, address= {Norman and London}, year= 1991 ) @article(KingWand2007, author= {King, Gary and Jonathan Wand}, title= {Comparing Incomparable Survey Responses: Evaluating and Selecting Anchoring Vignettes}, journal= pa, volume=15, pages= {46--66}, year= 2007 ) @article{ KirkpatrickGelattVecchi83, author = "S. Kirkpatrick and C. D. Gelatt and M. P. Vecchi", title = "Optimization by Simulated Annealing", journal = "Science", number = "4598", volume = "220", pages = "671--680", year = "1983" } @book( knuth1998, author= {Knuth, Donald E.}, title= {The Art of Computer Programming, Vol. 2: Seminumerical Algorithms}, edition= "3rd", publisher= "Addison-Wesley", address= "Reading: MA", year= 1998 ) @Manual{KrigInv, author = {Victor Picheny and David Ginsbourger}, title = {\pkg{KrigInv}: Kriging-based Inversion for Deterministic and Noisy Computer Experiments}, note = {\proglang{R}~package version~1.1}, url = {http://CRAN.R-project.org/package=KrigInv}, year = {2011} } @unpublished( krosnick2004, author= {Holbrook, Allyson L. and Matthew K. Berent and Jon A. Krosnick and Penny S. Visser and David S. Boninger}, title= {Attitude Importance and the Accumulation of Attitude-Relevant Knowledge in Memory}, note= "Working Paper", year= 2004 ) @Manual{LeeLee2006, author = {Lee, Chun-Ying and Yung-Jin Lee}, title = {\pkg{PKfit}: A Tool for Data Analysis in Pharmacokinetics}, note = {\proglang{R}~package version~1.1.8}, url = {http://CRAN.R-project.org/package=PKfit}, year = {2009}, } @Manual{ivivc, author = {Hsin Ya Lee and Yung-Jin Lee}, title = {\pkg{ivivc}: in vitro-in vivo correlation (IVIVC) modeling}, note = {\proglang{R}~package version~0.1.5}, url = {http://CRAN.R-project.org/package=ivivc}, year = {2009} } @article( imbens2000, author= {Imbens, Guido W.}, title= "The Role of the Propensity Score in Estimating Dose-Response Functions", journal= {Biometrika}, volume=87, number=3, pages= {706--710}, year= 2000 ) @Article{imai2005, author = {Kosuke Imai}, title = {Do Get-Out-The-Vote Calls Reduce Turnout? The Importance of Statistical Methods for Field Experiments}, journal = apsr, volume = 99, number=2, pages = "283--300", year = {2005}, } @incollection( iyengar1990, author= {Iyengar, Shanto}, title= {Shorts to Political Knowledge: Selective attention and the accessibility bias}, booktitle= {Information and the Democratic Process}, editor= {John Ferejohn and James Kuklinski}, publisher= {University of Illinois Press}, address= {Urbana}, year= 1990 ) @unpublished( iyengar1986, author= {Iyengar, Shanto}, title= {Whither Political Information}, note= {Report to the NES Board of Overseers. Center for Political Studies, University of Michigan}, year= 1986 ) @Manual{JOP, author = {Sonja Kuhnt and Nikolaus Rudak}, title = {\pkg{JOP}: Joint Optimization Plot}, note = {\proglang{R}~package version~2.0.1}, url = {http://cran.r-project.org/package=JOP}, year = {2011}, } @book( johnston2004, author= {Johnston, Richard and Michael G. Hagen and Kathleen Hall Jamieson}, title= {The 2000 Presidential Election and the Foundations of Party Politics}, publisher= cup, address= ny, year= 2004 ) @book( johnston1992, author= {Johnston, Richard and Andr\'{e} Blais and Henry E. Brady and Jean Cr\^{e}te}, title= {Letting the People Decide: Dynamics of a Canadian Election}, publisher= "McGill-Queen's University Press", address= "Montreal", year= 1992 ) @book( kornhauser1959, author= {Kornhauser, William}, title= {The Politics of Mass Society}, publisher= {The Free Press}, address= {New York}, year= 1959 ) @article( kunsch1989, author= {Kunsch, H. R. and L. A. Stefanski and R. J. Carroll}, title= {Conditionally Unbiased Bounded-Influence Estimation in General Regression Models}, journal= jasa, volume=84, pages= {460--466}, year= 1989 ) @book( lancaster1990, editor= {Lancaster, Tony}, title= {The Econometric Analysis of Transition Data}, publisher= cup, address={New York}, year= {1990} ) @Article{lalonde1986, author = {Robert LaLonde}, title = {Evaluating the Econometric Evaluations of Training Programs with Experimental Data}, journal = {American Economic Review}, year = {1986}, OPTkey = {}, volume = {76}, OPTnumber = {4}, pages = {604--20}, month = {September}, OPTnote = {}, OPTannote = {} } @incollection( lawson2004, author= {Lawson, Chappell}, title= {Introduction}, booktitle= {Mexico's Pivotal Democratic Election}, editor= {Jorge I. Dom\'{i}nguez and Chappell Lawson}, publisher= sup, address= "Stanford", pages= {1--21}, year= 2004 ) @article( lipset1959, author= {Lipset, Seymour Martin}, title= {Some Social Requisites of Democracy: Economic Development and Political Legitimacy}, journal= apsr, volume=53, number=1, pages= {69--105}, year= 1959 ) @book( LittleRubin1987, author= {Little, Roderick J. A. and Rubin, Donald B.}, title= {Statistical Analysis with Missing Data}, publisher= {J. Wiley \& Sons}, address= ny, year= 1987 ) @unpublished( lupia2004, author= {Lupia, Arthur}, title= {Questioning Our Competence: Tasks, Institutions, and the Limited Practical Relevance of Common Political Knowledge Measures}, note= "Working Paper", year= 2004 ) @article( luskin2002, author= {Luskin, Robert C. and James S. Fishkin and Roger Jowell}, title= {Considered Opinions: Deliberative Polling in Britain}, journal= bjps, volume=32, pages= {455--487}, year= 2002 ) @book( MccullaghNelder1989, author= {McCullagh, Peter and John A. Nelder}, title= {Generalized Linear Models}, edition= "2nd", publisher= c-h, address= ny, year= 1989 ) @article( McCulloughVinod2004a, author= {McCullough, B. D. and H. D. Vinod}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Reply}, journal= aer, volume=94, number=1, pages= {391--396}, year= 2004 ) @article( McCulloughVinod2004b, author= {McCullough, B. D. and H. D. Vinod}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Reply}, journal= aer, volume=94, number=1, pages= {400--403}, year= 2004 ) @article( McCulloughVinod2003, author= {McCullough, B. D. and H. D. Vinod}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study}, journal= aer, volume=93, number=3, pages= {873--892}, year= 2003 ) @article( mckelvey1985a, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Elections with Limited Information: A Fulfilled Expectations Model Using Contemporaneous Poll and Endorsement Data as Information Sources}, journal= jet, volume=36, pages= {55--85}, year= 1985 ) @article( mckelvey1985b, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Sequential Elections with Limited Information}, journal= ajps, volume=29, number=3, pages= {480--512}, year= 1985 ) @article( mckelvey1986, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Information, Electoral Equilibria, and the Democratic Ideal}, journal= jop, volume=48, number=4, pages= {909--937}, year= 1986 ) @article( mcgraw1990, author= {McGraw, Kathleen and Neil Pinney}, title= {The Effects of General and Domain-Specific Expertise on Political Memory and Judgement}, journal= {Social Cognition}, volume=8, pages= {9--30}, year= 1990 ) @article( mckelvey1985a, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Elections with Limited Information: A Fulfilled Expectations Model Using Contemporaneous Poll and Endorsement Data as Information Sources}, journal= jet, volume=36, pages= {55--85}, year= 1985 ) @article( mckelvey1985b, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Sequential Elections with Limited Information}, journal= ajps, volume=29, number=3, pages= {480--512}, year= 1985 ) @article( mckelvey1986, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Information, Electoral Equilibria, and the Democratic Ideal}, journal= jop, volume=48, number=4, pages= {909--937}, year= 1986 ) @article( McNemar1947, author= {McNemar, Q.}, title= {Note on the Sampling Error of the Differences Between Correlated Proportions or Percentage}, journal= {Psychometrika}, volume=12, pages= {153--157}, year= 1947 ) @book( maddala1992, author= {Maddala, G.S.}, title= {Introduction to Econometrics}, edition= "2nd", publisher= {MacMillan}, address= {New York}, year= "1992" ) @book( maddala1983, author= {Maddala, G.S.p}, title= {Limited-Dependent and Qualitative Variables in Econometrics}, publisher= cup, address={New York}, year= {1983} ) @article{ MarinariParisi1992, author = "E. Marinari and G. Parisi", title = "Simulated tempering: A New Monte Carlo Scheme", journal = "Europhysics Letters", number = "19", volume = "6", pages = "451--455", year = "1992" } @article( MannWhitney1947, author= {Mann, H. and Whitney, D}, title= {On a Test of Whether One of Two Random Variables is Stochastically Larger than the Other}, journal= {Annals of Mathematical Statistics}, volume=18, pages= {50--60}, year= 1947 ) @Article{MebaneJr.+Sekhon:2011, author = {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title = {Genetic Optimization Using Derivatives: The \pkg{rgenoud} Package for \proglang{R}}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @article( mebane2000, author= {Mebane, Jr., Walter R.}, title= {Coordination, Moderation and Institutional Balancing in American Presidential and House Elections}, journal= apsr, volume=94, number = 1, pages= {37--57}, year= 2000 ) @Manual{MebaneSekhon1997, author = {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title = {GENetic Optimization Using Derivatives (GENOUD)}, note = {Computer program available upon request}, year = {1997} } @article( MebaneSekhon2004, author= {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title= {Robust Estimation and Outlier Detection for Overdispersed Multinomial Models of Count Data}, journal= ajps, volume=48, number = 2, pages= {391--410}, year= 2004 ) @Manual{MebaneSekhon.multinomRob, author = {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title = {\pkg{multinomRob}: Robust Estimation of Overdispersed Multinomial Regression Models}, note = {\proglang{R}~package version~1.8-4}, url = {http://CRAN.R-project.org/package=multinomRob}, year = {2009}, } @article( MebaneSekhon2002, author= {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title= {Coordination and Policy Moderation at Midterm}, journal= apsr, volume=96, number = 1, pages= {141--157}, year= 2002 ) @unpublished( MebaneSekhon1998, author= {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title= {GENetic Optimization Using Derivatives (GENOUD)}, note = {Software Package. \url{http://sekhon.berkeley.edu/rgenoud/}}, year= 1998 ) @book( Michalewicz1992, author= {Michalewicz, Zbigniew}, title= {Genetic Algorithms + Data Structures = Evolution Programs}, publisher= s-v, address= {New York}, year= {1992} ) @unpublished( MichalewiczSwaminathanLogan1993, author= {Michalewicz, Zbigniew and Swarnalatha Swaminathan and Thomas D. Logan}, title= {GENOCOP (version 2.0)}, note = {C language computer program source code. \url{http://www.cs.adelaide.edu.au/~zbyszek/EvolSyst/genocop2.0.tar.Z}}, year= 1993 ) @book( mes2002, author= {Erikson, Robert S. and Michael B. MacKuen and James A. Stimson}, title= {The Macro Polity}, publisher= cup, address= {New York}, year= {2002} ) @incollection( miller1986, author= {Miller, Nicholas R}, title= {Information, Electorates, and Democracy: Some Extensions and Interpretations of the Condorcet Jury Theorem}, booktitle= {Information Pooling and Group Decision Making}, editor= {Bernard Grofman and Guillermo Owen}, publisher= {JAI}, address= {Greenwich, CT}, year= 1986 ) @article{MitchellKrzanowski1989, author = {Mitchell, Ann F. S. and Wojtek J. Krzanowski}, title = {Amendments and Corrections: The Mahalanobis Distance and Elliptic Distributions}, journal = {Biometrika}, year = {1989}, volume = {76}, number = {2}, pages = {407}, } @article{MitchellKrzanowski1985, author = {Mitchell, Ann F. S. and Wojtek J. Krzanowski}, title = {The Mahalanobis Distance and Elliptic Distributions}, journal = {Biometrika}, year = {1985}, volume = {72}, number = {2}, pages = {464--467}, } @book( neuman86, author= {Neuman, W. Russell}, title= {The Paradox of Mass Politics: Knowledge and Opinion in the {A}merican Electorate}, publisher= hup, address= cam, year= 1986 ) @article( NixVose1992, author= {Nix, Allen E. and Michael D. Vose}, title= {Modeling Genetic Algorithms with Markov Chains}, journal= {Annals of Mathematics and Artificial Intelligence}, volume=5, pages= {79--88}, year= 1992 ) @book( page1992, author= {Page, Benjamin I. and Robert Y. Shapiro}, title= {The Rational Public: Fifty Years of Trends in {A}mericans' Policy Preferences}, publisher= uchp, address= chic, year= 1992 ) @article( PalfreyPoole1987, author= {Palfrey, Thomas R. and Keith T. Poole}, title= {The Relationship between Information, Ideology, and Voting Behavior}, journal= ajps, volume=31, number = 3, pages= {511--530}, year= 1987 ) @book( patterson2002, author= {Patterson, Thomas E.}, title= {The Vanishing Voter: Public Involvement in an Age of Uncertainty}, publisher= "Alfred A. Knopf", address= "New York", year= 2002 ) @book( popkin1991, author= {Popkin, Samuel L}, title= {The Reasoning Voter: Communication and Persuasion in Presidential Campaigns}, publisher= uchp, address= chic, year= 1991 ) @article( PriceZaller1993, author= {Price, Vincent and John Zaller}, title= {Who Gets the News? Alternative Measures of News Reception and Their Implications for Research}, journal= {Public Opinion Quarterly}, volume=57, number=2, pages= {133--164}, year= 1993 ) @article( pryor2003, author= {Pryor, Kane}, title= {A national state of confusion}, journal= {Salon.com}, month=6, day=2, url= {http://www.salon.com/opinion/feature/2003/02/06/iraq_poll}, note= "Accessed 07/05/2004", year= 2003 ) @book( putnam2000, author= {Putnam, Robert D.}, title= {Bowling Alone: The Collapse and Revival of American Community}, publisher= "Simon \& Schuster", address= ny, year= 2000 ) @book( rosenbaum2002, author= {Rosenbaum, Paul R.}, title= {Observational Studies}, edition= "2nd", publisher= "Springer-Verlag", address= ny, year= 2002 ) @article( Rosenbaum1999, author= {Rosenbaum, Paul R.}, title= {Using Quantile Averages in Matched Observational Studies}, journal= {Applied Statistics}, volume=48, number= 1, pages= {63--78}, year= 1999 ) @article( Rosenbaum1993, author= {Rosenbaum, Paul R.}, title= {Comparison of Multivariate Matching Methods: Structures, Distances, and Algorithms}, journal= {Journal of Computational and Graphical Statistics}, volume=2, number= 4, pages= {405--420}, year= 1993 ) @article( Rosenbaum1991, author= {Rosenbaum, Paul R.}, title= {A Characterization of Optimal Designs for Observational Studies}, journal= jrssb, volume=53, number= 3, pages= {597--610}, year= 1991 ) @article( Rosenbaum1989, author= {Rosenbaum, Paul R.}, title= {Optimal Matching for Observational Studies}, journal= jasa, volume=84, number= 408, pages= {1024--1032}, year= 1989 ) @article( RosenbaumRubin1985, author= {Rosenbaum, Paul R. and Donald B. Rubin}, title= {Constructing a Control Group Using Multivariate Matched Sampling Methods That Incorporate the Propensity Score}, journal= {The American Statistician}, volume=39, number= 1, pages= {33--38}, year= 1985 ) @article( RosenbaumRubin1984, author= {Rosenbaum, Paul R. and Donald B. Rubin}, title= {Reducing Bias in Observational Studies Using Subclassification on the Propensity Score}, journal= jasa, volume=79, number= 387, pages= {516--524}, year= 1984 ) @article( RosenbaumRubin1983, author= {Rosenbaum, Paul R. and Donald B. Rubin}, title= {The Central Role of the Propensity Score in Observational Studies for Causal Effects}, journal= {Biometrika}, volume=70, number= 1, pages= {41--55}, year= 1983 ) @article( rubin2001, author= {Rubin, Donald B}, title= "Using Propensity Scores to Help Design Observational Studies: Application to the Tobacco Litigation", journal= "Health Services \& Outcomes Research Methodology", volume=2, number=1, pages= "169--188", year= 2001 ) @article( rubin1997, author= {Rubin, Donald B}, title= "Estimating Causal Effects from Large Data Sets Using Propensity Scores", journal= {Annals of Internal Medicine}, volume=127, number="8S", pages= "757--763", year= 1997 ) @book( rubinMI1987, author= {Rubin, Donald B.}, title= {Multiple Imputation for Nonresponse in Surveys}, publisher= {J. Wiley \& Sons}, address= ny, year= 1987 ) @article( rubin1980, author= {Rubin, Donald B.}, title= "Bias Reduction Using Mahalanobis-Metric Matching", journal= {Biometrics}, volume=36, number = 2, pages= {293--298}, year= 1980 ) @article( rubin1979, author= {Rubin, Donald B.}, title= "Using Multivariate Sampling and Regression Adjustment to Control Bias in Observational Studies", journal= jasa, volume=74, pages= {318--328}, year= 1979 ) @article( rubin1978, author= {Rubin, Donald B.}, title= {Bayesian Inference for Causal Effects: The Role of Randomization}, journal= {Annals of Statistics}, volume=6, number=1, pages= {34--58}, year= 1978 ) @article( rubin1977, author= {Rubin, Donald B.}, title= {Assignment to a Treatment Group on the Basis of a Covariate}, journal= {Journal of Educational Statistics}, volume=2, pages= {1--26}, year= 1977 ) @article( rubin1976, author= {Rubin, Donald B.}, title= {Multivariate Matching Methods That are Equal Percent Bias Reducing, I: Some Examples}, journal= {Biometrics}, volume = 32, number = 1, pages= {109--120}, year= 1976 ) @article( rubin1976b, author= {Rubin, Donald B.}, title= {Multivariate Matching Methods That are Equal Percent Bias Reducing, II: Maximums on Bias Reduction for Fixed Sample Sizes}, journal= {Biometrics}, volume = 32, number = 1, pages= {121--132}, year= 1976 ) @article( rubinMI1976, author= {Rubin, Donald B.}, title= {Inference and Missing Data}, journal= {Biometrika}, volume=63, pages= {581-592}, year= 1976 ) @article( rubin1973a, author= {Rubin, Donald B.}, title= "Matching to Remove Bias in Observational Studies", journal= {Biometrics}, volume=29, pages= {159--184}, year= 1973 ) @article( rubin1973b, author= {Rubin, Donald B.}, title= "The Use of Matching and Regression Adjustment to Remove Bias in Observational Studies", journal= {Biometrics}, volume=29, pages= {185--203}, year= 1973 ) @unpublished( RubinStuart, author= {Rubin, Donald B. and Elizabeth A. Stuart}, title= {Affinely Invariant Matching Methods with Discriminant Mixtures of Proportional Ellipsoidally Symmetric Distributions}, note= "Working Paper", year= 2005 ) @article( RubinThomas1996, author= {Rubin, Donald B. and Neal Thomas}, title= "Matching Using Estimated Propensity Scores: Relating Theory to Practice", journal= {Biometrics}, volume=52, number=1, pages= {249--264}, year= 1996 ) @article( RubinThomas1992, author= {Rubin, Donald B. and Neal Thomas}, title= "Affinely Invariant Matching Methods with Ellipsoidal Distributions", journal= aos, volume=20, number=2, pages= {1079--1093}, year= 1992 ) @article( RubinThomas1992b, author= {Rubin, Donald B. and Neal Thomas}, title= "Characterizing the Effect of Matching Using Linear Propensity Score Methods with Normal Distributions", journal= "Biometrika", volume=79, number=4, pages= {797--809}, year= 1992 ) @article( rustow1970, author= {Rustow, Dankwart A.}, title= {Transitions to Democracy: Toward a Dynamic Model}, journal= {Comparative Politics}, volume=2, number=3, pages= {337--363}, year= 1970 ) @article(SchacharNalebuff2004, author= {Shachar, Ron and Barry Nalebuff}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Comment}, journal= aer, volume=94, number=1, pages= {382-390}, year= 2004 ) @book( schafer1997a, author= {Schafer, Joseph L.}, title= {Analysis of Incomplete Multivariate Data}, publisher= c-h, address= "London", year= 1997 ) @unpublished( schafer1997b, author= {Schafer, Joseph L.}, title= {Imputation of missing covariates under a general linear mixed model}, note= {Technical report, Dept. of Statistics, Penn State University}, year= 1997 ) @Manual{SekhonMatching, author = {Jasjeet S. Sekhon}, title = {\pkg{Matching}: Multivariate and Propensity Score Matching with Automated Balance Search}, note = {\proglang{R}~package version~4.7-12}, url = {http://CRAN.R-project.org/package=Matching}, year = {2011}, } @article( sekhon2004, author= {Sekhon, Jasjeet S.}, title= {Quality Meets Quantity: Case Studies, Conditional Probability and Counterfactuals}, journal= pop, volume=2, number = 2, pages= {281--293}, year= 2004 ) @unpublished( SekhonInformation, author= {Sekhon, Jasjeet S.}, title= "The Varying Role of Voter Information Across Democratic Societies", note = "Working Paper", url= {http://sekhon.berkeley.edu/papers/SekhonInformation.pdf}, year= 2004 ) @article( SekhonMebane1998, author= {Sekhon, Jasjeet Singh and Mebane, Jr., Walter R.}, title= {Genetic Optimization Using Derivatives: Theory and Application to Nonlinear Models}, journal= {Political Analysis}, volume={7}, pages= {189--203}, year= 1998 ) @unpublished( sekhon_glmRob, author= {Sekhon, Jasjeet S.}, title= {Robust Alternatives to Binary Logit and Probit: With reanalysis of Fearon and Laitin's (2003) ``Ethnicity, Insurgency and Civil War'' and Bartels's (1996) ``Uninformed Votes: Information Effects in Presidential Elections.}, note= "Working Paper", year= 2004 ) @book( smith_charles1956, author= {Smith, Charles Page}, title= {James Wilson, Founding Father, 1742-1798}, publisher= "University of North Carolina Press", address= "Chapel Hill", year= 1956 ) @article( smith_herbert1997, author= {Smith, Herbert L.}, title= {Matching with Multiple Controls to Estimate Treatment Effects in Observational Studies}, journal= "Sociological Methodology", volume=27, pages= "305--353", year= "1997" ) @article( SmithTodd2005a, author= {Smith, Jeffrey and Petra Todd}, title= {Does Matching Overcome LaLonde's Critique of Nonexperimental Estimators?}, journal= je, volume=125, number="1--2", pages= "305--353", year= "2005" ) @article( SmithTodd2005b, author= {Smith, Jeffrey and Petra Todd}, title= {Rejoinder}, journal= je, volume=125, number="1--2", pages= "365--375", year= "2005" ) @article{SmithTodd2001, author = {Jeffrey A. Smith and Petra E. Todd}, title = {Reconciling Conflicting Evidence on the Performance of Propensity Score Matching Methods}, journal = {AEA Papers and Proceedings}, year = {2001}, volume = {91}, number = {2}, pages = {112--118}, } @book( sniderman1991, author= {Sniderman, Paul M. and Richard Brody and Philip E. Tetlock}, title= {Reasoning and Choice: Explorations in Political Psychology}, publisher= cup, address= ny, year= 1991 ) @incollection( sniderman1993, author= {Sniderman, Paul M.}, title= {The New Look in Public Opinion Research}, booktitle= {Political Science: The State of the Discipline II}, editor= {Ada W. Finifter}, publisher= {American Political Science Association}, address= {Washington, DC}, year= 1993 ) @book( snyder2000, author= {Snyder, Jack}, title= {From Voting to Violence: Democratization and Nationalist Conflict}, publisher= {W. W. Norton}, address= ny, year= 2000 ) @article( stephens1974, author= {Stephens, M. A.}, title= {EDF Statistics for Goodness of Fit and Some Comparisons}, journal= jasa, volume=69, pages= {730--737}, year= 1974 ) @article( stokes2004, author= {Stokes, Houston}, title= {On the Advantage of Using Two or More Econometric Software Systems to Solve the Same Problem}, journal= {Journal of Economic and Social Measurement}, volume=29, number="1-3", pages= {307--320}, year= 2004 ) @Manual{synth2008, author = {Alexis Diamond and Jens Hainmueller}, title = {\pkg{Synth}: Synthetic Control Group Method for Comparative Case Studies}, note = {\proglang{R}~package version~0.1-6}, url = {http://CRAN.R-project.org/package=Synth}, year = {2008} } @incollection( vose1993, author= {Vose, Michael D.}, title= {Modeling Simple Genetic Algorithms}, booktitle= {Foundations of Genetic Algorithms 2}, editor= {L.~Darrell Whitley}, publisher= {Morgan Kaufmann}, address= {San Mateo, CA}, year= 1993 ) @Manual{WandKingLau2007, author = {Wand, Jonathan and Gary King and Olivia Lau}, title = {\pkg{Anchors}: Software for Anchoring Vignette Data}, note = {\proglang{R}~package version~2.0}, url = {http://wand.stanford.edu/anchors/}, year = {2008} } @book( wilcox1997, author= {Wilcox, Rand R.}, title= {Introduction to Robust Estimation}, publisher= {Academic Press}, address= {San Diego, CA}, year= 1997 ) @article( wilcoxon1945, author= {Wilcoxon, F}, title= {Individual Comparisons by Ranking Methods}, journal= {Biometrics}, volume=1, pages= {8083}, year= 1945 ) @article( WinshipMorgan1999, author= {Winship, Christopher and Stephen Morgan}, title= {The estimation of causal effects from observational data}, journal= "Annual Review of Sociology", volume=25, pages= "659--707", year= "1999" ) @article( wittman1989, author= {Wittman, Donald A}, title= {Why Democracies Produce Efficient Results}, journal= jpe, volume=97, pages= {1395--1424}, year= 1989 ) @article( yao.liu.lin1999, author= {Yao, Xin and Yong Liu and Guangming Lin}, title= {Evolutionary Programming Made Faster}, journal= {IEEE Transactions on Evolutionary Computation}, volume=3, month= {July}, number= 2, pages= {82--102}, year= 1999 ) @article( yule1899, author= {Yule, Undy G.}, title= {An Investigation into the Causes of Changes in Pauperism in England, Chiefly During the Last Two Intercensal Decades (Part I.)}, journal= {Journal of the Royal Statistical Society}, volume=62, number = 2, pages= {249--295}, year= 1899 ) @incollection( zaller2004, author= {Zaller, John R}, title= {Floating Voters in U.S.\ Presidential Elections, 1948--1996}, booktitle= {Studies in Public Opinion: Gauging Attitudes, Nonattitudes, Measurement Error and Change}, editor= {Willem Saris and Paul Sniderman}, publisher= pup, address= nj, year= "forthcoming" ) @book( zaller1992, author= {Zaller, John R}, title= {The Nature and Origins of Mass Opinion}, publisher= cup, address= ny, year= 1992 ) @unpublished( zaller1986, author= {Zaller, John R.}, title= {Analysis of Information Items in the 1985 NES Pilot Study}, note= {NES Pilot Study Report. Center for Political Studies, University of Michigan}, year= 1986 ) @unpublished( zaller1985, author= {Zaller, John R.}, title= {Proposal for the Measurement of Political Information}, note= {Report to the NES Board of Overseers. Center for Political Studies, University of Michigan}, year= 1985 ) @book( zakaria2003, author= {Zakaria, Fareed}, title= {The Future of Freedom: Illiberal Democracy at Home and Abroad}, publisher= {W. W. Norton}, address= {New York}, year= 2003 ) @article( zakaria1998, author= {Zakaria, Fareed}, title= {Doubts About Democracy}, journal= {Newsweek}, Month="January", day=5, year= 1998 ) @article( zakaria1997, author= {Zakaria, Fareed}, title= {The Rise of Illiberal Democracy}, journal= {Foreign Affairs}, volume=76, number=6, pages= {249--295}, year= 1997 ) @Article{Altman+McDonald:2011, author = {Micah Altman and Michael P. McDonald}, title = {\pkg{BARD}: Better Automated Redistricting}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @Article{Wand+King:2011, author = {Jonathan Wand and Gary King}, title = {\pkg{Anchors}: Software for Anchoring Vignette Data}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @Article{Sekhon:2011, author = {Jasjeet S. Sekhon}, title = {Multivariate and Propensity Score Matching Software with Automated Balance Optimization: The \pkg{Matching} Package for \proglang{R}}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @Manual{Rcore, title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2009}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org}, } @Comment LocalWords: apsr booktitle Finifter Zaller NES Iyengar Shanto Brehm @Comment LocalWords: AlvarezBrehm ajps HorvitzThompson Horvitz jasa ny kunsch @Comment LocalWords: MannWhitney Psychometrika Biometrika rubinMI Stefanski @Comment LocalWords: Cantoni Elvezio Ronchetti CarrollPederson Pederson jssrb @Comment LocalWords: copas jrssb sekhon glmRob Probit Fearon Laitin's althaus @Comment LocalWords: Bartels's MebaneSekhon Keisuke Geert ec Allyson Berent @Comment LocalWords: Krosnick Visser Boninger Hausman Kosuke Rosenbaum Bon Ai @Comment LocalWords: Kornhauser Jamieson hersh url huntington Zakaria Fareed @Comment LocalWords: zakaria rustow Dankwart Lipset geddes MacKuen Brunell @Comment LocalWords: BrunellNiNardo DiNardo Reweighting AldrichMcKelvey rubin @Comment LocalWords: McKelvey imbens abadie incollection dominguez nguez jop @Comment LocalWords: Chappell Ordeshook Lupia fishkin Subclassification Jong @Comment LocalWords: CochranRubin BertsimasTsitsiklis Bertsimas Dimitris Yung @Comment LocalWords: Tsitsiklis Kaufmann Quantile Ellipsoidally Galiani Segal @Comment LocalWords: Gertler Schargrodsky GalianiGertlerSchargrodsky Diprete @Comment LocalWords: DipreteEngelhardt Engelhardt herbert Winship Jin PKfit @Comment LocalWords: WinshipMorgan BowersHansen Pharmacokinetics Vinod aer @Comment LocalWords: McCulloughVinod SchacharNalebuff Shachar Nalebuff Hsin @Comment LocalWords: AltmanGillMcDonald Braumoeller Jasjeet ivivc vitro vivo @Comment LocalWords: IVIVC Hainmueller Synth Mebane GENetic @Comment LocalWords: GENOUD DiceOptim Ginsbourger Roustant @Comment LocalWords: Kriging rgenoud/inst/doc/rgenoud.Rnw0000644000176200001440000021542713171743040015605 0ustar liggesusers\documentclass[nojss]{jss} \usepackage{amsmath} \usepackage{dcolumn} %%My declarations \newcommand{\hlink}{\htmladdnormallink} \newcommand{\MyPerp}{\perp \! \! \! \perp} \newcommand{\e}{\text{e-}} \newcolumntype{C}{>{$}c<{$}} \newcolumntype{L}{>{$}l<{$}} \newcolumntype{R}{>{$}r<{$}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Walter R. Mebane, Jr. \\ University of Michigan \And Jasjeet S. Sekhon \\ UC Berkeley} %% for pretty printing and a nice hypersummary also set: \title{Genetic Optimization Using Derivatives: The \pkg{rgenoud} Package for \proglang{R}} \Plaintitle{Genetic Optimization Using Derivatives: The rgenoud Package for R} \Plainauthor{Walter R. Mebane, Jr., Jasjeet S. Sekhon} %% comma-separated \Shorttitle{\pkg{rgenoud}: Genetic Optimization Using Derivatives in \proglang{R}} %% an abstract and keywords \Abstract{ This introduction to the \proglang{R} package \pkg{rgenoud} is a modified version of \cite{MebaneJr.+Sekhon:2011}, published in the \textit{Journal of Statistical Software}. That version of the introduction contains higher resolution figures. \code{genoud} is an \proglang{R} function that combines evolutionary algorithm methods with a derivative-based (quasi-Newton) method to solve difficult optimization problems. \code{genoud} may also be used for optimization problems for which derivatives do not exist. \code{genoud} solves problems that are nonlinear or perhaps even discontinuous in the parameters of the function to be optimized. When the function to be optimized (for example, a log-likelihood) is nonlinear in the model's parameters, the function will generally not be globally concave and may have irregularities such as saddlepoints or discontinuities. Optimization methods that rely on derivatives of the objective function may be unable to find any optimum at all. Multiple local optima may exist, so that there is no guarantee that a derivative-based method will converge to the global optimum. On the other hand, algorithms that do not use derivative information (such as pure genetic algorithms) are for many problems needlessly poor at local hill climbing. Most statistical problems are regular in a neighborhood of the solution. Therefore, for some portion of the search space, derivative information is useful. The function supports parallel processing on multiple CPUs on a single machine or a cluster of computers.} \Keywords{genetic algorithm, evolutionary program, optimization, parallel computing, \proglang{R}} \Plainkeywords{genetic algorithm, evolutionary program, optimization, parallel computing, R} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: This needs to filled out ONLY IF THE PAPER WAS ACCEPTED. %% If it was not (yet) accepted, leave them commented. \Volume{42} \Issue{11} %\Month{September} \Year{2011} \Submitdate{2007-02-11} \Acceptdate{2007-11-21} %% The address of (at least) one author should be given %% in the following format: \Address{ Walter R. Mebane, Jr.\\ % Professor\\ Department of Political Science\\ Department of Statistics\\ University of Michigan\\ Ann Arbor, MI 48109-1045\\ E-mail: \email{wmebane@umich.edu}\\ URL: \url{http://www.umich.edu/~wmebane} \\ [2ex] Jasjeet S. Sekhon\\ Department of Political Science\\ Department of Statistics\\ 210 Barrows Hall \#1950\\ UC Berkeley\\ Berkeley, CA 94720-1950\\ E-mail: \email{sekhon@berkeley.edu}\\ URL: \url{http://sekhon.berkeley.edu} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \graphicspath{{Figures/}} \begin{document} \SweaveOpts{engine=R} %\VignetteIndexEntry{Using genoud} %\VignetteDepends{rgenoud} %\VignetteKeywords{rgenoud} %\VignettePackage{rgenoud} \section{Introduction} We developed the \proglang{R} package \pkg{rgenoud} to solve difficult optimization problems such as often arise when estimating nonlinear statistical models or solving complicated nonlinear, nonsmooth and even discontinuous functions.\footnote{The \pkg{rgenoud} software package is available from the Comprehensive \proglang{R} \citep{Rcore} Archive Network at \url{http://CRAN.R-project.org/package=rgenoud}.} Optimization difficulties often arise when the objective function (for instance, the log-likelihood) is a nonlinear function of the parameters. In such cases the function to be optimized is usually not globally concave. An objective function that is not globally concave may have multiple local optima, saddle points, boundary solutions or discontinuities. While the objective function for a statistical model is often concave in a neighborhood of the optimal solution, that neighborhood is often a small proportion of the parameter space of potential interest, and outside that neighborhood the function may be irregular. In such cases, methods of optimization that depend entirely on derivatives can be unreliable and often are virtually unusable. Newton-Raphson and quasi-Newton methods are among the commonly used optimization methods that rely completely on derivatives. Such methods work well when the function to be optimized is regular and smooth over the domain of parameter values that is of interest, but otherwise the methods often fail \citep{GillMurrayWright1981}. Even in models where such methods can be expected to work most of the time, resampling techniques such as the bootstrap \citep{EfronTibshirani1994} can generate resamples in which derivative-based optimization algorithms encounter severe difficulties. This is unfortunate because the methods most frequently used for optimization in problems of statistical estimation are entirely based on derivatives. The \pkg{rgenoud} package has been used by wide variety of users and developers. More than twelve \proglang{R} packages currently rely upon \pkg{rgenoud} including: \pkg{anchors} \citep[analyzing survey data with anchoring vignettes,][]{Wand+King:2011,WandKingLau2007,KingWand2007}; \pkg{BARD} \citep[automated redistricting,][]{Altman+McDonald:2011}; \pkg{boolean} \citep[boolean binary response models,][]{braumoeller2003,BraumoellerGoodrichKline2006}; \pkg{DiceOptim} \citep[kriging-based optimization for computer experiments,][]{DiceOptim}; \pkg{FAiR} \citep[factor analysis,][]{goodrich.fair}; \pkg{JOP} \citep[simultaneous optimization of multiple responses,][]{JOP}; \pkg{KrigInv} \citep[kriging-based inversion,][]{KrigInv}; \pkg{PKfit} \citep[data analysis in pharmacokinetics,][]{LeeLee2006}; \pkg{Matching} \citep[propensity score and multivariate matching,][]{SekhonMatching,Sekhon:2011}; \pkg{ivivc} \citep[in vitro-in vivo correlation modeling,][]{ivivc}; \pkg{multinomRob} \citep[robust multinomial models,][]{MebaneSekhon.multinomRob,MebaneSekhon2004}; and \pkg{Synth} \citep[synthetic control group method for comparative case studies,][]{AbadieGardeazabal2003,synth2008,Abadie+Diamond+Hainmueller:2011}. We present in Section \ref{sec:examples} an example using benchmark functions taken from \citet{yao.liu.lin1999}, followed by an example motivated by the \code{multinomRob} package. The benchmark suite includes functions that are high-dimensional, discontinuous or that have many local optima. The \code{multinomRob} package robustly estimates overdispersed multinomial regression models and uses \pkg{rgenoud} to solve a least quartile difference (LQD) generalized S-estimator \citep{MebaneSekhon2004}. The LQD is not a smooth function of the regression model parameters. The function is continuous, but the parameter space is finely partitioned by nondifferentiable boundaries. In another paper in this volume, the \pkg{Matching} package and its use of \pkg{rgenoud} are described in detail \citep{Sekhon:2011}. \pkg{Matching} provides functions for multivariate and propensity score matching and for finding optimal covariate balance based on a genetic search algorithm implemented in \pkg{rgenoud}. The search over optimal matches is discontinuous so no derivatives are used.\footnote{The \code{BFGS} option of \code{genoud} is set to \code{FALSE}, and the ninth operator which depends on derivatives is not used.} The search also involves lexical optimization which is a unique feature implemented in \pkg{rgenoud}.\footnote{Lexical optimization is useful when there are multiple fitness criteria; the parameters are chosen so as to maximize fitness values in lexical order---i.e., the second fit criterion is only considered if the parameters have the same fit for the first. See the \code{lexical} option and \citet{Sekhon:2011} for details. All of \code{genoud}'s options are described in the \proglang{R} help file for the function.} % If one wishes to use such a model, %significant optimization difficulties may need to be overcome. For %example, the estimating functions of all of the following models are %not in general globally concave: models with multivariate qualitative %variables, censoring or endogenous switching %\citep{maddala1983,amemiya1985}; linear covariance structures %\citep{bollen1989}; models for durations or transitions with %unobserved heterogeneity \citep{HeckmanSinger1985,lancaster1990}; %quasi-likelihood and extended quasi-likelihood models %\citep{McCullaghNelder1989} and systems based on such models %\citep{FahrmeirTutz1994}; and nonlinear simultaneous equation models %\citep{gallant1987}. For such models, optimization methods driven %entirely by derivatives are often unreliable. For some versions of %some of these models, algorithms such as EM that involve data %augmentation have been successfully applied to produce optimization %problems that derivative-based methods can solve %\citep[e.g.,][197]{lancaster1990}. The \pkg{rgenoud} package implements an updated and extended version of the \proglang{C} program \code{GENOUD} \citep{MebaneSekhon1997} described in \citep{SekhonMebane1998}. The many improvements include among other things the interface with \proglang{R}, which includes the ability to optimize functions written in \proglang{R}, options to optimize both floating point and integer-valued parameters, the ability to optimize loss functions which return multiple fitness values (lexical optimization), the ability to call \code{genoud} recursively, the ability to have the optimizer evaluate fits only for new parameter values, and the ability to use multiple computers, CPUs or cores to perform parallel computations. The \pkg{rgenoud} program combines an evolutionary algorithm with a quasi-Newton method. The quasi-Newton method is the Broyden-Fletcher-Goldfarb-Shanno (BFGS) method \citep[][119]{GillMurrayWright1981} implemented in \proglang{R}'s \code{optim} function. When the BFGS is being used, our program offers the option of using either \pkg{rgenoud}'s built-in numerical derivatives (which are based on code taken from \citealt[][337--344]{GillMurrayWright1981}) or user-supplied analytical derivatives.\footnote{User supplied derivatives may be provides via the \code{gr} option.} Our program can also work without the BFGS, in which case no derivatives are needed and the optimizer will work even when the function is discontinuous. The primary benefit from using derivatives is that the algorithm will then quickly find a local optimum when a current set of trial solution parameter values is in a smooth neighborhood of the local optimum point. Appropriate use of the BFGS can make the algorithm converge to the global optimum much more quickly. But premature or excessive use of the BFGS can prevent convergence to the global optimum.\footnote{The user can control whether \code{genoud} uses the BFGS at all (via the \code{BFGS} option), and if operators that use the BFGS are used (via the \code{P9} option), how often they are used.} As always, it is hazardous to rely on an optimizer's default settings. Our program does not eliminate the need for judgment, testing and patience. As Gill, Murray and Wright observe, ``there is no guaranteed strategy that will resolve every difficulty'' \citep[285]{GillMurrayWright1981}. In this article, we very briefly review the theory of random search algorithms that supports the assertion that \pkg{rgenoud} has a high probability of finding the global optimum when such exists. And we present three examples of how to use the \code{genoud} function: to optimize a simple but fiendish scalar Normal mixture model; to minimize a suite of benchmark functions that have previously been used to test evolutionary programming optimization algorithms; and to optimize a version of the only intermittently differentiable LQD estimator. Additional details on both the theory and performance of \code{genoud} can be found in our article that describes \code{GENOUD} \citep{SekhonMebane1998}. \section{Background on Genetic Optimization} An evolutionary algorithm (EA) uses a collection of heuristic rules to modify a population of trial solutions in such a way that each generation of trial values tends to be, on average, better than its predecessor. The measure for whether one trial solution is better than another is the trial solution's fitness value. In statistical applications, the fitness is a function of the summary statistic being optimized (e.g., the log-likelihood). \pkg{rgenoud} works for cases in which a solution is a vector of floating-point or integer numbers that serve as the parameters of a function to be optimized. The search for a solution proceeds via a set of heuristic rules, or \textit{operators}, each of which acts on one or more trial solutions from the current population to produce one or more trial solutions to be included in the new population. EAs do not require derivatives to exist or the function to be continuous in order find the global optimum. The EA in \pkg{rgenoud} is fundamentally a genetic algorithm (GA) in which the code-strings are vectors of numbers rather than bit strings, and the GA operators take special forms tuned for the floating-point or integer vector representation. A GA uses a set of randomized genetic operators to evolve a finite population of finite code-strings over a series of generations \citep{holland1975,goldberg1989,GrefenstetteBaker1989}. The operators used in GA implementations vary \citep{davis1991,FilhoTreleavenAlippi1994}, but in an analytical sense the basic set of operators can be defined as reproduction, mutation, crossover and inversion. The variation in these operators across different GA implementations reflects the variety of codes best suited for different applications. Reproduction entails selecting a code-string with a probability that increases with the code-string's fitness value. Crossover and inversion use pairs or larger sets of the selected code-strings to create new code-strings. Mutation randomly changes the values of elements of a single selected code-string. Used in suitable combinations, the genetic operators tend to improve average fitness of each successive generation, though there is no guarantee that average fitness will improve between every pair of successive generations. Average fitness may well decline. But theorems exist to prove that parts of the trial solutions that have above average fitness values in the current population are sampled at an exponential rate for inclusion in the subsequent population \citep[][139--140]{holland1975}. Each generation's population contains a biased sample of code-strings, so that a substring's performance in that population is a biased estimate of its average performance over all possible populations \citep{dejong1993,grefenstette1993}. The long-run properties of a GA may be understood by thinking of the GA as a Markov chain. A state of the chain is a code-string population of the size used in the GA. For code-strings of finite length and GA populations of finite size, the state space is finite. If such a GA uses random reproduction and random mutation, all states always have a positive probability of occurring. A finite GA with random reproduction and mutation is therefore approximately a finite and irreducible Markov chain.\footnote{\citet[][372--419]{feller1970} and \citet[][107--142]{billingsley1986} review the relevant properties of Markov chains. The randomness in an actual GA depends on the performance of pseudorandom number generators. This and the limitations of floating point arithmetic mean it is not literally true that an actual GA has a positive probability of reaching any state from any other state, and some states may in fact not be reachable from a given set of initial conditions.} An irreducible, finite Markov chain converges at an exponential rate to a unique stationary distribution \citep[][128]{billingsley1986}. This means that the probability that each population occurs rapidly converges to a constant, positive value. \citet{NixVose1992} and \citet{vose1993} use a Markov chain model to show that in a GA where the probability that each code-string is selected to reproduce is proportional to its observed fitness, the stationary distribution strongly emphasizes populations that contain code-strings that have high fitness values. They show that asymptotic in the population size---i.e., in the limit for a series of GAs with successively larger populations---populations that have suboptimal average fitness have probabilities approaching zero in the stationary distribution, while the probability for the population that has optimal average fitness approaches one. If $k>1$ populations have optimal average fitness, then in the limiting stationary distribution the probability for each approaches $1/k$. The theoretical results of Nix and Vose imply that a GA's success as an optimizer depends on having a sufficiently large population of code-strings. If the GA population is not sufficiently large, then the Markov chain that the GA approximately implements is converging to a stationary distribution in which the probabilities of optimal and suboptimal states are not sharply distinguished. Suboptimal populations can be as likely to occur as optimal ones. If the stationary distribution is not favorable, the run time in terms of generations needed to produce an optimal code-string will be excessive. For all but trivially small state spaces, an unfavorable stationary distribution can easily imply an expected running time in the millions of generations. But if the stationary distribution strongly emphasizes optimal populations, relatively few generations may be needed to find an optimal code-string. In general, the probability of producing an optimum in a fixed number of generations tends to increase with the GA population size. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{enumerate} \item[\code{P1}] Cloning. Copy $\mathbf{X}_{t}$ into the next generation, $\mathbf{X}_{t+1}$. \item[\code{P2}] Uniform Mutation. At random choose $i\in\mathbf{N}$. Select a value $\tilde{x}_i \sim U(\underline{x}_i, \overline{x}_i)$. Set $X_i=\tilde{x}_i$. \item[\code{P3}] Boundary Mutation. At random choose $i\in\mathbf{N}$. Set either $X_i=\underline{x}_i$ or $X_i=\overline{x}_i$, with probability $1/2$ of using each value. \item[\code{P4}] Non-uniform Mutation. At random choose $i\in\mathbf{N}$. Compute $p = (1-t/T)^B u$, where $t$ is the current generation number, $T$ is the maximum number of generations, $B>0$ is a tuning parameter and $u \sim U(0,1)$. Set either $X_i=(1-p)x_i + p\underline{x}_i$ or $X_i=(1-p)x_i + p\overline{x}_i$, with probability $1/2$ of using each value. \item[\code{P5}] Polytope Crossover. Using $m=\max(2,n)$ vectors $\mathbf{x}$ from the current population and $m$ random numbers $p_j\in(0,1)$ such that $\sum_{j=1}^m p_j = 1$, set $\mathbf{X} = \sum_{j=1}^m p_j \mathbf{x}_j$. \item[\code{P6}] Simple Crossover. Choose a single integer $i$ from $\mathbf{N}$. Using two parameter vectors, $\mathbf{x}$ and $\mathbf{y}$, set $X_i = p x_i + (1-p) y_i$ and $Y_i = p y_i + (1-p) x_i$, where $p\in(0,1)$ is a fixed number. \item[\code{P7}] Whole Non-uniform Mutation. Do non-uniform mutation for all the elements of $\mathbf{X}$. \item[\code{P8}] Heuristic Crossover. Choose $p \sim U(0,1)$. Using two parameter vectors, $\mathbf{x}$ and $\mathbf{y}$, compute $\mathbf{z} = p(\mathbf{x} - \mathbf{y}) + \mathbf{x}$. If $\mathbf{z}$ satisfies all constraints, use it. Otherwise choose another $p$ value and repeat. Set $\mathbf{z}$ equal to the better of $\mathbf{x}$ and $\mathbf{y}$ if a satisfactory mixed $\mathbf{z}$ is not found by a preset number of attempts. In this fashion produce two $\mathbf{z}$ vectors. \item[\code{P9}] Local-minimum Crossover. Choose $p \sim U(0,1)$. Starting with $\mathbf{x}$, run BFGS optimization up to a preset number of iterations to produce $\mathbf{\tilde{x}}$. Compute $\mathbf{z} = p\mathbf{\tilde{x}} + (1-p)\mathbf{x}$. If $\mathbf{z}$ satisfies boundary constraints, use it. Otherwise shrink $p$ by setting $p = p/2$ and recompute $\mathbf{z}$. If a satisfactory $\mathbf{z}$ is not found by a preset number of attempts, return $\mathbf{x}$. This operators is extremely computationally intensive, use sparingly. \end{enumerate} \begin{flushleft} Notation: \\ [2ex] $\mathbf{X} =\begin{bmatrix}X_1,\dots,X_n\end{bmatrix}$ is the vector of $n$ parameters $X_i$. $\underline{x}_i$ is the lower bound and $\overline{x}_i$ is the upper bound on values for $X_i$. $x_i$ is the current value of $X_i$, and $\mathbf{x}$ is the current value of $\mathbf{X}$. $\mathbf{N} = \{1,\dots,n\}$. $p \sim U(0,1)$ means that $p$ is drawn from the uniform distribution on the $[0,1]$ interval. \end{flushleft} \caption{`genoud' Operators. Adapted from \citet{SekhonMebane1998}.} \label{tab:operators} \begin{center} \line(1,0){450} \end{center} \end{table} The evolutionary algorithm in \pkg{rgenoud} uses nine operators that are listed in Table~\ref{tab:operators}. The operators extend and modify a set of operators used in \code{GENOCOP} \citep{MichalewiczSwaminathanLogan1993, Michalewicz1992}. The operators are numbered using syntax matching that used to refer to them by \pkg{rgenoud}. The \textit{cloning} operator simply makes copies of the best trial solution in the current generation (independent of this operator, \pkg{rgenoud} always retains one instance of the best trial solution). The \textit{uniform mutation}, \textit{boundary mutation} and \textit{non-uniform mutation} operators act on a single trial solution. Uniform mutation changes one parameter in the trial solution to a random value uniformly distributed on the domain specified for the parameter. Boundary mutation replaces one parameter with one of the bounds of its domain. Non-uniform mutation shrinks one parameter toward one of the bounds, with the amount of shrinkage decreasing as the generation count approaches the specified maximum number of generations. \textit{Whole non-uniform mutation} does non-uniform mutation for all the parameters in the trial solution. \textit{Heuristic crossover} uses two trial solutions to produce a new trial solution located along a vector that starts at one trial solution and points away from the other one. \textit{Polytope crossover} (inspired by simplex search, \citealt[][94--95]{GillMurrayWright1981}) computes a trial solution that is a convex combination of as many trial solutions as there are parameters. \textit{Simple crossover} computes two trial solutions from two input trial solutions by swapping parameter values between the solutions after splitting the solutions at a randomly selected point. This operator can be especially effective if the ordering of the parameters in each trial solution is consequential. \textit{Local-minimum crossover} computes a new trial solution in two steps: first it does a preset number of BFGS iterations starting from the input trial solution; then it computes a convex combination of the input solutions and the BFGS iterate. \section{Examples} \label{sec:examples} The only function in the \pkg{rgenoud} package is \code{genoud}. The interface of this function is similar to that of the \code{optim} function in \proglang{R}. But the function has many additional arguments that control the behavior of the evolutionary algorithm. \subsection{Asymmetric Double Claw:} Our first example, which we also studied in \citet{SekhonMebane1998}, is a normal mixture called the Asymmetric Double Claw (ADC). We plot the function in Figure~\ref{fig:mixture1}. \begin{figure} \caption{Normal Mixture: Asymmetric Double Claw} \vspace{-.5in} \label{fig:mixture1} \begin{center} \includegraphics{fig1.pdf} \end{center} \vspace{-.7in} \end{figure} Mathematically, this mixture is defined as \begin{eqnarray} \label{eq:adclaw} f_{\mathrm{ADC}} & = \sum_{m=0}^{1} \frac{46}{100} \mathrm{N}\left(2m-1,\frac{2}{3}\right) + \sum_{m=1}^{3} \frac{1}{300} \mathrm{N}\left(\frac{-m}{2},\frac{1}{100}\right) + \sum_{m=1}^{3} \frac{7}{300} \mathrm{N}\left(\frac{m}{2},\frac{7}{100}\right), \end{eqnarray} where N is the normal density. The asymmetric double claw is difficult to maximize because there are many local solutions. There are five local maxima in Figure \ref{fig:mixture1}. Standard derivative-based optimizers would simply climb up the hill closest to the starting value. To optimize this normal mixture we must first create a function for it <>= claw <- function(xx) { x <- xx[1] y <- (0.46*(dnorm(x,-1.0,2.0/3.0) + dnorm(x,1.0,2.0/3.0)) + (1.0/300.0)*(dnorm(x,-0.5,.01) + dnorm(x,-1.0,.01) + dnorm(x,-1.5,.01)) + (7.0/300.0)*(dnorm(x,0.5,.07) + dnorm(x,1.0,.07) + dnorm(x,1.5,.07))) return(y) } @ And we now make a call to \pkg{rgenoud} using this function: <>= library("rgenoud") claw1 <- genoud(claw, nvars=1, max=TRUE, pop.size=3000) @ The first argument of \code{genoud} is the function to be optimized. The first argument of that function must be the vector of parameters over which optimizing is to occur. Generally, the function should return a scalar result.\footnote{The function to be optimized may return a vector if one wishes to do lexical optimization. Please see the \code{lexical} option to \code{genoud}.} The second argument of \code{genoud} in this example (\code{nvars}) is the number of variables the function to be optimized takes. The third argument, \code{max=TRUE}, tells \code{genoud} to maximize the function instead of its default behavior which is to minimize. The fourth option \code{pop.size} controls the most important part of the evolutionary algorithm, the population size. This is the number of individuals \code{genoud} uses to solve the optimization problem. As noted in the theoretical discussion, the theorems related to evolutionary algorithms are asymptotic in the population size so larger is generally better but obviously takes longer. The maximum solution of the double claw density is reliably found by \code{genoud} even using the default value of \code{pop.size=1000}. Reliability does increase as the \code{pop.size} is made larger. Unfortunately, because of the stochastic nature of the algorithm, it is impossible to generally answer the question of what is the best population size to use. Other options determine the maximum number of generations the evolutionary algorithm computes. These options are \code{max.generations}, \code{wait.generations} and \code{hard.generation.limit}. The specified termination point also affects how some of the operators perform: the two non-uniform mutation operators introduce smaller ranges of variation in the trial solutions as the generation count approaches the specified \code{max.generations} value. There are many more options that can be used to fine-tune the behavior of the algorithm. The output printed by \code{genoud} is controlled by a \code{print.level} argument. The default value, \code{print.level=2}, produces relatively verbose output that gives extensive information about the set of operators being used and the progress of the optimization. Normally \proglang{R} conventions would suggest setting the default to be \code{print.level=0}, which would suppress output to the screen, but because \code{genoud} runs may take a long time, it can be important for the user to receive some feedback to see the program has not died and to be able to see where the program got stuck if it eventually fails to make adequate progress. The output printed by the preceding invocation of \code{genoud}, which uses the default value for a \code{print.level} argument, is as follows. \begin{CodeChunk} \begin{CodeOutput} Fri Feb 9 19:33:42 2007 Domains: -1.000000e+01 <= X1 <= 1.000000e+01 Data Type: Floating Point Operators (code number, name, population) (1) Cloning........................... 372 (2) Uniform Mutation.................. 375 (3) Boundary Mutation................. 375 (4) Non-Uniform Mutation.............. 375 (5) Polytope Crossover................ 375 (6) Simple Crossover.................. 376 (7) Whole Non-Uniform Mutation........ 375 (8) Heuristic Crossover............... 376 (9) Local-Minimum Crossover........... 0 HARD Maximum Number of Generations: 100 Maximum Nonchanging Generations: 10 Population size : 3000 Convergence Tolerance: 1.000000e-03 Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation. Checking Gradients before Stopping. Using Out of Bounds Individuals. Maximization Problem. GENERATION: 0 (initializing the population) Fitness value... 4.112017e-01 mean............ 4.990165e-02 variance........ 9.708147e-03 #unique......... 3000, #Total UniqueCount: 3000 var 1: best............ 9.966758e-01 mean............ 3.453097e-02 variance........ 3.373681e+01 GENERATION: 1 Fitness value... 4.113123e-01 mean............ 2.237095e-01 variance........ 2.566140e-02 #unique......... 1858, #Total UniqueCount: 4858 var 1: best............ 9.995043e-01 mean............ 4.615946e-01 variance........ 7.447887e+00 [...] GENERATION: 10 Fitness value... 4.113123e-01 mean............ 2.953888e-01 variance........ 2.590842e-02 #unique......... 1831, #Total UniqueCount: 21708 var 1: best............ 9.995033e-01 mean............ 8.403935e-01 variance........ 5.363241e+00 GENERATION: 11 Fitness value... 4.113123e-01 mean............ 2.908561e-01 variance........ 2.733896e-02 #unique......... 1835, #Total UniqueCount: 23543 var 1: best............ 9.995033e-01 mean............ 8.084638e-01 variance........ 6.007372e+00 'wait.generations' limit reached. No significant improvement in 10 generations. Solution Fitness Value: 4.113123e-01 Parameters at the Solution (parameter, gradient): X[ 1] : 9.995033e-01 G[ 1] : -6.343841e-09 Solution Found Generation 1 Number of Generations Run 11 Fri Feb 9 19:33:45 2007 Total run time : 0 hours 0 minutes and 3 seconds \end{CodeOutput} \end{CodeChunk} %DESCRIBE OUTPUT After printing the date and time of the run, the program prints the domain of values it is allowing for each parameter of the function being optimized. In this case the default domain values are being used. Naturally it is important to specify domains wide enough to include the solution. In practice with highly nonlinear functions it is often better to specify domains that are relatively wide than to have domains that narrowly and perhaps even correctly bound the solution. This surprising behavior reflects the fact with a highly nonlinear function, a point that is close to the solution in the sense of simple numerical proximity may not be all that close in the sense of there being a short feasible path to get to the solution. Next the program prints the Data Type. This indicates whether the parameters of the function to be optimized are being treated as floating point numbers or integers. For more information about this, see the \code{data.type.int} argument. The program then displays the number of operators being used, followed by the values that describe the other characteristics set for this particular run: the maximum number of generations, the population size and the tolerance value to be used to determine when the parameter values will be deemed to have converged. The output then reports whether BFGS optimization will be applied to the best trial solution produced by the operators in each generation. For problems that are smooth and concave in a neighborhood of the global optimum, using the BFGS in this way can help \code{genoud} quickly converge once the best trial solution is in the correct neighborhood. This run of \code{genoud} will also compute the gradient at the best trial solution before stopping. In fact this gradient checking is used as a convergence check. The algorithm will not start counting its final set of generations (the \code{wait.generations}) until each element of the gradient is smaller in magnitude than the convergence tolerance. Gradients are never used and BFGS optimization is not used when the parameters of the function to be optimized are integers. The next message describes how strictly \code{genoud} is enforcing the boundary constraints specified by the domain values. By default (\code{boundary.enforcement=0}), the trial solutions are allowed to wander freely outside the boundaries. The boundaries are used only to define domains for those operators that use the boundary information. Other settings of the \code{boundary.enforcement} argument induce either more stringent or completely strict enforcement of the boundary constraints. Notice that the boundary constraints apply to the parameters one at a time. To enforce constraints that are defined by more complicated functional or data-dependent relationships, one can include an appropriate penalty function as part of the definition of the function to be optimized, letting that function define an extremely high (if minimizing) or low (if maximizing) value to be returned if the desired conditions are violated. After reporting whether it is solving a minimization or a maximization problem, \code{genoud} reports summary statistics that describe the distribution of the fitness value and the parameter values across the trial solutions at the end of each generation. In the default case where \code{genoud} is keeping track of all the distinct solutions considered over the whole course of the optimizing run, these generational reports also include a report of the number of unique trial solutions in the current population and the number of unique solutions ever considered. The benefit of keeping track of the solutions is to avoid repeatedly evaluating the function being optimized for the identical set of parameter values. This can be an important efficiency when function evaluations are expensive, as they can be in statistical applications where the data are extensive. This tracking behavior is controlled by the \code{MemoryMatrix} argument. Upon convergence, or when the hard maximum generation limit is reached, the program prints the fitness value at the best trial solution and that solution's parameter values. In this case the solution was found after one generation. While the Asymmetric Double Claw might present a difficult challenge for a gradient-based optimizer that uses only local hill climbing, it is an almost trivially simple problem for \code{genoud}. \subsection{Benchmark Functions:} The second example is a suite of 23 benchmark nonlinear functions used in \citet{yao.liu.lin1999} to study a pair of evolutionary programming optimization algorithms. Function definitions are in Table~\ref{tab:23funcs}. Because it includes a random component and so lacks a reproducible minimum value, we ignore the function numbered function 7 in their sequence.\footnote{The omitted function is $\sum_{i=1}^n ix_i^4 +U(0,1)$, where $U(0,1)$ is a uniformly distributed random variable on the unit interval that takes a new value whenever the function is evaluated. This stochastic aspect means that even given the set of parameters that minimize the nonstochastic component $\sum_{i=1}^n ix_i^4$, i.e., $x_i=0$, the value of the function virtually never attains the minimum possible value of zero. An optimizer that evaluated the function at $x_i=0$ would not in general obtain a function value smaller than the function value obtained for a wide range of different parameter values. Hence we do not consider this function to be a good test for function optimization algorithms.} Implementations of these functions are available in the supplemental \proglang{R} file provided with this article.\footnote{This supplemental file is available at \url{http://sekhon.berkeley.edu/rgenoud/func23.R}.} These \proglang{R} definitions include the values of the constants used in functions 14, 15 and 19 through 23. The function argument domains are restricted to the specific domains used by \citet{yao.liu.lin1999} via bounds that are stated in the list named \code{testbounds} in the supplemental file. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{tabular}{LLLL} \text{func.} & \text{definition} & n & \text{minimum}^a \\ 1 & \sum_{i=1}^n x_i^2 & 30 & 0 \\ 2 & \sum_{i=1}^n |x_i| + \prod_{i=1}^n |x_i| & 30 & 0 \\ 3 & \sum_{i=1}^n (\sum_{j=1}^i x_j)^2 & 30 & 0 \\ 4 & \max_i \{|x_i|, 1\leq i\leq n\} & 30 & 0 \\ 5 & \sum_{i=1}^{n-1} [100(x_{i+1}-x_i^2)^2 +(x_i-1)^2], & 30 & 0 \\ 6 & \sum_{i=1}^n (\lfloor x_i + 0.5\rfloor)^2 & 30 & 0 \\ 7 & \sum_{i=1}^n ix_i^4 +U(0,1) & 30 & 0 \\ 8 & \sum_{i=1}^n -x_i\sin(\sqrt{|x_i|}) & 30 & -12569.5 \\ 9 & \sum_{i=1}^n [x_i^2-10\cos(2\pi x_i)+10] & 30 & 0 \\ 10 & -20\exp\left(-0.2\sqrt{n^{-1}\sum_{i=1}^n x_i^2}\,\right) \\ & \qquad -\exp(n^{-1}\sum_{i=1}^n\cos 2\pi x_i)+20+e & 30 & 0 \\ 11 & (1/1000) \sum_{i=1}^n x_i^2 - \prod_{i=1}^n\cos\left(x_i/\sqrt{i}\right) + 1 & 30 & 0 \\ 12 & n^{-1}\pi \left\{10 \sin^2(\pi y_1)+\sum_{i=1}^{n-1}(y_i-1)^2 [1+10\sin^2(\pi y_{i+1})]+(y_n-1)^2\right\} \\ & \quad +\sum_{i=1}^n u(x_i,10,100,4), & 30 & 0 \\ & y_i=1+(x_i+1)/4, \quad u(x_i,a,k,m)=\begin{cases} k(x_i-a)^m, & x_i>a, \\ 0, & -a\leq x_i\leq a,\\ k(-x_i-a)^m, & x_i<-a, \end{cases} & \\ 13 & \left\{ \sin^2(3\pi x_1)+\sum_{i=1}^{n-1}(x_i-1)^2[1+\sin^2(3\pi x_{i+1})]\right\}/10 \\ & \quad +(x_n-1)[1+\sin^2(2\pi x_n)]/10 +\sum_{i=1}^n u(x_i,5,100,4) & 30 & 0 \\ 14 & \left\{1/500+ \sum_{j=1}^{25} 1/\left[j+\sum_{i=1}^2(x_i-a_{ij})^6\right]\right\}^{-1} & 2 & 1 \\ 15 & \sum_{i=1}^{11} [a_i-x_1(b_i^2+b_ix_2)/(b_i^2+b_ix_3+x_4)]^2 & 4 & 0.0003075 \\ 16 & 4x_1^2-2.1x_1^4+x_1^6/3+x_1x_2-4x_2^2+4x_2^4 & 2 & -1.0316285 \\ 17 & [x_2-5.1x_1^2/(4\pi^2) + 5x_1/\pi - 6]^2 + 10[1-1/(8\pi)]\cos(x_1) + 10 & 2 & 0.398 \\ 18 & [1+(x_1+x_2+1)^2(19-14 x_1+3 x_1^2-14 x_2+6 x_1 x_2+3 x_2^2)] \\ & \quad \times [30+(2 x_1-3 x_2)^2 (18-32 x_1+12 x_1^2+48 x_2-36 x_1 x_2+27 x_2^2)] & 2 & 3 \\ 19 & -\sum_{i=1}^4 c_i\exp\left[-\sum_{j=1}^4 a_{ij}(x_i-p_{ij})^2\right] & 4 & -3.86 \\ 20 & -\sum_{i=1}^4 c_i\exp\left[-\sum_{j=1}^6 a_{ij}(x_i-p_{ij})^2\right] & 6 & -3.32 \\ 21 & \sum_{i=1}^5 [(x-a_i)^{\prime}(x-a_i)+c_i]^{-1} & 4 & -10 \\ 22 & \sum_{i=1}^7 [(x-a_i)^{\prime}(x-a_i)+c_i]^{-1} & 4 & -10 \\ 23 & \sum_{i=1}^{10} [(x-a_i)^{\prime}(x-a_i)+c_i]^{-1} & 4 & -10 \end{tabular} \begin{flushleft} Notes: $^a$Minimum function value within specified bounds as given by \citet[85]{yao.liu.lin1999}. \end{flushleft} \vspace*{.1in} \caption{23 Benchmark Functions} \label{tab:23funcs} \begin{center} \line(1,0){450} \end{center} \end{table} As \citet{yao.liu.lin1999} describe, optimizing each of functions 1--13 presents a high-dimensional problem. These functions each have $n=30$ free parameters. Functions 1--5 are unimodal, with function 5 being a 30-dimensional version of the banana-shaped Rosenbrock function. Function 6 is a step function. Function 6 has one minimum value that occurs when all arguments are in the interval $x_i\in[0,.5)$, and the function is discontinuous. Functions 8--13 are multimodal, defined such that the number of local minima increases exponentially with the number of arguments. \citet[84]{yao.liu.lin1999} describe these functions as among ``the most difficult class of problems for many optimization algorithms (including [evolutionary programming]).'' Functions 14--23, which have between two and six free parameters each, each have only a few local minima. Nonetheless the evolutionary programming algorithms considered by \citet{yao.liu.lin1999} have trouble optimizing functions 21--23. Although \citet[85]{yao.liu.lin1999} state that each of these functions has a minimum value of $-10$, over 50 replications the two algorithms they consider achieve solutions averaging between $-5.52$ and $-9.10$ \citep[88, Table~IV]{yao.liu.lin1999}. We use these benchmark functions to illustrate not only how effective \code{genoud} can be with a range of difficult problems, but also to emphasize an important aspect of how one should think about trying to tune the optimizer's performance. Theory regarding genetic algorithms suggests that optimal solutions are more likely to appear as both the population size of candidate solutions and the number of generations increase. In \code{genoud} two arguments determine the number of generations. One is \code{max.generations}: if \code{hard.generation.limit=TRUE}, then the value specified for \code{max.generations} is a binding upper limit. The other is \code{wait.generations}, which determines when the algorithm terminates if \code{hard.generation.limit=FALSE}. But even if \code{hard.generation.limit=TRUE}, then \code{wait.generations} determines for how many generations the algorithm continues once the best parameter vector and the value of the function being optimized appear to have settled down. The fact that the current best solution is not changing should not be treated as decisive, because this solution may be merely a local optimum or a saddlepoint. If the population size is sufficient, the algorithm tends to build a population of trial solutions that contain parameters in neighborhoods of all the competitive local optima in the domain defined by the parameter boundaries. Even while the current best solution is stable, the algorithm is improving the solutions near other local optima. So having a higher \code{wait.generations} value never worsens the algorithm's efficacy. Increasing \code{max.generations} may or may not in itself improve optimization. The value of \code{max.generations} sets the value of $T$ used in the mutation operators---operators 4 and 7 in Table~\ref{tab:operators}. These mutation operators perform random search near a trial solution that has been selected for mutation only when the current generation count is an appreciable fraction of $T$. So increasing \code{max.generations} without changing \code{wait.generations} increases the period during which random search is occurring over a wider domain. For multimodal functions such a wider search may be helpful, but sometimes failing to search more densely near the current trial solutions is not good. We use \code{genoud} to minimize the 23 functions using two values for \code{pop.size} (5000 and 10000) and two values for \code{max.generations} (30 and 100). Following \citet{yao.liu.lin1999}, we replicate each optimization 50 times. The following code describes the computations. The list \code{testfuncs}, vector \code{testNparms} and list \code{testbounds} are defined in the supplemental \proglang{R} file, and it is assume that this file is loaded with the \code{source("supplemental.R")} command. The vector \code{gradcheck} is true for all elements except the ones corresponding to functions 6 and 7. <>= source("supplemental.R") gradcheck <- rep(TRUE,23) gradcheck[6:7] <- FALSE sizeset <- c(5000,10000) genset <- c(30,100) nreps <- 50 gsarray <- array(NA, dim=c(length(sizeset), length(genset), 23, nreps)) asc <- function(x) { as.character(x) } dimnames(gsarray) <- list(asc(sizeset), asc(genset), NULL, NULL); for (gsize in sizeset) { for (ngens in genset) { for (i in 1:23) { for (j in 1:nreps) { gsarray[as.character(gsize), as.character(ngens),i,j] <- genoud(testfuncs[[i]], nvars=testNparms[i], pop.size=gsize, max.gen=ngens, hard.gen=TRUE, Domains=testbounds[[i]], solution.tol=1e-6, boundary=1, gradient.check=gradcheck[i], print=0)$value } } } } @ Using \code{genoud} to minimize the benchmark functions produces excellent results, at least when the \code{pop.size} and \code{max.generations} arguments are sufficiently large. Table~\ref{tab:23mean} reports the mean function values for each configuration of the arguments. These values may be compared both to the true function minima given by \citet{yao.liu.lin1999} (see the rightmost column in Table~\ref{tab:23funcs}) and to the average minimum function values \citet{yao.liu.lin1999} report for their ``fast'' evolutionary programming (FEP) algorithm, which appear in the last column of Table~\ref{tab:23mean}. The \code{genoud} averages for the \code{max.gen=100} configurations equal or are close to the true minima for all the functions except function 13. One can reasonably argue that the average solutions for function 5 are not as close to zero as might be desired: these averages are close to $10^{-7}$, while the averages for other functions that have a true minimum of zero are $10^{-15}$ or smaller. And the averages for functions 6, 12 and 15 in the \code{pop.size=5000} case are off. The effect of increasing \code{pop.size} is apparent with respect to both those three functions and also functions 13 and 20--23: the average minima are smaller with \code{pop.size=10000} than with \code{pop.size=5000}. Except for functions 6 and 12 in the \code{pop.size=5000} case and function 13, all the \code{genoud} solution averages for \code{max.gen=100} are either slightly or substantially better than the corresponding FEP solution averages. The results in Table~\ref{tab:23mean} clearly illustrate the potential consequences of not allowing \code{genoud} to run for a sufficient number of generations. While some of the \code{genoud} solutions for \code{max.gen=30} have competitive means, several of the means are not good at all. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{tabular}{llllll} & \multicolumn{4}{c}{\code{genoud}} & \\ \cline{2-5} & \multicolumn{2}{c}{\code{pop.size=5000}$^a$} & \multicolumn{2}{c}{\code{pop.size=10000}$^a$} & \\ \text{func.} & \code{max=30} & \code{max=100} & \code{max=30} & \code{max=100} & \text{FEP}$^b$ \\ 1 & 1.453\e 32 & 1.658\e 32 & 2.416\e 32 & 6.134\e 32 & 5.7\e 4 \\ 2 & 6.55\e 16 & 7.212\e 16 & 9.652\e 16 & 1.043\e 15 & 8.1\e 3 \\ 3 & 4.633\e 18 & 3.918\e 18 & 3.787\e 18 & 4.032\e 18 & 1.6\e 2 \\ 4 & 6.203\e 17 & 6.542\e 17 & 9.453\e 17 & 7.85\e 17 & 0.3 \\ 5 & 0.07973 & 5.887\e 08 & 8.133\e 08 & 8.917\e 08 & 5.06 \\ 6 & 18.58 & 0.08 & 9.38 & 0 & 0 \\ % 7 & 0.1114 & 0.07473 & 0.1114 & 0.06466 & 7.6\e 3 \\ 8 & -12569.49 & -12569.49 & -12569.49 & -12569.49 & -12554.5 \\ 9 & 2.786 & 0 & 0.9353 & 0 & 4.6\e 2 \\ 10 & 2.849 & 3.997\e 15 & 2.199 & 3.997\e 15 & 1.8\e 2 \\ 11 & 7.994\e 17 & 7.105\e 17 & 9.548\e 17 & 6.439\e 17 & 1.6\e 2 \\ 12 & 5.371\e 19 & 0.004147 & 0.002073 & 1.178\e 19 & 9.2\e 6 \\ 13 & 0.02095 & 0.006543 & 0.006629 & 0.003011 & 1.6\e 4 \\ 14 & 0.998 & 0.998 & 0.998 & 0.998 & 1.22 \\ 15 & 0.0003441 & 0.0004746 & 0.0003807 & 0.0003807 & 5.0\e 4 \\ 16 & -1.0316285 & -1.0316285 & -1.0316285 & -1.0316285 & -1.03 \\ 17 & 0.3979 & 0.3979 & 0.3979 & 0.3979 & 0.398 \\ 18 & 3 & 3 & 3 & 3 & 3.02 \\ 19 & -3.863 & -3.863 & -3.863 & -3.863 & -3.86 \\ 20 & -3.274 & -3.277 & -3.279 & -3.286 & -3.27 \\ 21 & -9.85 & -9.444 & -9.95 & -10.05 & -5.52 \\ 22 & -9.771 & -10.09 & -10.19 & -10.3 & -5.52 \\ 23 & -10.1 & -9.997 & -10.32 & -10.21 & -6.57 \end{tabular} \begin{flushleft} Note: $^b$Average minimum function values (over 50 replications) obtained using \code{genoud}. $^a$Mean best function values (over 50 replications) reported for the ''fast'' evolutionary programming algorithm, from \citet[85 and 88, Tables II--IV]{yao.liu.lin1999}. \end{flushleft} \vspace*{.1in} \caption{Mean Values of 22 Optimized Functions} \label{tab:23mean} \begin{center} \line(1,0){450} \end{center} \end{table} The effect of increasing \code{pop.size} are even more clearly apparent in Table~\ref{tab:23sdev}, which reports the standard deviations of the respective minima across the 50 replications. With the exceptions of functions 6, 12, 13, 15 and 21 with \code{pop.size=5000}, the \code{genoud} solutions for \code{max.gen=100} vary much less than the corresponding FEP solutions. For those functions and also for functions 20, 22 and 23, the \code{max.gen=100} solutions with \code{pop.size=10000} vary noticeably less than the solutions with \code{pop.size=5000}. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{tabular}{llllll} & \multicolumn{4}{c}{\code{genoud}} & \\ \cline{2-5} & \multicolumn{2}{c}{\code{pop.size=5000}$^a$} & \multicolumn{2}{c}{\code{pop.size=10000}$^a$} & \\ \text{func.} & \code{max=30} & \code{max=100} & \code{max=30} & \code{max=100} & \text{FEP}$^b$ \\ 1 & 9.997\e 32 & 7.059\e 32 & 9.562\e 32 & 2.1\e 31 & 1.3\e 4 \\ 2 & 1.668\e 15 & 1.621\e 15 & 2.116\e 15 & 2.102\e 15 & 7.7\e 4 \\ 3 & 4.568\e 18 & 3.342\e 18 & 4.38\e 18 & 5.136\e 18 & 1.4\e 2 \\ 4 & 1.793\e 16 & 1.758\e 16 & 2.055\e 16 & 2.002\e 16 & 0.5 \\ 5 & 0.5638 & 4.921\e 08 & 5.573\e 08 & 4.955\e 08 & 5.87 \\ 6 & 5.65 & 0.274 & 3.528 & 0 & 0 \\ % 7 & 0.0837 & 0.05153 & 0.08042 & 0.04883 & 2.6\e 3 \\ 8 & 3.749\e 10 & 1.071\e 12 & 8.948\e 09 & 6.365\e 13 & 52.6 \\ 9 & 1.864 & 0 & 1.179 & 0 & 1.2\e 2 \\ 10 & 0.7146 & 0 & 0.702 & 0 & 2.1\e 3 \\ 11 & 1.209\e 16 & 1.582\e 16 & 1.289\e 16 & 8.713\e 17 & 2.2\e 2 \\ 12 & 2.336\e 18 & 0.02052 & 0.01466 & 7.423\e 19 & 3.6\e 6 \\ 13 & 0.03427 & 0.006867 & 0.006903 & 0.001508 & 7.3\e 5 \\ 14 & 5.638\e 12 & 8.894\e 11 & 1.029\e 12 & 4.35\e 12 & 0.56 \\ 15 & 0.0001813 & 0.0003546 & 0.000251 & 0.0002509 & 3.2\e 4 \\ 16 & 1.315\e 14 & 9.751\e 15 & 1.233\e 14 & 1.054\e 14 & 4.9\e 7 \\ 17 & 5.422\e 15 & 5.51\e 15 & 4.925\e 15 & 1.392\e 14 & 1.5\e 7 \\ 18 & 1.509\e 13 & 3.477\e 14 & 6.18\e 14 & 2.907\e 14 & 0.11 \\ 19 & 7.349\e 15 & 1.521\e 15 & 1.344\e 14 & 7.255\e 15 & 1.4\e 5 \\ 20 & 0.05884 & 0.0583 & 0.05765 & 0.05504 & 5.9\e 2 \\ 21 & 1.212 & 1.776 & 1.005 & 0.7145 & 1.59 \\ 22 & 1.937 & 1.269 & 1.052 & 0.7459 & 2.12 \\ 23 & 1.479 & 1.636 & 1.066 & 1.29 & 3.14 \end{tabular} \begin{flushleft} Note: $^a$Standard deviation of the minimum function values (over 50 replications) obtained using \code{genoud}. $^b$Standard deviation of the best function values (over 50 replications) reported for the ''fast'' evolutionary programming algorithm, from \citet[85 and 88, Tables II--IV]{yao.liu.lin1999}. \end{flushleft} \vspace*{.1in} \caption{Standard Deviations of Values of 22 Optimized Functions} \label{tab:23sdev} \begin{center} \line(1,0){450} \end{center} \end{table} \subsection{A Logistic Least Quartile Difference Estimator:} Our third example is a version of the LQD estimator used in \code{multinomRob}. Using the \proglang{R} function \code{IQR} to compute the interquartile range, the function to be minimized may be defined as follows.\footnote{The LQD problem solved in \code{multinomRob} is somewhat different. There the problem is to minimize the $\binom{h_{K}}{2}$ order statistic of the set of absolute differences among the standardized residuals, where $h_K$ is a function of the sample size and the number of unknown regression model coefficients \citep{MebaneSekhon2004}. The problem considered in the current example is simpler but exhibits similar estimation difficulties.} <>= LQDxmpl <- function(b) { logistic <- function(x) { 1/(1+exp(-x)) } sIQR <- function(y, yhat, n) { IQR((y-yhat)/sqrt(yhat*(n-yhat)), na.rm=TRUE) } sIQR(y, m*logistic(x %*% b), m) } @ For this example we define \code{LQDxmpl} after we compute the simulated data, so the data vector \code{y}, matrix \code{x} and scalar \code{m} are in scope to evaluate to have the values we simulate: <>= m <- 100 x <- cbind(1,rnorm(1000),rnorm(1000)) b1 <- c(.5, 1, -1) b2 <- c(0, -1, 1) logistic <- function(x) { 1/(1+exp(-x)) } y <- rbinom(1000, m, logistic(c(x[1:900,] %*% b1, x[901:1000,] %*% b2))) @ The data simulate substantial contamination. The first 900 observations are generated by one binomial regression model while the last 100 observations come from a very different model. Presuming we are interested in the model that generated the bulk of the data, ignoring the contamination in a generalized linear model with the binomial family produces very poor results: <>= summary(glm1 <- glm(cbind(y,m-y) ~ x[,2] + x[,3], family="binomial")) @ \begin{CodeChunk} \begin{CodeOutput} Call: glm(formula = cbind(y, m - y) ~ x[, 2] + x[, 3], family = "binomial") Deviance Residuals: Min 1Q Median 3Q Max -22.9168 -1.1693 0.3975 1.5895 24.6439 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 0.439492 0.007097 61.93 <2e-16 *** x[, 2] 0.679847 0.007985 85.14 <2e-16 *** x[, 3] -0.716963 0.007852 -91.31 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 \end{CodeOutput} \end{CodeChunk} Of course, if we knew which observations to omit the results would be much better: <>= suby <- y[1:900] subx <- x[1:900,] summary(glm2 <- glm(cbind(suby,m-suby) ~ subx[,2] + subx[,3], family="binomial")) @ \begin{CodeChunk} \begin{CodeOutput} Call: glm(formula = cbind(suby, m - suby) ~ subx[, 2] + subx[, 3], family = "binomial") Deviance Residuals: Min 1Q Median 3Q Max -3.21478 -0.71699 0.03528 0.67867 2.88314 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 0.501880 0.008036 62.46 <2e-16 *** subx[, 2] 1.003592 0.009779 102.63 <2e-16 *** subx[, 3] -0.984295 0.009437 -104.30 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 \end{CodeOutput} \end{CodeChunk} But in practical applications it is unknown apriori which observations should be treated as outliers. As the definition of \code{LQDxmpl} indicates, the LQD is based on minimizing the interquartile range (IQR) of the standardized residuals. Because the quartiles correspond to different data points for different values of the regression coefficients, the fitness function is not smooth, which is to say it is not everywhere differentiable. In general, at every point in the parameter space where the identity of the first or third quartile point changes, the function is not differentiable. Figure~\ref{fig:lqd1} illustrates this. A higher resolution version of this figure is available in \cite{MebaneJr.+Sekhon:2011}---also see \url{http://sekhon.berkeley.edu/papers/rgenoudJSS.pdf}. The IQR clearly has a minimum in the vicinity of the coefficient values used to generate most of the data. But contour plots for the numerically evaluated partial derivative with respect to the second coefficient parameter testify to the function's local irregularity. The function we use to evaluate this numerical derivative is defined as follows. <>= dLQDxmpl <- function(b) { eps <- 1e-10 logistic <- function(x) { 1/(1+exp(-x)) } sIQR <- function(y, yhat, n) { IQR((y-yhat)/sqrt(yhat*(n-yhat)), na.rm=TRUE) } dsIQR <- vector() for (i in 1:length(b)) { beps <- b beps[i] <- b[i]+eps dsIQR <- c(dsIQR, (sIQR(y, m*logistic(x %*% beps), m)- sIQR(y, m*logistic(x %*% b), m))/eps) } return(dsIQR) } @ Setting the intercept equal to 0.5, the code to generate the plotted values is % -rw-rw---- 1 wrm1 research 1878 Feb 10 2007 lqdxmpl2plotB.R <>= blen <- 3 lenbseq <- length(bseq <- seq(-2,2,length=200)) bseq3 <- seq(-1.2,-.9,length=200) bseq2 <- seq(.89,1.1,length=200) IQRarr <- IQRarrA <- array(NA, dim=c((1+blen), lenbseq, lenbseq)) dimnames(IQRarrA) <- list(NULL, as.character(bseq), as.character(bseq)) dimnames(IQRarr) <- list(NULL, as.character(bseq2), as.character(bseq3)) for (i in 1:lenbseq) { for (j in 1:lenbseq) { IQRarrA[1,i,j] <- LQDxmpl(c(.5, bseq[i], bseq[j])) IQRarrA[-1,i,j] <- dLQDxmpl(c(.5, bseq[i], bseq[j])) IQRarr[1,i,j] <- LQDxmpl(c(.5, bseq2[i], bseq3[j])) IQRarr[-1,i,j] <- dLQDxmpl(c(.5, bseq2[i], bseq3[j])) } } @ The following code produces the plots: <>= par(mfrow=c(2,2), lwd=.1) contour(bseq,bseq, IQRarrA[1,,], main="IQR", xlab="b[2]", ylab="b[3]") contour(bseq,bseq, IQRarrA[3,,], main="partial derivative w/r/t b[2]", xlab="b[2]", ylab="b[3]") loc2 <- (150:160)-5 loc3 <- (40:50)+5 contour(bseq[loc2],bseq[loc3], IQRarrA[3,loc2,loc3], main="partial derivative w/r/t b[2]", xlab="b[2]", ylab="b[3]") contour(bseq2,bseq3, IQRarr[3,,], main="partial derivative w/r/t b[2]", xlab="b[2]", ylab="b[3]") @ If the IQR function were smooth, we would see clearly separated, slightly curved contour lines, reflecting the nonlinearity of the \code{logistic} function, but there is nothing like that. Instead, looking over the domain $[-2,2]^2$ for the second and third regression coefficient parameters, with 200 points evaluated along each axis (the upper right plot), there is a splotchy cloud. This reflects the fact that the derivative changes sign very frequently over the domain: of the 40,000 points at which the derivative is evaluated, it is positive at 12,460 points and negative at 27,540 points. \begin{figure}[t] \caption{Contour Plots of the LQD Fitness Function and of its Partial Derivatives} \label{fig:lqd1} \begin{center} \includegraphics{lqdxmpl2B.pdf} % -rw-rw---- 1 wrm1 research 2745 Feb 10 23:15 lqdxmpl2plotB.Rout \end{center} \vspace{-.3in} \end{figure} The LQD fitness function is not appreciably smoother close to the true values. The bottom two plots show the partial derivatives with respect to the second coefficient parameter evaluated over the domain $[.89,1.1]\times[-1.2,-.9]$. The bottom left plot evaluates the derivatives at 11 points along each axis while the bottom right plot uses 200 points along each axis. In the left plot it is easier to see the intricacy of the partitioning of the parameter space as the identity of the first or third quartile point changes. The bottom right plot shows the intricacy in fact replicates at the finer grain of the more detailed evaluations (to see this it is probably necessary to magnify the plot while viewing online the \textit{Journal of Statistical Software} version of this documentation).\footnote{Please see \cite{MebaneJr.+Sekhon:2011} or \url{http://sekhon.berkeley.edu/papers/rgenoudJSS.pdf}.} Within this smaller domain the sign of the derivative changes even more frequently than it does over the domain $[-2,2]^2$: the derivative is positive at 18,098 points and negative at 21,902 points. While the LQD fitness function may be differentiable in a neighborhood of the global solution, that neighborhood, if it exists, is clearly not very big. As likely is that the global solution is located at a point where the function is not differentiable. Hence a numerically evaluated gradient is not meaningful for evaluating whether the solution has been found. At the true solution, numerical gradient values may differ substantially from zero. To use the LQD to estimate the binomial regression model parameters we use the following call to \code{genoud}. Because gradient information is of questionable relevance for this problem, we turn off the termination condition that the gradient at the solution be smaller than the value specified for the \code{solution.tolerance} argument. We retain the default setting \code{BFGS=TRUE} because, in principle, gradient-driven optimization may help in each of the many differentiable neighborhoods, even if it is useless across the nondifferentiable boundaries. Our experience optimizing the LQD \citep{MebaneSekhon2004} shows that using the BFGS in this way improves performance, even though the gradient is not useful for evaluating whether the solution has been found. <>= LQD1 <- genoud(LQDxmpl, nvars=3, max=FALSE, pop.size=2000, max.generations=300, wait.generations=100, gradient.check=FALSE, print=1) @ This invocation of the \code{LQDxmpl} function matches the behavior of \code{multinomRob} in that it produces an estimate for the intercept parameter along with the other coefficients. In a linear regression context, the interquartile range statistic contains no information about the intercept, so the LQD is not an estimator for that parameter. With a binomial regression model there is some information about the intercept due to the nonlinearity of the \code{logistic} function. The LQD estimate for the intercept should nonetheless be expected not to be very good. Results from the preceding estimation are as follows. % macht:/home/xchg/jss07/rgenoud: % -rw-rw---- 1 wrm1 research 5080 Aug 7 02:31 lqdxmpl1b.Rout \begin{CodeChunk} \begin{CodeOutput} Tue Aug 7 02:27:08 2007 Domains: -1.000000e+01 <= X1 <= 1.000000e+01 -1.000000e+01 <= X2 <= 1.000000e+01 -1.000000e+01 <= X3 <= 1.000000e+01 [...] HARD Maximum Number of Generations: 300 Maximum Nonchanging Generations: 100 Population size : 2000 Convergence Tolerance: 1.000000e-06 Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation. Not Checking Gradients before Stopping. Using Out of Bounds Individuals. Minimization Problem. Generation# Solution Value 0 4.951849e-01 56 1.298922e-01 57 1.298891e-01 59 1.298848e-01 60 1.298820e-01 61 1.298793e-01 62 1.298768e-01 63 1.298744e-01 'wait.generations' limit reached. No significant improvement in 100 generations. Solution Fitness Value: 1.298743e-01 Parameters at the Solution (parameter, gradient): X[ 1] : 8.130357e-02 G[ 1] : 9.616492e-03 X[ 2] : 8.889485e-01 G[ 2] : -1.167897e-01 X[ 3] : -9.327966e-01 G[ 3] : -3.090130e-02 Solution Found Generation 63 Number of Generations Run 164 Tue Aug 7 02:31:09 2007 Total run time : 0 hours 4 minutes and 1 seconds \end{CodeOutput} \end{CodeChunk} Recall that the gradient is not reliably informative at the solution. To check whether this solution is believable, we might try reestimating the model using a larger population and larger specified number of generations: <>= LQD1 <- genoud(LQDxmpl, nvars=3, max=FALSE, pop.size=10000, max.generations=1000, wait.generations=300, gradient.check=FALSE, print=1) @ At the price of a greatly increased running time (from four minutes up to one hour 53 minutes), the results are better than the first run (even though the summary measure of fit is slightly worse): % macht:/home/xchg/jss07/rgenoud: % -rw-rw---- 1 wrm1 research 5236 Aug 7 05:16 lqdxmpl1d.Rout \begin{CodeChunk} \begin{CodeOutput} Minimization Problem. Generation# Solution Value 0 2.238865e-01 2 1.301149e-01 3 1.300544e-01 4 1.300482e-01 6 1.300375e-01 7 1.300343e-01 8 1.300323e-01 134 1.299662e-01 135 1.299099e-01 136 1.298867e-01 137 1.298843e-01 138 1.298822e-01 139 1.298791e-01 141 1.298774e-01 'wait.generations' limit reached. No significant improvement in 300 generations. Solution Fitness Value: 1.298770e-01 Parameters at the Solution (parameter, gradient): X[ 1] : 2.013748e-01 G[ 1] : -7.394125e-02 X[ 2] : 9.526390e-01 G[ 2] : 7.807607e-02 X[ 3] : -9.642458e-01 G[ 3] : 3.834052e-02 Solution Found Generation 141 Number of Generations Run 442 Tue Aug 7 05:16:37 2007 Total run time : 1 hours 53 minutes and 45 seconds \end{CodeOutput} \end{CodeChunk} %$ This example demonstrates a key difficulty that arises when optimizing irregular functions in the absence of gradients. It is difficult to assess when or whether an optimum has been found. The estimated coefficient values are close to the ones used to generate most of the data, except as expected the estimate for the intercept is not good. The estimates are better than if we had ignored the possibility of contamination. But whether these are the best possible estimates is not clear. If we were to use an even larger population and specify that an even greater number of generations be run, perhaps a better solution would be found. %http://sekhon.berkeley.edu/rgenoud/R/genoud_cluster_manual.R %http://sekhon.berkeley.edu/rgenoud/R/genoud_cluster_manual_tunnel.R %\code{genoud} can be tricked into doing constrained optimization by %passing in a function which contains a penalty function. Even for less irregular problems convergence is difficult to determine. Nonlinear optimizers often report false convergence, and users should not simply trust whatever convergence criteria an optimizer uses. \citet{McCulloughVinod2003} offer four criteria for verifying the solution of a nonlinear solver. These criteria are meaningful only for problems that meet regularity conditions at the solution, notably differentiability, and as such are not useful for the LQD example offered above. The four criteria are: (1) making sure the gradients are zero; (2) inspecting the solution path (i.e., the trace) to make sure it follows the expected rate of convergence; (3) evaluating the Hessian to make sure it is well-conditioned;\footnote{Following an exchange with \citet{DrukkerWiggins2004}, \citet{McCulloughVinod2004b} modify their third suggestion to note that determining if the Hessian is well-conditioned in part depends on how the data are scaled. That is, a Hessian that appears to be ill-conditioned may be made well-conditioned by rescaling. So if an Hessian appears to be ill-conditioned, \citet{McCulloughVinod2004b} recommend that the analyst attempt to determine if rescaling the data can result in a well-conditioned Hessian.} and (4) profiling the likelihood to ascertain if a quadratic approximation is adequate. One may need to take the results from \code{genoud} and pass them to \code{optim} to conduct some of these diagnostic tests such as to profile the likelihood. It is also good practice to use more than one optimizer to verify the solution \citep{stokes2004}. Note that \code{genoud} uses its own random number seeds and internal pseudorandom number generators to insure backward compatibility with the original C version of the software and to make cluster behavior more predictable. These seeds are set by the \code{unif.seed} and \code{int.seed} options. The \proglang{R} \code{set.seed} command is ignored by \code{genoud}. %user supplied gradients and lexical search? \section{Conclusion} \label{sec:conclusion} The \code{genoud} function provides many more options than can be reviewed in this brief paper. These options are described in the \proglang{R} help file. The most important option influencing how well the evolutionary algorithm works is the \code{pop.size} argument. This argument controls the population size---i.e., it is the number of individuals \code{genoud} uses to solve the optimization problem. As noted above, the theorems proving that genetic algorithms find good solutions are asymptotic in both population size and the number of generations. It is therefore important that the \code{pop.size} value not be small. On the other hand, computational time is finite so obvious trade-offs must be made. As the LQD example illustrates, a larger population size is not necessarily demonstrably better. The most important options to ensure that a good solution is found, aside from \code{pop.size}, are \code{wait.generations}, \code{max.generations} and \code{hard.generation.limit}. Many statistical models have objective functions that are nonlinear functions of the parameters, and optimizing such functions is tricky business \citep{AltmanGillMcDonald2003}. Optimization difficulties often arise even for problems that are generally considered to be simple. For a cautionary tale on how optimization can be a difficult task even for such problems see Stokes' (\citeyear{stokes2004}) effort to replicate a probit model estimated by \citet[pp. 335]{maddala1992}. A recent controversy over estimating a nonlinear model estimated by maximum likelihood offers another cautionary tale \citep{DrukkerWiggins2004,McCulloughVinod2003,McCulloughVinod2004a,McCulloughVinod2004b,SchacharNalebuff2004}. End users are generally surprised to learn that such optimization issues can arise, and that results can substantially vary across optimizers and software implementations. The \pkg{rgenoud} package provides a powerful and flexible global optimizer. When compared with traditional derivative-based optimization methods, \pkg{rgenoud} performs well \citep{SekhonMebane1998}. Optimization of irregular functions is, however, as much of an art as science. And an optimizer cannot be used without thought even for simple surfaces, let alone spaces that require a genetic algorithm. We hope that the availability of a scalable global optimizer will allow users to work with difficult functions more effectively. \bibliography{rgenoud} \end{document} % LocalWords: optima GillMurrayWright EfronTibshirani GENOUD MebaneSekhon LQD % LocalWords: SekhonMebane multinomRob overdispersed nondifferentiable Broyden % LocalWords: Goldfarb Shanno BFGS optim genoud EA EAs GA holland goldberg GAs % LocalWords: GrefenstetteBaker davis FilhoTreleavenAlippi generation's dejong % LocalWords: substring's grefenstette billingsley Vose NixVose vose GA's ADC % LocalWords: GENOCOP MichalewiczSwaminathanLogan Michalewicz Polytope dnorm % LocalWords: nvars Nonchanging UniqueCount var MemoryMatrix IQR LQDxmpl exp % LocalWords: sIQR yhat na rm cbind rnorm rbinom Min Std Pr Signif suby subx % LocalWords: apriori Raphson saddlepoints fn Genoud's gr hessian unif int ssh % LocalWords: Tausworthe stdout tempdir polytope musil deckard makeSOCKcluster % LocalWords: usernames username PVM MPI peakgeneration parm UC Outlier seq mu % LocalWords: lapply xlab ylab col biclaw mNd ALTMAN rgenoud WandKingLau PKfit % LocalWords: KingWand braumoeller BraumoellerGoodrichKline pharmacokinetics % LocalWords: LeeLee pseudorandom pdf glm rw wrm lqdxmpl cl makeCluster probit % LocalWords: localhost clusterExport stopCluster AltmanGillMcDonald GENetic % LocalWords: McCulloughVinod SchacharNalebuff GenMatch GUI URL boolean Sekhon % LocalWords: CPUs nonlinearity FAiR goodrich SekhonMatching ivivc vitro vivo % LocalWords: multinomial Synth AbadieGardeazabal synth nonsmooth Rcore maxima % LocalWords: resampling resamples optimizer's eval nonstochastic testbounds % LocalWords: LLLL func ij unimodal Rosenbrock multimodal minima saddlepoint % LocalWords: testfuncs testNparms gradcheck sizeset genset nreps gsarray tol % LocalWords: gsize ngens FEP LLLLLL sqrt dLQDxmpl eps dsIQR beps blen lenbseq % LocalWords: bseq IQRarr IQRarrA dimnames mfrow lwd loc online DrukkerWiggins % LocalWords: maddala funcs sapply runif ifelse rbind crossprod byrow vXXi % LocalWords: interquartile rgenoud/inst/doc/rgenoud.pdf0000644000176200001440000166571013421760172015620 0ustar liggesusers%PDF-1.5 % 43 0 obj << /Length 3499 /Filter /FlateDecode >> stream xڝrF]_%D3\ڇTlV*N # eo%{%$K뛫Wo21UjMᒛduZ&5InVɇw̶~E^6a?kpo=9/A[ng½/\no7o_)MLU6M,TL[i _8eVY?sC/QIY_dBBefջTa֙&Y8d_ 㙁 ďw)%_}MۦME0yZ-3D'~kapl_;8q v;uӔiQîaHwܣ;2S&}v`g$d}͜@!؊q\+2 Sd[`myS'OIC>y_ݑW&iҦ%V5iTIѸ)}u+<"YH#D Si^o2{a9O@YT3@[գ]MҲ>Wň:-Rvt d(g:XX`aNLVE^.M8,NYQYkq ue?:w]%1rjlȤ8( d@+2#g͊ŝ ֙-3-8Vtr/'LԀτ[gp #U۶EV][Rjr^C&͍nf\>A#>*+g0\#ˣRțX o]v^{2gEm}b8O<*X.mܙ"p,@I!}R3uł',MͽN3v8(2/a}zw$1fN@"/Źe0Nǂ=!.g,}M@[ e;8lɅDҰ3 4^D{ M ;ՠ To{QaJru*M#Q"fUsƅ-B;KmS Wu_F37'5e~JߝDC/$\txU]"MCvlvjȑ!QA 4)7uLeXK ^7&t .yz=sھ8%[)>MzݫDKrKr^x'xGg/!iQ,Ե4IXDZw,Őw%{PSV#u],W0pɺ4煤;jx'QBB%7relwY\b&\P"04񅖴*?bn&:VU$(iFԋ* AW8_Oѱyӗ![ʇ 1Lf":.R?|D?pLc1!g fc`]7BK( Gr%p2^{ٯ;TyxdiCń%؎V Abv%UՑk0CٓJ)Jse$g\c{^bAH!y𴤯>d_nlcH?X#~Ϛ 9P%ZA7$>pt'ZB,UQB;PT]|"Ш Lm"i[l`cKwa]Wyu\D@%o{ӝJNhY9.??z4%jd0|"=A!5MDy7Ō*D:m* nCrӕEUMZ6Y6KV1^$  #s| )51vJEQ)ƙNo|H0:՝ pV;c:{~WD}!Z'5oiA.Nܻ@NvE- F|@êx'hj_ܜ7o%0S\&8ֵ- 0\]p`Zih;}! -+،n^yLU{=&W]5y,O(ʍWo\iS%K!˂Κ3Im6aP^e49u;mM`C/ xuL  'Fۑ'W&}36w"n.#+Fg;/g6)T cBTkÙ(hj)nuA*i⏣.|,gל}?#-N|LZf! XΥ3&nO8O>┕ i+ IB#6B^{gGk{%ȔwtH/(%~-'Sm-{%[ygv{TD:a M~(mR endstream endobj 117 0 obj << /Length 4784 /Filter /FlateDecode >> stream xڵ[Ysȑ~_7SM pO=ۇi9 "MluO;ϪRw7pԑxē{MLUqe&L$/&?Oݿ [UIWAmwffZ=;i/MF~i2]Yn$/p|wŸZ;lc(Noq .ˡ_rt܋zZ$FI^¯!fIf("*m#4~+y]Ut>Z"_}/z|,:|wDlg~n-N6T#OW?*WjIJ0Ԁ.p)ⱑzf80#lZ&| gc􉤨m{ނ=R(" ^J%$0l>"MHR큼T|&jx21_TnsA-vEYvp ,1cvYj|;8=ׄ3V^ mڈL,&ڪ/)DijX&SIeCfIq4&[op JT#ݍmI޼qkY+$pce 0 ;Foc"c#[[gݹV öw0AزsZ~&I*oӶpL>F3/w Hv/ZC1@blk2oa$Accs~wJSӃғ AlZU*_cӁb%k(I%Ɲ@OoDŽ3ɣ& :HfIN"4*PClʫ雍HڶPŤoƐ㲸KţbtKQ ,X E Ի3:βF;Uh39%LsIT`8y'V^+^0/~H[Vb[$Y*]<ɞjgNVQa p=S0Fx ] xf@k2\&Fxt'zpswK}m̈́ý#;}䎢[DU: ?fC,UMFֲe8d'lDqti'w,m@hPVZJ-6hDw!YV(3QAoQ;W,%&XuG /@|ݲh:;Y~fֺP1wk `h#=MːL2\;ttԗX83y{#08aT˨,g6)s)7;%a֤M?+| MC}lDuŝ:/}" !Ne^n6C~rࡪ|ole㐋/RCҳ-CmsiըSGjl"Q-Uy ?[Үq;ءf s뚸s SSB.`\0U%.4+JM芽 ]: v8onv(_Wۛ(@ Х 6l@ onP;ge8\?=*#2L!*̘3)1(C"jݾ;] ]ǵG"Pz1+x3{ is|ixE1nI(>`6[1sjn\4y~>:/6 2Ž򶖺 R ;1UŦoOCMS^14U)5J,| s4ݜeWo:rdIbYվHm%QM6άp,hKn=xs\k$A6^kd_ `-z .YSvl)G[e"Sz*6\7K#C#"O(Z!#/jҵDMdl`#=u&܆΅4-,Q*(Ԫ`sʬ]];g\44*̣ΰOHP_//LL^=a3$O[(i[)zԬ_VJ KeJ.Qu}G"kW Y**0t鸹7J `jUx;2+¾aM !!O7 x@4]z8gpũj2ϕ~hI8SĞ>I!+z,Y r:GW͔s F}8LI[S}5u cta4nTBxl,,E+QK&1JϖeTh C%ض-1g6M:w &oGf*b'{sl&<Ë2U5^|Eofsȇ^w4lg Kbz/z[kgtHհV\r?ު ¯FJ&'CӐר!eLmLR!kžJq:|a ^06VxK_ 4pLFгpWѹtT|)&x^V"JϬ Nq|x1ÞlDF렚c [yfIo# }Z耚|֢w~yex)3o_xp*'j >_ȯWG`e`\ M-p8O>M .*OpHyT N-c;"꧑ĥީiQ?Mz}lfޤ§;cN,?#&` K2,jxNJ Õ Dǯ+ipc͠aG|b c2NDB?Hx|q4o i!`F+AǕ+b?<i(x%C䎒_ה/=7}I"OG 5G?̳QKi \Sֽhj'F΃Ʃ:%u-u. X7lA%d䷐N?g)`'XeE.r'ӌ;9 Jc!,Ənx &ҔiDʹeSnWDw:I}ֹHȞ n]aM'3KN*apqY5@|, p4SFq6Ϡªńr^;Y#z3 t+4er{1#C+ 0;VBxBNx?ݥgM)(Oͭǖ)M'qN,L9RGeja繋yrD6*˲,)/+s]ޟx`Ǎ`۽E}?\ɛL endstream endobj 174 0 obj << /Length 4409 /Filter /FlateDecode >> stream xڝɒ`bN XXb'ACb8HHI/x]ċ^}U.8*Y[DUeEVDo7wޔ$5Z9輭[vQzӛO|Ch6q=ko~{WIg*`',ye4M+Ee!;ݔG8,O6ew1p4 ;y;hlٵ~^:7X9=!FZ<P!' aoK5b]AdڃK`0Jlcg+@1 r'US3H=M"•&$\YD5JP%"0n6.#cr]FsI>""90|W  tslERl$I>'E6+'Yzϭħ:fCGRMZ^>Q1s&`rv\ GR`I"_ަuA;>x29^,! gxRWv߳ AHe)ݩ,-#8.OF/ mMh +ra-.L |]VP` iESNn@cp]|Kɤ{9ؼ/w n$AYߏÉuM:4N_n@Yr #2|@(Iư+B,㈥Oj/{ŤW{aW 5.! ZrU"!c% Z†E?yG$G-tL?::bF-&JF4زH'*sB Խ 疔Xf*Jdby6Fd==[u{zVɟr=-艉#k& $t+6MEZdf+V:nU O"7|<9ɇävD{ (EAڨ/.n4E( >>)S?m-FЃ*~Te.:EyԃD>*{8_6ZōȌ4q|^>tr+-q%ވ t<8*|!u;5q)U f]4n3ttC^WA<@Re#e[YgˊTR{NanH^L\dzŔO8aixZ䙝#ǚœtd#6,.bZ P-߶G)Nmvfw`ѬXiGH~}O^%f<:4H$Z7$ u|-jV*A7[ZSp(ՖboQNDO8D,NfxPYe/U+c/px6"Xsċ/MĶQHi&.~;iN9(j+ͫ;Ĵ8\ loQFIR#O½Mr1U SQk9O6xF.ŠQn] ion)|1h̖s `3ބetIєA#'֎d >Eoto a9x lP)Gg 6w{i|8Ԍi~+Y9Vp+ɮbrv4seGjt̥eSxQ \5NMYa@qfӼCð̰ڱ YZ& ]#<1. ~ߏ*A]sfm o41qN*G=w;rd,;a"KE&/\xlIy &'/DݭmۇS*Sê 3{۴#؆@b2V׃|b q$L$I%'UqD8 މt8tP#Bd_Sm [HA(˨եέwk5jޝŽ\CM.< ]N/D湛W &Lܫ~ss~paaRU1s$=7d'X $@:Di!l$QȐp/oZbݚa@wN!1\DyA9iՆd)8󅦸+_d\Q" ́_r=}bpFs`~1)d.O 6_jZ7 Rf67!q->?JGLPsT@>f+휉s՘0R7<'T!XҠs<)Xzr빹ؖe%:拞bڨ\T, q'tk7]=&5*+0qZ>T.}'MVk<{N81'Y*Ib&gy^n8ثbB ur[A۰EA>(_ zJe \I.NR-sLTϽ^?+#_jKUlCPpCJ0!*֧8lB " ߳\T4)Pe ߽}YBydQ$Jl><{[@?2UxYERrx'#,*a@ MeJEUypF =*c!/KJv|E\_*DKTW)N~k7xꮤ4şyp x%C)&&Js;ҵ~̕I*.efTA3e%I{1cf\;yw VfgGZω(%g{AeWݛ5Q-žTv~ A0$ʒsxfeιiBPRw|+^Ө"@@pQQqŀlʻffZ 0X*KS̥,Rn71{.,(V!=uqT/h endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 824 /Length 2837 /Filter /FlateDecode >> stream x͛[sܶS1O8fFbljݤ;iZY&q>} 땔f& %p\cJ8a+/H BOk_NZP iJ v|9\p K o0Zd1"Y+ *.7j< ANY"CHv9$"[aRB+yR3 8D -~qQxfPFx/x/<%O,pcڊQ`6Csĸ0s A %nO<"g%@D4Mh^NT@FF+23A))0bbL)?p m6AƸf)m' Z$f:3)<0yZQh"(Œ&RN\ZTWHp,q&-8{P_U'⫗btTY^u'H_Ͼ۽uI>NWݦ=kO^7 9o~.}aq ϟ9y^nsEXH"A8ngK|i󛋭k1A,yw\.|MZ7y^A~~eϫu{$"Ce1cCo],7r꽆UH̟47\ՇXֳ9v}g۬kˋu׊~r*dLof5O)}жĽf-S.\\r fv,K1i揺Ic<7̼XV!?e}dFsJIǣhֵ|QWmJY;ZQIQ$a,W2e}5 )!KcX̃AbVIXOr}hXP{6XJk:Ztz:TGIZ6`DZaS 3.HODߕܓÇAV=㿯GGy [CcuuZވzIC_p/BPf|X:TLc aU8ZaW۫E@y+l}loX7˜k ڒ,=cs= |81.m/kL:1UX}H3YpӖ1Ea[_:xRߗz ^(2CP"%)H EJ(RbX"%)HEJ,RbSߥR#iHKEZiHKEZ*RziJW꯺5?W_} pP/z94%5at *4+z-#퓒6ݚi\جVՇVٚRPG%{ 8B+/ ~K+'#V՞LLKZF1&P߼]uYUmCdUW&6a=5VYb-5T?UtbOc=qh;uĄ2 J~ d/<6Z02 ME{$N1@4(slH>qP:eh4«.N``>/][-O^1pDzCg,Di؜@WT&3'ǫjse iG"6>"ZfYDOd,ξ_6m F7k7Usn] a;0|tl40ྨ֋3dNcFdžj<.ITv@^ܪqK3x74?7?/W|H$E3Ut@waEX/D{3FR։<,M۝uSyX,C_g@Tڍh  pʳ=-6Ggc&:Niߪj9m,1l6,o8<Ṫ6Q/v.>9kQ> stream xڽ[Y~_7kͫ p~HIX]%?>uAQZWUuW=d1I'o|)'&M1Im&Iiq7@dɓ)9ܚ~97]Q$9$p{W6 ~ۻ<ϧ=XO_KT-dz _tmYA~is+n#+f5:&~ u&Ɨ*n8[LVvAAW;\IZNwk7k&j8}I-w ׭ s+tmB˚ 4f_ɤqAO^ޮ_}d bz]W5&l#zg2ÚXq UܶP,}Dd8P۫Ne|/R$[Z͑m9ꀕXKV.l]@Ijڳ44(|gNžDJ x3V꺊,rW. .<v. |b:kyQWn6+cC%>gG_q*<ϲG~μкKfܣ CA:75G`WKv$-wIń]i Խ̮#*WH *!c;݇.p)c 尣]t]N# (Vqʅ14lgh 8o樂gyULBGai ^F = (P1 pA86K8.9\LeI}Ĵ'OCcoc0^jw#QyS Z fVG])#fM kW _" qGfLҥC홙z^IlV餤FzG,tw#E8!&X=I]۠⨖FG,e gD1 –1ث0ǡ<Ȓ+X >CCC cKee m.Gy ybq8e$RSm9>1йhPzGB ~Q8ג0?oF| ɛLb-xͿŤBtDy0l#ƭj"rGq5½`ԨǰRVf Y0OmˬJ9aSyv0nkxM#i 8*\f)~繝j8]HX͟E&O%#9XjϏ7L]v [l@s&_*`F{X2:e-%q`AK,&2I!eϟIkɹx !;xV,2_ޮfFrj2ѯBfZD0Ò[,B! Җh;мTFy >h>gU̟搙oW k*@ >M}~6,<]b|>᠘0~01gRWl*Q/vI6O+*t>k^Uƥ]sjQN4 {IW:*mhEx Te#dg!ebtLWE0-7{lM9 Rg3&\cmY؟>I՘$EubZr gY4PY-WzU Vl8)*2Fti95~/\"%$Ϥ;vΨү{rPkyA4{2=f\ Ifnxu:jCr~̔ބ;@ RpQUp,aT7la:b&29`q*(|9&H%߄tI˵$ppc̯WNc$?@diP|)P+^~ytrNc đeݩoZ\T"&+p'-Zj6^=2PGrClVMLD5RNt) J#*x]+i_yK 2B6ak'z9PiۓAm/LTWu$o:[qy[tQIoH o{'Pi {ѻ+e]uu X@3aپe*əTo~111fǟʁ HzDT|#XOiMMʤ)2Es Nꤩt&r'u*bvUl׃x"K_ l:Plx/oCI8WU`fHN㧵w N}.)RYo2"#k8tL߰ /|㯷tK`Zn;ж!=&Y Mw|(?qrWY%#JcEj@OOT2sJ'G'x刁9K$kϝvT{\H#S)7|׽)rgZ]ρ;Z-q1c À~L /8g3 WA1,,?*U# ri5'kV$iCx7?$C=?;s>z^,;|\Yc儒-{%ې#w[A:#2F*x'WuJGJS(Y4yjWZ, u셸܆>8V9cʝ =@Op endstream endobj 230 0 obj << /Length 4173 /Filter /FlateDecode >> stream xڽ;ْ >"\8 ?Hs:<~]}xxȑy@V֡h@"L~Q-on+U^\-LeTE[vW-͕^oV֚O?kGSG] |G@M~~9;UU-Nh,V7 an|eW/cle+L=HG^Q 19eYn8=]Lցķ<[;nwv>#-m@bqb@vSi[;nF9ԘnAuv(0I qHO&zk&HnZ~$EabS‘-*2MOG!Ax KNKMz_Qno1K=ql pߒDc=SG,sJ%$H"cڜʫ¶~ܖ|YL ӺO| Xd_s?^bny gF@h7c'4 f# oDm _"AEԜiϩZ,Q"f4?6Ib{jbDyI@]ghuIj J6^U+*UXG:]MM<,˚⠧ dR;:%I. t5Å-5 Z,h-DXj)Q(u['̕!Tql|}nbjbE1'i?[½ =2.7SO5iwn-Bz!K܍뵼^SX@8 EuruSx-ʵ>ֵYṀ)6`9UK2EJrMvH\D`If}[6!ҰN}RXk[uPLkV)jKP )s- =9ffJtDe Jy]{ Ϡ/Da]XC/_Tq1 hLԉFzC֪%?k~@YcZl?Ph(ͳ³eaʴep<N\KcFjq;IgCr=r= ,p,ނ.YJ#xz.)p+eڜtìD0@Ѱ5{|LZ& WUo?Уcf*Tq'FbɅ{(v(ogsLVФv`-^XGӔ/EN.E2NUqAJv0D`6LԶFA(~G11Uo(ss 9~"'LkT[i{Q2PgXi8*DTڠUmRboEnxRc֣-}̦qh9'g3DN 9FpT㛓!9 'O$xU #s$B{ HBfBLHۡgy6#ɩߐP_&I~Ώywd nu 7tn ǎl <8^}x6P' Rd>< ]'OM]B70x/z(n  ϧIPz⪎xϷϴx~N2kl } zޤ(Bg/u2 ٵ#Z|6|uIL\fUD4 FvU:X=-`.yejYh[XUS{Җn**Lt W|MJ5~v~޾UʁyO[U[aax\7?MX "![ utU &*%:<|@xY4W&<'|'</-i-nn6"4Ω N 7Ӓ_@SW򪟺oq7M.\gGic7 sC2Rɍ%:ϥ(Р99V+9uE ;dψ57+Jo'?6?'^/ňtRbIrÂz˕B$$i4Bä}q*6 O:" mr19a<kVN3I~nYMiaPhđĖ hO0p^ endstream endobj 245 0 obj << /Length 3945 /Filter /FlateDecode >> stream x\oB*#;msݤY/bZ[%EG·}oΐMZhr8yL䋓.N~9J*K,\\O h+jfNQ"VnNow?+ш>!*3>> _[;s 38\㵟܍Z-q ť[8&LStw{+di\w8z}L(RPYQ)3?y\'Lܠ{ JX8:k=iҚVܨRZe} 맍HUexqA*:RU/Vkʣ:@ClhV #'3Z)] ic%NQLOwN\r=ǦfYiݔJS:pQZ8(qi4(uL&ZLir$1p*I3f#Iq1cNn ~ #t3_:KsV[ OXacWrƨ|q+t8e2&~ë, yq%73;~"A b<ܤF}O8)Rk5z]ګY~OdqQ1 oZL%$+!+yXg=~8 fb& K`؄s>)Jʂ7rG.I0PR&q-Iٮcbذi!wVв6E97=bӕ,X+?Z}}5Gs;ƛ]Ӟ aM[ŭE[eF 5-頡) Dd wEȭ+fDhA, b=P B"/j&j>!] GdbT4P6^9MD7{P'~phK57n:QtΊWe͡`L`+?}O$& k Rju4Jg`/U=݆ ̣4V-=Zfiuxf~p) $XJDR&'yDe5LV5aL5+K3xnάÀ=f}lSfLt4~ T$M~4#(̹,\`Ji xgi;&PB{><]<|h\pgNϼU0Fٴ8FKz!mTQٽVj>>ԁ$G`o@;ZX㚷+ωo|PȦc"LU %!- ,h3|9 2D%6#"LN`N/aI H5=& Im)њ 53_EmWqFOVTz hi 't >\`(rsH'ZQhI[iuSb2Btt*q-Wt3aF`SXx m_Uc5 @3f +Y{>;˱~Yu/cEVIjY-'Ym8(sw~>bxɆio] X?3ZCZ$ǻ˃U,`cˡE0"d8CKׁ#kNPf~}~ѷ LZI'm;0{P<cpA}d=YܟZo᷋Q^)5g=s_!EhEsD85^6{konpھ}c{UE 9`hǤԣR!] b ۻt6FZՀ'S4M+ f~'bb/n.ֻw*AJel= a7g#%W.X|Y2-G-3DA\n x]܆6Zk -P`yLYJQݒTZG=RӜ^<ӣa@Xi9h$ŨDIJr)?xL1~uc*RNQT%+|UTPJ(ie e ʒFz.0MLXR=m]jfjg/jvZ[`EG#ؘ  ?'m\ m$F$IG5̽F%C r}0(`ïSX31ieB9G܉I-=.v=r˲A%@24M5#_3 LdB02XnJkk|Lz,kI Mh J;0cKqA33M̕/ f),bܨaFOϳQcPCǏORɄ5,R ~2أ#KsT#E} efk,Z6 dʯtx2NTJ 29vl[Г.[^eg]Lx>AH3Y.?rLB7Tp'sy"4FݥE#rh &\Mc|>[V[6&Yth;~UAM*h/DS"sHP!˰>FD: bq}5hbvIb0*DH6ZQ О|@V6e4y]9q~1,ցh e.r_mur pc eg\<u:zK%R\oYje&03ٌ()Hj[gLڄQ:&}8șo9iƉb迭bߠ:6P븢৒$~|ƺwteti&5/ܻyEsoX}RkMVܠ=;,(PSK!_bs+| endstream endobj 250 0 obj << /Length 1793 /Filter /FlateDecode >> stream xڵXo6_!^#F$EQ*+am3b+Wd;x(GIA"J(NG?O4(BFgJ( YcEMt6ޏ\Nxj&jV/ k:rC@hHP?9wDDũOsדgO ӲIbAv"(aeQ\DqD5'!~Z>iǿ8MbH{ZYi_lovqs[5؟cˉ~u6I"IeDRεȒ"O s!54V},GnR_bcÒIV<}SgBګl|7[6,N?rgsWzYw8K2.껪v<^_7eR\K-frg_Ʊ׋0Bfv{CYO^ov^fԳ3I[Zr4nQu+wY"/+l?3!&~{34Xe_QuP|veS_p" 2pkyյO)N͙l%[xZ)`j|H5xQwu  KT(ٱ6&@.*4i31Q*BZ0%>mP_\O|)TJFphέHpע0PƠP!mz`(ɴ^wjC6`RHz|vBfqB$*W@ѭ3#.#3Jk.ra5IwC W2OzdA ]hl2gdܪ<'`rUu;t!&wsuKvBm!AL[i/(3 0`X+t}<| F1K-_}nk} kި뙛N9npkx$w9sq ([,pD s/,7]Cp(Z `A -3 ǚ) vYm<6OB28 Qz KyD  RpC9R{KkHN,6=*tqWtj},[GA~Y7:=xC7>^PAk 6:ϴ%Y':*IUb͵{ ."U sݩJj١zaGaը㧣D(WhBytMT/@ѻ. ķjRh* ]j >>I7O_tDe@4 Sr})[Y*}&9"v;^UWD;ag Kbؿd9}]fo*XVyp]묎f,cϗ=KқuOW.᝶<_= Es_B’ endstream endobj 226 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Figures/fig1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 255 0 R /BBox [0 0 432 432] /Resources << /ExtGState << /R7 256 0 R >>/Font << /R8 257 0 R/R9 258 0 R>> /ProcSet [ /PDF /Text ] >> /Length 7608 /Filter /FlateDecode >> stream x|Ku9n;[F]@AcThAõu*6IHjI___y~;՟~ï_֏?Vd}>eԯAُX|LǗ9˳~qUUbH {VҒmrjqHs/k\PvR)9רmQЎYZ) {c3˞YcQy*%FN4F=55vʵfP4 ZdoCe!{(<8O[ikOh^yJT:H 4Ϟ4~V)_%"7c:j9VZTmU5{BBC,5"pm)-z~/rsQoZ>5gh^:=,eLi3JjNh %'}}ԙ3K2/\KPJ~,IYVWKVYU\o9[7r:)5۫'jeΑ֎\A q>e($c`+}o3!st(+ј)nUjhk?:hUe!/dRI!qL) %ʆ;MI;? jeHɻأ^%ZV!.Bb!G"!*-l zQYvzkAg*V=46QtghDÉj1, T1|`LS$ߺJCQaDo9kMc@-lm_m, N_hȲBDЯ!RN) mwQ AbANtgΛ>/{*ztzt#(I| IUˢKZ>/TS룅-ޒ;$ }fO&tkPtYA!蚯 <ƮsSl|}GvCH=)-n¶WiRap,(}o۬kAZK;Eњut{ˆ>5d'g0žxVa 65[ il<jkfG8e.7L68]Vy[kI9Gˠ;mZa_[Eev(ʠP/'tjlyS"RFj2(:֑y48L@PSIPXՒܛ|دd :-ԘS0UN{8|)0/DBa5'i=IRiЇσ߹$8,U8ФY}yȽS2?C`6xVѰ6 kT%iyR!wú&Z6R/Jny?liI/tN?`M]av'~`J|R; j Ծ J7 rOi+gQ5Zv+5M tZIt]-X:wL<}Y۶?tӡ看$∦N]nn(Q7IdZ&8G}J#n{'d iZY(O'ܠ$R֪TZٹ*z:kls,L|Qԩ M+;g+ڥwM 4jy[gfNujivW:+\nPQ76˳84 Jy:MrbS^O-=C?iZWN3Yٲ@i[ҳ&N[^X͝&[vYUuYBkNGjik ݴ608W*kv坲Z:ee=W<h6VH(8z?I~I<$ͱ^;s4t+mTŶ}3`rgh4le=Չt⧕&|+yKml1Ԟ%h̃ɲĦK6vӫ.hyجhvXX˶wYYFjŖM+b>[v33JV-ZYZ';v<'ɿig]N֦dؖ-PZP@[wS-#)tYcN,<(ZV5m^Ҁo&k`[DO^x~glֆzwIҶDc_jvRWnVbsMro=s}Ė&R_g=(TI+*:udWY̞ҴRFmzh95JPVmBԚCɠm͸M".$挢ii2bbt z9a44Zg'MVhgc<] ze=N;185]U*'xޤ  k J%Oק4 :A,lZMcC2qiaE/,&mBj7-,N'5ɽ_(-Z'+*.ZF]`<13an>ͻ;gypgqJɒ`_I)NxJOjWZ]9>V/IDckZ:}w|vr }WsCr®.giUhZD%:5ihTN8(iPNsnKgn>\VtEwOt8gw2uXSI=YCVu?.(SV=iU.{ߋ6?i/oAtZU7Iz7PAe%H7G?‡ѵNC>`yU!9@z,)jQhS<*wNe Z;'}Ѵw9ƃ L+hSWI4(ZԭQmN{zJsQ4Ԫɻ*AAP=//h_lݰwpk4!syL?s nޠF'+w,}*?~lHЙ-m#Hn-T{{fG{t:mb랼㘫nG,|J/k%l/J)4"yyR.-:M5Ӏ/M8sg86]8`5@NX Qtz&1)ُs 0O܄ [ZX& |ţ"C0F\}_ pODRԤuO[\=RϯIۺT\՗Ez =]0MC1><}y_G޴D8ɟgiăƸmLCbDQγaۄFn6*N֊4-7pǶZmIV2u,ent:<礱5Vi#C&b ^4w*0cjs}ΛbvxT>&#['ֳ(]WK@yeEA[z::YTڴdSMto:SS 7 ZK3UIv8HvnV8(ٶI;FLGS*}R g*#ns5k)xd^orILu竬CiH0p,ѩ({vx-[^裳;Ewt/].JwX&:IPիAJ'*c7{W6t.=c nmM4m=KZt M:Os}ZO&p+EdIԤ]r& >-?vj3P:K9RsCTn^|o86wSM ]X2wxxq^.C#~z+@AWێ(F5ʒU J;[Ȕ=mtI<iUFc1˗4 Q !1jotki"oҞ+8@FSu4[֥w8ElmUO.Tm!e}y׮ȌG/lgHahGDKzsksK$A󺌵&z-/jv\M'ϓz18c6=cdxPNut7,iau?:tcDv'K 8WۭvȺuDOZC}%7/@Ѻ;77d[y~ek8^P: ޜt޳_3xA1hq!./{vћ={׍W`s  7:sM>#/>I33tw}O@oA1B7ݸ{܎;A;O; !wxsAwQww Sw܃Txw <|Py>0owf;{w'4w Ko\;wڍK+n|@ݸy߾"wqoTEPq_1+"ÝJN8#0*ā~Ċ8o$<<~cMET w❓ƸnLP%ӌnύ +;]7.q}ܸG߸m7 Υ q{nLQДBs1IAD,.L޹xWB9n8)ToUмg_qVA+z-㰼/EGחv__[5KkKoE2nYЊ^4Gk溼ƶy?_#frn\\Њ^˸9jGkw}qy>2n/hů=V6z1k {c Cq-}U #V8Gsuxi{y}$yz1®= !&a|>]Qv&nO[ը"G OXk}ñ][퓷inPw#;Hb#nq;@F! Kw@#r'vm>yJr}*Fo3]!+#'On~|X~/ćDz/E |)6%z_/Ô/B _+I/ߧ|1F |-|Ek>]*~.E|6OW!}W, _(76xJ>N}O FH0_<_o>>C⋗ K%:^ m[/s +1ߌćENc_OćKP e/ń{߼E|о<_榫޽00o $}7IGz½m>yrq G3Ai\KByӮ͈o fL}7Gyr_EpR|"o+R|3fpy=ןz>&cRW wɕٗ)?G}{ɣq|w߾/_|_˗銎BWA?ga?l~n;O蜟i32/7\s^\!F_cjw_>b G2On,(?gG>y8c`?:w1 eكh}^D ˑy[/Cj[%?ZQnF}_?_QÐ%2ASGQ/0/9*}l+'rX 4]H_ Xaip endstream endobj 261 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 @N. 2D! }I:gׁm_Xց$i,Ÿ> stream xْ]_GnED0[<ؒ$K.yUvU,=J$@ק9HzWq6 3===}j^?ٟ7̤I6fv~9ͬ*Ɋjy}!T%iSٝ<]<xV}ydI8[y6[=|<[dY6 -<{h jߏ" gE xhy7.#EZ$VFI|@RױYaqe{pke-̿k;d#CC\1BX6 5pnI8`97G!t(Q!*nxؑ9(tLE".`X@R %Ext:is`ifD-l`2۳- rn`T;24#]lz[2YM>*9t5}TNךx *DԞϕ!Sh?# b:lp|CB[L6(C= SzӃ1+̲3QhҝX8VӰfE+<=LVȳz !蛻%af`yF=n=7Pø$oSJnU'WIU|e glM:ߓDclru0 wW$ͱ#Ѷ%cН끇n67<"n]  FU܋? p&WXwgA l{D #/ƿ!K" O̺#X.Kw@aoC3yeșѷ*O kmFٸ5(@ܣxNR:Ѐpwmz0A!Nc:2LJ%9%a!Cn9#intYkWp!.:&%.^G/+Ok窎H,$)ib"vzrJ"rVZ qrMyrRB>LY]*t[7o,<^ 5ה5Ļ u#0x< GZ<. ZUb:SBk.i [ʇVݳTD2I+Μfl:kl/tTnkcc};/)jba) de;͘!TpPǞ3z1za(L r tQgSl3 z7'IJBwQUʦAr!j=.>N%>LeJ\}#vƓ6k>~ST{]3?1Jk # )%Zs˝5h: 臓ƥMR7_a9:tkDji@pƀ#a'x3{2rf'4`LLc6չ+[fkϽ>/Lm IV>{Gv4 Oc︁<<8)i#){%7 *ts_HMܑ]H:zI.*3 Hfy~^rBTq`˒8'O^#h"|p ?ʲW 9 P #5-R1oQ+ن#z[Yt؄wՉ*ei -H"څ(pe > _<,iT"GN!FĿ na?͑s4ŔYDEIxT <<"M@M<""^-}-bXWb'ӣƻ[9GlG?}9N:UhAnT2~'rRdB_:iUJ`T` ], ۓtB#JȗK wPdy{ endstream endobj 268 0 obj << /Length 817 /Filter /FlateDecode >> stream xXMS0WxC)a Cr-鯯,M7i YZ~r$A"ƛncDIWI,R MLxirmwRI@jla7,nmCz ␉CqZ'h ַs=luw:qrFy!eGZiH,&Ds㶵*xaWPpp'_ [mMR \Umenl=x x^˲"!Z"ӃW"J6<p-[VNE!vџI{w@2avE(myҜ¼(fϜHx^ d|f\I+aSMW2PJgrkRcrz2=@RV[\Xgq?31ွ ghOX8ܰ;vֿo>{raӣAj?O endstream endobj 273 0 obj << /Length 3467 /Filter /FlateDecode >> stream xڭZKWQr9l$E=ǿ>]_UCAjwÛwo>)8j&{]UTQwWI| T`MychOV;7ߓmxb< &~CoueYNZ?LdEi&p3W̳x,0M U$D@obaNufxf)5,yGQ8;H{? a\ RB˳vrkF-kcQoU$b%INj@hXm>3;V0C>DnBY Z57z F D61۹|10I!!^9fzD GϛF$ڪ3))]b7m#ʓӐ{3.0I,,Y*T]A?l^v%2`d[ AN32nX"m ;A̚gdGO@饾Rzqbfzt7ST@O7SASï ̉9 >jte͒U }[@IߢԾή<݄o9bNE\ (ITZ;Sr=/*jBQBJ0XGUe!f1:: c(Fw}>j~(9O~A~s!qRdKJFnen$&7Ek yإZNj̝_g9Mj(GფZ$.S Vڌqf蹿peox㊝$ h|`KuO;68ќ2n-M%Ǣ9*DqJx 5e@!W1G%; 9@zyI618EӿպI }R4-89@x (Od$@9qNc^x9-KuiqKOCk{\IyO.f{OtPa,s Slq<ͯm2;B pAˑ? ~'DcxWQa?}n@͚Kn~FbSAbi)+s Eߍz&zA'HM y{E eWpyٞQ\4 y8kc͒C'{Ҡ1aQ /Il W vRN,afW[| zuBJ8;7iϝzY;jrd dMo 촃ZzU2,'>Z@V>>D{RRMbg8Yڙx>Z#xb,ޏ29%#wt m W\dveV7#gq*N}Ġ_& J"Iuiۿ BFt\,JՋOA9W=6Z0@/ {WΧ"S*;ZDYc-PW}g]<Ҽ +!ꊈ>ؖ8}fʼnRݱl_4+B$4k]UQ$eW !|4Ίȟ:ͥ|L@'0 (K>[WVɍFgHZ~œ"XX>_ P\\/_A?W?{ӵle_OؚʳC>:\lO6\ib8hƑZ~ LT$H'HhCYkXpH^b Vn (N^BTBE֠YXÍktH3 2;D'ˇ'wN@ p+xDޖ|c8ꓚK+>\玥`(A.PP4̽j-_u+GJhͥ6[V gU[xS Z]Nj%:)un#pF$/G݀D(|02F6+_5) soEUr"4L&TOMhD?_q endstream endobj 297 0 obj << /Length 4801 /Filter /FlateDecode >> stream xڵ;nˑ b_Z&8&&@ 9#r$q͋緮}6i$!s]]].Y>o޶Ywfv0+":;k&l5[>zݖ~}m7i~Sox𼇿 hP?ÁL@8 m[SYey1tif7eif7ںfweSMw{[ .DbV-(|Rv6)Ba#W,GA:07AGJ# "3e;FwD}{0P)"}b񒟑:?eю iDC)PiVʱhm뢥%@qFȧȁđ5?S.+Ln;Ԃٲ#( -P'7%ڃG7Qn2DVӻgYGSQp-dS<KDCy$aGb'}'P-^8-H4COǝ21 =Ӣdc1 L6]eud@JbUZ':h#ޤQ=zPp`1`16ZK&k]kGQG>՞=O<݈"آ:z(AB~bzUD<}WAlS9CڱX,EW5 Cq E@mΆ5daYċc r?LPKz $vݝd\F[4O I-hj /IXʋ(`,[Œ &K^ K] fȎ|DP4uV7.* cHCZϩ)2t9qe$ ;˲ ;0Mf_x K=zk#b$2D2>K?k]͜a]prl4>TF0XN缎D2Q3*)gF43ةهatxQ$#azTSrVFFO)-;ȇ!J냬 z+.*?DT<\,:Fԥ#Q|kиx9)9)P<0DQOX8!->pF= yz&yCoKkT̘Egu ɉ!-Jo"\7dBxl^w"v~\,sĿ.H I zO0PF#ʙ3V<šw;/,A |"1{zl qQJy elU.~|u bq\Cw4Z,NYT;hrL1򋸘.ko K7 ['+m0ҚJ³J܄,{D \ܕZ\Cz3\[)kI%'yE]iwco/ PLN#c FuysJ@=x݆G ؆0.HLjq]5Ř7(a/q2H#'{Qg39 neߢ uqBuv0j;OȕhCvoo 3kLng(^Ts4e6auY8ڟ U%\pm'%cw:-vb9Մ9" 㔚 1/pmF&ζY*SoIײTMju!O }RlwX?ɦ,C&w mdv/Ƥݶ)e武u5g(r:j 'VqJum5l9[Xԉ t77t1$GZ Zu΁W@+u =^xЄNyUKi4$@W(mִſ&@^D\ByGIA׌Z֔l`yuMcJ}oEƔpoWpye#5L(GQKh*.!9,9YޜDk#['aZ#ds(LGWsŷy>j,̾E*;ΜsNZM70w;Ĩ ?)1]j$C)#6rWMyd#jAR@ANA!Psb__4_+>gt/ Q~ߘ*Q,: U %UD_b#b~ }\7DIn,%#~%>+^b$2,'њ?V#AFo aķ֮RTjj*E< H3Yߴl=rƦbKzM'âwE8[e/E :+'ߘ;Xf@Ig?) 1u3O{@ݭU ~7i\ 6#QUqZQxYy{4Mn&RU@ehK+C :B%pZJ@F%eUzQs8G"U>Ũ0a7Sσ.3qv)r+N'̄2D+j2qG.X}`2e źm`F05T&y[J؁Av,I]ڤiy%n&HƖn"d9"nmvvUq%u $VVfgA7}'TXKN(X4E_{!h_^*~"Zø `L  =]vdC\:ԠF#309*=?h(9xƜ4 %?%9t#:`Dr= ?On^jLb͖ɩ$ex/ NR7Q%I֘H϶%f73f`Z"FIO> stream x[[s9~ê5U@&ajLjC'$=7ew_;qL [-}::wWB 6dEOZDxՓsĤG:9a6y[(a"kw6xJ`"a+|]$ViD gtĞp<΃_] NR+%$'2;7"rGq>9A15Ђ zDID @;8_Pc g<yUʋp$d:8pFD& ^֏gv^D f 0ItOщSD76GB LLC3")%":`c%^yF)~D_ytpƄL)ZJ C8p, wPr)*DUELM؅3Yx ӚJOiz6E;Ix\GOWWx:48:ixLϪkSxQ\<ǃè:mk/xM Gnh{*<ű(W(ģӺqV'8G=$ĤsHVkl=ZC)(`Cj<~vX$vq)N-=N^cIIfvD؏-U>D`.϶ ɿ+(پaFoNcHe^Ky86OG{xU}lśU8*/QثI;Ϛi54aauVϚdVGSͰ6F֤omn]n}nCncn{۞,lDvyyOy|Sǧ<>f<1O3hA@+++Vd zɺlrrqɹ&/EXqJ2]wƱ^Y*vg6hg'MFp(JxcY79VdVm[=+Vaqg$pjs\{,IKV?a=C=bYih }elXp^ :rŘ lIJ_/Wj\q}퀬dT%ϡyw}вv8Hةvhm9(݀,9bah "((tcW5hdd(h 000f 6msd5 $Kw7xPֈ<B,HYD/Λj@#`6)Ї^q q:zr1W` = ȪM;dZa \R6;̘mhHOQDKh|.tRZ%6>mFbtAKPtP,g]LJK@r^ 5T (kuM]Wmr5y(DiV8r=^u֜[$\V21V87ɕS 7)&yhFi5cnS8-soMnmn]nvyUKna{mN.ɸbɸzH$++WV@<>r\]]=)r('jlF=l20@mRF+VimLl91\ bYx|g]m+J}a}TtZ~}Z_\/N^5*JJ'i,O(ZDlwE_ʓ/"8rc}M!N._ D&{{Kډ/%:6CЅ`4 | U *m([; z˝v}ˉܖF.VȩSc!BN!%CK(Q.\Cr"%DKRu 3:s<Yd@ؘ>&;oF+̀KC%Uc{hvtSW.Gwd'iZs}SW,-XL VxX>1Nݝtɱ!J.ߵ|{6CI=IJj rтswʸ@ UWo @p$ْ \CL\[+іWOs~Fdz$"mD:_<Z g.x8?\~n endstream endobj 317 0 obj << /Length 3667 /Filter /FlateDecode >> stream x][sܶ~ׯո8CMf2KR#AeGN$9v=]< ],w yA\sW|ř^}>ď?~wWNyzoA3=\9XYmzl 8 DwL+AoOa nǟͅNSIӍRr ?syRt݄_şm#? ċ?GWkڝ%+K-0Oq_vq$Dr8윯^һq !aA]3yV)qu//Hu3*lGһvB'V2mGB0gT7#wɩ7jcyh͐ϊ .Xm2]+s|>YfBcD3m[l${{oN Kw)nOҮ$4>&P{ݺ A'%9/p&Il3MפL2.XeC 0% 2<75Ee͔ #t>~H ޤS('.J~yD@5:lngNkN1M={M,5XIJCt;(8  hv8%8Ӎho.h4KVp$1#qnWT4ښ`RÂu7FĂ ϛ疞GV`jAپ9i3CnYTQAme_π$2"^rG9{cTZȗԄ?Dtd,JI`BGU54sФHGBZl3mq =/^$XEH́m>7Cest RΡC:V.i4[]A%_TV/&|TF埨J]JP^T#{2}&lȥM`2 COw׷lm&橒x﫝`8H?)K?m3֦٧5ɬ>"1A: S$ oP@I;f,EMwQ(ڦN&k[.Ugl`R}t{4JЙ~N7Ґ H8UaGΤ?Dž90J51/jnRFN戴hq )yDH ]cE C+V@hCt>if \m10 [i.}C\LA+䱻$y6sR}qUȃoJ?pPlH a\m:7N!B U!v'Xc`n𤅬s{?-f$n @%8E?<`H#EUtIdji q IjJjγ1C *\}rvCl=1jz %f%b S?8JP܎W՛'ߣ6B88Z#D K >xLR PXj_,{U& @a mqP1qL֩@};D}98JaK3)"-|`*)7 R ,boXh6IءUH!@Gߝ34#kdURYQ8PelgjJUhdUR-ZdZ W!c'dȺIR:tt>?,~GvInc'U8Gp܄JM>SBKt?7[%"u3*<_PӨL] @L-k8FJ0vgN]LV䇞*Ֆ }zAnaΖyt(>~ dvIǍ/bqCF@r'$&9f1z}Cݟdtw_w߁] I&Rto -\#i_spAK5X u3|[(`:?;r.J T$t"-[F6:Aʶ1|FMv zؐ3DB{0+ژ ?VO2Z-8؜y_لu"LD[kH& S]ttD/EgL V!Kf,-' iq|l!umۏ Yow.‡jJmR .5f+Ul@IwQ>WJp'dESD#(B^Ho*{g!J 'I13.+%tEy9{k.$d`]MB-@1X( nhF%LW, =]}NTˆLe%FgJfĽ^T C$*[*Ee*_ Ii-u'\ V]ptZ˶ElV˨Y)S *qD˟Q+5GxԽ3۹\P gR11(΁I:2@'Ȉ!#ìI'G2{~F]P kQq&_z7峹:{ ƂEG7po<ݨҚp#9TP~3UFA$,QeOvc<0 wnzNNS)L-=G-iTy~PQ˕CJK2k~H<;*B)u+H6kgul5Fߐ{TU?1L'T6%gn3dh  >(^!;C)$r,%!]Q@[8D Q!O[{h֏&l+2U3G;%tfêx?:Bd2َn|NI=a +<=hX ]d!UeE?/U6J/|LU]_tH3c[w#hߊ& M$ex{7goiScS{9C缜6493f endstream endobj 325 0 obj << /Length 3611 /Filter /FlateDecode >> stream x[[~Xj1 iSAE+q%% NsRzv>pE;& ݾE|_'&*MQeͷ.tQ W-W֚ś@]}®wpEpQ?? _}*BlREq\DVbqЋxG`,4Y,*74[$lVRdGPUUEM$Rrs,;/YܬdURD6 5lqܣ>P^M/AreEX/MA#[\[%[A pU (4@J8(5mOKS2 l(JV 7QFqnu,Hy0k-(3(tei+-4l}b+79JNA8Cy!ǞՇ%l2#?MpY؅/6;u(ijuXi?;h&8s^Dn$)E?⡀jm{!  =mx{tK]j'~i|ܷ6yq$-hŶS[4fKQ~ard5Op%eǖԚ"qը";l=pkߒ)ꋸcXM{R :R"-XFZ󫋉=Am4矅6 Fz7)&D%<nO(,H /G4;5`^]='5u MnT(2ypB(+AuF!٭^pόlȊ@y焹2U\•N8(ĀbY?y9#$5!?&kϖ(X~4@Cd3|^YUS1Bc?-Xtu9tU2 t>%tR9^`C/`D 7y$K53 ݾɈaw# K#c9 V|ج[֨WbܺƩ$*w2٨g"rױs҂G 14d#UAwR2^vX?/=YE2lqk^Yb"R93H,:t2e鹷eqy-$V$تY64s MjLf)΂pUUk~DԛZ{4^Yg˙X&8T%%ȫ_"L@y}&z^7~}FrlV#0ʣ@E‡J':X,z/v8$ct29F;I";MF&+5u8h_A!5c)vki$H{BQ67HX!=)ޅ;q0)3"CMj\֓/yq;6ipuRןL4,Sy0|X9!XU86#|Yݫw$U"! Q1EoV`]qE^suvZJM!9R\YpOQ]^w=&ң`FcbU`'2qʄb\2ϓW݁&HDOx= >pBX3y.a3**T@L"V XX`7Q9fR՜_((tWl٬ݠGdK%Mr8Nqgޯ/K<:vEA-r޵ ,ZڈNlsFt"9:SxrOO0s.7_  vuֲ)Z_ 69,e q"yC@UXYU4r7\y@sz]oEE>*G G3zE$"0"Q `V} UfzFT6Fi脣NzL+#\[ WY@4# M9a QC-WR1:z4U]@ɵ١N1} i 7 vK=9OS7kY&q݋:~I'`{jx *}b,WIV$3[0Q]o]MT3vI$fGy^, w}/f endstream endobj 348 0 obj << /Length 3975 /Filter /FlateDecode >> stream xڵi 1@ ;A[p(J]:63ڬ 1#吏#S̮fۋ?]t|YguY+oً\G^|Ja=s-A6ýʢ9U:Ax'g~?iDvdOQ2^;̀3e,T + 0dp xMLײkqd\N &#A)P7'2e"i3 jOPVU=Ġ?9ZD*VphUXM, ,V=l,dž~?-AK8x;в_wox({,C΁X#6 oVx 8?Ƒ=AД%u]"ȆEՀ)8FY q6P꼁 tY(/olc23Ym)cPBD(^e%;p4rOvc6;arsB0@8q*gzqn~%b^: ԭ \f.6VٹC A2YNpvɒ_+` ^߄ }j3L-gA.k>N@IvK?|r925LHFl 4Mm\V'՘F`AUR'`!D-Z Tqt8zUF94yGȾ0oE?F#gsucwcC`N_UJ=2GDV۹FP;Xyi"|CX^I.xPDiQ+#H?CߌoZ47MynH*Qk4Va6Сz2wcۢRU] ▖ldoh6g^ Fo0Wrh!Br!i*eM>D0ReZue"AYK7 ߗOf3Zf^FJo?yd%t[P0g*Z-&HLGʕ» 5}JH@dO%X+UHSj낭SgVyaŒPg*:J=MNT,JKaAxM $ IAʱ}K%<..B\gH~ȱLmB,v'ۿ۔_*]:I`@#))cת,d="Qm=Y6d1eUοޯy<Ҽ'h^Dڥj7B6n C`}cb' -JL٬Ѭ05$>:R4 ,`ءq((ZiZ*d˜X Yu1?ɪְӟ:Rֻ ٽBS"B.'͙>bˆ:d|Mw>a]Ye)|qKſ)>Sb,Vu?V.74qRܛrJV1#z 'Dq$ڸ=cFvs.><6@qa̴T|CC/l7Jy>9ѕoN,ޓX>},Vz ,Rt1x=KWAKTccPMѺ 6u7oVp+?x(ə/ye,m8IecA褐\n(67٥tww9vaKN1_؜t'Uf8>T {E\qM˨){lic^kSnU )@HZ9c]"ny\i~ㇵ~g5XQֱsZbCNi>Ƕ1* W= 0ߣh3 LύᎸ(2x7g|hf<;k)5i: ,B VJn> stream xXKo7W9I@=@\8@Hlʮǟ̐ZʴRk-fHP7G P2\heJFd2NOho鷋=+'+zE}ćEE+Y+ojpSpT* vfd竣3W%@DU%PZ(iRXk-x7JWF7 !hUrZl3YR 1$hC&h6#.*P/ 7Ŏ"adr1{]f: hD)ѡFT:6Լ4.3ZtX!Jlp 5? :Èб{s;V&|m#vtz~hEL6%eՓfYbeQn=A֋+Rbߍ"͊ivROR06w$ }g .- u̦α%xZj}G"v2́G)#T6# K#AԭXL I`ʵ(Đ#R6WFb}i#WeYJ9LSEkhSHוB )NĴȑU*(A~ [:00#Q'g;a_,:]K~E/}2VT~b@U19 ӊk[n=fP3 Hঌp!5X XiM͛t3%4Sȶf:( J+(K?ڍi /M)Q7+/N(; RE9nU 0k $e{"UxXw^F]| Հבh&jRHöql%){tqNG Jѣ/z8:8:ʏL|dMqK{m5v4j@Wui] &7#<6~.xxyXqhA7)eveftohVps.j_-t >wFt*WB+yrw˽-;qoup.wmd/);ss8>$,NxG7'./Jӟe1ay%3ruVj쌊lTѵ@ \˞@,KNnJ_#$?loKv)~icߟ-3?~)͘\F Je[zfŌ\T\ejC |Wf]I'+1]ů?/"zع+=[<Ȳڬک LyI—T9D UxeFddC?(zOkY#EjE&C/3{2/f{ּRnsK= wGpuJj;=)yƏ)X#l endstream endobj 361 0 obj << /Length 1614 /Filter /FlateDecode >> stream xڭXIo[7W<$K9\RdAr蒸4ǖiڦ3ӣ@az4 =v|$W7q1Bk3ɾ ߿:% )V .+ RFy4)h[mpCyA<pRZ|@vƏ1)=~&*L ]TG%5*6 `:p^JI#r}jW#I1Rm `¬9z yA2.]a1C5R@ GR^\`#:!5U @F0\2.]{i+8L=NW8MHpFcq͜YT#z 쁸U6/LNHvdT=cNsZH=( JMN#YL nkhȡu$J"#Vq9eU.#\fi I.DM[8R&]79[2S_aR_1r噦'*.w8d"V m.z˶j-j^k]dۇ[qF Mdr<uw|W>Vaj$[b#s&o5KcYծ.yݓIZh} bQ:nߧ/pq}qQƱ 2m^l6ʲqf'b C17C0̤ifJ8JޡPjt3:HUM4CXhR:$dTYb4Ki~.uDz p䛀bbRMhQfUu/wIkQݗ*K6$r .sCJI.QO:o= endstream endobj 365 0 obj << /Length 1942 /Filter /FlateDecode >> stream xYKs6Wh:43ImN24wzHr%JV#J6.@hɭx,>X@`6tzt<" @pƩt2x?cEb1-r=P}UBYġk(>b?"y%wH`>j9xmp H%R$: X&H 0$FS1D/v2>G)TwPP1 =GP!I8U]05w3߈z"(7d"r o-^C1|ۜiϸ_-`k'PNPN,J_ Q2K`S,Dz5ͺdzQ#]@lH@)c?ݣHYΐ@Tn}J.HT vDĶ)iɬ" Hem=c(ȅҏnRDO-ŷg pU!ݶFsoj9c{٤@>(p-{[٦%+b'(ӡOǢD{ȱ #1Jf\V䙞w!ud!+U,c`nfmr %f1pv=(!Z#NKɮ QF x!1|rYs<՛q8ϺB=c]L<-O_r" b]f)O8$+۸RVxCZAtYZ?DnqSѮ9g9}dnЪ161M3GP1x,ɚYpC'prdi3c500VH_iA0pGь!Rf)-)RfK\ ʹ)ye߆tɳrIF?3Ļʜܭ=IR/ʿU(RIX5|B'[j +$-2ܦUE>t`UrPMKDUZܒ??q:i#3`$us$&)P(R UsAbDHMbJڊ-RSg7-6UџZ4g2P)Hjmì#c(ӒFQ%:Ǒ3K A zUlZ9+Yaڻq`] v)Z-=L.QSB֌NO7#p&>*.y"T#$d_9o3?pAw4T/ÁSmsL YGş MPѴJ{ lq/\{4}JU[FUe.g\ZstTod$3Q?ְ+΋DNIVA9֋]HtREWkA{]Vrs@@'5+g&8: ?U0 +3x]!Ž \ưȚNSn4C,"~iHikW$\5L]wF{kΛɯC}4{I;a+~G G;.E&fm~%-H'@Gax3 #WsqJ ;(Sו  'I!D}ڭe_%5IW<ǘ#׺lݏtu}tUSB@ vϓŜ4iyLLʹ=%{zlݷÛan|kkDS=+E{ 7w8Dvt︂&=ĵA?U endstream endobj 373 0 obj << /Length 2439 /Filter /FlateDecode >> stream xڽk @)1i.!  E哛p02˅g8#@`2Ia4ܘmyKISi)ĈSroL8I?JNJ6d!k~' ?3M18͜LD?/댮B* ,9x*@f=X%z#,H!~G @q׋kb4RS NoӜUhiBohBeK?4JS'aYj wVhNu6 .vtiqY K֩A~"ҷQNrד4eư!s&Ϋ5wՔ%s!CGI',J֬Ff +'>b0^Rv(zQqͨv ipXM晴T'Ai]Atj& ̤}CP& `GDT!ꊁ;R շr "&z/H0%iMLh/.աĶR-O-;J Ȼp)Pשlx\d,$yd˽WQuƟPG)+Uy z14:7X"P(C;bHAgȑ6ȆݍKfpDYD4 yߡ m2yjyͯE4#G'y51tG.5J >0ҚNB!l="" 5QF.b{>{()% |[MW5_'XFO@^:,`Hxmz{\3 $VcDX`#WH)W$V8xhDQp֨$ :!TnWAU݁A>hPBJk=hjDZ&vB"-F\UC0[anHʾrYLTbT^59arVtPcP `-7Lc:Aj29I4yoD{0%KJA)w}<|=۝sMkWEJe<*6aKI%}[y JTt 9_! Pipcp)0o{0q$XGd;i94o$ !?ځX $[^w~.τWfy E *6Feo;^kJ 櫶s(k"HN$v|LGVQ U*edb&sS+A&@yfoιs&ӹjB!'2LqP6G!_H&KJ' + .=2Wߔ}",6acy~= d#@MW"vʭFeM&wHggr9`l'L~H ~-~YdsI~x %?ǡ(NW S;X1|3D`$ǘ.WVs|1 Ix0nߟatgK.Z->gjvϝBK޵S4XoY>G;OsQ ww4ޠzEOA#$Ѓq$wszy/'ŠWcVi#&Y?y=˟sOyN%uPWMy6G6T1Cڗ6AjMҵ}x)&1lXthuX%^PT!C%VQ4QɢߗWf endstream endobj 384 0 obj << /Length 2772 /Filter /FlateDecode >> stream xZoBO2bIhѦH+zZZuz1wf8%k(Ùozog/UTR=LTq/OwH\7ԫAPC]5Ǯ +x"x)j > y]o1?~}Rp.#r%)^ PDqYfG|3Lym#W8q&e0˚?q)'9\{7`!u3(~k EҠҼ"ր"SC9 OUli +hl=t{~/[! <3yR[Z6c}i ;͘˺x._k&TyE5=8m/C162֚@VW;.Թ{DK׌/:)?|)S7QeGxѰwx>-Y>^0itϓ|`# tyt;b.9m_7ٯhv5kHJL-=@.q87ye sN-<_(TQubOļE{ l__d! ђ /dv #>>#$pA0|`y)sq,q/B1yÂߵX "wP~:L^Xږ_YCʖ8M,x IzÙ)?/1H5s:-a(yVlOmߪsļoRMQ 3xjmW{(+80š(K='xjJc) nܭ NF礫gvY bc]+Ц"*s#&; ]O(klmw7^g֚֮VF̅2Y{\()v0s֪j.ry $Ee4S>`.hFCuàL"1Zt^)ե"JT 3}4JRG}nDER8DrcGeZ3ʂ _Xb>-`j wl5:Z6'+D%CTG7oVDS(Kеw;K7}(`G/kKPdۆ;Zb#h#̾0+>|) ,}%P%\mDԯQD(Nږ5k4v%,@vDb-Tks2!WQ=iFD}oN-iR|k?%`k5Eg#+P)m@U;uWwBܠTFVFjTƊIMOybU9ʼnv2ZlGb-GްjYPp"6$;a}=/vޭH%sEY^!Ƥ7 nrmED ĸsĨZ.(>Uw00>Ta>xkpg %(m/v`w6mL%kX|# Զ>Q wp(#qp׭dp!JrN!o ⺙}Cׁa(  ^1՛cH@|lfbbGGdAm'ёJctrS>cI(JvTvg}ajEL{ sFqele,8煊f񞵺D Y['њQUFy H[TOMK(c*n]DEPRnϯ%Qe-S 룁P^t@:Z^Y`iG1r-tbM4Ea]2+j^= iOv&B,2m`ܸQ=?lKB\cj?5N1 @]w*/,QNc똔8/6֖$*h줜2pS`ŶUޱř%V:҇'˥wcnNVr1u7mlXT\&QS !2U{i׶idQ]ZVCFEio_[//k {Z_ ˋ\gO-*pNITx룼epGRr~[3̃3MҽBâdyo8;U/DqYjyuޝh?5pPA2s7&tkeP%HG2BZmYonuWsI;,/-Spdw|q`(%ȈdZetGI`= Kۙ܈]0'#Ix1?Q )oH6T;(`8"o endstream endobj 392 0 obj << /Length 1865 /Filter /FlateDecode >> stream xڕXY6 ~Уv&V[jnm'\!Ƀ֖e98)Vtv egbYz JSbyPƩXy|XTa䒕E&%!&7kH\$ b$|?̓$k ?HA ]R/ʴt)'!<2,LWJG*l8ms +EX<S!S*EN- 5 _RBc[5r{wݳQbWAM |U3J(Af\+⭺R=V P" o?_1fˣm(=`!ݟGd?d2es\kTcMBÐ53Kby':yKuHIA+R4)ǡDeobp ұ{yT'tpX0.oq|v@0a=φYM[xv_9υ/5OoR3f;0$"EaJe׹!H#/yhݤkRz 3mZdWyyZkjJdZ=_"N+Z UYu V:>hAYb&LNDz=e%R9UN6]^-`~llJzѢ箽עO*N&VRq:hA8&*![2h;m)o:ԩ #B$z^$7_j N> ny,Ř\ q-76l^ "!*V[d]V|TDh7Q%}M)Fw KW8m+%[P&U4[vTXqjRH4ͳ ; -nːdw^I&tncI߯%O'3y6mhVD5wwξZ{}\%&p a xWyML(Pc?Wz یnݜuA@%X$T> 9:1`]ESzs6/}+ B{:uy\%ⱃ6|9ȖcQ*stu7z8P ÀVruD­]-\IGZR?ȣ#Hm5 jV='½VKMV:BZL09֨Y5?iY/Β  %^_FQэ1jk.,=-I&56v_ϼw'r>P1Q3SuXq>/ProcSet [ /PDF /Text /ImageC ] >> /Length 39 >> stream q 207.367 0 0 207.367 0 0 cm /Im0 Do Q endstream endobj 395 0 obj << /Type /XObject /Subtype /Image /Name /Im0 /Filter [/DCTDecode] /Width 864 /Height 864 /ColorSpace 396 0 R /BitsPerComponent 8 /Length 397 0 R >> stream JFIF++ExifMM*JR(iZ,,``C  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ| ``J !1AQ"2aqcsDTtB#4Rr356Cb$%S?z~Ju0NrҘ1i8Jjdeu\I>+8lqܒWmxO+º rvZ_X$rpU'CɋQΔkfJi4[o0XJՕ(ŷhJɛczF Ursъ#T1)5gcj6,9uNXt}/(?!+F0˪z~:pDcZ .mӸJsmVy]>JCyIJ.sܰ8w&t|tE1!C[rъgW#\Rj (7mo/JJy5(SpcG0RMΣVE8εJE҃m.vt >gw= lc,UKSVo-ҐNTԅjrY4ޛUhʗs+9S=CB}ʽ\ΒV:gerMEk@x_Ylfo ?*PO盫2ҴaJ5uQ]/Gf_UUWydݑ4JIB.YM)GWZ%0T7)7J;Rad:oy ?iG+Z2eO*ߩLlO 8xqs<"KץFw(uwiCNjR̠I=FS$sN?ðL&&)YC SG]%޿B J'Q$:Hi*b#VqVQO%i^ kX%brbjz3zw-K8xy1W Ib:Cְv>jڊ|H;biWb,`*y}~.|FE^Ju<%N5pN. F#ap0IA?)Q-)G {I]j :P"ĺ*Bp3%*t^gWMxiL<-QZNsYTz.<-HԌa+2NlS{WKz98JZwM:oz+AN/8И}OCXv`Q'{JN1RTwpphC$df@ԭd7ѺJX:5|:)MjK[ld%kBit~eZ Y4JH4!Iݫ)[؊ʵZwMC B׍;Uwہzjmm{WGaV/͗3oNiB0bR䑖/CRhΟF`JA/38⥚;IٲT)PRQ$Ԓ~0zXjJw(ac(ІE'wRx9t+m8 b vi٢9p(kt~YVNɵjxZ43B5iJ_wN gZ_CjVR*P3D`SwWmwX|MHTO4wj¶ Z+TBewG FW?gS DzV{G FW?qx,>-EW.ڵo)Ɲ8ӂbK:3RsJ*RiCL&T }tTq\UjsZ좵;= w/Rp^VJ2nonRG`,Fz I+UT'&i?tyhyǐs/cP*TZu*RURFk}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ9Yaybk+ Mb+澾gRՠVS+RVghTO ZY97eI3C<˞{qR*ӭ)Ved4___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___ku)ʍZ5j2)]5fv l=Zi)8iRxT:(*2kE%z'W:r JYD(SV2sWNe&\MU\{WMfJnZE6--zQ=ϙ1fW,=tЬܤ⸓NĈ{(%%$ۻ nfVI#J2"zJ,}1pexΈ_&k^܄ܮZXQ&m4];Ͳ#|7HOEʜڪ/^1̓ę7m~FzxjE3֯̒%RQZ$7du$J\dݖ2|[ K 2)[bA1̹3.kM+}*]1}?_FtUX'WWܵG*M%w- 4O;(oV0JQIYسQKFїʻ9uMbfxrc'}r&io2٬rK4f;'w{]>"M]_]i8ߍ(ڽ[,ryj2Q{^<ɕ²9)Md|uk*jMX{Q IJVV]E.'}*qJgIEEyD],TMNM=iJRWZmfw/mݷ#Ug@8z/퟉vdENRKbH-HQbKwb3."l$ Sn2k.q59atIF:MMwQ\윫 E"2re]ϛ'/mՆdOc _oWѝ迶~&V.I$c,+:|d'F֖nUn`$V-Qnwj'U)vkv7bJ.K-Y.JQy}yjS$׹STx)8fygd kԦd٥vл재v&I;~)kѤ*,$Đݕ|6wII"@]sDf^>W:ܑ7|R./M/]H4)$sxjree%ühP2M?#Ө[F2 URT<12(,XV;kH%ѸȆh(8KєtcT㪱i48vvKE+'fOٗ4QVj܉qkf\9ZIve{wPZ2(yE8Ipzu6zkM9p{NiVz_kø8+I_%)ȜYmԜZi8+}*nh>-ػE&GfQj&eVw{xEMϼLV˺/xdKt*˫w}Mvm;?q7u.W3}ggd-)[bJVD<m+HTwrK^g͌߉`!W$W*ᧀBo)/΀p_??$6iAZUS(v LDۓ쯡(9Ǭ/И^q6{2ZV٦8^IFXZeiopjǒIWь*;'yQI 쭺Me,m~򒊺KԻ&xگ:6-*4#[c䪵IKT\8L1P'"%N;(K, HlLcZs, ;, [~^ l_,!~R nWy]7m5rejvzFhRrѤIݦn|_oWѝ MBN]k~GGUZ$okGEF&PƓn{]nԔRQI%ݤH迶~&&խ(}%,CZ긓d9}Yg֎jQBTs?OM rG $NKGd4=KrT&TbiijaI6wwnD+m$Ekk^Um_y^ɽlRIk$cQIvr\r&/˞7uiZ:fj=<_oWѝ 4ԩ%x.M.)#<- j2ҩIYo}gA<>SJ)gnq!Z ]'2thyx\?Fף֜j֒뺕:5*T򥄞j>NJY_K?e[d&{=K#>͓.8}ıلؒ-V[xX׫̰DedHs+cJTGiK4c+g yld罿Crdgb]ZU&7s4&kf67g'kd6KnBVF!K}bqk^Dm<gbe[Q,TV4 R_54~GxlLc[xCWA;Uh!&"AU{^RI!nFDXKwb3rM1rSĂԍWy)ܓUg@9J FYdՓuo?DQZLҎ 1J|S\RtҵE3Rt&6jNeOM\$$F[{mT]f=\R{_ikYW ]%JBܼ컑HgkzX՞BoJw-94oeRyot5\tz;{|Ȟ%LogF"w-/ݹyɨ+]+4,ު˸+v]*vd[Z[N%2}ggIX,WŁXnE M9{Cv!&!lKdwؐU_S0}ggv[_Z.KbɦOb$sxj -q.=I p6*RJ8`=;Hj=anU<ѲVm]o+vŠ7gI;lޗZ -S[n3Zo3[xrr8iɄVċ^2]%5{^ ͷȬ:[bUtWF4Z6Mܖ{_D+\uDf!V6vk&i}̱}?_Ft tVFRugݦCXN5!2WOiԄ3R*I}N9}_>r1NQ'mA+rAI]~zGbHee ksаc!nˑ >L>/΀9N5ݨNk Ƥ#8J2:jTYI/8ϸKbg.R)9d>D-4 x\&WѰyYlTvWk^6YYY$Yvb.D]+_tW௣-j땊U_f۽-;do6Z$hŢvdDIUc'wbJQK2t[MXz%dHxٻxMMEJM4ZJJ-JWZƐw1}6?'K`Pqp_??+tWXMsرYp|`Uq,CXwX/$>DQ kus.d^~H! I|_oWѝsc}gE3<+ueF&2Rʹ[o*oVZm&ެw[rWeU7-~ey;[K܄o_)M2nr.ŵKEfws_6V\yB Z14wHrm7KǸUÄZIxn"n/4ͥJҦR̴M-}̼/ҝ[41}ggWVފPM;]w4*i-S TI]XdF׼*X>/΀p_??앯*Kiɻifȴ]l$ݕ{.n۷"sdӶ&RiVfr![3wYKT[2zo߸qYeGi+[n [eBF[EZ=/ȋp^#v_dڒdE^fie[wzJ姥|KV|6-%'/)e{Ǝ)ɥ*r-Oe3=:擃s+mU&fQ:S8ilH+b% ie,{HlnDL9mwI&pg9F7^CPW7-I$ݼHJ]xjE3^Ee5Ve_D+tBm;;۝[-['+ފ+aM&ܸܙZwnκY,+w~zU;$LE-DekJ͠O[4̛(+Z=vŔyAԖn:{;9Z̲m]7'"ma˧rSYAtk]nzI(̱}?_FtqHӌ[qVej'}ՙ%^Oܱ ]X'I ]X'uI ]XE) eg,1pZ1k,E\(vUzNP&x%W#*,\RR'>/΀p_??뚋g.b6$'m#kZѵ ˗"iz6!B[KKXv k}.Qߕ-9'dEaIEk%ݡ -׍kk!DmU6e-5kq%Y5{dD;;?ddk+MF|"WI_ȼmʸtZYw-лZu}--Y&ԼS4Kc_oWѝ't9F)>ITJkaeKQӵmpG[߬>]'S5ұlLc {U~j頝dz;K>XNBm%4ݸ[6ϋ3RN7h6q*Bl,a4S:vͮuˣfzV:8z/퟉v7kh߁Zz܆K{Rb-Vɟgm{(Ů<6EJ6rR6kERۼ}ޛ2r*ڻnYϭfBWibFyirVލ[\a,wY6E$w}oY4V+ GDzضY(I+pFzwd.-oDkTՑE.|js)sS#Qj/Gdfբe3gVjҝ9vgJ4' ,'NtTr%g)WZ!Vi8BkW=#Uy'=mhE =!b"E:)G'G6"m)+>J3,CJp$j-{>B{nMc%|윽H /{%+q/΀ZqJtٜ\_9(М09Qʤ^Ц ^.5jTZq WM\kUTip'0~Le؉m.V،[YK,lߩ)49dI%kq(JZr+8˭߱*&2K{pk(ֵԌwj_UFYWVjZݷBQ[m#m [%㔈v[TMYBrmkmHTfrӦmrP>Dewi駉%~\dIIs.+hM^8گ:q)}lJ?Cp*U ֌UwcufE^9J4#+x_s~H3GW=""Rm(ȏH?$zE}#+x_s~H3GW="Hٰv;]yoH?$zE}#+x_s~H3GW="IXLZI]K`MI&j>_s~H3GW=";#K[ ֏#6>WTCi%?G`ф«hEx;CPƵVPSIsOC`έ5V˳4ɓ*t.Q 1a{99;nh5UWQ$׷dUU4"cZ+()$չgVJtٚqvɄ:qvI х0sP4c*樒~j V"Z4ڏ|uHׅ,NT|u$'tᨵQܤ*JVieͲpSJo,έZt)ff,\1:}?hNujF)ԛ`*RTi*j]p= + - VmGݾ:k–' *>WHK:ow :F\lpZnROHrbqNXQIի4ڊv8LR)¥7pzgV:JPݳ .T>fZX:#FM0NOHd[ *tj4L}%ZظTiH-RrJ4jT8+2gܹV+kӭJ)-]ɞ؊m*,պ6"\UJj(ʩ~28_g?yۧ%~8uaz-(Ept_o}ʻk:i7,9H*jJ;m~H9*¤OAm/*3"QR7 6qY>b_^lJTMIjL@USiPd֭QjTWC^UKun9xN9+ì6 llB-xU8МYIfWV8|^GSRPikG0abi:k_q>Sg rR~RO;)Q*Ьy5}ωĨXdM{j)aݛTӢRNrljPJTі^9DMR_b04hfkʟFa)39)E?)'ӕhVqjhT|[q2M RX̀*Tisto)'9wjʵ(W*uVhFkˢpiKOY/w*3RxVwۋKҥZ(P5~OJַqyYt⳷v".lU)(ө(Pqz`p}%FxjO^j[qixTZ]% OI^7Z3x]o+<5:>NVvNT՞ %u%7z=OLt T/yo[~(̄R5de|cN,<($kSQa@Mg_VmR;_:O*SXaFN-Yܑ:4F5;Hgy+Dz- PB^O'rRn/8F?-b'T Pdֳ#gy+Dz- PB^O'rRn/8F?-b'T Pdֳ#J5%QZ-P%jʔ\۴e%dͱ#C⪹9h]*JFqWqzo 5yLҖU,:][e=?{8YA"1VSQwUjT%968^ź&#̩9)GW+3j/ZjS=&4GVjUԅn(TItTZHԢiA6W;:rFNO3ջL^:t[2UIVE-FRVL40N*U.O4gw;GQ)eQ˯råyE Z1]SӅL#e5xIuVmENSj-U:MZQv{ù6ۥ) *۔Ujڊ|H;biWb,`*y}~.|FE^Ju<%N5pN. F#ap0IA?)Q-)G {I]j :P"ĺ*Bp3%*t^gWMxiL<-QZNsYTz.<-HԌa+2NlS{WKz<~R+kF+sE`5m/qlWG᱓SO4M Z5jTT'd{x(a#(ІE'vԥnb+*iޢY6- %bg^4Vjҕޫn| j9 e5]XgTo6\:q ъQKFX dTkJ;٣:}(JTex7 j?'fSPBTaIFRK4a*tc oW BޭJ<^WW|T1*3e٧fC0t ŠZlEeZ;V&ũhZե+}186*QjJr} ӅZnHBZ4J]UNz]sWa5!R<Ӈeݫ ,=jR eޖw-5b%^0JW{LL1Z2-5b%^0JW{^|jվЧtN ъI.rIu(J}] 0<>-PwgQaqU S%jϲ'G}|J#N )y[(ɻiJU=jJجJnj3yΪ]WS֪ű]MN+SН+Ў :x,,n&J5(t|aVggZ:]B.Vc,n&joΔ)M$jx7N5sA5r׼++eykks\=/1d\eZUi{KJNZJQH}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}yԧ*5h8ժTԥtՙ2OѩN򳂍:qpmC9ViJTG+$8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___3NTjqU橕J3Ok#HEEXw(u&3sLfݭwZޞfv]&Iދ]_&kw؋z1{i/m%_z~nvٚ'}Ʒds _oWѝpϥpprk|rKދauה'}2KC#𕙇ޱ)8)K."i9;eY8wRSpdJ);~3osg%ͫk4Km]\Fwtq>)򒽖ԗ9' wo ݤ"[mJ~f= nWJ"Rz[pյ3}[3IJm[]wOCԚJ[&Sv˂ m%aܯxmq}?_Ft dtAײ*%%_CF%m! VWމMh๲a%+7?/t/MktE\Iݹ$V _gqCJqǒ˜گ:uB"o Bka+PJ/%<}w* *Spե7uÒ= gg5-oЌ6RM5 Y4a{V2̣~#V U"o;&L"pe,q_fZi^D jfnYM~uKT&4ijNE܊_}VY$߁Ymv2f(ZfݵԳVIZ+N7ۑ2bnV>HMe;s,_oWѝY%ZSOg2G2nfo%^dj[$BW[imy>8|]5k{!/2X7km .?+tB6\$@QZCq|uMv[n3>oqeĀCۙEn)Ⱥi }>6N8,Djk EpmUetḤmɹE6Ȯ.O]w-;m&+ҺЙ)enxRJz3Z6bWE4i[]BYuZs!jŶop&y S,ޥE[]xZ>N7CZ]w(n6/^v+m/.u%+>B[dFRSqO]m[_mTyW[;kldWr~7VkUg@9GCb\6Zn"ۼPon%sI-iYIn7̯k>&8گ:e]Ս;Єg;)YyNЯFԝHbHWi;kܯwpnDd'MTIFZ1jYӖ+#R"_zp['h!hTغdoMt]%8iEcMGWy=6_~)dHSRPNO]^Se;uM;kvW JVUg@ ӝJyiՕ'~Ro0\G|]b)95mZ_b4OMݭZҳm&|Q9 *U.)Y;6׉ 2K*ӗI$e[!=븉Y>TVN]'nQ{8IEG|[<Ku!<|Yg+_2BGhLmN+|Yy7C%Z/n^}ritVMg+)-4ni!unJM2}ggU&-G8ơFU*p%&"T[ZJl[Z tуyNnNI&n2voUɖJ!'t"67d:ܓ"Oq&'.)hN*Ro2mk2S)8'z5'')-nI|%n^c3=:;5uղtK7n:n-4sYތUi<-Lof-%{&-%k]ݬWv2=$/"mit&4La-^[I_Mݶ+i~dNΨ>i4@RwwDm< 6Yt\H`nVԸhԭ\qڢRw5:_^a'%i;xlDVae۶b~fXگ:lLcV䦞đ+[R{.Ei=IFIzí| y%}.Rj:k\k+=n;noI{i+=1yrmx#:JPu,㳾#xQqK4W9Tg'[MR+u,{w\>/΀p_??먓Wjlg%gm lF-([^,W3ڄ\b-v5s׫UkmXk*HExQj]mZ+jDl,;rDI[_%74_+~L]&ӿR+%KRBI__mWexk\I-t"Q㣳)9eE'U!'d]|4{4l=Ug@3\&\$\l6**9SK~ktp_??왔({m>d#n 2{7Ë }s&wM]NUe\}qmwט~M}ЎK^AKi|kMnȎ$S0[IY}Iz^õGik.M $Bl$t'>/΀p_??먛Z;39l}%}+Kj>%\V]"MYk]fI_E)&x]nYJC\Zn3sIsPVp\Z"ӞV"o%QI$w4r--EEVr%ٻ*[| m%w.WܬҩM5*)Ź1Z]vl2/΀h9Щ9Ehy|[ЅJO4_zhʿH@8z/퟉vIR{0ݼHsHeDRSZyokBY{[t9-9$ݭ3ݭV| NB"eKk&[_%g,r#)gQ[uaS:eB3AJJߪ5+-Q-Q-ɉ刎rm$^].mWqRrYuj=]q%;Ug@έEJ"o;-]7Xkk[Z\i).E/~|:Wqi"[egd \fYenBKyk=g'm*+]n(X+;-Xi+iKX2}ʵEFJ6&r9(8?y_~Fq8xVj3WIlS𒛒ۻ'8jJ-7ήkngiiS*e4u_̇2S\[Nnd}Dfbm(S;e uf0N)-o]X8'kFSѶ"Z$%[*Am/:CgVqi>ʥ9MNQQqM%{TʔUkCŁ[eUl-6 7c:RJR"ѧ6)Zگ:VѩU"G4q%WZG>O?V' MFj=́j~V٢~W<_5[>ouQ*lju)ΜbISwwp_??Iԫ%IŮ<ƣ&J%d]-oZR-;߫z;_g3M[\Veɮ{䴶Rʒ uIוgiE[M޶'f?~eMuv墕|x;&Y^ۡNY+W. mI~-1nO^|N6芴ﮚX$*ԜsΦKV Yў/΀&'.͵#}#X*FR7## T(bIH SNjJ)(rPn 47kΣjzr+JtbTkTck*Z:8z/퟉vKK.e,4p!nFDC\V:[E''1xxV|\ELsʌQ8kd!9bQcUg@qPfߑ徑Fky|VI)jG*1q[[s%RIpEu7B7kmhBhMUZu)QHJhy;M匥},z=:y.-NZrD]uJmڵs| VmJ\m+5~!$Z;t2- vmr5ummEer-|nZ;"2nJʛvZku̾s ]]?أźOKhWk)?2.\r4tBMuE[{m#RqRZSmybxje^qFI+1riqI89hSQ6JJx{#:q'QO߫;p MFj=̀0(V+Bgh¥*VthlLcZDMĽZ^ՓkB4ԯ }+]ǵÐӊ[,o++nV5(^ -%\GeiD7\SEBwѯp]E[27~Bi&d;/=Ɋ/΀UTjTc&Ã5ciT 73qWBynI%Z8f*[Qs|M562a=% DfɊϗ?Nv|rf7˚"]Wku~XFCݷm5i&N*'w9BWRn-Jϓ[vj{"vI.d]^ɬ16ߋ"VӉd춵r"R-5weV)$̵գv$xiZ۾ĥŭ/f$ջbxjU$Ԓiyw,6 RɞR MnPaJ9ngQQ%k O ^W%؜4\0ԡ%iF 5c`ggtC~/LvY%[ ]ر _r.++ecrStulBzj2Sji$iGj7T`ӒJؐBiۄH0e0q+crK_;;X^IZ.گ:iI5$z4f"K agCDedF&1X|,n[F1TbbIZŁI,)[Ks͡WJӛyXeUJidmʯggg8)'+4Z_7MTM--+$wȋ~lٵk{v!n"{_}$W IM־%Gȕ{Q]JuIY.obTETK*'xOU%M?3_Gy k$sIeÙ1wMYt$gWYlR9.KIu5/΀sRɫ'k8*je\hbzYk;ggx[2y}7xb4߂ۼ|D-4Wq=nkO[%/2w\z/xkؔWn̹Qh5R$ 1}?_Ft3eMY;^ϙYVTK-(C:E'M+_0tp,Ѓ4PBk)wPgguvo{oI$$N2辤\zd4׶(.)74*W%=u禶"Y۵2twŬ&e%oYi_bh%Bo+{nKqQJϸںZp'.XkWh=6Mo~vL5RV[&Q[D8i63r'<"iA *hnM-w1}gg_mձVz܍kψ￿{k%a|}NU{!H;깖+[vV%$.dm^%WD%ȋE9}?_Ft&84މN8J׌RvF=:-%5Y}Iޮ񰒽fg-oإ޺x"UޭŗRom!j-"]Fqvn[칓%dM+s(+Ts5ei+){ h#i%kqdr=mZVw̄tih] v+gQ7ؘRcge|Ik&[4+yf$Kg3U4Nzfq%*VojwCWVeZz(Y I5P-wI b-E VDur%v읉Z}Gk!;a3UR4ۣMT.YSC>rq9,&wIdR6E+Ynm[l4npeIf" Y棪m]ɽӾiiܙK쟸̞[t~H+{+< WfܙJ9igy✓nUE b:L[(j+k߽wó[-MY5kbxjE3Y&w!v˙݋-ձ)\W2Ee9Rǃs]n-I[jKr%ceK1؈Gx\ĸsNje/΀p_??n6[9۳DwːKK۸W!B!D+/΀p_??읭n7m~>FWO=ȋ'~x6t읭[+miue{[DZ.d8Rn,\SMjY+4컶ؙ5ۿ|J-\cFZ<*yi 9fZ7jm̪]Y-zÃ}x8zZĪJZ9IǓzkɾ7߀&Fֳ1}=LfR%sJu!V938@ggܖNlR˗4F;+j_q(^B)R44onnNE:+-dYFt,~x'fZRqnZ|BN2\uKIK vѿxG#7%pUg@8z/퟉vIfZ;w'%v _^Y|2,ދk"o()Y&4_]xiˮDIunNvkב7v6eP_٧T_EZr&VͨbYnוĒjIe]YJZ+nTDuoН~\[wkLkYE' F)s"5mL+q/΀u7B7kmhBhMUZu)QHJhy;M匥},z=;[*v$ +vVJ-dx/#Ns;x ߋ٢SOfD| *Q4~:qyK$dJMiE&y7yqѫw$V]hIh٥O v'z-}.FEϋ35*tB;ck>y_1]'(b&m;'Z ͶfS]i=ZSSz]qVеT~(z4̭w~/nx%V(uVZ ҿĎ6|6`IIx iŕ,Vwq~$AI'm7;w. 5{VoinWIfׂA۸B\%\KG+Nd2Jp'U{6Wu۶}L}?_Ft NYa)(Y^vyHỤO,NϖFͫI^!eup_??jEk%v܍e܉"HW܎Y{rZ5mX9'SvM.XuNhBfwx+'ho獡Eo}֜\i/} =Bw`|_oWѝsaiK-LE(prW4Rc84迶~&4QwRm%*̝KMZ7hUu}JƢDⴌZomvwρ%u.-/wh~WE4mk+)M4N\ RYFm'n*6jQINjZܘZ{ܝTksmu~V*ѲzÌ{OC#QI=%5vwViϻٴ|5׈U%vɻY]g)F?s[Zn YE8c3 J77YZ_\^52Z y,oksSD5!],D}p%lt-Ż\Z[BWb]ES v+r 5 ]X'}!d*rJҒjif ۵-rE>/΀u7B7kmhBhMUZu)QHJhy;M匥},z=:6K&lV munkF3v h։E+WU&(7$RѴb!EWCKoDbr{,[]:iklJ_^iJmuY.-wgvȲZc:z%̳c)Wr3vZO{jq۾䤔u^ lJqZ=ó[$m6- '^}?_Ft NJsWvW8Lդr1lUW3r֞usa?H!l#*㯉`Uv vZ8C||ߏв=ICW܎z[c*1u3{4ӓhSXE;]j`/΀zFJH[fSVkSiNtr._'uƻI0teA%y]G2e_w>%^[ۛ&*˪Ax]ՈʮO;g-'Z pU)]ER3qf]WOWwZknODVMI^eytj&/ȝ2+_3^Z譭IZp+8]M;ЉZ1jZ{CoI[5߇"{QZjh{iݟ#UUg@O ne'V}k5R]%tsa?~ZMB,֋YpL$5_[~mnگrSVrWo^VCwWT;=w}@"JMN knlK$ob|BVVFگ:ZRM5tia)F-)]GhEj~IKXE6_LkUTip'0~Le؉qЪSm]mĖg*-%E/2%*;ei괹{<Ͷī~Ҍj7h=eV׶k٧Ɍ5ҷ6D'v{%$|YFVjԌLT▜,2IHQvV#$Ɍ%{bm;IĴ{gTںp2I?~:)Yzj,_oWѝsc}g*FTrN15l}%T~oiA6.X,DbnK E4Pi1F(Ɣ/7nlε(֣:RYۼbV,ʵVP~չPTc:榚^_jFcZU|O{}M@:~VqZ4ݧ%$.lZB5trQ֩O o'e>J|8IN1KW-('*zI&RRK}W:ʍ.W)(i 5 BN33%JhQVse̢FxZeNQoTҾ'Rq́p;@1zPvSX4k(Rn؜^&8hErQc ciQEѪ'$^&^yL+Zt0r:|NRU!ֱ4dbݒWl,V*th9:ZPrsOM֟8\ThuiIEEwL&&8IJqeY*F9TbqJtUiBnIvԜiSIF)N\4ШҍG$ٵҶ2qРԊRYEE=|MphH[DpԼNMo&Hʎ2rנԒne%$q5ba7k%odcK7FЕDe%+nUʥH7/(R\M&gbqtp֚{w9ӭ.u{^+,2RnтݕZZV 3wMsLO'is-k{wWD4pPyڕK]BjLF.T*4h\s4؆:Uӥ<RN9.v^h ^OORs}t#PmJi('LpЋqsy3<>.U+:55rK2g`t\i┚Ry_OC)_Dܚ]L!^#8yps˃O4)6ZLuONr}ǠR otaJjExT]"NU]+NWkr| N+R6 yZ%u$r=P8zWO_21yI+e SӍ=gzC?nV}0qRPI @8:/LMҍJ8UaYשOYfrʢey04TnZvӧ+{NtmgP-N>78DZR}ɾ_tSm?)8([F0RY`ԟ%m'T1Ro$c8VӇ3XYGEs]b%n@IrDoݣuONr}Fja(.ٓ媱S`wN-Mmm1©Q^:4q;p_JEiJ7gH3Jg/Dʰ]W3IbTu=e$6A7{y [zxF[$k/;GN)o*pq% TNaI&^*`ja MjR(Tԓ@8:Kۯ;HsˏNT5g)IۖH># G*y'4y5M+(qrRRe8Qha(C*kɽHԌ$#NY|/0BC].*jO%nN G Ӌ.ԥ&5UW*z͗3~vRNyI9˽Rji뙳: 5 Ӄ̕M]؊RSps(K#8(A(*.24wYGIG+wDhSiՌm:);m>Fy|(^1J8T8FhӡIS-4VM5tLj5HSwfmG=R^JmKʗG3%*RmG2،D+f]hmJ(Ӎ:qQUFε*uJXB[eʜ^f)9;ry#RY*II|FFճNNNܵ3FNRpk3dF)$\ M4fQ҆(ڞW{<NVvNT՞ %u%7z=OLt T/yo[~(̄R5de|cN,<($kSQa@Mg_VmR;_:O*SXaFN-Yܑ:4F5;Hgy+Dz- PB^O'rRn/8F?-b'T Pdֳ#gy+Dz- PB^O'rRn/8F?-b'T Pdֳ# endstream endobj 400 0 obj << /Length 1694 /Filter /FlateDecode >> stream xX[6~?"3}jaI23\0P!>s)I ]rsJ1 k3F4(66V?rOE3S4:ixs4M`FYlJrJ)J[RLv@|3wdȫ* ˇHcHC%6Urvi`+MOrLj%,',Xܘ vyvzƮW 1'BGkx'QeGnBƠ͚6"cVn^ PSD0|I eN.Z_%.\c/ a!qT +J\b;#N (y:* (Hvsfeƿ^@gf n15gQ+l1K6aYhhWj7.mP`0(fmtHwنkwK[rnX+љ)oHJ [\f~ЕAϭRNJvc*ZLiS+V`4{l< FymרJb{V ;~T?]Tc[,#ƽի&ΉqDݾ7#u -U* QfXO8NNnݑ2> lF+)]Zn;.T/م1K#|HG >QT!ؚpćθos"qς=q6ِdeɴG6㹻ܗ|~G+2q-z@SgwQ.تLDkњD9=Ubi?%9Tppƭ%ܧ%ݭ(eY۳M.f߬J]Vc~ȧ̓VYq?v4h]1Ȏgu `suTcoxwá'r ~s%˩h3o;=Rvǡlb{VcIOPw+t ,YǞkWݦ":eBxr hwT9?^s`9%}PsiređHN~ӰtgU{;!ձPX=##sނrh1%b9c1 f)f1e̔IOMiW}}S5Xas;bf~=F"msSS"NKMDW67mYzySea,qz:۲gNwnSe o-0RoқRDW}? X endstream endobj 404 0 obj << /Length 1482 /Filter /FlateDecode >> stream xڥXY6~_aKע)"Et}I3 i5Z7ou<*UGQGiFGؘɇ@MHgQr!D ~̘Ϲ]Mu M/0|V̺B3}I@LQ0=`厹G4Hh4j/ ](11Ԃ58$a K`MNccoeQ5Z p4 #hZ-BsЬN)h&Tt{+Jj鷭MW>P/ 3dE@6R 䀨U:rOX|Z1tΆ(l(%}, g(b.&\"Z m6Τ]O?xq*FiB-]!D ZAUz1=l$VQ(ueILT< s6jM#jg}%9r)8Je̖oKIKd&M&#mW&2]y{|$&Jثe7}.0團tʡfb,S~mtZyL:Gf42KѪ疡GRYuSd2[w"}])&ew$wX&?2'8 FGo{y3 o'S:hP\ƟzNx@PQghgoD>Hr5@;$Ü-N'/[t)L!F\}E_AZ0-?RӘ9U~&e*aZs ]v!vFB03͒ # 5cR2}^zmOO{Ӿ臐76Z)/%\ǻ\J1iI7"F1k;EzS0_`HblhpI{, lL#YS$>cmu;FShI-I}+9#? @:Ȱ^7Y1 ~+Պc}mg%(%6fgC&MJYno״BhE|\t T3J~;AjB>ng\љ쌠@ZJb?3ѫf|O  CdOAh<4ow$lr[WtD8^辂l;"k]d@J ލ6xU$4۽sR"vHw9GY&JO}@ shuf.!|3,a<OaLOܠ@p:yQL/.ο[DYw@_%8Jl2!ArpP{(du,e*4of" endstream endobj 419 0 obj << /Length 3468 /Filter /FlateDecode >> stream xڭrF]_Gʄ1氓&تdyHĊ$|93![st=Ex{7e0qTŕY-8.*-n6߮tY^Y,Ec^, |7'^l7?~c9k( J,. % W,V6< ?!U%bg w>BX?NiӇ`q#jal+qn y@*)*o|x#C>4p 2rg |*)ҕV7\A3HOr;g.@k!bRE|7L~\T̰1Э#Raq'!B$*fz D(K #* <8*<3RvU/AD΅f T mZU(Ջ#! }Ipr'Jp`Ѿ NsZKq}48Bk!i@/Dsi8ɊfNpfKF1J SFP 6c\$s/ݍ3n hBNNSҸZ6!}L "@r:s#v%cgkiiUK B`VyG6|nVmym+qLyzvw[RƯv}xwKM 6@'/.c|ˆ/0 AclTYT75$uՃ*1;xx!oA.O0V$Vڱd;Ժsڵ0 &iMCG<6w$ ]9tGif'^n#$wncf@w~[C{Ws,"!x~ibp<^h72b[}N-{dI"ax[^>{NH`WIErG/A54u&i]lG@ѩ/،p0`k&0#LQPCvLX&ȗ@X4[=y2qeW,?qyeu=Py,&K? ze?.8۰.MAU5FmR G^slŐepCnЙژ5pdiS`3کDNm@lм6-u+}j*LRsS Nx55. fh; X{a[Qo sH5{[.bY R,QR g4'ua$9R3b{U-g1uM% }t_@ T"7\!zOܪwqGmH9FqB&֍(w>[-6=YP).ɀmI2 d:`rPyb2JejGe\?@JCG]t5:q=)/@0^(]V7=+x&1"kY.lTeL㲊 \Oa]YVt6U;L(B$sHiYЬ?Z)MpwkYjT%5O\d+Cqu w]ʄP#P4y~D!pYr ~,u%PdT9^ G)Ex-tkޝd̓Ϙ;M:$Ւl?G(\zFkS)|T;OdnS0,܅QH=)$t3"$rT/)3mݽ=#|ـ{ʛA^(⌴qrf;%+CHOқ'~jbG rǿ\pRZКވ ʌDAm^BG Mǿ_:p endstream endobj 314 0 obj << /Type /ObjStm /N 100 /First 906 /Length 2512 /Filter /FlateDecode >> stream x[ms9_PWhԭVjluvo&`gOgě‘fGz$un \8Å I@s;gGL(Iِ#Q Qr 6Dθ6 -pъ$ ٜQ!_<^<p'fGŰaqQ9e =Qe}ETŸlhQ ƐF^hx}=q:pFHW=H  0H<3y/&8Bh+PThN#΄Pś0^VKuP&@d# /El@%$T$&c3͐E5x'@* H1Դ,du- }D%TL^)dq'(c*hAvQe*<&cFRN,&GIJnU.caLQ"b*A T#):sDsひ} MզT} Px.tM X" FV=4U}Uc"ѧYk@*g#4iE4RHI`Yx!`Tr^t:[˷Qd6?8{S\=fTIb̶`#ng=6:2O3SǓEmglrߔ0i͏??,&gYefm+R1E:Ldth)=d3 LyX5p|ֻ=l kQ~oq-~\W(P ,Wx\sZ`VX@5퐚UNjlZUz\/?TEljY'.OwcH^=יW1ٛkŰtD6`D$ NbHpCfE`ϲ[ dfYW:>X uP0e'Pw֭.D7Bw]u|~E _1|v|TCSL^ן֣ͦ)F_O` UhysE}2?}6R", Nn/s4~/KF/йY.S!"-%JJ08#8ʸg.QdBTM}47Yu# ,ieIz57Lt@k}2Z-KbW,sڒxUƒ׮--,,쓜$:2T!y^ȉ9!->QsqUqVS MH` &YmiYAlh:;}j"&+:D@R/DXnu5"N66: X#tSԒpSuGuGҷeZ[G[WyeK+/[4 jvF`kJr 6H.6Cɘ&h@.ÕyI*fѶ+Klc}ɵ5><ߴN0т>:#?)V>}d'*CXN/#9[o9rnj,}d[HBINF.F|X?E8D=5V?G'I{}>%mWy_Km qobNlIM]]~ĥ\^Y~ل{^kזԖܖ-DA&4-9ꮃON8s:9 endstream endobj 448 0 obj << /Length 3860 /Filter /FlateDecode >> stream xr۸=_KKq.f7hIIԒR+ʔd8r>{y7&0(ŒnnGeIQ2Y~xϛweVA53^_j;߂'?/Vy/&8o+[|2h4ڷ>_I=awMz42_$ ܴjyϑ0P̌x@B!)FAjyX&R֞#=LaK~QyCLn-ju @u-=,2$h,NMDѷs {`ldxs =@Sh½,`SV0SBtRk6pv|O:<p%nI0p wJs_E"1c"a|7m6Aa +4D:UoֻQ9%~Yut3\kk^gODn~Gq# qĂ9q;` yf6;&E#7=!ðLT&$ĎDvLfշBMڍc'Ěo1dig[Z@s eV6pGrf?ÁX֝)I(9= Q=7> nc#B,Gy+xSpǓV}?'BFݕ mESmF=h ' i\|B/Elz,0khFDY*5=n+X e#(ns;\xm%m&n.nC "+(!]$:$ 2HU=*ñX1,93;VC>va yLl:xHڙASv |_Lh#m#JxGk9PQwj#):RJ1-Pa'u(ca[^Ԝ,*'VXޥYR|fl;q2Py5 Dx%<>1Б/!ҢyTcHL9lnZi|HJVCx’)m5+2L4ܴ[RLA/]jҜ2Apg' sJG5Nv>ڿv"`rqai/o(Z"0m衜1gU_޻P9Ö-q¾Gm6iȔvnKr1x]vPhCsR/`}߿Gu@T%vwY~4ij5>Kdn*%g˒dw_G6RJ,&>x`b Эwz*O4kJfZ}J%f]As^1t#;:JݹW8OS#OA /ai3U{`^FsRޢ:!`#||K,6>GΝqH+]'A9P[-b#₈X Y؋Ib$a$OCz*3'wU(}×:Ab0;L쉈y7Bn*.3$!`x zǣ$J'l@L>}< &s=Y|) x7C>}d0m%^5r|e$s!e6)-╼EJr} y=v.YH lsRGAG ʝDC>= x&BO\|C_ԗW9+#UYϜy?'xNTaxy@IʼSu(1|-uǦ<9sXDVs@"_8 ha?;HrrUY%&Ǭ -LG@\y=uyr{c(> stream xZ[o~ϯPЀ̕}P^'wEƒe%Ѡl=!)Rlh`qH g;9c՛TջWo>dU\o{F8m/i[߻vh h`F1_?ObG,=*V;vuWwS.q}YJvZ镒^{to`}% x*6(&&yTfw).w5#Ew'$ ~}ί(QZASӮyn$ZvV೨5bd=Xaۣ& `Ni j@+މS6ODf.$a-4k8*{mcr:N>5ObR6I 2fl=ؠA_Fpm&^"):q_X|4YGor o;|{Xq-Lld5*B KaSʘ7}sIݶI5_!UkNd1mwd̠m.Oƀ#%qXDF"otk|wV.N) ;# Eg`﹇[Njnm>EUbxaT#@ tQETWt'`ȭ ^p*Z}ax5F7>:/CSIs+P6𹋾h2'Kx Χ`p,yX5(1gS݄ЭodQq=>Izdߏ mW4)tQ ]o9.ּՎ,قXHbDVv6"zo:m)Mb-[L3Lٚ ) ,Ț&!RಋE675V0z3 i;CsSeN]2̺fvL芆јZ$rLE|!^Dh,ߒ=~bOUMƛ5!^RdEC7c[n8H<:+$XN—"+M"D*\l!xX0lEGg,4]j`4N'bu K+mB/%˟(qUN~:]3"`ǐSr̯Q?><̷\I1@֦7vm } D qb(v#,nN:x̘yjqIVLdl(!ejIT:)Ct/#g*{7'If/]9)ӆ64GьS-SJRS~yB"! I-^XJm5DwKk(݋dߝݧ4h϶ӠZ7ޛ!X=ߚ>T hz}Z>tSa/n⋷s([3IgR0[v>@7Kd]aT&i)$ f]}Fjʆ2`UnB]M?sVtL=3-n2E6 y[ I*JϦ B>BBQo @XRu +|hl]| R'bs|u*ź; @+I4g!{( AٝM>o9t 7Rf_A׈k!`RA.QRSx㒔JjG턫 @JJY2A&S2 )/Y6+Qόdvܧ2F %7OLy~x,.u&+6ΚpL9>nb怂RbåAXn) _?y4V.04*&"$f}5 Պ0TUɓ@jAGvPzn7Oa2qzxa bʘ 'nb2iCAYkC2Ju@TT^bKn,* Bǡ0󻳢B ",vYUER/T|6%wxq[$HRpW LCe"R綠R 47& [x) æ̟6` 0: U9:,Dg7WZ{o&#4P[<pT@:k}>'@4qwk ZG֦5`.*OXb/w;2:,io_a'>" ϮH{*'f-m|+q/B d6w.e'wXg==g|&K:Pt@nqXGeY2oX'Y?#qhe~`4U,W){\: endstream endobj 480 0 obj << /Length 3265 /Filter /FlateDecode >> stream xZ[SF~_A퓨+ݭJU LB*1 d2Uܺ}Ֆ~swNKwѫ7V;Z͎;e^U\\=1?.A-mjKs[A'Ti1\ ~Vp]sCgv֦$X%G5T;F,˒PϦ;\Cz̰I_̀Da7/K6 )O +Radw&3XH]QpF };rS2JUC(k(~zY<66-O;Җ67\uS]d,b,AZ9lOn9pG].݌立C)&i~,\,6ud*\*/]\G2@I{)_ ۀp,ՙ`LBǗNNk{FD2P;s&&-m /p}%>\gpuBYN[ e'Rc^u~X})\ϲDcfEG4)SUe;Ӣb*a a~ BJ}@C~꼈j< ݁UUSu "!+y{~/QgI=aM%SҶkĄ*qioW*-U]tj\G*beG2dGi"䰎&UeZЅu3 Ėɲ!C4Sف%ʍfYgUm $fv{3K ut,'^ @D6d6])DjV[VgɛK35?lO}`\3{c67cW}KIqɪaiDΓf&.r8;bR"YrPg` fi k;)i&_uL*:5!Qcrث#=c?Tbt\&UAOYoO&MHE((seɁل*eBC)*,_u R,"Ha)c1.8`),'X\PXZݐr!"LaF@a@!4 M Dk3~ ^66(F*ɪl*S&t2-+BeWf0д|'\ch&_~X cl_mG! lWѰҟx"Q_YvPX|^7%b+ϹҔrM%0X{O(Ӄ]BM}pŁ'k> %s<:D]nG#yfYl ,b Ds=iS5C}D_1BuF)ƅ/7kffڋt3? t1VoE2)="{r`+W?= ak"|\\jZF"'h) <\ 6]aj^m 3rxcokaBq@͊L(TYrnFSR<:팦f -m9wPFR'̾fFse̕ 投 :Ac.X0( .}s.F~epf1.]`E(cŠ$4u&9\xNv1[P˃ ilwq'W? GA \ 2wz݌Fi1Y?seT2Ci%1 ۛǔsd_Dٹ tbҔTձs2T&嫭ԖO:5iE,y7S,3ӸI*0 |T9S/: utf sn4SۡwM~5lZpNU ihm F";әdNQL[q8md>~NĠx2EIA(Aֳ>99__vi2)>4k" ˊڜkp>UjOq<CЁ'W:a-m[W$3GQ|ۍkxD?] |6VEp4𯮟;i|,}%ϔxDxhrk| D6}UU봀Gt\_J$MPcmpy:ފb.J3LgYhp06s-.M9kwЧg_b=r8e4[фQZrr.d+=e>%W ;m8X Ej}P hFcR֢3,O4_k^r/C6<[ԯP{sv5ÜKHlʁ#_eى_оD϶FʴN@_e1VձAlVqRa7ϙy QȽ[kHB|#π\BePk<> stream xZs6~_@X`_gzi=vW;~eV-J>~Rl'vH)Zv߂$(2IYJlP.EsY(bkkUSִ7 erSŬ0K΢#; IdSNlSRθڄ;(G*G.tHlD8(oH흤ЊLV>(2'#|~@"g2N(#"C`g(+V8῀[YRb([XY@ @8:,A 3Un4á`ah8F#"ahT lvtN:6fÒ < ,,vP/{ ),=,A89kE:yBnAq"ybf<V@!dpEѨZfѨJ!aUp'I8ATV&ŌNorVŏ8Ch{bS祗rC֥k}^/$-$!#܋X2` ۛJI i^}4ӳjf5'w%.,.Q5l@uڽ:Xqp/H=UmpT|<M3lB}dۋ%&YY7ym$P򣨾;u y}kbN$Q5U5Zh{`5V`&wI+4a{y&? `:]\&[!teC1(ZBNnn#V U5,NK^BIdL$4k0`yl^`T\g4vN€Gފ\f cS<}UOvq$~ @#"-q`$>D]_J\@~1 $x^q8ÃWx[ڨ6<,/AI3Cvhf|:f-ojoF7-F hSB.R l[ovZߵԵkcrvn>nn^Z{%/&GQxp::xl}Orh<~3<'xA,H.q8+  o_A'jR 6-"xF=p%ȞhY(jC&P+H ƒP[Pħ%(JP[|#%*:"U"B%Ny-TTnVnA?VւEr6vr8MpO:^7WEɭ`6]-JA9?|UuuYOTBM7pZ#sY;h?T"Lݞ-!l S C"[rA eSvQ^b،Iq\}u47._fMFӋ\e4BVb.4{(M#B ,|4KB[~ Ȧڬ pRzX_Y9jA%tB~$gH!k!3RTHE9~PHQWŮ 0@9^\wcW(uɺ[@1h5wіQğWnh6z6ټ8/qs[Nu]մQ\\=i /es=~i,#_pm8YGæIp%"rϷˣџn/ [7 .IsCru~Iޭ ܮ^?F;{igNˉ> `4~iFkGDc߾3@E+QS ڪj_폎6֪V{B5-RVٴ/o2m ~yo|( D4( heNڹ;yO݉;wmN޹kSw]:6nDP:CGPY~m~>j֏K1fVHcC&ѻѻ(f#wG,.6^8&Q}qv|s6|qpQi먥nBwz4bhvm*m[hbR#A]+! m8Y5.GgTrv[uU]=>5E5 nʩis #G6+`%P]g&j~:x=y-j,_1(ElE"EMg"]Rmt-xt%Uf^.#]w<{PʹWq_Z1Y97mz'K^ %kv;p~K 4$f~+#is' fzÿ^H^~uИ1Ziw endstream endobj 495 0 obj << /Length 2311 /Filter /FlateDecode >> stream xYYoH~ϯv_(bdc{f'dg0Ze-۷ne;Y`(6j|$Fǯ/^>JH8]\Pq鑳.δ]FG&o2ZSUt˼ġ+xbxKSW^8XsDC7S]H.sZfx'I{41F&i ~aJSb뜛𥄔Жs!u z^/0e讲2: vSZ|OŵmA PLqt5*Ɩ5U:qzΧ4oz0w(x}{ce{$U-I)PDn[8 9K63X9qJ[S1 JviOquq6DDX%&LCNc墛QԁJp -1N7j9ч VV"<;F;Qݍh ks y`_ 8-6ڵ?IQl+%䞱X^;}Fyh]{<ဂgsDlvb(h(h޶"2%CCMYb?@N*l? oc8)JfB5SEgb+Dgf[ҪA~„!R&!/yF*noI0E*[]WŽ LZ+8@RGZ̷!4DۯN@`H(|My"8E'ׂs^?pZGr@52:1`-Gx*Ք!5 ľN ҅vqvyƐFQy*Qc[*[2z7P8yjOAg99 om5έrnYʿ]T]95jxR<4a^-EaMO{h9ne6C?|]f At}2ԛ`tAuffmeV?:Asv۷~Ckm2JËW m endstream endobj 527 0 obj << /Length1 1831 /Length2 11746 /Length3 0 /Length 12880 /Filter /FlateDecode >> stream xڍP\۶5 N@wݝ@Cpc={UUW>c5TdjLbfv );[g&6fV~8+Jl [@ rt@d&4q~SȹX8ll<vVV1sH9;[#-<ht6>>?b6 G0hl y4 g A+hllblh!Lp;[TAN GWMl@uƌ@P;%W3wv3q` xKPU(كl2Vˀؘo?mt6lMl=s5$05lmbfg&)1[t;;1;h0oLdG}`G=XY+[;7[ϿlkfGf.,`&o"d g+++7-YaSoO{;{[ o9 pvty{[߄0 -? =ַcϓxZ{c)ik3tvO&nv;+-=ۃQ6]ƿ|em|UvLS@r;Ghr}V.VQo]j? ouq~[E5ߦZVdM@?v̔@˿f/;f )9xXYmVo/SzۛNhgǂsqLM<ޮlohrs,̶vo.v'7!,/E? `8,'Ez)X!>-?`Q2ޢCoCo1?N_`o9Ҿe5b|kśoX J߶_o{b/|___v5·p&y5,@GǷ6IA wae(!}ՁVc# l2]mVXHU/*O^F38SEb߈ቘE{8xi[AAtQ9(`޻ H7~XY%.1 QgYIԖROxj@‚&>2cP9PB7&eO0Z8@MCLU&mXC1RfM}x VKІ0c%99f`A}VFjFKU,^1 x}YqTdL:]^͘Ͻdf90K+$ кLr',BoGpi6að\,[.YwFc8hW+^ /TUV&#'2ҳZɌOi7pyq~FLpWe5ad&JrmAo~rw?s&͖{mV:`̂y瞻x "),5FC .F>2j+.6&pˠ绲+]QiJNm -]lׂl?[⦫~%|v䥝DFw3js= (kAr:a}U`w{6!` X:Q$Y=΄Muւ>|MG^ë;3&d/97s=;@Ô$I?U澛Bۊ}-C"gG=7U[T5igI50?ed}.+3B-Sz8r3-fÉ5~\.WR90FHB"<]w܇_,ET.ӋVsOer 09QF=2xs%% qa)WՒ0M/&'3loD# {TܤS f7jsKBw] m/KLl4CiCx-tMUDU6Q3$K4nIRxUॹBZ L& Ho^&3$Ÿf/yҠ=L҄./m{i}}>ΥK<w":_iLzXBdSCzR3{ܼ $ػYm*_&ٚ:ʹRdsB[ݍo=K1\A#cZَ_"ԴYzFV|;߭}xLO65J@N,GKJ_Z4@Avqдf޽ [3,XQݖhfBr>LF4K)o+2#y8y.Wwv_4}!iqdň'Q߇M-"MjgbZV 1D4eV&E\6ձOn#~Cw .*$ؙ~qboo+cݯuk9:-qM%DqkKa#E98 @'D\A;V} Eq *5)rei$&o_Q+\P|ۜmkw.PHC2ߢ{ 7[x? '74quMM `kdrB|aVAOL 3Cͩq_o`=Hkq>{^}?FPuEPz'!>`%7G×Ic/I"u/7w)/`ImE4* .4Kd>ؼRU(*aCD-[v[%S\:<&c9{z"w`4j\<%$*r AiC2{p&WxyoyA;ӆ{ļdHr#l2dxzn{jfM B_5r9؉p25SjppQZ}PQ{=q#>}_wU"{꜀^yQr2Ʉ-A%%X[ ߙZ1 {v]Zv 804{ YvoϨa{d:{lCå?(V_LRIB$%K]|x*j8CԺR[{!I(\7Ì#{'ʃ/SP3M!_(2?:}haJ!͕9(h8 S_h3~.l$hT/ͺUkOFfYB I'g0aEIH>n}JD݀TIiAbYD~{Iq"[ PNt/?dCN$gȴ۽B@sd]|[Yؑi@Y,gg Ϭ˻[1Q5vhN'ЖCn>3 zr4k4dA)W־>5 l7  {/Nw90ꜵ:&v 1"ܔ{].OzQ&X}J ;~ E{l}* |ԝb[VGg}H[—)Tꆐ,42;3z6^Ahb!y=GR۷O^b vV"0mHKdegg6v* _]Ԁ9K" Mt%?}]iKj.\\= 'nY\ >j%hPKY2cM:;ڝ""nB,s4c2N3 bVG^κ+cۏ 5mŶ],|+Q8XarZa @P32[E rۯ0:a#vpmϚQFso"^tjHTpyc?㛉(GvW':iJ+ϙprY9B]6x.d:{~ -M nGDd'/;[;=}+DDˉҌv k|W#)X$#*3nV-^8n!ՍH H >j<󳰙Q%+C_*8VZQPrO-N"<1\1Ә8^S7z,u6޼ơT4g45f))=ӳ,U45Kګ^>EޛJ\,;".vDHDM\x~gjE% pNKt']wDuB x;{j-G5_9o H&^vB^sy5Xb3mc&5EgS-T\E}o󌏔zc 4{\$1%-Cd~En?LhйhMVӪϢ9)UB_W2׋?ܞ)nr0,lW;Gn#p)LQ3ӇzjI6z>#mo!7)IstKԢ '"N '*]=ŪIS7V`U-/(2'?^n5AQo>+;n:݌>_ĝ#ٝaTPIj@f,u 0"dqk~zЊULP/x-/1bYaݪ+C"Ri9?p %I`54ߋu"#XP?ŵoՐq;]J ا!1NM?Kl^v&m|zaqT6Zw'QiK%- 5?ߩ:dۡB|9Ja0Bi(.J @ے棦p)gɟd ђ(`,=5}> 载k>tSL.y5%92kDڂ VzGkEɀ }Φ8#ZKcSJ $?8h@KDIia|}`=`>`XIV =@{*G W`R+=~Sɍ<6>=6|L}PO,bVͼ^ (upmdͰ[(SX@?.l`M&]lp$TY}ȦiaI<|ط;Ț֘ϽM=VWgeu?n`>a7g0yCʣF[Jz~_A;XO"|r kYʟTm  /6Jʭ#@^s-#GLѝ>V=sH1e˙{ѴŃI)iMh. ' av͠9躱"hBuC"]VGko&mNR+pr bc P`M&6ϻ3S ϯ]sF)D=~J |34>Tp Cheq>ך~lR JƩzyx-oNBK24ٍp=ii ׸ה6+]i+Afiݪ /4s'{ȘTX ECP[odD -@BWb9t?b&rR+5&HYswXḃ("޽fD e}=ћ"6#sЮרQ-y._U/ ~&N;wB}/}OCȨ%8lfӖ;ikWT552_ M -@ !fp0ϓOk#G߱H4ދY 1iVOU,>p0:Osr<T W+K8 xMD->ǜlDd{ R40ꐍR(*t]drW30}!+ZNgsiexŘ'f% k2͘["QQjo Srp@1r$ 4FBޙ-Lpxw*#7xu"g77VmtUxD7]k%ؐf(X駣}n ̒f4CQ'Ӏ^#W;=j$[}-a8YֆV3-GBeW% KG1Q@-_EAvVcУT|WWcyNUPctΜDW~%aUwM?uke$vno$qB{%>hKP)aOl`U;阉ھZIn]϶ٻ,uU-s1 xp4\K"\Z@-ط;cͣ0bH$IShpdCq"n,U*__XL~(i9F;Ĉ|D/KLIAܴ}X"as+=!Jdm*N/=-疵rYeC7q/S (#<ńz6KIh:i@e Yv9 g"H{t@z9;e|ǧ c?vS/ Pnd?!qq\qqZtdvR{D!t5y`Q299.?%o.}@Ld^Jfo}ZY(b|hz~WMQhLL* [ QkϠ 2Mx :3o @ff{EgK&$5Ae%/]K{n $W{DH!(TY&wt@ AX$ nM=h\ző~SYY/oH8r6!r/;}&+#6rM͛]IZ%Y @Vʊ"Xlqvy27a%Ew'Es1SJ${!x^bdĒ﹘{kS\i~m}Vv-EЮ2%0^HhMnܳ @bSUd?)i,E؜@`cAl$s5KsCE11L@^\ BȱC*{. eo,SXh%UޖMks~<')W~ c0˸%QK0#MK}ᢛ:芡Kz_4dYM5Jk]esˍn] k2Tb=BT9<ė/ +~FGIHYɺNIV#,56&"OQ$KS+")g]ذ<=U'J|hSM0?@7љT$I7\|{QeK{'q.w&'G}U~Obhk/5 W5>`*96\.5rl{HÁ>v/S72[`(א7^,\c'EH<%_1Kxi@x|̳Ӛj1Z޿nDCf ڏh&-s2Aq =؜qqْ*A)p\&C{f>Бw1QƑEUijfA47x)Q ʕh Yybǰ߰s2i \U)ȅar8`5Eb@帇zK?Q34Q?@`HKV>rUY>t|Miw?@W"a_ L@d/+r< h@iDs}}JdI['P|㇪/H1yJtfqoϊU%yLj3^xÓIFv#@"ѮiTJM [r;ODa0t֫%0)RêÛA|Lnbę9t3GhOZ[4%sB~~5!JC%EJWȡ}tԏs[j*I-_!B0~ \†Zgxg^ o0̼Fg+[Ce4'ҵ43g2N!1HʋB$K]7rj(z!hSH*FT Stk 7gJ&4i{z*vw|i7Q^; a2k]WadXTbO.] Z)m,f281d!Üu "q3-gj0!nףdnf5Hژfpr,Rc~j|hzY1E$h`;/ NrXZ#[3=R%k }eQەIذe<,٘Vv άO ,>n*>.r+'aYŠ#`Ir:|4ՄQ计A,*IamujӹU_ ꛫ$S3$Z%!K.+zjEc_5i28-^FEy7'UA@$V[PPJ:LҌMa}u NU/v!'ߺxo`fJ".nb#x|1. 0|i_u.ˏS2 $k|^ :/&~o@}vNMHq!T!]@$XPY z`$3.rGpݡ4i[G`4ܚuƼJ|aX.[C8 ymBB\2M~$WG͢׊v"G|gğ\{eGZ$.z=/c+9FT0|FǜgOٱP4+^R&YDhq% Y\/,t9;OF-w\oYl_1b܌$ Ph4/(~T8Jxe!?&يBV/?mt\WvH$g&JE#>L&RLG.OĜG7 {la4%gS6,!H!|.ZQ.4HUq";C }%,=<:Vt->f(Kc?EkQ/CCu3< vn:& ?_z 1ˣ6E'ߦ=iI!]4m6bۦW A3-,r`nKGuV0 5wX)#@QpȺ٩s@ZE0%x 'aln0*Es%m쪺v?Kb1t9RJ$koaCz:(0=>o_k#&w4GmYan,hK< alwd0p̽؛!o⫒|D$J]; ? ;b~ړz1ko 7$EJ#r>dQN?bV[J!zE[c勐$e\kc[”!8&#oi4~]bN*w.sslRډw>I9Ջ N $3UO*A ܫ.jz?\C uC֯4]ExuX0I0}51 ; ЉyJaB 3!ey:#ĒlDҰϰ+`jFAԟ'g6 odM(S`{>SBj)E%ʤO`;Ay{.uKDC+J+GKH)T d[ :LuYk2bGۤg k~rhjQB?]Ъ5N.k[ Vnk zW׈f4 hu1Am`DtBZ8F~__t@'|;DV+ ~/T%@0\`F$  ,3}lAjW>+c6ɰszp$ϝ, HnED'XU5Ww S|c9"}QJb^F'1>?P=x޶[Ogߚr|B?.K ΍ n;􂫓Ίf?/;[0>6ʵ#`z&RETGb0_|)]*x]+h̀^/cL°cLW"p+ьt 8x!E}WkP*&)uXH1cuDk`,Ouek"}PCQwk PCP$|Vi<0'xq3O6Oܨ|;Y['a뼉AB+@ya>["w%ɳ1RIK5AV~ǟ7 z9*I˺t.,"yzG)?K_$?C2ZLsZ n~`pV~Qцc^,ذ=T+.u3~옇qt9`Dve4?60b8j[9;"L;Lj\)b5ƲKhv[~7 v} c˪(R//%l>y0n5U] xqtIc2eA,ll+GaiGn'G󘗪bi=]} 6o\'r! HY$3ٰI%AHs-cUuIm¨T~$&dy=ЯRP֍Q|x;gD\ ܕŻ{#z/뻽Sݺ4<`|/iWzۊJ&^:7 BV8gԎq!"z?"m>u[Fpv[bUhF o]& ɏvZ`v >17ǤPpBoˎoW,+:ĪKz$b M)kGE;ǓMl%MٚGoG Embxo{*IVL>}2AmƟUrt=cD$ֿMM%-)H[8*34 7wȖ9<5mzmBtS>z2v,2_Yt( oy#_m@}/P endstream endobj 529 0 obj << /Length1 1685 /Length2 11369 /Length3 0 /Length 12456 /Filter /FlateDecode >> stream xڍP-s@pwww~ݒ@p%[pw;3{E[Wݽ)T5LALl̬ %q]6V++3++;5&ZvBt}$B%{- `ge t $j G/g9Кxpفf@{ dz`zWZA+WWG~f 0#jPA%vJcFhZ]4h8XzAWlwyuq79^Oh)TA03l3hXmAiEfWOWFhtm?R ]#0,eo.`gwuA$dz^,5?lon s7G-{HN/+g rpp@N4A~ӯ58:8,^-@|\ ߆FHlls+d G'+  g}?6￿ _'-fӑd俍&.n;+qTt_?)5-c);N.@Ϡr?.S;u7#i7[? ?v/亹n.T;ؚM b_#E 2WY9.ZlRup~ZLlc{.3u&0^翏7s0e:;^>lhc,.H;`Mxx,#W7A6o˟7`.+ אll]q@?,+r+ o_Y2A_WKܜ_?_ ' inL Ⱥ*B؃ikThzK'gι ><ÊX@'=/Yy7L!yvȞ5'GObk+pp?cn?s1ʱ㋣'NعhA錫ݛRLM=,cr#d ™GHDRo;"r˕ӷK6bN-np&"^rMm* Ӑ| .PYb"t8Y~kv/ >1ttR|/ zH{SP=uNϮz&@:P=Uᄠ(`<`=U]a.dx-''6Ll7^~K/-OJMk=wq^68E ]EEaPVluFD8=' 뀇V-r4=[sT.;}!1H^~ݘZDArٗ"PDf4z;&(. ķx.ۻ5~Ws#0>Gc|bkz@7MgC9"a~{TķƤXfojr^{2u%pܧX7垳Y&dsW]|rԦ]"rI@U-%a1i%g+LD dlF M4&UjAw֗:m YM>61|7xHὖT8Uo}R!-Xbz7<SE6jXڄo6&U+,UP 6Xqџm0\MĻC֧+ d6.yEx6nGšGwuACKs_U62xKamMxMO fWWg_z.m ёՌM _b[[چ 2(=Y;oWEv(g>" J#2۶ {ܙ;\=p Ol:f03w$b 6j%Q(ptCQ%|oiBlwi͝s8؞ n"y&*' .i [bfM2dS(ٽf'cud?̡+ aҾ@-fZl3|G7FdQjʎ52GҒ׺w^6㚈{uUqPmi1+J2UT^r8dz^0e9"5|>N(聯0{^:RɴSþt-Z˭_w˴&* O ަCWL>刷Ʋ'1F! l[uhGH`f}(^p(#C-~[VBh+y+R(1C0)W"!G!f_03*Ea9Bİ*ذ/ Cմj_,9 -C1wђ:1JPk.kHX+9-Ɗ zJ<;pM6R-ɩ؉ح@{(~tSBr.d;XAq%^n80:TXRY+ A|R鿹v s7xAsr)[i펣e6꼍ӟ49A~H!H$k(i9oo*zK5Q7tvY=J}:3դ;F/GϤT-\뱷Ps?^tEd |:QcڳnŇ&Vܵ'xP4W(ٔ0P@ +ɝW\o͇69-PgA|yKb5IA@2U\X4}J2܁[拐AskO1F=CSX2ewNJȢxQ5<}?D&:4ƲȽ_1sPAC|0K:KP3/Ӻ71[4T_\kF(Hz ȗc\=^.nKuf?a"U P{Ҽ'G,8ZZ^d7h0d uJye\!B]sG3#QKw%0Q7Qι1nbz,OW~oəű$C=tN5~22qweC.& Vf k hQm^3?^( W Ycۗ&s!̠6vW 1+oN3:O{>bo({ j J-?;Kdٽ#m0Sߣl `}(T0TfR/2!t7X2@iьj'G'iXlw>',M0X2P ׈ľp2 \f%K d \tVQdVLbѡ?<*};'S1uɢ\ g4AϪp~it%{3Vb vZF tѦ1Pe{E6*N ?quTo~`!?l}|&BgM7tQ2'iWîv= lDB/<[\pH?~r}g|ah+.ӑQcݰŞ:GyQgG8bߍWAuCpn\NYddb9܂S$zBa XݛAo؍imp}vaq)9 GNj0u؍O=عf(ӡ{b<"E)|wq$B봂$Y>`.A_ s.^*,^hDpNhU۸! fZkŤktuR F 5 =E42fٶ[hAokbUЀ0pF7T;akMy90q4Pٖvj.OtCțM cR|mvBcМ(@#5F?& 'ZSTOMkז Xoo nUp_cYB`FA)0?cыtcY!7KCJ!_e`Ҭ%\@0żjeWl Ɓ ɗ1]t90ET[xyD3DȅmDŽas.y]փ[d&+%(z\@"Zz5Sg~9O*زw˖|7#E 9h =Q{o"ѝ0ʱNa8!x1?k~A1hZ*HRhS?̹Y@7'!uaVp?e5łKT,1{ gҐUg^[3R Ʃ1am&kpx>̠w.oBqL i!52&qڰV>%Br^Ѵ3`/b|dNT`A&ED(ߥeP2I{xoϦYm.92BWk"y0!˾)RǪ/aMϑJXD @}Pz mn-{^pp?NQ9UΜV#o<>:ΝІUWFX5=ʔKʢ~\Q.o Y,w,G 1T dVHd-EBM@yngLS0ֳV ~ .r#BX)Bf$C qh~bsC [m"]ye:WQ_;yjSM&ėHjKN ˛MMcMZ8*4-%ggӆd-+| =KQhMMMǒ|}8;$U4ꞕ2o̍lj$Puw=lb>̮aJp~Uvlܻ6_`ˉꚸ:[7qf⿀x= anUgWۇx/>zM6{wL7ܐ<3`E&;v n琳uCkԩҪ$`t[JF bǮ6v>dᙹ8 R1i|^xn%LqZEj[Z :ƎbAIq1RNS檌(Mq_PVzZ!#n"(`F }\i.fc5+ISYݨ4r N΂o2Bt+n_`0[wzi0(5a?jCU?>38V18qD9t/_7PDlv~$>~Zܻߌ4WL '2*;h5$¶P߾\)n8[Z g<rvJcMMc; (|aP/'Ut/G' 9L6Y'Gaa/ H~tQy[jRcYD C7-W!PtjLƩlUynđ=ƻ~vSSbNihX8~Va֩ [x6M)eDwj] k};,}\<.R +Y0SLy?Dڕ/7n?ѦKC02ߧ wfO0n0)%Ě3|؉QwO"LӤk3ٯr%frFuBlj{aܼr6gXaszg88M.c jnS'`T-ksn"{fIn^g {ğ)B~[~I{z\Vƹ3 ǍvfE##y-GJoH@GS(xm_<߄ن}&^}k JKLĤPop [ps!έl+.q:];7LL'l9X.TH0Sv8U; \wlnOvn~+IU oY5ʲq~쏿gq=F B˰DH؎w 4sQd,/ _NFn}Mq󽎳c.+]@ummE@&_6t& c<46A~bNލ@!o$aO[߈ByiNP^,Yc`]FJhcYt\xy\K=*V;nS'^M7 m낶]BRب>mLIq4êMgW` I:L?巢K5YZbUtJ&-觷I!{t_qCd`HjY5s=ӹi9j د~ b!h\"3kdx9~|T[?5tBtT#ڞ)cd,D2ϸ%6XA.sKA/9]ipS QM}6gߏtYA1.c z!i4ϱ#;!/pNS_dgXUQ!bW(sO36ޒnYb_m d:ZJBUjB!)?"ʣ;F-q^J0-RWp9>g8=:rWr4FջKHү'B1s&-'kmǣp[^fWFV_lC@[z^搢(tIaG<-b{J4$B=^ZAD-X"!& nzt'$B~٘wψרٱH'R?R,V D&AKGUvf(.9Fup]yy@h$xˤ ]i" ,." xy:OD9Ꟁ;R%޸MT0>7]c! |U/Wqv-c] DV< 0yyi TW=u?C,Ze#m#H79.z\)GƺV@{`s1& e,7 u'A 4KpOR"{0ڥ:OR?=d ;dYdkY;[!e2\Q`0A[G'&d U{#ą=2xCԦRfک6|~>qR$i4nՂޑGf[Ii7:E\IOζ0h%lW:rz=?B|`z)C䖋\S:Qy%*eGGFDɧ UBK41)ICEM;9|a: =aLMS{ jԠaY&%"FĚoѿf,uQ&Ƽ)$1͢_\>$C%cɜTNkl=d1)WUp=*Cs\6hV`">_P;1`i_ʏ6}VH%#w>oO,.ZB,[DS2_o.AUWWdncW߸?Xȇcⷳ>Ɉ7)l,E˧B6]@n]MQjU E֚/TCcQ mcrL͈~2Bu`Οe⓱@iPۦVǴ^n}dz9\ ħVX91 K@Aުfyp̗<9<?3j*} ڊbhTߐj7hiKih45O_o3@&u|35V@8=yB6▭PzԢBmB1Z7*n3+ǒ F ɬZOb;Y \NMq*o8Mu;[l =V.%H5AZ}u jsfǵ|>Yz^lŸKntٙGZ )~C ދ.uqQH!y0j3Tf0{}нHi%C߬K=MEBn'J// \W(_fQd:ت0ocZd3H,ȦSK?6>-} ;bd"M./j*' `H }PDҪ}2kDC/AM&Lx =c{0C_|qTM\Mt``|xgq8eϙݭ!z59g= BTs2k$wlBTIJ!wY5A8,jLylFY=W|OH/T"zn OcОw 3ܳF:byT eh";uAW0RWw,WؖjLÉ%i/B-Y7BA;q?lΎ h ^:dVj"P:jUixAΧ# ߫" ɕ3/^}?!^LAR,KY ~5@pRTSWE7}ύŲàcj3RϵC4",Lcy!KYBȧȘ.Yg3K CB]â뜲5$S3RzZ}7rd Ve_ 6H_h' G '5Sf4o"$Ħ@9%u endstream endobj 531 0 obj << /Length1 2146 /Length2 15410 /Length3 0 /Length 16686 /Filter /FlateDecode >> stream xڍP[ӆ <3;Bp !hp vsjVw{)ȈULLtL9aM&f## =##3,aM,q45tX5tp]lL,&vn&nFF3##&9z L#~(L\\lM- 9Cg SۏƆ6;cKSgق͍ٞ։ќflP6u2ut55% ohkoidU KT̜ M 6Ʀ@##;@EJ`o h>=w_Y6467zXf6qYzgwgZ!/GC'xCWCKCK7 ) ?[_ŀ&"v@g'ؿt458w_5 2%ŞA hb*%o%?k6FFFv.؂Zeog0acifdj pvt1 `bi 025c_qmƏc0/ݏ3xqd555h-Faa;w `c>Or??%(= TKsM]v;_kߊ]llSnhkiouq9Y_W I9~̂h$nnjhllv׺_fc 4Uscbd?2x|8}&ӏߔb@c;`hJll/q41u @;8#_7`k_`C? `C\#A1$ AG>?O}dP/q~dPC3A}SCTЇZ?OACa3bk'd0~Tl(~|9۹8#C?#qV16(CQ/? ck1v8CGN??9[8I1 nv2D?~7|8:~e~~ W1ʢ1OՏ!\7I9=t*:'DꯁwB)#k;b? _NZZڞ_g`1 O?ѩ {:xXvI:p"*>K .)WŨE̓e/`C9P\#͡LJ'ưyim1>.xW2;ucbkaߢϐ{ Jc.yIF-6w :uM:)Gڙ 3V&9QBɭ(}e/uRSO\b}9\gG.}\.w5.T|.e â+y=Qz%>XM̈́tj,w;EnA{J` #m&gЍ[1 \q(3Qxx#ٗ3dV3@h<_>Kt1Ru9~H^F1F(R_x\xoREhomiV0(c* H>;f~5rX^HiP>qUٍ L9Js0 Ǭ6ᅡX#-H4}4hIyR4u5e+5h횫.ZǡuSu-^4KZ;cm]'Nk1J]ujOUƼOTj͍y.E 'uL DxYAGk]д|4c,,5cCpgP6mB@M̽;!. ҉iKc Wg9]q6*ٸkݺ᧭ ߭7\%9O[Df\>0ew){0I`j04Xg֟yi%}W~FLȡCJc~hʹfqM);{|C`*vs[Q 0TTf&47!ؕB[_r#>T! ӄm7C (^S$ F@.{gfVk*A}Uˊ u8.:~<feoC"uC6(m&L Os"Z!؎5* &YuI>X6h#ٞzާ(?Ͻkz{*3h<!}j (5ԗoHH*75ho?vj*^atS˿? /[FGLZGQ?RGRe*(C.Q ?B'ݑ<g?YVpewQf#*],~' 8EBEȂ:g.f$44υ4-$!43;h56jm1<<@tGph%d˷Q5"R 3K$vj&3HsSDPS|,%LAQzX4@`֑Asa)fG+/C*5LjB$߄uO"RlEpN%g>.rd:]톮sz( s] zECXVSdHS ?ehY~dή;ebm)G$"4Bg>M" xՑ%|Ӿhv#QB⊮e CfWHؒQ)LI^a0hB̠1ՏUs]ڬ$E7!nfczS+~%2IP1Q(λK&QPQsl8G+x= SvYLi*`{ @)?__MWo}#ZbL ]2c׳K-l M.kQgSXƃ467d$K~FC:u+BE?$z`qtYknr բNcJO=A^П:T7:nԱ6gc:Ʉ~ZD_-ù;II,=U8 h<)\6A!]Kxކ?5sUi̤(&WijD*TwHULSp-oA5]*G>GO%ߘ݁20OZO.xkэ,UOO~A=vcхs~'n}]{J/3\b{ص)J@{[^ypqo+;Ht:{mpZcX V cҧ.bSi>k|8K Ը1*zxE7\)RVmNr8b /ćDfX4YDjB S`,(;$]Dב|;$èϯp#)#.EQF I]uk$I{2_; w|T 8\Yvj'+Ule;X;R".Cb,u"r|L%')|t-ИuI]qCVWˣFYWwޱPd2M,pLj9]{W̭3kk^!{;9`pT< 8stJΪGHn[<)5hK'VJGR Ź[kuGqz}_=3ZKRF=@(d;k vJAn0Sţmq8Q!N)xΆxu"A,LFۆ.tӲNʘqzm˸Ƚ d_Ӡ~SַAهΥ3o-dW,/E9EQr>˫,91:9.&<-B#ag2oOK T̙)$g3^o0/u]oN5m~ÒCj#Xͣ'&Yۈ8@j]#{#&6j,U`ACA?r8+Ih)@Z#2ET>\~JuCh ̪2k>S9)궝LZm0W۬FUc'8 #*F "ނS.u!x/7[G,śX\#1پ8IA57SlH3ʂ ^f'J">MFa|w뎈Y^sfoۢ h(h3jxY,O0Dd[ԩ̾Iy8F.4FZTQ% L h?Q ˏͿLtfrPx F8w 3n?S:qc4QHf_:?)Oq3r7g_lzV Q/2+&R`hĄ|*}ݚgLPEDėC115Vb^ H֌kfF7p#q;!/ pU]6^w_`Q)hlN k 0"Dj~"cR>KJ3Ño"C 5iqbw $$W+mpGDc$5)Z@cLtmyT+]W>Bj")):Sgjw29tAS2,vc NƗwm=}PRsH_[#grpvԙaV=ƽN2H{(ʓEĞp';,ar+WN@f~+6sh߃A !J4j!^à ;&+D3, t @IT\_aqQg+X:E{pBHbKE5 ȔӶAoH 3 *a_Ąq{a 򁄣LnTquOS-?4#:׭nӕF[v(m|d؆vt_&~3ÓJg;ɡ eݭ.iᷚuC.rqN˝Oz\YIѠn3Ц4yt%6My&_\Qwˠhcb\cYZVI+ 0̞}{"fjZX2* %MRvwVFrd3;K-󻸘K 3df!3!xw AƐ@gLح̍kWK&H/r_|ȵ~yŏ~?H&xy}_F{Hz&9*ÿ0-@Ȥ,€-MN.PƜrF^%X8!0,H+|<֛ 7XX>py# $iqGs#,ei57b-rx?}@ gG 1[nj^AjFިՓȆMfƘ΀>]R Auu0Um}q}TzO,P92>$OgWWc=gGR#䨎T$/O_qa4Yt_;b`IFﴛ?KAb{ u/ck8&[Lopكy 6u Cr0D L?Mar4Wí@M}Am/qA1ZmV2q@f/p5=s ݬkHg@dFqg/EeYA SZ兘=]ۈ;܋[>iɺЭ$v?hM7jBoŰ9 mx]-)? VN&^&u$9~+*g&ˇ:24;farL)sX uWK: 7xV ɸy4`註OGUxKCuuq']C),Fr'$G!%p0# ۿ|84im .JKL֓4 ~)69=a s]nq5|6Ɉ<=H1 6jSvJpu;f%%g/n`7xQT h]{Pm3="Ps(wP2$8? Auk}.-ܙ[Vm̃Drf#H;8$aHp{IJl*oUF6itfuOE\pNtB}żt+nXe刐1q.n _\P0O˄*km8Hx7 f^/O9VzI̱\j$/E31 XM˃=zH..HBGXJ#o"ޮL3,{U_g դhG}z4BƊ*,wxPA4,$sBhehnn&-7T,,F[prW{YN%K, ^dW~ɋ\NZ갏@)F RJH)j  UbH~>?]gCuS~ͪ{ 6.Av9V>P) ⦛a>{\Q%~đq;;!+R(G][!7n9fK-OH>f(% te?_%Nv39!s+j-G3=R>i:}WM%ORqF0,3N>i-5jd'2&2V^9^b_B)s(zJ*roksPAbUrG]S^mRuhw}ȝwYg+^Òʵ,AA+ٝ9uId'@xV44D6^a"so`eL= AHT IX:ڍ8fi.@ ++Pw`hm<"I'b9#/ Ng<տwqԔ%0#v2ɷBqhWNi WybxNjXi=I |U-ᒩ!tOnLvhH[kZPPDZgZ_?L-6%-ƁU)I,2ӽcž`~S!,wF[9GJT| +ĭ4 ldj E 9ޛ{2Rv'+,Jc=#dE-|5=ѧ}Y|ZRpceaM{\QW]HqFЮ{8>_ᒩ{Hha!ݳmiwO湟wQA[zD T/u}?LqSxw%$ɷ7݉l+䊦%Z\GmƽLx\u0qʄ<7BH nj*7/%0;b2sns}8!-pv#Sj~N8N9жq?&yxz^)#`|筂d_=tي4΅hEDE}4ƹr=FR d0djɞCˎ'DP b\)tCO)Mb73lo9!߿r5dyVwse$ǷfA/Խal-mIo}!Ƙ0GR3#f=#txc`UXAtSdyAy2a\1^%.]Km#y$c Qds+tdþ[}'o$/5N@o> [A\8$XW4Aj`;_^^.|,vG[ >?o`_a&Pk)誌F.j¼h YobWj7+gdn%ad:r7kJOTXm2flPF~`S7X7,ުQ>`ͮЀ'k*IU$Et\IwWu"K27af;t xd%jqMWjX68߇(1`w&EwyiNW5SQreDtkdd,гY**TB/NiA&VaZWodUxTEg>`HU{Qs-6.i+B9uWy[V4rJ> * cK.-ģ6XdSËmV\ {v2ܭ_S;Oi+0kR=#܍ XyrKĐ[1,3?uR4~rMYfе7le=ȣɤůwF,gSTY<0Gn'Q `._J5H=t/5 e7B:,} שu pX\¼G:G~ Nu98(Uj]Me*Hbt"pOSFrsn}Y<,LJxjPfZ ?xe6{(M{  d-ņ5yʧF.T=eL z„,nbËkj s2uQ޸&C,q0 (!df*%eE[wq6Dߎ,'kSf|y-bHR'; NΓ>SH,>z.inpMǧyP9zԱčɔ_s*W5Q {U %UÄ4RǞ/] Ȝ8Fo5ǯ+1j7fսi@vZe )'wwq :qMԶY(% OAN$x&7~Y0zьψ >N1$E€nm/U(5uZ[޸WF 9\m ևAtڼ91WIVivLjHFNaCRs\7u&ҏk[SrI-qCX#2.c~.&isĊ5 vĢy* ,/.ɽwN__|ޛw's/]>_.{oyc=6[./*N;u#DRJ5M8ƪ 29Hgwi_ JV9geF'0>1B-l4o}:A9"ViҮ?=%&qCw_P$i4hjM`VoEƮ!,L7A I@GѬn84כvXCׯ:d 2=Imܡ,{q=YӎQ{yUSy 47 HbH· Xf&w#OT\/tmrRɋZХeX,;Bi4:g%P[3:MĔϾ@}^pEKEpvb3M6 0RҐ11OD5 ދugݞU`e ̫-J WI0;,@rڨn($1!!zfͻZF?*mirLmH;*g׀xSh~2ThocJhqeTgדT|ÅCuO֌(qe8Z ƃf&T;v9C neЕ_bnK·;O>j#ڸ5HAXjSD825'k>gs7.OLb=2EڧV4BQ_qOe[or9gu4.+Lޟأ 9ce Bq36Cmj4Hᝀk@#3 K r$nyWa$)mo =Ō?3ԓc1;)Ǘ)E[B,-aSsNn8@mSҨ )Z5¢GԬ1Osr*=Xv[X"^d݄"қ K _&RògᎱnLI,;K}b5DI* _,*n]M\XAېԕ%wXD~)ku \4K:bkzv!1y;5!XZ6uq9sTo=k vsV& 4 Khc(ɊzDcv^9}nRZ8^T*puK[[PlT >ϣ;s{X$ b=ds𶣙;N#QZ22{6 2{1yυ\g@WĮfD#?)$/~ raP~bA͏R"uq֏De`Ebh秙1IʹN(g 5< P/_ 9inHh ͩ0FKXҴ1ׯ}}U4Il 5) 55rYp{Uzw]ܝ3H1h.Y}o8kdLY5Ҙ0l @ W]#Py\K-iαQ /j+}eé:ɳ99qUrMb oFuK27Ac9;Tc:B W&}1)+9>zaLJt ?whwK`XEzp*-^Hz5 `Zl0P>Iu0:9F&IxK4ڦ -̱q.o][WϓުP w.!}pe {Dp8ZhY3|DB]Tj! iCC$ŋB$usCħ endstream endobj 533 0 obj << /Length1 1480 /Length2 7018 /Length3 0 /Length 7999 /Filter /FlateDecode >> stream xڍTuX[DPSzh;A[I!.)[D|'{ P?DR Y4x81 s?K;u"a0v:;_)%ܜxy===yN<fЅBPk`'_\p!lOG W(=6tKGN˶NG/𽽩s0":<]K#nkc7B,yηbb%߫<r_R`/;-fƃ1PD#I6LRv|Y@fh7Vqy}S2q d|zJr,f?RysPԗwQ BySK+j¨u>ѡYz䬳E!فls}Oaɬ“}ZTp݁-6pۢ|Q)ec/wڕܥIπw w؏~%*az3gp0(݇ݼ EqPo?BnDJж~L^|:8ZeuPh`}þCuhf~+mi"(L܌f7Nޮ,-uEZI@^@E2ǡIVENM,,ܘL'Y U.ͤOe*ocm%Ăxjw`U8a?ȷfH,oqji|%{>t[ ;) s_oY3 mBx΂1[ Y Gz,DHsF6~+oH r@) dKB;S3CG*tiD7 $eR3xd.oV 6ѩ|03F"D^~ K*cm;mDԌ&P$$xWٔotwNk}GČ=h?ăucR'tUL-];q ݠE-  0jl;}&ƿJo0ڛk"Kc\5lD'c%;e@4X ]F 1祙*tHNC oĊd(_2;kW Z.R!q- s0rT dq2mE `Ҩۘqy֋޼z0Hb*=-"(6-CRgLل7Ky~^/S }cD&dU V}'/(^I$" zpni,^6`|9W F%Wcɽv.ȁyQOQ(sK|.`>޼{־#dej!;(\DE­l؈ɂBzl.ض 7)jhLuGj;̋Lb.rv5CG:rUaG-HbGֆhءܚmtF%6);\4xqE;?ze@UD2”!{jgGF]Cc3B>~e 0@ghB'gO c: %J{n~_5zGRms"c: GRJ1奞+tedo9(Pةd߭/ NHCtZ ( <7p {qevk|9-bY8t{f#]UOaA_w0!5|OQ18Wf^\eb W 5u9=Ogz-!ouJ6긭еRFo*i{`M{efi˸{溌0_4'G0hhioxXܰ&7}ֲTFXr~Npuϙ*)ܰѺJMprO6џv_+줣گEڑ7r['0ɩQǙ4q],NeZRO9N/AlR//} bҲ$*Qsa]Lj'!ilocS& b8.+sS=bK<ݵnʬC1:g?X׾M,U(?ArR1г>-忙1y: VcL K/%wΉw/pf%M Ӕ,?Km>LZ(g.*N(}'"јGJ82&j+T.p>ꩤ:o_X> AaG܃>Qa8X =V#fe.s+'`]Е ]p =2L]?]!?#[bgq39vB~¥ͮa(G2'!2?fr>{&te 5_Ohmg:Kq[$d+3\[!Y3 ?$~ZUO*z+>X]HMrsN%./}M gNf~.Fe#B3.%!WL BPu6 VQN|j`oEɕILfs HܓϳM"t1F{on/G5&)KU5YA`Us56$}rMD&R~btGsS$VE Cj+qU/c#,>Y' p)̏BKV0S|BU4BYqȃ>s3 . Rq[A"z5!&BdFVfQv km1h_Ï^|,^T~29+T;gގW XNdƤg|_k>M|U9+b a\GقZ=N8R50?%u( O8*5\:;P 5a :wϕlp}69ww<*)bN$G:/\u3mLmV Z5nic YϐC]NozWՔӿ]&Ӭڛυ$˭|@%uî״C/ r=ε2 *F^:m澑ASQ:]S".靋8tIN[% X},uW*^]&!Gvi4hN|/[ȮG6U+}/s4C _54@٣4n\VSHV@ʹ+ޒ8(Yt2ҍL\&|JbYyl9ufn~qu}x:8EoEt6%)[Z)snwV@wd6 d}F_o:oڍll]GY֞-溴i7 O$PE4Ǽg4X 7hq9Ǿ<6=TD1+n x-Py$e,*s1e w-tɑlXKj2#V@Jf8f &2|Ô@q@E Øt`6G%,*/o |I3B=Y"5#4ћ'U/^ԻC2B9O=9K+c>#b\QO]ΞZ5T(59z}Aiе,yo-Œt~%<4lu'ߵ>| un#2jZ]x 2U"1}; 8ft$'?܄)^˴_ И(,F+GK~([b^zdewNDL|f)=+<5#`;6mǦمN!3hՓ:izq{^Mbxܟ18u+d5#ݍe^jb^%̤Xf&MGMO̓+"' 7Ys'{b-69dZEx1a1wq93 A0^2MԶ}6.;JM6T㧢T~ظtxrJЛѰ#'Qɵcoi2a wɪ+^ۙ |.Z5` Umbx ;m3eoTAzh+ۧJLXr &Z(\LHs@qUMVfiApM0󴇤<8 u)O~cTzwNt 7!$KCUÉO3^Ŧ: 1}Z#_6DިqB~-_G sN͂ycpM'fQUS|_v2ow&MEK>^p[5{u%΁~Crc7:,ۚӒp&O:mýuca=ڝ}a:b2m/OzE4:R6$W JK4?㙵֐2U ^{GOݝP4==s;Wr~TWxM_K S/(鶶|wyզ2ҳǁNᗯ yܬ͉Yu1FJSqks|3cȓD4YӄfKv32À0:ծף7ߺh7 qd,+sM',hzڔlouuR׼VŁc# ƕKMNڞ[6KA>2}Z&9 ,N>|䲆`Q9U)~eyP^/y#^[Ɉ ffI{+Eo?5zd2h8j\>Xh/nԋ\+(zk(vU0+&6?6Cɉ>7<> mH`*'dO)zjSԇ/DE͸Z{ZqSo5ddeVaΎ=n>A},b |e%+]w`]˔IƟƸ0Pō?7L`cy'Pk~}Qq× Md5\Hh;5Mי[ǜHgLTaFʹ2[mmG@] ǴJyMqsq?(xMh/H# _?m.1V;5k(R6Q9ϔo,szਾhSR6f%^2MpnA/* ;-=x=Tiv4><N>=Ӣ_){odErҊ6^EsmNU3搉ð޷Vw2ŗK *DzbzTP"lNstbj/4 Ƌ΍$Jz ;;z۩d>vMY$JY8۬9ٟvkBZ{/0=i܊4Y7+͋IarhIwଭwJ9I@Quciqe$W&Օyn JM8. 1l - \J/+.4U9=XC:R|,C#SIeJPf|e|i?4]lKU@m`p7iP' FyBnT&G0'*wL2=\ †|?י5x}U߾n!B%JEgr}א~H?I\I#iڨ]|KxA?dYElȼw?g [^{@9軿6&5X)Jާ+7_Du0ˑ:y5CWv@vBfmaYdV~dUH֠XˏUQgr/<9ʂWͰ endstream endobj 535 0 obj << /Length1 1826 /Length2 12473 /Length3 0 /Length 13606 /Filter /FlateDecode >> stream xڍeTiרq+Npwwww/ECpwR݊KqwBp;YY+ɵ}wV(IUE@&@) #+ @\QLGC†@Iab G@trF h.0vy7U\mV.>Vn> nVfE&@)rtty?_4V^^n?v@'+Sc{%=-@djt4..|LvL ' !Z%@ trhdl9&J_*u.2;;ڛ e_ 0s<V&ֿ@V:=-V@ Cc[gлɻDU=CgS'+g&g+?d#AKڛ.'a4}?yO=6733WfM{+GWE,.NnnV0d#O>|@VVogc7 o++`G'hO@}Y,f>gf {[|̚*7ZL fd0qXٸ9ܜblJ+koUIOn, -c)'g X8YLXO״cwMRZealgevuyEVoSm_k,5:YxlFV&VRV@3+S˿&/{gkeT9[q׼{/ڼ' KWdұqr=ޟ;qY߷ @A..} '?-'Y_`x7 Yb0Cf=? `Vx{L gPxߣCC1M&aAͭ}k/|_^ l/| 'v'r'r˿[{n=_`~?s?e zM@u5lHiI <\D.D>l5`|I^n67eB|XZ',u"dt$,.;"DphVgX\,/D"16Νrpt$>.|OSYʽ>Iܧ8qJ!O_KrҍF.&JNM t)$ܝ5 vGZBƪ\`?=-bW.ͯli\]P'[QKw#/q}^Gw;6E>eAՖ:^;c)hyN!P)S*L{Mmhq P"雎E,gH5Ǘ*NFd݅B`"YCxqrє.#3v]7\'Fw ˇ}1C#Hrs25 m:`"1J#N60)}\yfK[V0E8'Q ~5;61 6%z-<#.tLK|e{ )ᜥ3 %/0\I Y7nTQޱ ~*!Kr=gjƀEna}iuWq0$gk^OE+S@4=fo ,H0n=,ђY^ `0~/iOnjs"f]VD]3~\ T=%n9V1Ph=샻(s\A2\5Bɰ:<}aiJtbU,WSSawW\@ؔFЄs+?stS,\ n 2Np. lKyY"VB so6ɓ("0h[dv_;(69۴SLqi(#7 O Q了4tF˞߶P;uiݵ6zKuؽ%{(;C>F&m$Mx:RTjds4&S ·̴ǐP͝"5/"p21=U:eUZ6hXv>Mnq$ܳq k0GP/|VCGQMy`N]*r9mvlB 12e(J/EU;og4Nؿ$aW(t'r\05\`)=m1FK a~냊b:%EdV k7kTG D܏\,uKm)Q^K-mOs{W"\cn#TvoxD^y:`~T/:f;+sh:"U"+O fgaZy*prư6PRE5qtc2u/u~|66b (Ҭ5CcG;L4S)q& ݕޕkqouK 3VRQiILٓ>T $Ia4vSSv=KKHSZ\C\.T`9$gvwq`:躘LCHQrsPi_hi`5߯18:zU"/lx/LY.T]1 Dep뱲 .:HpKQeLԕq6I xU"2dSDŬJ󾌌WKwPq Y*#:Gtؐɩڤ_!ͦtU^,2:0֢PVn֝^I}y?j-nDԬJ<^P7[}`U^:M%pj 9x+sNVZm&W ߹eEP%ȑrAxI=<5H xHS67a{Z,LoȜ!&TXe G4I6 pκr叔dRRXv 045B 5̹rU U;8\I`%N/h'Q{WڙUG!qmS U37nh@K$7G=p,xb yx2ŷk"erL#Q4`ex MA>Ju+| }J'\IHdd] H}~`=-3pцq^UYltDV s&莊~uT[w4SnAoj+l2?R;9aKyBnT fq/:?Nf nim?'8 Z8Bq$H$)~1rkq2dx+YAUr8nǒKcs%ADž Sʡ0WMOKU'3f9$c@7ZobյM2Uz#C:|&J˧#bڤr Gm;)9M)WWI4 trx3ıq:7|>]1:IR>Ѡ#@b2|%2+JʼtF~Awu6`u ԹOuK!&l)&D>g/3ى>7h$xE~U!&]3՞Fojh5X$DLsA=vbj=-U#ՔRw"!Xj!˭5?t(_:` O?kG_h{QއaX@@&M(yȈv wWԒ&Y}@' 7F&@WUii5vC7%s,YaW/rfȏۛ-uH[omOo֜U" 'Lh-ImF(vm C/ s5JT%2UuNQȟ?Κ m`v-s= 4o1:+=[.rR:RbIEw9vܒȸ%1G]>@rJ|;_a;sPE^HuQ aZsP# u9 G|<'\CkOXzriCfJgR]e[5z‘aG~ ]YtHVZ[oLpZuD߼lE* ڱx-JZ(:?XrG xQu¾>Mcq#akŚAwkC'iywMzG-Y'Jߚzч2 ԓci tw/l~7ֻV ha_%bS;NcSv{{'z8W\"<"!ש?$Ø-~Eh+죍lt:TAN#c4}?#ȹ84mX1^[/awÂ['YU8 .v]ɍ 8ү(zs5CݜC=B۶M`)Nf]$SP|-F;`w:a0x{Ciy YiK~}SaݔHs,>pZ_:7Y'4Eg} mnYi 'H,5G.mkC7K/m84ҶA2-J읫xv9)T@c *&L N#c)R9USobv#vZ A.“x[VKdi[ !e+K)ĮŨp#4]}Rzy{^&fGѺIκ_HQ3t#HEoNFABaLha] Vc(@NRbϝYwDukd/%_%,Zc$i k9#x?- V amSXnL[ M_Pߛr3=2{7C^]#ٴV)`w_i.v•x%*j%O@M(G}FzM-@SQȇv7k=Fw2@.[vxO뫁1 6kgF'/SՀ+?^*oGTR r۝ÄChRF d&吋dzX>0 aN }a6[զd}Hùe#Mu"^=F@vM&8)~rH};b??ek„]Y*s./=p(&/;~Iʞ9r.'h杖E*Tq!f2ӫHGIF7-x8Wҙ&6Pnφp-JlQ)k3NJ+V ~%#6?B=)!5l#cSjհm*yB=p #l;$"bmȨ=w璗 k~4yuLS( Z9N;h\\557F) BglNhRu2` 4ȥ eN3"va⋭oKAIlM; UX^IIw? N ]ˉZUc$<&~2{Uu%yX\knCNp!fɼ; LdS0ԗVQnGVTOV}SIZÔ!gՇh~`xA9̏tTꟵC3̯՟:a4j V'e*@Jnw;Ό\r&G5PJMu?:6rN殫Oxx8"Y(TLE{xX5CtsTQ'Q&JXZpSz?9 "~(6gUuIwBYUpR {so>[b7 -src3Bٟמp\?[fQuШiShMXN팕UKL,F[CpcV7IP ;On2U6 )Ϯ-ÉNKoGZ0[OCrv707,I:ČS\FF\R7NG5BhMKRO~Y1~*fЛ@"soFdu|X'e}ݲUUaED ȤSHxd%#Ws}{dcG*Hb;" X.;S7FGk"ood|'.c(aXcVְFX׵}"cODC=I0j⶟">Ԥ] ڪ*e{`H(Qc6 ѵy}H6G0GF*?ge+($#iA%BhݯVEi">94&p[K $ KKd FV@&D۫كQ ԊW (Ia Y H.QeΘ*!.ƽOqdOgߵ\vքo:wqʊ9G m`Q=p2/Sô@ I!ÀWs+pp ݦ30kuprz/;#$\KjZ<0 ]{_ :g]|w՝ qԎ6`|UYxStQ=_`h:|Rx_>=%}pK+COX*{Mm#_$l۷ W)GlZ ˮrT;;n#s$ RpJ0Nl$ J"]Du\+\MqF̪tˮ|Q<6!~MfL>Yľ5 x|jZamiM J qO}A_ ޒŚA r|6fXҴ+:(6*lz'_sc4z37jC`V "uOSOJ yqNK hUɷxhMp>dstJ 4 i3h-)ȰbJ\ز.:ʖ.8N^i_>b݃݊n L<35^Ҳn~[ #`Deb?F&3jN๝YLwf*NIĶK&_'w$>7 hnhnZ#%Q2S<(vOŏwWZLg'42񅓄r؜ގ,q?jS%rw\H)lqF81<+C\&?i]2O힆@cg:)DN﫮iAv@!Ll `!2Pt&ٺ璶"e*}[nvJiY3Q֘03DV!U%-Иx0/,xZ>O]0:"*kH8l B䀅㽿(%0?'>_z[,-%BWg3;!a T NO_CX]%ˌO!&Jɹ>tyg .oL+6CYHqJB!6E/0q1NZ`CN Ơo,[w)V$ivp(MhK0NKmǷ39]^֚_ ٤P' ] ۫(,'vO?Lţ9Ցk\^&\uZ3M1U'dRO:n˛ٵ6XwJ2H kP2pvS׸ ɧgee5gC ^Tƥ(}L^MA[r'ÖUؼ\#hYrX+% gty༺ujjʍDs ;mpF0ϴwS]-a\8f}Go*k9{okm"?`7clJ=yji {{Cӡs55/ _2>+$u~'W:\XS7s>@.hӲʖ$[8L4#hN ˂Bĕ_6u%QIO ^Grb˹Z~Y͇/Np̐)#{J-[`L=K5|g,Җ,]\L*o#QAgxQ@[vtQ5,8&k3}V}^ =^yjNPVEPo6 -5h1U'vجO]F?Yg_Rxu\@M9#q *J}Pnm9Jo%F[bɲ?;MpCFȳC-ʏO?c\-$xT;|3NMhTXƤc_A?)s0w^W~Z &xT iT(aUmA[,ඵ_&emfp%*@5%|#M0蕦0(<~!s'hgܞeNA_LeS:S) =.oqxdցj;"=fXB|7!2(EސRM!-\FݰE8O9BMk̽Viy+ 5氉"-3S58Vp`aGҟcb"v[h\*E KBCsؓH:Bg/&5~j/۷3KVʅlv pjSBl"D#8yM3fכj?H f92Ɍ[c.F۝GMO:Kc Q 9wgOY vG=ٓmր' tjd|z6{uCm!C i^0V/Zu&=6k %+K.փ Z<HԣV *=(Î2̐'1 `uܭ+Q ,RV_1ZEiy NiAy[~m#p`)=`= !;D'ZlW>ܪ쥤*h_kI3̡"RnB{V=a $ė*(+))\[x } e^j=cP\HzwM8\%u`#A7öuܘL&|Ӵ`k B2`[ fFd!?qtį't {Jc+u[}v䰲0LB7'9x$ifmg&a,R12ڣi8m5Hg g-]i1?.Mod&@2be74 Y zaFI+(ZC0pfcK7(H-EgTY3 3H@tbEQlpX&<̡D>&!fiS18t&' ҁ\2?48HV[UE8M+GW:1L)c\v6*Oi+ybx܏PRVSBFki_%Z{0yO h|a:-VWr~#:O#П&fʙT4M]5|Α6SLmL  4==: 0'FORjNj0[&羈T|8JzoJ~'ryPUt`i=¾e[=QG?a(<uG82W򄘲Dl/Hz0s0 "/~T؀z7թ|A9}Zzy-٣G챮 XDwIaB5@,~Ӹ GC5*JY5,vپL]&)JǑ+,+a@?մڄxw 7yl"fH=L-?Iig=v>gH6jK~Bӓg0~1ɇ|V N C+ r.aMuSL8`&qoװ(o0Aaq/1s8RS;BwEM[S0'&I7;m"T̞E.*$o% WֲƳ}szEw:Ocȧ+,XO8O;f&byp%/ĉ鳔5`xarWVu]ԫt#k;]&BzǷQK]}k|ksfU  y=KQ&JȔA>L9Fߐ endstream endobj 537 0 obj << /Length1 1812 /Length2 8066 /Length3 0 /Length 9169 /Filter /FlateDecode >> stream xڍwT[. -9twt0 0 CwwJJI HH HJ)!-*H{9ZYk>o[D%k (aH. 7@^S cb҇"! !w(&/y)p@Āb>^^ѿ1j aw<&yj# sd] (hی`3@B>`p@"]xxA.p' tB!O-g- wkxL}_B@g(sxl!mv@Y/N EpW A!m% n7t9o Odst@It+ҝGanYf+wqx?S" }}N0fk [Wք= @o>_ ?W+ HrH߿?Wx@  Fl Pߚ!voVap1)?.>/( (H]ȿȪ0;8@zo7=. ozEg"%g_8_\>=n끼M0jBl."A wg#JPo vK1 ~Κ3сC.. /avAoe ϟ)a`A1߮~ۉx2GRg*A[[ x;DP_ п .W?H~)9AN%?!z{;[SD~"x# !@?G ??eO?@V5Z{=b ,qV'{ߋkcT=ӆQDv:[mn'ĩl5Et~mMQ/?jJѝhǛ+ٕm}/oކڥCH̫WٻșGBW' Cʦ m\48GwNNߓSK K/3]K<]sMڔVYҥ)D;f!H'\AJmˈwܠ\7m!HY!}lK$=&XF#Nm e 2=*L!wafS* S6"#AsS'g[ЕR\f3\3I +Äe_݉W,CtRDJX3߆U}DT<,z$hqD?d`E*WfZ\x/]+Ӵj=[-~JAЙ\ü-6+l1M=kmm)Q|W /7K>%0乳;"Xw;A<_Q<۫ieP!(QkPGydtQrsDLG1Wf>194ll(BT/1h??+Ex&\ٵԎ>^3%bT=aA5]ЩAwMzzZ7IkWZ6^c(L:%|G@f{ay>. [e*BٝOvfv.n=]Gt| `UVm\=U{M^bTA_}s#hk1DV[Dli3n9="޷1A+,Zy̸`~?(}:HSKw)id`rYƯ/h~ceW !D3Xdԩ*cv eFVvY^DS)V4N/>*dmPbGxMK mg6:N3j֥.ºqbFիW0fq&vګ0Hʎ M P\i@=HM{;,zұy%_ỦB9 e´<9D\RVϟdvS$iE(P;SW+"9ї¬lBiWnoz]9/ݭ}6h?s-j] Cx|USK}NbH]ktWʾwDN+N~C\_l*$V0^֣#;'ylroEIn /@~|)'~:5x ,gP}F78 Gp1RfY wDZIS!=F|l4t13<\kڞ}$2>Aq?Pg'ޞEC9.0E9'r#m^;zԲ?iJ7ߜ@ήtKCTg5l!!`>N7@EGX.Q>#]⋶oqg`ʎFԘu* Zw[7f.0:C|D:'j y?FW qݘ <1AX DcLv`BrdҖa8ϖ3]cLT(I:^6\"ˣTN:i佖795? u bfuo=pB}y:}3ԋlzUP6Kck*:9̫éPYR~} /ٮ=>ƙ^3BR| t%| JVÜ.HkWOQ[Jhgwi!ݩ~"ia"Lʞ8{t7z>wuVS{=v@ӫh˱6+^zc܁u1"(q"Ϳg|)ĐUfIp q])>)h@q2X^bfs].49 A%56\O(h8A: 2c-_cФ\mGx>EDeu3hw5ivT]ϢaP'Ƒ 0 4oOنUDdDS@w!D\!F`,*^4᠝T2mJIQFb1ǃ &aBwA4mKc6:1T l~m#=:S`Yz2UGiز5~=JJ,D]BSGk1J|]EKˍ4&D~K`2h{!319㯘ߖf>d)ܪyzM͏<:K{]+kڌJHbn7~Qߝ҆")..ݼI̽S`xWkfrH-paBfPؤ;GDӍxpnt.ƒEc [$英raWĩ]ǔD 8i'mgEVQo-6'X`%0 mb1)iĴAeɯ}ŕeTMlMԠ]IeL;Cry^iIuNDӺQ 7Xg9#'vAN#7O9.!=YpJ 3ü"4=e3e-@AQb'Lonnf!3=79BHh n{ݽ\5ڀKgP7U:?)br6T5ףEq A|Fn}, .oblU0vQZP~)fRMWb;$Qd:>* \9 λwd̐[Ǥc nAy@+ұ/'E>-mTZH^o)e:V# 9'z&]zIlZsIݨa%.C'ܤ_8B󹙊a8?FiRu֩?&Kvew+hw IEy;zBB#ރgdhHTuY.Ukt ( eƓW: F#,|_#y7gPF=/- qA44}5&93 aJtG[G78X;0ez؀`7F[FY'YRxMW:qF6.m!todAҮ_#@YbecT-̀8bzI"EKZ<'̹7-N3h ˶3K^CIό-VLTyV{(=_{NCHj˜\,Mkm̅%7~*yK>|ec 3ɯZ~<}Gw()y6RZ IGwNq)7e .N?(.e< W~;hΉYY9=<ʋjI@FR@)&\|yMs yϪ[NaޯbT`3.,,5XP6;?/}/|.UsE]F8i:%D>pW쨦h&0>1ׁt7ډhEG(#HĚǘ Ss}zZP7O$#wԦW gI?|B~r.#Tğʵ𬑎sn(jIXCF0s.,Bl<"-Yfau; :r^HX* S%noaa?!k%w7:;9iN8( B Uޛ~L㵊_˛?^?,M8V)x[G giRPyHAw[{•o% m}wܧK:K2Ld*ZycDeNI&-H/QFe?U_*k> 0({)I)5'U9D d/w<_Je%Y;{1 䫉0햍nw tgۄl1m)uUÖ5wlu[TJ>rprM}WH2Pr֝t5x%Ln4&FC=t/ol|o(Vν_(f&4(;:inX%_9iMMK#1#D#>_l>}dc=0J<|6(g F8ֱNAlkQϿnG3J{gVt\7'Yr#@Pk4-hIՒJjZ_!uHrѣ6 u4h%bc_:TɅz=݋v7үLTθ#ũ զwY9Fw9XMEŌIWB q+噐Y*Oq ԴޒRrsJ&3GEZ?/AMfBQ4WM-?# }B'!P?h,/hIDWM?CԬ6ѤMJ/&OaklΉiu؛cJ~n)EPem鮀M mل֏s 52鬈±uI \47na8ʛQմVǂF_+ӬoK'88xρ}0T;1qw:ɪӖB `ʂ5dzOc.YrY:YC‰;TuSu( g)b~uǘ [B[kZmK*tsa\ -E VԕEVi1Q:si/{b/gr03'τd7yAܮ~.eD< 0yY}K^nl@Ze()1JwGǫoE4uLW]0>i[?@uW{xz*y4§?%dj%I+Y31s[&'xV\uh# Υy-Rou^˗frUiy=G*7;"(3]#U,Z Gġ(8jBf\.C>{lYV NkN= c(y܋*LS(yUr VIY8}Ɠŋ6Ȉ͟2bvO[0i-嬑OqM&/\f.׭Iȷ24#uѩ^Mᵉ yS fհCehWq{HK8hY ̩r1h, q^=a7EvX׷$O>o\sG}q+KRr5"P|V2BZqJw짩IGI9S'G_;VWG*|<<dm0"OuͰ1k&NlC$orlqŽ,6kz {xGNQϟe3b8~خh:G>en 𽝮[=Ee! &ӍrtҗsәW*>:gXQp+ 74]7/dQko"b9fʐQT\,i3)L6kl<4SUZ_TDxBo\sYapt]ѼbQL_; o4G%u ^Z?埒UU Լ T|#]va1"E)Qxxӊ<8^*I)us:No{Yv]L:_,7'bV`bWRߌwL< ecstYnM4'0efO;K\A|ƹ92V) `d4a.cRI5RQe4_/XSN{u'<\yg>_)퐅0bs5FsꃻS rMh ^$c!Avuh]5cGL!k" Gwru1yE>N̋COn{但zm#n+-qrJS>ϑ'( <^$y"1C[^h쳳~cϘte>4FKLs.'IC6NL)^ u>lW]o<G endstream endobj 539 0 obj << /Length1 1425 /Length2 6190 /Length3 0 /Length 7166 /Filter /FlateDecode >> stream xڍu4.Z$.&D2Z{13eF'ZBN-z=!h!z${wo[Zg?gs힞!<aUAѼ|@ 8،`h_31 !6%4<\B@ @( m>E)"0H#z}8\qqQyW( #zG0`àh?BpJ9n| W P *r `C"ў $pmppԵE7ktݠ?d?߳ ;__` 0c`p= UC{y 8B\`. kAy}HŇ*WSVCP8E+?% >v u#<>08W7~c8rm"EؑWx#7(|] `]f~@4 :~mY__>^kOѵ  ?˯O^^A@@X\ **g=o8?^ӿR~W X:kBQPoERpq s s%\}ڈ>7khu'\}0 уn\`p5W@a׽vkM׭-`W <Hx-%Au3B^U #.$ݮ'j9_Į=Pg!#'[5 k{@^P0,Tz\%u@P᳣+tN ENɿ[g5i3l\[i *BK|r*DL\ MM]Rhdjf0 xpN;wlu/Guj'[Jiy|ѫ*d)'j2% 3^,efUm&g#7X$Dm%7z9k#f˱yJX k=)䝟`}JO۞~y8#O;q'Jo vUĄVf0D$xu4fY\Z8 xbX"z;{("*#UT߈—o5^:oZki$2$. ˪MgX#SzU$9哛~ʪ~@ڥh QhrW 8Ȧdp~ y&@Dz)D Cww Ƙ MSLw{%M>b Ukگ~W{Pé^철S_?},OR%)NJ#C#5KSgs`+mgJ45dӄ򂈺w6/g*G[MUYol^mJ27'62-IPS⴮v(<vzaw3z?^oG{42;B2J.x֊8ܚ]I$a/ԉ~V*ڥ`l#M:F.Մ91tڪo=БRX,Ԭ "8R$ks9H*`6E2 -*P'-4)4 J^-dvD/{yH V;6u9(ktGI0^m9693*}@apEWt`LS<ŹYd᧌j/x6=з8DPɷ'.#vgt,e喒UWّ"RYTlB>thbk\A4ٗAEw(z=^f(:Yz*6rezF7 .vEY> fA\4tyAT\jTZ9#\h؆&0SK宰&m94 lIΎ2( z<[ ;[1?UЇ~ap4p`u;p)ƣJ- pz>p:=ն뤸 3C6,۪uӵd][T䊵^q㌝9(ԑi3𬎕Zv҈l# װГmA'6*^[.?[$b אZ)dNa7u4H)JjBWـMD픖:fsE?sϟ+<tu I4賌9&h8DmC]պ@w#xq4YD,ohݪ7)D?[V]J _j' OT0'J~z?Xtx}ӗV)+ ,2~Y{x5sy[ak@-ͪK/l`qdaVKX@N~Vz饀\AGeAm_lxLfIHKz6y%r/0~ṁf (x[~X-@(k6s8,-xvoLnu2h{ן:ygY#!Nm2ƇzmT},!Z"[5fn vZLJuJB Sr>]QC'yrMs~} 4({jiMsy}zM_W͚Q9y c.mg;X?NW}&ikV/Q,wi0nVk9LD\due3s&H6F}0.rʨ}4>r$ͱ|3u \!2^RK# B6f Ťgfk01gr:~@T">gt2<}رHHڢd̺n?ahMb-w@KJj"O`CP8 <* R=:pi;Z`р9\b s %ͥ"Fu| `8YNE5yj뚖v#Nwsd?Zvc 75e>s$AfwO%M+l|]sJy9.3&{c6`H,GokKCl'f8='AǂCom8W4D72GпL.ؕ^^LЋ bחPnFIԦL#;G]'?nǤrX,퐜|7ҴQQo1lO{shP&V*D} ɺo`2`H`w˾ W>X̔-JB%ƒƑ[d*o?WlM4ȈKks`wIҟ_"^c@)<} ~Тj2s@J(Ie 9//(sH'ƝQ+QL*.<>Uq6 %@ɡL,]g )>Yy|S{`pNylEu#[VJ42ߎ"Oks-Nknx#]U9VaȲ\}*24Lw)?iy-̡H -GTHBHvkg~E0E}`X>W2g:i" DD7GM=3"%Uq?v{eS> Tq=,{v  acoޭndPo=AR*{6`Ɗqa =cJi#$'-/CIK;| gʘi(Zv /羊07FFPmO6^m־SkKReQwyE,luʺCem36yXp9Orٲ@ѭ376ost2_FD|_捈 Fg@`$r}W?ǕXrTŴV_k0rcƑk>LAKؔB"@,m EL%,kNAFJ©uGY"wLn3İ5=dI v:%9D2 w8U/O?}U$-6{,ԟIs,6vsIDCqYde=h($ 0ᡲ4}*J[փd;X'YEcz*#6vmcs2[*KYj7-m1=֕`Ǻ[֗_L~@kF P?MuG3 ~&r_=ޮ;>I01fյE,<ů{R243d 4pm!8fH2y!d1f-Rh+ޑ@tL\~ӑ?zx|_]4{R'$83+#=D7 ͳ ZYF;?m;8~ ~_(qbynwn2k-8V>zsC_:_m^s 83ͧ:Ĕsn6$d`M\Glnt) .}tt^ye'0}†+β_4; Iywja1='Q@k,bGd34ݸe?}Uߓq-SCt.p+˲ 9;f%xpաGِb9' κQؔjD\̣h+>V>z*IR#..^ܣ>yq*{ k$ߘR\r*ʹϫ+ iڦ\tl4xq& |!έ]q<>u[u/\/ɏID}":T O%oDMExȡAq:G瞅Η9E}& _6L?,&jji .B(|QFq圮wDNwxo Z<X`LڅʴPcJ>K-;Ŗ*o5_Mh]y1k<Jxbq" b1?/0l+&7 ɅFd#o{Y3 :u !:ƧT?g)Z a"߾v&%O%UC-&n.8q 8nk%F܊C|ގ$BdGIz7s1Ih 0%9yM۱;BxoBtGbOyS'2Hpw>Z8Ѝ3|=r7spzqp)P%ܴ k**F3a:MnNm(n )9O{%)]T\TR eD . @+ȴFޗ+K>/վab^Q⪖Zkc<;v=Ͱ|KԴ֊s Nv' Aخ쑳 -ӥ+RWEgѪzZh@FEy2NW#vRE? 3|$~>&z`M <|fO}t(OI#[7L C يcZT Pt*y04$ÜVx2c{F)) ?z9󄶾;Ym>KQuk e9cc~i/fD#oELKn-FPj"u.f6#qԄdM+y endstream endobj 541 0 obj << /Length1 1778 /Length2 11164 /Length3 0 /Length 12308 /Filter /FlateDecode >> stream xڍP , :hpwwH 0`kp  [p /{}j}ݫޡx,f 5KCX %%96 `Qhh4 Qhށ!Pk1$ g$ᙨ;Z8ll<@ j9AJ,y5Fjj15sxG=/sb(V@u?.lYYY@V,P;Saz&3 9K(ƂB0P88g%lmlhm  s<g{׿-sb` H *W3 I/mv<=$^IXb6i=veq_+[5W{3OW/ܯI(g0`¼% @16UxS=L[(#آQQOhC͡p@cMUfNHr ` Js9Zvig)u$wK9_Sp e^~]OU|fuvKAI8ۑ )x]VNbF09\}pܵdlJ|ptڽBDZ:&Xǒ#Z' ئ7 [Ri&9}ԖKWtZyZ4 |98Н Ie/_q>朷.ؖYGU/yeߞ~1J psZ(wYU췂{XqbGCE,M!=.J`a ^A[`8P }oaS(65noMr 3=nJT?q4217maBǔ>oby2ZDUߏ o[h $>Fk)Eb+M;0%&:O ئOd;'yz7L5V]zjlA^%>s͉1Ysrs锬)bzLxJ6elmi 6/O>?Vi2EydZ>0ydFG%t{gvN-fuHׂ G'GsEEYd1Ʀ 5"P97^!,޲0N,`O<ҪbIޥ} ks4H!ui6xHIZr^LMxwk\GQ#`̙9ϴyKeŰ4#6R; @:+ 3fmU t`X'xjp9Em`yBaE̷㟵M`R&ZI{>:+${􂻡Fp bqV{!At"j4?ԜSQR'(g!M{$w Y; 9M<>gk&8;+xզ] pkUZh:Т4ӛ܅#XJʋ$QlE]w3|NPЗzΒ` cޚh{ CWQ|wGq7AY`r!|^:!@Эk<+DdQPOO:*~z2lɽӷSh\|Įk_q? %7;.1t*Wz\̽q~UKtPRW@PI jO.bTW?rq wPBUڽmuc4+R7J$֓=`;{@1Ph .9\7ykحwY6wM6 V>X cn |4X`,gM]lײH]Q=+deYhn -WB]~$V&[4e{MvH>@l 4lT郓8k"ǰ>=MϢ28::v2QdITkIUr5 =YG,pTsTy?Q2h+$P(QW9 7vim'ì9Vw^ٔYEtph#b7ju]SB9B|+5۽W׹ cLfrWoNy9PHԙDآDPgĦ{W]-6_494gÝhF8CxJt.Z/zQ6_KŔy!a3Bvf$HFЅ:9E e=-m_2$fB|͞^%]C2B=z_-S!ȼS1D~<!a\|a^)2D :'R[7\7ccddF Y:6< c(= z~u(7oתXiN 5p]o3&9.+O3.1XY4Өpe4}n?: EE7z j)ZϷtJ|ظETk7G!zMT);{O#qa-2RfӴ{"xWke離|aIPQ8F[{"kM f 8hr;Vy}}+6G .kG{Lh| Hň7}f9a[Ϥ#.-^(JgY.6fo`o>m g )=S%Vk台3W 2޼zj=MW)5ӗ'_.a"D2oHwX td[D,kpqa__Pr"XXc ,XW'>CSG^Dm`،|;W?kEmsHEQX HڒD@>y:';28͉];u{)b_[6<|[G411?捸˟ԩ 1fv! I^BckGT(2Lފ(V]~ "]-ZpCϥX36y/]uWgtҖm~C 'yy?OcK6Ve;`S4䔮]`Rx9YH=*۩2 `b_Z Ar o2_lf~b$BOYvQ D-H )|J {%]o%9(NT?yMѯڎocI; 'd T7"- =a=0&Omyf렮a2 w~DhXVA 6_  ݖDh!y*yV>Ua)Ù[` y[Y5l(9Diw\E[7Xa;WQD.痌 G H;# ]BKle.,}jP$ IB0l@zؗ T%~J}[.c[ . Q j[x'. !Cj]E ï:YzQa0 x*jQukL>A jxNӠUGWߛ=ЫE8za ܗ7fNa\Uxoޜm5ɑ.?5?\L.ac.fc(2_Az}<{JH@O I[`DP>~[z;GfsnF]GQ4;e;g+F6[Í7>x@˶v>14esg3Bڥg-vYt̏QnIw)B4Y7wm0]^\o25aShĹ-;/:(z ;ɳk?F;QoxWМ`y^@@b⑭9U;h YUɂ:5SJ |o{,UE&L,lάhE|{owvk\6.1݌}8hY'Id:a3)x^'-ɿ_!~b\ӍKo2NPDRą2fyUD5a''71-mޛq~в bşsڳ~whǚOFm_Ѣ?@K:*v#+Q4ETQ|p.#- ?d~TjىCXS4&3yAh   3kCq~~ 8O17@II? >ZZ21qq}rO4QE-b dIv%"ޛ,u6+`JDlqWtTUWh}4t>ֱd lޫc`;-W_85g']1okH2(o\{` 8@ԿGhN\m, XB!G[Q#L_FqfZ((ؒn+  F $ M8y{XFZ('u20]D2Q7I/~a)8Q5j,.X[g2_BLjʿbn|WP.6R97ʏMkUTL$R/!)kކ'j}yhߔYb ?)nP]T/؍ƆheOc7w>;oKE1<6_h^AAÈP-\ Mx#.I,Px9hT#g!5i-r͘4G+>c# ))C ‹D}?7;d޿\6rd{-ʘFiaD2VOɻ)#xMRvEv@lJ ϏLl-\| -V>ԔWl@W!z 2YCD&S"H=WnˤcRx><摣92M< /?*ABq! /YyMهNS^. ;l"_F%C[2P}IKa<@?Y/EǻR?ͱ`q:=.x8:t6aZraW1{);T?o&| w6fZ3R"R,PLi^0ű8|R4IT0#ttp»#;Ƞ]4zX5 (83;!V|pPM}}A*ŽS"@ߖ^_ 0_dZxeV1D!R?7XibBqKh /w>M(0V~r{8y`Ϭݟ#xϕGefAWe6=g| QZحJE]3I12eU* cSfU|JZ{=QwRbs7H1ra\d\i[Amjk.ا`T'$ѵ|L,fۂđ8ι_T^W$̰φgw.|W$-)J6e&2nUfc`/ 5պ0-AL\#=4UWuUvڐwۖa- a]ruĨ]lkkcp,)pX)QЅNzU6&![<&{(t_9C-5$ԵHKR3/CW6i9*\vBvyxB Ckl%yxGIO?>-⏦ßϟvh_E6-ok }#tb7#=E1.f٨x-9VE<_t[ n;v`OUN!b >q?MĜT}OF;\5X zCZ*!&]!}R[}=W[T ")?mW+8JcM!iۙ!O2Z▍/[ҳ+i!E)]xhF::Xu 3H}cN)rEpS} #WLKZiO3> _ ;g 2K;&F!PqX\$3h~Sn|eM23y7:jMX<S>Cϊs(tm Q=+/$JDaQ"Y?[[ΌF endstream endobj 543 0 obj << /Length1 1384 /Length2 6326 /Length3 0 /Length 7276 /Filter /FlateDecode >> stream xڍtT.ݥR5t#ݝ2 14)( H7HJtw)%{׺wZ|{gww?D%c C0/7P "@><&&}(׍dqvab !>yӀ^~E;AnPk7@1=v1zZxEE9d P+ BA'Zzp+(v;7l+ p"k`&g2n<&_np9CH= sAf¬!=u# {7^n;dewp<0[ RTFx 8 /  0s@QFBw<+g#…jkD_e;8@`_C!Vk0;aYՑur ]xBA0q@< D7jg:y-Ҕux0{SNq˖7yw:}N0I܀m"K+V܅(3k.=&bDwf"Ea+2iD Vt^u,Y+Qfᩚ$Z/Izzu>j|~8qOAF^p.:m}o]뮒E*]szvη8{J /_g%HW|7, -z}zRhԺy۸kYɁ{𠠘-[V{Ey幧/E:`FB7?8ϖI=L81߉&w_|(訕Ivf$|u3hf$.磵0^];?htob52, ZLp1JX潨_JM3LtƳƗW'%=ʴ.҇ع?A*7z%tvbhs$Zt<)>%y.w"=cѾFRӼds{`seG >JJj7LÎ/]MeԤg}a{^Q4ï./R2NjјCӽ#D*-BbȑČ&6 קK~ 7U I1F9]*01Us!d.e-DK ;qiъ ^kbyQqM0?H { &lo o(P\]78Of_{J:"7|:8ް{ePdk& @HNwv׷>Mkcʭl=x 蚴ՓnØJ{WbE= (;w&m*D#/̻Pՠ+`olt,P//eÌXj[u u /VTp(6PSZ/C{U#hh{˓^VfDCi! t6wfg &Um)18o$#?X0;U3 u6 &xX& HӤS#e ~&N-z1G-v ձvxceVԵh yUuuv/-$2"mV4,Y$s$xzGNx&s(]b' \F9I"h(LSq|s8M}Xcc^NSt "FMFi6 ]ʄ+%K\Dag^Yы@:E$^dɃ[+|[՚@߯,<~Q>͋nWY~Q,̓6#P3EĨU\@9Wdj0K.AS'5oxN·e7-`LLZ[7d%`yBvAFJj e2@tjUUIۑLg6bP> cu$>nAc)2\[O7:KNN|O~/BerVjb4he2GiZ҄CNK~ 1J2T8N4d-q>pW!1Ci, &jr,^}/h_n:̰]zւ -xаSD C˭B ]3&_j?ߴnv'kHFf6CcuSea{T6婒ºqWh<ȱ3gAH{Lx wi)s`nMnO=vӘu(Q:=㮊-2 O(t?=.-fgsp񯝩|-qJٙ|?FAӃ)tA5!D*Bso )waUK!ZޞWгq(`<7tvE?c(by[vw$o4!B{Qw#ah+ȕ,F =XY}cĹklZ2I-h~M6!aAA7 ,i6< KCZJY L;hN1xIeIiCO'> ~1KxdcI9}'lGWRL  Z}.5Ch5 7:PV4J0Ct|D27 ; s8ҿhBoH7R}ۀy׌d$"x@uO &2Yh%[n1E*C= *7T:f>=Y2(4-/{RGs]P5^4@V{zI+DwEႤ ZL _(GsR7rtyl [ >FLOQm->ߊڴ1tjn;XWg3tFq|Sw}BE_Ǹ7猯2-o|ܸQWusȗi54y߳qq>{o fXqHu4t5 .MLbIբȥ=pYq[v\)&7r Ăls4v1z-ˆiMO&6yٶRv 2XFO q3D6i>IzbsQoi B#oؕfLv,-c Ohd|}';R~v0.P0w\̉Յ{R} ?nN[DTg$a>n@?bXDB:E˛ܬm|Z׏%g2x:dmJg)˧BeC?-4$ xdw>j'ai=B,XP &qQw ԰C-[E8ѳ~>oK5>T:݌!dbJ '?88+K,y|\s:轐H$kI4A\02Mx')1!\ Z/&{8{<{$9xRUXϲ<}/8C!IчTO#%,i{*[p9yimhT\;vkѹM{A͛,AFjۤ_,F=}7pXu 4rX)s8k&~_1^z>{A8?+&ag;')LMH뮆 ax}j7[zjbk: gVOAѤm ܣc?UN6{Sf¨ISޯ$(!X֭1eSeTm}%T3cSwrx`K91Mv@Ȗl>f#l`Ỻ!ɠd` _Frz@Ƙ6QszI`v@ 0ZFJM1X&[CŒmY`}3"_`qꦇiE>r:;^θjrExJSR6H> stream xڍuT6)H 9tI3H*3 1ҠtJ7HҍtH H~{=5kͼ;wؙ)@VP JB0/5!CA Duʖ(Pwu@1) @HPP_@ hp  E%%yHвDB7-z0 G .[IJ@ݝхP] ~h[:B '`\(wK$V8P :"zjGNPg?z_``0 aP#&? C~9Z: n0K+- %_\Hʅ 4.!JGG(B>e FSdw_5 $`9BՔrA@QQA qa zm~t6Vx;!hP5CbP4S"gGd0 {@ϿOO )*"<;D@! @}gǖ;T nTnӿ*v\-7ɴhB\LPT;_Y7wA WflsMZWz5jA!0W,ыA(/(Gs<0e ~ }pz[QeC~yd^61ug*p0kDH'zhIB #P$5fqQ/o F!`" [DC[G `W$]o !B=`X:خ:; Qʅg^Ix̌yR\̮C["kWZO3>&Ў U3̩szF\$EF"d/cnAlzIsVw&sCZ߽)Ф4_E5Y oRsf;}4 KNcѐi$w?4x3"@-p꞊^bޝ"4Ro+U2%J=\f]jWMGfWxva {$myiKaѮ )6%{ǗCTsC[2XۖWЋK@gr{Hﻃ ϛT2YORC l9~f25VDӦ\86ida`_ e5͝`דFF{Fly*IDS8e`v ڔJc꜌,/|>,X*(o<'(M_HӻM' tRj8LOkYb)´J1qp۝㦠¤짙UHZ9.?l6!@pB#`iaB:lP܈:b' |}jtkcWE!|;,GXDc.SQмOTAHQIh)B]6ۛɽxeu'nqAT;![3w\$^<ͯcFkXptT1i1ONܻ?7\gf pXUzakIj j^v)0}iwy0 | ?蝞fxG!5_̧$rtJdCeVzXQ Q/i+;3EiN(?OЃq?HBm"By4G&)-Iճԃ.E?nzHV.+z |gȀ˂T8#u|ej8ks.bگ$E)WQxg,y\#'MH~'F$F i#pw p迴_8r8X-κh󼁉aMQv*vT"}-49!-C6tig5!YyLfŽ+Kwdf*f2 g:ޡn"ِ; Ӽy<]H[,csϛ5:Ǫqkf8RY-\ʂq %0j7ڏ}.5Pw :X݇BmZW9h{ME|5ͻElrJ6hb<6Wܕp52^y#RN仾 ð|ٞʢ0҇z]_'f_V,4B'dUKƨ;aU{bηyƶ~%ۨX+/|'_nQ~ZʟvmtĨSմU5U=>S٫9mI>f *G,ZuI_$$yMֲ[I( cc_G*8ڻejWӼCA6)^{?jMn5bPNT`U,$-5iQ4e2hz7mlsp?L['W8'*À-&Oۥ,|o^T  D#\ض5Uxqebx ?ϲ9zI%Sw1g[hu3l ңK[5͑mV}obI˓r]N 'C_gٻNDDM+dZ .>(=xH=+mԬ|ΦhU*'{ʈgoO]U4wb$)XBUO-!X9 :q~^]{>Eҩ|WZig+TH wAx8-y+i]|X;xq̛X8{n)^̋aiqY#Tl,79 ;dF

QX L/m 9ɺ#sMVeџ5v+ m^>6όFU= ͥKWx`rZȱܢAeASߐAooճlI{Keݯs㧶 /rUqՆ9|XpФCk,_2ľΆطH8wyWĴ/߅:U,>`a^5mk;l=u$L 3ѻ"7|Aߝ˦?v7O!w5FӯI ye("}o  ug5_%je[ Qd=Y k>$eHpwWz ܭ@/B&3Q 0E{6p-WʼE#$5+Tly&<&E+= BO߇yi?R5\QjRYas |ŢT8ADz8`kg"(>6r= !{GvnȘm#2:NLlHlQ,c ΀ +D j]fIN͖mT@}C[Oz فP7(b]iOm 7V%%9_ӧ7ۂUy[:Khjx{n,I?/Q\ՑoO7މ' u^ᦖmc(AδnnޕZ& ȸ3;$M8xB%Kutt}Lj@VKj|J#.\$?˽H<^7ʶ}ؔ#=錔ӄ6Roba6I=V 7>PB4b0q}[MN"kFWƞB}bY~*ZXȌloӓ١oQsfRZ&nK])1kF@ 0y%Ma`'uTonQJNzgSJ8¯KDb2Ǹa@ic酵Y`LI=$E]a&[|#r4PskbaX}&,<C'C.Q| &ʸOELŪ zuO?ovHQHԏRZ1$u=>5*Mztyãh$Sm7x5Qv4m[(wܹ Rmv]xTu--;['>\jywyzOmī؃nahJ Jp)W9_\!;vq[6`%~Ur^I(whI7wbC2v1]H }-u5+Ͷ1af[ЈMvq*n.2eVv<+,H2xZb^1 zCN}_9u\pZ۷j&]@SN].ӈ2=45wðmevŶhK,WuCQ+= '~[Iq͘E,#/ u %L5{OfDFe$:`\}Sa `hHtQQ>ghTQ#'ߘ[Jfk̼,d%& Á,qg6Wcy| Y.Y}G|-̅uh7_1 /:J*ưcF@]f*_.4LXX5rb(|U|P*|Է>l" rY\}o#cf DD ;" 58WC9|Y>)mO*̿UPi6K۪J *8.j ^ȃ87t'c1Ǭߝ~x.|GKAtI;IyM>*- ? ׯ =@7\9EOvM㻨~dbƢZ KMz3"a=ʲYu3#I>x"/.ds/\O:pMݽ2rOA?+$sFz*kfR ]b-es'(NVW'3 m>_9 i\Òh#Z30~jg0;! bXه T@UwOvٴ 3t/g!ZM#] UtrjeO޽s }.fϦ ޡ<(ȢKzw{fց`j䚬$YTo32XO~USuN˶"Aªz:h}GIA #1&NK1$ =so+$# ,˜<ߝmͽz(fy.|̶hdKX{ѦR s{F ƱnЗwFuu:FO0 #\>&` BbyLCEbiLU^r+)DT(בG)ʷF&Fdz M Suua2ش^:diVA_iI,f!HytSWǧl v؟n2us!puF}[uRB<ԜޙzԼ~w؀΀JIg=e' X;Ï$S6"MU s٦7> Q9Fژ`mTZ*NO NWٽpW|ao yM}Ç?լ2Qa81y~Y9 (>s^(Y{nWe2]t3IC7wsv5gi4B>鴇Af͂m:sƒ fD ungYʌIC ,k⛆6cA,b7[հsZz\gM,_O=;U=g)Y""v˽\u4;cf: endstream endobj 547 0 obj << /Length1 1488 /Length2 7601 /Length3 0 /Length 8610 /Filter /FlateDecode >> stream xڍ46.D%a:-zE:f0މ.B^F/DщO[oγg&z m.I+L@sAiUUEA 11ء᰿xLz0!i}koyH@ " YTJH $ttEn%Ւ z' s"P-vGK(=+-$ uDq#]l8vh[ sqY~7 P: ckˮFC]`[@F"`.ڊ*u'/_Ngs߉HG'(ar*h4'MQx% @o=ōnwSEXI#a4 w}2v.0cfHwae +W']+LQoʭ   `-:N?NomNH'm0_;k7 ]\ao, f_]<A@^ {Cs<*2uo⅀`0xz4PFnʽ=X6'SC`G ?S$ qPG;߄[պo'@y;ZUzIDܪ nYiء-m_v߳C4(ߏm?t}@PEN5ưy:dH߃ @]\xW oZUNN#'ڪyZx}ɍ8YIx;-ߊli|`Ip(o+93dGX>oJ%+,saӏI-AN˃D={ [Cum4/T=iݩKrQ*:lKtĺj,ۅ hRFS?^ YFB9J!,;2-Z.8W]׃?sTBŊ*a@$Fz4Ë́ڌDE2c5`YU}!/=4 ? s[/N-˦`4M8zZ!2Be;N^*rMқS^mO՚t%NmgJ'kßˊErO񍩛Lζd)tɂ9+.a-\i ?pShe^/,yS&Z=qD棑jNJY/̮L}Ķy%}vw3!eoI 'IWE/53k/-$1,gdG#o`kzC;GJY?i.S66=d) =Vr S򻻞{5HWƸfsUT{և!hW1Ke?pO>Ȼ~^' ^T6w)|&F`wOz=;w~&LÄۇm`$emPdzُ,FaKJSylc;lIx?oSg_P]ΠȔ3~9Y}]/e Kۮhᧁvx&8kT `9Oi#)3("4ױuDʮݺLsK f#Rt}Io` aHnhrmR6o/B2K|+fU2el0f(pv٘x ;^㟿n{f\*{vj6yZamo7Ii8yE}b'nz-K9|9'uA_oT-wt7M+g'ʩ }X΃E~<%R/b[!HIyݵ *̉ܣB-wR9wbx tBK{~QQ4l$}\cV]>[(mʡ`.hEf*Q?V' 5tyCT˴' TCh̄vWacL{G'cȢp^z30,zg6rgB{i!uY=LV&}q(k9lڶK 6ζ!~FR1ExvcV-reRJڸdt׀7ه " v{hK2x! 9:ex)C,ÉS1.qz{ BzQOǺL>9KHAfw0a^w k_47~k8mɋ!lנoǂArm섦oʘݲX3+M>:#3sF̄2{Di|+>k↷ݪ 0m&O,_knn=^~!@&:绥Y&&GfrNJ%ʰ vXz)9> -. 9W =%ReC)k:=YI(ϊËZ43nioL񤵟G|.GP?}:KG`7'&ZsFUqG :%0l?$NiE~#ߙV\A,; uC0VZPJ*-PI5dA0$<(?;Y6ˍa:f_Us*&{BggdL{\wE|Vhbe͞~C;zƉ~~Qd7'|݅o ]:Y57/OVe[)_-E)v_kO00";ꑵn #Sno-󰸨 :fїuk_ZչoGDDV^1҆hY7&6D<;Kޮ/髍j\?GGh[fĀw >og6]FHwbǤH^:ͤ/9ܼbIL[A~1$7Ƴƅx[WI:8Jg'$)Cv,a/cIBeʴR䅮QeN0[i͟,lF=.%ڀw~aoh2=pP?r3UH𿜊~8aO%t1w9g]I(@~r♜0:${i><0GDx`b]1%= 9rSf/C*pZX>K]gڲcR$)r$=I=+ |{`'5${U'F7SI 8N50.\T^fvĬV6d|Zlpbж:CH*-7S|;)OkCJ )b$l)%Q)u2Gƕ k9EU!5GGI9#i/efMbrgN.*Ƌ˗mPA L$*딖Q11sco{~<0Ăb;~ zbPQמ d A ڸTOX~ׂ"fc@KATǺBaʇtjaNXj;W.r 9ӝ`@K4Z:2< EYڗtѢ/5FJ:7DUJAE!gʮXӁ764﫱(Ns~r MW8&s;r0em ԭ}M~r#`Вj2O,7m2)XYc4xm&^Ȼm#{;":%0MŢxe[fxI2 6W:r:kެa 1eInxĵo51lgR& "vYIYj,Q~A ReX8PIFSu U4VACN> gw>R,tҍ0pr"9ԩvWYP#0}C)g9vN@cB/|=C"Y+$SHe[.+ᬱ$uoGArS*7nۦ'Xu ~i`9=F?0 \C@t!!YW#!#5>OA$p͢[Ghm󹯬*H0E Cp =5u~Ky4$O:F!fr[&,+Wuo zz(1w/n54ڈ7fRiL; ~l, #2)&6D ܫmTU}~cX""!9c^b^ړE»C>+~nXL4Nȉ;b찖U,R.}nOzmu?WN/z+[NI^ym Z6 +#~z{c7 mIʁSEN( s_,NnnV^U.n۽yAkF3zI-Y9b7k,ϖa']kveFMU]/#Eo2) m Z,*fd6;xGIWx+\`ل@CW"χY&ZU6`U~XD(xfhu~xN?kS+}WsZ^8.$fILP\6RUMz+Qj:eb;#l\ׁXΕ1?5B +9Kcf'+L=*oXX^KԚ;ﮮ^s>e=fs6P* jc}X%1T x DxI{;If`+QspA>)иm $>b60z we4̸[y^B]Y6kmSF _neps%HLhe@G1wgK%ob".c'_Ѥ~YT`_]] O:`=Ѿ1& PP~' [Jt DuY+ga-H0 #Kz;1×P-3܉4'/2MT߿"h'~HB)S1xvNYTլ'VIP&4%?1HMNDI3#7qz7o͘}-!ZϢc;*[*!@xF˗0;^撺7KE=7R}11bҧiC$#E" m.?S`['ib3H @ʻs1܇" >`/1y][ܴ;1Ư: A:ubњn:@z} endstream endobj 549 0 obj << /Length1 1448 /Length2 6887 /Length3 0 /Length 7877 /Filter /FlateDecode >> stream xڍtTҶ ]*ФHH* @ HWWI{ E={}+k3왽gslPe$ I $HiC;ArrA]Q0$B? P0S8-$< HW "f#P)fgn%;  `@ ±;BN}$E{=,v<0=uu~ á&#PH[ :`(pC@]jg(X>௳ _ٿ  Fxv[ɇD6`'vÜXe9=;_ 0g4s5"2SVB( p("՟" uD =0!lܜ 07_o  .'ĞWy/g/7v_og3;f zP Z WǺl<f ,_,A"_~C}m?;&/x@A@$*.|YF ߹j[$6OsW1/uYL-7A" #UX )99s?a0Z74VZH } Z- Q549@a>? ?75'D~=.,bXA K?!0 6keCzgJE`/Rc-V6P!hl ;/JD\-q?Vp=عa o]A\]m&ٿ( !@B;T1y% v9OJ#qi3O]3&xc>ܩ>Qްc3qu3}6AQs-qmwtYo6usRܭhWUnl.OӤc7^y6X9u7sa2Q;MC4ΣRWoe;KKx{whJ̊DFso3߹oPy[Pnt-$Whc,XﹴgTj'T{';[#|bS`I1߳ ,yno@=tVFDZ<]I}U&Tdl`>iNߜGyʇ%}-Y#R$GA"% _5I22mY+]$+X8xF k âESU.7Mq"M]ג`]{VW\MlѸ3Y`#_#T98ƍs9E'Ov9QXAE}T%n |8a t8Opf쥧r8qz;կksjm'UT8~7ىhD)Uw(%2Yr֊:T K_vr*M> p7*=X*S*m)x+NsQ3Im#қN5rqQ"xɘ=yL)ט[3[ˊz|p#~ Y}m7Ji>KhƒPKi>!옏C5Qh +1Cxr| &׼1B1m9b,VY'=LHE=,PQ VZoY04s&ZRe9Rپ (oNY~k2`Zb^صPJ5 ƞvMe.+s$)vfwH_%p#>\iG0^@bW2&J哆~ rw}HHCIgAuWZac|if|QH'wMnuGm1Dh ˱>.+]I:ůa 8lUߗ'y\O)D-Zettp/y+ޛ>eJ$_s#-0DcЀ7 >Ky+z*?*U,r%:Z-ƙBo\xo30mDf9uAm1Q]vƐۏ'ԉS}_yHiNvpߤ=>*Ǔ'![@[@yyJaصM%OaX:sݯ&X|#L0Ғf٘ĩAz`?jOo5UM:nݳ p>OjU9t JLU")1{/~%L2Pe Ӣݬ{r !6$?[W~ghxf}Wk6]T4~@6@5>`VIhw%ڹwq,;7OG8PNޯN߯/lWZ7@`hSՋ-Y'&n^,_H-@R?d<9apʔecՆbw-c1*70ԃ2AbMҷlS\6u5i$VkW5(%9{hLUM!ų`K{Kl7&}0 GA%+8gjOhz#Z)킷BCPyx3)mb ıݚܘK[F-SCs%Ket/u1P3{"hu=loFAn6iO5@,EZ;"@㶮7G̔%k .sWV|b?F T^ÔdD(5Є4qoSP#Up"M@#y> ət)h= !oez-1^L`HmzIy;_z~'[J @ hEG'C,RY%\0vd ۩}hn~([֊U[sFR9MWSWhS{Z\CGQLc w׋B4ӕr^X4;,bbD<=dJ$=>Sr 蛽o%хaIe+?p燫4&?7/EJжe^VעfH. LAΫvɌke V<Aj.32 n3x\ Jr* kɠ(Aqu:dOg0ɷvz6]u8ac۸>S 'jN{ZT:xP2- pGzM7KriVZ Nbؼ˛{ߌbg>ɉ8on鄳[41>&=(%Wo@:n-޷JWe8_~iRuYhqx]E vX{)R\RKP1 (? {eNJNz&?H$ \pd'Rی"uZ:YKrWT |둁ƠYOM~zB{Xa7:.v 2'1=z|4b;|I]RF8-AWPd嫪W[-/R(vMFSjN_"b>z\_PEy[vYk3z?? J.c+HPU*8ɫ,U_NwAHil ^T[rnj.(nPNu[eq(yUvϝ'z]gxש^Jݢ@.>w8Od]Q"FM~#:!FcKyjy*`"ދs3\?eKM3AÅF%G~,Wyuڨ'3P!EUm|d{!Hl) B(='B)׋\.v`$FZUt%/(ڡFJtVvI_O~u{y/ٸ_C`Q5.NA'#ٜbU}lfA'F RT>!nA:u40!MiNr%G=ͲKP<;4g2KYg<󘝣q+Yljx[܋!j^%tǴ]ytZ//R~~-Ȧ/,j(-,.i)lU9l)+̷"mY74}Uû25NR8ߗ yZa.tʪY%sS)w1ʩ;:쟲{|dLjSnR|kl2b~(=M>ʧt8jlȅ7M~_&:xhA-GBw:nʇ-Esqm7Uk>$b􃤭>鑀¦\6tBFez#IU[z'[ZRTV<ot< Ѥ;w1pvCgWiO3RMnSylϽ; +}v2_0:tEҩ-zx2~1*:cbyUlץd%Pc!%m[(ېc]d Do)zg-UZ`B M}MNe&fdȋ\Uj $ZukF?6y)KofI]8XldսhO|y+ %Y*Kap~-L"9BoA&m_*y,x,/J[k[ƽo>ٗp/(\f}V\r0?wpe9BX[?.x?9S(a<@-.^a #I޼x^` 1 q] gm1xVPw pU_-#7^u$eZ2^ +0 .>OKq$N98bW*8_*Ú/3g@W<<$!.5YM{%ibQ!uI!-q/~$Vz}<&4W7Uk69@NnDȨp%AeIi{׻h p ϼ_73\ofl˵1q٨TѦd8BH']࿺wލVwF0B8m@ʛS7;J-C~qk_MG`}^LS\ `< ݎbN:qjwمmq/)N"OH{mnKw݈CMOtխ;OQMe=#],_ꑘȻ1O 36 fb*; 0]Մz#FeZ@KA* endstream endobj 551 0 obj << /Length1 2756 /Length2 24051 /Length3 0 /Length 25594 /Filter /FlateDecode >> stream xڌP\i- %K4n I n]?U[T5goCM$j` r21X̬o]5. ?ĝ&`+XOsqظxYY쬬|0q6(2@@DjqG/gkK+WpyЙx2L@EW+=8@tV,,&.ΖBkW+4Jdb;3fDj[+k&@X`gm-@@g88@]V#ؘu/G֠MM@^ K,0R4sqۛXۙbnU'=3gkGWfk_)r$\ruAOh.ߝ9x| s_I9h܀Ee@W+++zYr!/18?GG8 puvy_06s-A@1֞=VXd/so"VTV=s0qعXl_7*&Vd-Lg9Z rG/ 6_tMQ+xkߪZVhnfOe]M .R֞@skW3oƯ-U\]+&pkxlW x$:7!%AfV`ln2q|hk, W WG,D#no߈"X$E<߈ "Xd~#o `\#0E7sQ\E`.*oF`.o#0E7s\#0o3qL:W,5MMlwo9ǿpxؙxGKboƯc1C{'O6v 20h) п]o,>73c%뗺 @8r Nn\?S5 l oփ#M]0U>bUw7?s N?*b7. KG׸N\on~pX\TC> s{S^@pwfnহo࿾@Oܴ@MUhm(ț -dz&9{TDk I+y'jxզGX&1ܞѯ߻Iފl>9jB5@vrEUu%xav9ewi#"'MÛ)[l#BaȄμ˞VntkeN`mWa9S(7EaVrIv[-Ė5-l>Dѱ:oyvZayn`O@[҃^gbWmZ@YltyDG0A3{B0C\پgJkNZW'1f<0 B^B^L|>=J`!i.'M}GZU*`dH1j).DB:Y/UtLY~_.fF'\U(ݚ>.k1C=ͻRkoyBs޷f(HFʿ٘D08AcW_UN!LXyClY!Z=O\6\9k`9|-M_Vc~ϴY'XEjJ0~$Պp>#wbOOUPo Qj$u9tB&8;^^f*F^=yEv0.F<Ć-v_Ǥ35,P&J Z1QT9rf*q9bNOܕAccmS2SDQ,ER3R\ =#|_TGvF>#! f§6ٟTͦ/[.gTT  _$" e%^zrM\qGCNiswcxHNŭq-'~7#_q: olTt'K3mRqg,u\QN1KGwiN+,T 77P o3/ӷ3IDIg x-СFӾdWf\-BEew)oU `8uKO ?4CNm`Z~#7D {-.%;|uj|#+] f7kY4EF.@oF3Uo?Xqsʬ{h Ud c薰.,kNgx!TwWSS`6y8bLY9s՚d4]e7"RRosLc[5>Yg̛,Y"-J_{3Teë;i \ mHzǶÕ|&V&0qZ8]I5JQJV&^t֒h d.QJ\Pa@eQQw?lT΍@h͏mд}a <लX#XtC0$GɛDb>lX_reu+-@veUe7H`0}=V[K U-!uSo08$YF4\,^܍$2ZlHY; #E?f3^ucpc8ޘ8e Fth*_cMv Ƙ#b=|Ϡ0\~ގA.6zY=^GT˵\bV)|2J2{B m2.Hi6Z"2R`u-[d\)HčnPb(|>(a{_V[qTGTZ1B?Psp4ߨƸCo:k+%L\&ԑZ h-Ѱsz`y#mSMk`Uy,*nQ(ga ku4Xb7*VDOWM z]h,fP pmnh:J<Rtt~͕yQ7:*#R_/O'Cڦdij uUEFdV]s7_ yhZF@ȕ{: &o;h&WRX@FD(9\$x$ĪT%ySC4о?ByWȆnL/lTX/.= )Mon\NҰME|bɢ|tkOHY@Ha.*TL#i4 ?1찐}Ӫywj,Fz C֌ļ³] O6þڿh Ԇ4%%jo1G˳%#n*Alz[<YR;9n]TB0q䊉^Dŭ'gLX6>c446%회>D-[Hʑ-_;\E qd%e'*#^:pKw}?76MĽWu A{MǵVaB!ݏF3:U\+ 'pXJj Xlv-'HhoNj7Pʬ ~-mFb!>8']:QZ7\E`P@IQaq ,j3q{> Vʋ/rjcv~:ƾ#,0A6&%FNٰZFd۳{$H#΂ӫE oiN32?9f7݂\⵻\Äbg~ oFy3窰u_#q%)&ѝMP6UXy &2I n1~?v:/ a5I:w䓐:[YԻfyiod anVCzu՝L*:ESc|1Ex:Qa"\qK+tBH!u26_7\pq=;ǦsFm?u $S ̧V?[oJy ِ5QI|i; x274+9/LJEɽ7&3s=OaMG߯Xq$ nPH%aZ(Miki<=^t"NP ˴D)˼ 3 9]wA 2XD+F[J U"i:h?/@H5VȄ"`nA Z#3D]Hf;Iq#]Sj%VcՄJOX7#&HAVʶPuiȥn^TIKn~fN \^OKSDm2٭a] teF@=)g1X\on]Lkg]!ai25g HQƼ7 Wbޮr/>Xnǖe!ޘYd1d[|vNkόI;!44gHYjZ{i^amtm[+K$j)*JRPу#,öE%}a7ȉikدMЛN'+:n;6;[Ob8H\]7'S˃Zċb 0bĦ_o4)h>ʧ7Y'GVDjò?V9DogSoH,]K :BAlYiU:h'&o#';]_~ۈz!nE^B;$Ù^حN1&:f069C+D7:$AshBJm}`g3P/}U  w zZn'[}8%T{DȤ0Nӗu"o,0.0NrߥX}P8'ՁB%S0L  f }aܪS;vꋿSXݠgL𗴙T1'CUzх?M^\!}׋ЧW<{>Y]{/\ld/,rǡ_F% :)^-됖œ,ݕCf(َ9*I)g۽J{2/#;iׇ7wRx ӌ ;.8ߤ9UwB_CZEw}%*Q*qLMUԲ2Tlz\=Ҕب7^ هOoUrn\L$DH:T{§x(B($6}5~W0$jX2m*G'e2 2!bSzWX8tgOf!@;(.Vt1)tF%BZ,HJ%vs16G"R'x;J/HpK蛬VaZ8-$>.0~Pf4 ĈT/3&yY~>hX;zeO(ͳ=&J#7V;7kYV?܉} Yy~Mt aW*+"xт5=N-"q&Wm(q"zқ]PD塤y>nP.{v)LUcEZO7tr|>UGbzC;ݼn6Q.];.i)9<~/k xOs$NYx3{cq >Qn%՜V ]p]Htl\ݕW㏌lEIPc]L撘KA!%{ķ?jpݒg0Mػ5^Az&YdvsݫIuƾ U [r!8k^CĨs5dV7΢!|dU_ @3"g*ʹiWQ|f{<+/ۓ8j!̮:`KtKW"ӸstK3>}p3[bz:R /Zti^E,* D~f];0Ϣr 2\fb;$< 3f:5xH7kax`rt%;m{ov8?ߐ`OLXJWO]{P63=i.Nj@q5 VkJ}f}[8N#YUC6եUZ՜&ck1Rv72\)2FCv:!E^jq5Ċf2@yO m:gb8*x us SPi5/Ι )den# =M \p׺v^k>K?^x{< oSK^0T03q8Ak7*+>~xS< (%CpdSFl12)әP}~Ly^u-GNT|x2͖ARFt[}kd.4YvcuMba!]]qY[\ HYYq- eΨ8kw\M!`˳RYUpB߼yWI-0Y)'Gfg^؎(%;`bh2> iy43ߜƳha{-=sBtUh\G00i=>ji}[] Jh fkx;b'ύY}3e_ ʚJ+)}>}#\n$x[/x- QcVmShz<\yϚ7΀75Ż|V^Q FlX VZ VjwnT=[ r.4dj<,fˤ _ZL!lrU'HwL~=5{OqՈ^Ϳ7{:y.RƒEi|l61ʱy L7qIEd@Z2Hؕ}u˕ʠrb@҂Z Dj嗝3RLj A!ъm2 ^ay{ =рa ۘ^cOW㇄$YBHZMDOŋ,Ls/~$JT<$7 ^Iq De겵PZ.S59t<b% Jr`Đ염vު^0 )R'MD~U;%_r>bq'54CaiCbAñj牼7L;_Cd$kvE7~\ +VS蠋i>z^1X̗"pIG9K[009!!_AS16nWe'/y) 6Ai$?BOLi4t!=$c n$@GJW?$KYbX ^[]fzʇQ&ZdAANeW Kx 0hۮ96O41}7R3n՘.J19qh`3?'%O*!=G(%sy^ H a "CF/0#O xgɮh|o!TZwK׍IDw#EW D4Jk$ҎQ(tn{Q*6.#;Y}+ IĿ>0 ^( U.v]o[y4i~B`h.[ ĴY5!>jwO³NɔXoOzZvurY ;D a3 t!k{EK"q pl.}"ɐk6l\{[5yE/y{r|b |}c0BQlS E[Pp`yjɼIB\@0X %*I}{.SZQgUߦ+'2f ʾ 2FChIa;ﬣR )&e8M^6,ׅI+Y]:t^y9D,[!  2)Qxԋa7 ICD"/]#׆M퓪,LA.ihVH(욷9$x &9Y*y^b lyB0=IY, `ba:1SV:2ízO[qq[ f@T9G&U3"0'4hdOpЌGşBjI2 4M~O7dJfo`g_4.8qs畟* K V2c]?orFQnP.q3.!k)9g'[gcBbg0`хk:C(gwʼ{o篲<ߵNɖ%ʼXo}ޘƣxjA,j%ZU!Uzv̀Rx5,$ LVFÝ(El>3AWTOJI89{Svohxk_46 UN^s=w|V hџ&39 _MIJDs#҉浔 maBffQEهK٪ϣ!(ypI~ߜiv9'THs8RÓm Ej}c(%&=Iʨx8uv8ug*vJ#hɫP,Фt2QϛL2l K7]ly;zh RX9[PW#rr$ғx)z/nY(jͥ!"ޜ׾+ + M'],7,ut hї_*Ai>Dh/eI=! Nf.޽,9 2Vp▿9!-WyL2N5ʶWrU1]SY+33t&:KP0`%= ٻ d"+M)aabaGG9.4}4^FI٘TTӰW37!WWrZ0z"@ F$N̂&I$| Iny|r&_3')+Jd+[([O-n K"!j3&B4J+fOu43cR|,]Ǹ{H+~7[) 4*9.Zo3@}{) 6;H)?KyZMP$Ƞ)C60lj\q E~3'vL|ox'X͜fw}$OvYleolL*) &ja-ԭ@>$1 `iwDe4?qupi0Z}}lq3rqfN^`&VYF[i{+ЊĨ\8Sedx,VJch!cV7/W-Eb-bsN뒽ُ%ν w;} G_H:$ aTʋ g|߾I>qUґHY2F:Ud/9Q1Mm` \P[AƛA~"&B}^"S9Í1m2#&C<+hu$1vԫN b7yvTw:"?qԠ`ܰ{l?bOd f[C?v~r/n@ݕ]5vTD툎-}XDd}qaÂ#l閐Lka|Sf5SB*ڃ(7%OjYuyk= j9++"WHK+W&m2Qq}Y_KwV^X=޷R8ᆙ}v٢ ݂ucu 2'H4][dZKz帍]kC8m4L]..9G~KVʶI"lj K9{ҢWV[jp1y),]io ?v<|"XJ%ksp+7fj@4S}ίE7Ʊ/hm׵l6ԋ,eCnr#0ԐQD:I3'A+kK֐W<8HLzٚ=}a_hY0MD.mҺi"cW wu>7# /w4$١`Ĥ9 v4jE2_A׳}4|D2߅;vˆ ebq 2fqnI֮c6 zJO8 Ի~WHnzeFٹuX}2ƌ$屡۫D;΋W,TNL9ܬ>}g} kE} q²kN0(RIz%!+IV΋3Of8ݦ*A4-=3nCˏ4iE*D,{hƱbsW2G[#y-~,S%PȘ}jZ>nǙaTZړ5RqVG2G3Ikg$E;f}ݙ7>{ -p8Ou@3 2{aJ[D"Big]H@as%sva]SaSbG{֔h\Qyl疄[e:|#*Blԁzt[K:ɟH'^d;í^Z8틑ەÆĴ#Z2 ՒD4 e=_l9T Y,H=bjل! W D'}=_]݂o`7D}\J;]}}wPea/|mv&cMjd+ U(I9g'ow5 ^B_`Yrtԙ? FGC8UyCg%mo#}0 p쁎:ن#2?bIV*~#ܠ=z&y$K\t"qL)J&.\ ոlM>Xzd A gvTQ4)g@PNU@SԠ/+t7-Br|aBbݴ-8nᐷ" 1[o1:'4^Io|ȪԤt G)HBdK 19Ick ,@;FlӋqR*󡍺!8?}bMJEǏ/΍'؛T-HIIȊbeǽr8@2 6׀̚n%☍ܥ%( ׎>HOgmBJ2XU=bvXbe#ւ6YZZ~z'g?,;Xc?2 oBv0ph-åWu -#ud5 «왃ocIFZ|# ,mTNR%\D#7WhҐg $^R3&*&f}cjvg$V zoq/Z+Thbz-9 jc {kn[fɮүJMdYX{4.~`F,oṮH)MnTm_}~k(|QpMH^/3t"k V^Ed5VkIIcۭddP#!G=@ mPV8D=BG2~WzTMK*8QKCݒȶj<ۊO#+dGehFvg1Q}ݾ*hel4[ .r;3?l bXe퐏^Gl78k%B[E!61 zM)!tHxC,тb >j6b lp_cJt!:CG3^(s` jgjbpːu9UʴE8NrKwfv@/d <\"V "-A'J7Ͽ%_^pLlog>qn4@kl~oo idqYtgAjJif?"ݯ1*~C4ֲtlZfƿ7s>a(c.$iULA\2 ?wC;{MX uxX7}_y()j~Ӵ^#SW'nّz6%J_R 7_C>n9'' %^p n'V(C. Ui[:B/?(GDhK W;!NZkJa-.I܂3Z!$3iL2Sn,7[U$*_Cy\#QIrioJm[''ϸg/` /8|x^)^sl//% XfxYYnozQ8$RFrho'K’K=^!Q۫]@cO`ܷa;I ?2W|U 2SuaW1 >[㍍}5ͯf'˴^6_DkVtp\j%Vy*E^iC0dye͑[0C5`o9Hg[x޲.j)W*取?V)/r 6'DE P9Ei;f*ɶ ]!cm={ӝg5#c|v,~ Q6>"}!ܛ |^0*;Pa{("t8 n"zwiDi$/Z)ǝtARW%O9xM' \t=A8o<8 @b%dZ\XC$Xw uf;x W@PiYyV%$X3,/@#'$1vC7ХEP.ryK; .{J:?5*'^C;kq.R!2tEiGfCtJ6av/o! Ƙd.E ~E W f.=^i}fȤ x_/UFP~(˗B%kGmJ>F}΅:%2FLp$-Z)AQ v Ry vAujuL6swsԔ&ڇ 4?E7Ir Jhܽ_B:w:D)o5JBaK|&"+0'M~tnl:UXs㡾cb1'55̺n(Ԉ̷ >Np;X4;7aE:y frgfRcE{ƨ <kj[ݣXߠFG\bC^#9Xq٢Fl<-tXؓ(UF3w"Pkf#D41oY9k Y|UiƢ2 Y͖ gnk:Qryhj[NYD}~ DkX7:{?[XIZ%D\cvTe`EQCg/"|AbR>A (Vo,+,YDwLd ]h[{ԃ%HDS?), hpSerip$l K"8e_@*!5zݍ+`7tisF 9GR]"fյD|L۶]Ǩ\^Kx<~ipW˹3męhd(3[G%riHjzWKT?@ r:CXDqFKdbRs񕿳Ηq,]o)Kb7)1\V]1O:uaWt)ؠo~5wj haIjl2G6Bj!(E׏A mfQVk/ %ɧZX=[$u۽0 b4n)=5t+򖢃`)g"K4o yCZ+YAa'HVt~,2XHK/+ ˬeL"@G⪻Kyr&  3,DjǩL9ő :W)jE<.⚨p RO^.A,!vߐ"g+S:Pl dkX`p>OQ;ԌIEG&pME9+e"G![.KaD<4%؅cv_< ϗI|~' Kwө_0@ E@uC=1_~OȯVG_n(hj"IBvHz5!e/@iqB -}<<8ZrL1Y&0?K5|秴D04>r{oӶa=UCZlU<3ݤތ}j}+ d˒+"YIw JWtpOsz@t?Hx,fp4`|R|\%%:=%W.ᆺоܪMӓ(7X%aVd2X.>R"ES8ݞ^x!-r&h8Lb+Grס|v7QpLBW?Њؓh (;>Iݻ4ZǒY=5SK8pP4F 9\/[*;5?[=b,P_T,/u[);~F(wE|=qb_R n>=K~KK!Hd}hɳ rE]=pPMӔKO^`I?.Q^\P|>Q?8` #sg6Co'=cwdYB6 c 6~)}*8T/$ o96]=Qƺs4=FզRG49 j,Y4?8wj;8־ö<^'ԧ^밆H6nzFC_mq:c&PRKV0߫{YV\$hˎYERL*:zx6bof?<]A3cpEoHV`Beb V4yl]mp"ߺ $WMU{9?O+!-e2T |':q1+^t~ *]-z.#H@l8A  / "Mfysk@`rQg0~k@/TG4~;"}󹎉 D;h /TNl%@ edq $:szhʕKFЙ`T#4W#'g.q`GkLs)q/&P3yZU>I;Gߣ<ڲN*Z.yKHk0{jarE!p*7UgTmHnvYD.B(<)i׳<[tCWh.vRK5Qsf/'yR8MM7|V]ꐇTRV[8u9`tB|BR vWígSZΚ*gN@~D!'ˮ~Rq8#ݨIoL=NQ&%ˮ -~^nm`L)xlqmÈ> e,Q42Z،ROk(r얟a(ryG!;h,_FLX DH/X:e :q⤠|R 0#,US M5g~KZhܾ,:' e+ VB.ד %y;CKߠkfi?⇛ة xDˡM2p!dQAZ4#\VBt3dOʻia;?CYSY&=!?Sc, )&}D E8P* y. 1[N (BVjNT{i`;&"=i]G_{› @IGxm]m-4|$m4 `^v>v  U1l;A e#:LB畒:wBjCoDj?:|ǵv7DK[DqCR}6x&Am.W)]v<N10T5~e!uЁj0$ɖV~" Ѓ,TgUFz<_zh-0m[@=%*DgV $k(:E@~E%.kA ?`0B ʐƀ_[16d}Z,FǤM t 8# osb6Pg7d}. |N\fɼ">WR{vp@(xySe~N.6`G;ꏎۼtȬzWi0=c(mmBN =Pqs,[14PM8ǷnUۇ֐ Ϩ ]V5jhw8;8 $R9% $JnJ4X{ s|UŏrWh֎/*鲖@޲G9T]kO OқuxW;^xa_@Zd,ek'#AItF{so*!bK=E@1=ʻto׶M .Ļ”{NF:wzYY{GdxEć]͛+81]/*scN \HSƱm,L-5Rfh5!Na0SLBsd^bU2.Cd"#[딜iUC6dXʾFk}d2|"X-Ka3q{ؙ+yB۝Z|ls W[.52y@ VfW9n!Қ`K I%Okdtް+ K\*)!^0u;;Ug4y!ury%A*ur͑>(UC'C3uƬ 4:m<베B9:B֮2n Sҁ%fS,7N46HASx%;тJDHjt+,h$XMZ_D؍okMEѐ'Yc\S~ؒT\^(iHY_jqRzʗa gxmz`{Rn3Ob=?8,_ +ʌwi> stream xڍT6L#  C7 ]"-90 % -!"%ҍHHH#7s[̻gk + y%-}Q( Ⳳᮠ?(>1 B$KQ-e!\BQI1I  J (zZ|GPU ꎄ[sps$$x~@0-e wnu@ 8_!8pwI~~ooo>[7O>(I ;A \wa|Cg(lx ` qAk1 lkous '#Qy_P-e;q[U_ypO>O A5YusAS@#9;!Jp@A_( @1q wsQ% !@~/ pv '0(GFMXQ}>Y"1=\~=UecRTx^A @@@B :;-,C?ɢ>_ w,m( ?Q_4_Q/|TW}-(j kjZ 0p[(@\n"SrPnk\.A Cm D Z_:.AQ- fG%Pk`? GP0_D9) FDP5 "B~G0(!|%Q{P߈0 Aou-/ S { z~աȿd8 qQ@ͻ1.3úaD\fp冮2H?p`mkjO{:Ej5$UDɮwox`w?b-@_xUyri4rnCoNTr7(2=k],5.Cg3d RJ/g}W ={hXh̩`N)~|toEl,UGtׯX'$9h1)3.?ZQ.fɣ qkĪ)cܴOxwmsiwGEH./!z$T ‰ŏOO .Qs @:QizZU <ֻKdG6x,Ŷ{$GRU+[ YX~2!GjܤD&kӊ_9= ~SB[XX4JPݩ J+6=Twg*D;7d~TARDSbͷd:9);d3&D{cz32y2^p_hF3)xƚ1IEa@k4l~s ºhUsL3~}VA9w;mA 1J̢;tfL!n!M̻YM:yW=C m.|ԿJf $AP~󺻦bTeDj7>vZXsW5\if\rܻ1kmpD;4H ^fbovK񐂀xZoM4@SrRٵ%I1nalWv;lAe f,Ņ֦?ttfGO;d$^z~uaoesyV+|sOZUrT RCfB:ܹ3sGTQҭOp^+s\t ;{34S<䉧N8#ڔĭz s֔U|Rw>eiF~WOtg48£XWטzb-ΦQP'N{.΄խ-?LC z0"8Ap7R|dSٮ琸ByO>-2ݛlغr!`e_ոNnM.ͤctAnЬԥN9(xKHG)<ܡ}( ұeq6`ՏʦJ|壼#Az U:cvC'uLIV 4**.ڻ|r+/ͽW4wmj'&FV[ >~Ķٳܪ)½,~2Ѷl$$ -6o]3 /{YA*B]K--:׳W:;]L/x$9 YvW*-cy 8'˧ 1uJ FZG EkALk"y"KNsRĈbg{V4D@[s>pR%pݛmYp!75@[;:]!\WKyC}nwbhwc>P;^4Vt{ XX?yZV6{mIybZC^F@d4ht5:o;%WkB%O(SJz8,Pҽ !GسqWR+H n|^[uaL I+A>{ϫ{_?-npc{XHQ #3>Wj[?a a>k*Y)Uz_xvPQ{PJSpViaC\/yb=Fߪy+2rϸJÓ]yl"5ށUVwoqqrξVnÚ|\[cvR>+5kÂ|\i z5,&% )G%:4ʥ+n'so>QF6+HQ4vm<9j-t43b.ޚӦu]|hUv5P<\3i4Z<2S\2+ᗑAw8V"sؚRiO|mX/PT$tfbʊ ljͮn8尮i͓(ɹJEo1G+eO ǿ[@_4nYLɨ gs弹CB4*dZ0vĖ3DY(Ģgzgq =55o¬kQ,ٯ5(5lK];S%vˠ]5#jكM)fge -fA: JdIu)L3 MHGB}͑G5"ϲbǟ$1=¢i*)LĮRfT |j$F=\t7o?w+bf<}"hذM;,Pcu7 کAxvA{r Vv9ސd ! a-EJwۖuvE 0bZ'\rk]"usj5A Cw`Bkgͳ/=:>x Μ+~PPE sLn^&0e%E;Q 6)b䥋ߴ G5 rODl"::Lz)_ZOUϘ[K-yNN#zE/ߜ%<+4r m7 [Vv5})ۙlH7'y`w؀tKZ_̏4ǔ r8Շ4Um4fvr[f$<+|Cј(빎=˔_ݨ/8Q{֟ٸMNCr3;jUsˊ~bX;UyH.2t}a{S}D+>Rd׶d7m1)Oȴ\ht/?M3s(5خS@^"3я6䘞2etybqt7K/p|3 쬶^#pv`Pdߔʨ /WTK.wYC&x AIx 5Y~s {;T%mnF`L=&#{/L40N>n-KtWe>p2-9r yV4C6w]>=}Rfv|!N1xM#XEG87D)DkbeO^z@*" յLóMdL@YjJ͸vV>n|ƑmsZ?[R44KByuOAw봗n^;k뙪:atã`Ja|AN@*INS$ee`I$ځ, A^n#u=rBᆐ@=K\Jx Z%#j0'RPDcƴ6>MlY[~BNmAn吙%ޙ7ͳw6)s _Td7>jBOZ0N tH1nbo{{a2TRPC$!.W%mvqWo5_4[撎AVthNoLxIqu=]s;,1H;e5i4|bh` P+mmE^\_sPSmg6q% ,zկiALJZ+H#ߏ.6{ I=iӊHZ%[ILYr =)+l l;ApX]N34j=嚕.UST"b'.*^*]1:REilT }zx=V\׼xX&%}y冺i/(bl6BnW= YwE҃e"4!uyk.2SڭN>OS6, YKnUq6 37%<4`5Vg'=ݨDz=g>40|AcݐɕJ@~`=I,S6oYm,N΃unMd t{Af*e ;O2;]U;HnH8zϣЊyoTvcppq ,uWmd1݃wOؤoEz7·TM6$[/V:BCv13ez?:=ׅqٙ^gq+>xQ81.wN9MNi.ҌžXvTjʮµKIm a2.U [ËyϺyx)wo=F:$^5)ős}|&:+O88m=|CgY GkC4({lzFҫiF4QlFi endstream endobj 555 0 obj << /Length1 1588 /Length2 8190 /Length3 0 /Length 9245 /Filter /FlateDecode >> stream xڍTk6 t 1tHw  3CtHwH HKIH77yyk}ߚq훍IߐOnV|@~A)C 0ALn8LJn`k SFt0ŤR!AAݤ֞[?@)] -98A\8ow3 t`gԍ k( pvv燻r C;l U.@0~<6lCxY( a(- ` sk1w~;[@pgk7f@=Um~ 2Q֞ wU5sA\ ~A5YfwvxSA{  sl~`"` z5@Ax``@TPPP\HF.0*_ UbF[{7+-[C`xDG`?2jn$BE< @l0?濇+jUp$OX '$* QGѷ?0;8@O.'aϿbpKb, P3W 7U(v@ң@q_Z 5j`пqW Uƿ _ ((?:VP;U`JnkDnnx$Q/`oap*`w5O1Q/$PG(- )o=z&0@Z!p@CU7 "  p;j-@8ZA'(_y^F5? FAxs3ptc}h::/QI \|sni\ϖNYSRUhe3v3 vhAdw /$գl識0جӺwU1g8l&g ǀMz$:9$eLߋ.5_?Y2rGJcǸqB:<\jַdm8}}d9}m%;ۘ' FLRzsS2H%w^dȭTЪ~Ef{j)fp#ܽO~]|hb̠Q_uJJ s"/So3~pY{[4N߉F ңhV);9yXgҷeT:fDBw;w.5gTr[lqo%8l>ařwK]&V7'BhozWBTRok0x(gS=(mx19kC.qD 3zTPڤEF›>GH rʥR P9_{FQ%i/LcmjOWIT|.(؈U$ ]G LDt|5 "XMli xK]Xl;Kq[ϓ蓉lO Gɷ;؍Mr1׉/ܶX d~[,t!H7A{#ַ (DSQȴ(Y4y}"P48r@ 5y.KÔƝ6 ;(jY-'3!y8GvLE>u "iSbڶw,LPD6sG"䦸0ZuȆu:N!Dp >~͜a{CyN_Oc-]Gd-i? E7}?;b Bmw;Ʒԩ.޺珠X+di۶}VZ,oX)׹gZnN ڒ=3U ,b%mM +۵`㛝Pm5(BxAK[Ozx NS5JPXlj=% QmSA氏uFzOu+ gšI9щO W2![;b&<? yk5>y\#`t1}t_Gtj|ʜ7'+YFmvjz sTu. u1l(#yv7AL{C|,fc jRuw6J"_3GRHUnUuɕqA.yzGjhs)s^ID8 }^bsyh#YA\dv+ѡFN}~Ww)nWrV ,~g|"#|C߳م"M/+_ǹ71ʼn%q]&|^b#_kcfd$5ewViYhdyuW$}[d2/ Hv1=;+R)%ܟb+Y0qa9u̠Xi:ճl*1rSLO$f͜'8Fxc=^G&'lwʬ d(.t"|"KOn ҋF2”J0v krP[[½vR8)_IF~>2gadž|̌x+Ju4bjWs mӏҾ3p,аH``L:|ٓX(j̉A@.ᨠk3:͞]$hjw a]ALH4⇡n*Y9=n-|-OYG7wF1o(J2_lO%17y!PjHRo#~I;ڮ9&Q{9nZ+ % 309^Iu "TѭLh戯3Ud3Hs罍 ]ʏ&VǂTgyXcG/wPY%zߝI$E1Vu, S^gH;-]Gz4Xta:Gg̩p<-HuPgᩨ{ TӶjA;=d c.8YG;vC0:CzqS ]^zk M"! V_^/o$N84s>n\ǀR0jcidPᶅgF aON3=;ҾܐaF OQ<1z8y{2W)B!B;x4jG>S:nMCjdۜf~>(ŧw)~ODח$5ZLL VNX£t( ({٢f< yQ<$FPg5G:򛗟w- p}j4btVzB6jFCAw}H8Bj#p飥)ʁnW`E=+UjԆV9YS)mM*WUHnW}ɏ3-u?5JYݳϕָi_J+dΘWTX#+*O"$!sUG4::}iq`izi`"^4Sh ?*wZ'lQ%`kMA=h6ჭ9N$'DTf\L^M ľ;CFVLXӓ`o-Γ|Ixq9#wNHƝ'_f*ɉm̊_4BTb0ȐIף bӥ* JVӊ!w?0N=.Uqm(S{+׹-Wa"³#)86;K9`>UjN{w^)u=V>7:8I)God)fNJ=OK\ݟ{~!o>x&P^Pb H1Ɓ/.]\뛻w#509; a^Jd3̀A;VjU$⫯l,[47%ҨŹٙЂFGsHƱ~U;?(M{ m' f !n;i.!J6i:g\7.]):af h4PvV=^? 8ÇS3w#A&' ۊ J@n% ҜDrĥ[Pk"HBve)qfc `_|zS SO ޤVG+VwKt ON~@2a߷a2r5 hC:~_W]#VpB-&7ߧ!CWtbc1T;vOfUJ}o~<><2Q:$g^vg+7b K 354c8|ߜY 2 zT0(+N' c=O7V "׵w,r'51aYH[JpCݙ>a)K4gOd3mV!`0圼ؚGhyjkA+\/haUɗn) _?1؃wc? Yj/|C1N {@Ywvs܆krKA)% $ N F,+0z#}Z 6,.haq PWԹĜLSh7Zlu6?VB@Ώ`5cE5lRjmQJ^+G- 2Se)^ʮ־UVq~I^w΁7[$ %mQ4˝·h8q,Ga<+Vf.g\74r;u~8>SK ~/ÚItƜ=_SK2D7`C% ~Zp(/f>fH?%7y+'=_Ġǭ"f59lE~_ >}l"_ ؀y {}hDeTUL|kEf>S eSov9%뿬^2 J'$<@9eq?ѓ}%Uy[d ў>8AwK8ϟB%߳7޳ǯ$aozWSiKCIC&p+ >$#]'3ˆA[i>Cw;e@dp)n0BY$;HISދVQr+xU'Q_}Ǟ9d{̣^pݯ%F轣/U&K$Nsإ0U_**sаp3xp!dwF;LEhA(šWv~Up Qɨ;# G4Nb}n֩Ws- -qkGۗ^3Ë3m$>tnZ+-.+)15A|zI3fkX(&$],ADrfxddtLFְ$De.G&j,ˡ؊Iq{9XkQbd8͗f%d3ٷ:fяfECrL̅TP ?ܝm'||}oGx785[l1fC^Cyi$^YXmJD9oj vDUSi{0a=>{r^fez[\ ?ɶ-w*f:D?yBN]I?lফJ-!WiT\*534 L{(N+FEbR /ԆO庝QT?#w[8כB9fnGxtE"Sgfט2Ńh_fưEL75S1d>̦;N xcJ&2W=AƴqqdE Y'"1{rq8MONzҭ}DТJqrmʨ=<{l5LtvMJɌ4 1Q#2,vGAF$#ñSL| oLN$GYەLa0rP@d|ևAU4^}?l~l|Z#Y_;s#!r91ZBm- ͼ~MK6EgtR=aV̝:U5 æWSyǕV/FEs]_8уyG 1i*Ӓ{c,$?43W`8ηkch7ijǕ^W+] ~߳ {#:{ۚ5&֭ @U.=T9{F5wd\cM9(]Ƥ2ǗVp2/J=ݥq$sx͞17kFṯg; jmm©<i%r\@\tBM23΀FZ'.[;i`e YnOQpcH 21g≝LK. ='M ;GK/\_X a};@鎜$4n-Toj<-R3u^=#Yzz?ko~IesZd?ubI Xnh zx)42+edVaH?.Wv-b:em+M-@_04&ˋUf#В,jr= \fx;dn\2l!j1F !Rx+Lq ܼN{_EΨ&릻дR6 5g,E1)[\wڐTvShػ}yЋl&wmDR~!ƖNJɴ "CZ>=}ZcWT2y#15":s_c$^ye=u'> A~Kr7Բ!!8N zYS%t-M(Y Z')NuyVd[>9߁_ >``^F?OӔ ?^ZntIg46vW6wѰ@ਓhr] ڪ KM-q„%м(<Ұf PE0$X@kE\b )6˩w'$z?Z% <"RO*SarY9p3L9ĊeV͝f4;~No+ yVUਯŘpķi!tX'L #8~%0^.vQmL cxȌ+1%7I0 ~TjcTL7(5QMLV@R 뮃2Es@l[Me(:|OcWYT" k )2KV߇whw]]iݥC/~nɀ'M潃B2+Ύ>-1[iv׫mU_$OH1aYe s(lt8T:e_VV~_$t|M78飲F_pK۪ͦɪ/ƃ3{n?th#wO( &\F:wAemH}i{1[4"Dd9 t=ˤk1> stream xڌP- qwwwwwwww  $Mpn>^սEd}7Jf&@ {Wzf& 7\\b`^h 2nfV33' ybVfy=\>LܜtVycWK(-@ _T|< v. t+WK 4U.@wa 5K+Ī@H`ke w9ٛUi9#c i _xEdePcptۛehl7v7561@BX` ?չ:[90XU!_4&ۛ:]]Oh cw糹_%92[9cY]LLL,ij#o%_bP~>sP @?+s ;S`fe 0ZXf`䝭<Lc0'}n9z6{2bJDC gag03r8AE?Y07wp,KOà7hc d m_,HKYzGW7W;.j9WyJn@&ZHXy͔\M-Y=P@t2=.}[7u0X9^;tf@Ͽ7` r;85Ov_Q70F\F'Q7b0JF,F)8#¿ ĩ8#o `Tj"]7Eqo70@@ofhe FϢkڙX!2x@WTo20? (o.n , ɰZih z[d3zh5A]#uP~S\AKT gRw9m 4G[{dlm\GF'7jc5;hge`Gi;e;YdttB\=p[# jFI׿О{//8Xׇt yOϒk~Yvr{DM t)umWNh紭6=I0Aez~iɢS!8|z5'_@6<'7.d{AIφձO 531zs&$0h.=Q~΢N$Űl>{W`@ޡMS`-}]l+&EK[Ge8bɬRos[fKP}EK+o0t&QĬ0Bwcuw3N_ixs'!Dxk"x/:O,-zGE]ttLp.bUS.M>,RĴۙ\q L6SdѕA92%KwI^"jl(6㮝oJU$Wkخ[~h+i (WBڰ?=L r_[b $,xb4?}n{<*:څ#1py?2XY 閬vޱ>x~sT֌9Nd Ip؝]SȋmVިnDP}4ڽGB:Y^9'Y*8ʆ_I)H!dW* 2Ga0"vc3yB*<' ~)[h-~ʡpIiѹ6_z%tMc5;H)EHڋKf42F4_xr$-[\tIDE ìhSqq-,Uv=vOdRu՞%ii| X{D~۟y|Zx"(̖[蝼 캼SG,֚.[ M^Г.df# ʌSܕ|3F? BxWM<{ɉ vƻ ǖ;UBuH4}Q'~ZO_\hi}&YjI. g H~$6zҡW<|?Rs$Y"x9c:(+}OWOdRQ35O_>MHā eF[#ħb$L6PnG4>qz.|36Lrw3طn, SMGY0ENQ:5>ji<g d'ԸX˲/ŊVz=$K.MM^}@ xpM>̍fzjg^ݷ-,=wIǟWT~lxcQNL-;<ۉi&[˴LMʹ^dʡ6_,0]{UzrdW}QrIK&;1aK$$Jn궈3%~?rsww+ O`NYCyHd ~$ݽ!fiX9t0޿FY~bފ˖ gѝ ڇ #n~Bۦ{U.6h2kIOQ BMNfwl$ ,!?d҂oy,,a~mº,­!y 3Z >VAqOQMYrOF9NM}`} + cg<=*#VI| ʗ2E` &&07(2_! ybQ=ҵ3z3l70eZZȁԻVџԧף|+K̈9~)DkjnP4hF>tMTSyD%t+=!DĴs :%T$ZaV5ɥ7 b^mFrXn0m+w5K@m( mC6 >+1IntϿ`g!Z:CPf_PU&oۜVJ]q6ίYViX_D ƭFlz Xpr [PʕQ V<9XYB:3y`M9U.~q&܋{i,FL:n1; Grz( pQ}C/f &iY̢Ư0SȐ`5֦qc6~"=ݱcG7HAB텯P0㤲3#0Y#icT2 ナvEDl27͚ii!C #%,xS.yf,><,=u@XG`XWi>)W{p15”1 j3e0^P/ @V1 32h Mik|J B]̉I|2W2i(PQjs(c-^i2dSb>k L Iɋz ϣM6?%B  m'6S_H- gKQ!_בYz~ϊO L,yZ߱d.J;3s cYЈ6bsk3 m:nj;rO1Z׻8/hyݨfpHzo<?ˆڤ\(YyGsT\QH** E94Cv&#SJ&vdJȰ )G*d~ iK)x='tyK::,\ogZBѦIDաIlN{Qg*< n%5ꤡ7Y֠0/cÇ̆܎(GwOt x]FVI|ym#led[[xTĒxPC8SߌTO:1_^/XGF|+2g TH~ofb}3e%lhd`{sS7:0>')ճeso"Bc@<\r}]A:S7pcb@Tٸ" }6xwg9oоJ9h:z 2.}0<Ma?]2>M%`7Ӧ*Ɇzx\Ҹ:sg4|FYi+ E.QHo|C˖Ŧnk~f|xPEHP:-~M=63$`}j~&J" -S!U|֐G rQ"zP` RoR_NzftF]BEuۈYa^P%JȠGם kRpB>i8݈rn6ŰT휆;63>.(FGO@K'dO,6ʱ5[Oo+eDƙ4*fGt)y;vyq7ӯs{^Y-xBXo1Lwa|bx(xQs:~"V^Ld(NmN\^-4quT< x程$7'a6Fcb r8BNRǫPE̔OyQj*RaۨLOФ&ncX各|pـi5/}L`i$n܌ֺ* V/~ Ed{KCŲ" eҜJoନNKZGQ??(M Z| X`Ɍi;!parV&4H'o(jxZ){% l}]I7BB̴_cktcׄeGƏҋf7lEȲ>wSY+ۚJ  V:l*_0u%mQ;@ohEJ~ର)Ԑl /mtc">p9 /fGl5^&jgeuՊ|TR`Jqw45A"*,C/M#mZ+jpL,݅VAY#12=r?Z4ee>^S<;d +,({ܦ4iD(a9A]MPfqޣOe8mi3/l-*At1ޞ8"IjC'[2 G{9='8)M"+Χ!wVأ70_Dx =0*>ޢua^ [jF24A4eՊ<ƨ$Z&,%hJqj`TAo`u:c1OB݊<{u<%.NB!4bڟ QfMDmBSA%#He9NFTlX3) ׏pTGR[X 'Qz( -!'U1CCˏqi讪n? *츃Ip%`@ɟQP#?$ƌ.%B=`b`~ĜL5/T;%2Mڙ|WI@o>:%"9j<޷NECޙΌu̯/@s*r#HIFW#9G?-(ӫ@쭏v{˟==hmLX w)2K^魡ee_B*e!f-[a~+.wQDH6AT(F'1G): u㽑MǠ~Qmdf'L@'G.D?~Rɗ[~4Þą8;XiHiX;"h_?gWcMq9%rb8^r ԑrs[*$/}8x4OBEv!d[?^:ϙl4rtP!9]Ry~sA8D*w; ?sAYl,l/~ HTdZoO,Od:CY c;NiMM.AY|ƍdF|i{i8K;s$" ]ƌB佭.4rwUa3#=#PwJzU3l:ך?|nxB`Ÿ fTd^xh_c & YG.`bh.^)dg%$Q䧻RKL#x*$\b2 U!݀at4wx8V<v_fp%Z[3ݣ4?bvc9Y()T;Jكc4ihyz4z]P3y#}kPWоC _Zscsm,{|$ʂE^tl$l3c\O*_h(!s'?+"`A"_Zɹ=Rce#(tFI: pH0$> |!vV+Lb-KCo=L=ܻ{fJ-n 9ZhSH8skT i^r(,]4XuN$ޛXqmݐ}Ԃ,g9=x| A8Y;1jρ,8op?!/3%2i]\))miq50:iP^kmq6"VJB IDŽP#eX;uj+98g 9'YXV2,tY.m63*(' ;l?Oٮ wˢaoNtO1`:HW"_胮FR[S_W 3UĨM*@`n}a!=pBKU(vѢleV)vTC-xoHkį%J<+RB!tHrp(!͸,?6QakFnZUqwzˎ|-x ">{4?\Q<!N@4-6׭åN-4f{np 'N$ W~-R|gMfa]̖>fȁW¨K<5ǧR)[زJjRTW 0Ԩ~,׼߽)yX+k`2̙ +w_+Z]訧q;nj9W^yV["~;-EJZ8ML[ 6Xt$vU+8V>`51oA h ́θi:U: >O (ުYY%ьLh[F¹:#]'HWM^ѯŝsLPrjx2:EI K,7_sx'H* }:[_{C)]eSQS|ZhۙH*f 佶zL䡺d#lVTRU/$?82#EeqψfMI'B@1"n)oilrF'Jv3oά7N5:pNE/+EK4u|TĖUÊ^dblik%'d=>Lg!rR`Q7F@h1r{Cjcx\=q #ψ7g7͟ij~9s?%!'ec u6pr`3J 0ORuɼcPI RW +_SN񾄪3@D`N9jDkKL-XXU}?yD][-g9sT?bFc1i얱Қu^W-7'-bHs =42!HDdQTBvK =֡S19eֺ>㗊ȧ1{- jHRXr$Gl,-vg-Bۻ^@:{֜E^;-gMd,O\^}#fEgv*N]Z 3˭O"*G%hw6Xn+S܏: k8zɷc][ܬf&Rp,zU Ϻy)z֪9#K~A e4Q_=dcJ4 Y;Ӈ"0xf"bV ww|UDbRrkM&͸3T=:BUq&2 C8QYblU< 6$c夈Q/^=f>, $_U_}隽`uJZl˫L{W}&FH|~j`Il f \J6-xϫ():o檅.6)' +0jz3;}VɷAد4&mƪzcV14̪ѡ@q󫇥9CKS*徉i8"MN>1N4lJ1c"ɪBb:Ľn VYG-6>[BP{U\(E!b<]_ճ*#'3*yc)}6TMc6:{srY(r͉SHGĘJ#R[1Q|̞IMm/ l z{U,w.k_F&JKY8Lm_e$o#̪GK_ 6|*IKb׫N.ֽ\\avM+\JzhI o9uA6ykA*m"#E#S{P:SYseQnEihQ&Zmyw,]FrX|I*G'!hҞh7E5-ml|3}.!3NEښLl"_Ch"O;ƹyeFYExM\ ?Ni9 xyĩ3I vb[1TĈ A(!9`fXfّ2#=UN82(ɟxBtS>c:>ö]4:@[MƜv=K&~p,|= $Ilpe)jr6d(u} rcGqоgnc}lI$lQb^JM[aEVS0ҤH} ?|9N3Nd ~ I#8tJ~JEm킈})|Jn1S1 $ƽed{.ʗ.#Hg 7 x"C1_rOxśrs姕_ +l0~Krb%_tM# qydrL _:~Ƙ0Ժ6~4#SC"=̜$JjYeuEIDS$ n'WڜMGZ.o0NP9 K֝2jipX_޷bť^𲍜TXќ ̒Dǎg -:J`nLrݩP}:`); gtVus?]&_#G,=l4UėVxAy@({`y[$5ޒ%|XHh:# F /@^!yV+^GQ}ZݤR&J zǵܲ/><)(RzuXW>H/_ٽBFOuPy N&Y岹@)| tqw%I!BuQ^c?Msxu %9y8_w`?Ұ⋩|COcRW ܮ)H[J?3jgLςnDzsS<ۺT tTe[.aG+ՙ!~3u/gRuS]bvxŵ^bc4BeO@OnjbXΣ=Xj;E̤dG!Z_鈢O_[rPƷ*8D2%rv'aSz];Gl,%΢Wy>lq">ܕo'V::L}Y+dg"ƶEx;+/ޤ ˜(ս_~n`sʮ`BStC^ m}p"Qȱd[ɴ|H]+ZǨ?^RV0fs^X_fHy !%bg6xѡ"@q>|'_޽$Pꯔi4چc 06a]N8b)NZLYf1.̉񣪛GL@u# X,%J q^t˷>8%vEFiD/oj'$do Y|y,K/HJTX?MqI}i0(4O(2 ^5w9 l +G5^JxpZˇY$v yX5Uǭ1AmQ5Ə~"dy,VVJ4ƲygcD lMkq>2Q'.,+SODG5Sb>b*gg,ndnJVJY)ZKZƷ>r^2_L`tsdZ)Cd)KL]Z#okN3zٶy~_*Zm|ĩZ,~.RE gD1AA5 M7 )3ΪПlX,TGmi_eEꭔ3bBYSeZEPN,6-F~4pn öW 4y+$H]aSFHJ%%4@ȿ ^gF0b.FUR*[ٔԆ?z@shO$I7**bBffU'yI ZM#zIbkē S{i&$TLi>&;ҤvMOvb~CO/ !U}N- >xD%eΛ|x4=C \ʻ 6Qv饒ٛ@9_'E 7~b`!WL}՗)[49U5z Y/:#joH%XRf&'R5 )Z3kĬ8h +w9+)8eSPƽJz?f|\Nǚ;sGy#cQoQ!`-zn"tn!A|8#}"3h`T$h7 ŶZ( 1q;wɋSyKSxB% K1XaXk qo&͹MtFXr0G?w1/{wfj^e`I)C$b̩|[*C7NX纗~-RAGLB8d8%νF]t?FVKED9D.B߼]t:\ŠNi}T `&[$s ^MP>Y; X20~U7O(3,@Aa%ăL'&5x2@PEeFHnBF] ,-&@_@l1^|]kos^E i!xj&hEyP"mT|CsQn-4N 0W3细#^*K? >uJh=NoO`\ma(.0mA d 薍!!^Xd:}˕6j$vNS4f̑,-Ƽo4sI3Hf*Y:'Z $dfI<@ùCÐ2`Lb.t1pF,R-^!5S6y5{l. ?݌.'HYƿ[+ȏ̯UV7xɺt,U{{OQsr+]ԲfK5S> 0E#z_|)!@"C=`(຋XPH@'o.57IJ|(R7> 9̉_{K]6:pp0Hh`"ӵ-eKl_~.qхh°z$Y\3{c!.iFy>Pc=v>l Xbhq0%ƍ#X ۅEK_/OK+qem.J|c*RHHg+x"ND\'h> 0,I~~j8`BS%`NXTIvєݞDϧ.;2?] P_g젝rJ)-ƜDSp nG%M}uȂE#F ;bxJLL*0O*-$ӮsD&muXZkWވMt-~W076W Ս| H/.+I٠ȓIz1KWe d%c$bdJLP{{?ɺڭynYt[1,o l^F dfFԧեpLQW ;f4+䥗źHpN(Z{"(9'9e]a}8>K>z[W"zK2RA7&ZK@$[*gh 9K]!ܶ0lN.fs@ $ <" l&H>ZxP(Y}?RLn0̸IC9ܕ7`fy EzD(J<)+5ipIFk&yG$OsA B$4e(}E&=l<=:]O{k8u)rsd 4B$lags$cgw &K`}$bLg.=oTBhآ1$faր;(okruX[ ٜҥc k詞r)K.K5_`?s4sƩ`c5ci"?mX%7sOj78m޻!qLA;zfhTD(@έ<,>ᚑA:38FSF,VU k] z.]ťMp~6e>%$`SAڲ8qh¿e u0n,Yf8W ePBz5w&MFL T9a hn֕8Mg#q@rt}P8@zCv"yelD] civ`1 d@*6s~Qőt&ыsQ[u>jXrC"A|,X99 I"N[MEL_#^:G6qcH79!u< 3Q'b%%)kgMCe% |h#և%{,%=Q4sXA陞 E(pSӮ(W3KZ1>ZT9]<o rV4Zk~3K2u#8MĐC~4 >O>h$O??UXx-+i7 Ssl Zag@Z3vMmsG;~ ۹^e ܳ]axlmӏ}b7ͿUpۖ\\i $ )Fwb$G o]lй7I7KJ:td @+NIHqR]3ĹDG?mQDRLo&3B{qJ> }6C}|!@[Nl܍ʶ'Ț'7z!f8#cd =oodg̥kA&JSECbWv"Ʌog^o`HƳ0sߊg>8x".2 ˥T=sv `rQCRc\ÇygD3`lkWQ4%unkًNh]GEP*C8Q4N.UKj`x,[LL?~2G,\!2[ȫ7>kEI~t}!;I)jc7U"H-B*T|v~^S0]<O_ U!?6Se1!1b+k |f݊T0w"6 e;DR]0"ԄѦgZˊc^ 43=^a;Á^O06߾ VG O+f;_dY%4)Sgz_9sC;Po*|ɏT "\&uX%wwPBJ˿!óJKU#=k'kic GrGzx*T{:Zt(7d3 JZḄ5>gƜ 7N Yz! AiAy:vKc(@Ej]hTlJb,˾!7.i͆!MJˊQXH@ڮ<)Nu8Rhtӵe^jC/`QjidYyvb~heN߇7ea ઀od{z N4(ہjU{]?߰IwWt z?Zm(:48Mꗻ-t^{E{y",#,/ f , cpaTO dc4Y}"_rUIݿvu7( >]kve_5K> gpA"Kvp{mm3EfxK^T?Q_}SdG0Oi+7Ry%9Wλ%K)[<`8hpƍC6 ]mA _c 9k)Գ߅&7flv_5 ceIJW7D c);2*}~>8IÒ_gYOBm3ݬ'T5Sj'|$tͬ9gޝ1ikKyC`f.qn_GٽnKnjb:Մ'ǐiՐ syc]1A@`0׈g|=L\M΄ݥzl)zJY|xűc({ִ ^)HB ႺYZתXqPdpvq-v`9ty䶧[iظi2df;,+,Y 㑖hW tq;w,gFW幝,z ޝr XΎ7UyޣKx>gLpݺ}nOab|poe+% M^T5}B @ x2;BcNG]AԔ&jıH^~3&?״aPX ؚ(E%PNsUiIL- /G tzP_ &GE +b6oec#\PVД2c[vJ&UT|htaZK7 c[EDvCt= vF_eƸ6xx>K >Bԝ'tomźOPK3RbjMq'㟶99;uV< %mYZverY\Aʆy +4nj7}zPd$"I}= 81}5uy3 endstream endobj 559 0 obj << /Length1 1824 /Length2 12131 /Length3 0 /Length 13272 /Filter /FlateDecode >> stream xڍP\ր Np XC4X!!KrrޢY1jQ(  `k:&zFn,#B` B hg[sBh&5px3[-L,&vn&nFF3## vQ'1@ #Pm\@foy40qqqځ rf@F?!(yl vTg@hsh o`5z / xXo.@;[v,@h_Dp{ddm 0Y .k? ,oN K7?K7 ) :?{#;==vb"`++=FoZXC& kc?0vab uJm&BGf t122rpq T]m*n!8v@O+ #!dO71/~; @mImŒ֖y  4_0N cfc0118<7:+empU9dgo,y WF6F)#ߊ--Se7Ym6o[ ~kku Gr0x!kӷgeK AFf _/%112ێYD&Om7]cfc"]ܙޖ,o.=&`;? O`0HC qKCoQK\odbe0/o ++/|_`/| /d0 *f- pl)-eVݿ2ᛇÿ-۟?sahgs߆? t!,΁x̫Z*>:1"]^é9+_-uo3[h`3Z{qc/ִ71ܦ@{8udޓiog66>kPp¡؝M?Pv[jv r,"  2U(LRhzMRpW}J03VR1-h3uA;`bK 1%~DE'CjgR4Cu2*^볮\ fˎ\oE-V$k,4ͦpUn+z(Aij/Lꦖ*M ɕB𡐿0-k}=nGݸZ+9 t_;-C༑Au)u h,F}&TH:Tu:HtYɯE5M0.=}^~zvs`[K>PaEďes.>:WgMGC}013TͿ[}@{<;*}^K {%@=ٸڽܵ{Z<髝@ZoޢU &*Um9EZbtA䳲~[<@2i|sxPIȁ~wEb>fM$ו@Տ\QΔ y0hQKt6]W+/ 7qLgDWT8"i y\!>'V]VMWvLy>A`]gll(հ o6tqќWgء78=b:Q} "гvˡDc]LMD3(CgC$!)hZ) YՌلSEBSL\ؙN%Ö85J1ңpZcn'#ѭD4M} +_Ƴ=.}v~ u{&j@A!c"4 kh!k %ǂLۤPc3%y65p~e9- ARhUWN{h W`[ܾ4Kd2̐6h.FcDjh:e/=UY}.,DDe@et~%gje|svFGㆮ;fKԥT.^LcDf |Z=/eSW|zr0] PPMoHԺhjl^Zdm!n` |lz̩OMB;yKɼhs݅W&Af{kʑ|O--j+ө5W}xPf_4\wx# Touob%'tas ^v|) Yy5).U0vp)`%cNkojOՊCNWx%x= E>ؒaP@B$4 y}Bx "㶒^]ap3x Ed7͜< 髲W zc-5U "\`5 5aD JO)H^aRonPD˘<,DBzbؔ=<gpcc[N/Sg 5|ah}N;/\}J{Ln\>YAMz/;q0|]Ru@ۂ?熰>~8̆ DtiQlTAǃj! j-2Y(S}z2*3Ht^aLnF&t#=0?&>$P-@V@ve5驉_%$$veR KRpu/n%>`Geز%&2y0?6$A-ba7d%3}pYQ?2c<, +ݵ^ l oZwbeA1Xi8y'Au*N.G@s}lϫ2wR SS'*,/^J_)NsPCMTOMUhܻKI1u 2+>m{E?LhX1I7Jm 8^ H̓eQyQU“L~ ņ> yL}^|MgR$9l 0Ȑ=}KйΑK o:|2|,s`"@-d[5[| jw<41\auS+9a Bz=LH5}%]x35:\ dWnZܺf(w>4>ܝ~m!CJ"5@-kBՔq)Uǐ &q֖ H2t&N?Ȫ6;I"}WX(njH~ܬLG Lu.ʹ'ZEˍəbשز+a0}Q{>W,d++=X␀T"[#rz}dyFn)Ɵ֢vS%s'}TXNfL82NjZ.g􌡐"nXbW.6wuR0ӵYt=}wB!aNn_hd~}#"gF:T5;28 ƏvWWرD9<snxO9c^g^|HQa{tWħE..+ YLIHـ\B _wmrEV|!yM>DKpEzAbg`4[Pg!$"ʨ̀>;Ĕ^_YJDWR㶛speRvݎzJhc!5zJc*0]{T;{9|J|۰8N7&94PT:s,)H Ggg4cu(-Nٓ|>1-fx쓡3c,qmwoUJaaT|tlj`WmFD0眇dBh1*w?s]Iwq۵5nr}?CfH*0> ,ȂxF!X0zC@#˿FYPҾc$8&NpX/$9y|7= }S~M&D\Ln{7rO,tKM 0k-48úa$J`hALIϾ_+ER2a{È\D8VվWB.݂I^u!uqy+F45MԛѦ6CP#Bbʫ;9G4N]zG T1A"ܤT@|xeYwꔼEI>ѯ#9,Ado,֬( &H C01奺R4[kyn~1%~F_9 `赅OborOx]*K˚~:h =PqD ,_Q݆Ԙ/sOFYf~wt@Ŷ:.9'V'[R Op۫x2Tŷ55H.ncQ;@to!p:\k8tu!cax0P,I|oqSDvY_-+-CJ(Yr~ JP aR8xF^.DY[fg8m.G <:ڸΔu:l&J4WiWABD[X85=75G§tNz~|VTFW -i3=坹e4nƙs ޾'(Ca ܶ #>agC#f_Mx1^z[pDvˁa-[]| 5G*6,Bf4a vZ),6$7ZkK4Q4VzqP p>KOa0ZS`UlOQru\B_W2O&x(팕{lY-^?SKRYt:'q;[9t`Ksb%e#Y$9~p#\p G~ۗ/Dh%MH˫swF`6-ѱS(@+% \dÒ%$irAc{C21a !9܃vُ ,:`gB9'R]gZ_ J_uFI/=UAY'ˍU[ wJDamMFp "$>~}4P, Tmz+GB~nAX钵*mWbDl1f=veͺyc#uWmI0IڄۋR%( ;k]TaC~npM  ~Z1FI[g8w vSˣ1L"V7dmOu{] sJle/lPW~듷`w].]1A[FB]k}Uv^ssT/aC2G#p<>9]-r,CN  %±hZSI8LS!7}Y]G OsXopI ܀<)ׯ&O)jR"k$O@J &Uo`[N tâ+-E,J4wQIyW.\cM|8Soic9렘8MA/Wg:r{>t ߖ'Q)8M)]Lbmn7D㱲6:qIGok7] ʹ@Ov %u'"3&Ka^HaZ둉W [.A.`qуOct?@$[Q1ۈgS-??{ zP>dAMeyDTh|[Lx_L'zBpGQ̝dtE w*iRk`bCնC)  ˸_tی.dAQ15SW&e P'y?Hp*R^ν!|ͳ<>W*Y+gKU?{eR5EIK2n0WG_Y'P^Zⓒ8 2u[A%k>Klκ)QM..ZZ>uo d=0 JK+C5Kn[]ӌXVdqD}<ĢTH;CEkLyY[Jg[)r B;8oi6-*w[BTrWA|Xc^-wP3Q ּ: ";DVЙN9{)]ˠ815:]n_2dqwߦ-Vqm=&5i ë/%C-ɞ6e1ÖRz\A8ڎIPu_ѳ6q-{51WS1tit]lg=6߰(Ջ!c.AOENY}zfY"1JdcMbd bol)o 9nAΚ;8+Z$Bo%4rU@'&eXmBSx1mkƹaw R'փoWxBp$ʓY0Q؉FD!gfW\+.'gR_Nt4}Iq<Ts8UaЍɄaRaaVJEL  z[>#LՆ;~[ ͧ {eX`\Y7O{HNVT2rA;' tJΟ%i^4*" 25%gS7:TZ*^]wCzF~taFFz᨝ΆguF$>Akʘ[*^dv=d`x:]2{˙# IV ֢X,6X9+%)pN,4])z) gI>]l'i|JZ&kPNXCUܙia0(bU5qDY+$ɞzn{Mz'3A'^TX?$jQ6pv">j9kz;[o% Lt|b b'~=#ZBX:7c]]|9Ral6Al2yX]3C+džd>_h;̞G/̆a^i!ib-l [!"f=~P| HF_ݭUv3٬y'ѺVH"&H‰7 ,IP-].O,1õ3TįU0FT7w#SBw%=~? u䂙vU :/ebBq"0`ќr 8_:js>(zm3x^?M=%7ք6."zuc" fk$RCY Z\pǮ9:ף7\NlՠnJg{; PᇔB^ֻ~K=>;OOդܺx]4jiÆB|jE_2q6|jz4*HB9(ؗ`%m*j" >dr1iGPs̼naQ , \IkQ.8bĞCx"2RڵuЬ M$N}.N .(j$)gQڇge[a5%ʫma85S_`i%z['D_޴Dgs+w[SH>y.3]931("%gX|o},O9O1* 0606h^~̷4nԊ8l[={FTqLU6j1AM+JY7AnWśg&0Rn3hLr.m0ґf,3GfB"ҎuA^i&qd.%cIrT,Nr{';*` aWJfO8/E 8'*D!a'?dcVu>2Hd'.*-oՐZ&!g`W :* Ug]R|~[Isð}^6~# F;D]xRf!Ney ,\'9A*MziER=VC1r@~<"qDOWE|4?hB1%>G8Qx:/}-?YV;OkNa?  WıJHL0w,DRDS Iux1 xBk~qiI6ki( ĕMWx~?:t:fC8A5p54!Hص 'j&RW=adt$m&G_kا)TGtn JՐ@̷ؘɢ=ADer4j@ک>uyIG"e-b D\g,(MN@bx)UfANQ|veZO6^+9-kR5|<#Bt91͵k萸]NkJ,ӾuN0OZ74iN&]c5}_; 3LӬ#EIKYܔ-7FGP qovyP; +WD^wSJh(!!؆ߏ{VG3r,^顔̢>MuU.|'%ԮJ;5bXR̻jԙ2 "Hq Z-;)_A_TpQYX FFVvk<\1J}n`ކ!vH"r.cy2R: ,iښú]6m;HW:5)3EV#h6苍󘦍?3pέ%UtHQgmkCGۭo551 ?%tm qwVx;/ W^mAk7A^s"EI;,7%va'!&'p [+ v)nbfˉίwD/uJU=ݺpeovQŻ%럆:r  gzCf(^b١ZpmWNqZОJM7izIjqxZ ΩadEj}-jP SCȥ6ab3MDq-bYnNAFH,N(G,k[A1v6eXt 48|K6:y=n׮ Un+rRq?Q%~h_O P4cֽgAdjdXW # 7SMʯVQ4*4p;> stream xڌwuTk.!5ttw)%54 ݍt !t ]gYk~ 5:)$sffc44؀ dGְtPk,vȈ;!4 #g" b`qv  #WKS" @lrB{8Z[8C<#΄:@hibdP4rB<& g2A'hlbdv4gY:[@N GW)௴JFcAhXX:R99 bg r@e `<6G/Cv+m<,f6 3/A#'0D"wF)QU$ddhidiWZTlk svB+> KG fYڙ= HV?Ro9y!9@&9d l04A~P\AgGןF(llSKg1udL;@B6ϿO93xѬT5%M_0spx|6bd@P3R?@=-%0dA@oװecwLR.66K%adki8CA Y - gA.+lY Q;sh3prCttX:X=&5Z;K; /dL!ljd:f ^%L;7*v..d9MA3 Q@2Qj-7U/?*X%E<@o` Ċҿ X~#߈A"XElFN&٘sE4*$?T!>L@6 3?\!3*C9<ǿ)ɿ l!rE#HYML66FH@%ѬrFU 0 .un;H,<-@vH@h@HV@HRF7RJrveY?"GQo6Ę=*r=9B?DYwRA{?20:6) djG ?jo \,@=C\ɀ\(<Ĉ7HN6FN;|ȑlc" qvth!={b:L\!wu~A&(``:Q7o}ܚ/.(16,0J$W)9*5С$1h´}qA`<׷:?H*)#~Z}iAm96C Fqn85&y_5ޢSmt7SId> 7 ToyT#.ɥR쟯dc݄'fҭK,d~z~瞑;Þb9=fH%Z &L|A;r|_&DSMŽw&"sC(rZ?AL=3FEތt{󸾒RlܓiM]uN{vk&aCic2Zr)XWpttPW2e\jznqY˅Rl.h'tG!h=N1( Gvc8 M`>&r9#B$B'wLfIתSХ/,g?7Ոs=z3|_hlRRLfz3eÌ݋6wӁ"IU4CXìs?z(V'lHPfO ܹN2%Aa5Ձ+h]Zһ"t2w7EKHSoYr?Tp2/g$j[+M췢+|U"їLN>(Nϔ|2j>ϐ1yawUx=5^q3FW';Z&\xZؽ=IQ7xLorQ2/y3..ay**pb(?ώ0ͲˬaN^xof IsIizEw\ןD[S8I(qcV qrV6U|^ތdMqׂE~ y1:Sҍ(WVxP,[jw;ޕ{!L.#!TeϘOiA2b[Àoe/c~t.p15I>b@r;dIf0ّT "Y3c ALApvBb1 )+^}Afh YC/$^S[덮% :Nܗ5;ԓQ#I+[?۠?0e>pWv50Y,KDZ|s5,I*r$ x,9Di %*jW9=m9Ȝ之sXlV7*vE[ LQaEIy8xP9`ҁ;#?ˎo#Lg$?TfqF$|B9JYdP)Fh!Ҿu2µ&M~f^yf5U C򑜍Ε|3N> Kg2ן"QB+VHYUԋ2Τn^/ JN!H&ϑt"+-Mt-ԆpN$v u_b6#gVfHR,,8 7e)X࣏'֯'WJd4:n\A&^Fk l7=n Cʵz`'ۭ_"@1ڨmhC)rEyM"HQ! @z{~IW_ԶПTΎ$phܻN/c̵fuQ#lrʋ6L 7JJeO?V/5!U4^(aPJ:%m33#u󮼇֯2b7,&?0 0T4n͞ʻq7}nuO/\k38l%E?zT ?󛗅Ph).͙k漺uV"]8!9] wSK/ ,mYk _Nvh{US%a5E+pg!kQyN4/v[L5Z>M/PU&MMJB7vHр$RVVje:ϕom1R!(/$W./$|0UUK{›mk(J;/Z"yhyq0/H y:%d51W׃ߊAM|b7LLn w`+6mHjMX^zn<;`o ,(Zk6)nq`|Bϵ\ԈT40>8=8Gcx2[1io #?0U_ pgN~tՠ6Ҹu3Q7bWFqQ3M;Y/1BLl(L-}C>Ekg8 P/|Hm4^z @~Lcp@jel-ǻ>w]=)Ka|^R>+q\:jyfN NUiaXVocis.Zhڂ[i$0ԓH^]P,56wjLzz#R3K<MJp榄bgImi-EJT)'nvOh-fh@#2H8G%jls1iߌ*։NXxfa;?DC'[$>biɥStOv}@]ɇ<{T|m9ܨGjZJ>+'|fIVzh\O ֡*>tvQ5׳c085BRo\]QiܗzD'^8;|IE~7:|m`ď+={qwb'=ұӞ*9E a8/^0j4NCuX걻6ΦCiS|gʄVCnE['^1Ako=MlWv*YRƽH OxhEVS!;b-wѬ^~{]f݋G/)Ӛ~ ʲvyKH)hK2HP7ڼ`G\J%Cf¹Sf(ǕdTBsW]DSRPb,LٗIIyįڝj^?'G&yn蠥n?omt:>~z8|sjիT-LI6p=#\=i/yIDP 4Uc%ȆBYh9!ѯQ az1;ӎZ-cDP,/Zh]Ь/xp7 ٳp7m_β%6LQ{5w"sO& 5XXGH/LdX]{"}MMt< EjJٌBd! 7|rÜy;ןW7+l.jrq}IzМQi!E^4aϾղ]mO)پ5Ƈ!wlQDeIfdG@} ʌšȪ T1Y393${@ץҥUw ,&ݓX Qamog?z*}Lj g:A|kbW5 GɈj~jvݍdż&,YeWZgG7Y? 0xWAЦjspaָP[Ѝ,'g0o0@hh b}F?3zD'@,-e#BsSTHWKyrq1Ԇ 8۟ۿ 3!CG.oP,3.9E3^*\BCVH[-RD.њ4嗨WcMíw7ߩJuڒ󳝭$8<.ufyUB $e'zHX93(1sF6֙>2PŐwS,몠s$l2CM>T7H<ܪW[Yh:Zߍ$zII PrُlqX7jenޫށHisrTҠ"Jژf$-f%9]V(f\Øu(5i x苁)_58~zvϼ7yo="V1o3IppK6G?ӓ 7Ừ=?I3i,Yw7pzlJ^k <dz61@fÎiX;^ap.ץ;f϶ 7[*}C@Pmkq*æ)RB5:^*#kY M⡕YCv:KY=X)k-] Cu%`8Z=vJ,a%nréW_kS"O׌N)g,A3JR1 ޽I@PG)[u:dJa` ! 9uͳ=JNӟo@_/ I#efE/9M U3R|CmI~0 Qy6펕q?}6 E4v~qICFR<;7' :ST_o7'3Ex'%8 spc4qv$[a9mYIOd,  ?i' G1ĐѶ_E$dEr.xCjUW;ChFg~P6g`ne. (h~'wfB.Be۷_jzIDiT֨8aApP+C(̌_~Sh_Zl_[<|R:jT ?ߗ˲vض^}?M^[exѬ1Cuggf<">ͰE=n,T$EyEt]xaH`*vm.9 d7+syЭhŁKg9"m9"X:y87ꪅ &eñ_so*ps/`৫.7lZ.itMSA!1s収}MalUK-! 9@['́ qg`'djQLcbӐyr^m1@~pc R8+םVUs4D.>N$sŦoj͂(t8G a&mApEra'4?IlO#ё~Ŋ]w-^ d!:+OC_UAgܶ_!#>)3Qϰ} O( ;)0o劊F¬^r ;}A/EAЛ2P=9Z/xcʂ(~U,NM C"Czjp}+?gc e?$Z@sUͺLF/f=)r⼀eҒ}ͮLŲzjIQo`Z>qL>ZrK1,B2]& &FZ|&+1 =rmJЋɱ$6j9WU4E򲓃-1 k7ѿL8c~J3n 8TvMjH/yE4w~ ؝|-{%n,ASa"_i5KQ7XvjHh(P{y_D 𫝓6s+{Z(QMhBP;ja4 e.R~$a0^{ݷgUVxzg]~ʏ.c$DhDw6SVY_2mb__Y>B*d洟(İ\ vi IUnּkASnz[׭r )|kXjWzxpBKO{dSw?ݹ[郂bq!=I>v1ƒ",R]LosJ}Ԭ9D& u ǩ&蔰`Š/-{f8^n5O{QqǡV(1:3pijd;@I #5r!{Z F6,ɒIR' uzELzV+b]>as_qZF O"S]Dɦv6Y;!MroY )9bv85>y΋K[bq-6QVW6a2|^se :Ո剚UDթ@`'2j6SrO )Ii67L7=tq¥a;պv,גf\Z!)/TBՇw;z9bū^fØI8|?k+5yݙu]V;VP4X$ i(rOl'c|RanjaҠhF{Av0z7BAi'$c&sAxq'88WNBhq| Ŋ.I*Zr l,~X &\qdl0ۦ'Ħ{?;\/8%E@Y/2d/Kk"yPG%0ԌA0ִp!WM*\Mw[ ?ـQ+f(?o-5M x5~~1hP\wE2W1[O_:_'q:LDÛ]Ia7Fxx+]NtkY ٢hcƔXZ36bn(v۾% HyO+=ZJi< 'I<:2Ss} !-cd:tgg}ՒYwC9 ɧJZb7ͻilϬ??ēk,<LK8ƌ$Q  o-8X G"ulPqkR+ smٴ 3%>YYc})A SǔM4y:p4fZЀ1z?f%M譗e@аD,`WT/ρp٦B^qfr|҇9YuQ> ß{ /3wb\NSUٳqĩ̮͞^f>b mJ!ˋKYg9l[}81+!N+a:˼8xIǪoZh*{I{et=>QeG~a q쾘Dv=5:P,OVh1&鮧抃WZQM1S) Ye_; [=r) \-֙ 5o{k2Nˬݏzߦ^%v_$8ETx|ٷy_j]Ohs.HuW DI3DFn[R16Egڸ?iRi¿$%Β2MygJQ=LSvs.w1d"es R\OSg8|dGSxaX 100m, `w&Գ*g{FFv oTn{@=FgyLr>UcwMFw4H/ Z k ѥ{ Y-XRʬυܬhz@$dͫ"͘! ]IJNg0~UDF@`8Ta|\`L‰e=ըDصQulE秳PCc9F&ii"+x씁9J.2nqꅯ>4c[S }+p$q|U<U:5 [bcr;8iR4jE_jvgѼ[ bД+u=bPPE?>pe$khӨ_|ȫq-1S6+ Glpp o0Y?Ale ~-m|3_`SJ= f''2oq_f5OfHU)MɭpE+E-i,7a6Egce_rUM;568Yzo|Cs@8SENJ0T^?:b@)FLZ@jPb3]*^ =\RyKu"gRqb(A ff_uw@,[/3} =hc.;[e< L}F3u˽jͿ.v)/K5 ;E'@ڟEy^2,mO'ai_V '-B-/jnG(dx1_Q̟ٝJzOЁPnD ] XןlnHUttvJd'5h?(pކt>7w,Uj?wLLt\]\  ɛ-^ P S?,pf'7r%e^Svc4.imr Hu)y>OzwXoAi!u$ QVX.l6NW΁N4uHMM(?~%X:Œ]ʬ",+0EKf._ܡtWAvx" /XP7 Z,Ho~!?rH_ՋB( 3s`Eu)#dk<`:b[8J!VB? A_ߖ(PEx'!6nfm0j2)<e7kνp`itJD|OsovxN=GGmmRbsSoR^/O}ed ({Ӛn1{ILץuQ*(7:V/;KSNjߣR@d7?yΕlDIx6BPG-9Q/W_zɳ4k5#Sy"@9Tj/IG]S~7О6D+څ]67LF/pHofabҶ*Rv6 ¤KSaC~Y U@(xsZc?L!u:67PީT:,DX; mid(LfQ.,J:hW\ގn:b}|.ku1mìKt.**CQbė&"hu9!b*Vհ!`܏Y endstream endobj 563 0 obj << /Length1 1384 /Length2 6063 /Length3 0 /Length 7005 /Filter /FlateDecode >> stream xڍw4ֶhщ^G^CD`0 f!DQ-D B$D'JK$os{[̳vz6&}>y; TG A !<66ꁄ!R{@!"uD5O@P!Ho C PxM~@ "7_#ߏ- ());wzl!p@rt[2(7?ɏpa(G@zxA_+ZWG> 7-IA= 9@__d*N"\ p_@me ~~!.HM> s~u͆CzPH~$׎puQH_)<7+roߖ= ngk ;O7p'TUƅo@ 0u>AovwC7k@aЛ<$ <<'(lQ w7/=`>~_O7 C]| }**<VWPA |B @RRYF3_{}p!.7A ۛ/3HHw/\| n뉺&F AR&QUF p$ P/_Js:$׻+v#/[򆔿CaKfBbᒐ(/xG;op&Y/GxS1q@ے~[hbqDoP-8V:ܩ&ZΛo#bkLIO(}"Qvƃwk Tɲ:!󎬐\Rϒ>_~(xjҝD]zbk3L3$N5S-(>%aJC=iB5ab]D}01''0K4P}z,,L%Y|_z{R Ի*"hԘrHRk@+˒F>`lvfza`~kkAeX˨C+!PgM h,jI3(-5Ѫ_XjC8nWhK)~v-1{E 6~yB\j r[5Zlpa k ԓʰ$`{5MuIJ1a`q`>!-$~<:h8߾{Y,,F_.6Ͳ|`cgm7)z9sǢ'IY*bl|(^ܷZA9:e1wb%5ۢW9˜,]1smVװ.dQ3"_,!LV7UUǵKw--sa3?!v wzvgWY0!bKah4+mW>͚'*-MlӸevV_RcGs!̊v昺Oox=kmP|o`D2o_l;}RO6h8ɽWaN?B6@vۄrsˋ#%>VoS략=vfL !p̓II -huha/J߬;. wvC_C 0̾a8k"AN-wb<{̆J4H fːNuҕ7Rw?#kO3-uZi'5c7\G:22mPIu¾΀ein(]:챖~8]<&i/$ a\@xCG?^cdEI8yѭ@{ݭ1>_n=14ԟ?:[^P8=o̕huTTQS62nnJɷ6c|g8rRv՞v_+rPf`16?-_v<3R}m'u)?//6M:J7GjQ>izi՛{B'i59hդV!QNeD5w5:W>=Y7ŨbLuR+=0QDUvj-ߪ"FfbQ daO~&GeUp;ݷyIzh Jg6(@甿&z'6rPPoc+,]R0U#])W䧨DaG4^7oYgnװGjI6I,}ݔyA4ިŸ.P%,W o,͙zw:iq5e3tՏY/w[l-"uDzg,簈Lލ1K!}/<CU"SKD/)Gl; )UJYW( ^)CY}@{I1HQ])I )uty"J^~J_*7@el,z*BZ;Ge_ 珮wu`32<)MwP4 $rGuτmG3W`HAvmp70sXd_e-NUCcxH%1]ؐLH cj޲jDu w Qar?e,Wnc .ݹu2>gd!U#y뼃QzU6ڲ{'ÝLa5ho{ߊRE|L%sJ\{r Q"tx[Xq²xZBܮ [nvO<лte"/Pk$sݾ #k( oP∩g.uicK,4H1ew+Iŕn.hism5a э}{Z/릾)of <6]]rl.'*YװχX[22(_. tSK@v֚goGp{ul]vQ7H, -655YIWUPߒ pM'%#\t엠1|#UnPN{{C?12+t[N|Ē<9h$&AD)7N#$<[Օ RW$%#CwְJXGs(c_հWwQڅF{m?^Θw5ng9d>Sn6 ^3J;͏|dNU&ɽq4Szjڭv&[]ʕй+y_|q ҍŽ'Zy#y=hT =*_fjn0]0N1 cڂ1 C秌onƸ;Rd3:=7f 4x&3fRR3 {҇5xˇu`^.U| pT;Xo|OVbCV~YM^RO >Azeޑ1!TQJ_+Ƚ_ ']!ے_ >PWˎ ż^ОZ1 qDņ줥>@(٭ĝQ3 ThjIQnrY%eE{VbObhf#-h4oG˓|(R:wԞ?LIO/ǰ<^b+-hfqʧ5v90?Y&)y$Q*Jrzy1÷. ưU6v'Ø : eP6؝*P li_%EZ7&mVrR^~̊FUyL"|el%<|*sB:'+ NJW`?m>Boo(ɨ \$VB?zz!N:_5JÐdB0/ΣUhTN.&L")8nԺ:<,q•``{ᎆ-K%Ѽh=\/7-2L铦\|jli6P]#l4yDؙ*+͞SDZ'6noRYxʂ60e)e'>P OO{=/RvN~:;Qe S1G\ dr3z8J_VicjNBä1a5m7٦$Q>|N=ydǷfƵv;Rh|?WHk{14r8#̶%{ 䣒D}c}j.eaʂo.u,{Eҭ ?'w4|=V[UwM;F'/,Tى̈_H6E/ڰ0I4M׌Q{=h"76c6 Qؖ͢ Jcoܡ[c6#N;LŎ"KupNu/H&o; |b2etC(~` ƪIckƾ91,t:DO`*7ㆥrU&> stream xڍvTk.t#%H#1C HtJ0 00Ct7H(JH H )"-!9k֚yzzp +jhF,udH\#1F`̤Wb5Qh@OkO/qΥƲC IeRsG"7 %;+4Vރpwo&"5"^p>Ö?v_*C"Pp}k@J }ua)*%UQP4$+ědIc{&1 *Bc!v<Jk7Q_&b{ؚ91~CCo: m8Pd^#kJ4?&~>d+cIן( c:ߒ4QXP~dC HG-H2FecI`ɗro,LU|Ry۲:Rsbb90i]-3܍5MbGJ ' SS]Y;w_jK1IdfHʺ WIP(EHn r}j*co-$5&*<7q:@=‘zpՑ[WTiv]KavnV\8/Dxp:)Shs679_g\ d, +^n: lު:8mѬPw+]r ӸRԨ5\B؏ȤK3])R vnl]eܽQQ+d0f-ٕQ[UŰQbԔMB6 AC ƀOfhyMWRQB@,vcQ>,gjјJ3cOS  ܳ F+Pe*w뺂ju4Hb]&6B_=sp7#ð!Y@ >7{0n|mKq9Y/$Eپ[X}C*N4^ܐCL>M)eh@TRF%Ɍ?dc:/g|ZwtƵbjbƂidreb(\mj9Xʆ0lESzŠ) M #p?0_PnxI|ҋΔY?xf_U0uWFK:h#cݛ'J |Q$W>1Pl,|JNU䅯ԢAoy!+i~0ک0a~%:R*n#s0/ !Y$^Zm%W+fAБ??;~AxT``,I.:7&q`H?{20yMZ0}gj|:,nDž{̕q遂bΟ}y Y1D} }̝E7, kl *.ò&369:Rؑ9mw-SPv">u᎗Kaxhϑ uNCV#ލA⻩;9MT\d%b;_~}ʧ?bb/OHaKeںQd71fO w+7y Wd_銶l 橯dLKaR\w@Z_wfn\[݌걲sa1^gli Z`xqLx$oPgΔcYߐ-!wzlv^jP;hj*jg[M\fe͝4['׽҄V;8JMnp|Z˟S~Jm~AMCԮ(ʰ3'FK?:Q&_^BbRo=fC>4:>'D,!{|w#QY>~bZQE> +7FX[Shl\,erߦ\QH[&/V{7&t# ;#:9:̡JvH/yHr  H&_>W^``@(i:ȡ"$-8)ʤ|ރGF.⢇7TS׆#W;jyFl[ҸZ72loA W_fѽ{%[eXt<.@U henj9d;ܜ;l(oas9- Z5ugBr?ΰr5YYV'Jm6ŶE/w/a-JBau+Jɍ2V9XnQKnM.߬ਸe9,Qlڪ邢É\ L &W^Vd̫ewGNH Ώ@v(^Mw!R1RmEz^VCB:3jZYXFv2^w^bcpJ"F~=B Ɔ&vUYzVDܡEo-P@YMoM4&˜E'wKKt\  -`m4WMervTf9v? ,9O3go>uU-4 q5q\!!1g#b)LJކ< >9 AYebBF9R/yC^voj6Tw6{'!_SìWj8a.[G&qۨ;Uɝ6u?WqkGy.gN_c\ُKI?ܔ7^>5K+354[9׼naM i,6L`\f"y׌i?y|LDƬ!}N|eNoD#YCfo\IK9[3-Sҿ𸘛~5FNǽ'_#St^=g1)]:Y^CD{2f߬ae9DK8GG/z's:YIPUԜjXUčkɾN> ㅢ8 =3\q?jV͓\,\_t?lo~^)BLCZz@(e`grOsK6UO$~ֹ3觿lu3+wrJU ji"1FpꈩH.(ؓeI\oٓ]9D1tE^ -O<)}QRLs1;4_|ᦘLfsBiORzpiIy BRܱ[ :T󹊎>}%2(O522_¸oTT|aZBD6Dk?X==ݥsucђL4c4mNΜS7̦D߅gMo~xrUգ+)!IJsDix$>] +_ \1jB+"?CuJ&:Lȷ+_CgW'ģ}sllHoӯQm{ $A)$dzV @ WdUx}ePN5Bfj9|qGj cX pѭx">k=Ìm-OY7ߎy/Ut0ѨRbߛEϞM|s'Y_t }Tc|YI~:Sɧrjj  aן6Xߊz}1[#kc8zrRl1EɢbEB7`9직e8f˔GY6(_*AK^,U1>5v :N"*z1Iuh*c `cqzp|M!bYpf7(.JRge\C搓'ꓓ-_|3杉U0U-ӲL',5O 剞fhӪnU7}|g{DX.KfI; @#yfNS%YZ?Yp{;Etj,"Ray] ,*;ig0NMZ_մS+0?sXo0חV]["yZ=lX&"8Y1uCF/_XIȕc |;"Sz5kf*z G˯%C|/םس/Kiś+-sIh';SۚIZ7Ό`O;ԏjx8r:2 }棲|UDr ]F.g\ ޭy==!9 &<z=@[v 03z=ܵXr\o5x,WSC= H|^]Wz9rM sLݜG VU2#Wmy%pxie.}~GwC;l}s$E˰ ha| {WNi8JX{}37C^xIA=@U}L#jY.Pn(\4G7U]t/0zMjAd.o6-xAH.&PW3&R8s\;&JF963UV/p>'ϓ -GeCƇ]nZb)hqL>-v+|۠ 鎁,9j']Ԗ..<P7&.0+InY=bGKl܎Zh,5NW5ࡵ)~;|*=l/ЍWJ1E 5 Gϓe"EQ"CXS 1(qRwII Ow!#tǭ?8l>iyiYARïP/.FI}|LNHY endstream endobj 567 0 obj << /Length1 1385 /Length2 5961 /Length3 0 /Length 6893 /Filter /FlateDecode >> stream xڍTuXIHO$6fñ9BZA;iDDAIIAJnз~dz纮>χ!=Bbx| 0 @66#8'`3(`0ʧ\AQHE$ P BK p{6PQ>h_@N(,..;(Cá$Pq\uB@C*qqCex^pC{쁿@\`/`90^4 x@0U^ku]a?Zxܟٿ !P(#p Ň!H_@u+!@y} j?7tw>w8ז\2^CbSaЫ"Q^H?ik{W~c$'A Hs¼N~W{c]Q@U`p1h??`0`p$Wn po芄` 7+٣/_GP[S+(X^Q0W@Łb +ANHPNꯡ=dB0 ? WS/ Ϥ@Fp_ '+=hTo)+S@T!tD}pw7^:A?ƿ$#az(w  WJgЇW+fdH(E4+K_ @~>$ sZB~ݪ P4Jf/_oM`0(`r u m<]"N=~ ;Ph}өjCp iE#4R;gQ(h]g0~6B '@&kn;~ў7\/CyM3U֨2oLn ]_:e8R5LG`9c%1?¿ѵ '8S9u}6YwWqׄi쁵RT?mO?c5~;3Y ,Ÿ/+t<-yT(ÇibK xWŚe-lx٢ mequpu}  t};dZ[0Nm۵RзqNO^2PJmJԧޯק{3];l{-<$aO@g6jz.YA Pbە!]hWW.D`Se "&B-Y7 ˬ:|,?~[bqA'ld yi;BnV<1bmp XDg_4X\?)xTM@!&>S U2TKx.'n*.jDHUT1=yzm][־_c=.4$y 'RUHjNܙJY&-P@!i4AA'=paVhzJ˔xWTtF6wrl|#qLhnRٜ躰Iyq -Y[\ ! u%dz˽] "b̧^MӸ K!Htqgw3%K3L@zSYPMB^DsGpLYC:4#DeJE%KOTq 7:wx^2]|$މLrqzn YqB έ7Rig.\cP]Hb(נW45{>Ln!;N yl9'˺5řL &1XgWqc3,xgO !3[NE bDOiaƤ)~r~+v{zkLNfJ%vBSu%u0chd \`vPr}')~֑e6L袂 WF#eu|`'"xtzPp"3lTd^v }tb{b_cۖ/gэ!~hT@zo>TWQ8uC2%TlEI^R<6咎–?.] L,ܓ,~deGS2Ikg Na׈u"oHỌ83ZX9Ckn'~ `,g0#&Y9st{ŪDQBvLekxn>V3]8樃iZ}s 9mK3hSSӍ'n܏RoP<>4۽gE=kQb+cCv >IOJZje Сsqo Y4=H_.`[FkE|י8\\1@tay`۹{!hR-8oZa|ǣ:Qw܊:XL+&yG͵R3l ^[+7ޝKMV,# *ួqv: س-o&:;߯s UW6ͦ\hfH/]D&-zmώ(r$qiKC$.tX+_M^ɅvE}⭜V3kvb̺.6d$9f;wFo}EGfJ,?$xVZH./Մ."N$6h$܅68cM* ҁ.gmULZ -r8%M)=zk`cϾ=PLe]nMtVY-Uɭc6\V/V֝.fg9:y6F<_@CN)&CCiumr$~ lSA~ "b6[2N4#kMO~'eE:ӵlınu];bl( ^IJ\KgH^*;u菉Xxws/YG [a'3=Ƨ'_^y&u gH;1} "EaC/79m[23ueaxBZϨ/ܧnԕX[ :B-3 3h΍o)SOiE_^|(-\n3b_'>wMtĩpl\kLeS*z>!!"K5Mޢ2xDc̰y慯&'yOTW,/0uic^/W 4FA3+ft$o=Qj OҰ&\S;]Z w`ePYcWU {46CVUå.?T lLͨsrx;< I>z]Bw;41)l_sx($XmD aM1.g|asn'D|Ne›_S»0>Q{W&Oū԰x?GmI4w.8xP>?%. ?R&"(|SEFQkFejōGppk&2[Ѱq "Tjح 5rdҠ|> stream xڍwX>!C 0J;G+1ƀQ҈ Ғ]M8q<{:|E'o h>A~$PQ VA a~HnG;v؍a(w8!E ؔ h Rjx8%$A $*A<@m~s+"]}Pp{4_@N(PPBBw8PC!6sTB`$C+*) qqGex^pCyl@\``:vh/ Pば@PNgDp`tq |{UG{y/ xB w>ݡ(+ڝkH_i0UDhw(>{iGUw+ ˜ah(D܀0o>N_fHWf?Ce ecmECf۫IDA@APLTDzG: _Fճ4S$\Ab rCG Qs?Sw鿲dT<8D? OhA jC0[{$Z aazp4a78g8tz`B@adu113č\a%3Tc$+0IڰHl$~e-c^( U444fhQ3Ho-kl: Epd/>Y~Ϊ)p H*!1E{7 M,$rxEvf:*ŃM۶wc/ _sąΒ|5S5Kmu~ƌ=t` M͉4D zTs8a.GÄO!tHxd)B3gNOkJijH'&lF 嫡 /ҙ-X-?@@ 0$ ~LJˀ_XN)\JB훗,ݥy%Zb`6 _K T@%׳YFFf^9a?Es4RrJ]|0,~gyDpL XmgvW5jQ:&^QPO鄲wmN~ԧ),xϤˬ>JۨGZMTxطWEŢ7kh"Ljp_=xxI Ȫ]&e.~@ieI^8MƔ&LK>a+SIiheGO蛐jAvMOM1Q7aͬr8#o 58)b²83[] b$ʶ y9u}iy]3Pa)$JeXطqwdP'[M2/+KB)L^P",euPZO^煩OwayzIvb`oq_uߨOZ$($eJyj8%3pQXc6~v ټEh6 &ZsE)5_LG}*4>/Z 7Zdpuze1Mُw'oUn>).ZEв,%m=I@Hϊ7 Yd(O(w QOMO[Ac]7=|}<(dDSP7WUJ1@h7]$zT#wiT/Mpj޶oy#wTDiT$?L 󢂚y]a=2;ѧJԍU9Օ+L[@by g1V@#Ƀ2S%Jo,YgڭRrjvLE(aKL]7=[Fl.D4qÉ!P2QvMVg ~2yl=W=CH¸KkT`Z*akguDibA̋F-_83XXNHo6߭Y|Wdi.⑒RDcQ*PkIDU6 z5Sij.zjji_s~{qg~*qaA\>msy㵠 0ᚄķecl8ʃW(U2,8>XK'1~8sȸCRE꣠Wc @O"1Ss1jc5a R O+捖I +.m21)J}u{]4+fKnp}6(aNE,w2FSNvׂ/srX9Uf_hn0]|;qQ=]9}{]ijA5ys-́k0q93ȝ穂,A/8<³VdĴ2`5~-ާJ?X>dP$D q+M--LhY2)H- :W[9b Ӓ {\l~:sd~+£O^AuHAF#y=$ fzs2lWQo64.=Un&3GoUh, V.۷]dxmed4iO<ܩAMz+^^ |Ѫ4W7eu1;<2<&݌9|şp 3U{Vⷌ'RxIkxfZ<56=I!*k }84'=UcX"L<"-n Y[#3ɗz3' hAɳn$/k4eΪ6.IgE@ԺTKš~~8 0E-2X?Nyw[hea%3ntpոΏm\PE)kwlxWMEэPE9SBq+'F 'T}ȳdH.kq^Ys vByÌ6%qd>imܵBؽίVRG ,4w(Kd1$Tv|#cpR7',d,r 'gLO4\xžLyZʩIe  nGb&j!.z}ƛU(,h_--$0fDfocfaY)kMQ>JһOAɚ:/&iTGdSUn (6HVi>EkD {$UpYLgӄMȥ^;cc:ptA؍Kw/dݲ4C*Y͓ 󪓱TFz3 V26m*c0O➒@R'OH1} EVv_>n!,bUm͠0!ҾSksKSiRۀ/f dо5EFh@m7;ŰݼB_fIOAZ#|̈fY|$J<ߙa`6HV$els|2|g)mvMVˋ 2(ARIǟ ^*epm.;dB?_X^?㪍 QЦϹfJm ` FДM#On>ۢs?8Rng/'WI/I cv7;?7 /ް8F$Yn=Ͳ)="14\xt}ON~)?Sm&ueyR ̍R !\W4jZ97_IEN[ J~ -i|onQLYgCI|ѳBcŸ7X)9;VthvUfnUohMGUe5#/WmOr2 㟅h $i 'x;!ZK.l(ΰL\wNWi6ξ[!GS<ѐdG|E,[%Q:;GxjK]tх'w}6RY?/Rx~8Ǣ9JAdfv,ٽk@*'k40  * &o6EjLٶ#1hZabjc/ 7T3v5}L̅BR x2`0RPv%$,cםk[BRN Eh|YB@[xBHH{]yl.w2*mz\Kþ&ϭE? =eBUPz9u;D'm:/o-gbZ-8rۨbb?M<_ƖJ?Zg >:D尢hS`GbDMAb&*K˓4TKt*]]dXф5nߧ"R:ZZXDCZܔk}fkWJڼ1_ʎi=S$AJK7 /OoP'np◛z!_ukzÁ7_! Տ,Y,̈́!o(fytwt O_2Q } . -JY 5KfQ&Lwa!qe$.hlb7v٦';IjYàw)?$e3)vNKVw{RӗfS[OB-F&'_2?o472p8*r K:ؖ0G`2%itq` F:qE}N!~oZ,umо낵 {S׾ $H@dr"fK2HNWS SHEUKJ鿀f}urDv:V9 rny.[gD]| endstream endobj 571 0 obj << /Length1 1591 /Length2 7374 /Length3 0 /Length 8430 /Filter /FlateDecode >> stream xڍT[64Ht H !] 1twK#%Ҡt#HK %%!7z}}k֚g?{~Y̠-g+an>8@AK߄x@~\ff e6{@0b(mHL$jauO(O','"@pwqP pW_w#ߏ6;OLL;@Z6G rG A`tD \yyyl\3 R~|?OHaPW^QO]NO>n~10' ; OJyNGlXpr(!O忢_){Bl?v\Or Y/ A<]תANhn>A_8CӅ @/׼A!0.AzcCyx FпUv_H`n㋋5r%CN緘<08@j,Pkk #w G,ȼx_&& േ &w~d(B'RH xBWdćDm~ lꟚuZ Owwde<ʿ׿)0 ]$"Dt\Q{sobv&!X^;jbL[۽y;_59@qp9c6/t9SԿ.]8N0.,v0E ݌5uH7][b{@9C&5"Q.k5ބi1lbNY j<|Guß?&p\W#*:CH %iJz йBEF2#eK2t@{ʠgB}MpYc\-\ϘkP·k}dtOwZ MŦp˯։9)|RP//ut#O%3$T$jh N#x^C`-;{LSƝ9{vSՄ?q( #4VII uۻT$Le' 4PqL#BH*h_/V x!"! 4qtOQ[Q}ɶGؖ]eڬdH^TraIyy}ӳcShlzTOiz&ufl6RL`V?:^Q"|0Y}TFchό)%yg:^A?ZI蕗^cr-'nԊaZ1&+e'Q-E&I3u4o׭[jfLQ>e h_|MO8G)t?5i%}= J|GfIؑ5rWぜP|K @iɧ^6/x88E>}}Tıx2qWJ J jLڢ8{L|k~"{֠,ۣJLJ2/m6ˡh]'>XST'r彯$'nچ}j*[N/W'5$1^VeX)#|>c<=EG\JiY+AU9)+ekѰLK~Of5͕c6Bċ`\.G alv@Ff}[W4:U=(2u 'Bgc$'';ĊKEk#?{=YN|j_OщDX)ӈt֑"߿5/A>•ɿ:~ vC3[dvyl~{f9̒yrlA, Hhhex˛fɞ`.u`a~,SP"i;E?WN8[X^SS:줺ɋ  ^Q@Ɂ!قLx ͘+lzJ|0CGf;GֹUbjōnm.dVwዎ%^tbxOUS}]%iN|yG#,?(02?x3le 'i,4gas}f􏶗%pc-[|`yCz7^7q^/*&\gLNnYIIϾ|`}s>l3D@To.( c;pozm" }%-z?8 J..{zZsZ=|$ڵ*8'jAWaK`QE8VAE#_yrOB:gV-F8jH=~VRW*#QZRnCJ?ޥ)>ӈX{t܄?VJMqT?[NWc߯RηmD@To P B}<ƴh#uc9^I](΋t|"Iĉ0& mhCU X-сi;'_оF#V)>8( Sh4QX}jKϊ(r?KpQ/;k8pa^rξק U<3EhO;;Y%'L:W0x/  DB8=^ oP)t0ކ2[*tdX4_[sk% Al\޽:JFAsUՇ8UE0ykUz='z;~oZ獋zjw]/yЧ=* W|1,յFn9]gn &_L(Wjыɨo";|~AG:q_v'ͱKEHY鑸^ d>!dg?ixq= u=+ۇ#if.-\W-[*~!b0ܳ̚g4D<;C#Lն8TFo0#e7n Ƭz4An-3hWn*XlMt[4HL,I 7BPƊPHDa^|F7noƏFWz'袋'^S|ĩ>/>]y^\fƺD` ꈒqֱқɗƻGAu9)aR3ߣ|XMva!>)ۧ͢,Kic.òcP2'wSF ۗE?:Ϥ`H^i{ۤc햔w"J@8˩YDk]7}3\5R%bbf'ͰsX>LaɢQ\4H?袛گ}pPə"x$YC2p'T̕ LclT;Wp#K|ɢDXZOfAq?DJ2^- 6ߍքMqAc;khԹWw9U]OR^k(N&ݳ{ᯔJ:\@MDjH;sfrvfܫ!E?ٷ!jW@){5AvfbpvIp>Ŗwd?mX]+}Ķ^cͼ_IMTСG dXi=ߒ⬞q?TZ94CL.:h$dF!՗<];Y;@%U& 3V*MUNI,!wNZN7TD1HZDƾ Śyf+;+s<+"֟%p#Xj/V6Q4M= t=S<:k/u9(4V|fxخ1Y1e!VecC쨩s4$>`3QNNZ>;!*7*Ū*-_ZZwcKJ.L3Ud\|'>]fVj<_8/Tјun0kAWڍ Q>2 [‘LOg-VVUgYd0 k1ؼ FF*9K_\ӊz弞~eP tfHSRڤ8젌*v k06W؜e+EczPḐPŸ$|YD\[W[ְw|H z$ "͵fIu2Q$قt1Ž[$ yVsFk=/E׏=b OXBnމ̖oRyɃ89eJcXbƭ0S5-q^D|2h_ŬKt%E#5ohKI{% iՄ9}# ~DM=sjaG*Ʃ$Rwm oq7w%vT^&Q&pWӝllwEet ֎_1uH{0ֿ{TBR/I"MG7}pOX;S]&#.}SϊuX ﻒMzpHݩ{tD7,Jmqnvwv%'/G38щ!hz+kb( o+tdR–w^Q3T}ZFʤ@1NgM'bwM親BʨҾƲɳCfӚqOMֳÅDIWn1cpUzx엨K*koDc;o5DqZt~b mLbX|c[{y R;tr^8k:^S54Mp~n,.|~h6兞JF FO,%p%绅Z2cV*uegY_lcPC8)(QCւyH4̵El]_)bq$CAF_ŧ '[bާ1v=i{ss6"ȡwj9qW\,Ϗ$}ەynBp~hKN6's!.{ƃAVaAt" ڊa?ӧdW tR^Fzʼ[R o۶b}U\c4n@İ\525s\T-f?bj)%yyWdk%@/k"gS\F"".ͮNyebʺpDH-Je~!ލ75Xrao8 zc+{.Q:a+tj'6*m3Uر]mYB@fbrXfo ji.QEPxCgU.8A(:.y4r2 y(̏v iǩAMVvx u㺾Ն w,I'Yd?ݙXWWo$co5j|ZYS4[_R۱fr;[ 1J;*N+ETԐ?ΞEl1U<6$'ʷ(q8+1V O)#.FZx\N춂ڽXnX=zpx"!CAxP,Uۜ^>%ݗ+kt?a/\n—ź_TYwƾ<6+h8r'e_6,t~rs+ǷKJI4i"(|*x7d.#ȜA#W RyAwhlW[{;=pW*M81 Nm+|V%,5AR_6CƝKFa̢^xN)vU̡>[@+:]3xx5&d4,34$eTe Yzߨc$8?D_?PCe:*4!ܚl+OHrKC@d \6O]1n4Z›lH[컜QtAxȓY~U 5abW fk"s> $$}.2}J]7:=8D<nӿܛ/c%`*+ќz6L>#L4b}S1~3oοrn#S t&6h N6a8wэs2x:Oڜ=x^%m~`P zGQ8Ʌq7/G$x %2`R,P;yԴ9dQx}[o.>қ?Q^XbڢHeִ{yd-:c6 j8 ) Ca<9}7/Fi +Y4F[B 0Fo/<qH DH`\4 \2|{1^4 K/B]luUf^Mx Q!=N;,ĈDܹE4z&u5v뀘œ*J6rh[$_ yg$>B3Hߝ'&М+> stream xڍuTݶ-A@%Bґ.А%$ޫHQR Ht)"IX9?ɷk 2mFD@`Y4 ..$p!0X$%Ԡ8A4B`Ok`]+d q^P \0 @ ~s.P CC=Hf*DN`hW7(r#]@; 7NE.X4> E@ߝCw P0H7EQW)hWW O A#fQh/߅=5Mt@h!0("܁o&>nA_0~?7?"iPO@?W  H?07kO ^^p4?+lnvJC~Bb`PDDZ(%% g(oj@?_{_sY.Z?"Ka/oN)W;..üGtK7oSL#=\;⍠rYHD#ws#?/ Q4݂+u;`h/JH I~"xC޿ 8| ?cV0PB@a7 `- |#Z68ፀ'0pMGU,^B_ߓ~d-|{9Kc]>zTIȄ? Ѡu[N\zעʶP^n0$H&}1YTJry vJ;-@9;a%;Kk $Dt0ptI|7;ۛݕ.Q)YID͖۟D0GK"qZ5{1 ix2\~pN6b%HԨJ@ 0naH.qQsg ;(*kK^m~}wYg ?ΓWnw cOHg(|P7Ꭹv0߷/S4L =|zd7QTpu0IGOC2MQK i]— #@߅|v\ܛ?CʂbIBD7 EG߽|_kKMעM;>ATXG6:ax>P;M c,c6M(#CpII̝,3M ueV `~[gEm`R\=H%Ss+ufov' xÔզ6Em&CgpL.ktڿHd6?8v͒-v6b.H} 5)" Rl7f<&?ur*'k`)gͷ9M^бK5?WX|T [£eI( Fnc{|0:3"OX;ApdpKV2KgVefA Gu'- ZJ^z? AN%|Ʋh^w16lx'qj9L^1=߅04i,v_ H]-%%_~- 38{P,0l1[ۋpRR  1ȎKS% ȺaPHsS,YOw=6(~Wާb[MDV-Xsa{d3Eŵ_J;"sajAmNuVDՆ?f*:b 3WxEqBXn=4<mO xuӓgD _ɑn@b{'yxAU,]IfRCaW.-O>DBis^|Q{Z2)ґ{:$&~jy-RsJ$Pʬ|+M%,tXOMTrR!O:ln [T<5"P֕cg71\h9<`U8di}i>2 b6w˗6ߣB Ip7]d?9p@mpj5i`(\ҝmYx%9^{;4rHiaY)\Mwr%Ϗ^\&RZhstt74_l ? OeZ@7W?GK $KWk$*RYà|PyRR@]NZSMR63mhU7C7^J ~;GtNg/oEru's`HuIƺ}ɓY'K̭x4ͭEvr>N_bTD"6wޏ-8Ky;VNu$8BsӰ9Cwl[.۲/rwNNsFavf!VyxbY*--J4 j$?e YGs8\!pheIk?gѹg:Ee;ӟ4od98̮y@KuFQSONEN}HgQafk_ d}X2o}iqhS]EgbyiL&*m}e>^F(_lDBN3ioc@{ZܴXL.a8_Hx'Cu bG0ʁ|C%yEu:(CQWkH(ty m| xeAԭY(µ@ڵ全)to,hkhR3j>69t.-/ICQ7Mla0MoUIyBqekVzEv)fET`꧸e!!qk[KikNdS]RK hu9yaDJ݂1T4C 3 F )bb4([;)"8bPP]~<W}]tsIF:FN mh˂(flѡb9~̉θq[_qm{>rJxh,c;x =1eI.g] .w'Ie=⶜算Wod4(3`+yamk:iZmzHUc&?/1t|H_Ɩ"N6|tI$ڍ<>|/vץɖ{bK`M~d E{@X'6р&ͦSτ]߀J*ǩf.WIp]7ߍ\rFz?Aha(ß_&ϓm:j0*Xjj̢VWbs,F6%# Yz?A-3=sQKKʉ7ekuҨ_"1 ZvBd&՞VB:i`8 ?z zX45&7PJ.?̮k'@Z<^l94nS2>yP3N_,{Z\+W !*PVںvc-\Q c֒"S({4G>WZy7M䖒(4Lǘśbд0@W47Pw[:2 4|'l^M "'ӎJn{D5?s!Qj͈ 8x$N.{h$+;ѵTK,R%Ty '`9"* }j~lރ[+93ܭŖZ^Ma-RWC}.UߋNdH,"x(G ) wU@1HU=-:" h j}A |dmvfojivzh˶']S|6to_nzn]Snڭ+"%ȼf̎}[|~j_̩} 2w#"*уϯKik?-wk]b=F5y]eO~rQ,pdAPʈa|OW({GU WOf&}? ^n}OZBf ?Xnc%N `Y}5R. y ۿ7}ۺ ]畇yV*P4EMQpr¯'<{m~4 @R\fWqcDISY53Ǥ;g3O`=Ԩ ].o5  d<8Έ.C逵23Nj$2y9m3_>xyhY ܇Az HkWLQg (?"XY՛G+;;%M\ٍiyGTh;5<[ݹԚ[BB <.#}q#vm2,]ޅնޫ`Ik7,/d~`Ns r~sݟޜq@;G Twb⽆J Xy79tmj zfhK\żd xZw 8lnA_!*xIIVBߐ+ Vc&mR}<۵tXZ E!ODN\!i˸-u*OdbZ >.TL(Tu)ȭyuѭ\a?>V]wo.n.bv[Ltob;,]fI;{"/*aXY;RZ3N}.-y5xs2(Q%6] hv=z8ݫQIRTb΢ &{~ endstream endobj 575 0 obj << /Length1 2212 /Length2 18714 /Length3 0 /Length 20025 /Filter /FlateDecode >> stream xڌPҀ"www w4hpn!Kp஗d{a^{ % P΅ .`aagbaaT#:9a!4vyI*>X\||,,6;$@f&G{;3<=hLi DmN Sc;%= @t4..|LƶLNB w%@ trjhl wkLuKj.N@d s~wq3:޳dJ@ˀ27ܿ dg0JRL.. c; m݌A6&n UwM@.L zd+1Kڙ\O4}?wO_dgfWfv GWĿmEd@' zZ2@/{6 s?xogc7 O<++ d0ZD豼+寿~03{;?_1.[RL `ddq߿oecп=_徟Jv {AhK}r?o:")W42ۂl.[` vT U\mV}D,'_rh r1K׾ـΠ^w/{_2SW}4VwJڙڛll\c''cO~'N7V=f3˻ G__>?E\f? `C<f? `/q+Ye;Yq?Z{-?^zE^zϮ޳=zϮ޳kxbk1/qLm/?$uf_ [2-,dhw?ߛw8f{ir:]HY-s_;?1W?!|fާ?O{8wo{ў>YMSW\~C?"4_7 n%pgg@ڑsW xb/Z1~VdbmŇdg]YޕmOK׈YuZdbw.PZ b<& "C4JVtfSRdwCzr8h3A:HA$`rG)&=309NEdF<W-~.ȥ"/vN겞ri A)8E8:hr>S)3E #jW Sp#QAN m  Z^JRȋ'c@BBQi^PVs;5sz"1X)`c<@Htx<|ODN1<1c*cI1n~ceۦ7UJMQ,|ϯ|g)K6H[pD8s -3&\+-Hv?J1,ey;Wk!xȸ/z_A];qvA*Mno-` 9 P64 bqY29ǯecOt*~AbIsCbPiiE;+x]~/b7&QHڗ@RDI"Dm?'oYYI8Iչ xzs~)Uܞ?7GT 3NZ^Sd93ZݠuKVbsҟ%X&LS<|C@5+ԯj,-):+Nτ4 P(7qQH%k!/,kB(U+D$VufgOk(kV @u"gkC ".zxUSPQot|g3# *s jqc+b}6i~Y1g"׷Y EM`GBG)+  _8BfN;h?tzؓ$ HhV<K˪=::KTqs>;k}i:]S5"K*i:DLnGpZ j늶q.L`{AN킭[UI f+T'=B#d8 Gk}p|:4ޑ# O]BeVX7dc~Y(5 ^↪ 0԰3vJ f4a ?z7$Ĺf`N5f1Yv&NtiJ'vΩ4qWYպ= p}/,-uxKb.uy?ؓ!q(:bbrr PsqMo'>u;bSȗf\πH OC[}>1Qc6#=ᛠOah ĄASK^ypW #ldP0rPҪR4YY* I$=lpTa'AsNk}\y"PPgLTx1oBJx Yf8j VUY CM1%]K)A MúDm^j7EEbˇkS/^33ϵ4yl+G+qQo>9US,ufN*i 7zGZ4>Pl~.>Ƅd*{(84dM\opJ~G=fO%߱.Kbה0ǚwuZbi=sJ?u: ܦL=ͧ>ŀ ,j@yNpDq2 I2bb}9 [>a}K>gIki[P ١ boli#KTGiO}&m0j`~45>ا#t>¸?mJ0]\\U!IrQGJf9w?Ď*ۢfYFmv^*Mx6=(:Ro 2mǞ秋{G2(cE@I9Ɋ>ַ؊vm(&˫Ҏf>6Xui]Ivͤ]L%vG%.A,&[c^KOwv|&b,8a("ZtWޫ8 +bے3=jplXĴ79Ą_+3qM%06<ʂ=sd({>lF~q]IQVx}S&rJ2)w* #VNׂpN:HŽm. YrsO.w7TPS `/[:_<{EMv@}d%M)m"spx$^:o;=?` d7!4n| sA?B"[/;0'XJ,UY{HӋ+Fqv#Od]`A|[/=ruoF؝uD~@Y:ŋf5vKw: ss%xnDqRwa6Ojċ<8*΀> g'ϱ( }!rMPDDO!DQ7aᨴ9MkgA7paO%BTT^0XY75Zj ј3UD! Dl7=jTmSYኬ[")Y9\{=s[W.E?Tk}gg.ã:R3[pj/X~r׻Y5e^C3G^;XUDSA9# [>G t%i,fjX7㮄t&0ϊ[Ð1ߩf}ȳ`WCØ}ċٲfGX S+MTuX+㕷 \Uv6>! P. G.,WSD\ %_ /%ZԦ@*Vͫ@4cܬdCe%! e& bj9f0B8+Yjhcb;ȶW~8vBTPl%ؙаHsERf<"I,d|3WrrMfyhOyR^hF=4Ń`F=<ǀAd\A &{ȏ/[<as(9 cG@NAa Enx"0W'<RۥXdJB|Lɓ(I3K4)ZdfIz L@̱A1CL,*{z]Lq>i>h; vwy|wnzeQg'4:*o TϨ.!V$+\ee&ޠ^K+V#C{]\h0i_v/މ儨 I5E7t!a(p '@{/&pJZMn_p-TmgF_e"v =c?=3q䴍ac!]]iau߷GC1vR9aQRs5"Vnj:i&?Xh2:҅fٯp^x D7+] /N 5ն1d-qϧSmKڦ]}aR~ ֕ k”N =?>`""!(ޤW-F"m#u3 w5(Yp -M]bR_LT %4XpLq0wkBOȚ{Y#Js1dW2ഋ́k)6 Y$W}~]) ܖsyE+?')ڳ2}6fdW)F]y)yhImKzes)ی&ߩ4⤋&7ВKVt~i$^fƬ1Xt2s^> M }^}]5 FMKz+)iad+me%* zlސ'hf%k>L !Iu-+J`CHηSp!&uyDt, Rm%sfsos w\p] >mf euf& =fK9K5J,f{xMb 8sLٛ;DwDn5`Y)"l9} `IU2$yQ[9xg90!9.AbXGb]yE0m Ŀ[.l)SC~(x߫Ƅ?Sq 6W ok'p,_e]D}ǿ~*AI =k8|ʚ臃V Z̳Y[W8bo|hitFW 14Gu6*t60Mhl}WJ@1O]#VnttZ:Vau.Co\Je[gvNkU'jOǼ#p 06[>r.7\F"oSVeo= r%SWܐ )h @#s(\O۞0UVÙ'ҳ9-^lg"ްQ64]@kL p;* 'k}&\\__ #Vd0=|Ɔ`6!|A'(gG_o;Uױ&QǶ€+oMgZ(|Z,䌀2Y ^#tM8?"in ) $G )\Tpf ğ1>5INC?b<,Ycdo~#t$<V]˓&IP}k.wU'N4/"a(!m xBK Dh1w\ =RTZN|ŎZ]mڊc($>+̚z@r]c_­^p\'%*x}fifh+qm2ΩșԡlQDVTL4MY }P-פ=&Dif)'g]iDJ }$NwhS'4DZ7JYIX'CEFnr:h7V7!2KI #ɇUm9Iݬh.f|E\oR E>W4@-_Ϋ J7DAo8©ˉ`XƔ X͢FCa 2eb~p~іy7m{I4H*tm&یn_@i\Ǯ`3#(XIQO5 n0 Ȅ`IBMfWR ƝTsBC9& `'G`[{qѲ"E5ߩz[Y.S'( 7!ATǹt_ $AK:s8ZNzEojcEk'C}ܽ k갑:&շ<'}({iuB^Oկڣ"1ipL O{q(qxn TDΑNK h,fmmװg/ʅ`=iH pw[LM^G[!jϼfG2 Jϱf] bj? ~dl/|RycؓF3M .qy-&Nm Y? rjsˌ,3rS; $]su |b<~Kt)9)iy#@9jq%`$6 g{ H@_L؇:Ώ]Ң79^6.Yxse y%cŢҼG3Iz Z2P`5u1ڵqeE HúѰ$0Ě?ht-Ww,v?@<]J{z5] Uhz: ΦQlk=(/ͺpg6MaBMH/C]!ҏSlʼ1 ɝL&^;,K޺kVxDM5EER ū6T[K"˔UlZ[nja6)2Bi_:G)qP 5v//q;ZL~؎B.P1pBk+Uƫaz񜞋!@^Nֱ_!dHIhYre Q̬'\ZV.:?ZBEMX ka?j_83w\sƣRXRzxrkA/098kfp@ms<#qy`JG''4zrBM0zV(905gmlOfWMmI&;@_&&JZ{W˭ZJ ^ 0%&aWwT84{eu!t!lnrz~2 # S}*R>3T4i"uvS1&EfUEi3TkYf{FSSZ"ul#YuW8) |CUv2ʸ{HH3kaa9VFr I+Yr>ҿCz 23zBO_ 卖r$׉xQ Vk2~N#@T|u Ŵ 9A]zwWlV ߰a>lji$KhR~IVF9#+_1:5,!Riޱ:hEL8M5 ^IŐlyRM(H$K [)XXO%7Ӽ>26Uo)FK 6f=f]=E7/}#,}@KjAʂwAH- ~1L :BGL,Z=~5w"BRh?jv)uhMCxj=gيw҄5^#0 =6kLČ`R97'ؾ->$ǭ‘/&!׳<#\%Gv>^VH1st$_z>ayoAL8L3W=g+L1sX7~+1֌G牵Mk7[8escʠ$)2yz[䄙h5GVIs5?M64QkE⌼I 2npx}y&vVs3̼SgO$_"V7?3 EKLFP̴~SQ9VHrFn3bm8W^&Pџ9C/여[%=j c}ǙߨuFˇ`&:=KU 亚R!>D2ΕowLkD;FO)/y*/y24=44XH-~[gXؼ8^Q)k=,D0H{|>Z sR8rB8l(%8W{uhu%+72:%bOwf̄+.X&pUg&@ZPΈ6(#sDnD+io-=/U~s _h_L,; Ղ쑩"-?ڗ!.;W+k V\Eh 禑:{C{cTLH-b9\&%zgrEXV}cǵbV[]ԁMQY3(3Z]3 <BS+2_D&':[rZw w–{2{J\&s<9/y*`ABؽ#[&)P)f[NgEJE݀u{Rޭ"CB }L`{|06t/tcSM"捴^&f^[6!I&n7u_Rd*fy{+QtnL{oE0KǻYcjl;x|YPݞfZc¥Slے~,AJvvV8!ip4"./c^9sD6/8+(@ OU#vWwYUG )o& ;GW|}g}6b^vgӨ_&4+?LLF`A&^/|j] J"/!οp> k9n[i90uǀ50|9TyXM}'50/v|GThޓF9_X%f  7l+\a)p L./ IZge #mqz%˨ҌIzfmU;|CI4#n8kFW֮)3,|M|Bbرu7r]*LanRelv>{]9X"W5MTS{☼OIarm,rx9U /Jkko4j]#~D2v.cIV+.Y ]>,Ɩ\24*jBV(εIQnMɧ`t tM{ᡣfsQYRFE: GwX;p zםApG'h粋G ]>ķIPNj0uNrPmbEiTh&tS`x XNk4o.di4<*!ڔ3>VEvC!f`# y!!+AC/0?g*P'_| ii=Mߓ/AC%Mw(b 'Ot̪8Be =uLm[(rjɮ*GPBj$kc(tF6}N8 w5[?V>Uxbqo,c9ZF]6$v-@%"WR)Tg:!~aKqݚiU f0xu ޘo#N&2Cg"%}$֞j'^%#ON3[k5 n0Asm0X&Yx/d;ѐBQ6X͑3$!#_Z5py˜6?0VrԁBZ9e\V]&&g~n*Tec#h 1 `=9En6$`2o6&$)谟wfJmL'm ["1G'-}j5>r#h;ǶW,GoTCtz.X񒹸7*53s/z-;غ c% W?oO^3PKA y*(r sAHzZ .-T՚KQOZwkV%C9;"蕨FsV1S9?7CljВGS&u!Z3bkIȐ/~}]H`̘vfQo|?v-$}E1"׌o^"~C|d-}|l) |ɻ4C_rkV&GJϾ!ϟ5ﶪC/IuUhl˘>}c6;#sG?X,VPN:+]CɆ.4Gqt@p"3rD dKKͱ+D,;ϺKhS=߲ S!,OOR*{.$YMT休 yaˀ݇}`< 㥄Z/8IS#P5vI [VOj pUkz4XQ{;dlDVdt_/rUs ax*\vIުr G&O?}xjߕrJrUl9j2GE3l FPs(lΩ<5pXAp/OߏP)uu4 ~5ɩB5R21dcޤI;~4W· U iS>H-1@ItF1=3ake-`u ĉ.b? L޾8=Xv{;rm8v /s*ysLܚ?(|ύZ@:~IX =.As[Q]\r.ƶO%:ZFmWJ_!!*dc? nl򴞏S#| k"Ðc N0l L K d K!{+Su9xYk!Ymq>~m͜! 1<: =!Eգrvv\[إ[G-|\Xэ$iٱ/3:Iݸ{#=$piSK E)}ISA Ϲ%GGd_iz%cΙ'oF0k9ﯣhQwȒ]lnMe^Ty^c:{*7r;u,ȳ4>Se쪪P7bڳZW/dO#⠟le|};_b{Oɧg$cg}$zt r9zƴE[5\TMw6sJ֗ T |!9f ^sOG!WֹQ{zh OoE쉜&f< ]~8[=M93=Uڛ*zѪMttT@M3F*O86!4 Nn G VQ/'H ,OO9<* x^kIdWȾ 5LKtj+ek;]#EQY.iӷE]o\וN•8-'-1;=Tj c Ͳx!KR5*дK7pjlz͢-Oe Ic(R\]ĂG) poɬZ %Y]gR R6rCf^3֌6"{t4"c T9Kc9<6Cy91zmPuzT"Wo"S_lEmgwR*K9%cdT#v7w 206^ h e-N臞={sшeS=rKd'H¼!ˇE5XF_93-BL&EOZE( *=g7 Ts:T)[CwoρkR%0Xm9ݛ+tkl"@9$s/F ߦ{coy|=U-rE)1٤ZheǞY[aN[Iv瓵('$K9 HS\tJR6 is>Ao%o\ DP0~H ji"+)ytCU{w,XTZ vN,rsPe=ڇ5G.eQTZ^rqZ;ipjFqH%U/l[KObFy䬦R(4*8K{_\I`p㣟 D\m\poByƏ] 0 R 뻚8} Dt:RދaI)Jic}:O#*3P=A0`Q >G^:xoeʌE; NظsB[)?(pc;{f4ޏ8"/ϳ}R}GHPkYyhaK.yk?MJKQ$~oqϾn`<2W96Bbahܭvy̅3VeF_f)=+ok 0tH7RP9PIH3~ 1NEk9"q1-;R4?vxn 2n&YQ}P `G-Dcc+& ,+AÖJݲӖ# D9f~1n$C5#d_TWMA !nw)rƺ9O'j(m>͑弎fȐ^SQ<ֻ:H)x˾!`l\,q |cPxsB_{,6f2>D%`ݒW$h4 Z;I˦bDoO~PB>Ŭ79%މh~*/\ N9"e;;ܝ/`bՑnP C`K m(Q, $EV!}-%fT6`C꾗1B=H<pG;&iwiBE, w]Tď}̕ _ $уTSLDVz-dZ*:LSQX/5"wܑCťE4aD G@w$:E$enfacuſ$mSA1W =62qRESd gMbv6iZ06"hsd$A>=J٩ <-`t1V`ZYXJ05^7JHj*V ( <}*m#|Bшxb;!\cX+k)g8Ċf'5ޢjz˺O__d!f444J0 ⍻x"6D_1q K]Zvpɳ=:UO"ͣcC8;T[!ELɠ8,6Gu5[3*7IH3جf zϲUUjFNļw&Ș/A9jE!UpRV[]%x1fp-,: f}>c"9zyƦg>'%c3L^ z '[Bja4pk e Ȯfٻ2t: TH& endstream endobj 577 0 obj << /Length1 2640 /Length2 19101 /Length3 0 /Length 20620 /Filter /FlateDecode >> stream xڌPNK,wנ]>U[TFs~ UVc1w4J::102Yl̬nv(4.֎XM@2q7@`eef23х namP`::](]-@y'ڌE;@bmfP0qڃ2ͬn͉ӓޕRifP]<怿J()ne Y\A.@(;@MFt 4o d𷳉%Pgtr8ehb7031M )0UO}f.NnvWP%nv:8z:YX;[U;PF`fffc@/3+{;V%~!xn.@?XXfnS 1?t.^=f/Є;:y6tt%)_`pp7?,qp,K%P4[ 3s0a<e$ng??z{k;,@sG&8_S-Whnn2n&]q֮^@sek73g?bj``af?:rقnWHv3J89dof$rp|Y@h{Ln : _G`K `Lb7I70IL I7b0IFl&߈$F .o(A\#E7qQ@\#E7q@\E<캿_ cjf :o;srvֿĠv`ߑ@YLҚV4u112?gUzf/E7s ῜4L@P5 ?8;V P. nKwD oڠcv:aYALm#:1'd7t2NZl]PLIb:* L;ɲ#seU$'jE>[u hnYT!]^ZjgjGDAo (t4@P<orH>@R_<]_ 4CX^t4 iz_'Bɰ7)0GAJSK$ummGVx 6=Y(QufaigpDqA]xO3 K"ٝE޳_ʫqbu9.- a,w߲ i6HƺHxe0p\y;ԌhNPYxzJJ(EЙ+x*zo-Cʝ5LYl#lc;c)swdL:y{uVJ fa}E1x[ɮ_a C7"|~?-Im2U"aBbcx]E̕[8R!W{^XvռFxC|B!Ǩ"%]@ˡIԼnNɇ֖t-([(i~݆âdpbIʼX^Å_10ixVN-z8#WBr jsoUz}u2uztGkc뇂((1x;B%nt͘.0L歌I4;zƏ)zٷ.Ԥc !3aV%8Y2wq W3~f/U1R'7impRk-7z}ȗ^J.Ib.au.5'%e(FQ:0| Imto%W|-pZMZy.rReg6Μ_`p;EKy/hJaLSMfTi+2y `q9@9)4+7,8ﲜ&Oc`I.C%xs=ڼyzoi@UV6t_mz(Nq1ig"ԙ#iMK%IL϶#6H 1\8f>@вXzv3嶲u WnqϰD0nf^\EKxPWsDH}pƺݹhuɂ|?~h+c7l_vw|YTfayJo}IDLM[0Y̢!nd'](smO<4ؓ~[ xFP;#g5t?DZ]l/2?L}g}0) $ϘP!W]]NqUjVXa- -:!!cRj-}zpW $|q@(QzȲJdY:?g S`3P琩sѳ%6y}ؤXUQ9s7. qcWo?H0:[eA^=Ty/+h8MWWlRੇ5’5$NG4>V- i<«Ljz0߳# 6jxI]=^A:hs"*/cNPF2b jJ_y]3UeLJƔ!xrbr<]^ ^F{yQo>oqP;ӧIb(%rl+*:K]A:O /*@||:7g`u< Lj:rkF`9owD ;N+nUaXy* pvi#W\yI&T- eN5uؘn^NXm2gGG쑱mYX%WB FBl7cIj>X~Mhk&4`idF2C9 (bi or(}cpans\z}ZH tvf܀ӃUR~%CQ6-'I~)Ʃч/`T-Xә,1J~ V–-i!g(񼭠sG{KRnl !vGUn8*Un !Y)lRJ#0J8$Nyy^b)dˣ"y,[+DdЋ=4iԓ7ٝTv8|Pc#D23/\4_cŸvJ-R8/N'IEYUjpN=u3vo0c*jHjڳQJed1dPBWR$oC'ea`PHBV4ܔL&h%3G4_(DCj3tlsc?ioYosqc55=&Uxׯ.%ʨwF&jX~ ?D|=*3l9|ن |.IB6,kT4wjr;ڪ?ڥ`X#6jH'aXHx7pmQܥZDu|>'BV4H6 p!J!>E ¦୽׍]V1(]QdNa0Wڌ႐YԎ̡otCizogBGw ޫbLKԨz]dX~N6cEYM3 NQUq#JNj~0i%kӱ%6Gtw@ߴv9wkh rE*r*?GhNJG7s,1pE/J9&>,~Y+ 1v L]}yLD*2^ J87dկ#tZpZ1|P?}v{W~>Mq.(jL>]´k‚fz4M}Fu&l쥎Xwi7K {Yy!La!L,qŸ,Zr]:k-b'rM ]#Gr,Hn?ݮa3]mGj[~Hyɏ^}פSCĴxV.`0l 9d‡`Gf4Yckj}1qp)Sޡ(XvD wOcг]){J?}uIF-p@.F!%'gwƾشpXNaAA؆{N$瓿i.B['t#(͂s<&v#x"-r08.6?-]ꇐiiyI.sg0+ڵjϼĴd 0G߷mxe39bQvM{k-G+kHqİQw²G?P_~q=O x:Mda'/Xi5QݖMC78OQ!ՍF3J04D$ 17OT'%3pTZ)OI; aɔՑ_8s68*te)vT _GVN/a ܝHOUqXe[k;-uI$Ov}i')EWSҝ^/RW~<( a|e `"'=/nJb&l ZMi~>:*DuqA_Zro]}x plWQSA]w jmC`*D!jXtE'nSn1[9a5o[1z]bD’J#Qvs2eZt{$vgK6#XFxxlF]}LT.o-n .d :F0m*.3iFN>5}/14C4RQI)="ƳhҀq-@~%uaoSc@ay|ܞMGPdr,!.OmIclTt@?ۀ\{oI0ɀT,w);pV`"Β݁=5l~{'#K vIPz4CvMEv^PvgFېD5Gg=@Xm*}CW|_wnڛql1lY~'IGO\"A8Ш yI/;!ˈ/-cdoSKqGh̒֠\}zڒC$팳a\Cp%i^p@k Q` z`Qbkg 2v P0`h%&TG%3`i1Qə~5pJ +zK¼29^ÎܯA lqGQ%1 k0b=޸lhXnz.TIUkuMK5?'&vSYr: +B9Kl YsLx˸/ftekZa S:ʐ-̄,l9tױv r?ZAnI ?/5LDUeXڎ@HpcAf.D(2;LnZC=S3 lp,h"hC|Src\v`,k$ZIlU:|yɍD7x55DE%pW5 ˴+DA?Q.KfaF#ıs-g!/Q3E%c9>㢣̢~?쪁ptцnѩMaMk GQm"'B,G B(Yd\[&%^8|S:HqƍHwث?L]7:eǩ-JOUZr_תks eyl*J-XyF=? 7t͇$ b=>*uD}E/S}5WSo|(We1šZJ~,ӻ qśpG ˴u0qxAd٦n_2G3Ƚ+5OZix;̐o?(&h銍 fE)}>V ?an< \0m\nS Lc Yfɢmen h܅wQJC|琁C5zc]E񮁄S|,Lˣ[a#聐~!L&#̗Rzgؔ^M2x2NQ}xȏf dsфlSFk#s%T7Z l ~81 M"vWaW0/a; H f.,6/~~=n%ydCºakoaoD@ !8̺F-Ux$^)E/3 :eBӈF.ŝ& \Jq,\X֟}㑢qYuF,^EGAU+_F|qQNt`薋GkP,D*gرO%R,9m5'=R{"fK殃-2vOUO6.备$4D.܅~6Oi%k m&k6iSn 2muk5\2No= +V-( XV:9~2XZ[N zjəQ1ɽZP!U܀eqWli"EǾ)+[v5{]# t8?+fn"z/׽&!̵ECa r+%4{*ڼtઆmJ CFpH^C#~knv\Fɳ6+ƜcdY#o8ri>v2%+"/>5m^&wcڃgs5@&A1cs ̅z;u5jOx͍p|hBiAU-#bjѯ€muG+~<]zQ"r ?H7,)9Uir!ƣc77o` ψj:Ȱ.6I<`{gzgan7T:6ARS5|i޻=>4CIa*|X lh]m.q OCzӀ&dFLॶH+-f YiҔN}* M1Pn@ó2Ga1 0^x QTWT#vFDphYJhFw9W~CD;k{h㉋ZLQ_ :l81YV|Om[ѩ-lݝ$Pe?'#h>ͅ$cCN谮ɹxqՕ&-y~`?F51wn '~1ueBp@-X%=! f&֝%>u &mGpvQ<ԗ4s3,z9JկPx~R&zYƒ"W7>(zZ~ O]*17szaŚS>*%[+ՠmXP,1ɡoqm/K?:vZb4 !~󨌭/-_z@ ODy: 㷂ai#->?v;z gp*l!,"7=ݾȭu#_ Uu>@Y |˜UT(JL'Qc`q,M]}噈wNj=j,Wφ+*Qy|Z ry=:BldɷOK,fU+3VNa\"̛L:}*aw5--TKEK܊) 1p\u0A)BGPja#b&̡>ϛ}=TeΆ+?D+MK+2a,ZݘhI ࣽa  Q%,my])E+oBCF#7-Oq3 `5oz"ٮ,Xa@p]yoc[{A:_MM_1kO!Z 3QzS p:i wn*?u;ERp%`kIdCiP%Myg \< XAH5q!lLH:w0zTޒ鱫p-PC þB&zh SIPCޑϡ:" [E =\*+Fueˣ 0Y']ޖn+?`^o\[!-udBC>%?wV $G\L59nO;: [d"rFS2Bh>_Ɓ3 p}KߞIӟbO$5[ilc,H6>,5rM'.[=sH^:!˅o?:e8D(r֨4/ 1:f܏᷑U}v2O7#f[,`&y+\({fAQDU6Y؁r~,)YFo'qߗƯ^1rz)=+C>l|Sܐ)A(@E83T.a`Bߋf۾hYșc#|lBU}yVes<#uuúLUGWWJS끔VgMXOCP!|G-*ҼOQ>J~l9UKk(p5lh-}ڂ1 L6s2[ڒ΄\auOv(fˮ" ,zISP&;zO_` 1.At4.V<׏NԩyWqc:sK{m&[G {r:K K%.\-ϸ##{v;+瘘 evτRh>-U(sB<"VяCO l/XbmL̯bm"\,H!`D@Kvx@}%C*x}9,kʋ`O>k)AA(I Z:N`nQRtsQq$Fjg-䭋R(Gjժ_/:qƮ 䜘{ѣ:=+a xf cSu9lq=n^S'}> ֝IbV_OET.m #{F3C@3Vx9q`id^p*qd  3nt_س T|٢uW&kS0u65C4'K51l؜/V3*Á<82?xCrna ݱ2;*+(ToӔ;enLRs@4ew;`WHԻY <Z%&KtTXxA0yg+^+œ[hTj$Uq_A @SgްMT7_x*PMuνXS(YH], 9R-S21ʉ;]s9D#GI1pd8)B_i~2FWI/D#TBp0[SSyljj2mЁ(/xP4;ދ5ƑgMu h,Q1qq"~M.xUGi l% GI;å\Wm;.XjC [鋎|Ӈ::.j3"ogvb#Lʋ^5}Ⱥ+rnWyz<=ci3죅FsENiW)TFgy!qS>t9?$ehPlF&9%HOpN% 67Y7R9:Lt6fPeOzi*) w&K;'ٛNxhvSMRmyw71A}: **V^I$s&| m_|bHrpjG@rqk_@P 41lW8 m%)u`[\;BPXz?mբzz)aU6vHF9+q7XIj-'8a qn6iiFSѰỉrrw,p,!ZzeLhDR  ؐ LdlSc&:$_?Db(e%juU҂3P j O1fD渵7DCzMXƮ&[5Kf/ ٦-sP'ɋ.pexA\՘18<| 14!ɧreN!\} eIahvf6h _Ud)twəSryS_{\-p`sVJ)ۏԚ+'?4]pA4gjN۽nյaL]EI"DH}z*J j&.ZEYrᔿγV V`qqHSUˬ@ęegG+Wؐ|\wlkVQ4`O;7Lw>z1₹*'󟾿x 7ӶIK)Nwӳr 41I?e); GDG917PE+&jPURd6# tY14Zݗ`LHg84 43c[,ˑ<T\G.ҾE|?w}ߖڂvcR`)# ɓCx"nm8@p\6^VX0E`L/ 9/hZZMG}>?p؉;۩'h閯{joO IkkuD8.f"MkvZAwOrS+$['c 7r;)cX*2ϓ&e=D*>Mf7}y2kE07,mE:y4(§iSaڈp{iTf%ώN] ?%)L Zm7dɐQܺDOGRM _JIfgVB xM^_vl j-C$ԑ4XU`.M9Zp޽u{,'4}dG]JSgҜ#bl}7v;ёR )~`c5,f"PcuF'7u(D/)w&M`ګ O]G-^ٳ)W!!bCxB|02 . = 2I'\5 A ximď\o׃&nKz >79GyF")qx Yp nnfېns"DOCzny ʹ}w#E~9 L1[}RL6pкB|*iLpN%J *I`J6պxn(<MħWNݹG LRֶa]%?İ>_@Y:iˤz g*K, KʎF٫ֲ|\a@5+@FNs9"w<ڝ^6f0 sŒwneu%<4C8Xz`DtQ}feA ؋<Q{S-lh#0UrCYz%j$ұ%AQ1,}Z ʗe3jf ׷]n| .iwՊ  pR6vMWk:>;dn,(vUtDT:*X5kS|I(&V+2O9|86re+wg+,b6]Ѻ2o{ ki t-SASP^XG$,Wf[<}%,[G-Gbϋcm02=)TY1E+gypׅ؇ buJ@P-<8ޞ;tK7>#)ٯSu:+k3WTmϼM{֒D8NWCHF"JȘ]+I]'5OQ2bnƆ1g:ܰG\cpb.5U-5N(: @`P}j*GH&k:xg!|?qKD<|ЦJu_)!rgH<+9ԁ"V;'+b)dU>€qȾ[:M  ax{-R`m+sjXO pi1| ĉ%5;^*sMqp1# >z #vu%A//}5vY-)8:C`\M*꿌۽?yrD${-UnH]'vKgQrA .P'Hux6 ؋صj؞0J,:YW +0xfG3^mM{V`*+b;|Y5Ǩ0IoJgJSƫ&Ztqp"7YkGf#VFg; ï5_%CED epQD -)#Q5n.ݰRmr*';~ŒqQ8Ϸ1;22c[ۼjGG l3! Gj|kW)Ol{<e\'^䯟}2hL!GǤ>|tSJCpKߜ)2`rn4K$J/x)CÐ (|^8y3dٜd"ۑ"d3 O3`/"&29RX:?;,L2G㚀i Ql*I-j\.7Lpa0dG=dLNc"na4xG/ OǸ|yvqu)-ѰAcxS MPyZ.K'$hqS:y /1VR4SdE@Q&>!~*#,N6;[elfѧH,3LYձvSAx4B%5Fe[xɨ,JsB<-|b,AiVRzD$Jex kYdj5mYL1i8GHdK -tHMIm0PGnш%isU=ˊWԧ2m.uÍX/9{ ftcD7d!w帕ryZš~;[ w<|Fx;!m'`u#n;Oҧ`a{,q[ CՃb ȀD=?j@Y#i,yc$⭴ݭV)9}F5QYIhYJ0/O2ʗ؞іENbE~@%6ԓTQB;e ' TŔz `[fYv?@e | xC{e!{7] {|SYAR0W:%|zAĐp\ei+ؽuPԼi^_$ &v-2euhlKw:5|eԇ\.smn+$)5CI%S\I=>ES]Ht>xAшsWz4oPY'얨p$e -1rHGcvn<@-n_y H`M Vkk"l\S@Dž$G4'(!RZziBΔ>a<("} f39-srO4L6tA<ޙ7$"ʲvsyȴ(fI mJ,n|vJuwcIf4g&_hTU4Y5bW@x4W+WP\'|f-5πq,rM>RǢ33 wdbYR2o{E} Y,}锲+<=@)T|$QS݁Pxu։g_0s?֝ B۞Tic0O'43|q2#$Bvo3i/BQT7ܬ2O7иʨ>2j:%64ˆHDXMs[$@{?S z5$ Bla4:WnHo\ uQJp#ݺzɉCj4CpYԧN}EWv43 )5V"W5mo^ .E8:]pb+:/ݗp xS,#z?臮u`qʮJ³pJ-k*b$IWhOVtt~jG[(تN"TDAaK%04}w?MhFk3LgPnpkœpnrҨɹlx/[7*+Uk⎚Ӽ1V8JRC=1CepϬ]kſTzʈ%zx6~S۫N {O!,m!m4( ..1E.kEг2}ZПQ<ܮ; F[84R.%'^)ZLʬzdzߟHI&iWŒtXgDӨh=϶?ma{))~{Ê0׮V\@zʖ:EwļxF&sܬ!MȒm™rHߎBl= o X~T-}'b,/H 'oȂ-.Vwy1 hjm~wyB&5jG$H7J/e\NhN샌i(h\Eaڸ?.C>s"'Y_G7tdc{*UqǑy#]ꖉr0h0zt!W Q4NC'fhDf9eU6`DmZ"`_6: Tç@͈_VR>2$r3U ȋj[.c| 0+j=췌-91ɮs!BßV*7O+埪>ךjQuEr\(,04PVЭas}G>ɯ[h|ݱR'GR5o; .1" hEB@bx+@Tg(|  ӻe#G] !":NqR)/Gq@Y8o"_) qMg&S]ɣP1(7[:}pPΡz2K971 ܛ `1F"W`EqlĆ9>R!|?"X翺liLQgv1Or ѮI^>G({r^X*1ƋP?0\xαɝ%)Dv, ZqN, Ucō=b[~_Fn(껵`kl/|fGK8m/BNj Up`Nem(G~x(ĢJ=E.{t=]Q;IW}@@PkSO;`z~ 借\{94caH|h~E㿞[f1K33PX"DAfpþzZn8/,5u[{cMcSWo 'sd>Fӱk\W<:bU\Q %ߧC: [įT :|K*ҙ0<9սqEQ+|w4`FqCFoefP}k]QH׼sI`ucX0幆-}6Ztl-2ɪ"ܒ}M"gd .k9j34 Tx~x ggz 1H /!,!C:tt..Y2dq'iˡb" /0e uݢ|&I\%)&YAZZ 4t(uvtsqj*@!cާx'w"ENSE;uf){cfHG'1վ50h߀Hyak[# lW,GnjI#p@;n|!%&+yE:Ʃ=$mTNm[! Üv)ǻ~AU\'$Sp/P%Ȉ% m*1J%ݶƁ%cTjKH%x歨OOĤ.Xͦ~J;!k`(济?661S,N.gad C9H wϧj endstream endobj 579 0 obj << /Length1 1984 /Length2 12027 /Length3 0 /Length 13240 /Filter /FlateDecode >> stream xڍP-C; :2X$@pwk {pAGɹjYm{ujrU &1 G3 `e`feeGC@QA.`GHL!/6ISK@`gge'х i(1@(N^.`+k1 30MJkˉv Gs0_%!'~fS{WfG+azFb P\A?(ڃi vˮh 0u^ v`sKr8@CNr+XF߳1S? L657ww2u;X,v "30u#%lgj'sSs5w;A\]vG)K9XH8ۃ (_:8z8x ,4aĢvvIbBmA\l3inGyM/'П?/z;9:,_-A/_(ޮ o#660YP~W1,/h _F/ptH))ij(0?>qqGO77wUS$Xg9X:2u^ zRv|,@[↬\/gvM6y"Y7ȋ_Cu@f^99X3F4d [)Z M0em_ =(`h~sqL]\LPX_df{YD 0;8B^R/,]PPn.7E7HF|/X#6o `^j*FK߈qX4A|/\L*f 3׋e1W}^; /r_e6/ /l/WzIuxſ/_;rˊ9y./T]'w3uWK o/A]@o /5~CK?y3@ O99Gs`௷bL;B3;:)L]02\nEZZ}ԧvZQ&_O aytmqvPý+] QۭV@}(f֊2 (5F@a"Azs9{}3=L&ǀ{Q譿ۻrMvNB*B}k)o$yy5,Vzf3q K!9;h@ Z>G]`iJG⟫=53$7iEjK> d4^ROauα{a3I<*Cn#/ֹ\c 0MpHu&'%4vJ~B#t#{Xf FA5Z5ɸ:p֋LBɫ5]#e"XS}wڬ i%ñN-Dq(Rd~׃=/<į;m!0.,gfǑ,FV o˛f*M%&}|GNX⾢u JBGKj(Σ h{-/{S9TCюդvݯnPIz'ÉMh~ؠ hipHBdS+m'_sQdsj%*y ?Ǟ6SS? (O} <q* gزr#)V mPf:v<6$v/)$_Y>^I }%2 ƹ%꣬^dƄ= p _1ÆѲ\Ҿ^@y3*i&cZI ☫[$[A]f4Jwu6(ĻUc2EZ~}+adH03FngLm&HkOi 7܉D^,yDVvUj`mY&",b,3iP, {sGoX~glkz6pW@.哭񩔏2 +KA@N$Mq{^f܁& =᭿NldN`i'N++(\Z$s N#OwG6 @ݾ: 91^GI"TWF2#6Q7ɹi.켯M"Wx~j5uX&|D<5 +ү.Ʃf%x(YȉsMh%cFr`0r A]aPB؟9ms,R~O bl;"Vݛk-/;W#StZN֏ jZ29le4mLg co~Y&=|ЪLcYR>aR||T%? E 7RvFuɅ4gFR>YX,'Mi+C汑R[o9J+%<ԖS7P,77 M>0t>o/vt㩨V=yHmw[,UF̓HVٌ.GW.#pͽjqĤ\qřFk[BYi!ζx`ǥXaJ$/k |H>x-~:F)#9BN*<( Pm_d4 E(+WU-.0 8:'V_G@`WR#{n`/6QO.H`!B&0m3ey1t>% 8X±.kt633MWsTp ?6]0Tjư\,`6&=}.&- FژK*Ik('юg}޽YO7'L^@;ugQ1"xm*-Jў? ُw6$ ;&{cq 4[C֒O?}d$dM&SA[7B9np41k@lFH}%1u&i9 l8,SU:O)zCH$=żЊ>%5}VA_.D/ Ҡ[A 0zTnN8})sRo5GGq|4 ߿}|Yٙ yIo@ҘMVw[% 7t:I#Cc[0XW&;LJϴ%O>xZw7çd[=̻kAjqoqݧ|gqد/]_TՕgcF\uLXA%p~ d,p(TuKl-)i0_M]" m39qs8cUX鴌N~7Km.Oz2#AD*vbGwyeU\<"ۂQTfDUR6q7{4v{SLH٢ޱ+RC;X yW_ۖLn-D8C#:yEW[Kn5-Uz}O ]0V-#`=L:HtxXRqX1#GʙXc]3sh#dla(e; ݯ ʜn5m7._or=kIE*t8CJI"w|T͘TgJ$8[%y. ߔn$]٭O&Dz:׉qݥp5p]Q]`2>$df<, Y̘.jAXƾuބgS4kGCOtx^z/4/0ykgvPK!˻ Tp%UgcMig?plvOOiտgeCvjzq,.G3Uz I° 'NZ6|ؾc *0>]}( *Α;~[MSDM2>E6EKj$l?"K~*e[LŔ\ M̶֡uF5N>؋ o>vцZvS=^4wlp- /%MꘇAؤa[d>e(%//=>O(~EQ]92,>]ak6 y;s.#CEsD4Nha9w1voJÌ 2xd Sʹ O~*YtwȲw0{Lp릒da5A| b6+eu*݅[jQk*"F\% \PP φ[~@ql0gz"1?m8. G>+Zq"ܼpR!~ ydנ5`#]Ei )o Q[L&5FR/{t# "vcѧHrz+&-n▯3O%(n_6 y`ױk#a 'k8@(tG8ݑdw!J3Nݵw5 ǶNk!D[H0?Kڏ:tZXJJo6͇4D-A]/-ϯ-:RV ^tSL %ax)i(`JyoHSMaѹ(gs:3OyC]#+[*=7,Q>8=J.0GEdo7֪ےg_R ڃ+4.v?﵊ \|+ཇ#$/Mfx\>+dBt7k2£@Z.5>?K}p~hV[2{׭ n5FcHں D-}5 W7Y4,y*KԜx𠬱\Y}:ۘFxn!*(4mxRj㏟I>*Pp/7vӪ?pMm~MOV12ZKCqzFFH',@E-Hxb{56"0*?op{aQ64ւa-}{%V7 W吊"pi;BTEdX]i}]IQ 0]D\Zg[#-1>lcJ,NmA %g?ߙ881:Ocszh~RB։}p27"!vQi 6H둳k(E<{ѯTzZ7(`i'*.jX*h=ęJ12f'>YALj t;)hdLM_ltvΡQQfzjIr,@uUPY;ŊJ977v-7 i[I<7 {ѭB % W|@7J:f>#A,'ચa^,?pi`b+zbCzCfvz[rӻnO>mI7|ISKdɦ@[u:a˪Vjk-}/Ğ1-/|3u#}&޼aE1dmǔ$o$xfq7x\ּnG,Nu\P~&w>өlN(kbX߱Nm̽C¹SE:ŮF{!$U0\_##E[x28֗)\eYoNG4줌?龢Gki&_w衧sNZ"rwFTOg|875 q}&cbg3J?@qθ~zg-E;dB&yA9\kkkBI w~ܺD(?/ ︗Fioí7-!༹K,<&1PS/g ۼ.AuAPUwkxzmQb a%0B)F[BY@3zr/\6q뺃Nil`!-R~%fBd=8}+e|y vRG j{UavK8Wgz?Z\X9, !A t@t`Tㅱ `Dhs`PIRxx`_BQymbHؓQֳڳeeW`. ៾1򊻩'qpuil%- 3rĉO?\.$F0؇zB >Hˢ3&.!5_Δ`{r>n0*p W)gח{'oʴ0{KӚII;\?ޯϊLh Ve, cs,b@Gm ~5h*l&;~=g I'>ȃCZk}g{tԏhO.@n7)lܯLb -S _q؎٠8Eg+BB'*%K sBYZtAO{r-TlhxZkMO nk!i2{JAqX] 2|Bߣ{̂ 5p o'\G-_b`:'؈9&DξC t.)OV7(77?t\]5܉ow Z@K`osWP)=iNwTcM>Ìiv1J!0eJ,D]> =GeG*_֮51C2@LnP# {dO6ݛwHI/~!lnSAYcAj껫ݣu6FU(Vvԥ]gpYs3 v}dfAU%xέ8/E5q'}co#"T1g3,9iYV 3/j"/@cG0fus/'ٳ,X. p  (7 OPgxs%ލ|H7@cy #=DSb_8EqOttFUP&8(~nIkvuYZ5"׎57"p({d%C:aW TLCC.?'4}IOeoH-ނo|Gn vY.(IPOٷf7@khC_R3ZG]>-s}^m.ASHjg䔮t>jrk[6 ߶z\"CH6Vb 0|?&>83Bpd鶞<:qfRUzkeTuM%úYW‘(q3nXD!0w# 2z/<ڠ7~Hguzx!0Ebڛs.nmr*:WvD瀰UGcqs:u:4- Ʀs|?eE؉k4JD5#gGn0|_-ο ڦծKN1)?spEcQJoQ!Ȉ̐kQF+I8Ä_n|>a`gXJk2I0`%SB#i^N(`H@Ij3BHY:G5< cl>ryOhsT %yOP&8Ƙf6'Qaaܲҩz,)uY"DS= ε=WLX8r\">2\f9/z)5M%bl/EJjXK⼜?1j`2NġtLq#n>c!'8GzTMز `2mIDGRa +edk|w?T͘bGp?ySf!^#,9X$c;*ѷoHĩC 1kGՂׯה0b%2k~A`N ƌ׬z )+EiFD!DjOL;s&wbX=lU ̰qvS-j{7[dn5F +O-H=eklօAF]=!(@HHb1 &X#8;,:QY7\C lR3Ֆ=K /*ʠn5W"RwG &չaܪ-wʙc#In1N<~#(vr*\D uuQE3:\ss+ ]Z9\=O+NG#.9Li a*'~RL_̈A~8ew%ܿ*rV>^9d Wէu+$_Whx##i Ți*~4x|S$GU&٠QQѯ4doqU^y6߉E3Z$*U(˸sXhEtr۩/Iܺܣ{hcTkM4dMT:v>36^~"*}^znrkHA^jld+ 00 Jj[Fjq' {yJ9*|R_%8Ҳ]& tE v;> ]# (q!X .Zj;!Z)]c#7z[r.S&AWI}x(QQ-f?K8FTW?nߪXks2| czpT{w'8V8w8t7F<{1{&qc:\0pێt @йOHmPi5> 2gyQ=KSA=+ ߨ(tmyҮ~uۜ+Q\Ӈd^<ǩ@x%bzl4_\pLrON}-%Dѱxyvsv2EOW;jNԖprg]2BP{I+IXؘk29ٴR*0rIK)Dl,읇'{*+:'7x!<7EGg"YO4 V'_gY^>WH}ܮ>{m Ծs[*9&pFKr4~' gk76(4RjH}T@*\َت{ҁ9@˜hsQ }n 6A}>!Ztr\ 01"X$X*+1,xBGԐԝ>ulV+Ǫp"s 7?T2N%d>(:aE2c[n}qeoƘh}|&_~A Z,AWS-xOBMSg#&=AO38noziY$,'=oM.e(W#a`M5&ꗴ otM/[JY|x/7~䪎6\`UoWQn΄4Ȑl TZR,LtO1cK1pIN.%k&nчQo-8q u9 hP \"`=AccpсMP86Ewy߆,}O2IIk֋n(l~gL9.7ҋ7gRJ-gmApErrYRlḗ|f{+r_) Vmx`lu4F2Ue#;-CGOv\#llg4r=:hR5nC{L~Q d +JH-K`3NZtm^{U ]Evb+xgOjU endstream endobj 581 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> stream x჎[ zb= [3L̈d̈t> /ȅJob H8hYO'y[ 6 X>7:X% b Tz> @+( 0( 8 6RPNmpWQ|zd|2>wʳJ Ԩ`yI<<@]0t#C4' N(ճ~԰m`NS:O׽Ny1T=yӃV 80mU&y4w.ݝя'DP dEaG'ix$it kHטtʨ7NLn;EoLGga 7`>k\BBt ð/SX|~+< i4,OʷLJtz=~Ur3ey=?+tFQD་YC@ҽPpU ]($|4s~m2N'|͏&=:+gD?[wxQن_awq[vW!g riP=K[\`:ޗGp*a#',߈թN}8 ) 8ehv@V_r޷_zoANZS(' MuEp0h9z$+{Òp 2WaVkbW*5ɮ4bՆ7feAjD0 vy?7/ H~yS@x,t1DŽ)1*7#[a4B\[@ G}<ܩ*06TkەPV;kH>NW=:ݧ]&+=sAH[l(MD> cLtECxh"CtOv-$ bv^ 'ӔۋX%Lg f=6{%rL^$ R/@\[`!ooH`z޶F#av!.0 d̅CӚ1B s% w]aaY01bXz,@_ c$Df'1f8@P^H0mzK1@ ,#y!&ICJki?cV8;$Pe @ʭ @#TLTJIoУ>Rю`}X# U-t B: ߈'Za ]0vyk :mp$$`Q ! j"D~Hq;4BrL "Yl f+\.Ag%0%Pj3] B!tF:*R,U Ȥct+!)h`pXxURv8qۂyKګ@)=M[wJKK|z#GI*y @l ޴%w߼'BRZL1<%BUaȑgwBa z c(MrAx DJy `Bc4bo)xr5H-CaB8lNZrP8`Xʎ\x_1E%H\OSm<%p2ךYW hۧL&Ȃ`f=&ُ83H%rn/%PA{wD/(0OkW{dzA + ]w&pKmP%*Է"4y&K d0keQ1I,:I Td`ŧNnQbAh k&2e3oOF&KC6Z&M k䤍 eR]cg zR"M<% 8ge$Z:fiyGҜ~eT99VF.%e*mͮȽjFȍ{5Gh2:z$2SF WnFF$UdhWK.ӑ" WDrSif5G4h\l8Ph'Xd!׳*X-kZcU1կJId"%ڂy;ZzJ|lyQ/pO*ugM%:G 2m<͈H^ &0/ʇݮP..HdXl׈ 'QSi PACuH~na-j7zť\bXfqҺ JajnfaP!xa2TSiC:w;9*Pk~yh Lћèϥ%FΤ-}`OGJMCESmٝjwt O3yK8[,>5Ӂn)[vP:CiI0@vJ5J ψo]w՗^s(INFZOɊcIzlHCqU(ΥyE*S]02)N23cu/c)(I,) 'ɂƈez.кF'8Υ6BI)CJj.FFPKY6 ~6]nbeJ7)ӊ `PKHf+d8\%)f [^[H"UDJV>*mV3' މXG@Xr$#YqLUv6Qstr~IYq5M˓j6-+(=UeO.ZMf-՘6yX5D8j52a.5K$!$b>neMށ7|mU ʘxCs/bu꟭MoL;hnG7وlu WidAp0t@^"(w8*r2R*V'JR,k gh\sTj2ta+'FՈ(Qhu{+4Q)@mm#~כ7ј?h{սƯ_휞mhG t/'v _(r?u9~UvoWS~p]/Nr';|UIUw.wʽ<,/ʣuky\Ky^^k,ʫ7Wa/u9,GM9.'崼-(18þzcv?8EQĺDQ("yU%iP v\^9>ӫqWN Gg:A:yyv#DD#A𝉎$"N!1yJ2 m>|4 ^_wYxʯC9ꗿ*!BZޔ7qt)} 9\<{fyM)B_bEQ%Z)$m5jo~pH7C lLZ2'm!ƻ6vD EɅ{0"'TҘ ZT2z?:}/7_ub~3לM֛+/h7fsI5o~GƣcZ&܂~8βL_b P/#/x~xbdiM|$DJuTֲGw_<&TRT KGB%vTeSw_~;L*fR<;f-ۓׯxX|ۤ|ȱuz;><L3ăԩ2.bUWh>`e&!8ےXڥސ/vYO`V<.0x{ѿԙDeѴwe@f7<ɉub$Ȣ_&$v-f`{ kȨEFpX$13$Ubzfz>e-FMJţ* rHVZއ]Dԕ20 6l$&"Se^S5| սWiXg!^gUC\Vv۾lzN 2hy $o4{;{>5CkB*R֨URmT㱷;~ /xy;A|KWy$Y+;``&"GW+)Ҥյ*,CXQZ>ٳ{Cc@'kޮb˨qwKvzf;`\jKʫI{9ϲ GFܿp6'2_Z3X?D~ZoX7kʝ7ϩpZ!6y>` xrӞjӵA5ڛhLn]Y LubR~-ޫORm"h~ic=FdDo^},׊H9 gFW9h.vㅃ_~lF{Db8 r cKҝbv|a)xnhį)NO^o*o@+ͥ)/߽~9W=9bojnd-^ڛn`n/Ȝ .xͽD|l L-XvnXFղXsl RVc{/VG endstream endobj 610 0 obj << /Author(Walter R. Mebane, Jr., Jasjeet S. Sekhon)/Title(Genetic Optimization Using Derivatives: The rgenoud Package for R)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords(genetic algorithm, evolutionary program, optimization, parallel computing, R) /CreationDate (D:20190122223314-05'00') /ModDate (D:20190122223314-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) kpathsea version 6.2.3) >> endobj 583 0 obj << /Type /ObjStm /N 44 /First 372 /Length 2103 /Filter /FlateDecode >> stream xڝY[s۶~ׯc=ʸDrė\`Ëן]ArD.ҌG @IH( B""` B?DQ "#pcDr"@RX7IB(`<`) hc@."Z1&28\1P"$ +(PRKT"D@xJ:* "x J %qC(!: )B@*q4 (L( ILXL&>9~7<&GzQ5(W48}|wr%F}feWy`H IQV']t5lrtM EYEa/>>|rߎFcO3/t(5_ǻ\'x^zyy=?o=&BЩ.^~~v1=!0;<xӭll >dAM99:k}Ѕ+HdUswPס#nGլl ʎ3L8!wcdGjXln9g7gH-aĖ?Wԍ6.ajs&,0> ڜVwơ[;|XdJ 58:Xxin, *5>9:W]HC~iZSٙ)ec-ikI2߫unĨk9BΒ<u7M+cu ~.Cuj:1}+5PMJM6ϫ,̔=<:2Ác[WRM2=ݯ&Asq/@ Kƻj`@0b$tvMO \Q;7*ɳ)ͪ"_3WWzy.V!f2S%K|_lz]oSS$Y>=ɳeZΘT|nMUXY^/RW'[r $g)1rfLHlz:)]. 4*^|?Kno Ѳ;ݭx㘹Y&Bs8K6Votmk X.VF 2BJirg:]8%iڪYOBJߧY׃h_MgyܜLB,<γdi" ?YQݙ&YSGiyv,MR,JaSy0&;N{LjM`uQǛ"Yo*8 avY3uV[*JC̠w?`|p Dsԟз|\uPNӼ^o>'Y-A0i4=}Z慁sW\Ģu-( :([K]-7P@67ƕc8i13nw25Px$m|SvC7"'/7ooTEvo9MouR`,>Rc:&OSX `-ѹ:yH~+ojSmkIH;=,|̪ L`?eqGiFTjSO nnu]4kֆD"{xD!{\h| LpiOD+A Zvb@'Xz<3|UQܗ`:'ŰIyl_K =" G!j5N y|ZkGMN)n^y| H9 (%~M'tIhO:)"\ܻ*Oܗ5,G9b1@{*4XXKᾤIquw9t[Gk>7};Z"Eߎ>98Ŝ;FFFGGE/9 v tfm`GSٓ=B׹! K̔%DW:C_T\H/Zksџy:ZRx]/ endstream endobj 611 0 obj << /Type /XRef /Index [0 612] /Size 612 /W [1 3 1] /Root 609 0 R /Info 610 0 R /ID [<49A524A9C9E3B8CC8C4082D4280543C1> <49A524A9C9E3B8CC8C4082D4280543C1>] /Length 1460 /Filter /FlateDecode >> stream x%KlWE-B)-R(W)-)}C @K5qh1&&&v. |DY9ƐH&F776˹sν̽!B!X 0@a^d"(1zˠ~qX V,kp5bV5+ceZO7F m 4[zMae<΂`׹oݚ[Kn&n0*xܫSvvA}`?8A^~p A0c`'')pL3,8fE0fy0.Ebam2~\2- 2yAN !0N*.rdMB%:@e06pD$Öp\ pk9Um} `)GVGVGVGVGVW,Yh*j&u=~ vvvz;z;¹^k3h-^p4#0Ԥ{L-}` t Q np:"\sHHHHHHH=^Mz vN gk ѝpr,ozj9:kh)1G-8XOMq?p'-H~uHk83>yYSA9 wgtK2] BBGXT}tt=):::::-`{4P-@JtkA΋%Pfh^ IS`-,7:*-`+hM\yhl&Mv#q-q7~D̸ {>yE<ޗ!D\iMW1f5ƶ8bVHc4DdolAqYofq,xAc `ʬ M% @*sfhws F m\6Q'ݫq(iġ jxQ1%Jكv] I`ڷ9q- ^{{ޮFCsBħ7Jj+UB\ Z<jHo<P%EB/%V22ʓ,aX=GoNUM4Q+iZ(헦$HV9>QL2 S2 +cMkr5n$fC_G֯ d2L2̤3L2- ̴d%3δd&drIN& Zwz_YmEVKYE8֩ߊW?TtĊv):j*VgEV|P1+<7h^;dR4l'XyuQ+.)[[O7EE's&[EVQסU컧UVqMESVi_*P6M跻 l,[@+m ;A'v.*_ Vl} endstream endobj startxref 484628 %%EOF rgenoud/tests/0000755000176200001440000000000013421760006013056 5ustar liggesusersrgenoud/tests/testthat.R0000644000176200001440000000005113171746275015053 0ustar liggesuserslibrary(testthat) test_check("rgenoud") rgenoud/tests/testthat/0000755000176200001440000000000013422437302014717 5ustar liggesusersrgenoud/tests/testthat/test-Example.R0000644000176200001440000000022413171745513017417 0ustar liggesuserstest_that("This is just an example test which should not fail!", { set.seed(1242) x <- iris[1,1] expect_equal(x, 5.1, tolerance = 0.00001) }) rgenoud/tests/testthat/test-genoud_no_given_seed.R0000644000176200001440000000522713421757307022203 0ustar liggesuserstest_that("Tests the new version of genoud() where the seeds are not given", { # here we test a lot of things for genoud() set.seed(746612) #maximize the sin function sin1 <- genoud( sin, nvars = 1, max = TRUE, print.level = 0 ) expect_equal(sin1$value, 1) expect_equal(sin1$par, 7.853982, tolerance = 1e-6) expect_equal(sin1$gradients, -3.496816e-12) #minimize the sin function sin2 <- genoud( sin, nvars = 1, max = FALSE, print.level = 0 ) expect_equal(sin2$value, -1) expect_equal(sin2$par, -1.570796, tolerance=1e-4) expect_equal(sin2$gradients, 5.944754e-11) #maximize a univariate normal mixture which looks like a claw claw <- function(xx) { x <- xx[1] y <- (0.46 * (dnorm(x, -1.0, 2.0 / 3.0) + dnorm(x, 1.0, 2.0 / 3.0)) + (1.0 / 300.0) * (dnorm(x, -0.5, .01) + dnorm(x, -1.0, .01) + dnorm(x, -1.5, .01)) + (7.0 / 300.0) * (dnorm(x, 0.5, .07) + dnorm(x, 1.0, .07) + dnorm(x, 1.5, .07))) return(y) } claw1 <- genoud( claw, nvars = 1, pop.size = 3000, max = TRUE, print.level = 0 ) expect_equal(claw1$value, 0.4113123, tolerance=1e-6) expect_equal(claw1$par, 0.9995032, tolerance=1e-6) expect_equal(claw1$gradients, -4.34173e-08, tolerance=1e-6) #too variable without seeds being set # Maximize a bivariate normal mixture which looks like a claw. # biclaw <- function(xx) { # mNd2 <- function(x1, x2, mu1, mu2, sigma1, sigma2, rho) # { # z1 <- (x1 - mu1) / sigma1 # z2 <- (x2 - mu2) / sigma2 # w <- (1.0 / (2.0 * pi * sigma1 * sigma2 * sqrt(1 - rho * rho))) # w <- w * exp(-0.5 * (z1 * z1 - 2 * rho * z1 * z2 + z2 * z2) / # (1 - rho * rho)) # return(w) # } # x1 <- xx[1] + 1 # x2 <- xx[2] + 1 # # y <- (0.5 * mNd2(x1, x2, 0.0, 0.0, 1.0, 1.0, 0.0) + # 0.1 * ( # mNd2(x1, x2, -1.0, -1.0, 0.1, 0.1, 0.0) + # mNd2(x1, x2, -0.5, -0.5, 0.1, 0.1, 0.0) + # mNd2(x1, x2, 0.0, 0.0, 0.1, 0.1, 0.0) + # mNd2(x1, x2, 0.5, 0.5, 0.1, 0.1, 0.0) + # mNd2(x1, x2, 1.0, 1.0, 0.1, 0.1, 0.0) # )) # # return(y) # } # biclaw1 <- # genoud( # biclaw, # default.domains = 20, # nvars = 2, # pop.size = 5000, # max = TRUE, # print.level = 0 # ) # expect_equal(biclaw1$value, 1.65353, tolerance=1e-6) # expect_equal(biclaw1$par, c(-0.5001947, -0.5001947), tolerance=1e-6) # expect_equal(biclaw1$gradients, c(-1.526799e-06, -8.571643e-07), # tolerance=1e-6) }) rgenoud/tests/testthat/test-genoud_fixed_seed.R0000644000176200001440000000540013171745520021463 0ustar liggesuserstest_that("Tests the old version of genoud() where the seed are given", { # here we test a lot of things for genoud() set.seed(746612) #maximize the sin function sin1 <- genoud( sin, nvars = 1, max = TRUE, unif.seed = 912821, int.seed = 93058, print.level = 0 ) expect_equal(sin1$value, 1) expect_equal(sin1$par, 7.85398, tolerance = 1e-6) expect_equal(sin1$gradients, sin1$gradients) #minimize the sin function sin2 <- genoud( sin, nvars = 1, max = FALSE, unif.seed = 912821, int.seed = 93058, print.level = 0 ) expect_equal(sin2$value, -1) expect_equal(sin2$par, -1.570796, tolerance=1e-4) expect_equal(sin2$gradients, 5.944754e-11) #maximize a univariate normal mixture which looks like a claw claw <- function(xx) { x <- xx[1] y <- (0.46 * (dnorm(x, -1.0, 2.0 / 3.0) + dnorm(x, 1.0, 2.0 / 3.0)) + (1.0 / 300.0) * (dnorm(x, -0.5, .01) + dnorm(x, -1.0, .01) + dnorm(x, -1.5, .01)) + (7.0 / 300.0) * (dnorm(x, 0.5, .07) + dnorm(x, 1.0, .07) + dnorm(x, 1.5, .07))) return(y) } claw1 <- genoud( claw, nvars = 1, pop.size = 3000, max = TRUE, unif.seed = 912821, int.seed = 93058, print.level = 0 ) expect_equal(claw1$value, 0.4113123, tolerance=1e-6) expect_equal(claw1$par, 0.9995032, tolerance=1e-6) expect_equal(claw1$gradients, -1.277157e-06, tolerance=1e-6) # Maximize a bivariate normal mixture which looks like a claw. biclaw <- function(xx) { mNd2 <- function(x1, x2, mu1, mu2, sigma1, sigma2, rho) { z1 <- (x1 - mu1) / sigma1 z2 <- (x2 - mu2) / sigma2 w <- (1.0 / (2.0 * pi * sigma1 * sigma2 * sqrt(1 - rho * rho))) w <- w * exp(-0.5 * (z1 * z1 - 2 * rho * z1 * z2 + z2 * z2) / (1 - rho * rho)) return(w) } x1 <- xx[1] + 1 x2 <- xx[2] + 1 y <- (0.5 * mNd2(x1, x2, 0.0, 0.0, 1.0, 1.0, 0.0) + 0.1 * ( mNd2(x1, x2, -1.0, -1.0, 0.1, 0.1, 0.0) + mNd2(x1, x2, -0.5, -0.5, 0.1, 0.1, 0.0) + mNd2(x1, x2, 0.0, 0.0, 0.1, 0.1, 0.0) + mNd2(x1, x2, 0.5, 0.5, 0.1, 0.1, 0.0) + mNd2(x1, x2, 1.0, 1.0, 0.1, 0.1, 0.0) )) return(y) } biclaw1 <- genoud( biclaw, default.domains = 20, nvars = 2, pop.size = 5000, max = TRUE, unif.seed = 912821, int.seed = 93058, print.level = 0 ) expect_equal(biclaw1$value, 1.671127, tolerance=1e-6) expect_equal(biclaw1$par, c(-1, -1), tolerance=1e-6) expect_equal(biclaw1$gradients, c(2.491051e-08, -3.427565e-08), tolerance=1e-6) }) rgenoud/tests/tests.Rout.save0000644000176200001440000000307313421760063016036 0ustar liggesusers R version 3.5.1 (2018-07-02) -- "Feather Spray" Copyright (C) 2018 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin15.6.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressMessages(library(rgenoud)) > > #maximize the sin function > sin1 <- genoud(sin, nvars=1, max=TRUE, unif.seed=912821, int.seed=93058, print.level=0) > sin1$value <- signif(sin1$value,6) > sin1$par <- signif(sin1$par,6) > sin1$gradients <- signif(sin1$gradients,6) > print(sin1) $value [1] 1 $par [1] 7.85398 $gradients [1] -3.8465e-11 $generations [1] 11 $peakgeneration [1] 1 $popsize [1] 1000 $operators [1] 122 125 125 125 125 126 125 126 0 > > #minimize the sin function > sin2 <- genoud(sin, nvars=1, max=FALSE, unif.seed=912821, int.seed=93058, print.level=0) > sin2$value <- signif(sin2$value,6) > sin2$par <- signif(sin2$par,6) > sin2$gradients <- signif(sin2$gradients,6) > print(sin2) $value [1] -1 $par [1] -1.5708 $gradients [1] 5.94475e-11 $generations [1] 11 $peakgeneration [1] 1 $popsize [1] 1000 $operators [1] 122 125 125 125 125 126 125 126 0 > > > proc.time() user system elapsed 0.508 0.045 0.537 rgenoud/tests/tests.R0000644000176200001440000000077713421760006014356 0ustar liggesuserssuppressMessages(library(rgenoud)) #maximize the sin function sin1 <- genoud(sin, nvars=1, max=TRUE, unif.seed=912821, int.seed=93058, print.level=0) sin1$value <- signif(sin1$value,6) sin1$par <- signif(sin1$par,6) sin1$gradients <- signif(sin1$gradients,6) print(sin1) #minimize the sin function sin2 <- genoud(sin, nvars=1, max=FALSE, unif.seed=912821, int.seed=93058, print.level=0) sin2$value <- signif(sin2$value,6) sin2$par <- signif(sin2$par,6) sin2$gradients <- signif(sin2$gradients,6) print(sin2) rgenoud/src/0000755000176200001440000000000013421760172012507 5ustar liggesusersrgenoud/src/unif.h0000644000176200001440000000135213421760173013623 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu $Header: /home/jsekhon/xchg/genoud/rgenoud.distribution/sources/RCS/unif.h,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ /* Tausworthe-Lewis-Payne generator */ #ifndef DEFTLPGEN typedef int integer; #define TLPAUXSIZE 1300 #define TLPDBSIZ 2000 #define ZEROI ((integer)0) #define TLPMOD 2147483647 void ruxorv (integer *, int, double *, integer *); void tlpseq (integer *, int, integer *, integer *); void tauint (integer *); void tlpcor (integer, int, integer *, integer *); #define DEFTLPGEN #endif rgenoud/src/print_format.cpp0000644000176200001440000001576313421760173015734 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu */ #include "genoud.h" /********************************************************************************/ /* ReadPopulation(): */ /* */ /* This function reads in an old population file and initializes the */ /* newpopulation with it. */ /* */ /* */ /********************************************************************************/ long ReadPopulation(double **Data, long NewPopSize, long NewVars, FILE *fp, short PrintLevel) { char ctmp[MAXPATH]; int generation, PopSize, nvars, UsePopSize, FitVals; int i, j, ltmp, fint; double **OldData; short trip=0; /* This reads the "Generations:" name */ while(!(feof(fp))) { /* pos = ftell(fp); */ fint = fscanf(fp, "%s", ctmp); fint = fscanf(fp, " %d", &generation); if(PrintLevel>0) Rprintf( "Generation: %d\n", generation); /* This reads the "Population" name */ fint = fscanf(fp, "%s", ctmp); /* This reads the "Size:" name */ fint = fscanf(fp, "%s", ctmp); fint = fscanf(fp, " %d", &PopSize); if( ((PrintLevel>0) & (trip==0)) ) Rprintf( "Population Size: %d\n", PopSize); fint = fscanf(fp, "%s", ctmp); /* reads "Fit" */ fint = fscanf(fp, "%s", ctmp); /* reads "Values:" */ fint = fscanf(fp, "%d", &FitVals); /* reads number of fit values */ if(FitVals > 1) warning("Reading an existing population file is not supported for Fit Values != 1"); /* This reads the "Variables:" name */ fint = fscanf(fp, "%s", ctmp); fint = fscanf(fp, " %d", &nvars); if( ((PrintLevel>0) & (trip==0)) ) Rprintf( "Number of Variables: %d\n", nvars); if (trip==0) { if (nvars!=NewVars) return(0); OldData = JaMatrixAllocate(PopSize+2, nvars+2); trip++; } /* loop over the main data part */ for (i=1; i<=PopSize; i++) { fint = fscanf(fp,"%d",<mp); for (j=0; j<=nvars; j++) { fint = fscanf(fp,"%lf", &OldData[i][j]); } } } /* Map OldData to Data */ if (NewPopSize < PopSize) UsePopSize = NewPopSize; else UsePopSize=PopSize; for (i=1; i<=UsePopSize; i++) { Data[i][nvars+1] = 0.0; for (j=0; j<=nvars; j++) { Data[i][j] = OldData[i][j]; } } /* let's print the population file */ if(PrintLevel>1) { Rprintf( "\nRead in Population. Used Population Size: %d\n", UsePopSize); for (i=1; i<=UsePopSize; i++) { Rprintf( "%d \t", i); for (j=0; j<=nvars; j++) { Rprintf( "%e \t", Data[i][j]); } Rprintf( "\n"); } Rprintf( "\n"); /* fflush(output); */ } JaMatrixFree(OldData, PopSize); return(PopSize); } /* end Read Population */ /********************************************************************************/ /* */ /* FUNCTION NAME : print_domains() */ /* */ /* SYNOPSIS : void print_domains(equal,t_equ) */ /* */ /* DESCRIPTION : This function prints the matrix passed, on to*/ /* the standard output, in the format of */ /* domains. */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void print_domains(MATRIX equal, int t_equ, short DataType) /* MATRIX equal; the domains matrix, with the upper and lower limits int t_equ; *the total number of domains */ { int i,j; Rprintf("Domains:\n"); //Integer if (DataType==1) { for(i=1; i<=t_equ; i++) { for(j=1; j<=3; j++) { if(j == 2) Rprintf(" <= X%-2d <= ",(int)equal[i][j]); else Rprintf(" %d ",(int) equal[i][j]); } Rprintf("\n"); } } else { for(i=1; i<=t_equ; i++) { for(j=1; j<=3; j++) { if(j == 2) Rprintf(" <= X%-2d <= ",(int)equal[i][j]); else Rprintf(" %e ",equal[i][j]); } Rprintf("\n"); } } } /********************************************************************************/ /* */ /* FUNCTION NAME : print_population() */ /* */ /********************************************************************************/ void print_population(int popsize, int nvars, int generation, int lexical, double **foo, FILE *out) { int i,j; if (lexical < 2) { fprintf(out,"Generation: %d \t Population Size: %d \t Fit Values: 1 \t Variables: %d\n\n", generation, popsize, nvars); for(i = 1; i <= popsize; i++) { fprintf(out,"%d \t %e \t",i, foo[i][0]); for (j = 1; j <= nvars; j++) { fprintf(out,"%e \t ",foo[i][j]); } fprintf(out,"\n"); } fprintf(out,"\n\n"); } else { long lexical_end = lexical-1+nvars+2; fprintf(out,"Generation: %d \t Population Size: %d \t Fit Values: %d \t Variables: %d\n\n", generation, popsize, lexical, nvars); for(i = 1; i <= popsize; i++) { fprintf(out,"%d \t ", i); /* print lexical fit values */ fprintf(out,"%e \t ",foo[i][0]); for(j=(nvars+2);j Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu June 3, 2012 */ #include "genoud.h" #include "unif.h" /* unif.h integer definition */ int NewUnifSeed[MAXTHREADS]; int RandIntSeed[MAXTHREADS]; int ThreadNumber; extern double func4g(double *X); void genoud(struct GND_IOstructure *Structure) { extern int NewUnifSeed[MAXTHREADS]; extern int RandIntSeed[MAXTHREADS]; extern int ThreadNumber; MATRIX domains, /*Matrix for Domains*/ final_mat; /*The final Domain*/ VECTOR LowerBounds, UpperBounds, X; /*Initial values for the variables*/ INDEX fin; /*Size of final matrix*/ int i, /*Counter variable*/ nvars; /*Remaining variables after p-variables were eliminated*/ time_t start_time, stop_time; double delta_time; long hours, minutes, seconds; char time_str[27]; static short firsttime=1; /* FILE *output; */ /* Lamarck Child Test Variables */ // char LVMchar[1000]; long LVMreturn; /********************************************************************************/ LVMreturn=0; time(&start_time); strcpy(time_str, ctime(&start_time)); /* Fault Tolerant MinMax */ if (Structure->MinMax > 0) Structure->MinMax=1; else Structure->MinMax=0; if (Structure->OutputType!=0) { error("output path/type must be the 'R' default"); } /* else { output=stdout; } */ if(Structure->PrintLevel>0) Rprintf("\n\n%s",time_str); ThreadNumber=Structure->ThreadNumber; if (ThreadNumber > MAXTHREADS) { error("No more than %d threads allowed\n\n", MAXTHREADS); } if (Structure->ProvideSeeds == 1) { // Only toggle the instance number if we have threads! NewUnifSeed[ThreadNumber] = Structure->UnifSeed; RandIntSeed[ThreadNumber] = Structure->IntSeed; } else { /*If a Seed is NOT provided, use the base random number and run from that base! In other words, might as well the ThreadNumber equal to 0 */ if (firsttime==1) { //NewUnifSeed[0] = BaseNewUnifSeed; //RandIntSeed[0] = BaseRandIntSeed; firsttime=0; } ThreadNumber = 0; } fin.r = Structure->nvars; /*total number of inequalities + domains*/ fin.c = Structure->nvars+2; /*x2 variables + lower limits + upper limits*/ nvars = Structure->nvars; /*Allocating memory for all the vectors and matrices*/ final_mat = matrix(1,fin.r,1,fin.c); domains = matrix(1,nvars,1,3); LowerBounds = Gvector(1, nvars); UpperBounds = Gvector(1, nvars); X = Gvector(1,nvars); /* SETUP DOMAINS */ /* alter the domains when we are using integers because of the "open set" problem. We only extend the UPPER domain bound */ if (Structure->DataType==1) { for(i=0; invars; i++) Structure->Domains[i][1] = Structure->Domains[i][1] + 0.99999; } for(i=1; i<=Structure->nvars; i++) { domains[i][1] = Structure->Domains[i-1][0]; domains[i][2] = (double) i; domains[i][3] = Structure->Domains[i-1][1]; } for (i=1; i<=nvars; i++) { LowerBounds[i] = domains[i][1]; UpperBounds[i] = domains[i][3]; } /*Initialization*/ if(Structure->PrintLevel>0) print_domains(domains,nvars,Structure->DataType); if (Structure->DataType==1) { JaIntegerOptimization(Structure, X, domains); } else { optimization(Structure, X, domains); } /* free memory */ free_matrix(final_mat,1,fin.r,1); free_matrix(domains, 1, nvars, 1); free_vector(LowerBounds,1); free_vector(UpperBounds,1); free_vector(X,1); /* print final numbers and the time this has taken */ if(Structure->PrintLevel>0) { Rprintf( "\n"); Rprintf( "Solution Found Generation %d\n", Structure->oPeakGeneration); Rprintf( "Number of Generations Run %d\n", Structure->oGenerations); } time(&stop_time); strcpy(time_str, ctime(&stop_time)); if(Structure->PrintLevel>0) Rprintf("\n%s",time_str); delta_time = difftime(stop_time, start_time); hours = (int) (delta_time/3600); minutes = (int) (delta_time - (hours*3600))/60; seconds = (int) delta_time - (hours*3600) - (minutes*60); if(Structure->PrintLevel>0) { Rprintf("Total run time : %d hours %d minutes and %d seconds\n", hours, minutes, seconds); /* fflush(output); */ } /* no longer allowed */ /* if (Structure->OutputType==1) fclose(output); */ } rgenoud/src/frange_ran.cpp0000644000176200001440000000354013421760173015320 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu $Header: /home/jsekhon/xchg/genoud/rgenoud.distribution/sources/RCS/frange_ran.cpp,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ #include "genoud.h" /* replacements for random number functions in GENOCOP's frange_ran.c */ #include "unif.h" double newunif(void) { extern int NewUnifSeed[MAXTHREADS]; extern int ThreadNumber; /* static integer aux[TLPAUXSIZE], iseed = NEWUNIFSEED ;*/ static integer aux[TLPAUXSIZE]; double wrkout; double wrk; /* get a random uniform double on (0,1] */ ruxorv (&NewUnifSeed[ThreadNumber], 1, &wrk, aux); wrkout = (double) wrk; return(wrkout); } double frange_ran(double llim, double ulim) /* double ulim; double llim; */ { /*llim, ulim: The upper and lower limits between which the random number is to be generated*/ double num1, diff = ulim - llim; if (diff == 0) return(llim); else if(diff < 0.0001) return((flip() == TAIL) ? llim : ulim); do { // printf("num1: %lf, ulim: %lf, llim: %lf\n",num1,ulim,llim); // fflush(stdout); num1 = llim + newunif()*(ulim-llim) ; } while((num1ulim)); // printf("fr2\n"); // fflush(stdout); return(num1); } unsigned int randint (void) { extern int RandIntSeed[MAXTHREADS]; extern int ThreadNumber; /* static integer aux[TLPAUXSIZE], iseed = RANDINTSEED ; */ static integer aux[TLPAUXSIZE]; integer wrk; int num; /* get a signed 32-bit number from the TLP generator */ tlpseq (&RandIntSeed[ThreadNumber], 1, &wrk, aux); /* truncate to 16 bits */ num = wrk%65535; return (num); } unsigned int newrand (void) { return (randint()); } rgenoud/src/evaluate.cpp0000644000176200001440000037365113421760173015041 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. University of Michigan http://www-personal.umich.edu/~wmebane Jasjeet Singh Sekhon UC Berkeley http://sekhon.berkeley.edu */ #include "genoud.h" #include "gradient.h" extern "C" { double genoud_optim(SEXP fn_optim, SEXP rho, double *X, long parameters); void RlexicalSort(SEXP fnLexicalSort, SEXP rho, double **population, short int MinMax, long pop_size, long nvars, long lexical_end, short int type); long RmemoryMatrixEvaluate(SEXP fnMemoryMatrixEvaluate, SEXP rho, double **Memory, double **population, short int MinMax, long pop_size, long UniqueCount, long nvars, long lexical, long lexical_end); void userGradientfn(SEXP fnGR, SEXP rho, double *parms, double *grad, long nvars); } long Gnvars[MAXINSTANCES]; struct GND_IOstructure *ExternStructure; int JaIntegerCMP(double **a, double **b) { extern long Gnvars[MAXINSTANCES]; extern struct GND_IOstructure *ExternStructure; long i = 0; long nvars; nvars=Gnvars[ExternStructure->InstanceNumber]; for (i=1; i<=nvars; i++) { if ( (int) a[0][i] != (int) b[0][i]) break; } if ( (int) a[0][i] > (int) b[0][i]) i = 1; else if ( (int) a[0][i] < (int) b[0][i]) i = -1; return i; } /* end of JaIntegerCMP */ int JaDoubleCMP(double **a, double **b) { extern long Gnvars[MAXINSTANCES]; extern struct GND_IOstructure *ExternStructure; long i = 0; long nvars; nvars=Gnvars[ExternStructure->InstanceNumber]; for (i=1; i<=nvars; i++) { if ( a[0][i] != b[0][i]) break; } if ( a[0][i] > b[0][i]) i = 1; else if ( a[0][i] < b[0][i]) i = -1; return i; } /* end of JaCMP */ /* Cummulative probability on crossover */ /* Random probability on mutation */ /* NO multiple hits per agent possible */ /********************************************************************************/ /* */ /* FUNCTION NAME : optimization() */ /* */ /* SYNOPSIS : double optimization(X,x1,x2,fin_mat,rc,tot_eq) */ /* */ /* DESCRIPTION : This procedure initializes the population */ /* with the values X passed from main, and */ /* evaluates them. After assigning weight */ /* for each member of the populaiton, a group */ /* of them are chosen to reproduce and a group */ /* is chosen to die. Genetic operators are */ /* applied and a new generation is produced */ /* to replace the members that died. This */ /* cycle continues for the number of times, */ /* user specifies in the input file */ /* */ /* FUNCTIONS CALLED : assign_probab(), */ /* evaluate(), */ /* find_cum_probab(), */ /* find_live_die(), */ /* find_parent(), */ /* ivector(), */ /* matrix(), */ /* oper1(), */ /* oper2(), */ /* oper3(), */ /* oper4(), */ /* oper5(), */ /* oper6(), */ /* print_population(), */ /* sort(), */ /* Gvector() was vector(). */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /********************************************************************************/ void optimization(struct GND_IOstructure *Structure, VECTOR X, MATRIX domains) { extern struct GND_IOstructure *ExternStructure; MATRIX new_genera, /*Temporary storage for the new generation*/ population, /*Population of x2 variables*/ temp; VECTOR probab, /*Probability of agents to die or live*/ cum_probab, /*Cumilative probability of agents*/ t_vec; IVECTOR live; /* for oper4 */ IVECTOR parents; long count_gener= 1; /*Counter to keep track of the number of generations*/ unsigned long peak_cnt; int /*Total number of agents chosen to reproduce*/ j1, j2, j3, j4, j5, j6, j7, j8, oper, ocnt, B, /*Parameter for the 3rd operator - nonuniform mutation*/ STEP, /*Parameter for the 5th operator - simple arithmetical crossover*/ first_live=0, /*Index of the two parents for crossover parents*/ second_live=0, first_die, /*Index of the two parents for crossover death*/ second_die, die_now; /*index of agent to replace in current operation*/ long i,j, s, k; /* for oper 4 */ int p2use; double Q; /*Probability of the best agent*/ FLAG same; double **Jnew; double bfgsfit; double *grad, *evalX, *finalhessin, *bfgsoutX; int nochange_gen=0; double oldfitvalue=0; int IncreaseGenerations; short int GradientTrigger=0; short int BoundaryTrigger; long InstanceNumber; long nvars, MaxGenerations, WaitGenerations, count; long pop_size, P, P0, P1, P2, P3, P4, P5, P6, P7, P8; short int MinMax, GradientCheck, BoundaryEnforcement, UseBFGS, HardMaximumNumber=0; double SolutionTolerance, *Results, *Gradients; short PrintLevel, HardGenerationLimit; /* Old variables which may change when SetRunTimeParameters is run during a run! */ long pop_size_old; /* Summary Statistics (mean, variance etc) */ /* double popmean, popvar, popwrk, popstat; */ /* Population Print population*/ FILE *popout; long *tobs, nnull; double *mean, *var, *skew, *kur; /* Stuff for the Unique Stuff (how's that for an informative comment! */ /* A big Matrix which remembers all of our past evaluations. It's maximum memory is set in genoud.h */ extern long Gnvars[MAXINSTANCES]; double **Memory; long MemorySize=0, UniqueCount=0, OldUniqueCount=0; /* fine two unique parents count */ long SameCount, UniquePairs; ExternStructure=Structure; Results=Structure->oResults; Gradients=Structure->oGradients; /* Structure Done */ SetRunTimeParameters(Structure, 1, &pop_size, &nvars, &MaxGenerations, &WaitGenerations, &MinMax, &GradientCheck, &BoundaryEnforcement, &UseBFGS, &SolutionTolerance, &InstanceNumber, &P, &P0, &P1, &P2, &P3, &P4, &P5, &P6, &P7, &P8, &PrintLevel, &HardGenerationLimit); /*Space allocation for all the vectors and matrices involved*/ long lexical_end = (Structure->Lexical-1)+nvars+2; /* population[][0] = fitness value (first) population[][1:nvars] = parameter values population[][nvars+1] = flag for fitting population[][(nvars+2):((Structure->Lexical-1)+nvars+2)] = other fitness for Lexical fitting */ population = JaMatrixAllocate(pop_size+2, lexical_end); new_genera = JaMatrixAllocate(pop_size+2, lexical_end); /* reset population to get rid of odd things being passed to R */ for(i=1; i<=pop_size; i++) { for(j=0; jLexical > 1 || Structure->Transform == 1) { LexicalReturn = (double *) malloc(Structure->Lexical*sizeof(double)); oldfitvalueVEC = (double *) malloc(Structure->Lexical*sizeof(double)); } temp = matrix(0,nvars+1,0,nvars); probab = Gvector(1,pop_size); t_vec = Gvector(1,nvars); cum_probab = Gvector(1,pop_size); live = ivector(1,pop_size); /*for oper4 Find max(2,nvars) parents for crossover operator 4*/ p2use = nvars > 2 ? nvars : 2; parents = ivector(1,p2use); Gnvars[Structure->InstanceNumber]=nvars; if (Structure->MemoryUsage==1) { if (HardGenerationLimit==0) MemorySize=3*(MaxGenerations+1)*pop_size+1+pop_size; else MemorySize=(MaxGenerations+1)*pop_size+1+pop_size; Memory = JaMatrixAllocate(MemorySize, lexical_end); } grad = (double *) malloc((nvars)*sizeof(double)); evalX = (double *) malloc((nvars)*sizeof(double)); finalhessin = (double *) malloc(((nvars*nvars)+(nvars))*sizeof(double)); bfgsoutX = (double *) malloc((nvars+1)*sizeof(double)); /* populationstats variables */ mean = (double *) malloc((nvars+1)*sizeof(double)); var = (double *) malloc((nvars+1)*sizeof(double)); skew = (double *) malloc((nvars+1)*sizeof(double)); kur = (double *) malloc((nvars+1)*sizeof(double)); tobs = (long *) malloc((nvars+1)*sizeof(long)); Q=0.5; B=6; STEP=10; if(PrintLevel>0) { switch(MinMax) { case 0: Rprintf("Minimization Problem.\n"); break; case 1: Rprintf("Maximization Problem.\n"); break; } } /* if (PrintLevel>2) { Rprintf("Parameter B (hardcoded): %d\n", B); Rprintf("Parameter Q (hardcoded): %f\n", Q); } */ peak_cnt = 0; pop_size_old=0; if (Structure->ShareType == 1 || Structure->ShareType == 3) { if(PrintLevel>0) Rprintf( "Using old population file to initialize new population.\n"); if((popout = fopen(Structure->ProjectPath, "r")) == NULL) { Rprintf(" Generating new population\n"); warning("Unable to open the old project file: %s", Structure->ProjectPath); } else { pop_size_old=ReadPopulation(population, pop_size, nvars, popout, PrintLevel); fclose(popout); if (pop_size_old<2) { warning("The old population file appears to be from a different genoud specification."); pop_size_old=0; } } if (PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "a")) == NULL) { warning("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } fclose(popout); } } /* end of ShareType 0 */ else { if (PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "w")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } fclose(popout); } } /* The new initial value matrix: setting a new initial value for every individual */ if (ExternStructure->nStartingValues > 0) { /* Adjust old starting values (from ReadPopulation) so we have enough room for our starting.values */ pop_size_old = pop_size_old-ExternStructure->nStartingValues-1; if (pop_size_old < 0) pop_size_old = 0; // seed the starting values until we run out of population or starting values! j = pop_size_old; for(s=0; snStartingValues; s++) { j++; for(i=1; i<=nvars; i++) { population[j][i] = ExternStructure->StartingValues[s][i-1]; population[j][nvars+1] = -1.0; } } // end of for loop pop_size_old = j; // randomly add on people if we still have population left over! for(j=pop_size_old+1; j<=pop_size; j++) { for(i=1; i<=nvars; i++) { population[j][i] = frange_ran(domains[i][1], domains[i][3]); population[j][nvars+1] = -1.0; } } } // end of we have starting values! else { for(j=pop_size_old+1; j<=pop_size; j++) { for(i=1; i<=nvars; i++) { population[j][i] = frange_ran(domains[i][1], domains[i][3]); population[j][nvars+1] = -1.0; } } } // end of else if (Structure->MemoryUsage==1) { OldUniqueCount=UniqueCount; if (UniqueCount==0) UniqueCount = 1; UniqueCount = RmemoryMatrixEvaluate(Structure->fnMemoryMatrixEvaluate, Structure->rho, Memory, population, MinMax, pop_size, UniqueCount, nvars, Structure->Lexical, lexical_end); if ( (UniqueCount+pop_size) >= MemorySize ) { Structure->MemoryUsage=0; warning("Turned Off MemoryMatrix because memory usage was too great."); } /* end of if */ } // end of Memory based evaluation else { for (i=1; i<=pop_size; i++) { if (population[i][nvars+1]==-1.0 || population[i][nvars+1]==11.0) { for(j=1; j<=nvars; j++) X[j] = population[i][j]; if (Structure->whichFUN == 1) // neither Lexical, nor Transform { population[i][0] = evaluate(Structure->fn, Structure->rho, X, nvars, MinMax); } else if(Structure->whichFUN == 2) // Lexical but not Transform { EvaluateLexical(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[i][0] = LexicalReturn[0]; count = 0; for(j=(nvars+2);jfn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[i][0] = LexicalReturn[0]; count = 0; if(Structure->Lexical > 1) for(j=(nvars+2);j0) { Rprintf( "\nNOTE: Transformed individual below lower bound.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e \t Bound: %e\n\n", count_gener, j, X[j], domains[j][1]); } warning("Transformed individual below lower bound. Generation: %d; Parameter: %d; Value: %e; Bound: %e", count_gener, j, X[j], domains[j][1]); } if(X[j] > domains[j][3]) { if(PrintLevel>0) { Rprintf( "\nNOTE: Transformed individual above upper bound.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e \t Bound: %e\n\n", count_gener, j, X[j], domains[j][3]); } warning("Transformed individual above upper bound. Generation: %d; Parameter: %d; Value: %e; Bound: %e", count_gener, j, X[j], domains[j][3]); } population[i][j] = X[j]; // put the transformation in anyway }//end for }//end Transform } } //end of i loop } // end of default evaluation if(Structure->MemoryUsage!=1) { /*Sort the initial individuals based on their evaluation function*/ if (Structure->Lexical < 2) { sort(MinMax,population,pop_size,0); } else { /* in eval.cpp because it is like the EvaluateLexical() function */ RlexicalSort(Structure->fnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } } peak_cnt = count_gener; /* since we are on generation 0 */ oldfitvalue=population[1][0]; if(Structure->Lexical > 1) { oldfitvalueVEC[0]=population[1][0]; k = 1; for (i=(nvars+2);i0) { Rprintf("\nThe best initial individual is:\n"); print_vector(population[1],1,nvars,output); if (Structure->Lexical > 1) { Rprintf("\nbest (lexical) fitness:\n"); Rprintf("%e ", population[1][0]); for(j=(nvars+2);jLexical > 1) { Rprintf("The worst (lexical) fitness is:\n"); Rprintf("%e ", population[pop_size][0]); for(j=(nvars+2);jLexical > 1) { Rprintf("\n\nGeneration#\t Solution Values (lexical)\n"); Rprintf("\n%7d \t%e ", 0, population[1][0]); for(j=(nvars+2);j1) { Rprintf("GENERATION: 0 (initializing the population)\n"); populationstats(population, pop_size, nvars, mean, var, skew, kur, tobs); if(Structure->Lexical > 1) { Rprintf( "Lexical Fit..... %e ", population[1][0]); for(j=(nvars+2);j 0) Rprintf( "#null........... %d\n", nnull); if(Structure->MemoryUsage==1) Rprintf( "#unique......... %d, #Total UniqueCount: %d\n", UniqueCount-OldUniqueCount, UniqueCount); /* Rprintf( "tobs............ %d\n", tobs[i]); */ for (i=1; i<=nvars; i++) { Rprintf( "var %d:\n", i); Rprintf( "best............ %e\n", population[1][i]); Rprintf( "mean............ %e\n", mean[i]); Rprintf( "variance........ %e\n", var[i]); /* Rprintf( "skewness........ %e\n", skew[i]); Rprintf( "kurtosis........ %e\n", kur[i]); */ nnull = pop_size-tobs[i]; if(nnull > 0) Rprintf( "#null........... %d\n", nnull); /* Rprintf( "tobs............ %d\n", tobs[i]); */ } } /* end of printlevel if */ /* if(PrintLevel>0) fflush(output); */ /* Print the population file */ if ( PrintLevel == 1 ) { if((popout = fopen(Structure->ProjectPath, "w")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, 0, (int) Structure->Lexical, population, popout); fclose(popout); } /* end of PrintLevel if */ if ( PrintLevel>1 ) { if((popout = fopen(Structure->ProjectPath, "a")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, 0, (int) Structure->Lexical, population, popout); fflush(popout); fclose(popout); } /* Interrupt setup. Let's print a nice message to recover the best solution so far if at least generation 0 has been run */ if ( (PrintLevel > 0) & (strcmp(Structure->ProjectPath, "/dev/null")!=0) ) setVar(install("interrupted"), ScalarLogical(1), Structure->rho); /*Assigning probability of survival for each of the agent, with the*/ /*probability provided by the user for the best agent*/ assign_probab(probab,pop_size,Q); /*Finding the cumulative probability of the agents*/ find_cum_probab(cum_probab,probab,pop_size); /*Reproducing and evaluating for the total number of generations times*/ do { /*Initializing the live vector*/ for(j=1; j<=pop_size; j++) { live[j] = 0; for(i=0; i0; ocnt--) oper1(t_vec,domains,nvars); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j1++; } break; case 2: /* JS Description: Boundary Mutation */ /*Applying the second operator, boundary mutation*/ if (j2 < P2) { /*Find one parent for mutation operator 2*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 2.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; oper2(t_vec,domains,nvars); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j2++; } break; case 3: /* JS Description: Non-uniform Mutation */ /*Applying the third operator, non-uniform mutation*/ if (j3 < P3) { /*Find one parent for mutation operator 3*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 3.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; for (ocnt = irange_ran(1,nvars); ocnt>0; ocnt--) oper3(t_vec,domains,nvars,MaxGenerations,count_gener,B); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j3++; } break; case 4: /*Applying the fourth operator, GENOUD Polytope Crossover */ if (j4 < (int) P4) { /*Find max(2,nvars) parents for crossover operator 4*/ for (i=1; i= (UniquePairs) ) break; for(i=1; i<=nvars; i++) { if (population[first_live][i] != population[second_live][i]) { same = FALSE; break; } } } /* end of while same==TRUE loop */ /* check that agents to replace are in range */ if (die_now < 3) { error("Not enough agents to be replaced\n"); } live[first_live]--; live[second_live]--; first_die = die_now-- ; second_die = die_now-- ; new_genera[first_die][nvars+1] = 5.0; new_genera[second_die][nvars+1] = 5.0; if (!same) { for(i=1; i<=nvars; i++) { temp[1][i] = population[first_live][i]; temp[2][i] = population[second_live][i]; } oper5(temp[1],temp[2],STEP,domains,nvars); for(i=1; i<=nvars; i++) { new_genera[first_die][i] = temp[1][i]; new_genera[second_die][i] = temp[2][i]; } } else { /* copy agent chosen twice into two new indivs */ for(i=1; i<=nvars; i++) { new_genera[first_die][i] = population[first_live][i]; new_genera[second_die][i] = population[second_live][i]; } } j5++; } break; case 6: /* JS Description: Whole Non-uniform Mutation */ /*Applying the sixth operator, whole non-uniform mutation*/ if (j6 < P6) { /*Find one parent for mutation operator 6*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 6.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; oper6(t_vec,domains,nvars,MaxGenerations,count_gener,B); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j6++; } break; case 7: /* JS Description: Heuristic Crossover */ /*Applying the seventh operator*/ if (j7 < (int) P7/2) { /*Find two distinct parents for operator 7*/ same = TRUE; SameCount=0; while (same==TRUE) { SameCount++; first_live = find_parent(live,pop_size); second_live = find_parent(live,pop_size); if (SameCount >= (UniquePairs) ) break; for(i=1; i<=nvars; i++) { if (population[first_live][i] != population[second_live][i]) { same = FALSE; break; } } } /* end of while same==TRUE loop */ /* check that agents to replace are in range */ if (die_now < 3) { error("Not enough agents to be replaced\n"); } live[first_live]--; live[second_live]--; first_die = die_now-- ; second_die = die_now-- ; new_genera[first_die][nvars+1] = 7.0; new_genera[second_die][nvars+1] = 7.0; if (!same) { if (first_live < second_live) /* first agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[first_live][i]; temp[1][i] = population[second_live][i]; } else /* second agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[second_live][i]; temp[1][i] = population[first_live][i]; } oper7(temp[1],temp[2],domains,nvars); for(i=1; i<=nvars; i++) new_genera[first_die][i] = temp[1][i]; if (first_live < second_live) /* first agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[first_live][i]; temp[1][i] = population[second_live][i]; } else /* second agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[second_live][i]; temp[1][i] = population[first_live][i]; } oper7(temp[1],temp[2],domains,nvars); for(i=1; i<=nvars; i++) new_genera[second_die][i] = temp[1][i]; } else { /* copy agent chosen twice into two new indivs */ for(i=1; i<=nvars; i++) { new_genera[first_die][i] = population[first_live][i]; new_genera[second_die][i] = population[second_live][i]; } } j7++; } case 8: /* JS Description: Local-Minimum Crossover */ /*Applying the eighth operator, homotopy (BFGS) */ if ( (j8 < P8) & (Structure->BFGSburnin >= 0) & (count_gener > Structure->BFGSburnin) ) { /*Find one parent for BFGS operator 1*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 8.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; oper8(Structure->fn_optim, Structure->rho, t_vec, domains, SolutionTolerance, nvars, BoundaryEnforcement, PrintLevel, Structure->P9mix); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j8++; } break; } } /*Replace the population with the new generation */ Jnew = new_genera; new_genera = population; population = Jnew; if (Structure->MemoryUsage==1) { OldUniqueCount=UniqueCount; UniqueCount = RmemoryMatrixEvaluate(Structure->fnMemoryMatrixEvaluate, Structure->rho, Memory, population, MinMax, pop_size, UniqueCount, nvars, Structure->Lexical, lexical_end); if ( (UniqueCount+pop_size) >= MemorySize ) { Structure->MemoryUsage=0; warning("Turned Off MemoryMatrix because memory usage was too great."); } /* end of if */ } // end of MemoryUsage==1 else { for (i=1; i<=pop_size; i++) { if (population[i][nvars+1]!=0) { for(j=1; j<=nvars; j++) X[j] = population[i][j]; if (Structure->whichFUN == 1) // neither Lexical, nor Transform { population[i][0] = evaluate(Structure->fn, Structure->rho, X, nvars, MinMax); } else if(Structure->whichFUN == 2) // Lexical but not Transform { EvaluateLexical(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[i][0] = LexicalReturn[0]; count = 0; for(j=(nvars+2);jfn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[i][0] = LexicalReturn[0]; count = 0; if(Structure->Lexical > 1) for(j=(nvars+2);jMemoryUsage!=1) { /*Sort the new population based on their evaluation function*/ if (Structure->Lexical < 2) { sort(MinMax,population,pop_size,0); } else { /* in eval.cpp because it is like the EvaluateLexical() function */ RlexicalSort(Structure->fnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } } /* apply the bfgs to the best individual */ if ( (UseBFGS != 0) & (Structure->BFGSburnin >= 0) & (count_gener > Structure->BFGSburnin) ){ for (i=1; i<=nvars; i++) { bfgsoutX[i-1]=population[1][i]; } bfgsfit = genoud_optim(Structure->fn_optim, Structure->rho, bfgsoutX, nvars); if (Structure->whichFUN == 1) // neither Lexical, nor Transform { switch(MinMax) { case 0: if (population[1][0] > bfgsfit) /* minimize */ { /* is the BFGS individual in the bounds? */ BoundaryTrigger=0; /* outside of bounds ? */ for (i=0; i1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n\n", count_gener, i+1, bfgsoutX[i]); Rprintf("NOTE: Fit: %e\n\n", bfgsfit); } warning("BFGS hit on best individual produced Out of Boundary individual."); } if (bfgsoutX[i] > domains[j][3]) { BoundaryTrigger=1; if (PrintLevel>1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n", count_gener, i+1, bfgsoutX[i]); Rprintf("NOTE: Fit: %e\n\n", bfgsfit); } warning("BFGS hit on best individual produced Out of Boundary individual."); } } /* end for loop */ /* if we use out of bounds individuals then proceed */ /* 0=anything goes, 1: regular; 2: no trespassing! */ if (BoundaryEnforcement==0) { for(i=1;i<=nvars;i++) { population[1][i]=bfgsoutX[i-1]; } population[1][0]=bfgsfit; } else if (BoundaryTrigger==0) { for(i=1;i<=nvars;i++) { population[1][i]=bfgsoutX[i-1]; } population[1][0]=bfgsfit; } } /* end if (population[1][0] > bfgs) */ case 1: if (population[1][0] < bfgsfit) /* maximize */ { /* is the BFGS individual in the bounds? */ BoundaryTrigger=0; /* outside of bounds ? */ for (i=0; i1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n\n", count_gener, i+1, bfgsoutX[i]); } warning("BFGS hit on best individual produced Out of Boundary individual."); } if (bfgsoutX[i] > domains[j][3]) { BoundaryTrigger=1; if (PrintLevel>1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n\n", count_gener, i+1, bfgsoutX[i]); } warning("BFGS hit on best individual produced Out of Boundary individual."); } } /* end for loop */ /* if we we use out of bounds individuals then proceed */ /* 0=anything goes, 1: regular; 2: no trespassing! */ if (BoundaryEnforcement==0) { for(i=1;i<=nvars;i++) { population[1][i]=bfgsoutX[i-1]; } population[1][0]=bfgsfit; } else if (BoundaryTrigger==0) { for(i=1;i<=nvars;i++) { population[1][i]=bfgsoutX[i-1]; } population[1][0]=bfgsfit; } } /* end if (population[1][0] < bfgsfit) */ } /* end switch */ }/*end of NOT lexical bfgs hit */ else if(Structure->whichFUN == 2) // Lexical but not Transform { /* is the BFGS individual in the bounds? */ BoundaryTrigger=0; /* outside of bounds ? */ for (i=0; i1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n\n", count_gener, i+1, bfgsoutX[i]); Rprintf("NOTE: Fit: %e\n\n", bfgsfit); } warning("BFGS hit on best individual produced Out of Boundary individual."); } if (bfgsoutX[i] > domains[j][3]) { BoundaryTrigger=1; if (PrintLevel>1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n", count_gener, i+1, bfgsoutX[i]); Rprintf("NOTE: Fit: %e\n\n", bfgsfit); } warning("BFGS hit on best individual produced Out of Boundary individual."); } } /* end for loop */ /* if we use out of bounds individuals then proceed */ /* 0=anything goes, 1: regular; 2: no trespassing! */ /* Add new individual to the END because we are doing lexical stuff */ if (BoundaryEnforcement==0) { for(i=1;i<=nvars;i++) { population[(pop_size-1)][i]=bfgsoutX[i-1]; X[i] = bfgsoutX[i-1]; } EvaluateLexical(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[(pop_size-1)][0] = LexicalReturn[0]; count = 0; for(i=(nvars+2);ifnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } else if (BoundaryTrigger==0) { for(i=1;i<=nvars;i++) { population[(pop_size-1)][i]=bfgsoutX[i-1]; X[i] = bfgsoutX[i-1]; } EvaluateLexical(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[(pop_size-1)][0] = LexicalReturn[0]; count = 0; for(i=(nvars+2);ifnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } } /*end of LEXICAL bfgs hit */ else // Transform { for(j=1; j<=nvars; j++) { X[j] = bfgsoutX[(j-1)]; } // Call EvaluateTransform now to transform X EvaluateTransform(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); /* is the BFGS individual in the bounds? */ BoundaryTrigger=0; /* outside of bounds ? */ for (j=1; i<=nvars; i++) { if (X[j] < domains[j][1]) { BoundaryTrigger=1; if (PrintLevel>1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n\n", count_gener, j, X[j]); Rprintf("NOTE: Fit: %e\n\n", bfgsfit); } warning("BFGS hit on best individual produced Out of Boundary individual."); } if (X[j] > domains[j][3]) { BoundaryTrigger=1; if (PrintLevel>1) { Rprintf( "\nNOTE: BFGS hit on best individual produced Out of Boundary individual.\n"); Rprintf("NOTE: Generation: %d \t Parameter: %d \t Value: %e\n", count_gener, j, X[j]); Rprintf("NOTE: Fit: %e\n\n", bfgsfit); } warning("BFGS hit on best individual produced Out of Boundary individual."); } } /* end for loop */ /* if we use out of bounds individuals then proceed */ /* 0=anything goes, 1: regular; 2: no trespassing! */ /* Figure out why BoundaryEnforcement==0 and BoundaryTrigerr==0 are separate above */ if (BoundaryEnforcement == 0 || BoundaryTrigger == 0) { if(Structure->Lexical < 2) // Transform but not Lexical { for(i=1; i<=nvars; i++) { population[1][i] = X[i]; } population[1][0] = LexicalReturn[0]; // from ~45 lines above } else /* Add new individual to the END because we are doing Transform and Lexical */ { for(i=1;i<=nvars;i++) { population[(pop_size-1)][i] = X[i]; } population[(pop_size-1)][0] = LexicalReturn[0]; // from ~55 lines above count = 0; for(i=(nvars+2);ifnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } } /* end of boundary enforcment */ } /*end of TRANSFORM bfgs hit */ } /* end of UseBFGS */ /* check to see if fit is improving */ if(Structure->Lexical < 2) { switch(MinMax) { case 0: if ( (oldfitvalue - SolutionTolerance) > population[1][0]) { nochange_gen=0; oldfitvalue=population[1][0]; peak_cnt = count_gener; } else nochange_gen++; break; case 1: if ( (oldfitvalue + SolutionTolerance) < population[1][0]) { nochange_gen=0; oldfitvalue=population[1][0]; peak_cnt = count_gener; } else nochange_gen++; break; } } /* if(Structure->Lexical < 2) */ else { switch(MinMax) { case 0: LexicalFitsImproving = 0; if ( (oldfitvalue - SolutionTolerance) > population[1][0]) { LexicalFitsImproving = 1; } else { k=1; for (i=(nvars+2);i population[1][i] ) { LexicalFitsImproving = 1; break; } /* (oldfitvalueVEC[k] - SolutionTolerance) > population[1][i] ) */ k++; } /* for (i=(nvars+2);i population[1][0]) */ if (LexicalFitsImproving) { nochange_gen = 0; peak_cnt = count_gener; oldfitvalue=population[1][0]; oldfitvalueVEC[0]=population[1][0]; k = 1; for (i=(nvars+2);i population[1][i] ) */ k++; } /* for (i=(nvars+2);i population[1][0]) */ if (LexicalFitsImproving) { nochange_gen = 0; peak_cnt = count_gener; oldfitvalue=population[1][0]; oldfitvalueVEC[0]=population[1][0]; k = 1; for (i=(nvars+2);iLexical > 2) */ if(PrintLevel==1) { if( nochange_gen==0 ) { if(Structure->Lexical > 1) { Rprintf("\n%7d \t%e ", count_gener, population[1][0]); for(j=(nvars+2);j1) { Rprintf("\nGENERATION: %d\n", count_gener); populationstats(population, pop_size, nvars, mean, var, skew, kur, tobs); if(Structure->Lexical > 1) { Rprintf( "Lexical Fit..... %e ", population[1][0]); for(j=(nvars+2);j 0) Rprintf( "#null........... %d\n", nnull); if(Structure->MemoryUsage==1) Rprintf( "#unique......... %d, #Total UniqueCount: %d\n", UniqueCount-OldUniqueCount, UniqueCount); /* Rprintf( "tobs............ %d\n", tobs[i]); */ for (i=1; i<=nvars; i++) { Rprintf( "var %d:\n", i); Rprintf( "best............ %e\n", population[1][i]); Rprintf( "mean............ %e\n", mean[i]); Rprintf( "variance........ %e\n", var[i]); /* Rprintf( "skewness........ %e\n", skew[i]); Rprintf( "kurtosis........ %e\n", kur[i]); */ nnull = pop_size-tobs[i]; if(nnull > 0) Rprintf( "#null........... %d\n", nnull); /* Rprintf( "tobs............ %d\n", tobs[i]); */ } } /* end of printlevel if */ /* if (PrintLevel>0) fflush(output); */ /* Print the population file */ if ( PrintLevel == 1 ) { if((popout = fopen(Structure->ProjectPath, "w")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, (int) count_gener, (int) Structure->Lexical, population, popout); fclose(popout); } /* end of PrintLevel if */ if ( PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "a")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, (int) count_gener, (int) Structure->Lexical, population, popout); fflush(popout); fclose(popout); } if (nochange_gen > (WaitGenerations)) { /* increase the number of WaitGenerations if the gradients are NOT zero! */ if (GradientCheck==0) { if(PrintLevel>0) { Rprintf("\n'wait.generations' limit reached.\n"); Rprintf("No significant improvement in %d generations.\n", nochange_gen-1); /* fflush(output); */ } MaxGenerations = 0; nochange_gen=0; } else { for (i=1; i<=nvars; i++) { bfgsoutX[i-1]=population[1][i]; } if(Structure->UserGradient==0) { gradient(Structure->fn, Structure->rho, bfgsoutX, grad, nvars, MinMax, BoundaryEnforcement, domains); } else { userGradientfn(Structure->fnGR, Structure->rho, bfgsoutX, grad, nvars); } GradientTrigger = 0; for (i=0; i SolutionTolerance) { GradientTrigger = 1; break; } } /* end for loop */ if (GradientTrigger==1) { IncreaseGenerations = WaitGenerations; WaitGenerations += IncreaseGenerations; if(Structure->BFGSburnin < 0) Structure->BFGSburnin = 0; if(PrintLevel>0) { Rprintf( "\nDoubling 'wait.generations' limit to %d (from %d) ", WaitGenerations, IncreaseGenerations); Rprintf("because at least one gradient is too large.\n"); Rprintf("G[%d]: %e\t Solution Tolerance: %e\n\n", i+1, grad[i], SolutionTolerance); } } else { if(PrintLevel>0) { Rprintf("\n'wait.generations' limit reached.\n"); Rprintf("No significant improvement in %d generations.\n", nochange_gen-1); /* fflush(output); */ } MaxGenerations = 0; nochange_gen=0; } }/* end else loop */ } /* end of if (nochange_gen > (WaitGenerations)) { */ if ( (count_gener == MaxGenerations) && (GradientTrigger==1) ) { if (HardGenerationLimit==0) { IncreaseGenerations = MaxGenerations; MaxGenerations += IncreaseGenerations; if(PrintLevel>0) { Rprintf( "\nIncreasing 'max.generations' limit by %d generations to %d ", IncreaseGenerations, MaxGenerations); Rprintf("because at least one gradient is too large.\n\n"); } } // if (Structure->HardGenerationLimit==0) else { HardMaximumNumber = 1; warning("Stopped because hard maximum generation limit was hit.\nAt least one gradient is too large."); if(PrintLevel>0) { Rprintf("\nNOTE: HARD MAXIMUM GENERATION LIMIT HIT\n"); Rprintf(" At least one gradient is too large\n"); } } // else } // if ( (count_gener == MaxGenerations) && (GradientTrigger==1) ) /* increase the number of generations if fitness has been improving */ if ( (count_gener == MaxGenerations) && (nochange_gen < WaitGenerations) ) { if (HardGenerationLimit==0) { if (WaitGenerations > MaxGenerations) { IncreaseGenerations = WaitGenerations; MaxGenerations += (int) (IncreaseGenerations); if(PrintLevel>0) { Rprintf( "\nIncreasing 'max.generations' limit by %d generations to %d ", IncreaseGenerations, MaxGenerations); Rprintf("because the fitness is still impoving.\n\n"); } } else { IncreaseGenerations = MaxGenerations; MaxGenerations += (int) (IncreaseGenerations); if(PrintLevel>0) { Rprintf( "\nIncreasing 'max.generations' limit by %d generations to %d ", IncreaseGenerations, MaxGenerations); Rprintf("because the fitness is still improving.\n\n"); } } } // if (Structure->HardGenerationLimit==0) else { if (HardMaximumNumber==0) { warning("Stopped because hard maximum generation limit was hit."); if(PrintLevel>0) { Rprintf("\nNOTE: HARD MAXIMUM GENERATION LIMIT HIT\n"); } } /* end of if HardMax */ } } // if ( (count_gener == MaxGenerations) && (nochange_gen < WaitGenerations) ) /* if(PrintLevel>0) fflush(output); */ } /* end of do loop */ /*Increment iteration count and test whether all generations are done*/ while (++count_gener <= MaxGenerations); if(PrintLevel>0) { if(Structure->Lexical > 1) { Rprintf("\nSolution Lexical Fitness Value:\n"); Rprintf("%e ", population[1][0]); for(j=(nvars+2);joPeakGeneration=peak_cnt; Structure->oGenerations=count_gener-1; /* obtain gradients */ /* print best solution */ if (GradientCheck==0 && UseBFGS==0) { for(j = 1; j <= nvars; j++) { i = j-1; if(PrintLevel>0) Rprintf(" X[%2d] :\t%e\n",j,population[1][j]); grad[i] = -1.0; Results[i] = population[1][j]; Gradients[i] = grad[i]; } } /* end of if (GradientCheck==0 && UseBFGS==0) */ else { for (i=1; i<=nvars; i++) { bfgsoutX[i-1]=population[1][i]; } if(Structure->UserGradient==0) { gradient(Structure->fn, Structure->rho, bfgsoutX, grad, nvars, MinMax, BoundaryEnforcement, domains); } else { userGradientfn(Structure->fnGR, Structure->rho, bfgsoutX, grad, nvars); } for(j = 1; j <= nvars; j++) { i = j-1; if(PrintLevel>0) Rprintf(" X[%2d] :\t%e\tG[%2d] :\t%e\n",j,population[1][j],j,grad[i]); Results[i] = population[1][j]; Gradients[i] = grad[i]; } } /* end of else (GradientCheck==0 && UseBFGS==0) */ Structure->oFitValues[0]=population[1][0]; if (Structure->Lexical > 1) { k = 1; for (i=(nvars+2);ioFitValues[k]=population[1][i]; k++; } } /* free memory */ /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1 || Structure->Transform == 1) { free(LexicalReturn); free(oldfitvalueVEC); } } /* end optimiztion function */ /********************************************************************************/ /* */ /* FUNCTION NAME : sort() */ /* */ /* SYNOPSIS : void sort(MinMax, population,pop_size, */ /* variable) */ /* */ /* DESCRIPTION : This function sorts the population, in the */ /* ascending or the descending order of the */ /* evaluation function, depending on whether */ /* it is a maximization or a minimization */ /* function, respectively. */ /* */ /* As an alternative, the sortq function below */ /* can be used, That sorting function uses */ /* the quicksort algorithm. */ /* */ /* */ /* FUNCTIONS CALLED : swap() */ /* */ /* CALLING FUNCITONS : optimization() */ /* */ /********************************************************************************/ void sort(short int MinMax, MATRIX population, int pop_size, long nvar) /* short int MinMax; Tells whether it is a maximizaiton or a minimization function int pop_size; Population size MATRIX population; Array of population */ { int i,j; /*If MinMax is 0 sorts in the descending order, and*/ /*if it is 1 sorts in the ascending order*/ /*Sorted in ascending or descending order, based on*/ /*the evaluated values of each of the agents*/ switch(MinMax) { case 0 : for(i=1; i<=pop_size; i++) for(j=i+1; j<=pop_size; j++) if(population[i][nvar] > population[j][nvar]) swap(&population[i],&population[j]); break; case 1 : for(i=1; i<=pop_size; i++) for(j=i+1; j<=pop_size; j++) if(population[i][nvar] < population[j][nvar]) swap(&population[i],&population[j]); break; } } /********************************************************************************/ /* */ /* FUNCTION NAME : swap() */ /* */ /* SYNOPSIS : void swap(x,y) */ /* */ /* DESCRIPTION : This function interchanges the values of */ /* x and y. */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : sort() */ /* */ /* */ /********************************************************************************/ void swap(double **x, double **y) /* double **x,**y; */ { double *temp; temp = *x; *x = *y; *y = temp; } /********************************************************************************/ /* */ /* FUNCTION NAME : find_parent() */ /* */ /* SYNOPSIS : int find_parent(live,pop_size) */ /* */ /* DESCRIPTION : This function returns the index of the */ /* agent in the population, which is to be */ /* chosen for reproduction. */ /* */ /* FUNCTIONS CALLED : irange_ran() */ /* */ /* CALLING FUNCITONS : optimization() */ /* */ /* */ /********************************************************************************/ int find_parent(IVECTOR live, int pop_size) /* int pop_size; Population size IVECTOR live; Vector containing the number of times each agent is going to reproduce */ { int i,temp,t1=0,tot=0; /*Finding the total number of parents to reproduce*/ for(i=1; i<=pop_size; i++) tot = tot + live[i]; if(tot==0) { error("No agents to select"); } /*Choosing one of them randomly*/ temp = irange_ran(1,tot); tot = 0; i = 1; do{ if(live[i]!=0) t1 = i; tot = tot + live[i++]; }while(tot cum_probab[i]) && (i< pop_size)); /*Chosing the parent with that probability to reproduce*/ if(count < P) { live[i]++; count++; } }while(count < P); } /********************************************************************************/ /* */ /* FUNCTION NAME : find_die() */ /* */ /* SYNOPSIS : void find_die(cum_probab,die,pop_size,P4+P5) */ /* */ /* DESCRIPTION : This function finds the agents from the */ /* population, who are going to die. */ /* */ /* FUNCTIONS CALLED : frange_ran() */ /* */ /* CALLING FUNCITONS : optimization() */ /* */ /* */ /* */ /********************************************************************************/ int find_die(VECTOR cum_probab, IVECTOR die, int pop_size) /* VECTOR cum_probab; Cumulative probability IVECTOR die; Agents that are going to die int pop_size; Population size */ { double random; int i; int done = FALSE; do { /*Choosing a random cumulative probability*/ random = frange_ran(0.0,1.0); i=0; /*Finding the agent with the chosen cumulative probability*/ do{ i++; } while((random > cum_probab[i]) && (i< pop_size)); /*Chosing the agent to die*/ if ((die[pop_size+1-i] == 0) && (i < pop_size)) done = TRUE; } while(!done); return(pop_size+1-i); } void SetRunTimeParameters(struct GND_IOstructure *Structure, short FirstTime, long *PopSize, long *nvars, long *MaxGenerations, long *WaitGenerations, short *MinMax, short *GradientCheck, short *BoundaryEnforcement, short *UseBFGS, double *SolutionTolerance, long *InstanceNumber, long *P, long *P0, long *P1, long *P2, long *P3, long *P4, long *P5, long *P6, long *P7, long *P8, short *PrintLevel, short *HardGenerationLimit) { double tP; int i; *PopSize=Structure->PopSize; *nvars=Structure->nvars; *MaxGenerations=Structure->MaxGenerations; *WaitGenerations=Structure->WaitGenerations; if (FirstTime==1) *HardGenerationLimit=Structure->HardGenerationLimit; *MinMax=Structure->MinMax; *GradientCheck=Structure->GradientCheck; *BoundaryEnforcement=Structure->BoundaryEnforcement; *UseBFGS=Structure->UseBFGS; *InstanceNumber=Structure->InstanceNumber; *SolutionTolerance=Structure->SolutionTolerance; *PrintLevel=Structure->PrintLevel; /* Check to make sure that all operators are positve numbers! */ if (Structure->P[0] < 0 ) { warning("Operator 1 (Cloning) was Assigned an Illegal Value: %d.", Structure->P[0]); Structure->P[0]=0.0; } if (Structure->P[1] < 0 ) { warning("Operator 1 (Uniform Mutation) was Assigned an Illegal Value: %d.", Structure->P[1]); Structure->P[1]=0.0; } if (Structure->P[2] < 0 ) { warning("Operator 3 (Boundary Mutation) was Assigned an Illegal Value: %d.", Structure->P[2]); Structure->P[2]=0; } if (Structure->P[3] < 0 ) { warning("Operator 4 (Non-Uniform Mutation) was Assigned an Illegal Value: %d.", Structure->P[3]); Structure->P[3]=0; } if (Structure->P[4] < 0 ) { warning("Operator 5 (Polytope Crossover) was Assigned an Illegal Value: %d.", Structure->P[4]); Structure->P[4]=0; } if (Structure->P[5] < 0 ) { warning("Operator 6 (Simple Crossover) was Assigned an Illegal Value: %d.", Structure->P[5]); Structure->P[5]=0; } if (Structure->P[6] < 0 ) { warning("Operator 7 (Whole Non-Uniform Mutation) was Assigned an Illegal Value: %d.", Structure->P[6]); Structure->P[6]=0; } if (Structure->P[7] < 0 ) { warning("Operator 8 (Heuristic Crossover) was Assigned an Illegal Value: %d.", Structure->P[7]); Structure->P[7]=0; } /* if DataType==1 (i.e., integer) we are not giong to use any gradient information etc. */ if (Structure->DataType==1) { *UseBFGS=0; *GradientCheck=0; if (Structure->P[8] > 0) { warning("Operator 9 (Local-Minimum Crossover) was Assigned an Illegal Value: %d\nThis is an illegal value because we are working with integer data.", Structure->P[8]); Structure->P[8]=0; } /* end of if */ } else { if (Structure->P[8] < 0 ) { warning("Operator 9 (Local-Minimum Crossover) was Assigned an Illegal Value: %d.", Structure->P[8]); Structure->P[8]=0; } } /* end of else */ /* Let's figure out the number of operators we need. Move stuff to absolute space */ tP = 0; for (i=0; i<9; i++) { tP = tP + Structure->P[i] ; } if (tP > 0) { *P0 = Iround( (Structure->P[0] / tP) * (double) (*PopSize-2) ); *P1 = Iround( (Structure->P[1] / tP) * (*PopSize-2) ); *P2 = Iround( (Structure->P[2] / tP) * (*PopSize-2) ); *P3 = Iround( (Structure->P[3] / tP) * (*PopSize-2) ); *P4 = Iround( (Structure->P[4] / tP) * (*PopSize-2) ); *P5 = Iround( (Structure->P[5] / tP) * (*PopSize-2) ); *P6 = Iround( (Structure->P[6] / tP) * (*PopSize-2) ); *P7 = Iround( (Structure->P[7] / tP) * (*PopSize-2) ); *P8 = Iround( (Structure->P[8] / tP) * (*PopSize-2) ); } else { *P0 = 0; *P1 = 0; *P2 = 0; *P3 = 0; *P4 = 0; *P5 = 0; *P6 = 0; *P7 = 0; *P8 = 0; } /* Check to make sure that all operators (i.e., 5, 7) which have to be even numbers are */ if (fmod((long double) *P5, (long double) 2) > 0.0) { if(Structure->PrintLevel>2) { Rprintf("\nNOTE: Operator 6 (Simple Crossover) may only be started\n"); Rprintf("NOTE: an even number of times. I am increasing this operator by one.\n"); } *P5=*P5+1; } if (fmod((long double) *P7, (long double) 2) > 0.0) { if(Structure->PrintLevel>2) { Rprintf("\nNOTE: Operator 8 (Heuristic Crossover) may only be started\n"); Rprintf("NOTE: an even number of times. I am increasing this operator by one.\n"); } *P7=*P7+1; } /*P is the total number of parents needed for applying all the operators*/ *P = *P1 + *P2 + *P3 + *P4 + *P5 + *P6 + *P7 + *P8; if(*P > *PopSize) { if(Structure->PrintLevel>0) { Rprintf("\nNOTE: The total number of operators greater than population size\n"); } if (fmod((long double) *P+1, (long double) 2) > 0.0) { *PopSize = *P+2; if(Structure->PrintLevel>0) { Rprintf("NOTE: I'm increasing the population size to %d (operators+2).\n", *PopSize); } } else { *PopSize = *P+1; if(Structure->PrintLevel>0) { Rprintf("NOTE: I'm increasing the population size to %d (operators+1).\n", *PopSize); } } } else if ( *P== *PopSize) { if(Structure->PrintLevel>0) { Rprintf("\nNOTE: The total number of operators equal to the population size\n"); } if (fmod( (long double) *P+1, (long double) 2) > 0.0) { *PopSize = *P+2; if(Structure->PrintLevel>0) { Rprintf("NOTE: I'm increasing the population size to %d (operators+2).\n", *PopSize); } } else { *PopSize = *P+1; if(Structure->PrintLevel>0) { Rprintf("NOTE: I'm increasing the population size to %d (operators+1).\n", *PopSize); } } } if (fmod( (long double) *PopSize, (long double) 2) > 0.0) { if(Structure->PrintLevel>0) { Rprintf("NOTE: population size is not an even number\n"); Rprintf(" increasing population size by 1\n"); } *PopSize=*PopSize+1; } /* return PopSize and P values to the return data structure */ *P0 = *PopSize-*P-1; Structure->oP[0]=*P0; Structure->oP[1]=*P1; Structure->oP[2]=*P2; Structure->oP[3]=*P3; Structure->oP[4]=*P4; Structure->oP[5]=*P5; Structure->oP[6]=*P6; Structure->oP[7]=*P7; Structure->oP[8]=*P8; Structure->oPopSize=*PopSize; if(Structure->PrintLevel>0) { Rprintf( "\n"); if (Structure->DataType==1) Rprintf( "Data Type: Integer\n"); else Rprintf( "Data Type: Floating Point\n"); Rprintf("Operators (code number, name, population) \n"); Rprintf("\t(1) Cloning........................... \t%d\n", *P0); Rprintf("\t(2) Uniform Mutation.................. \t%d\n", *P1); Rprintf("\t(3) Boundary Mutation................. \t%d\n", *P2); Rprintf("\t(4) Non-Uniform Mutation.............. \t%d\n", *P3); Rprintf("\t(5) Polytope Crossover................ \t%d\n", *P4); Rprintf("\t(6) Simple Crossover.................. \t%d\n", *P5); Rprintf("\t(7) Whole Non-Uniform Mutation........ \t%d\n", *P6); Rprintf("\t(8) Heuristic Crossover............... \t%d\n", *P7); Rprintf("\t(9) Local-Minimum Crossover........... \t%d\n\n", *P8); if (*HardGenerationLimit==0) Rprintf("SOFT Maximum Number of Generations: %lu\n", *MaxGenerations); else Rprintf("HARD Maximum Number of Generations: %lu\n", *MaxGenerations); Rprintf("Maximum Nonchanging Generations: %lu\n", *WaitGenerations); Rprintf("Population size : %d\n", *PopSize); Rprintf("Convergence Tolerance: %e\n", *SolutionTolerance); Rprintf( "\n"); if (*UseBFGS !=0) { Rprintf( "Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation.\n"); } else { Rprintf( "Not Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation.\n"); } if (*GradientCheck==0) Rprintf("Not Checking Gradients before Stopping.\n"); else Rprintf("Checking Gradients before Stopping.\n"); if (*BoundaryEnforcement==0) Rprintf("Using Out of Bounds Individuals.\n\n"); else if (*BoundaryEnforcement==1) Rprintf("Not Using Out of Bounds Individuals But Allowing Trespassing.\n\n"); else if (*BoundaryEnforcement==2) Rprintf("Not Using Out of Bounds Individuals and Not Allowing Trespassing.\n\n"); } /* if(Structure->PrintLevel>0) fflush(output); */ } /* End SetOperators */ /********************************************************************************/ /* JaIntegerOptimization: */ /* */ /* This function assumes that the X variables are integers. */ /* */ /* The cross over operators are different! */ /* */ /********************************************************************************/ void JaIntegerOptimization(struct GND_IOstructure *Structure, VECTOR X, MATRIX domains) { extern struct GND_IOstructure *ExternStructure; MATRIX new_genera, /*Temporary storage for the new generation*/ population, /*Population of x2 variables*/ temp; VECTOR probab, /*Probability of agents to die or live*/ cum_probab, /*Cumilative probability of agents*/ t_vec; IVECTOR live; /* for oper4 */ IVECTOR parents; long count_gener= 1; /*Counter to keep track of the number of generations*/ unsigned long peak_cnt; int /*Total number of agents chosen to reproduce*/ j1, j2, j3, j4, j5, j6, j7, j8, oper, ocnt, B, /*Parameter for the 3rd operator - nonuniform mutation*/ STEP, /*Parameter for the 5th operator - simple arithmetical crossover*/ first_live=0, /*Index of the two parents for crossover parents*/ second_live=0, first_die, /*Index of the two parents for crossover death*/ second_die, die_now; /*index of agent to replace in current operation*/ long i,j, s, k; /* for oper 4 */ int p2use; double Q; /*Probability of the best agent*/ FLAG same; double **Jnew; double *grad, *evalX, *finalhessin, *bfgsoutX; int nochange_gen=0; double oldfitvalue=0; int IncreaseGenerations; short int GradientTrigger=0; long InstanceNumber; long nvars, MaxGenerations, WaitGenerations, count; long pop_size, P, P0, P1, P2, P3, P4, P5, P6, P7, P8; short int MinMax, GradientCheck, BoundaryEnforcement, UseBFGS, HardMaximumNumber=0; double SolutionTolerance, *Results, *Gradients; short PrintLevel, HardGenerationLimit; /* Old variables which may change when SetRunTimeParameters is run during a run! */ long pop_size_old; /* Summary Statistics (mean, variance etc) */ /* double popmean, popvar, popwrk, popstat; */ /* Population Print population*/ FILE *popout; long *tobs, nnull; double *mean, *var, *skew, *kur; /* Stuff for the Unique Stuff (how's that for an informative comment! */ /* A big Matrix which remembers all of our past evaluations. It's maximum memory is set in genoud.h */ extern long Gnvars[MAXINSTANCES]; double **Memory; long MemorySize=0, UniqueCount=0, OldUniqueCount=0; /* fine two unique parents count */ long SameCount, UniquePairs; ExternStructure=Structure; Results=Structure->oResults; Gradients=Structure->oGradients; /* Structure Done */ SetRunTimeParameters(Structure, 1, &pop_size, &nvars, &MaxGenerations, &WaitGenerations, &MinMax, &GradientCheck, &BoundaryEnforcement, &UseBFGS, &SolutionTolerance, &InstanceNumber, &P, &P0, &P1, &P2, &P3, &P4, &P5, &P6, &P7, &P8, &PrintLevel, &HardGenerationLimit); /*Space allocation for all the vectors and matrices involved*/ long lexical_end = (Structure->Lexical-1)+nvars+2; /* population[][0] = fitness value (first) population[][1:nvars] = parameter values population[][nvars+1] = flag for fitting population[][(nvars+2):((Structure->Lexical-1)+nvars+2)] = other fitness for Lexical fitting */ population = JaMatrixAllocate(pop_size+2, lexical_end); new_genera = JaMatrixAllocate(pop_size+2, lexical_end); /* reset population to get rid of odd things being passed to R */ for(i=1; i<=pop_size; i++) { for(j=0; jLexical > 1) { LexicalReturn = (double *) malloc(Structure->Lexical*sizeof(double)); oldfitvalueVEC = (double *) malloc(Structure->Lexical*sizeof(double)); } temp = matrix(0,nvars+1,0,nvars); probab = Gvector(1,pop_size); t_vec = Gvector(1,nvars); cum_probab = Gvector(1,pop_size); live = ivector(1,pop_size); /*for oper4 Find max(2,nvars) parents for crossover operator 4*/ p2use = nvars > 2 ? nvars : 2; parents = ivector(1,p2use); Gnvars[Structure->InstanceNumber]=nvars; if (Structure->MemoryUsage==1) { if (HardGenerationLimit==0) MemorySize=3*(MaxGenerations+1)*pop_size+1+pop_size; else MemorySize=(MaxGenerations+1)*pop_size+1+pop_size; Memory = JaMatrixAllocate(MemorySize, lexical_end); } grad = (double *) malloc((nvars)*sizeof(double)); evalX = (double *) malloc((nvars)*sizeof(double)); finalhessin = (double *) malloc(((nvars*nvars)+(nvars))*sizeof(double)); bfgsoutX = (double *) malloc((nvars+1)*sizeof(double)); /* populationstats variables */ mean = (double *) malloc((nvars+1)*sizeof(double)); var = (double *) malloc((nvars+1)*sizeof(double)); skew = (double *) malloc((nvars+1)*sizeof(double)); kur = (double *) malloc((nvars+1)*sizeof(double)); tobs = (long *) malloc((nvars+1)*sizeof(long)); /* JS: Integer Q was different, why? Q=0.2; */ Q=0.5; B=6; STEP=10; if(PrintLevel>0) { switch(MinMax) { case 0: Rprintf("Minimization Problem.\n"); break; case 1: Rprintf("Maximization Problem.\n"); break; } } /* if (PrintLevel>2) { Rprintf("Parameter B (hardcoded): %d\n", B); Rprintf("Parameter Q (hardcoded): %f\n", Q); } */ peak_cnt = 0; pop_size_old=0; if (Structure->ShareType == 1 || Structure->ShareType == 3) { if(PrintLevel>0) Rprintf( "Using old population file to initialize new population\n"); if((popout = fopen(Structure->ProjectPath, "r")) == NULL) { Rprintf(" Generating new population\n"); warning("Unable to open the old project file: %s", Structure->ProjectPath); } else { pop_size_old=ReadPopulation(population, pop_size, nvars, popout, PrintLevel); fclose(popout); for (i=1; i<=pop_size; i++) { for (j=1; j<=nvars; j++) { population[i][j] = (int) population[i][j]; } } if (pop_size_old<2) { warning("The old population file appears to be from a different genoud specification."); pop_size_old=0; } } if (PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "a")) == NULL) { warning("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } fclose(popout); } } /* end of ShareType 0 */ else { if (PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "w")) == NULL) { warning("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } fclose(popout); } } /* The new initial value matrix: setting a new initial value for every individual */ if (ExternStructure->nStartingValues > 0) { /* Adjust old starting values (from ReadPopulation) so we have enough room for our starting.values */ pop_size_old = pop_size_old-ExternStructure->nStartingValues-1; if (pop_size_old < 0) pop_size_old = 0; // seed the starting values until we run out of population or starting values! j = pop_size_old; for(s=0; snStartingValues; s++) { j++; for(i=1; i<=nvars; i++) { population[j][i] = (int) ExternStructure->StartingValues[s][i-1]; population[j][nvars+1] = -1.0; } } // end of for loop pop_size_old = j; // randomly add on people if we still have population left over! for(j=pop_size_old+1; j<=pop_size; j++) { for(i=1; i<=nvars; i++) { population[j][i] = (int) frange_ran(domains[i][1], domains[i][3]); population[j][nvars+1] = -1.0; } } } // end of we have starting values! else { for(j=pop_size_old+1; j<=pop_size; j++) { for(i=1; i<=nvars; i++) { population[j][i] = (int) frange_ran(domains[i][1], domains[i][3]); population[j][nvars+1] = -1.0; } } } // end of else if (Structure->MemoryUsage==1) { OldUniqueCount=UniqueCount; if (UniqueCount==0) UniqueCount = 1; UniqueCount = RmemoryMatrixEvaluate(Structure->fnMemoryMatrixEvaluate, Structure->rho, Memory, population, MinMax, pop_size, UniqueCount, nvars, Structure->Lexical, lexical_end); if ( (UniqueCount+pop_size) >= MemorySize ) { Structure->MemoryUsage=0; warning("Turned Off MemoryMatrix because memory usage was too great."); } /* end of if */ } // end of Memory based evaluation else { for (i=1; i<=pop_size; i++) { if (population[i][nvars+1]==-1.0 || population[i][nvars+1]==11.0) { for(j=1; j<=nvars; j++) X[j] = population[i][j]; if (Structure->Lexical < 2) { population[i][0] = evaluate(Structure->fn, Structure->rho, X, nvars, MinMax); } else { EvaluateLexical(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[i][0] = LexicalReturn[0]; count = 0; for(j=(nvars+2);jMemoryUsage!=1) { /*Sort the initial individuals based on their evaluation function*/ if (Structure->Lexical < 2) { sort(MinMax,population,pop_size,0); } else { /* in eval.cpp because it is like the EvaluateLexical() function */ RlexicalSort(Structure->fnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } } peak_cnt = count_gener; /* since we are on generation 0 */ oldfitvalue=population[1][0]; if(Structure->Lexical > 1) { oldfitvalueVEC[0]=population[1][0]; k = 1; for (i=(nvars+2);i0) { Rprintf("\nThe best initial individual is:\n"); print_vector(population[1],1,nvars,output); if (Structure->Lexical > 1) { Rprintf("\nbest (lexical) fitness:\n"); Rprintf("%e ", population[1][0]); for(j=(nvars+2);jLexical > 1) { Rprintf("The worst (lexical) fitness is:\n"); Rprintf("%e ", population[pop_size][0]); for(j=(nvars+2);jLexical > 1) { Rprintf("\n\nGeneration#\t Solution Values (lexical)\n"); Rprintf("\n%7d \t%e ", 0, population[1][0]); for(j=(nvars+2);j1) { Rprintf("GENERATION: 0 (initializing the population)\n"); populationstats(population, pop_size, nvars, mean, var, skew, kur, tobs); if(Structure->Lexical > 1) { Rprintf( "Lexical Fit..... %e ", population[1][0]); for(j=(nvars+2);j 0) Rprintf( "#null........... %d\n", nnull); if(Structure->MemoryUsage==1) Rprintf( "#unique......... %d, #Total UniqueCount: %d\n", UniqueCount-OldUniqueCount, UniqueCount); /* Rprintf( "tobs............ %d\n", tobs[i]); */ for (i=1; i<=nvars; i++) { Rprintf( "var %d:\n", i); Rprintf( "best............ %e\n", population[1][i]); Rprintf( "mean............ %e\n", mean[i]); Rprintf( "variance........ %e\n", var[i]); /* Rprintf( "skewness........ %e\n", skew[i]); Rprintf( "kurtosis........ %e\n", kur[i]); */ nnull = pop_size-tobs[i]; if(nnull > 0) Rprintf( "#null........... %d\n", nnull); /* Rprintf( "tobs............ %d\n", tobs[i]); */ } } /* end of printlevel if */ /* if(PrintLevel>0) fflush(output); */ /* Print the population file */ if ( PrintLevel == 1 ) { if((popout = fopen(Structure->ProjectPath, "w")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, 0, (int) Structure->Lexical, population, popout); fclose(popout); } /* end of PrintLevel if */ if ( PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "a")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, 0, (int) Structure->Lexical, population, popout); fflush(popout); fclose(popout); } /* Interrupt setup. Let's print a nice message to recover the best solution so far if at least generation 0 has been run */ if ( (PrintLevel > 0) & (strcmp(Structure->ProjectPath, "/dev/null")!=0) ) setVar(install("interrupted"), ScalarLogical(1), Structure->rho); /*Assigning probability of survival for each of the agent, with the*/ /*probability provided by the user for the best agent*/ assign_probab(probab,pop_size,Q); /*Finding the cumulative probability of the agents*/ find_cum_probab(cum_probab,probab,pop_size); /*Reproducing and evaluating for the total number of generations times*/ do { /*Initializing the live vector*/ for(j=1; j<=pop_size; j++) { live[j] = 0; for(i=0; i0; ocnt--) JaIntegerOper1(t_vec,domains,nvars); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j1++; } break; case 2: /* JS Description: Boundary Mutation */ /*Applying the second operator, boundary mutation*/ if (j2 < P2) { /*Find one parent for mutation operator 2*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 2.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; JaIntegerOper2(t_vec,domains,nvars); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j2++; } break; case 3: /* JS Description: Non-uniform Mutation */ /*Applying the third operator, non-uniform mutation*/ if (j3 < P3) { /*Find one parent for mutation operator 3*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 3.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; for (ocnt = irange_ran(1,nvars); ocnt>0; ocnt--) JaIntegerOper3(t_vec,domains,nvars,MaxGenerations,count_gener,B); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j3++; } break; case 4: /*Applying the fourth operator, GENOUD Polytope Crossover */ if (j4 < (int) P4) { /*Find max(2,nvars) parents for crossover operator 4*/ for (i=1; i= (UniquePairs) ) break; for(i=1; i<=nvars; i++) { if ((int) population[first_live][i] != (int) population[second_live][i]) { same = FALSE; break; } } } /* end of while same==TRUE loop */ /* check that agents to replace are in range */ if (die_now < 3) { error("Not enough agents to be replaced\n"); } live[first_live]--; live[second_live]--; first_die = die_now-- ; second_die = die_now-- ; new_genera[first_die][nvars+1] = 5.0; new_genera[second_die][nvars+1] = 5.0; if (!same) { for(i=1; i<=nvars; i++) { temp[1][i] = population[first_live][i]; temp[2][i] = population[second_live][i]; } JaIntegerOper5(temp[1],temp[2],STEP,domains,nvars); for(i=1; i<=nvars; i++) { new_genera[first_die][i] = temp[1][i]; new_genera[second_die][i] = temp[2][i]; } } else { /* copy agent chosen twice into two new indivs */ for(i=1; i<=nvars; i++) { new_genera[first_die][i] = population[first_live][i]; new_genera[second_die][i] = population[second_live][i]; } } j5++; } break; case 6: /* JS Description: Whole Non-uniform Mutation */ /*Applying the sixth operator, whole non-uniform mutation*/ if (j6 < P6) { /*Find one parent for mutation operator 6*/ first_live = find_parent(live,pop_size); live[first_live]--; /* check that agent to replace is in range */ if (die_now < 2) { error( "No agents to be replaced\n"); } new_genera[die_now][nvars+1] = 6.0; for(i=1; i<=nvars; i++) t_vec[i] = population[first_live][i]; JaIntegerOper6(t_vec,domains,nvars,MaxGenerations,count_gener,B); for(i=1; i<=nvars; i++) new_genera[die_now][i] = t_vec[i]; die_now--; j6++; } break; case 7: /* JS Description: Heuristic Crossover */ /*Applying the seventh operator*/ if (j7 < (int) P7/2) { /*Find two distinct parents for operator 7*/ same = TRUE; SameCount=0; while (same==TRUE) { SameCount++; first_live = find_parent(live,pop_size); second_live = find_parent(live,pop_size); if (SameCount >= (UniquePairs) ) break; for(i=1; i<=nvars; i++) { if ((int) population[first_live][i] != (int) population[second_live][i]) { same = FALSE; break; } } } /* end of while same==TRUE loop */ /* check that agents to replace are in range */ if (die_now < 3) { error("Not enough agents to be replaced\n"); } live[first_live]--; live[second_live]--; first_die = die_now-- ; second_die = die_now-- ; new_genera[first_die][nvars+1] = 7.0; new_genera[second_die][nvars+1] = 7.0; if (!same) { if (first_live < second_live) /* first agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[first_live][i]; temp[1][i] = population[second_live][i]; } else /* second agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[second_live][i]; temp[1][i] = population[first_live][i]; } JaIntegerOper7(temp[1],temp[2],domains,nvars); for(i=1; i<=nvars; i++) new_genera[first_die][i] = temp[1][i]; if (first_live < second_live) /* first agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[first_live][i]; temp[1][i] = population[second_live][i]; } else /* second agent is better agent */ for(i=1; i<=nvars; i++) { temp[2][i] = population[second_live][i]; temp[1][i] = population[first_live][i]; } JaIntegerOper7(temp[1],temp[2],domains,nvars); for(i=1; i<=nvars; i++) new_genera[second_die][i] = temp[1][i]; } else { /* copy agent chosen twice into two new indivs */ for(i=1; i<=nvars; i++) { new_genera[first_die][i] = population[first_live][i]; new_genera[second_die][i] = population[second_live][i]; } } j7++; } } } /*Replace the population with the new generation */ Jnew = new_genera; new_genera = population; population = Jnew; if (Structure->MemoryUsage==1) { OldUniqueCount=UniqueCount; UniqueCount = RmemoryMatrixEvaluate(Structure->fnMemoryMatrixEvaluate, Structure->rho, Memory, population, MinMax, pop_size, UniqueCount, nvars, Structure->Lexical, lexical_end); if ( (UniqueCount+pop_size) >= MemorySize ) { Structure->MemoryUsage=0; warning("Turned Off MemoryMatrix because memory usage was too great."); } /* end of if */ } // end of MemoryUsage==1 else { for (i=1; i<=pop_size; i++) { if (population[i][nvars+1]!=0) { for(j=1; j<=nvars; j++) X[j] = population[i][j]; if (Structure->Lexical < 2) { population[i][0] = evaluate(Structure->fn, Structure->rho, X, nvars, MinMax); } else { EvaluateLexical(Structure->fn, Structure->rho, X, nvars, Structure->Lexical, MinMax, LexicalReturn); population[i][0] = LexicalReturn[0]; count = 0; for(j=(nvars+2);jMemoryUsage!=1) { /*Sort the new population based on their evaluation function*/ if (Structure->Lexical < 2) { sort(MinMax,population,pop_size,0); } else { /* in eval.cpp because it is like the EvaluateLexical() function */ RlexicalSort(Structure->fnLexicalSort, Structure->rho, population, MinMax, pop_size, nvars, lexical_end, 1); } } /* check to see if fit is improving */ if(Structure->Lexical < 2) { switch(MinMax) { case 0: if ( (oldfitvalue - SolutionTolerance) > population[1][0]) { nochange_gen=0; oldfitvalue=population[1][0]; peak_cnt = count_gener; } else nochange_gen++; break; case 1: if ( (oldfitvalue + SolutionTolerance) < population[1][0]) { nochange_gen=0; oldfitvalue=population[1][0]; peak_cnt = count_gener; } else nochange_gen++; break; } } /* if(Structure->Lexical < 2) */ else { switch(MinMax) { case 0: LexicalFitsImproving = 0; if ( (oldfitvalue - SolutionTolerance) > population[1][0]) { LexicalFitsImproving = 1; } else { k=1; for (i=(nvars+2);i population[1][i] ) { LexicalFitsImproving = 1; break; } /* (oldfitvalueVEC[k] - SolutionTolerance) > population[1][i] ) */ k++; } /* for (i=(nvars+2);i population[1][0]) */ if (LexicalFitsImproving) { nochange_gen = 0; peak_cnt = count_gener; oldfitvalue=population[1][0]; oldfitvalueVEC[0]=population[1][0]; k=1; for (i=(nvars+2);i population[1][i] ) */ k++; } /* for (i=(nvars+2);i population[1][0]) */ if (LexicalFitsImproving) { nochange_gen = 0; peak_cnt = count_gener; oldfitvalue=population[1][0]; oldfitvalueVEC[0]=population[1][0]; k=1; for (i=(nvars+2);iLexical > 2) */ if(PrintLevel==1) { if( nochange_gen==0 ) { if(Structure->Lexical > 1) { Rprintf("\n%7d \t%e ", count_gener, population[1][0]); for(j=(nvars+2);j1) { Rprintf("\nGENERATION: %d\n", count_gener); populationstats(population, pop_size, nvars, mean, var, skew, kur, tobs); if(Structure->Lexical > 1) { Rprintf( "Lexical Fit..... %e ", population[1][0]); for(j=(nvars+2);j 0) Rprintf( "#null........... %d\n", nnull); if(Structure->MemoryUsage==1) Rprintf( "#unique......... %d, #Total UniqueCount: %d\n", UniqueCount-OldUniqueCount, UniqueCount); /* Rprintf( "tobs............ %d\n", tobs[i]); */ for (i=1; i<=nvars; i++) { Rprintf( "var %d:\n", i); Rprintf( "best............ %e\n", population[1][i]); Rprintf( "mean............ %e\n", mean[i]); Rprintf( "variance........ %e\n", var[i]); /* Rprintf( "skewness........ %e\n", skew[i]); Rprintf( "kurtosis........ %e\n", kur[i]); */ nnull = pop_size-tobs[i]; if(nnull > 0) Rprintf( "#null........... %d\n", nnull); /* Rprintf( "tobs............ %d\n", tobs[i]); */ } } /* end of printlevel if */ /* if (PrintLevel>0) fflush(output); */ /* Print the population file */ if ( PrintLevel == 1 ) { if((popout = fopen(Structure->ProjectPath, "w")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, (int) count_gener, (int) Structure->Lexical, population, popout); fclose(popout); } /* end of PrintLevel if */ if ( PrintLevel>1) { if((popout = fopen(Structure->ProjectPath, "a")) == NULL) { Rprintf("Unable to open the project file: %s", Structure->ProjectPath); /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); /* free numeric.c allocations */ if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } error("Fatal Error. See output for diagnostic information."); } print_population((int) pop_size, (int) nvars, (int) count_gener, (int) Structure->Lexical, population, popout); fflush(popout); fclose(popout); } if (nochange_gen > (WaitGenerations)) { /* increase the number of WaitGenerations if the gradients are NOT zero! */ if (GradientCheck==0) { if(PrintLevel>0) { Rprintf("\n'wait.generations' limit reached.\n"); Rprintf("No significant improvement in %d generations.\n", nochange_gen-1); /* fflush(output); */ } MaxGenerations = 0; nochange_gen=0; } else { for (i=1; i<=nvars; i++) { bfgsoutX[i-1]=population[1][i]; } if(Structure->UserGradient==0) { gradient(Structure->fn, Structure->rho, bfgsoutX, grad, nvars, MinMax, BoundaryEnforcement, domains); } else { userGradientfn(Structure->fnGR, Structure->rho, bfgsoutX, grad, nvars); } GradientTrigger = 0; for (i=0; i SolutionTolerance) { GradientTrigger = 1; break; } } /* end for loop */ if (GradientTrigger==1) { IncreaseGenerations = WaitGenerations; WaitGenerations += IncreaseGenerations; if(PrintLevel>0) { Rprintf( "\nDoubling 'wait.generations' limit to %d (from %d) ", WaitGenerations, IncreaseGenerations); Rprintf("because at least one gradient is too large.\n"); Rprintf("G[%d]: %e\t Solution Tolerance: %e\n\n", i+1, grad[i], SolutionTolerance); } } else { if(PrintLevel>0) { Rprintf("\n'wait.generations' limit reached.\n"); Rprintf("No significant improvement in %d generations.\n", nochange_gen-1); /* fflush(output); */ } MaxGenerations = 0; nochange_gen=0; } }/* end else loop */ } /* end of if (nochange_gen > (WaitGenerations)) { */ if ( (count_gener == MaxGenerations) && (GradientTrigger==1) ) { if (HardGenerationLimit==0) { IncreaseGenerations = MaxGenerations; MaxGenerations += IncreaseGenerations; if(PrintLevel>0) { Rprintf( "\nIncreasing 'max.generations' limit by %d generations to %d ", IncreaseGenerations, MaxGenerations); Rprintf("because at least one gradient is too large.\n\n"); } } // if (Structure->HardGenerationLimit==0) else { HardMaximumNumber = 1; warning("Stopped because hard maximum generation limit was hit.\nAt least one gradient is too large."); if(PrintLevel>0) { Rprintf("\nNOTE: HARD MAXIMUM GENERATION LIMIT HIT\n"); Rprintf(" At least one gradient is too large\n"); } } // else } // if ( (count_gener == MaxGenerations) && (GradientTrigger==1) ) /* increase the number of generations if fitness has been improving */ if ( (count_gener == MaxGenerations) && (nochange_gen < WaitGenerations) ) { if (HardGenerationLimit==0) { if (WaitGenerations > MaxGenerations) { IncreaseGenerations = WaitGenerations; MaxGenerations += (int) (IncreaseGenerations); if(PrintLevel>0) { Rprintf( "\nIncreasing 'max.generations' limit by %d generations to %d ", IncreaseGenerations, MaxGenerations); Rprintf("because the fitness is still impoving.\n\n"); } } else { IncreaseGenerations = MaxGenerations; MaxGenerations += (int) (IncreaseGenerations); if(PrintLevel>0) { Rprintf( "\nIncreasing 'max.generations' limit by %d generations to %d ", IncreaseGenerations, MaxGenerations); Rprintf("because the fitness is still improving.\n\n"); } } } // if (Structure->HardGenerationLimit==0) else { if (HardMaximumNumber==0) { warning("Stopped because hard maximum generation limit was hit."); if(PrintLevel>0) { Rprintf("\nNOTE: HARD MAXIMUM GENERATION LIMIT HIT\n"); } } /* end of if HardMax */ } } // if ( (count_gener == MaxGenerations) && (nochange_gen < WaitGenerations) ) /* if(PrintLevel>0) fflush(output); */ } /* end of do loop */ /*Increment iteration count and test whether all generations are done*/ while (++count_gener <= MaxGenerations); if(PrintLevel>0) { if(Structure->Lexical > 1) { Rprintf("\nSolution Lexical Fitness Value:\n"); Rprintf("%e ", population[1][0]); for(j=(nvars+2);joPeakGeneration=peak_cnt; Structure->oGenerations=count_gener-1; /* obtain gradients */ /* print best solution */ if (GradientCheck==0 && UseBFGS==0) { for(j = 1; j <= nvars; j++) { i = j-1; if(PrintLevel>0) Rprintf(" X[%2d] :\t%e\n",j,population[1][j]); grad[i] = -1.0; Results[i] = population[1][j]; Gradients[i] = grad[i]; } } /* end of if (GradientCheck==0 && UseBFGS==0) */ else { for (i=1; i<=nvars; i++) { bfgsoutX[i-1]=population[1][i]; } if(Structure->UserGradient==0) { gradient(Structure->fn, Structure->rho, bfgsoutX, grad, nvars, MinMax, BoundaryEnforcement, domains); } else { userGradientfn(Structure->fnGR, Structure->rho, bfgsoutX, grad, nvars); } for(j = 1; j <= nvars; j++) { i = j-1; if(PrintLevel>0) Rprintf(" X[%2d] :\t%e\tG[%2d] :\t%e\n",j,population[1][j],j,grad[i]); Results[i] = population[1][j]; Gradients[i] = grad[i]; } } /* end of else (GradientCheck==0 && UseBFGS==0) */ Structure->oFitValues[0]=population[1][0]; if (Structure->Lexical > 1) { k = 1; for (i=(nvars+2);ioFitValues[k]=population[1][i]; k++; } } /* free memory */ /* free populationstats stuff */ free(mean); free(var); free(skew); free(kur); free(tobs); free(bfgsoutX); free(finalhessin); free(evalX); free(grad); if (Structure->MemoryUsage==1) JaMatrixFree(Memory, MemorySize); JaMatrixFree(population, pop_size+2); JaMatrixFree(new_genera, pop_size+2); free_matrix(temp, 0, nvars+1, 0); free_vector(probab, 1); free_vector(t_vec, 1); free_vector(cum_probab, 1); free_ivector(live, 1); free_ivector(parents, 1); if(Structure->Lexical > 1) { free(LexicalReturn); free(oldfitvalueVEC); } } /* end JaIntegerOptimization */ /********************************************************************************/ /* JaIntegerSort(): */ /* */ /* This function sorts a double** on an integer basis. */ /* The function also assumes that the double** is indexed from 1 in its rows */ /* and from zero in its columns. */ /* */ /********************************************************************************/ void JaIntegerSort(double **InMatrix, long n, long k) { /* extern int JaIntegerCMP(); */ long i, j; double **Tmp; extern long Gnvars[MAXINSTANCES]; long nvars; Tmp = JaMatrixAllocate(n, k); nvars=Gnvars[ExternStructure->InstanceNumber]; for (i=1; i<=n; i++) { for (j=0; jInstanceNumber]; for (i=1; i<=n; i++) { for (j=0; j Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu August 3, 2009 */ #include "genoud.h" void genoud(struct GND_IOstructure *Structure); extern "C" { // mkanswer SEXP mkans(double *oFitValues, double *oResults, double *oGradients, long *oP, long oGenerations, long oPeakGeneration, long oPopSize, long nvars, long lexical) { SEXP ans; long length, i, indx, operators; operators=9; length= lexical + (nvars*2) + 3 + operators; PROTECT(ans=allocVector(REALSXP,length)); REAL(ans)[0] = (double) oGenerations; REAL(ans)[1] = (double) oPeakGeneration; REAL(ans)[2] = (double) oPopSize; indx = 2; // include fit values for (i=0; i 0) { /* need to free a matrix of StaringValues below */ StartingValues = (double **) malloc(nStartingValues*sizeof(double)); for (i=0; ifn=fn; MainStructure->rho=rho; MainStructure->fnLexicalSort=fnLexicalSort; MainStructure->fnMemoryMatrixEvaluate=fnMemoryMatrixEvaluate; MainStructure->fnGR=fnGR; MainStructure->fn_optim=fn_optim; MainStructure->Lexical=asInteger(lexical); MainStructure->UserGradient=asInteger(RuserGradient); MainStructure->nvars=parameters; MainStructure->PopSize=asInteger(pop_size); MainStructure->MaxGenerations=asInteger(max_generations); MainStructure->WaitGenerations=asInteger(wait_generations); MainStructure->HardGenerationLimit=asInteger(hard_generation_limit); MainStructure->nStartingValues=nStartingValues; MainStructure->StartingValues=StartingValues; MainStructure->P[0]=REAL(P)[0]; MainStructure->P[1]=REAL(P)[1]; MainStructure->P[2]=REAL(P)[2]; MainStructure->P[3]=REAL(P)[3]; MainStructure->P[4]=REAL(P)[4]; MainStructure->P[5]=REAL(P)[5]; MainStructure->P[6]=REAL(P)[6]; MainStructure->P[7]=REAL(P)[7]; MainStructure->P[8]=REAL(P)[8]; MainStructure->Domains=domains; MainStructure->MinMax=asInteger(max); MainStructure->GradientCheck=asInteger(gradient_check); MainStructure->BoundaryEnforcement=asInteger(boundary_enforcement); MainStructure->SolutionTolerance=asReal(solution_tolerance); MainStructure->UseBFGS=asInteger(BFGS); MainStructure->MemoryUsage=asInteger(MemoryMatrix); MainStructure->Debug=asInteger(Debug); MainStructure->InstanceNumber=asInteger(instance_number); MainStructure->ProvideSeeds=asInteger(provide_seeds); MainStructure->UnifSeed=asInteger(unif_seed); MainStructure->IntSeed=asInteger(int_seed); MainStructure->PrintLevel=asInteger(print_level); MainStructure->DataType=asInteger(data_type_int); /* Share Type: (0) no reading of the existing project file and no looking at the public population file (1) reading of any existing project file, but no examining of public population file (2) NO reading of any existing project file but examination of public population file (3) BOTH reading of any existing project file AND examination of public population file */ MainStructure->ShareType=asInteger(share_type); //Paths char OutputPath[1000], ProjectPath[1000]; strcpy(OutputPath,STRING_VALUE(output_path)); strcpy(ProjectPath,STRING_VALUE(project_path)); MainStructure->OutputPath=OutputPath; MainStructure->ProjectPath=ProjectPath; MainStructure->OutputType=asInteger(output_type); /* output data structures */ FitValues = (double *) malloc(MainStructure->Lexical*sizeof(double)); Results = (double *) malloc(parameters*sizeof(double)); Gradients = (double *) malloc(parameters*sizeof(double)); MainStructure->oFitValues=FitValues; MainStructure->oResults=Results; MainStructure->oGradients=Gradients; /* from setupGenoud */ /* output data structures */ MainStructure->oGenerations=0; MainStructure->oPeakGeneration=0; MainStructure->oPopSize=0; MainStructure->ThreadNumber=0; /* Operator Options */ MainStructure->P9mix=asReal(RP9mix); MainStructure->BFGSburnin=asInteger(BFGSburnin); /* Transform Related Variables */ /* whichFUN == 3 implies EvaluateTransform should be called */ /* whichFUN == 2 implies EvaluateLexical should be called */ /* whichFUN == 1 implies evaluate should be called */ MainStructure->Transform=asInteger(transform); if(MainStructure->Transform == 1) MainStructure->whichFUN = 3; else if(MainStructure->Lexical > 1) MainStructure->whichFUN = 2; else MainStructure->whichFUN = 1; genoud(MainStructure); ret = mkans(MainStructure->oFitValues, MainStructure->oResults, MainStructure->oGradients, MainStructure->oP, MainStructure->oGenerations, MainStructure->oPeakGeneration, MainStructure->oPopSize, MainStructure->nvars, MainStructure->Lexical); // Free memory free(MainStructure); for (i=0; i 0) { for (i=0; i Jasjeet Singh Sekhon UC Berkeley http://sekhon.berkeley.edu August 3, 2009 */ #include #include #include #include "genoud.h" extern "C" { double evaluate(SEXP fn, SEXP rho, double *X, long nvars, short int MinMax) { SEXP R_fcall, Rx; double fit; long i; int isFinite=0; PROTECT(Rx = allocVector(REALSXP, nvars)); for (i=0; i 1) { k=0; for(j=0; j Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu June 2, 2012 */ #include "genoud.h" double **JaMatrixAllocate(long nobs, long nvars) { long i; double **M; M= (double **) malloc(nobs*sizeof(double *)); for (i=0; i=nrl;i--) free((double*) (m[i]+ncl)); free((double*) (m+nrl)); } } void free_imatrix(int **m, int nrl, int nrh, int ncl) { int i; if (m == NULL) return; else { for(i=nrh;i>=nrl;i--) free((unsigned int*) (m[i]+ncl)); free((unsigned int*) (m+nrl)); } } rgenoud/src/gradient.h0000644000176200001440000000764713421760173014474 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu $Header: /home/jsekhon/xchg/genoud/rgenoud.distribution/sources/RCS/gradient.h,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ #define EPS 0.000000000000001 /* machine precision */ void gradient(SEXP fn, SEXP rho, double *p, double *g, long nparms, short MinMax, short BoundaryEnforcement, double **Domains); double func4g(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains); void numgrad(SEXP fn, SEXP rho, double *epsacc, double *optint, int nparms, double *invals, double *grads, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, int nvars, short int MinMax), short MinMax); void numgradc(SEXP fn, SEXP rho, double *epsacc, double *optint, int nparms, double *invals, double *grads, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains); extern double *numopgc(double *epsacc, double *optint, int nparms, int nobs, double *invals, double *opg, double *wrk, int (*func)(double *X, double *outvec)); double **eaccuracy(SEXP fn, SEXP rho, int nparms, int ndiffs, double h, double *invals, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains); struct estints { int nparms; int *errors; /* 0 == OK, >=1 == error */ double *hf, /* interval */ *phi, /* f' (first derivative) */ *phic, /* f' (first derivative, central-difference) */ *phi2, /* f'' (second derivative) */ *ef, /* error bound */ *hessian; /* hessian matrix (lower triangle) */ }; struct estints *algfd(SEXP fn, SEXP rho, int nparms, double *eps, double *invals, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains); void fdestimates(SEXP fn, SEXP rho, int parm, double fvalue, double *invals, double *wrk, double eps, double h, double *fplus, double *fminus, double *phif, double *phib, double *phic, double *phi2, double *cf, double *cb, double *c2, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), int nparms, short MinMax, short BoundaryEnforcement, double **Domains); struct estints *numhessian(struct estints *instruc, double *invals, double *wrk, double (*func)(double *)); struct estints *numhessianc(SEXP fn, SEXP rho, struct estints *instruc, double *invals, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains); void estoptint(SEXP fn, SEXP rho, double *epsacc, double *optint, int nparms, int ndiffs, int pflag, double *invals, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains); void dohessians(SEXP fn, SEXP rho, double *epsacc, int nparms, int nobs, int ndiffs, double *invals, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcment, double **Domains), double (*funco)(double *, double *), short MinMax, short BoundaryEnforcement, double **Domains); rgenoud/src/unif.cpp0000644000176200001440000000734413421760173014165 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu $Header: /home/jsekhon/xchg/genoud/rgenoud.distribution/sources/RCS/unif.cpp,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ #include #include "unif.h" void ruxorv (integer *iseed, int n, double *rvec, integer *aux) { /* the double precision random uniforms in rvec have only 31 random bits set *iseed!=0 to reinitialize the sequence, else use *iseed==0 *iseed always equals 0 on return aux points to an integer vector of length > 1279+3 */ int i, ibloc, nw; static integer wrk[TLPDBSIZ]; double fk = 1.0/((double) TLPMOD) ; /* if n==0, initialize the TLP seed vector in aux[] and return */ if (n == 0) { /* initialize only if *iseed > 0 */ if (*iseed != 0) tlpseq (iseed, 0, wrk, aux); } else { nw = n; ibloc = 0; while (nw > TLPDBSIZ) { tlpseq (iseed, TLPDBSIZ, wrk, aux); if (ibloc > 0) { for (i=0; i 0) { tlpseq (iseed, nw, wrk, aux); if (ibloc > 0) { for (i=0; i k+3 */ /* initialize aux if nonzero *iseed is supplied or if aux[k+2] is not set to the magic value */ if (*iseed != ZEROI || aux[k+2] != k) { if (*iseed < ZEROI) *iseed = -(*iseed); seedw = (*iseed != seed) ? (*iseed ^ seed) : seed ; *iseed = ZEROI; for (i=0; i 0) tlpcor (k, n, rvec, aux); } /* Tausworthe-Lewis-Payne generator, core recursion. assumes aux is valid see Bratley, Fox and Schrage (1983, 190) and Bright and Enison (1979) */ void tlpcor (integer k, int n, integer *rvec, integer *aux) { /* aux is a vector of length k+2 */ int ii; integer i, j, inew; /* get the recursion location indexes out of AUX */ i = aux[k]; j = aux[k+1]; for (ii=0; ii Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu June 3, 2012 */ #include "genoud.h" void add(double *in1, double *in2, double *out, int row, int col) { int i, j, idx; for (i=0;i DOUBLEMAX) { tobs[j]=tobs[j]-1; } if (popdata[i][j] < -1*DOUBLEMAX) { tobs[j]=tobs[j]-1; } else sum[0] += popdata[i][j]; } dinobs = 1.0/tobs[j]; sum[0] *= dinobs; sum[1] = 0.0; sum[2] = 0.0; sum[3] = 0.0; for (i=1; i<=nobs; i++) { if ( (popdata[i][j] < DOUBLEMAX) && (popdata[i][j] > -1*DOUBLEMAX) ) { x1 = popdata[i][j] - sum[0]; x2 = x1*x1; sum[1] += x2; x2 *= x1; sum[2] += x2; x2 *= x1; sum[3] += x2; } /* end of if */ } /* end of i loop */ mean[j] = sum[0]; rvar[j] = sum[1] * dinobs; rskew[j] = sum[2] * dinobs; rkur[j] = sum[3] * dinobs; } /* end of j loop */ for (j=0; j<=nvars; j++) { x1 = rvar[j] ; var[j] = x1; x2 = 1.0 / (x1*x1) ; kur[j] = rkur[j] * x2; skew[j] = rskew[j] * sqrt(x2/x1); } /* free data and work storage */ free(rkur); free(rskew); free(rvar); } rgenoud/src/init.c0000644000176200001440000000124713421760173013623 0ustar liggesusers#include #include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Call calls */ extern SEXP rgenoud(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); static const R_CallMethodDef CallEntries[] = { {"rgenoud", (DL_FUNC) &rgenoud, 37}, {NULL, NULL, 0} }; void R_init_rgenoud(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } rgenoud/src/genoud.h0000644000176200001440000002363113421760173014147 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu June 3, 2012 */ #include #include #include #include #include #include #include #include extern "C" { /* function definitions */ double evaluate(SEXP fn, SEXP rho, double *X, long nvars, short int MinMax); void EvaluateLexical(SEXP fn, SEXP rho, double *X, long nvars, long lexical, short int MinMax, double *ret); void EvaluateTransform(SEXP fn, SEXP rho, double *X, long nvars, long lexical, short int MinMax, double *ret); } /*end of extern C */ #define M(ROW,COL,NCOLS) (((ROW)*(NCOLS))+(COL)) #define EVALUATE -645271937 #define DOUBLEMAX DOUBLE_XMAX #define MAXPATH 1000 #define MAXTHREADS 20 #define MAXINSTANCES 20 #define ERROR_CODE -99999 #define MAX_OPER_UNIQUE_TRY 1000 #define TRUE 1 #define FALSE 0 #define DOS_SYS FALSE /* set to true for dos, false for unix */ #define UNIX_SYS TRUE /* set to true for unix, false for dos */ #define flip() ((int) ((newrand()*(long)2)/(long) 65535)) #define MIN -32768 #define MAX 32768 #define HEAD 1 #define TAIL 0 #define TRIES 1000 #define MULT 25173 #define INCR 13849 #define MOD ((long int) 65536) #define SHUFFLE 256 /* size of random number shuffle array */ #define EST_OFFSET 0 /* offset in hours from Eastern Standard Time zone) */ #define NOTDONE_ADD 0.25 /* number of generations with no changes to be treated as convergence at generation limit */ #define NOTDONE_LIM 50 typedef double **MATRIX; typedef double *VECTOR; typedef int **IMATRIX; typedef int *IVECTOR; typedef int FLAG; typedef int TOSS; typedef struct {int r; int c;}INDEX; struct GND_IOstructure { /* --- Basic Input Parameters ---- */ SEXP fn; SEXP rho; SEXP fnLexicalSort; SEXP fnMemoryMatrixEvaluate; SEXP fnGR; SEXP fn_optim; long nvars; long PopSize; long MaxGenerations; long WaitGenerations; double P[9]; /* Operators */ double **Domains; short MinMax; short GradientCheck; short BoundaryEnforcement; /* 0=anything goes, 1: regular; 2: no trespassing! */ double SolutionTolerance; long ThreadNumber; /* indexed from zero */ long InstanceNumber; /* indexed from zero, the number of parallel runs */ short UseBFGS; /* Use BFGS on the Best Individual 1= True, 0=False */ short DataType; /* 1== integer, everything else equals float */ short MemoryUsage; /* 0=minimize, 1=normal */ short Debug; /* T, F */ short HardGenerationLimit; // T, F /* Starting Values (if we want to provide any) */ double **StartingValues; /* a matrix of starting values (each set consists of a row) */ long nStartingValues; /* number of starting values */ /* Random Number Stuff */ short ProvideSeeds; /* 0: no, 1: yes */ long UnifSeed; long IntSeed; /* --- Ouput Diagnostics --- */ double *oFitValues; double *oResults; double *oGradients; long oP[9]; /* operators used */ long oGenerations; long oPeakGeneration; long oPopSize; /* Output Files */ char* OutputPath; char* ProjectPath; /* I/O types */ short OutputType; short PrintLevel; /* Parallel Processing Stuff */ short ShareType; /* lexical sorting */ long Lexical; short int UserGradient; /* Operator Options */ double P9mix; int BFGSburnin; /* Transform Related Variables */ short int whichFUN; /* 1, 2, or 3 corresponding to which evaluate function to call */ short int Transform; /* 0 or 1 indicating whether transformed parameters are returned */ }; /* bfgs.c */ void dfgsmin(SEXP fn, SEXP rho, double *p, int n, double gtol, int *iter, double *fret, double *hessian, short int MinMax, short int BoundaryEnforcement, long InstanceNumber, double **Domains, short PrintLevel, FILE *output); /* change_order.c file */ void get_var_order(IVECTOR tot, IVECTOR cart, IMATRIX var_order); void find_x1_x2(int tot, IMATRIX var_order, IVECTOR x1, IVECTOR x2); void find_ac1_ac2(int t1, int t2, int t3, IVECTOR x1, IVECTOR x2, MATRIX mat, MATRIX ac1, MATRIX ac2); void find_lu1_lu2(IVECTOR tot, IVECTOR x1, IVECTOR x2, VECTOR dom, VECTOR dom1, VECTOR dom2); void find_limits(int tot, MATRIX domains, VECTOR llim, VECTOR ulim); void find_new_in_eq(VECTOR a1b, MATRIX a1a2, VECTOR ll, VECTOR ul, INDEX rc, MATRIX newin); void find_org_in_eq(VECTOR a1_b, MATRIX a1_a2, VECTOR vec_d, MATRIX c1, MATRIX c2, int c1row, INDEX a1a2, MATRIX org_ineq); void initialize(MATRIX mat, INDEX rc); void find_final_mat1(VECTOR l2, VECTOR u2, MATRIX finmat, int row, int col); void find_final_mat2(MATRIX newin, int r, int c, int finr, MATRIX finmat); void find_final_mat3(MATRIX orgin, int r, int c, int finr, MATRIX finmat); /* evaluate.c */ void optimization(struct GND_IOstructure *Structure, VECTOR X, MATRIX domains); void sort(short int MinMax, MATRIX population, int pop_size, long nvar); void swap(double **x, double **y); int find_parent(IVECTOR live, int pop_size); void assign_probab(VECTOR probab, int pop_size, double Q); double x_pow_y(double x, int y); void find_cum_probab(VECTOR cum_probab, VECTOR probab, int pop_size); void find_live(VECTOR cum_probab, IVECTOR live, int pop_size, int P); int find_die(VECTOR cum_probab, IVECTOR die, int pop_size); void SetRunTimeParameters(struct GND_IOstructure *Structure, short FirstTime, long *PopSize, long *nvars, long *MaxGenerations, long *WaitGenerations, short *MinMax, short *GradientCheck, short *BoundaryEnforcement, short *UseBFGS, double *SolutionTolerance, long *InstanceNumber, long *P, long *P0, long *P1, long *P2, long *P3, long *P4, long *P5, long *P6, long *P7, long *P8, short *PrintLevel, short *HardGenerationLimit); void JaIntegerOptimization(struct GND_IOstructure *Structure, VECTOR X, MATRIX domains); void JaIntegerSort(double **InMatrix, long n, long k); int JaIntegerCMP(double **a, double **b) ; void JaDoubleSort(double **InMatrix, long n, long k); int JaDoubleCMP(double **a, double **b) ; /* frange_ran.c */ double newunif(void); double frange_ran(double llim, double ulim); unsigned int randint(void); unsigned int newrand(void); /* math.c */ /* Not needed here. In here for completeness! */ void add(double *in1, double *in2, double *out, int row, int col); void copy(double *in, double *target, int row, int col); void multi(double *in1, double *in2, double *out, int row1, int col1, int row2, int col2, int outrowcol[2]); void scalarmulti(double scalar, double *in1, double *out, int row, int col) ; void scalarmultioffdiag(double scalar, double *in1, double *out, int row, int col) ; void subtract(double *in1, double *in2, double *out, int row, int col); double trace(double *a, int n); void transpose(double *orig_matrix, double *t_matrix, int orig_rows, int orig_columns); void copy_matrix(MATRIX mat1, MATRIX mat2, int lr, int ur, int lc, int uc); int Iround(double in); void samplestats(double **obsdata, int numobsv, int novarsv, int weightflag, double *weightdata); void populationstats(double **popdata, int numobsv, int novarsv, double *mean, double *var, double *skew, double *kur, long *tobs); /* multiply.c */ void mmprod(int m, int nm, int n, MATRIX mul_cm, MATRIX mul_am, MATRIX mul_bm); void mvprod(int m, int nm, VECTOR cm, MATRIX am, VECTOR bm); /* numerics.c */ double **JaMatrixAllocate(long n, long k); void JaMatrixFree(double **M, long k); short **JaShortMatrixAllocate(long nobs, long nvars); void JaShortMatrixFree(double **M, long nobs); MATRIX matrix(int nrl, int nrh, int ncl, int nch); void nrerror(char error_text[]); double *Gvector(int nl, int nh); int **imatrix(int nrl, int nrh, int ncl, int nch); int *ivector(int nl, int nh); void free_vector(double *v, int nl); void free_ivector(int *v, int nl); void free_matrix(double **m, int nrl, int nrh, int ncl); void free_imatrix(int **m, int nrl, int nrh, int ncl); /* operators.c file */ void oper1(VECTOR parent, double **domains, int nvars); void oper2(VECTOR parent, double **domains, int nvars); void oper3(VECTOR parent, double **domains, int nvars, int T, int t, int B); void oper4(MATRIX p, int p2use, int nvars); void oper5(VECTOR p1, VECTOR p2, int STEP, double **domains, int nvars); void oper6(VECTOR parent, double **domains, int nvars, int T, int t, int B); void oper7(VECTOR p1, VECTOR p2, double **domains, int nvars); void oper8(SEXP fn, SEXP rho, VECTOR parent, MATRIX domains, double SolutionTolerance, long nvars, short BoundaryEnforcement, short PrintLevel, double mix); void find_range(double *llim, double *ulim, int comp, double **domains, int nvars, VECTOR parent); void find_rangeInt(int *llim, int *ulim, int comp, double **domains, int nvars, VECTOR parent); int irange_ran(int llim, int ulim); double get_F(int T, int t, double y, int B); void JaIntegerOper1(VECTOR parent, double **domains, int nvars); void JaIntegerOper2(VECTOR parent, double **domains, int nvars); void JaIntegerOper3(VECTOR parent, double **domains, int nvars, int T, int t, int B); void JaIntegeroper4(MATRIX p, int p2use, int nvars, double **domains); void JaIntegerOper5(VECTOR p1, VECTOR p2, int STEP, double **domains, int nvars); void JaIntegerOper6(VECTOR parent, double **domains, int nvars, int T, int t, int B); void JaIntegerOper7(VECTOR p1, VECTOR p2, double **domains, int nvars); FLAG InBounds(VECTOR child, double **domains, int nvars); /*print_format.c */ long ReadPopulation(double **Data, long NewPopSize, long NewVars, FILE *fp, short PrintLevel); void print_domains(MATRIX equal, int t_equ, short DataType); void print_population(int popsize, int nvars, int generation, int lexical, double **foo, FILE *out); rgenoud/src/change_order.cpp0000644000176200001440000005464713421760173015654 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu $Header: /home/jsekhon/xchg/genoud/rgenoud.distribution/sources/RCS/change_order.cpp,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ #include "genoud.h" void get_var_order(IVECTOR tot, IVECTOR cart, IMATRIX var_order) /* IVECTOR tot, array with total number of variables and equalities cart; array with the subscript of the variables to be eliminated IMATRIX var_order; matrix with the variables in one column and a tag in the other to identify as to whether it is to be eliminated or not */ { int i; for(i=1; i<=tot[0]; i++) { var_order[i][1] = i; var_order[i][2] = 0; } for(i=1; i<=tot[1]; i++) var_order[cart[i]][2] = 1; } /********************************************************************************/ /* */ /* FUNCTION NAME : find_x1_x2() */ /* */ /* SYNOPSIS : void find_x1_x2(tot,var_order,eq_co,x1,x2) */ /* */ /* DESCRIPTION : This function splits the original vector of */ /* variables into x1 and x2, where x1 consists */ /* of the 'p' variables to be eliminated and */ /* x2 consists of the remaining variables */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_x1_x2(int tot, IMATRIX var_order, IVECTOR x1, IVECTOR x2) /* int tot; total number of variables IMATRIX var_order; array of variables with tag identifying them to be eliminated IVECTOR x1, array of variables to be eliminated x2; array of remaining variables */ { int i,j=1,k=1; for(i=1; i<=tot; i++) { if(var_order[i][2] == 1) x1[j++] = var_order[i][1]; else x2[k++] = var_order[i][1]; } } /********************************************************************************/ /* */ /* FUNCTION NAME : find_ac1_ac2() */ /* */ /* SYNOPSIS : void find_ac1_ac2(t1,t2,t3,x1,x2,mat,ac1,ac2)*/ /* */ /* DESCRIPTION : This function splits the original equality */ /* or the inequality matrix into two matrices; */ /* the p-equalities or the inequalities and the*/ /* remaining part of the matrix */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_ac1_ac2(int t1, int t2, int t3, IVECTOR x1, IVECTOR x2, MATRIX mat, MATRIX ac1, MATRIX ac2) /* int t1,t2,t3; IVECTOR x1,x2; the variables corresponding to the split matrices MATRIX mat, the original matrix to be split ac1,ac2; the split matrices */ { int i,j; for(i=1; i<=t1; i++) for(j=1; j<=t2; j++) ac1[j][i] = mat[j][x1[i]]; for(i=1; i<=t3; i++) for(j=1; j<=t2; j++) ac2[j][i] = mat[j][x2[i]]; } /********************************************************************************/ /* */ /* FUNCTION NAME : find_lu1_lu2() */ /* */ /* SYNOPSIS : void find_lu1_lu2_(tot,x1,x2,dom,dom1,dom2) */ /* */ /* DESCRIPTION : This function splits the lower or the upper */ /* bounds of the total domain constraints into */ /* two groups, one with the domain constraints */ /* for the variables to be eliminated and the */ /* other one for the remaining variables */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_lu1_lu2(IVECTOR tot, IVECTOR x1, IVECTOR x2, VECTOR dom, VECTOR dom1, VECTOR dom2) /* IVECTOR tot,x1,x2; VECTOR dom, the original array of the lower or the upper bounds dom1,dom2; the original bounds split in to two groups */ { int i; for(i=1; i<=tot[1]; i++) dom1[i] = dom[x1[i]]; for(i=1; i<=tot[0]-tot[1]; i++) dom2[i] = dom[x2[i]]; } /********************************************************************************/ /* */ /* FUNCTION NAME : find_limits() */ /* */ /* SYNOPSIS : void find_limits(tot,domains,llim,ulim) */ /* */ /* DESCRIPTION : This function forms seperate arrays for the */ /* lower and upper limits of the domains from */ /* the original domain constraints read already*/ /* from the input file */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_limits(int tot, MATRIX domains, VECTOR llim, VECTOR ulim) /* int tot; MATRIX domains; matrix containing the domain variables and the limits VECTOR llim,ulim; vectors of lower and upper limits */ { int i; for(i=1; i<=tot; i++) { llim[i] = domains[i][1]; ulim[i] = domains[i][3]; } } /********************************************************************************/ /* */ /* FUNCTION NAME : find_new_in_eq() */ /* */ /* SYNOPSIS : void find_new_in_eq(a1b.a1a2,ll,ul,rc,newin) */ /* */ /* DESCRIPTION : This function converts the original */ /* equality constraints into domain */ /* constraints eliminating the p-equalities */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_new_in_eq(VECTOR a1b, MATRIX a1a2, VECTOR ll, VECTOR ul, INDEX rc, MATRIX newin) /* VECTOR a1b, the product of a-inverse and b ll,ul; upper and lower limits of the domain constraints MATRIX a1a2, the products of a-inverse and matrix a2 newin; the final matrix with domain constraints INDEX rc; */ { int i,j; for(i=1; i<=rc.r; i++) for(j=1; j<=rc.c; j++) if(j==1) newin[i][j] = ll[i] - a1b[i];/*eliminating the constrants from the*/ else if(j==rc.c) /*equations in the domain constraints*/ newin[i][j] = ul[i] - a1b[i]; else newin[i][j] = 0 - a1a2[i][j-1]; } /********************************************************************************/ /* */ /* FUNCTION NAME : find_org_in_eq() */ /* */ /* SYNOPSIS : void find_org_in_eq(a1_b,a1_a2,vec_d,c1,c2, */ /* c1row,a1a2,org_ineq)*/ /* */ /* DESCRIPTION : This function converts the original */ /* inequality constraints into domain */ /* constraints, with the variables other than */ /* the p-variables eliminated */ /* */ /* FUNCTIONS CALLED : matrix(). */ /* mmprod(), */ /* mvprod(), */ /* Gvector(), */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_org_in_eq(VECTOR a1_b, MATRIX a1_a2, VECTOR vec_d, MATRIX c1, MATRIX c2, int c1row, INDEX a1a2, MATRIX org_ineq) /* VECTOR vec_d, the RHS constant vector a1_b; product of a1-inverse and b MATRIX a1_a2, product of a1-inverse and a2 org_ineq, the converted inequalities into domains c1,c2; p_inequalities and the remaining inequalities int c1row; INDEX a1a2; rows and columns of the matrices */ { int i,j; VECTOR temp; MATRIX mat; temp = Gvector(1,c1row); mat = matrix(1,c1row,1,a1a2.c-1); mvprod(c1row,a1a2.r,temp,c1,a1_b);/*matrix, vector product C1.invA1.b*/ mmprod(c1row,a1a2.r,a1a2.c-1,mat,c1,a1_a2);/*matrix, matrix product*/ for(i=1; i<=c1row; i++) for(j=1; j<=a1a2.c; j++) { if (j==a1a2.c) org_ineq[i][j] = vec_d[i] - temp[i]; else org_ineq[i][j] = c2[i][j] - mat[i][j]; } free_vector(temp,1); free_matrix(mat,1,c1row,1); } /********************************************************************************/ /* */ /* FUNCTION NAME : initialize() */ /* */ /* SYNOPSIS : void initialize(mat,rc) */ /* */ /* DESCRIPTION : This function initializes all the components */ /* of the given matrix to zero */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void initialize(MATRIX mat, INDEX rc) /* MATRIX mat; INDEX rc; */ { int i,j; for(i=1; i<=rc.r; i++) for(j=1; j<=rc.c; j++) mat[i][j] = 0.0; } /********************************************************************************/ /* */ /* FUNCTION NAME : find_final_mat1() */ /* */ /* SYNOPSIS : void find_final_mat1(x2,l2,u2,finmat,row,col)*/ /* */ /* DESCRIPTION : This function copies the remaining original */ /* domain constraints on to the final matrix */ /* to be printed */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_final_mat1(VECTOR l2, VECTOR u2, MATRIX finmat, int row, int col) /* MATRIX finmat; VECTOR l2,u2; int row,col; */ { int i,j=2; for(i=1; i<=row; i++) { finmat[i][1] = l2[i]; finmat[i][col] = u2[i]; finmat[i][j++] = 1.0; } } /********************************************************************************/ /* */ /* FUNCTION NAME : find_final_mat2() */ /* */ /* SYNOPSIS : void find_final_mat2(newin,r,c,finr,finmat) */ /* */ /* DESCRIPTION : This function appends the new inequalities */ /* got from the original equalities, on to the */ /* final matrix to be printed */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_final_mat2(MATRIX newin, int r, int c, int finr, MATRIX finmat) /* MATRIX newin,finmat; int r,c,finr; */ { int i,j; for(i=1; i<=r; i++) { for(j=1; j<=c; j++) finmat[finr][j] = newin[i][j]; finr++; } } /********************************************************************************/ /* */ /* FUNCTION NAME : find_final_mat3() */ /* */ /* SYNOPSIS : void find_final_mat3(orgin,r,c,finr,finmat) */ /* */ /* DESCRIPTION : This function appends the inequalities, which*/ /* were converted into domain constraints, on */ /* to the final matrix to be printed */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : main() */ /* */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void find_final_mat3(MATRIX orgin, int r, int c, int finr, MATRIX finmat) /* MATRIX orgin,finmat; int r,c,finr; */ { int i,j; for(i=1; i<=r; i++) { finmat[finr][1] = MIN; for(j=1; j<=c; j++) finmat[finr][j+1] = orgin[i][j]; finr++; } } rgenoud/src/gradient.cpp0000644000176200001440000006023413421760173015016 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu June 2, 2012 */ #include "genoud.h" #include "gradient.h" double GammaLN(double xx) { double cof[6] = { 76.18009173, -86.50532033, 24.01409822, -1.231739516, 0.12085003E-2, -0.536382E-5, }; double stp = 2.50662827465; double x, tmp, ser; int j; x = xx - 1.0; tmp = x + 5.5; tmp = (x + 0.5) * log(tmp) - tmp; ser = 1.0; for (j = 0; j < 6; j++) { x += 1.0; ser += cof[j] / x; } return tmp + log(stp * ser); } double VMgamma(double xx) { #define PI2 3.141592654 if (xx > 0) return exp(GammaLN(xx)); else if (xx < 0) return PI2 / exp(GammaLN(1 - xx)) / sin( PI2 * (1 - xx)); else return 0; } /* func4g is required by the gradient code. It takes what is in evaluate() and increments it down by 1 NOTE: funco() (which not used here) does not increment evaluate() down by 1. The code internal to the function does this. */ double func4g(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains) { double fit; short BoundaryTrigger=0; long i; if (BoundaryEnforcement==2) { for (i=0; i Domains[(i+1)][3]){ BoundaryTrigger=1; break; } } if (BoundaryTrigger > 0) { // *Status=-3; // min if (MinMax==0) return(-1*DOUBLEMAX); //max else return(DOUBLEMAX); } } if (MinMax==0) fit=evaluate(fn, rho, X-1, nvars, MinMax); else fit = -1*evaluate(fn, rho, X-1, nvars, MinMax); return(fit); } /* replace gradient() body with analytical gradient code, if desired. by default, numerical gradients with the intervals in *optint are used arguments (must be identical in any replacement code): *p, vector of parameters, p[0] is the first parameter; *g, vector that will hold the gradient, allocated by caller, g[0] is the derivative for the first parameter; nparms, the number of parameters, p[nparms-1] is the last parameter. */ void gradient(SEXP fn, SEXP rho, double *p, double *g, long nparms, short MinMax, short BoundaryEnforcement, double **Domains) { double *wrk; int ndiffs; /* formally declared global in graddata.h */ // double *epsacc, *optint, *ihessians; double *epsacc, *optint; optint = (double *) malloc(nparms*sizeof(double)); epsacc = (double *) malloc(nparms*sizeof(double)); wrk = (double *) malloc(nparms*sizeof(double)); ndiffs = 9; /* order of differences for num grad optimal interval calcs */ estoptint(fn, rho, epsacc, optint, nparms, ndiffs, 2, p, func4g, MinMax, BoundaryEnforcement, Domains); /* numgradc: numerical gradient, central-difference */ numgradc(fn, rho, epsacc, optint, nparms, p, g, wrk, func4g, MinMax, BoundaryEnforcement, Domains); free(wrk); free(epsacc); free(optint); return; } /* numerical gradient, forward-difference */ /* see Gill, Murray and Wright, 1981, "Practical Optimization," p. 342 */ /* invals, grads, wrk should point to double w[nparms+1] arrays; func is the function whose gradient is to be evaluated */ void numgrad(SEXP fn, SEXP rho, double *epsacc, double *optint, int nparms, double *invals, double *grads, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, int nvars, short int MinMax), short MinMax) { int i; // double u, rf, fplus, fminus; double u, fplus, fminus; double epsuse; double duse; /* evaluate func at the input point */ u = func(fn, rho, invals, nparms, MinMax); /* copy the parameter values for point at which to evaluate the gradient */ for (i=0; i 0.1) { /* switch to central-diff */ duse = pow(duse, 2.0/3.0); /* see GMW p 131 */ wrk[i] = invals[i] + duse; fplus = func(fn, rho, wrk, nparms, MinMax); wrk[i] = invals[i] - duse; fminus = func(fn, rho, wrk, nparms, MinMax); grads[i] = (fplus-fminus) * 0.5 / duse ; } wrk[i] = invals[i]; } } /* numerical gradient, central-difference */ /* see Gill, Murray and Wright, 1981, "Practical Optimization," p. 342 */ /* invals, grads, wrk should point to double w[nparms+1] arrays; func is the function whose gradient is to be evaluated */ void numgradc(SEXP fn, SEXP rho, double *epsacc, double *optint, int nparms, double *invals, double *grads, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains) { int i; // double u, rf, fplus, fminus; double u, fplus, fminus; double epsuse; double duse; /* evaluate func at the input point */ u = func(fn, rho, invals, nparms, MinMax, BoundaryEnforcement, Domains); /* copy the parameter values for point at which to evaluate the gradient */ for (i=0; iEPS*scale) { while (huse > v/scale) huse *= 0.1; } for (j=1; jerrors = (int *) calloc(nparms, sizeof(int)); outstruc->hf = (double *) calloc(nparms, sizeof(double)); outstruc->phi = (double *) calloc(nparms, sizeof(double)); outstruc->phic = (double *) calloc(nparms, sizeof(double)); outstruc->phi2 = (double *) calloc(nparms, sizeof(double)); outstruc->ef = (double *) calloc(nparms, sizeof(double)); outstruc->nparms = nparms; /* evaluate func at the input point */ u = func(fn, rho, invals, nparms, MinMax, BoundaryEnforcement, Domains); /* copy the parameter values for point at which to evaluate the gradient */ for (i=0; icb ? cf : cb) <= 0.1) hs = hk; if (0.001 <= c2 && c2 <= 0.1) { hphi = hk; goto FD5; } if (0.001 > c2) goto FD4; FD3: do { k++; hk *= 10.0; fdestimates(fn, rho, i, u, invals, wrk, eps[i], hk, &fplus, &fminus, &phif, &phib, &phic, &phi2, &cf, &cb, &c2, func, nparms, MinMax, BoundaryEnforcement, Domains); if (hs<0 && ((cf>cb ? cf : cb) <= 0.1)) hs = hk; if (c2 <= 0.1) { hphi = hk; goto FD5; } } while (k 0.1) { hphi = hk * 10.0; goto FD5; } if ((cf>cb ? cf : cb) <= 0.1) hs = hk; if (0.001 <= c2 && c2 <= 0.1) { hphi = hk; goto FD5; } } while (khf[i] = hf; outstruc->phi[i] = phi; outstruc->phic[i] = phic; outstruc->phi2[i] = phi2; outstruc->ef[i] = ef; if ((ef>ebar ? ef : ebar) <= 0.5*fabs(phi)) { outstruc->errors[i] = 0; } else outstruc->errors[i] = 1; continue; FD6: if (hs<0) { hf = hbar; phi = phi2 = ef = 0.0; errval = 2; } else if (hs > 0 && c2 > 0.1) { hf = hs; wrk[i] = invals[i] + hf; fplus = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[i] = invals[i]; phi = (fplus-u)/hf; phi2 = 0.0; ef = 2.0*eps[i]/hf ; errval = 3; } else { hf = hk; wrk[i] = invals[i] + hf; fplus = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); phi = (fplus-u)/hf; wrk[i] = invals[i] - hf; fminus = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[i] = invals[i]; phic = (fplus-fminus)/(2.0*hf); ef = hf*fabs(phi2)*0.5 + 2.0*eps[i]/hf ; errval = 4; } outstruc->hf[i] = hf; outstruc->phi[i] = phi; outstruc->phic[i] = phic; outstruc->phi2[i] = phi2; outstruc->ef[i] = ef; outstruc->errors[i] = errval; // #endif } return outstruc; } void fdestimates(SEXP fn, SEXP rho, int parm, double fvalue, double *invals, double *wrk, double eps, double h, double *fplus, double *fminus, double *phif, double *phib, double *phic, double *phi2, double *cf, double *cb, double *c2, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), int nparms, short MinMax, short BoundaryEnforcement, double **Domains) { double ih = 1.0/h; wrk[parm] = invals[parm] + h; *fplus = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[parm] = invals[parm] - h; *fminus = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[parm] = invals[parm]; *phif = (*fplus-fvalue) * ih; *phib = (fvalue-*fminus) * ih; *phic = (*fplus-*fminus) * 0.5 * ih; *phi2 = (*phif-*phib) * ih; *cf = 2.0*eps*ih/fabs(*phif); *cb = 2.0*eps*ih/fabs(*phib); *c2 = 4.0*eps*ih*ih/fabs(*phi2); } /* put strict lower triangle of numerical hessian into instruc->hessian */ /* instruc should have been set by algfd */ struct estints *numhessian(struct estints *instruc, double *invals, double *wrk, double (*func)(double *)) { int nparms; double *fplusi = NULL; int i,j; double hi, hj, ih, jh; double fvalue, fplus, phi2; nparms = instruc->nparms; fplusi = (double *) malloc(nparms*sizeof(double)); /* allocate storage for the hessian */ instruc->hessian = (double *) calloc((nparms*(nparms+1))/2,sizeof(double)); /* evaluate func at the input point */ fvalue = func(invals); /* copy the parameter values for point at which to evaluate the gradient */ for (i=0; ihf[i]; fplusi[i] = func(wrk); wrk[i] = invals[i]; } for (i=1; ihf[i]; ih = 1.0/hi; wrk[i] = invals[i] + hi; for (j=0; jhf[j]; jh = 1.0/hj; wrk[j] = invals[j] + hj; fplus = func(wrk); wrk[j] = invals[j]; phi2 = (fplus - fplusi[i] - fplusi[j] + fvalue) * ih * jh; instruc->hessian[(i*(i-1))/2 + j] = phi2; } wrk[i] = invals[i]; } free(fplusi); return instruc; } /* put strict lower triangle of numerical hessian into instruc->hessian */ /* uses central differences: */ /* phi2 = f(x+hj ej+hi ei) - f(x+hj ej-hi ei) - f(x-hj ej+hi ei) + f(x-hj ej-hi ei) */ /* instruc should have been set by algfd */ struct estints *numhessianc(SEXP fn, SEXP rho, struct estints *instruc, double *invals, double *wrk, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains) { int nparms; int nelems; double *fplusi; double *fminusi; double *fppi; double *fpmi; double *fmmi; int i,j, idx; double hi, hj, ih, jh; // double fvalue, fplus, fminus, phi2; double fvalue, phi2; nparms = instruc->nparms; nelems = (nparms*(nparms-1))/2; fplusi = (double *) malloc(nparms*sizeof(double)); fminusi = (double *) malloc(nparms*sizeof(double)); fppi = (double *) malloc(nelems*sizeof(double)); fpmi = (double *) malloc(nparms*nparms*sizeof(double)); fmmi = (double *) malloc(nelems*sizeof(double)); /* allocate storage for the hessian */ instruc->hessian = (double *) calloc(nelems,sizeof(double)); /* evaluate func at the input point */ fvalue = func(fn, rho, invals, nparms, MinMax, BoundaryEnforcement, Domains); /* copy the parameter values for point at which to evaluate the gradient */ for (i=0; ihf[i], 2.0/3.0); idx = (i*(i-1))/2; wrk[i] = invals[i] + 2.0*hi; fplusi[i] = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[i] = invals[i] - 2.0*hi; fminusi[i] = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); for (j=0; jhf[j], 2.0/3.0); wrk[i] = invals[i] + hi; wrk[j] = invals[j] + hj; fppi[idx + j] = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[i] = invals[i] + hi; wrk[j] = invals[j] - hj; fpmi[i*nparms + j] = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[i] = invals[i] - hi; wrk[j] = invals[j] + hj; fpmi[j*nparms + i] = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[i] = invals[i] - hi; wrk[j] = invals[j] - hj; fmmi[idx + j] = func(fn, rho, wrk, nparms, MinMax, BoundaryEnforcement, Domains); wrk[j] = invals[j]; } wrk[i] = invals[i]; } for (i=0; ihf[i], 2.0/3.0); ih = 1.0/hi; idx = (i*(i-1))/2; phi2 = (fplusi[i] - 2.0*fvalue + fminusi[i]) * ih * ih * 0.25; instruc->phi2[i] = phi2; for (j=0; jhf[j], 2.0/3.0); jh = 1.0/hj; phi2 = (fppi[idx+j] - fpmi[j*nparms+i] - fpmi[i*nparms+j] + fmmi[idx+j]) * ih * jh * 0.25; instruc->hessian[idx + j] = phi2; } } free(fmmi); free(fpmi); free(fppi); free(fplusi); return instruc; } void estoptint(SEXP fn, SEXP rho, double *epsacc, double *optint, int nparms, int ndiffs, int pflag, double *invals, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcement, double **Domains), short MinMax, short BoundaryEnforcement, double **Domains) { double *wrk; int i,j,k; // int nsteps=1+2*ndiffs, nrows=nparms*nsteps, ncols=ndiffs+1; int nsteps=1+2*ndiffs; double h, beta, dwrk; double **table; struct estints *estructure; wrk = (double *) malloc(nparms*(ndiffs+1)*sizeof(double)); h = 0.0000002; table = eaccuracy(fn, rho, nparms, ndiffs, h, invals, wrk, func, MinMax, BoundaryEnforcement, Domains); for (i=0; i= EPS */ epsacc[i] = (dwrk > EPS ? dwrk : EPS) ; } #ifdef NEVERDEFINED Rprintf("accuracy estimates:\n"); for (i=0; ierrors[i]); Rprintf(" %17.10e", estructure->hf[i]); Rprintf(" %17.10e", estructure->phi[i]); Rprintf(" %17.10e", estructure->phic[i]); Rprintf(" %17.10e", estructure->phi2[i]); Rprintf(" %17.10e", estructure->ef[i]); Rprintf("\n"); } } /* put estimates for optimal interval into optint */ for (i=0; ihf[i]; } free(table); free(wrk); /* free the estructure */ free(estructure->errors); free(estructure->hf); free(estructure->phi); free(estructure->phic); free(estructure->phi2); free(estructure->ef); free(estructure); } void dohessians(SEXP fn, SEXP rho, double *epsacc, int nparms, int nobs, int ndiffs, double *invals, double (*func)(SEXP fn, SEXP rho, double *X, long nvars, short MinMax, short BoundaryEnforcment, double **Domains), double (*funco)(double *, double *), short MinMax, short BoundaryEnforcement, double **Domains) { double *wrk; int i,j; // int nsteps=1+2*ndiffs, nrows=nparms*nsteps, ncols=ndiffs+1; // int nsteps=1+2*ndiffs; struct estints *estructure; // double *opg; wrk = (double *) malloc(nparms*(ndiffs+1)*sizeof(double)); estructure = algfd(fn, rho, nparms, epsacc, invals, wrk, func, MinMax, BoundaryEnforcement, Domains); #ifdef NEVERDEFINED /* numerical hessian, using forward differences for off-diagonal elements */ numhessian(estructure, invals, wrk, func); Rprintf("numerical hessian, forward differences:\n"); for (i=0; iphi2[i] / 2.0); else if (i>j) Rprintf(" %19.12e", estructure->hessian[(i*(i-1))/2 + j] / 2.0); else if (j>i) Rprintf(" %19.12e", estructure->hessian[(j*(j-1))/2 + i] / 2.0); } Rprintf("\n"); } /* fflush(stdout); */ #endif /* numerical hessian, using central differences */ numhessianc(fn, rho, estructure, invals, wrk, func, MinMax, BoundaryEnforcement, Domains); Rprintf("numerical hessian, central differences:\n"); for (i=0; iphi2[i] / 2.0); else if (i>j) Rprintf(" %19.12e", estructure->hessian[(i*(i-1))/2 + j] / 2.0); else if (j>i) Rprintf(" %19.12e", estructure->hessian[(j*(j-1))/2 + i] / 2.0); } Rprintf("\n"); } /* fflush(stdout); */ #ifdef NEVERDEFINED /* numerical outer product of gradients, using central differences */ if (funco != NULL) { opg = numopgc(nparms, nobs, invals, opg, wrk, funco); Rprintf("numerical outer product of gradients, central differences:\n"); for (i=0; i Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu May 6, 2013 */ #include "genoud.h" extern "C" { double genoud_optim(SEXP fn_optim, SEXP rho, double *X, long parameters); } /********************************************************************************/ /* */ /* FUNCTION NAME : oper1() */ /* Uniform Mutation */ /* */ /* SYNOPSIS : void oper1(parent,domains,nvars) */ /* */ /* DESCRIPTION : This function returns a new vector generated */ /* from the parent vector, after applying */ /* the operator, uniform mutation. */ /* */ /********************************************************************************/ void oper1(VECTOR parent, double **domains, int nvars) /* VECTOR parent; The parent vector*/ { int comp; double llim,ulim;/*Lower and Upper limits of the value to be mutated*/ FLAG SAME; double tmp; long count; count=0; SAME=TRUE; while (SAME==TRUE) { count++; comp = irange_ran(1,nvars); /*Finding the lower and upper limits between which the values are to be mutated*/ find_range(&llim,&ulim,comp,domains,nvars,parent); /*Find a random value between the lower and the upper limits, to substitute*/ /*for the old value*/ tmp = frange_ran(llim,ulim); if ( parent[comp] != tmp) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; } /* end of while */ parent[comp] = tmp; } /********************************************************************************/ /* */ /* FUNCTION NAME : oper2() */ /* Boundary Mutatation */ /* No Uniqueness checking here */ /* Don't use this oper often! */ /* */ /********************************************************************************/ void oper2(VECTOR parent, double **domains, int nvars) /* VECTOR parent; The parent vector*/ /* MATRIX fin_mat; The final matrix*/ { int comp; double llim,ulim;/*Lower and Upper limits of the value to be mutated*/ FLAG SAME; double tmp; long count; count=0; SAME=TRUE; while (SAME==TRUE) { count++; comp = irange_ran(1,nvars); /*Finding the lower and upper limits between which the values are to be mutated*/ find_range(&llim,&ulim,comp,domains,nvars,parent); /*Replace either the lower limit or the upper limit at random,*/ /*for the old value*/ tmp = (flip() == TAIL) ? llim : ulim; if ( tmp != parent[comp]) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; } /* end of while */ parent[comp] = tmp; } /********************************************************************************/ /* */ /* FUNCTION NAME : oper3() */ /* */ /* SYNOPSIS : void oper3(parent,fin_mat,r,c,T,t,B) */ /* */ /********************************************************************************/ void oper3(VECTOR parent, double **domains, int nvars, int T, int t, int B) /* VECTOR parent; */ /* unsigned long T; Total number of generations*/ /* unsigned long t; Current generation number*/ /* int B; */ { int comp; double llim,ulim; FLAG SAME; double tmp; long count; count=0; SAME=TRUE; while (SAME==TRUE) { count++; comp = irange_ran(1,nvars); find_range(&llim,&ulim,comp,domains,nvars,parent); /*From the current value of the component to be mutated, chooose at random*/ /*whether to mutate with a lesser value or a greater value*/ /*Then find a value lesser or greater than the original value from the*/ /*function get_f()*/ tmp = (flip() == TAIL) ? parent[comp]-get_F(T,t,parent[comp]-llim,B) : parent[comp]+get_F(T,t,ulim-parent[comp],B); if ( parent[comp] != tmp) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; } /* end of while */ parent[comp] = tmp; } /********************************************************************************/ /* */ /* FUNCTION NAME : oper4() */ /* Polytope Crossover */ /* */ /* */ /********************************************************************************/ void oper4(MATRIX p, int p2use, int nvars) /* int p The parents chosen for crossover */ /* p2use; number of parents (rows) in p */ /* int nvars Length of the parameter vector (cols in p) */ { double *A, sum; int i,k; A = (double *) malloc((p2use+1)*sizeof(double)); sum=0.0; for (k=1; k<=p2use; k++) { do A[k] = frange_ran(0.0,1.0); while (A[k]==0.0); /* insure A[k] is above 0.0 */ sum += A[k]; } sum = 1.0/sum; for (k=1; k<=p2use; k++) { /* rescale A[k] to sum to 1.0 */ A[k] *= sum; } for(i=1; i<=nvars; i++) { sum = p[1][i] * A[1]; for (k=2; k<=p2use; k++) sum += p[k][i] * A[k]; p[1][i] = sum; } free(A); } /* end of oper4 */ #ifdef NEVERDEFINED /* This is the arithmetic crossover operator */ void oper4(VECTOR p1, VECTOR p2, int nvars) /* VECTOR p1,p2; The two parents chosen for crossover*/ /* int nvars; Length of the vector*/ { double **child; long i; double A; FLAG SAME; long count, tcount; child = JaMatrixAllocate(3, nvars+1); count=0; SAME=TRUE; while (SAME==TRUE) { count++; do A = frange_ran(0.0,1.0); while (A==0); /* insure A is above 0 */ for(i=1; i<=nvars; i++) { child[1][i] = p1[i] * A + p2[i] * (1.0-A); child[2][i] = p2[i] * A + p1[i] * (1.0-A); } if (count >= MAX_OPER_UNIQUE_TRY) { SAME=FALSE; break; } /* Are the two new individuals unique? */ tcount=0; for (i=1; i<=nvars; i++) { if ( (int) child[1][i] != (int) p1[i] ) tcount++; if ( (int) child[2][i] != (int) p2[i] ) tcount++; } /* end of i loop */ if (tcount==(nvars*2)) SAME=FALSE; } /* end of while */ for(i=1; i<=nvars; i++) { p1[i] = child[1][i]; p2[i] = child[2][i]; } JaMatrixFree(child, 3); } /* end of oper4() */ #endif /********************************************************************************/ /* */ /* FUNCTION NAME : oper5() */ /* Simple Crossover */ /* */ /********************************************************************************/ void oper5(VECTOR p1, VECTOR p2, int STEP, double **domains, int nvars) /* VECTOR p1,p2; *The two parents for crossing over*/ /* int STEP; *Parameter for the crossover*/ { MATRIX child; FLAG BFLAG1 = FALSE,/*Check to see if the newly created vectors satisfies the*/ BFLAG2 = FALSE;/*set of constraints*/ int i,n=1,cut; /* unique check variables */ FLAG SAME; int count, tcount, ccount; child = matrix(1,2,1,nvars); count=0; SAME=TRUE; while (SAME==TRUE) { count++; /*Get a random spot on the vector for crossover*/ cut = irange_ran(1,nvars); /*Copy the parent vectors on to the child vectors*/ for(i=1; i<=cut; i++) { child[1][i] = p1[i]; child[2][i] = p2[i]; } do { /*Cross the two vectors*/ ccount = 0; for(i=cut + 1; i<=nvars; i++) { child[1][i] = p1[i] * (double)n/(double)STEP + p2[i] * (1.0-(double)n/(double)STEP); child[2][i] = p2[i] * (double)n/(double)STEP + p1[i] * (1.0-(double)n/(double)STEP); ccount++; } /*Check to see if they satisfy the constraints*/ BFLAG1 = InBounds(child[1],domains,nvars); BFLAG2 = InBounds(child[2],domains,nvars); n++; /*If the constraints not satisfied, then generate another*/ /*set of crossed over values*/ }while((n<=STEP) && ((BFLAG1 == FALSE) || (BFLAG2 == FALSE))); /* Are the two new individuals unique? */ if (count >= MAX_OPER_UNIQUE_TRY) { SAME=FALSE; break; } tcount=0; for (i=cut+1; i<=nvars; i++) { if ( child[1][i] != p1[i] ) tcount++; if ( child[2][i] != p2[i] ) tcount++; } /* end of i loop */ if (tcount>=(ccount*2)) SAME=FALSE; } /* end of while (SAME==TRUE) */ if (BFLAG1==TRUE && BFLAG2==TRUE) { for(i=1; i<=nvars; i++) { p1[i] = child[1][i]; p2[i] = child[2][i]; } } free_matrix(child,1,2,1); } /********************************************************************************/ /* */ /* FUNCTION NAME : oper6() */ /* Whole Non-Uniform Mutation */ /* */ /********************************************************************************/ void oper6(VECTOR parent, double **domains, int nvars, int T, int t, int B) /* VECTOR parent; MATRIX fin_mat; unsigned long T; Total number of generations unsigned long t; Current generation number int B; */ { int i; double llim,ulim; /* unique check variables */ FLAG SAME; long count; double tmp=0; count=0; SAME=TRUE; while (SAME==TRUE) { for (i=1; i<=nvars; i++) { count++; find_range(&llim,&ulim,i,domains,nvars,parent); /*From the current value of the component to be mutated, chooose at random*/ /*whether to mutate with a lesser value or a greater value*/ /*Then find a value lesser or greater than the original value from the*/ /*function get_f()*/ tmp = (flip() == TAIL) ? parent[i]-get_F(T,t,parent[i]-llim,B) : parent[i]+get_F(T,t,ulim-parent[i],B); if ( parent[i] != tmp) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; parent[i] = tmp; }//end of for loop } // end of while loop }//oper6 /********************************************************************************/ /* */ /* FUNCTION NAME : oper7() */ /* Heuristic Crossover */ /* */ /********************************************************************************/ void oper7(VECTOR p1, VECTOR p2, double **domains, int nvars) { VECTOR child; FLAG BFLAG = FALSE;/*Check to see if the newly created vector satisfies the*/ /*set of constraints*/ int i,n=2,tries=MAX_OPER_UNIQUE_TRY; double A; /* unique check variables */ FLAG SAME; long count; child = Gvector(1,nvars); count=0; SAME=TRUE; while (SAME==TRUE) { count++; do { A = frange_ran(0.0,1.0); for(i=1; i<=nvars; i++) child[i] = ( A * (p2[i] - p1[i]) + p2[i] ); /*Check to see if it satisfies the constraints*/ BFLAG = InBounds(child,domains,nvars); n++; /*If the constraints not satisfied, then try again */ } while((n<=tries) && (BFLAG == FALSE)); /* Is the new individual unique? */ if (count >= MAX_OPER_UNIQUE_TRY) { SAME=FALSE; break; } for (i=1; i<=nvars; i++) { if ( child[i] != p1[i] ) { SAME=FALSE; break; } } } /* end of while SAME loop */ if (BFLAG==TRUE) { for(i=1; i<=nvars; i++) p1[i] = child[i]; } free_vector(child,1); } /* end of oper7() */ /********************************************************************************/ /* */ /* FUNCTION NAME : find_range() */ /* */ /* SYNOPSIS : void find_range(llim,ulim,domains,nvars, */ /* parent */ /* */ /* DESCRIPTION : This function finds the upper and lower */ /* limits, within which the mutation should */ /* occur. */ /* */ /********************************************************************************/ void find_range(double *llim, double *ulim, int comp, double **domains, int nvars, VECTOR parent) /* double *llim,*ulim; Upper and lower limits*/ /* int comp; Component of the vector to be mutated*/ /* VECTOR parent; The vector with the values of the variables*/ { double A, B; A = frange_ran(0.0,1.0); B = 1.0 - A; *llim = (A*domains[comp][1]) + B* parent[comp]; A = frange_ran(0.0,1.0); B = 1.0 - A; *ulim = B * parent[comp] + (A*domains[comp][3]); } /********************************************************************************/ /* */ /* FUNCTION NAME : find_rangeInt() */ /* */ /* SYNOPSIS : void find_range(llim,ulim,domains,nvars, */ /* parent */ /* */ /* DESCRIPTION : This function finds the upper and lower */ /* limits, within which the mutation should */ /* occur. */ /* */ /********************************************************************************/ void find_rangeInt(int *llim, int *ulim, int comp, double **domains, int nvars, VECTOR parent) /* int *llim,*ulim; Upper and lower limits*/ /* int comp; Component of the vector to be mutated*/ /* VECTOR parent; The vector with the values of the variables*/ { double A, B; A = frange_ran(0.0,1.0); B = 1.0 - A; *llim = (int) ( (A*domains[comp][1]) + B* parent[comp]); if( (int) domains[comp][1] > *llim) *llim = (int) domains[comp][1]; A = frange_ran(0.0,1.0); B = 1.0 - A; *ulim = (int) ( B * parent[comp] + (A*domains[comp][3]) ); if( (int) domains[comp][3] < *ulim) *ulim = (int) domains[comp][3]; } /********************************************************************************/ /* */ /* FUNCTION NAME : irange_ran() */ /* */ /* SYNOPSIS : int irange_ran(llim,ulim) */ /* */ /* DESCRIPTION : This function returns a random integer */ /* between the llim and ulim. */ /* */ /********************************************************************************/ int irange_ran(int llim, int ulim) { int num; do num = llim + ((int) ((newrand()*(long)(ulim-llim+1))/(long) 65535)); while ((num < llim) || (num > ulim)); return(num); } /********************************************************************************/ /* */ /* FUNCTION NAME : get_F() */ /* */ /* SYNOPSIS : double get_F(T,t,y,B) */ /* */ /* DESCRIPTION : This function returns the double value which */ /* is the evaluated value of the function, */ /* needed for the operators 3 and 6 */ /* */ /********************************************************************************/ double get_F(int T, int t, double y, int B) /* unsigned long t,T; int B; double y; */ { double factor; factor = (double) pow(1.0 - (double)t/(double)T,(double)B); factor = factor * frange_ran(0.0,1.0); if (factor < 0.00001) factor = 0.00001; return(y * factor); } /********************************************************************************/ /* */ /* FUNCTION NAME : oper8() */ /* Local-Minimum Crossover: bfgs */ /* */ /* SYNOPSIS : void oper8(parent,fin_mat,rc) */ /* */ /* DESCRIPTION : This function returns a new vector generated */ /* from the parent vector, after applying */ /* the operator, BFGS. */ /* */ /* */ /* CALLING FUNCITONS : optimization() */ /* */ /********************************************************************************/ void oper8(SEXP fn_optim, SEXP rho, VECTOR parent, MATRIX domains, double SolutionTolerance, long nvars, short BoundaryEnforcement, short PrintLevel, double mix) { double *parm, *work; long i, j, btest; double bfgsfit; double A, B; parm = (double *) malloc((nvars+1)*sizeof(double)); work = (double *) malloc((nvars+1)*sizeof(double)); if( mix < 0) { A = frange_ran(0.0,1.0); } else { A = mix; } B = 1.0 - A; for (i=0; i work[i]) || (work[i] > domains[i][3]) ; /* shrink point until all parameters are in bounds */ if (btest) { if(PrintLevel > 1) { Rprintf("NOTE: killing out-of-bounds individual created by bfgs oper(9). fit:%10.8lf\n",bfgsfit); Rprintf("NOTE: oper(9) Parameter: %d \t Value: %e\n\n", i, work[i]); } warning("killed out-of-bounds individual created by bfgs oper(9)"); } } if (btest==0) break; A *= 0.5 ; B = 1.0 - A; } if (j<20) { /* leave parent unchanged if not in boundary after 20 halvings */ for (i=1; i<=nvars; i++) { parent[i] = work[i]; } } } free(work); free(parm); return ; } /********************************************************************************/ /* Integer Operators! */ /* */ /********************************************************************************/ /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegerOper1() */ /* Uniform Mutation */ /* */ /* SYNOPSIS : void oper1(parent,fin_mat,rc) */ /* */ /* DESCRIPTION : This function returns a new vector generated */ /* from the parent vector, after applying */ /* the operator, uniform mutation. */ /* */ /********************************************************************************/ void JaIntegerOper1(VECTOR parent, double **domains, int nvars) /* VECTOR parent; The parent vector*/ /* MATRIX fin_mat; The final matrix*/ /* INDEX rc; Row and column of the final matrix*/ { long comp; int llim,ulim;/*Lower and Upper limits of the value to be mutated*/ FLAG SAME; int tmp; long count; count=0; SAME=TRUE; while (SAME==TRUE) { count++; comp = irange_ran(1,nvars); /*Finding the lower and upper limits between which the values are to be mutated*/ find_rangeInt(&llim,&ulim,comp,domains,nvars,parent); /*Find a random value between the lower and the upper limits, to substitute*/ /*for the old value*/ tmp = irange_ran(llim,ulim); if ( (int) parent[comp] != (int) tmp) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; } /* end of while */ parent[comp] = (int) tmp; } /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegerOper2() */ /* Boundary Mutatation */ /* No Uniqueness checking here */ /* Don't use this oper often! */ /* */ /********************************************************************************/ void JaIntegerOper2(VECTOR parent, double **domains, int nvars) /* VECTOR parent; The parent vector*/ /* MATRIX fin_mat; The final matrix*/ /* INDEX rc; Row and column of the final matrix*/ { int comp; int llim,ulim;/*Lower and Upper limits of the value to be mutated*/ FLAG SAME; int tmp; long count; count=0; SAME=TRUE; while (SAME==TRUE) { count++; comp = irange_ran(1,nvars); /*Finding the lower and upper limits between which the values are to be mutated*/ find_rangeInt(&llim,&ulim,comp,domains,nvars,parent); /*Replace either the lower limit or the upper limit at random,*/ /*for the old value*/ tmp = (int) (flip() == TAIL) ? llim : ulim; if ( (int) tmp != (int) parent[comp]) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; } /* end of while */ parent[comp] = (int) tmp; } /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegeroper3() */ /* Non-Uniform Mutation */ /* */ /* SYNOPSIS : VECTOR oper3(parent,fin_mat,r,c,T,t,B) */ /* */ /* DESCRIPTION : This function returns a new vector generated */ /* from the parent vector, after applying */ /* the operator, non-uniform mutation. */ /* */ /********************************************************************************/ void JaIntegerOper3(VECTOR parent, double **domains, int nvars, int T, int t, int B) /* VECTOR parent; MATRIX fin_mat; INDEX rc; */ /* unsigned long T; Total number of generations*/ /* unsigned long t; Current generation number*/ /* int B; */ { int comp; int llim,ulim; FLAG SAME; int tmp; long count; count=0; SAME=TRUE; while (SAME==TRUE) { count++; comp = irange_ran(1,nvars); find_rangeInt(&llim,&ulim,comp,domains,nvars,parent); /*From the current value of the component to be mutated, chooose at random*/ /*whether to mutate with a lesser value or a greater value*/ /*Then find a value lesser or greater than the original value from the*/ /*function get_f()*/ tmp = (int) (flip() == TAIL) ? parent[comp]-get_F(T,t,parent[comp]-llim,B) : parent[comp]+get_F(T,t,ulim-parent[comp],B); if ( (int) parent[comp] != (int) tmp) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; } /* end of while */ parent[comp] = (int) tmp; } /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegeroper4() */ /* Polytope Crossover */ /* */ /* */ /********************************************************************************/ void JaIntegeroper4(MATRIX p, int p2use, int nvars, double **domains) /* int p The parents chosen for crossover */ /* p2use; number of parents (rows) in p */ /* int nvars Length of the parameter vector (cols in p) */ { double *A, sum; int i,k; A = (double *) malloc((p2use+1)*sizeof(double)); sum=0.0; for (k=1; k<=p2use; k++) { do A[k] = frange_ran(0.0,1.0); while (A[k]==0.0); /* insure A[k] is above 0.0 */ sum += A[k]; } sum = 1.0/sum; for (k=1; k<=p2use; k++) { /* rescale A[k] to sum to 1.0 */ A[k] *= sum; } for(i=1; i<=nvars; i++) { sum = p[1][i] * A[1]; for (k=2; k<=p2use; k++) sum += p[k][i] * A[k]; p[1][i] = (int) sum; if( (int) domains[i][1] > (int) p[1][i]) p[1][i] = (int) domains[i][1]; if( (int) domains[i][3] < (int) p[1][i]) p[1][i] = (int) domains[i][3]; } free(A); } #ifdef NEVERDEFINED void JaIntegerOper4(VECTOR p1, VECTOR p2, int nvars) /* VECTOR p1,p2; The two parents chosen for crossover*/ /* int nvars; Length of the vector*/ { double **child; long i; double A; FLAG SAME; long count, tcount; child = JaMatrixAllocate(3, nvars+1); count=0; SAME=TRUE; while (SAME==TRUE) { count++; do A = frange_ran(0.0,1.0); while (A==0); /* insure A is above 0 */ for(i=1; i<=nvars; i++) { child[1][i] = ( p1[i] * A + p2[i] * (1.0-A) ); child[2][i] = ( p2[i] * A + p1[i] * (1.0-A) ); } if (count >= MAX_OPER_UNIQUE_TRY) { SAME=FALSE; break; } /* Are the two new individuals unique? */ tcount=0; for (i=1; i<=nvars; i++) { if ( (int) child[1][i] != (int) p1[i] ) tcount++; if ( (int) child[2][i] != (int) p2[i] ) tcount++; } /* end of i loop */ if (tcount==(nvars*2)) SAME=FALSE; } /* end of SAME while */ for(i=1; i<=nvars; i++) { p1[i] = (int) child[1][i]; p2[i] = (int) child[2][i]; } JaMatrixFree(child, 3); } /* end of JaIntegerOper4 */ #endif /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegerOper5() */ /* Simple Crossover */ /* */ /* SYNOPSIS : void oper5(p1,p2,STEP,rc,fin_mat,X,x2) */ /* */ /* DESCRIPTION : This function returns two new vectors */ /* generated after simple arithmetical */ /* crossover, from the two parent vectors. */ /* */ /********************************************************************************/ void JaIntegerOper5(VECTOR p1, VECTOR p2, int STEP, double **domains, int nvars) /* VECTOR p1,p2; *The two parents for crossing over*/ /* INDEX rc; *Row and column of the final matrix*/ /* MATRIX fin_mat; *The final matrix*/ /* int STEP; *Parameter for the crossover*/ { MATRIX child; FLAG BFLAG1 = FALSE,/*Check to see if the newly created vectors satisfies the*/ BFLAG2 = FALSE;/*set of constraints*/ int i,n=1,cut; /* unique check variables */ FLAG SAME; int count, tcount, ccount; child = matrix(1,2,1,nvars); count=0; SAME=TRUE; while (SAME==TRUE) { count++; /*Get a random spot on the vector for crossover*/ cut = irange_ran(1,nvars); /*Copy the parent vectors on to the child vectors*/ for(i=1; i<=cut; i++) { child[1][i] = p1[i]; child[2][i] = p2[i]; } do { /*Cross the two vectors*/ ccount = 0; for(i=cut + 1; i<=nvars; i++) { child[1][i] = p1[i] * (double)n/(double)STEP + p2[i] * (1.0-(double)n/(double)STEP); child[2][i] = p2[i] * (double)n/(double)STEP + p1[i] * (1.0-(double)n/(double)STEP); ccount++; } /*Check to see if they satisfy the constraints*/ BFLAG1 = InBounds(child[1],domains,nvars); BFLAG2 = InBounds(child[2],domains,nvars); n++; /*If the constraints not satisfied, then generate another*/ /*set of crossed over values*/ }while((n<=STEP) && ((BFLAG1 == FALSE) || (BFLAG2 == FALSE))); /* Are the two new individuals unique? */ if (count >= MAX_OPER_UNIQUE_TRY) { SAME=FALSE; break; } tcount=0; for (i=cut+1; i<=nvars; i++) { if ( (int) child[1][i] != (int) p1[i] ) tcount++; if ( (int) child[2][i] != (int) p2[i] ) tcount++; } /* end of i loop */ if (tcount>=(ccount*2)) SAME=FALSE; } /* end of while (SAME==TRUE); */ if (BFLAG1==TRUE && BFLAG2==TRUE) { for(i=1; i<=nvars; i++) { p1[i] = (int) child[1][i]; p2[i] = (int) child[2][i]; } } free_matrix(child,1,2,1); } /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegerOper6() */ /* Whole Non-Uniform Mutation */ /* */ /********************************************************************************/ void JaIntegerOper6(VECTOR parent, double **domains, int nvars, int T, int t, int B) /* VECTOR parent; unsigned long T; Total number of generations unsigned long t; Current generation number int B; */ { int i; int llim,ulim; /* unique check variables */ FLAG SAME; long count; int tmp; count=0; SAME=TRUE; while (SAME==TRUE) { for (i=1; i<=nvars; i++) { count++; find_rangeInt(&llim,&ulim,i,domains,nvars,parent); /*From the current value of the component to be mutated, chooose at random*/ /*whether to mutate with a lesser value or a greater value*/ /*Then find a value lesser or greater than the original value from the*/ /*function get_f()*/ tmp = (int) (flip() == TAIL) ? parent[i]-get_F(T,t,parent[i]-llim,B) : parent[i]+get_F(T,t,ulim-parent[i],B); if ( (int) parent[i] != (int) tmp) SAME=FALSE; else if (count >= MAX_OPER_UNIQUE_TRY) SAME=FALSE; parent[i] = (int) tmp; }//end of for loop } // end of while loop }//oper6 /********************************************************************************/ /* */ /* FUNCTION NAME : JaIntegerOper7() */ /* Heuristic Crossover */ /* */ /********************************************************************************/ void JaIntegerOper7(VECTOR p1, VECTOR p2, double **domains, int nvars) { VECTOR child; FLAG BFLAG = FALSE;/*Check to see if the newly created vector satisfies the*/ /*set of constraints*/ int i,n=2,tries=MAX_OPER_UNIQUE_TRY; double A; /* unique check variables */ FLAG SAME; long count; child = Gvector(1,nvars); count=0; SAME=TRUE; while (SAME==TRUE) { count++; do { A = frange_ran(0.0,1.0); for(i=1; i<=nvars; i++) child[i] = (int) ( A * (p2[i] - p1[i]) + p2[i] ); /*Check to see if it satisfies the constraints*/ BFLAG = InBounds(child,domains,nvars); n++; /*If the constraints not satisfied, then try again */ } while((n<=tries) && (BFLAG == FALSE)); /* Is the new individual unique? */ if (count >= MAX_OPER_UNIQUE_TRY) { SAME=FALSE; break; } for (i=1; i<=nvars; i++) { if ( (int) child[i] != (int) p1[i] ) { SAME=FALSE; break; } } } /* end of while SAME loop */ if (BFLAG==TRUE) { for(i=1; i<=nvars; i++) p1[i] = (int) child[i]; } free_vector(child,1); } /* end of JaIntegerOper7() */ /********************************************************************************/ /* */ /* FUNCTION NAME : InBounds(child, domains, nvars) */ /* */ /* DESCRIPTION : This function returns TRUE or FALSE depending*/ /* on whether the vector passed satisfies all */ /* the constraints or not. */ /* */ /********************************************************************************/ FLAG InBounds(VECTOR child, double **domains, int nvars) /* VECTOR child; The vector to be checked for violation of constriants*/ { int i; for(i=1; i<=nvars; i++) { if( (child[i] < domains[i][1]) || (child[i] > domains[i][3]) ) return(FALSE); } return(TRUE); } rgenoud/src/multiply.cpp0000644000176200001440000001115713421760173015100 0ustar liggesusers/* RGENOUD Walter R. Mebane, Jr. Cornell University http://macht.arts.cornell.edu/wrm1 Jasjeet Singh Sekhon UC Berkeley http://sekhon.polisci.berkeley.edu $Header: /home/jsekhon/xchg/genoud/rgenoud.distribution/sources/RCS/multiply.cpp,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ #include "genoud.h" /********************************************************************************/ /* */ /* FUNCTION NAME : mmprod() */ /* */ /* SYNOPSIS : void mmprod(m,nm,n,mul_cm,mul_am,mul_bm) */ /* */ /* DESCRIPTION : This function finds the product of two */ /* double matrices */ /* */ /* FUNCTIONS CALLED : None */ /* */ /* CALLING FUNCITONS : find_org_in_eq(), */ /* main(). */ /* */ /* */ /* REV DATE BY DESCRIPTION */ /* --- ---- -- ----------- */ /* */ /* */ /********************************************************************************/ void mmprod(int m, int nm, int n, MATRIX mul_cm, MATRIX mul_am, MATRIX mul_bm) /* int m, row of mul_am matrix nm, column of mul_am and row of mul_bm matrices n; row of mul_bm matrix MATRIX mul_cm, the final matrix mul_am, the first matrix to be multiplied mul_bm; the second matrix to be multiplied */ { int i,j,k; /*counter variables, where i=m, j=nm, k=n*/ for(i= 1; i<=m; i++) for(j = 1; j<=n; j++) { mul_cm[i][j] = 0.0; for (k= 1;k # # Jasjeet Singh Sekhon # UC Berkeley # http://sekhon.berkeley.edu # # genoud <- function(fn, nvars, max=FALSE, pop.size=1000, max.generations=100, wait.generations=10, hard.generation.limit=TRUE, starting.values=NULL, MemoryMatrix=TRUE, Domains=NULL, default.domains=10, solution.tolerance=0.001, gr=NULL, boundary.enforcement=0, lexical=FALSE, gradient.check=TRUE, BFGS=TRUE, data.type.int=FALSE, hessian=FALSE, unif.seed=round(runif(1, 1, 2147483647L)), int.seed=round(runif(1, 1, 2147483647L)), print.level=2, share.type=0, instance.number=0, output.path="stdout", output.append=FALSE, project.path=NULL, P1=50, P2=50, P3=50, P4=50, P5=50, P6=50, P7=50, P8=50, P9=0, P9mix=NULL, BFGSburnin=0, BFGSfn=NULL, BFGShelp = NULL, control = list(), optim.method=ifelse(boundary.enforcement < 2, "BFGS", "L-BFGS-B"), transform=FALSE, debug=FALSE, cluster=FALSE, balance=FALSE, ...) { if (transform!=FALSE & transform!=TRUE) { warning("'transform' must be TRUE or FALSE. Setting to FALSE") transform <- FALSE } if(transform) { return(do.call(what = genoud_transform, args = as.list(match.call())[-1], quote = FALSE, envir = parent.frame())) } if(!is.null(BFGShelp) && !is.function(BFGShelp)) stop("'BFGShelp' must be NULL or a function") #These used to be option. From >5.7-3, they are no longer available #because R CMD check complains about calls to 'stdout' if (output.path!="stdout") { output.path <- "stdout" warning("'output.path' can no longer be changed. Please use 'sink'. Option is only provided for backward compatibility of the API.") } if(output.append!=FALSE) { output.append <- FALSE warning("'output.append' can no longer be changed. Please use 'sink'. Option is only provided for backward compatibility of the API.") } if(!is.null(P9mix) && !is.double(P9mix)) { stop("'P9mix' must be NULL or a number between 0 and 1") } else { if(is.null(P9mix)) { P9mix <- -1 } else { if(! ( (1 >= P9mix) && (P9mix > 0) )) stop("'P9mix' must be NULL or a number between 0 and 1 (it may be equal to 1)") } } if( (BFGSburnin < 0) & !gradient.check ) { warning("If 'BFGSburnin' is negative, gradient.check must be TRUE for 'BFGSburnin' to have any effect.") } if(!is.list(control)) stop("'control' must be a list, see ?optim") g.scale <- control$fnscale if(!is.null(g.scale)) { if(g.scale > 0 & max) { stop("positive control$fnscale is inconsistent with maximization") } else if(g.scale < 0 & !max) { stop("negative control$fnscale is inconsistent with minimization") } else if(g.scale == 0) { stop("optim divides the function value by control$fnscale ", "setting control$fnscale to zero is therefore impossible") } FiniteBadFitValue <- ifelse(max, -.Machine$double.xmax, .Machine$double.xmax) } else { # NULL g.scale if (max == FALSE) { g.scale <- 1 FiniteBadFitValue <- .Machine$double.xmax } else { g.scale <- -1 FiniteBadFitValue <- -.Machine$double.xmax } } control$fnscale <- g.scale if(!lexical & !is.null(BFGSfn)) { stop("'BFGSfn' can only be provided with lexical optimization or when 'transform=TRUE'") } if (!is.null(BFGSfn) & BFGS==FALSE) { if (!is.function(BFGSfn)) stop("IF 'BFGSfn' is not a function, it must be NULL") warning("setting BFGS==TRUE because 'BFGSfn' is not null") BFGS <- TRUE } fn1 <- function(par) { fit <- fn(par, ...) if(is.null(fit)) fit <- FiniteBadFitValue if(length(fit)==1) if(!is.finite(fit)) fit <- FiniteBadFitValue return(fit) }#end of fn1 if(!is.null(BFGShelp)) { if (!is.null(gr)) { gr1 <- function(par, helper = do.call(BFGShelp, args = list(initial = par, done = TRUE))) { gr(par, helper, ...) } } else gr1 <- NULL } else { if (!is.null(gr)) { gr1 <- function(par) gr(par, ...) } else gr1 <- NULL } #setpath to tempdir if(is.null(project.path)) { project.path <- file.path(tempdir(), "genoud.pro") } #do we have stating values? if (is.null(starting.values)) { nStartingValues <- 0; } else if(is.matrix(starting.values)) { if(any(dim(starting.values) == nvars)) { if(nrow(starting.values) == nvars & ncol(starting.values) !=nvars) starting.values <- t(starting.values) nStartingValues <- nrow(starting.values) if(nStartingValues > pop.size) { warning("increasing 'pop.size' because too many starting.values were provided") pop.size <- nStartingValues } } else { warning("ignoring 'starting.values' because the wrong number of parameters was provided") nStartingValues <- 0 } } else if(is.numeric(starting.values) | is.logical(starting.values)) { nStartingValues <- 1; if(length(starting.values)!=nvars) { nStartingValues <- 0 warning("Ignoring 'starting.values' because length(staring.values)!=nvars") } else starting.values <- matrix(starting.values, nrow = 1) } else stop("starting.values must be NULL, a vector, or a matrix") #set output.type if (output.path=="stdout") { output.type <- 0; } else { if (output.append) { output.type <- 2; } else { output.type <- 1; } } # let's create the Domains if none have been passed. if (!(is.matrix(Domains))) { Domains <- matrix(nrow=nvars, ncol=2); for (i in 1:nvars) { Domains[i,1] <- -1*default.domains; Domains[i,2] <- default.domains; } # end of for loop } else if(nrow(Domains) != nvars) { stop("number of rows in Domains must match 'nvars'") } else if(ncol(Domains) != 2) { stop("number of cols in Domains must be 2") } if(!all(Domains[,1] <= Domains[,2])) { stop("Domains[,1] must be less than or equal to Domains[,2]") } if(any(Domains[,1] == Domains[,2])) { warning("some Domains[,1]==Domains[,2]") } # BG: now check all starting values are sane if(nStartingValues > 0 && any(is.na(starting.values))) { stop("Some starting values are NA") } if(nStartingValues > 0 && boundary.enforcement != 0 && !all(apply(starting.values, 1, FUN = function(x) Domains[,1] <= x & x <= Domains[,2])) ) warning("'starting.values' which are outside of the bounds have been provided. Continuing, but unexpected behavior can occur with 'boundary.enforcement!=0'") # has the user provided any seeds? if (unif.seed==812821 && int.seed==53058) provide.seeds <- FALSE else provide.seeds <- TRUE; #if lexical==TRUE we need to know how many items will be returned if (lexical < 0) { warning("lexical < 0. Resetting to FALSE\n") lexical <- 0 } if (lexical>=1) { #creating visible binding for variable "indx"; although it is #actually defined in fnLexicalSort() via an eval and paste if (!exists("indx")) { indx <- NULL; rm(indx) } if(share.type > 0) { warning("'share.type' being set to 0 because of lexical optimization") share.type <- 0 } if(nStartingValues) { foo <- fn1(starting.values[1,]) } else { rfoo <- stats::runif(nrow(Domains), Domains[,1], Domains[,2]) if(data.type.int) rfoo <- as.integer(round(rfoo)) foo <- fn1(rfoo) } foo.length <- length(as.vector(foo)) if(lexical > 1 && foo.length != lexical) { warning(paste("Function returns a vector of length", foo.length, "\nbut you specified lexical =", lexical)) } if(foo.length == 1) { lexical <- 0 warning("you specified lexical = TRUE but the function returns a scalar") } else lexical <- foo.length } else foo.length <- 1 if (lexical > 0) { if(is.null(BFGSfn)) { #All derivative stuff is turned off if we are going to do lexical if BFGSfn is not provided BFGS=FALSE gradient.check=FALSE if(hessian) { warning("'hessian' being set to false because of lexical optimization. See 'BFGSfn' for workaround") hessian=FALSE } P9 = 0 } else { if(!is.null(BFGShelp)) { fn1.bfgs <- function(par, helper = do.call(BFGShelp, args = list(initial = par, done = TRUE), envir = environment(fn))) { fit <- BFGSfn(par, helper, ...) if(is.null(fit)) fit <- FiniteBadFitValue if(length(fit)==1) if(!is.finite(fit)) fit <- FiniteBadFitValue return(fit) }#end of fn1.bfgs } else { fn1.bfgs <- function(par) { fit <- BFGSfn(par, ...) if(is.null(fit)) fit <- FiniteBadFitValue if(length(fit)==1) if(!is.finite(fit)) fit <- FiniteBadFitValue return(fit) }#end of fn1.bfgs } # end else if(is.null(gr)) { gr <- function(par, helper = NA, ...) { gr.fn1.bfgs <- function(par, helper, FBFV) { fit <- if(is.null(BFGShelp)) BFGSfn(par, ...) else BFGSfn(par, helper, ...) if(is.null(fit)) fit <- FBFV if(length(fit)==1) if(!is.finite(fit)) fit <- FBFV return(fit) } # end of gr.fn1.bfgs genoud.wrapper101.env <- new.env() assign("x", par, envir = genoud.wrapper101.env) assign("helper", helper, envir = genoud.wrapper101.env) assign("FiniteBadFitValue", FiniteBadFitValue, envir = genoud.wrapper101.env) foo <- as.double(attr(stats::numericDeriv(quote(gr.fn1.bfgs(x, helper, FiniteBadFitValue)), theta=c("x"), genoud.wrapper101.env), "gradient")) return(foo) } #end of gr gr1 <- if(is.null(BFGShelp)) function(par, ...) gr(par) else function(par, helper = do.call(BFGShelp, args = list(initial = par, done = TRUE), envir = environment(fn))) { gr(par, helper, ...) } # end of gr1 } # end of if(!is.null(gr)) gr1func <- gr1 }# end of else }#if lexical > 0 if (lexical==0) lexical <- 1 #optim st if(is.null(BFGSfn)) { if(optim.method != "L-BFGS-B") { genoud.optim.wrapper101 <- function(foo.vals) { ret <- stats::optim(foo.vals, fn=fn1, gr=gr1, method=optim.method, control=control); return(c(ret$value,ret$par)); } # end of genoud.optim.wrapper101 } else { genoud.optim.wrapper101 <- function(foo.vals) { ret <- stats::optim(foo.vals, fn=fn1, gr=gr1, method="L-BFGS-B", lower = Domains[,1], upper = Domains[,2], control=control); return(c(ret$value,ret$par)); } # end of genoud.optim.wrapper101 } } else { if(optim.method != "L-BFGS-B") { genoud.optim.wrapper101 <- function(foo.vals) { if(print.level > 2) { fit <- fn1(foo.vals) cat("\nPre-BFGS Complete Lexical Fit:\n") print(fit) } if(is.null(BFGShelp)) { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method=optim.method, control=control); } else { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method=optim.method, control=control, helper = do.call(BFGShelp, args = list(initial = foo.vals), envir = environment(fn)) ); } if(print.level > 2) { cat("BFGS Fit:",ret$value,"\n") fit <- fn1(ret$par) cat("Post-BFGS Complete Lexical Fit:\n") print(fit) } foo <- c(ret$value,ret$par) return(foo); } # end of genoud.optim.wrapper101 } else { # "L-BFGS-B" genoud.optim.wrapper101 <- function(foo.vals) { if(print.level > 2) { fit <- fn1(foo.vals) cat("\nPre-BFGS Complete Lexical Fit:\n") print(fit) } if(is.null(BFGShelp)) { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method="L-BFGS-B", lower = Domains[,1], upper = Domains[,2], control=control); } else { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method="L-BFGS-B", lower = Domains[,1], upper = Domains[,2], control=control, helper = do.call(BFGShelp, args = list(initial = foo.vals), envir = environment(fn)) ); } if(print.level > 2) { cat("BFGS Fit:",ret$value,"\n") fit <- fn1(ret$par) cat("Post-BFGS Complete Lexical Fit:\n") print(fit) } foo <- c(ret$value,ret$par) return(foo); } # end of genoud.optim.wrapper101 } } # create the P vector P <- vector(length=9, mode="numeric"); P[1] <- P1; P[2] <- P2; P[3] <- P3; P[4] <- P4; P[5] <- P5; P[6] <- P6; P[7] <- P7; P[8] <- P8; P[9] <- P9; clustertrigger=1 if (is.logical(cluster)) { if (cluster==FALSE) { clustertrigger=0 } else { stop("cluster option must be either FALSE, an object of the 'cluster' class (from the 'parallel' package) or a list of machines so 'genoud' can create such an object") } } if(clustertrigger) { parallel.exists = requireNamespace("parallel") if (!parallel.exists) { stop("The 'cluster' feature cannot be used unless the package 'parallel' can be loaded.") } } if(clustertrigger) { if(!MemoryMatrix) { MemoryMatrix = TRUE warning("MemoryMatrix has been set to 'TRUE' because the cluster option has been requested.") } GENclusterExport <- function (cl, list) { gets <- function(n, v) { assign(n, v) NULL } for (name in list) { parallel::clusterCall(cl, gets, name, get(name)) } } ExpandDots <- function(...) { return(match.call()) } dots <- ExpandDots(...) if ( (length(dots) > 1) & balance==TRUE) { balance <- FALSE warning("load balancing has been turned off because the function to be optimized requires extra arguments") } if (class(cluster)[1]=="SOCKcluster" | class(cluster)[1]=="PVMcluster" | class(cluster)[1]=="spawnedMPIcluster" | class(cluster)[1]=="MPIcluster") { clustertrigger=1 cl <- cluster GENclusterExport(cl, "fn") GENclusterExport(cl, "fn1") } else { clustertrigger=2 cluster <- as.vector(cluster) cat("Initializing Cluster\n") cl <- parallel::makePSOCKcluster(cluster) GENclusterExport(cl, "fn") GENclusterExport(cl, "fn1") } if (length(cl) < 2 ) { stop("You only have one node. You probably should not be using the cluster option") } } fnLexicalSort <- function(mat, parms) { # parms = (1) MinMax, (2) nvars, (3) lexical_end, (4) type (0, vars, 1, obj) decreasing=FALSE if(parms[1]==1) decreasing=TRUE if(parms[4]==0) { #on nvars not on obj function foo = "indx <- order(" for(i in (2:(parms[2]+1)) ) { foo = paste(foo,"mat[,",i,"], ",sep="") } foo = paste(foo,"mat[,",parms[2]+2,"], ",sep="") foo = paste(foo,"decreasing=FALSE)",sep="") eval(parse(text=foo)) mat = mat[indx,] } else { #lexical on obj function foo = "indx <- order(mat[,1], " for(i in (parms[2]+3):parms[3] ) { foo = paste(foo,"mat[,",i,"], ",sep="") } foo = paste(foo,"decreasing=",decreasing,")",sep="") eval(parse(text=foo)) mat = mat[indx,] } return(mat) } fnMemoryMatrixEvaluate <- function(Memory, population, parms) { EVALUATE = -93813381 MinMax = parms[1] nvars = parms[2] lexical = parms[3] lexical.end = ncol(population) pop.size = nrow(population) vars.indx <- 2:(nvars+1) lexical.indx <- c(1,(nvars+3):lexical.end) FIRSTTIME = TRUE if (nrow(Memory) > 1) FIRSTTIME = FALSE nevaluate = 0 mfunc <- function(pop,memory) { f <- function(...) paste(..., sep=":") a2 <- do.call("f", as.data.frame(pop)) b2 <- do.call("f", as.data.frame(memory)) return(match(a2,b2)) } population.mat = matrix(population[,vars.indx], ncol=nvars) if (!FIRSTTIME) { Memory.mat = matrix(Memory[,vars.indx], ncol=nvars) match.matrix.indx <- mfunc(population.mat,Memory.mat) for (i in 1:pop.size) { match.indx = match.matrix.indx[i] found.match <- FALSE if ( is.finite(match.indx) ) { #this is needed because mfunc truncates floats (by the call to paste) to 15 digits # if (all(population.mat[i,]==Memory.mat[match.indx,])) # { found.match <- TRUE population[i,] <- Memory[match.indx,] # } } if(!found.match) { if (population[i,nvars+2] != 0) { population[i,nvars+2] = EVALUATE nevaluate = nevaluate+1 } } } } else { for (i in 1:pop.size) { population[i,nvars+2] = EVALUATE nevaluate = nevaluate+1 } } #evaluation loop if (nevaluate > 0) { eval.indx <- population[,nvars+2]==EVALUATE ret=0 if (clustertrigger==0) { in.mat = matrix(population.mat[eval.indx,], ncol=nvars) ret <- matrix(t(apply(in.mat, 1, fn1)), ncol=lexical) } else { if (balance==TRUE) { in.mat = t(matrix(population.mat[eval.indx,], ncol=nvars)) cl.in <- as.list(as.data.frame(in.mat)) cl.out <- parallel::clusterApplyLB(cl, cl.in, fn1) try(ret <- matrix(t(data.frame(cl.out)), ncol=lexical), TRUE) if (!is.matrix(ret)) { if (!debug) { stop("Cluster returned an object which could not be turned into a data.frame. Cluster may be in bad state. Please consider restarting it. To see what the cluster returned please turn on the 'debug' option.") } else { cat("Cluster returned an object which could not be turned into a data.frame:\n") print(cl.out) stop("Cluster may be in bad state. Please consider restarting it.") } } } else { in.mat = matrix(population.mat[eval.indx,], ncol=nvars) if(length(cl) > 1 ) { cl.out = parallel::parRapply(cl, in.mat, fn1) } else { stop("You only have one node. Cluster option should not be used") } try(ret <- matrix(cl.out, byrow=TRUE, ncol=lexical), TRUE) if (!is.matrix(ret)) { if (!debug) { stop("Cluster returned an object which could not be turned into a data.frame. Cluster may be in bad state. Please consider restarting it. To see what the cluster returned please turn on the 'debug' option.") } else { cat("Cluster returned an object which could not be turned into a data.frame:\n") print(cl.out) stop("Cluster may be in bad state. Please consider restarting it.") } } } } # else clustertrigger==0 if (lexical < 2) { population[eval.indx,1] = ret[,1] } else { population[eval.indx,lexical.indx] = ret } population[eval.indx,nvars+2] = 0 if(!FIRSTTIME) { Memory = rbind(Memory,population[eval.indx,]) } else { Memory = matrix(population[eval.indx,], ncol=lexical.end) FIRSTTIME = FALSE } }#end of nevaluate if (lexical > 1) { population <- fnLexicalSort(population, c(MinMax,nvars,lexical.end,1)) } else { if (MinMax==0) { population <- population[order(population[,1]),] } else { population <- population[order(population[,1], decreasing=TRUE),] } } return(as.vector(c(nrow(Memory), Memory, population))) } #end of fnMemoryMatrixEvaluate if (!is.null(gr)) { UserGradient = TRUE gr1func <- gr1 } else { UserGradient = FALSE gr1func <- function() {} } if(data.type.int) { BFGS = FALSE gradient.check=FALSE } if(is.matrix(starting.values)) starting.values <- t(starting.values) #C++ code checks if at least Generation 0 has been run and if #print.level>0 and project.path!="/dev/null". Otherwise, 'interrupted' #remains FALSE interrupted <- FALSE interrupt.message <- paste("genoud interrupted:\none may recover the best solution found so far by executing") interrupt.expression <- paste("pop <- read.table('",project.path, "', comment.char = 'G')", sep = "") interrupt.expression2 <- "best <- pop[pop$V1 == 1,, drop = FALSE]" interrupt.expression3 <- paste("very.best <- as.matrix(best[nrow(best), ", foo.length + 2, ":ncol(best)])", sep = "") on.exit(if(interrupted) cat(interrupt.message, "\n", interrupt.expression, "\n", interrupt.expression2, "\n", interrupt.expression3, "\n")) gout <- .Call("rgenoud", as.function(fn1), new.env(), as.integer(nvars), as.integer(pop.size), as.integer(max.generations), as.integer(wait.generations), as.integer(nStartingValues), as.double(starting.values), as.vector(P), as.matrix(Domains), as.integer(max), as.integer(gradient.check), as.integer(boundary.enforcement), as.double(solution.tolerance), as.integer(BFGS), as.integer(data.type.int), as.integer(provide.seeds), as.integer(unif.seed), as.integer(int.seed), as.integer(print.level), as.integer(share.type), as.integer(instance.number), as.integer(MemoryMatrix), as.integer(debug), as.character(output.path), as.integer(output.type), as.character(project.path), as.integer(hard.generation.limit), as.function(genoud.optim.wrapper101), as.integer(lexical), as.function(fnLexicalSort), as.function(fnMemoryMatrixEvaluate), as.integer(UserGradient), as.function(gr1func), as.double(P9mix), as.integer(BFGSburnin), as.integer(transform), PACKAGE="rgenoud"); indx1 <- 4; indx2 <- (indx1+lexical-1); value=gout[indx1:indx2]; indx1 <- indx2+1 indx2 <- indx1+nvars-1 par = gout[indx1:indx2] indx1 <- indx2+1 indx2 <- indx1+nvars-1 if(!gradient.check & !BFGS ) { gradients= gout[indx1:indx2] gradients = rep(NA, length(gradients)) } else { gradients = gout[indx1:indx2] } indx1 <- indx2+1 indx2 <- indx1+8 operators=gout[indx1:indx2] if (hessian==TRUE) { con <- list(trace = 0, fnscale = g.scale, parscale = rep.int(1, length(par)), ndeps = rep.int(0.001, length(par)), maxit = 100, abstol = -Inf, reltol = sqrt(.Machine$double.eps), alpha = 1, beta = 0.5, gamma = 2, REPORT = 10, type = 1, lmm = 5, factr = 1e+07, pgtol = 0, tmax = 10, temp = 10) nm <- names(gout[5:(nvars+4)]) if(lexical == 1) { hess.fn <- function(par) fn1(par, ...) hess <- stats::optimHess(par=gout[5:(nvars+4)], fn=fn1, gr=gr1, control=con) } else { help.stuff <- do.call(BFGShelp, args = list(initial = gout[5:(nvars+4)], done = TRUE), envir = environment(fn)) hess.fn <- function(par, helper = help.stuff) fn1.bfgs(par, helper, ...) hess <- stats::optimHess(par=gout[5:(nvars+4)], fn=hess.fn, gr=NULL, control=con) } hes <- 0.5 * (hess + t(hess)) if (!is.null(nm)) dimnames(hes) <- list(nm, nm) ret <- list(value=value, par=par, gradients=gradients, generations=gout[1], peakgeneration=gout[2], popsize=gout[3], operators=operators, hessian=hes) } else { ret <- list(value=value, par=par, gradients=gradients, generations=gout[1], peakgeneration=gout[2], popsize=gout[3], operators=operators) } if (clustertrigger==2) parallel::stopCluster(cl) interrupted <- FALSE return(ret) } #end of genoud() genoud_transform <- function(fn, nvars, max=FALSE, pop.size=1000, max.generations=100, wait.generations=10, hard.generation.limit=TRUE, starting.values=NULL, MemoryMatrix=TRUE, Domains=NULL, default.domains=10, solution.tolerance=0.001, gr=NULL, boundary.enforcement=0, lexical=FALSE, gradient.check=TRUE, BFGS=TRUE, data.type.int=FALSE, hessian=FALSE, unif.seed=812821, int.seed=53058, print.level=2, share.type=0, instance.number=0, output.path="stdout", output.append=FALSE, project.path=NULL, P1=50, P2=50, P3=50, P4=50, P5=50, P6=50, P7=50, P8=50, P9=0, P9mix=NULL, BFGSburnin=0, BFGSfn=NULL, BFGShelp = NULL, control = list(), optim.method=ifelse(boundary.enforcement < 2, "BFGS", "L-BFGS-B"), transform=FALSE, debug=FALSE, cluster=FALSE, balance=FALSE, ...) { #wrapper for the transform option. beta changes should go here as well if(data.type.int) stop("transform option cannot be used when 'data.type.int=TRUE'") if(MemoryMatrix) warning("setting MemoryMatrix to FALSE") MemoryMatrix <- FALSE if(!identical(cluster, FALSE)) warning("setting cluster to FALSE") cluster <- FALSE if(!is.null(BFGShelp) && !is.function(BFGShelp)) stop("'BFGShelp' must be NULL or a function") #creating visible binding for variable "indx"; although it is #actually defined in fnLexicalSort() via an eval and paste if (!exists("indx")) { indx <- NULL; rm(indx) } if(!is.null(P9mix) && !is.double(P9mix)) { stop("'P9mix' must be NULL or a number between 0 and 1") } else { if(is.null(P9mix)) { P9mix <- -1 } else { if(! ( (1 >= P9mix) && (P9mix > 0) )) stop("'P9mix' must be NULL or a number between 0 and 1 (it may be equal to 1)") } } if( (BFGSburnin < 0) & !gradient.check ) { warning("If 'BFGSburnin' is negative, gradient.check must be TRUE for 'BFGSburnin' to have any effect.") } if(!is.list(control)) stop("'control' must be a list, see ?optim") g.scale <- control$fnscale if(!is.null(g.scale)) { if(g.scale > 0 & max) { stop("positive control$fnscale is inconsistent with maximization") } else if(g.scale < 0 & !max) { stop("negative control$fnscale is inconsistent with minimization") } else if(g.scale == 0) { stop("optim divides the function value by control$fnscale ", "setting control$fnscale to zero is therefore impossible") } FiniteBadFitValue <- ifelse(max, -.Machine$double.xmax, .Machine$double.xmax) } else { # NULL g.scale if (max == FALSE) { g.scale <- 1 FiniteBadFitValue <- .Machine$double.xmax } else { g.scale <- -1 FiniteBadFitValue <- -.Machine$double.xmax } } control$fnscale <- g.scale ## BFGSfn can (and probably should) be provided if transform = TRUE # if(!lexical & !is.null(BFGSfn)) # { # stop("'BFGSfn' can only be provided with lexical optimization or when 'transform=TRUE'") # } if (!is.null(BFGSfn) & BFGS==FALSE) { if (!is.function(BFGSfn)) stop("IF 'BFGSfn' is not a function, it must be NULL") warning("setting BFGS==TRUE because 'BFGSfn' is not null") BFGS <- TRUE } fn1 <- function(par) { fit <- fn(par, ...) if(!is.finite(fit[1])) fit[1] <- FiniteBadFitValue ## only catch [1] return(fit) } if(!is.null(BFGShelp)) { if (!is.null(gr)) { gr1 <- function(par, helper = do.call(BFGShelp, args = list(initial = par, done = TRUE))) { gr(par, helper, ...) } } else gr1 <- NULL } else { if (!is.null(gr)) { gr1 <- function(par) gr(par, ...) } else gr1 <- NULL } #setpath to tempdir if(is.null(project.path)) { project.path <- file.path(tempdir(), "genoud.pro") } #do we have stating values? if (is.null(starting.values)) { nStartingValues <- 0; } else if(is.matrix(starting.values)) { if(any(dim(starting.values) == nvars)) { if(nrow(starting.values) == nvars & ncol(starting.values) !=nvars) starting.values <- t(starting.values) nStartingValues <- nrow(starting.values) if(nStartingValues > pop.size) { warning("increasing 'pop.size' because too many starting.values were provided") pop.size <- nStartingValues } } else { warning("ignoring 'starting.values' because the wrong number of parameters was provided") nStartingValues <- 0 } } else if(is.numeric(starting.values) | is.logical(starting.values)) { nStartingValues <- 1; if(length(starting.values)!=nvars) { nStartingValues <- 0 warning("Ignoring 'starting.values' because length(staring.values)!=nvars") } else starting.values <- matrix(starting.values, nrow = 1) } else stop("starting.values must be NULL, a vector, or a matrix") #set output.type if (output.path=="stdout") { output.type <- 0; } else { if (output.append) { output.type <- 2; } else { output.type <- 1; } } # let's create the Domains if none have been passed. if (!(is.matrix(Domains))) { Domains <- matrix(nrow=nvars, ncol=2); for (i in 1:nvars) { Domains[i,1] <- -1*default.domains; Domains[i,2] <- default.domains; } # end of for loop } else if(nrow(Domains) != nvars) { stop("number of rows in Domains must match 'nvars'") } else if(ncol(Domains) != 2) { stop("number of cols in Domains must be 2") } if(!all(Domains[,1] <= Domains[,2])) { stop("Domains[,1] must be less than or equal to Domains[,2]") } if(any(Domains[,1] == Domains[,2])) { warning("some Domains[,1]==Domains[,2]") } # BG: now check all starting values are sane if(nStartingValues > 0 && any(is.na(starting.values))) { stop("Some starting values are NA") } if(nStartingValues > 0 && boundary.enforcement != 0 && !all(apply(starting.values, 1, FUN = function(x) Domains[,1] <= x & x <= Domains[,2])) ) warning("'starting.values' which are outside of the bounds have been provided. Continuing, but unexpected behavior can occur with 'boundary.enforcement!=0'") # seeds always provided provide.seeds <- TRUE; # we need to know how many items will be returned bf fn() if(nStartingValues) { foo <- fn1(starting.values[1,]) } else { rfoo <- stats::runif(nrow(Domains), Domains[,1], Domains[,2]) foo <- fn1(rfoo) } foo.length <- length(c(foo)) if(foo.length <= nvars) stop("'fn' must return criteria and all transformed parameters") lexical <- foo.length - nvars ## it is possible that lexical == 1 or lexical > 1 if (lexical >= 1) ## always TRUE { if(share.type > 0) { warning("'share.type' being set to 0 because of 'transform' option") share.type <- 0 } if(is.null(BFGSfn)) { #All derivative stuff is turned off if BFGSfn is not provided BFGS <- FALSE gradient.check <- FALSE if(hessian) { warning("'hessian' being set to false because of lexical optimization. See 'BFGSfn' for workaround") hessian <- FALSE } P9 = 0 } else { if(!is.null(BFGShelp)) { fn1.bfgs <- function(par, helper = do.call(BFGShelp, args = list(initial = par, done = TRUE), envir = environment(fn))) { fit <- BFGSfn(par, helper, ...) if(is.null(fit)) fit <- FiniteBadFitValue if(length(fit)==1) if(!is.finite(fit)) fit <- FiniteBadFitValue return(fit) }#end of fn1.bfgs } else { fn1.bfgs <- function(par) { fit <- BFGSfn(par, ...) if(is.null(fit)) fit <- FiniteBadFitValue if(length(fit)==1) if(!is.finite(fit)) fit <- FiniteBadFitValue return(fit) }#end of fn1.bfgs } # end else if(is.null(gr)) { ## should we do numerical gradients when transform = TRUE? gr <- function(par, helper = NA, ...) { gr.fn1.bfgs <- function(par, helper, FBFV) { fit <- if(is.null(BFGShelp)) BFGSfn(par, ...) else BFGSfn(par, helper, ...) if(is.null(fit)) fit <- FBFV if(length(fit)==1) if(!is.finite(fit)) fit <- FBFV return(fit) } # end of gr.fn1.bfgs genoud.wrapper101.env <- new.env() assign("x", par, envir = genoud.wrapper101.env) assign("helper", helper, envir = genoud.wrapper101.env) assign("FiniteBadFitValue", FiniteBadFitValue, envir = genoud.wrapper101.env) foo <- as.double(attr(stats::numericDeriv(quote(gr.fn1.bfgs(x, helper, FiniteBadFitValue)), theta=c("x"), genoud.wrapper101.env), "gradient")) return(foo) } #end of gr gr1 <- if(is.null(BFGShelp)) function(par, ...) gr(par) else function(par, helper = do.call(BFGShelp, args = list(initial = par, done = TRUE), envir = environment(fn))) { gr(par, helper, ...) } # end of gr1 } # end of if(!is.null(gr)) gr1func <- gr1 }# end of else }#if lexical > 1 #optim st if(is.null(BFGSfn)) { if(optim.method != "L-BFGS-B") { genoud.optim.wrapper101 <- function(foo.vals) { ret <- stats::optim(foo.vals, fn=fn1, gr=gr1, method=optim.method, control=control); return(c(ret$value,ret$par)); } # end of genoud.optim.wrapper101 } else { genoud.optim.wrapper101 <- function(foo.vals) { ret <- stats::optim(foo.vals, fn=fn1, gr=gr1, method="L-BFGS-B", lower = Domains[,1], upper = Domains[,2], control=control); return(c(ret$value,ret$par)); } # end of genoud.optim.wrapper101 } } else { if(optim.method != "L-BFGS-B") { genoud.optim.wrapper101 <- function(foo.vals) { if(print.level > 2) { fit <- fn1(foo.vals) cat("\nPre-BFGS Complete Lexical Fit:\n") print(fit) } if(is.null(BFGShelp)) { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method=optim.method, control=control); } else { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method=optim.method, control=control, helper = do.call(BFGShelp, args = list(initial = foo.vals), envir = environment(fn)) ); } if(print.level > 2) { cat("BFGS Fit:",ret$value,"\n") fit <- fn1(ret$par) cat("Post-BFGS Complete Lexical Fit:\n") print(fit) } foo <- c(ret$value,ret$par) return(foo); } # end of genoud.optim.wrapper101 } else { # "L-BFGS-B" genoud.optim.wrapper101 <- function(foo.vals) { if(print.level > 2) { fit <- fn1(foo.vals) cat("\nPre-BFGS Complete Lexical Fit:\n") print(fit) } if(is.null(BFGShelp)) { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method="L-BFGS-B", lower = Domains[,1], upper = Domains[,2], control=control); } else { ret <- stats::optim(foo.vals, fn=fn1.bfgs, gr=gr1, method="L-BFGS-B", lower = Domains[,1], upper = Domains[,2], control=control, helper = do.call(BFGShelp, args = list(initial = foo.vals), envir = environment(fn)) ); } if(print.level > 2) { cat("BFGS Fit:",ret$value,"\n") fit <- fn1(ret$par) cat("Post-BFGS Complete Lexical Fit:\n") print(fit) } foo <- c(ret$value,ret$par) return(foo); } # end of genoud.optim.wrapper101 } } # create the P vector P <- vector(length=9, mode="numeric"); P[1] <- P1; P[2] <- P2; P[3] <- P3; P[4] <- P4; P[5] <- P5; P[6] <- P6; P[7] <- P7; P[8] <- P8; P[9] <- P9; ## cluster is coerced to FALSE at the top so none of this matters clustertrigger=1 if (is.logical(cluster)) { if (cluster==FALSE) { clustertrigger=0 } else { stop("cluster option must be either FALSE, an object of the 'cluster' class (from the 'parallel' package) or a list of machines so 'genoud' can create such an object") } } if(clustertrigger) { parallel.exists = requireNamespace("parallel") if (!parallel.exists) { stop("The 'cluster' feature cannot be used unless the package 'parallel' can be loaded.") } } if(clustertrigger) { if(!MemoryMatrix) { MemoryMatrix = TRUE warning("MemoryMatrix has been set to 'TRUE' because the cluster option has been requested.") } GENclusterExport <- function (cl, list) { gets <- function(n, v) { assign(n, v) NULL } for (name in list) { parallel::clusterCall(cl, gets, name, get(name)) } } ExpandDots <- function(...) { return(match.call()) } dots <- ExpandDots(...) if ( (length(dots) > 1) & balance==TRUE) { balance <- FALSE warning("load balancing has been turned off because the function to be optimized requires extra arguments") } if (class(cluster)[1]=="SOCKcluster" | class(cluster)[1]=="PVMcluster" | class(cluster)[1]=="spawnedMPIcluster" | class(cluster)[1]=="MPIcluster") { clustertrigger=1 cl <- cluster GENclusterExport(cl, "fn") GENclusterExport(cl, "fn1") } else { clustertrigger=2 cluster <- as.vector(cluster) cat("Initializing Cluster\n") cl <- parallel::makePSOCKcluster(cluster) GENclusterExport(cl, "fn") GENclusterExport(cl, "fn1") } if (length(cl) < 2 ) { stop("You only have one node. You probably should not be using the cluster option") } } fnLexicalSort <- function(mat, parms) { # parms = (1) MinMax, (2) nvars, (3) lexical_end, (4) type (0, vars, 1, obj) decreasing=FALSE if(parms[1]==1) decreasing=TRUE if(parms[4]==0) { #on nvars not on obj function foo = "indx <- order(" for(i in (2:(parms[2]+1)) ) { foo = paste(foo,"mat[,",i,"], ",sep="") } foo = paste(foo,"mat[,",parms[2]+2,"], ",sep="") foo = paste(foo,"decreasing=FALSE)",sep="") eval(parse(text=foo)) mat = mat[indx,] } else { #lexical on obj function foo = "indx <- order(mat[,1], " for(i in (parms[2]+3):parms[3] ) { foo = paste(foo,"mat[,",i,"], ",sep="") } foo = paste(foo,"decreasing=",decreasing,")",sep="") eval(parse(text=foo)) mat = mat[indx,] } return(mat) } fnMemoryMatrixEvaluate <- function(Memory, population, parms) { stop("this function should not be called when transform = TRUE") EVALUATE = -93813381 MinMax = parms[1] nvars = parms[2] lexical = parms[3] lexical.end = ncol(population) pop.size = nrow(population) vars.indx <- 2:(nvars+1) lexical.indx <- c(1,(nvars+3):lexical.end) FIRSTTIME = TRUE if (nrow(Memory) > 1) FIRSTTIME = FALSE nevaluate = 0 mfunc <- function(pop,memory) { f <- function(...) paste(..., sep=":") a2 <- do.call("f", as.data.frame(pop)) b2 <- do.call("f", as.data.frame(memory)) return(match(a2,b2)) } population.mat = matrix(population[,vars.indx], ncol=nvars) if (!FIRSTTIME) { Memory.mat = matrix(Memory[,vars.indx], ncol=nvars) match.matrix.indx <- mfunc(population.mat,Memory.mat) for (i in 1:pop.size) { match.indx = match.matrix.indx[i] found.match <- FALSE if ( is.finite(match.indx) ) { #this is needed because mfunc truncates floats (by the call to paste) to 15 digits # if (all(population.mat[i,]==Memory.mat[match.indx,])) # { found.match <- TRUE population[i,] <- Memory[match.indx,] # } } if(!found.match) { if (population[i,nvars+2] != 0) { population[i,nvars+2] = EVALUATE nevaluate = nevaluate+1 } } } } else { for (i in 1:pop.size) { population[i,nvars+2] = EVALUATE nevaluate = nevaluate+1 } } #evaluation loop if (nevaluate > 0) { eval.indx <- population[,nvars+2]==EVALUATE ret=0 if (clustertrigger==0) { in.mat = matrix(population.mat[eval.indx,], ncol=nvars) ret <- matrix(t(apply(in.mat, 1, fn1)), ncol=lexical) } else { if (balance==TRUE) { in.mat = t(matrix(population.mat[eval.indx,], ncol=nvars)) cl.in <- as.list(as.data.frame(in.mat)) cl.out <- parallel::clusterApplyLB(cl, cl.in, fn1) try(ret <- matrix(t(data.frame(cl.out)), ncol=lexical), TRUE) if (!is.matrix(ret)) { if (!debug) { stop("Cluster returned an object which could not be turned into a data.frame. Cluster may be in bad state. Please consider restarting it. To see what the cluster returned please turn on the 'debug' option.") } else { cat("Cluster returned an object which could not be turned into a data.frame:\n") print(cl.out) stop("Cluster may be in bad state. Please consider restarting it.") } } } else { in.mat = matrix(population.mat[eval.indx,], ncol=nvars) if(length(cl) > 1 ) { cl.out = parallel::parRapply(cl, in.mat, fn1) } else { stop("You only have one node. Cluster option should not be used") } try(ret <- matrix(cl.out, byrow=TRUE, ncol=lexical), TRUE) if (!is.matrix(ret)) { if (!debug) { stop("Cluster returned an object which could not be turned into a data.frame. Cluster may be in bad state. Please consider restarting it. To see what the cluster returned please turn on the 'debug' option.") } else { cat("Cluster returned an object which could not be turned into a data.frame:\n") print(cl.out) stop("Cluster may be in bad state. Please consider restarting it.") } } } } # else clustertrigger==0 if (lexical < 2) { population[eval.indx,1] = ret[,1] } else { population[eval.indx,lexical.indx] = ret } population[eval.indx,nvars+2] = 0 if(!FIRSTTIME) { Memory = rbind(Memory,population[eval.indx,]) } else { Memory = matrix(population[eval.indx,], ncol=lexical.end) FIRSTTIME = FALSE } }#end of nevaluate if (lexical > 1) { population <- fnLexicalSort(population, c(MinMax,nvars,lexical.end,1)) } else { if (MinMax==0) { population <- population[order(population[,1]),] } else { population <- population[order(population[,1], decreasing=TRUE),] } } return(as.vector(c(nrow(Memory), Memory, population))) } #end of fnMemoryMatrixEvaluate if (!is.null(gr)) { UserGradient = TRUE gr1func <- gr1 } else { UserGradient = FALSE gr1func <- function() {} } ## impossible if(data.type.int) { BFGS = FALSE gradient.check=FALSE } if(is.matrix(starting.values)) starting.values <- t(starting.values) #C++ code checks if at least Generation 0 has been run and if #print.level>0 and project.path!="/dev/null". Otherwise, 'interrupted' #remains FALSE interrupted <- FALSE interrupt.message <- paste("genoud interrupted:\none may recover the best solution found so far by executing") interrupt.expression <- paste("pop <- read.table('",project.path, "', comment.char = 'G')", sep = "") interrupt.expression2 <- "best <- pop[pop$V1 == 1,, drop = FALSE]" interrupt.expression3 <- paste("very.best <- as.matrix(best[nrow(best), ", foo.length + 2, ":ncol(best)])", sep = "") on.exit(if(interrupted) cat(interrupt.message, "\n", interrupt.expression, "\n", interrupt.expression2, "\n", interrupt.expression3, "\n")) gout <- .Call("rgenoud", as.function(fn1), new.env(), as.integer(nvars), as.integer(pop.size), as.integer(max.generations), as.integer(wait.generations), as.integer(nStartingValues), as.double(starting.values), as.vector(P), as.matrix(Domains), as.integer(max), as.integer(gradient.check), as.integer(boundary.enforcement), as.double(solution.tolerance), as.integer(BFGS), as.integer(data.type.int), as.integer(provide.seeds), as.integer(unif.seed), as.integer(int.seed), as.integer(print.level), as.integer(share.type), as.integer(instance.number), as.integer(MemoryMatrix), as.integer(debug), as.character(output.path), as.integer(output.type), as.character(project.path), as.integer(hard.generation.limit), as.function(genoud.optim.wrapper101), as.integer(lexical), as.function(fnLexicalSort), as.function(fnMemoryMatrixEvaluate), as.integer(UserGradient), as.function(gr1func), as.double(P9mix), as.integer(BFGSburnin), as.integer(transform), PACKAGE="rgenoud"); indx1 <- 4; indx2 <- (indx1+lexical-1); value=gout[indx1:indx2]; indx1 <- indx2+1 indx2 <- indx1+nvars-1 par = gout[indx1:indx2] indx1 <- indx2+1 indx2 <- indx1+nvars-1 if(!gradient.check & !BFGS ) { gradients= gout[indx1:indx2] gradients = rep(NA, length(gradients)) } else { gradients = gout[indx1:indx2] } indx1 <- indx2+1 indx2 <- indx1+8 operators=gout[indx1:indx2] if (hessian==TRUE) ## only TRUE if BFGSfn is provided { con <- list(trace = 0, fnscale = g.scale, parscale = rep.int(1, length(par)), ndeps = rep.int(0.001, length(par)), maxit = 100, abstol = -Inf, reltol = sqrt(.Machine$double.eps), alpha = 1, beta = 0.5, gamma = 2, REPORT = 10, type = 1, lmm = 5, factr = 1e+07, pgtol = 0, tmax = 10, temp = 10) nm <- names(gout[5:(nvars+4)]) # if(lexical == 1) { # hess.fn <- function(par) fn1(par, ...) # hess <- stats::optimHess(par=gout[5:(nvars+4)], fn=fn1, gr=gr1, control=con) # } # else { help.stuff <- do.call(BFGShelp, args = list(initial = gout[5:(nvars+4)], done = TRUE), envir = environment(fn)) hess.fn <- function(par, helper = help.stuff) fn1.bfgs(par, helper, ...) hess <- stats::optimHess(par=gout[5:(nvars+4)], fn=hess.fn, gr=NULL, control=con) # } hes <- 0.5 * (hess + t(hess)) if (!is.null(nm)) dimnames(hes) <- list(nm, nm) ret <- list(value=value, par=par, gradients=gradients, generations=gout[1], peakgeneration=gout[2], popsize=gout[3], operators=operators, hessian=hes) } else { ret <- list(value=value, par=par, gradients=gradients, generations=gout[1], peakgeneration=gout[2], popsize=gout[3], operators=operators) } if (clustertrigger==2) parallel::stopCluster(cl) interrupted <- FALSE return(ret) } rgenoud/R/zzz.R0000644000176200001440000000253413171743040013102 0ustar liggesusers# RGENOUD # # Walter R. Mebane, Jr. # Cornell University # http://www-personal.umich.edu/~wmebane # # # Jasjeet Singh Sekhon # UC Berkeley # http://sekhon.berkeley.edu # # #.First.lib <- function(lib, pkg) library.dynam("rgenoud", pkg, lib) # use .onLoad instead of .First.lib for use with NAMESPACE and R(>= 1.7.0) .onLoad <- function(lib, pkg) { library.dynam("rgenoud", pkg, lib) }#end of .onLoad .onUnload <- function(libpath) { library.dynam.unload("rgenoud", libpath) } .onAttach <- function( ... ) { rgenoudLib <- dirname(system.file(package = "rgenoud")) version <- utils::packageDescription("rgenoud", lib.loc = rgenoudLib)$Version BuildDate <- utils::packageDescription("rgenoud", lib.loc = rgenoudLib)$Date foo <- paste("## rgenoud (Version ", version, ", Build Date: ", BuildDate, ")\n", "## See http://sekhon.berkeley.edu/rgenoud for additional documentation.\n", "## Please cite software as:\n", "## Walter Mebane, Jr. and Jasjeet S. Sekhon. 2011.\n", "## ``Genetic Optimization Using Derivatives: The rgenoud package for R.''\n", "## Journal of Statistical Software, 42(11): 1-26. \n##\n", sep = "") packageStartupMessage(foo) } rgenoud/vignettes/0000755000176200001440000000000013421760172013730 5ustar liggesusersrgenoud/vignettes/Figures/0000755000176200001440000000000013171743040015331 5ustar liggesusersrgenoud/vignettes/Figures/fig1.pdf0000644000176200001440000002366713171743040016670 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 425 /Filter /FlateDecode /N 11 /First 66 >> stream x]k0+޻>=J` l&BLJGwԉVA:}#!! $/"Jdyq@ $ RAH|sy ^5+1Rsiko nRyBGqgg]5TkZ8W1:խy︼8z!nMj F\s uőCе9ֺԝۚHq+ sZW'$jŵOj Z:n^٧Fp!7,[MxŪ>Ptp~ݺ$LPf hd: S2q qZYM"Y5:4qdlߝ^gxƾvt7OLѐV|endstream endobj 13 0 obj << /Subtype /XML /Type /Metadata /Length 1319 >> stream 2012-06-03T12:02:44-07:00 2012-06-03T12:02:44-07:00 UnknownApplication Untitled endstream endobj 14 0 obj << /Filter /FlateDecode /Length 7608 >> stream x|Ku9n;[F]@AcThAõu*6IHjI___y~;՟~ï_֏?Vd}>eԯAُX|LǗ9˳~qUUbH {VҒmrjqHs/k\PvR)9רmQЎYZ) {c3˞YcQy*%FN4F=55vʵfP4 ZdoCe!{(<8O[ikOh^yJT:H 4Ϟ4~V)_%"7c:j9VZTmU5{BBC,5"pm)-z~/rsQoZ>5gh^:=,eLi3JjNh %'}}ԙ3K2/\KPJ~,IYVWKVYU\o9[7r:)5۫'jeΑ֎\A q>e($c`+}o3!st(+ј)nUjhk?:hUe!/dRI!qL) %ʆ;MI;? jeHɻأ^%ZV!.Bb!G"!*-l zQYvzkAg*V=46QtghDÉj1, T1|`LS$ߺJCQaDo9kMc@-lm_m, N_hȲBDЯ!RN) mwQ AbANtgΛ>/{*ztzt#(I| IUˢKZ>/TS룅-ޒ;$ }fO&tkPtYA!蚯 <ƮsSl|}GvCH=)-n¶WiRap,(}o۬kAZK;Eњut{ˆ>5d'g0žxVa 65[ il<jkfG8e.7L68]Vy[kI9Gˠ;mZa_[Eev(ʠP/'tjlyS"RFj2(:֑y48L@PSIPXՒܛ|دd :-ԘS0UN{8|)0/DBa5'i=IRiЇσ߹$8,U8ФY}yȽS2?C`6xVѰ6 kT%iyR!wú&Z6R/Jny?liI/tN?`M]av'~`J|R; j Ծ J7 rOi+gQ5Zv+5M tZIt]-X:wL<}Y۶?tӡ看$∦N]nn(Q7IdZ&8G}J#n{'d iZY(O'ܠ$R֪TZٹ*z:kls,L|Qԩ M+;g+ڥwM 4jy[gfNujivW:+\nPQ76˳84 Jy:MrbS^O-=C?iZWN3Yٲ@i[ҳ&N[^X͝&[vYUuYBkNGjik ݴ608W*kv坲Z:ee=W<h6VH(8z?I~I<$ͱ^;s4t+mTŶ}3`rgh4le=Չt⧕&|+yKml1Ԟ%h̃ɲĦK6vӫ.hyجhvXX˶wYYFjŖM+b>[v33JV-ZYZ';v<'ɿig]N֦dؖ-PZP@[wS-#)tYcN,<(ZV5m^Ҁo&k`[DO^x~glֆzwIҶDc_jvRWnVbsMro=s}Ė&R_g=(TI+*:udWY̞ҴRFmzh95JPVmBԚCɠm͸M".$挢ii2bbt z9a44Zg'MVhgc<] ze=N;185]U*'xޤ  k J%Oק4 :A,lZMcC2qiaE/,&mBj7-,N'5ɽ_(-Z'+*.ZF]`<13an>ͻ;gypgqJɒ`_I)NxJOjWZ]9>V/IDckZ:}w|vr }WsCr®.giUhZD%:5ihTN8(iPNsnKgn>\VtEwOt8gw2uXSI=YCVu?.(SV=iU.{ߋ6?i/oAtZU7Iz7PAe%H7G?‡ѵNC>`yU!9@z,)jQhS<*wNe Z;'}Ѵw9ƃ L+hSWI4(ZԭQmN{zJsQ4Ԫɻ*AAP=//h_lݰwpk4!syL?s nޠF'+w,}*?~lHЙ-m#Hn-T{{fG{t:mb랼㘫nG,|J/k%l/J)4"yyR.-:M5Ӏ/M8sg86]8`5@NX Qtz&1)ُs 0O܄ [ZX& |ţ"C0F\}_ pODRԤuO[\=RϯIۺT\՗Ez =]0MC1><}y_G޴D8ɟgiăƸmLCbDQγaۄFn6*N֊4-7pǶZmIV2u,ent:<礱5Vi#C&b ^4w*0cjs}ΛbvxT>&#['ֳ(]WK@yeEA[z::YTڴdSMto:SS 7 ZK3UIv8HvnV8(ٶI;FLGS*}R g*#ns5k)xd^orILu竬CiH0p,ѩ({vx-[^裳;Ewt/].JwX&:IPիAJ'*c7{W6t.=c nmM4m=KZt M:Os}ZO&p+EdIԤ]r& >-?vj3P:K9RsCTn^|o86wSM ]X2wxxq^.C#~z+@AWێ(F5ʒU J;[Ȕ=mtI<iUFc1˗4 Q !1jotki"oҞ+8@FSu4[֥w8ElmUO.Tm!e}y׮ȌG/lgHahGDKzsksK$A󺌵&z-/jv\M'ϓz18c6=cdxPNut7,iau?:tcDv'K 8WۭvȺuDOZC}%7/@Ѻ;77d[y~ek8^P: ޜt޳_3xA1hq!./{vћ={׍W`s  7:sM>#/>I33tw}O@oA1B7ݸ{܎;A;O; !wxsAwQww Sw܃Txw <|Py>0owf;{w'4w Ko\;wڍK+n|@ݸy߾"wqoTEPq_1+"ÝJN8#0*ā~Ċ8o$<<~cMET w❓ƸnLP%ӌnύ +;]7.q}ܸG߸m7 Υ q{nLQДBs1IAD,.L޹xWB9n8)ToUмg_qVA+z-㰼/EGחv__[5KkKoE2nYЊ^4Gk溼ƶy?_#frn\\Њ^˸9jGkw}qy>2n/hů=V6z1k {c Cq-}U #V8Gsuxi{y}$yz1®= !&a|>]Qv&nO[ը"G OXk}ñ][퓷inPw#;Hb#nq;@F! Kw@#r'vm>yJr}*Fo3]!+#'On~|X~/ćDz/E |)6%z_/Ô/B _+I/ߧ|1F |-|Ek>]*~.E|6OW!}W, _(76xJ>N}O FH0_<_o>>C⋗ K%:^ m[/s +1ߌćENc_OćKP e/ń{߼E|о<_榫޽00o $}7IGz½m>yrq G3Ai\KByӮ͈o fL}7Gyr_EpR|"o+R|3fpy=ןz>&cRW wɕٗ)?G}{ɣq|w߾/_|_˗銎BWA?ga?l~n;O蜟i32/7\s^\!F_cjw_>b G2On,(?gG>y8c`?:w1 eكh}^D ˑy[/Cj[%?ZQnF}_?_QÐ%2ASGQ/0/9*}l+'rX 4]H_ Xaipendstream endobj 15 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 @N. 2D! }I:gׁm_Xց$i,Ÿ> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 17 /ID [<20e64486ba37077a5e4b9042ec501bc4><8345504475fa09f0547d855970b7a974>] >> stream xcb&F~ c$$󍉁WH0`~2 endstream endobj startxref 9855 %%EOF rgenoud/vignettes/Figures/lqdxmpl2B.pdf0000644000176200001440000011453713171743040017704 0ustar liggesusers%PDF-1.3 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 3 0 obj << /Type /Page /Parent 2 0 R /Resources << /XObject << /Im0 8 0 R >> /ProcSet 6 0 R >> /MediaBox [0 0 207.367 207.367] /CropBox [0 0 207.367 207.367] /Contents 4 0 R /Thumb 11 0 R >> endobj 4 0 obj << /Length 5 0 R >> stream q 207.367 0 0 207.367 0 0 cm /Im0 Do Q endstream endobj 5 0 obj 39 endobj 6 0 obj [ /PDF /Text /ImageC ] endobj 7 0 obj << >> endobj 8 0 obj << /Type /XObject /Subtype /Image /Name /Im0 /Filter [ /DCTDecode ] /Width 864 /Height 864 /ColorSpace 10 0 R /BitsPerComponent 8 /Length 9 0 R >> stream JFIF++ExifMM*JR(iZ,,``C  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ| ``J !1AQ"2aqcsDTtB#4Rr356Cb$%S?z~Ju0NrҘ1i8Jjdeu\I>+8lqܒWmxO+º rvZ_X$rpU'CɋQΔkfJi4[o0XJՕ(ŷhJɛczF Ursъ#T1)5gcj6,9uNXt}/(?!+F0˪z~:pDcZ .mӸJsmVy]>JCyIJ.sܰ8w&t|tE1!C[rъgW#\Rj (7mo/JJy5(SpcG0RMΣVE8εJE҃m.vt >gw= lc,UKSVo-ҐNTԅjrY4ޛUhʗs+9S=CB}ʽ\ΒV:gerMEk@x_Ylfo ?*PO盫2ҴaJ5uQ]/Gf_UUWydݑ4JIB.YM)GWZ%0T7)7J;Rad:oy ?iG+Z2eO*ߩLlO 8xqs<"KץFw(uwiCNjR̠I=FS$sN?ðL&&)YC SG]%޿B J'Q$:Hi*b#VqVQO%i^ kX%brbjz3zw-K8xy1W Ib:Cְv>jڊ|H;biWb,`*y}~.|FE^Ju<%N5pN. F#ap0IA?)Q-)G {I]j :P"ĺ*Bp3%*t^gWMxiL<-QZNsYTz.<-HԌa+2NlS{WKz98JZwM:oz+AN/8И}OCXv`Q'{JN1RTwpphC$df@ԭd7ѺJX:5|:)MjK[ld%kBit~eZ Y4JH4!Iݫ)[؊ʵZwMC B׍;Uwہzjmm{WGaV/͗3oNiB0bR䑖/CRhΟF`JA/38⥚;IٲT)PRQ$Ԓ~0zXjJw(ac(ІE'wRx9t+m8 b vi٢9p(kt~YVNɵjxZ43B5iJ_wN gZ_CjVR*P3D`SwWmwX|MHTO4wj¶ Z+TBewG FW?gS DzV{G FW?qx,>-EW.ڵo)Ɲ8ӂbK:3RsJ*RiCL&T }tTq\UjsZ좵;= w/Rp^VJ2nonRG`,Fz I+UT'&i?tyhyǐs/cP*TZu*RURFk}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ9Yaybk+ Mb+澾gRՠVS+RVghTO ZY97eI3C<˞{qR*ӭ)Ved4___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___ku)ʍZ5j2)]5fv l=Zi)8iRxT:(*2kE%z'W:r JYD(SV2sWNe&\MU\{WMfJnZE6--zQ=ϙ1fW,=tЬܤ⸓NĈ{(%%$ۻ nfVI#J2"zJ,}1pexΈ_&k^܄ܮZXQ&m4];Ͳ#|7HOEʜڪ/^1̓ę7m~FzxjE3֯̒%RQZ$7du$J\dݖ2|[ K 2)[bA1̹3.kM+}*]1}?_FtUX'WWܵG*M%w- 4O;(oV0JQIYسQKFїʻ9uMbfxrc'}r&io2٬rK4f;'w{]>"M]_]i8ߍ(ڽ[,ryj2Q{^<ɕ²9)Md|uk*jMX{Q IJVV]E.'}*qJgIEEyD],TMNM=iJRWZmfw/mݷ#Ug@8z/퟉vdENRKbH-HQbKwb3."l$ Sn2k.q59atIF:MMwQ\윫 E"2re]ϛ'/mՆdOc _oWѝ迶~&V.I$c,+:|d'F֖nUn`$V-Qnwj'U)vkv7bJ.K-Y.JQy}yjS$׹STx)8fygd kԦd٥vл재v&I;~)kѤ*,$Đݕ|6wII"@]sDf^>W:ܑ7|R./M/]H4)$sxjree%ühP2M?#Ө[F2 URT<12(,XV;kH%ѸȆh(8KєtcT㪱i48vvKE+'fOٗ4QVj܉qkf\9ZIve{wPZ2(yE8Ipzu6zkM9p{NiVz_kø8+I_%)ȜYmԜZi8+}*nh>-ػE&GfQj&eVw{xEMϼLV˺/xdKt*˫w}Mvm;?q7u.W3}ggd-)[bJVD<m+HTwrK^g͌߉`!W$W*ᧀBo)/΀p_??$6iAZUS(v LDۓ쯡(9Ǭ/И^q6{2ZV٦8^IFXZeiopjǒIWь*;'yQI 쭺Me,m~򒊺KԻ&xگ:6-*4#[c䪵IKT\8L1P'"%N;(K, HlLcZs, ;, [~^ l_,!~R nWy]7m5rejvzFhRrѤIݦn|_oWѝ MBN]k~GGUZ$okGEF&PƓn{]nԔRQI%ݤH迶~&&խ(}%,CZ긓d9}Yg֎jQBTs?OM rG $NKGd4=KrT&TbiijaI6wwnD+m$Ekk^Um_y^ɽlRIk$cQIvr\r&/˞7uiZ:fj=<_oWѝ 4ԩ%x.M.)#<- j2ҩIYo}gA<>SJ)gnq!Z ]'2thyx\?Fף֜j֒뺕:5*T򥄞j>NJY_K?e[d&{=K#>͓.8}ıلؒ-V[xX׫̰DedHs+cJTGiK4c+g yld罿Crdgb]ZU&7s4&kf67g'kd6KnBVF!K}bqk^Dm<gbe[Q,TV4 R_54~GxlLc[xCWA;Uh!&"AU{^RI!nFDXKwb3rM1rSĂԍWy)ܓUg@9J FYdՓuo?DQZLҎ 1J|S\RtҵE3Rt&6jNeOM\$$F[{mT]f=\R{_ikYW ]%JBܼ컑HgkzX՞BoJw-94oeRyot5\tz;{|Ȟ%LogF"w-/ݹyɨ+]+4,ު˸+v]*vd[Z[N%2}ggIX,WŁXnE M9{Cv!&!lKdwؐU_S0}ggv[_Z.KbɦOb$sxj -q.=I p6*RJ8`=;Hj=anU<ѲVm]o+vŠ7gI;lޗZ -S[n3Zo3[xrr8iɄVċ^2]%5{^ ͷȬ:[bUtWF4Z6Mܖ{_D+\uDf!V6vk&i}̱}?_Ft tVFRugݦCXN5!2WOiԄ3R*I}N9}_>r1NQ'mA+rAI]~zGbHee ksаc!nˑ >L>/΀9N5ݨNk Ƥ#8J2:jTYI/8ϸKbg.R)9d>D-4 x\&WѰyYlTvWk^6YYY$Yvb.D]+_tW௣-j땊U_f۽-;do6Z$hŢvdDIUc'wbJQK2t[MXz%dHxٻxMMEJM4ZJJ-JWZƐw1}6?'K`Pqp_??+tWXMsرYp|`Uq,CXwX/$>DQ kus.d^~H! I|_oWѝsc}gE3<+ueF&2Rʹ[o*oVZm&ެw[rWeU7-~ey;[K܄o_)M2nr.ŵKEfws_6V\yB Z14wHrm7KǸUÄZIxn"n/4ͥJҦR̴M-}̼/ҝ[41}ggWVފPM;]w4*i-S TI]XdF׼*X>/΀p_??앯*Kiɻifȴ]l$ݕ{.n۷"sdӶ&RiVfr![3wYKT[2zo߸qYeGi+[n [eBF[EZ=/ȋp^#v_dڒdE^fie[wzJ姥|KV|6-%'/)e{Ǝ)ɥ*r-Oe3=:擃s+mU&fQ:S8ilH+b% ie,{HlnDL9mwI&pg9F7^CPW7-I$ݼHJ]xjE3^Ee5Ve_D+tBm;;۝[-['+ފ+aM&ܸܙZwnκY,+w~zU;$LE-DekJ͠O[4̛(+Z=vŔyAԖn:{;9Z̲m]7'"ma˧rSYAtk]nzI(̱}?_FtqHӌ[qVej'}ՙ%^Oܱ ]X'I ]X'uI ]XE) eg,1pZ1k,E\(vUzNP&x%W#*,\RR'>/΀p_??뚋g.b6$'m#kZѵ ˗"iz6!B[KKXv k}.Qߕ-9'dEaIEk%ݡ -׍kk!DmU6e-5kq%Y5{dD;;?ddk+MF|"WI_ȼmʸtZYw-лZu}--Y&ԼS4Kc_oWѝ't9F)>ITJkaeKQӵmpG[߬>]'S5ұlLc {U~j頝dz;K>XNBm%4ݸ[6ϋ3RN7h6q*Bl,a4S:vͮuˣfzV:8z/퟉v7kh߁Zz܆K{Rb-Vɟgm{(Ů<6EJ6rR6kERۼ}ޛ2r*ڻnYϭfBWibFyirVލ[\a,wY6E$w}oY4V+ GDzضY(I+pFzwd.-oDkTՑE.|js)sS#Qj/Gdfբe3gVjҝ9vgJ4' ,'NtTr%g)WZ!Vi8BkW=#Uy'=mhE =!b"E:)G'G6"m)+>J3,CJp$j-{>B{nMc%|윽H /{%+q/΀ZqJtٜ\_9(М09Qʤ^Ц ^.5jTZq WM\kUTip'0~Le؉m.V،[YK,lߩ)49dI%kq(JZr+8˭߱*&2K{pk(ֵԌwj_UFYWVjZݷBQ[m#m [%㔈v[TMYBrmkmHTfrӦmrP>Dewi駉%~\dIIs.+hM^8گ:q)}lJ?Cp*U ֌UwcufE^9J4#+x_s~H3GW=""Rm(ȏH?$zE}#+x_s~H3GW="Hٰv;]yoH?$zE}#+x_s~H3GW="IXLZI]K`MI&j>_s~H3GW=";#K[ ֏#6>WTCi%?G`ф«hEx;CPƵVPSIsOC`έ5V˳4ɓ*t.Q 1a{99;nh5UWQ$׷dUU4"cZ+()$չgVJtٚqvɄ:qvI х0sP4c*樒~j V"Z4ڏ|uHׅ,NT|u$'tᨵQܤ*JVieͲpSJo,έZt)ff,\1:}?hNujF)ԛ`*RTi*j]p= + - VmGݾ:k–' *>WHK:ow :F\lpZnROHrbqNXQIի4ڊv8LR)¥7pzgV:JPݳ .T>fZX:#FM0NOHd[ *tj4L}%ZظTiH-RrJ4jT8+2gܹV+kӭJ)-]ɞ؊m*,պ6"\UJj(ʩ~28_g?yۧ%~8uaz-(Ept_o}ʻk:i7,9H*jJ;m~H9*¤OAm/*3"QR7 6qY>b_^lJTMIjL@USiPd֭QjTWC^UKun9xN9+ì6 llB-xU8МYIfWV8|^GSRPikG0abi:k_q>Sg rR~RO;)Q*Ьy5}ωĨXdM{j)aݛTӢRNrljPJTі^9DMR_b04hfkʟFa)39)E?)'ӕhVqjhT|[q2M RX̀*Tisto)'9wjʵ(W*uVhFkˢpiKOY/w*3RxVwۋKҥZ(P5~OJַqyYt⳷v".lU)(ө(Pqz`p}%FxjO^j[qixTZ]% OI^7Z3x]o+<5:>NVvNT՞ %u%7z=OLt T/yo[~(̄R5de|cN,<($kSQa@Mg_VmR;_:O*SXaFN-Yܑ:4F5;Hgy+Dz- PB^O'rRn/8F?-b'T Pdֳ#gy+Dz- PB^O'rRn/8F?-b'T Pdֳ#J5%QZ-P%jʔ\۴e%dͱ#C⪹9h]*JFqWqzo 5yLҖU,:][e=?{8YA"1VSQwUjT%968^ź&#̩9)GW+3j/ZjS=&4GVjUԅn(TItTZHԢiA6W;:rFNO3ջL^:t[2UIVE-FRVL40N*U.O4gw;GQ)eQ˯råyE Z1]SӅL#e5xIuVmENSj-U:MZQv{ù6ۥ) *۔Ujڊ|H;biWb,`*y}~.|FE^Ju<%N5pN. F#ap0IA?)Q-)G {I]j :P"ĺ*Bp3%*t^gWMxiL<-QZNsYTz.<-HԌa+2NlS{WKz<~R+kF+sE`5m/qlWG᱓SO4M Z5jTT'd{x(a#(ІE'vԥnb+*iޢY6- %bg^4Vjҕޫn| j9 e5]XgTo6\:q ъQKFX dTkJ;٣:}(JTex7 j?'fSPBTaIFRK4a*tc oW BޭJ<^WW|T1*3e٧fC0t ŠZlEeZ;V&ũhZե+}186*QjJr} ӅZnHBZ4J]UNz]sWa5!R<Ӈeݫ ,=jR eޖw-5b%^0JW{LL1Z2-5b%^0JW{^|jվЧtN ъI.rIu(J}] 0<>-PwgQaqU S%jϲ'G}|J#N )y[(ɻiJU=jJجJnj3yΪ]WS֪ű]MN+SН+Ў :x,,n&J5(t|aVggZ:]B.Vc,n&joΔ)M$jx7N5sA5r׼++eykks\=/1d\eZUi{KJNZJQH}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}yԧ*5h8ժTԥtՙ2OѩN򳂍:qpmC9ViJTG+$8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___k}}y5q澾<ǚ8___3NTjqU橕J3Ok#HEEXw(u&3sLfݭwZޞfv]&Iދ]_&kw؋z1{i/m%_z~nvٚ'}Ʒds _oWѝpϥpprk|rKދauה'}2KC#𕙇ޱ)8)K."i9;eY8wRSpdJ);~3osg%ͫk4Km]\Fwtq>)򒽖ԗ9' wo ݤ"[mJ~f= nWJ"Rz[pյ3}[3IJm[]wOCԚJ[&Sv˂ m%aܯxmq}?_Ft dtAײ*%%_CF%m! VWމMh๲a%+7?/t/MktE\Iݹ$V _gqCJqǒ˜گ:uB"o Bka+PJ/%<}w* *Spե7uÒ= gg5-oЌ6RM5 Y4a{V2̣~#V U"o;&L"pe,q_fZi^D jfnYM~uKT&4ijNE܊_}VY$߁Ymv2f(ZfݵԳVIZ+N7ۑ2bnV>HMe;s,_oWѝY%ZSOg2G2nfo%^dj[$BW[imy>8|]5k{!/2X7km .?+tB6\$@QZCq|uMv[n3>oqeĀCۙEn)Ⱥi }>6N8,Djk EpmUetḤmɹE6Ȯ.O]w-;m&+ҺЙ)enxRJz3Z6bWE4i[]BYuZs!jŶop&y S,ޥE[]xZ>N7CZ]w(n6/^v+m/.u%+>B[dFRSqO]m[_mTyW[;kldWr~7VkUg@9GCb\6Zn"ۼPon%sI-iYIn7̯k>&8گ:e]Ս;Єg;)YyNЯFԝHbHWi;kܯwpnDd'MTIFZ1jYӖ+#R"_zp['h!hTغdoMt]%8iEcMGWy=6_~)dHSRPNO]^Se;uM;kvW JVUg@ ӝJyiՕ'~Ro0\G|]b)95mZ_b4OMݭZҳm&|Q9 *U.)Y;6׉ 2K*ӗI$e[!=븉Y>TVN]'nQ{8IEG|[<Ku!<|Yg+_2BGhLmN+|Yy7C%Z/n^}ritVMg+)-4ni!unJM2}ggU&-G8ơFU*p%&"T[ZJl[Z tуyNnNI&n2voUɖJ!'t"67d:ܓ"Oq&'.)hN*Ro2mk2S)8'z5'')-nI|%n^c3=:;5uղtK7n:n-4sYތUi<-Lof-%{&-%k]ݬWv2=$/"mit&4La-^[I_Mݶ+i~dNΨ>i4@RwwDm< 6Yt\H`nVԸhԭ\qڢRw5:_^a'%i;xlDVae۶b~fXگ:lLcV䦞đ+[R{.Ei=IFIzí| y%}.Rj:k\k+=n;noI{i+=1yrmx#:JPu,㳾#xQqK4W9Tg'[MR+u,{w\>/΀p_??먓Wjlg%gm lF-([^,W3ڄ\b-v5s׫UkmXk*HExQj]mZ+jDl,;rDI[_%74_+~L]&ӿR+%KRBI__mWexk\I-t"Q㣳)9eE'U!'d]|4{4l=Ug@3\&\$\l6**9SK~ktp_??왔({m>d#n 2{7Ë }s&wM]NUe\}qmwט~M}ЎK^AKi|kMnȎ$S0[IY}Iz^õGik.M $Bl$t'>/΀p_??먛Z;39l}%}+Kj>%\V]"MYk]fI_E)&x]nYJC\Zn3sIsPVp\Z"ӞV"o%QI$w4r--EEVr%ٻ*[| m%w.WܬҩM5*)Ź1Z]vl2/΀h9Щ9Ehy|[ЅJO4_zhʿH@8z/퟉vIR{0ݼHsHeDRSZyokBY{[t9-9$ݭ3ݭV| NB"eKk&[_%g,r#)gQ[uaS:eB3AJJߪ5+-Q-Q-ɉ刎rm$^].mWqRrYuj=]q%;Ug@έEJ"o;-]7Xkk[Z\i).E/~|:Wqi"[egd \fYenBKyk=g'm*+]n(X+;-Xi+iKX2}ʵEFJ6&r9(8?y_~Fq8xVj3WIlS𒛒ۻ'8jJ-7ήkngiiS*e4u_̇2S\[Nnd}Dfbm(S;e uf0N)-o]X8'kFSѶ"Z$%[*Am/:CgVqi>ʥ9MNQQqM%{TʔUkCŁ[eUl-6 7c:RJR"ѧ6)Zگ:VѩU"G4q%WZG>O?V' MFj=́j~V٢~W<_5[>ouQ*lju)ΜbISwwp_??Iԫ%IŮ<ƣ&J%d]-oZR-;߫z;_g3M[\Veɮ{䴶Rʒ uIוgiE[M޶'f?~eMuv墕|x;&Y^ۡNY+W. mI~-1nO^|N6芴ﮚX$*ԜsΦKV Yў/΀&'.͵#}#X*FR7## T(bIH SNjJ)(rPn 47kΣjzr+JtbTkTck*Z:8z/퟉vKK.e,4p!nFDC\V:[E''1xxV|\ELsʌQ8kd!9bQcUg@qPfߑ徑Fky|VI)jG*1q[[s%RIpEu7B7kmhBhMUZu)QHJhy;M匥},z=:y.-NZrD]uJmڵs| VmJ\m+5~!$Z;t2- vmr5ummEer-|nZ;"2nJʛvZku̾s ]]?أźOKhWk)?2.\r4tBMuE[{m#RqRZSmybxje^qFI+1riqI89hSQ6JJx{#:q'QO߫;p MFj=̀0(V+Bgh¥*VthlLcZDMĽZ^ՓkB4ԯ }+]ǵÐӊ[,o++nV5(^ -%\GeiD7\SEBwѯp]E[27~Bi&d;/=Ɋ/΀UTjTc&Ã5ciT 73qWBynI%Z8f*[Qs|M562a=% DfɊϗ?Nv|rf7˚"]Wku~XFCݷm5i&N*'w9BWRn-Jϓ[vj{"vI.d]^ɬ16ߋ"VӉd춵r"R-5weV)$̵գv$xiZ۾ĥŭ/f$ջbxjU$Ԓiyw,6 RɞR MnPaJ9ngQQ%k O ^W%؜4\0ԡ%iF 5c`ggtC~/LvY%[ ]ر _r.++ecrStulBzj2Sji$iGj7T`ӒJؐBiۄH0e0q+crK_;;X^IZ.گ:iI5$z4f"K agCDedF&1X|,n[F1TbbIZŁI,)[Ks͡WJӛyXeUJidmʯggg8)'+4Z_7MTM--+$wȋ~lٵk{v!n"{_}$W IM־%Gȕ{Q]JuIY.obTETK*'xOU%M?3_Gy k$sIeÙ1wMYt$gWYlR9.KIu5/΀sRɫ'k8*je\hbzYk;ggx[2y}7xb4߂ۼ|D-4Wq=nkO[%/2w\z/xkؔWn̹Qh5R$ 1}?_Ft3eMY;^ϙYVTK-(C:E'M+_0tp,Ѓ4PBk)wPgguvo{oI$$N2辤\zd4׶(.)74*W%=u禶"Y۵2twŬ&e%oYi_bh%Bo+{nKqQJϸںZp'.XkWh=6Mo~vL5RV[&Q[D8i63r'<"iA *hnM-w1}gg_mձVz܍kψ￿{k%a|}NU{!H;깖+[vV%$.dm^%WD%ȋE9}?_Ft&84މN8J׌RvF=:-%5Y}Iޮ񰒽fg-oإ޺x"UޭŗRom!j-"]Fqvn[칓%dM+s(+Ts5ei+){ h#i%kqdr=mZVw̄tih] v+gQ7ؘRcge|Ik&[4+yf$Kg3U4Nzfq%*VojwCWVeZz(Y I5P-wI b-E VDur%v읉Z}Gk!;a3UR4ۣMT.YSC>rq9,&wIdR6E+Ynm[l4npeIf" Y棪m]ɽӾiiܙK쟸̞[t~H+{+< WfܙJ9igy✓nUE b:L[(j+k߽wó[-MY5kbxjE3Y&w!v˙݋-ձ)\W2Ee9Rǃs]n-I[jKr%ceK1؈Gx\ĸsNje/΀p_??n6[9۳DwːKK۸W!B!D+/΀p_??읭n7m~>FWO=ȋ'~x6t읭[+miue{[DZ.d8Rn,\SMjY+4컶ؙ5ۿ|J-\cFZ<*yi 9fZ7jm̪]Y-zÃ}x8zZĪJZ9IǓzkɾ7߀&Fֳ1}=LfR%sJu!V938@ggܖNlR˗4F;+j_q(^B)R44onnNE:+-dYFt,~x'fZRqnZ|BN2\uKIK vѿxG#7%pUg@8z/퟉vIfZ;w'%v _^Y|2,ދk"o()Y&4_]xiˮDIunNvkב7v6eP_٧T_EZr&VͨbYnוĒjIe]YJZ+nTDuoН~\[wkLkYE' F)s"5mL+q/΀u7B7kmhBhMUZu)QHJhy;M匥},z=;[*v$ +vVJ-dx/#Ns;x ߋ٢SOfD| *Q4~:qyK$dJMiE&y7yqѫw$V]hIh٥O v'z-}.FEϋ35*tB;ck>y_1]'(b&m;'Z ͶfS]i=ZSSz]qVеT~(z4̭w~/nx%V(uVZ ҿĎ6|6`IIx iŕ,Vwq~$AI'm7;w. 5{VoinWIfׂA۸B\%\KG+Nd2Jp'U{6Wu۶}L}?_Ft NYa)(Y^vyHỤO,NϖFͫI^!eup_??jEk%v܍e܉"HW܎Y{rZ5mX9'SvM.XuNhBfwx+'ho獡Eo}֜\i/} =Bw`|_oWѝsaiK-LE(prW4Rc84迶~&4QwRm%*̝KMZ7hUu}JƢDⴌZomvwρ%u.-/wh~WE4mk+)M4N\ RYFm'n*6jQINjZܘZ{ܝTksmu~V*ѲzÌ{OC#QI=%5vwViϻٴ|5׈U%vɻY]g)F?s[Zn YE8c3 J77YZ_\^52Z y,oksSD5!],D}p%lt-Ż\Z[BWb]ES v+r 5 ]X'}!d*rJҒjif ۵-rE>/΀u7B7kmhBhMUZu)QHJhy;M匥},z=:6K&lV munkF3v h։E+WU&(7$RѴb!EWCKoDbr{,[]:iklJ_^iJmuY.-wgvȲZc:z%̳c)Wr3vZO{jq۾䤔u^ lJqZ=ó[$m6- '^}?_Ft NJsWvW8Lդr1lUW3r֞usa?H!l#*㯉`Uv vZ8C||ߏв=ICW܎z[c*1u3{4ӓhSXE;]j`/΀zFJH[fSVkSiNtr._'uƻI0teA%y]G2e_w>%^[ۛ&*˪Ax]ՈʮO;g-'Z pU)]ER3qf]WOWwZknODVMI^eytj&/ȝ2+_3^Z譭IZp+8]M;ЉZ1jZ{CoI[5߇"{QZjh{iݟ#UUg@O ne'V}k5R]%tsa?~ZMB,֋YpL$5_[~mnگrSVrWo^VCwWT;=w}@"JMN knlK$ob|BVVFگ:ZRM5tia)F-)]GhEj~IKXE6_LkUTip'0~Le؉qЪSm]mĖg*-%E/2%*;ei괹{<Ͷī~Ҍj7h=eV׶k٧Ɍ5ҷ6D'v{%$|YFVjԌLT▜,2IHQvV#$Ɍ%{bm;IĴ{gTںp2I?~:)Yzj,_oWѝsc}g*FTrN15l}%T~oiA6.X,DbnK E4Pi1F(Ɣ/7nlε(֣:RYۼbV,ʵVP~չPTc:榚^_jFcZU|O{}M@:~VqZ4ݧ%$.lZB5trQ֩O o'e>J|8IN1KW-('*zI&RRK}W:ʍ.W)(i 5 BN33%JhQVse̢FxZeNQoTҾ'Rq́p;@1zPvSX4k(Rn؜^&8hErQc ciQEѪ'$^&^yL+Zt0r:|NRU!ֱ4dbݒWl,V*th9:ZPrsOM֟8\ThuiIEEwL&&8IJqeY*F9TbqJtUiBnIvԜiSIF)N\4ШҍG$ٵҶ2qРԊRYEE=|MphH[DpԼNMo&Hʎ2rנԒne%$q5ba7k%odcK7FЕDe%+nUʥH7/(R\M&gbqtp֚{w9ӭ.u{^+,2RnтݕZZV 3wMsLO'is-k{wWD4pPyڕK]BjLF.T*4h\s4؆:Uӥ<RN9.v^h ^OORs}t#PmJi('LpЋqsy3<>.U+:55rK2g`t\i┚Ry_OC)_Dܚ]L!^#8yps˃O4)6ZLuONr}ǠR otaJjExT]"NU]+NWkr| N+R6 yZ%u$r=P8zWO_21yI+e SӍ=gzC?nV}0qRPI @8:/LMҍJ8UaYשOYfrʢey04TnZvӧ+{NtmgP-N>78DZR}ɾ_tSm?)8([F0RY`ԟ%m'T1Ro$c8VӇ3XYGEs]b%n@IrDoݣuONr}Fja(.ٓ媱S`wN-Mmm1©Q^:4q;p_JEiJ7gH3Jg/Dʰ]W3IbTu=e$6A7{y [zxF[$k/;GN)o*pq% TNaI&^*`ja MjR(Tԓ@8:Kۯ;HsˏNT5g)IۖH># G*y'4y5M+(qrRRe8Qha(C*kɽHԌ$#NY|/0BC].*jO%nN G Ӌ.ԥ&5UW*z͗3~vRNyI9˽Rji뙳: 5 Ӄ̕M]؊RSps(K#8(A(*.24wYGIG+wDhSiՌm:);m>Fy|(^1J8T8FhӡIS-4VM5tLj5HSwfmG=R^JmKʗG3%*RmG2،D+f]hmJ(Ӎ:qQUFε*uJXB[eʜ^f)9;ry#RY*II|FFճNNNܵ3FNRpk3dF)$\ M4fQ҆(ڞW{<NVvNT՞ %u%7z=OLt T/yo[~(̄R5de|cN,<($kSQa@Mg_VmR;_:O*SXaFN-Yܑ:4F5;Hgy+Dz- PB^O'rRn/8F?-b'T Pdֳ#gy+Dz- PB^O'rRn/8F?-b'T Pdֳ# endstream endobj 9 0 obj 36787 endobj 10 0 obj /DeviceGray endobj 11 0 obj << /Filter [ /DCTDecode ] /Width 106 /Height 106 /ColorSpace 10 0 R /BitsPerComponent 8 /Length 12 0 R >> stream JFIF++C  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ| jj-!1QA"a2qRr#3?8B–^$j Z%sźupnxʺE#&d_R[j- w[4Fsg>xa\Znt+4fԓ%{^J}]hoW%mMOO܎<"U ;lI;iUg [kV]YU8t%y^Tm&s{Kgri/lo2&ؚ f&ک5OUiMWIֻrV 6ֵ_1M6ܛ&nME7niw my40)_,H9k[˦4.ֹmVƅ_U[o>i(8ѓ)/eG`f_U{A +WF|&vZft\ٸ9)\9֍6.k_h{x&.'n)KM;`Utٙ> endobj 16 0 obj 905 endobj 17 0 obj << /Title (lqdxmpl2B.pdf) /CreationDate (D:20120603155857) /ModDate (D:20120603155857) /Producer (ImageMagick 6.5.7-8 2012-04-30 Q16 http://www.imagemagick.org) >> endobj xref 0 18 0000000000 65535 f 0000000010 00000 n 0000000059 00000 n 0000000118 00000 n 0000000316 00000 n 0000000407 00000 n 0000000425 00000 n 0000000463 00000 n 0000000484 00000 n 0000037451 00000 n 0000037472 00000 n 0000037500 00000 n 0000038545 00000 n 0000038565 00000 n 0000038581 00000 n 0000038601 00000 n 0000038623 00000 n 0000038643 00000 n trailer << /Size 18 /Info 17 0 R /Root 1 0 R >> startxref 38823 %%EOF rgenoud/vignettes/rgenoud.bib0000644000176200001440000017213713171743040016061 0ustar liggesusers@string{aer = "American Economic Review"} @string{ajps= "American Journal of Political Science"} @string(apq = "American Politics Quarterly") @string{apsr= "American Political Science Review"} @string{ams = "Annals of Mathematical Statistics"} @string{aos = "Annals of Statistics"} @string{bjps= "British Journal of Political Science"} @string{ec = "Econometrica"} @string{ier = "International Economic Review"} @string{jasa= "Journal of the American Statistical Association"} @string{je = "Journal of Econometrics"} @string{jel = "Journal of Economic Literature"} @string{jep = "Journal of Economic Perspectives"} @string{jet = "Journal of Economic Theory"} @string{jmcb= "Journal of Money, Credit, and Banking"} @string{jme = "Journal of Monetary Economics"} @string{jpe = "Journal of Political Economy"} @string{jop = "Journal of Politics"} @string{jrsa= "Journal of the Royal Statistical Society, Series A"} @string{jrssb= "Journal of the Royal Statistical Society, Series B"} @string{lsq = "Legislative Studies Quarterly"} @string{pa = "Political Analysis"} @string{pm = "Political Methodology"} @string{pop = "Perspectives on Politics"} @string{ps = "PS: Political Science and Politics"} @string{qje = "Quarterly Journal of Economics"} @string{c-h = "Chapman \& Hall"} @string{cup = "Cambridge University Press"} @string{cornell.up = "Cornell University Press"} @string{hup = "Harvard University Press"} @string{mit = "MIT Press"} @string(pup = {Princeton University Press}) @string{s-v = "Springer-Verlag"} @string(sup = "Stanford University Press") @string{ucp = "University of California Press"} @string{uchp = "University of Chicago Press"} @string{ump = "University of Michigan Press"} @string{yup = "Yale University Press"} @string{cq = "Congressional Quarterly"} @string{aa = "Ann Arbor"} @string{berk= "Berkeley"} @string{bos = "Boston"} @string{cam = "Cambridge, MA"} @string{camUK = "Cambridge, UK"} @string{chic= "Chicago"} @string{dc = "Washington, D.C."} @string{nh = "New Haven"} @string{nj = "New Jersey"} @string{ny = "New York"} @string{sf = "San Francisco"} @string{st = "Stanford"} @article( abadie2002, author= {Abadie, Alberto}, title= {Bootstrap Tests for Distributional Treatment Effect in Instrumental Variable Models}, journal= jasa, volume=97, number=457, pages= {284--292}, year= 2002 ) @article( AbadieGardeazabal2003, author= {Abadie, Alberto and Javier Gardeazabal}, title= {The Economic Costs of Conflict: a Case-Control Study for the Basque Country}, journal= aer, volume=92, number=1, year= 2003 ) @article( AbadieImbens_largesample, author= {Abadie, Alberto and Guido Imbens}, title= {Large Sample Properties of Matching Estimators for Average Treatment Effects}, journal= ec, year= "forthcoming" ) @Article{Abadie+Diamond+Hainmueller:2011, author = {Alberto Abadie and Alexis Diamond and Jens Hainmueller}, title = {\pkg{Synth}: An \proglang{R} Package for Synthetic Control Methods in Comparative Case Studies}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @book( adams1805, author= {Adams, John}, title= {Discourses on Davila: A Series of Papers on Political History}, publisher= {Da Capo Press}, address= {New York}, year= {1973 [1805]} ) @book( alesina1995, author= {Alesina, Alberto and Howard Rosenthal}, title= {Partisan Politics, Divided Government, and the Economy}, publisher= cup, address= ny, year= 1995 ) @article( alesina1989, author= {Alesina, Alberto and Howard Rosenthal}, title= {Partisan Cycles in {C}ongressional Elections and the Macroeconomy}, journal= apsr, volume=83, pages= {373-398}, year= 1989 ) @article( AlesinaLondregan1993, author= {Alesina, Alberto and John Londregan and Howard Rosenthal}, title= {A Model of the Political Economy of the United States}, journal= apsr, volume=87, number= 1, pages= {12--33}, year= 1993 ) @book( AltmanGillMcDonald2003, author= {Altman, Micah and Jeff Gill and Michael McDonald}, title= {Numerical Issues in Statistical Computing for the Social Scientist}, publisher= {John Wiley and Sons}, address= {New York}, year= 2003 ) @book( alvarez1997, author= {Alvarez, R. Michael}, title= {Information and Elections}, publisher= {University of Michigan Press}, address= {Ann-Arbor}, year= 1997 ) @book( AlvarezBrehm2002, author= {Alvarez, R. Michael and John Brehm}, title= {Hard Choices, Easy Answers: Values, Information, and American Public Opinion}, publisher= pup, address= nj, year= 2002 ) @article( AlvarezBrehm1998, author= {Alvarez, R. Michael and John Brehm}, title= {Speaking in Two Voices: American Equivocation about the Internal Revenue Service}, journal= ajps, volume=42, number= 2, pages= {418--452}, year= 1998 ) @article( AlvarezBrehm1997, author= {Alvarez, R. Michael and John Brehm}, title= {Are Americans Ambivalent Toward Racial Policies?}, journal= ajps, volume=41, pages= {345--374}, year= 1997 ) @article( AlvarezBrehm1995, author= {Alvarez, R. Michael and John Brehm}, title= {American Ambivalence Toward Abortion Policy: A Heteroskedastic Probit Method for Assessing Conflicting Values}, journal= ajps, volume=39, pages= {1055--1082}, year= 1995 ) @book( althaus2003, author= {Althaus, Scott L.}, title= {Collective Preferences in Democratic Politics: Opinion Surveys and the Will of the People}, publisher= cup, address= ny, year= 2003 ) @article( althaus1998, author= {Althaus, Scott L.}, title= {Information Effects in Collective Preferences}, journal= apsr, volume=92, number= 3, pages= {545--558}, year= 1998 ) @article( AldrichMcKelvey1977, author= {Aldrich, John H. and Richard D. McKelvey}, title= {A Method of Scaling with Applications to the 1968 and 1972 Presidential Elections}, journal= apsr, volume=71, number=1, pages= {111--130}, year= 1977 ) @book( amemiya1985, author= {Amemiya, Takeshi}, title= {Advanced Econometrics}, publisher= hup, address={Cambridge, MA}, year= {1985} ) @article( atkinson86, author= {Atkinson, A. C.}, title= {Masking Unmasked}, journal= {Biometrika}, volume=73, pages= {533--541}, year= 1986, month= {Dec.} ) @article( austen-smith1996, author= {Austen-Smith, David and Jeffrey S. Banks}, title= {Information Aggregation, Rationality, and the Condorcet Jury Theorem}, journal= apsr, volume=90, pages= {34--45}, year= 1996 ) @unpublished( bartels2003, author= {Bartels, Larry M.}, title= {Homer Gets a Tax Cut: Inequality and Public Policy in the American Mind}, note= {Annual Meeting of the American Political Science Association, Philadelphia, August}, year= 2003 ) @article( bartels1999, author= {Bartels, Larry M.}, title= {Panel Effects in the National Election Studies}, journal= pa, volume=8, number= 1, year= 1999 ) @article( bartels1996b, author= {Bartels, Larry M.}, title= {Uninformed Votes: Information Effects in Presidential Elections}, journal= ajps, volume=40, number= 1, pages= {194--230}, year= 1996 ) @article( bartels1986, author= {Bartels, Larry M.}, title= "Issue Voting Under Uncertainty: An Empirical Test", journal= ajps, volume=30, number= 4, pages= {709--728}, year= 1986 ) @unpublished( battistin2004, author= {Battistin, Erich and Andrew Chesher}, title= {Measurement Error Bias and Propensity Score Methods}, year= 2004, note= "Working Paper" ) @article( bennett1988, author= {Bennett, Stephen Earl}, title= {Know-nothings' Revisited: The Meaning of Political Ignorance Today}, journal= {Social Science Quarterly}, volume=69, pages= {476--490}, year= 1988 ) @article( berg1993, author= {Berg, Sven}, title= {Condorcet's Jury Theorem, Dependency Among Jurors}, journal= {Social Choice and Welfare}, volume=10, pages= {87--95}, year= 1993 ) @book( berelson1954, author= {Berelson, Bernard R. and Paul F. Lazarsfeld and William N. McPhee}, title= {Voting: A Study of Opinion Formation in a Presidential Campaign}, publisher= uchp, address= chic, year= 1954 ) @article( BertsimasTsitsiklis1993, author= {Bertsimas, Dimitris and John Tsitsiklis}, title= {Simulated Annealing}, journal= "Statistical Science", volume=8, number=1, pages= {10--15}, year= 1993 ) @book( billingsley1986, author= {Billingsley, Patrick}, title= {Probability and Measure}, publisher= "Wiley", address= "New York", year= 1986 ) @book( bollen1989, author= {Bollen, Kenneth A.}, title= {Structural Equations with Latent Variables}, publisher= "Wiley", address={New York}, year= {1989} ) @unpublished( BowersHansen2005, author= {Bowers, Jake and Ben Hansen}, title= {Attributing Effects to a Get-Out-The-Vote Campaign Using Full Matching and Randomization Inference}, note= "Working Paper", year= 2005 ) @article(braumoeller2003, author= {Braumoeller, Bear F.}, title= {Causal Complexity and the Study of Politics}, journal= pa, volume=11, number=3, pages= {209-233}, year= 2003 ) @Manual{BraumoellerGoodrichKline2006, author = {Braumoeller, Bear F. and Ben Goodrich and Jacob Kline}, title = {\pkg{Boolean}: Boolean Binary Response Models}, note = {\proglang{R}~package version~2.0-2}, url = {http://polisci.osu.edu/faculty/braumoeller/custom/Booleanbatch.html}, year = {2010}, } @article( BrunellNiNardo2004, author= {Brunell, Thomas L. and John DiNardo}, title= {A Propensity Score Reweighting Approach to Estimating the Partisan Effects of Full Turnout in American Presidential Elections}, journal= pa, volume=12, number=1, pages= {28--45}, year= 2004 ) @book( bryce1888, author= {Bryce, James}, title= {The American Commonwealth}, publisher= {Liberty Fund}, address= {Indianapolis}, year= "1995 [1888]" ) @article( bunce2000, author= {Bunce, Valerie}, title= {Comparative Democratization: Big and Bounded Generalizations}, journal= {Comparative Political Studies}, volume=33, number={6/7}, pages= {703--724}, year= 2000 ) @incollection( camp2004, author= {Camp, Ai Roderic}, title= {Citizen Attitudes toward Democracy and Vicente Fox's Victory in 2000}, booktitle= {Mexico's Pivotal Democratic Election}, editor= {Jorge I. Dom\'{i}nguez and Chappell Lawson}, publisher= sup, address= "Stanford", pages= {25--46}, year= 2004 ) @book( campbell1960, author= {Campbell, Angus and Philip E. Converse and Warren E. Miller and Donald E. Stokes}, title= {The {A}merican Voter}, publisher= {John Wiley \& Sons}, address= ny, year= 1960 ) @article( CantoniRonchetti2001, author= {Cantoni, Eva and Elvezio Ronchetti}, title= {Robust Inference for Generalized Linear Models}, journal= jasa, volume=96, pages= {1022--1030}, year= 2001 ) @article( CarrollPederson1993, author= {Carroll, R. J. and Pederson, Shane}, title= {On Robustness in the Logistic Regression Model}, journal= jrssb, volume=84, number= 3, pages= {693--706}, year= 1993 ) @article{ cerny1985, author = "Cerny, V.", title = "Thermodynamical Approach to the Traveling Salesman Problem: An Efficient Simulation Algorithm", journal = "Journal of Optimization Theory and Applications", number = "1", volume = "45", pages = "41--51", year = "1985" } @article( ChristakisIwashyna2003, author= {Christakis, Nicholas A. and Iwashyna, Theodore I.}, title= "The Health Impact of Health Care on Families: A matched cohort study of hospice use by decedents and mortality outcomes in surviving, widowed spouses.", journal= "Social Science \& Medicine", volume=57, number=3, pages= {465--475}, year= 2003 ) @article( CochranRubin1973, author= {Cochran, William G. and Donald B. Rubin}, title= "Controlling Bias in Observational Studies: A Review", journal= {Sankhya, $\mathrm{Ser.\ A}$}, volume=35, pages= {417--446}, year= 1973 ) @book( collier_christopher1971, author= {Collier, Christopher}, title= {Roger Sherman's Connecticut: Yankee Politics and the American Revolution}, publisher= "Wesleyan University Press", address= "Middletown, Conn.", year= 1971 ) @book( conover1971, author= {Conover, William J.}, title= {Practical Nonparametric Statistics}, publisher= {John Wiley \& Sons}, address= {New York}, year= {1971} ) @incollection( converse1964, author= {Converse, Phillip}, title= {The Nature of Belief Systems in Mass Publics}, booktitle= {Ideology and Discontent}, editor= {David Apter}, publisher= {Free Press}, address= ny, pages= {240--268}, year= 1964 ) @article( cornfield1959, author= {Cornfield, J. and W. Haenszel and E. Hammond and A. Lilienfeld and M. Shimkin and E. Wynder}, title= {Smoking and lunch cancer: Recent evidence and a discussion of some questions}, journal= {Journal of the National Cancer Institute}, volume=22, pages= {173--203}, year= 1959 ) @article( copas1988, author= {Copas, J. B.}, title= {Binary Regression Models for Contaminated Data}, journal= jrssb, volume=50, number= 2, pages= {225--265}, year= 1988 ) @book( cox1958, author= {Cox, David R.}, title= {Planning of Experiments}, publisher= "Wiley", address= ny, year= 1958 ) @book( davis1991, editor= {Davis, Lawrence}, title= {Handbook of Genetic Algorithms}, publisher= {Van Nostrand Reinhold}, address= {New York}, year= {1991} ) @article( dawid1979, author= {Dawid, A. Phillip}, title= {Conditional Independence in Statistical Theory}, journal= jrssb, volume=41, pages= {1--31}, number= 1, year= 1979 ) @incollection( dejong1993, author= {De Jong, Kenneth A.}, title= {Genetic Algorithms Are Not Function Optimizers}, booktitle= {Foundations of Genetic Algorithms 2}, editor= {L.~Darrell Whitley}, publisher= {Morgan Kaufmann}, address= {San Mateo, CA}, year= 1993 ) @Article{Dehejia2005, author = {Rajeev Dehejia}, title = {Practical Propensity Score Matching: A Reply to Smith and Todd}, journal = {Journal of Econometrics}, year = {2005}, volume = {125}, number="1--2", pages = {355--364}, } @Article{DehejiaWahba2002, author = {Rajeev H. Dehejia and Sadek Wahba}, title = {Propensity Score Matching Methods for Nonexperimental Causal Studies}, journal = {Review of Economics and Statistics}, year = {2002}, volume = {84}, number = {1}, pages = {151--161}, month = {February}, } @article( DehejiaWahba1999, author= {Dehejia, Rajeev and Sadek Wahba}, title= {Causal Effects in Non-Experimental Studies: Re-Evaluating the Evaluation of Training Programs}, journal= jasa, volume=94, number= 448, pages= {1053--1062}, year= 1999 ) @unpublished( DehejiaWahba1997, author= {Dehejia, Rajeev and Sadek Wahba}, title= {Causal Effects in Non-Experimental Studies: Re-Evaluating the Evaluation of Training Programs}, note= {Rejeev Dehejia, \textit{Econometric Methods for Program Evaluation}. Ph.D. Dissertation, Harvard University, Chapter 1}, year= 1997 ) @book( delli1996, author= {Delli Carpini, X. Michael and Scott Keeter}, title= {What Americans Know about Politics and Why It Matters}, publisher= {Yale University Press}, address= {New Haven}, year= 1996 ) @article( delli1993, author= {Delli Carpini, X. Michael and Scott Keeter}, title= {Measuring Political Knowledge: Putting First Things First}, journal= ajps, volume=37, number = 4, pages= {1179-1206}, year= 1993 ) @Manual{DiceOptim, author = {Ginsbourger, D. and O. Roustant}, title = {\pkg{DiceOptim}: Kriging-based optimization for computer experiments}, note = {\proglang{R}~package version~1.0}, url = {http://cran.r-project.org/package=DiceOptim}, year = {2010}, } @article( DipreteEngelhardt2004, author= {Diprete, Thomas A. and Henriette Engelhardt}, title= {Estimating Causal Effects With Matching Methods in the Presence and Absence of Bias Cancellation}, journal= "Sociological Methods \& Research", volume=32, number=4, pages= "501--528", year= "2004", ) @incollection( dominguez2004, author= {Dom\'{i}nguez, I. Jorge}, title= {Why and How Did Mexico's 2000 Presidential Election Campaign Matter?}, booktitle= {Mexico's Pivotal Democratic Election}, editor= {Jorge I. Dom\'{i}nguez and Chappell Lawson}, publisher= sup, address= "Stanford", pages= {321--344}, year= 2004 ) @article( drake1993, author= {Drake, Christiana}, title= {Effects of Misspecification of the Propensity Score on Estimators of Treatment Effect}, journal= {Biometrics}, volume=49, number= 4, pages= {1231--1236}, year= 1993 ) @article( DrukkerWiggins2004, author= {Drukker, David M. and Vince Wiggins}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Comment}, journal= aer, volume=94, number=1, pages= {397--399}, year= 2004 ) @book( EfronTibshirani1994, author= {Efron, Bradely and Robert J. Tibshirani}, title= {An Introduction to the Bootstrap}, publisher= {Chapman \& Hall}, address= {New York}, year= {1994} ) @article( EpsteinHoKing2005, author= {Epstein, Lee and Daniel E. Ho and Gary King and Jeffrey A. Segal}, title= {The Supreme Court During Crisis: How War Affects only Non-War Cases}, journal= "New York University Law Review", volume=80, number=1, pages= "1--116", year= "2005", ) @article( erikson1988, author= {Erikson, Robert S.}, title= {The Puzzle of Midterm Loss}, journal= jop, volume=50, number = 4, pages= {1012--1029}, year= 1988 ) @book( FahrmeirTutz1994, author= {Fahrmeir, Ludwig and Gerhard Tutz}, title= {Multivariate Statistical Modeling Based on Generalized Linear Models}, publisher= "Springer-Verlag", address= "New York", year= 1994 ) @book( fechner1860, author= {Fechner, Gustav Theodor}, title= {Elements of psychophysics, Vol 1.}, note = {Translated by Helmut E. Adler and edited by D.H. Howes and E.G. Boring}, publisher= {Rinehart \& Winston}, address= ny, year= "1966 [1860]" ) @book( feller1970, author= {Feller, William}, title= {An Introduction to Probability Theory and Its Applications}, publisher= "Wiley", address= "New York", note= "Vol.\ 1, 3d ed., revised printing", year= 1970 ) @article( FilhoTreleavenAlippi1994, author= {Filho, Jose L. Ribeiro, Philip C. Treleaven and Cesare Alippi}, title= {Genetic Algorithm Programming Environments}, journal= {Computer}, volume=27, pages= {28--43}, year= 1994 ) @book( fiorina1996, author= {Fiorina, Morris P.}, title= {Divided Government}, publisher= {Allyn \& Bacon}, address= "Boston", edition= "2nd", year= 1992 ) @book( fisher1935, author= {Fisher, Ronald A.}, title= {Design of Experiments}, publisher= {Hafner}, address= {New York}, year= {1935} ) @book( fishkin1997, author= {James S. Fishkin}, title= {The Voice of the People: Public Opinion and Democracy}, edition= {2nd}, publisher= {Yale University Press}, address= {New Haven, CT}, year= {1997} ) @article( franklin1991, author= {Franklin, Charles H.}, title= {Eschewing Obfuscation? Campaigns and the Perception of U.S. Senate Incumbents}, journal= apsr, volume=85, number = 4, pages= {1193--1214}, year= 1991 ) @book( gallant1987, author= {Gallant, A. Ronald}, title= {Nonlinear Statistical Models}, publisher= "Wiley", address= ny, year= 1987 ) @article( GalianiGertlerSchargrodsky2005, author= {Galiani, Sebastian and Paul Gertler and Ernesto Schargrodsky}, title= {Water for Life: The Impact of the Privatization of Water Services on Child Mortality}, journal= jpe, volume=113, number=1, pages= {83--120}, year= 2005 ) @article( geddes1999, author= {Geddes, Barbara}, title= {What Do We Know about Democratization}, journal= "Annual Review of Political Science", volume=2, pages= {129--148}, year= 1999 ) @book( GillMurrayWright1981, author= {Gill, Philip E. and Walter Murray and Margaret H. Wright}, title= {Practical Optimization}, publisher= "Academic Press", address= "San Diego", year= 1981 ) @incollection( GrefenstetteBaker1989, author= {Grefenstette, John J. and James E. Baker}, title= {How Genetic Algorithms Work: A Critical Look at Implicit Parallelism}, booktitle= {Proceedings of the Third International Conference on Genetic Algorithms}, publisher= "Morgan Kaufmann", address= "San Mateo, CA", pages= {20--27}, year= 1989 ) @article( GeyerThompson1995, author= {Geyer, Charles J. and Elizabeth A. Thompson}, title= {Annealing Markov Chain Monte Carlo with Applications to Ancestral Inference}, journal= jasa, volume=90, number=431, pages= {909--920}, year= 1995 ) @book( goldberg1989, author= {Goldberg, David E.}, title= {Genetic Algorithms in Search, Optimization, and Machine Learning}, publisher= "Addison-Wesley", address= "Reading, MA", year= 1989 ) @Manual{goodrich.fair, author = {Goodrich, Ben}, title = {\pkg{FAiR}: Factor Analysis in \proglang{R}}, note = {\proglang{R}~package version~0.4-7}, url = {http://cran.r-project.org/package=FAiR}, year = {2011}, } @incollection( grefenstette1993, author= {Grefenstette, John J.}, title= {Deception Considered Harmful}, booktitle= {Foundations of Genetic Algorithms 2}, editor= {L.~Darrell Whitley}, publisher= {Morgan Kaufmann}, address= {San Mateo, CA}, year= 1993 ) @book( habermas1964, author= {Habermas, J\"{u}rgen}, title= {The Structural Transformation of the Public Sphere: An Inquiry into a Category of Bourgeois Society}, note = {Translated by Thomas Burger}, publisher= mit, address= cam, year= "1996 [1964]" ) @book( hall1992, author= {Hall, Peter}, title= {The Bootstrap and Edgeworth Expansion}, publisher= {Springer-Verlag}, address= {New York}, year= {1992} ) @book( hampel1986, author= {Hampel, Frank R. and Elvezio M. Ronchetti and Peter J. Rousseeuw and Werner A. Stahel}, title= {Robust Statistics: The Approach Based on Influence Functions}, publisher= {Wiley, John and Sons}, address= {New York}, year= 1986 ) @article( HausmanWise1979, author= {Hausman, Jerry A. and David A. Wise}, title= {Attrition Bias in Experimental and Panel Data: The Gary Income Maintenance Experiment}, journal= ec, volume=47, pages= {455--473}, year= 1979 ) @article( hirnao1998, author= {Hirano, Keisuke and Guido W. Imbens and Geert Ridder and Donald B. Rubin}, title= {Combining Panel Data Sets with Attrition and Refreshment Samples}, journal= ec, volume=69, pages= {1645--1659}, year= 1998 ) @article( heckman1979, author= {Heckman, James J}, title= {Sample Selection Bias as a Specification Error}, journal= ec, volume=47, pages= {153--161}, year= 1979 ) @article( heckman1998, author= {Heckman, James J. and Hidehiko Ichimura and Jeffrey Smith and Petra Todd}, title= {Characterizing Selection Bias Using Experimental Data}, journal= ec, volume=66, number = 5, pages= {1017-1098}, year= 1998 ) \item , ed. 1985. \textit{.} New York: Cambridge University Press. @book( HeckmanSinger1985, editor= {Heckman, James J. and Burton Singer}, title= {Longitudinal Analysis of Labor Market Data}, publisher= cup, address={New York}, year= {1985} ) @unpublished{HerronWand2004, author = {Herron, Michael C. and Jonathan Wand}, title = {Assessing Partisan Bias in Voting Technology: The Case of the 2004 New Hampshire Recount}, note = "Working Paper", year = {2004}, } @article( hersh1982, author= {Hersh, Seymour M.}, title= {The Price of Power: Kissinger, Nixon, and Chile}, journal= {The Atlantic Monthly}, month=12, url= {http://www.theatlantic.com/issues/82dec/hersh.htm}, year= 1982 ) @book( hettmansperger1984, author= {Hettmansperger, T}, title= {Statistical Inference Based on Ranks}, publisher= "Wiley", address= ny, year= 1984 ) @article( holland1986, author= {Holland, Paul W.}, title= {Statistics and Causal Inference}, journal= jasa, volume=81, number=396, pages= {945--960}, year= 1986 ) @book( holland1975, author= {Holland, John H.}, title= {Adaptation in Natural and Artificial Systems}, publisher= "University of Michigan Press", address= "Ann Arbor", year= 1975 ) @article( HorvitzThompson1952, author= {Horvitz, D. G. and D. J. Thompson}, title= {A Generalization of Sampling without Replacement from a Finite Universe}, journal= jasa, volume=47, pages= {663--685}, year= 1952 ) @book( huber1981, author= {Huber, Peter J.}, title= {Robust Statistics}, publisher= {Wiley, John and Sons}, address= {New York}, year= 1981 ) @book( huntington1968, author= {Huntington, Samuel P.}, title= {Political Order in Changing Societies}, publisher= {Yale University Press}, address= {New Haven}, year= 1968 ) @book( huntington1991, author= {Huntington, Samuel P.}, title= {The Third Wave: Democratization in the Late Twentieth Century}, publisher= {University of Oklahoma Press}, address= {Norman and London}, year= 1991 ) @article(KingWand2007, author= {King, Gary and Jonathan Wand}, title= {Comparing Incomparable Survey Responses: Evaluating and Selecting Anchoring Vignettes}, journal= pa, volume=15, pages= {46--66}, year= 2007 ) @article{ KirkpatrickGelattVecchi83, author = "S. Kirkpatrick and C. D. Gelatt and M. P. Vecchi", title = "Optimization by Simulated Annealing", journal = "Science", number = "4598", volume = "220", pages = "671--680", year = "1983" } @book( knuth1998, author= {Knuth, Donald E.}, title= {The Art of Computer Programming, Vol. 2: Seminumerical Algorithms}, edition= "3rd", publisher= "Addison-Wesley", address= "Reading: MA", year= 1998 ) @Manual{KrigInv, author = {Victor Picheny and David Ginsbourger}, title = {\pkg{KrigInv}: Kriging-based Inversion for Deterministic and Noisy Computer Experiments}, note = {\proglang{R}~package version~1.1}, url = {http://CRAN.R-project.org/package=KrigInv}, year = {2011} } @unpublished( krosnick2004, author= {Holbrook, Allyson L. and Matthew K. Berent and Jon A. Krosnick and Penny S. Visser and David S. Boninger}, title= {Attitude Importance and the Accumulation of Attitude-Relevant Knowledge in Memory}, note= "Working Paper", year= 2004 ) @Manual{LeeLee2006, author = {Lee, Chun-Ying and Yung-Jin Lee}, title = {\pkg{PKfit}: A Tool for Data Analysis in Pharmacokinetics}, note = {\proglang{R}~package version~1.1.8}, url = {http://CRAN.R-project.org/package=PKfit}, year = {2009}, } @Manual{ivivc, author = {Hsin Ya Lee and Yung-Jin Lee}, title = {\pkg{ivivc}: in vitro-in vivo correlation (IVIVC) modeling}, note = {\proglang{R}~package version~0.1.5}, url = {http://CRAN.R-project.org/package=ivivc}, year = {2009} } @article( imbens2000, author= {Imbens, Guido W.}, title= "The Role of the Propensity Score in Estimating Dose-Response Functions", journal= {Biometrika}, volume=87, number=3, pages= {706--710}, year= 2000 ) @Article{imai2005, author = {Kosuke Imai}, title = {Do Get-Out-The-Vote Calls Reduce Turnout? The Importance of Statistical Methods for Field Experiments}, journal = apsr, volume = 99, number=2, pages = "283--300", year = {2005}, } @incollection( iyengar1990, author= {Iyengar, Shanto}, title= {Shorts to Political Knowledge: Selective attention and the accessibility bias}, booktitle= {Information and the Democratic Process}, editor= {John Ferejohn and James Kuklinski}, publisher= {University of Illinois Press}, address= {Urbana}, year= 1990 ) @unpublished( iyengar1986, author= {Iyengar, Shanto}, title= {Whither Political Information}, note= {Report to the NES Board of Overseers. Center for Political Studies, University of Michigan}, year= 1986 ) @Manual{JOP, author = {Sonja Kuhnt and Nikolaus Rudak}, title = {\pkg{JOP}: Joint Optimization Plot}, note = {\proglang{R}~package version~2.0.1}, url = {http://cran.r-project.org/package=JOP}, year = {2011}, } @book( johnston2004, author= {Johnston, Richard and Michael G. Hagen and Kathleen Hall Jamieson}, title= {The 2000 Presidential Election and the Foundations of Party Politics}, publisher= cup, address= ny, year= 2004 ) @book( johnston1992, author= {Johnston, Richard and Andr\'{e} Blais and Henry E. Brady and Jean Cr\^{e}te}, title= {Letting the People Decide: Dynamics of a Canadian Election}, publisher= "McGill-Queen's University Press", address= "Montreal", year= 1992 ) @book( kornhauser1959, author= {Kornhauser, William}, title= {The Politics of Mass Society}, publisher= {The Free Press}, address= {New York}, year= 1959 ) @article( kunsch1989, author= {Kunsch, H. R. and L. A. Stefanski and R. J. Carroll}, title= {Conditionally Unbiased Bounded-Influence Estimation in General Regression Models}, journal= jasa, volume=84, pages= {460--466}, year= 1989 ) @book( lancaster1990, editor= {Lancaster, Tony}, title= {The Econometric Analysis of Transition Data}, publisher= cup, address={New York}, year= {1990} ) @Article{lalonde1986, author = {Robert LaLonde}, title = {Evaluating the Econometric Evaluations of Training Programs with Experimental Data}, journal = {American Economic Review}, year = {1986}, OPTkey = {}, volume = {76}, OPTnumber = {4}, pages = {604--20}, month = {September}, OPTnote = {}, OPTannote = {} } @incollection( lawson2004, author= {Lawson, Chappell}, title= {Introduction}, booktitle= {Mexico's Pivotal Democratic Election}, editor= {Jorge I. Dom\'{i}nguez and Chappell Lawson}, publisher= sup, address= "Stanford", pages= {1--21}, year= 2004 ) @article( lipset1959, author= {Lipset, Seymour Martin}, title= {Some Social Requisites of Democracy: Economic Development and Political Legitimacy}, journal= apsr, volume=53, number=1, pages= {69--105}, year= 1959 ) @book( LittleRubin1987, author= {Little, Roderick J. A. and Rubin, Donald B.}, title= {Statistical Analysis with Missing Data}, publisher= {J. Wiley \& Sons}, address= ny, year= 1987 ) @unpublished( lupia2004, author= {Lupia, Arthur}, title= {Questioning Our Competence: Tasks, Institutions, and the Limited Practical Relevance of Common Political Knowledge Measures}, note= "Working Paper", year= 2004 ) @article( luskin2002, author= {Luskin, Robert C. and James S. Fishkin and Roger Jowell}, title= {Considered Opinions: Deliberative Polling in Britain}, journal= bjps, volume=32, pages= {455--487}, year= 2002 ) @book( MccullaghNelder1989, author= {McCullagh, Peter and John A. Nelder}, title= {Generalized Linear Models}, edition= "2nd", publisher= c-h, address= ny, year= 1989 ) @article( McCulloughVinod2004a, author= {McCullough, B. D. and H. D. Vinod}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Reply}, journal= aer, volume=94, number=1, pages= {391--396}, year= 2004 ) @article( McCulloughVinod2004b, author= {McCullough, B. D. and H. D. Vinod}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Reply}, journal= aer, volume=94, number=1, pages= {400--403}, year= 2004 ) @article( McCulloughVinod2003, author= {McCullough, B. D. and H. D. Vinod}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study}, journal= aer, volume=93, number=3, pages= {873--892}, year= 2003 ) @article( mckelvey1985a, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Elections with Limited Information: A Fulfilled Expectations Model Using Contemporaneous Poll and Endorsement Data as Information Sources}, journal= jet, volume=36, pages= {55--85}, year= 1985 ) @article( mckelvey1985b, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Sequential Elections with Limited Information}, journal= ajps, volume=29, number=3, pages= {480--512}, year= 1985 ) @article( mckelvey1986, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Information, Electoral Equilibria, and the Democratic Ideal}, journal= jop, volume=48, number=4, pages= {909--937}, year= 1986 ) @article( mcgraw1990, author= {McGraw, Kathleen and Neil Pinney}, title= {The Effects of General and Domain-Specific Expertise on Political Memory and Judgement}, journal= {Social Cognition}, volume=8, pages= {9--30}, year= 1990 ) @article( mckelvey1985a, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Elections with Limited Information: A Fulfilled Expectations Model Using Contemporaneous Poll and Endorsement Data as Information Sources}, journal= jet, volume=36, pages= {55--85}, year= 1985 ) @article( mckelvey1985b, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Sequential Elections with Limited Information}, journal= ajps, volume=29, number=3, pages= {480--512}, year= 1985 ) @article( mckelvey1986, author= {McKelvey, Richard D. and Peter C. Ordeshook}, title= {Information, Electoral Equilibria, and the Democratic Ideal}, journal= jop, volume=48, number=4, pages= {909--937}, year= 1986 ) @article( McNemar1947, author= {McNemar, Q.}, title= {Note on the Sampling Error of the Differences Between Correlated Proportions or Percentage}, journal= {Psychometrika}, volume=12, pages= {153--157}, year= 1947 ) @book( maddala1992, author= {Maddala, G.S.}, title= {Introduction to Econometrics}, edition= "2nd", publisher= {MacMillan}, address= {New York}, year= "1992" ) @book( maddala1983, author= {Maddala, G.S.p}, title= {Limited-Dependent and Qualitative Variables in Econometrics}, publisher= cup, address={New York}, year= {1983} ) @article{ MarinariParisi1992, author = "E. Marinari and G. Parisi", title = "Simulated tempering: A New Monte Carlo Scheme", journal = "Europhysics Letters", number = "19", volume = "6", pages = "451--455", year = "1992" } @article( MannWhitney1947, author= {Mann, H. and Whitney, D}, title= {On a Test of Whether One of Two Random Variables is Stochastically Larger than the Other}, journal= {Annals of Mathematical Statistics}, volume=18, pages= {50--60}, year= 1947 ) @Article{MebaneJr.+Sekhon:2011, author = {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title = {Genetic Optimization Using Derivatives: The \pkg{rgenoud} Package for \proglang{R}}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @article( mebane2000, author= {Mebane, Jr., Walter R.}, title= {Coordination, Moderation and Institutional Balancing in American Presidential and House Elections}, journal= apsr, volume=94, number = 1, pages= {37--57}, year= 2000 ) @Manual{MebaneSekhon1997, author = {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title = {GENetic Optimization Using Derivatives (GENOUD)}, note = {Computer program available upon request}, year = {1997} } @article( MebaneSekhon2004, author= {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title= {Robust Estimation and Outlier Detection for Overdispersed Multinomial Models of Count Data}, journal= ajps, volume=48, number = 2, pages= {391--410}, year= 2004 ) @Manual{MebaneSekhon.multinomRob, author = {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title = {\pkg{multinomRob}: Robust Estimation of Overdispersed Multinomial Regression Models}, note = {\proglang{R}~package version~1.8-4}, url = {http://CRAN.R-project.org/package=multinomRob}, year = {2009}, } @article( MebaneSekhon2002, author= {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title= {Coordination and Policy Moderation at Midterm}, journal= apsr, volume=96, number = 1, pages= {141--157}, year= 2002 ) @unpublished( MebaneSekhon1998, author= {Mebane, Jr., Walter R. and Jasjeet S. Sekhon}, title= {GENetic Optimization Using Derivatives (GENOUD)}, note = {Software Package. \url{http://sekhon.berkeley.edu/rgenoud/}}, year= 1998 ) @book( Michalewicz1992, author= {Michalewicz, Zbigniew}, title= {Genetic Algorithms + Data Structures = Evolution Programs}, publisher= s-v, address= {New York}, year= {1992} ) @unpublished( MichalewiczSwaminathanLogan1993, author= {Michalewicz, Zbigniew and Swarnalatha Swaminathan and Thomas D. Logan}, title= {GENOCOP (version 2.0)}, note = {C language computer program source code. \url{http://www.cs.adelaide.edu.au/~zbyszek/EvolSyst/genocop2.0.tar.Z}}, year= 1993 ) @book( mes2002, author= {Erikson, Robert S. and Michael B. MacKuen and James A. Stimson}, title= {The Macro Polity}, publisher= cup, address= {New York}, year= {2002} ) @incollection( miller1986, author= {Miller, Nicholas R}, title= {Information, Electorates, and Democracy: Some Extensions and Interpretations of the Condorcet Jury Theorem}, booktitle= {Information Pooling and Group Decision Making}, editor= {Bernard Grofman and Guillermo Owen}, publisher= {JAI}, address= {Greenwich, CT}, year= 1986 ) @article{MitchellKrzanowski1989, author = {Mitchell, Ann F. S. and Wojtek J. Krzanowski}, title = {Amendments and Corrections: The Mahalanobis Distance and Elliptic Distributions}, journal = {Biometrika}, year = {1989}, volume = {76}, number = {2}, pages = {407}, } @article{MitchellKrzanowski1985, author = {Mitchell, Ann F. S. and Wojtek J. Krzanowski}, title = {The Mahalanobis Distance and Elliptic Distributions}, journal = {Biometrika}, year = {1985}, volume = {72}, number = {2}, pages = {464--467}, } @book( neuman86, author= {Neuman, W. Russell}, title= {The Paradox of Mass Politics: Knowledge and Opinion in the {A}merican Electorate}, publisher= hup, address= cam, year= 1986 ) @article( NixVose1992, author= {Nix, Allen E. and Michael D. Vose}, title= {Modeling Genetic Algorithms with Markov Chains}, journal= {Annals of Mathematics and Artificial Intelligence}, volume=5, pages= {79--88}, year= 1992 ) @book( page1992, author= {Page, Benjamin I. and Robert Y. Shapiro}, title= {The Rational Public: Fifty Years of Trends in {A}mericans' Policy Preferences}, publisher= uchp, address= chic, year= 1992 ) @article( PalfreyPoole1987, author= {Palfrey, Thomas R. and Keith T. Poole}, title= {The Relationship between Information, Ideology, and Voting Behavior}, journal= ajps, volume=31, number = 3, pages= {511--530}, year= 1987 ) @book( patterson2002, author= {Patterson, Thomas E.}, title= {The Vanishing Voter: Public Involvement in an Age of Uncertainty}, publisher= "Alfred A. Knopf", address= "New York", year= 2002 ) @book( popkin1991, author= {Popkin, Samuel L}, title= {The Reasoning Voter: Communication and Persuasion in Presidential Campaigns}, publisher= uchp, address= chic, year= 1991 ) @article( PriceZaller1993, author= {Price, Vincent and John Zaller}, title= {Who Gets the News? Alternative Measures of News Reception and Their Implications for Research}, journal= {Public Opinion Quarterly}, volume=57, number=2, pages= {133--164}, year= 1993 ) @article( pryor2003, author= {Pryor, Kane}, title= {A national state of confusion}, journal= {Salon.com}, month=6, day=2, url= {http://www.salon.com/opinion/feature/2003/02/06/iraq_poll}, note= "Accessed 07/05/2004", year= 2003 ) @book( putnam2000, author= {Putnam, Robert D.}, title= {Bowling Alone: The Collapse and Revival of American Community}, publisher= "Simon \& Schuster", address= ny, year= 2000 ) @book( rosenbaum2002, author= {Rosenbaum, Paul R.}, title= {Observational Studies}, edition= "2nd", publisher= "Springer-Verlag", address= ny, year= 2002 ) @article( Rosenbaum1999, author= {Rosenbaum, Paul R.}, title= {Using Quantile Averages in Matched Observational Studies}, journal= {Applied Statistics}, volume=48, number= 1, pages= {63--78}, year= 1999 ) @article( Rosenbaum1993, author= {Rosenbaum, Paul R.}, title= {Comparison of Multivariate Matching Methods: Structures, Distances, and Algorithms}, journal= {Journal of Computational and Graphical Statistics}, volume=2, number= 4, pages= {405--420}, year= 1993 ) @article( Rosenbaum1991, author= {Rosenbaum, Paul R.}, title= {A Characterization of Optimal Designs for Observational Studies}, journal= jrssb, volume=53, number= 3, pages= {597--610}, year= 1991 ) @article( Rosenbaum1989, author= {Rosenbaum, Paul R.}, title= {Optimal Matching for Observational Studies}, journal= jasa, volume=84, number= 408, pages= {1024--1032}, year= 1989 ) @article( RosenbaumRubin1985, author= {Rosenbaum, Paul R. and Donald B. Rubin}, title= {Constructing a Control Group Using Multivariate Matched Sampling Methods That Incorporate the Propensity Score}, journal= {The American Statistician}, volume=39, number= 1, pages= {33--38}, year= 1985 ) @article( RosenbaumRubin1984, author= {Rosenbaum, Paul R. and Donald B. Rubin}, title= {Reducing Bias in Observational Studies Using Subclassification on the Propensity Score}, journal= jasa, volume=79, number= 387, pages= {516--524}, year= 1984 ) @article( RosenbaumRubin1983, author= {Rosenbaum, Paul R. and Donald B. Rubin}, title= {The Central Role of the Propensity Score in Observational Studies for Causal Effects}, journal= {Biometrika}, volume=70, number= 1, pages= {41--55}, year= 1983 ) @article( rubin2001, author= {Rubin, Donald B}, title= "Using Propensity Scores to Help Design Observational Studies: Application to the Tobacco Litigation", journal= "Health Services \& Outcomes Research Methodology", volume=2, number=1, pages= "169--188", year= 2001 ) @article( rubin1997, author= {Rubin, Donald B}, title= "Estimating Causal Effects from Large Data Sets Using Propensity Scores", journal= {Annals of Internal Medicine}, volume=127, number="8S", pages= "757--763", year= 1997 ) @book( rubinMI1987, author= {Rubin, Donald B.}, title= {Multiple Imputation for Nonresponse in Surveys}, publisher= {J. Wiley \& Sons}, address= ny, year= 1987 ) @article( rubin1980, author= {Rubin, Donald B.}, title= "Bias Reduction Using Mahalanobis-Metric Matching", journal= {Biometrics}, volume=36, number = 2, pages= {293--298}, year= 1980 ) @article( rubin1979, author= {Rubin, Donald B.}, title= "Using Multivariate Sampling and Regression Adjustment to Control Bias in Observational Studies", journal= jasa, volume=74, pages= {318--328}, year= 1979 ) @article( rubin1978, author= {Rubin, Donald B.}, title= {Bayesian Inference for Causal Effects: The Role of Randomization}, journal= {Annals of Statistics}, volume=6, number=1, pages= {34--58}, year= 1978 ) @article( rubin1977, author= {Rubin, Donald B.}, title= {Assignment to a Treatment Group on the Basis of a Covariate}, journal= {Journal of Educational Statistics}, volume=2, pages= {1--26}, year= 1977 ) @article( rubin1976, author= {Rubin, Donald B.}, title= {Multivariate Matching Methods That are Equal Percent Bias Reducing, I: Some Examples}, journal= {Biometrics}, volume = 32, number = 1, pages= {109--120}, year= 1976 ) @article( rubin1976b, author= {Rubin, Donald B.}, title= {Multivariate Matching Methods That are Equal Percent Bias Reducing, II: Maximums on Bias Reduction for Fixed Sample Sizes}, journal= {Biometrics}, volume = 32, number = 1, pages= {121--132}, year= 1976 ) @article( rubinMI1976, author= {Rubin, Donald B.}, title= {Inference and Missing Data}, journal= {Biometrika}, volume=63, pages= {581-592}, year= 1976 ) @article( rubin1973a, author= {Rubin, Donald B.}, title= "Matching to Remove Bias in Observational Studies", journal= {Biometrics}, volume=29, pages= {159--184}, year= 1973 ) @article( rubin1973b, author= {Rubin, Donald B.}, title= "The Use of Matching and Regression Adjustment to Remove Bias in Observational Studies", journal= {Biometrics}, volume=29, pages= {185--203}, year= 1973 ) @unpublished( RubinStuart, author= {Rubin, Donald B. and Elizabeth A. Stuart}, title= {Affinely Invariant Matching Methods with Discriminant Mixtures of Proportional Ellipsoidally Symmetric Distributions}, note= "Working Paper", year= 2005 ) @article( RubinThomas1996, author= {Rubin, Donald B. and Neal Thomas}, title= "Matching Using Estimated Propensity Scores: Relating Theory to Practice", journal= {Biometrics}, volume=52, number=1, pages= {249--264}, year= 1996 ) @article( RubinThomas1992, author= {Rubin, Donald B. and Neal Thomas}, title= "Affinely Invariant Matching Methods with Ellipsoidal Distributions", journal= aos, volume=20, number=2, pages= {1079--1093}, year= 1992 ) @article( RubinThomas1992b, author= {Rubin, Donald B. and Neal Thomas}, title= "Characterizing the Effect of Matching Using Linear Propensity Score Methods with Normal Distributions", journal= "Biometrika", volume=79, number=4, pages= {797--809}, year= 1992 ) @article( rustow1970, author= {Rustow, Dankwart A.}, title= {Transitions to Democracy: Toward a Dynamic Model}, journal= {Comparative Politics}, volume=2, number=3, pages= {337--363}, year= 1970 ) @article(SchacharNalebuff2004, author= {Shachar, Ron and Barry Nalebuff}, title= {Verifying the Solution from a Nonlinear Solver: A Case Study: Comment}, journal= aer, volume=94, number=1, pages= {382-390}, year= 2004 ) @book( schafer1997a, author= {Schafer, Joseph L.}, title= {Analysis of Incomplete Multivariate Data}, publisher= c-h, address= "London", year= 1997 ) @unpublished( schafer1997b, author= {Schafer, Joseph L.}, title= {Imputation of missing covariates under a general linear mixed model}, note= {Technical report, Dept. of Statistics, Penn State University}, year= 1997 ) @Manual{SekhonMatching, author = {Jasjeet S. Sekhon}, title = {\pkg{Matching}: Multivariate and Propensity Score Matching with Automated Balance Search}, note = {\proglang{R}~package version~4.7-12}, url = {http://CRAN.R-project.org/package=Matching}, year = {2011}, } @article( sekhon2004, author= {Sekhon, Jasjeet S.}, title= {Quality Meets Quantity: Case Studies, Conditional Probability and Counterfactuals}, journal= pop, volume=2, number = 2, pages= {281--293}, year= 2004 ) @unpublished( SekhonInformation, author= {Sekhon, Jasjeet S.}, title= "The Varying Role of Voter Information Across Democratic Societies", note = "Working Paper", url= {http://sekhon.berkeley.edu/papers/SekhonInformation.pdf}, year= 2004 ) @article( SekhonMebane1998, author= {Sekhon, Jasjeet Singh and Mebane, Jr., Walter R.}, title= {Genetic Optimization Using Derivatives: Theory and Application to Nonlinear Models}, journal= {Political Analysis}, volume={7}, pages= {189--203}, year= 1998 ) @unpublished( sekhon_glmRob, author= {Sekhon, Jasjeet S.}, title= {Robust Alternatives to Binary Logit and Probit: With reanalysis of Fearon and Laitin's (2003) ``Ethnicity, Insurgency and Civil War'' and Bartels's (1996) ``Uninformed Votes: Information Effects in Presidential Elections.}, note= "Working Paper", year= 2004 ) @book( smith_charles1956, author= {Smith, Charles Page}, title= {James Wilson, Founding Father, 1742-1798}, publisher= "University of North Carolina Press", address= "Chapel Hill", year= 1956 ) @article( smith_herbert1997, author= {Smith, Herbert L.}, title= {Matching with Multiple Controls to Estimate Treatment Effects in Observational Studies}, journal= "Sociological Methodology", volume=27, pages= "305--353", year= "1997" ) @article( SmithTodd2005a, author= {Smith, Jeffrey and Petra Todd}, title= {Does Matching Overcome LaLonde's Critique of Nonexperimental Estimators?}, journal= je, volume=125, number="1--2", pages= "305--353", year= "2005" ) @article( SmithTodd2005b, author= {Smith, Jeffrey and Petra Todd}, title= {Rejoinder}, journal= je, volume=125, number="1--2", pages= "365--375", year= "2005" ) @article{SmithTodd2001, author = {Jeffrey A. Smith and Petra E. Todd}, title = {Reconciling Conflicting Evidence on the Performance of Propensity Score Matching Methods}, journal = {AEA Papers and Proceedings}, year = {2001}, volume = {91}, number = {2}, pages = {112--118}, } @book( sniderman1991, author= {Sniderman, Paul M. and Richard Brody and Philip E. Tetlock}, title= {Reasoning and Choice: Explorations in Political Psychology}, publisher= cup, address= ny, year= 1991 ) @incollection( sniderman1993, author= {Sniderman, Paul M.}, title= {The New Look in Public Opinion Research}, booktitle= {Political Science: The State of the Discipline II}, editor= {Ada W. Finifter}, publisher= {American Political Science Association}, address= {Washington, DC}, year= 1993 ) @book( snyder2000, author= {Snyder, Jack}, title= {From Voting to Violence: Democratization and Nationalist Conflict}, publisher= {W. W. Norton}, address= ny, year= 2000 ) @article( stephens1974, author= {Stephens, M. A.}, title= {EDF Statistics for Goodness of Fit and Some Comparisons}, journal= jasa, volume=69, pages= {730--737}, year= 1974 ) @article( stokes2004, author= {Stokes, Houston}, title= {On the Advantage of Using Two or More Econometric Software Systems to Solve the Same Problem}, journal= {Journal of Economic and Social Measurement}, volume=29, number="1-3", pages= {307--320}, year= 2004 ) @Manual{synth2008, author = {Alexis Diamond and Jens Hainmueller}, title = {\pkg{Synth}: Synthetic Control Group Method for Comparative Case Studies}, note = {\proglang{R}~package version~0.1-6}, url = {http://CRAN.R-project.org/package=Synth}, year = {2008} } @incollection( vose1993, author= {Vose, Michael D.}, title= {Modeling Simple Genetic Algorithms}, booktitle= {Foundations of Genetic Algorithms 2}, editor= {L.~Darrell Whitley}, publisher= {Morgan Kaufmann}, address= {San Mateo, CA}, year= 1993 ) @Manual{WandKingLau2007, author = {Wand, Jonathan and Gary King and Olivia Lau}, title = {\pkg{Anchors}: Software for Anchoring Vignette Data}, note = {\proglang{R}~package version~2.0}, url = {http://wand.stanford.edu/anchors/}, year = {2008} } @book( wilcox1997, author= {Wilcox, Rand R.}, title= {Introduction to Robust Estimation}, publisher= {Academic Press}, address= {San Diego, CA}, year= 1997 ) @article( wilcoxon1945, author= {Wilcoxon, F}, title= {Individual Comparisons by Ranking Methods}, journal= {Biometrics}, volume=1, pages= {8083}, year= 1945 ) @article( WinshipMorgan1999, author= {Winship, Christopher and Stephen Morgan}, title= {The estimation of causal effects from observational data}, journal= "Annual Review of Sociology", volume=25, pages= "659--707", year= "1999" ) @article( wittman1989, author= {Wittman, Donald A}, title= {Why Democracies Produce Efficient Results}, journal= jpe, volume=97, pages= {1395--1424}, year= 1989 ) @article( yao.liu.lin1999, author= {Yao, Xin and Yong Liu and Guangming Lin}, title= {Evolutionary Programming Made Faster}, journal= {IEEE Transactions on Evolutionary Computation}, volume=3, month= {July}, number= 2, pages= {82--102}, year= 1999 ) @article( yule1899, author= {Yule, Undy G.}, title= {An Investigation into the Causes of Changes in Pauperism in England, Chiefly During the Last Two Intercensal Decades (Part I.)}, journal= {Journal of the Royal Statistical Society}, volume=62, number = 2, pages= {249--295}, year= 1899 ) @incollection( zaller2004, author= {Zaller, John R}, title= {Floating Voters in U.S.\ Presidential Elections, 1948--1996}, booktitle= {Studies in Public Opinion: Gauging Attitudes, Nonattitudes, Measurement Error and Change}, editor= {Willem Saris and Paul Sniderman}, publisher= pup, address= nj, year= "forthcoming" ) @book( zaller1992, author= {Zaller, John R}, title= {The Nature and Origins of Mass Opinion}, publisher= cup, address= ny, year= 1992 ) @unpublished( zaller1986, author= {Zaller, John R.}, title= {Analysis of Information Items in the 1985 NES Pilot Study}, note= {NES Pilot Study Report. Center for Political Studies, University of Michigan}, year= 1986 ) @unpublished( zaller1985, author= {Zaller, John R.}, title= {Proposal for the Measurement of Political Information}, note= {Report to the NES Board of Overseers. Center for Political Studies, University of Michigan}, year= 1985 ) @book( zakaria2003, author= {Zakaria, Fareed}, title= {The Future of Freedom: Illiberal Democracy at Home and Abroad}, publisher= {W. W. Norton}, address= {New York}, year= 2003 ) @article( zakaria1998, author= {Zakaria, Fareed}, title= {Doubts About Democracy}, journal= {Newsweek}, Month="January", day=5, year= 1998 ) @article( zakaria1997, author= {Zakaria, Fareed}, title= {The Rise of Illiberal Democracy}, journal= {Foreign Affairs}, volume=76, number=6, pages= {249--295}, year= 1997 ) @Article{Altman+McDonald:2011, author = {Micah Altman and Michael P. McDonald}, title = {\pkg{BARD}: Better Automated Redistricting}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @Article{Wand+King:2011, author = {Jonathan Wand and Gary King}, title = {\pkg{Anchors}: Software for Anchoring Vignette Data}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @Article{Sekhon:2011, author = {Jasjeet S. Sekhon}, title = {Multivariate and Propensity Score Matching Software with Automated Balance Optimization: The \pkg{Matching} Package for \proglang{R}}, journal = {Journal of Statistical Software}, year = {2011}, note = {Forthcoming}, url = {http://www.jstatsoft.org/} } @Manual{Rcore, title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2009}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org}, } @Comment LocalWords: apsr booktitle Finifter Zaller NES Iyengar Shanto Brehm @Comment LocalWords: AlvarezBrehm ajps HorvitzThompson Horvitz jasa ny kunsch @Comment LocalWords: MannWhitney Psychometrika Biometrika rubinMI Stefanski @Comment LocalWords: Cantoni Elvezio Ronchetti CarrollPederson Pederson jssrb @Comment LocalWords: copas jrssb sekhon glmRob Probit Fearon Laitin's althaus @Comment LocalWords: Bartels's MebaneSekhon Keisuke Geert ec Allyson Berent @Comment LocalWords: Krosnick Visser Boninger Hausman Kosuke Rosenbaum Bon Ai @Comment LocalWords: Kornhauser Jamieson hersh url huntington Zakaria Fareed @Comment LocalWords: zakaria rustow Dankwart Lipset geddes MacKuen Brunell @Comment LocalWords: BrunellNiNardo DiNardo Reweighting AldrichMcKelvey rubin @Comment LocalWords: McKelvey imbens abadie incollection dominguez nguez jop @Comment LocalWords: Chappell Ordeshook Lupia fishkin Subclassification Jong @Comment LocalWords: CochranRubin BertsimasTsitsiklis Bertsimas Dimitris Yung @Comment LocalWords: Tsitsiklis Kaufmann Quantile Ellipsoidally Galiani Segal @Comment LocalWords: Gertler Schargrodsky GalianiGertlerSchargrodsky Diprete @Comment LocalWords: DipreteEngelhardt Engelhardt herbert Winship Jin PKfit @Comment LocalWords: WinshipMorgan BowersHansen Pharmacokinetics Vinod aer @Comment LocalWords: McCulloughVinod SchacharNalebuff Shachar Nalebuff Hsin @Comment LocalWords: AltmanGillMcDonald Braumoeller Jasjeet ivivc vitro vivo @Comment LocalWords: IVIVC Hainmueller Synth Mebane GENetic @Comment LocalWords: GENOUD DiceOptim Ginsbourger Roustant @Comment LocalWords: Kriging rgenoud/vignettes/rgenoud.Rnw0000644000176200001440000021542713171743040016073 0ustar liggesusers\documentclass[nojss]{jss} \usepackage{amsmath} \usepackage{dcolumn} %%My declarations \newcommand{\hlink}{\htmladdnormallink} \newcommand{\MyPerp}{\perp \! \! \! \perp} \newcommand{\e}{\text{e-}} \newcolumntype{C}{>{$}c<{$}} \newcolumntype{L}{>{$}l<{$}} \newcolumntype{R}{>{$}r<{$}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% almost as usual \author{Walter R. Mebane, Jr. \\ University of Michigan \And Jasjeet S. Sekhon \\ UC Berkeley} %% for pretty printing and a nice hypersummary also set: \title{Genetic Optimization Using Derivatives: The \pkg{rgenoud} Package for \proglang{R}} \Plaintitle{Genetic Optimization Using Derivatives: The rgenoud Package for R} \Plainauthor{Walter R. Mebane, Jr., Jasjeet S. Sekhon} %% comma-separated \Shorttitle{\pkg{rgenoud}: Genetic Optimization Using Derivatives in \proglang{R}} %% an abstract and keywords \Abstract{ This introduction to the \proglang{R} package \pkg{rgenoud} is a modified version of \cite{MebaneJr.+Sekhon:2011}, published in the \textit{Journal of Statistical Software}. That version of the introduction contains higher resolution figures. \code{genoud} is an \proglang{R} function that combines evolutionary algorithm methods with a derivative-based (quasi-Newton) method to solve difficult optimization problems. \code{genoud} may also be used for optimization problems for which derivatives do not exist. \code{genoud} solves problems that are nonlinear or perhaps even discontinuous in the parameters of the function to be optimized. When the function to be optimized (for example, a log-likelihood) is nonlinear in the model's parameters, the function will generally not be globally concave and may have irregularities such as saddlepoints or discontinuities. Optimization methods that rely on derivatives of the objective function may be unable to find any optimum at all. Multiple local optima may exist, so that there is no guarantee that a derivative-based method will converge to the global optimum. On the other hand, algorithms that do not use derivative information (such as pure genetic algorithms) are for many problems needlessly poor at local hill climbing. Most statistical problems are regular in a neighborhood of the solution. Therefore, for some portion of the search space, derivative information is useful. The function supports parallel processing on multiple CPUs on a single machine or a cluster of computers.} \Keywords{genetic algorithm, evolutionary program, optimization, parallel computing, \proglang{R}} \Plainkeywords{genetic algorithm, evolutionary program, optimization, parallel computing, R} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: This needs to filled out ONLY IF THE PAPER WAS ACCEPTED. %% If it was not (yet) accepted, leave them commented. \Volume{42} \Issue{11} %\Month{September} \Year{2011} \Submitdate{2007-02-11} \Acceptdate{2007-11-21} %% The address of (at least) one author should be given %% in the following format: \Address{ Walter R. Mebane, Jr.\\ % Professor\\ Department of Political Science\\ Department of Statistics\\ University of Michigan\\ Ann Arbor, MI 48109-1045\\ E-mail: \email{wmebane@umich.edu}\\ URL: \url{http://www.umich.edu/~wmebane} \\ [2ex] Jasjeet S. Sekhon\\ Department of Political Science\\ Department of Statistics\\ 210 Barrows Hall \#1950\\ UC Berkeley\\ Berkeley, CA 94720-1950\\ E-mail: \email{sekhon@berkeley.edu}\\ URL: \url{http://sekhon.berkeley.edu} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \graphicspath{{Figures/}} \begin{document} \SweaveOpts{engine=R} %\VignetteIndexEntry{Using genoud} %\VignetteDepends{rgenoud} %\VignetteKeywords{rgenoud} %\VignettePackage{rgenoud} \section{Introduction} We developed the \proglang{R} package \pkg{rgenoud} to solve difficult optimization problems such as often arise when estimating nonlinear statistical models or solving complicated nonlinear, nonsmooth and even discontinuous functions.\footnote{The \pkg{rgenoud} software package is available from the Comprehensive \proglang{R} \citep{Rcore} Archive Network at \url{http://CRAN.R-project.org/package=rgenoud}.} Optimization difficulties often arise when the objective function (for instance, the log-likelihood) is a nonlinear function of the parameters. In such cases the function to be optimized is usually not globally concave. An objective function that is not globally concave may have multiple local optima, saddle points, boundary solutions or discontinuities. While the objective function for a statistical model is often concave in a neighborhood of the optimal solution, that neighborhood is often a small proportion of the parameter space of potential interest, and outside that neighborhood the function may be irregular. In such cases, methods of optimization that depend entirely on derivatives can be unreliable and often are virtually unusable. Newton-Raphson and quasi-Newton methods are among the commonly used optimization methods that rely completely on derivatives. Such methods work well when the function to be optimized is regular and smooth over the domain of parameter values that is of interest, but otherwise the methods often fail \citep{GillMurrayWright1981}. Even in models where such methods can be expected to work most of the time, resampling techniques such as the bootstrap \citep{EfronTibshirani1994} can generate resamples in which derivative-based optimization algorithms encounter severe difficulties. This is unfortunate because the methods most frequently used for optimization in problems of statistical estimation are entirely based on derivatives. The \pkg{rgenoud} package has been used by wide variety of users and developers. More than twelve \proglang{R} packages currently rely upon \pkg{rgenoud} including: \pkg{anchors} \citep[analyzing survey data with anchoring vignettes,][]{Wand+King:2011,WandKingLau2007,KingWand2007}; \pkg{BARD} \citep[automated redistricting,][]{Altman+McDonald:2011}; \pkg{boolean} \citep[boolean binary response models,][]{braumoeller2003,BraumoellerGoodrichKline2006}; \pkg{DiceOptim} \citep[kriging-based optimization for computer experiments,][]{DiceOptim}; \pkg{FAiR} \citep[factor analysis,][]{goodrich.fair}; \pkg{JOP} \citep[simultaneous optimization of multiple responses,][]{JOP}; \pkg{KrigInv} \citep[kriging-based inversion,][]{KrigInv}; \pkg{PKfit} \citep[data analysis in pharmacokinetics,][]{LeeLee2006}; \pkg{Matching} \citep[propensity score and multivariate matching,][]{SekhonMatching,Sekhon:2011}; \pkg{ivivc} \citep[in vitro-in vivo correlation modeling,][]{ivivc}; \pkg{multinomRob} \citep[robust multinomial models,][]{MebaneSekhon.multinomRob,MebaneSekhon2004}; and \pkg{Synth} \citep[synthetic control group method for comparative case studies,][]{AbadieGardeazabal2003,synth2008,Abadie+Diamond+Hainmueller:2011}. We present in Section \ref{sec:examples} an example using benchmark functions taken from \citet{yao.liu.lin1999}, followed by an example motivated by the \code{multinomRob} package. The benchmark suite includes functions that are high-dimensional, discontinuous or that have many local optima. The \code{multinomRob} package robustly estimates overdispersed multinomial regression models and uses \pkg{rgenoud} to solve a least quartile difference (LQD) generalized S-estimator \citep{MebaneSekhon2004}. The LQD is not a smooth function of the regression model parameters. The function is continuous, but the parameter space is finely partitioned by nondifferentiable boundaries. In another paper in this volume, the \pkg{Matching} package and its use of \pkg{rgenoud} are described in detail \citep{Sekhon:2011}. \pkg{Matching} provides functions for multivariate and propensity score matching and for finding optimal covariate balance based on a genetic search algorithm implemented in \pkg{rgenoud}. The search over optimal matches is discontinuous so no derivatives are used.\footnote{The \code{BFGS} option of \code{genoud} is set to \code{FALSE}, and the ninth operator which depends on derivatives is not used.} The search also involves lexical optimization which is a unique feature implemented in \pkg{rgenoud}.\footnote{Lexical optimization is useful when there are multiple fitness criteria; the parameters are chosen so as to maximize fitness values in lexical order---i.e., the second fit criterion is only considered if the parameters have the same fit for the first. See the \code{lexical} option and \citet{Sekhon:2011} for details. All of \code{genoud}'s options are described in the \proglang{R} help file for the function.} % If one wishes to use such a model, %significant optimization difficulties may need to be overcome. For %example, the estimating functions of all of the following models are %not in general globally concave: models with multivariate qualitative %variables, censoring or endogenous switching %\citep{maddala1983,amemiya1985}; linear covariance structures %\citep{bollen1989}; models for durations or transitions with %unobserved heterogeneity \citep{HeckmanSinger1985,lancaster1990}; %quasi-likelihood and extended quasi-likelihood models %\citep{McCullaghNelder1989} and systems based on such models %\citep{FahrmeirTutz1994}; and nonlinear simultaneous equation models %\citep{gallant1987}. For such models, optimization methods driven %entirely by derivatives are often unreliable. For some versions of %some of these models, algorithms such as EM that involve data %augmentation have been successfully applied to produce optimization %problems that derivative-based methods can solve %\citep[e.g.,][197]{lancaster1990}. The \pkg{rgenoud} package implements an updated and extended version of the \proglang{C} program \code{GENOUD} \citep{MebaneSekhon1997} described in \citep{SekhonMebane1998}. The many improvements include among other things the interface with \proglang{R}, which includes the ability to optimize functions written in \proglang{R}, options to optimize both floating point and integer-valued parameters, the ability to optimize loss functions which return multiple fitness values (lexical optimization), the ability to call \code{genoud} recursively, the ability to have the optimizer evaluate fits only for new parameter values, and the ability to use multiple computers, CPUs or cores to perform parallel computations. The \pkg{rgenoud} program combines an evolutionary algorithm with a quasi-Newton method. The quasi-Newton method is the Broyden-Fletcher-Goldfarb-Shanno (BFGS) method \citep[][119]{GillMurrayWright1981} implemented in \proglang{R}'s \code{optim} function. When the BFGS is being used, our program offers the option of using either \pkg{rgenoud}'s built-in numerical derivatives (which are based on code taken from \citealt[][337--344]{GillMurrayWright1981}) or user-supplied analytical derivatives.\footnote{User supplied derivatives may be provides via the \code{gr} option.} Our program can also work without the BFGS, in which case no derivatives are needed and the optimizer will work even when the function is discontinuous. The primary benefit from using derivatives is that the algorithm will then quickly find a local optimum when a current set of trial solution parameter values is in a smooth neighborhood of the local optimum point. Appropriate use of the BFGS can make the algorithm converge to the global optimum much more quickly. But premature or excessive use of the BFGS can prevent convergence to the global optimum.\footnote{The user can control whether \code{genoud} uses the BFGS at all (via the \code{BFGS} option), and if operators that use the BFGS are used (via the \code{P9} option), how often they are used.} As always, it is hazardous to rely on an optimizer's default settings. Our program does not eliminate the need for judgment, testing and patience. As Gill, Murray and Wright observe, ``there is no guaranteed strategy that will resolve every difficulty'' \citep[285]{GillMurrayWright1981}. In this article, we very briefly review the theory of random search algorithms that supports the assertion that \pkg{rgenoud} has a high probability of finding the global optimum when such exists. And we present three examples of how to use the \code{genoud} function: to optimize a simple but fiendish scalar Normal mixture model; to minimize a suite of benchmark functions that have previously been used to test evolutionary programming optimization algorithms; and to optimize a version of the only intermittently differentiable LQD estimator. Additional details on both the theory and performance of \code{genoud} can be found in our article that describes \code{GENOUD} \citep{SekhonMebane1998}. \section{Background on Genetic Optimization} An evolutionary algorithm (EA) uses a collection of heuristic rules to modify a population of trial solutions in such a way that each generation of trial values tends to be, on average, better than its predecessor. The measure for whether one trial solution is better than another is the trial solution's fitness value. In statistical applications, the fitness is a function of the summary statistic being optimized (e.g., the log-likelihood). \pkg{rgenoud} works for cases in which a solution is a vector of floating-point or integer numbers that serve as the parameters of a function to be optimized. The search for a solution proceeds via a set of heuristic rules, or \textit{operators}, each of which acts on one or more trial solutions from the current population to produce one or more trial solutions to be included in the new population. EAs do not require derivatives to exist or the function to be continuous in order find the global optimum. The EA in \pkg{rgenoud} is fundamentally a genetic algorithm (GA) in which the code-strings are vectors of numbers rather than bit strings, and the GA operators take special forms tuned for the floating-point or integer vector representation. A GA uses a set of randomized genetic operators to evolve a finite population of finite code-strings over a series of generations \citep{holland1975,goldberg1989,GrefenstetteBaker1989}. The operators used in GA implementations vary \citep{davis1991,FilhoTreleavenAlippi1994}, but in an analytical sense the basic set of operators can be defined as reproduction, mutation, crossover and inversion. The variation in these operators across different GA implementations reflects the variety of codes best suited for different applications. Reproduction entails selecting a code-string with a probability that increases with the code-string's fitness value. Crossover and inversion use pairs or larger sets of the selected code-strings to create new code-strings. Mutation randomly changes the values of elements of a single selected code-string. Used in suitable combinations, the genetic operators tend to improve average fitness of each successive generation, though there is no guarantee that average fitness will improve between every pair of successive generations. Average fitness may well decline. But theorems exist to prove that parts of the trial solutions that have above average fitness values in the current population are sampled at an exponential rate for inclusion in the subsequent population \citep[][139--140]{holland1975}. Each generation's population contains a biased sample of code-strings, so that a substring's performance in that population is a biased estimate of its average performance over all possible populations \citep{dejong1993,grefenstette1993}. The long-run properties of a GA may be understood by thinking of the GA as a Markov chain. A state of the chain is a code-string population of the size used in the GA. For code-strings of finite length and GA populations of finite size, the state space is finite. If such a GA uses random reproduction and random mutation, all states always have a positive probability of occurring. A finite GA with random reproduction and mutation is therefore approximately a finite and irreducible Markov chain.\footnote{\citet[][372--419]{feller1970} and \citet[][107--142]{billingsley1986} review the relevant properties of Markov chains. The randomness in an actual GA depends on the performance of pseudorandom number generators. This and the limitations of floating point arithmetic mean it is not literally true that an actual GA has a positive probability of reaching any state from any other state, and some states may in fact not be reachable from a given set of initial conditions.} An irreducible, finite Markov chain converges at an exponential rate to a unique stationary distribution \citep[][128]{billingsley1986}. This means that the probability that each population occurs rapidly converges to a constant, positive value. \citet{NixVose1992} and \citet{vose1993} use a Markov chain model to show that in a GA where the probability that each code-string is selected to reproduce is proportional to its observed fitness, the stationary distribution strongly emphasizes populations that contain code-strings that have high fitness values. They show that asymptotic in the population size---i.e., in the limit for a series of GAs with successively larger populations---populations that have suboptimal average fitness have probabilities approaching zero in the stationary distribution, while the probability for the population that has optimal average fitness approaches one. If $k>1$ populations have optimal average fitness, then in the limiting stationary distribution the probability for each approaches $1/k$. The theoretical results of Nix and Vose imply that a GA's success as an optimizer depends on having a sufficiently large population of code-strings. If the GA population is not sufficiently large, then the Markov chain that the GA approximately implements is converging to a stationary distribution in which the probabilities of optimal and suboptimal states are not sharply distinguished. Suboptimal populations can be as likely to occur as optimal ones. If the stationary distribution is not favorable, the run time in terms of generations needed to produce an optimal code-string will be excessive. For all but trivially small state spaces, an unfavorable stationary distribution can easily imply an expected running time in the millions of generations. But if the stationary distribution strongly emphasizes optimal populations, relatively few generations may be needed to find an optimal code-string. In general, the probability of producing an optimum in a fixed number of generations tends to increase with the GA population size. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{enumerate} \item[\code{P1}] Cloning. Copy $\mathbf{X}_{t}$ into the next generation, $\mathbf{X}_{t+1}$. \item[\code{P2}] Uniform Mutation. At random choose $i\in\mathbf{N}$. Select a value $\tilde{x}_i \sim U(\underline{x}_i, \overline{x}_i)$. Set $X_i=\tilde{x}_i$. \item[\code{P3}] Boundary Mutation. At random choose $i\in\mathbf{N}$. Set either $X_i=\underline{x}_i$ or $X_i=\overline{x}_i$, with probability $1/2$ of using each value. \item[\code{P4}] Non-uniform Mutation. At random choose $i\in\mathbf{N}$. Compute $p = (1-t/T)^B u$, where $t$ is the current generation number, $T$ is the maximum number of generations, $B>0$ is a tuning parameter and $u \sim U(0,1)$. Set either $X_i=(1-p)x_i + p\underline{x}_i$ or $X_i=(1-p)x_i + p\overline{x}_i$, with probability $1/2$ of using each value. \item[\code{P5}] Polytope Crossover. Using $m=\max(2,n)$ vectors $\mathbf{x}$ from the current population and $m$ random numbers $p_j\in(0,1)$ such that $\sum_{j=1}^m p_j = 1$, set $\mathbf{X} = \sum_{j=1}^m p_j \mathbf{x}_j$. \item[\code{P6}] Simple Crossover. Choose a single integer $i$ from $\mathbf{N}$. Using two parameter vectors, $\mathbf{x}$ and $\mathbf{y}$, set $X_i = p x_i + (1-p) y_i$ and $Y_i = p y_i + (1-p) x_i$, where $p\in(0,1)$ is a fixed number. \item[\code{P7}] Whole Non-uniform Mutation. Do non-uniform mutation for all the elements of $\mathbf{X}$. \item[\code{P8}] Heuristic Crossover. Choose $p \sim U(0,1)$. Using two parameter vectors, $\mathbf{x}$ and $\mathbf{y}$, compute $\mathbf{z} = p(\mathbf{x} - \mathbf{y}) + \mathbf{x}$. If $\mathbf{z}$ satisfies all constraints, use it. Otherwise choose another $p$ value and repeat. Set $\mathbf{z}$ equal to the better of $\mathbf{x}$ and $\mathbf{y}$ if a satisfactory mixed $\mathbf{z}$ is not found by a preset number of attempts. In this fashion produce two $\mathbf{z}$ vectors. \item[\code{P9}] Local-minimum Crossover. Choose $p \sim U(0,1)$. Starting with $\mathbf{x}$, run BFGS optimization up to a preset number of iterations to produce $\mathbf{\tilde{x}}$. Compute $\mathbf{z} = p\mathbf{\tilde{x}} + (1-p)\mathbf{x}$. If $\mathbf{z}$ satisfies boundary constraints, use it. Otherwise shrink $p$ by setting $p = p/2$ and recompute $\mathbf{z}$. If a satisfactory $\mathbf{z}$ is not found by a preset number of attempts, return $\mathbf{x}$. This operators is extremely computationally intensive, use sparingly. \end{enumerate} \begin{flushleft} Notation: \\ [2ex] $\mathbf{X} =\begin{bmatrix}X_1,\dots,X_n\end{bmatrix}$ is the vector of $n$ parameters $X_i$. $\underline{x}_i$ is the lower bound and $\overline{x}_i$ is the upper bound on values for $X_i$. $x_i$ is the current value of $X_i$, and $\mathbf{x}$ is the current value of $\mathbf{X}$. $\mathbf{N} = \{1,\dots,n\}$. $p \sim U(0,1)$ means that $p$ is drawn from the uniform distribution on the $[0,1]$ interval. \end{flushleft} \caption{`genoud' Operators. Adapted from \citet{SekhonMebane1998}.} \label{tab:operators} \begin{center} \line(1,0){450} \end{center} \end{table} The evolutionary algorithm in \pkg{rgenoud} uses nine operators that are listed in Table~\ref{tab:operators}. The operators extend and modify a set of operators used in \code{GENOCOP} \citep{MichalewiczSwaminathanLogan1993, Michalewicz1992}. The operators are numbered using syntax matching that used to refer to them by \pkg{rgenoud}. The \textit{cloning} operator simply makes copies of the best trial solution in the current generation (independent of this operator, \pkg{rgenoud} always retains one instance of the best trial solution). The \textit{uniform mutation}, \textit{boundary mutation} and \textit{non-uniform mutation} operators act on a single trial solution. Uniform mutation changes one parameter in the trial solution to a random value uniformly distributed on the domain specified for the parameter. Boundary mutation replaces one parameter with one of the bounds of its domain. Non-uniform mutation shrinks one parameter toward one of the bounds, with the amount of shrinkage decreasing as the generation count approaches the specified maximum number of generations. \textit{Whole non-uniform mutation} does non-uniform mutation for all the parameters in the trial solution. \textit{Heuristic crossover} uses two trial solutions to produce a new trial solution located along a vector that starts at one trial solution and points away from the other one. \textit{Polytope crossover} (inspired by simplex search, \citealt[][94--95]{GillMurrayWright1981}) computes a trial solution that is a convex combination of as many trial solutions as there are parameters. \textit{Simple crossover} computes two trial solutions from two input trial solutions by swapping parameter values between the solutions after splitting the solutions at a randomly selected point. This operator can be especially effective if the ordering of the parameters in each trial solution is consequential. \textit{Local-minimum crossover} computes a new trial solution in two steps: first it does a preset number of BFGS iterations starting from the input trial solution; then it computes a convex combination of the input solutions and the BFGS iterate. \section{Examples} \label{sec:examples} The only function in the \pkg{rgenoud} package is \code{genoud}. The interface of this function is similar to that of the \code{optim} function in \proglang{R}. But the function has many additional arguments that control the behavior of the evolutionary algorithm. \subsection{Asymmetric Double Claw:} Our first example, which we also studied in \citet{SekhonMebane1998}, is a normal mixture called the Asymmetric Double Claw (ADC). We plot the function in Figure~\ref{fig:mixture1}. \begin{figure} \caption{Normal Mixture: Asymmetric Double Claw} \vspace{-.5in} \label{fig:mixture1} \begin{center} \includegraphics{fig1.pdf} \end{center} \vspace{-.7in} \end{figure} Mathematically, this mixture is defined as \begin{eqnarray} \label{eq:adclaw} f_{\mathrm{ADC}} & = \sum_{m=0}^{1} \frac{46}{100} \mathrm{N}\left(2m-1,\frac{2}{3}\right) + \sum_{m=1}^{3} \frac{1}{300} \mathrm{N}\left(\frac{-m}{2},\frac{1}{100}\right) + \sum_{m=1}^{3} \frac{7}{300} \mathrm{N}\left(\frac{m}{2},\frac{7}{100}\right), \end{eqnarray} where N is the normal density. The asymmetric double claw is difficult to maximize because there are many local solutions. There are five local maxima in Figure \ref{fig:mixture1}. Standard derivative-based optimizers would simply climb up the hill closest to the starting value. To optimize this normal mixture we must first create a function for it <>= claw <- function(xx) { x <- xx[1] y <- (0.46*(dnorm(x,-1.0,2.0/3.0) + dnorm(x,1.0,2.0/3.0)) + (1.0/300.0)*(dnorm(x,-0.5,.01) + dnorm(x,-1.0,.01) + dnorm(x,-1.5,.01)) + (7.0/300.0)*(dnorm(x,0.5,.07) + dnorm(x,1.0,.07) + dnorm(x,1.5,.07))) return(y) } @ And we now make a call to \pkg{rgenoud} using this function: <>= library("rgenoud") claw1 <- genoud(claw, nvars=1, max=TRUE, pop.size=3000) @ The first argument of \code{genoud} is the function to be optimized. The first argument of that function must be the vector of parameters over which optimizing is to occur. Generally, the function should return a scalar result.\footnote{The function to be optimized may return a vector if one wishes to do lexical optimization. Please see the \code{lexical} option to \code{genoud}.} The second argument of \code{genoud} in this example (\code{nvars}) is the number of variables the function to be optimized takes. The third argument, \code{max=TRUE}, tells \code{genoud} to maximize the function instead of its default behavior which is to minimize. The fourth option \code{pop.size} controls the most important part of the evolutionary algorithm, the population size. This is the number of individuals \code{genoud} uses to solve the optimization problem. As noted in the theoretical discussion, the theorems related to evolutionary algorithms are asymptotic in the population size so larger is generally better but obviously takes longer. The maximum solution of the double claw density is reliably found by \code{genoud} even using the default value of \code{pop.size=1000}. Reliability does increase as the \code{pop.size} is made larger. Unfortunately, because of the stochastic nature of the algorithm, it is impossible to generally answer the question of what is the best population size to use. Other options determine the maximum number of generations the evolutionary algorithm computes. These options are \code{max.generations}, \code{wait.generations} and \code{hard.generation.limit}. The specified termination point also affects how some of the operators perform: the two non-uniform mutation operators introduce smaller ranges of variation in the trial solutions as the generation count approaches the specified \code{max.generations} value. There are many more options that can be used to fine-tune the behavior of the algorithm. The output printed by \code{genoud} is controlled by a \code{print.level} argument. The default value, \code{print.level=2}, produces relatively verbose output that gives extensive information about the set of operators being used and the progress of the optimization. Normally \proglang{R} conventions would suggest setting the default to be \code{print.level=0}, which would suppress output to the screen, but because \code{genoud} runs may take a long time, it can be important for the user to receive some feedback to see the program has not died and to be able to see where the program got stuck if it eventually fails to make adequate progress. The output printed by the preceding invocation of \code{genoud}, which uses the default value for a \code{print.level} argument, is as follows. \begin{CodeChunk} \begin{CodeOutput} Fri Feb 9 19:33:42 2007 Domains: -1.000000e+01 <= X1 <= 1.000000e+01 Data Type: Floating Point Operators (code number, name, population) (1) Cloning........................... 372 (2) Uniform Mutation.................. 375 (3) Boundary Mutation................. 375 (4) Non-Uniform Mutation.............. 375 (5) Polytope Crossover................ 375 (6) Simple Crossover.................. 376 (7) Whole Non-Uniform Mutation........ 375 (8) Heuristic Crossover............... 376 (9) Local-Minimum Crossover........... 0 HARD Maximum Number of Generations: 100 Maximum Nonchanging Generations: 10 Population size : 3000 Convergence Tolerance: 1.000000e-03 Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation. Checking Gradients before Stopping. Using Out of Bounds Individuals. Maximization Problem. GENERATION: 0 (initializing the population) Fitness value... 4.112017e-01 mean............ 4.990165e-02 variance........ 9.708147e-03 #unique......... 3000, #Total UniqueCount: 3000 var 1: best............ 9.966758e-01 mean............ 3.453097e-02 variance........ 3.373681e+01 GENERATION: 1 Fitness value... 4.113123e-01 mean............ 2.237095e-01 variance........ 2.566140e-02 #unique......... 1858, #Total UniqueCount: 4858 var 1: best............ 9.995043e-01 mean............ 4.615946e-01 variance........ 7.447887e+00 [...] GENERATION: 10 Fitness value... 4.113123e-01 mean............ 2.953888e-01 variance........ 2.590842e-02 #unique......... 1831, #Total UniqueCount: 21708 var 1: best............ 9.995033e-01 mean............ 8.403935e-01 variance........ 5.363241e+00 GENERATION: 11 Fitness value... 4.113123e-01 mean............ 2.908561e-01 variance........ 2.733896e-02 #unique......... 1835, #Total UniqueCount: 23543 var 1: best............ 9.995033e-01 mean............ 8.084638e-01 variance........ 6.007372e+00 'wait.generations' limit reached. No significant improvement in 10 generations. Solution Fitness Value: 4.113123e-01 Parameters at the Solution (parameter, gradient): X[ 1] : 9.995033e-01 G[ 1] : -6.343841e-09 Solution Found Generation 1 Number of Generations Run 11 Fri Feb 9 19:33:45 2007 Total run time : 0 hours 0 minutes and 3 seconds \end{CodeOutput} \end{CodeChunk} %DESCRIBE OUTPUT After printing the date and time of the run, the program prints the domain of values it is allowing for each parameter of the function being optimized. In this case the default domain values are being used. Naturally it is important to specify domains wide enough to include the solution. In practice with highly nonlinear functions it is often better to specify domains that are relatively wide than to have domains that narrowly and perhaps even correctly bound the solution. This surprising behavior reflects the fact with a highly nonlinear function, a point that is close to the solution in the sense of simple numerical proximity may not be all that close in the sense of there being a short feasible path to get to the solution. Next the program prints the Data Type. This indicates whether the parameters of the function to be optimized are being treated as floating point numbers or integers. For more information about this, see the \code{data.type.int} argument. The program then displays the number of operators being used, followed by the values that describe the other characteristics set for this particular run: the maximum number of generations, the population size and the tolerance value to be used to determine when the parameter values will be deemed to have converged. The output then reports whether BFGS optimization will be applied to the best trial solution produced by the operators in each generation. For problems that are smooth and concave in a neighborhood of the global optimum, using the BFGS in this way can help \code{genoud} quickly converge once the best trial solution is in the correct neighborhood. This run of \code{genoud} will also compute the gradient at the best trial solution before stopping. In fact this gradient checking is used as a convergence check. The algorithm will not start counting its final set of generations (the \code{wait.generations}) until each element of the gradient is smaller in magnitude than the convergence tolerance. Gradients are never used and BFGS optimization is not used when the parameters of the function to be optimized are integers. The next message describes how strictly \code{genoud} is enforcing the boundary constraints specified by the domain values. By default (\code{boundary.enforcement=0}), the trial solutions are allowed to wander freely outside the boundaries. The boundaries are used only to define domains for those operators that use the boundary information. Other settings of the \code{boundary.enforcement} argument induce either more stringent or completely strict enforcement of the boundary constraints. Notice that the boundary constraints apply to the parameters one at a time. To enforce constraints that are defined by more complicated functional or data-dependent relationships, one can include an appropriate penalty function as part of the definition of the function to be optimized, letting that function define an extremely high (if minimizing) or low (if maximizing) value to be returned if the desired conditions are violated. After reporting whether it is solving a minimization or a maximization problem, \code{genoud} reports summary statistics that describe the distribution of the fitness value and the parameter values across the trial solutions at the end of each generation. In the default case where \code{genoud} is keeping track of all the distinct solutions considered over the whole course of the optimizing run, these generational reports also include a report of the number of unique trial solutions in the current population and the number of unique solutions ever considered. The benefit of keeping track of the solutions is to avoid repeatedly evaluating the function being optimized for the identical set of parameter values. This can be an important efficiency when function evaluations are expensive, as they can be in statistical applications where the data are extensive. This tracking behavior is controlled by the \code{MemoryMatrix} argument. Upon convergence, or when the hard maximum generation limit is reached, the program prints the fitness value at the best trial solution and that solution's parameter values. In this case the solution was found after one generation. While the Asymmetric Double Claw might present a difficult challenge for a gradient-based optimizer that uses only local hill climbing, it is an almost trivially simple problem for \code{genoud}. \subsection{Benchmark Functions:} The second example is a suite of 23 benchmark nonlinear functions used in \citet{yao.liu.lin1999} to study a pair of evolutionary programming optimization algorithms. Function definitions are in Table~\ref{tab:23funcs}. Because it includes a random component and so lacks a reproducible minimum value, we ignore the function numbered function 7 in their sequence.\footnote{The omitted function is $\sum_{i=1}^n ix_i^4 +U(0,1)$, where $U(0,1)$ is a uniformly distributed random variable on the unit interval that takes a new value whenever the function is evaluated. This stochastic aspect means that even given the set of parameters that minimize the nonstochastic component $\sum_{i=1}^n ix_i^4$, i.e., $x_i=0$, the value of the function virtually never attains the minimum possible value of zero. An optimizer that evaluated the function at $x_i=0$ would not in general obtain a function value smaller than the function value obtained for a wide range of different parameter values. Hence we do not consider this function to be a good test for function optimization algorithms.} Implementations of these functions are available in the supplemental \proglang{R} file provided with this article.\footnote{This supplemental file is available at \url{http://sekhon.berkeley.edu/rgenoud/func23.R}.} These \proglang{R} definitions include the values of the constants used in functions 14, 15 and 19 through 23. The function argument domains are restricted to the specific domains used by \citet{yao.liu.lin1999} via bounds that are stated in the list named \code{testbounds} in the supplemental file. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{tabular}{LLLL} \text{func.} & \text{definition} & n & \text{minimum}^a \\ 1 & \sum_{i=1}^n x_i^2 & 30 & 0 \\ 2 & \sum_{i=1}^n |x_i| + \prod_{i=1}^n |x_i| & 30 & 0 \\ 3 & \sum_{i=1}^n (\sum_{j=1}^i x_j)^2 & 30 & 0 \\ 4 & \max_i \{|x_i|, 1\leq i\leq n\} & 30 & 0 \\ 5 & \sum_{i=1}^{n-1} [100(x_{i+1}-x_i^2)^2 +(x_i-1)^2], & 30 & 0 \\ 6 & \sum_{i=1}^n (\lfloor x_i + 0.5\rfloor)^2 & 30 & 0 \\ 7 & \sum_{i=1}^n ix_i^4 +U(0,1) & 30 & 0 \\ 8 & \sum_{i=1}^n -x_i\sin(\sqrt{|x_i|}) & 30 & -12569.5 \\ 9 & \sum_{i=1}^n [x_i^2-10\cos(2\pi x_i)+10] & 30 & 0 \\ 10 & -20\exp\left(-0.2\sqrt{n^{-1}\sum_{i=1}^n x_i^2}\,\right) \\ & \qquad -\exp(n^{-1}\sum_{i=1}^n\cos 2\pi x_i)+20+e & 30 & 0 \\ 11 & (1/1000) \sum_{i=1}^n x_i^2 - \prod_{i=1}^n\cos\left(x_i/\sqrt{i}\right) + 1 & 30 & 0 \\ 12 & n^{-1}\pi \left\{10 \sin^2(\pi y_1)+\sum_{i=1}^{n-1}(y_i-1)^2 [1+10\sin^2(\pi y_{i+1})]+(y_n-1)^2\right\} \\ & \quad +\sum_{i=1}^n u(x_i,10,100,4), & 30 & 0 \\ & y_i=1+(x_i+1)/4, \quad u(x_i,a,k,m)=\begin{cases} k(x_i-a)^m, & x_i>a, \\ 0, & -a\leq x_i\leq a,\\ k(-x_i-a)^m, & x_i<-a, \end{cases} & \\ 13 & \left\{ \sin^2(3\pi x_1)+\sum_{i=1}^{n-1}(x_i-1)^2[1+\sin^2(3\pi x_{i+1})]\right\}/10 \\ & \quad +(x_n-1)[1+\sin^2(2\pi x_n)]/10 +\sum_{i=1}^n u(x_i,5,100,4) & 30 & 0 \\ 14 & \left\{1/500+ \sum_{j=1}^{25} 1/\left[j+\sum_{i=1}^2(x_i-a_{ij})^6\right]\right\}^{-1} & 2 & 1 \\ 15 & \sum_{i=1}^{11} [a_i-x_1(b_i^2+b_ix_2)/(b_i^2+b_ix_3+x_4)]^2 & 4 & 0.0003075 \\ 16 & 4x_1^2-2.1x_1^4+x_1^6/3+x_1x_2-4x_2^2+4x_2^4 & 2 & -1.0316285 \\ 17 & [x_2-5.1x_1^2/(4\pi^2) + 5x_1/\pi - 6]^2 + 10[1-1/(8\pi)]\cos(x_1) + 10 & 2 & 0.398 \\ 18 & [1+(x_1+x_2+1)^2(19-14 x_1+3 x_1^2-14 x_2+6 x_1 x_2+3 x_2^2)] \\ & \quad \times [30+(2 x_1-3 x_2)^2 (18-32 x_1+12 x_1^2+48 x_2-36 x_1 x_2+27 x_2^2)] & 2 & 3 \\ 19 & -\sum_{i=1}^4 c_i\exp\left[-\sum_{j=1}^4 a_{ij}(x_i-p_{ij})^2\right] & 4 & -3.86 \\ 20 & -\sum_{i=1}^4 c_i\exp\left[-\sum_{j=1}^6 a_{ij}(x_i-p_{ij})^2\right] & 6 & -3.32 \\ 21 & \sum_{i=1}^5 [(x-a_i)^{\prime}(x-a_i)+c_i]^{-1} & 4 & -10 \\ 22 & \sum_{i=1}^7 [(x-a_i)^{\prime}(x-a_i)+c_i]^{-1} & 4 & -10 \\ 23 & \sum_{i=1}^{10} [(x-a_i)^{\prime}(x-a_i)+c_i]^{-1} & 4 & -10 \end{tabular} \begin{flushleft} Notes: $^a$Minimum function value within specified bounds as given by \citet[85]{yao.liu.lin1999}. \end{flushleft} \vspace*{.1in} \caption{23 Benchmark Functions} \label{tab:23funcs} \begin{center} \line(1,0){450} \end{center} \end{table} As \citet{yao.liu.lin1999} describe, optimizing each of functions 1--13 presents a high-dimensional problem. These functions each have $n=30$ free parameters. Functions 1--5 are unimodal, with function 5 being a 30-dimensional version of the banana-shaped Rosenbrock function. Function 6 is a step function. Function 6 has one minimum value that occurs when all arguments are in the interval $x_i\in[0,.5)$, and the function is discontinuous. Functions 8--13 are multimodal, defined such that the number of local minima increases exponentially with the number of arguments. \citet[84]{yao.liu.lin1999} describe these functions as among ``the most difficult class of problems for many optimization algorithms (including [evolutionary programming]).'' Functions 14--23, which have between two and six free parameters each, each have only a few local minima. Nonetheless the evolutionary programming algorithms considered by \citet{yao.liu.lin1999} have trouble optimizing functions 21--23. Although \citet[85]{yao.liu.lin1999} state that each of these functions has a minimum value of $-10$, over 50 replications the two algorithms they consider achieve solutions averaging between $-5.52$ and $-9.10$ \citep[88, Table~IV]{yao.liu.lin1999}. We use these benchmark functions to illustrate not only how effective \code{genoud} can be with a range of difficult problems, but also to emphasize an important aspect of how one should think about trying to tune the optimizer's performance. Theory regarding genetic algorithms suggests that optimal solutions are more likely to appear as both the population size of candidate solutions and the number of generations increase. In \code{genoud} two arguments determine the number of generations. One is \code{max.generations}: if \code{hard.generation.limit=TRUE}, then the value specified for \code{max.generations} is a binding upper limit. The other is \code{wait.generations}, which determines when the algorithm terminates if \code{hard.generation.limit=FALSE}. But even if \code{hard.generation.limit=TRUE}, then \code{wait.generations} determines for how many generations the algorithm continues once the best parameter vector and the value of the function being optimized appear to have settled down. The fact that the current best solution is not changing should not be treated as decisive, because this solution may be merely a local optimum or a saddlepoint. If the population size is sufficient, the algorithm tends to build a population of trial solutions that contain parameters in neighborhoods of all the competitive local optima in the domain defined by the parameter boundaries. Even while the current best solution is stable, the algorithm is improving the solutions near other local optima. So having a higher \code{wait.generations} value never worsens the algorithm's efficacy. Increasing \code{max.generations} may or may not in itself improve optimization. The value of \code{max.generations} sets the value of $T$ used in the mutation operators---operators 4 and 7 in Table~\ref{tab:operators}. These mutation operators perform random search near a trial solution that has been selected for mutation only when the current generation count is an appreciable fraction of $T$. So increasing \code{max.generations} without changing \code{wait.generations} increases the period during which random search is occurring over a wider domain. For multimodal functions such a wider search may be helpful, but sometimes failing to search more densely near the current trial solutions is not good. We use \code{genoud} to minimize the 23 functions using two values for \code{pop.size} (5000 and 10000) and two values for \code{max.generations} (30 and 100). Following \citet{yao.liu.lin1999}, we replicate each optimization 50 times. The following code describes the computations. The list \code{testfuncs}, vector \code{testNparms} and list \code{testbounds} are defined in the supplemental \proglang{R} file, and it is assume that this file is loaded with the \code{source("supplemental.R")} command. The vector \code{gradcheck} is true for all elements except the ones corresponding to functions 6 and 7. <>= source("supplemental.R") gradcheck <- rep(TRUE,23) gradcheck[6:7] <- FALSE sizeset <- c(5000,10000) genset <- c(30,100) nreps <- 50 gsarray <- array(NA, dim=c(length(sizeset), length(genset), 23, nreps)) asc <- function(x) { as.character(x) } dimnames(gsarray) <- list(asc(sizeset), asc(genset), NULL, NULL); for (gsize in sizeset) { for (ngens in genset) { for (i in 1:23) { for (j in 1:nreps) { gsarray[as.character(gsize), as.character(ngens),i,j] <- genoud(testfuncs[[i]], nvars=testNparms[i], pop.size=gsize, max.gen=ngens, hard.gen=TRUE, Domains=testbounds[[i]], solution.tol=1e-6, boundary=1, gradient.check=gradcheck[i], print=0)$value } } } } @ Using \code{genoud} to minimize the benchmark functions produces excellent results, at least when the \code{pop.size} and \code{max.generations} arguments are sufficiently large. Table~\ref{tab:23mean} reports the mean function values for each configuration of the arguments. These values may be compared both to the true function minima given by \citet{yao.liu.lin1999} (see the rightmost column in Table~\ref{tab:23funcs}) and to the average minimum function values \citet{yao.liu.lin1999} report for their ``fast'' evolutionary programming (FEP) algorithm, which appear in the last column of Table~\ref{tab:23mean}. The \code{genoud} averages for the \code{max.gen=100} configurations equal or are close to the true minima for all the functions except function 13. One can reasonably argue that the average solutions for function 5 are not as close to zero as might be desired: these averages are close to $10^{-7}$, while the averages for other functions that have a true minimum of zero are $10^{-15}$ or smaller. And the averages for functions 6, 12 and 15 in the \code{pop.size=5000} case are off. The effect of increasing \code{pop.size} is apparent with respect to both those three functions and also functions 13 and 20--23: the average minima are smaller with \code{pop.size=10000} than with \code{pop.size=5000}. Except for functions 6 and 12 in the \code{pop.size=5000} case and function 13, all the \code{genoud} solution averages for \code{max.gen=100} are either slightly or substantially better than the corresponding FEP solution averages. The results in Table~\ref{tab:23mean} clearly illustrate the potential consequences of not allowing \code{genoud} to run for a sufficient number of generations. While some of the \code{genoud} solutions for \code{max.gen=30} have competitive means, several of the means are not good at all. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{tabular}{llllll} & \multicolumn{4}{c}{\code{genoud}} & \\ \cline{2-5} & \multicolumn{2}{c}{\code{pop.size=5000}$^a$} & \multicolumn{2}{c}{\code{pop.size=10000}$^a$} & \\ \text{func.} & \code{max=30} & \code{max=100} & \code{max=30} & \code{max=100} & \text{FEP}$^b$ \\ 1 & 1.453\e 32 & 1.658\e 32 & 2.416\e 32 & 6.134\e 32 & 5.7\e 4 \\ 2 & 6.55\e 16 & 7.212\e 16 & 9.652\e 16 & 1.043\e 15 & 8.1\e 3 \\ 3 & 4.633\e 18 & 3.918\e 18 & 3.787\e 18 & 4.032\e 18 & 1.6\e 2 \\ 4 & 6.203\e 17 & 6.542\e 17 & 9.453\e 17 & 7.85\e 17 & 0.3 \\ 5 & 0.07973 & 5.887\e 08 & 8.133\e 08 & 8.917\e 08 & 5.06 \\ 6 & 18.58 & 0.08 & 9.38 & 0 & 0 \\ % 7 & 0.1114 & 0.07473 & 0.1114 & 0.06466 & 7.6\e 3 \\ 8 & -12569.49 & -12569.49 & -12569.49 & -12569.49 & -12554.5 \\ 9 & 2.786 & 0 & 0.9353 & 0 & 4.6\e 2 \\ 10 & 2.849 & 3.997\e 15 & 2.199 & 3.997\e 15 & 1.8\e 2 \\ 11 & 7.994\e 17 & 7.105\e 17 & 9.548\e 17 & 6.439\e 17 & 1.6\e 2 \\ 12 & 5.371\e 19 & 0.004147 & 0.002073 & 1.178\e 19 & 9.2\e 6 \\ 13 & 0.02095 & 0.006543 & 0.006629 & 0.003011 & 1.6\e 4 \\ 14 & 0.998 & 0.998 & 0.998 & 0.998 & 1.22 \\ 15 & 0.0003441 & 0.0004746 & 0.0003807 & 0.0003807 & 5.0\e 4 \\ 16 & -1.0316285 & -1.0316285 & -1.0316285 & -1.0316285 & -1.03 \\ 17 & 0.3979 & 0.3979 & 0.3979 & 0.3979 & 0.398 \\ 18 & 3 & 3 & 3 & 3 & 3.02 \\ 19 & -3.863 & -3.863 & -3.863 & -3.863 & -3.86 \\ 20 & -3.274 & -3.277 & -3.279 & -3.286 & -3.27 \\ 21 & -9.85 & -9.444 & -9.95 & -10.05 & -5.52 \\ 22 & -9.771 & -10.09 & -10.19 & -10.3 & -5.52 \\ 23 & -10.1 & -9.997 & -10.32 & -10.21 & -6.57 \end{tabular} \begin{flushleft} Note: $^b$Average minimum function values (over 50 replications) obtained using \code{genoud}. $^a$Mean best function values (over 50 replications) reported for the ''fast'' evolutionary programming algorithm, from \citet[85 and 88, Tables II--IV]{yao.liu.lin1999}. \end{flushleft} \vspace*{.1in} \caption{Mean Values of 22 Optimized Functions} \label{tab:23mean} \begin{center} \line(1,0){450} \end{center} \end{table} The effect of increasing \code{pop.size} are even more clearly apparent in Table~\ref{tab:23sdev}, which reports the standard deviations of the respective minima across the 50 replications. With the exceptions of functions 6, 12, 13, 15 and 21 with \code{pop.size=5000}, the \code{genoud} solutions for \code{max.gen=100} vary much less than the corresponding FEP solutions. For those functions and also for functions 20, 22 and 23, the \code{max.gen=100} solutions with \code{pop.size=10000} vary noticeably less than the solutions with \code{pop.size=5000}. \begin{table} \begin{center} \line(1,0){450} \end{center} \begin{tabular}{llllll} & \multicolumn{4}{c}{\code{genoud}} & \\ \cline{2-5} & \multicolumn{2}{c}{\code{pop.size=5000}$^a$} & \multicolumn{2}{c}{\code{pop.size=10000}$^a$} & \\ \text{func.} & \code{max=30} & \code{max=100} & \code{max=30} & \code{max=100} & \text{FEP}$^b$ \\ 1 & 9.997\e 32 & 7.059\e 32 & 9.562\e 32 & 2.1\e 31 & 1.3\e 4 \\ 2 & 1.668\e 15 & 1.621\e 15 & 2.116\e 15 & 2.102\e 15 & 7.7\e 4 \\ 3 & 4.568\e 18 & 3.342\e 18 & 4.38\e 18 & 5.136\e 18 & 1.4\e 2 \\ 4 & 1.793\e 16 & 1.758\e 16 & 2.055\e 16 & 2.002\e 16 & 0.5 \\ 5 & 0.5638 & 4.921\e 08 & 5.573\e 08 & 4.955\e 08 & 5.87 \\ 6 & 5.65 & 0.274 & 3.528 & 0 & 0 \\ % 7 & 0.0837 & 0.05153 & 0.08042 & 0.04883 & 2.6\e 3 \\ 8 & 3.749\e 10 & 1.071\e 12 & 8.948\e 09 & 6.365\e 13 & 52.6 \\ 9 & 1.864 & 0 & 1.179 & 0 & 1.2\e 2 \\ 10 & 0.7146 & 0 & 0.702 & 0 & 2.1\e 3 \\ 11 & 1.209\e 16 & 1.582\e 16 & 1.289\e 16 & 8.713\e 17 & 2.2\e 2 \\ 12 & 2.336\e 18 & 0.02052 & 0.01466 & 7.423\e 19 & 3.6\e 6 \\ 13 & 0.03427 & 0.006867 & 0.006903 & 0.001508 & 7.3\e 5 \\ 14 & 5.638\e 12 & 8.894\e 11 & 1.029\e 12 & 4.35\e 12 & 0.56 \\ 15 & 0.0001813 & 0.0003546 & 0.000251 & 0.0002509 & 3.2\e 4 \\ 16 & 1.315\e 14 & 9.751\e 15 & 1.233\e 14 & 1.054\e 14 & 4.9\e 7 \\ 17 & 5.422\e 15 & 5.51\e 15 & 4.925\e 15 & 1.392\e 14 & 1.5\e 7 \\ 18 & 1.509\e 13 & 3.477\e 14 & 6.18\e 14 & 2.907\e 14 & 0.11 \\ 19 & 7.349\e 15 & 1.521\e 15 & 1.344\e 14 & 7.255\e 15 & 1.4\e 5 \\ 20 & 0.05884 & 0.0583 & 0.05765 & 0.05504 & 5.9\e 2 \\ 21 & 1.212 & 1.776 & 1.005 & 0.7145 & 1.59 \\ 22 & 1.937 & 1.269 & 1.052 & 0.7459 & 2.12 \\ 23 & 1.479 & 1.636 & 1.066 & 1.29 & 3.14 \end{tabular} \begin{flushleft} Note: $^a$Standard deviation of the minimum function values (over 50 replications) obtained using \code{genoud}. $^b$Standard deviation of the best function values (over 50 replications) reported for the ''fast'' evolutionary programming algorithm, from \citet[85 and 88, Tables II--IV]{yao.liu.lin1999}. \end{flushleft} \vspace*{.1in} \caption{Standard Deviations of Values of 22 Optimized Functions} \label{tab:23sdev} \begin{center} \line(1,0){450} \end{center} \end{table} \subsection{A Logistic Least Quartile Difference Estimator:} Our third example is a version of the LQD estimator used in \code{multinomRob}. Using the \proglang{R} function \code{IQR} to compute the interquartile range, the function to be minimized may be defined as follows.\footnote{The LQD problem solved in \code{multinomRob} is somewhat different. There the problem is to minimize the $\binom{h_{K}}{2}$ order statistic of the set of absolute differences among the standardized residuals, where $h_K$ is a function of the sample size and the number of unknown regression model coefficients \citep{MebaneSekhon2004}. The problem considered in the current example is simpler but exhibits similar estimation difficulties.} <>= LQDxmpl <- function(b) { logistic <- function(x) { 1/(1+exp(-x)) } sIQR <- function(y, yhat, n) { IQR((y-yhat)/sqrt(yhat*(n-yhat)), na.rm=TRUE) } sIQR(y, m*logistic(x %*% b), m) } @ For this example we define \code{LQDxmpl} after we compute the simulated data, so the data vector \code{y}, matrix \code{x} and scalar \code{m} are in scope to evaluate to have the values we simulate: <>= m <- 100 x <- cbind(1,rnorm(1000),rnorm(1000)) b1 <- c(.5, 1, -1) b2 <- c(0, -1, 1) logistic <- function(x) { 1/(1+exp(-x)) } y <- rbinom(1000, m, logistic(c(x[1:900,] %*% b1, x[901:1000,] %*% b2))) @ The data simulate substantial contamination. The first 900 observations are generated by one binomial regression model while the last 100 observations come from a very different model. Presuming we are interested in the model that generated the bulk of the data, ignoring the contamination in a generalized linear model with the binomial family produces very poor results: <>= summary(glm1 <- glm(cbind(y,m-y) ~ x[,2] + x[,3], family="binomial")) @ \begin{CodeChunk} \begin{CodeOutput} Call: glm(formula = cbind(y, m - y) ~ x[, 2] + x[, 3], family = "binomial") Deviance Residuals: Min 1Q Median 3Q Max -22.9168 -1.1693 0.3975 1.5895 24.6439 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 0.439492 0.007097 61.93 <2e-16 *** x[, 2] 0.679847 0.007985 85.14 <2e-16 *** x[, 3] -0.716963 0.007852 -91.31 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 \end{CodeOutput} \end{CodeChunk} Of course, if we knew which observations to omit the results would be much better: <>= suby <- y[1:900] subx <- x[1:900,] summary(glm2 <- glm(cbind(suby,m-suby) ~ subx[,2] + subx[,3], family="binomial")) @ \begin{CodeChunk} \begin{CodeOutput} Call: glm(formula = cbind(suby, m - suby) ~ subx[, 2] + subx[, 3], family = "binomial") Deviance Residuals: Min 1Q Median 3Q Max -3.21478 -0.71699 0.03528 0.67867 2.88314 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 0.501880 0.008036 62.46 <2e-16 *** subx[, 2] 1.003592 0.009779 102.63 <2e-16 *** subx[, 3] -0.984295 0.009437 -104.30 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 \end{CodeOutput} \end{CodeChunk} But in practical applications it is unknown apriori which observations should be treated as outliers. As the definition of \code{LQDxmpl} indicates, the LQD is based on minimizing the interquartile range (IQR) of the standardized residuals. Because the quartiles correspond to different data points for different values of the regression coefficients, the fitness function is not smooth, which is to say it is not everywhere differentiable. In general, at every point in the parameter space where the identity of the first or third quartile point changes, the function is not differentiable. Figure~\ref{fig:lqd1} illustrates this. A higher resolution version of this figure is available in \cite{MebaneJr.+Sekhon:2011}---also see \url{http://sekhon.berkeley.edu/papers/rgenoudJSS.pdf}. The IQR clearly has a minimum in the vicinity of the coefficient values used to generate most of the data. But contour plots for the numerically evaluated partial derivative with respect to the second coefficient parameter testify to the function's local irregularity. The function we use to evaluate this numerical derivative is defined as follows. <>= dLQDxmpl <- function(b) { eps <- 1e-10 logistic <- function(x) { 1/(1+exp(-x)) } sIQR <- function(y, yhat, n) { IQR((y-yhat)/sqrt(yhat*(n-yhat)), na.rm=TRUE) } dsIQR <- vector() for (i in 1:length(b)) { beps <- b beps[i] <- b[i]+eps dsIQR <- c(dsIQR, (sIQR(y, m*logistic(x %*% beps), m)- sIQR(y, m*logistic(x %*% b), m))/eps) } return(dsIQR) } @ Setting the intercept equal to 0.5, the code to generate the plotted values is % -rw-rw---- 1 wrm1 research 1878 Feb 10 2007 lqdxmpl2plotB.R <>= blen <- 3 lenbseq <- length(bseq <- seq(-2,2,length=200)) bseq3 <- seq(-1.2,-.9,length=200) bseq2 <- seq(.89,1.1,length=200) IQRarr <- IQRarrA <- array(NA, dim=c((1+blen), lenbseq, lenbseq)) dimnames(IQRarrA) <- list(NULL, as.character(bseq), as.character(bseq)) dimnames(IQRarr) <- list(NULL, as.character(bseq2), as.character(bseq3)) for (i in 1:lenbseq) { for (j in 1:lenbseq) { IQRarrA[1,i,j] <- LQDxmpl(c(.5, bseq[i], bseq[j])) IQRarrA[-1,i,j] <- dLQDxmpl(c(.5, bseq[i], bseq[j])) IQRarr[1,i,j] <- LQDxmpl(c(.5, bseq2[i], bseq3[j])) IQRarr[-1,i,j] <- dLQDxmpl(c(.5, bseq2[i], bseq3[j])) } } @ The following code produces the plots: <>= par(mfrow=c(2,2), lwd=.1) contour(bseq,bseq, IQRarrA[1,,], main="IQR", xlab="b[2]", ylab="b[3]") contour(bseq,bseq, IQRarrA[3,,], main="partial derivative w/r/t b[2]", xlab="b[2]", ylab="b[3]") loc2 <- (150:160)-5 loc3 <- (40:50)+5 contour(bseq[loc2],bseq[loc3], IQRarrA[3,loc2,loc3], main="partial derivative w/r/t b[2]", xlab="b[2]", ylab="b[3]") contour(bseq2,bseq3, IQRarr[3,,], main="partial derivative w/r/t b[2]", xlab="b[2]", ylab="b[3]") @ If the IQR function were smooth, we would see clearly separated, slightly curved contour lines, reflecting the nonlinearity of the \code{logistic} function, but there is nothing like that. Instead, looking over the domain $[-2,2]^2$ for the second and third regression coefficient parameters, with 200 points evaluated along each axis (the upper right plot), there is a splotchy cloud. This reflects the fact that the derivative changes sign very frequently over the domain: of the 40,000 points at which the derivative is evaluated, it is positive at 12,460 points and negative at 27,540 points. \begin{figure}[t] \caption{Contour Plots of the LQD Fitness Function and of its Partial Derivatives} \label{fig:lqd1} \begin{center} \includegraphics{lqdxmpl2B.pdf} % -rw-rw---- 1 wrm1 research 2745 Feb 10 23:15 lqdxmpl2plotB.Rout \end{center} \vspace{-.3in} \end{figure} The LQD fitness function is not appreciably smoother close to the true values. The bottom two plots show the partial derivatives with respect to the second coefficient parameter evaluated over the domain $[.89,1.1]\times[-1.2,-.9]$. The bottom left plot evaluates the derivatives at 11 points along each axis while the bottom right plot uses 200 points along each axis. In the left plot it is easier to see the intricacy of the partitioning of the parameter space as the identity of the first or third quartile point changes. The bottom right plot shows the intricacy in fact replicates at the finer grain of the more detailed evaluations (to see this it is probably necessary to magnify the plot while viewing online the \textit{Journal of Statistical Software} version of this documentation).\footnote{Please see \cite{MebaneJr.+Sekhon:2011} or \url{http://sekhon.berkeley.edu/papers/rgenoudJSS.pdf}.} Within this smaller domain the sign of the derivative changes even more frequently than it does over the domain $[-2,2]^2$: the derivative is positive at 18,098 points and negative at 21,902 points. While the LQD fitness function may be differentiable in a neighborhood of the global solution, that neighborhood, if it exists, is clearly not very big. As likely is that the global solution is located at a point where the function is not differentiable. Hence a numerically evaluated gradient is not meaningful for evaluating whether the solution has been found. At the true solution, numerical gradient values may differ substantially from zero. To use the LQD to estimate the binomial regression model parameters we use the following call to \code{genoud}. Because gradient information is of questionable relevance for this problem, we turn off the termination condition that the gradient at the solution be smaller than the value specified for the \code{solution.tolerance} argument. We retain the default setting \code{BFGS=TRUE} because, in principle, gradient-driven optimization may help in each of the many differentiable neighborhoods, even if it is useless across the nondifferentiable boundaries. Our experience optimizing the LQD \citep{MebaneSekhon2004} shows that using the BFGS in this way improves performance, even though the gradient is not useful for evaluating whether the solution has been found. <>= LQD1 <- genoud(LQDxmpl, nvars=3, max=FALSE, pop.size=2000, max.generations=300, wait.generations=100, gradient.check=FALSE, print=1) @ This invocation of the \code{LQDxmpl} function matches the behavior of \code{multinomRob} in that it produces an estimate for the intercept parameter along with the other coefficients. In a linear regression context, the interquartile range statistic contains no information about the intercept, so the LQD is not an estimator for that parameter. With a binomial regression model there is some information about the intercept due to the nonlinearity of the \code{logistic} function. The LQD estimate for the intercept should nonetheless be expected not to be very good. Results from the preceding estimation are as follows. % macht:/home/xchg/jss07/rgenoud: % -rw-rw---- 1 wrm1 research 5080 Aug 7 02:31 lqdxmpl1b.Rout \begin{CodeChunk} \begin{CodeOutput} Tue Aug 7 02:27:08 2007 Domains: -1.000000e+01 <= X1 <= 1.000000e+01 -1.000000e+01 <= X2 <= 1.000000e+01 -1.000000e+01 <= X3 <= 1.000000e+01 [...] HARD Maximum Number of Generations: 300 Maximum Nonchanging Generations: 100 Population size : 2000 Convergence Tolerance: 1.000000e-06 Using the BFGS Derivative Based Optimizer on the Best Individual Each Generation. Not Checking Gradients before Stopping. Using Out of Bounds Individuals. Minimization Problem. Generation# Solution Value 0 4.951849e-01 56 1.298922e-01 57 1.298891e-01 59 1.298848e-01 60 1.298820e-01 61 1.298793e-01 62 1.298768e-01 63 1.298744e-01 'wait.generations' limit reached. No significant improvement in 100 generations. Solution Fitness Value: 1.298743e-01 Parameters at the Solution (parameter, gradient): X[ 1] : 8.130357e-02 G[ 1] : 9.616492e-03 X[ 2] : 8.889485e-01 G[ 2] : -1.167897e-01 X[ 3] : -9.327966e-01 G[ 3] : -3.090130e-02 Solution Found Generation 63 Number of Generations Run 164 Tue Aug 7 02:31:09 2007 Total run time : 0 hours 4 minutes and 1 seconds \end{CodeOutput} \end{CodeChunk} Recall that the gradient is not reliably informative at the solution. To check whether this solution is believable, we might try reestimating the model using a larger population and larger specified number of generations: <>= LQD1 <- genoud(LQDxmpl, nvars=3, max=FALSE, pop.size=10000, max.generations=1000, wait.generations=300, gradient.check=FALSE, print=1) @ At the price of a greatly increased running time (from four minutes up to one hour 53 minutes), the results are better than the first run (even though the summary measure of fit is slightly worse): % macht:/home/xchg/jss07/rgenoud: % -rw-rw---- 1 wrm1 research 5236 Aug 7 05:16 lqdxmpl1d.Rout \begin{CodeChunk} \begin{CodeOutput} Minimization Problem. Generation# Solution Value 0 2.238865e-01 2 1.301149e-01 3 1.300544e-01 4 1.300482e-01 6 1.300375e-01 7 1.300343e-01 8 1.300323e-01 134 1.299662e-01 135 1.299099e-01 136 1.298867e-01 137 1.298843e-01 138 1.298822e-01 139 1.298791e-01 141 1.298774e-01 'wait.generations' limit reached. No significant improvement in 300 generations. Solution Fitness Value: 1.298770e-01 Parameters at the Solution (parameter, gradient): X[ 1] : 2.013748e-01 G[ 1] : -7.394125e-02 X[ 2] : 9.526390e-01 G[ 2] : 7.807607e-02 X[ 3] : -9.642458e-01 G[ 3] : 3.834052e-02 Solution Found Generation 141 Number of Generations Run 442 Tue Aug 7 05:16:37 2007 Total run time : 1 hours 53 minutes and 45 seconds \end{CodeOutput} \end{CodeChunk} %$ This example demonstrates a key difficulty that arises when optimizing irregular functions in the absence of gradients. It is difficult to assess when or whether an optimum has been found. The estimated coefficient values are close to the ones used to generate most of the data, except as expected the estimate for the intercept is not good. The estimates are better than if we had ignored the possibility of contamination. But whether these are the best possible estimates is not clear. If we were to use an even larger population and specify that an even greater number of generations be run, perhaps a better solution would be found. %http://sekhon.berkeley.edu/rgenoud/R/genoud_cluster_manual.R %http://sekhon.berkeley.edu/rgenoud/R/genoud_cluster_manual_tunnel.R %\code{genoud} can be tricked into doing constrained optimization by %passing in a function which contains a penalty function. Even for less irregular problems convergence is difficult to determine. Nonlinear optimizers often report false convergence, and users should not simply trust whatever convergence criteria an optimizer uses. \citet{McCulloughVinod2003} offer four criteria for verifying the solution of a nonlinear solver. These criteria are meaningful only for problems that meet regularity conditions at the solution, notably differentiability, and as such are not useful for the LQD example offered above. The four criteria are: (1) making sure the gradients are zero; (2) inspecting the solution path (i.e., the trace) to make sure it follows the expected rate of convergence; (3) evaluating the Hessian to make sure it is well-conditioned;\footnote{Following an exchange with \citet{DrukkerWiggins2004}, \citet{McCulloughVinod2004b} modify their third suggestion to note that determining if the Hessian is well-conditioned in part depends on how the data are scaled. That is, a Hessian that appears to be ill-conditioned may be made well-conditioned by rescaling. So if an Hessian appears to be ill-conditioned, \citet{McCulloughVinod2004b} recommend that the analyst attempt to determine if rescaling the data can result in a well-conditioned Hessian.} and (4) profiling the likelihood to ascertain if a quadratic approximation is adequate. One may need to take the results from \code{genoud} and pass them to \code{optim} to conduct some of these diagnostic tests such as to profile the likelihood. It is also good practice to use more than one optimizer to verify the solution \citep{stokes2004}. Note that \code{genoud} uses its own random number seeds and internal pseudorandom number generators to insure backward compatibility with the original C version of the software and to make cluster behavior more predictable. These seeds are set by the \code{unif.seed} and \code{int.seed} options. The \proglang{R} \code{set.seed} command is ignored by \code{genoud}. %user supplied gradients and lexical search? \section{Conclusion} \label{sec:conclusion} The \code{genoud} function provides many more options than can be reviewed in this brief paper. These options are described in the \proglang{R} help file. The most important option influencing how well the evolutionary algorithm works is the \code{pop.size} argument. This argument controls the population size---i.e., it is the number of individuals \code{genoud} uses to solve the optimization problem. As noted above, the theorems proving that genetic algorithms find good solutions are asymptotic in both population size and the number of generations. It is therefore important that the \code{pop.size} value not be small. On the other hand, computational time is finite so obvious trade-offs must be made. As the LQD example illustrates, a larger population size is not necessarily demonstrably better. The most important options to ensure that a good solution is found, aside from \code{pop.size}, are \code{wait.generations}, \code{max.generations} and \code{hard.generation.limit}. Many statistical models have objective functions that are nonlinear functions of the parameters, and optimizing such functions is tricky business \citep{AltmanGillMcDonald2003}. Optimization difficulties often arise even for problems that are generally considered to be simple. For a cautionary tale on how optimization can be a difficult task even for such problems see Stokes' (\citeyear{stokes2004}) effort to replicate a probit model estimated by \citet[pp. 335]{maddala1992}. A recent controversy over estimating a nonlinear model estimated by maximum likelihood offers another cautionary tale \citep{DrukkerWiggins2004,McCulloughVinod2003,McCulloughVinod2004a,McCulloughVinod2004b,SchacharNalebuff2004}. End users are generally surprised to learn that such optimization issues can arise, and that results can substantially vary across optimizers and software implementations. The \pkg{rgenoud} package provides a powerful and flexible global optimizer. When compared with traditional derivative-based optimization methods, \pkg{rgenoud} performs well \citep{SekhonMebane1998}. Optimization of irregular functions is, however, as much of an art as science. And an optimizer cannot be used without thought even for simple surfaces, let alone spaces that require a genetic algorithm. We hope that the availability of a scalable global optimizer will allow users to work with difficult functions more effectively. \bibliography{rgenoud} \end{document} % LocalWords: optima GillMurrayWright EfronTibshirani GENOUD MebaneSekhon LQD % LocalWords: SekhonMebane multinomRob overdispersed nondifferentiable Broyden % LocalWords: Goldfarb Shanno BFGS optim genoud EA EAs GA holland goldberg GAs % LocalWords: GrefenstetteBaker davis FilhoTreleavenAlippi generation's dejong % LocalWords: substring's grefenstette billingsley Vose NixVose vose GA's ADC % LocalWords: GENOCOP MichalewiczSwaminathanLogan Michalewicz Polytope dnorm % LocalWords: nvars Nonchanging UniqueCount var MemoryMatrix IQR LQDxmpl exp % LocalWords: sIQR yhat na rm cbind rnorm rbinom Min Std Pr Signif suby subx % LocalWords: apriori Raphson saddlepoints fn Genoud's gr hessian unif int ssh % LocalWords: Tausworthe stdout tempdir polytope musil deckard makeSOCKcluster % LocalWords: usernames username PVM MPI peakgeneration parm UC Outlier seq mu % LocalWords: lapply xlab ylab col biclaw mNd ALTMAN rgenoud WandKingLau PKfit % LocalWords: KingWand braumoeller BraumoellerGoodrichKline pharmacokinetics % LocalWords: LeeLee pseudorandom pdf glm rw wrm lqdxmpl cl makeCluster probit % LocalWords: localhost clusterExport stopCluster AltmanGillMcDonald GENetic % LocalWords: McCulloughVinod SchacharNalebuff GenMatch GUI URL boolean Sekhon % LocalWords: CPUs nonlinearity FAiR goodrich SekhonMatching ivivc vitro vivo % LocalWords: multinomial Synth AbadieGardeazabal synth nonsmooth Rcore maxima % LocalWords: resampling resamples optimizer's eval nonstochastic testbounds % LocalWords: LLLL func ij unimodal Rosenbrock multimodal minima saddlepoint % LocalWords: testfuncs testNparms gradcheck sizeset genset nreps gsarray tol % LocalWords: gsize ngens FEP LLLLLL sqrt dLQDxmpl eps dsIQR beps blen lenbseq % LocalWords: bseq IQRarr IQRarrA dimnames mfrow lwd loc online DrukkerWiggins % LocalWords: maddala funcs sapply runif ifelse rbind crossprod byrow vXXi % LocalWords: interquartile rgenoud/README.md0000644000176200001440000000203713272711055013201 0ustar liggesusers## rgenoud: R-GENetic Optimization Using Derivatives (RGENOUD) Walter R. Mebane, Jr. and Jasjeet S. Sekhon ## Introduction Genoud is a function that combines evolutionary search algorithms with derivative-based (Newton or quasi-Newton) methods to solve difficult optimization problems. Genoud may also be used for optimization problems for which derivatives do not exist. ## How to install A version is on CRAN. The latest development version can be installed directly from Github using [devtools](https://github.com/hadley/devtools). ```R if (!require("devtools")) install.packages("devtools") devtools::install_github("JasjeetSekhon/rgenoud") ``` The package contains compiled code, and you must have a development environment to install the development version. (Use `devtools::has_devel()` to check whether you do.) If no development environment exists, Windows users download and install [Rtools](https://cran.r-project.org/bin/windows/Rtools/) and macOS users download and install [Xcode](https://itunes.apple.com/us/app/xcode/id497799835). rgenoud/MD50000644000176200001440000000436513422437303012236 0ustar liggesusersde28bbfd523a7ea3ebf4d1dc85555a45 *ChangeLog 5f24b48294ba69b2d2ccb5597ea3c33d *DESCRIPTION 7041fdf1d47575612a5530f22815c74b *INDEX dd96eb8ce3b1221be8425461a15b5998 *NAMESPACE c3af326c36548e98bf3aee6707bf780f *R/rgenoud.R 1a33ab1680d185e8ac27ccbfee0a69c5 *R/zzz.R e60d8842ac2d0c1bfe76037a50e7dd5f *README.md 25129bd5b49e80311b34031c8b770413 *THANKS 8713bf8a08a11446eeeb9f63b1b5177d *build/vignette.rds c1555556931726b8c05fb5eca07023ed *inst/CITATION fc974e2bc8d4159f9ef7c20f2e4d2d40 *inst/doc/Figures/fig1.pdf c1c87156136ee41de970e4fce41fe4ed *inst/doc/Figures/lqdxmpl2B.pdf 301934099bc3c999ad3b509374fccd7f *inst/doc/rgenoud.R 688f42dd89519765ad82e2ec6eb8b9ce *inst/doc/rgenoud.Rnw 6da32365e697f8c1d280b3bf1c346ef2 *inst/doc/rgenoud.bib 3e517e79fc213c2c3f4235443e9c9979 *inst/doc/rgenoud.pdf 7bc628bd7dc21c14eff6f3569c259743 *man/genoud.Rd 9e5f395a8f7532118c723dab203d314d *src/change_order.cpp 0e2173333529000bcd8a2b2cdceec2c6 *src/eval.cpp eda0a447d4f9118ad8da45d166509345 *src/evaluate.cpp 764566a9500e5236bb9916b4714d6157 *src/frange_ran.cpp b879f79ea289e274660632b76f5ec6a7 *src/genoud.cpp dfa87419e843d8e6fb959e156004c550 *src/genoud.h 3213f79851150f99629a7e2a1719a7d6 *src/gradient.cpp 682a4a00ac9b06f5063f248f59989f0d *src/gradient.h b902f1136b7bc1f5d2ef0cb121b6b011 *src/init.c 824d9f5d338ecaa274098127fbfe987b *src/math.cpp 1ac6ed98c2cb0267453dcdfe1c8029ce *src/multiply.cpp 62b05e4d2b6ccf20af199dc8db6f4436 *src/numerics.cpp 1dfcf27b62c83849ee8bd8b361d06e11 *src/operators.cpp 205fa9ab76b8072dd50d2e506e86f1b2 *src/print_format.cpp 6232a071dae711bba098c886b76bbdee *src/rgenoud.cpp 5a028c6ece078d870ee528ca300a9776 *src/unif.cpp fa19da33dee62a703d43ed766e8d2985 *src/unif.h 5d2e512e4d6a4da5ece7116e9f9ad74e *tests/tests.R 81814a6d009645ab317d6a7c28af2850 *tests/tests.Rout.save 012b1ca9c9d4f7f7de7160a03b9d220a *tests/testthat.R ac10fd985633dfaeeffb5f4d4772b3ef *tests/testthat/test-Example.R 32778f8d7781442bb2256bdd1f5a0667 *tests/testthat/test-genoud_fixed_seed.R 2ad8c35dfe002125921a23440d5ab3ca *tests/testthat/test-genoud_no_given_seed.R fc974e2bc8d4159f9ef7c20f2e4d2d40 *vignettes/Figures/fig1.pdf c1c87156136ee41de970e4fce41fe4ed *vignettes/Figures/lqdxmpl2B.pdf 688f42dd89519765ad82e2ec6eb8b9ce *vignettes/rgenoud.Rnw 6da32365e697f8c1d280b3bf1c346ef2 *vignettes/rgenoud.bib rgenoud/build/0000755000176200001440000000000013421760172013017 5ustar liggesusersrgenoud/build/vignette.rds0000644000176200001440000000031013421760172015350 0ustar liggesusersb```b`fed`b2 1# '.JO/M +G -KWV& 7h0XU{H&$aּbt.y) DM;<f6̜T3B2K7(1Ix(\%^PL4@bts$$ {rgenoud/DESCRIPTION0000644000176200001440000000104313422437303013422 0ustar liggesusersPackage: rgenoud Version: 5.8-3.0 Date: 2019-01-22 Title: R Version of GENetic Optimization Using Derivatives Author: Walter R. Mebane, Jr. , Jasjeet Singh Sekhon Maintainer: Jasjeet Singh Sekhon Description: A genetic algorithm plus derivative optimizer. Depends: R (>= 2.15), utils Suggests: testthat License: GPL-3 URL: http://sekhon.berkeley.edu/rgenoud/ NeedsCompilation: yes Packaged: 2019-01-23 03:33:15 UTC; sekhon Repository: CRAN Date/Publication: 2019-01-24 22:40:02 UTC rgenoud/THANKS0000644000176200001440000000050413171743040012627 0ustar liggesusersThe authors would like to thank the following people for their help and assistance: Sören Künzel Olivia Koshy Ben Goodrich Erin Hartman Todd Rice Jonathan Wand rgenoud/ChangeLog0000644000176200001440000002425613171743040013500 0ustar liggesusers2017-10-10 Version 5.8-1.0 * fixing the reproducibility bug. Now the seed is set from within R which allows reproducibility * rgenoud.R, genoud.cpp: Setting the seed to be a random draw from a uniform instead of it being randomized independenlty from R * Adding new unit tests. 2015-07-19 Version: 5.7-12.4 * genoud.R: creating visible binding for variable "indx" 2015-07-18 Version: 5.7-12.3 * genoud.R: import non-base functions explicitly 2015-07-17 Version: 5.7-12.2 * DESCRIPTION: improves description 2013-06-28 Version: 5.7-12.1 * test.R: suppress message on load 2013-06-28 Version: 5.7-12 * genoud.Rd: Updated the documentation to reflect the usage of the 'parallel' package instead of the deprecated package 'snow' * vignettes: moved vignettes from /inst/doc to /vignettes. 2013-06-28 Version: 5.7-10 * genoud.R: now uses the 'parallel' package instead of the deprecated package 'snow' 2013-06-27 Version: 5.7-9.2 * evaluate.cpp: JaIntegerOptimization(), Correct memory issue. When reading in an old population file a segmentation fault could result when an old population file was read that had a larger population than the new population. Issue only arose for integer optimization. 2013-05-06 Version: 5.7-9.1 * operators.cpp: oper5(), Simple Crossover, always hit the maximum unique individual limit. Corrected the logic to only check for unique children in the crossover portion. Note that this makes results different from previous versions even if the random number seeds are set. 2012-06-03 Version: 5.7-8 * rgenoud.R: Added the following options back in for backward compatibility, but a warning is printed if they are used: output.path and output.append. Please use 'sink' instead. 2012-06-03 Version: 5.7-7 * rgenoud.R: Call to optimHess() now explicitly names the arguments to be matched. 2012-06-03 Version: 5.7-6 * evaluate.cpp: output streams are no longer flushed because of R's rules about calling stdout. * rgenoud.pdf: has been compacted to save space. * .Rinstignore: new file has been added to sure that inst/doc/Figures are not installed to save space. 2012-06-03 Version: 5.7-5 * rgenoud.R: Because of the switch to Rprintf (see below), the 'output.path' and 'output.append' options have been removed. * evaluate.cpp: Routed printing calls through Rprintf rather than fprintf. Made sure all error handling is done by R's error() function. Many cpp files affected: genoud.cpp, genoud.h, gradient.cpp, operators.cpp, math.cpp, numerics.cpp, print_format.cpp. 2012-06-02 Version: 5.7-4 * rgenoud.R: Removes calls to .Internal(optimhess). Now calls optimHess(). * zzz.R: Now uses packageStartupMessage() to display .onAttach message. 2011-05-04 Version: 5.7-3 * rgenoud.Rd: Update for Journal of Statistical Software * inst/CITATION: Final update for Journal of Statistical Software 2011-04-16 Version: 5.7-2 * inst/CITATION: Updated for Journal of Statistical Software 2010-08-26 Version: 5.7-1 * operators.cpp: Fixed boundary issue for integer optimization (when 'data.type.int=TRUE') created by changes in the GNU CC compiler, operators P3,P4,P5,P7 were affected. * evaluate.cpp: See above and corrected printing of population means and variances when doing integer optimization. * genound.h: See above * print_format.cpp: Changed longs to ints to prevent warnings produced by the call to fscanf() in the ReadPopulation() file. 2010-06-01 Version: 5.6-7 * rgenoud.R: Improved handling of the parent environment when the 'transform' option is used * operators.ccp: Fixed boundary issue for the integer version of the Polytope Crossover operator (P5 and function JaIntegeroper4). 2009-08-14 Version: 5.6-6 * rgenoud.Rd: Improved the documentation of the 'transform' option. 2009-08-07 Version: 5.6-5 * rgenoud.Rnw: created vignette file to generate rgenoud.pdf, rgenoud.tex and rgenoud.R. Support files also added---i.e., rgenoud.bib and figures in the inst/doc/Figures directory added. * COPYRIGHTS: file added * COPYING: file added * THANKS: file added 2009-08-06 Version: 5.6-4 * evaluate.cpp: Adds boundary checking for the parameters returned by the 'transform' option. For the transform option, only checks bounds in generation 0 because of computational efficiency concerns. The standard bounds checking remains unchanged. * genoud.Rd: Documentation updated to reflect above. 2009-08-04 Version: 5.6-3 * print_format.cpp: Corrects issue when 'share.type=1' and 'starting.values' are provided. * evaluate.cpp and multiple other files: Some warning messages are now simply notes. 2009-08-03 Version: 5.6-2 * multiple files: optim() can now be called by any valid method using the 'optim.method' option: namely one of "BFGS", "L-BFGS-B", "Nelder-Mead", "CG", or "SANN". * rgenoud.R: The error checking of user provided starting values has been improved. 2009-08-03 Version: 5.6-1 * multiple files: Major revision. Adds the transform option which is required by the FAiR package by Ben Goodrich . * pint_format.cpp: share.type=1 works correctly again. * multiple files: Printing is cleaning up when share.type=1, and relevant warning messages are improved. 2009-03-13 Version: 5.5-1 * genoud.Rd: Corrected formatting issues in the help page. * evaluate.cpp: Corrected overloading ambiguity between "std::fmod(double, double)" and "std::fmod(long double, long double)" which prevented building on Solaris. 2008-01-04 Version: 5.4-7 * evaluate.cpp, rgenoud.cpp: The 'BFGSburnin' option may now be set to a negative value. If \code{BFGSburnin < 0}, the BFGS will be used if and when \code{wait.generations} is doubled because at least one gradient is too large, which can only occur when \code{gradient.check = TRUE}. Note that 'BFGSburnin' was an option added in version 5.3-3. Premature use of the BFGS can lead to convergence to a local minimum instead of the global one. This option allows the user to control how many generations are run before the BFGS is started. This option delays the use of both the BFGS on the best individual and of the P9 operator. * multiple files: Better interrupt handling. When genoud is interrupted, it now prints a message on how to recover the best individual found so far. * multiple files: Helper function of analytical gradients is enabled. Better checking to make sure that input parameters are legal. * rgenoud.R and other files: User may now pass in "control" (a list of control parameters) for optim including control$fnscale. * rgenoud.Rd: Updated rgenoud.Rd project.path description. It is now noted in genoud.Rd that with boundary.enforcement=2, no out-of-bounds evaluations will ever be requested. In this case, boundary enforcement is also applied to the BFGS algorithm, which prevents candidates from straying beyond the bounds defined by \code{Domains}. Note that this forces the use of the "L-BFGS-B" algorithm for \code{\link[stats]{optim}}. This algorithm requires that all fit values and gradients be defined and finite for all function evaluations. If this causes an error, it is suggested that the "BFGS" algorithm be used instead by setting \code{boundary.enforcement=1}. 2007-11-19 Version: 5.3-4 * multiple files: Made some changes for the Portland Group Compiler (pgCC). Converted some longs to ints. 2007-10-18 Version: 5.3-3 * multiple files: A number of starting values can now be provided by passing a matrix to the 'starting.values' option. * multiple files: A new option has been added named 'BFGSburnin' which control the number of generations which are run before the BFGS is first used. Premature use of the BFGS can lead to convergence to a local minimum instead of the global one. This option allows the user to control how many generations are run before the BFGS is started. This option delays the use of both the BFGS on the best individual and of the P9 operator. * rgenoud.R: The dimensions of the 'Domains' object are now checked both if they have the correct number of dimensions and if the values are sane. * evaluate.cpp and other files: Fixed warnings in gcc >4.2: evaluate.cpp:304: warning: deprecated conversion from string constant to 'char*' * evaluate.cpp: Fixed a MemoryMatrix issue with data.type.int=TRUE. MemoryMatrix now gives the same results as !MemoryMatrix. The issues was that the number of UniquePairs that were hunted down for P6 and P8 were different between the two setups. 2007-08-04 Version: 5.1-14 * multiple files: Minor changes. Changed #includes so that the package now compiles with Sun Studio compilers: extern "C" is not needed for R header files. Added a regression suite to the "tests" directory. 2007-03-23 Version: 5.1-9 Major changes: * multiple files: Lexical searching now allows for one of the fit functions to be optimized by the derivative based optimizer. This functionality is made available via the "BFGSfn" option. Also see the "BFGShelp" option. * multiple files: The 9th operator which takes the convex combination of the parent and its BFGS fit can now by tuned via the "P9mix" option. If this is set to equal 1, then the BFGS fit is simply used. Minor changes: * multiple files: If BFGS results in out-of-bounds individuals, warning is only printed if print.level > 1 2007-02-20 Version: 5.0-5 * zzz.R: Prints version and build date on load. * rgenoud.R: If starting values are provided and the lexical option is TRUE, then the starting values instead of domains[,1] are used to figure out how many return fits the function provides. 2007-02-11 Version: 5.0-2 * genoud.Rd: Improved documentation file. 2007-01-30 Version: 5.0-1 * evaluate.cpp: remove needless if statement in evaluate.cpp 2007-01-30 Version: 5.0-0 * genoud.Rd: Multiple point crossover now accurately called simple crossover in docs * operators.cpp: corrected whole mutation to actually do whole mutation * evaluate.cpp: fixed minor no improvement bug which involved going from gen0 to gen1 * multiple files: simplified printing Copyright 1997-2012 Walter R. Mebane, Jr. and Jasjeet S. Sekhon. Copying and distribution of this file, without modification, are permitted provided the copyright notice and this notice are preserved. rgenoud/man/0000755000176200001440000000000013171743040012470 5ustar liggesusersrgenoud/man/genoud.Rd0000644000176200001440000010704713171743751014262 0ustar liggesusers\name{genoud} \alias{genoud} \title{ GENetic Optimization Using Derivatives } \description{ \code{Genoud} is a function that combines evolutionary search algorithms with derivative-based (Newton or quasi-Newton) methods to solve difficult optimization problems. \code{Genoud} may also be used for optimization problems for which derivatives do not exist. \code{Genoud}, via the \code{cluster} option, supports the use of multiple computers, CPUs or cores to perform parallel computations. } \usage{genoud(fn, nvars, max=FALSE, pop.size=1000, max.generations=100, wait.generations=10, hard.generation.limit=TRUE, starting.values=NULL, MemoryMatrix=TRUE, Domains=NULL, default.domains=10, solution.tolerance=0.001, gr=NULL, boundary.enforcement=0, lexical=FALSE, gradient.check=TRUE, BFGS=TRUE, data.type.int=FALSE, hessian=FALSE, unif.seed=round(runif(1, 1, 2147483647L)), int.seed=round(runif(1, 1, 2147483647L)),print.level=2, share.type=0, instance.number=0, output.path="stdout", output.append=FALSE, project.path=NULL, P1=50, P2=50, P3=50, P4=50, P5=50, P6=50, P7=50, P8=50, P9=0, P9mix=NULL, BFGSburnin=0, BFGSfn=NULL, BFGShelp=NULL, control=list(), optim.method=ifelse(boundary.enforcement < 2, "BFGS", "L-BFGS-B"), transform=FALSE, debug=FALSE, cluster=FALSE, balance=FALSE, ...) } \arguments{ \item{fn}{ The function to be minimized (or maximized if max=\code{TRUE}). The first argument of the function must be the vector of parameters over which minimizing is to occur. The function must return a scalar result (unless \code{lexical=TRUE}). For example, if we wish to \emph{maximize} the \code{sin()} function. We can simply call genoud by \code{genoud(sin, nvars=1,max=TRUE)}.} \item{nvars}{The number of parameters to be selected for the function to be minimized (or maximized).} \item{max}{ Maximization (\code{TRUE}) or Minimizing (\code{FALSE}). Determines if \code{genoud} minimizes or maximizes the objective function.} \item{pop.size}{ Population Size. This is the number of individuals \code{genoud} uses to solve the optimization problem. There are several restrictions on what the value of this number can be. No matter what population size the user requests, the number is automatically adjusted to make certain that the relevant restrictions are satisfied. These restrictions originate in what is required by several of the operators. In particular, operators 6 (Simple Crossover) and 8 (Heuristic Crossover) require an even number of individuals to work on---i.e., they require two parents. Therefore, the \code{pop.size} variable and the operators sets must be such that these three operators have an even number of individuals to work with. If this does not occur, the population size is automatically increased until this constraint is satisfied.} \item{max.generations}{ Maximum Generations. This is the maximum number of generations that \code{genoud} will run when attempting to optimize a function. This is a \emph{soft} limit. The maximum generation limit will be binding for \code{genoud} only if \code{hard.generation.limit} has been set equal to \code{TRUE}. If it has not been set equal to \code{TRUE}, two soft triggers control when \code{genoud} stops: \code{wait.generations} and \code{gradient.check}. \cr Although the \code{max.generations} variable is not, by default, binding, it is nevertheless important because many operators use it to adjust their behavior. In essence, many of the operators become less random as the generation count gets closer to the \code{max.generations} limit. If the limit is hit and \code{genoud} decides to continue working, \code{genoud} automatically increases the \code{max.generation} limit.\cr Please see \code{MemoryMatrix} for some important interactions with memory management.} \item{wait.generations}{ If there is no improvement in the objective function in this number of generations, \code{genoud} will think that it has found the optimum. If the \code{gradient.check} trigger has been turned on, \code{genoud} will only start counting \code{wait.generations} if the gradients are within \code{solution.tolerance} of zero. The other variables controlling termination are \code{max.generations} and \code{hard.generation.limit}.} \item{hard.generation.limit}{ This logical variable determines if the \code{max.generations} variable is a binding constraint for \code{genoud}. If \code{hard.generation.limit} is \code{FALSE}, then \code{genoud} may exceed the \code{max.generations} count if either the objective function has improved within a given number of generations (determined by \code{wait.generations}) or if the gradients are not zero (determined by \code{gradient.check}). \cr Please see \code{MemoryMatrix} for some important interactions with memory management.} \item{starting.values}{A vector or matrix containing parameter values which \code{genoud} will use at startup. Using this option, the user may insert one or more individuals into the starting population. If a matrix is provided, the columns should be the variables and the rows the individuals. \code{genoud} will randomly create the other individuals.} \item{MemoryMatrix}{ This variable controls if \code{genoud} sets up a memory matrix. Such a matrix ensures that \code{genoud} will request the fitness evaluation of a given set of parameters only once. The variable may be \code{TRUE} or \code{FALSE}. If it is \code{FALSE}, \code{genoud} will be aggressive in conserving memory. The most significant negative implication of this variable being set to \code{FALSE} is that \code{genoud} will no longer maintain a memory matrix of all evaluated individuals. Therefore, \code{genoud} may request evaluations which it has already previously requested. \cr Note that when \code{nvars} or \code{pop.size} are large, the memory matrix consumes a large amount of RAM. \code{Genoud}'s memory matrix will require somewhat less memory if the user sets \code{hard.generation.limit} equal to \code{TRUE}.} \item{Domains}{ This is a \code{nvars} \eqn{\times 2}{*2} matrix. For each variable, in the first column is the lower bound and in the second column the upper bound. None of \code{genoud}'s starting population will be generated outside of the bounds. But some of the operators may generate children which will be outside of the bounds unless the \code{boundary.enforcement} flag is turned on. \cr If the user does not provide any values for Domains, \code{genoud} will setup default domains using \code{default.domains}. \cr For linear and nonlinear constraints please see the discussion in the \code{Note} section.} \item{default.domains}{ If the user does not want to provide a \code{Domains} matrix, domains may nevertheless be set by the user with this easy to use scalar option. \code{Genoud} will create a Domains matrix by setting the lower bound for all of the parameters equal to -1 \eqn{\times}{*} \code{default.domains} and the upper bound equal to \code{default.domains}.} \item{solution.tolerance}{ This is the tolerance level used by \code{genoud}. Numbers within \code{solution.tolerance} are considered to be equal. This is particularly important when it comes to evaluating \code{wait.generations} and conducting the \code{gradient.check}.} \item{gr}{A function to provide the gradient for the \code{BFGS} optimizer. If it is \code{NULL}, numerical gradients will be used instead.} \item{boundary.enforcement}{ This variable determines the degree to which \code{genoud} obeys the boundary constraints. Notwithstanding the value of the variable, none of \code{genoud}'s starting population values will be outside of the bounds. \cr \code{boundary.enforcement} has three possible values: 0 (anything goes), 1 (partial), and 2 (no trespassing): \itemize{ \item{\emph{0: Anything Goes}}{ This option allows any of the operators to create out-of-bounds individuals and these individuals will be included in the population if their fit values are good enough. The boundaries are only important when generating random individuals.} \item{\emph{1: partial enforcement}}{ This allows operators (particularly those operators which use the derivative based optimizer, BFGS) to go out-of-bounds during the creation of an individual (i.e., out-of-bounds values will often be evaluated). But when the operator has decided on an individual, it \emph{must} be in bounds to be acceptable.} \item{\emph{2: No Trespassing}}{ No out-of-bounds evaluations will ever be requested. In this case, boundary enforcement is also applied to the BFGS algorithm, which prevents candidates from straying beyond the bounds defined by \code{Domains}. Note that this forces the use of the L-BFGS-B algorithm for \code{\link[stats]{optim}}. This algorithm requires that all fit values and gradients be defined and finite for all function evaluations. If this causes an error, it is suggested that the BFGS algorithm be used instead by setting \code{boundary.enforcement=1}.}}} \item{lexical}{This option enables lexical optimization. This is where there are multiple fit criteria and the parameters are chosen so as to maximize fitness values in lexical order---i.e., the second fit criterion is only relevant if the parameters have the same fit for the first etc. The fit function used with this option should return a numeric vector of fitness values in lexical order. This option can take on the values of \code{FALSE}, \code{TRUE} or an integer equal to the number of fit criteria which are returned by \code{fn}. The \code{value} object which is returned by \code{genoud} will include all of the fit criteria at the solution. The \code{\link[Matching]{GenMatch}} function makes extensive use of this option.} \item{gradient.check}{ If this variable is \code{TRUE}, \code{genoud} will not start counting \code{wait.generations} unless each gradient is \code{solution.tolerance} close to zero. This variable has no effect if the \code{max.generations} limit has been hit and the \code{hard.generation.limit} option has been set to \code{TRUE}. If \code{BFGSburnin < 0}, then it will be ignored unless \code{gradient.check = TRUE}. } \item{BFGS}{ This variable denotes whether or not \code{genoud} applies a quasi-Newton derivative optimizer (BFGS) to the best individual at the end of each generation after the initial one. See the \code{optim.method} option to change the optimizer. Setting BFGS to \code{FALSE} does not mean that the BFGS will never be used. In particular, if you want BFGS never to be used, \code{P9} (the Local-Minimum Crossover operator) must also be set to zero.} \item{data.type.int}{ This option sets the data type of the parameters of the function to be optimized. If the variable is \code{TRUE}, \code{genoud} will search over integers when it optimizes the parameters. \cr With integer parameters, \code{genoud} never uses derivative information. This implies that the BFGS quasi-Newton optimizer is never used---i.e., the \code{BFGS} flag is set to \code{FALSE}. It also implies that Operator 9 (Local-Minimum Crossover) is set to zero and that gradient checking (as a convergence criterion) is turned off. No matter what other options have been set to, \code{data.type.int} takes precedence---i.e., if \code{genoud} is told that it is searching over an integer parameter space, gradient information is never considered. \cr There is no option to mix integer and floating point parameters. If one wants to mix the two, it is suggested that the user pick integer type and in the objective function map a particular integer range into a floating point number range. For example, tell \code{genoud} to search from 0 to 100 and divide by 100 to obtain a search grid of 0 to 1.0 (by .1). \cr Alternatively, the user could use floating point numbers and round the appropriate parameters to the nearest integer inside \code{fn} before the criterion (or criteria if \code{lexical = TRUE}) is evaluated. In that case, the \code{transform} option can be used to create the next generation from the current generation when the appropriate parameters are in the rounded state. } \item{hessian}{ When this flag is set to \code{TRUE}, \code{genoud} will return the hessian matrix at the solution as part of its return list. A user can use this matrix to calculate standard errors.} \item{unif.seed}{This should not be set. To set the seed, one should use the \code{set.seed()} function directly. It only exists to ensure compatibility with functions which are used to call the older version of this function.} \item{int.seed}{See \code{unif.seed}.} \item{print.level}{ This variable controls the level of printing that \code{genoud} does. There are four possible levels: 0 (minimal printing), 1 (normal), 2 (detailed), and 3 (debug). If level 2 is selected, \code{genoud} will print details about the population at each generation. The \code{print.level} variable also significantly affects how much detail is placed in the project file---see \code{project.path}. Note that R convention would have us at print level 0 (minimal printing). However, because \code{genoud} runs may take a long time, it is important for the user to receive feedback. Hence, print level 2 has been set as the default.} \item{share.type}{ If \code{share.type} is equal to 1, then \code{genoud}, at startup, checks to see if there is an existing project file (see \code{project.path}). If such a file exists, it initializes its original population using it. This option can be used neither with the \code{lexical} nor the \code{transform} options.\cr If the project file contains a smaller population than the current \code{genoud} run, \code{genoud} will randomly create the necessary individuals. If the project file contains a larger population than the current \code{genoud} run, \code{genoud} will kill the necessary individuals using exponential selection. \cr If the number of variables (see \code{nvars}) reported in the project file is different from the current \code{genoud} run, \code{genoud} does not use the project file (regardless of the value of \code{share.type}) and \code{genoud} generates the necessary starting population at random.} \item{instance.number}{ This number (starting from 0) denotes the number of recursive instances of \code{genoud}. \code{genoud} then sets up its random number generators and other such structures so that the multiple instances do not interfere with each other. It is up to the user to make certain that the different instances of \code{genoud} are not writing to the same output file(s): see \code{project.path}. \cr For the R version of \code{genoud} this variable is of limited use. It is basically there in case a \code{genoud} run is being used to optimize the result of another \code{genoud} run (i.e., a recursive implementation).} \item{output.path}{This option is no longer supported. It used to allow one to redirect the output. Now please use \code{\link{sink}}. The option remains in order to provide backward compatibility for the API.} \item{output.append}{This option is no longer supported. Please see \code{\link{sink}}. The option remains in order to provide backward compatibility for the API.} \item{project.path}{ This is the path of the \code{genoud} project file. The project file prints one individual per line with the fit value(s) printed first and then the parameter values. By default \code{genoud} places its output in a file called "genoud.pro" located in the temporary directory provided by \code{\link{tempdir}}. The behavior of the project file depends on the \code{print.level} chosen. If the \code{print.level} variable is set to 1, then the project file is rewritten after each generation. Therefore, only the currently fully completed generation is included in the file. If the \code{print.level} variable is set to 2, then each new generation is simply appended to the project file. For \code{print.level=0}, the project file is not created. } \item{P1}{ This is the cloning operator. \code{genoud} always clones the best individual each generation. But this operator clones others as well. Please see the Operators Section for details about operators and how they are weighted.} \item{P2}{ This is the uniform mutation operator. One parameter of the parent is mutated. Please see the Operators Section for details about operators and how they are weighted.} \item{P3}{ This is the boundary mutation operator. This operator finds a parent and mutates one of its parameters towards the boundary. Please see the Operators Section for details about operators and how they are weighted.} \item{P4}{ Non-Uniform Mutation. Please see the Operators Section for details about operators and how they are weighted.} \item{P5}{ This is the polytope crossover. Please see the Operators Section for details about operators and how they are weighted.} \item{P6}{ Simple Crossover. Please see the Operators Section for details about operators and how they are weighted.} \item{P7}{ Whole Non-Uniform Mutation. Please see the Operators Section for details about operators and how they are weighted.} \item{P8}{ Heuristic Crossover. Please see the Operators Section for details about operators and how they are weighted.} \item{P9}{ Local-Minimum Crossover: BFGS. This is rather CPU intensive, and should be generally used less than the other operators. Please see the Operators Section for details about operators and how they are weighted.} \item{P9mix}{This is a tuning parameter for the \code{P9} operator. The local-minimum crossover operator by default takes the convex combination of the result of a BFGS optimization and the parent individual. By default the mixing (weight) parameter for the convex combination is chosen by a uniform random draw between 0 and 1. The \code{P9mix} option allows the user to select this mixing parameter. It may be any number greater than 0 and less than or equal to 1. If 1, then the BFGS result is simply used.} \item{BFGSburnin}{The number of generations which are run before the BFGS is first used. Premature use of the BFGS can lead to convergence to a local optimum instead of the global one. This option allows the user to control how many generations are run before the BFGS is started and would logically be a non-negative integer. However, if \code{BFGSburnin < 0}, the BFGS will be used if and when \code{wait.generations} is doubled because at least one gradient is too large, which can only occur when \code{gradient.check = TRUE}. This option delays the use of both the BFGS on the best individual and the \code{P9} operator. } \item{BFGSfn}{This is a function for the BFGS optimizer to optimize, if one wants to make it distinct from the \code{fn} function. This is useful when doing \code{lexical} optimization because otherwise a derivative based optimizer cannot be used (since it requires a single fit value). It is suggested that if this functionality is being used, both the \code{fn} and \code{BFGSfn} functions obtain all of the arguments they need (except for the parameters being optimized) by lexical scope instead of being passed in as arguments to the functions. Alternatively, one may use the \code{BFGShelp} option to pass arguments to \code{BFGSfn}. If \code{print.level > 2}, the results from the BFGS optimizer are printed every time it is called.} \item{BFGShelp}{An optional function to pass arguments to \code{BFGSfn}. This function should take an argument named `initial', an argument named `done' that defaults to \code{FALSE}, or at least allow \code{...} to be an argument. \code{BFGSfn} must have an argument named `helper' if \code{BFGShelp} is used because the call to \code{\link[stats]{optim}} includes the hard-coded expression \code{helper = do.call(BFGShelp, args = list(initial = foo.vals), envir = environment(fn)))}, which evaluates the \code{BFGShelp} function in the environment of \code{BFGSfn} (\code{fn} is just a wrapper for \code{BFGSfn}) at \code{par = foo.vals} where \code{foo.vals} contains the starting values for the BFGS algorithm. The `done' argument to \code{BFGSfn} is used if the user requests that the Hessian be calculated at the \code{genoud} solution.} \item{control}{A list of control parameters that is passed to \code{\link[stats]{optim}} if \code{BFGS = TRUE} or \code{P9 > 0}. Please see the \code{\link[stats]{optim}} documentation for details. } \item{optim.method}{A character string among those that are admissible for the \code{method} argument to the \code{\link{optim}} function, namely one of \code{"BFGS"}, \code{"L-BFGS-B"}, \code{"Nelder-Mead"}, \code{"CG"}, or \code{"SANN"}. By default, \code{optim.method} is \code{"BFGS"} if \code{boundary.enforcement < 2} and is \code{"L-BFGS-B"} if \code{boundary.enforcement = 2}. For discontinuous objective functions, it may be advisable to select \code{"Nelder-Mead"} or \code{"SANN"}. If selecting \code{"L-BFGS-B"} causes an error message, it may be advisable to select another method or to adjust the \code{control} argument. Note that the various arguments of \code{genoud} that involve the four letters \dQuote{BFGS} continue to be passed to \code{\link[stats]{optim}} even if \code{optim.method != "BFGS"}.} \item{transform}{A logical that defaults to \code{FALSE}. If \code{TRUE}, it signifies that \code{fn} will return a numeric vector that contains the fit criterion (or fit criteria if \code{lexical = TRUE}), followed by the parameters. If this option is used, \code{fn} should have the following general form in its body:\cr \code{par <- myTransformation(par)}\cr \code{criter <- myObjective(par)}\cr \code{return( c(criter, par) )}\cr This option is useful when parameter transformations are necessary because the next generation of the population will be created from the current generation in the transformed state, rather than the original state. This option can be used by users to implement their own operators. \cr There are some issues that should be kept in mind. This option cannot be used when \code{data.type.int = TRUE}. Also, this option coerces \code{MemoryMatrix} to be \code{FALSE}, implying that the \code{cluster} option cannot be used. And, unless \code{BFGSfn} is specified, this option coerces \code{gradient.check} to \code{FALSE}, \code{BFGS} to \code{FALSE}, and \code{P9} to \code{0}. If \code{BFGSfn} is specified, that function should perform the transformation but should only return a scalar fit criterion, for example:\cr \code{par <- myTransformation(par)}\cr \code{criter <- myCriterion(par)}\cr \code{return(criter)}\cr Finally, if \code{boundary.enforcement > 0}, care must be taken to assure that the transformed parameters are within the \code{Domains}, otherwise unpredictable results could occur. In this case, the transformations are checked for consistency with \code{Domains} but only in the initial generation (to avoid an unacceptable loss in computational speed). } \item{debug}{ This variable turns on some debugging information. This variable may be \code{TRUE} or \code{FALSE}.} \item{cluster}{This can either be an object of the 'cluster' class returned by one of the \code{\link[parallel]{makeCluster}} commands in the \code{parallel} package or a vector of machine names so \code{genoud} can setup the cluster automatically. If it is the latter, the vector should look like: \cr \code{c("localhost","musil","musil","deckard")}.\cr This vector would create a cluster with four nodes: one on the localhost another on "deckard" and two on the machine named "musil". Two nodes on a given machine make sense if the machine has two or more chips/cores. \code{genoud} will setup a SOCK cluster by a call to \code{\link[parallel]{makePSOCKcluster}}. This will require the user to type in her password for each node as the cluster is by default created via \code{ssh}. One can add on usernames to the machine name if it differs from the current shell: "username@musil". Other cluster types, such as PVM and MPI, which do not require passwords can be created by directly calling \code{\link[parallel]{makeCluster}}, and then passing the returned cluster object to \code{genoud}. For an example of how to manually setup up a cluster with a direct call to \code{\link[parallel]{makeCluster}} see \url{http://sekhon.berkeley.edu/rgenoud/R/genoud_cluster_manual.R}. For an example of how to get around a firewall by ssh tunneling see: \url{http://sekhon.berkeley.edu/rgenoud/R/genoud_cluster_manual_tunnel.R}.} \item{balance}{This logical flag controls if load balancing is done across the cluster. Load balancing can result in better cluster utilization; however, increased communication can reduce performance. This option is best used if the function being optimized takes at least several minutes to calculate or if the nodes in the cluster vary significantly in their performance. If cluster==FALSE, this option has no effect.} \item{...}{Further arguments to be passed to \code{fn} and \code{gr}.} } \details{\code{Genoud} solves problems that are nonlinear or perhaps even discontinuous in the parameters of the function to be optimized. When a statistical model's estimating function (for example, a log-likelihood) is nonlinear in the model's parameters, the function to be optimized will generally not be globally concave and may have irregularities such as saddlepoints or discontinuities. Optimization methods that rely on derivatives of the objective function may be unable to find any optimum at all. Multiple local optima may exist, so that there is no guarantee that a derivative-based method will converge to the global optimum. On the other hand, algorithms that do not use derivative information (such as pure genetic algorithms) are for many problems needlessly poor at local hill climbing. Most statistical problems are regular in a neighborhood of the solution. Therefore, for some portion of the search space, derivative information is useful for such problems. \code{Genoud} also works well for problems that no derivative information exists. For additional documentation and examples please see \url{http://sekhon.berkeley.edu/rgenoud}.} \value{\code{genoud} returns a list with 7 objects. 8 objects are returned if the user has requested the hessian to be calculated at the solution. Please see the \code{hessian} option. The returned objects are: \item{value}{ This variable contains the fitness value at the solution. If \code{lexical} optimization was requested, it is a vector.} \item{par}{ This vector contains the parameter values found at the solution.} \item{gradients}{ This vector contains the gradients found at the solution. If no gradients were calculated, they are reported to be \code{NA}.} \item{generations}{ This variable contains the number of generations \code{genoud} ran for.} \item{peakgeneration}{ This variable contains the generation number at which \code{genoud} found the solution.} \item{pop.size}{ This variable contains the population size that \code{genoud} actually used. See \code{pop.size} for why this value may differ from the population size the user requested.} \item{operators}{ This vector reports the actual number of operators (of each type) \code{genoud} used. Please see the Operators Section for details.} \item{hessian}{ If the user has requested the hessian matrix to be returned (via the \code{hessian} flag), the hessian at the solution will be returned. The user may use this matrix to calculate standard errors.} } \section{Operators}{ \code{Genoud} has nine operators that it uses. The integer values which are assigned to each of these operators (P1\eqn{\cdots}{...}P9) are weights. \code{Genoud} calculates the sum of \eqn{s = P1+P2+\cdots+P9}{s = P1+P2+...+P9}. Each operator is assigned a weight equal to \eqn{W_{n} = \frac{s}{P_{n}}}{W_n = s/(P_n)}. The number of times an operator is called usually equals \eqn{c_{n} = W_{n} \times pop.size}{c_n = W_n * pop.size}. \cr Operators 6 (Simple Crossover) and 8 (Heuristic Crossover) require an even number of individuals to work on---i.e., they require two parents. Therefore, the \code{pop.size} variable and the operators sets must be such that these three operators have an even number of individuals to work with. If this does not occur, \code{genoud} automatically upwardly adjusts the population size to make this constraint hold. \cr Strong uniqueness checks have been built into the operators to help ensure that the operators produce offspring different from their parents, but this does not always happen. \cr Note that \code{genoud} always keeps the best individual each generation. \cr \code{genoud}'s 9 operators are: \cr \enumerate{ \item Cloning \item Uniform Mutation \item Boundary Mutation \item Non-Uniform Crossover \item Polytope Crossover \item Simple Crossover \item Whole Non-Uniform Mutation \item Heuristic Crossover \item Local-Minimum Crossover: BFGS} For more information please see Table 1 of the reference article: \url{http://sekhon.berkeley.edu/papers/rgenoudJSS.pdf}.} \note{ The most important options affecting performance are those determining population size (\code{pop.size}) and the number of generations the algorithm runs (\code{max.generations}, \code{wait.generations}, \code{hard.generation.limit} and \code{gradient.check}). Search performance is expected to improve as the population size and the number of generations the program runs for increase. These and the other options should be adjusted for the problem at hand. Please pay particular attention to the search domains (\code{Domains} and \code{default.domains}). For more information please see the reference article. \cr Linear and nonlinear constraints among the parameters can be introduced by users in their fit function. For example, if the sum of parameters 1 and 2 must be less than 725, the following can be placed in the fit function the user is going to have \code{genoud} maximize: \code{if ( (parm1 + parm2) >= 725) \{ return(-99999999) \}}. In this example, a very bad fit value is returned to \code{genoud} if the linear constrain is violated. \code{genoud} will then attempt to find parameter values that satisfy the constraint. \cr Alternatively, one can use lexical optimization where the first criterion is a binary variable that equals 1.0 iff \code{ (parm1 + parm2) < 725} and the second criterion is the fit function, which should also be passed to \code{BFGSfn}. All candidates where \code{ (parm1 + parm2) >= 725} will be ranked below all candidates where \code{ (parm1 + parm2) < 725} and within these two groups, candidates will be ranked by their fit on the second criterion. The optimal candidate is thus the one with the best fit on the second criterion among candidates that satisfy this restriction.} \references{ Mebane, Walter R., Jr. and Jasjeet S. Sekhon. 2011. "Genetic Optimization Using Derivatives: The rgenoud Package for R." \emph{Journal of Statistical Software}, 42(11): 1-26. \url{http://www.jstatsoft.org/v42/i11/} \cr Sekhon, Jasjeet Singh and Walter R. Mebane, Jr. 1998. ``Genetic Optimization Using Derivatives: Theory and Application to Nonlinear Models.'' \emph{Political Analysis}, 7: 187-210. \url{http://sekhon.berkeley.edu/genoud/genoud.pdf} \cr Mebane, Walter R., Jr. and Jasjeet S. Sekhon. 2004. ``Robust Estimation and Outlier Detection for Overdispersed Multinomial Models of Count Data.'' \emph{American Journal of Political Science}, 48 (April): 391-410. \url{http://sekhon.berkeley.edu/multinom.pdf} \cr Bright, H. and R. Enison. 1979. Quasi-Random Number Sequences from a Long-Period TLP Generator with Remarks on Application to Cryptography. \emph{Computing Surveys}, 11(4): 357-370. } \author{Walter R. Mebane, Jr., University of Michigan, \email{wmebane@umich.edu}, \url{http://www-personal.umich.edu/~wmebane/} \cr Jasjeet S. Sekhon, UC Berkeley, \email{sekhon@berkeley.edu}, \url{http://sekhon.berkeley.edu/}} \seealso{ \code{\link[stats]{optim}}. } \examples{ #maximize the sin function sin1 <- genoud(sin, nvars=1, max=TRUE) #minimize the sin function sin2 <- genoud(sin, nvars=1, max=FALSE) \dontrun{ #maximize a univariate normal mixture which looks like a claw claw <- function(xx) { x <- xx[1] y <- (0.46*(dnorm(x,-1.0,2.0/3.0) + dnorm(x,1.0,2.0/3.0)) + (1.0/300.0)*(dnorm(x,-0.5,.01) + dnorm(x,-1.0,.01) + dnorm(x,-1.5,.01)) + (7.0/300.0)*(dnorm(x,0.5,.07) + dnorm(x,1.0,.07) + dnorm(x,1.5,.07))) return(y) } claw1 <- genoud(claw, nvars=1,pop.size=3000,max=TRUE) } \dontrun{ #Plot the previous run xx <- seq(-3,3,.05) plot(xx,lapply(xx,claw),type="l",xlab="Parameter",ylab="Fit", main="GENOUD: Maximize the Claw Density") points(claw1$par,claw1$value,col="red") # Maximize a bivariate normal mixture which looks like a claw. biclaw <- function(xx) { mNd2 <- function(x1, x2, mu1, mu2, sigma1, sigma2, rho) { z1 <- (x1-mu1)/sigma1 z2 <- (x2-mu2)/sigma2 w <- (1.0/(2.0*pi*sigma1*sigma2*sqrt(1-rho*rho))) w <- w*exp(-0.5*(z1*z1 - 2*rho*z1*z2 + z2*z2)/(1-rho*rho)) return(w) } x1 <- xx[1]+1 x2 <- xx[2]+1 y <- (0.5*mNd2(x1,x2,0.0,0.0,1.0,1.0,0.0) + 0.1*(mNd2(x1,x2,-1.0,-1.0,0.1,0.1,0.0) + mNd2(x1,x2,-0.5,-0.5,0.1,0.1,0.0) + mNd2(x1,x2,0.0,0.0,0.1,0.1,0.0) + mNd2(x1,x2,0.5,0.5,0.1,0.1,0.0) + mNd2(x1,x2,1.0,1.0,0.1,0.1,0.0))) return(y) } biclaw1 <- genoud(biclaw, default.domains=20, nvars=2,pop.size=5000,max=TRUE) } # For more examples see: http://sekhon.berkeley.edu/rgenoud/R. } \keyword{optimize} \keyword{nonlinear} % LocalWords: genoud GENetic GAs fn nvars max MemoryMatrix BFGS hessian unif % LocalWords: stdout Polytope cr emph eqn GENOUD's peakgeneration dfrac optim % LocalWords: seealso saddlepoints lapply xlab ylab biclaw mNd polytope cdots % LocalWords: frac url jasjeet RGENOUD PVM MPI parm Overdispersed UC dontrun % LocalWords: bivariate CPUs startup Genoud's GenMatch tempdir makeCluster % LocalWords: localhost musil deckard makePSOCKcluster usernames univariate % LocalWords: SANN dQuote BFGSburnin BFGSfn BFGShelp myCriterion iff Mebane TLP % LocalWords: Singh rgenoud Multinomial Enison dnorm pseudorandom Tausworthe % LocalWords: nondefault args vals envir Nelder myTransformation criter % LocalWords: myObjective rgenoud/.Rinstignore0000644000176200001440000000007313272736167014237 0ustar liggesusersinst/doc/Figures/* inst/doc/Figures README.md .git .git/* rgenoud/INDEX0000644000176200001440000000007713171743040012513 0ustar liggesusersgenoud GENetic Optimization Using Derivatives