rgenoud/0000755000176200001440000000000012553121055011714 5ustar liggesusersrgenoud/inst/0000755000176200001440000000000012163254567012705 5ustar liggesusersrgenoud/inst/CITATION0000644000176200001440000000273211560203507014032 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/0000755000176200001440000000000012553042713013441 5ustar liggesusersrgenoud/inst/doc/Figures/0000755000176200001440000000000012142033214015033 5ustar liggesusersrgenoud/inst/doc/Figures/fig1.pdf0000644000176200001440000002366711762732324016411 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.pdf0000644000176200001440000011453711762766061017432 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.R0000644000176200001440000001317312553042713015234 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.bib0000644000176200001440000017213711552430730015573 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.Rnw0000644000176200001440000021542711762766337015627 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.pdf0000644000176200001440000166614212105141670015612 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 1853 /Length2 11746 /Length3 0 /Length 12888 /Filter /FlateDecode >> stream xڍP\րnkp4Cww'\rr*z}ǜcLYI$egPgcr0#PQA4AN`;[H8Ld&ovv9kC;G~+ 9!PI{8-,@ 09&EgK[F5@9{OZAKgg{~777f'f;G a:F r94 hb3f*%/#&ANo.f G[r@d_p{l hgcobA%)fgwgF&Nvo&&`k7?+7HL='#ى lG,y;fv66 [g'?;oZڹz `[3?0sgѰ;d%6y!#9XYYy hGxu{П?ox{ߚyAo_N& ߊ%66 0Ym&ov豾 ?ELI[\]ᯎsx2qعXloy7?)U6]ܿ"ښӇcA7GYh}}V.V #߂\TQ؀=6xe緵P{[kkNm9l-{`');L kso e;'+ѽuvS@o)?X;v.nſm?@6֜7z?D7EHxX,RECo1!?`Q/T,[[2-&) ,-9_ڷ,·F,oXz[x[)6nmYo r; 9 ߮_v.·2\["?s&? rVA׉1L Qh1y8v<&fl9ފ%}]%}oT;SC`P{.yDm - $,k(93 e)tcR35S4pTe5#eFD`߇ bm3^3n)ikfjy]u^u 'ޗqg\L%OƤ-puیKi\ΎѪؽBL 8h wq"I. |xflCZ6 5[RظkY1uwm4CvOUZaoe92q"#=G)Dhٹnv;x ml ~yeYQJJm$~L>.lJ'aH3gbl7Nf6*,(} ":’[cD:iTCY.cbc z+kE**v-(1V~z-nZ1Wg' N^ Ki$:nxw16gѳ${}'[e vg#8@ 9 EL_Jm- S4y5:-3cBsC?G9ӿ8L:Kē+b(ԩ5_'++Ze /k2.(rvsS5EqK/Yp*TCSL+B?}/ݡ (2J< .g‹:Y]'0vECwg\Hq(?\2%{McG&HW\u#U&faƾ$M@) =qjYئ=Άqs(/%=AD/-FYlH!y 詜!3Ƹ\K'պqn/cΖJS}G\a^+#L;lh q;Qw\GC moc9.C1WRi[ZV.|5P- t i}Rl^ p-=F4,NuMz8rhv=?D*~7yV]84AF3 q ݈>vCMyzoi%}4B>e+rNMK(MldH,'чq;ԋ4iS |įJq A4Q]-oMiF݋ 9Âm&na_;(^\?xK gsdD$R"l,3򻙇CruguhAc6~K6!\Y\A}2}4"$h|&e@CDSfer_e(Z4&=r!S_}\Q7fqȳ͹>$|Wpgd<ߙq32/rI)ٵzkv߃Fm%Kyq,ZNÙLZ 9hAzR+2)牞&gmIx5DtlzknxrH5 ڔݽ2VҍXYd?N^$̀#?1ݺTŒAKx ~FCUYGvr> kQ7 j(RWBpͻ+_Oށip6TK1eUr0\mȥ}ͳ^0n06ϑ.G*.{&NSO"gީ :d(7hr7)xPmǣ =JV`N) V=F=@o$Z:*+3mػG̫L$'\^1+nIƊw;׫f4? U#+\~ 'a:^so9 %py9mڬշ% H>c7<e1xWΉ)([ %+L4_R |[[BU<1Sg);ߥkCwۿ@eG;4=0\ a}p$aJ*ęMRBy։CAo@9D+w1k)\bX)!?88jw<2Ep5ԭ*!S{Z!';\2\0ۿ+6b>AFҬ[nddnE! )p*li'Qznէ_t֧RΧKI.6e~pևlhU.9 ֍DVi?z}jcB%K 9/Oy~D'_b˥Ӡ{2̕ߌY˩[%36z )"&2G_8V/8,T0ê fu$ꬻ:PVlٚi=·5%a-ux; Ua:#cE^D " s&1a7 V([|/;,O%0ndLn9,NWnnH73rdwxbd YK@)W8 ۘ#L(eÌBJ3 KҔDD&?|"SA)i/xŘsw8A$HIE>B2fݢ% ."Z݈JtÏ3? YJ+2emi]c E-'$Ce:35Ex ?Qg͋aJLExN[c3=+ RUN^úS余",rgO4D J̅g>wx&x,\]DIw@O@,}5Q|ITW(hhùZiBTS1H^>n9dij7.E8gZ%a=?k Qӯ[|q9Bu-Q^T6HW?@{-O^,$u%3y퉝b&Ò9vu)czx< 2.E?>}acs0ז^lr/ 4JtxL-JyB,! k} 0kS4Uzm F^ q* s VX=U+*#([ɣLPC#,9ʝL9žFUXȟ:aFR0l#BfX_rC _qlI֭2$"ŚJߙP+{ VCX/->U eS\?Q YGXԠ^}:AA9*!OcοegҖ78+QpIHeèuW;`~oD\ҲX_pHZz.ė#ۨ-Yh>j RO!-|ҳL^`ۻƻIHWy?U4"W3Y#VoO-owV 7l<5k;6խ0Jr񳈃DO?V׊fnUd$Ymq}xƚ/#n w.1U܈c}js7n b fŀRgJQ M IJuB1:ˎUa քar@ܫ WNBiՇl*Н*@)>}aԳi5xx]Vv>qypjz; X;ԫ7'U,Rg!Hޫl8:HưicJ:( %a)1R;{ +yݩYcE93ēadXq J0!ꌺT!̜4&>s_pMQ<O X~ri ."ˊ&D[7q-e~/m{yN k?i$U 'P!k?(K9?ɠ&loCZMA; 1E0 ?Z_ RHK5gcLWU Q`\Йh~0+mO[=?h[C9e8. v#~wc+\"W3Q zS pkqK}lAsDʗ8CC8 GZ0Vvo0:#~ l8 ]/eݠd Jܡwt+*CKC8|pݸ<q ړPz{)qMzhrJ 1ѕ,Ab0 zuޯgU>Nkᴱ3x7,^ZޗnzT=tnY&l6m0Hc\!vEOUS#e ܴr:!/B`&<9k6Bj8YpD콘5 ۫ÞfdPRgʪ è4G;/Ǔ΁Oʀ{I~Uº$#_KdOIc{̉vMJV %NZ(匢bAU-Av!x1ZGkBpu[q6G[j g[}mmJ^Ͱ&sь %!r8% Q)G@Oj$䝩*oy„l I|2r~W'Ҫ}v#jwcJ&NW5'(u= h<|ٓMvNRx!YPїfnmh8ݢx$-TvU»tUD`g5<=How) yU0;礎^X` 5M'ItW֎XuH4_VzMlOiF-\m1Q^⃶ Vֵl[WQU"Q?npяo@呺4+%*o?- Ԃ}9< #$Kd>jG6WL,lzQKB \ըʏic$C^ xwObڨ4Mۇk, N?'rhtюHfXҩ1 >b{nY /U6t25Iiѯ2J{QLxgHTFXlwP}6L.OW\˛C\yq|* 2MAl:}0B~F̜Ww~gՋNGKf'5A^ HIW6 /þ]h) TO楄aVݧ"'wĤΰpo5q :ja`.sلР3PdfW|`BRS[V~ҵԺF`Nb}7@@DBzb@uerW+yH4[A`.݃hͥ>QY1%<`$z^s*l)g:i#ԼٕZl(B86'h3D5q/FF,Y_6_=ťf\'iiekN߲?],y\ 5;Ċ&]F=k T(ٛ=5\EcR͹6V&K1WKL_\o>w>TT 5E;]`-D{:")ؾyPV2E숅VRu[,mٴv1m# z<0[t/>T.ٮ㌮ ECq;Tqi^v1 K8kֵ&Cu-+DC|ɰgt4i .!X[)Tm<1!kRmcB ~,Er045"ҙ-?{1 ˣS5 W6s3: tIE$a{5ʷU6xrhxkbA?|^~t]$fvQRpqU3aSOIRS+4\Cl<%{H/>a659R~ ye΂@Ź=jyR4?dC[b58Wȗ޽<;v%FT{1dpfB=*!0؃-'~ ȥxa>wi&qKxEhiPT~a(Kc|3ѮeYZ\֐U'v ^y >'#eY\X\a+J>F!7V3P,Q{4C5CsJuX $t@?Am#g[sI7 Zt89V,zlyU-$D1!# F4gۧK %yu7~Bjq$蠤IgW;x^5Z~Z'6Sk;lᅧ!;`!Og Q2 㑢+51)fLC7s-_ES2*dqG`ȣ.ۢ:WRN)4;D !{qq^_OIy~ GAG8fۢ< _*@?)lqwΛfHk$xҺ?lN0TFs" ]H5qbtLpɺ]>EGApskBh72lG)XX`}gNʧɬ!XvY.e~EF}N% 2b&CsH2ijYZ8 >PX7"jopS=Jv11&lVykv'*5WƗIڋs8[DF4/e5A=CJ(5P¼WXݾ] [Òae7hݐʂo_6I3"9ګ{%: $wASM XRV\ZX.!x/@.)ˠ*h,a^xWl>t䀤Aҵ4MŘr'|Nro@<^a"wJNCPn<%O|4 JíY0o뜭%8 -͞'fA/j<-.@/_N+Jr5?+,:y8k(BqwFJ[vKb=&oDE*mù]>nty} uНNc-eED196]2 ZaBS^ʹCdQkrue:[#hK0>ېqY| ՁF2G匣tWFRc)DAoFDž]aԪ+AraT1RCd(i)utDOyS\6FSrFo;Eh`P4PQ—B0T,!~ʡ>'Rq38A0W[r#߫ȣchJcR4+9Sik<:]7ȣPnn#W!L"Is[xzlBu8KD]>1dhEr_rcEzw|…l}*{qglF#&M묝q|B셰a$۰*6Z5Z _heE7[(3rN/uy@Cv&>&6Bqm}gHsQцƂڹd\NFnzOCZO܋f!*L$Mٵ#0Ïl>-F =iݏۼp PzLXġ8"ca-o@Ivhz.6l%?x.*Y~Q =VIPƵ6> %LMc2Ɯ&oH#e+,9rZk!2?7&xCϙԜS0oN2aXͽB5TNxHOXZ:dZO3U\WuS=_m^sp蘧&"8iZ}=]֙W~*3"[O,F$ !_||OBo6*znmAyr挮j`vOvۄ9H?%$Q$]+L|9Cn7hB\^ H4x4O ~J*dzQҸO9!Nּ% TGŹ&#vTM:xưf. %jPYR` z;yhFVz/ FAD8N+eʎAciKw Dx"o 7ںCd\B%^4@G[E !noI`}9Ȣ8tfsz?2l ;7H"۪VHx2[U_s:o\@x07v \)ڗZ?/V*lt5уmK ,|F)Ǘ(3ȰhO/:h:BU pccZ̡\;fh'[(*iB*ŮZK OUz$ŗҥŽobzZY Nb04- 8ƴq +gͨAbYXp̽VeީbpR,\szLH`{}>VN19Lg%CZz7x1ojč׹uBAzVΛa.2s;>O+Y{WZ"<#TCdEA᧟}yP HۺB$IK.xZ/l/O3t)Ŕ-0h?iy giw/am9nʂ Kؓчk2Fɺ+ "R.3^ Vӱ\UoohK9-SYƶrtQfyvy$8y*ߧ`ƅ}"үЋ$uxxN8 Q880r8VUoж*JۛNrhRIj:- eׁsHuzpP?)]YO7G2Ϲ۞9ڭK#6I}všHks desOz"O# z?^l'n%Xfeq:jg[-f3ssLz5n+-yvŲ^>ұAJ PX>*dЬGjQ+Tvt`9[~> stream xڍP-spwwwww$ !@p %@pw 3sWWTzuݛB]E$.R`ss"hAhtAn`'G)\A@WN*Tqr(z8|Nvv\@O%@rCrrq[۸OC@wltm@'ZZN`qwwdcb::Z206Md ]2@4V$ Ox% GWGK+t2@XO3pr/߁8-,>`GkPUfuvg- nN@O h*#u @VB|,\nn`5z2RN Gw7I]AWsV˰pfqxҼRHp w;;;/?y[ذ>@7ZC3 P  zmo[A`G ?k]Cu,}b6Y=YmJ() cp88x|O@_+@"^o?x5 OPuzg7bax^?\fwoF@_yp  q_υt_;uC$F,dvsӅ`G``gYؽ>*nz]>Rq Azm+q.%::^ X9"(/M7_HA6k"l^  2?kt׊&_C: spp\_w7ya^W`{ex9KJx |-_-pu}}X~6@ 9' ۚ* b/q6{4$wkIC[2WO~GMua͉-S;-H?&'$jHIXw\uA7Av(dxbzy,~حUB~,fщ6z[&ŪxT;S傠d:`;SSi! d䁐|+ 1Jtx'l7]=& GN.rȽU߷ &ZDOHy0Q,/>'&JY~yKqj'ܞYVURo#T*q4~\ {R"K1CR(Q DZ=B©*7KylA2^#>[mK(wx5-VFI|'d@ L/T#^-T-#Q/SX''J ^X咼ʶo9%~uVe"#U-+d=.%wwxzzL8ͬYВPFKWXNhdVc^pmsמБ\qO#ŢFoy DR7FӣN԰J?n(Wn]1nrN&s&/Ev2']~ 6!^{fJJh\nvmr sF9[m$6 uHB3.M'z ="z@ʀ˜V6qDLT[Z w{t*5|uM `\IyT y(k1Ww/ WE'IF2(e<1y}5A}cC]a(@9iR!^`۱k݄[x`'> 2W;p%T B^W/jX@郣F,Kۚse'h^8ƀ>2o#.0U0`N=mrLzܑ@ jA#A/?h Ւf ]S yԽjxR?{;p]9ׅ+X~fѵu>3X LW͆,JiR{HQ:02QR-\Ys6 Ͻ2ewo GǼ+\ꩴͬ[ybJfC9 O/B5emѢse]GwgK,a7;ņ Pe'}=({|\}*+>!bw5q%'/yIU;4TcÐAœ1uF*ix pCDp8E83Jg,d¿[\[7SLjz'X5eBb!֭kD5?2 3laKln&ǒ>rG lwއ5v 4'YбLdR])"V‰By* b>h/B7Q-V!;$7MŖ`_ P; ghMH,}­șL* xK[7%hr>߸-1T?n4QE+uRo!%DD&n]&A׌;W2 *ɆLsɦ)}ԹT⪶rX`$(׳b__?~ d4c<^^aתWI& F oL:Bj3TsI[l3* %eWi;萤cI[7Wݿt s BStbj2 5l~%܇GY['9.RАtD|-nYoϪ~[ ب[OmS#0 O75s ejA$)wXJc.I5r@隙Jpugk.bAr4ܨ]|A􄢘@eS%?&zǔtV Qe+sү|0 ԀԌu~#Y 4m9(0RH抈ͽ.> @j*p/kh7&'y }&[ ovs4ʑ(5~˃%"";'l1 |VI y4cta|VTv<793A#l=*"&"* >99rDm5F\r1 v"{) C}?տD:ٟ`LdKiaL.U?"}X}ȣ̇ ٔ1jEV<j7YgĖu}F1h=wL%pR-ILEKPq>DzKM/gѾ)J X0R! w%W&F]# *$ӧ]av~>&D1c[o+0_Eٻ(%Mntu,;x,ħC3j'")ivn(ӽ^l.?F)zxQ3qiSjɭ ? {s^(kKWJ9[;WtSO8!,3| 1oήBdcgn) k/],m>wDJ9!%bGe})ZOqlQ7鬤˟!d@~oƱmg8ӡ*+aG?L%.M*n7j~L=Zag á*eI9>"m 3K )=4Cuh* {V!N W5sɦZ g2ȮtiC t⁊545=OvR)7Nz>f,L1 ݤpU{e*nMq-2o~F| /m|~%`KVQM|bLKiג#Jir;6D>C/=ۊ]q>p `T`[8(0_S|++!϶i3#M9o`IwW$rOQmcpn\AUllbN5Ҋ[,vJi Tӗ`ԃecp}veu)=ܗ 0s܋H3ܽa,ݩwj2*p*M%boi4R4дE!p>@k>A*<^Dhǫnhuۄ$L: 2J&K4uZQJ}%Y|.a^rO?3u#Ts<;Lp)|ZOn^8Χ r1"e#C+Ւ|+ޙSe"X#4sq#/KV] *#ɰ/e41wk]؈8xN?\7igCy58q+K&pCc0~:gщR44<&xdǝ gY szd xG'K+Jq(ݟ.8$zsjT瘵έMLC#+Ygo}krL\eր.Kq*y/U5lu楘AQg BKribb@]mgoy_j 87&`'%-54oQ\-Wї}R/];Ii(J}Y% \!Uyʛ11ݟ.%<.l1}B 4 e}x)X0ֺo0' lhe IyU "cO Aoqj]:hC@Jiyj^jnwzJEszVSUtz R*&s9hT}]U"2m0GF`.y:sǃաk: %!|8= 0O )j`Vrf81@iCqdzpNȽ+%)Xy{ʹވsx`݀ufINfe!(#Σk#? sb; ! \DIW6iC'cij(<|GC9JR:. visP.8il'ڦBځKpT;+M3;6,xU0Kㄫ?bϲOq3w;Him4Wt>$VoȽYnalN,ݢaL>2a?7^2#QgFk[Be3R5d'Ww4.=u/ds^-#zMkH]cDGUYj.&'h58m >R%8Aa7"c;mJh|ɨKG_c\BJ aey͵$ߒ̝c&3*B]{9u0{|zto 2`aP"Շ1;.,d9 sj7  7g:Eu摍/}4YTh1t+4Ir}ia5D-*Nm\~tgk5Hcs# [Ҏ'y|T%@Yvד0" ,3pDވQ6YjHYrI@rjz-I-®%l/Y1\EZRFWnVgUL C8%_X|fBΥbpua̙-ƛANs?sb.UhBX8Uoa6iz"+iNDwG=s ZV8<3ܼ~W'`V)gCwܺa2@) Xyf2yN2;¼ŢoRa/G)?0CjƝs=-+yՒseٽ9`G e(CS-6+oo3 I˜c$9)y̢ޱroGiw8hj-vT"&MXM  5e}>I4AFe"%i RI@BH %'v_~VxkN426p5Z܄)myS^dU,\gV=VGعJ )bY742$8z"hZ(3OwOwG)ݐ߫5f9/duz迪 lZ-tN%\pIR =sBUo֩/ܫ.}˭̭ȔR!K9lqsםc~O |oka/\Ԍk$9 '&6zfc^k=ydGrik%e=mfNAo{Om/ كl7dyU0Q+4ލw~p]tJYmabCq?? ҇4sf$j'ˣ"E"Y؄E'qXoE茅C ЉWV?0B+E8%s'R_#\3u7R[K~of)oWxQq2v\mEr|j:\b%,e5hr-T _=^VƹHčueGb #u翡6ĖK Ievh%)鵊 ,~^lR=]DIZEo Z"% x#C#+Y:@Vy} swz69鴖>j V56ZRY[Pl_P<a8hp+0!'/Zeհt [{&i%vuj i"k$?S ,E䙥\p&r7CUB҉G++* CCHYd?fDo Mz-y%)oډŠ;N}yFV9&_$H^^6SϤ1ż i'qC)\j.ru9V11OwU= ENl݇nQ{$DS45Ѫg%GA愬s"(*f{fTL܆m]j- !>TߨK?%'ȓbĞq$׾V|]AehvCG[ L&glpvT#63%'si:`2y{W^@J C Pipglb +~ xzĚ2 k{aH=\Œ:D0"-Z+aٙL]OH0xLqoԡQsdssYȉzͪ+CVNHk -mQt9M.'Q1{*/ `$HWIhzc12K7`Œ٦ ݲń' t_p5>d|q9[ݹR`\)in{&GÖ|k _ oY'zl 3a- ҧ@v{̄X)6ɉDEmq^z,_8l^^>[iyU0A4^Ҥ>ܓr >JeDZdQ"Eb%ǫ\j2wdW[emlP;rG\qLHlG=#%tfИ$SHI "d@y4a<8FC U,݉ D!ڐJv}H,б@G$[NʻFOr^}a\1:_[#MO'׹X>oYfSftAO[ lhvl3 g Zm.ڐa4!y0&-.Q+Dvu_bX4MS5MRHbМZ83a]MO))ܾ{f>WSjyE{qf ;ֹ>Rqm\H58HJ@~8;7Z^XPٱl.@TTיnKrb2Ì1;C$[njζnVP.y ?pRlɐee Tui!JoN+;LEI,M}0*5hon,Kp՛0/N7z%UWa tzbYHcѝ^3:Ϩd)vGH\)OLDWFK绹e*}K72B %pFXll#W+5 C~Du{Ƀb7ӳiRqMQTQ?elL';Xa_熮 OiaHڻZ&0 ٘ k)u]%14Uⵘ>!L#S.bjr[X;cQrk(_eD7R%~0?FKӥE4y\dzyAOkГhe"šثu8ͺja>v*eƓ Fu +~ˮY dLa;["XIM u.4h+Ifي聤puUx/&Hץ&a^薡YP @~JHL+P })4=K8\| R..cچs]zDC.I扼!I1#Ϭ\ַub xs%+N w&&[9~leiON%VS@85B Mju1|P9LD=giH};,E̗9#4[30p)yƾ;WCjwzHN ̹fm0!UiV0{ c\ 5a,l1E$lfy%w|H/Tb˃J͠ޱwIs?5s|vɭ{EC%t] ԫ3Cg8P&_LcDWG vcǣ[Pd]ex2f}S]P'g3%F,6jHΦgunȚ ol81mr +?"|&X3.\!HeUCDOE+ endstream endobj 531 0 obj << /Length1 2168 /Length2 15410 /Length3 0 /Length 16692 /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>={U1Q hfwdž >@u?0C_Ho;솶6gِu0@ ٘_DŽm{N&j6@SE;'˿8:&Fc9c돇]m2M)43k bRS{@s|9ulE?`C?`/q0A+A}CGG?A1G>?O}UC4K\d>ZKl6c;+ +_+KGŦZ??4?,*-licPj>TQP?揼ncK?t0}Tp##Cf-.- G?c{G̗ǻ'~љî,[nuۛ#HZqpyBNx'2ҋ#Fy+뤥:5IE?Ayf vycpDnz5x h4Y 'b>[{@x~5 K,]ZN@ 5ʅ;J;t i Ksz*S76)>- a4WiqthTbk-Q oԯ1#r8cm2#N,:W&X'΃W ϨAga}6PaK\~ Fy=^g`>SS@o7_UAFH G,rx ξi V[̀XnJwy";1ǻ(䠺lRm:i-y$aVɯN>6B Q]jhXOf~Sr=Y?S6wdR-l=#U>;DR-\)9Sw.iz y|tUlS`G,J !oA$YMZV=w# 4jon;/}:4E(gur;zY>#B \#;Ʌ*6ݗuzxZ2yؽ+23W7}9Mfu>tDG#(U㗊Hj|P a<)WŽ\,e]\ZZYƘva#R: 3\lFW3Y,GEw_gYH<? zj^5҂DӇ^K9AF)uJ['Q!Wf2_H/P׮ꢕ|ZW>e_uiNYH "E0ԑNBKif247LD1%I*_?ԡt,/',:Jdf*>wnMHm"{j).0+;dRs*OM~_*(%vY TR"k*_IMsAn: *;Հ^4%oe?E4SF;GfS_(f֜{DRQ*Bq-wӄ Q*\J1 َf7%z/:lla)$;+!_0dvU}-r8ϴ&oi)pz (S]~]X%0J2^T+| !&mv8?WRp,Leߍ+H!ٻdbe 56=sBg}Ψ0ee֫jt~9W.[vֽ ̂HVfpd-<9<{*MXZw>7eսV ]Zj,vV7 AM2F\v"S }@3/M27HK &&_-$>Z9Cu醹J;Jis6 ɯL8E*)k0k#ĒSՈH̓ȥjҵmCY3WLRmrAFɬrJa~y1Tjo4 1W<ߥr3pT(GoSBGh\59^!~c7]8qrVХ9˸d`?%] TNMGD玭~5V mŞmuZ <&}"!6CYƇÿ40 KB) Wtk*"o ɛZNl ٦*爳|,V] B|HtJmEE&05 O+ҽΑzNnHtC2 72Re̐)UFT)10@zI5!Ps˛e*||QEV%ܸ,Ȩ+2$R'B!wd_rRn—zMbjn_>7oUq-JDzYۍΓq)P^߱touyO0$|TH /5ZPe!Vyo3$HQoc L{d*菀Bpo35Ϊ_<؉3ⴞblJWX'RzMpd4mҙJ7-ᤌ,漌[;ѠLE> 78e}T}Ok\a Z{93BV%΂b\SE/糼Z:̒#j=lab¿yso";N\&V>k>h亄@ŜKJr8v`QGVT7,;yyrqzutR%AO̅1wjѿo+kρZTs3ņ4,ev$rdfxwyDZ5g&-L̿KnF67>êCLAۙt'܌ShBnE+OuY^B: ʳTQܞ*ҲxVz@fU}eП!1|)}6\{މa ;:4p,g 呗0An/B1 qH%`]7߼Xo+vtĀ:_y\^{])ihEJ';4Ҵ;߱nZ̤mJ% * Vsf>ȇ`g Gr ` KGP, Yw{* 2+AP\eqqF#fg254-#/q} y_d,k 7T^v@,?}qu';H4MΈy.V+0f> slQS}τ! o_Ρ\+лQ;Z)oO`6/w B!ilsg|=Cs:!jj9MD`F ӚW8*wq5O8}'a{2,ӱi"!PLLȈR'ܭ|eZ4AD|}1C\c%*> [n8f`j,q7NAWe-\N~u ?@A# M$7-";O+5Ce^{^7uxmݮMy&V^(va#*f)綧{!b m{l}#oUhW*D,f2ӵ2ڈW;ӽ<00-G]NB~UMLGb*H8FW=u!C=s::]ax .{>][\׊3c5l0G ?_sވ<=3%.hZB%؎'d7+Z`kQEydrQf: Xuʱ~!x.fRX~_|T25R,)#ˡ̤ٞ;Cc]n?{]c"XGmhGg+5`9a<3"'Ǖț 6mJGWb!g5W :61&5U8m Ұ H'b,Pb.d!;iwgŹo$ȉH6c#r]89Y;Cfr>BK7p-l tݺ{p{xżdlL "wsaji Yvc6P׾cڡc0ǵxuaST[rЂ0f2ʭEvsQ r5TҥhO f}{E 7$E^3S6lW{dknQv}ȼ2RǛB,qRI@Z bY.Bێƌj*L6@;Tϗ+¶9pGR+bix_ ^7]x6uIM ȭ$SM4 b8;ҩ!Rd'c{FOӘ}h6J@TkԓfHxbK"7$] J4gdOCoK+ 䢝6X{O4T^)L * E"bohlL}Gx+۹G RK~_α#UϷx\.N!^x!ln+geg2 z OLbz( R{+m̉n)g5IXsbZMÂ,*s/j rc7b0MM2(]&wT8 ?矝;"\RVs."-|Ͱy Ixzjd@Z]=0ldfQ | E 'EPlT]Sކ ڗ G!̂x[U.SLK~zu5c_|q$>ANErNy>]b[FEG=`qQg8$/ COd{^V*wQM~5M Ԅi'{ Jf%aR ׼QӃ0ͺ& qD nTwo{R/N |[1%YiY^X:ν(о5S Ab38kЯI}˾m&V C ؆G^Ւ2`%-d2NeRG㷢r:mR|#C?ii!t2/^~cpxmu ۟JA3ti]7hJ4Z]Pgw2+5b4,wBIYxRb =AUO<T1e:%ǚ-n`%5 XS% GT)">eZApR*-Gin7@z{)_TOKH贂#&-?Ҿǝy{: *N Ħ#vw1Oz,*r=AXhFdB`Tك:7Z^~FH{>_:yo(;3f Ǘ2m)yu9GhBE3ɽ+Gɝ)z1eh?R'C>c D'ݩ7vʻ;} %Ra5ޱ~b(<(g%W!1{Bd LYB0/J$4,Qywj@)F ->¥}YLDa GӚOPX~VDUdnP{=Kfh6[JE6aвӾ䋴Ǖ$kk2ќ_9pLx}H|#Eb$"!NZۮIzS;̇C֦Ѐjixd=)KS:"b0GqKWÇl|0l;`w)+W SmVY_2pyfF|Eo`%5Y6=C>/5N}%C+HTAauiU<I$g0|!ȏCƓ7dc]KgM: b54} 1=w W(Qi.X)#7w.A/qoQt 1{'c&o&I4h9Ze}jA98;[Mv}٧GC/d{rwY)D",MIB0'9o;^/VfrrC5͂Y n4e'wuW%Z]= O|WxU^-Pu깪Db `P 8%q6T_:p/ξ߬GbmcL B!nÃld@/ڽzկO pۖ^|Ulq~:ndCtb ST(~>ʉϋTAɱgNG:B{Jt$NB_DYp O.}v _R"oP~0-yƲ7,U X D]Fǝ_5z_4N`PnUC\Ji_ P5Iwϒt@Gg܁ǵhUQR 8'?LN"r٥BxS拚kB?dcfhR2xAWU d;/2r43+&/cGAazuD\*5|i C)2 LӪVp2XFv"c"aŌ蕚%%2R/7JAy䨢*= u$X*wU1vL,Uz7L߇y{)]}"l 0, ۬\{{RtM ^'m\1$QI|w1`5HSI_)Id#&2VܳѬDe {]c6܏ j""}quv6[#tx,39xSygAMHKX3b'q|+Azajp 'tU֓WUb|. RNdPfޭ%H{}f5^Q2gS|o8.[E`dr-c<݋1,i7>ro#xD{JUoo lHFF`PT0㽹_*3 ew² ?_3KVH 7Q#*}/зŧ%7Qt\Kʅ%{<` ʼe.w6 f=/ݖv:]S* ~ʠP''= 5udE쵁87ԭ&%4i&u]E*KmZiPGe4+yyHQ&|ؾTȺ /X=CBWtP]knp"xPwQ]RE2'RH5UBcS_0Ԩfg/#1Pv;P# C-2I }(L%nŒŬ'O_4t*AdEdn,jczNJe7@BR#wO>%wW(OR|qӝȶBHhJP"Ey,\|ԆoXn.G\eJX\^P+ Lsc,`@দq:"*aX#,^\ c;76WAهl726Csmcng9)(":vɷ~*aJCO\|[ATߗJc(w)^j$՟M?C8}B/)ƕbK7:j!y9FP)^Y -WC::8aպ}<1^A{|odHZY6_BئV/:b|$+E=Ө=Rja+h3>J7>7 VPe5D7E(CSUBooNۈ6GB:E6HN6zbNQo~ON 泠ąLxE31 3;UbGqDQr#9 fhohF+̋}&(v8^v>r~^_HAY:Fz-w#fIO\&mv_zUiW6Jpi?\? |#uS*zs z\EQDe8 tW~U 0YZ*xYg8a) )"$ *ssfFC_JV8tuM։hS}.lvWoRԝ<ɚ}YDxU3Eu-g]} @!=qHFFV=1ErL%tmke7WԘ~(]+ÏGtqyE#e/c 7 ꦴ˝ ;DPk|T5;RPHSk}1vXLюx\UMN]4 ~ <胉 ։dY5bvB Sxu eE#B`= YIX$3O!; [cY~Pv#Â/ }q_PN %.{|sToɮ_,` RU&TVd.N' 4e-=',qtd6 eWfĸGi`oBQ@(^lX#G |j$n_BSƴN+LX&V<&0:/Sk27 cp"Mf-r\R_U~gSHqHDrbm=eϗ"6ZM.z}<:3;UޏIJk4y| OX#gIKܘL5WyX!J5o`ZY^_RU:L]O)uYݕ9jXkfY3yWcKvSaVݛ diZ֐zrQNKq @m^NDwmjj}Ȍ.MQ܋KR$ 2Q%\R3j^᭵ekq{h Cl,նP iq(yk}D;*O>˝syd5&P`dd6p(5wh%ySg!ƹ5ů\j 7Pق<75R,rX>Nro\/[^1GyX`NM,Z?1{ lq8罹)>~q20z1۳mc2kW=7*3|u2hFfN*' zL.|T]}x.KR:gy&B !)*-L|AzWcyT9;~X/ᄻY9/-X>uh'|@FI57_؊ɢm͐RMI:/ 9ؾ0*i k*`|}7=p-a@|RZ @\=-tMbWc)MpVcQ(҃ݗ_ UqZCxd .o ֮T)OF9R;y9@tf< NGI1RTdXIt컇u:;ۋbbT+Ueb& A2nn7ݝ'r;'ZDTꎧq1"b2jYܰ\iĜvbܽ``mmG6Rh/d~n*G:G;{nElyӯrx 1I֊7/NL0ƍQx66ZY/X&Oh{v=Iw?\X1*\H>~{hxWyah<8j:nBEa1\F: zY6IO ]%&֭$|Kh>6[Z/:L_!Ss"~6w2T$#Έ]}kE#ITfڏ+WAOSO}VG"d[= #8X/7c>ԦF[PI &/ t823 ra|.GʡzFHBv^ݐS8]N0>93K=9vνr|R/tY̍^2ڒ:5 춍CZ 6*j^Ͱe\3 ,jxdj!J~4'/2݃ewɺCg(۹kӦXٗjd{rV;s~ ~xONM[29a\+2Hth IyT <8??޻euTʨiIyEb\oVM]RUZ;2nr >rEۓR kYWliQ7O. L 8hW}Av|1YZ#2`3g}jzGX7#vz#[sTA|yGz\E߂=jYoڼ7͜(L;䄶[AzA |ynwgz[ j/M?.ix3P=JEZ\m-qJ=Dޚ_<ڏVtAS6"$éiO|p 7W'U=V2l]h{6kqr0G"H:Jت!ᄦ>Kx0 q"5Ve&p(Hγi {Q8M6(/Z}I"HM2*'߻Pctmr¸T(Q<00Pe9Mf0TT R]m;׸!8N=c 2I<ا]s5An4ӴiqpEI, K˳e! {g*QDƴ^wښ)"N_u$D&r=*$R5( 4I&T+5QiA;|u?Q.eZJś`)0kB gxOoS;t*DS{ELRu}-/Jp1!4|L9sk9[w9he0N㙄(_^AZ!:kF[:q%cf#;4G2CP}%|s.=ؒ'. /V&HH\q2; ȝI>e5>Vttj%EM+a))ؠH?e9 5:,}&$_xͲ7~,VCo.̢2;tʅ$Ny I]yZr7NEtrJz˿]ڛJ:Q(fj./^#ui_3Gvѳba <`eM#˰i?G9nn5O? KWTE?_o qVN%ǵ4R{ƏzK)麿𲯶ǣԁOҕfArp>]G6'#zfd8f{CGFǼNPdP ,6 Lc{mcXv=jÝ۸tDíK7´mc?U^EZ{Nǟ+I{2m)!kyB霝}~MBaʚ$Yw]ymK8fmz< `N\q'" G_WJd> ͍53ϗmݮHdQ.4ѥ Hˮp:Dx9OR\](Db]>7?щ endstream endobj 533 0 obj << /Length1 1502 /Length2 7018 /Length3 0 /Length 8004 /Filter /FlateDecode >> stream xڍtuX. "K. ,KҭHt-"ro><=3yϙ0s J;7(ה3@ ?ȇ'bEpaPO~ DjN?$$|@_@R 4yj8 E⃄ٻvk `p@\P$ 4Pێ@A}S]Eˋƃ@Iqp`=  ;C&ǃxls#u#[ &ymHm@  @< ; ]p` s4xܽݹ`/ qÜַߛdu[2t a.n.A/-? 4f s{BHh߿p@ 8TuCmo o3UQUa997[X'E·V ۫UT"и=x9ʇZ۹9P;_U?d{Rpr` !0'?1~MĭV 5!n9TZ;(njs1Nm'pz b 8>2nw;*!_JHZ?Эdm޿Gߦn lH_7'/ߟ& Ǽ:^[0_/Sώ!H䭶-  L! 5Ϫd׆>D3ZU 8?/mX:_${sјd?#J|][.bɋ7 uS+~^^ב8dkCi6[7\(""MMrղͪn2CIJ[]|˟fKaKx.GRBTV#qvŇGC[ $hcӨ) w>CJ< 1le\,S\$f1󁢾F+ Mn.RSοh 'g-N b plA}ðSM]fjmozrBPuJL(SPȹo&NHrA:yWyb?p'#qo SDfr?ʖxfC%à]JnWlażȺm q>z3;b+YR2;yzxZvԭBl.R> L=(qvskb)|dde0I ~Oxzm&=Oa*Ke7}.,KǤ+A CVBsKcm Lj0s`w^,ީNmz(Ȟ}@HhsJ{ǘLtAO!wdƼ`xЛ INdw.K15a dxJς['^tPE_½Y,U=7F'K{mHBf `3z{soѽ,sߙ*\4\5(a|u]'޶եFi6%7e.S|gvgz$:JC-;}=H+=SO5 yN -Uh\A|Kpr٣G:pؠ?_uM+,4otCxf{(~$9y }žVKdi"% DIb}ŞM&Jw礽Nܗ~Dk}YY>9&p&@-^u(..dkؕ JYP >ʢӗ|bT¦2i;[ٜ/BfMi^-7;f1pܓ-X ׎5?ߪoQu JvB&_|vKmY!l,SNKD K},T|47s=?"]X!jc%~鹽a |#}ZrB%rrvŒP$HWQ 'VmsŪG=T ˧$u{ǪK~NJD>޼5q2d4~zaFNqf+m`AZG+5tdGaV,nƻMOݵ4 H!5$DLng{lфLzP#Uooi.()I.GRs\@+,*cFсKV !*e:r"8A깣%_ItJuxqckOhM50X’[/^{ ?dx%/]j>`Zq;o+@m,z bSv/]o5O&Q2y#|vcTo-99Lo%t)z -"OʍV;4x3 $}C&nirG-@]1d6S>(01\R9N 0-E57eV!G~h=hfM)ZelQ(v%K'ХЁle{:B5 șmO3- oY@I4{KUY6 ezzGQcLqeD1 ~=${ fRwۏ7Ġ̔4qzZTnf]YL?t<l<!40h^юf ^[86<:>˒hX-<m ֝B>q-\dơ[7Lf}tJM R+1_(`y'|El!:iZ}wJl_>{x;Mruz`jܦCzZOfȞKU&b("{4CNxՍkتJ+ŊD9w[ N@Zkӄ <5 }34VSGxm&wOMx]74oK'xK3LkBK>2CkZFEGm Aw z~cUE̻_6?𬭙% w|0(FQ#6+S QLg[3pn v zxgtGfP~49˦FuLUyK{+ۦxpDDba U,Yds6)@c/p6 cBiO1ODtK، V^:uS'(d%}fOa' 0@fX/l ksf\O*_Ւ2Q"Pǁfd}Qw$ޏGη)af#tX>-aQ9}y0^Lm1a0|)Zyw_XirtxmٕWGQch4Ɠ_֣͒(̉<]r!Cw{p]>f;b(Kag+,FEؖ 6{9~j齃wov}5-re{7߾i ^i92[EE1 mV^zz+̐kY!짟w fQ}'7бuHϭyHfC"dsj]`F@'e dARZl.dPL_Nvu9άCp{q g*Iլ.>.aRQ.^S 3Er78?]"<Ӊ3QhvɘT*SN_`7P ⛿Dd$E:,bewq?1 IH:qx E9Q۽Mji{*Vנ1QZXT 9Q/ESc=112!/mǺ&xr30cik^G4kT1 V)OЈD'bsԳwmЪvU.c& 37m8jrylR5Qp\̚]8)4KXk_> .+ ?֐&*| PvL$6U(S1VOVaCc)"KBrGD%"ҎyF=R)&)i~/{og&h(fրEx#),Դ1N-PPό5ѸQegg̮l*3a1j߻p3#nU7_[=b+"6N3֕;T#B,דf.sͶwtHKI%y[T045\lJT|²FÝ|1U?JvjcnMkn6?sӖuˆ@5nX j ws1v Vn77{|Љd֜uÍ|1y2hPx h, ˼i{|+e㪓,%a#yT/3\/ 3^[|m)S_eА/wƛN꩏ynXnڟj/6+)ݒ0s%Ueε4t\G7Xz8P A4:5{Y5S*8Em{.ILMC/' ϦȊE& 6c_\ qW&`Uѭu%lEI(CeUld\/~}tʈy*K%wɹRZO`$:Yx^ Gs/,WtWr1A!{xn5#vg7%zTڑʘ[:@ET TvGCUCԃJRXUDkb/ٱqow>?mfCN$~QD'~&oD| J ,>Qv;ˇaHw8ʹA婕&y*?WC7MW(lUfV8S8ph܇|"χXւ~NW"}q? ;ؚTEjgFΑ~zoH>*&NvBQɀs m֡ٔ:[i=9(UT%SE_&vȩKVy9:)~n2/z%)°?[#`bYz=&'ײM&*YR <ߥ} QOm?}ƬE_y\KZ%V-M@{GCk o b;ͩF8ē)Ŀv`Z3y+X@Zfʫd xméFpҡzfh4:q>N2k)*.AiOl*V$r.NJ0@9Fd,~Nf~dvf$}He61Idro66khΧ lO~ob.zMWLnJbj<ZRolxQTXZwHUHdhFDA IZʃ зJ;x+wbyj\Be} brz>3j?D-_Zy/%D?* Mw&Wy\Ҫl[&-=wŨdWZPƍV&|^Ui[a‹83+J!o?0߹*n&7=TWS ,:үI+I} DDe,ԋƯm$DuLX#,¶LV0?=~a2;MA7xy8#@2aI=sX?`LFAElb;=kӷt"u9H6jEy;ߒ#t9G}HǭI)3l :/ ¬Q ]{)]Ʀ}~T#ã4Et)K"un9R"ObbI*s@,+4{*|-z; :pTk1*B'GYX"|Cc endstream endobj 535 0 obj << /Length1 1848 /Length2 12473 /Length3 0 /Length 13612 /Filter /FlateDecode >> stream xڍeTiq N;-\{f{fǞ:}%:(wadeb+hȲXXؙXX()5\lk(NV {؈;]e.力 {-`ca!ȉ afePdȁ O'+ KL 1r3:Y],vMm S+tqqcfvwwg2sf9Y2ܭ\,j@g G%c;_1!P4,R;[+S󻓫 .PvX_ p#Ʀ ;c{O+{ -,07ofleklng)QU{ř.~Вf ;;3IX9MOޓ+{Vfbio ջo :$tSއ` l8}oB`eYLVGSdgyBVϙo?/YSQEBWR<ތlF6N+7ߑ:T#96?{>h>Πzk 50`d1}c^?]_;G5ߚ\mmealgeovuyE6_-5_[;#+ ǿVRV@3+S==Pl݋t+hjq~?U 2 ?V `d> f}Y3ǟc`f;Z.NYo0KE,f,7q7Yo0+E<1U&6A/}b7Wf74X75=?r{4~c|Od7/!?=/~.n]eDSϭ}h h2 %pgܟd@N{OP5P\ᚽ rIg a FOz$rC.㩳+ہ|w'v{3 -j7"8 WYT-Uw?aΘ!&#aqyx!;E:jEgd)L'I?q 3[m 9dqRI>tИ8$We,= ybZJn5 uU6`U:wmK!ag ; =:7V5L?&P>O)ϐhsri~eLt/?,Uqj6'\.gɒ7[0ߌt8r>Ͽ:14L\>싩Wbl-} @@jDYwW8lәdpU⿠qdyNWN; ~h5\ڲkQ]/9ٱ!XA_-1kOq5`g`\-U'lH ,͟Y,|EJb(qC Lh>p0SYڕ9KPC5,r[ ( K߷-gwϮ뼢Џ%83\',g_GB$1~1f1@veΪJCІg{M{r#Wӝ1]"˧']gې)q ϱF)gE O F-[5 KS{,:`R J¦m7(L@&hD3vmUȖi`sRѐ)CQ) ~38cȧqrE>% B9;めGD  NQo12]J nS XT{֡G()"jX\ۗτ5:bP#~ $d[rvh˼m_H'Xh8l{} ߻[tDk&Zij~1%@1;PYGPXaxrH08+ oV93ē:*3ܧ{,̖#|s{1y]݂ U>p0RQ`ehlGu-ŻS ̮y]! 8ty0/N7F-NKv+YF2$Tۥc?;|i5y$<#QshFZyK(SW "ׁؕM2zcDQwWbNIh*!nXRZ#N- _o]ĻkJy `V/z*aKN$,2v-d;ɶ0!h,#/H;H '9-@fUr?c?y8eZ(NqӜ5Q-\34{~s^ HLҾR>'OH2gʞ1?}tܠ` I qM귃`Y\BDrrjo ?C Դ#wA$\d<BfrMEK~Ռ)7㬢yfC,{7fW_̪vQ ".ۏ͇#?\lpQ/@b|N'Ĩ,׆[j4,;dJ|+̰KjtТ.ݨ(`FuCi\(v{Ea3`EO nq7aqR@m짏 x]33*,V{K2d;¼Arno007L2C<2,(Bi bѺHBdikd?̕8 c&DuNZTE>ݰXYIzud|4 道\ MQ"*u(F 1VRք2sR0[bSC7%"uh'4p#ab>nPöE>VNa._3cwny.%C;wԭżl̹pJ_*r1Z T|ZNYEEfȿƈ{[2д`ʈPY~a6FA⃰_>'(1.]'yIcpڗKӼOс=:dQ0 e˧27AzcAv*hSx+""kT{@vq d0ֶc`+; #Pi7 Q;\ak_Wt>JB%&#J0(Fs&H5H&{$XhL6GT:E>1ӊ%Y(pr!&rb؀ЬnNn2&" JLUui8GrȂg#`j>`6AwT姒Rr S[Yfa 4ށ [ʋrZGT 0K}!u3SuOk9waVʀZ?'F"I(wwkY^菓!slE[i ⭚=t;\+ 4<.dLuWm͆Ϗ=m~ }Zrυ?1{1  I|z-ηmoBxL6! VZ>iddU&;18JnGIo*n΀PNBlOю`3Ǜ!ӱa9H׌4JA3/!pؿXQR3 +Tdí;.}_4 7\f;N1/E'9|NF#!+ 4604vG|VkGs$%~`'b jTiqo )RK Yn~MɥCҩO&x]#/,̸Úu4h]0|EYhl?T{@F=ug(z-49-B=YhN1j6½ZJkMkw}Y\-!c9zk@6@~ls@|m{w|ܮIа?aDkIjk0@ikFP L\)P*OnvjsBDq5u6i@o^x<ץ!~a^ٚtq;O(ID-9 zSdKj ' f-bt N'LWQ ׎+'hXU"F䔶ߔ;oxp5ll2ÍC_+ ^:Iˌ(h2>փw?h.W|>PBT֋>Q[ܸx(NK{Afÿ̶޵J@ /=+-IcqwZۛޣ?ouPɼ N)x'nDh/F]amDglס 'uA GўϥmRy¬z C#Pݒ|o?ʨVp^O8Do 2TOnDn_~=@ N'+Ivtmr޶mKqbյ6"hm5 sLc}܋ JskzMK_JHnG` CTF"`{*չ:Y~(J>SK-\(osbNC9A*=`Y>Dtk3\Y&xiáu :oTf\EV+I\Py71ebnu LʩBx# ^ox xv!LWo䷻Ys1C7rٲxZ_ YЅ7^[<3z4?}qd<$\iP'Ty+=Jb4&B2Z {D5I.\=wƂQwgspjj6%+Gε,o)2Ĩ750xm2?H;]53_@[/XS&R8wI@4}߁KRȑw9A{W-R!j< 7^Gb? OmMDW6BT_3cz̞BF, v2VAe/䪩1JiHD}(a~젣"/Wa~A/Wq0%:)˿@UGRrvfT39RjPֱ/ wJ4w]}2{KɺFab*óRw.냀F햭 2^g^/$J@&B#.AYZם f.#;2P1EYzw񜂼1:_y#;)uCA `趲P5ºx:%}IyVt-? `&HF_tVU){ e+@G҄;ഡTE)<82?W9{.XG!I *B~*LQϡa7Z5!^OXZb &l8dN62!\^_VzmXGI ]j@Pfv_*@v|Vyt1]~ʝS%{*jh׎is~ELR@Nz j [[ 6]_Yӻ}9JɬsUyŸlͭzz@tyDػ]U  6SȮٳt{$^ԯ.(nz2_ke꺼B!Yt^Ti@HmOP(ɦ?ck,oCNv.w.;㾮 ›ACߔ»xe-y0mý_"_~zRkto"ids޾5`)UJL9dh\vD>ܐ /ݙt$iXuSvf&IP1u"~W % M$s"\yJo5`Vus\v烍z yk2eRd=Κ$$Ũ8]+ScԊ|oKkbPX{8 n,֜{31êǐ]ՁoT@yQa[ V>%|xgs)ȼQ+{zjV`ȋsZRX?FGǯJ5CKl5۵L\%{֟{cWr_ ]H@CnIFUD:uQ/t!ݔqJjVuS=V`٭g疖uZ#*S}12iP=ptbe5Sp*M% ^2:[7'1 GsCs{w5 )zپG#~*~ļJeZ>;1/$ vtf+lK~L-ڰ()QA9CQ|V?9ҳ gh-:? nJpz?J*1_f^0~ 1qPJ˻=^pu|cn_ɴ:BPJ)xI/Q׍p}rRx5~cZOd%IsnC5nB]q_2wl >aWrU& :apR^EyԮ'd$?H }jqF`*=ϩ_"2ʭ :iB5>'De~q ]̮Q@ [VzALX ۶I>@yi#iE֏c!Ӷ9 (4. (cĀ?zm2.Dc j꿼 Җ#=)|r>dGˢ;Z,Y8ݯ WSSn &HG!h4&|ռj 0;zWY 0({#_kئKgV"ySKS@u-qy)\p\ %{;BxL#IrAU$qtpݺɠe @ptZ~Xr d/.yJz*}mhwb=j֖?[j>|a'vR?cL;DUjac:_Y@8>6_<`d`B}bR} :[~-:/aaA7Y Ss*:(z)oQ1XE>f}G-2d:hj7mwYQQrk GP]&\x(1KMnىm PM\%5zF@jQ~de~B#]ujq%1OĻ-,TAsMhJE @5&œL%xէ/:n;Y7/ŤTrah &;ŒBV)zL`\bÞDB:{5S{پf60] W.d33LPBnf!zkJ֘4TFZ0+ y]Nf|ls)4uWDMO<_GQ)mdV%:g&޶ǿV7f/%UA]Nd/蔂w4J6sV [>P_ !TADYIIz@MN(Hj ^k.R{.~j"f&M =Ğ@86d~#zΆ($ޖo`ʏ,BO|)YNBN,rn&4* (RvMQ`==occ'<ʣŚ6V BC=UY[|,ֿqs4st  GGһ[l)J/6q4Hd2A曦tH o[W `}Rv?J``4;5' )atwݤ ~}?mVCU=[;UdH#=`z? I˅6k?49>cWmMiGb=d83h1*Lp/=oz'5Zt(OYgg@kT3J:^GYɎ`4{#t^_9GDj),:͚Y0Gڽ_+b Gֆ6a/GG$1 5NKiY3I, =qME|X璹]9@pݪ/ziZi<"tՉdO2?W|M[Xɓë~vʄPJ 6ZK7w*ރ[~j`D#(#|5u$l< u?)O0&01SΤi효As:|dZ6l&fL 鉷=1z p8oU LtR 49EQ҃Sj?ÇCKOD?%. irHhR{}lp]"nJ6NG<0! F7Cp=Ƒ'Ĕ%b{QE"pmdCO8i}D w눼N"8Ĥ܏kyt58buE^"CMDZxbdk-dx>QW'X}Ϫ%`34#x9;Fb\nvP[Cn]BqjvOZ!l X.〟t mӟ"d6Н5$E~߇YzH6 Cvőn|2.remlښʄ 5>7MzIolwb.Z4wW!y(I|eW/-5^+}~kF>]ab|ZZ[ ]34:\XP5oYUm6WB :=9d!nw endstream endobj 537 0 obj << /Length1 1834 /Length2 8066 /Length3 0 /Length 9172 /Filter /FlateDecode >> stream xڍwTm7 -]5ƀݝRRҡ<~|9~W_D%k (aH. 7@^S cb2"! !w(&/ y)p@Āb>^^ѿ1j aw<&yj# s2Ⱥ@P0! . g> }p*Dxyyq\ܹ{)6NЃC[ϒZ ҸP} nP0~k mW/e8rq#(1 `>P= h+ip#"~kAA6 Rdu F@]P5tsfE<COo{N0fk [WG0DUέ?2{ +',$ ` |\!@Om ~pWm  @-@0xC:apP_HϔwrrpoOT tO .T޿\ѿmߕxaA ~Kh?7߾??)y8;YRuqKhrhoWߪF6Zb poT ]Y?+A!:P$/=[PDyݮ^q/rUT?׏OPB @>xÿ= {j Eo7 5ܖ#~Tc!j/W !vH9?ȿ?r^ @+7! r ;>V`O]ooG&o&"?DBjmbO?9{t{ n3@Z[}u5ߎ0;6w|ϴaqAV q*>xaMD#ݵn[3vǺWV)zxsc%M}4 d6 CPԘyy*{7UοݬRǿJxoR6Th7Mŀa'=3ur`Z ^^2_bkԦT4'&2.O'ڹP6;5A:yRj_F̸ki# 8G!_ vTkڪc?@d671c&tt`) TTHoWD8/RCBnW B_2zyt5MX EHIɔMScߪlvRcO'e"g]s(ɖ-jݧY/f@Ȕ,bH, )TN]P;LSVtt!'3fՁ `M* =\'D>A B~BUٰy͒uPb+tEZx5 kҫp`vE1:8Ebb?yHCےj1l=| tEŦSWG¦j"f9uAXJTafHv\ Tn t.#LW;L 0aWo&̷aU*>3"0 iv!>?X 󕺷yGD'/lW 4nWmgxt&2oJ:[LeOŞ?o)Q|W/7K>%0乳7"Xo;A<_I<۫ieP!(LnDͣ# 3轰<[IJJQr!U'd]rW]}.#gjLWJ0Kik6{j  ?Xڽ &/1Ə ~ůh q5"u\-"y6wr>LGRۘ e$ȩ42t0ìwWC4бŲlHIxTbFbb g{#+,e+-~DGVVzA]6C#r~%3X|jRa81+YI8sw op $}eGyޅ&(.z4vYc3#K+6ẃr9@^S ˄iy>r{%E?u4"IӖPvVDr/Y#/#)ԅӮ^9/ݭ}6h?s-j] Cx|USK}NbH]ktWʾwDRH'J!./SXX5WB/#;'ylrڌoEIn /@Rws+}.VR8:lBt@}6^kjtero/(7{[qI >Q\vhi yj`?&M2'YNA^c675 oePlkjQLL7tNukweizTQS5Ӕ kvd ((G!m/y7 ۱D)kon/CfWu:ml? -ϼ8 x+gЧ`!ʞI5#$ŗ0MWȧЏ!d99Z<)j;[)ۛzb4X7;5O$-LIsga7z#݅ሾS{e[MQauͯ$.|ږ{qBLp*sv<ĉ875""#rCZZ޿WN&mMHN1gNAk3wv^wQVE:!Z#P+? $|P$}G@ ݷgam@Ya ѡE5敕 LI)ݯ9BAS k&jc>2-":.ߣ{WFj}N%,){o r BO36񴛝mXLDFI.>5 sBpP-%Smd ҡrGI_j e,~J#VȮDa |e$sVoaz SX-+Yt ͲL@+B8W-Q,8 /UtHcIDZ&?ic/~>myNnvCِ­< JL8YÖ#屝GZpionam8ێ JTm$ƋQGwҏ1 !sW_PD"e%إ[7O| ,tj͌WM޹n"L5VyHwY΍Ex~rq ߳6r}1V=ʔ8똲BA'4"נhp**⍣eCmZ,~3%(12,RIQcEõZHV4l:;o0>z[TƈctfDΛ~NqNI|ujr%&A\=6@Ay&mqfj .Pङ2;Cje^iMuNDӺQ 7Xo9#'vAN#7O9.!=YpJ 3ü"4=e3e@AQb'Lon?O̼/rGmzƐ q41i''wp;BKI\gMtsCQK7@v)`bI~)T^oُ2 S YwgI`ԑ F2Ū%PyL-q]ˈ # YpuS,KgϾLc/u^jth͞W~0a{Ȋ,u >~T>ԹLboǪWHZ̃L F:_}7k(\yA&mQfw}j$D*57OJ@PT}l~dr~ 8oT[v}Sͥ㑬C$(NRqRUC0IJFrt/zXVupKcnuνIN7xMؠ.oʦJӖRP_:lY{VgҢJ/a7o5FyՆln[/-fr v\6y6qZ{}c[x??DjB䇕׵3qm_%F|Is/Ik @ lZj؝y' fs#T2!G9Kp7‰5vSm`[#r4g_֗|u; P;9-j*\;$iAK(TUJ s JE>صmleGcL,ZСJ.ֿpU^ᄀ~duL?N% q6)4m-:/(f\Nl].τTtRy҄_oBU2=(:w7}w Bl2ҠhjDIh¤<QvPFcu~AL"7'xmfuM&m"8mTz1i?FX} [cNuNT coq+M<ډMC 0voNVb˜V,!{27tɒl8]N٠r?ĨEi;/WN94e5'=\؊]}2ZC,*l[:աsE7iU4\7 ^9kE]YZd 53'_r& :cn|LXKvӑG+QFģ Ūܷ Tk^v2T}7-?^ez+)cп{TfQtyqǀݬ|Ë5?5Wϻ>Q,!W+ 'MZҝw#:׹1nb٩}gu\6 \ײ,kYg+|i&Q埖7Yzr )B:S5;R5rDڌB&o?{Ix9WɦMe%׳?4A0'ν4R_Ս-PPaڜ5ol:Im/\xqhٞ!M/ i瀡HՊ; cւ]״`͵9n6+p"Vrġ : )61!oB߬t(qXu*:ti t5[-2 9Z.8$k`9nT ~kc/nVQtIJnF*s:QW jE)~\TJz_P?XI "ͳϡ |tzTօ`."Ud%eij+ `eBnc03w bCM (-.9 p o+g%.4eLt~ʟts0u"p4|Z! mp}Ĭͧ#kɃ@G_Is?~δt6fm>|Ay\(  ~|Z^b5Q=_#'ըgEY+̼0d_8+ڀξ:Ohb|o+BE"wOQYt{ݥtU s +*.{E+ ,jX2de~(U  ZqL {&M6͔}qնD#йet9WF^kV&m.]aw4Xb+&N›=-GvIݳinVFdp5B$7/jf<rXh wsevJϑ'( <^$th-/N4 gL2BD#%9ZŤGG'&Zte:\6Ϸd?-( endstream endobj 539 0 obj << /Length1 1447 /Length2 6190 /Length3 0 /Length 7175 /Filter /FlateDecode >> stream xڍu4k׶.Z$.&D( z]0f03DC w=$Z&5sk}׾㖞!aUA|@)$H98`h3) !R᠈XF.Aa%rD J0@CQ7 n' Pp"a` B;B];A.CEcKvH{ܼO`EAO+73~R# nG{PC(lE յnPog?g;ݟ蟉`_ 0c`p= UG{y 8#ƃ`. ;ïA}K= sCQ0~2pu(ҟ)P01; Gx},apO7c8k"EDBb;v 4c!XP?="ABh?H :dǚ#a^K V{XyAp?+{7㿱^>!Q@PDR ..wO/z ؟T#I`O/"p+f([E`y~3.H `+e4v.),kC!0F |(\>FJ`" .08Tm|@a؉;coW (v2w~"Booy:Qr ?{8AvxX@?+!l5!!K ٟ)883ƾ8U7_E '(y6^M:B08U5B 9ʥGH6!qp-XfU$ܫI;WS. 5|rNBٵh XxdL_FpXF4>ך6܊y a+tL^JtuP5u0eT4X'i98#pJRܮ8jeQr~թ;ǂLضo# &FqjBHIS'Z(1/04omKS=,Ԡt = ;n%_¸GoLɃӍ?G?*<"{q9UwJM}Hx54qzے5.a׺EDDuoh~LD6{5m(Ge-Ύᓑh)b;]^ %C*Vjk#p6ļ+ldD3۱[~;IkF/"B#4qSfaBդ JtҕG¹A$]Bt ]gBcc,礨su;S[Ǡ F92dY$iT2nBv3é;EiVıGk{T%ҖYd!ٳJ|rrGw`dZ"Ra#.c+g6Rz1&O˩aVx=t/=LEful$iHukf}RZ m}Ysu C͠VrNJD^{鋛eFyUci1^#>JB\ُXQib?:c<T%xe jq7wE">Ӳ~&iwC[0dwu.f;\D8ψت^ۿ.mr#_LW!^ c 풱ˤaȭDyy[^5˺ *AC-sIҝB7ϟ_/5{,^e, 3jQBKcHcXtRMh`)s-0{+vsLejLjUS>ri-KhYYWM Hfr`*ʠ< P]r\;tO4]>@ACfpp.O7AOPڧr=Z=oZZԴq8>.X"3\l˨CAY:Vmԑ8xq j mlOǾ8dԦOccBC& a)lJO媥yV놄>ZxzS019 Wbs~#ulҢ͓_}Ji齉AiHE9q2ƞ㚗r&mӭ萚`@ KfThɧ+kb] h4"xFԜ?adqUTxo>qX`,i8KQ̳n{K{d4G.UYj; rN$GF31oٝMdCl$P+p5y".zsnj]ϚJxwb&}hWGJ&2צ(2jv!mp<*ޯQ3Ҩ 77tb0TӰJe]5WcA4-2);,WKٞmo}>90 ~qgU-Mo#эwC>(vcFas;0~&rW/_5 7\͏ Jo %RCc{5rQV!о{m6V(  O*1pIZ,fAp U^ Jd}|a+W;$Xhj guxC{8k8㋤Y]qŏq:FqPS"jM*x(֔exPUh<[!KJ6*c-8T Qӟb;B5ǻ;iLX+aM*wfJ'#CYbq{mtn5 O6'(*Ij$Nh4 i67tS4:JXe@J8\Aݲg{JgS׊ xOUM Rsxl{{3v>פ }f %l l&m^pWTRf;TN6}JSDT>Mnmܺ:2"c ?p%V*Z *K˸~dխ[,HR[@mJQV U|B38v|Ux׆i=Izӗ5.~ĞHĢ D:'=U /rn=9T3SFaes4=E K^5ӽNqVkT]fHQj礪xW|} k%iUeW|\Ru#\c$FZ"Ihq*t:ͽL%\xDDfӼ46f9vvYTB욟$˙qU[5m3ͬy^$s@)WKd-V; ٗ}kV{_75y}7}ÌgD=pqksy/Vk=- oYxun +O 2<+/{+=Dr7H α LLiZF߹mۜξۆ:=L;7\Dm)[C<ݾma,0@ќraJ97QE_3I>zÆ|[L'nکQPWB>8<C?nۉ&ȍ W23r{0$;I"L5 ?䋻YTID6M Ҹ?}W%cA;U-vu&W/SGg>sUP$W gHD]s3g}P} wI2 ݥ5I+ {AGo~d%F_8򗑽PQΩ{VxԐ~yJELC8oАTykFUiZYSaW0JiɋQgE41g5#=SÃd]ʒi#l:ioH/:*Nwp[\~Yصp7_Y;OߣW44U5˲&BtKx,V@WXŇq"L'SC-$l,8Vs9ni%_E|B$\l[[ F]\ih Ѳ0%YMp1oCXtcNxR&jj=K0p{ w]5jfƔ5`guWmBfCJskirfn3&!M..-H+LOz]T\Tj&S Z쇊Ⱦn/nn.KFWiʲyoLGZJhq.SZYpI8iv=mҙ.Ncll^ cZH|ʮv dv^КR{9e7(Y(2] 2?B*'DoLM%7ezB|l[^E{AaiK6PQwJ 3;f~2BJk91 gg[WAŞJsGƪkᮼc{ 685<$?%{Y$i7 Nغy=exVRivL+?JRi G}:LN|m.ct$̵2 1Ԗz31|mm;)nT_)_ȜpXŻ5/I<{ endstream endobj 541 0 obj << /Length1 1800 /Length2 11164 /Length3 0 /Length 12313 /Filter /FlateDecode >> stream xڍP-J,=X 6 -kn-dWjh(ު3C Pkf6 ?@BII 9X@v %o9 ;=j/,9<yGK|vIZQh$6vS38?l||HS+>{#;==w< l`;?I]Yj5od66] 5,'Ypr6?l5x@m&e=!&w{`t b0BQ,oq|>' 3Z[CŬbT*?Jqq 9y<?'wH߂ e/r&Px>+qk4zP>4@F_l[H=ݟdt<Ўˡ}^jh%1r%6}tf6N r4l`d0ݍk[=ly,/?/ϫyHYA$;7dgrEygpg{^^c3`e:<k@P~7*[j ^?? =3 AL ya=o+_jLm_d,qZ>)XǞ_9?>bANI ;Ӣ$?~ Uڵ:ۇ~WGsb~\:%+|)yy>带Ci!b;a[c|1à,⋡7}{@ϧU04 +GNQ[4X^_XQb%m2gmXn4޲"µ !n:bqU8yHeP;os`G鉶5甩u~`Tp rH)I'!qg@V΂v%ϙCɭgg ^xu)xW4vxu&,(5w֬" +6p3fx S8'd(X1~?&^+d m#ݑ_\MP*裠\׀N1j6t3Oe :YsTSΥ0x@̄;ۯ'wr+(8/+A@WOB'#vNfz :sC_)r01:qyTdRrZj1S<ḋ=?U6\f5<hC9vE@pC}DEN+O-ifTTC\ Z7 IU5C~}󼆞t -WS7KOb ŕUtC6{#%`Proo DF #`BZ/_bO inf:c",Xch˹.ѾM~Cd^U|Cva9ԴEOvobt[ݯĊMR孆,ɀkjX>P ~)-A>K(M!vk]V.',]M6VBg69VX8Yn۵,RdW*gJ?YYjExP:.UIp:"M^ 2[>- $U$Κ1,4y-1EO +ζN]EkCnYz;իZRU\o BCEOVQ. #k!UG|OTL9oEbj %vԕCN/c`]F0kN՝.yF}6qAQ/:8H'b /G]ה~nJvuGX/,8>lS^"u&($UWK:McYp'8?;^d^jR1e^H Ǭݷ!"Q"=taNNHCpOg 9gר0媥3yxP2\x?PC>K C=_ӈhDb]4˅(9.ZЫ\@:P ;N3saKΪZI[,EMۣwϷDoܲح UK},b+y?/ukM؎+C}HY|tF4U3w~}SygN˓dVm@ ;ܳ W"]Nv0hTl  R 6ڟX/5RűҲV0+y%jېTKj ŃD2(sqIPWzF2T/Q{=_.2O,1AH*A)~oJj,3QN+nM>XYA+wwV}: O˜$lϻi_M'۵,u}{ڸSC bכ lDƦLK!V4j!\M[ ec*mD½Z-_i<6*DrQ%ڍox8dj*v k5HܣEXK㰌4 ZA|(_ETGT1z^ZS Yjh;0ڬaεU^~M둂-Gw7}/Z4B;R1MYN3HeK{ oʯg<*zFg?t7ٷ&flJjTh#lLG7/nl@OUmJ'KGlۥ!1ҩ.B{6~bY**#\G`f9V"C;mUѬWQ#}pG24!6-~OZ?tQsQf4C7D)꼶$xмjI3*L%Nsbj|Eng^ DƵy=ז+auG>(1lLF̏y#.G}g!!u*C=w퀙%?29D`ogRZ(> "ʶU}Wl3Ps)֌ͮi gW%{v[",s uW~XA]Q_sN,z\:̤|׍յhvx7;Ne_~]F x"{k\I`YZ{V&ܝZ#2aH&WŢ 8XL0p|R ]xsq 81L o&4tKw6I6 '^!BR%+zoWoqIsVjLdFCاfpX7yKDIgU -EO$Yږұ.'+>IDLڰ%\DՋH:6xD.$"u@J[xkC͎Lq6eƆ pfv?B-AZ 4N`cFr.eiPZ|X@-&:#6u,?`ΓyOaNᝆ?W^x)6 |)#Ըn!/>kӫG sM,R!5Iʾ>Ȝzu6m5 *,XWd=DAÛ(SexxlhC,.FD7j @J>pwIdɨhOcSm*dX *B.UMa s;BOqX*|AbÄ:zLB._5:VU6yEEv%#`bH>F^J~oiUOkzJpǖ3X,톀@>Vft J1QWc)?VD@؎(U j%0>O݉/U B6'{FՋ߹od#+-lxm]&]P.Ӝ>ˌzVof<}Q>LinfD1%aS4ţݨk%f;-/4$J %>#l6D0"9)\HJcҐsH-9) j|JzTNz'b8ٻ5ɃH >F;66l-Qt~ ㇎L$a_ ^TIk}]xuU fwY$9tO BLFq@^eIE͈&g~ Qү oݠ\K_KతiqVld,3\P7@k4Gq_pR1"%9iZWh, 2]ue~\7H"+[j4w z=Pn͞~/$dXE\#CɅtԬ+_dP/;3HJP*3 }jYt ȓG\ZN!roB#S74A2?y4h kj:3^-!(S$W%[7gAm!,/dr~ ˏi )ؘ ؤ=n?ʣ~fuFOcP+zV1=1^NٜQבxT1NNY+£{ +p% m!вOL$́e܃ٌvYK_+!~c$g[pv MGd*q>7M]-L*g1כLAqn*J;NďxT.4 *X^oW&y{.xdkeZx+eVUj@kt ;8`͔©/^>aEEq'3|t'ߞ@۝] ~(KuL@7c@N<3qxGIR.1%g᳎dX yJ7IK/Wt'қl166'{f'e=!q!eY^&2vEIMLEKfm_;@8rCe"vyB2S PrpE(&½y wv\\8MTQؽYp&1 p u&A|7;Յy~U}'ZM,u.ۅXxNMى{hW[.Rg9 %/=!Zi5KCG)8nFc<ӗQYF "{箂C`; CNޞ.QI fL;wT!b_;cqXx;NT FK9Vٿ{}mT ͣT̓EƁcZ zHkZ_ީD+Z7fvVpBO/@v;(T;`= vr27Zٓ%X/ ώ:Rnob<|a0"w2kBB>j#^K|on ^A').oH EAZ\3. VniFM攠LYStE@)G5qEWqz<m-R;P*([" 'z]޳yo $ѺAZcKv y (%=M//m:OwT1!G&2_ zQt'mή*y“D;+B 2vV Au-@*NzCu9Ħ}aEZ,߾r~KҾP)~Zu{.߂h׎[l,_ ^ ki$ґN?;hDVl3ߩ1QKD1ٓx͵L-i|! ͕tҗjJA/u0Ynα#8EA~.a6%YJgm< 31TƩ9-9f#-X[H}ktdR&f8n;S/]֎yy9Kg3~8nn{CR.fљ'#\1{<}j9YFٿܿj I毤(PHkOh٦UDu W eUA{(y+x~b0G֞$8 z+ 41h\c 1v#fO$l=UDH~oYeQnf& !E=ll9?0tm7$-\F2W݇ˇHʾ1SBMCabH-|Ec-jőp1aB|%+m iE€"$9vߢy]bGd9_ ;TuyRcO{%Pdft hyrT|O!zs,XܸN-NN!]MaEd${aL^  ͆֌@5 SZLq,1_MU-*]'/-_`G2hm.t?V!: Nl8=0)ElSC/vE_{JqH(зH'ٷ? ^UL=zAE0 nPag˝y'D9> q$s 3,!ٝ IK {1FGOh&[Jg320>6?󙮕Ft Jl-.uFԵq ئe|-`@vN\0oE {]Edś^z)g:"w[р'}IMimbtiaAK>'X S غl+G)MB-j|S-\[D7_s&/SК`lZ5l;[)"ߜѳٸyqӍXk5b^gȽe22 Tvzi_0ՠ'GC_%ʥ$G1em%3@_*mDEа;NkPHn>2ǚ AVh!ERlJ} n(rÛ#Ab¦¹q\? {f> e "J3CIe )VL2"Z׼K5r1\ЉI ?(6s?֟Y4+%Ǖʙ$Bv}g|o;vᦒ(vNFцW')'7N {ٱD4( mh{F#sXz~F7qTj_ 2qIX1n勏jr[6BKBM.Lix=S+HO:cU]6ݶemXKoyzX\]?1*o $g 0lJt'e:"^եͿI=% rPK 07u-p~z̋}7ǕMZμ3]^r8P@+g ;a{F?r7^t6coӏ說Og-"/#p1oeM$En9<#rU3â _@V̶-"*]8[6§6\4;j /g-YW+)du%n1T )׆Ef{Uuݓ -Dr~R, >[I=Tf(Fip'UHGs};OYoQS]mÖXZE[V8 iV˨Y6*^xG/]ւNCD|ES}0z}|oO1d3z_W BuސJ.{jh:!t99r endstream endobj 543 0 obj << /Length1 1406 /Length2 6326 /Length3 0 /Length 7279 /Filter /FlateDecode >> stream xڍtTk.ݥR5t#ݝ2 14)( H7HJtw)%9kz^&zm=.k8!xb9 A 11CxLg(&! 'B 40=+$+,@ѿby P .xLrpGOg9WWTTw9@  9 dЃ[A!`C xxݹA.pg[)6N;aЅ@ ր_ dxL};r{悬pYC=u#'YO'௻r_տAaAVVpG @!-EunYJٻ 7F&>9(!pv `rp |Pg=yl ˰¬m~vu1A\!* ]xl! PD_8 Vv<{:B~y|$/vAgWXC0 ; c# f5fO"/FUEOdeo~a IWQ0]o쿽 _gPf`@^8_a{&eV~x} EW{a# r{+) 8RN5Q)-\@?~"b EX!߻@ΰ p/ RuV/_@.H "~/ APYOPrvy! ޼HZC<~ #%$f_ ך^TPsI`]<ʳAt)>[N{9^qW'MY S߽תj<θlqwg4 (F)b](ڏ"I>>c"aNtg&-RV (SFpoE_AɒeAM/dw^磶WnGC{i r v_+=޵*YdK<[;5gw|[OىuvL_`|xPЧ' +{h/u<۾F fL7_  Reu^]ğW{^DSfX(do{l.Ʉ\#h_aR~׈Zdgj/KWW>fFr>ZK^sU:UIFGyO*V# e$}}oeދ$Q>Dg<j|y{͌_Q٣L }-r^Bg'끎ָXCE觵Smej{>Jjj]8 _dmR\b2 91w?PPB;QԚ<^ 2PLyP@t}C,Rnmw&0QQ c4CОY[UkaXhAgEgCxe3bfňȿ*S OVǎ 량,{٤;^xR^K{eBbG" tEW ޖ+~O -b"%7C _6RBmUtV58jt|~cww="^Q[y6)WYq `taHJ|a)2V2ʿ!aaIJ8LCK>G7@^#HL]$EU2S8 gen,tM.#n5D)N+WTCS!_x-Cݾ>dGP~׆E6ۘWR--N'kwr-k7-TPWf}7)A08:śnvul?ȝv52wVG-`24]FCdzConӏc+ Y~R "C{T:xA憝?"2xk\Oַ'M Ґ"it 2=6#䷯tvtQNMLÏv B9I8`|`sŶ !L~┊!G_UcRG2+i s?sW 7fta-ʾ*~Ic=GNMLw#sQgoB|'3 _nT_,5ͻL:6Oq_Z c&x.=("݅TFOM|y;GE3zh*%;[9=K=B8*$I̘jbPx8{}tpScU \5̯Kb\BԿtA3ב`ѹ&s԰`"6 ե}`FO(rç#<0 ˺WV Efb8ZxwPh([Jz}{SLۼG8hF5aǾgxX*MNw|i"5&7﬒DAރ+TР%80aZ2MSƭp#hesmܳwo\w,~$hRrߙW \ig*grTw $=A,fY鞦"dͨ+a \sWejN*`UEfpaԛur)UQ|1JeZc Of.c9tIJ&rMM/S gT*@Ru?S om@}qXn<%?[Ef%LIJiޔCɕ1bͽDY.f9V-`~:^s?y KXsNfDW3PJ>mӛ>:VgZtNϲ[=2](lH_vӴ6#|N_Ik_=o8 wE)VT/ ݓ8CoqGjrѦM< ¼ A0ݟZ JA>F'KNB j "X6̈6UתP7;oNe b9Xq7ěQ8⏆}bсw(oh^0aT Q|1M*10"(_~ܘ m"$g:s$H2lPˊڛ}jhɏ~:jYlN]ي֬@MWUQh7B".#fxONÒEr+1G7!{4gr!0%|e+hnc$ 6/̈́;77wß;Ԯ灅81k4eN/bd.VkC8 0ѥLrN{]EtVp՞eS4MEHy<·U T:^@`P:˂ȣ>sѼ{5Xe>s^D[Ŭ^pt|aAD=uQ6ρ+|[F=|Ĵޡ)Uz#OVb 'j0dįi_&Hf_U99,_)Ytn*0&XMc="ÕHq?@뤻4kk`XA'2(-T&a&F=nVZ.sTɚM)*MH=Dtqiۨˎ(C DIڲ'Mqwbc9rhNi&^!jշL靈 ۵gj-;P@Т 8O=*5cŚӬMFiwdmj3=V9U6+/a׾MeX*,[}ŏV3?~FD$7K{ܜKZ1W^ &c7\:^w*zp6o)+X4l5hU8;4PzSNCI"}`Ja9{m]x-. QKi;"k|jz;R禿Q$.yl F{iFH@wyK3i;'"PByCг“x81`R2?ee0hmjq?h|eҏ-;BKr揇 *Ra;^2GuՑ}f/ma{?!>NJAO{ڙljD>h ;=2_LT/O$R(p?Gjq{GVTyE=2sAg[#0;=(FewGA2!u7&\ybNKqÍ%_I7FN%s$PVuWrb9IV;pJ B嶑Zi㶫<|6~+̜6`۱*.cdriy[Hysسڷ*X/S*ML¦*н T]oI "%BtH6_~ʳ+Qsp=}}4ӲYoXN^1t3 o f#ϰT=eݜC(QןTD1D_}+80GGV8xvt%DkH\3K+]remuA[ >D̷N-s̮?# !Yٍij@Ba7?RIufiE1޷~lYW1ƒ},3|s#ɓdTbu-R5l3\ڷr@]A/3аrFϑ9<)㩙cڢͪ9nzyԸٽP24.+̮Y9L+  iO YhD'ٺܮloVm:VUTqv+p:~":Zm(Lx|94Z$+ċBQGQqMos&n\9DeWya1fN˒I}kuGzt )Yea%*Ш馷-/%ኝ6ZeiGHV߽Y.T}7hCO*{M֧Jib,6{:tΊ&qO, 47!4A{=:weNeq{dGLrWYta:Ntqdp,Av`ovS&;4^tb~7H կDPҶ"9o f_81 }KYxdUsc*0ɻ wHL"^WX`B!\]SOߞo<ԣ8IȠyzCc~/BRG,u4 \MklŹ'BD|m_.HؠprA:'ձx#G cT]T}Y(MNH춃uqV1NgW/>^7uPx **_ xS}j)'>[uX7|VKGpi=6`扥GTGMCWĤ+ANT-(\S*gauYW^a'EXbys-ٰN,ϖ^0GüjײlDa`bgnm+JiW UjA>Cdݮ쓤;.6/Fϛ&=Q_,4"y]i@gv]̄`2 ;1)|4kA7ymC,7J` s|7윿5;ɜX]+ 洿űIDuJ$#6E$StϾauH۟XrVA,G`M&ئDx"|: \_10#BC!@V~v#4Ҏ2juqg B ;2OξU=jJTCEO(DapCcPλRMmRaoG5W\ DGn1z']e,k,C޷rS:}HU:rQbr ǭGwhv>؆VN8뻱c'ДToIټɲ>.tlM*ZUb܃wө X!J3!^I0b >I`g`Tӻb2vs߄djȯlקFyF.{a_ñpiDMjn =J0S[d1|7ei +NP4*MшRe_6ux]FPZ]HJ5#1;6ug!\/7WZshh_)nlcOȿ=r6 ) l>Oe(' diӸ5Ǭ &i 0aoeTcoěLdac`rDtafmgеJxQp+-)UDU_aE=[IьvxU;N)lP 2B1Cշ7*'Ke?NNdMeWںMl &M~ % O+z$Z:RJ~ ص/?8[jO 5̐"eɮy=uvIǗIEm A aX:$!>ۂ&Jmn&ۗQT=2őa?VXF+k뀅|dDnEz>T,نug1``/5qanzXV#CKv-Wwa<%e3&|MD{"M"ǂ^[^",)6OQ1=&kՎ^LaJ+!R*2TV?)# endstream endobj 545 0 obj << /Length1 1451 /Length2 7045 /Length3 0 /Length 8019 /Filter /FlateDecode >> stream xڍuTj.)H 9tI3H*3 1ҠtJ7HҍtH H|ufyag~ǧAXAA8/(PR PпP _JH% SDp( IťB;"ReK7PG.J'O$.%%yHвDB=Ey+- $% o@ra([.tB-ma.zk% @+``( @tq&Y/௻IWD0`K0d m0(HX!-\xK7Kw /x.`$ sQW-!JGG(B?e F_pkb Isv)V@ JmF#vB8 >0k( @!]>o@`` jZG<h>9=E ;x{ZFJ <Ǧxk B"@8,7ǖz' qE V4o&(*Fw \~~#/4]QB߮F?\۪DMq>=BP`?D{081AG u`{₞ zQK}ȯmX"hB%Q4?k z;@@Ch>kטET% V?"z"&S f``֋7 t|2G)B|zU&235JAs=@3mE独_7jj=E@;6LV3?0YfH1r"-c'yY=A^ Win8C^p]d5)zJ͙),,Y;EC ޽jΈuc{*"xUywHTɔ(ru ^5Q]e&Qm"/E$X^ڄ{Cd@M_MRm8o`}n[^|^A/.lo!!$Ii24]D c`GXNrN<.ڰRQ~34w]O婤+ O̿ 'Nee *ŸO%oOmw ^fVɛ#i|@| Ek% yCs JjBr#ꈝ$d#ә^pNbQXLEAR>Q! E%駢L uWSpnoz&͏ZRQl!ϸq${rS4ŽW%bM5ґLSŔǜ>r8qRp)aV酽r5*.'G_w+V:K Hiogq^G6;bAm߯˜v f>%U"o%*3MGEݎNz9=L[Nߙ)rMkpE|R|AhʣAn6>2!OiI}\ܨtqNn/q;<@.w1(vXkH?&|%,ojYȰbl܁lD/%ƇI,F<׏+}ûK|v}[pMEQ $G+C剳Xۼ=ʽjeiovxop'̨iVŞZc>aʍ#"gRFʖN2j\4ѹՂ\Ig nhr5Njh2yY>fq?AMlB?1Bp !4_HSCPH·#dYOĒ?o\u֭D3pΟ L\k}U [em1 l9K; ɪ;de5\m6Kv\1u^##&3P5i >HwUdɆi%M޷sBNJd{ެ9V[ 4SEƑjR ]H-YU~;w}Jjкq\u\Gsm -5i-bƆd0\:`0dy}&:!\7F]WF Z];vs7U+FZ} CJBAP:Rũ- V-? Z=xI:m8;Q3o"vӅuBb$iO㐈Y.Aӫni3g3_t7eLgҌm:V^18Ql1y.g+} ܮ0uP/ w%RU=9zċ+{fP\=ETːLKGH.{9ڍ֮@ )gS ]ߪ4hiTojC}KZ*NvR؏?*>[s"r&o@]!ժ F.vA4C8-A^whftt6D[BoT>PF<|{:3K&Nzo Љ{Z6)N'甠`O;[qȧ GRhļ+9o[I˦;cެ/>w9,hsKjd^ KcibcVؙ +L7湅Hڻd h&9*ZGs~}!?Ɗ.5K+0c;7p*QJ'V Ay>ޢ WB0Co?,&6bE{iW;Y05m"+3U2[pܰBgV)SO+y!n@> :s ƅ`zLM}ڂ*{v: _]R)f9NE}Uaj5Ҧ֒ġOu/1#kjLc탢#UƼ x/ ׵6r2S~aÏnQa.:6S]ܥ+:q 2M^i` ^ey YB1b1+,ިוVMmz%;JRiO{Ta>?±U eVe͆x"% 5WRKoba9AdRaz)l+/~PhIk2.([imRyf$G7Ypn.]:+X×}B * z\wp z%žMeeK[*S~?f($J6ṯkǂӄ&Zg!u64ǾE‘O΃hmU$}.ԩbi ըi[1f_=ǯ#azTY᫤\6iU̿%~ A0~MdmΛ/+@iI{k`߭; Gr,Q?[vzO:@XT{[i5=+x k۩]ԔCOު l=+! ~c!w$0J@r1| eDQZ6]e*ac]m1WjB8~\B(l7/>=իdpyR<39 oUsu0oOx^Va~T\BPW9; ƇiD\OTd)$gCoĂ(\+Թ"p_z#O5]7 zvTyskB 8G )~o%wܘ)GFކ?'`tO2+^EV0Ov)񏈂O&RX^p'.CZc`n~12:_N/  o 3nzФ^NV.J! Yjdcs05I(r^_ oz>KZz>ȍR- S#l+ERǑ:K];A9,x~dYw;ˆsClqbb+Ee xԌbQq\nX%j8T0SLwjlKG8M7A"N{-m{OOE,)?/2>D{hfY2@CUcW$tteQdLL2yݵ<|}qN8m 7lC Dtu3'Xu2y/n@ i._mR2k^c歯g!cu\.1gf;c]2s$t[wq?4; na.${G$BaxQR4 C04KVY$"fwa3@E⣀Ra䣾}aY[{k6c'%8ܑW|UJcI9l{ZVfu~֮RHYVUggV5vW˴o$mkFɤ89fwCT?JX|KMIkWinL5ե<꯺K}ʴȚMȞ}9 qpjZX#8~W+x-[6v6~6ee&AFXջ ;#6kP'd} -΢z&pxGuZVU!@pܵ'?bO /l1&vZq'((X{_95&q/n^VN`Y/HmoC4tcE%_܋63udf0u ;03#^ց02Dܾ~ym1cc͛g2,[-Mc ]N!G?JP5297,?_ohXHЭuhߨ c4~ΗiƦQ$KG%b'8J[`L e˫ )fuC+p:@9lHWB%Xa6==`.Wm+53?}QnlяڱY^(`G )SP[nI;Tq511=6CL"e=8rԶwNDP{((?8`X G:kA6':Rɪ$2=,DR_2n*#7O lDqLlMO%2=SfFqHP-#9lp=Z@Ӂ]41me݉/D68wE㘍e$ȼ>>5ecXtĿ@5;_3:=L۪KGJr+hv=[$tTJ:-;O8n~$д@o6Hj?1bv,GE k6ҢP)pz"Pp\dt{lmk>,!f sACY@q9#|@lΪ[]w*#銠Irr^ӍK90L}!2I=D+ :0klיd0#R'^8Ku;= >bLUfHH`=O\4< bɽR|=k@f?}*9؁9K<Xo6MW&69 endstream endobj 547 0 obj << /Length1 1510 /Length2 7601 /Length3 0 /Length 8615 /Filter /FlateDecode >> stream xڍ46,D%a:-zE:f0މ.B^F/DщO_֬̾L\VH sҪcbұCa`.(;$B?]`PMSE"Jp? п.@DPxLH'O;X-`!0;K( EowHK;JڢN<x582M-AY/ѽh@2:<5J>D(wN֮?v;xS7ɷmmeS sV]Z7l`~T_ZYL{f8㞉G#9GՎU_]!1֙mJ4gB D{@*T!O?,'`B_jg^ZHdc:1XVGj2֎!lvR)~3-\=Dlll{S3{T A:Cww=j_qdCz 5o4 b )~;|w+!kO׷mc%RL : .z=wLۙ :Y/HڠgYTQV|KvhU~d VϾn0A? )gr(yv^P—~Ϸ]i+J 4O~}I[Lp58%p?r(8)GRfbQZ!Exi;4zŧc눔]u07A$Fؓ޺$\0*Tv9xضQ0s)St&N+5eSY^ujn3H~&/ Oq0#0%4YaMF'g?8ly0sC]I&1hn7]@ɽ*kTeQIm3|zCD$Gts)vHwR7*0Q(HŤԷ!p"hv2WKao~kV|w'ww'<{U}>l=penoJpdc% O5d'Zz s$w;1Rs0 O\)z.ިZZn i^WOZS'^4$y"K^(*xKBLV)EkAU>15GZ$r|K脨 h8 0HS(Ƭ89ī>}; Qڎ3(C0]:,(&wU:~BO&K?jTs E!iYO,bј ' ZKz3,1OәK=>ُN~E37ἾfCa)YlT)((B\4{}CMFQsشm@ldAmCnTc ^~Ǭ[ʤUqo8vDATx05x7dJA%C>stx!B!4S$Y8?!Hr}b\l }%?ޣ`/u'|4hs68BRY`24Re׾ho֎qڒCLA::,ۅ Mߔ1eUfǗӃW9|tFG,fnWڙ =e,@ %'#V0%<8%0}M ΰOJvRԛҋ+7k9\z:.4޺&sS5_%cB_mUó?|~)-o}U{G#cч; -ݯFiMеXdtf~ \VZk;ɰiCV@<7xq?ḁbcA;EN_=3٭]/~֑]A/o,^^ʆR uz~iwJ =FQyh2]gܬߘIk?<\ٹ}t ;oNOL.ލɫ,u4Jav.5H?g/"q;/>EG3xp϶ s,ߔ~/8e˱L완?`q[b fұt Έiܯgg T2)gMSozR/N$R|5#G'4%37G}X8v~s5a5T ؝[V#kȂ.`HxPv,m',quy`UL> ! Ș~ )ѹЫpX=wu n;Nb OD I2utճjn2x_X/'F˴+R[Rx>L壦ߟ{LP.&q4$qw'ZWD;*hKnLcI(_E ĨyOB*Vi~cW.`RsoR/bV9ؚ<+xEt.K'C ,LXpkD?L;Hy1T+j?5'l2<_yYkIL (%%B[C`vdDO ֪4% B0PO̘bPeDEQx\iY7 P*6 /Qb%ݛuyOS[ J>/%q, zwr )#w_%*oh˾# )N%W.}3,a7|2֮``2Evw#kFގ[5aqQt@/ךsߎ% b -7opMl|yv]%xig922!p7޶VW {U9YGnStA hln.N+EasD؅ XS̑n Ir6&O x6i#~{1F?*( ~Fe*_A)$۝G~tDq˫ \e(NݔY-oj#S ?Wu_= X!`/pۺ!zf>%XQ]3A3 Ǻ-q(dHb__,Sv,s(0'\>3ѦL 5Nq_vyΔ-Sli5=4d[FnyrRTʧ o#B YKe 飳3*uTN0 =$-4:&2f6;SZ[6Io2 T=BwS2 eZ?  RH"SJ6j$43R4de+/^ofsrB*k/BTm55r=TG^ʸ͚l4Μ\T/+Y3~ 97<xBIU)-ٟ2bEܥǀ&Nu , *=hǝv\rf; <.it=dNyy":;la& ~)zgBqrD~qnўY>8rGe,xĶ 56|Q[ܾQa%uVC_A؄CHBFm8X/^x1o YqUr fr5#mND hb)XpGbW  R0GQ;CĕGJwX/ GWܪuglF)z5|O/*E_*Cӷkؕu,n|G1 jrz~\a3@2֝͹ 3-BBl"GBFkk}>H<[ N;E"ڪs_YsU#` {>k3iHz+џum,BL8Q{MQGeR-MlNWۨX?$DDdEC:s"IƗ1⹵'w߇(|DWܰzhG=wjy\wa-Yi]Aݞҫ7~2^9W U mZWF|-i#+.7_nڒ8 >2KϝPv58Y0Zno;6\#{=֌gZ0!g; "%~snX=-N> ˌܛޫ.S4_F""dJ7SpY)XT>lwh񎒮Vte /,"E:$L$l։ Q̨ >[$֝~צXWSѽp]HJ͒lϹmݥtkVL/t2 wF6؈W9kp;yI+c̩?j@6VrNV46T%;{&TްA.ԩ5A5qw7]]R}&33{Zyl.kD=&)e:uލRlTڜ=ۨÔfE+(ԵH<@+n|mT"ұKc@:0v8d{WRႤ}Sq!p1I@+Wi}l1a&hq%:XSgKIvmNG~ 360m2tCwK&SwѺˀ db6ΖJ 0E\(y(OfwI#(@@it*U5SE{}cL>NDVZ`Fзwb/+![f,iNZ_eLE-$%[ mOhS.c>잝YO~աLhJ9mc摚L͝ʉr-f/F6[o",ro1[BE{ I &vUTC:6$/aZwJ(%u o/{-oBcb8O9_҇HF2Y7E\,t ӧl#y]:uOĢg36L?AdwbEzk1|T_>btηiywb_uDÃuŢ53t0 endstream endobj 549 0 obj << /Length1 1470 /Length2 6887 /Length3 0 /Length 7882 /Filter /FlateDecode >> stream xڍtTk/ ҂ C P!!)  % Hҩ ݃ *ߨ;kݻf<;#=D`‚ iD(xxaW_j S( C"2 t*` OhyEw%A $#% P{-$QF`N5|~ĝE8]0 |2N D`'}(~?)xN0FA8+ Eq{( `w"8q7aA+W"w0Ast1ޘ;0#Ń=0Ww`!<4sà0_~uYaá W}*0kПɺ ^߿{7! NE$%D%Pw$+Q p? _4 ' d=  A EAa8@ww4o`_Łɨp@@<_;zHoAp #,/wAj| Hv .BajbPD88]Z 7a N,pwP$E@eíqcq;=_2eCAZG0 '|q{kMx pHů1KL~~KR!܆p 9/G BM&\˿_ ( @B:W6U( a:UGl23fզ?=tnSr?Z}^#vdWpd<K=d圠}tS5π-Z+c߭D/^B5 F֊ FV)z5oecCV%qj4S$x_[홣 F^iKמ[ivt [%IGUzN-kj QOxӛ0_=j)b[xE%7л8"I~op#tZȽ<]OM[!Rbxw)eȊ_mʏC#]~;9#FY!e _tȳHX# 7)JHƊTɷM أÿ~deDf}>/ I:- y3Vo7R{kP> 1a{Z$w=0 0\% @(6Xhk⣼"[fFİR~}30YY v}ԇZ7Χ)*bI/#kh*>&5+ƧGzGcjf}µ nFXR,EacwzWxt-3S3n,[ 5^) 9 drP+23Hw%M_ו`Z|\  GV]Nlg{B}`#_|4,ySex$&Lv9b]\ A|=ny'ynID2tur{w ~8޳%X|]ջ QF鱢ɲ6wj+W=ٛ.iV wJ:!KwTO3-D 7X>X*3( m az.,4OvL c 5N}3v~ .tWޏVIeoҴXܶ\nȉyjp+f ]{s7Ru>Olɖ̤o9&O(4)(kj)M%$"IUU>-S0e5i.xdOd|~K3 #xF5wQ4t! oT轱τ}Dj4sKO v~H9i |K0}By*Ѽ`YǏǟK )mĻ`uěB%.8q]f!iϏ>TĪT;K.MN62Zx}\/ȸj,9fZ1ZFaƍ|KU߲8t:(BՓy/Ʒ"j4rfYYjʢ)PJ*)vnI}T_I VxB*rHðg'&`z=@!2{PTPll6 {'9=u̓, 3 WQr8DS<3ʹ~EXV<\Qs̗u3~/7|c?zA`v [Β$/{RAJؙk eC ʡ| Oۿ \-ml=H*CmfUJ?Cpe$a !_m)^=lZyZi/\+kҍx4! # zL!D) *0mObLl["0-/ؒM#“"G Bd޼3jfP}|H{$mœǏ{ SAǢe҂15 @A7TBf쀶~o>-X*x.VZm9Zͩ(hEU{e6Zza#1(ie3ZG f""߄SԔ;;O=u.WnjCWȚl*IZHvIDʛ $~"NhM{aoFAʻ#"9V"摳GA1HrW7M+?0#Rl:XI}1ڲce}32ʌ*_6E*#l9k-㑥x]I (+. xbloH\Tkt#u_"ʏ>d\O%8d{-M~V3i7y]hy3fp]A2} gf.Ǭ={b;?5jsd:8]>xw3&''ȷN*mר/Wy/37и&ue:*6ƷmF8iNa #Nj!U[/8־wz_Dz4Ϝ Z ÂrsH0oyx+M2i䱌ݺ w=Fm KUer̖]x |J)74,x4h]tp^Yq!uO#H2ޙu٫&bvq $aW$wܔ GP(kwNRr^ V!laǽF.Β%htT1$?{XpGE<3ճρ?UU8**(V}$eO~%4X]QD&؄oᕆ-xOiQR+ ~f>GIN׫تdhpH=g: $v45&Zҫ^N!Ъ"V[K3q' ͬ:(d'al/'N 0`ò%8<i3hY;g=nv7s^x@ܿH69`7Dgf.; 3ͱwޑ4𭳷(L 1zp=I8~KD 0Dayхhd@)=w49Xjn:!2Hja)HC&]vK}}򝮨z{BZd5K*A/%[IDZeIwT82W<(1|bD*3LJ m%j!W/hneM PIzWҒLu5::ߤjxi(8T .Í 7Cޞ8•:E6RY*mC~k&owl3z8,~TkETSђc9*%hnk0a=ɼ}o4HS839IP&'($oz gAL^^ft1f< N(lgQ=&k<6fZkš KQ^üD]p.V'4#DzeM^ˑ^!hv00(VG"vY 6Ye[4m+.teLtX)i qN>wbYxt~w ՝dW~Hn&@$`'~D+bz姌/OKVfX˳B \cR"ݿowKWGlY|X  ˸-mUgTB@O6r-RK8`^W.țHgkxӞ6 JgvmLC` %$ўs>q̀;Cq|EeWTxnLTӯ՜ۼ4deqad)*vJ1@q&.ԩʪ!q*OHN~y2lnrGA}ѫ^CeӶ.wh1Mi|TSrDZP<8;LTH 7̼Rz)H f{Al@`:UJ}w_Kr OGs #U A^R2W`*8$}tKlIq \E %Ij*إ[+ZHnkqZ}ί|. Hg#h5+|B$e(UpEyH~kG~p֦tU@2aG`ηfY)~:ە//nTN vIa _K<|f0rzDGcm3D'gXo%k^$GPVaEIEuZÙh49I˝ZMI~ iՙNObuj3d+^w BK[LG Cw[Iuq*;m:IV?2P^\r@]jR13P{~nBe;dt삂w[U>'Un|^0,S;%t*(3(\U}_9+,<&&<d2xY]j'qn׼aUm&'F&=&_^_x i T4n' !?f2?Y lMfoll庵ؔ9B4Sp-myG=ڮ@nG~Hs;eacռEۥ1w r"Tt~߰LR_g9w([liz[ڋHi[ v<%%dr|Y ^|z+Ծ/4f(C-&)Q< bU 9j {%FO񎜫:ӯC?> [ٞӠ8N_煷!%JɴުkX Wd94^Rه9XYɉkiT'>dM1̴k 4cLpAR| 鳝 =[-qKskɸ}CȾ%^bxȳLxjŲm[NQ[Q\BZ5 3{l6XŧCrPtf~G(# v;1fAt[=ƫeCu܆%9pe>kJ %m܆O҉^[]ǐ2Κ+ޑӔMj/#5{gmڿcI͉ͷN fe)BPK"S2=p݆5[|T6rd]ŭ7r~H8z6,K(Z9<5W\f=_ժdB;>U,۸=S,8}<ܗ,,^xQZc~N>"pCkTh\L`jp^*%eڦ2o.|gcښuaR!nzUm˾P9>/}J%*C=7[&,2 -AȔ51>υ~211vDQ,; REHP,]EBvNWbJ %W慀4!;Xb7:7D]脒euޟ~.T*,'_GєL}ʼjvN˄b=$ !Fp{, u"l[IzO~=ͱ&i YkLJ;_}޲5f*rwɪM^n<@blIz>kS̛顓~ȋ*-%c}t >m_\g4kט.O )z nhZv=S-NJػ3LݦhrS,nT.yK -~(y2Mcy%Õ, V<2ZkӾ;N 0]g*n<*}BgJ8U邤\bam9Qꎉm}84b"Egi\$;6 k{p?Cj-:&^(j%AVI!.'LY8<o 5fidK&yÁͬ.Tl^herLXC؀^QI%P?Grn\靵NHJS]] SO> 1fi|LtZz?Eʜ+{|4.ҾQPK+o^*]-j&Yw~9UV,/Z+/$_eG 07)DOjS_$6ھE) t7 x+6,+Jm׆[PSX5vV,zsJ4M^㟛.BQ UU *'DADpw:M:}bGs) GI endstream endobj 551 0 obj << /Length1 2778 /Length2 24051 /Length3 0 /Length 25601 /Filter /FlateDecode >> stream xڌP\Y Cpw!kpw 8[ H4A[pp;3N2W[T5Y{ɳlCM$j` r21X̬o]5. ?ĝ&`+XOsqظxYY쬬|StpH[r "+8tf6>>ƿ@gk3@ hhfbPw0z#?  =# t:(Όo3YA.` 79PU(;A++66fcˑ5/c33{G5`am(K)0z2L@M\&&v&`DU&IՅW,܀, 2w\]vwgmA 5Wn, k'7?*`o%:fV,ܿruK `NgmCq1q\݀~>!̭\@Kko`1o n'@<{l_>d[+Ud;<>L&v.Vۯ!?Ϳ_IUL!GY_?+Co%,tG_ y27%$fg1_?&v^(G_U-߫4v&Y[Fk)kO3.Y*.ֿ.a pf ܫ}oHIc8;x![F\6=m 3lppFQn./߈"'7HF|+E7bHF߈"qX~#0E7sQ\~#0/oF`.E7s\~#0E_LE`;{G*$KM#0{Sg3[ e[_vf`I89I5t,@pHoāv77qC?eܿ8kp-~C'\oflsRwps#X'V^V@`YͳKgj=sMAmzp$kJ#اVlJFg28w.8ɀGw9qss?X{ќ\v L?'G_e__l&6r[w|~؉ 3*R3ctpan@p`j[=y{4׿޴Mk !M; T6Vy0mJgsnqGK/O^qM@_ܐ'{9h oWmz}4UjBz ȶf-T9l'7^T/X]Ҟ߻Mons#=dш*1͘§ue"y6yu=5B&ˀwÑ磻n{[v6*]|+̡q$9¼ŞY<,ϋL̻ijQJVD@(-Qf|eQ32NyQk%-dBlZ3'd[ʪ 9D|̕{Tuuc %[ӯVr$,UL2Ky)ĭs͞RqJwn͔G{2kj4}U%v](Xԋ7tёĕi=þ!h1JVlC"e<Lu {o\J@RHGh#m?r'fQFlZSO'dό#*CUeb\nГG[iÛbDClNbU}L:SR!eĠX}EC+gs-]H99v05-3ER4*5cA!ŕL=ʷ%AUpdg3Ҹ`)k/|ʋ`ӞIulrrvJ^ |MMEEp?O.P6^b '[y4z?gy7=T qTjҪ k/|g3Rj@mNeNwr4/'qz͢YWHJtX }t^OֿrrO xs<<~?};#􀼏Itf ")jȼH'.ϲ "M6M>7"Gq:9wTGwc7]?q<֖ ;WeFO²Vhn9bRx5lIE}^7m)P|MDEym!>>ڸMfG+iMeLj2ٔ=uM~M}HԻRԬs0SrWY,:3ZU$sI5EXq3EsWn2|ې(ga@RqQ>jq]o6N_>:("aMO|Xy&mAT},ɮ4l1q$Qf;aɀ:#K"L0CST}Z҃=-iW|WB!'T%F췣I zQo1$hD 7I*E%yEz<:HoD[3R5˕{H"p1y09*> Sh1! Pf7̊70QE0vn  |JU9pw55fs#&PQ0˔3WyyKIC;߅Yf*B!z//u6!9U3eY{ƼҘ%⩤A;NU6!@ ߺf^}P 苋4wl;<\iWibLoHy_Cܕ$ZydiEg-@v^rkT*p NͭL5VM y3N*5O7LqD.oQ,HD/slφ%W6Q dGQf=\YvS3kc% !PR7E 9fWOLuiD%.ɲxL,ņ$際ӽ@:RQd:c6E^7 79 !SqjDlO>d`>L-6)+gؘOMy Jo($bSg SuK\E(o y!l'+ 'r'키`f."!V̟u<Aƕ?nI *ri".ijG5~D*Ak}#$S 8G ߡn _8$F))ʡRBaUoBEr!R ;f76$ VRXϡ2Kr~Vk)L%|chJ}"ŋoqbv F!_ߩS(A-eP9/OH \9Ku3r8"!9tB>m M&FRWUdMvnՕ:w%)M1j\IC;`QV9`r%dJSEKAKE,Q"񑗪YY85M3]+/|ȁlyt_?QXYlɖLl/r쒈sq]zf! T'k \\, Y+@tjf颒lN4]>2F  ٷ?w+b۫=lͨJ̻l <%d3<櫙NmH\r^I sp<[R:"^gaYRJĦ#%eEJ%#/IE[ܪxrʄei=V ,HNc`Qp]r]xqG> ) ?U8E Ok'Y^HFlnHր(P@y1шa:NXi+_˄ #]45&@Cl]4&2NGx+R/!c}'s1 qCh~ly3hk4kul eQwx{\H|thgOd0qOtvX Mm/sݪֵ@WfT#l}v涻$v&OQ} e{uP,Ƌ:Pz}-2Uf{l[\ OA!OjiWO̘MCsv^d<_uſv֖KqI̱?DO"= "rd+E=H92l[[YQvC(l*{)t"Za!a-cie'35ǘysR8<%@+S'FlFV|zn/;|q]oL6=,kC_yF9zA%4۠s)˶ZQzKciv|h҉ahy?r5;y]V/C2ňyncLc>HHt㟭C0&D9 &x~6;"[~h'Z0p)[pɬר>vºEQQB;GdL 4}P'BB/K?]z ߿Ù~RX+T2cXhn]t@+@hܷ6ɭZ*{qʤI9O5lsR:T'k]#ō|H}|XX*C#NMIe+?OV2"(}jek._[ ym܂:jۼi9<.̉ 9]9d Morݫ `\/S9Rp#1J{}xy g)0ȰM!K}Su't5Ut7ڷ;]oޡE"7@Դ]Y!zA-+M//k#M )ύh~Α}x=oDv,^%% DRL4_OPľͮC!|1"!BHAhWHwȸMrv?%fr xR S/18ZwcQ~9N'q\ 4hm_?j1˸rhE@gT)Ų.ԯTRm=#k~$2+uݾZ)jUk6ӢAJ aƙH@~OHJ8c␗7H:H1j0SG:k\ޡڰ8?G┵= ɹw0ʓB"W&j.Z,ѮO < lpMZpԴ(6;dLq&EtWwݷ{KEZ tUnwq"7 ȝK;u95'2fCd@r{ڝ =Esg"YSR.- Z>sH}vLFHgSJSR1v Oz&;j6aE@n/|yx( >#- P.M5l3kcPmGd(M'X$>@+})Ռvip{g-1)^'á ZB dBAA΂}~Ud,X#-X/1:Nk%I"9rz\354~61 DvCĦ+j X^W_8*Ae6=_Rix`D6/@]yq1ȦY5f\ o.94Q"GI|;c(G-yz{dH]CU_Ghx:JjEf7׽ Tg R%녫;Gwa:7Q-ֹܯs,hLuHU⯨bhBgֵh,+7![n.vs Ab 2nSM_qWtCIF}&&y(GWBFfc d}E>teuo?%:H`;ӓ6 G8_b-4jַ%sdU9Xh IOZ/,?m̿m~0~D 7| ac%JO@g㹹<SO5j s13';FN~bwqa~Ix8ɣ[2 Gk>UhcY/, 2 Zx߇hnIgU2?~TOo{G,l+nDGpLLS*xh' =V$eOٕͥ0Nɋ4>}aE Q RK\*j茺~SvAE8_T]-'y<+U '͛0pt㐥rao~$iq툊2])Ъ f/!K/죐GZÕgz xkzSSgbȆb`Y|Fu[/B#Of3bLb6,W}b~ǔg]W[J {3h' R*+,<_tfs~ldO~ZtMN D۬%3]ڷ_\ *'V{ $-E Z*H֊\~Y?#d rxyN?ٶ.Y?﵎w@ =z5~HH%ΎUITN0IR4:GJQtOCYJ8qikxKTݭ.[ 2US)C3!H]$' F ~kGZ-,b -e X|4L4W%S(#fY'}RI3̘v>?ZN!?Vip~ ~ôq5)NF"fWz=ϥle>ڝVۚ JNE|)t | s!`~t;cvXv򒗲`f@Cl/ĔFC^ړA2 1PVMID;{uCY*,|,65Eo|qeH^hYO䴍QVLOap0~  ga-yMQI-Ch2?I_끖;v0 ʁq*Ͷ[E%.f;NitnKI-l*'f›5|y2] [ ;ň1@bcA8n撚03D0k'{)BneekP}GG,6@wrE5:SZTYc< gwGZndOgB`zE *eo''>auRh\P&Ť' )faƵE?PWQRq׸-G.ׇj1> C/ԙ6%9x RJ ֑>|-<$ R"Է21>uv9^5mr"*lPڛ(Q"a+c;F:*eZm-]+ޔ_j r]X4եsJ畗HԍP8R{;@*'M[vs :9A$0,qmt>tbnfu]BɮyCZɠmޘ},kϝ,- ϖ(ӓE˲&H73Uau#1zΨQZ߹! o=pH}dR%@>#-qBFT (xT !L@$BDǣ-DEDϮFK8zcGٔڏs'"kbfRđxDB9o\ gEcA\-[- =؛WT64J6mO˾8ݟ42*6pْYЏvYlR S.^gTikN-W5,M!~ 'E~Dp:Ys ?>TxAd6jq. vE7w^°-`aiQ(>VSF/'me"|=XRCzv9Y~V?&$v _?z]&M`>)ayvǪ̫^F9{*[`]?l|/[kևl<:ĢVURi (Տ[bO٭aehn;܉RĖc54&q ~I[V2,nѹ)Cƒ N (ϕ1BS53̏\I:<^͉eGC`33^tN%HD*#鱿7h?1EsiP0דp'̷ia23 5ndD47"UWfG>VzAsBczš^S)ϋ~OCo*">nTWN<3't|3&Q^3Buo4w~θu^ɠMu F0qѷ`ÿ㍎bo$E 2ds.{n s%kGP7i17#zngybk&a|GdW͞%VPFƤb6B*N|0cIq7LD}PFXWWw'0#k lb:iA^P8!IM%s>FǤ>|>Iص|_! zGimYΫl T,Ϧ#+-\}Emu ۿ6 ci,\ݕ&cǃ7˛/bTfT6"`DlT(pO!bQR[*sUO!I<-ZvVJIGzts-_kX4ZJ35Ztj._p]f`NZ:o = C JEn4s6Nd yڎ^~|^DyKK@z,.&XO bv.&2vpWCy3m; yLc̭^kMr AL`GïV$St=GG,]#l~nG̱lP& cV&dZ_:n ? ُ{PMyh7Zf[\'cHR*p}LxRAĔjyQ>/FPW',[v18{C"$H\r/nH~Y1kmz DS=6>T HVBTQ0 kkZ*6ͭq˪ ,sDAZJ9^A`L@=]_ ݧu>vFU9=qZ3!'Imj{$s4vIPc&םyX­B=SZ 4-ë/,Q$n(E$"$ z6م6WB1g56%;.vWnMU/NvnI_٩c7B?/ IW:+J`txOj3ܺeӾ]9lhIL;-P-)I{nJ^{ŖL<ώ,uʂS+\MRp`Mtҧ*ՕO-h6~C_ܗ̥u_w\jfg"0t[QL]~&|vW%%GGi `4$X -Z9t]ۦ6ӡ0 m[-?",d1~ ףgGE q׫ʔdb9EPc|Jvpf'O @Әr4Td9)\O ȬN'|"$z+&$-K/ /vM߂-GkЋ&y+@޽s2MƇJMMp IƱc{잣46Jr ÜћAo9'82ڨ+{2=}wzn)֤Tt~xI<ٍ}^~*[& )}[9/z d*0jc Ȭ VR!]Zb p#d~F.z$5Y/6ak%V_8o-hS0wqL[ =1#@9(d=\zUǠK2"^\GFpXsp+ʞ9X.6$_noH;E͗=Ft)UE4bpYz& y@%H ?#i(Y.kbg;fw6Jb@gqMBf.bȝ#Y:斈Ei.MA^ mỿgOvltIb]6 A᷆G=߄;#H'piUO6Wkd8ݪJvON;N}S}䞊Hkir6wW7|EqۭJ2<O썦:WןR- T*;&VC&--~M6*7u|'^E;*qve:0i֮vzN -^3x9+)6e5IĪoxC+}$3GPJGZдԮj؋4-ъl۪ӿh:;n@vTfdw틭VF3Н*M@,'<æ!\u)w46|C8jX+kU2yoj#+הB1t-X+&x߾c笡f#6F +ȼ`Zyտ:4Oa?9qH132.Ȍ 6XȠv& Y#,\zL[C$g4>sr|{5^wskfg QIγ%bI+ bQ [qktt ynp@hQeA&v&HCd&Vh{P\ZComw){6}7򴶐^hҟoxEFa¡;K ѯG_@8* p:Km:Nȇ40ZOjoPʩkH]Y\=#?ų1k+Gri iя%%>8i3UoCO=֦k@L9SXh4Qp̨`}b,R/߷򞗻ġ7;3]"r*{5=Z,$/p^4~ZVvt;}CG^o˗G!Gc-z؇mu$\C3mnPD9/G%-G/Q]eb qJMN[}U0 N#.j%3[,%^)žx'6O !3JF4Re{ Z)LNbE7;d9u9aU R i9;>"\䝿KԘh>_xCH@Q}V7^)x%y[0ҵ>" M 5-H'NN^Uǡf@J[Rdt3Cl^I6&"[OKV#3p Kʼv~91dXfvcOhJ[:fs[?T39L"'E[iM|pM7B`LTK,s*?Dd 5?1gJĊ+@Һ3'vuGp\l\: 5wWJ5{d4p b1Pqoɨ/XgW@}Ҙ?zM;]W@t.H?ZR mS1 /ɳMAsH&ǐL)n%JwԮΙ'"݂01*~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ڍwT\6 Cwt7H030Cww !!"%ҍHHH#}{_5k͜8gaa5wځT8?/P/y@|C0b y+@pd GiA!u+_/"/*@0  PB@,Pw$ Gnw-:``r%ym Jx++W?˧"d&GE/Q][wQ AUhx ?Dž(( G};_Y}T ӎR1-(j. jc@`[ඨɐ8]D  ;!zJ t_ /j]PO'SM (He= la0[$>05 ߺBpTE/'*J(7"B<> ( ( 7 $u>OmB!(G w#B`*=C= E_߯_K?i ︨a0[u"p38B`gC}$˟O>5Fm?adW廇xx 6oLrGn 8Bk>jEf$@lIT몘aϓ+"F:AB3&W_DGmּH~e+jsim.uDd};6v2VP4[Bvۉ{P&86'%$Y*c>lK2&u wZ >ї_w=CS (ƪsO>NlWn< {(Όcli KJPēkNےwZÉ?S*&G3ji4|W뾝T.}._fsnC:7x| 2 84 ]b_-XQ:~Z0 _KR5M_H[ao'ēErnb|e|F\x'C¹C`kFy썑Y>wG[ܬLϊUJV6$NiGSm͗4.+2C? oޕi_B8Zjmc??Ox;(2@}@gV͏;A%-_l TpGȆݟaʹ]0vCjtعpٻԲNWǠPY42b2$;]7W:l!FictNJNT+=d%{);+NJ@=V,E:a*j%E-9[W<O:N}q_MM-v?{rsQѯ[a+d!wʂ>`z%/})_/˥عj=uAq"=1FK@؏|xOzp=. ^/4ziBe>$^Il5]?9ayVς9U?xYU,K~MX> v%fQum3kpp{l BېϦL&+R:Sϡ X6C^X>_% 1Qr (y]Sf6鲌{e"fZXsW5\if\r1kmPD;H*3~fbovK7:7~|dw]4,5_gi0%~HSSm0bJہX}^]Jq1{!A'Q3˅Lh6Sjҳy[/X-W+6Xu 7X~7ڹi6~J~]gzS˲2V{ViiϨXETa枇3ku+no8N0/܍:_*>qT9$&u~籝WEfB<{3M_ս=7`*c[߭㴙ycw?]:3O+4" ɭ9CጏoW3aWʺ>hU3| E-S\M-9DS C>B-D"jslQ FMڷ5v|D.;ƹ?WD"L\KTP\1K{NHaW~]z1-Wq&N5ݝS{ͬkX2;;ZvTfy_CCTv;]1cEd㫹Rlߞ(t.,5 c|ovByJ3.OmZŇVe?Fc/`n>)σ+\b>iYȓTϦkpߎsSxlK@ 6|i'i(ުYh2t^ ^2J%@ So9}Gs}"qĠ$\=#!AʲUٯ6'JPd.kP8S㉯ KJ&]X1&#="#%qs[c=N٭+nZ%u.JpRYLb>,y[gg4znh9o ,L: Qt18虞ޭj{CGE=yGZ36#w 8|~6ǥ`ݍ..n;؎̣WCڈrn$aV{pYB:G wDvkLXz7 4W8`hE =~Ok=+Qi$dJsqBo{Iu)3MH*An1hcNQZgq q55F| j#tsw@ {Y!OԱ{KoǢk尔e!_D&I/,6sݥ Aox{*O_"H&6"Xvj^^$,|"k7c%-BPjBHKݶeiQX &\*ZoRM-fP&uC-ħC;+ LRb-yeX}'dttҙsEWzrz^Xvedd6(Mae SX1 Bo#B,6. zMVMېjT ID&aZΤ3կuTԒa<[Z@Dy2qYZRq=B!7vӰe%[טyIL&t,=8XjwUp5X9&f >jnVq5k76T&1Xx/سL_ߍ8;'oK9`?"l :A`oIT5Wj'|1OہS3i伇no 6ro 6C6zӼǔ llaR#FV< ?Km\`1J#kpinp_ %BMgtrٵ5m(vҋ/0>ɸ ;-gb_>5\|+c~}Y;<*UU֐ ^|CPtT,Jޚ,Aʒ67DRxFn&Jp&ara'7ßwWe>t2->r yZ4C6w(r\>eyȶqU)=;>АX'TRq ,vFǢ#vC 5Z1IJ <^z@*" մLsMpL'2 rT?`zsΩϸvT>n|ʞmsɃZ?[R44KByuYS tuN7/W 5 L?K3d00۠et zyVԤU[YIy\tBNjmAn%ޙ7ͳw6( 8_Td7>jBOZ0J tO1nbow{a2TBPC$!6O9mvEVs耘ë/M-zWHw ^+5_yE&bۍ9[^$ԝݚ4yJn~ugD~N>J4ÈY(&6?բryL9驶3cock}Ϩ@JZ+vH#.6{r ~=iӊHE[Iy4 =)+l l;EpX]N34j=嚝.UST"b'd.lb^]1:Eili޳T :xVlOS4, LK.zUqiVr37%<4`1V$=٨Dz=g>40|Acݐʓɕ @~`}IlS6oYm,NuՀnMd h͔(h^wgv)+tRΑn,%pCGs_KD(6:6 .AXjhbtw{Cx*xk4/  Q߲Sng0ېo,s[yc ?8 uXQbL\igzEү4>U3{};d1:7YŹV>K3fbe!RəO;]kTCBL 1]>+ ·FuswqKQzu>/I>k2S#̟T"e3u:W9:pVaz$ Ňr2@hQ&ɫYV{5di VY)Һś endstream endobj 555 0 obj << /Length1 1610 /Length2 8190 /Length3 0 /Length 9249 /Filter /FlateDecode >> stream xڍT6 t 1tHw  3CtHwH HKIH7;?߷Y7g?;>lL| p* JtJ، (fvsaRWr[#P5e4=0(& Jmw([{Bl:M8 Ǧwv; PY>8A\8ow3 t`gTF5`A pvv燻r C;l Ek M `q^n` B@`;f vr 5z.`c?/_   P0@OUDa p5jm2]5@U`;wb(+ U`Jpgg0 >euomu`v/ .0XC/ /fFD%+9 n uP;0 @y}S=ot #:A,Qsz-[8 (k&JQ D@AqA8Q7ߨ5$P@4< οօ t98ǂ <]fWo=Po-/Gk zGM:p^guj QswUlA =@B``};3 k 'SoJR9!Q17(I D--{08@~SL #$HWTAPk n 0I?eT gDU iQߠ(&>`? o-~`$77I:ևSd0};qAUlT!m=5ό׾_[#ZS ^]Y%=x#eXW^\z>#MkW?`'NM|W BB^=jȆފ Z1{W|qƱ˦ lr| 8ܤHIҼ[F$<8_ei*#!w44 '쾊5f}K܆ӧ)GVSmN ݇?v~XIqP `k.';1%c~\BjoqKA z^IoOIolG"yixjF _p|뾳~݈HT+ ,m{P}N&Bt7?b}XPЋB4UȎLbEw.E/Pcoݡ9ml8LkYhPsȎr21stj.TcH_ R6%fЫm})mEnꎎ=!z* Bn sUNM^lh_QwJ$AB '74Wk46}DؒF.ฝPtsw( 1vwsk|SРS#T3 hʖq+Q{mM_O/IuHjpјQJgԃIxh\Z]Gb$NM#.씲NgBȏޅ$<|6^-?IL7܌L56rxlnu&$Re-6^EɄ5`Ʋ.6<^V8rqcMM-L4̏|zZ C2A{Bm[g2vn~{U{뤠-9Ѓ>S^+L:Z6yT@R] 67 eV 0!䏇{D(5^Q/m($;JQ㨌ɩuSːu}f9dXjDqPp*0x%cR#&j"cV㟷%?VOI/ޗJgQzx4iIGgY9|W/k:K{|bb)af&ѩJ*zH A vS uS=6#80Dlyc$=({7'N? $SL8=♪ʜD  *65 XIx P~4OT@#~馒r`/bA}z o{3qgDF$3oE.+qTsz㞗% Vdh/0HN6b1\aTӮ횓a2בr@Yl0L.aT B?Xτ&h:S5Ij<4y۸Ůhb5x, O%~VWu0vb|w՚^Uݙ!8A_kUǢ =ulo.udG# EyX{V͜J .l܂T'Ez@=m6QCN60=2#ua' 8o 3G'~=$R 0QnUA딎C3h1% x .59V;;ƛFAun[xqkN443# I~MotjosS'ye/t"gKh~3&ߴ> ;Oi8Y|zg27!Lt}iORi $`5Zu.+G&L#vLgǞ.+ ?+Dj3fh4Hn=t'Ԍ#䯶K<2 7>ZxAv%VR.Fm[os5f1IٴɫrqpZivqǚ89!"^SEh=;\i4ByəIe{:x* "ҙ.ت[ΙcDr,MthAUPk&u\.Eaل̀N3ddtu9= &<ɗGc8 N+_^~gȈ!n}z^i1"NΟƬE,D%F |=p~i.6]r,^ؠ#4j|!@S׾6ںv62\zo~lqw>@UI9ծYQ*we`\}&8ۮ-;78{#,c3U0?6\5ķ^/#Fp6ƒG3!aݸƒk~Ǔ&cFV 촬VYUa2KQYd6(ZճIqTNXf}J-Y':*-PxSh?x8C4Z`2?;Jrۂ{)"<;a(ytN S6hyxyGu\wc5}DrV1KIƋbzC d3Nhg"Noj *`43;n ťq7RJ`.D6 dhѮVE_(EsS,P -ht4g;w_v Xiv?pBVsj#{us埢OfJN LoJeg.@s;;On1|9u9sG/+02dr`p|.V,_ I!A\E8v!,4 \mW&yg66~WCEcdVԗG̃1#CIrew}&+zr+ưT9SC3#OZ ͙ڠ( 0O(|pѝ BhmQ Js6_A6f #_ɋ9=p*k [|9&:qXcA =~G;}17[ېbcd_i$|Z9+fҏf1ç?D tLMugm7m!4zЪȍb Z \N o3>ҧ`ò?V0nZ iyExN+Hk,N4vYOh?c'K C_gcU(tAW3VYsи&hnߖ]Ub-}Ԓ 7UEj[n_.xxؽE_O|~dرo`ervu#O.'3YQW:3 3_H N8)-Ngك=$CD|Fj9TR맥K 犒baDêYn@휷rcK z*"lV#Qd``;zdž/Z*Uبz L^FUķfQOlx3EJ R9>&m\-.SYtBs #YWm=wX2>|\M ?KM~ zk *YtC-+߿n$z\^(v$ʹc_- Nm"(*l~#x}) ׷OGq nhGu!7?e0F&|>|S7݋x)(o.[R={=xJ[x |f!Maq)SYr.bm.a|tY]>nD2>;rfajd@mpqDn]F{ #,NDg}8ax$YEڇV`}`ZwƧ8q37"+5*{kqdZԡF'*fSU3#D6Xzu广8RQlR{{W[ŐqQW)brHX㞺}d^fhBKCM!<[$m4$ 1};ŅβdT>ʈB.8b~[rANϋQ2\8){Ә4l9AЩB h6p٘F%nQfFNPdpU .jt7^u_l_0fe{R V&_7ܩyMY ,~T`*i;PZ?lںxU< !.z\ixibAmn_4G0n5^K= w2-7mrAyK"pC={o||v>6z~P|\U: bp =۰g1BpQchbo: ZBݳAg![sw]Lv 58ؔeL*`||iU -]G":wY.4bsC7^Flc%f(~8 KQQg3NeyG;b ֲku*=XN7mPKb8t>Ya1#cUwg0N &[/^GcA+ HsaLGI{ɽ6&&ʃѫޑFX2.'y~ȕq eI($#91 mn}벵 V֩Mͽ{x0"s&iϤZKΝp{{BD۰s]]ޘVʮꑴEZlNy%+kɔafeAIQ+¥O'+!ABBơ"5])S@;:ћ5!qVf_F>7L`yEHsQ+v 0XWJ#R&JftB }e"/cZֶuMiXe嘉g fr6ay@ bl}L A;t؃\5vuJ5)A7S#Ҫ3W5A%>_W3Z7p@p͡h~췸,g+q30{@-BT >!55X" @w_زo؄20u$YgHe{cN8H o --ץ@@d[.'L[+ɍ+ o2UDM2NԹ_ĥ+ސbC }yIrСJPp-aͳ؁."K{20.[:. 7=#PhVl1Fe[C.~Z# 5 q=)zLXf jF#*PgUm^5Z hL|&Bu2P| ̶Tޡw(Q$1vŜK%n< !s*џnn{dl*.b<8ÿ#KOf1~MČ lµ`Cx$P?X\ֶԗfg3yNN#;HDЊxM׳LZS nJwgڣI`?DNX^[}XlkAݫ usFҲ' #D<2- endstream endobj 557 0 obj << /Length1 2407 /Length2 19158 /Length3 0 /Length 20564 /Filter /FlateDecode >> stream xڌP\'Hphݝݝ`݂ww A{svr^霫ɉTL L<Qyn+ <9-)<3$3v;dl̬ffN&&  ybVfy=\忏*Sj377'a;=@hhjl Pu0z## 5t: P0]<9@3Z]@nf@g(6@UZX:Z`f`?Yllj`hleeo0%\=]fۺ8ݍlM@'n VOu.V. .VU fvv@{WrXm<}y67337GFu{+'7,@"2 +t=M-"WrdK `*gen@??fV=ovhMZ1G?g t8rG[7[twr1ۉ2uulDӀ2t-2Z:X!Py8u-yD5w#@L@Bb ߗ?hO~@SSZa< Y}>]nȰ)5YA?SS 5†')w<>&Lw/M}:Yt*0DO&th#CƅT~1(0T:ia_Cb>F=Z/t<${ƕ ڥ'Y7"Zxb-؇yJ5^2l;i TEⵯKm|DHtik G,5V*Q-uc{y)J{Iu-$5Qu6@nsΟ}i+3 oyN:u-^D"E e?Xo?h>cH1ظiŔZjܥiT|_'%^vv;+_8}r,1(6GcN0IKW %fy`ܵ[?0q uOm3M a]X|''DnkP\@"QZOl23⧵O6-bgYEg"#Sa`w|/~3Ͼ0Y=TPwRtkv]C`ж741Z:ce >=8w_b10I zqم `dQAqj?yGQH [)6sq;9Dx7زb'Jӝ|6j=18YO鋫-mÄ1K!!Ʌuv܏FO:1UGG{$K/uՍa*4 fȩ8*_wZW}?5R5W=AwY6Xw*[/wɥ)Ы(81LO!7j B~x:ʉ ~gc|;1?qK|}+xL9tsC[󋥗Xpۘ~/^bCҕRO_ 4*^.id<& BtﲏP>e˛9g~=Ȣ+ZCP5 hl6jk?Ux 0PY?H.z@neҥƅߝ‡cDDM@q>GqnE ɻ#k5)x$1\uc7d_, k5֜ר4O2[qr] 7T2|3۝^P{䝑sЭoQhte-Yfm=)*V9XI쎟M%'•YZZ53̯]XEuY;8?OݻabQu܇J;[>nIB1i3KI:(i=Z@?z"a쬔gGrʲ2 #ݔARClQFE+"b!/pC8 GtFa#C[+0R|C 90zʣ;ztueؚQ9/=hM CՍ^ȇ)Jy0hnŽg vnAGD>̪&8T{F_̫H &wmy.t= pgaJNG7*Sx:ȏ#qVWg .c7|zPɢf|pM/kX\~3'oP_~u9)GD/;3ZM^uF nT Ld8Mkt Q߁~cV'~LjiWy彝 ([bͣ4L[0M m G.mt$urLU1ʮE͒em74w%&=NLwl3뽒`l/V_*,teN){0O-k]N\B>P1:g'U5D Ap`|R_Ġmcx S:.<0j s6k˲ڸՈٝM/=WkNBxKS2'kP>KTg&"jO=Da{q/eHI?-1fgȴQWNU%!.ObՌ2-kCYCfj,y"{ O#szಧ;v)Qh1fTvf5k=Ty̔J3aq|PB<ඈ-xXf"Y6 -5-daSʥ6lÇ V*'~/<毆BR>Fq7zC-DuQv@_LPjVgP{N~SJ_^s𥅁)cD!'ʢO*iTv4G} &ˡ~UUTE2Sb*&pF&M4) p-O Ds1‘91UOJ&^7a#J-}%blE1W:rRƖL cJ_g"=S)߾ 1y6?%_.6oIGG ں]mL[(4):t!MI`/l3RTe#ՍF4&Ke{ِxWA2 SJ5)/c-{Av PXx}Cg꛱I'(S/UvݟV ?A/oMC@Ըol$ mݕ,aunjƹY'>Ӵ$]z`.B$Qh,Ko>S{fnS !ZC>OYO.}T,MW)q4іMBGuAƥ' :K&c>G 1w Qf2P%P[K7_'|nˆ; 5m6 ޔo{ْtܭ~ό}o"ÒHI\gUGfDEO"x2cPW>[+ F_胙kp,xcc"LqWz1&bY2nWTq*ke[SiCaOYSMKT7 0v~vp]V[DY9?"/56Ltz0&t%(k$f^GG?Fǫ~*x'փ,ar%1_ue۔&M%,0K q`8N{T -v慭R%@8ƜCs3S$ ]mVs^v@&cQh/#]'U[d46<ڪ{Q5KhC}|$7'F_e[2]K]uvKY1Zy|SDBˤ-`@)cXZ8HMC'q:,I(<|['~Ϲ Gۥ54wI(F,Q!j,P"MhT~A4T{ k$J0%3bXYb|}%::Fz~~1n?-UGaZ`Sw0 8D (: AbxDؘхDh3Q Tۏi:07cD/tZ;* 荞GD$'\'ߩh;sţ^sNE`ɵ7 j$ QfI[|Ȏ4uK9ÑF.*$=K*r3}5Ue.tS|.#0 B-噭C[oa)Cuw*,Qk剬^g(Xal)0]%(ظ̈/m/ gi~١2wcpBPD˘Qc~Յ_U TY#;}&vC`J@Ijf[MZ#'C`Oו3 OnQ2Y@1 ׾|c:,P+akuRAؠBq"+C +P|̡_0^$\t\J}0"yO ^Lf*0fQgN$u9_kk{T>G.Ww,4%t qG){pL8  "O/fS Jq02c/pM*R?`H AXkwveϐDYпȫnZDUmfuT 3q8Ğy󤔷[{E]$,@K]+90`[Wrxh>#Van ħ:q[ê1vX̻ei ހ{wl^#%7 $=YtJBun "!AKZ|@=*>Mj.˜f"l"3$ӱ-k%cӄwiІU|$v gphs_^wkgθMmY?b/^0_Up. #MІӃUmYw#%WajܭΨ15ϡaGn>.&ƛbÕGðږ k=+\TCªhwx'FDaI-tCEWȝ!X"_nKZJz'H(-ޭlBpp ۵%St!)'q_3޵yT 0뻣`Fs 3ݢ muN"Dv(f沏gq\=g |yg8Ddt;WIJ7>) H\7(^7bPPp7͝4S3yUէڡЉ{S217u{-Z8Mѡ[kR %nzu~ :uQQRA t$E/#(ŷwIP] A Vk`I]j ~: Z!CF%u%@0moRN:x>FJtZ%l=D3=}=Y-8}9 n\c'$eU<+1%"3-N0F'ҫz-nx|FĊbW)THu!{j| kN>}%gCx$1$KbXe.0˅sAX@a)u?nYt#-éni= _@0J}؞H*]wk >añI̍?L:$g?Na|N?Zt  *EN1qH\/M6iD}%\JWh"ՐI3DWg3قu~&J"sMB*7uP@oe]]d>T[}F4t67 |"‰tȵ1ƣu F߬sw-Aډdݳ ׯE*b̿7+gSӬ=9pJUbIU硷>T}=%7w [V3@ BmVj@Տ:=KS{|W93a2+ qvzپ@ 4n[} 9Yk#jKq|POy_Its@=PC"QOӮ ~GF6-WxM׳97MJ ![5>+DC7WmH8W4t+7r$ I=+s UNOF:)a%kNq0$IB1]pX'bks(3壋l*s}/W3p;SIR 䛼ֱB/P *QG~h7lv> bU01DAB(7F$ݍ<-MADIN~͙z{^FWIeײhfزjXLMw6xԛZx'I2q9\N 2h-U^N~ow#Avw o~"Nab> MC/gS$wlXlF[IT*67uy `")!Y*;|y܉`0ޗPՒb)GhM;|~  Y`K>JOO8\kL09y. _h,#m2VZ&BPElIp.БFQ&>l!;Bnxg@:t*F8^~ZW}R4z|Ş:AWIKV(%EVs{׋hS{Ϛk⬩qɛ WtcĬ,n0[^ܩ˳X2A1|f{IDB娄Ncצkme񛧮*MM+v4.]urzq~VAH e_xJ_ sEm>?jF)*0u3FAID6E~dE5ePCN-֠9"U1D)[-2l09Ý5g#>T{IܱCFf7T4_U1 Cұ-o{`WZ[G]+Ѯ鮔;k.\FiKDoh<"3x;ZTq8qAr_VQn3Hq0e]^p8?J+<'E96y}6Ό؜/<6lBqFQmI-N6Z-G]da ]/vkk̤[*wYY2/E`\RZ]:K J|ۆd6 :eݫ̇EDT˸/]NI˒-pyqWq¤cHCOO\], m,=Kɦy%9E \&DqFWy&ל*6&y!mXZo<0Yu3:(n~=?{hiJq7#M'ZDҸI'ՉFcM p 0qlZ`^$ YU_HL-Wx"Sr*HƇvxKHjϼk|(Dl4Y<zvBe䄙yyF%o,†J8"p vF{|q\N8 E9qUwDXx+&*Vw?s:)ŰA^_aBo e΅}ˈWy=kiLmPYY~IC֦wOCetx9b \_z źޞ+̮iKI\-\"9>2ӖP6&um2HE5TMdĻr$~j/Jg6>u*6k/ };"Ss>6 -$c_-㎥H+/ W>($PڳF(F9b >|cE8d`ih_[:m2@5kM[cܹiy8W0"(h˰a'uz)-?a /Q;O8t&iNbk921>?2#9 K;;Rf*)gT&%}^n gCSzL!gض&?ZcIؘӮ'ti%o`$ n,JP̫])cyx 0qjʐF@Ciؼ6g/i07|qNAiW"-7]Q/şO6vj4&4ܸlo%Zew,]QfG.}-zsḕ^:J=*40}iz{*]HZd@E]Z/o+fBI4X6l9+os4[Ah]|g*T= ]8&-Ŀ#}+1C*$K9qFc[,̧O_t8F}R xYyBc ƏQ>|IN+Q_ق؞rV=5޽r3[NKS3Zϝfdj]4D)/z\ !c!i[bpG *JŇĹ7Qy\BmƩqʣP>G#Y{IۺSRm6V ^J2+ѓ܁CY`7cIn[;\O,|5'M63T?k`;CMe~a>u^Iϲ1՛C}J@Mh?!2N5l2|ȡ'`n怯*Z=,t`tuy9ПA(kj ?wO{Ŀ$-"߻0E־n$5=?vk'=YRr ĥYT,ggᕶCLުnKVppef|r|7(heW?#o[򽄘kIxC?\YgdAψ]%+<Ϫ`eQ[ҋ4(j7־#XK>1TT_`d2@AVՂ[g;SXJ W+w6BYH 7ð*2/6뱢\6(oZqYn;.5n39D.ʠkVpiuܸr$?orGV|1oHyiL===۵  BbZ)gFwlܹaV<>Y0ۭX6^~N~r cgz[Jl %lx;h%:3o4bZ*n*;q_KYKlFȾiBQ,yk\0}@@#Dt 5QK0By[_(W&D]$q6tJb(mijYJ χ1NDǚrJǗW'"`vLDVocEٛBuv]>r7+߯pNbLS3Stꙮ9K#N$589Vl+^+sE⧟T0KJUvJl A4!Dƺ2:}T}{Sh8N羗˻dpJR9B&Yp&BI'V,5I#)=1ƥ91~Tu(6 vZ:ѐ ŷDC!΋qnP|ځĮ"pHwz\^Rum}t_1lm4A5+6\2e)\\0?ǚ%0,ɟk r 8)6#?ݳEڼxY vjdaP([`{c3A>"OΠ/-̵AYl#janB`oq&Ww-8%)bP)$Q U:U{&ix$;4Z-"C?"SӼJ֊u:gJ2{pOse¯t讹\3Uj+ 7]K8Pnk'KΫQW8Uh.2_10Ĵ0rv >Bqb]oOP'YoXݪ_Ћw 4>d93C8 L5edDmEbU0ގgI[)44/ Ftմ:E&!ӫN='A6{ y}eK [K~421=x"b<&8`%|ЍYJ)+Bv]٧T.8cP+PnX+el?42eK#|}C~  a)|fC۟?۶?/0K\헏8UkE5T4(Bl(&(F29evY `J-=@Q,;;hCYrsf=T^(kL+Z|Ѿ EѦuُэyؖ !f2ovKS9 r aTIDߵ4w:ߠ4k3(&C,J^J[%|+6pS(wM$FREޱW3t,==7Ӹ 2i_ACi$X/Ilxraj/ud)dBλ)1nZoupBe0⹡1O[IG]Bhؠu,#>ysRձv9Ky"2S=:ʎ\?T27{(7dSsaOU1U 2qv6a| 9{x{P/!K]eXgV ɻZ VdDꢕq$Xk&rۘ5\ |n4g:%, ͊bF ,bYg>αd-~ [XAgha\w#!4 cAU])pؼW,Nd# :sVpi4{$?m"~YѴl4y=fO)GQ g_ ;ce{$d~E0/?4)fݡ`z6mFEHe7j:sx8h(T/ڀ͆EF&CW>O.g ʸWQnjoT=}XӾ{g ud 8-*Eύ^N-4'sOv&m4pq <_VTKE;0&7n.3!yq /py OX!a)+|M!ͤ9WBK.H63U?Fucl^mѫ,7}},4"ed[ 9xkQe ~\1دEJ3(IV(`= ĹѨb Cν;>]Rs/_(GqEhKCKX)5LRdd[aUWјޫI' ysK;xofzbF(?(Dx06ܐ$5|Vu^F5j{|pvK%|B1x;0cѧVGs;m= -q6"h"lݲ,ɜ(X}8x(qR>B,@Iׅ.NˆeP+fF2f#c-0…)w+w66Ze|w KǢ]Ug58'JA-k(aT9ucS4q)*)2Ȏ=t_ D-p tXx_s׊"uヿÜuo/Eja j& (2]i[ƻ֌R;]/& {gMep?=bf=~ 51vc# &%VSb`ܸ9I z]a[4T%:q2]7] ķ<"tz+4NtQ΅x / 276s:?'\hMyI<|-{c*'[h 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}5u.y9 endstream endobj 559 0 obj << /Length1 1846 /Length2 12131 /Length3 0 /Length 13279 /Filter /FlateDecode >> stream xڍP]Y$85;wwHp<: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ڌuTJwH0twtwIJ Cwwww#ݡ4HH#twuYk|;J2e5FS1PdSPWWge3!QR[:s(5N ;?dF`3XTduXXXXl,,9č\-M LY R dhin G -ou-`l{41L,2A#`lddr4eY:[TN@GW)௴FcB[X:2sv3rKXv2c[dkodaig0$噜ݝFv 8FF6F`7H97C'GK{g'&'Kd vb [[_[:M`v 7;TL]5,\2~́Npc_N=3Y"},̀$/'#W '`ji 0[!&She!+?O93xT4$I(`dcgprx>6O Te#A;3?YL\;4Z=(c =N][kc oL.66KO%adki_`8D^+n+M-]l/W,"vgeIhllb`6v@e_M@k!n, xUd&qr3#_0E0Ff7 Y7b0F\flE `V̪؊o`VixF V6C#'KplL9"hd[`ƎF&@d3(l t۲|p@+gd 6f URSv/{#"Co%w8q#ko394LƬ hkKG9F7?#v1r08჏dfg G ? [@pdnX6wp`K@if.%t -΃L;Dwqiܼr @n3A*[q\+ZB+@CIpYv2cb`BIG15 (!L&Dy JUhS cpsP#",FTڛ}#K Jr/yOe`FNkGP IZ425ɂ.sAi<'X>/ad,92QzS'/CHBLV!53Ncz{U 6v1ҕ5S/{7}ӃMp?m7ͅu%*+ iDkB#nrXX؟s]}t{WaiF͇7Joik4[ɶqkeV*[FF$Ƥ[Yfv_tiH]zWW&)7I(mui(#Ά9 ;i9=F"cMåNZ \4'>bM@ Z\vZ RV6eA|(486BZ&4FUm*u[YE[>]Q}mĄWz$4tC@Kkʯ).O&O1Z o BbL7E%YMw{>} BIX$pO@RX1ѮFd&˸2 K-/=N鎂zfcQh3?±.YbyCHdOӖ (?0'ި_L@Z2T%̅a8`=׾٤LQ{g*ÊmqQYD>H&Y~FPŝ$wLٺ;a 10 d4^)yV+r28V=t7x@./wMJ+e8hFo+cjjN0vVl(( /=Z8jh҄qA9LSQmN2Eؼ|˫ Z`)$ nc|S,y^3ǝGr ƾ8<C1p9շ'#UeJy~%AIW7Z/`%Ҹyxj{LᏥ7+#2d, C]sfxU *urf u}7 &fa$yL2e` >rn&䨗ds"x CM:8`:.>3)y;*c0ԁWځf1%vhacAԀ7[$%]J$/-xvej+<l]}Z_/>EpD܁CX.<+E܏A@fֳx^O٦FNZ?!35|,ދq˺"ݗPn̥l:eJ뙣o:{t='LLajii/|N,c~ýGXɣGp^8vAz SAX0>hEHû,Xum {.W&&aæ5q]3uM$\FEYIA[enZ9ʼf;JE)[39$} 7}}DOu$R7NlY5o@UKRs㹊f)ItK!uiq{Ƽ dJpļ+{Xså~dN_uY֟SC#$6[ |?JRdO+ŕ>c)XTc=$A_`/W !&&jK5MޟO1 G[ [Ef2L/u&NJ}⎞4_6 eU^d]Z#<7Ǹ3V?7֭93v-įngʚ\[ljm-W`kѣo7M <{덡 JS6ohڭ/KB49u8Z> 0 N{aH}MQEG>9d̹F >Q#xe'P>ѨkG=j⯩%V~ǐ"C]r,Ya\vSӖCAX9ʌou[lN_0D9-Z8I=*|gWE錠 Q\:fG"m EKɝ)d;'LkR3\з]̩:_1銔dmԱa_Lߔ9d"FW+ypB*r^q&- WziTrvf\(HG97W!mk6t&u#wcPd+i>C$aIQ) |W<1Nb]Q h8LvM;7Zo~BR. 40*qv!HH*La 7J9ۻa͑ZWD/ODӴĘE* 2(0L U8_E/@{jqh [?'c % MEUΚ tnVAI s e9acF{r2OҰe[ wᑐ|*핟2^G3&gH9|h|<,*V>~iz.UFPg 5pIVܑ!E/n)q۹d6p5#,aU=v[9>>9=< c5!pWBď_jͤS*'W?\@-,A3l6Zv^6ٹscRQ&,zƈ5 C gf mpST 5$t \0Iexc:7Rpc.>(6݁3C,=Wr۲~Hcx9zZxI rb4Wۊ͞Y9}$ %L$ް-AcZm[K.?mrtUɨfy>U斾Aˁ環D}>- 7|?wuX&ÏEgwG/qB&dh#/xM6/BYգ;n8FU-C;%gtHkmҥE$ Of(?k-S%\6v|UcSC~V9:?qXw$X,Af;K9e2ȏz 8t=̢/BDFtr<!_ ~aHzp)a;u%m,x9~OtcԩwC;O'RrqɨXO$oqtQPrF( )1fbPZ:|A S3JRc0 a1My ;lF~Վ'h}N/je<b&̆iT$phܻN/c̵fu^=lr‹.L +,\UξN"i&==qSAq5t2=%@Dt.֙++LUw+ <@${!~ YEa֧L :>weWτTW,5U4^s*C!mtIfJeFtIC]yݭdx'nXLb3旦 i*՚=gdz O۞^5fPJ߫~""ncw/ B~3J]^F!sٷ3yu%"0CZs,޹F-uh]=)Ka^<>+qܔ("\ 4roA*9ng*5bGw9r7>SQpr&X gCӰVjI'1 [xI;QdP׳َ0biݽ$_5>-5b zHX!ybu}{-r4\Y;u 2N8;g*rlTzUGRF: vׯyp1Ȑq|9*Ƿ&,v* :zs[4т\Ԕ* %v#l0\@jC(b=йSVcR℞]]("p.WP%d;KvnXWR$hMUnrf MYT'^ hYbxxNϒPR,ȥm+%xbGD~f"*и5ta8t+j}PP<%Z}sTrEʬ} 3kT\ؤ%v'o"0 }_SD[;[l^'h.{X4&O(W?;u&)y~kڬ{(C:%iZO^IɎHIeO cw=QDl>Ji uW 3lblwqWHmiRK M v,ׯ4/acQCΊy`1-ܗ*;ݎŸ7lHV0;i:XLTCD%5Z+"sWKrq=lqR^H}'nކ9ܖy1nZԸm7Ba[zuWǜ#w&NgWgxT-yG@6ɐD@΍y?ѣIMo^¡Ljfx+L30a 78ʲ@!<9og~rC<ʢ3$.18{m­coW'57(dpQ5\ϷCE}K$z28$ TF 'oV)QyI[h0%#)?8)rwht2DqCz7 bӋѠ$y5AK*m@5>IVƩ1z8Ū:6u (Og,'QkF=}eÈpQ5]y> {]5Uvo#1E2%.^# kF7B213,OCqdw>#>|Ef~H' o5Fm0z kKm^NVίI3-xw0?Ë&ٶZM䑾? +/I̒p_ME]8Y:2&cf["k$6tTJvb$;{C>J&L%5m] 5}'O6؟1A ]vMl2Z<H3i֎T൩Ĝm!-Eɿ|\85.p% ~4^!6#ş5F3 _*Tj+ V)=ߓ 5oϯ%2;H,ΏbcfGVqvYG?"k?ƛ>#BsSTHWK͏SyRL^Oq1Մ*X_ۿ 1CF.oJ},3.9 E1Z*TBMVH]-RD.њ4D17?hλǛr`YlAL9}m{d z*>\Pc=v (e?RA%#s{\\bPGU0rTMUЗF"K !q\Է&V_rTQQ,4NVnw905VT\#Z}')CwlL)e,A2J0S ޿K@PC*[u:bH ! 5u)ͽ=L˟w_9(Q#岆UFE&)U)E3B|c]I~0+QՎE63 q?m&2Y4/f=~qiCFb<;w'uW:GSTw u㛓~WئS-kW ҍ侲QDѺo!=X?2I ej;#IQtSHtjh:nyc#DTJYXȲy!a%c}Ǫ]5;>U9Nf8}_yg\&?'CX<$m(ٞ%IH#\=}|?4MěOy^aA*RY\_Te׳P""w6~{ "Z&}ewDKDVIeڌG پX8h5=_Uݽ gUXZ~}YVvQBO|g? s]d5zWYg'TcBMOA_VDU ʋ1 2kYW]s9j1Ny3#;w\݉TtVmϝs,R7Iڑr+4DCP5y;&ψmֵha` }}L—uMު:)FЈ^_K@f.5qh /72ddsFJ&%)>7y]f(MQsu,Jwc¼[ ^ܡ ܑZQΪ?ȐoҸWS)3)-v{TT-ߝ~;]uDcrE}ж|Q͈13t[ }㐭j*O !gbߢ>!ut㕤?>CBʠS)ǫ;Rޛ*EQl84}Zv[:`%QAGO.8!\@8Uv_uERY_t?źU GugL}y Ze~ˆ\=H5{CcX Q~έÆ|#Y>$nd[-SVsgGTw$Ek'L;H^bmoq`U6:zIB'o1"-;ˁ>'cF̜qE GNV- ښuIf E|#8-L̼b~J݆XG =Aܧ#ck LXEʠWagt8g%UjdD(Q }O.M-=ZFq< 'I0" p~u|j.@tA^6 Xۯ?%Tjx%UHmt_Dj+5:8^_k-"D/jW>%OȊuʕVtmiHR%9RF3IB _ygv/ż4~P t ;ܢPyʺjb͇vxm#ԞTHea7V$6>}Kݞ:$ĽVpĖXX sZO8eDA%mi% ;b׎VHбߊ pw֝T?gmC"c#LJ./0`gLf*2_sf}rI0DQt -dG"ulX$SıW:/?gѲjf}&VZ1.kymh̴u)SHL:Sƻ@!q;/+ˀa(hvρp٦B1F[R_*R9Yu/Q>@_*{ į3\<f.,SUٳq\͞^f>x ,: %BrX©p5|&bJW_BVìuyp̯"f{ƪn[騌*I{{!t5i=(VfC`JG8b}1j[!T|P&,rV(1&g ZQM Sɷ Xd^\;Z l{`6YUUFk‚uWpߓZg0@ٚlm# ϰp4Ӥ#5U{EL%Y#i4`/z:]kv5mcDHI_1˄S@nπv{ĆI#*5PCb`qژ_Qe &#cLgULϖ: G[lޮre {rNəf +8_lN{MX\[|S537PT:|ս0 }>i&Q`ddį'Bo~ S>iZlLpo.\IS. GMHByXm&V*&tIe2{p)iY>8YA;d%?KUzVee8T% 9ږڸU[؋q {Ѷ#A"[趓nN+/o>m)SA΅ Nݐ>O6 jZ}*,aR=|RZ״s!7+XB= {HUf_hn>=H`Xh"!MǢ3m@u1ZM?r.ĎRvlTA(&62y|h!X[#4 \6zEiG87?0J,ky?E8**.yy08ܟ it6)s6 Жݛ~6oru^h24FMXfMNUX{b94$q5n%fꌱf2"ሕFwa|SgHM?(>êժe4 Y&Gn˗ŎYœV tM[5XT(d_a9?`n s#sLoOO 4[vWozc߀k܃\Oމ7% fWY,kljUmxFzz'TJfQS6aM.MXɗTE 'yͬ V d#TѱW-گXU`C&X5O& O&)Ӽ:s#^8bV/n3h; Sr׎)>b1] ཭IG>'zz͎]+RBNa VI0-k% 436VayE|͝S|5t:_0 scBIY4 *K[,A%P%!", kbe@7iA5 c"6h?(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հ!`%b endstream endobj 563 0 obj << /Length1 1406 /Length2 6063 /Length3 0 /Length 7014 /Filter /FlateDecode >> stream xڍw4ֶhщ^G^CD`0 fGD Q щDI޼Z߷fg}kz=CETG  d0DA # ꅄ!2{A!(OBp@ %d%e@ @!>0@[@H0 B%P/=hCPPwtG{`AQ(-By Bܑ/'y~r HEЁCP$aȿG/ n0{(N;@twP] k W?ٿ ࿓!wwanP@WUK p_@·@`n;4!>A3i@!0_~AYFC($)ü \W8;8!t+]9AQ8POg,wP!88i@aPA P^ "`(: uF߿O a`XHM\YQ~@0 "Iqi e5A`@/bpQ ::Co%Hd?kwoU_O;CanuF@ P_zֆ:;%wr aHUAwkty7@~qabhٻ*HmAњgK=D%ğ0qq PR:@ ^TBrD!?{{y{'-w(jO05tl9VdX;Ĭ'V9u3ވC@dYxeGv\Z CgIi_QAI2-n^>#WUdZjяV䚹2)naƛ/>Y%{Y{3xԒ@"1ׯ}ٽ=i]Ut,OQ%ek4 18Oeɢ{]pGs|n7Ţ2OejLAޱ&u4cN5%֤dj5,*#z0z+2j8ͻ"ZIB}I_e5w'1bP9˚ ,]XlVp.RA13b\,!LQ7SUdzp--ki ! vwyz``/BPY8!fOa`4'cW1Ö/*+Kj׸~V_ZkG{!†~᜶h z;gMpςoU`$ro_ l|RRL1h<ɻWa0J>H~یzsˇ#%VoS޵T=, apO[d10#^6ĺhYwy!LFխ9*_~?z3Ì*KioIMP^g1&u(92#S6CD_D3STK#ݴrMjǝcHy<"-S+NJ[֥2% ;d: 4kG,s?ϗD3>ph  x"F uanv%trKީ]I6̙>x[N n|GMWr e|=TqNu;ӑՖvǶڋPJ.5\&6SВeS3 ~bXcbXls e6y'{Ѧ]6ME21f,8s{W ?ˣN K8갚ۯ!:j6$(&:}&P\ǻey?$ø!,^'fDw֩)%@.١zJ)51K􆢊իeR^cjoӐ=3Z*|F=4DV1Ŧ2K3奫~ӋV.[hSHk Lu*b /Wd.鰔<|MOciݟx _RÇPN'%E2"r 6|5w\g`l$gAGLBf-~pOV3zQmU#t( hfN( `[T<_\P<,^30y)#=Z:{"OjTuҌ;Ԡ q پ93# [ `?,lq{#9`[ۣCqċ(ݴ[:UŲhM,$:c(n*7#QLzʫ?Q#)cGR_ co [x}b|].KkDiwx7P`wa="cƷNG8{kb ̕^X1Shw2~}A ۵t.'Fg}߂.ʓ6GRM܌bo/FK:*}#lfOk1ʽLҾX )r&Y0!Mjw}竲0W)d܊0ۉJu0!ܹ&WH՞D{~űz<@9eUH[7x%4z<(|I!o'SΩ~!O>6}"ެgEE74Xa@CeHR8E3">ߠ{yvp?+v84X_KYzC3lj&-u1jey_ 幷Dh03ؔJjF!ŧ_񴗚\a\6ſQ>f-f/ߝڱQrH}7jfqPH q*3vɔ%U[ O!`Y۪%Iʠ i+eqB(o+t>%KD\c4/z_)+#OQńo[hL}V>cROC]Wp,k5&ecxly}6Oΐ/u 3n>.m` )̩ }r V!l.}uv[z)33a'sx(>{8K,옖cFh)I]l3 :cBrN)[9+yo 2IGwnD %w1[kwiu>dQi/&xg:vzXgF&۞~ٷ41$l( \2^HcU}տr8'Qp~$+ɞ[s=*6C)ڦ?EaF`\=C0VcuR]WM<̹HMWۘ,K]7JE5ፎt U5q э}{ZC/릾nZ <6ݛhm.'*pHχZR3IXr^/ uS)'@uZJfcn[8Fpxul[qQ7J*:oceߨ[3n/KkMP&O-v ܖ\Y_4!6g:Hjq-u%7c?xeGe;V)#S҃Pkz?y&;s%!XOoV5`gSTV"DavqP\;W".}%zNJuJC!Har>fZ!LM Φdf8WBD 1ڋ wXn|L KHʷm7a iHfĦ a70gA2%"tvLUle2<擘USZϐ_9 E0(t2OVZ7aaUkw0Ât'l,pV>˷F?R+bFgg~,^_HD*kY$_.u~c0Zb G+5*ŧőIXҧ _@|+DƟ%@>I I)vݟl½z:FzAn0q>d@`B~n7|fX}?֠]Enyx3drp/j$JNe ;K9%qIT?W]Ӱۉiɓ)U(SvyZBs:@IB1 ֥/nm,k~%뒂nI'iMFkk z_L;wjW ً2˥HVʿONϼXإ읪Zvr4'*|ҨD]xx1屹M 7IAdHaJzBtVȜSmM"9[4wyxG fj+I:wu[ A7O+K۟~辭]iL?KcWTpZ(35WKHL)9 uM)91Ȱ%"oHHڒtڱ-;:CIv x`Aї$%9{p/WiigsicE$NpIvK9αflug Ba"kfYs2ܩ$5vjJ]Zq4G[Ձx۬{ۡ[ &o%Ϗ;cAwCZ+O u' q`2#xP嫾L6Mtz? '(a;aM[13 RT--1<,SfF=bM[kGzO_{y,CJh]|G]1p5תDwh*8;뽩K.w4I/ޕQ2Ġ7z~:n~9J4&FkDy 2C{[!j^91 T2"K^!#{3pQ]tT<(Ux3ypǝ!YꞒTM(WM[?+Z]#vbz$xQ1Bc{ÿwd*5rhryÕejκ󇩠1i%8:ͬu7Wy.g'˄!3Ϛ䕽JV5bَ0@/{օ?Ӏژj On4ƥ!I`F):!qk 0Ԧ4@by>Wj_!!pI٩ͮlT_"27 ̦t*E_ b^\ff9iye'Woa?o=lo(ɬ$Z$UX5J˘dB( ΣU4..&,(88L5/ǙWnuK&U*:IǺoAMeD&W.Ӡ[ ҩS%`URrW;n7^xsjsD".~!sy^>!G\寸5qSНdJŽKRV.>#UꚴN.jnKtdմ94^!}De c&pgt;d{^eL.#Kx58'9hl>3-ИY ǎI~Tx` `uvz4X*Z=%/yyy-[<*zJy8_2j6UsHC#l<y.*Sq'6nnr lc*'S {&O|#Ɲ *v^윖tv瓛4c\x )t7,g 4+ҥ(l܅dISz jdn]GIbOJ݁;lrɎo,Kk,G?XMwe~#mcydx|qqOcK~)@χ ?40#T(4]~A8xNw #_eؤ }\Hl3`w[!=6 $owN_Xsܛmĺ6=\dccBiMvtw&={> {0ZESnTRSe ?cpřQ3!XATxBC Fw/.}wN_6;5ݾGok"|yGo3.n~6ώY@e }A%@*0]8^CuG3 gCa9F̷t/o>T3-l/i7.U2K!;GY>[z<E&h~}i" Nb; MwpP=z21>,ߣo4zݩƅMFQ!D~ڎLtvQS>KGz]zÞ*LHI~?8he&ee`5(xd.e(^-sJ|anݻhCs|w:gW׃])<ʲКw*W%aȎ[ !9T{Q'N?'d V({GvVBm$g"s|rm3gf^6pϤX 8 endstream endobj 565 0 obj << /Length1 1385 /Length2 5960 /Length3 0 /Length 6895 /Filter /FlateDecode >> stream xڍVTn]RESBuweX:ABTBR@B%Ii)鐺k|w{7=˩o$C߇Q(HP12@ QHAIyMn4J] ֦`q:hp %XFA ٿhW9@⁀:m4 FʫvvEcezXVVFW8wE@!(@;a+B!H E1J! o8ˉyzzBDѮv7O0]=0'a@L0Gm1W85 P8 ᎂ]lqHSs~? BN7e"p@OM[ (O C< $>@M` uE8cDȟ~vYSF;9Q7ҟSA¡ض{# sE`?IܝLPwD@ 58w^P{鍽῜f,_g3`%G±?n8quwǿO`0C@1}EOvn+ aw ~~~® Bz5_153UuS㫿SRB{"ei47/ğˁɨE9`?k!G2+袱 Y ) W?_RsG"~@z`W+BKYC;WCe75@_SG"Pp}@ }ag%UQP4ĥ+ě;zI c {Zm@L`C,=Js1ß&bkؚCI?C^6U(z,5E%wDJaƟk?RrQ1O m{m Nv+m=i}? άwOrlf|HZwͭwX]k*Nw4]6-=ӔA<Iw1SH+Ӝu+;FIEpƺ[xy˸nGWIuL95 , NrfIv5_MYEV v͔a+k,2>f[Ъx BiUwu~sʏ|cl;2ḻ!'G2%#t뗗&vO0k $Kܫǟ|ypw$%HT_fVTnnքd6G*狙<7)Fր w{4  ̈Nk*s[Ui 0 i4PvzjeeZzrn>{ag#{F  Ϋ*gCTq:ZѪ*ۖ4Vu ~#•엸Yto^to^)8l@6(r`pv hm*D?2lcFamNX fsҿ@Bl BO}Ĭc~VgXq*ĬD6Bۀ s#Ũ`K`*}G}wutd)_$S& c()JgٵQ^v v5?Y{8;ɪ49@lzKq*M*8d4Mp=_DMb4rUq—7x݊tfdk׏H 'BJW]MqMX'%ȅNc|WfJhc-rK|/ 9;}$9 7|2mYREnm n1T|'E w}u>$AnQ[yG|\\a<ܒ$JNPW ocn kdd.8f$Gy.Agd bf HNh:f`J}aY/jN֩|Zv79.{Ak;X9"BȑEwڛ>2u͑ʱ8yL`ߎʟ5jsgȶhD8s:O=W!|YeҺICz6¬A9nr|MΣCc Qu-d۞#RWX8n}McHaVO+w5\T{7vimTABҭN+85ΣAt<O1z.\% ΟnnJJJ/o-k4u6L`TZV/~D BÃ2YCZ C˞!^GF^=^ (s)Ʒf$[j '? yq>7b1{^ Of;&Bp Gp St^=`1)Y<^^E>D{2f_ae=DK8GG/x's:YIPUԜjPUwɾN>b8 =;3q?kV͓b,{_w?lݯ~Z!BLCJz@(e`grOG9 ē.un 6o?lʓR¤Z#y_F@uT$7/v)$ю<]m": kF%d!t}w2رR]OJ2zhI&OjDepss'gΉۍ̦D'M{rY:K)aĒsdIx$>] ˣG \1jB+">BuJ&;nLhWR?j".NID5#$Y-))Hf٢_a^68H|>TH,* \ nՁ.) ˢ=\m w-zp,׏2oG1>IE,w }Vg zTiZ1}ZkVejauUףQƗ5'<ß=^'NX=a3•_t}Xc|II~:Swjj  a\THGPRS굱qzRRl>yɂbYR/` 9쇁E8fӔGY6(Q@*A[n,e1>vum:N"*zq)5h*c `cqzp| abYHf/(6JRge\}Gꓓ-_|1曉U0U-ӲJ ,5O 卞fhӪnV}m"f *ԭ\\r@##.w@/G;EK6~4zB-YE熱ޘa/؅dZ L'oMyQt+b^r>E5_(?nbLkլ ~瘩-H_wcO>-o \6iΤioMmiF'i_=5=wt=눨ѽtooK 4s˵-si<0a lǶfoC#)=V@ kػڶ3NzQ"wn.Hp x%865NT0I');Bp_g2Hd7gYuyhhU> IDS}_̈́㳅rof&$v;訝5-S]zq:^%an(]M\ SAVƛ;Ď|-xk*Xj ^Ѐ֦vLvn;=7B7^/l}d6h|,u>OE dM-̠vSY'}*=L<NޝGuO~}y1gajJ= b@_:ǞX~8Y$ayF_ endstream endobj 567 0 obj << /Length1 1407 /Length2 5961 /Length3 0 /Length 6901 /Filter /FlateDecode >> stream xڍTuXԕ^ڥiee%AEQFRRRE[ǹ}{f{f!=Bbx| 0 @66#8`3(`0ʦ\AQHE$ P BK p{6PQ>h_@N(,..;(Cá$Pq\UB@C+*qqCex^pC{쁿hu .؀FNp?\( ^p( ~䁴WZ@]W3W"8w0 EB>p#uU0 i A!8bw}yPE^'Cw(qs#~H{E q ^uއ?Dp/*HL]Oԕ  @ 1yC1qvxc]Q@+*0ux€`0`p$Wf-@ý%A~Y]= {: ښۭbyE@^a w۪yȨt@qտxʇ :9%HzbiW N*o_>b6smԕV 5!n}ȕV䑎[ wW{$#H@Rj^]+q2Ba ubWryp ? ^:Ѐ_S2F_jutL5U^R۩x o`:Gl 24_LvUu܎~.b:eVYsd{6~y){2NZg$݉ErSޱӐԏ}"ꅊFXNSKՋL & 0op,Ć,F[F褳hJ5*zg;[4<cȕ%W䓜K&~ɘ`] ^fSePz])LqWuiaUheJ(9S*=h+qaDkxN-bԿʝ < 9" 3Ӎs,[G-~V!MFJw 4 +,ƏFdͭ}0SƔ=epz4O~UWfmm!KG>alG!BPC;g 9G76ăg:~'O^#ᒌwU[ߦ?r.|zT9tM֔?JZ<.$Eeȋ3dʳ\BeVrMM#4Ajֺ-5Gy^sK5<顊>+"pӏ8p&*N0mvӛ=vT -=w b7;CoGR?b&+_EzN T79JEtx0M,{:O@X EB ~U/[T,η1βo¹Ꮾoї^ks7M;{VJ6ni둣xZ&` AMiTr7qkm%}$̼)pAX \/%+c#2(!JlZy2 J%ylwlaP$D"ƑaU/ѯ2qkZC,V:脍L!!w=mO͊G`2T n謔' b:Ĥq !zJj$iEZ&T x~ /C>5?UR3G6Oo}kxSb5O^x!\ I\͉;sWI4oľ ("8(BGN86 VoQi*CHަãZn ןv$>mP؝xy=zM*]7v9/.}%5bK!u@`pADC 9bPع s{?.qdi{FX Ho* iCË(]y~n:kXgvL:Z_d *nFtΐK/;QR R:N v!6 ~1WY0fP"3eZ{ J iX JqFtӔ12dx"!o>ݶԴsY8I3ݰ*nlw}r7dҁc 4>~؉|^ 84? 2̘4OonVoX :>L)`Į_{;yѹ.F#6r LJ^N62b{$5/:ƞi]TP! Ԩ|sL2DNnWd 3LKۮtϚNL{Xk1cs;1=$~ʵ DF}+Us."Fn^jqӰ㾏#&(桎4qlڒzlͥNlY,3sCAEF]6w#h]<QG$WM6gE1 Ӹ `˛|T=d"v\rܺ_!3zalKd^R z'{Ӓ]m;} ?C5FK^bSsz:{(dTG&s?Id-_)/e/PF=vB$J(Wrﮦ%i]8£}2 3RgIߝc(xKH~KF]M\̝$ Wt54H_EүW%'8#R|3O/|IlLøL?P6ݶua1z\j`}%7"iknx"~2t}3Q!Ҩu]5#/Jd_plt ޷ Ԟ2Jߤẗ!KN"DĊrXYޛi:jXsXٷhwSks6pt/ݷĥc_ Sd|>3<?nm̃픢ܵBِD5֪a|e <tM[3xp"x3igFdXPMګb;šuՀu-Ӎ'6į (CX͇U10 '״;༲~HBƱDr" ի~RF 0\Qr_ӥze{=SvjX&i ),qY )|Q':Uk4݃+2gh;/,[Ef$+0gno~Xh8JȮW鳌x@/\: @-KHn<,?)7]:?>iO'5e5 %O o.a4gsmimjjčQ #G4wcKǞal(7g- ZqelWa'I)\RKm:t/3Ma4FߵKUb+(y-華xR: 3."Lr;7څNY }IK5Πh;Ojf| NYE}ӆd;lG2<>=-P֌@i$J Ʌ@ĉDu'||i[ES:7򬭙8?] E.w|)ǕT}Ml,WV꣢ɡlѼ.|܊=1˵E5UypbVƒ뚣j ۺ,3'[ ; bȩ4dsz(NMnCb_UM4e#{|tc?g6?v>٤NbLi3} &OA]5Lz%&rKfN,pOHUힺ2Kr_Be&Aw߹1?ez)m8˾"wCQKmfCW˚nfٵo^RQvw*\owCr\15 2RB*8 nK1wͳ|}cܾppޏ mL媁(h@rFy~ŌN'*]-A>Sdk"pڼ1p3^+UAj6]`jR!Xs&fȪJtǐs#>8𱣜uSOoG!)‡jO'4l 7Hnñ+~!A"qs&4|'"-t㳬Z-@Bb Sn\a|Ak+vUJWGYnfV7&V]|>;0I} /Lmשu5TxkJxRY?'xjdRx݃VB9хj1Zd[DxHZ suՁR5Lhnݤ>RRc?޾ .rUJ W'3*lΗQҵD9s8歼N:eP[1'NgkZY%&g]gL7[o?7Ӻ_ԥM-n#Tk{|D6W5.]%W3]_ZXe=bR+"K⌣nڃc5*:F4]ɕɳY3~3lIx֌L-T{e_U{cmzΜj]٥e%><.^>|i{ZfT컆k;ryr /|ݍKyZd3^D<_&2< ZᠳnmwƟJi⤒z3GrK.s~I ͡󼺪AK3`K-ígznël\eɂJu931 Mz5oٵWDDmx.K@fWpR֩diKB>x/ $]MbZ+q Gg[ɼm&qNjڴΟњ+F*Pny(;gb6 iD˷Lnql<:ѰN"!vjlJp{NsĀQvWI"Á涧N짞75*+I#,|ucg|~lz4d]*C>tm`lUlSpfFݏ_O5ʇLԟ]> stream xڍwTTm6!!=HP 9030 %HHIJ"-)!! %!SZ߷f3{׽uf;OiSA"| I6.@ vPp$B? ()A6p K I@@!H/ % Txm@ $`WDhLnP.p B@m悩8H(W Ni4UR@ˋΏDrh@\`q xH;b p( ᎉ@P@Ly X] C t3W"8w0 EB>p= hѼ@C'Aw( vw;")+ 朕H?%8 _uB /[_Dl=\p7ҟ @ qL :*a eưuE0D`p; (: mP4fGɎ1XcF>a&P3dH?]P6V4^7ЗOB '$  Āb@'۪ȨC%`9x9J :HLÀHH\B_Yw T<8D? Of=h#12A7ap!#1'(P?f^` 80=;ף#>o UF@D($zA >`V@_AZma޿G(@1!@ AWq!/_i(F{ۏa0o0>J:֝{-J $@)X'33&4T[U,uNfF.}b.9cVYg>J=f`!5IV`,@a1F6ڷI8ZQi\Sk j;{Aɕi,mfp\ LCgmy2c/]aڥuPQjk'^|0SfΨ+֔g`QUU6G85xOG's9(ܜ!scʻ:HE_+ ӟF4)27f5}ٌ4:ip#ilɖWcԟ..P E}Ǜ}i͟,BP9(ishv.ޱdz6ypnpҕ'M 5!9u,'LOQ "@ó;#/ϴ[zO옊40~kQ#*ES3 O nzڿO\#9%!≀i(9C,e,xg%ϭhIt d z< ,{:qI־[sT~u"Ă'ZFpf9)m0?m[^ \l9a]#%fǓT7vr+mjnۧHg]F>4xCEΦUÂ8ѹz}ڦ#kA~ͩa5 oqPeXq:)E}@ޗObqqRGAknyDby%(cjz'xw`r1G#rZ$ݺa, 2w/{r>oҎ=%^?t kZ;`x .x]-Nsf;S۳Y׃&r_, pxg6i;'UekZO)4|HW H@V:ZZ4y)Ѳd`9_S8`Y[Hub&Eaks%B)!r=ۨ hҞxSW] .V@0U 3i&nnc!wZmydyLs :?f̭<&*o Nlgʹxkl{BT*phxOL/{$ǰD&xE "K[6>Gf0'cC/?pgNт,gQ?:I*_hU+l\Ί?Ӂ$u5p^`/`~Zd^(<~KfRpqO۸|vR>جtI"{ۋ*s;VbO`@Ogɐ\oe=9NL":υ7Vm(J\,},4nkv{_| $Yh>QbH'dpGn9kOX&>YpOT /i92f-9= S.<D{_ei8Tг'#U'c$:g5AdlT_o_yj%Pl#"R,eBmda.D `|Q$/*q&:mx(k%/<1AwxC'&uQ-Rw_+ *U8 zN }?Z,a&ANhq}O.az =%rG#Ob#-߭ RO}݆CYZ-qVmJ!kA3aC}斦xߞ\T>?Xx`9iM>W|uRpT wu*ۢ`"xB77L5I +R'Ia!s,TFx^KѽpB^un3i&+L#SnH Qij8ihrl~QwpŮ+vOQӖ.Ɵf dǐvsH{%IA9 zgn֩tkEisNq; ө~mM8qgZq X`O&I5%|)yjy+ gO.y؞D9<']+Yxk[׏^Iv\ Vht٭.NXT Cׁe ݊s}6m7^@L}kЀ;ro&Y|yBjȻoVm7>SCfU;o4ZZRT 8 0ˡ/wݸw X!an`ȕ/S7ɨ _*B^Gg8H`^f%wHvJm1V"K<SX*o=e pICk(q;FKO)|3~wۋayy8s͎>3eK׃G<@n=9^5I"yȿ3:ޫ=p[m2[H4قdf6S Fy,ɛ7ePܥ?7,FA=5T#4\nwNɄ~y~.UՏMsP9>@b)lSC=Yh%X CzPЃ3f\H+e(@1\Z,&jj̢t'MrBH~]n,MOvժaARnIęgRf&B27f/]ͦ8 y.[LNO;=dHMirodpTܡU,tC'&t o?˱-a&2dJ>py:.VWA.:u"4^NfCFϣ> X748/}uk9Pޯ}UH2䒅12UE~Q .ʹ^ 7d bv~+;i;vWu(sq@Nb 9]^4c endstream endobj 571 0 obj << /Length1 1613 /Length2 7374 /Length3 0 /Length 8435 /Filter /FlateDecode >> stream xڍTk64Ht H !] 1twK#%Ҡt#HK %%!7z<}k}b-xk_{uk?3 f]}n9;-XCp Z&|@(23@P8.Cl@b6$Q {B|>aq>q Mm v-:eVC}~|bb"\r.`wвA8];l}8F#*cwwfxC`K2@G.3W@nq<)0;;;@_M Es9>Ul]\m`t5y>. Gx@6H6Hy!F_e׬Sa_SA{\g%ӕq) !``@(&,,> G_H pW=R8bF@{[Hlw ' 0[+.G?Ayy_ -&  DD 7ksxq۟a{m8`owUO Em\ P? =Ђ#''Z ltߨ9#r0ϹyeN9奿 u_d?1聜d~J0 lm|q@|Y8G SH{;6??p`{7</kLDP8_.,E*y"=7] 0OА'qEL|H{! x= Ȧy#Oȫ{A pDӛZ9joQ̕ծd! GM)7ykW#t+&g9.|.g P司 ~uEŮZ=zcTl(='bȤF$wƛ00"M̉>p74P3ASgI$MSo@a:WHf,qbYFY.hOltVɳ.4+߻|Lck%5֑n{caJ6x\4Aj/Z2DCA&)}K"[2RѺLU! iKޖ7 =].5 ")2/OzzuxX`,Wc M ^zt)MVķN֌-ƟG$*⃌%Ъ$6f6-N]HnZn7j^U+G aGNj1 V?}o3? Aqo݀h,1ŷTq=:LVGë>@+ SXk#W]wečZ1L3Dp$$iCґ Wp \>r)ʇCpOi(g&M^gÃ5Q;Sη^j<3pi(-ˆAe?ۧЀ8c^Y?jQARQ34A~›7W[goO$?|e{TPF2}Eٙ^r9-Dx D՚D=â-Bp#xO^mRez%F"˪~4eO>z1_KI0-kŕ?H6G,%vkZYCRj6J ?lVo1V1Aw0jRQmҸYa<]&N^jxTe]֧/G>{p 050:iɜɬrFx̑K}\W!L-N<Ȉ5جoPFG4WEN1DDL}~?z’XqTr?;{M>cdw6gB=‰Zײ :Ѵ:k8{1ׂ:RU%(g]R2Wgԏ"nhf .~6oO,瘚Y6O-EI,oy,s 6߅V,Lԯv3J$mg\{Z g K*}6X~T79yQAb9390$[0O!wSs }Zo2_]rr(:]LYm16mScq-3Ål(e9 xZa>P/DgsyL}.|V4s{`kNϗ)Yj: ͉r/oBqE\[?FoQđǺL_[:?u>Uz4]bZݷMڄi`B7u9Hd5ջ"MӅDI8ju\j6ӓ|3,|ιO ߌ{$VZne뱀0oYO&+Cńv2IIM#]8k?i4Wܖqԇxmqfܒ*w}%%ap~BRoUDsE/AtҕAO?Y@K؛}uNKDVD-*4xil1~?*ȷh+#OIH تeh5R^  Ӱ~oٽj_JџRp$X PMїQuHǻTߴ7gxn@*Piߵ)Tgˉjt5vLUַhWݘMAǘVmn,G 0"Ծ y1R]< ˜8w m3t?xw%:]"mwkh2*[aʔ{b~1 Am)YQepZgb 3jp}s6.KN[7rzhM0iq'I &%ABHhУgvߋO3-*nєq&b8^P1>rk_&kx9|Nt$!㙍y>ֻWit!f ߂7R z` מtXXB(sT-gyLۍD`9jumIvs.kڣ&ؤ:Ipq'Rj58vC5zQ?5-|]dǁ߯1H'N9Bwxc)1+=|aπ\G?"' vtC/rgztt0=rľ= Ltp z+T/D0&{6zYl(gWzuXxH s& yޘuq=>P7֭eYM t1)%;I[{cX \(8Lw >&W^`!J`#V]tqk]{8'\§4/܋R>XwH~stW@Q;X:vCzs9xhv:.'%L[{{#<[ޘb.,Z:eY\~)m%}Xv JFqHAuGg I[U3J+fE DL?H=6'k'+b'$؝Aa T)ɗP{1IY@;AWaXS0lseG~ygEC\^73Vnc}ۀKSʦ6JG GGxn~<'W /u5Ƣ8:L"$2*sl5uf3l&j Pg3[_&U^X5QKk\kWo|li2CIIc±1ևRaј *A f-jV1! Gd~S8[8ә סJ|7`a-i;ٜ=E6{vk|z⟧5, 3XulC Cb/H, 5 yT2c$U5 fohS&nߤ 5ąh!}j8Cmк,;ruP֦Ҍ{C4{ᅺi,"!깧d"D';N%^Α3znvTeFaCZ&)璆tqxjRj/~\bugHQHE=g5qIskZzC׳[Ұ U 1 }`J~PYrc^4.~a 9,|}}}?b̢_HO_<6"ȂkK:=}Ďʋ25 $Jr͐N b.+ܷiqtJ[%T 搿/P kGcj^Q ؽ+ZĥbY #}WUɗ;8;UxE\Q7Nn.h':7Moex^] zml1VZ>q 33@4qTTuVTUX y`pȌtZ3αzy3m#`,TsjS|Ie y}Dz(.\˓OL$S6^ Ko,yko>V2]nDxYM*4b'F-7'8݊$\nAs<*3 #{q8:?Y?.sMoY)W&WԸQ@}jiX#k+IӢ2,o/]-˹,AJiңQMx^W̗5fYL00j3C*ĕ*߸#ό^ 7vi/m9DYCk| { Q VԠ|m ma_j=kcΒPNgpM'kM#m3OaBUrzfX5[ )5[_Z WbB ?HWVv![0ۮSƮ9J(WƬ VσROWD򾎗3)guZkuf=.m yM׏}-0qӞ8W ͵=:hR1Wx;^,) fy!E_|}LϾxry7K *tn֣ a]kY֗-7TGNdJ*?,/J吵 f ?s퇅q[dJX\`#)b)-r8 CPuРїb)*!izO^ܜMr]ZN@U&,+K$IvDPd7_? (e\^ŷiUiG%@/ݨF}b)Y~Uc7ݻTѩ`j2d=۶jaטvd&1,};W͢kMrrKOxbI^ZI)lZH/ѽKkSp8ҩya˳R?G}Awv:;\NʞKDw 4鲍J~[Lvlmo90b.4<6۪i!wZvZ |)Dd,&!P`Ym NK CJ,OY<pBqjePOV<~nӅU:8&ެ7~Fhݸo!|sC>kIYFtw&&땡<5~%֗=v,c'4~ ~N_Q65䏪g[ fs3M I-@ܫ0 cUkaӤ{| 9 kwy7B*7 v#q}Ozz%HH%P|1K6A}|-bA>O %f'U֝oo#>6y"l!I8W !CmRR-s"M' /> 2'|(ßmz^], jA%godGe}Q#HU|E#hX Y8QLN z&9<D0K%l"O3(UJN+ϮUtVҗ8x?AxG| 1Ӡx~y[h A a5}@P{(zqixX IkYUlCnp7 A..)TjPN %b(f-@`)3\(k#:}Am͓qEWw 7¤[& a2.g!;]^4d~BB` rXĂٚiC0ɺ'IKL`{MN66t(/ƋcIJt4ޟl S?bFi8.XTLA /qǟHfM.`+>`ã(zwM$]rt nΓ6zrGO#sIg_hTCQT$Nyhr{܍Nj<>ll=CEg= :g<c5mf3x/c_Vꛁ~u5;6R5mwb8{&| 9㘍Z>Nm7_sJ<*syNs*͋QZh yVuP$> Ob1Q>6׼0ưMiC( ^ PWlx>#<}Gr=Ws^CTazq <1"7wxE ^IhM=): 0 bG'VIBa7 O,YvEyz! /^M~}>lKLen^rn'zͰ7.iSRR` >Q1NJ'k*{_"E֋嵏2~@9D7wgI44"O!t])&DZƫoNΔZ(j>^d14blod<.Շ ^ endstream endobj 573 0 obj << /Length1 1411 /Length2 5998 /Length3 0 /Length 6961 /Filter /FlateDecode >> stream xڍuP[-A@%Bґ.А%$ޫHQR Ht)"IQ{g$^Okp )v;hNH[J`1, 2A\.3DdW*15(F=\"b@IY)Y0( ՠH8PFX*tpEdd]$ AqWDh!8wd@PW,qPz!q@#DB]\@G$nyA1 pA(,G`@c-]'YO D_P E Q@{ G (D zB.P;|Cw PnA_0A h'@#??,a<~;@DGp@;;FY/Bx>y F~ Zia '$ HHED%RR2M7jE9?Ph_2|OkG` 0 %m%7o莇0"]|JKo#XYGzwT C倗8,Gb p$GH_~ 0@c8*0bxo,~xS{: r$@}`D*o0Kx@{4Z@aW$ K0HyB5 [m{LOarN/ÛY'%&ɲ+Z=Qrƨ}xtȑ ͣAo붜4'8Em6-8aH*=fzMb#v슕w+[ rnw8K6/wT 4H9a2P)gnv7+]l'_Rq„yq{zT)(>4x795+;8Je_JȎq]OJYEhd0̧fiL/nu`"#o]:,JW>+~aHþq'}`9X?@al.],vPT֖ܽ" N'72nU˗*qpcQ@T oSW`|+o_', h<{O'B2n`j ve(^Ҝ8/vG $X7tŒ:&v)Ko {tWs=֚5ȯEw}ălu"}"w6YjlQPF<"<0-;Yw5vY*gf{;%^;6znS+1@{JV056O@v)Mm(L ڗ\%f#X _m~p%[l0H\(.%@j(RrD"Lo84x6M"FU,O!נ.R>`Κo!rc>j~4@G˒PA8`:u;f27MEN}CN1V38&7|=dϬ2T;XT?[%ANZh'i$~@ʃGYKeRkP?8blPOr=bz aJ3 [i4XDZk%J&I/K vz n [@gqX;Y`Mc+z= b !Ju<1a$էX'&{lQ> 6*SyO9Zfk x^ O$lK|= Bd,91d?ؚJAamHOcPΕL3o7h%HPvP6hsIDP˔uu{w.~*w\r('fZww]E HC3s4C j}vEqZe bn൏U,ѭͫ #qsZݏUugh6sℰ~3{hB]y$y3ڞ'ψ#u1N#%O\kY&a4esZ=\~7h[3,0},-eӚdR#[tXIL0O[`5 NByIYxWJ!YhȍӥBf*tk܈AxjvE+nV;Ac*}sy 4HYcw1q|dAkekmė/mG=G^,=n&~sځd)H'4S}3;j ^Fg!=VQ7t_; 3|GO%Krj/vh < <²SvI $Km㽸jM⥴"4Mnhٺ~@dˬ𵰁o62~1%6Hڗ<IUx}*A,\Ni0.zmfB+RO@oRn| 9Pw^ފ2$N 1"G3꺓u'O^7[*i[|F"osſjkߺ;7f񌘉 }sC f_ eI~ϻH ip[ԥFM</n=af鮮MBR;zDEAk7t9Dct2)gZt!TthvtpqNU T=%jCTJϔ3aR&b0M ﭸ <86w81!Mr! Lu,o"6&c a~4gFEl{nB7H>J[6IyKXgTZԧq.Lj^{5  o.:<Ǜ\auxEWf5 &N¹s*Ko+d- 桽έhmtn~VQƒ>t IMQl%(-b6$7ڢVTk-r` K;M3b ֬[8eί%ާ['US^Kd;M*PҀ{z=ʷݣK,rtLN?]eDY8˸Py[9/\#! #cn-Y]XfN~[Qba଴&A=dn8b:f<Ґ"OŷS7=@46a{RYdC~(@l Of.abl.Msͨ/_o>KݿytDml II0QKTpmYuϭ6}j̪?B^e|M+UL[Zth,8P;r(!H~$A|.jqBfʒ!tR: ͊:YͩOqˌC`?y+rUw{bmy˒\xLo-Y#yH Ѽtӿlx8cH| ]N9AU˛{bm9]/a.WiR1bQ0f0BW5= /یt>tM 5^b4p99-Edm3K;/Ǔ-H'jށ$)}9HN3lMM  $4cUS]n L~&kQ?O 6G3MT'>u6a@U(ԘE<޳NY۩lJF!~~[fz$o>Q>Eс%cR$bL=t2^qA"= 'z[yiTkL0oT>g):\~6]N;x7U.ls[S(b P[9{ZTu EekTd$/Ȗ~XmO+&.h>dm6n߾ J!6Zlܴ[WDJyU)̢W]iԾS,d^}FF eETIǣ#W_#Җ~r[,ּ9z8jj[5X6Y1>:PY 9Q mLvcµ&~N*Jc_-,ܑ*kN]~."?@A$o1eZCW'ӷuo=Ad+$T]'ߡhBЙ_Q!tOx^S0G2{-{q-hF4* 18jgICw.f:{Q\k\7yqM]kefJIdrBg|h*r >oM!>q!,<%׮*jQ~vEhCo=7WvwnK~pK .wjx0s5bbRy\FFh! egY '+m᛽WznX^"5*:qŝd?9zKw"J:&/6{ z~ qW9>EM; endstream endobj 575 0 obj << /Length1 2234 /Length2 18714 /Length3 0 /Length 20034 /Filter /FlateDecode >> stream xڌPJ #www w4hpn!Kp஗sy﫺ZYJRe5FQ3{ #+ @\A]OIrO trC hn0vywT|tXXXXl,,qwH Lv@gxJq{O'{|ИXyy:L .@65{SBX8133:3;Y2A.U3 hK2@oiLuK]܍w h xP(9,/pW ߛMMm =}vv!s_2\5@@Y,.N60d+Eֿ|2 s?xogc7 υ%xVV`n cyo?V_afv6bfQQMqI]K`eep8=۪l wu(kgnwͿdžX8YL?X?[_Q_V$jc:Ϳ֍mA6xgWP@+@wU}FD,_vh r1W/2s؀Πޝ],,g}L+{ >YWd;9{¿w;qYg w]޷5X./0!n0K!^,X ,̲"kC(Z{-J%Z{v?]gWC5{v?]N?^}rcbkg_l|?=s]û$?.Ow@x]?]?s˳?B?{~ux-wx$ ǻ0W|?{||3~|/o4uuz>*@)Ҽ)U]p}(;8e5֎$۾J{AԢٽ c&kmlku(>P& >肏l{r]]FvfgͪC"38 sYTUwg0ԍ'L1Q0<<YUb3Η"㿓G8AGGHrYGB_z&3;=O4iLGՄew&/e.wbdU-e7 77DzPouIF.ysRKcJ!-IM1}EJ4PwNɞI/bhTV^`2 r1umX-Nj PD^<jpMJF۩[jO{sYF {"rj!SKq-|].6ERJ'ufn"d|~;Mg^Z G߂ qkO@o6Zio!D y1 !")#\=~g‘պn(AduJ$_5TV`.+ع\ KFƍ|\ + Ryov{kK`̙L/gʷېgKOv>͒ɑ/?~-K˦R<8WOEbpN N+9X]?~S1 4'B׾B&Jʍշ' h9yʪoO.ؾD)mL}Q{՛EO@9j@t򺟢ee$%˙rD}XŲ"ŭvCnIX+Y G3*}sه)Y4hQZcbPיqבNp2+ WbGv)Qcxii3rρl#>=EP'MharbSMkմ=Cu@\@i"C4L(ݔV5 P%Znh;KoS$ MY 5jrsWY禐èOLD ~'ȞmUU}a`ksP9]唝G=/9x67aN`׭Y~UciN9]qt"x&ĈEF1F/Y y`Y{<@ X$'Y|57P.>|ZkFX#'_Z9[ xZ,nuNj}ݯ8<~;1_adPDW]-V^[Iˊi= 0`X(h] <b>LYQ0?$`7sAÞ<&o@FBZX*\Vѹ,Y"ץF~Ѵ(XKӱ`YWUI˕A'b¶p;R_P[W uaP$ rjlݲ҄MR0[9<Q`$}>"X듄ӡQj/’6h%GqE@A7Te uVzl6c)g\z ||c]}t=ʸx]ӯzyȩJ%eE3sJTA?|N{OC8 rwn!x9g u1&L$cVLGAơ!k2寇w1F80U櫴IuҡOa8LYWI {a) ng޲Ȥד:Ny{W;?1;x,@pYa<քL6{P|l|KW2iؔ6fjgm>?/llFgQ08z`sG$IhOcuiE SX9SHZK*HHl~g]Nô[27>5M{3>nQY>+t}>0p Eox>]WJ-G )O 5z8RR/6!vT52hڥWiyAQ) Eli=ĄO=?];A7/J2΁LVVk@9 4_^-%_v6Kӥ@Tl?M$Pn&e fg/8B/q g6\:5/Zz&l-2V/ml><'E~#uʛ POwѰbҋ2g®bPʇkp !tO^mn> {{ifA5i@;"e9UrgߴcC6'HMxԋTfxE!d,Lwyb8no՚xRPShǸ6+7f CТ2^f`_3m~ؖQ{g㔭 %&&rXlkh*FP0Q#Cc`+ 0J#/"7SQlNhS1uZd#uY|G 6vwopYȒם{re {+j+ f[5%+iJ!`ncM}3 XՉd}CD< ɥqMՀ[hԘ \Xzݙ=ƺOTb<6EM^d_4Z$re mszAyxC} 0#$D3 )^4_ qoDo[M.s#*UҧMo7O |U[ ^Qp1E-(Ph8."ʺAzP{iƜiЯ$R I&"H<d}Pi7Q $nʚWdwN$rٜ/J^8;;#vDՙ痚bgV~2#ޕ}=)j)8BZ' z <Qr=ODm,Id1SjiL|w%3釄}VN5[DM?* ^͖0;]4zhZ]A@Dm*08ZEH2d ܰ% Ih("mvi8raw"gm)8gxq,i֢6Pj^f?$*+' X(3CW75r9\^!lR@kA#yred+΄յOG:`̅+22Id!l}0C{cZB0f.,E69 ; bx60C~ٺ&qlGPj>4ی^5^ CYhO;*u/v Kmof.rëm<œ?UT乏0.'P;ezOE)O9\9LѺ%7kO{mfrbU"ybeQAl{/Bf"IE?^a#m/W泿3u+:=Qyc zF=dt "Y*3/s&?0a PHڷ^:]BI{QN,'DfH?)z C[P8ߋx5VBpd+8 y;3%K[ $Zl`ڃpJ5&NIEB~$q S,0Ӡ-Ÿ Z =gLd+B8׮>ֿ8H@F[ ᪧ8exT't\/&yʩ]grS4N3Bԑ.5~݅: ̏Ń!Y2%mo~qj-!k1+>j+_6C ۘh(,l-]^?t P$+?v AaL&}nq0m3W\3-Fʇ[miZT+j f?uj0.ĂdÆ_[~G$;rQ2/g1((*%"EPݞ>EWOS 2OZhYáDW\t/hG?Zb*"mg4C~oC+L3JxqѺafΕ=$ 6'qArY r0E+RE1Ew8[qǢݜ6JLM2]`-f@^z]gBwT l\!/i'*JބM`:2,w䚗 x_3tJwM'1)%b;(mX_0@i-;0FnL P QSQGդQa U~AP(*׭2kZcqBtC|IMGL""ɡb냑U\oQyvg ɩ.ҖU!ѸAqrb]OWQۉnac=*E) NHt\׵h|fZkSI`559([鰶X82풱#KrS4`S7y+,WLwo\вi&:80s$ISX-jDU6%٭UdÅR(U~#Q xdS%PtFfSXV%S(S>H\W糼T y[G>%iPW]aȵLQHb1Ul,Xp0FUPCQg mġ4ځ;ֿJU׸$sG.'iX(#,QO3|v{92(+Q!Pl*FsfBUR}ؼ*\5pSͤұ 8E5tjMR_-$ݺn?wh]8Q}zw>UV^PP)i"stq(%!}6~*{Q.eDOH@f5d\D:Sc]3n8RyR?EP^"a2H{Eg^0mį:g\]qنA/JWs-ZAK=ͧhD_3~? #ki7VG,&I:daJLq#zLu鮲Δ,'?Ɨi Xb;cLqܥZeRQae8Y3݆ҖW$&/P`>" 36Ak} "Э^>A9;z y]5)8:\/|k?GR7`%gt\YbXk)ypE70EOsIQg&_8 fH@ZOh ܯwsEb֒7 SNT VW0QJlbEwl9e\3o+)wN?{{RpR%"OiSriZI8bf\|"=2 3tB2B`cazݲ@Yknlhwl% 1ҟ=`VKl޶G!y̐:H.籫kͦ;7k?,j%7 Q3qScJ\,/6˞M@P5_cF$AUn6<0+ H8%1Vb5:(yMc->7I\7r.Ŧ1;z]Lp(Aӭ0f`Ogt'QDoaLrjdZ?S`JC&~K{$ Z7I*~~7_tӯg>q2 Cai[hJXR bDj[5qç"c^xƱ~Ҥayd3k >Ǒ7W&8E:C j;i&1H>3<ƎMO1h7AE{* T~ZX5B{ Br"b@?׮+k((&~Al ɩukgH2s+* kž~CujP5yY3cryZt;lЮURɻ3adɛ^H #w駥@ M\p[ŤpK =} .P3ŠShŝV&xFk=t:Ń0/ QYcypb۫?w = ~AlG䳀x"U^xo]v*{^VӒh;Hj4#Jvx~f9FN^ 8g[%z>:1P - ^&FJO+U22tݭɹj_*G#(HˠoJ&Ō|å]ruC,v@rhV+D!ٌ8]|dʇ_n< U.)P Txh4Kk5C[#m'uNEΤD^fB$8zgRylHhlUj&1&r8a< uj!ZJ1; ś7LN@vlw_w+3W]S8 _&'>F:=䤂3|OE > DlM_ u[n? I6K99՝H#PkYlmL}q>*3L&ݢ-VIA aAب\JrEeI> 5m}LfUEs1+zZ`>,aMLJ0Bo@}?w^mP"!:0 :PNm<]N2}4h*h7" fn-7-̣9VhK2FWkK-v6fHOwJ 8vј>-ALJ"E.pgpAX@&×gNZn2;>vr"U0-էs~r1T@N;aW4{Q.<HkDJhdԅbj: QS_|5F8RiP:}4_8Ue&5d{C[ǞT4iPVpk 5q oKeTLɢQ_S[f\e̝1a'dk3.[SHQAMNΓ:W+&aY8cAj* b>̶q~15tZǓ,}ϾO ϋ.+?#}d,RlpBɁM>clc~/U7jj5dN҇62y4Q}PӪ$ݻXnzPj)6 ¡A+# )d{=tF!#<񈖷7578[gYnKVїrI}5ϟI2H 2709,22-McѠj^2;3Z׺Sd#U!jOyf`@۴Q}xGBԮ ΥX α2#OH"^QUJ,[|Quc89CzNl&(ole#NċN' EE]<|$w:]:#mUt'Pfxhe.o=|_Tߏud $գ=B(gm]eSK;Dt$YB[S`'PM2ǵ 5ٸ_b,0ЩaA OױOE+b$lbtEXhǦfo|5^\ܼbሤ}_|Z2l`٠g{s~l浸=_6tT~ hk jgjeھNqc=vȓ*3Q+=*%c#kkFL!zfւ: q :oQpPJ+7`&'{RQœ]?-a2䛩5[3)xÝ^3G2 ;h=&39Z&T[U0&"OF(6(0glGFz% ]JxLR'z.!Ar}K1\1{7)ya9_R R{uBj1W)fJ=bbA tc "DQKCn2S>{@V&iuwȈ.ym X\;`"fWT2W + uX|G{&a|+ fde9s]gǺ,e^f<:Om 5iMo3smF729Ut=eqrUEF]QϒIό@d^gO ^`/ZA0#*AIV .~:WCyX ܂uE) T%II+ "'D9XONʜttiaW\Z+44gNwU7,qp0ͅÛ$4Q;e:|(O$"|i(Zb2"wbʹF7Musŝ;mŹj6yx `do()Uӏ^(c,䉂BKcC ŽR(p!‘w~H3EͰS84 ?\n* `)t9tp•?K- 1"bLOTGVҰu?2C~煠SfW}kE}HQ>8=ΌF4u]>+ݶ6ѱQ|H$^ޯj 1$0w~ctG^$B1T|J'u~+Wq|xɓ顙BB0mC>pp:c %GzO}/]}a!!טUFrSyb‘a%G(ګC+Y5Y)}*6g&<_qƺ͘7mԬ83;򶐇rFAG#vu5q[svN)Y{E M5fgV¤dQE6f>W,ñա ?ZQlv`'͘za?#zXg/Q68;BTIae< Jm*0"qACn9c==,}7i-v_OKܗtGozPHe~9CLp'!:S]hè.qmWxU΢g`x;I-CD!+_Şj_LG9 4~5*RVo4yZ!1Ug'y 1 YXW%ZO{~mŐ:kE+oBf*dqΐP`gTfL%mEL׾ paḢ^Yc⒔,B[87bBjIe 0u42LX.;+šޏ3h;|lzyEע 6h)ZIh"4?IAߒX<:羰H^kbѥi,'^y Sx [}%`fե3D # _ v2%QՉW0('>FsbҾ3ĐF!\\Z(Z#2B 7R&kE0dJs0=|,0͢og8G u(S&v>t+ءC{zrr0~,E6 n[}V %( O΀t0LpcIVWIy$(I@) L﫦c6l[7?#"A\պܓUR76_KyMS[٢0IO7۪w8+T*Z%ԭèߓ nEZ0?cZ×糇j1oťdM21kزa N0qTyڗ S1Sۋ\6osӗ`{+bT^: MkTc˂4{b.jFfۖc 80WҰHuy[/G#6%yYAy'yXFa3bL̺ݭ:j_UhOy3g4I9ؾt;#/⨶>ӘF2i}ħEt^!Ffb"32}SRWV_y q-X0nXGtJo΁=ծYY,I,~jm#E&8aIՀ ~״+]gpƙX3vMakBfχĎ̯눿);*wW`^ ov*c 1hn\J ;\kc; WxQZc Ssn 6bϢ2*a8 P/Sл ;:fF;]<Vq&OHr:^wӅjc;&.JRfF3S_& mrb_Ӿ9W~u&NyyU?֦) ^.3$ 7yhowGͣ YI 2q5?V:q[OHOn~ ʀ/h@f8yBCgV(d.[WfYcnFWoNvTP92lDW#9]F0:ȴshuvQ $ڍA?C{cq2d_$.o/J:ө_%8 ^tNO1ytūc~qj6yMP=/#q̵T̯+xsS*Ak`y/r}y&F[)~1 oD &!H1E]$.0HtLD/60Slcb?i+Ua g9:AoS𩭬E8 b9zӋ7vU V[֓o! U7'h.8^y~y X *nγTiG;O[ Bғg]pix\2j~ҺC^%,QmyݱGD5Ş =N<4𭥯K iך[KFF| X PEcԵ7zoaƸ 6.70ԧf|sy%;#x&k;FxducKQLMrJt8T7^7i?WUzX y|Uw~Ou|Dc\lo4 #d+௤uؙVVȘC?!"Ogط-uY\q(XH6v)=$!^Zj_!6giy=_BO a-E$-~h=~BUaSt% -mm6"T]`PW.^<=>u0if/%wvNlJ~чAvH(:8`ȇrqS?W_N:Lh޲zR4N@PN(ݗd]ӣ mƚ!c%"Mzҝ#o ǓTU沟HV;H^?0yWd痓߯WR*`Q9- ac0Z]dDauNqm7 {Xx~j=L13{IxIN!#ku&Mr9㠹r>&jH̜*FJG0hH3Ev蹽$([.ˬms l$\@&N|u9s J޾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 2662 /Length2 19101 /Length3 0 /Length 20627 /Filter /FlateDecode >> stream xڌPNK,wנ]>U[TFw6 Re5sGS #3/@LA]̊@AnfBj $7q*8:d,lN^.^ff+33 ]x&FB h,<<\]L &nV@{PD3;5\P[921yzz2ػ2:X <ݬ@WWE{?1"Pԭ]Psp4q@;k3+舻9P(9c,z?09v%Pgtr8ehb:oabmgb 2 @RD`\\\]ʑ/72K89\'n4ݛ:8z:YX;[;PF`fffc@/3+{;V%~!xn.@?XXfnSo 1?k/3hXhb&]i uuRW)*e`08ظ<oo?'`O 7 oEG4Կ_ _Fvvc74nPp5gW+fK i*i4Wv3{bw;k_ @+gf S\A[mFp0s4kX98&..&̠bvh@G.$?$q~#no`q1$#o `L2;I7q@\#E7qQq(F .*oF .ohx@u#ɿo;srvֿĠv]`ߞ@QLҚV4u117?+&_nh9%=h:s "pwv#D-~q_jGw?L,{-ztZ j bjoƜZzPC;ȗhmB;ۛuaZA .09& )PNՠN: 4I;*I>fU hnGX@?*s]AؿAAp3qoGAyy:qjT5?6trU79'Buj*//!,/:4|!d؛ʠa]vtDMp%:ҋ#A}+B{ޞl:ׁ438Ut"8@OȠ.d %K΍\y/8P:_)\1T:OoG@Gq:k#wD64Ww5agJյ_c|W0MoYĬ4`$~c]gz2v.}Idׇ0_Xete?{$lK*0h!1K<Ů@ɌO-Z/,j^#~pcTdޒDP$ j^7'CkKa-V4n`aQ~@28D$e^ b//]4T<+'[El ѫZ^!KLFȉ~97bۊmq¾es=Kޣ^õ1 CAZzsG`Y{ |d<7fLnm^&cVƤIc =GZh[pujұOא]0,|Ż8+rr jYMM3ޗ@϶eF>KRpb/ng%QNSzB[\ NX10:Ț“2J#_zB(uvg>X6:ڷ+Ir u8&|-ʏR8|c\Y4:LdA}?d 4͕1ώnmEX/_;N;,y*>ZeCgf@n*NU5BX ʰА ͱpRo)>=d8ثT>KҸz~Xu j(md%ڇJ ,ˎer㟂3`MԩsT0DrTrsTʊ QjlR(œB  8ڱT$q2trM*<Ǘk4&Jo?)aZΚzn#uUM4 r&5`=ّlvXTCkieӋ/S  R9twחgkq'(#uUS TK<2SGhu cSBj<^FS 9./Lmyv/#∽O7Kͷ8LLםӤ1ta'[R X>͛3AB0:walCb9ݏ5#7;ʁRy7Cd,@G<描qQf8RJ呫$b@ uіCx2K'Ԛx:l /'C6Z# U#X,iw`P_# wH1]q \M5rG,}R&5 P4n2VΉ_#i!kB4I7Pyܾ^p0C^9 .>-qnje:t~];3nJ6L!,%Ԓ}(MM<$r,sIa;h3.~Pm<"k÷Vzߝ& &֡ǐLuǢg1v7: 7y-DvMcG|oLE[G(^ij~<$߫/݇E,L%=B3qEmm}ay,,-*)( Γ$xEKDJ0pVEIO%Z?+_a˖4א3axVPٹУPgz_76˂{Ȫ}FQzRt_ }D? {6)z %Mbt<^čL1"X.1_b\;%|)tiI$*58:;iv쌷1B 5$b5\٨fA@u2 2(!]v)e~D2V~0N(K!+nql&Q4ҒIqۙ#/Z!}:Y69ɱ[7Xl8^ȿ{*mWDMce;jč]q,?h͟p?T6ilQzM}>LmO!Ic*;59omUj|H[0f^$ړ0Xy,B[mi{h8n6q(fR-CԺz>r` +GS$HPSN[aӏ^Mf..(20+mFpA,jj7`x{:4Eշ3xypλR U1 %ejm.l,M?K'1R"l&dH(rrP%hxEk4afXv?M:Y}Me; Uoy;Ȁ˻E4Q9WK9@~#m4 cţkNٗOORz[?ǬD敄Q;>T]ü{S&Z"Mxt/%We:[-8S A_>+?cz5rS%\b5v_Î i.8jc뉈_pqS%i>~|ɓj@ldӕfce V naڵ\aA3=>#gBRGr,鴛< BӰ&@iJ omf-s.Mv?9tj. N#`9]7nװۣm5 -w?G/SۥN ?v)lqgM1&Bx3Ly![w{Ӻ$\xdC|XDےN;Hc_lZ8,]0 Wܠ}l='l__QݴY}-[fA9~LY<NQt rclzVev.C<~$R_hVtI~Z5g^W\ XbZ2q 6<2V QĦ=JT#5$è^CYp;a٣MtvesU'MgTR<&mYn˦ KQ^xF r%L"U[syh*'XWX}ܰdȯS9`;R z#+0AmN$㧪8 5:^rQqۤRD'_꾴â+{yyH B)NogM)M+?SLaM0\O^0VޓrQˁqܞPk1Pxs\N&z4?moiOV [گZ->v ~tc嶁!s0|WvƉ,:"eQDˀYQW7ɘȭΚ-.1sKagYD(c{]^be2Xyw=sZ;3ܥxSLr,NwRHHÍ*77T2PB#64q'>!v)(礔NYwriz uyRʰ1K0Pn<>nϦΣNX2}k 9E qʧ $]Èlm:Pm@=䷤Ed@*;ό8+0E7t|Pwk}׉]@O3]/=Xbz3Q߁g6 cIaF(=!U& "T ]Ir;W3|mHP֞_ B y,D6yԡÍ?k ;c7X8lk6U 6,gDS?–$#֧n.|SРwJOLhTƼ$SM]Meؗܖ12Ro R%ٸB4fIk?>qm!rvف0!A8O4/Gx ȵ M0W}R0(3_;(l0HOm^#ےGL8Y%I}DTF%fa cx؜OaaGWm}wtщ6#јsy5|o\64,7hԤ5&FݚV)Ie%sD5&V!;=74oOPB^!C]Ag!E%}6,9eLŸ07.O.v쩅sL1sE,3dʈ Del4(%RK!s!_cña.x@BL)ߋ G`Cz0ijV@HI& [mW)`г~lrn&J Oo'EԨcy>zOǏP3M2v571szĐn>3|3V`fHѸVYqBdSxQQյcϚ{&جARteo7˟ >İdg jT2STv$ۆw )(J)'YCQg6AP$%t\}B>)$8P׹F"(s]Y=NY|ۜ¥kªZ)JXt:>wej]4Xɼ(Զ.A'g+El=A@5Un,+mqS/fA2O!_5'Dq43~'qp >o=o-6~NxwhR?,#ģ8tPlj}¾Ak=5T\`bǪNuhX2M:OxiV$j.9Uy~1@)=rKK\>'r _[Y{Ň\XQ# >v8R':yFtţC}A(["~39e*: c%.G3`!h4. n3=4+ߘ+)5~~J:Aa\:R|)]gR+ci⪖Kf~M:ܦ Qr(G-|8@W]t׌IǟM:64Zw-L6Ud*TTN}O |hY5Y' ;r!T753L5/'X3@OEAKB[c磉BdjYv ) 6Ã4 cfا )ܓ) =n3 %sA}Xts_'B i^rC  "BbL٧5Ͷb^vz5r)s7bKhڶ еEpvqkස{Ja OCyL߈+i\Q?_qk,-x=?̨p-L[*nu2ȸ x"cT|DP߭J޽ŏ]:П37AZ^Qڢ9z U Z̽p~Xm`:pUC6%!yo{#^8$GġcwG57 ;.Jc1H㬑qm4;mq|{VɶXA;sx{ h 9EB}jb5'Yq@v4!ٴZ1R5Wf a@6r~:YǣD?.OGR=KSJ (Gl94nQyLÎ70qgD5{dXe{L$dz3`=޳0QI*ump )uܩR>4nQ ݞsCK!FD$Y0Db>hhg4ɮ6']k!=HiR2#qR$Jv34 yQW++ҚGAw^w8Qqd=?SoiJ '>qJjŽ&(YJ[{ ?`o~ƣט/jE(V+Wwwh#Pp8YVɌ,W}%~q!G"V5ZC E?&¨/6CUӬg+ԖrN?ORBЍx!p'gtX܇HǸJb OPsZE_fikB`h_[2z%I1Bi]'.SlȄ‰aƾG6UxrA4yҢʍruϜHf.,|zGwumtbJg%SnW(-iCIԼTe6 {HRqj\Sp\y Sr0.&>;c뚖xu`QN"%n8:#(01PM>r *2gÕ?%P`^0nnv4$ts0ߎڍ_ۇPT"I|•7Q@ާ8HC=l~0 fB-= zXZڵ(=)tyB;7:mŝ" )G_$2wۡ4aƼ3 tyȂ.Zdo,NcX¸6&$;=*GoUj(U aF!kUwkEul$qTmfePBlBYtĄ.iO,joK ?0v/̋o疺~D2!!p~qDkHKC+#.ldUVM2`L9#Y!n4K|/@>tȥoϤO'L4_Hjy61kyA$Udf V-pF9$ue/P·j σ2"zQB|kTUis>;A3-؈U0\ڽl("*Ь?M{S@9߂nf~`,MvC#K@W9= ԕ!NN6}>)nHԔt} "P`*_0X0VEmn4,1ϑU>6쪾MFv9պ:a]ã@J&Ч!K RDiD#Weiާ( m?*掠~ A վw mj9-mgB.';f3֌e@|o)M(Eħ/s0Ά Z:+Gb<1ι%O=6-# IfM{Z}ܥ. ՖgwX^zsLL2 gBN)4*d!?߈{ǡ'Ib6 V,eyne1~o6m&WP6m0jdE;<`СCER>}5y؇v\E|A^WР }$mByjcoh0()񹨸y^#WҎ`}Z#Sjկ׸Hx BcWvUrN̍Qו0BJ<3\UDW:x6ڋ7[>~` N xB1/"sN6r?Aւ=!d}T}f<8v2/K8J 2 y|r7A/jم?D blullqpH+Cٵ) O!P ˓f6l+@ G!gC90̈́aX}xhjiʃf27&ع@ e;+$LݬStmlzz\-@r[ޥy:*\w ,RY_W_ < kZa-x*5EYN*8/oߠZ_۩3oئ w/Qlv|QBi:~G)Mw,RXd.B]k͘wDm흮V\y$`u]2֔u!~ί4 ZDC#$?F*uH8έDW56@<(QÝ]mEi&ܺ4ϸN&^~xds[9I=̱VyB9zM"IR3|)|W24(UW|v_wdWJqtQ',vVi)&\:fs3ڲ'4i~Po;YץML'am|Oj{AQ+$9EoUl/>W1S$9g85# F9/X Ril(~ECP쒔ͺX-Bo s!aprY=  jQd=0*H;$l#싏,K뉊[IOH0cNb{WYڄ\LQS4g#PhXKD9;sWnpb8Q-=s2&4")`fklHZ&n`6)1uLU2Vr*si_U ŧZ}ܘC|3"s"`=^&,CcW-rPŗ׆l9(YȓEòW .GEjL>SGtnz.O >N2ݤp4;\I3u4ԯ*»L))YւK~I/=8Xq9zm%iGj͕E .o ^s5^^wZڍcbKmc$bj" h>e=r%c5D,9tp_wY ]q8$*eVky{}2ڳ+lD>;O5H+(wGEontn 'ΝfQr=q\ksfO߉ 🁻ҾoKAmA1 )eɡc 8DTMȓ@Rt׀=qշ'$ȵ:"L`35;N-ߠ'?X)Mwv{ǭ ձgsREm ,BuIl˲{"\&TAqG<5sӢvٶ"pkuBȀD]|)Is3JiNIUI1>H?ұRB1új#^Jq]nra˦Rs U'.#WC+̐KP~f!AIxB>j@VsN$QLdvgxȚ 6Ň_\A%Ŝ3<@qkpνr$~a6LWw9u{þmۮTspfh#قQn fucp龒a-87y4Z nGY"i][u8ޙ܉ U\EO,߫[}nx.D6 azcՆK"!4EXsȨc`cLCSh&]x7h믃('IIMj4^uxG*8: *Dяi <݅ imc&'gV/=,MoZ|䲐wzvQq_r ?NOxm2*TѸeit8m`b~I=x~7aȯ F.e9؉( 3nQs@ߞ$j6{v^}!ap~Kzv| KƄH`$R6= ȸ49! aaMջ[| [oWe I}z YVVO"|$4pJ4[mH9 "{=<{>[x@_7]Κ+zԲ:$Xh5YwB;?sCdKvm` NKB5leSTRЬ[*,Q 0{ZcݫqY2غW1B_%8xi9,DN-l~m cGePD~ :@ϧc?XZ:éIo&ph~Fb>υy3^"كpA"?xD]c ц_~_w[S->)eN8hYPwz>Ѵ^l8'k%܁$vj0Chj]OBL~ceyur{iY#bf|; |l^IN?y3t9aFn;2{?\o!W,\=FyD|;Yej?󨽩O4O^*Sto9슡և ,W}5䠨 >YRr{cK˲zI3.7^EgⴻjTA);& 5yu2Jkj ;* :"*vR,ښŵ) +n>pEYɻj}ܳVq.h]V~]^7ܽ:n)(z#nl+ado~-H#1E[RHBߞ],~M<8Whd{VD}^Cez1:% (fd[xno%vNש:dE+*g=kI"'+!$#s bd㮕$]\Gњ'SRF17EciA3Jn#g1Wc8 v}ſmdhz 0>qGmq~# 5PyS3 exLN^_">h/Y93$|KIa1`L SS*t}na@fֈgMON+11 >I)ԇ+ * +B/{8/%3HD O5YH'*ǻ{$WL%. hZg8d-&nh0E)69a5aysVĒ/繦8l|^[r=܊vCGšP0.?_F~ޟcaYR3P%)VUW`-88H۬5xu+|׳^kb W󚯒!Ȣo"B~H\("?~I?nX)69 AyCEfE|qsaFp˸Eg[ߘdvyh`Y٭m^C#6ZeiK5J5+RA'v=Ul/n>sI4ǣMcR>)!8 oΔ}9 7%XAxQsjpW /UÌklN2GHؙVwR),K[YF&@ZqM4( `65~.mk80ͣUh&C1wJİ]<#MǸ|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+p endstream endobj 579 0 obj << /Length1 2006 /Length2 12027 /Length3 0 /Length 13248 /Filter /FlateDecode >> stream xڍP-C; :2X$@pwk {pAGɹjYݽݽ&W`p4I;:@ؘYJ|VVfVVvjjM0Z vtW b4)9:l6n~6~VV;++]` 3@B-O9=1{ d ٿT47h8AJA'h 8xxx0ڻ2;X 3<k:!ljK3 5@]a חn Kq"@ W_{`cf'ߧHv󰩹 ` T!Fv/MMvf/27HL_-qev!4/]rp9@\Q' v݋寛uppX,,aĢvvIbBmA\l3inGzM/'П?/ |/"@`K;qqz `6@V`_ ˿廀=/`/ptH))ij(0'dp|;?#O)oj9X:RҺp{(^zWPv|dra?MYotMv^ e)_VCu@-f^9r9XF4d [9.v`+?m3}yM\_Oe[ 0uq1Ba}.v..7zZӊ0H ϣv-l3tHۊcXWÈZ3|7)F,ŭ(oȦ9yхS2 f-ܴ'R R12ew6Y2d}w;1A}TUYXqk[wm94sg7β?޴yA{ŝUJ9zfMS,\g<\ᨙyL'/I+R[8i|$z(sC{p1NQr~n+@39)S'psz5slX6 bͅg1?MՁ^djH^1;h_h bԬQ& jUsO>Wvu zdH.uj!C"쑄Uxm!~TlCh 6p`93;|g6uݴڏHdhp}}_4S!lJ.1;rǢ}kP=ZRCwLWoD[#l`^lߛ1bvԨ&= ~pڎH;Nl"@ <7L@xMSEB"jXh =!G S4-.yUK}~>ipnG}s%~WYSQ8Ö\l|UN %O?ZAh4ӱL䩶!x'O JZd /ѧX5/9/Teer 3&DHK6ԏ㰞鈋Q.+%xOBYv=9JSrŽ dպ֫RD +7f2%Q_ pm*|Zu돫KݏEgC$N7p˕u\R!}2 Bх 5 \489odn\;Q䡶Ž֑>Pvcܾ_wEx1[Dd뿦_$ƪTZ:0F֑%O CF4?=RH-HVKC9x劇ҷ ۜQpOï0sD=i}HO{K8e8qNyJ'$jTw'3|wdvazO }Kxn#o(Խ^6 a%6V6ڢ/m4><;ڠ!'AiwxYLMF Y:T/1C,h~fq(Jj\" eW64Vz۶A&ͬ+*תu8X #cGFi7r5>cj30IDZkxJc$PN$(e#sEWm+*0Qg){fўI"fic%>z?{gC_wT۰ c_r.lO|iPm\Y r(%h .2,85Y o-u` s`K&4>vZAd^A'1Wp|<ڰi—.QX|,T?/p./]@]:(6K.8C7jd9A@nH_2t產ݲ}QZ.ᡶXbi8֯y{OE%%]Bɻ V-Fo۸CBe2dDl*oft<ri~E pheT&&E +$7$dX "H u{+<.Ś SU&}Y[(kG2 3ls1NrPUAADnj'KQ(B~\ѸoA-wYWOՑ=ɰWZ= 2@ܛt{z:uy&G„ 0 YWmS)ۈ͋E)QT)u_ä1#m-ė?ZK /wBVT5\Ffm51s4iY64]RI_3F9!ЏvT48mz¾895fZrީC&ےV9d]~U { >;~}!킥<3ү`R _4.S caŇC"[fmLHK%o/Yh ^+ >2#UO͐gX~}Xs+"`ڧF5\D}J λڶdro!a+Zwn{"dFWmg DCʔΎy}_?z`T,o4eG%Cd+C! /yM~\?翈d-TO otu#نoqahW8i\O*V3FgWuN;2o$7eĜR=SU'ٚ-{uIt#nEx2!8N.! +5a9WΪU-et)V 2 4-wХ&8 ylO-0]?zzg֣x![>>%_J\n+:0DmJ=\`g3-~r~N=.FPӓ5 e̕v>lGï n`H:d5FFp`~v>wzkPDa`/Wqmkju (W%z8l@,-Z GPs&aqXPA-b-D>Ohd͌D3"q^@nx[_צ|6ׂl񢹫Re#hixy],iR< "& <ݚ$)C,y~yҠFK.zJldʑAd{^c9NCvɬI( ('q*F{ ˡg;{SfDmVhL#DL٬6X׎Rm_xPE͢D=LcX7<& i\)KS.RE`]Su1j*!GNHjYՊ4H%ÿ}A=+蝾r-JWHy:b201ZzYػϦAHM>EȖTX׃]ŧUU6ip|MŘy-qFfvQӾ՞X kv9. 5\SB=D;&d%밽+IoVqZ쮽ɖX%jyw }iy~mQ*{Hů}b Ll( SOIFtU8}@||h n$5D9Ӷә}R_]ɸRq14dRO &GVr)8*j&+#Vޖ<[J\Lqq!xU9h[=Y$yi2k2 e7_&C∦\sdݔ1-:zv~Y+K@]ʔ9?|ExnPpS 5CM Eho _I(" 7`qÀW\¥uh܇eʊV 67«u[ VAi3NSRLQq<}gwVkrxo'kzxGZ?+{0 6E:a*oFG{ ])6ƠVy "aD mؓ.'nJ/TD K*"{EZJ(5N"%n^"ֲ=ӖEZoQΎak<|WB1!lsA Db¶r >2չu?g~_d1ﰠk$p5R@<{Kh9,pkϽ:9C >eeK|2m_X]ds;[n;x">o8?[0?󣦅vp%w|%Z?9}ʊJMNUsZaK1z&ԯVkoYݷHuoa Ntj 2U(̀>y;XC+Nk 4?"LeHnwFZ]C(vߣ~}􇸹D;Ns8Pqϯ,PRG!TN߈5;h, bRcIE#=&cjb$sEp*%2[THcWdj{ʒ)VUʉ%cmn HHzMGOIhd_؋nm=-n(NոQZ1;eibhu8W bKc_9{ʌ6{r޵v{i{OK]"ðN6eڢL_VR}]kGO~o&i}釯)3q5+!kcf$yK$3xs*80uHu?bpB 854Nes:DXJ/u ocm==h?ΝR,)v5 !Rѷ9,«\N*CExuB>a'eI="?0\O34܀@=0s8㾻7bz:W56;㝩]Wsm;[nA,y$2 9r^[[H$JFyYxǽ4=tM~sTԸnl A͐Xbu5|h>D\Wu|& [ n{\ +ЅJ1*"򟉎d|崞碰^sJ{g Ym+1 [iM/K ><`sT=bTs]Į [$Ĺj={՛š!e!X1^K P/崠V#Bt͞+J}C88y3~;Eܲ ݶ57\@LZG }Mĉ'ˤ&M~ ʢ*NZCxc,:*;rd!F 0R-]3Nexϑ!JCpА9iוF8;1%$ϋDV6 ]g.ok͕_Seoz},CM2m0cϕ@baza 8ʣ,?OmMCžӞmM(.˼sA-lpyWM={_GݯKc ( n#N|r!3>Z@Z=W1q! r YKxy~ hq.<DZQlSyy]$Z"v5ڕ W47;rɻI^Ve؁kkpbH^VΊͽx^&#,%\pɹ2KpBN{Eۼ;x뭶cM$9LSvJ0~LwWAQ{ajڵٴkL;N[IG8&oh1lX?- t机|t}=({#U@'k%>Te`aW+c&.}xoG)^[9G0x`@nvpc+q+,z(/4pL!>TS}-(֮Mx%ItVw m)g{`nȳj=  XAF)ƓHźg_5FV=e2?E7v׿M![Q%ML7̉z 1Vr(iI(<Jr(rk=$K/F;-ZИhAe sS8!^>+|ALka'E͎q5op4Z)*Jf+~{!%ܘB*^Zͻ'Xvf}1qxKDtm|[uPcbH=TL=8x;G4U ]LJ"1 ~%xVd*F+]ٷ-[gI0hEcA3?=hSAS `39MH:I9EXs?,_;~G{ޘr mrI)ސg~eB۷NHpm! V Wv}ġ-:X=$: VA-9XW02__ڥ7|ړh9g`EU]kzblpX 1nq}\Sk2 O_PԻ9rIٟ˾T#R-ST;i,ܩajI gv~v?疻\8B1ڳSW&n_KJ衅M x>m4pCb7i|Fj;"]`IW}ޓ1s/Siz)z4 JIS ȕ|âUȐ<'doߓ`L ,pX?mpL};8_nZ<9F<1'rJXs͜N1v5(ǧ|(,lF {(I\N|ӾWrZJ|;JItkfL(W?s D,ޣ|f=}k{e(WMBЀ v+Z.Hށ@x[ʣ:\|Mfj ;yZwEIO'x۹[pU2W  5^6є(m@5j3<ۛcJZ`Qc-)h&/o4HYvKQ%טG(2nDf| ɕ/UE`!Gza8/8>J,;R/5v4R1bRwdIH##~z޼CbL~Oߏ}!@} a&v˜@ Ȋ WOT]<<7B]-f.:˚;h#S5 -+tnuDZ}n~(UE>q|,C{&ҍ?{%̇gT쟗\'6hI:7Zy6,VGm~=Q$7 3S|aX<ɞ-gr] ocgGI: (nCJReh%a,|ۤ5֕zW-6AsK_(Ԣ9vɾTMC\#+ϭ+Jpbr9P$K'*{3Gj|;vccκvQFIzʾ5ZC:i3hcv MEV=#tK5qU{]Hܲ90Uո 7O֣bqB$!t4K'L י3 ՛\+2h.Q$lE퍋P}Gq"R ȾlxA'{a}G>? )ބsiwnӗUԑ%:8zc58oQ@76՝#)c].JNdŏXQJ'8;r3 jAw-O6լv^rNN!I/%PB| AFd W%\Mg3_N&䗰pm,3D;zWW\DDL t`7+a%HpBۯ@zNRBJԉ8Q`3~@_b?-||21ƤW6a= 㖥NcIQbG'⟟2Ѵ$qc5!gYb5y%K9(i*`|Q,beVRZyWCtj%czphvV=)?\4[נjJ-ĖOH(ChSL"8hg~8?xtkYx.; [{jP<Ә[ģJސ0 igaiŰb'01W}Cڤ&NRn \;`L|uu ž~+I_[uP0ffջ8nHG^)Jk4"J@ $T{f:ܙ3|Fab}gj%nEwVۻ" w1: OXYjq@r1χ/_c+e. *M7: ?FGШBF11(D6w:YgL׉zm̺pbeEBxX)\yYVQ-w;&P,81 Vly`UsOOIuu M$YFuV9"j}O}hh*rHXQwP: \u yZvo<vaOnS98Wu~gbF|X>`$}+)k\/5-Vor!kn>mU{^!&@ TIM@lMSiুs$92L絎~ ~ʳ)N,"aTABY =},Оv|+B+NcP;N}I֕C]XZhiU&oԱ['xJA7=W Jԣws[- G R(fk?$[aQPR2R;n7TʁP~2d*QǑ87ah+bqYG m jpRiLKoA,ֻ[t2 оJC͌j5+^y7ЦytV\@׃ڻ><ƹq]ݤ0j|뜎c5pPivS]Ν}z7EGjJQMA8k̋Z\ R]1o̯H@FEk˓vKG\ѐ >$k8NU5mLp; L=D}H^(ҍ 2֮2gY6&b!oC5Ef3*Bhf7kR<8$6!.׬#*S3ų4e4/a`_QRZ0q1SX1Rvru)w?#g3lN>Ǧacb =D}w#hl9.a&ʷ̳Ȗ)xQ+vh]u>y=6Ҙ[Mb\9g=H*TN\ɦT!K0_"LĬUM!bca<=Vm]ѹ> QH6uo/j=:x9Vt=߯:˪B(xv[nK_lV1im;6ZҐQ;h=[.qgGEa qh禆<9PĻqj!`,춰L6ZdBhC:s- +K] 6n6TiC9jC9` yU$<"Xd0HURKWz|)\4ܞF8E229HG 5!=}KYQL#ڼ *]WW-<9mq+Rr&BB*dcO]9VYkwhq('kم .'Gu {.1{Prӟ+k3 G{e3y+ d bARwl({l:1yx{ҝYv{K'f9~yk28t)cDQ #o6QxWxۥk/|RǻxS-&Wu*z[ſ rӴv& d.E`[NefRNo} \bKjuBu)Y]3q;>zvoĉ.K͡%AKj 㼅3hlЇ1Y?.K?|P6,g{OJZ뼼^tkEq7 .7g̈7ǷƆ;eqؽ^ =+JT"o!8>kc -eӌ*b ǽ3_ѕ#'M}LL^"o++N`$$hO6 -yl/U? 4~2`c#>3;GCqc6j =XDxPDjYB`Cw`&Sun+ګ`,[!dz7T=c|b 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.13)/Keywords(genetic algorithm, evolutionary program, optimization, parallel computing, R) /CreationDate (D:20130208092200Z) /ModDate (D:20130208092200Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012) kpathsea version 6.1.0) >> 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 [ ] /Length 1457 /Filter /FlateDecode >> stream x%KlWE_R(-Z*7A JiyFcW΍ DYh 9č0$&n\MpCt+rfs=;so!W, D 0@a ^dacn3207&U`ڲ:A5smdX6ͥj :˴n'У5Fv]Xuzim<΃;`\oݚVn'nsJ Tx.t` N] 8#(@8zA8 "C`Q08 ΀I0 8 9p\2X "X hZBp ̂ep yA=`0gLs2%@K{ @e0\%aupmpk9m}`)GVGVGVGVGVWZh*j&u= R;R;R;zz;z;¹^k;h^p4#0ܬ{L-}/#`t 1 ns&"\sHHHHHHH=^Oz vN jѝpr,oz[j9:k)1,3fY8N8SeNOinTPew:@~.Q!ml>:.`{4P@-ZtA旀΋%Pf h^ISdS- [9 :*`'h~_vvBt#&F=Z (8:,LN3$6w[=1+\AQy~ (bۿ8>h7]{Š]UtҊ_*VFѠt):e Y a+ 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 > > #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) > claw1$value <- signif(claw1$value,6) > claw1$par <- signif(claw1$par,6) > claw1$gradients <- signif(claw1$gradients,6) > print(claw1) $value [1] 0.411312 $par [1] 0.999503 $gradients [1] -1.27716e-06 $generations [1] 11 $peakgeneration [1] 1 $popsize [1] 3000 $operators [1] 372 375 375 375 375 376 375 376 0 > > # 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) > biclaw1$value <- signif(biclaw1$value,6) > biclaw1$par <- signif(biclaw1$par,6) > biclaw1$gradients <- signif(biclaw1$gradients,6) > print(biclaw1) $value [1] 1.67113 $par [1] -1 -1 $gradients [1] 2.49105e-08 -3.42757e-08 $generations [1] 12 $peakgeneration [1] 1 $popsize [1] 5000 $operators [1] 622 625 625 625 625 626 625 626 0 > > proc.time() user system elapsed 6.218 0.141 6.384 rgenoud/tests/tests.R0000644000176200001440000000376712163371233014362 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) #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) claw1$value <- signif(claw1$value,6) claw1$par <- signif(claw1$par,6) claw1$gradients <- signif(claw1$gradients,6) print(claw1) # 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) biclaw1$value <- signif(biclaw1$value,6) biclaw1$par <- signif(biclaw1$par,6) biclaw1$gradients <- signif(biclaw1$gradients,6) print(biclaw1) rgenoud/src/0000755000176200001440000000000012553042713012506 5ustar liggesusersrgenoud/src/unif.h0000644000176200001440000000135212553042713013621 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.cpp0000644000176200001440000001576312553042713015732 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 "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 long BaseNewUnifSeed=81282, BaseRandIntSeed=53058; 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.cpp0000644000176200001440000000356212553042713015322 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" #include "urans.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.cpp0000644000176200001440000037365312553042713015041 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 June 27, 2013 */ #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.h0000644000176200001440000000764712553042713014472 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.cpp0000644000176200001440000000734412553042713014163 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/genoud.h0000644000176200001440000002363112553042713014145 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/urans.h0000644000176200001440000000077212553042713014015 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/urans.h,v 2.15 2005/10/29 06:14:44 jsekhon Exp jsekhon $ */ /* set seeds for the random number generators */ #ifndef DEFURANS #define NEWUNIFSEED 81345 #define RANDINTSEED 98711 #define DEFURANS #endif rgenoud/src/change_order.cpp0000644000176200001440000005464712553042713015652 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.cpp0000644000176200001440000006023412553042713015014 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.cpp0000644000176200001440000001115712553042713015076 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=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, ...) { 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'") # has the user provided any seeds? if (unif.seed==812821 && int.seed==53058) provide.seeds <- FALSE else 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.R0000644000176200001440000000253412552557302013110 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/0000755000176200001440000000000012553042713013727 5ustar liggesusersrgenoud/vignettes/Figures/0000755000176200001440000000000012211655411015327 5ustar liggesusersrgenoud/vignettes/Figures/fig1.pdf0000644000176200001440000002366711762732324016677 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.pdf0000644000176200001440000011453711762766061017720 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.bib0000644000176200001440000017213711552430730016061 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.Rnw0000644000176200001440000021542711762766337016115 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/MD50000644000176200001440000000370012553121055012224 0ustar liggesusers03031d7393b444fb126b60b64e11fb87 *ChangeLog 011cd745379495c2173b8c558a21430e *DESCRIPTION 7041fdf1d47575612a5530f22815c74b *INDEX d0e648e7a542fefef8ded0093a377d0c *NAMESPACE e876d80633dfbe62bc02b1bfac2182cc *R/rgenoud.R 1a33ab1680d185e8ac27ccbfee0a69c5 *R/zzz.R 5b89fbb8f5ded1292c887abd380d9ed3 *THANKS b4e36fbfec752be4e34ac7be2a1df462 *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 5ff472c622145eb456da868ca0c1d987 *inst/doc/rgenoud.pdf e9bf210be99470cc4bc1dc2f33d7c6fb *man/genoud.Rd 9e5f395a8f7532118c723dab203d314d *src/change_order.cpp 0e2173333529000bcd8a2b2cdceec2c6 *src/eval.cpp 41e73b115fe52a57d90f9771202ab5e7 *src/evaluate.cpp c064f9e6cdb0634bc0062a044f5d1eb6 *src/frange_ran.cpp 1a9a34c6ab01598c176ef45ec10e5e70 *src/genoud.cpp dfa87419e843d8e6fb959e156004c550 *src/genoud.h 3213f79851150f99629a7e2a1719a7d6 *src/gradient.cpp 682a4a00ac9b06f5063f248f59989f0d *src/gradient.h 824d9f5d338ecaa274098127fbfe987b *src/math.cpp 1ac6ed98c2cb0267453dcdfe1c8029ce *src/multiply.cpp 62b05e4d2b6ccf20af199dc8db6f4436 *src/numerics.cpp 1dfcf27b62c83849ee8bd8b361d06e11 *src/operators.cpp 33b6a2cd3d214a86355fb03ae840034d *src/print_format.cpp 6232a071dae711bba098c886b76bbdee *src/rgenoud.cpp 5a028c6ece078d870ee528ca300a9776 *src/unif.cpp fa19da33dee62a703d43ed766e8d2985 *src/unif.h 4ef64fab110b8894a0a4871f34f5692f *src/urans.h 1bd5ce070de3e38986c27c888120005e *tests/tests.R de48b17cafdb9e88eb76e1a6cd7b6074 *tests/tests.Rout.save fc974e2bc8d4159f9ef7c20f2e4d2d40 *vignettes/Figures/fig1.pdf c1c87156136ee41de970e4fce41fe4ed *vignettes/Figures/lqdxmpl2B.pdf 688f42dd89519765ad82e2ec6eb8b9ce *vignettes/rgenoud.Rnw 6da32365e697f8c1d280b3bf1c346ef2 *vignettes/rgenoud.bib rgenoud/build/0000755000176200001440000000000012553042713013016 5ustar liggesusersrgenoud/build/vignette.rds0000644000176200001440000000031012553042713015347 0ustar liggesusersb```b`fbd`b2 1# '.JO/M +G -KWV& 7h0XU{H&$aּbt.y) DM;<f6̜T3B2K7(1Ix(\%^PL4@bts$$ Eټrgenoud/DESCRIPTION0000644000176200001440000000103512553121055013421 0ustar liggesusersPackage: rgenoud Version: 5.7-12.4 Date: 2015-07-19 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: parallel License: GPL-3 URL: http://sekhon.berkeley.edu/rgenoud/ NeedsCompilation: yes Packaged: 2015-07-20 00:50:19 UTC; jas Repository: CRAN Date/Publication: 2015-07-20 09:24:29 rgenoud/THANKS0000644000176200001440000000035611236750565012646 0ustar liggesusersThe authors would like to thank the following people for their help and assistance: Ben Goodrich Erin Hartman Todd Rice Jonathan Wand rgenoud/ChangeLog0000644000176200001440000002362212553042657013505 0ustar liggesusers2015-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/0000755000176200001440000000000012211533373012470 5ustar liggesusersrgenoud/man/genoud.Rd0000644000176200001440000011212512163247246014251 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=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, ...) } \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 sets the seed for the floating-point pseudorandom number generator \code{genoud} uses. The default value of this seed is 81282. \code{genoud} uses its own internal pseudorandom number generator (a Tausworthe-Lewis-Payne generator) to allow for recursive and parallel calls to \code{genoud}. Repeated invocations without specifying this argument cause the program to continue drawing from its internal pseudorandom number stream, which is preserved in a static structure between invocations during the same R session, so the second invocation does not use the same pseudorandom numbers as the first. To produce exactly the same results in a subsequent invocation, one must explicitly provide the same, nondefault value for this argument. \code{genoud} does not use the seed set by R's \code{\link{set.seed}} function. This will change in a subsequent version.} \item{int.seed}{This sets the seed for the integer pseudorandom number generator \code{genoud} uses. The default value of this seed is 53058. \code{genoud} uses its own internal pseudorandom number generator (a Tausworthe-Lewis-Payne generator) to allow for recursive and parallel calls to \code{genoud}. Repeated invocations without specifying this argument cause the program to continue drawing from its internal pseudorandom number stream, which is preserved in a static structure between invocations during the same R session, so the second invocation does not use the same pseudorandom numbers as the first. To produce exactly the same results in a subsequent invocation, one must explicitly provide the same, nondefault value for this argument. \code{genoud} does not use the seed set by R's \code{\link{set.seed}} function. This will change in a subsequent version.} \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/.Rinstignore0000644000176200001440000000004611762640255014231 0ustar liggesusersinst/doc/Figures/* inst/doc/Figures rgenoud/INDEX0000644000176200001440000000007710330611541012505 0ustar liggesusersgenoud GENetic Optimization Using Derivatives