From: <fer...@us...> - 2007-10-14 19:12:03
|
Revision: 3942 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3942&view=rev Author: fer_perez Date: 2007-10-14 12:11:32 -0700 (Sun, 14 Oct 2007) Log Message: ----------- - Fixes to main book so it compiles to PDF directly from LyX, without having to use the kludgy lyxport script at all. - Update some of the examples with minor fixes. - Add new workbook directory. For now, I added the .tex files as well, though they are generated from LyX, so John can use the system without LyX while I'm gone. Once I'm back, we can decide how to best do this in the long run. Modified Paths: -------------- trunk/py4science/book/fig/hothead.eps trunk/py4science/book/fig/load_ascii.eps trunk/py4science/book/main.lyx trunk/py4science/examples/quad_newton.py trunk/py4science/examples/schrodinger/schrod_fdtd.py trunk/py4science/examples/skel/quad_newton_skel.py trunk/py4science/examples/skel/trapezoid_skel.py trunk/py4science/examples/skel/wordfreqs_skel.py trunk/py4science/examples/trapezoid.py trunk/py4science/examples/wallis_pi.py Added Paths: ----------- trunk/py4science/workbook/ trunk/py4science/workbook/fig/ trunk/py4science/workbook/fig/Composite_trapezoidal_rule_illustration.png trunk/py4science/workbook/fig/wallis_pi_convergence.eps trunk/py4science/workbook/fig/wallis_pi_convergence.pdf trunk/py4science/workbook/intro.lyx trunk/py4science/workbook/intro.tex trunk/py4science/workbook/main.lyx trunk/py4science/workbook/main.tex trunk/py4science/workbook/preamble.tex trunk/py4science/workbook/qsort.lyx trunk/py4science/workbook/qsort.tex trunk/py4science/workbook/quad_newton.lyx trunk/py4science/workbook/quad_newton.tex trunk/py4science/workbook/skel trunk/py4science/workbook/trapezoid.lyx trunk/py4science/workbook/trapezoid.tex trunk/py4science/workbook/wallis_pi.lyx trunk/py4science/workbook/wallis_pi.tex trunk/py4science/workbook/wordfreqs.lyx trunk/py4science/workbook/wordfreqs.tex Modified: trunk/py4science/book/fig/hothead.eps =================================================================== --- trunk/py4science/book/fig/hothead.eps 2007-10-14 19:00:50 UTC (rev 3941) +++ trunk/py4science/book/fig/hothead.eps 2007-10-14 19:11:32 UTC (rev 3942) @@ -1,385 +1,9190 @@ %!PS-Adobe-3.0 EPSF-3.0 -%%Title: /home/jdhunter/cyber/cyberpy/roadshow/fig/hothead.eps -%%Creator: matplotlib version 0.81, http://matplotlib.sourceforge.net/ -%%CreationDate: Tue Jun 7 15:25:48 2005 -%%BoundingBox: 18 180 594 612 +%%Creator: (ImageMagick) +%%Title: (/tmp/lyx_tmpdir9363Ed1GeG/lyx_tmpbuf0/2_home_fperez_teach_py4science_book_fig_hothead.eps) +%%CreationDate: (Sat Oct 13 14:29:25 2007) +%%BoundingBox: 0 0 1200 900 +%%HiResBoundingBox: 0 0 1200 900 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 %%EndComments + +%%BeginDefaults +%%EndDefaults + %%BeginProlog -/mpldict 7 dict def -mpldict begin -/m { moveto } bind def -/l { lineto } bind def -/r { rlineto } bind def -/box { -m -1 index 0 r -0 exch r -neg 0 r -closepath +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval } bind def -/clipbox { -box -clip -newpath + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse } bind def -/ellipse { -newpath -matrix currentmatrix 7 1 roll -translate -scale -0 0 1 5 3 roll arc -setmatrix -closepath + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval } bind def -%%BeginFont: Verdana -%!PS-TrueType-1.0-1.0 -8 dict begin -/FontName /Verdana def -/FontMatrix [1 0 0 1 0 0] def -/FontType 42 def -/Encoding StandardEncoding def -/FontBBox [-102 -423 2963 2049] def -/PaintType 0 def -/FontInfo 7 dict dup begin -/Notice (Typeface and data \xA9 1996 Microsoft Corporation. All Rights Reserved) def -/FamilyName (Verdana) def -/FullName (Verdana) def -/version (Version 2.35) def -/isFixedPitch false def -/UnderlinePosition -180 def -/UnderlineThickness 120 def -end readonly def -/sfnts [ -<00010000001301000004003044534947CD5006A400020D64000014144C5453485694D82F -00001530000003814F532F32477590C3000001B80000005656444D5874F17C6D000018B4 -000005E0636D6170E84D8B8B000007A80000068C637674204CA740E3000022AC00000198 -6670676DEE371553000021740000013867617370001700090000021000000010676C7966 -01F195F700009EC000013BB668646D7809490ECD0000323800006C8868656164C748722C -0000013C0000003668686561133B09D00000017400000024686D7478C905723E00002444 -00000DF46B65726E75BF7E53000200CC00000C966C6F63616784B57700000E34000006FC -6D617870086A023E00000198000000206E616D65A93B95720000022000000587706F7374 -C58F55450001DA7800002651707265701240C02F00001E94000002E00001000000010000 -16FBFC3A5F0F3CF5001B080000000000AA7E442900000000B26DE2ABFF9AFE590B930801 -00000009000200000000000000010000080BFE5200000C2CFF9AFBD40B93000100000000 -00000000000000000000037D00010000037D00620007006B000500020010002F00380000 -0495013F0003000100010411019000050000059A053300000125059A0533000003A00078 -02A70800020B0604030504040204000002870000000000000000000000004D5320200040 -0020FB02061EFE5900CA080B01AE2000019F000000000000000000030008000200100001 -FFFF00030000002801E60001000000000000004300000001000000000001000700430001 -0000000000020007004A0001000000000003002F00510001000000000004000700800001 -000000000005000C00870001000000000006000700930001000000000007002F009A0003 -000104030002000C00C90003000104050002001000D50003000104060002000C00E50003 -000104070002001000F10003000104080002001001010003000104090000008601110003 -000104090001000E01970003000104090002000E01A50003000104090003005E01B30003 -000104090004000E021100030001040900050018021F0003000104090006000E02370003 -000104090007005E024500030001040A0002000C02A300030001040B0002001002AF0003 -0001040C0002000C02BF00030001040E0002000C02CB0003000104100002000E02D70003 -000104130002001202E50003000104140002000C02F70003000104150002001003030003 -000104160002000C03130003000104190002000E031F00030001041B00020010032D0003 -0001041D0002000C033D00030001041F0002000C03490003000104240002000E03550003 -0001042D0002000E036300030001080A0002000C03710003000108160002000C037D0003 -00010C0A0002000C0389000300010C0C0002000C0395547970656661636520616E642064 -61746120A92031393936204D6963726F736F667420436F72706F726174696F6E2E20416C -6C2052696768747320526573657276656456657264616E61526567756C61724D6963726F -736F66743A56657264616E6120526567756C61723A56657273696F6E203120284D696372 -6F736F66742956657264616E6156657273696F6E20322E333556657264616E6156657264 -616E6120697320612074726164656D61726B206F66204D6963726F736F667420436F7270 -6F726174696F6E004E006F0072006D0061006C006F00620079010D0065006A006E00E900 -6E006F0072006D0061006C005300740061006E0064006100720064039A03B103BD03BF03 -BD03B903BA03AC0054007900700065006600610063006500200061006E00640020006400 -6100740061002000A9002000310039003900360020004D006900630072006F0073006F00 -66007400200043006F00720070006F0072006100740069006F006E002E00200041006C00 -6C0020005200690067006800740073002000520065007300650072007600650064005600 -65007200640061006E00610052006500670075006C00610072004D006900630072006F00 -73006F00660074003A00560065007200640061006E006100200052006500670075006C00 -610072003A00560065007200730069006F006E0020003100200028004D00690063007200 -6F0073006F00660074002900560065007200640061006E00610056006500720073006900 -6F006E00200032002E0033003500560065007200640061006E0061005600650072006400 -61006E006100200069007300200061002000740072006100640065006D00610072006B00 -20006F00660020004D006900630072006F0073006F0066007400200043006F0072007000 -6F0072006100740069006F006E004E006F0072006D0061006C004E006F0072006D006100 -61006C0069004E006F0072006D0061006C004E006F0072006D00E1006C004E006F007200 -6D0061006C0065005300740061006E00640061006100720064004E006F0072006D006100 -6C004E006F0072006D0061006C006E0079004E006F0072006D0061006C041E0431044B04 -47043D044B0439004E006F0072006D00E1006C006E0065004E006F0072006D0061006C00 -4E006F0072006D0061006C004E0061007600610064006E006F0041007200720075006E00 -740061004E006F0072006D0061006C004E006F0072006D0061006C004E006F0072006D00 -61006C004E006F0072006D0061006C00000000020001000000000014000300010000011A -000001060000010000000000000001020000000200000000000000000000000000000001 -0000030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 -25262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 -494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60610062636465666768696A6B -6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F -909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAAB03ACADAEAFB0B1B2 -B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD000D1D2D3D4D5 -D6D7D8D9DADBDCDDDEDF0004057200000084008000060004007E017F019201A101B001FF -02C702C902DD0301030303090323037E038A038C03A103CE040C044F045C045F04911E85 -1EF92015201E2022202620302033203A203C203E2044207F20A420A720AC210521132116 -21222126212E215E22022206220F22122215221A221E222B22482260226525A125AB25CA -25CF25E6F002F00DFB02FFFF0000002000A0019201A001AF01FA02C602C902D803000303 -03090323037E0384038C038E03A30401040E0451045E04901E801EA02013201720202026 -203020322039203C203E2044207F20A320A720AB21052113211621222126212E215B2202 -2206220F221122152219221E222B22482260226425A125AA25CA25CF25E6F001F004FB01 -FFFFFFE30000FF1400A60099FF8A0000FE0F0000FF4C0078FF41FF28FCA00000FE170000 -0000FDD9FDD8FDD7FDD6FDA6E30B0000000000000000E085E095E109E084E0F9E156E077 -E0B70000E0900000E038E02BE123DF6ADF79E068E03CDE96DEA2DE8B0000DEA60000DE74 -DE71DE5FDE2FDE30DB9EDB96DAEEDB73DB5D10BE000005BE000100000082000000000000 -000002380000023800000000000000000000023800000242026800000000000000000000 -000002B203640368037600000000000000000000000000000000036A0000036A00000000 -000000000000000000000000000000000358000003580000000000000000000000000000 -0000000000000000034400000000000300A300840085037C009600E60086008E008B009D -00A900A40010008A01000083009300F000F1008D00970088010100DC00EF009E00AA00F3 -00F200F400A200AC00C800C600AD006200630090006400CA006500C700C900CE00CB00CC -00CD00E7006600D100CF00D000AE006700EE009100D400D200D3006800E900EB0089006A -0069006B006D006C006E00A0006F0071007000720073007500740076007700E80078007A -0079007B007D007C00B700A1007F007E0080008100EA00EC00B901440145010201030104 -010500FB00FC014601470148014900FD00FE01060107010800FF014A014B014C014D014E -014F0109010A010B010C0150015100F600F701520153015401550156015701580159015A -015B015C015D015E015F0160016100F800D50138013901620163016401650166010D010E -01670168010F01100111011200E000E1011301140169016A01150116013A016B016C016D -016E016F01700117011800AF00B00119011A01710172011B011C011D011E0173017400F9 -00FA00E200E3011F01200121012201750176017701780179017A017B017C012301240125 -0126017D017E017F01800181018200BA012701280129012A00E400E5018300D600DF00D9 -00DA00DB00DE00D700DD019D019E019F018A01A001A101A201A401A501A601A701A8012B -01A901AA01AB01AC012C01AD01AE01AF01B001B101B201B301B401B501B601B701B8012D -01B901BA01BB01BC01BD01BE01BF01C001C101C2012E01C301C4012F013001C501C601C7 -01C801C901CA01CB01CC01CD01CE023A01CF01D00131013201D1013301D201D301D401D5 -01D601D701D801D9025D025E025F0260026102620263026402650266026702680269026A -026B026C026D026E026F0270027102720273027402750276027702780279027A027B027C -027D027E027F028002810282028302840285028602870288034C034D034E034F03500351 -03520353035403550356035703580359035A035B035C035D035E035F0360036103620363 -036403650366036703680369036A036B036C036D036E036F037003710191019203740375 -037603770378037900B100B20238013400B500B600C3019300B300B400C4008200C10087 -00F50195037A00BC009900ED00C200A5019B019C023B023C023D023E023F024002410242 -0000001F001F001F001F00470070010401C0025F033C035503A203F10461049604C004DE -04F50520057F05B9063806DB072D07A70830086B090B099309B509F10A350A640AAA0B13 -0BF80C600CDC0D4F0DA00DD60E060E7A0EAE0EDB0F180F860FA61000104C10B8111711AE -122012B812DF132C13881407148814DF15221544156F159015C815DE15FE168916E71747 -17A01803184F18D11912193D198C19E51A001A761AB61B011B5D1BB81BF51C8B1CDB1D1B -1D741DD91E641EC21F041F631F7E1FDC203B205520FE21AA21BD21D021E9220222142226 -2238225322652278230A231C232E234023562369237C23B423EE2400241224242436244C -245E24702482249424AB24E62520259A260826EB270B274327C928832929297B299C29C2 -2A2D2A912B412BCD2C0D2C5A2CA82D0C2D4C2DCB2E3D2E722E9F2EE92F5E2F9F301130E7 -316D31D831FF3223326032DF336433A233F33443346D3480349334A6350E35AD35C735DD -361C365B368036A736E33728373F37593777382D3858388438E139313986399E39C43A03 -3AD73AEA3AFD3B103B243B373B4A3B5D3B773B8A3B9D3BB03BC33BD63BE93BFC3C173C47 -3C8E3CA63CEC3D003D493D7D3DB53DEA3E1B3E5B3E923EA53EB73ECA3EDC3F043F6B3FFF -40124024408840E441014135416941BB4239425A427E42AA42F643024314432743F044AF -44C244D444E744F9456F4586459E45B145C3465F47144727479D47A54806489348A648B8 -48CB48F0492B4961499249BC49CF49E149F44A064A1A4A2D4A404A534A664A794A8C4A9E -4AEE4B6C4B7F4BEC4C354C484C5C4C6F4C824C954CA84CBA4CDA4D584DDD4E3C4EC24F58 -4FB24FE1505D5081509D50E951DF51EF52085268528B52CA538353FD5425543F54665491 -54EA54FC550D551F55345546555B556D557E559055A455B655C755D955EE5600561556B8 -575B576D578757DE583458A458FC593F596C59C05A035A595AB15AC85B225B335B495BA2 -5BEB5C305C465C5C5CD25D2E5D405D515D635D745D855DEA5DFC5E105E4E5EBA5ECC5EDD -5EEF5F005F125F235FA2600E6020603260446055608561656246625C626E6285629A62B1 -62C362D562E762F963166332634963606388639E6422648E64AA64D76504653065556589 -65A265DD65F36611662F664F666E668E66B16700670867106752675A6762676A6772677A -67C367CB67D36812681A6840684868DA68E268EA68F2695D69DC69F66A106A216A376A48 -6A5B6A6F6AFD6B4A6BBD6BFF6C866C8E6D226D7A6DC16DC96E726E7A6ECF6F3B6F7A6FEA -705A70F370FB7112712371347146715A71C571DD7255725D7265727F7287731C738773DE -73F3749074C174C97521752975497594759C765676F2773A77AE783B7892789A78A278AA -78D078D878E078E8795979DE79E67A167A5D7A907ACD7B297B907BE47C5F7CCD7D367D3E -7DCA7E4C7E6C7EBC7EC47F7D8015804D80B18126817B81D38203820B82308238829A82C9 -82D1836C837483AC83EF8425846784C3852B858085F4865386BD86D38757876887D587DD -87E587ED87F5888B88F9894F896489EE8A258A4E8A7B8A918B238B488B6C8BBD8C398C73 -8CD88D0C8D8E8D8E8D8E8D8E8D8E8E208E8D8EF48F598F9F8FB58FBD8FC59006904590BD -9126916491A19209927292C09334938093D1944E94D395479558956C9586959B95B195C7 -95DD95F3960B96219633964996659683969596AA96BC96D196E396F8970A971F973E9759 -976A977B979697AE97C497D597ED97FF98179829983F985598679879989898B198C998DB -98ED98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF -98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF98FF9911 -9922994099549970998999A199B399CB99E499FC9A159A359A4E9A659A769A909AA59ABB -9ACC9AE29AF99B0B9B1C9B2D9B3E9B549B659B7C9B949BAF9BC79BDD9BEE9C009C119C22 -9C339C4E9C649C759C8B9CA49CB89CCE9CDF9D639D6B9DDB0000037D01011C1C300E0E0B -0E010A01010E0E010F01010B0B0B0B0B0B0B0B0B0B01010E0E0E0B0C320E101923150E0F -740A0E2D240E0D0D0D0E322C1D322E1C111C0101010101010D0D0E0D0D1C0D0BB4010EB4 -110B100D0D2A11110B0A100F0A11010E0101323210230E0D1D0D0D0D0D0D0D0E0D0D0D0D -B4B4B4B40B10101010100B0B0B0B0B010B0B01010B0101010101010E330D010E0E0E0B10 -010101010B0101010E100B300E010B010127270132320D011C0B01010101010E010A1101 -01010101010B010101013223322323747474740D0D0D1D1D1DB401010101010101010101 -0AD732111C110E1001110A0D0D0E01010101010101010E0D743211100E100E0D0101320D -320D190D10230D230D2DB42D322D010E0B0E0B0D100E2A0E2A32112C112C111D0B1D0B1C -111C11100D130D2612181110010D010A0A110E01240A121901011901320D100E100E230D -230D230D0E0D0E0D0E0D0F0B0F0B74B474B474B474B40A010E0E0E2DB40E0B0E0B0D100D -100E2A32112C111D0B1D0B1D491D182E10110A01320D330E0D10012E102E102E10110A01 -010B01010101012E010101320E1C10160C27B4320E01231C0F740E0A240E300D0F0D1E2C -111C111474110D120BB40B0B0F0D0B0DB40D0A130A011010010B0C1010B40B100B10230A -100D3274740A0C0E010E1111320E0E10012311010E0E0E12240F0D0F0D102C11131C2D22 -11111F2D0E0D01100D240A010D0D301210100B011D1010100D0F110A170F270D11320C11 -0C0E0D0A0D0B010E11B4B4010A0E0B0B0A10100A01011001010101010101010101012D10 -282001010101010101010101010101010101010101320D320D320D320D320D320D320D32 -0D320D320D320D320D230D230D230D230D230D230D230D230D74B474B401010101010101 -010101010101010101010101010101010101010101010101010101010101010101010101 -010101010101010101010101010101010101010101010101010101010101010101010101 -010101010101010101010101010101010101010101010101010101010101010101010101 -010101010101010101010101010101010101010101010101010101010101010101010101 -010101010101010101010101010101010101010101010101010101010101010101010101 -01010101010101010D100D100D100D100D100D100D102D102D102D102D102D101D0B1D0B -28202820282028202820110A110A110A110A0D010B00000000000001000101010101000C -00F808FF00080008FFFE0009000AFFFE000A000AFFFE000B000BFFFE000C000CFFFE000D -000DFFFD000E000EFFFD000F000FFFFD0010000FFFFD00110011FFFD00120012FFFC0013 -0013FFFC00140015FFFC00150015FFFC00160016FFFC00170017FFFB00180018FFFB0019 -001AFFFB001A001BFFFB001B001BFFFB001C001CFFFA001D001DFFFA001E001EFFFA001F -0020FFFA00200020FFFA00210021FFF900220022FFF900230023FFF900240025FFF90025 -0026FFF900260026FFF800270027FFF800280028FFF800290029FFF8002A002BFFF8002B -002BFFF7002C002CFFF7002D002DFFF7002E002EFFF7002F0030FFF700300031FFF60031 -0031FFF600320032FFF600330033FFF600340034FFF600350036FFF500360036FFF50037 -0037FFF500380038FFF500390039FFF5003A003BFFF4003B003CFFF4003C003DFFF4003D -003DFFF4003E003EFFF4003F003FFFF300400041FFF300410041FFF300420042FFF30043 -0043FFF300440044FFF200450046FFF200460047FFF200470047FFF200480048FFF20049 -0049FFF1004A004AFFF1004B004CFFF1004C004DFFF1004D004DFFF1004E004EFFF0004F -004FFFF000500051FFF000510052FFF000520052FFEF00530053FFEF00540054FFEF0055 -0055FFEF00560057FFEF00570058FFEE00580058FFEE00590059FFEE005A005AFFEE005B -005CFFEE005C005DFFEC005D005DFFEC005E005EFFEC005F005FFFEC00600060FFEC0061 -0062FFEB00620062FFEB00630063FFEB00640064FFEB00650065FFEB00660067FFEA0067 -0068FFEA00680068FFEA00690069FFEA006A006AFFEA006B006BFFE9006C006DFFE9006D -006DFFE9006E006EFFE9006F006FFFE900700070FFE800710072FFE800720072FFE80073 -0073FFE800740074FFE800750075FFE700760076FFE700770078FFE700780078FFE70079 -0079FFE7007A007AFFE6007B007BFFE6007C007DFFE6007D007DFFE6007E007EFFE6007F -007FFFE500800080FFE500810082FFE500820083FFE500830083FFE500840084FFE40085 -0085FFE400860086FFE400870088FFE400880088FFE400890089FFE3008A008AFFE3008B -008BFFE3008C008DFFE3008D008EFFE3008E008EFFE2008F008FFFE200900090FFE20091 -0091FFE200920093FFE200930093FFE100940094FFE100950095FFE100960096FFE10097 -0098FFE100980099FFE000990099FFE0009A009BFFE0009B009BFFE0009C009CFFE0009D -009EFFDF009E009EFFDF009F00A0FFDF00A000A0FFDF00A100A1FFDF00A200A3FFDE00A3 -00A4FFDE00A400A4FFDE00A500A6FFDE00A600A6FFDE00A700A7FFDD00A800A9FFDD00A9 -00A9FFDD00AA00ABFFDD00AB00ABFFDD00AC00ACFFDC00AD00AEFFDC00AE00AFFFDC00AF -00B0FFDC00B000B0FFDC00B100B1FFDB00B200B2FFDB00B300B4FFDB00B400B5FFDB00B5 -00B6FFDB00B600B6FFDA00B700B7FFDA00B800B9FFDA00B900BAFFDA00BA00BBFFDA00BB -00BBFFD900BC00BCFFD900BD00BDFFD900BE00BFFFD900BF00C0FFD900C000C1FFD800C1 -00C1FFD800C200C2FFD800C300C4FFD800C400C5FFD800C500C5FFD700C600C6FFD700C7 -00C7FFD700C800C8FFD700C900CAFFD700CA00CBFFD600CB00CCFFD600CC00CCFFD600CD -00CDFFD600CE00CFFFD600CF00D0FFD500D000D0FFD500D100D1FFD500D200D2FFD500D3 -00D3FFD500D400D5FFD400D500D5FFD400D600D7FFD400D700D7FFD400D800D8FFD400D9 -00DAFFD300DA00DBFFD300DB00DCFFD300DC00DCFFD300DD00DDFFD300DE00DEFFD200DF -00E0FFD200E000E0FFD200E100E2FFD200E200E2FFD200E300E3FFD100E400E5FFD100E5 -00E6FFD100E600E7FFD100E700E7FFD100E800E8FFD000E900E9FFD000EA00EBFFD000EB -00EBFFD000EC00ECFFD000ED00EDFFCF00EE00EEFFCF00EF00F0FFCF00F000F1FFCF00F1 -00F2FFCF00F200F2FFCE00F300F3FFCE00F400F4FFCE00F500F6FFCE00F600F7FFCE00F7 -00F7FFCD00F800F8FFCD00F900F9FFCD00FA00FBFFCD00FB00FCFFCC00FC00FDFFCC00FD -00FEFFCC00FE00FEFFCC00FF00FFFFCCB8FFC0401EB229323610B220B240B250B270B280 -B2A0B2B0B2D0B2E0B20AC0B2F0B202B8FFC04070B51718361F44010F561F56024F555F55 -026F54019F54AF54025153170452531604535215044A4952044649370447493204484932 -04493539043C3F32043D3F3D043E3F2104433F1D04423F5204413F5204403F52043F3532 -0432336404333534043534540434351E04D034E034F03403B8FFEEB3B4254836B8FFE0B3 -B4102336B8FFEE400DB4090F36B41A480476B386B302B8FFF0B3B3254836B8FFFA40FFB3 -092436B314480489881304706C7078020F9CDF9E02409D161936409C161B364097171936 -4096171B368685131F0F840F850F8E0F8F0F901F841F8E1F8F2F8E808580888F91908590 -8790880F40820910360F721F72024071090C360F6D0120C80120C7013FC6EFC60220C540 -C50200620100621062024061A061020F5B012D1411042C1425042B1439042A1413042914 -15041F141E042120430420143C04C91A45041A1B47041B1A3C041A143204151439041314 -480412141A0411141A0470140140144143360F0E2A1F0006010DC34B1F0CC24B1F0AC04B -1F09C04B1F05BC4B1F04BD4B1F03B94B1F02BA4B1F01B64B1F00B74B1FC3C22A1FC0BF2A -1FBD4056BC211FBAB9211FB7B6211FC2C3C40DBFC0C10DBCBDBE0CB9BABB0CB6B7B80C10 -BC80BC0240B980B9020FB63FB64FB67FB6040FB62FB63FB66FB67FB6BFB6CFB6FFB6080A -0937040C0D02050402030202010002500501B801FF858D8D1DB0964B5258B0801D59B808 -004B5458B001B0018E59B0084B5358B001B0018E59002B2B2B2B2B737473732B2B2B2B2B -2B2B2B2B2B2B2B2B2B2B2B2B2B2B2BB00345B006456861B006234473B00345B00E456861 -B00E2344B00E45B00F456861B00F23442B01B0144568B01423442B732B2B2B2B2B2B2B2B -2B2B2B2B2B2B2B2B7373737373737373732B732B732B2B2B2B2B73732B2B2B2B732B2B2B -2B00752B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B73747373742B73742B400C3736 -26251F13120D0C0504022C20B003254523452361688A204568208A234460442D2C4B5258 -45441B2121592D2C202045684420B001602045B0467668188A4560442D2CB0122BB00225 -45B00225456AB0408B60B0022523442121212D2CB0132BB0022545B00225456AB8FFC08C -60B0022523442121212D2CB100032545685458B0032545B0032545606820B004252344B0 -042523441BB00325204568208A2344B00325456860B003252344592D2CB0032520456820 -8A2344B00325456860B0032523442D2C4B525845441B2121592D2C462346608A8A462320 -468A608A61B8FF8062232010238AB14B4B8A70456020B0005058B00161B8FFBA8B1BB046 -8C59B0106068013A2D2C2045B003254652583F1B2111592D2C4B53234B515A5820458A60 -441B2121592D2C4B53234B515A58381B2121592D061E061405F005D1047C045D03DD0010 -0000FFE7FFE1FE78FE64FE590394001FFFFF009600AA00B900C600CEFFFFFFFFFFFFFFFF -00BC00C2FFFFFFFF007600B200C000CBFFFFFFFFFFFFFFFFFFFFFFFF0081009400A600CC -00DA00EFFFFFFFFFFFFFFFFF0098009E00AB00B0FFFFFFFFFFFFFFFFFFFFFFFF00900098 -009E00A400A900AE00B300BA00C3FFFF00880091009800A500ACFFFFFFFFFFFFFFFFFFFF -006F0087008F009B00A000D3011DFFFFFFFFFFFF00C3021401C2FFFFFFFF00E9000C02D1 -0173018E001A002C0044005C0073007E008600B200C8014C001A003D00440050005C0072 -0078009200B200B900C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003D0056005D006A -006E00B100B900C1FFFFFFFF002A003D00540064006A00B100B9FFFFFFFFFFFF0071007A -008900A100A700BB006F007A00870091009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -008102210221007400E500B900CA019502C600AC00A700850614000A000005D1001F0000 -045D001F00000000FFE10000FE64FFF50000036202F402A2029100AF026A004C08000100 -0000000002D0000002D000000326012303AC00A8068C00C30516009B089C009505D00073 -022600A403A200B503A20093051600A7068C00D202E9009303A2009902E900FD03A2FFE2 -0516008905160116051600A1051600A70516004D051600BB051600890516009A0516007A -0516007103A2015A03A200E6068C00FE068C00F5068C010C045D00A0080000B00578001A -057C00C805960073062A00C8050F00C8049900C806340073060300C8035E008903A3002C -058B00CD047400C806BE00C805FC00C8064C007304D300C8064C0073059000C805780086 -04EE000005DB00B20578001A07E9005C057B004404EC0006057B007E03A200EF03A20046 -03A200AB068C00BA0516FFFC0516015404CE006804FC00B9042B006904FC006C04C4006A -02D0004404FC006C051000B9023200AF02C1FFC204BC00C1023200BB07C800B9051000B9 -04DB006A04FC00B904FC006C036A00B9042B006E0327003E051000B104BC003D068C0056 -04BC003C04BC003D0434005D051400AD03A2017A051400BB068C00BB0578001A0578001A -05960073050F00C805FC00C8064C007005DB00B204CE006804CE006804CE006804CE0068 -04CE006804CE0068042B006904C4006A04C4006A04C4006A04C4006A023200A00232FFEB -0232FFF502320005051000B904DB006A04DB006A04DB006A04DB006A04DB006A051000B1 -051000B1051000B1051000B1051600BB0456009A0516009F05160089051600AC045D00B9 -0516008904F600B90800009F0800009F07D000AA0516021D0516015A068C00F507E0000E -064C0073080000A1068C00D7068C00FE068C010C0516006C052200BE0516009505D100BB -068C009005A900710516008A045D0097045D0079068C006B07A4006804DB005D045D0071 -03260123068C00D2068C00860516FFDC068C00F305D10032052800A6052800AE068C00B2 -0578001A0578001A064C0073088F007807DA006A051600990800009903ACFFED03AC0096 -0226FFED022600A0068C00D2068C00AC04BC003D04EC000602E4FF9A0516000003A200BA -03A200C20500004405020044051600BB02E900FD0226FFF603ACFFF60C2C00950578001A -050F00C80578001A050F00C8050F00C8035E0089035E005D035E007E035E0089064C0073 -064C0073064C007305DB00B205DB00B205DB00B2023200BB05160136051600ED05160118 -05160113051602210516012D05160161051601560516019F05160132047E001802460018 -05780086042B006E057B007E0434005D03A2017A0634000E04E5006A04EC000604BC003D -04D800C804FC00B9068C00DC068C012304560123045600CF045600CF080000AB080000AB -0800008C0516003C0634007304FC006C035E008905780086042B006E05960073042B0069 -05960073042B006904FC006C0516FFFC02E900FD0578001A04CE00680578001A04CE0068 -062A00C8052E006C0634000E050F00C804C4006A050F00C804C4006A047400C8023200AB -047400C8025E00BB047400C803AB00BB05FC00C8051000B905FC00C8051000B9064C0073 -04DB006A059000C8036A00B9059000C8036A009205780086042B006E04EE00000327003E -04EE00000327003E05DB00B2051000B105DB00B2051000B1057B007E0434005D057B007E -0434005D048800C8064C0073068D006904FC006C04DD006A041A006D050B006A03F8000A -065200680516FFFC04FF0123045D009A094F00C806F7008904E900AF05D8000002E400D5 -047500D5089C00950296000F04D5009202D6008302D6008304D500B102D600700578001A -04CE006805960073042B006905960073042B0069050F00C804C4006A050F00C804C4006A -050F00C804C4006A0634007304FC006C0634007304FC006C0634007304FC006C060300C8 -051000B90603002005100013035E002C0232FFF2035E005F0232FFFC035E008002320001 -035E00890232008E03A3002C02C1FFC2058B00CD04BC00C104BC00C1047400C802320005 -05FC00C8051000B905FC00C8051000B9064C007304DB006A064C007304DB006A059000C8 -036A001B05780086042B006E04EE00000327003E05DB00B2051000B105DB00B2051000B1 -05DB00B2050B00B105DB00B2050B00B107E9005C068C005604EC000604BC003D026700B9 -0578001A04CE006807E0000E07A40068064C007304DB005D03A2015A07E9005C068C0056 -07E9005C068C005607E9005C068C005604EC000604BC003D0226FFED0516FFD005160089 -05BE00B1080000AB0800008C0800008A0800009901B00061051601610516021205160100 -057800070602000006F6000004510000070C000006070000074300000232FFCB0578001A -057C00C805A0001A050F00C8057B007E060300C8035E0089058B00CD057C001A06BE00C8 -05FC00C805310072064C0073060300C804D300C80561007604EE000004EC0006057B0044 -06F700B3068C006C035E007E04EC000604FC006C041A006D051000B9023200A0050D00B1 -04F600B904BC003D03A9006C051000B904FE0089023200BB04BC00C104BC003D051E00B9 -04BC003D0406006804DB006A050000B904100069050D00B104B80030069300B006820071 -02320005050D00B104DB006A050D00B106820071050F00C80657FFFF048800C8059B0073 -05780086035E0089035E007E03A3002C08F2001208D300C8068BFFFF058B00CD04EC0006 -060300C80578001A057C00C8057C00C8048800C805F7000A050F00C807C9002004ED0051 -060100C8060100C8058B00CD05E0001206BE00C8060300C8064C0073060300C804D300C8 -0596007304EE000004EC0006068D0069057B0044061700C805B2008E083E00C8085C00C8 -06440000075D00C8057200C8059C0061084600C805A6002C04CE006804EA007404C200B9 -03C500B904F9000904C4006A0662003404320041051F00B9051F00B904BC00C104F7001D -059200B9051900B904DB006A051900B904FC00B90446006A03F8000A04BC003D06BA006F -04BC003C052800B904D8008E070200B9071A00B90520000A065B00B9049100B904600053 -06B600B904CC004304C4006A0510001303C500B90460006A042B006E023200AF02320005 -02C1FFC20750001D075000B90510001304BC00C104BC003D051900B9048800C803C500B9 -080000CB096000C8051900B904560119045600EF045600E6045600B3045600E6045600F3 -045600C5000000000000000000000000000000000674007304DB006A060D00B2054700B1 -0000020900000221000001540000021D0516013605160003051601360516012505160142 -051601420516014205160125051602090516013605160142051601420516014205160142 -051601360578001A04CE00680578001A04CE00680578001A04CE00680578001A04CEFFE3 -0578001A04CE00680578001A04CE00680578001A04CE00680578001A04CE00680578001A -04CE00680578001A04CE00680578001A04CE00680578001A04CE0068050F00C804C4006A -050F00C804C4006A050F00C804C4006A050F00C804C4006A050F002904C4FFFC050F00C8 -04C4006A050F00C804C4006A050F00C804C4006A035E008902320096035E0089023200AF + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 1200 900 +userdict begin +DisplayImage +0 0 +1200 900 +12.000000 +1200 900 +0 +0 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF... [truncated message content] |
From: <fer...@us...> - 2007-10-14 21:14:22
|
Revision: 3946 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3946&view=rev Author: fer_perez Date: 2007-10-14 14:14:18 -0700 (Sun, 14 Oct 2007) Log Message: ----------- Directory reorg Added Paths: ----------- trunk/py4science/tools/course_checklist.py trunk/py4science/tools/course_checklist_umich.py Removed Paths: ------------- trunk/py4science/course_checklist.py trunk/py4science/course_checklist_umich.py Deleted: trunk/py4science/course_checklist.py =================================================================== --- trunk/py4science/course_checklist.py 2007-10-14 21:13:52 UTC (rev 3945) +++ trunk/py4science/course_checklist.py 2007-10-14 21:14:18 UTC (rev 3946) @@ -1,15 +0,0 @@ -#!/usr/bin/env python -"""Minimal test script to check for modules needed in python course""" - -modules = ['numpy','scipy','matplotlib','IPython','mayavi','pyvtk','Image', - 'visual'] - -for mname in modules: - try: - exec "import %s" % mname - except ImportError: - print '*** ERROR: module %s could not be imported.' % mname - else: - print '%s: OK' % mname - -print 'Also remember to check that SPE is installed.' Deleted: trunk/py4science/course_checklist_umich.py =================================================================== --- trunk/py4science/course_checklist_umich.py 2007-10-14 21:13:52 UTC (rev 3945) +++ trunk/py4science/course_checklist_umich.py 2007-10-14 21:14:18 UTC (rev 3946) @@ -1,15 +0,0 @@ -#!/usr/bin/env python -"""Minimal test script to check for modules needed in python course""" - -modules = ['numpy','scipy','matplotlib','IPython'] - - -for mname in modules: - try: - exec "import %s" % mname - except ImportError: - print '*** ERROR: module %s could not be imported.' % mname - else: - print '%s: OK' % mname - -print 'Also remember to check that SPE is installed.' Copied: trunk/py4science/tools/course_checklist.py (from rev 3944, trunk/py4science/course_checklist.py) =================================================================== --- trunk/py4science/tools/course_checklist.py (rev 0) +++ trunk/py4science/tools/course_checklist.py 2007-10-14 21:14:18 UTC (rev 3946) @@ -0,0 +1,15 @@ +#!/usr/bin/env python +"""Minimal test script to check for modules needed in python course""" + +modules = ['numpy','scipy','matplotlib','IPython','mayavi','pyvtk','Image', + 'visual'] + +for mname in modules: + try: + exec "import %s" % mname + except ImportError: + print '*** ERROR: module %s could not be imported.' % mname + else: + print '%s: OK' % mname + +print 'Also remember to check that SPE is installed.' Copied: trunk/py4science/tools/course_checklist_umich.py (from rev 3944, trunk/py4science/course_checklist_umich.py) =================================================================== --- trunk/py4science/tools/course_checklist_umich.py (rev 0) +++ trunk/py4science/tools/course_checklist_umich.py 2007-10-14 21:14:18 UTC (rev 3946) @@ -0,0 +1,15 @@ +#!/usr/bin/env python +"""Minimal test script to check for modules needed in python course""" + +modules = ['numpy','scipy','matplotlib','IPython'] + + +for mname in modules: + try: + exec "import %s" % mname + except ImportError: + print '*** ERROR: module %s could not be imported.' % mname + else: + print '%s: OK' % mname + +print 'Also remember to check that SPE is installed.' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-17 01:15:49
|
Revision: 3959 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3959&view=rev Author: jdh2358 Date: 2007-10-16 18:15:48 -0700 (Tue, 16 Oct 2007) Log Message: ----------- made a classes dir for course specific items Modified Paths: -------------- trunk/py4science/examples/distributions.py trunk/py4science/examples/logistic/maplib.pyc Added Paths: ----------- trunk/py4science/classes/ trunk/py4science/classes/course_checklist_umich.py trunk/py4science/classes/pomona_agenda.doc trunk/py4science/classes/pomona_agenda.txt Copied: trunk/py4science/classes/course_checklist_umich.py (from rev 3942, trunk/py4science/course_checklist_umich.py) =================================================================== --- trunk/py4science/classes/course_checklist_umich.py (rev 0) +++ trunk/py4science/classes/course_checklist_umich.py 2007-10-17 01:15:48 UTC (rev 3959) @@ -0,0 +1,15 @@ +#!/usr/bin/env python +"""Minimal test script to check for modules needed in python course""" + +modules = ['numpy','scipy','matplotlib','IPython'] + + +for mname in modules: + try: + exec "import %s" % mname + except ImportError: + print '*** ERROR: module %s could not be imported.' % mname + else: + print '%s: OK' % mname + +print 'Also remember to check that SPE is installed.' Added: trunk/py4science/classes/pomona_agenda.doc =================================================================== (Binary files differ) Property changes on: trunk/py4science/classes/pomona_agenda.doc ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/py4science/classes/pomona_agenda.txt =================================================================== --- trunk/py4science/classes/pomona_agenda.txt (rev 0) +++ trunk/py4science/classes/pomona_agenda.txt 2007-10-17 01:15:48 UTC (rev 3959) @@ -0,0 +1,45 @@ +DAY 1: + +Introduction: + + 35 min : Scientific computing in python (standard overhead talk) + + 45 min: The core tools -- ipython, numpy, matplotlib and scipy. (type along) + +Break: 15 min + +Exercises session 1: + + 45 min: Working with data files, web based resources, date handling, + CSV files, and record arrays. Word counting exercise. + (urllib, csv, dateutils, matplotlib.mlab) + + 45 min: Numerical integration, trapz and Newton's quadrature (scipy.integrate) + +Lunch Break: 45 min + +Exercises session 2: + + 45 min: Linear algebra: Moire Glass patterns + + 45 min: Statisical distributions, random numbers, central limit theorem (scipy.stats) + + 45 min: Descriptive statistics and graphs: mean, variance, skew, + kurtosis, histograms, autocorrelation, power spectra, + spectrogram (scipy.stats, matplotlib.mlab and pylab) + +Break: 15 min + +Exercises session 3: + + 60 min: Interpolation, data modeling and optimization (scipy.interpolate and scipy.optimize) + + 45 min: Using code from other languages (FORTRAN, C, C++) -- + Presentation (pyrex, weave, f2py, ctypes) + + +DAY 2: + +Exercise Session 4: + + 45 minutes: screen scraping - extracting data from web pages (BeautifulSoup) \ No newline at end of file Modified: trunk/py4science/examples/distributions.py =================================================================== --- trunk/py4science/examples/distributions.py 2007-10-16 19:39:57 UTC (rev 3958) +++ trunk/py4science/examples/distributions.py 2007-10-17 01:15:48 UTC (rev 3959) @@ -4,7 +4,7 @@ source using the random number generator. Verify the numerical results by plotting the analytical density functions from scipy.stats """ -import numpy +import numpy as npy import scipy.stats from pylab import figure, show, close @@ -18,14 +18,14 @@ # in each time interval, the probability of an emission rate = 20. # the emission rate in Hz -dx = 0.001 # the sampling interval in seconds -t = numpy.arange(N)*dx # the time vector +dt = 0.001 # the sampling interval in seconds +t = npy.arange(N)*dt # the time vector # the probability of an emission is proportionate to the rate and the interval -emit_times = t[uninse < rate*dx] +emit_times = t[uninse < rate*dt] # the difference in the emission times is the wait time -wait_times = numpy.diff(emit_times) +wait_times = npy.diff(emit_times) # plot the distribution of waiting times and the expected exponential # density function lambda exp( lambda wt) where lambda is the rate @@ -37,7 +37,7 @@ fig = figure() ax = fig.add_subplot(111) p, bins, patches = ax.hist(wait_times, 100, normed=True) -l1, = ax.plot(bins, rate*numpy.exp(-rate * bins), lw=2, color='red') +l1, = ax.plot(bins, rate*npy.exp(-rate * bins), lw=2, color='red') l2, = ax.plot(bins, scipy.stats.expon.pdf(bins, 0, 1./rate), lw=2, ls='--', color='green') ax.set_xlabel('waiting time') @@ -53,7 +53,7 @@ # gamma distribution. Use scipy.stats.gamma to compare the fits. # Hint: you can stride your emission times array to get every 2nd # emission -wait_times2 = numpy.diff(emit_times[::2]) +wait_times2 = npy.diff(emit_times[::2]) fig = figure() ax = fig.add_subplot(111) p, bins, patches = ax.hist(wait_times2, 100, normed=True) @@ -79,8 +79,8 @@ # variance expon_mean, expon_var = scipy.stats.expon(0, 1./rate).stats() mu, var = 10*expon_mean, 10*expon_var -sigma = numpy.sqrt(var) -wait_times10 = numpy.diff(emit_times[::10]) +sigma = npy.sqrt(var) +wait_times10 = npy.diff(emit_times[::10]) fig = figure() ax = fig.add_subplot(111) p, bins, patches = ax.hist(wait_times10, 100, normed=True) Modified: trunk/py4science/examples/logistic/maplib.pyc =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-20 17:57:39
|
Revision: 3971 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3971&view=rev Author: jdh2358 Date: 2007-10-20 10:57:36 -0700 (Sat, 20 Oct 2007) Log Message: ----------- added files workbook Added Paths: ----------- trunk/py4science/examples/skel/noisy_sine_skel.py trunk/py4science/workbook/fig/noisy_sine.eps trunk/py4science/workbook/fig/noisy_sine.png trunk/py4science/workbook/files_etc.tex Added: trunk/py4science/examples/skel/noisy_sine_skel.py =================================================================== --- trunk/py4science/examples/skel/noisy_sine_skel.py (rev 0) +++ trunk/py4science/examples/skel/noisy_sine_skel.py 2007-10-20 17:57:36 UTC (rev 3971) @@ -0,0 +1,22 @@ +from scipy import arange, sin, pi, randn, zeros +import pylab as p + +a = 2 # 2 volt amplitude +f = 10 # 10 Hz frequency +sigma = 0.5 # 0.5 volt standard deviation noise + +# create the t and v arrays; see the scipy commands arange, sin, and randn +t = XXX # an evenly sampled time array +v = XXX # a noisy sine wave + +# create a 2D array X and put t in the 1st column and v in the 2nd; +# see the numpy command zeros +X = XXX + +# save the output file as ASCII; see the pylab command save +XXX + +# plot the arrays t vs v and label the x-axis, y-axis and title save +# the output figure as noisy_sine.png. See the pylab commands plot, +# xlabel, ylabel, grid, show +XXX Added: trunk/py4science/workbook/fig/noisy_sine.eps =================================================================== --- trunk/py4science/workbook/fig/noisy_sine.eps (rev 0) +++ trunk/py4science/workbook/fig/noisy_sine.eps 2007-10-20 17:57:36 UTC (rev 3971) @@ -0,0 +1,954 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: noisy_sine.eps +%%Creator: matplotlib version 0.90.1, http://matplotlib.sourceforge.net/ +%%CreationDate: Sat Oct 20 11:42:38 2007 +%%Orientation: portrait +%%BoundingBox: 18 180 594 612 +%%EndComments +%%BeginProlog +/mpldict 7 dict def +mpldict begin +/m { moveto } bind def +/l { lineto } bind def +/r { rlineto } bind def +/box { +m +1 index 0 r +0 exch r +neg 0 r +closepath +} bind def +/clipbox { +box +clip +newpath +} bind def +/ellipse { +newpath +matrix currentmatrix 7 1 roll +translate +scale +0 0 1 5 3 roll arc +setmatrix +closepath +} bind def +%!PS-Adobe-3.0 Resource-Font +%%Title: Bitstream Vera Sans +%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%%Creator: Converted from TrueType by PPR +25 dict begin +/_d{bind def}bind def +/_m{moveto}_d +/_l{lineto}_d +/_cl{closepath eofill}_d +/_c{curveto}_d +/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d +/_e{exec}_d +/FontName /BitstreamVeraSans-Roman def +/PaintType 0 def +/FontMatrix[.001 0 0 .001 0 0]def +/FontBBox[-182 -235 1287 928]def +/FontType 3 def +/Encoding StandardEncoding def +/FontInfo 10 dict dup begin +/FamilyName (Bitstream Vera Sans) def +/FullName (Bitstream Vera Sans) def +/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def +/Weight (Roman) def +/Version (Release 1.10) def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -213 def +/UnderlineThickness 143 def +end readonly def +/CharStrings 25 dict dup begin +/space{318 0 0 0 0 0 _sc +}_d +/parenleft{390 0 86 -131 310 759 _sc +310 759 _m +266 683 234 609 213 536 _c +191 463 181 389 181 314 _c +181 238 191 164 213 91 _c +234 17 266 -56 310 -131 _c +232 -131 _l +183 -54 146 20 122 94 _c +98 168 86 241 86 314 _c +86 386 98 459 122 533 _c +146 607 182 682 232 759 _c +310 759 _l +_cl}_d +/parenright{390 0 80 -131 304 759 _sc +80 759 _m +158 759 _l +206 682 243 607 267 533 _c +291 459 304 386 304 314 _c +304 241 291 168 267 94 _c +243 20 206 -54 158 -131 _c +80 -131 _l +123 -56 155 17 177 91 _c +198 164 209 238 209 314 _c +209 389 198 463 177 536 _c +155 609 123 683 80 759 _c +_cl}_d +/hyphen{361 0 49 234 312 314 _sc +49 314 _m +312 314 _l +312 234 _l +49 234 _l +49 314 _l +_cl}_d +/period{318 0 107 0 210 124 _sc +107 124 _m +210 124 _l +210 0 _l +107 0 _l +107 124 _l +_cl}_d +/zero{636 0 66 -13 570 742 _sc +318 664 _m +267 664 229 639 203 589 _c +177 539 165 464 165 364 _c +165 264 177 189 203 139 _c +229 89 267 64 318 64 _c +369 64 407 89 433 139 _c +458 189 471 264 471 364 _c +471 464 458 539 433 589 _c +407 639 369 664 318 664 _c +318 742 _m +399 742 461 709 505 645 _c +548 580 570 486 570 364 _c +570 241 548 147 505 83 _c +461 19 399 -13 318 -13 _c +236 -13 173 19 130 83 _c +87 147 66 241 66 364 _c +66 486 87 580 130 645 _c +173 709 236 742 318 742 _c +_cl}_d +/one{636 0 110 0 544 729 _sc +124 83 _m +285 83 _l +285 639 _l +110 604 _l +110 694 _l +284 729 _l +383 729 _l +383 83 _l +544 83 _l +544 0 _l +124 0 _l +124 83 _l +_cl}_d +/two{{636 0 73 0 536 742 _sc +192 83 _m +536 83 _l +536 0 _l +73 0 _l +73 83 _l +110 121 161 173 226 239 _c +290 304 331 346 348 365 _c +380 400 402 430 414 455 _c +426 479 433 504 433 528 _c +433 566 419 598 392 622 _c +365 646 330 659 286 659 _c +255 659 222 653 188 643 _c +154 632 117 616 78 594 _c +78 694 _l +118 710 155 722 189 730 _c +223 738 255 742 284 742 _c +359 742 419 723 464 685 _c +509 647 532 597 532 534 _c +532 504 526 475 515 449 _c +504 422 484 390 454 354 _c +446 344 420 317 376 272 _c +332 227 271 164 192 83 _c +_cl}_e}_d +/three{{636 0 76 -13 556 742 _sc +406 393 _m +453 383 490 362 516 330 _c +542 298 556 258 556 212 _c +556 140 531 84 482 45 _c +432 6 362 -13 271 -13 _c +240 -13 208 -10 176 -4 _c +144 1 110 10 76 22 _c +76 117 _l +103 101 133 89 166 81 _c +198 73 232 69 268 69 _c +330 69 377 81 409 105 _c +441 129 458 165 458 212 _c +458 254 443 288 413 312 _c +383 336 341 349 287 349 _c +202 349 _l +202 430 _l +291 430 _l +339 430 376 439 402 459 _c +428 478 441 506 441 543 _c +441 580 427 609 401 629 _c +374 649 336 659 287 659 _c +260 659 231 656 200 650 _c +169 644 135 635 98 623 _c +98 711 _l +135 721 170 729 203 734 _c +235 739 266 742 296 742 _c +}_e{370 742 429 725 473 691 _c +517 657 539 611 539 553 _c +539 513 527 479 504 451 _c +481 423 448 403 406 393 _c +_cl}_e}_d +/four{636 0 49 0 580 729 _sc +378 643 _m +129 254 _l +378 254 _l +378 643 _l +352 729 _m +476 729 _l +476 254 _l +580 254 _l +580 172 _l +476 172 _l +476 0 _l +378 0 _l +378 172 _l +49 172 _l +49 267 _l +352 729 _l +_cl}_d +/five{{636 0 77 -13 549 729 _sc +108 729 _m +495 729 _l +495 646 _l +198 646 _l +198 467 _l +212 472 227 476 241 478 _c +255 480 270 482 284 482 _c +365 482 429 459 477 415 _c +525 370 549 310 549 234 _c +549 155 524 94 475 51 _c +426 8 357 -13 269 -13 _c +238 -13 207 -10 175 -6 _c +143 -1 111 6 77 17 _c +77 116 _l +106 100 136 88 168 80 _c +199 72 232 69 267 69 _c +323 69 368 83 401 113 _c +433 143 450 183 450 234 _c +450 284 433 324 401 354 _c +368 384 323 399 267 399 _c +241 399 214 396 188 390 _c +162 384 135 375 108 363 _c +108 729 _l +_cl}_e}_d +/A{684 0 8 0 676 729 _sc +342 632 _m +208 269 _l +476 269 _l +342 632 _l +286 729 _m +398 729 _l +676 0 _l +573 0 _l +507 187 _l +178 187 _l +112 0 _l +8 0 _l +286 729 _l +_cl}_d +/V{684 0 8 0 676 729 _sc +286 0 _m +8 729 _l +111 729 _l +342 115 _l +573 729 _l +676 729 _l +398 0 _l +286 0 _l +_cl}_d +/a{{613 0 60 -13 522 560 _sc +343 275 _m +270 275 220 266 192 250 _c +164 233 150 205 150 165 _c +150 133 160 107 181 89 _c +202 70 231 61 267 61 _c +317 61 357 78 387 114 _c +417 149 432 196 432 255 _c +432 275 _l +343 275 _l +522 312 _m +522 0 _l +432 0 _l +432 83 _l +411 49 385 25 355 10 _c +325 -5 287 -13 243 -13 _c +187 -13 142 2 109 33 _c +76 64 60 106 60 159 _c +60 220 80 266 122 298 _c +163 329 224 345 306 345 _c +432 345 _l +432 354 _l +432 395 418 427 391 450 _c +364 472 326 484 277 484 _c +245 484 215 480 185 472 _c +155 464 127 453 100 439 _c +100 522 _l +}_e{132 534 164 544 195 550 _c +226 556 256 560 286 560 _c +365 560 424 539 463 498 _c +502 457 522 395 522 312 _c +_cl}_e}_d +/e{{615 0 55 -13 562 560 _sc +562 296 _m +562 252 _l +149 252 _l +153 190 171 142 205 110 _c +238 78 284 62 344 62 _c +378 62 412 66 444 74 _c +476 82 509 95 541 113 _c +541 28 _l +509 14 476 3 442 -3 _c +408 -9 373 -13 339 -13 _c +251 -13 182 12 131 62 _c +80 112 55 181 55 268 _c +55 357 79 428 127 481 _c +175 533 241 560 323 560 _c +397 560 455 536 498 489 _c +540 441 562 377 562 296 _c +472 322 _m +471 371 457 410 431 440 _c +404 469 368 484 324 484 _c +274 484 234 469 204 441 _c +174 413 156 373 152 322 _c +472 322 _l +_cl}_e}_d +/i{278 0 94 0 184 760 _sc +94 547 _m +184 547 _l +184 0 _l +94 0 _l +94 547 _l +94 760 _m +184 760 _l +184 646 _l +94 646 _l +94 760 _l +_cl}_d +/l{278 0 94 0 184 760 _sc +94 760 _m +184 760 _l +184 0 _l +94 0 _l +94 760 _l +_cl}_d +/m{{974 0 91 0 889 560 _sc +520 442 _m +542 482 569 511 600 531 _c +631 550 668 560 711 560 _c +767 560 811 540 842 500 _c +873 460 889 403 889 330 _c +889 0 _l +799 0 _l +799 327 _l +799 379 789 418 771 444 _c +752 469 724 482 686 482 _c +639 482 602 466 575 435 _c +548 404 535 362 535 309 _c +535 0 _l +445 0 _l +445 327 _l +445 379 435 418 417 444 _c +398 469 369 482 331 482 _c +285 482 248 466 221 435 _c +194 404 181 362 181 309 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +201 495 226 520 255 536 _c +283 552 317 560 357 560 _c +397 560 430 550 458 530 _c +486 510 506 480 520 442 _c +}_e{_cl}_e}_d +/n{634 0 91 0 549 560 _sc +549 330 _m +549 0 _l +459 0 _l +459 327 _l +459 379 448 417 428 443 _c +408 469 378 482 338 482 _c +289 482 251 466 223 435 _c +195 404 181 362 181 309 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +202 494 227 519 257 535 _c +286 551 320 560 358 560 _c +420 560 468 540 500 501 _c +532 462 549 405 549 330 _c +_cl}_d +/o{612 0 55 -13 557 560 _sc +306 484 _m +258 484 220 465 192 427 _c +164 389 150 338 150 273 _c +150 207 163 156 191 118 _c +219 80 257 62 306 62 _c +354 62 392 80 420 118 _c +448 156 462 207 462 273 _c +462 337 448 389 420 427 _c +392 465 354 484 306 484 _c +306 560 _m +384 560 445 534 490 484 _c +534 433 557 363 557 273 _c +557 183 534 113 490 63 _c +445 12 384 -13 306 -13 _c +227 -13 165 12 121 63 _c +77 113 55 183 55 273 _c +55 363 77 433 121 484 _c +165 534 227 560 306 560 _c +_cl}_d +/s{{521 0 54 -13 472 560 _sc +443 531 _m +443 446 _l +417 458 391 468 364 475 _c +336 481 308 485 279 485 _c +234 485 200 478 178 464 _c +156 450 145 430 145 403 _c +145 382 153 366 169 354 _c +185 342 217 330 265 320 _c +296 313 _l +360 299 405 279 432 255 _c +458 230 472 195 472 151 _c +472 100 452 60 412 31 _c +372 1 316 -13 246 -13 _c +216 -13 186 -10 154 -5 _c +122 0 89 8 54 20 _c +54 113 _l +87 95 120 82 152 74 _c +184 65 216 61 248 61 _c +290 61 323 68 346 82 _c +368 96 380 117 380 144 _c +380 168 371 187 355 200 _c +339 213 303 226 247 238 _c +216 245 _l +160 257 119 275 95 299 _c +70 323 58 356 58 399 _c +58 450 76 490 112 518 _c +148 546 200 560 268 560 _c +}_e{301 560 332 557 362 552 _c +391 547 418 540 443 531 _c +_cl}_e}_d +/t{392 0 27 0 368 702 _sc +183 702 _m +183 547 _l +368 547 _l +368 477 _l +183 477 _l +183 180 _l +183 135 189 106 201 94 _c +213 81 238 75 276 75 _c +368 75 _l +368 0 _l +276 0 _l +206 0 158 13 132 39 _c +106 65 93 112 93 180 _c +93 477 _l +27 477 _l +27 547 _l +93 547 _l +93 702 _l +183 702 _l +_cl}_d +/v{592 0 30 0 562 547 _sc +30 547 _m +125 547 _l +296 88 _l +467 547 _l +562 547 _l +357 0 _l +235 0 _l +30 547 _l +_cl}_d +/w{818 0 42 0 776 547 _sc +42 547 _m +132 547 _l +244 120 _l +356 547 _l +462 547 _l +574 120 _l +686 547 _l +776 547 _l +633 0 _l +527 0 _l +409 448 _l +291 0 _l +185 0 _l +42 547 _l +_cl}_d +/y{592 0 30 -207 562 547 _sc +322 -50 _m +296 -114 271 -157 247 -177 _c +223 -197 191 -207 151 -207 _c +79 -207 _l +79 -132 _l +132 -132 _l +156 -132 175 -126 189 -114 _c +203 -102 218 -75 235 -31 _c +251 9 _l +30 547 _l +125 547 _l +296 119 _l +467 547 _l +562 547 _l +322 -50 _l +_cl}_d +end readonly def + +/BuildGlyph + {exch begin + CharStrings exch + 2 copy known not{pop /.notdef}if + true 3 1 roll get exec + end}_d + +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +}_d + +FontName currentdict end definefont pop +%%EOF +end +%%EndProlog +mpldict begin +18 180 translate +576 432 0 0 clipbox +1.000 setgray +1.000 setlinewidth +0 setlinejoin +2 setlinecap +[] 0 setdash +0 0 m +0 432 l +576 432 l +576 0 l +closepath +gsave +fill +grestore +stroke +0.000 setgray +72 43.2 m +72 388.8 l +518.4 388.8 l +518.4 43.2 l +closepath +gsave +1.000 setgray +fill +grestore +stroke +0.000 0.000 1.000 setrgbcolor +gsave +446.4 345.6 72 43.2 clipbox +72 192.08 m +76.464 314.444 l +80.928 238.206 l +85.392 145.963 l +89.856 52.5249 l +94.32 177.605 l +98.784 244.507 l +103.248 225.898 l +107.712 141.274 l +112.176 101.132 l +116.64 221.273 l +121.104 220.387 l +125.568 198.393 l +130.032 110.626 l +134.496 87.2167 l +138.96 172.301 l +143.424 288.57 l +147.888 223.822 l +152.352 109.895 l +156.816 99.5877 l +161.28 161.557 l +165.744 327.85 l +170.208 226.413 l +174.672 119.61 l +179.136 160.455 l +183.6 170.923 l +188.064 276.783 l +192.528 252.279 l +196.992 93.6217 l +201.456 102.264 l +205.92 231.631 l +210.384 344.07 l +214.848 237.692 l +219.312 118.454 l +223.776 88.4453 l +228.24 156.313 l +232.704 288.34 l +237.168 265.415 l +241.632 167.558 l +246.096 89.9739 l +250.56 176.91 l +255.024 291.251 l +259.488 263.848 l +263.952 152.691 l +268.416 113.887 l +272.88 209.028 l +277.344 335.703 l +281.808 269.446 l +286.272 94.2113 l +290.736 103.596 l +295.2 177.029 l +299.664 270.441 l +304.128 238.945 l +308.592 118.646 l +313.056 125.076 l +317.52 184.406 l +321.984 271.919 l +326.448 271.253 l +330.912 119.814 l +335.376 72.1308 l +339.84 129.271 l +344.304 273.684 l +348.768 291.815 l +353.232 113.503 l +357.696 77.032 l +362.16 204.519 l +366.624 272.078 l +371.088 226.513 l +375.552 141.138 l +380.016 95.2778 l +384.48 204.455 l +388.944 287.641 l +393.408 229.498 l +397.872 126.356 l +402.336 106.437 l +406.8 210.134 l +411.264 265.254 l +415.728 240.776 l +420.192 105.556 l +424.656 141.974 l +429.12 200.065 l +433.584 290.119 l +438.048 258.193 l +442.512 168.972 l +446.976 59.1563 l +451.44 194.952 l +455.904 311.614 l +460.368 199.751 l +464.832 132.967 l +469.296 76.716 l +473.76 232.12 l +478.224 278.764 l +482.688 217.446 l +487.152 148.717 l +491.616 86.2078 l +496.08 175.329 l +500.544 272.56 l +505.008 227.057 l +509.472 80.2823 l +513.936 93.877 l +stroke +grestore +0.000 setgray +/BitstreamVeraSans-Roman findfont +12.000 scalefont +setfont +63.25 30.122 m +0 0.172 rmoveto +(0.0) show +0.500 setlinewidth +0 setlinecap +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +183.6 43.2 m +183.6 388.8 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +-0.5 0 m +-0.5 4 l +closepath +stroke +grestore } bind def +183.6 43.2 o +/o { gsave +newpath +translate +-0.5 -4 m +-0.5 0 l +closepath +stroke +grestore } bind def +183.6 388.8 o +174.975 30.122 m +0 0.172 rmoveto +(0.5) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +295.2 43.2 m +295.2 388.8 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +-0.5 0 m +-0.5 4 l +closepath +stroke +grestore } bind def +295.2 43.2 o +/o { gsave +newpath +translate +-0.5 -4 m +-0.5 0 l +closepath +stroke +grestore } bind def +295.2 388.8 o +286.708 30.122 m +0 0.172 rmoveto +(1.0) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +406.8 43.2 m +406.8 388.8 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +-0.5 0 m +-0.5 4 l +closepath +stroke +grestore } bind def +406.8 43.2 o +/o { gsave +newpath +translate +-0.5 -4 m +-0.5 0 l +closepath +stroke +grestore } bind def +406.8 388.8 o +398.433 30.278 m +0 0.172 rmoveto +(1.5) show +509.689 30.122 m +0 0.172 rmoveto +(2.0) show +272.442 14.419 m +0 1.578 rmoveto +(time \(s\)) show +57.594 38.661 m +0 0.172 rmoveto +(-3) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 92.5714 m +518.4 92.5714 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 92.5714 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 92.5714 o +57.828 88.118 m +(-2) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 141.943 m +518.4 141.943 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 141.943 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 141.943 o +57.734 137.568 m +(-1) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 191.314 m +518.4 191.314 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 191.314 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 191.314 o +61.953 186.775 m +0 0.172 rmoveto +(0) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 240.686 m +518.4 240.686 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 240.686 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 240.686 o +62.781 236.311 m +(1) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 290.057 m +518.4 290.057 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 290.057 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 290.057 o +62.438 285.604 m +(2) show +[1 3] 0 setdash +gsave +446.4 345.6 72 43.2 clipbox +72 339.429 m +518.4 339.429 l +stroke +grestore +[] 0 setdash +/o { gsave +newpath +translate +0 0.5 m +4 0.5 l +closepath +stroke +grestore } bind def +72 339.429 o +/o { gsave +newpath +translate +-4 0.5 m +0 0.5 l +closepath +stroke +grestore } bind def +518.4 339.429 o +62.25 334.89 m +0 0.172 rmoveto +(3) show +61.625 384.425 m +(4) show +52.594 191.453 m +gsave +90 rotate +0 1.578 rmoveto +(volts \(V\)) show +grestore +1.000 setlinewidth +2 setlinecap +72 43.2 m +518.4 43.2 l +518.4 388.8 l +72 388.8 l +72 43.2 l +stroke +/BitstreamVeraSans-Roman findfont +14.000 scalefont +setfont +232.848 395.712 m +0 2.906 rmoveto +(A noisy sine wave) show + +end +showpage Added: trunk/py4science/workbook/fig/noisy_sine.png =================================================================== (Binary files differ) Property changes on: trunk/py4science/workbook/fig/noisy_sine.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/py4science/workbook/files_etc.tex =================================================================== --- trunk/py4science/workbook/files_etc.tex (rev 0) +++ trunk/py4science/workbook/files_etc.tex 2007-10-20 17:57:36 UTC (rev 3971) @@ -0,0 +1,117 @@ +\section{Working with files, the web, arrays, etc\dots} +\label{sec:working_with_files} + +This section is a general overview to show how easy it is to load +and manipulate data on the file system and over the web using python's +built in data structures and numpy arrays. The goal is to exercise +basic programming skills like building filename or web addresses to +automate certain tasks like loading a series of data files or +downloading a bunch of related files off the web, as well as to +illustrate basic numpy and pylab skills. + +\subsection{Loading and saving ASCII data} +\label{sec:ascii_data} + +The simplest file format is a plain text ASCII file of numbers. +Although there are many better formats out there for saveing and +loading data, this format is extremely common because it has the +advantages of being human readable, and thus will survive the test of +time as the \textit{en vogue} programming languages, analysis +applications and data formats come and go, it is easy to parse, and it +is supported by almost all languages and applications. + +In this exercise we will create a data set of two arrays, the first +one regularly sampled time \textit{t} from 0..2 seconds with 20~ms +time step , and the second one an array \texttt{v} of sinusoidal +voltages corrupted by some noise. Let's assume the sine wave has +amplitude 2~V, frequency 10~Hz, and zero mean Gaussian distrubuted +white noise with standard deviation 0.5~V. Your task is to write two +scripts. + +The first script should create the vectors \texttt{t} and \texttt{v}, +plot the time series of \texttt{t} versus \texttt{v}, save them in a +two dimensional numpy array \texttt{X}, and then dump the array +\texttt{X} to a plain text ASCII file called +\texttt{'noisy_sine.dat'}. The file will look like (not identical +because of the noise) + +\begin{verbatim} +0.000000000000000000e+00 1.550947826934816025e-02 +2.000000000000000042e-02 2.493944587057004725e+00 +4.000000000000000083e-02 9.497694074551737975e-01 +5.999999999999999778e-02 -9.185779287524413750e-01 +8.000000000000000167e-02 -2.811127590689064704e+00 +... and so on +\end{verbatim} + +Here is the exercise skeleton of the script to create and plot the +data file + +\lstinputlisting[label=code:noisy_sine_skel,caption={IGNORED}]{skel/noise_sine_skel.py} + +and the graph will look something like Figure~\ref{fig:noisy_sine} + +\begin{center}% +\begin{figure} +\begin{centering}\includegraphics[width=4in]{fig/noise_sine}\par\end{centering} + + +\caption{\label{fig:noisy_sine}A 10~Hz sine wave corrupted by noise} +\end{figure} +\par\end{center} + +The second part of this exercise is to write a script which loads data +from the data file into an array \texttt{X}, extracts the columns into +arrays \texttt{t} and \texttt{v}, and computes the RMS +(root-mean-square) intensity of the signal using the \textt{load} +command. + + +\subsection{Loading and saving binary data} +\label{sec:binary_data} + +ASCII is bloated and slow for working with large arrays, and so binary +data should be used if performance is a consideration. To save the +array \texttt{X} in binary form, use the numpy \texttt{tostring} method + +\begin{lstlisting} +# open the file for writing binary and write the binary string +file('../data/binary_data.dat', 'wb').write(X.tostring()) +\end{lstlisting} + +\noindent This data can later be loaded into a numpy array using +\texttt{fromstring}. This method takes two arguments, a string and a +data type (note that numarray users can use \texttt{fromfile} which is +more efficient for importing data directly from a file). + +\lstinputlisting{code/load_binary_data.py} + +\noindent Note that although Numpy and numarray use different +typecode arguments (Numeric uses strings whereas numarray uses type +objects), the matplotlib.numpy compatibility layer provides symbols +which will work with either \rc{numpy} rc setting. + +\subsection{Processing several data files} +\label{sec:multiple_files} + +Since python is a programming language \textit{par excellence}, it is +easy to process data in batch. When I started the gradual transition +from a full time \matlab\ user to a full time python user, I began +processing my data in python and saving the results to data files for +plotting in \matlab. When that became too cumbersome, I decided to +write matplotlib so I could have all the functionality I needed in one +environment. Here is a brief example showing how to iterate over +several data files, named \fname{basename001.dat, basename002.dat, + basename003.dat, ... basename100.dat} and plot all of the traces to +the same axes. I'll assume for this example that each file is a 1D +ASCII array, which I can load with the \texttt{load} command. + +\begin{lstlisting} +hold(True) # set the hold state to be on +for i in range(1,101): #start at 1, end at 100 + fname = 'basename%03d.dat'%i # %03d pads the integers with zeros + x = load(fname) + plot(x) +\end{lstlisting} + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-21 20:57:56
|
Revision: 3977 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3977&view=rev Author: jdh2358 Date: 2007-10-21 13:57:54 -0700 (Sun, 21 Oct 2007) Log Message: ----------- added glass moire pattern example Added Paths: ----------- trunk/py4science/examples/glass_dots1.py trunk/py4science/examples/skel/glass_dots_skel.py trunk/py4science/workbook/fig/glass_dots1.eps trunk/py4science/workbook/fig/glass_dots1.png Added: trunk/py4science/examples/glass_dots1.py =================================================================== --- trunk/py4science/examples/glass_dots1.py (rev 0) +++ trunk/py4science/examples/glass_dots1.py 2007-10-21 20:57:54 UTC (rev 3977) @@ -0,0 +1,95 @@ +""" +Moire patterns from random dot fields + +http://en.wikipedia.org/wiki/Moir%C3%A9_pattern + +See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). +""" +from numpy import cos, sin, pi, matrix +import numpy as npy +import numpy.linalg as linalg +from pylab import figure, show + +def csqrt(x): + """ + sqrt func that handles returns sqrt(x)j for x<0 + """ + if x<0: return complex(0, npy.sqrt(abs(x))) + else: return npy.sqrt(x) + +def myeig(M): + """ + compute eigen values and eigenvectors analytically + + Solve quadratic: + + lamba^2 - tau*lambda + Delta = 0 + + where tau = trace(M) and Delta = Determinant(M) + + """ + + a,b = M[0,0], M[0,1] + c,d = M[1,0], M[1,1] + tau = a+d # the trace + delta = a*d-b*c # the determinant + + lambda1 = (tau + csqrt(tau**2 - 4*delta))/2. + lambda2 = (tau - csqrt(tau**2 - 4*delta))/2. + return lambda1, lambda2 + +# 2000 random x,y points in the interval[-0.5 ... 0.5] +X1 = matrix(npy.random.rand(2,2000))-0.5 + +name = 'saddle' +#sx, sy, angle = 1.05, 0.95, 0. + +#name = 'focus' +#sx, sy, angle = 1.05, 0.95, 2.6 + +#name = 'center' +#sx, sy, angle = 1., 1., 2.5 + +name= 'spiral' +sx, sy, angle = 0.95, 0.95, 2.5 + +theta = angle * pi/180. + + +S = matrix([[sx, 0], + [0, sy]]) + +R = matrix([[cos(theta), -sin(theta)], + [sin(theta), cos(theta)],]) + +M = S*R # rotate then stretch + +# compute the eigenvalues using numpy linear algebra +vals, vecs = linalg.eig(M) +print 'numpy eigenvalues', vals + +# compare with the analytic values from myeig +avals = myeig(M) +print 'analytic eigenvalues', avals + +# transform X by the matrix +X2 = M*X1 + +# plot the original x,y as green dots and the transformed x, y as red +# dots +fig = figure() +ax = fig.add_subplot(111) + +x1 = X1[0].flat +y1 = X1[1].flat +x2 = X2[0].flat +y2 = X2[1].flat + +ax = fig.add_subplot(111) +line1, line2 = ax.plot(x1, y1, 'go', x2, y2, 'ro', markersize=2) +ax.set_title(name) + + +fig.savefig('glass_dots1.png', dpi=100) +fig.savefig('glass_dots1.eps', dpi=100) +show() Added: trunk/py4science/examples/skel/glass_dots_skel.py =================================================================== --- trunk/py4science/examples/skel/glass_dots_skel.py (rev 0) +++ trunk/py4science/examples/skel/glass_dots_skel.py 2007-10-21 20:57:54 UTC (rev 3977) @@ -0,0 +1,77 @@ +""" +Moire patterns from random dot fields + +http://en.wikipedia.org/wiki/Moir%C3%A9_pattern + +See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). +""" +from numpy import cos, sin, pi, matrix +import numpy as npy +import numpy.linalg as linalg +from pylab import figure, show + +def csqrt(x): + """ + sqrt func that handles returns sqrt(x)j for x<0 + """ + XXX + +def myeig(M): + """ + compute eigen values and eigenvectors analytically + + Solve quadratic: + + lamba^2 - tau*lambda + Delta = 0 + + where tau = trace(M) and Delta = Determinant(M) + + """ + XXX + return lambda1, lambda2 + +# 2000 random x,y points in the interval[-0.5 ... 0.5] +X1 = XXX + +name = 'saddle' +#sx, sy, angle = XXX + +#name = 'focus' +#sx, sy, angle = XXX + +#name = 'center' +#sx, sy, angle = XXX + +name= 'spiral' +sx, sy, angle = XXX + +theta = angle * pi/180. # the rotation in radians + + +# the scaling matrix +# | sx 0 | +# | 0 sy | +S = XXX + +# the rotation matrix +# | cos(theta) -sin(theta) | +# | sin(theta) cos(theta) | +R = XXX + +# the transformation is the matrix product of the scaling and rotation +M = XXX + +# compute the eigenvalues using numpy linear algebra +vals, vecs = XXX +print 'numpy eigenvalues', vals + +# compare with the analytic values from myeig +avals = myeig(M) +print 'analytic eigenvalues', avals + +# transform X1 by the matrix M +X2 = XXX + +# plot the original x,y as green dots and the transformed x, y as red +# dots +show() Added: trunk/py4science/workbook/fig/glass_dots1.eps =================================================================== --- trunk/py4science/workbook/fig/glass_dots1.eps (rev 0) +++ trunk/py4science/workbook/fig/glass_dots1.eps 2007-10-21 20:57:54 UTC (rev 3977) @@ -0,0 +1,4719 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: glass_dots1.eps +%%Creator: matplotlib version 0.90.1, http://matplotlib.sourceforge.net/ +%%CreationDate: Sun Oct 21 15:51:47 2007 +%%Orientation: portrait +%%BoundingBox: 11 173 600 618 +%%EndComments +%%BeginProlog +/mpldict 7 dict def +mpldict begin +/m { moveto } bind def +/l { lineto } bind def +/r { rlineto } bind def +/box { +m +1 index 0 r +0 exch r +neg 0 r +closepath +} bind def +/clipbox { +box +clip +newpath +} bind def +/ellipse { +newpath +matrix currentmatrix 7 1 roll +translate +scale +0 0 1 5 3 roll arc +setmatrix +closepath +} bind def +%!PS-Adobe-3.0 Resource-Font +%%Title: Bitstream Vera Sans +%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%%Creator: Converted from TrueType by PPR +25 dict begin +/_d{bind def}bind def +/_m{moveto}_d +/_l{lineto}_d +/_cl{closepath eofill}_d +/_c{curveto}_d +/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d +/_e{exec}_d +/FontName /BitstreamVeraSans-Roman def +/PaintType 0 def +/FontMatrix[.001 0 0 .001 0 0]def +/FontBBox[-182 -235 1287 928]def +/FontType 3 def +/Encoding StandardEncoding def +/FontInfo 10 dict dup begin +/FamilyName (Bitstream Vera Sans) def +/FullName (Bitstream Vera Sans) def +/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def +/Weight (Roman) def +/Version (Release 1.10) def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -213 def +/UnderlineThickness 143 def +end readonly def +/CharStrings 12 dict dup begin +/hyphen{361 0 49 234 312 314 _sc +49 314 _m +312 314 _l +312 234 _l +49 234 _l +49 314 _l +_cl}_d +/period{318 0 107 0 210 124 _sc +107 124 _m +210 124 _l +210 0 _l +107 0 _l +107 124 _l +_cl}_d +/zero{636 0 66 -13 570 742 _sc +318 664 _m +267 664 229 639 203 589 _c +177 539 165 464 165 364 _c +165 264 177 189 203 139 _c +229 89 267 64 318 64 _c +369 64 407 89 433 139 _c +458 189 471 264 471 364 _c +471 464 458 539 433 589 _c +407 639 369 664 318 664 _c +318 742 _m +399 742 461 709 505 645 _c +548 580 570 486 570 364 _c +570 241 548 147 505 83 _c +461 19 399 -13 318 -13 _c +236 -13 173 19 130 83 _c +87 147 66 241 66 364 _c +66 486 87 580 130 645 _c +173 709 236 742 318 742 _c +_cl}_d +/two{{636 0 73 0 536 742 _sc +192 83 _m +536 83 _l +536 0 _l +73 0 _l +73 83 _l +110 121 161 173 226 239 _c +290 304 331 346 348 365 _c +380 400 402 430 414 455 _c +426 479 433 504 433 528 _c +433 566 419 598 392 622 _c +365 646 330 659 286 659 _c +255 659 222 653 188 643 _c +154 632 117 616 78 594 _c +78 694 _l +118 710 155 722 189 730 _c +223 738 255 742 284 742 _c +359 742 419 723 464 685 _c +509 647 532 597 532 534 _c +532 504 526 475 515 449 _c +504 422 484 390 454 354 _c +446 344 420 317 376 272 _c +332 227 271 164 192 83 _c +_cl}_e}_d +/four{636 0 49 0 580 729 _sc +378 643 _m +129 254 _l +378 254 _l +378 643 _l +352 729 _m +476 729 _l +476 254 _l +580 254 _l +580 172 _l +476 172 _l +476 0 _l +378 0 _l +378 172 _l +49 172 _l +49 267 _l +352 729 _l +_cl}_d +/six{{636 0 70 -13 573 742 _sc +330 404 _m +286 404 251 388 225 358 _c +199 328 186 286 186 234 _c +186 181 199 139 225 109 _c +251 79 286 64 330 64 _c +374 64 409 79 435 109 _c +461 139 474 181 474 234 _c +474 286 461 328 435 358 _c +409 388 374 404 330 404 _c +526 713 _m +526 623 _l +501 635 476 644 451 650 _c +425 656 400 659 376 659 _c +310 659 260 637 226 593 _c +192 549 172 482 168 394 _c +187 422 211 444 240 459 _c +269 474 301 482 336 482 _c +409 482 467 459 509 415 _c +551 371 573 310 573 234 _c +573 159 550 99 506 54 _c +462 9 403 -13 330 -13 _c +246 -13 181 19 137 83 _c +92 147 70 241 70 364 _c +70 479 97 571 152 639 _c +206 707 280 742 372 742 _c +}_e{396 742 421 739 447 735 _c +472 730 498 723 526 713 _c +_cl}_e}_d +/a{{613 0 60 -13 522 560 _sc +343 275 _m +270 275 220 266 192 250 _c +164 233 150 205 150 165 _c +150 133 160 107 181 89 _c +202 70 231 61 267 61 _c +317 61 357 78 387 114 _c +417 149 432 196 432 255 _c +432 275 _l +343 275 _l +522 312 _m +522 0 _l +432 0 _l +432 83 _l +411 49 385 25 355 10 _c +325 -5 287 -13 243 -13 _c +187 -13 142 2 109 33 _c +76 64 60 106 60 159 _c +60 220 80 266 122 298 _c +163 329 224 345 306 345 _c +432 345 _l +432 354 _l +432 395 418 427 391 450 _c +364 472 326 484 277 484 _c +245 484 215 480 185 472 _c +155 464 127 453 100 439 _c +100 522 _l +}_e{132 534 164 544 195 550 _c +226 556 256 560 286 560 _c +365 560 424 539 463 498 _c +502 457 522 395 522 312 _c +_cl}_e}_d +/i{278 0 94 0 184 760 _sc +94 547 _m +184 547 _l +184 0 _l +94 0 _l +94 547 _l +94 760 _m +184 760 _l +184 646 _l +94 646 _l +94 760 _l +_cl}_d +/l{278 0 94 0 184 760 _sc +94 760 _m +184 760 _l +184 0 _l +94 0 _l +94 760 _l +_cl}_d +/p{{635 0 91 -207 580 560 _sc +181 82 _m +181 -207 _l +91 -207 _l +91 547 _l +181 547 _l +181 464 _l +199 496 223 520 252 536 _c +281 552 316 560 356 560 _c +422 560 476 533 518 481 _c +559 428 580 359 580 273 _c +580 187 559 117 518 65 _c +476 13 422 -13 356 -13 _c +316 -13 281 -5 252 10 _c +223 25 199 49 181 82 _c +487 273 _m +487 339 473 390 446 428 _c +418 466 381 485 334 485 _c +286 485 249 466 222 428 _c +194 390 181 339 181 273 _c +181 207 194 155 222 117 _c +249 79 286 61 334 61 _c +381 61 418 79 446 117 _c +473 155 487 207 487 273 _c +_cl}_e}_d +/r{411 0 91 0 411 560 _sc +411 463 _m +401 469 390 473 378 476 _c +366 478 353 480 339 480 _c +288 480 249 463 222 430 _c +194 397 181 350 181 288 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +199 495 224 520 254 536 _c +284 552 321 560 365 560 _c +371 560 378 559 386 559 _c +393 558 401 557 411 555 _c +411 463 _l +_cl}_d +/s{{521 0 54 -13 472 560 _sc +443 531 _m +443 446 _l +417 458 391 468 364 475 _c +336 481 308 485 279 485 _c +234 485 200 478 178 464 _c +156 450 145 430 145 403 _c +145 382 153 366 169 354 _c +185 342 217 330 265 320 _c +296 313 _l +360 299 405 279 432 255 _c +458 230 472 195 472 151 _c +472 100 452 60 412 31 _c +372 1 316 -13 246 -13 _c +216 -13 186 -10 154 -5 _c +122 0 89 8 54 20 _c +54 113 _l +87 95 120 82 152 74 _c +184 65 216 61 248 61 _c +290 61 323 68 346 82 _c +368 96 380 117 380 144 _c +380 168 371 187 355 200 _c +339 213 303 226 247 238 _c +216 245 _l +160 257 119 275 95 299 _c +70 323 58 356 58 399 _c +58 450 76 490 112 518 _c +148 546 200 560 268 560 _c +}_e{301 560 332 557 362 552 _c +391 547 418 540 443 531 _c +_cl}_e}_d +end readonly def + +/BuildGlyph + {exch begin + CharStrings exch + 2 copy known not{pop /.notdef}if + true 3 1 roll get exec + end}_d + +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +}_d + +FontName currentdict end definefont pop +%%EOF +end +%%EndProlog +mpldict begin +11.7 173.7 translate +588.6 444.6 0 0 clipbox +gsave +1.000 setgray +1.000 setlinewidth +0 setlinejoin +2 setlinecap +[] 0 setdash +0 0 m +0 444.6 l +588.6 444.6 l +588.6 0 l +closepath +gsave +fill +grestore +stroke +grestore +gsave +0.000 setgray +73.575 44.46 m +73.575 400.14 l +529.74 400.14 l +529.74 44.46 l +closepath +gsave +1.000 setgray +fill +grestore +stroke +grestore +0.500 setlinewidth +0 setlinecap +gsave +456.165 355.68 73.575 44.46 clipbox +/o { gsave +newpath +translate +1 0 m +0.992115 0.125333 l +0.968583 0.24869 l +0.929776 0.368125 l +0.876307 0.481754 l +0.809017 0.587785 l +0.728969 0.684547 l +0.637424 0.770513 l +0.535827 0.844328 l +0.425779 0.904827 l +0.309017 0.951057 l +0.187381 0.982287 l +0.0627905 0.998027 l +-0.0627905 0.998027 l +-0.187381 0.982287 l +-0.309017 0.951057 l +-0.425779 0.904827 l +-0.535827 0.844328 l +-0.637424 0.770513 l +-0.728969 0.684547 l +-0.809017 0.587785 l +-0.876307 0.481754 l +-0.929776 0.368125 l +-0.968583 0.24869 l +-0.992115 0.125333 l +-1 -3.21625e-16 l +-0.992115 -0.125333 l +-0.968583 -0.24869 l +-0.929776 -0.368125 l +-0.876307 -0.481754 l +-0.809017 -0.587785 l +-0.728969 -0.684547 l +-0.637424 -0.770513 l +-0.535827 -0.844328 l +-0.425779 -0.904827 l +-0.309017 -0.951057 l +-0.187381 -0.982287 l +-0.0627905 -0.998027 l +0.0627905 -0.998027 l +0.187381 -0.982287 l +0.309017 -0.951057 l +0.425779 -0.904827 l +0.535827 -0.844328 l +0.637424 -0.770513 l +0.728969 -0.684547 l +0.809017 -0.587785 l +0.876307 -0.481754 l +0.929776 -0.368125 l +0.968583 -0.24869 l +0.992115 -0.125333 l +closepath +gsave +0.000 0.500 0.000 setrgbcolor +fill +grestore +stroke +grestore } bind def +138.872 320.348 o +181.354 288.083 o +357.964 322.431 o +202.996 278.417 o +479.1 277 o +260.058 194.004 o +234.101 204.196 o +410.704 284.956 o +199.64 248.815 o +134.449 296.136 o +330.037 298.035 o +344.126 345.135 o +425.543 352.504 o +415.221 304.834 o +197.037 276.79 o +170.12 254.009 o +190.512 250.384 o +324.695 186.827 o +432.329 245.359 o +336.339 125.487 o +287.791 89.5204 o +381.68 184.249 o +230.466 295.632 o +305.554 357.729 o +249.578 281.911 o +321.573 358.13 o +350.908 176.412 o +257.443 213.254 o +450.114 165.748 o +408.095 324.504 o +431.163 227.839 o +292.916 130.22 o +468.11 283.741 o +172.187 290.341 o +194.8 238.493 o +177.859 363.466 o +430.112 76.7245 o +201.049 181.351 o +440.312 241.362 o +207.565 190.797 o +339.893 261.469 o +454.246 207.628 o +352.919 105.208 o +116.475 107.987 o +395.899 203.544 o +180.572 294.822 o +300.245 74.522 o +479.409 259.564 o +372.722 87.9586 o +385.381 176.45 o +143.08 185.238 o +317.094 266.568 o +263.482 142.769 o +398.103 241.449 o +365.896 94.5178 o +237.9 180.849 o +333.754 280.745 o +207.62 243.104 o +118.806 295.197 o +126.636 157.277 o +218.643 106.715 o +254.875 118.286 o +147.65 195.146 o +225.248 74.5246 o +355.066 268.333 o +290.841 344.053 o +403.564 288.753 o +258.632 169.655 o +131.654 215.147 o +390.072 276 o +248.767 76.1061 o +341.527 102.451 o +308.153 362.83 o +389.696 307.53 o +341.991 320.747 o +145.6 310.19 o +458.027 139.011 o +156.005 334.202 o +199.174 175.718 o +231.551 350.143 o +419.825 158.443 o +296.386 91.4108 o +128.923 366.976 o +353.954 191.492 o +241.684 135.018 o +363.991 339.889 o +126.512 362.686 o +199.101 103.509 o +484.743 363.956 o +305.536 131.847 o +119.381 348.64 o +416.115 104.531 o +286.516 309.527 o +199.992 222.584 o +355.444 144.896 o +427.214 234.784 o +168.757 329.679 o +455.83 88.4333 o +285.905 172.676 o +156.026 164.155 o +188.071 273.666 o +187.916 136.562 o +407.909 323.552 o +135.324 258.64 o +287.746 278.231 o +207.449 179.942 o +421.334 305.842 o +314.663 190.183 o +351.187 213.08 o +176.022 282.36 o +138.019 327.616 o +169.827 96.2728 o +464.91 121.37 o +373.796 366.374 o +145.208 109.952 o +175.089 194.515 o +294.383 338.347 o +249.915 156.283 o +119.525 111.341 o +244.53 103.544 o +409.808 292.664 o +308.461 359.93 o +287.776 348.745 o +173.773 346.218 o +425.432 186.799 o +254.747 134.214 o +256.286 180.301 o +419.538 85.9271 o +250.207 178.698 o +300.684 87.3235 o +131.184 257.7 o +192.259 161.9 o +456.53 166.659 o +316.836 86.7519 o +407.628 106.727 o +190.232 273.035 o +312.55 146.774 o +428.198 204 o +368.553 150.419 o +278.036 191.729 o +224.856 121.302 o +150.41 315.313 o +260.425 231.498 o +309.768 184.187 o +304.958 153.568 o +112.915 276.316 o +309.354 177.085 o +336.929 167.493 o +180.567 223.19 o +229.777 297.53 o +455.815 283.428 o +421.887 290.296 o +446.669 119.702 o +487.66 108.829 o +182.089 346.473 o +145.699 137.244 o +192.039 250.998 o +398.202 216.872 o +231.752 364.519 o +240.127 90.9055 o +217.391 202.029 o +392.399 239.735 o +437.822 77.0468 o +224.397 276.118 o +279.636 363.825 o +193.176 175.589 o +363.001 101.526 o +274.929 209.605 o +272.618 205.443 o +300.278 165.258 o +337.662 79.5305 o +187.498 184.977 o +228.513 106.44 o +478.56 252.935 o +329.047 325.459 o +359.016 176.736 o +359.717 274.494 o +332.58 255.906 o +491.435 77.3955 o +114.727 254.287 o +402.668 333.981 o +194.344 121.25 o +206.262 295.478 o +282.273 106.178 o +389.608 116.418 o +126.291 207.928 o +283.15 346.093 o +467.219 123.922 o +421.747 300.785 o +314.434 291.814 o +390.887 238.758 o +462.319 202.901 o +202.757 79.7886 o +400.616 337.799 o +212.296 155.408 o +312.638 328.75 o +117.786 282.263 o +119.206 245.575 o +476.181 164.201 o +235.461 316.76 o +405.659 189.849 o +146.85 351.285 o +196.558 148.499 o +116.967 250.082 o +179.907 251.714 o +294.156 184.762 o +401.435 333.759 o +311.458 158.996 o +136.051 229.14 o +209.875 81.7894 o +361.768 271.649 o +483.416 366.668 o +481.696 140.925 o +417.553 108.185 o +375.311 356.113 o +387.829 105.223 o +116.154 268.893 o +467.238 125.51 o +267.525 293.436 o +304.527 340.005 o +122.639 171.326 o +190.546 350.555 o +469.441 191.214 o +304.82 242.737 o +122.584 228.077 o +132.956 175.495 o +279.462 218.933 o +164.331 250.829 o +341.961 98.307 o +307.81 281.154 o +277.775 189.146 o +417.441 132.333 o +199.899 155.381 o +443.963 91.6086 o +473.56 354.32 o +387.867 278.511 o +421.998 298.133 o +150.223 288.239 o +184.043 262.236 o +272.41 279.249 o +461.759 368.618 o +150.902 334.741 o +400.53 354.612 o +242.094 182.986 o +308.826 215.268 o +376.791 289.966 o +122.726 250.887 o +405.98 98.6444 o +214.821 241.789 o +309.771 112.835 o +470.463 346.819 o +279.301 249.964 o +430.109 250.444 o +301.819 328.806 o +298.424 76.3392 o +331.973 248.671 o +249.522 146.086 o +175.401 99.2822 o +228.554 159.894 o +175.303 234.465 o +346.902 342.171 o +128.284 299.681 o +319.009 259.775 o +446.993 135.097 o +336.261 297.841 o +387.981 76.0156 o +190.093 284.984 o +117.289 101.364 o +177.671 156.473 o +179.57 295.492 o +176.206 170.879 o +129.225 252.213 o +260.081 331.309 o +331.658 179.715 o +227.209 369.702 o +197.356 110.128 o +464.369 332.035 o +333.249 368.434 o +126.467 369.582 o +466.127 261.302 o +147.438 208.562 o +122.22 114.402 o +348.608 293.847 o +112.082 130.39 o +476.315 255.352 o +195.357 207.548 o +227.454 227.203 o +476.759 240.468 o +422.782 249.771 o +254.722 228.519 o +453.002 135.992 o +265.675 178.509 o +246.471 317.55 o +471.567 317.835 o +375.672 264.932 o +274.95 333.545 o +168.689 148.823 o +420.695 280.624 o +241.393 149.525 o +404.501 138.059 o +199.358 195.928 o +138.249 117.846 o +364.454 139.238 o +431.845 264.249 o +316.338 129.832 o +163.309 237.242 o +172.075 146.488 o +439.508 115.453 o +278.259 353.724 o +210.058 334.132 o +202.302 166.265 o +158.446 356.173 o +285.194 106.091 o +248.611 341.771 o +489.604 322.867 o +456.071 312.406 o +464.79 119.087 o +425.438 256.533 o +439.461 369.864 o +282.93 346.27 o +251.5 296.727 o +457.394 109.83 o +384.418 133.061 o +118.674 234.819 o +293.419 314.397 o +170.163 212.113 o +404.43 118.935 o +475.415 341.091 o +376.482 158.784 o +126.798 114.33 o +256.396 254.601 o +426.809 321.956 o +441.437 297.873 o +161.82 234.899 o +188.165 267.244 o +255.668 137.541 o +160.94 191.408 o +175.552 150.902 o +297.53 218.974 o +233.205 185.763 o +473.534 155.634 o +244.774 316.598 o +420.461 304.322 o +345.5 217.364 o +485.143 325.216 o +426.435 125.277 o +201.243 235.749 o +360.772 303.009 o +446.355 239.652 o +211.585 80.2485 o +336.016 274.146 o +342.914 258.117 o +213.597 149.515 o +231.369 259.409 o +229.053 225.945 o +370.259 177.794 o +112.131 298.327 o +385.197 362.949 o +388.187 223.292 o +490.034 205.446 o +252.65 253.679 o +468.172 165.86 o +147.742 229.936 o +419.906 274.743 o +467.227 282.59 o +127.635 223.748 o +146.136 273.682 o +170.22 167.226 o +163.095 367.957 o +208.991 115.787 o +359.526 236.957 o +422.731 295.167 o +287.769 285.945 o +319.457 182.818 o +208.088 177.499 o +388.5 233.284 o +186.328 144.152 o +349.178 234.061 o +191.316 356.356 o +479.372 96.7753 o +300.029 267.359 o +488.623 284.206 o +177.986 253.078 o +456.294 179.236 o +311.016 178.261 o +264.545 337.775 o +318.581 161.266 o +113.048 359.916 o +214.652 147.24 o +279.008 137.104 o +382.272 134.789 o +426.872 185.952 o +426.592 267.595 o +405.404 84.9546 o +131.186 135.731 o +343.325 255.998 o +396.665 172.218 o +434.62 188.597 o +194.766 283.685 o +459.152 234.457 o +323.366 220.7 o +314.503 76.0085 o +120.381 329.056 o +196.149 358.486 o +323.186 370.27 o +369.75 193.826 o +316.729 216.584 o +414.292 149.839 o +341.67 145.787 o +275.993 162.224 o +299.881 358.158 o +270.493 303.614 o +232.2 188.779 o +326.502 206.428 o +319.078 130.5 o +424.659 253.071 o +445.607 214.259 o +233.549 188.714 o +252.863 202.873 o +206.441 187.757 o +292.182 96.865 o +199.952 312.41 o +339.094 138.393 o +271.671 363.771 o +483.17 89.8751 o +379.847 183.692 o +388.276 306.95 o +407.382 152.418 o +260.009 204.048 o +450.009 77.5324 o +251.32 286.543 o +466.056 203.204 o +429.98 297.422 o +451.667 248.032 o +151.126 94.5473 o +241.892 340.781 o +346.822 81.9414 o +146.017 206.552 o +329.07 190.48 o +437.428 306.507 o +160.391 97.9028 o +191.69 308.678 o +205.407 264.776 o +432.084 322.55 o +375.411 192.394 o +386.484 269.544 o +185.603 101.241 o +156.272 117.931 o +329.991 98.3565 o +471.725 312.131 o +411.405 193.621 o +347.449 332.048 o +323.722 301.559 o +231.999 110.582 o +200.458 253.133 o +168.099 158.044 o +486.024 333.549 o +126.05 206.857 o +114.305 224.244 o +284.349 302.934 o +142.903 75.4316 o +317.773 350.971 o +146.487 295.744 o +453.998 187.824 o +339.836 234.517 o +425.8 203.241 o +219.678 126.347 o +197.342 229.044 o +329.781 139.385 o +485.509 332.31 o +326.141 256.716 o +150.478 191.463 o +220.661 143.763 o +117.456 231.471 o +418.767 229.043 o +469.284 279.977 o +356.521 336.279 o +404.954 299.058 o +129.752 266.034 o +167.307 284.833 o +379.813 103.665 o +197.774 314.785 o +172.341 127.62 o +324.304 212.454 o +355.613 274.041 o +472.143 110.404 o +200.519 103.87 o +123.023 228.516 o +157.332 267.395 o +303.247 148.734 o +317.328 261.994 o +275.182 314.317 o +249.326 153.465 o +463.299 251.449 o +250.225 165.016 o +437.22 117.623 o +436.544 323.89 o +212.403 149.415 o +145.903 88.3748 o +265.877 186.575 o +209.452 117.661 o +209.452 117.661 o +262.591 220.262 o +126.206 87.5087 o +207.374 82.8823 o +459.273 209.611 o +274.284 215.536 o +119.198 193.967 o +319.686 101.089 o +243.833 331.438 o +184.327 130.54 o +228.309 156.197 o +161.58 183.569 o +277.253 225.941 o +385.147 311.286 o +239.987 318.041 o +304.848 127.524 o +381.714 293.54 o +315.335 321.244 o +300.244 92.9418 o +116.06 242.752 o +425.72 79.8241 o +154.998 331.116 o +265.339 237.098 o +345.449 331.946 o +271.478 113.69 o +225.288 203.971 o +466.438 255.239 o +127.979 122.105 o +123.557 244.453 o +334.649 98.4301 o +470.524 159.202 o +221.416 327.764 o +302.744 306.569 o +347.35 370.113 o +420.085 282.824 o +189.848 181.249 o +322.098 159.457 o +326.839 256.731 o +276.552 236.102 o +485.957 357.223 o +464.292 250.328 o +123.079 264.788 o +262.148 310.214 o +454.816 103.646 o +457.076 345.077 o +217.586 265.513 o +381.333 94.1881 o +254.763 126.501 o +328.943 211.738 o +279.842 235.05 o +448.752 142.956 o +287.251 360.986 o +302.827 160.105 o +208.751 210.961 o +242.68 99.4743 o +377.223 245.872 o +292.601 123.931 o +491.541 243.084 o +225.37 91.3451 o +462.242 298.244 o +336.902 136.076 o +185.049 246.218 o +205.497 169.403 o +164.792 254.569 o +219.508 324.853 o +240.776 166.459 o +353.514 207.892 o +221.089 91.1437 o +337.128 205.989 o +167.607 370.225 o +395.301 328.821 o +173.856 228.073 o +263.982 153.956 o +476.128 158.786 o +326.157 323.651 o +348.227 110.074 o +472.657 192.951 o +212.006 102.889 o +222.094 298.664 o +125.434 74.5151 o +436.449 128.176 o +355.465 231.62 o +297.807 91.6613 o +461.726 283.76 o +334.445 326.366 o +220.797 141.381 o +375.034 136.138 o +272.121 288.651 o +285 355.465 o +326.257 304.117 o +357.178 286.842 o +386.798 274.605 o +336.801 245.333 o +330.22 91.4168 o +450.264 257.51 o +486.517 268.173 o +327.665 281.828 o +297.565 220.59 o +281.859 197.172 o +451.466 152.291 o +251.104 162.593 o +427.846 241.001 o +246.731 135.993 o +177.908 333.232 o +377.003 265.604 o +235.095 193.156 o +192.608 88.3428 o +439.761 249.946 o +470.617 182.678 o +172.077 268.477 o +165.904 201.147 o +287.379 175.569 o +184.022 118.105 o +249.374 320.284 o +376.145 309.887 o +365.245 143.057 o +198.846 134.505 o +341.165 368.199 o +188.346 147.785 o +278.043 267.894 o +124.597 222.114 o +185.488 119.102 o +161.879 87.5924 o +452.444 306.578 o +198.437 203.248 o +302.604 352.444 o +425.461 202.834 o +219.247 172.592 o +239.708 131.357 o +359.21 166.85 o +135.084 130.122 o +263.029 203.495 o +341.101 341.379 o +484.162 174.977 o +237.854 277.199 o +390.883 74.6849 o +256.827 221.996 o +442.711 197.518 o +305.619 191.565 o +200.31 264.455 o +316.027 117.921 o +484.668 118.798 o +120.803 75.0655 o +357.17 112.013 o +182.192 174.212 o +462.279 174.348 o +118.207 117.31 o +165.791 112.013 o +419.604 246.714 o +255.534 305.299 o +223.828 298.405 o +214.932 341.14 o +404.503 235.041 o +247.952 368.14 o +423.445 280.724 o +313.817 292.171 o +180.267 333.95 o +421.12 356.534 o +304.003 127.154 o +287.581 153.024 o +472.41 94.7735 o +146.653 271.935 o +341.174 248.123 o +206.522 94.76 o +213.061 146.064 o +397.491 99.0448 o +473.672 296.444 o +199.147 96.3443 o +461.825 249.601 o +378.72 279.374 o +137.275 325.583 o +330.202 318.84 o +189.58 101.269 o +347.169 116.202 o +226.231 112.9 o +127.691 232.846 o +448.114 207.306 o +427.888 95.6066 o +298.996 138.184 o +177.258 227.673 o +340.498 157.921 o +392.048 337.841 o +138.916 238.515 o +241.33 214.351 o +462.051 201.482 o +214.546 146.194 o +469.628 334.673 o +136.906 152.197 o +161.445 186.556 o +397.279 364.709 o +112.744 137.61 o +297.888 122.822 o +226.216 235.284 o +308.253 124.639 o +331.04 291.399 o +448.281 119.13 o +307.754 242.104 o +180.866 187.577 o +329.523 91.0822 o +355.427 106.784 o +246.386 305.307 o +427.444 269.358 o +201.551 267.456 o +219.501 96.7771 o +470.982 303.996 o +152.923 309.043 o +249.903 186.509 o +122.773 98.7548 o +306.934 132.89 o +429.148 220.57 o +471.389 104.551 o +326.948 215.22 o +142.076 282.781 o +220.74 329.318 o +310.728 81.463 o +155.519 224.173 o +280.518 95.2028 o +428.439 322.552 o +245.495 268.051 o +123.142 285.316 o +228.955 185.923 o +151.552 194.478 o +284.897 303.773 o +115.64 308.694 o +197.563 190.69 o +385.377 137.499 o +163.257 368.599 o +147.488 302.78 o +466.302 189.63 o +158.522 357.538 o +340.232 211.745 o +238.959 187.842 o +195.198 225.206 o +266.295 226.52 o +338.931 194.137 o +286.844 313.444 o +123.976 129.878 o +112.535 326.028 o +136.933 181.161 o +327.827 200.662 o +240.974 275.35 o +485.102 223.927 o +278.836 241.064 o +195.593 86.3321 o +343.915 226.532 o +326.033 77.6533 o +185.821 140.726 o +451.66 356.774 o +471.059 338.89 o +481.747 251.686 o +287.385 120.691 o +289.57 116.179 o +228.758 207.552 o +165.8 286.13 o +265.118 159.587 o +328.086 362.39 o +247.918 123.576 o +352.641 91.9426 o +439.844 147.201 o +143.116 102.545 o +470.171 329.396 o +190.675 95.5264 o +473.536 144.819 o +333.693 113.015 o +432.968 85.527 o +379.426 81.7622 o +387.507 319.292 o +178.664 198.677 o +267.542 264.484 o +340.919 253.008 o +356.65 309.005 o +326.206 342.744 o +212.952 313.491 o +213.819 141.78 o +363.025 108.076 o +249.005 269.242 o +405.377 346.644 o +240.38 236.501 o +161.788 217.861 o +223.97 218.424 o +263.242 207.594 o +144.606 326.233 o +345.948 178.2 o +174.699 367.85 o +205.278 139.698 o +352.064 317.67 o +239.632 330.922 o +230.785 232.449 o +218.874 145.831 o +283.62 325.524 o +294.351 292.526 o +410.915 331.606 o +405.5 138.956 o +465.853 330.204 o +360.469 122.693 o +473.741 160.765 o +172.641 189.137 o +383.933 88.3344 o +211.338 201.8 o +192.466 329.209 o +303.869 290.361 o +211.287 137.987 o +236.702 132.451 o +290.084 133.841 o +462.477 215.11 o +297.687 291.864 o +478.869 95.3053 o +455.169 101.553 o +312.954 339.831 o +176.85 227.521 o +300.725 349.222 o +300.367 99.3729 o +130.904 319.089 o +412.904 171.574 o +362.817 144.547 o +301.785 141.68 o +291.47 178.912 o +321.632 154.375 o +254.182 246.577 o +451.523 185.495 o +451.067 182.018 o +449.112 268.544 o +208.569 329.019 o +432.825 116.606 o +468.412 261.828 o +339.374 313.676 o +184.972 163.393 o +125.342 356.719 o +204.323 276.126 o +399.439 340.84 o +255.953 286.988 o +344.723 201.842 o +447.254 178.187 o +138.24 365.53 o +388.642 210.858 o +331.833 237.443 o +395.871 365.135 o +267.862 132.264 o +469.069 142.773 o +295.811 214.643 o +479.962 249.584 o +453.643 273.34 o +348.186 238.763 o +401.619 195.618 o +476.082 184.478 o +398.943 236.479 o +302.748 286.303 o +348.316 296.573 o +458.867 248.343 o +460.914 209.172 o +257.481 156.686 o +324.111 282.608 o +402.448 127.687 o +472.839 114.649 o +461.882 130.3 o +416.763 278.834 o +407.168 347.513 o +121.553 311.21 o +282.579 120.951 o +201.005 350.103 o +218.913 114.12 o +484.928 247.951 o +340.118 95.8858 o +183.713 364.322 o +480.709 179.5 o +336.987 178.97 o +256.437 76.911 o +198.532 351.991 o +405.908 366.991 o +222.633 261.06 o +450.787 88.5983 o +341.629 164.589 o +483.808 317.428 o +133.411 177.218 o +113.785 292.221 o +182.681 286.221 o +281.047 257.139 o +171.391 88.9033 o +311.44 258.558 o +269.54 283.723 o +257.826 129.656 o +279.093 83.72 o +140.71 254.831 o +217.489 80.4373 o +376.069 157.762 o +324.871 170.869 o +247.499 286.086 o +235.729 278.737 o +174.419 170.063 o +348.297 210.958 o +204.858 326.267 o +406.743 343.877 o +270.909 278.989 o +339.439 160.776 o +248.943 312.775 o +226.529 282.485 o +149.004 260.838 o +146.189 322.394 o +188.456 197.232 o +482.904 288.155 o +405.356 102.254 o +336.958 95.8941 o +301.773 317.607 o +436.905 101.889 o +377.844 135.755 o +375.728 329.221 o +375.623 324.795 o +288.715 182.255 o +484.533 188.424 o +357.602 113.142 o +367.87 240.278 o +465.576 205.013 o +393.843 268.567 o +251.895 137.167 o +354.533 330.311 o +402.986 278.187 o +197.738 96.4223 o +221.711 214.719 o +174.156 186.916 o +305.664 181.281 o +343.263 271.617 o +260.854 83.7153 o +272.557 241.097 o +135.784 276.112 o +218.485 326.944 o +204.853 150.586 o +170.578 153.642 o +384.244 210.049 o +282.37 312.351 o +254.859 203.903 o +485.847 248.538 o +463.762 323.685 o +182.079 87.2553 o +167.149 245.019 o +186.408 187.366 o +267.518 104.609 o +428.962 283.088 o +474.401 342.905 o +254.625 227.442 o +130.771 160.608 o +182.769 108.261 o +463.223 225.205 o +280.82 327.489 o +213.009 170.446 o +339.525 268.306 o +255.888 112.293 o +397.823 302.237 o +240.22 210.837 o +408.251 314.152 o +377.336 178.246 o +311.943 163.464 o +364.679 85.1074 o +333.158 142.482 o +374.703 113.199 o +183.361 100.464 o +321.021 243.288 o +290.025 82.11 o +208.264 285.77 o +336.646 125.747 o +222.724 139.244 o +315.949 255.978 o +275.164 235.814 o +186.206 246.296 o +113.208 347.606 o +414.054 206.685 o +169.448 253.647 o +476.664 92.9164 o +461.366 353.304 o +311.439 147.096 o +230.029 167.854 o +321.203 103.146 o +465.61 91.7564 o +379.839 104.974 o +150.244 143.995 o +349.267 188.331 o +111.904 259.111 o +340.881 152.435 o +157.774 362.801 o +358.848 316.66 o +139.902 286.125 o +115.404 228.927 o +271.113 220.826 o +428.353 193.197 o +268.255 108.389 o +139.834 101.412 o +151.952 159.081 o +274.748 119.762 o +431.088 325.418 o +415.007 310.416 o +481.51 324.235 o +428.838 346.782 o +116.86 150.312 o +259.881 93.37 o +167.958 208.889 o +408.653 192.334 o +257.879 216.837 o +169.338 148.057 o +317.02 214.097 o +289.861 369.658 o +333.189 338.391 o +449.042 310.993 o +449.042 310.993 o +230.071 327.532 o +169.765 192.02 o +152.408 74.8528 o +125.671 209.888 o +145.095 184.249 o +187.01 362.025 o +471.71 80.365 o +360.921 274.085 o +431.609 249.018 o +448.272 233.457 o +240.971 91.2614 o +467.904 293.456 o +126.199 96.6715 o +276.015 249.69 o +223.132 255.028 o +115.036 234.064 o +305.187 329.47 o +338.585 201.779 o +481.048 337.152 o +123.308 138.297 o +164.318 77.0981 o +306.436 111.115 o +191.305 368.988 o +231.544 97.6631 o +465.676 186.379 o +238.549 336.432 o +344.374 331.995 o +137.167 250.581 o +159.745 217.67 o +127.543 85.1101 o +428.211 250.176 o +346.652 358.055 o +293.293 282.373 o +222.459 330.461 o +222.479 217.724 o +205.617 269.194 o +318.476 98.8214 o +244.36 190.44 o +469.092 297.91 o +185.248 331.118 o +431.148 247.766 o +260.834 354.222 o +297.88 218.459 o +116.595 319.367 o +247.371 156.208 o +201.1 313.175 o +214.661 150.876 o +352.452 178.311 o +214.894 244.549 o +138.527 108.885 o +397.018 351.134 o +325.674 270.495 o +377.628 358.197 o +121.311 89.7141 o +131.22 136.061 o +257.758 196.95 o +394.862 135.851 o +185.004 338.204 o +164.733 82.145 o +460.033 147.389 o +232.819 83.898 o +361.064 221.258 o +355.07 208.59 o +324.129 189.879 o +447.268 332.942 o +160.083 194.53 o +174.6 295.516 o +114.192 231.4 o +480.986 125.748 o +461.1 183.677 o +320.243 259.395 o +366.682 226.23 o +116.961 263.477 o +135.063 176.121 o +337.979 306.837 o +161.164 134.644 o +255.149 89.4746 o +463.592 316.335 o +337.698 254.069 o +402.458 179.217 o +179.425 354.039 o +146 246.154 o +411.529 303.016 o +139.19 314.984 o +453.351 222.71 o +190.951 246.933 o +140.153 121.322 o +127.02 238.223 o +148.394 216.051 o +140.926 100.712 o +270.64 294.19 o +482.843 308.648 o +122.967 192.656 o +156.16 287.6 o +242.226 276.291 o +181.986 256.224 o +471.739 237.244 o +113.295 289.592 o +373.492 268.011 o +412.194 291.41 o +288.023 343.826 o +237.823 297.31 o +224.79 277.375 o +146.545 116.74 o +141.695 313.398 o +353.695 155.367 o +326.418 215.387 o +369.05 134.421 o +451.351 208.43 o +287.103 290.488 o +247.864 178.706 o +260.613 339.631 o +259.287 172.083 o +377.414 304.321 o +173.679 86.2304 o +136.911 176.166 o +470.54 168.157 o +347.677 132.329 o +178.442 114.751 o +280.344 219.067 o +376.335 269.533 o +351.856 366.87 o +313.373 156.965 o +302.696 206.567 o +305.98 329.823 o +197.215 222.556 o +490.767 224.008 o +173.796 244.504 o +267.566 309.695 o +398.032 98.1237 o +393.342 293.743 o +466.145 138.194 o +225.348 117.937 o +411.378 176.032 o +453.386 206.354 o +342.76 239.1 o +340.046 127.226 o +338.268 154.736 o +444.052 310.66 o +120.753 360.497 o +143.419 364.422 o +457.459 354.063 o +174.012 117.993 o +339.353 253.843 o +363.07 100.236 o +367.39 362.519 o +227.587 125.22 o +367.894 282.953 o +145.445 269.803 o +112.025 272.013 o +257.6 309.425 o +151.151 223.95 o +324.483 182.249 o +173.436 191.799 o +348.194 177.171 o +257.222 166.54 o +269.928 278.997 o +134.974 343.631 o +440.307 284.848 o +436 295.309 o +270.134 245.566 o +467.14 326.694 o +226.08 341.162 o +112.516 229.885 o +401.16 114.882 o +142.252 117.857 o +187.772 109.633 o +162.944 78.3937 o +257.718 97.5874 o +362.218 94.1442 o +353.182 181.177 o +259.491 196.301 o +161.084 291.397 o +219.517 91.2703 o +328.784 325.283 o +411.171 215.068 o +440.083 366.906 o +304.35 278.739 o +234.154 296.194 o +195.219 316.551 o +427.112 166.145 o +113.656 206.854 o +278.964 333.99 o +120.5 84.9609 o +179.65 362.181 o +369.498 242.068 o +126.99 302.654 o +469.435 148.485 o +309.753 181.316 o +259.454 296.58 o +242.419 329.716 o +282.757 330.124 o +374.876 124.03 o +457 318.452 o +447.827 222.977 o +125.687 312.766 o +389.29 169.921 o +192.098 251.358 o +452.88 323.345 o +454.384 114.662 o +277.087 96.7285 o +219.28 83.3024 o +452.739 301.539 o +241.485 193.11 o +304.592 268.569 o +391.098 210.573 o +460.222 253.193 o +423.704 366.478 o +320.354 82.977 o +374.081 118.531 o +117.336 245.092 o +374.885 259.618 o +490.216 244.77 o +135.865 77.6026 o +459.177 164.219 o +391.229 286.068 o +442.762 321.656 o +147.608 236.146 o +148.759 210.102 o +228.081 336.311 o +421.626 233.859 o +168.724 299.257 o +491.114 350.003 o +457.568 271.968 o +177.364 335.23 o +433.182 128.464 o +249.708 347.092 o +419.613 117.545 o +239.424 318.832 o +285.189 150.4 o +321.017 213.57 o +322.948 368.425 o +196.271 214.703 o +367.057 175.306 o +242.488 367.207 o +296.755 90.0569 o +448.867 127.242 o +364.823 186.115 o +326.693 123.348 o +312.984 184.891 o +260.971 120.38 o +159.206 148.363 o +245.126 177.574 o +470.898 257.794 o +170.009 269.782 o +415.918 357.153 o +396.386 249.562 o +315.877 368.729 o +335.352 81.9932 o +465.122 81.3471 o +304.285 352.915 o +364.221 116.467 o +290.689 288.663 o +441.549 324.914 o +302.139 248.372 o +400.541 284.378 o +225.174 81.0732 o +456.738 285.721 o +286.151 108.038 o +214.653 220.49 o +351.386 179.889 o +215.238 332.813 o +439.126 111.9 o +159.62 225.208 o +287.312 150.937 o +412.149 346.054 o +331.626 280.217 o +249.309 161.256 o +204.51 231.813 o +327.434 353.332 o +223.744 328.31 o +386.362 124.722 o +386.944 200.394 o +175.975 274.011 o +401.988 177.46 o +167.062 127.908 o +299.015 321.591 o +318.757 139.796 o +170.004 317.43 o +436.758 123.446 o +214.296 275.576 o +400.027 253.085 o +130.366 216.071 o +449.381 113.818 o +202.734 202.77 o +393.784 291.251 o +228.798 326.471 o +137.226 317.576 o +462.921 328.906 o +373.558 331.842 o +429.807 148.739 o +260.378 249.134 o +151.11 360.018 o +226.746 194.417 o +347.161 307.61 o +172.921 346.786 o +443.706 137.208 o +307.714 179.131 o +387.331 167.383 o +395.829 191.575 o +438.425 226.867 o +488.582 181.494 o +413.208 247.968 o +318.259 94.7168 o +300.982 177.026 o +262.819 363.335 o +414.382 164.552 o +410.81 179.936 o +119.129 321.892 o +188.822 321.559 o +122.426 307.439 o +486.877 276.714 o +127.046 327.249 o +296.792 282.851 o +481.745 291.546 o +384.018 110.89 o +160.672 174.147 o +247.512 260.742 o +172.107 118.008 o +303.432 117.225 o +276.065 185.818 o +233.356 105.804 o +209.537 88.6185 o +242.378 126.178 o +439.257 145.76 o +345.787 104.369 o +293.021 338.258 o +322.522 173.289 o +203.614 134.567 o +325.474 283.109 o +117.762 324.851 o +286.279 206.252 o +382.502 236.092 o +459.575 307.252 o +214.749 219.505 o +148.662 161.784 o +137.338 88.1992 o +312.737 363.339 o +328.063 164.294 o +178.992 243.324 o +163.237 171.27 o +267.433 245.24 o +319.834 164.095 o +375.144 295.233 o +259.102 107.75 o +392.699 276.767 o +391.691 204.319 o +191.902 231.978 o +386.915 239.014 o +173.738 299.101 o +441.171 218.606 o +433.56 205.023 o +294.507 238.357 o +244.474 326.735 o +395.717 337.651 o +113.115 260.654 o +311.343 169.363 o +169.068 137.107 o +224.866 158.43 o +429.421 222.162 o +359.743 149 o +282.6 159.052 o +390.569 204.985 o +362.753 183.236 o +262.533 324.614 o +334.777 365.532 o +140.009 251.832 o +219.799 300.38 o +445.515 152.523 o +418.375 80.9914 o +445.002 160.369 o +220.552 315.193 o +219.931 340.377 o +172.85 296.889 o +111.657 286.822 o +141.645 76.739 o +462.098 195.384 o +234.188 317.995 o +357.84 324.207 o +341.406 323.862 o +445.458 329.996 o +373.008 81.7091 o +319.047 131.166 o +488.926 368.786 o +148.207 218.967 o +297.168 280.434 o +464.95 161.951 o +326.349 145.08 o +194.684 100.673 o +228.215 83.5134 o +340.552 357.034 o +343.385 171.784 o +232.921 249.973 o +352.914 242.648 o +258.74 244.429 o +347.248 309.586 o +290.628 343.714 o +452.706 163.697 o +311.123 243.288 o +311.824 355.239 o +171.681 254.353 o +206.849 288.472 o +402.451 294.508 o +236.571 309.878 o +470.687 277.59 o +218.295 370.412 o +489.191 193.343 o +146.549 100.5 o +465.89 309.806 o +255.609 237.653 o +186.838 357.331 o +397.218 182.209 o +295.498 369.436 o +166.213 323.048 o +265.448 363.836 o +334.545 303.352 o +382.656 319.504 o +392.663 217.432 o +188.232 105.453 o +353.967 332.577 o +313.355 291.371 o +189.654 226.05 o +488.126 233.962 o +462.039 298.355 o +422.036 270.53 o +295.648 162.11 o +395.498 233.206 o +277.027 176.625 o +167.533 127.078 o +438.237 224.302 o +427.82 238.514 o +415.582 253.417 o +226.201 139.765 o +271.567 154.682 o +403.876 370.111 o +132.727 129.687 o +236.103 141.182 o +255.964 319.083 o +271.761 320.419 o +389.424 173.27 o +159.048 119.739 o +135.831 256.809 o +219.334 220.279 o +115.493 151.414 o +216.987 344.594 o +114.852 120.835 o +473.535 354.597 o +164.868 267.906 o +285.759 200.603 o +444.005 214.607 o +332.616 194.389 o +265.987 311.361 o +455.137 322.855 o +258.028 272.029 o +324.434 155.212 o +276.686 273.476 o +224.264 321.544 o +275.379 330.977 o +337.922 209.395 o +420.71 335.119 o +489.437 164.871 o +288.57 306.517 o +289.189 180.662 o +428.578 211.337 o +409.359 195.569 o +164.783 208.909 o +309.069 313.877 o +411.255 79.1339 o +295.611 180.802 o +151.741 322.454 o +310.622 244.259 o +113.08 337.238 o +125.908 290.947 o +334.123 207.767 o +477.1 263.948 o +239.929 159.029 o +299.706 251.853 o +409.427 333.963 o +291.335 361.009 o +391.799 195.363 o +147.257 192.948 o +240.682 342.86 o +291.309 137.413 o +212.556 211.898 o +223.437 80.3394 o +453.089 326.74 o +268.276 220.324 o +183.958 93.5576 o +377.568 200.699 o +158.448 245 o +134.272 156.722 o +407.949 308.258 o +285.029 157.309 o +244.278 224.225 o +365.784 245.406 o +431.778 263.426 o +149.284 120.221 o +285.944 97.845 o +478.381 200.685 o +345.955 148.513 o +345.955 148.513 o +289.066 206.922 o +170.067 339.131 o +223.496 197.279 o +112.239 123.13 o +257.45 77.1489 o +216.234 254.535 o +364.774 253.972 o +236.956 133.709 o +258.001 244.962 o +445.647 203.085 o +421.761 290.749 o +378.5 270.765 o +180.731 242.786 o +290.381 170.15 o +286.351 340.074 o +115.567 165.702 o +228.817 340.854 o +354.088 273.08 o +473.527 114.457 o +381.696 163.286 o +303.737 277.347 o +426.668 352.176 o +466.517 268.623 o +218.313 276.676 o +191.707 119.979 o +143.758 212.116 o +119.057 320.484 o +300.596 209.376 o +203.27 167.709 o +168.009 201.423 o +132.68 198.154 o +384.686 342.321 o +226.779 300.969 o +286.137 168.448 o +112.189 341.182 o +181.409 86.8985 o +114.889 258.069 o +448.31 246.205 o +175.45 103.297 o +181.839 102.314 o +133.951 83.8023 o +442.758 238.115 o +473.849 268.08 o +113.726 77.0226 o +276.155 230.666 o +470.316 362.875 o +327.971 135.012 o +461.388 295.974 o +149.544 247.175 o +117.06 351.098 o +391.517 219.52 o +362.844 139.016 o +212.532 293.678 o +440.664 289.412 o +360.889 180.707 o +218.579 108.836 o +285.694 121.59 o +326.496 328.628 o +199.702 99.6927 o +307.075 161.22 o +482.499 99.0487 o +359.867 217.65 o +357.153 167.905 o +470.042 320.102 o +201.174 219.776 o +341.183 122.206 o +471.591 225.872 o +255.171 350.732 o +117.529 295.58 o +163.378 75.5144 o +362.399 196.646 o +226.959 192.084 o +469.986 312.81 o +186.05 257.211 o +335.757 116.78 o +169.18 144.119 o +294.643 113.897 o +370.889 308.577 o +122.868 139.292 o +464.463 360.364 o +273.222 185 o +189.253 235.181 o +135.311 368.563 o +330.741 98.1635 o +120.925 360.281 o +234.233 157.952 o +442.677 262.404 o +235.029 291.647 o +438.884 216.446 o +178.718 250.255 o +336.514 249.43 o +217.262 125.306 o +215.18 238.736 o +429.868 172.787 o +469.196 221.921 o +344.142 115.126 o +162.361 153.129 o +469.271 245.413 o +231.622 342.105 o +251.338 292.569 o +184.201 248.411 o +264.928 276.408 o +431.713 277.379 o +369.131 141.829 o +238.889 183.372 o +437.879 358.291 o +408.177 210.657 o +233.505 124.909 o +162.059 87.6701 o +278.868 242.895 o +174.469 348.555 o +222.204 133.162 o +237.7 325.19 o +410.363 348.649 o +261.919 192.918 o +483.908 166.883 o +154.679 282.411 o +189.27 291.17 o +162.043 210.024 o +249.552 244.816 o +219.077 359.079 o +135.441 215.602 o +388.579 264.358 o +163.988 238.053 o +309.539 355.035 o +294.827 334.219 o +139.792 306.947 o +485.155 187.234 o +342.185 165.215 o +143.136 312.884 o +479.619 279.472 o +193.965 135.318 o +147.058 80.8624 o +281.73 238.428 o +359.004 155.674 o +138.568 335.513 o +475.472 229.206 o +184.735 345.452 o +138.825 166.27 o +247.199 229.569 o +323.124 310.632 o +196.353 205.89 o +116.991 259.104 o +369.062 127.985 o +369.048 221.724 o +401.768 175.487 o +151.337 98.309 o +257.994 103.595 o +302.134 307.824 o +166.404 107.664 o +279.755 319.095 o +309.52 201.588 o +336.188 338.886 o +146.748 308.157 o +457.478 348.168 o +389.174 293.196 o +158.689 285.516 o +135.881 240.379 o +376.772 364.998 o +114.867 201.167 o +309.296 331.707 o +115.871 268.97 o +231.033 107.198 o +165.388 86.5341 o +173.499 121.961 o +438.866 142.694 o +424.036 314.283 o +195.45 262.876 o +190.159 283.921 o +268.097 164.449 o +295.755 362.353 o +196.869 75.1325 o +383.271 105.331 o +152.864 156.095 o +227.751 173.519 o +147.827 360.681 o +248.672 319.443 o +209.178 302.125 o +135.127 129.642 o +255.071 111.735 o +232.257 182.248 o +357.104 137.55 o +429.939 180.669 o +180.846 272.543 o +326.739 369.356 o +301.398 219.534 o +216.101 307.636 o +489.583 149.35 o +363.164 348.406 o +274.712 175.767 o +398.836 340.834 o +327.527 83.7424 o +390.716 241.864 o +344.56 354.832 o +447.984 144.76 o +340.32 232.134 o +205.536 213.88 o +195.437 330.023 o +391.695 205.476 o +354.051 239.269 o +302.44 118.799 o +185.508 218.995 o +114.032 246.527 o +203.441 291.263 o +414.604 278.249 o +222.239 95.6682 o +409.842 257.033 o +299.59 330.801 o +458.332 243.665 o +399.575 303.861 o +262.816 164.961 o +186.088 178.08 o +334.806 151.452 o +260.911 299.905 o +279.954 145.152 o +273.105 290.772 o +445.083 264.005 o +178.466 279.769 o +440.034 79.0233 o +349.33 280.715 o +336.441 114.71 o +322.181 299.937 o +490.914 271.426 o +138.705 359.236 o +376.471 219.915 o +400.988 152.771 o +117.747 188.526 o +307.254 83.3886 o +425.378 166.744 o +313.442 150.238 o +421.254 133.283 o +183.466 192.334 o +484.285 318.5 o +304.369 302.921 o +186.306 170.489 o +366.757 247.74 o +191.422 187.814 o +335.795 286.454 o +288.462 190.647 o +424.466 356.687 o +144.208 360.707 o +131.26 272.793 o +405.738 186.054 o +357.852 143.05 o +417.321 307.758 o +462.987 75.9591 o +444.404 265.32 o +191.222 226.292 o +243.615 226.097 o +203.269 304.868 o +162.277 350.208 o +317.248 227.141 o +423.073 151.768 o +360.812 254.779 o +436.532 191.807 o +259.007 292.046 o +396.798 365.26 o +391.698 260.093 o +131.449 295.38 o +333.482 284.416 o +274.839 254.635 o +287.247 142.062 o +143.469 272.449 o +272.218 166.527 o +243.758 106.82 o +217.445 96.8161 o +398.859 120.269 o +190.67 170.866 o +396.265 237.201 o +176.98 251.588 o +284.486 343.003 o +161.398 304.657 o +290.525 85.7818 o +396.092 298.384 o +284.817 164.009 o +467.268 277.802 o +342.393 330.311 o +225.084 169.053 o +204.268 342.176 o +363.999 270.425 o +130.688 240.901 o +282.43 146.03 o +479.45 152.984 o +189.407 137.626 o +279.4 192.659 o +436.378 253.654 o +292.477 226.992 o +362.571 321.225 o +178.623 327.984 o +476.323 245.63 o +219.464 97.3292 o +216.389 235.981 o +156.923 192.615 o +282.17 335.314 o +242.398 345.859 o +120.684 130.177 o +231.727 246.16 o +295.557 174.878 o +145.964 227.489 o +144.795 208.902 o +173.892 248.371 o +279.533 317.001 o +458.178 295.63 o +466.305 329.748 o +305.636 215.341 o +376.716 270.894 o +114.318 204.298 o +140.888 140.315 o +152.856 186.641 o +485.382 291.041 o +154.798 253.943 o +189.772 365.688 o +335.706 255.779 o +303.199 331.373 o +323.081 209.531 o +435.437 111.956 o +239.023 299.992 o +477.493 91.4192 o +462.763 358.509 o +196.418 279.241 o +353.83 210.574 o +166.98 277.972 o +472.552 331.482 o +407.668 192.099 o +244.773 329.311 o +440.051 305.505 o +268.002 237.85 o +337.155 165.768 o +415.508 277.48 o +255.319 117.816 o +210.598 174.491 o +185.088 229.795 o +344.059 302.361 o +361.143 99.696 o +412.428 353.2 o +301.389 238.643 o +217.641 333.597 o +386.132 100.714 o +383.482 350.856 o +145.448 114.526 o +384.478 104.062 o +414.764 164.96 o +282.385 365.609 o +280.04 119.736 o +334.931 239.08 o +264.041 264.26 o +268.195 269.298 o +238.758 239.685 o +367.012 107.149 o +254.039 319.574 o +146.883 249.039 o +212.066 362.928 o +405.445 350.339 o +393.728 78.6964 o +235.27 119.463 o +390.524 201.093 o +486.447 303.815 o +272.341 93.4554 o +244.842 264.97 o +404.064 342.974 o +464.049 126.185 o +211.223 360.426 o +296.057 167.313 o +490.508 290.569 o +320.655 196.956 o +230.054 257.551 o +244.161 131.443 o +289.135 198.111 o +253.018 326.064 o +282.517 157.432 o +395.265 182.595 o +201.664 183.961 o +190.822 205.643 o +300.585 215.37 o +319.016 157.411 o +460.714 357.133 o +266.554 354.175 o +171.775 241.92 o +209.27 171.162 o +325.503 171.451 o +151.16 99.7775 o +461.094 80.2036 o +439.971 281.439 o +425.381 352.525 o +377.9 362.515 o +429.347 225.153 o +201.717 139.017 o +131.273 162.918 o +220.638 151.443 o +162.362 158.945 o +361.487 257 o +444.09 233.397 o +344.74 155.248 o +236.009 275.369 o +272.234 253.042 o +158.056 128.078 o +473.215 193.23 o +194.988 194.265 o +307.45 102.966 o +249.061 363.794 o +433.707 252.247 o +321.235 130.224 o +279.145 91.669 o +118.158 119.211 o +414.906 359.465 o +359.447 284.041 o +133.373 333.028 o +245.815 118.28 o +319.399 235.203 o +399.717 279.832 o +452.879 343.913 o +465.374 221.034 o +467.121 327.315 o +130.323 294.172 o +468.596 88.8917 o +394.544 354.61 o +142.286 154.263 o +236.094 285.725 o +379.912 208.111 o +413.551 355.13 o +206.456 181.966 o +446.551 236.377 o +444.985 320.215 o +354.535 264.857 o +323.441 223.136 o +488.039 316.446 o +447.963 92.2288 o +475.134 234.765 o +250.879 322.908 o +134.565 287.553 o +372.353 315.817 o +347.657 268.578 o +315.334 341.447 o +227.151 272.361 o +251.798 189.409 o +284.381 192.602 o +464.537 361.335 o +184.243 166.173 o +375.653 205.489 o +351.795 234.282 o +186.972 271.266 o +154.164 186.083 o +164.595 313.03 o +251.292 157.761 o +377.68 143.072 o +423.28 243.038 o +470.735 331.967 o +245.713 88.7982 o +282.434 280.546 o +178.059 219.665 o +179.848 215.338 o +226.016 88.4789 o +416.733 197.088 o +254.33 118.649 o +422.273 266.306 o +356.691 319.863 o +427.831 104.759 o +269.878 110.662 o +403.025 239.419 o +457.935 119.042 o +171.023 212.11 o +170.031 199.403 o +234.463 171.575 o +258.209 259.439 o +381.527 153.006 o +395.79 239.453 o +219.763 291.731 o +215.804 319.155 o +318.612 341.637 o +176.667 197.788 o +465.53 177.024 o +118.524 290.943 o +124.926 297.832 o +327.281 151.359 o +428.668 104.481 o +198.62 189.024 o +302.98 100.107 o +191.028 195.399 o +369.778 124.82 o +221.589 159.492 o +483.096 167.947 o +368.466 250.33 o +342.588 201.786 o +234.694 230.036 o +211.52 90.1258 o +224.466 271.846 o +177.198 160.065 o +213.964 81.7332 o +362.845 364.893 o +275.366 358.65 o +399.385 241.743 o +136.546 287.894 o +323.334 336.138 o +190.913 233.411 o +333.291 273.411 o +283.715 142.159 o +257.917 90.6669 o +219.362 105.772 o +465.887 173.157 o +grestore +gsave +456.165 355.68 73.575 44.46 clipbox +/o { gsave +newpath +translate +1 0 m +0.992115 0.125333 l +0.968583 0.24869 l +0.929776 0.368125 l +0.876307 0.481754 l +0.809017 0.587785 l +0.728969 0.684547 l +0.637424 0.770513 l +0.535827 0.844328 l +0.425779 0.904827 l +0.309017 0.951057 l +0.187381 0.982287 l +0.0627905 0.998027 l +-0.0627905 0.998027 l +-0.187381 0.982287 l +-0.309017 0.951057 l +-0.425779 0.904827 l +-0.535827 0.844328 l +-0.637424 0.770513 l +-0.728969 0.684547 l +-0.809017 0.587785 l +-0.876307 0.481754 l +-0.929776 0.368125 l +-0.968583 0.24869 l +-0.992115 0.125333 l +-1 -3.21625e-16 l +-0.992115 -0.125333 l +-0.968583 -0.24869 l +-0.929776 -0.368125 l +-0.876307 -0.481754 l +-0.809017 -0.587785 l +-0.728969 -0.684547 l +-0.637424 -0.770513 l +-0.535827 -0.844328 l +-0.425779 -0.904827 l +-0.309017 -0.951057 l +-0.187381 -0.982287 l +-0.0627905 -0.998027 l +0.0627905 -0.998027 l +0.187381 -0.982287 l +0.309017 -0.951057 l +0.425779 -0.904827 l +0.535827 -0.844328 l +0.637424 -0.770513 l +0.728969 -0.684547 l +0.809017 -0.587785 l +0.876307 -0.481754 l +0.929776 -0.368125 l +0.968583 -0.24869 l +0.992115 -0.125333 l +closepath +gsave +1.000 0.000 0.000 setrgbcolor +fill +grestore +stroke +grestore } bind def +141.948 310.097 o +183.982 280.847 o +349.776 319.154 o +205.036 272.373 o +467.16 279.949 o +263.68 194.1 o +238.502 202.935 o +401.823 285.29 o +203.424 244.169 o +139.037 286.975 o +324.567 295.097 o +335.436 340.255 o +412.317 349.879 o +405.054 304.302 o +199.467 270.636 o +175.13 248.145 o +194.677 245.363 o +325.407 189.377 o +424.452 248.408 o +339.718 131.535 o +295.553 95.8314 o +379.629 188.771 o +230.192 289.599 o +298.158 350.961 o +249.061 277.194 o +313.34 351.859 o +350.84 180.339 o +260.174 212.286 o +445.562 173.424 o +397.245 322.741 o +424.276 231.741 o +298.255 134.624 o +456.372 285.992 o +175.162 282.695 o +199.379 234.216 o +176.658 352.28 o +431.31 88.2854 o +208.346 180.185 o +432.24 244.871 o +214.029 189.36 o +335.865 260.71 o +447.259 213.305 o +356.532 112.824 o +131.977 107.822 o +392.098 207.543 o +182.882 287.218 o +308.171 81.9989 o +468.38 263.41 o +376.244 97.0933 o +383.555 181.489 o +153.122 182.001 o +313.956 264.813 o +269.652 145.584 o +392.175 243.59 o +369.417 103.098 o +243.348 180.899 o +329.014 278.807 o +211.301 239.006 o +124.24 285.578 o +139.001 154.932 o +229.012 109.917 o +262.784 122.07 o +156.932 191.552 o +236.992 79.5782 o +349.901 267.715 o +284.921 337.506 o +394.845 288.663 o +263.62 170.945 o +140.688 210.018 o +382.718 276.123 o +259.229 81.8391 o +345.867 109.84 o +300.354 355.886 o +380.685 306.036 o +334.705 317.039 o +148.873 300.674 o +454.493 148.303 o +157.473 323.8 o +206.867 174.778 o +228.325 341.37 o +417.203 165.512 o +303.61 97.9033 o +130.027 354.03 o +352.929 194.75 o +249.376 137.524 o +354.568 335.917 o +127.967 349.881 o +210.635 106.242 o +467.895 362.661 o +310.146 136.577 o +121.945 336.32 o +416.548 114.224 o +282.651 304.598 o +205.152 219.285 o +356.82 150.574 o +420.159 238.205 o +169.816 319.918 o +455.096 100.229 o +289.344 174.693 o +166.53 162.409 o +191.123 267.381 o +198.263 137.251 o +397.119 321.831 o +141.86 251.416 o +285.482 274.935 o +214.496 179.054 o +410.802 305.456 o +315.708 192.239 o +349.155 215.149 o +179.225 275.243 o +140.752 316.968 o +183.235 98.4286 o +461.964 131.782 o +362.467 361.371 o +159.142 110.616 o +183.009 191.84 o +288.586 332.205 o +256.058 157.972 o +134.693 111.105 o +253.75 107.743 o +400.563 292.576 o +300.8 353.144 o +281.763 341.86 o +173.697 335.778 o +421.018 192.605 o +261.816 137.183 o +260.828 180.973 o +420.785 96.6778 o +255.143 179.255 o +307.907 94.1629 o +137.98 250.39 o +201.038 161.44 o +451.603 174.495 o +323.267 94.1423 o +408.375 116.034 o +193.208 266.852 o +316.01 150.97 o +422.729 209.021 o +368.968 156.24 o +280.863 192.522 o +234.134 123.962 o +153.166 305.691 o +262.035 229.698 o +311.38 186.389 o +308.443 157.173 o +119.652 267.468 o +311.365 179.635 o +338.046 171.422 o +186.684 219.232 o +229.438 291.378 o +444.719 285.297 o +412.153 290.719 o +444.74 129.61 o +484.222 120.615 o +181.576 336.288 o +158.158 136.535 o +196.094 245.995 o +393.576 220.268 o +227.753 355.021 o +250.242 95.606 o +222.758 200.339 o +386.853 241.779 o +438.61 88.8403 o +225.47 270.882 o +273.236 355.909 o +201.18 174.462 o +366.297 109.656 o +276.964 209.388 o +274.992 205.363 o +303.379 168.117 o +343.416 87.9614 o +195.293 183.188 o +238.394 109.974 o +467.927 257.092 o +322.17 321.093 o +358.518 180.909 o +353.988 273.713 o +329.22 255.194 o +489.475 90.9035 o +122.542 246.619 o +391.59 331.56 o +205.177 122.927 o +207.229 288.67 o +289.431 111.462 o +390.758 124.65 o +135.982 202.994 o +277.513 339.194 o +464.019 134.279 o +411.462 300.67 o +310.09 288.688 o +385.47 240.803 o +455.172 209.08 o +215.365 83.8475 o +389.44 335.117 o +220.399 155.926 o +306.422 323.686 o +123.959 273.269 o +127.257 238.495 o +470.385 172.798 o +233.811 309.813 o +402.089 194.862 o +147.875 339.717 o +205.831 148.86 o +124.892 242.701 o +184.541 246.283 o +296.533 186.43 o +390.433 331.309 o +314.324 162.535 o +144.118 223.441 o +222.014 85.9764 o +356.086 271.079 o +466.492 365.192 o +476.856 150.885 o +417.718 117.738 o +364.45 351.681 o +389.665 113.967 o +123.121 260.528 o +463.954 135.787 o +265.482 288.712 o +298.125 334.107 o +134.461 168.137 o +189.386 340.436 o +462.552 198.218 o +303.573 241.799 o +131.393 221.997 o +144.031 172.427 o +280.771 218.387 o +169.805 244.94 o +346.499 105.921 o +304.369 278.357 o +280.753 190.062 o +416.329 140.654 o +208.635 155.5 o +443.665 102.859 o +457.793 353.154 o +380.491 278.435 o +411.842 298.161 o +154.428 279.989 o +187.908 256.403 o +270.873 275.405 o +445.833 366.343 o +152.601 324.146 o +388.465 351.072 o +247.216 183.063 o +308.835 215.858 o +369.37 288.949 o +130.315 243.651 o +407.241 108.31 o +218.206 237.992 o +315.175 118.669 o +455.252 345.935 o +278.969 247.833 o +422.075 253.161 o +296.151 323.389 o +306.346 83.6648 o +329.028 248.308 o +256.226 148.281 o +188.366 101.465 o +235.592 160.708 o +181.088 229.763 o +338.228 337.531 o +132.997 290.14 o +316.134 258.428 o +444.229 144.232 o +330.485 295.114 o +391.362 86.2513 o +192.441 278.188 o +133.101 101.563 o +187.481 155.818 o +181.895 287.821 o +185.325 169.443 o +136.413 245.119 o +256.404 324.417 o +332.394 182.852 o +223.165 359.793 o +208.627 112.468 o +450.255 331.706 o +323.875 362.016 o +127.557 356.425 o +455.683 264.63 o +156.019 204.278 o +137.088 114.097 o +342.416 291.722 o +126.617 128.944 o +465.668 259.313 o +201.552 204.864 o +230.971 224.556 o +466.88 245.201 o +415.157 252.287 o +256.781 226.686 o +449.885 145.275 o +269.834 179.576 o +244.218 310.918 o +457.841 318.462 o +369.639 265.153 o +270.398 327.019 o +179.362 148.267 o +411.536 281.501 o +248.329 151.283 o +403.743 145.67 o +205.967 193.965 o +152.118 117.884 o +365.671 145.495 o +422.989 266.32 o +320.505 135.014 o +169.558 232.011 o +182.7 146.16 o +438.169 125.346 o +272.465 346.278 o +208.778 325.48 o +210.338 165.907 o +158.622 344.731 o +292.208 111.474 o +244.962 333.976 o +474.692 323.821 o +443.422 312.808 o +461.972 129.612 o +417.317 258.79 o +424.603 366.805 o +277.295 339.354 o +250.098 291.318 o +455.443 120.587 o +384.947 140.277 o +127.324 228.269 o +288.944 309.443 o +177.398 208.383 o +404.692 127.518 o +460.257 340.659 o +376.049 164.435 o +141.437 114.176 o +256.983 251.494 o +415.142 320.927 o +430.305 298.543 o +168.269 229.74 o +191.554 261.289 o +262.514 140.37 o +169.745 188.434 o +185.766 150.462 o +297.917 219.01 o +238.631 185.411 o +468.328 164.581 o +242.658 309.96 o +410.054 303.985 o +343.531 219.031 o +470.333 325.906 o +425.24 134.247 o +205.64 231.82 o +353.474 300.811 o +438.067 243.444 o +223.719 84.5693 o +331.511 272.617 o +338.91 257.627 o +221.947 150.375 o +232.974 255.249 o +232.555 223.414 o +369.132 182.276 o +117.738 288.333 o +373.469 358.488 o +383.729 226.038 o +481.341 212.39 o +253.477 250.498 o +462.695 174.113 o +155.171 224.574 o +411.099 275.894 o +455.595 284.871 o +136.417 218.051 o +151.322 266.042 o +179.838 165.783 o +162.408 356.066 o +219.369 118.214 o +355.801 238.081 o +412.696 295.37 o +285.094 282.256 o +320.649 185.403 o +215.232 176.756 o +383.496 235.53 o +196.352 144.404 o +346.134 234.998 o +189.808 345.967 o +476.996 108.907 o +297.717 265.013 o +475.816 287.095 o +182.646 247.516 o +450.711 186.425 o +312.88 180.805 o +260.297 330.697 o +320.963 164.92 o +115.336 346.817 o +223.07 148.25 o +284.689 140.709 o +382.819 141.848 o +422.43 191.848 o +417.825 269.326 o +407.422 95.2982 o +144.465 134.63 o +339.413 255.629 o +394.49 177.837 o +429.643 194.609 o +196.945 277.106 o +450.489 238.926 o +322.346 221.482 o +321.624 83.8704 o +123.935 317.764 o +194.282 348.145 o +314.227 363.433 o +367.797 197.475 o +316.266 217.362 o +412.409 157.167 o +343.699 150.974 o +280.492 164.453 o +292.752 351.185 o +267.757 298.468 o +237.517 188.241 o +326.081 208.039 o +323.07 135.736 o +416.763 255.479 o +438.707 219.32 o +238.801 188.223 o +256.379 202.286 o +213.124 186.439 o +299.33 102.944 o +200.341 304.537 o +341.647 143.874 o +265.679 355.6 o +480.968 102.481 o +377.918 188.184 o +379.368 305.439 o +405.715 159.391 o +263.099 203.631 o +450.151 89.6949 o +250.468 281.646 o +458.703 209.487 o +419.456 297.744 o +442.664 251.569 o +165.578 96.1867 o +238.637 332.818 o +351.982 90.5455 o +154.777 202.325 o +329.365 192.986 o +426.041 306.607 o +174.193 99.6708 o +192.697 300.728 o +208.049 259.504 o +420.117 321.661 o +373.246 196.299 o +379.655 269.88 o +197.944 103.654 o +169.22 118.546 o +335.136 105.581 o +458.294 313.053 o +407.343 198.627 o +339.286 327.941 o +318.386 298.237 o +241.482 114.018 o +203.971 248.294 o +178.313 1... [truncated message content] |
From: <jd...@us...> - 2007-10-25 18:16:06
|
Revision: 4003 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4003&view=rev Author: jdh2358 Date: 2007-10-25 11:16:03 -0700 (Thu, 25 Oct 2007) Log Message: ----------- added convolution example Modified Paths: -------------- trunk/py4science/examples/fft_imdenoise.py trunk/py4science/examples/skel/glass_dots1_skel.py trunk/py4science/examples/stock_records.py trunk/py4science/workbook/files_etc.tex trunk/py4science/workbook/main.tex Modified: trunk/py4science/examples/fft_imdenoise.py =================================================================== --- trunk/py4science/examples/fft_imdenoise.py 2007-10-25 16:24:28 UTC (rev 4002) +++ trunk/py4science/examples/fft_imdenoise.py 2007-10-25 18:16:03 UTC (rev 4003) @@ -14,16 +14,18 @@ def plot_spectrum(F, amplify=1000): """Normalise, amplify and plot an amplitude spectrum.""" - M = mag_phase(F)[0] + M, Phase = mag_phase(F) M *= amplify/M.max() M[M > 1] = 1 - + + print M.shape, M.dtype P.imshow(M, P.cm.Blues) try: # Read in original image, convert to floating point for further - # manipulation - im = S.misc.pilutil.imread('data/moonlanding.jpg').astype(float) + # manipulation; imread returns a MxNx4 RGBA image. Since the + # image is grayscale, just extrac the 1st channel + im = P.imread('data/moonlanding.png').astype(float)[:,:,0] except: print "Could not open image." sys.exit(-1) Modified: trunk/py4science/examples/skel/glass_dots1_skel.py =================================================================== --- trunk/py4science/examples/skel/glass_dots1_skel.py 2007-10-25 16:24:28 UTC (rev 4002) +++ trunk/py4science/examples/skel/glass_dots1_skel.py 2007-10-25 18:16:03 UTC (rev 4003) @@ -11,24 +11,19 @@ from pylab import figure, show def csqrt(x): - """ - sqrt func that handles returns sqrt(x)j for x<0 - """ + 'sqrt func that handles returns sqrt(x)j for x<0' XXX def myeig(M): """ compute eigen values and eigenvectors analytically - Solve quadratic: - lamba^2 - tau*lambda + Delta = 0 - where tau = trace(M) and Delta = Determinant(M) - + + Return value is lambda1, lambda2 """ XXX - return lambda1, lambda2 # 2000 random x,y points in the interval[-0.5 ... 0.5] X1 = XXX @@ -39,10 +34,7 @@ #name = 'center' #sx, sy, angle = XXX -#name = 'stable focus' # spiral -#sx, sy, angle = XXX - -name= 'spiral' +name = 'spiral' #stable focus sx, sy, angle = XXX theta = angle * pi/180. # the rotation in radians @@ -62,16 +54,14 @@ M = XXX # compute the eigenvalues using numpy linear algebra -vals, vecs = XXX -print 'numpy eigenvalues', vals +print 'numpy eigenvalues', XXX # compare with the analytic values from myeig -avals = myeig(M) -print 'analytic eigenvalues', avals +print 'analytic eigenvalues', myeig(M) # transform X1 by the matrix M X2 = XXX -# plot the original x,y as green dots and the transformed x, y as red +# plot the original X1 as green dots and the transformed X2 as red # dots -show() +XXX Modified: trunk/py4science/examples/stock_records.py =================================================================== --- trunk/py4science/examples/stock_records.py 2007-10-25 16:24:28 UTC (rev 4002) +++ trunk/py4science/examples/stock_records.py 2007-10-25 18:16:03 UTC (rev 4003) @@ -67,6 +67,6 @@ print '%s: %1.1f%%'%(ticker, 100*g) -p.savefig('fig/stock_records.png', dpi=100) -p.savefig('fig/stock_records.eps') +p.savefig('stock_records.png', dpi=100) +p.savefig('stock_records.eps') p.show() Modified: trunk/py4science/workbook/files_etc.tex =================================================================== --- trunk/py4science/workbook/files_etc.tex 2007-10-25 16:24:28 UTC (rev 4002) +++ trunk/py4science/workbook/files_etc.tex 2007-10-25 18:16:03 UTC (rev 4003) @@ -204,7 +204,7 @@ \par\end{center} -\subsection{Loading and saving binary data} +\section{Loading and saving binary data} \label{sec:binary_data} ASCII is bloated and slow for working with large arrays, and so binary Modified: trunk/py4science/workbook/main.tex =================================================================== --- trunk/py4science/workbook/main.tex 2007-10-25 16:24:28 UTC (rev 4002) +++ trunk/py4science/workbook/main.tex 2007-10-25 18:16:03 UTC (rev 4003) @@ -57,4 +57,11 @@ \input{trapezoid.tex} \input{quad_newton.tex} + +\chapter{Linear algebra} +\input{intro_linalg.tex} +\input{glass_dots.tex} + + + \end{document} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-26 19:48:15
|
Revision: 4024 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4024&view=rev Author: jdh2358 Date: 2007-10-26 12:48:03 -0700 (Fri, 26 Oct 2007) Log Message: ----------- updates to workbook Modified Paths: -------------- trunk/py4science/doc/linkfest trunk/py4science/examples/convolution_demo.py trunk/py4science/examples/fft_imdenoise.py trunk/py4science/examples/stock_records.py trunk/py4science/workbook/main.tex Added Paths: ----------- trunk/py4science/workbook/fft_imdenoise.tex trunk/py4science/workbook/fig/fft_imdenoise.eps trunk/py4science/workbook/fig/fft_imdenoise.png Modified: trunk/py4science/doc/linkfest =================================================================== --- trunk/py4science/doc/linkfest 2007-10-26 19:46:12 UTC (rev 4023) +++ trunk/py4science/doc/linkfest 2007-10-26 19:48:03 UTC (rev 4024) @@ -62,9 +62,9 @@ ipython: svn co http://ipython.scipy.org/svn/ipython/ipython/trunk ipython - matplotlib: svn co https://svn.sourceforge.net/svnroot/matplotlib/trunk/matplotlib matplotlib + matplotlib: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/matplotlib - py4science: svn co https://svn.sourceforge.net/svnroot/matplotlib/trunk/py4science py4science + py4science: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/py4science Important commands: Modified: trunk/py4science/examples/convolution_demo.py =================================================================== --- trunk/py4science/examples/convolution_demo.py 2007-10-26 19:46:12 UTC (rev 4023) +++ trunk/py4science/examples/convolution_demo.py 2007-10-26 19:48:03 UTC (rev 4024) @@ -71,4 +71,6 @@ ax2.plot(t, yi, label='fft') ax2.legend(loc='best') +fig.savefig('convolution_demo.png', dpi=150) +fig.savefig('convolution_demo.eps') show() Modified: trunk/py4science/examples/fft_imdenoise.py =================================================================== --- trunk/py4science/examples/fft_imdenoise.py 2007-10-26 19:46:12 UTC (rev 4023) +++ trunk/py4science/examples/fft_imdenoise.py 2007-10-26 19:48:03 UTC (rev 4024) @@ -73,4 +73,6 @@ P.title('Reconstructed Image') P.imshow(im_new, P.cm.gray) +P.savefig('fft_imdenoise.png', dpi=150) +P.savefig('fft_imdenoise.eps') P.show() Modified: trunk/py4science/examples/stock_records.py =================================================================== --- trunk/py4science/examples/stock_records.py 2007-10-26 19:46:12 UTC (rev 4023) +++ trunk/py4science/examples/stock_records.py 2007-10-26 19:48:03 UTC (rev 4024) @@ -37,7 +37,7 @@ r.sort() return r -tickers = 'INTC', 'MSFT', 'YHOO', 'GOOG', 'GE', 'WMT', 'AAPL' +tickers = 'SPY', 'QQQQ', 'INTC', 'MSFT', 'YHOO', 'GOOG', 'GE', 'WMT', 'AAPL' # we want to compute returns since 2003, so define the start date startdate = datetime.datetime(2003,1,1) Added: trunk/py4science/workbook/fft_imdenoise.tex =================================================================== --- trunk/py4science/workbook/fft_imdenoise.tex (rev 0) +++ trunk/py4science/workbook/fft_imdenoise.tex 2007-10-26 19:48:03 UTC (rev 4024) @@ -0,0 +1,47 @@ +Convolution of an input with with a linear filter in the termporal or +spatial domain is equivalent to multiplication by the fourier +transforms of the input and the filter in the spectral domain. This +provides a conceptually simple way to think about filtering: transform +your signal into the frequency domain, dampen the frequencies you are +not interested in by multiplying the frequency spectrum by the desired +weights, and then inverse transform the multiplies spectrum back into +the original domain. In the example below, we will simply set the +weights of the frequencies we are uninterested in (the high frequency +noise) to zero rather than dampening them with a smoothly varying +function. Although this is not usually the best thing to do, since +sharp edges in one domain usually introduce artifacts in another (eg +high frequency ``ringing''), it is easy to do and sometimes provides +satisfactory results. + +The image in the upper left panel of Figure~\ref{fig:fft_imdenoise} is +a grayscale photo of the moon landing. There is a banded pattern of +high frequency noise polluting the image. In the upper right panel we +see the 2D spatial frequency spectrum. The FFT output in +\texttt{scipy} is packed with the lower freqeuencies starting in the +upper left, and proceeding to higher frequencies as one moves to the +center of the spectrum (this is the most efficient way numerically to +fill the output of the FFT algorithm). Because the input signal is +real, the output spectrum is complex and symmetrical: the +transformation values beyond the midpoint of the frequency spectrum +(the Nyquist frequency) correspond to the values for negative +frequencies and are simply the mirror image of the positive +frequencies below the Nyquist (this is true for the 1D, 2D and ND FFTs +in \texttt{numpy}). + +In this exercise we will compute the 2D spatial frequency spectra of +the luminance image, zero out the high frequency components, and +inverse transform back into the time domain. We can plot the input +and output images with the \texttt{pylab.imshow} function, but the +images must first be scaled to be withing the 0..1 luminance range. +For best results, it helps to \textit{amplify} the image by some scale +factor, and then \textit{clip} it to set all values greater than one +to one. This serves to enhance contrast among the darker elements of +the image, so it is not completely dominated by the brighter segments + +\lstinputlisting[label=code:fft_imdenoise_skel,caption={IGNORED}]{skel/fft_imdenoise_skel.py} + +\begin{figure} +\begin{centering}\includegraphics[width=3in]{fig/fft_imdenoise}\par\end{centering} + +\caption{\label{fig:fft_imdenoise}High freqeuency noise filtering of a 2D image in the Fourier domain. The upper panels show the original image (left) and spectral power (right) and the lower panels show the same data with the high frequency power set to zero. Although the input and output images are grayscale, you can provide colormaps to \texttt{pylab.imshow} to plot them in psudo-color} +\end{figure} Added: trunk/py4science/workbook/fig/fft_imdenoise.eps =================================================================== --- trunk/py4science/workbook/fig/fft_imdenoise.eps (rev 0) +++ trunk/py4science/workbook/fig/fft_imdenoise.eps 2007-10-26 19:48:03 UTC (rev 4024) @@ -0,0 +1,9710 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: fft_imdenoise.eps +%%Creator: matplotlib version 0.90.1, http://matplotlib.sourceforge.net/ +%%CreationDate: Fri Oct 26 13:30:19 2007 +%%Orientation: portrait +%%BoundingBox: 11 173 600 618 +%%EndComments +%%BeginProlog +/mpldict 7 dict def +mpldict begin +/m { moveto } bind def +/l { lineto } bind def +/r { rlineto } bind def +/box { +m +1 index 0 r +0 exch r +neg 0 r +closepath +} bind def +/clipbox { +box +clip +newpath +} bind def +/ellipse { +newpath +matrix currentmatrix 7 1 roll +translate +scale +0 0 1 5 3 roll arc +setmatrix +closepath +} bind def +%!PS-Adobe-3.0 Resource-Font +%%Title: Bitstream Vera Sans +%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%%Creator: Converted from TrueType by PPR +25 dict begin +/_d{bind def}bind def +/_m{moveto}_d +/_l{lineto}_d +/_cl{closepath eofill}_d +/_c{curveto}_d +/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d +/_e{exec}_d +/FontName /BitstreamVeraSans-Roman def +/PaintType 0 def +/FontMatrix[.001 0 0 .001 0 0]def +/FontBBox[-182 -235 1287 928]def +/FontType 3 def +/Encoding StandardEncoding def +/FontInfo 10 dict dup begin +/FamilyName (Bitstream Vera Sans) def +/FullName (Bitstream Vera Sans) def +/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.) def +/Weight (Roman) def +/Version (Release 1.10) def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -213 def +/UnderlineThickness 143 def +end readonly def +/CharStrings 29 dict dup begin +/space{318 0 0 0 0 0 _sc +}_d +/zero{636 0 66 -13 570 742 _sc +318 664 _m +267 664 229 639 203 589 _c +177 539 165 464 165 364 _c +165 264 177 189 203 139 _c +229 89 267 64 318 64 _c +369 64 407 89 433 139 _c +458 189 471 264 471 364 _c +471 464 458 539 433 589 _c +407 639 369 664 318 664 _c +318 742 _m +399 742 461 709 505 645 _c +548 580 570 486 570 364 _c +570 241 548 147 505 83 _c +461 19 399 -13 318 -13 _c +236 -13 173 19 130 83 _c +87 147 66 241 66 364 _c +66 486 87 580 130 645 _c +173 709 236 742 318 742 _c +_cl}_d +/one{636 0 110 0 544 729 _sc +124 83 _m +285 83 _l +285 639 _l +110 604 _l +110 694 _l +284 729 _l +383 729 _l +383 83 _l +544 83 _l +544 0 _l +124 0 _l +124 83 _l +_cl}_d +/two{{636 0 73 0 536 742 _sc +192 83 _m +536 83 _l +536 0 _l +73 0 _l +73 83 _l +110 121 161 173 226 239 _c +290 304 331 346 348 365 _c +380 400 402 430 414 455 _c +426 479 433 504 433 528 _c +433 566 419 598 392 622 _c +365 646 330 659 286 659 _c +255 659 222 653 188 643 _c +154 632 117 616 78 594 _c +78 694 _l +118 710 155 722 189 730 _c +223 738 255 742 284 742 _c +359 742 419 723 464 685 _c +509 647 532 597 532 534 _c +532 504 526 475 515 449 _c +504 422 484 390 454 354 _c +446 344 420 317 376 272 _c +332 227 271 164 192 83 _c +_cl}_e}_d +/three{{636 0 76 -13 556 742 _sc +406 393 _m +453 383 490 362 516 330 _c +542 298 556 258 556 212 _c +556 140 531 84 482 45 _c +432 6 362 -13 271 -13 _c +240 -13 208 -10 176 -4 _c +144 1 110 10 76 22 _c +76 117 _l +103 101 133 89 166 81 _c +198 73 232 69 268 69 _c +330 69 377 81 409 105 _c +441 129 458 165 458 212 _c +458 254 443 288 413 312 _c +383 336 341 349 287 349 _c +202 349 _l +202 430 _l +291 430 _l +339 430 376 439 402 459 _c +428 478 441 506 441 543 _c +441 580 427 609 401 629 _c +374 649 336 659 287 659 _c +260 659 231 656 200 650 _c +169 644 135 635 98 623 _c +98 711 _l +135 721 170 729 203 734 _c +235 739 266 742 296 742 _c +}_e{370 742 429 725 473 691 _c +517 657 539 611 539 553 _c +539 513 527 479 504 451 _c +481 423 448 403 406 393 _c +_cl}_e}_d +/four{636 0 49 0 580 729 _sc +378 643 _m +129 254 _l +378 254 _l +378 643 _l +352 729 _m +476 729 _l +476 254 _l +580 254 _l +580 172 _l +476 172 _l +476 0 _l +378 0 _l +378 172 _l +49 172 _l +49 267 _l +352 729 _l +_cl}_d +/five{{636 0 77 -13 549 729 _sc +108 729 _m +495 729 _l +495 646 _l +198 646 _l +198 467 _l +212 472 227 476 241 478 _c +255 480 270 482 284 482 _c +365 482 429 459 477 415 _c +525 370 549 310 549 234 _c +549 155 524 94 475 51 _c +426 8 357 -13 269 -13 _c +238 -13 207 -10 175 -6 _c +143 -1 111 6 77 17 _c +77 116 _l +106 100 136 88 168 80 _c +199 72 232 69 267 69 _c +323 69 368 83 401 113 _c +433 143 450 183 450 234 _c +450 284 433 324 401 354 _c +368 384 323 399 267 399 _c +241 399 214 396 188 390 _c +162 384 135 375 108 363 _c +108 729 _l +_cl}_e}_d +/six{{636 0 70 -13 573 742 _sc +330 404 _m +286 404 251 388 225 358 _c +199 328 186 286 186 234 _c +186 181 199 139 225 109 _c +251 79 286 64 330 64 _c +374 64 409 79 435 109 _c +461 139 474 181 474 234 _c +474 286 461 328 435 358 _c +409 388 374 404 330 404 _c +526 713 _m +526 623 _l +501 635 476 644 451 650 _c +425 656 400 659 376 659 _c +310 659 260 637 226 593 _c +192 549 172 482 168 394 _c +187 422 211 444 240 459 _c +269 474 301 482 336 482 _c +409 482 467 459 509 415 _c +551 371 573 310 573 234 _c +573 159 550 99 506 54 _c +462 9 403 -13 330 -13 _c +246 -13 181 19 137 83 _c +92 147 70 241 70 364 _c +70 479 97 571 152 639 _c +206 707 280 742 372 742 _c +}_e{396 742 421 739 447 735 _c +472 730 498 723 526 713 _c +_cl}_e}_d +/F{575 0 98 0 517 729 _sc +98 729 _m +517 729 _l +517 646 _l +197 646 _l +197 431 _l +486 431 _l +486 348 _l +197 348 _l +197 0 _l +98 0 _l +98 729 _l +_cl}_d +/I{295 0 98 0 197 729 _sc +98 729 _m +197 729 _l +197 0 _l +98 0 _l +98 729 _l +_cl}_d +/O{787 0 56 -13 731 742 _sc +394 662 _m +322 662 265 635 223 582 _c +181 528 160 456 160 364 _c +160 272 181 199 223 146 _c +265 92 322 66 394 66 _c +465 66 522 92 564 146 _c +606 199 627 272 627 364 _c +627 456 606 528 564 582 _c +522 635 465 662 394 662 _c +394 742 _m +496 742 577 707 639 639 _c +700 571 731 479 731 364 _c +731 248 700 157 639 89 _c +577 21 496 -13 394 -13 _c +291 -13 209 21 148 89 _c +86 157 56 248 56 364 _c +56 479 86 571 148 639 _c +209 707 291 742 394 742 _c +_cl}_d +/R{{695 0 98 0 666 729 _sc +444 342 _m +465 334 486 319 506 296 _c +526 272 546 240 566 199 _c +666 0 _l +560 0 _l +467 187 _l +443 235 419 268 397 284 _c +374 300 343 308 304 308 _c +197 308 _l +197 0 _l +98 0 _l +98 729 _l +321 729 _l +404 729 466 711 507 677 _c +548 642 569 589 569 519 _c +569 473 558 434 537 404 _c +515 374 484 353 444 342 _c +197 648 _m +197 389 _l +321 389 _l +368 389 404 400 428 422 _c +452 444 465 476 465 519 _c +465 561 452 593 428 615 _c +404 637 368 648 321 648 _c +197 648 _l +_cl}_e}_d +/S{{635 0 66 -13 579 742 _sc +535 705 _m +535 609 _l +497 627 462 640 429 649 _c +395 657 363 662 333 662 _c +279 662 237 651 208 631 _c +179 610 165 580 165 542 _c +165 510 174 485 194 469 _c +213 452 250 439 304 429 _c +364 417 _l +437 403 491 378 526 343 _c +561 307 579 260 579 201 _c +579 130 555 77 508 41 _c +460 5 391 -13 300 -13 _c +265 -13 228 -9 189 -2 _c +150 5 110 16 69 32 _c +69 134 _l +109 111 148 94 186 83 _c +224 71 262 66 300 66 _c +356 66 399 77 430 99 _c +460 121 476 152 476 194 _c +476 230 465 258 443 278 _c +421 298 385 313 335 323 _c +275 335 _l +201 349 148 372 115 404 _c +82 435 66 478 66 534 _c +66 598 88 649 134 686 _c +179 723 242 742 322 742 _c +}_e{356 742 390 739 426 733 _c +461 727 497 717 535 705 _c +_cl}_e}_d +/a{{613 0 60 -13 522 560 _sc +343 275 _m +270 275 220 266 192 250 _c +164 233 150 205 150 165 _c +150 133 160 107 181 89 _c +202 70 231 61 267 61 _c +317 61 357 78 387 114 _c +417 149 432 196 432 255 _c +432 275 _l +343 275 _l +522 312 _m +522 0 _l +432 0 _l +432 83 _l +411 49 385 25 355 10 _c +325 -5 287 -13 243 -13 _c +187 -13 142 2 109 33 _c +76 64 60 106 60 159 _c +60 220 80 266 122 298 _c +163 329 224 345 306 345 _c +432 345 _l +432 354 _l +432 395 418 427 391 450 _c +364 472 326 484 277 484 _c +245 484 215 480 185 472 _c +155 464 127 453 100 439 _c +100 522 _l +}_e{132 534 164 544 195 550 _c +226 556 256 560 286 560 _c +365 560 424 539 463 498 _c +502 457 522 395 522 312 _c +_cl}_e}_d +/c{{550 0 55 -13 488 560 _sc +488 526 _m +488 442 _l +462 456 437 466 411 473 _c +385 480 360 484 334 484 _c +276 484 230 465 198 428 _c +166 391 150 339 150 273 _c +150 206 166 154 198 117 _c +230 80 276 62 334 62 _c +360 62 385 65 411 72 _c +437 79 462 90 488 104 _c +488 21 _l +462 9 436 0 410 -5 _c +383 -10 354 -13 324 -13 _c +242 -13 176 12 128 64 _c +79 115 55 185 55 273 _c +55 362 79 432 128 483 _c +177 534 244 560 330 560 _c +358 560 385 557 411 551 _c +437 545 463 537 488 526 _c +_cl}_e}_d +/d{{635 0 55 -13 544 760 _sc +454 464 _m +454 760 _l +544 760 _l +544 0 _l +454 0 _l +454 82 _l +435 49 411 25 382 10 _c +353 -5 319 -13 279 -13 _c +213 -13 159 13 117 65 _c +75 117 55 187 55 273 _c +55 359 75 428 117 481 _c +159 533 213 560 279 560 _c +319 560 353 552 382 536 _c +411 520 435 496 454 464 _c +148 273 _m +148 207 161 155 188 117 _c +215 79 253 61 301 61 _c +348 61 385 79 413 117 _c +440 155 454 207 454 273 _c +454 339 440 390 413 428 _c +385 466 348 485 301 485 _c +253 485 215 466 188 428 _c +161 390 148 339 148 273 _c +_cl}_e}_d +/e{{615 0 55 -13 562 560 _sc +562 296 _m +562 252 _l +149 252 _l +153 190 171 142 205 110 _c +238 78 284 62 344 62 _c +378 62 412 66 444 74 _c +476 82 509 95 541 113 _c +541 28 _l +509 14 476 3 442 -3 _c +408 -9 373 -13 339 -13 _c +251 -13 182 12 131 62 _c +80 112 55 181 55 268 _c +55 357 79 428 127 481 _c +175 533 241 560 323 560 _c +397 560 455 536 498 489 _c +540 441 562 377 562 296 _c +472 322 _m +471 371 457 410 431 440 _c +404 469 368 484 324 484 _c +274 484 234 469 204 441 _c +174 413 156 373 152 322 _c +472 322 _l +_cl}_e}_d +/f{352 0 23 0 371 760 _sc +371 760 _m +371 685 _l +285 685 _l +253 685 230 678 218 665 _c +205 652 199 629 199 595 _c +199 547 _l +347 547 _l +347 477 _l +199 477 _l +199 0 _l +109 0 _l +109 477 _l +23 477 _l +23 547 _l +109 547 _l +109 585 _l +109 645 123 690 151 718 _c +179 746 224 760 286 760 _c +371 760 _l +_cl}_d +/g{{635 0 55 -207 544 560 _sc +454 280 _m +454 344 440 395 414 431 _c +387 467 349 485 301 485 _c +253 485 215 467 188 431 _c +161 395 148 344 148 280 _c +148 215 161 165 188 129 _c +215 93 253 75 301 75 _c +349 75 387 93 414 129 _c +440 165 454 215 454 280 _c +544 68 _m +544 -24 523 -93 482 -139 _c +440 -184 377 -207 292 -207 _c +260 -207 231 -204 203 -200 _c +175 -195 147 -188 121 -178 _c +121 -91 _l +147 -105 173 -115 199 -122 _c +225 -129 251 -133 278 -133 _c +336 -133 380 -117 410 -87 _c +439 -56 454 -10 454 52 _c +454 96 _l +435 64 411 40 382 24 _c +353 8 319 0 279 0 _c +211 0 157 25 116 76 _c +75 127 55 195 55 280 _c +55 364 75 432 116 483 _c +157 534 211 560 279 560 _c +}_e{319 560 353 552 382 536 _c +411 520 435 496 454 464 _c +454 547 _l +544 547 _l +544 68 _l +_cl}_e}_d +/i{278 0 94 0 184 760 _sc +94 547 _m +184 547 _l +184 0 _l +94 0 _l +94 547 _l +94 760 _m +184 760 _l +184 646 _l +94 646 _l +94 760 _l +_cl}_d +/l{278 0 94 0 184 760 _sc +94 760 _m +184 760 _l +184 0 _l +94 0 _l +94 760 _l +_cl}_d +/m{{974 0 91 0 889 560 _sc +520 442 _m +542 482 569 511 600 531 _c +631 550 668 560 711 560 _c +767 560 811 540 842 500 _c +873 460 889 403 889 330 _c +889 0 _l +799 0 _l +799 327 _l +799 379 789 418 771 444 _c +752 469 724 482 686 482 _c +639 482 602 466 575 435 _c +548 404 535 362 535 309 _c +535 0 _l +445 0 _l +445 327 _l +445 379 435 418 417 444 _c +398 469 369 482 331 482 _c +285 482 248 466 221 435 _c +194 404 181 362 181 309 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +201 495 226 520 255 536 _c +283 552 317 560 357 560 _c +397 560 430 550 458 530 _c +486 510 506 480 520 442 _c +}_e{_cl}_e}_d +/n{634 0 91 0 549 560 _sc +549 330 _m +549 0 _l +459 0 _l +459 327 _l +459 379 448 417 428 443 _c +408 469 378 482 338 482 _c +289 482 251 466 223 435 _c +195 404 181 362 181 309 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +202 494 227 519 257 535 _c +286 551 320 560 358 560 _c +420 560 468 540 500 501 _c +532 462 549 405 549 330 _c +_cl}_d +/o{612 0 55 -13 557 560 _sc +306 484 _m +258 484 220 465 192 427 _c +164 389 150 338 150 273 _c +150 207 163 156 191 118 _c +219 80 257 62 306 62 _c +354 62 392 80 420 118 _c +448 156 462 207 462 273 _c +462 337 448 389 420 427 _c +392 465 354 484 306 484 _c +306 560 _m +384 560 445 534 490 484 _c +534 433 557 363 557 273 _c +557 183 534 113 490 63 _c +445 12 384 -13 306 -13 _c +227 -13 165 12 121 63 _c +77 113 55 183 55 273 _c +55 363 77 433 121 484 _c +165 534 227 560 306 560 _c +_cl}_d +/p{{635 0 91 -207 580 560 _sc +181 82 _m +181 -207 _l +91 -207 _l +91 547 _l +181 547 _l +181 464 _l +199 496 223 520 252 536 _c +281 552 316 560 356 560 _c +422 560 476 533 518 481 _c +559 428 580 359 580 273 _c +580 187 559 117 518 65 _c +476 13 422 -13 356 -13 _c +316 -13 281 -5 252 10 _c +223 25 199 49 181 82 _c +487 273 _m +487 339 473 390 446 428 _c +418 466 381 485 334 485 _c +286 485 249 466 222 428 _c +194 390 181 339 181 273 _c +181 207 194 155 222 117 _c +249 79 286 61 334 61 _c +381 61 418 79 446 117 _c +473 155 487 207 487 273 _c +_cl}_e}_d +/r{411 0 91 0 411 560 _sc +411 463 _m +401 469 390 473 378 476 _c +366 478 353 480 339 480 _c +288 480 249 463 222 430 _c +194 397 181 350 181 288 _c +181 0 _l +91 0 _l +91 547 _l +181 547 _l +181 462 _l +199 495 224 520 254 536 _c +284 552 321 560 365 560 _c +371 560 378 559 386 559 _c +393 558 401 557 411 555 _c +411 463 _l +_cl}_d +/s{{521 0 54 -13 472 560 _sc +443 531 _m +443 446 _l +417 458 391 468 364 475 _c +336 481 308 485 279 485 _c +234 485 200 478 178 464 _c +156 450 145 430 145 403 _c +145 382 153 366 169 354 _c +185 342 217 330 265 320 _c +296 313 _l +360 299 405 279 432 255 _c +458 230 472 195 472 151 _c +472 100 452 60 412 31 _c +372 1 316 -13 246 -13 _c +216 -13 186 -10 154 -5 _c +122 0 89 8 54 20 _c +54 113 _l +87 95 120 82 152 74 _c +184 65 216 61 248 61 _c +290 61 323 68 346 82 _c +368 96 380 117 380 144 _c +380 168 371 187 355 200 _c +339 213 303 226 247 238 _c +216 245 _l +160 257 119 275 95 299 _c +70 323 58 356 58 399 _c +58 450 76 490 112 518 _c +148 546 200 560 268 560 _c +}_e{301 560 332 557 362 552 _c +391 547 418 540 443 531 _c +_cl}_e}_d +/t{392 0 27 0 368 702 _sc +183 702 _m +183 547 _l +368 547 _l +368 477 _l +183 477 _l +183 180 _l +183 135 189 106 201 94 _c +213 81 238 75 276 75 _c +368 75 _l +368 0 _l +276 0 _l +206 0 158 13 132 39 _c +106 65 93 112 93 180 _c +93 477 _l +27 477 _l +27 547 _l +93 547 _l +93 702 _l +183 702 _l +_cl}_d +/u{634 0 85 -13 543 547 _sc +85 216 _m +85 547 _l +175 547 _l +175 219 _l +175 167 185 129 205 103 _c +225 77 255 64 296 64 _c +344 64 383 79 411 110 _c +439 141 453 183 453 237 _c +453 547 _l +543 547 _l +543 0 _l +453 0 _l +453 84 _l +431 50 405 26 377 10 _c +348 -5 315 -13 277 -13 _c +214 -13 166 6 134 45 _c +101 83 85 140 85 216 _c +_cl}_d +end readonly def + +/BuildGlyph + {exch begin + CharStrings exch + 2 copy known not{pop /.notdef}if + true 3 1 roll get exec + end}_d + +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +}_d + +FontName currentdict end definefont pop +%%EOF +end +%%EndProlog +mpldict begin +11.7 173.7 translate +588.6 444.6 0 0 clipbox +gsave +1.000 setgray +1.000 setlinewidth +0 setlinejoin +2 setlinecap +[] 0 setdash +0 0 m +0 444.6 l +588.6 444.6 l +588.6 0 l +closepath +gsave +fill +grestore +stroke +grestore +gsave +0.000 setgray +73.575 241.301 m +73.575 397.306 l +280.923 397.306 l +280.923 241.301 l +closepath +gsave +1.000 setgray +fill +grestore +stroke +grestore +gsave +207.348 156.004 73.575 241.301 clipbox +73.575 241.301396104 translate +207.36 156.24 scale +/DataString 288 string def +288 217 8 [ 288 0 0 -217 0 217 ] +{ +currentfile DataString readhexstring pop +} bind image +579b5269825289595394527380529e62759753a06d6a98528c6d539652657f528a5d5597527f7e59a55f7b8c57a7656a8e528a63529252647e528d60609e538a +7a60ae5b828357a35c6a8652875752905269805294636a9e55947465a3568879569b5268815287575292527180529c637397539e6d6998528a6f539652647f52 +8a5d5598537e7e58a5607b8e57a5666a8f528a63529052647e528d605f9e53897b5faf5c828557a35d6a885288595290526881529363699e55937665a357877b +579c5269845287585294527182529c637399529d6f6899528a6f529652658052895f5398527d8157a5607b9057a5686a92528d655295526581528e635f9e5388 +7d5fb05d828857a55e6a88528859529252678152926369a055927664a557877e59ba6d69c32fbe8d33f71fbe9428dd4696a537c46f6ac44099ab38e33f82d51a +e84c73cb35ab8456c65f7bb428d37c51d513dd8140ef24be904bbc6a6dc04e98a730f03a84c01ff82e84c422e6517ab25a89aa48b4824bec0bc88835ee08d184 +43e326ad9758a58d51c6557ed902eb4679d902e2497cc525ce7369b26c71bb3ab69029fa1abe9323ed34a7983bd7577fb34d9ca240d9477ade11e74d71df24ba +7164d24a929f3fc9775ccf1fca8537f424be993eca5b7eb742a78e49db358db729ee2e84cd20e64f79bc4c979c49ba775ed408cb8641e306db8543ea28ba9355 +af7f58c35788c80eee447dcf0ef44081c726e76674b1697ab743b29035fc14c09329fe22b98f3fe34294a5569d9c48d35179ed0be74b71ea14ca5e6fcc31ad8c +00c0007c1d1966005512453387005b3d0bb302b00d0da100b1133b3e19522636146f049a0e258103d400664300be1d6f172b342d4034440aa1007d1a05c300a3 +032b8f1a8230441f3b335e210d7a00ad04497105ae0067281884494b2c3b1a6a24762800a5009f021089068a003550424f5a2b1a671a9e083d6c00bc01773312 +7e005b113b4b741449450da10baf1806a300bb0a2c531267123822631a8c171d7f08de005c5000c50d7614224b104a1f4a1a9d006a2f06c600a7061d9c099821 +44282342452d087b00a509328302c0006936029d355c2034245030553400a500900b00a3029700306d316645381a56268111277700b601654f0c960060182f65 +622f3e46148c169e2102a500af031f6b0b790136355531761f19770ec1004d60380a65006f173b510099007112047b186b0247283a3b3a40007b02790b146f00 +8f005538225d1455064a2d6613255d00930676290a81007902354632430b4f1167197b1f028400a7003e4d00860462143f232c3a0a5d119500474500a9018208 +1d5d006a0e4f18521a323d0588008c04207c00a20457270c6b2748035c005b21285e00a000662200930e77013b37284b284c0173086216028200900043501676 +0d5b0c373d5121166500850d573e048f007500205c2557044e1a5128562e00830093002b5b008a005e22323d204604571b8101355100a2027f16136f00760646 +2b43261d490a7d06880e108300af024c37027e1456084f0a462d186306a300583400ae087e022e4a14591a5109660e4b2b0290008d0031690b8a085b1720513f +00be0063020a46003d022b186f001d1600b3019200007100ba03191404201a1d016b046300035c00d400321100af0b6000120b242710210396004c0400c40094 +00083d17860b200223115216006d0099001a2f01a00049000d672841031d0160103b0e009c008c00036f006f0018163e4e1b0b00550699060d4100b800510d06 +630044002629560e0e1a009e048300008500c701122b00350a1f0660184300006501df00211a00c00465000e240c32062b088800330d00c80097000057069e06 +1b060917351a00740081000d4b00b8003e0800851950001703461a1d1a009f006b01009800840011232b67131a00420b7b0d025a00ac00331a037f0049001d44 +412608210085096404009400ae0006480052011b0c522d2603006303c000182c350d3503620d282901a30062110a810d630a231a413a34230565067d08126700 +94002921146810300d3d266a141a36019505671a06810077061d431a3610270d71176b140b7102b90122350383033f11272e1b1d0e4c0aa200282501b7017d0d +1451006a0a28162f122f200690008a08166800b505361a0c62233f0c35054b121a3f01ae00511801a0096f0820222b4a1b2603580960120b8200950024420d82 +0c37102f3651251336017e0849220492006c0a165e144b0c28135e26501a066d039d001a4a008c003416204716240d4a148901203001aa0176120c6a00750524 +2722181d250986067f0d107100c5032823067513420d31113417144a04b3003f1d01c00577091a341658102808450d481a06980090021b5b0699083a141a493b +01fc00ca7336b03597667c4fd206af7730db04ee3b43f200e82c7b95499d64735cb906e82274cd0bf411af9305f430ae665f8a606f828717fa00d45e18fa0ddb +355adf29a55e75796f6b964466d000f60898be0edd1db17f27b46f6f7d6f609741c0651bf600f23040d921c63b6c9669639d4d6a9e41cb0d8ebc00fc00c58628 +c02ca56a6a6fb323a17b3dc816f84733f200fe1a6da93bad4c7a64a223dd336ac619fc0ca5a104fe17c0674e9a48816f8629f800be6c1ff206e3334bec0dc447 +7a825a80805e5ace00ef1083cb05e818b18900cf518c6c69718056a07c13f800e9481fe918cf3860b64e7f8063718a52b41f7fc600fb03b0a01dcd25a974508f +9545977a4bb428ee5525f400fa205cc52fba3e77748a3fc13f63b429e70599ad349644568a1f8a5725ba1d8e7503b1416a7f16a5474ca21b747a30b110579b1a +ae3647a22477732f9c336f8c14ae5245a31f9b4e1fb120897321964b409b287b7630c9165d9229c72156950da3384b8e355e8021885250bb06a26329be249653 +20b2137776307f5b259b295b9a1dbc2c50a714b1484f9903935a3d8f4353861d865d2bc317926f0abe3b7b6f1ab733599228796f2ca71a52a11db03548b02087 +6a3ba7207b7d23a34d4c981d8f511db321897910a0475190218e623bb71268882dbe0d569a12a7364a952d677c238f485ea701a55e35b2209a501fb01a82732c +875527992f638e21c32551a020c436519708a34b478a3d52831f845c3bc910976a17ce3386601db8236784307a6828a12352aa1fb33447b21a995b43a10c856f +3b1b5f00571f485f026000671712511a57195c40242d4f510a6306500d1d5f0060006040223f1760264a3244133f6200630a5f3a11600062043f3738441f5f25 +4514712f1366005e0349550560055c1a3b1d334b215b1759005c52016702601d2b5f0050185a1a5925314c105a006a0e3368005b0a60421b56224a1157004e2c +36600160006929015e115c17504d17363a5d04620d46250b60006300565b174b1260303e3e3b282d62005f12584c08600064022c43294e1a6030361f66420c64 +015900355b0060006028302e245b2053224f004f5d00640260291d63005c0d50274d342c571751066d1b2267005f06594e0d601653124b084238285f0a600065 +3e0168096016405a0c4228600a60183b38086000660544680c530d60362f483500a3016a06182f0056043e1b6a002428068f0198040077009006331d022d1a35 +066d0462000a6601a9004b1a00a70d5c0d30051d350d44038a004d0d03a2009002174a146a0d3f102d0c5120017c0085002837018100670d0e672c331345064b +19421d0099007e01066b0071003b143a431f23105d0083080957009b005e040d4a0062062c2f560c1a3a067b058803008a009c041f3000440b410a60174b040c +7101b300342700aa05680a25160a4503470b8300341604a30199030664067c0a3d12101a3529047d00770014530095005c1100851d42103d0436262535009400 +6a05008a0080002b2d28550e35104a016f12026a009200451a066500680b2147421d174406650d6a0800970090011149005c00440d502b34120d6f009e001841 +3b2844146f092c2104c0046a20068f1068220c2b4e412d131f710b930a1a7901ac0d202f14771d1b2b3a1d7417303110a704671d0a8a04901d1b4c193529141f +87175d0b1a7e06dd051d4102940d46272e3b2710264b0dbb0233200ad002871b0d4f03811f20232b113f1619b100900c1a6400d30e232c045f2344264116560a +283502cd044f2003b40c771f0d323456271720600d760e199a01aa0d1a350c9619292f282957272d3f128f06411f08a70481201468144c2812246f293b0b1b7e +08bb041b5902a30d372923552310284a149b012f250dc4017e1b0c65038f1d21321d14331a1aa3067c0c1a7703e80b1d2f047b1447263a203f0d274906d4033f +2106d908801d0d3b1b6a251620460e5a1318bb01a30d194b05b2142b2d14423f00fe00d70d3b7101af058a34cf00466f02d903f4020cdd00e6027b3a297b327b +04c606be0d18cb01f4019c3800f41dae0468142b73309508fc00a52301f700e502449029a31a8a0b693d7b4104f200eb0065920acf01c6081aae585e06900476 +3b845a00fc00df0510b501c902843b6a644e5b05a714bc0e28b100fe00c730289301c5056f55a7131d8503c010ee0c02f200fe01605e169a168e08a9239c2405 +d101fc007b6000ff0dc80452411090169918fa00774c01f400ed0224b80dc00b8a1a47585f5504ea00d9003bb602e301b51200d03b850583055055587f00fc00 +c91000d401d90269604f80327a058f25a02506d300f8009d5c18b201c805467a822f089203a321c32d01fc00f400358905b503921d8f3f763d04c006df00568a +8051d912c03da3c00bde05e15527b33db53da58453679d9b26de17be2050d503de0dc59a4e8a4fba52946f942885d50cd614db7922de03de24857e778a57b74c +9a2ee15d3ade06d90899bc0dde17cb58874e828d51be35cc02bcac09de05d54359d200b83eb84ac051869726cc00de246adf00cc1dc78735c6499e46c618af52 +7fd509de05e17404c928c13593a335807ab220de25af4f2fdb03de0ca5c833a33ec162798f7c5369dd0dcf24cc9f16de04df365e955ca149b5647d47cb7a2bde +0dce0177ca03de0dd6716d6a69aa4cad4db401a0c40add06d95b37de00d32ba7609f6b71ac35b80de13f51de03d914b4a120de34b648ac2c9a6b64cc1ade04d3 +9006dd18cc357ac31d985bbc2cdb379e761dde02de1288e21ab82ec66f59a5682ca04f4c44176043355121666b0b4c2040933b981b268c35905118560935601a +515247811a315e42af3451360ca755494d1351432c5b1d52742e662930a340853611872f6f51144f133b7d14515a4989312d58318a444d4a0b8a5c3051174d58 +2c79014383407e431b7c34624a0e60365967024a40469b144850379748453d1d6c4c3a511f71670c4c22457e3599132e8a3e9550125f193b571a514a4a7f123a +5c44c0284e3e1ba7514b49135a3f30512159711f572037a53f8e2c1a8e2f7b51195000386f17515b4c862826603b9b3d504101975a3b4f124f50296a134c7f3a +7437248f3b7143067133605c0b4f2e408c13505941923e3749267b494351187d631b5021496b328f0a368c428a4e176b284a511a52414e7a09425346b11d484d +04800077262741006a3058256c0053481971027f13177a0074145042234d28502365036a103276037d0a5e45037b135f2c431f1746355d148100681f0b7d007b +203565165228573f45283e271980007f014d59066d0675320e5b343a3a5b1b4424533e11800075030d6402712555443532403f3b600e5f092c6f03800075311a +5100753146325f0a49531b670a801d108100800c404b165c255a2b57125c1d2e710680064d510481096a2435290655305e1980006035127c007d1a236f06601f +573d3337333a1d790077063b6b02760b6b3b0069234d35531d313341511180006f0a006d00772446512840364f41551a50161a7c008000624211600175342f46 +4c1f475d1d5914712d1080007d052b570b68255c3649204e2d326a0971043f6327452d27500527051a9210512f027d0e4b3f013d3b2f37053f521077051d560d +7f250d350b6028114a242163104425227f084f0e14691365370d4e091d470838641357092f640db00e1436096b282c3d1d3727013d2e209605351816ac0a6623 +0c4109583a0d3a100146082e7e0a77171d5501a51f1938024a322d432d2640042f1a1a9d0d40270597105737043d283b370643420d6305226b0e812209310575 +281d4e1928501a472c2467063406177c135d3509600d3348063b531f3f03366210960618430b7728203814472902432f217f00361d1b9e09601a0e5110623a10 +400601430933770a6a11256206bb191233055c2b2e412628330235291da50b35210db70e602f083b17473a0a3e2808520628860d801d1244028a261f450a3a41 +0bed0d96181d5612741d4a2b9904313013c606c40d0d9a08db143e35063b35461b9c128406148a0be90c5a2004de18851a3821354b1d5218ce0966180dee0ac8 +14134e22a0184c1d2e10742d1bae0ebe0b355109b310831d14833d501d511a6c24561714d40bc011119a0a9b1a431d57661a1d1a7a0ebc0d1b6d0de30d851712 +6c12831d3d417714244614a90cac0a0eb40af014244e095d254d1d8c285e0516960cf809382f06f410921929361d5e1d581bbe064a2210e808cc1109740eba16 +4d23052453381bb30ea709167409ce0e741a00ac286a1b481a5535343e17d70b97130bc80bb2182b28407f1a3b1d5a10a11a1b900dd50d60270b8e12881f2f5e +5c2d1f55179014850613cb0be1131b6f0a7d1d511d77423a0919950dde06234a8f14ea00d3489ce205ee00ee3025b93ed102d960526f90c401ee0cc3213fdd00 +ee00ec8c538e32ed06b06d9d2857ee01ee16e97725ee00ee03967d869f14e826a731ea6a10ee00e800aaae05ee09df31903b74b21adb28db00b0be00ee03ed1a +60d000c521d93bdb5364b608dd00ee1f5eee00dd06ee5f3fd447b103d500b96666ec01ee00e75f00d426df02b987388963dd02ee1daa530ce900ee00c0c738ae +1fee169097845d30ee00e328d1ad13ee00ee01669762bb03e93d834ccc9a01ee00d9017ac700ee00eb57766551d609cb45c00187de00ee05ee4344e900e20ebe +59b77943d214c80eee3e32ee00e902d58d1dee2dcc14b70e9c883ee810ee00d29000ed14e90296b11fa341ec16ee358d8803ee00ee0893ee1dc710ee366cb26a +0dd510b735407a16a236854fb20168771dbc04db1428d203bb227d5e337d507b319614bc2238c109d30da25906d52d94316a3d2e6a568f2bca049e380dd106cd +2253a723893b8a4169487c3b2ebe13d30d6d9910b714bc3814a75e593b90286d37985d21cc0abe1b13a506b42c846053566963369b24a70d4cad10d310b74e2d +9017b73769679e0e4d8921a911e1241dd606cc1f63761f923d8a358228a9352cba0dd90989750ad91ba72d56581d83439336cc038a5c14cf05d41d3ac00c9f2d +8a494d5f6a5930b312ca144fb608c613b43d00bb467736842b504d757d24cb08b22506bb08c1286f80406b517c3d873496222bbc12d41098711da518bc3a4789 +832f4095259021cb3e1dd10ac81a428e11a3318f486f3b8e4b2eae17c5046d961f711f626920521d4b9440515f0b963d4963026a47426d03674c3f8d274d643b +835b086c1b74600c6d24557e0d6b275188336a30357b445571097d30246f0865603784134b673daf3834532577651d711a605c086431559d19523435ab3a6b47 +206c355171086d23236f145d7938892f2d6f2ba54c255b06676421711d5f60165928519e364b5216a740585b0b6f3f456f04713b38821f55713f874d0e682183 +5b1a6f1857741671245b79295725408645516f0a8637316b0567563b7406595f409e303f5b327d65146f1a676203692e568f065c2b439d366f3d296f3f55710a +7427146b0e60713587233a7135b6442853136f6221711d5c5d105f3253a52c4d4725bc406252146f3b4c71026f2e31791a59813f88401b6d26925522670a5f6d +1d59183438062b0d276b184335015c0c354b00452b244f03553b115800124a1760360b3b0a402e08581b2f480c4e192f6210401018511a4948064809165b0249 +4a0d580b3d45167d0d02380d523d1d4613281a004326306c063b171f7b184b280b4604434a044d14024700365f14561d23420577291146033a382055192d2203 +271a2c74143f28086c14404002451d2f4b045e30094c001f561760310a3f0653330e5e132e3e14571a32510b30051f5e1a4642054d08255903473d1852034844 +176a000940135b3e163d102c27004d25305b003b17277314481d114b12494c064a0d014e0040580d58162f4510861f083f08463d21501825190034252f79103d +1f11821a463505470e384a0155240648002b65195e2814450366321252082e3f1a852d31280c4727102f0e324608280d2584216811164f1f7d2f052806103602 +2f3a2842101d3425a21d181f09802b382d0430310b2f002f571a36191d8a2460200a2e1d602f062e111f55062f3529641b101a1b79271d2b06582e292f032c51 +113500276025562711571d3d2b002f27442e012c31287d0b291a217c29202410522b122f113b3d0b290828761d5e0b1a5923802e0833101631002f352e300a22 +3b27ae181d1a11872c352b063a270d2f062f50132d13219224641a0e421a6d2f032b001846052f3d2b56171629218a231a26006929322e012e430b2e002c5f21 +4621166f225027032f23502f062e2624680a2f302574240a201664291a2f104a36192f082969184d062060266d2d0c4518242f002f30362f05273d2899122319 +6f02d000b52b74a300fc00ef0c08c62bac0089455876737c01e200c01614e100fe00aa6a467c1ba7008258a92638bc00df0aeb430de500fe015f84606a069c16 +9a33d92d00ed00f200719301fe06c61b82354a710ac01fe900858300f703e70034b300d2189c30a724557301e100fe002cea00df00ac3b05d5469900bb00993f +47c001fe00d33500e219c40071663d924d9501d600a22800f200fe00809f2da10cb4005b7a8d4217cb00ce16ac7304f400fc0031a1468d009d297d51a75100ea +00df0148c100fe00c13d6951318d00a735ce0160a300ee02f2191dcf00ee088851863f288f08c40dfc100cf200f400956300fe26bb06a310765726d00cfe01b2 +5f00fc0dd500528d21ae30a211c80e865100fe00fe0059ce16c004b91a31a57100e800d235599308bb13a746be0a7ba505d904e32035e100d613ae595eaa33a3 +13b505df3a47d604ed00ce7300e12bb80d9a4e4c874cc40cdf01b55e01e503df007ec5259838ba149b606f5a14d500e31197c514d500d42b43a36a8224c11f95 +4dac9000e100d90940b519db00b8675e5c7a9508c12db41062ca00e700d55d40ac00cf069066a5325aba0ac916e34319e101e608947743c519b8279920cc5328 +d50cee00b09800e913c61a776c269d2dbb22de009d8303e700e2055ce10cb824be2e8081568106ce00e1216dd706e300d54d14be4e9e16b73076697bb200e100 +cb300dcc0cdd00a090467559aa08b342952737d300e605cb8a29c400d11271818d5c3ec613b62dd56a0ae200e30271962fd601c4417e3aa97514cf19d60090b8 +514c712b8d125f5a14e90da13b11be1a7f432f4e605b5d263ea216c01b34aa0adf1f5751288a354e514b409d21556721c108a53319c30ebe3b307935404f433e +9f24a01435b20def133b710dc9236c484d56432e48711deb045d4514eb03bc35198810a93d454c621f6a3633d601c91a2fa301d91d5b520c97435f486a2d6d17 +486f12f40b8a3a0de3149b3e26564773483d409019a22631cb06de1d3e711aa22e5b5635577d36517125ab0b7f3a16d60eb33d249627584a3f44833b7e1238b1 +11db1236890cd5216a4c3e6c3e384b6228c70156571adb02b63419a510bc3b3b5e4e225a3b35c00ab91931af06f0194b5e0db532684760375a24487a16fc0973 +3f10fe0db23b1d652d8d434a427d1b873031ed06d71f2b920db92660511d76630ba5004b3a005916224b182d60005618249a01891d1b6f0098200e4e001d4014 +414b046705315206b910383e069e134a4508442817470e2377005c170da9057b2d0d5f1371331457141f5e0d4047058502223a008a173b510a652e3356133b53 +0d5601237e0077140175035a360a502f4447024f3e1a90033f370b9c014036006718284e183a510d59182c850583141f77009e1a0b55002d3a13454616590538 +560dca0c363709a70a4e41054b1a194714257100561718af03832714690684291450001f4e11404d017704274c009f163b4a007f213f4f0d3f3f124a05227d00 +6918008c056a34055724583f0a582e1d770641400992002c3500771a3452144b411d621a337108730c227f008f17086401433b114a3f285104435114b2053b3b +1d1a3d002f0d2731003f003f0402310c301b2d23161d28280d3f002f06043a003f00341a141f053328261729092437003a033d1a063b003f031f211a20183219 +270d3f110e3f003b042033013f02370c260d13241d340b3a003226013e003b13122d00340d300c300c16240e37003f01173f0037083328053714281035002814 +2037013f003d0d023706351d25280e241f2f063d00270d033b003f0029280d2802352d1b2023101a3e0035063124023f003f00112813281d321d1f14341b0d3f +0036001436003f003a111f140b2d222f0e33002b30003d013d170c35003b0629162714172d1332043f08123f003d062c2e003f0c320b2f041d1a1d38063f003a +19023f03381a1a2b082b1733043a051d180a3f003f0021360631063729112d204e6f4a11770631130d8d0c500d0181144514013e383351020e460d73060c5b0c +7b0c02420d5a190b21223a6a0d37180d7f0b600a0a770d5111004c181b1704285c1d80030a5b0da30c133a066d13181a0e2d1f01142d2193053d2109a10e6612 +06630b4e2000261b04310218740d82060d660b9b112129015e3220100b0e44051f2410950a49140398145214024d293b3e020e370b5a050e6a0d800a095a0d6f +16162818455916280d0d6a0947050b820d500e0263182f1704324d276a010c530d8d090a4b09750d0d2b10401d001a2c2b82023b210b950d6910086c0d511700 +351b0124011f6c1283050d650cac0e1d320469231f0e0e183303172f179e08441f06b3125d14035a1b452f001729084703137b0d83080d6a0d83131d290a5249 +4efe20efcb98d75acb60944ec918a1872cdd04e7414ce800e328898d57a35e8953c106e53275cd0af411ba9308e82eb15e7484687a7c9a17ee05d06821f20edf +306ad928a7588c6d816b905760e700ee119dc012de1dbc763ea76c7b71875a9e45be771fee00e9374ece26cf35848d646297665faa3fc70e8ac800f203d38331 +be2fbc608367ac36978f37cd17e8523beb00f61d7fa745b54a905da521d64767c519fa0baaa204f417c163629650906a9e28eb0dc07b1bef06e2375be20dc442 +907a6b857a7355df00eb1b87d506e917bc8416c3519564816b875d9a8d12ef00df512edf1ad73477ae4a82797c659952b03377d700f208baa023cf28be6b6983 +90588c9346bb2bdd662dee00f2266cb936c53b906f883bbe5860bb28e3059db69763e92ce548c4d505ff00ff5521ca2f9f12534f59666a4c00bc02bc0d0ec600 +ee00755f357b1d6f0d5e4fa7223b8600cf05c13004d500db0235714b4c11621d9b29c11004cd00f001517c00e1068e1b5f3540460d901dea00746000ef02d106 +16a200bc1866297f0e4e4706dd00e6001ac500d9057b3b04b33d7108860085253e8e01f800ab2800e214aa063f633d82495d01ab059f1a04e100f200588c2299 +107c133b6a843a219000bc0c905702e600d4042196376d095f2e7e45942201c800dd0033a000e90088374d552d570a7f31ce01577700e301d2110abe00d40b56 +4767212d5c10c00cdb060ccf00f2036b5900d522820976106735239b0cfc00934800fe0bc0062e84219d306a0e9c0a7a2e03fb00ef003ab112b70980231b8a67 +18f401c86a63a33eb155974ab735887922d703c12d34a100bb13494428522d471f8a048813358605d704604600b6187d253b3f3d41375108b1007e3006c905a5 +10346f1b882b4b2e4b36622b289800b205506408b2066f341d773e553148287724603b02b400a71121900e8a0e44444a4f4c3425731fa108436f00c4007d3f19 +830e6b264c3f7419484b17ab0ca22414a500cd0a405a20661b4b257719731f2c860bdf03575100c50b88282f5224512c5614a900683d0ccd02a712298409a21f +4b353543493b209b00a10b417703c4066a3d0294296a2843315f304b4900b60095220da90b99113d5835673b432964288314358200be016050119a0c712d3b58 +5d35404e1d98168e300bb100be0634741879114d3165306029278113c4014e60471468009e18746f00cf00a92006b7257f112d474f5763310290008503005f00 +860020120e53002500281a640e012c007f005502006c0060000d3a0e1f011a0060135e00006700a5000d1a00730328001b240112003a0697001b1300a3007100 +033f005c001b1020001d0e0080007d00005d009b00260500511f2800280035060826009b003b02009601600010102740131a004300510600730088001230096b +002d001a294d1a0030006a00330e007f00590008560935011b00512141040062008a000435007c0027031637001900370d820006230095006900005700630014 +2018010d170075057100006600ad00190c0064102800240a1b0c003601a3002f0600b2006a000a26144f061d043200370b008c008700084c0482002e010a3d37 +01a5006a35146b0d3a323334711063311b9f0293211f8d019e22306a185d3b252c5104820d1d4c0293002c1600510a2202190d1a140b1d032c001d100059014b +001437083b0a1d0421102c0e0421003f03181d04530029060c3b17210620053a0c281800350032020b33053b001f1410251a1902320651021025004d001f0e0a +350020021720240d0d1d0253044b0c053e00490118140b25061b06160c2e0d06330275001b1a005904200514180c17061d092c0019160160004e02103d034305 +1f0814141f14011d00370612200160002b0c05491225041d082d10171d003100260904440243001a260d2f111a022c0b41060a250047011d160644002604122d +1f18091f034b063f12023d00400013230830001d0a13172714043504670016257af880b7d460f0be90ee74d1de51e37b9fde4ae68d8ae160eab577ef79cdf07f +eeb5aef86fbcc668f6669dbc41f8775caf0c9b5d22ae197583169f4a3fb4148a6f23d018718d19cb16579b06a54538a228688610a34837bc09a35731cd08906b +1fb30a6c881a935829a91d6c9002bc3355a702bc4044af039a5c32a52b5b900e99561abe1688730ccc286f8d0dbb30559b0e966728ab1d5d9805ad423db51797 +6621ce1d747f1fbb3351a30d9b5824b1177b860aa9424baf0c965f35bc0880801fbe0e5b9703a34535a225737d0baf3e4baa01ae4d3dbe049b6522b11073851a +95552bac1b76860bc7295f9d0dce2f4da506a55135a12b5b8a119b5126c812946a1ddf1d7f8117c02162951993622ba92263a105b53f46b80da75832c00c876f +93bbb284e15fe3d26dff5ff0b757e876b7a573c0878dcc7fb2d758ed66a7f855ff83cde27fcca7a3ba959bc643cbbe7ae335fb8033d113a567279f504c8a376c +8728d5145ab214ea145b9808ca3762804369732b816932db06996225eb05b65822b70e956a3f7d6f28983457b501dd284abe01d9325f9003ae5a4d81564b971d +847317e111a06209e624926c22a03d6f8434738c25b32850c004d5334eb11da7514c9e2777902c925f40bb0da3601fd114a76a1ab44363862d77713fb91462a7 +1ad71252a306cc355e853879692f875c43c60190652fdd03be5321c013a3683788632d90385ea30cdb214ebe0aed245e9206c54a5a7f505388257c7521eb0d9c +6316fe17a36523b229817740758228a73151cb04db3149c010bc4557960d927706c90198604ba7377d4d7f40a236907a1ac304c5535bba01bb23755e5b84426c +3f9406bc4875aa0adf09948a2cc4279744674f514b33710c8a057551149d058f00497f166a2469105f374c350e71008d0c596d0d94007a1a296c3e5214711469 +2c6957018500820829711185006d40353f4b5a067a1a81093a730095016f36267103710852416024346c068e0d932b1188009305594529740e671652167d351a +8108af00685b009e0c6f1349441b551a69168000574f02a00194063a8a067c146f1b4e4b374a066b008816417604a0007a2d128030620d6b1f52384a69008400 +75210d85098a00605c285035630871276a1a24760092056c50198100760d4253523e22710d811a86420888008d01465a1d7c006d27452869480e820e9d00516b +6314ae00a725779c01e300c42612b52c9900645e5265716500c803ab1216c000d7008569418429941a755f9f2058ac00d40dc83306ab00ab00316f5a69248e26 +8c279e13009f00c500243800a5035d00402b0a2c00660abb00323000c500a3000c5d00900042174b002b2700a700ad00038400b5004d0d0077284a005a015013 +175800c4006a0600b7058200281d31621a3e0075006a1100ab00bc002f47147c005700233e652b0063008c02532800a90094001371184d004200643058130094 +00ab00095d00b001580c3243003a005e16a301164700b7009900037b00a000352c380514370095089800009500cb003b1d0096145600500d311f046402ca0050 +1700d20093001a3b1a770b470664004e1a00be01bc00176d0a950058030d574a06f2009d1f2c64147b1a5a2f9f113e4d10d202c5141a9600e30e4b331b4c2e48 +168a047e141d8403ef0674310de31a961d41293f51273b039400461808c506c114237920a71337112b134c120c55007a011a2203900135110d4e1a3d10190c60 +0c231400810074040a600559041817324019120c4a0a8403142e009b003b140859032c0b261d44101719069304660b056a00a70314270a2d09190b52132b090d +5204ca011d1a009e04570c0e2711210d200671002c1403b10179050d3a05880a191111172c160963006403163201a7012b14016a0d4a0c170e47101919008300 +5b0a0280036904141d2456141a0d3d0d66091145009300211a067302350d1f333125141a0980084a10027b00930111410841041a104726210d0c5506ac001a24 +7542c102be308da703fc01fc510ecc43b6318364587589670edd0eca1443eb01fc0196773b813d9b3b826fa72681b903e113f86717f701fc0934743d411a7c33 +9935f8462be802f4068fbe00fc08791046342028016c14e800513e01e900b901008100a10d3e215e00342401d100c800019e00d3015520009633560263016a11 +266801f000860900df0c980219463b713538028a00860e00c500db01356c19900155022b537631096a01a701713300d500ac011484245102381a7d3a790201af +00d500117d01d10164223b501233015e25c601385301d700b10100a200b605303a49011b3504be0ab80001ad00ee00463a00b21b5e015c104b1a0d7308f8006d +2700fc05ae010d64208822450d79005f1701e600d6011a900cad015c0b11715849cd2cc8c888d78ac0d5b6a3b55ef4ca84c614ce96a9d913c48cc6ce95c6aeb7 +cbb752d671adc025cd42d7eb5ec959bbd4bcf2a998d9c98fcd3ee19f46cd30cd7aa3e846a7b0bee3b9a1b98acece56ce51c4c51db92ca3923894646a9b7e7188 +41b96f3bcd06cc414bbb27b45b7ba057559f5e859444a70d95b90ecd12bc882ea738a586756a9732b4834eab14cb594ccd04cd3375ac42a566847d901dca457e +ad22cc12a3a70dcd25aa795c964a82888e42cc11c17127c70cc14e5dd40ba359849a657c7d6875c30dcd238cbe09c126a99d16a751818977807653a38234cd06 +ca512bc01dba566dba406c8a719087509a2f8ac10ecd16af9c21b235a9975e7b814eb4875f9d27c66544cd06cd3565b336af63858c7533be527ea333bc08a1b2 +2eaf3e779f4cab695ab460978f23cf8262980eb16476b1148a7168933f7e7d528f553db843888e2ea32e9db828c0637b9f5dc97646c3627f8a27b3772c922193 +5362d12371a06ab96a95ba4fc3674aa54890af35a34b7b8d2e7445447f60554a268a46366f006d1b1a6a086a535682283176456b5c2967086675196a0d60561d +5e1d626a41605612865b3a600a9435358603622d436f1b595756664214902c5669137d117677107d165855365f144a6b584960037f48206f0480353fa1064e49 +5871383e5a3a555d107b1a5573026d207774057736456a555937317c513b6a017427016d056f4d4e901f3a684e77533162125d6f186912635d13622468713365 +51268c60455814983b357c016824326f1365595b7336218d375d651f7406747b6b5c9019963b85900598009f461d8e31953f9071484790902797117d25429200 +95039285336d409243765d742f839a149d139e7524a300942c716060774c90436c1fa75c32a1049d067e870c9d0a8d505930667a3d8a2e9c01a59d11a705985a +6aab007f33904486627b841d8a00900c2890008303813414822b62087f006032368901900086260181117f0e5e47235335750290045e1f028c00900062652060 +068318485051281490008112755606900090002d5c31620d7a22482f6c47069000810035750090008d27482f206f126f2376014777008f028f1f1d800089066a +356036206d0b750990181690008d046c4b02901975086c094d4524870890007a44019008870d475c1363237e0b8d114b3f05900090004887107103871d2d6c43 +0df60bb22823651d7e32633baf004c501ac902d91314c502d5205946115c3e4829ab13a10624a304e60a663505ee1b922d42313b5e487926ed09962e13ed05cf +1a1d6f239b21522f221276281db90dca021a5808ac129434169c574f36732c7733844421ee10d72528c517d230774f5e5c261a1d59099c05183a02ba004f1300 +62064b1d262451102419109a027d080b7f00c9060d36002d18271960163301166305e3041d1d03bc0460170a2c0e321a280b8700380c09d101960d064a06a310 +1d1d000a3b201776007b000d4500b306431b007f14511d1d1747171b0e0a9c006a06009701861305222b68191222360a7a0d185801af00301300790852201f3d +3b2726281382055b040c9300af060851004e14231a532d1f011a6306cb0219306a0ec00a9d1b5f8c06f406d0100cc91da10c6b225d7658770dd106ad140dcc06 +fb087f483b7b0b8a0d603aab28109809d105ce340edb08fe0d4e7f505c13870b9d2fb5160be105ef052d4a05e30ca30d6a3b0c460dac14eb05566a08f606e80c +359806d40d9330a114506a0cdf06ff0a27dd04df08af2c04bc3b790a6d0643040b5103ee02640802d3039309140d3d6a0a2d0981047a1006ba01cf041a281295 +064f0c2d2f63320c660594024a0803c402a309177105450b350a7e313b0308a302d0030c5f02c605580b3455092b0b5606b701123504d3009908047602b7092c +2929061a2908c0068f04089401ee0428210295135f0a5914280d0a6603fa013d0d02fe02a209041821870a3b0a6404551a06e601c404065708b006500c134b45 +09dd05dd8985c63ace67d256bb45bcdb28d906df608ee300d32edd80a3d551c336be05e1688cdd0bdd0ae2b924d434cd4ec19c8a8f9add21db1de3ae38db14de +43ceee25a367dd6fd78e7d7750de03dd2fd1dd1dd51fdf8286a26bae71dd5bbe56c4dd29df08df568acd42dd35ddc17a79c0dd6cdd58be40c1e308dd14dd9f4b +af02dd129064a32d60c10dbe17dd441add00dd0a977b43c71dc429971dc4552dd40cdb02ac9a01dd12c61d7b6a21a732c621db009e8505d900dd085dd90cad25 +c333828251860bd300dd2071d906d502dd5110b54b9c1bbc326f6c77b603dd00c72c06c30add08a58e456f59b013b3448a2838d900dd04d08a2bbb00dd17717c +8a5743cd17ac2ed06c0cdd00db0373922bd509c9437d35a2771ace19c7018abe7a99ab5fca58c1b446be31c58c2fc167a76d8dae5965c5825db843b74d7bb62b +b742a1c34c9684aa7e869a9e2cb4bc44c040d58c4ed238b26f79ae99909bb28a8d4ff87571c83ac42facbb2bc557a394717ca78279a371c014d5c52dcb3bc56b +7bee34997faa90b077b8a065ae35de5f90df2dc35bc4b84fcb7e8c8fa179d16bc0bc50cb34ca7106b12f883b5b9429647d6c519d1a8e2128ad1bb52d6aa32273 +43835b44797c2d6997329021975d25b320b643299245664d7169553baf443eac1aa00c51a312ae3a8c6f4b4b5a684776539801888924a719ad332eaf1aa35166 +7564346a6a46881bcf2738bc14a7237d8108b550835277337446569636ad10a56f0eba2896314aa31d766c775b921a843a30ad1bbb2759ba17863a89632b8e71 +63c1805e823f97823382198e9a417d4482a182b24d3b9d77a28234853660901f825083ac30637c81bc6d6a5e35cf8749811d837e498a2883a26d965a79d581a7 +6d23b5719f8428832587a92e824b7dab5a609c739d7d5a7a21c6a1448224827c6ab12874b182ae7763b97a8a7d1d96739f970c805e85d1567c6f74c37b7a8a57 +ac82408129a3b9447f38818e7499274a68605781196f2d2482008222687b1d603d6d8e455148317c7d2577147f5f1281068149355f355d746667492883475181 +08770046850482287c6840404c60716333690185712180037f502181007b4860565d407563466b0881325381057e1f69871482306a65651f5b3e68761a810a8d +63118110765547891159626c5681236d4424810082245e810e6b38718935603d13b11b933b355f147e4467559601776725990bb91a1dad06a02e474c1a554b53 +3f8c1690102b9310aa13885308b8317c3a4745235563743fb2099a4112b116b22f53b11d715b79505a44712f38af19a211527b168d1f8345139d5b4d48743657 +339e5335ba1ab22823a113a341717d4b4b8153418636970d63a51db223a056288125a34b60759012798733951fcf3225bb02b111134200452b38296414510226 +6906b009352f08ae0a68221d260a422841238802420e10a701901a0a6606861b3535061a402828810677051b51009310572800771d4d33321f36253a2f209b02 +7606008e007f28203f2d5923293d440471111f6c0d9a08482204660d623521483f213b3b1f640c6a06188f00a50d0d57005a2c3a28532940062e69069c032446 +491d5d1b8111273f1bdf189d1a11bb1a761b2b1d5e582d141b891495131a7e14c81a351d2d7d1a4c1d41378c1d1d4118b816971414b51ac81d2e6f3f2f21501d +9a35960918c819ee19345a12c120691d50481d301d6a1de60d2e3114e816b718147e18b71d5f37651449331dd218d010129e14d21a5d270b9443601d731d651a +28761df0178e1d11e61aa01b282f4b8a385b1da3127f0e147f108d14041a0b8718171d1d1a4e1f1d2918790b2609108a11621d0a580d3a1d031a602524021766 +10a50c103e0d881a211d174b1a011b37168901180e11af0d60100b4910761d0e290a062206198e1060090e600dd5110a1805601b341d281f2d04193214bc0b24 +120ac711671705231f511d011d290c480617a5108a11062c0aa516201a0d343d00f200e534639000d514c44acc0d7bbc01e304f21936f200de0aab3e51a335ae +02be06ee3d43ed03f200e16f00e927be02a9454e9a4ee50df000c97501ef05f202ade528a346e71dc479766c12ed00f214a5dd16de00ee2351ad759924ed23ac +5dc1ba04f200ef0e52c422f002eb74666087ba05e233bb1379ea00f201ee734ebc00ed0aae6db44f6cec13dd1af4663bf400f40abb8f60ee1dc80aa1219b3000 +d000ee007e6000ee0bc40060370d9a10ab16eb00715200e700e8002fb40db5039e175157596300de00d9083bbb03d900c10e00c338880098004c59529000ee00 +bc1200c600db007d584a772890009923962800df00ee00a55f1daa00d6014b7d9b5230ed1dc733ea8d1af700f705a3b648f205e74c8a3dba9829f228e701d0ec +9667bc1dd050b4c009d500cb7955bc4dca4abc8e7362a5bc22c714b13658cb01d10abcab43975fbe50a96f8d3a80c40cd11bd29d33d400c346ab8d86bc74be65 +b52de3a367d414df0ccbc733d614bc7b81609ca35fc135cb03d3c70dd606d16890de09b14fbc6ab782a5b94fd200df59a0db01d72cc8aa77c44ab36bb351d96c +a7c502d903d1ac4ed53dcf57b9db5c8697bc51cb55cc7c6ad506d723bedd2e9e20be30747f734d3dbe01c023ab9010c300c0065583519b16bc436d3eb77f0dc5 +02b90165a700c000bb565e5a48af1aa33fa50181b803ca04c34136c700b4129b4e966645aa1aa30ccf3635c900c806ac7e19c128a31d940d836d6bd328ef1de5 +dd59f42cd98ab7ef5faf96be74d185dbb871db06e76fc7ee1ae75bcac1bcae8946fb52c76b51b765b171848ad72e8a7c58df38f04645dd37d96369833a9d8e6f +71a34cc8285bbe35ee3a88631dee52946a5d756c7c857c71e342be674ffb4ee55968c65cb67488767b8ab66271ce5ff84893be3fdb55a96c2ece8f756f68679e +6abc7564e64ee86a53d756d6698d977f8c96556aa367d74784c557fe57d6935aca68b771719ecc3d7a9860d14ffc605bf055ff6d90b06ac57f97719f68db556a +d050fe2d635a19e336815b296c434e6d4859b4187b3b37d11dc13d22a71da351466f174a832b668d36af1d4a8921c435715f00be4f58663764643d7d3752c026 +a53d26c526a158287b3f795f346c513aaf1a698a33ca4eafb584ee67cf7185c0c0717fad67cd73f78462f65dfc718fc66ce371b08ea587d77e74d96fef48b2cc +28a132898735965671b35e838921cb60568d149a564fa109945f4ba0386c864994761d961d7a861d9c26778d0d9a36688a3f944b459e565d9b11ab562ca13394 +7559d01a71905ac95a638a42af9742a137878a198f4573b9287d5c4fc453976f33a75974a122aa5e43a7378f9860d24b4cb23aa76d5c931fb6a23ea135908f32 +90647ec05c817930db6a798827a76077a928a17a60bb4788ab66b77438be40998646a1209c89109d1f52561451143564333f7c047c26259802833b1f7e06774d +2c7a1937531a595f0e8009515e018c1d4e73017d2d3e771f5b3f26652e3185067a130187066d4f1d7d275063208a3e286c0d519447a181a7c8539f7d8fe35f9d +7752fa7aa3893dbe7d90a73da5795fb74690b273d96956d660c38a699c2dbcba202e1d2c60143f202896265f27088827462901433b354d032948236914214b23 +602601330e572c0a2d1d3d6f0c2c13246d20520e1d7129512e055a221b2f0a35633293081f7429b925233f1681312e2e24472b042b2c3586103b1f1ba9286b20 +1157225a320c44261346092e8a2e9d13127f21a5292735047d50322e312e58103b352ea92262220db0326028065e3b4f510a2e552371132e7e298c210c631f82 +2d22331f6c751d2f06253f120d031d461f1a2d003f111f2d002c3014300323291d5210122013352b0028022f24012914244b00250c1a5d1a281011291a222e00 +2f03002800284217400d173318731d081d06534d65454a3a8520405835df2382481ae9358d3213923b6c5023364b2060142e9b2eb11b14a32ea136524e0e8373 +00f600b014256f0080065932ae00444600d202e50000ad00e6064025003e1f2700a305ae0016a500ef00682800f41987002f0b29532c5708d900851101f800e3 +005bbc28a332760e5f497b3803c900df0063920ad100a30817a04b550c690c6f2e804900ec00e2020ab500bc006f5a67645c2f00901abb0d4bab00ff00bc4421 +9700b3066b60b513527d0bc010e30c00e800fe06576517921471169b23a71606c009fc00857500ff10c4063a350d4300280a8a00250000d400990000690ac041 +d38aaaa36c600089008600005300cb004700008c1d55000d004f1d1f0d00a3007500009d00900000282f6f030d006c5fbe3e63e200ff00c69623ce00e23b678f +a05875be35c031e15600fc00f70242a113ae027e3a903fa0471ac11ae5008fb39c6dd336e151bad309ee00df774eca50cf4dcd9284699bc036dd29d14a6cd700 +e60ecdba4bb062cf51b26f9e4c93d11de81bdb9833e300e2469c908ab86dce5cc430e3a575e81af820d1d436ea0ad57d9985b6b56fd53ae218d6ce12f206e573 +87df14ca5ace6cc58397b951e701eb62a1e201ec28d4b27ece4cc67ed151df7aadd902f708e3ba55ec40e569c8ce6d8f89cf50de50ce896cec0eee2fcdd634d3 +52d488b68f8f949ed633ec36d4cd2feb00e328568f519d25a5448a51e2dbbcf645fa87dbf05afb29dd7c68675da12ca23db5017fb100e705df462fd600d0149a +5bb17176c02fd20de6373be205fc62e2df8cf25edfa0ca92dfa9badf1afc31e3d551ff28ee8fc6e162bc85d463df6cc6ae63f205ee41c3e21be84cd9b2aead81 +06ff00ec6a62b932cf49b95ad720abab1ae905f8353efb00ec25ad7e60b94da12dbe08fb3a6ae808fc09cf8a03f430c93b9f75639368c71bff00d36a14fb0cf4 +24a0f82bb567d57cce9e9e846afe0bff24c9f018ef14e86655b67b9464c44cab57d3a519ff01fe3164d126ef26d29f6f6aa59545d148cf21b4f70dfe0dfca956 +db37ef63b980bc65b8e240e620fe7d4fff03ff2bbaaf60ee46ce60bc2eff7a73ee1afe09dfd00bff1ae66ba0b666bc6ad33bfc0ecb9b21f806ffa5e2ff28e67b +f8caecd2add2a0f820ff5da3e206f418ea7720d667cb86e397ad84b4e936ff25ffb186f834fe52dddb5a98a1e5a0f490c971aeff19ff29fcee49fc35f480a198 +a084a9e359dd3ef4a24aff06ff2f9dcc51f733de889b4ee28e5de932ed10d9ee7a8a9e57be3ea39a35f42fcf7635cf3ea07c58817a7185536dbe2cd03a5bcd14 +df38858d52a767768c6f62ae418f9047d91dcd7146d930e76f5b99636b907a71b34ace597bec40f85fa7bc60fc7ac690aea5929890b24dee2b96863df211d26b +49bb3bcf748a8aad5ca26d65e327e9526ccd17e34e9a9646cc7da590c179bb639bc046fc41d78c4dee42ca7d799c71a78e908ad751ce6b7cf63dfe679fb657c4 +6aa7907496b27e90d977e362d0b96ff65df89076c469978a7b779b66c37d81f855f06da9e360ff7de1a2a1b493cf90cd7de256b7d368f749f49094ec75f692cc +b5bea7a2c382db50f47587fb49fb6cb5a355ef79c490bb87b18597cf52ff3ac48950fe3edb7e81b36ac48ab492d355ba7671ff37ff628acf3dd160a7905bb29f +019f006043126808314d2f3377006f3a289002a01d1a8700801a2151061f281d2b43048c06356c06a50c5a4802981a513e1b411d274f2b187e00711b0da7048a +372db21f896f50a55e76a0368a971dd91d83b90acd2b797111904b385f2e4350146d1a178f008d1205850067362969354668215b55229c0669760db6007e6f0e +8a215075366b83108d4b3b940dc7272ea700a927368810815b3a776323c522698a1ae51175740dd416806f2c9047578c575ab001a75728cd06ab3025a2098536 +3f7f2250732b6a8318d42283a503d1277d8906cc607ba362928e4bbb6849c612cb592ecd1aad5a40cf3a7a8c43906f51ac14808919c50d869212ba316373237a +6f288947448319b52b2fb700b635288a0d66353263462f902052711dd5068d920b510d112206340d0137002d4306470b23530d5911064c0d3f21032804062101 +2200103b05292810680d282b065a18102c02231b04270014310c3a0914690d53301298227660178d164d760c624e0d9a0b4d6a0d92272e710b7c422358033135 +0a47000c3b0d430d09490d2917004b14334f014724176a0942270d7a0d2d4708560d0253064a510d7317376a13881d1d6a0d6f230b6d0a484901653825900650 +4b137d13433e0b901a354a045b171060062b710c77282b97107d3a1b7b114c35065a031b3a022d140d6a092f620da02d528f08bc514b9704715127870927840d +87280d9b166341068f2b59680a7a2b3a820c6d400d8d0d45660b8c2625790d6c531a82103b5b1377111a6d0d6b1408600c2d2b004119266902564e29b813685e +6a958c5ac532c0a326fc17d68930db459d7e50a26671b55676ba2fdf3a76df0bef358ab63da56d71a57174af2faf873ad610d56c2dee14dd7e62b0757eb38699 +ba53f488b6f736fc6dd1ed60fe7cdfd7b2b1d69ecac964ef38dbc05dfb08e38852e31dc0796a929a53ba6a65e202ee3d77dd02e33897be36d66f9baea17ad159 +c0c734fe2de6b24bf23dc8a781d9719fb298a9e566ef8ca7fc48ff6ac9eb63c6759ec742899c77ccaf53d426e7ad4cfa32f8a97ad57eb0bc93b0a967dd759adb +2eee3390ec28fb4ca5a55da1bcbcd7cd90e66fe3d776fc33f4b387f45df6b9acc6c3a1d9ac9bd935fb759dec27f85fc4dd59fa77c8c9b992d277ccd253ff38de +be5bff2ed5a27be75dbeaaa5a7e16ade8987ff1bff77c0f444e28ac4d98fd4c022fe05ee9076c65bdd84be6ad93dc3ac3fe705fc606cf403ed43a99e67c076b0 +71d628e9477fde0cfb18c9a320f62fb6628f86759092c03fff23e5884ffc1afe76c4f45acc94e9b9eaadccb1bcff4fff67e9f64ef851ffbe8ac98ab1aee28ace +6ad7ba4aff11f75866df31ef58aaa5797ea58f7fcc50d63eb6ee31ff1ff7be6fe55bfb9abc9ac677c7d763e925ff9275ff27ff71e9dfa5ffa2f8add581ffbab7 +fc3afe35e8e658ff33df6a80bc7cc69ddd65fc44e1b85dfb13ff77a5f82fd776deb3b3b29ea57bf43fff8ce7ff52fe60ffd58fe27cd9a9edb2cb9bd4ee6fff3b +f7a786f440ff7cd4d473aba3d5a0db77cd7dbefc40ff46f2d962ee55fca9a1adaa98bee679db47f7aa75ff29fe6bb8e171fc93fcbcc090ebdbabf857f65cebf8 +7f49ae27c53595a906f400cb4e38c53eb6378a7d6f64847d2bc622cd3b50c90be8059f903ba04c9e468a5e9c35649e0edb12c5662bdb00d436768a719760a769 +be3dec887aec1afa37becf3dff30d490a181aea587d037ee31c8b52df806ee667bd623d055a95da7577f8530df01e1355ecc01e820ae8a4bc0499e51ae3dc165 +96c406fc11d7933deb33d4539eb36a9c8eb959df58de9095fc23ff4ccbdf4cd46fcca9a58ea17f84cc2cd928b7a726ee0ae34e6ab160b54eae79a150be884bdf +1aee2890cf2bfe44e3b79dbeb1c799d05adb4acccc3af209f79771ed28f25fb788acada0b45cdb0df26073ed08f829b7af40eb3bbb67aa58bb7c80cb18fe18cb +a52cfe1ddf5d8fc445b571b34fcd55ba8a49fe06ff45baf62ce360d3b295bb8c00f600c93d35861297247c3dbc03746a13d703de1422d300e3166f5b337d316f +1ab405c11b40be05f402924e00e3239a25604642603f7e0ae800b7510df80df22d88dd29b45cbc60a57e98775df000f81bb2d614ea17e16049ae6d8357a5469c +4eb78213f600ec2741c11acb14816a6260765a35ad30c50e60c100f801d97135bb22d3428766ac3577a029d318ee5d45f801ff31bbb26bea53d66cc038e67174 +e91afe0acebc0dfe16cf496a85409e4baa27ed0cb07712f404ee1d47de0dc8309f648da793ab77f411fb4fb5ed08f71be3902fd256b366af688c6fa5ba17fc08 +ed5e4ce71aec278aa04c866f9d53b151b2355ee200f709c7a026cb1bd3506a84905b629d2db52bd65920f200fa1466ab2ece2da24f893fb25c47d62bea06b9d7 +2d081d02580927220299005a0b087909590519163d35361902530471050b5f0093001d280e600a25083629671410290195035910047b006a06194d2735103021 +9023ad1917a503ed04477108bb06642c433b3f1d125c1ac9025c3b02d9019510137b0177182b2142103419059c00a309128301c30438240d772c450b3e06640e +2e5601ce007e2106be168f111d623e694f380b8a0d9f2018c703dd084d931b9e2152343b5e6f33335b06ac08733204b0008c0b1a76204d0a24236829691608a9 +05e30b53a506d9047c6a455e4e41266c38cc08665804d701a51b10a0019b143140481a2e3319a90ab510139d01f00544480a9b1a510d4216511416600bd00064 +2903d9047d09175f1a681f2310590c501408b100a7041d7408a00637141d594d06d10c764a0c862c51552f47880088352fbb09b1201fab06b92e2d7114584624 +41670da304497d12df116b6803cf2c66471464303a663a20bc05af4319e91ac04c52eb299f8568a56a7aa73f90b019e6108ab114ca2f8a9713af685b95427187 +36b24135ce0bd52c23bc1b9c483a95505e931a71743abc0984920de20d957e1db038747e4e75a21fb15e55b41be93531d90bed4667c342af8781a2a33aee3d90 +b82cec19a7ab12ec28a5873da95c6f8f6345c703b45629e111c83b3bf016c37f87cb7ba1ad79b3d438f23aa1d912de37acac0dc85d849e5d92804bac603bd60a +cf5134df26b55946c7437f974c92765cb41a8ea30ee30c99901abb357a86328a7b2b9c3d519922cb3b2fc60ad72430aa1f8f504075643eab0e5e832dd5067d8a +6ff77aadb460cfaa7bbc60b5d152b86a8ad952e1746fd... [truncated message content] |
From: <jd...@us...> - 2007-10-27 04:01:05
|
Revision: 4032 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4032&view=rev Author: jdh2358 Date: 2007-10-26 21:00:59 -0700 (Fri, 26 Oct 2007) Log Message: ----------- added a few more workbook examples Modified Paths: -------------- trunk/py4science/examples/skel/stats_descriptives_skel.py trunk/py4science/examples/stats_descriptives.py trunk/py4science/workbook/convolution.tex trunk/py4science/workbook/intro_stats.tex trunk/py4science/workbook/stats_descriptives.tex trunk/py4science/workbook/stats_distributions.tex Modified: trunk/py4science/examples/skel/stats_descriptives_skel.py =================================================================== --- trunk/py4science/examples/skel/stats_descriptives_skel.py 2007-10-26 20:21:23 UTC (rev 4031) +++ trunk/py4science/examples/skel/stats_descriptives_skel.py 2007-10-27 04:00:59 UTC (rev 4032) @@ -56,14 +56,27 @@ maxlags : max number of lags for the autocorr - detrend : a function used to detrend the data for the correlation and spectral functions + detrend : a function used to detrend the data for the + correlation and spectral functions fmt : the plot format string """ data = self.samples - class Bunch: pass - c = Bunch() + # Here we use a rather strange idiom: we create an empty do + # nothing class C and simply attach attributes to it for + # return value (which we carefully describe in the docstring). + # The alternative is either to return a tuple a,b,c,d or a + # dictionary {'a':someval, 'b':someotherval} but both of these + # methods have problems. If you return a tuple, and later + # want to return something new, you have to change all the + # code that calls this function. Dictionaries work fine, but + # I find the client code harder to use d['a'] vesus d.a. The + # final alternative, which is most suitable for production + # code, is to define a custom class to store (and pretty + # print) your return object + class C: pass + c = C() N = 5 fig = c.fig = figfunc() ax = c.ax1 = fig.add_subplot(N,1,1) Modified: trunk/py4science/examples/stats_descriptives.py =================================================================== --- trunk/py4science/examples/stats_descriptives.py 2007-10-26 20:21:23 UTC (rev 4031) +++ trunk/py4science/examples/stats_descriptives.py 2007-10-27 04:00:59 UTC (rev 4032) @@ -72,6 +72,18 @@ """ data = self.samples + # Here we use a rather strange idiom: we create an empty do + # nothing class C and simply attach attributes to it for + # return value (which we carefully describe in the docstring). + # The alternative is either to return a tuple a,b,c,d or a + # dictionary {'a':someval, 'b':someotherval} but both of these + # methods have problems. If you return a tuple, and later + # want to return something new, you have to change all the + # code that calls this function. Dictionaries work fine, but + # I find the client code harder to use d['a'] vesus d.a. The + # final alternative, which is most suitable for production + # code, is to define a custom class to store (and pretty + # print) your return object class C: pass c = C() N = 5 Modified: trunk/py4science/workbook/convolution.tex =================================================================== --- trunk/py4science/workbook/convolution.tex 2007-10-26 20:21:23 UTC (rev 4031) +++ trunk/py4science/workbook/convolution.tex 2007-10-27 04:00:59 UTC (rev 4032) @@ -1,14 +1,61 @@ \section{Convolution} \label{sec:convolution} +The output of a linear system is given by the convolution of its +impulse response function with the input. Mathematically +\[ + y(t) = \int_0^\t x(\tau)r(t-\tau)d\tau +\] +This fundamental relationship lies at the heart of linear systems +analysis. It is used to model the dynamics of calcium buffers in +neuronal synapses, where incoming action potentials are represented as +Dirac $\delta$-functions and the calcium stores are represented with a +response function with multiple exponential time constants. It is +used in microscopy, in which the image distortions introduced by the +lenses are \textit{deconvolved} out using a measured point spread +function to provide a better picture of the true image input. It is +essential in structural engineering to determine how materials respond +to shocks. +The impulse response function $r$ is the system response to a +pulsatile input. For example, in Figure~\ref{fig:convolve_explain} +below, the response function is the sum of two exponentials with +different time constants and signs. This is a typical function used +to model synaptic current following a neuronal action potential. The +figure shows three $\delta$ inputs at different times and with +different amplitudes. The corresponsing impulse response for each +input is shown following it, and is color coded with the impulse input +color. If the system response is linear, by definition, the response +to a sum of inputs is the sum of the responses to the individual +inputs, and the lower panel shows the sum of the responses, or +equivalently, the convolution of the impulse response function with +the input function. + \begin{center}% \begin{figure} \begin{centering}\includegraphics[width=4in]{fig/convolve_explain}\par\end{centering} -\caption{\label{fig:convolve_explain}The output of a linear system to a series of impulse inputs is equal to the sum of the scaled and time shifted impulse response functions.} +\caption{\label{fig:convolve_explain}The output of a linear system to +a series of impulse inputs is equal to the sum of the scaled and time +shifted impulse response functions.} \end{figure} \par\end{center} +In Figure~\ref{fig:convolve_explain}, the summing of the impulse +response function over the three inputs is conceptually and visually +easy to understand. Some find the concept of a convolution of an +impulse response function with a continuos time function, such as a +sinusoid or a noise process, conceptually more difficult. It +shouldn't be. By the \textit{sampling theorem}, we can represent any +finite bandwidth continuous time signal as the sum of Dirac-$\delta$ +functions where the height of the $\delta$ function at each time point +is simply the amplitude of the signal at that time point. The only +requirement is that the sampling frequency be at least as high as the +Nyquist frequency, defined as the highest spectral frequency in the +signal divided by 2. See Figure~\ref{fig:convolve_deltas} for a +representation of a delta function sampling of a damped, oscillatory, +exponential function. + + \begin{center}% \begin{figure} \begin{centering}\includegraphics[width=4in]{fig/convolve_deltas}\par\end{centering} @@ -17,6 +64,29 @@ \par\end{center} +In the exercise below, we will convolve a sample from the normal +distribution (white noise) with a double exponential impulse response +function. Such a function acts as a low pass filter, so the resultant +output will look considerably smoother than the input. You can use +\texttt{numpy.convolve} to perform the convolution numerically. + +We also explore the important relationship that a convolution in the +tempoeral (or spatial) domain becomes a multiplication in the spectral +domain, which is mathematically much easier to work with. +\[ +Y = R*X +\] + +where $Y$, $X$, and $R$ are the Fourier transforms of the respective +variable in the temporal convolution equation above. The Fourier +transform of the impulse response function serves as an amplitude +weighting and phase shifting operator for each frequency component. +Thus, we can get deeper insight into the effects of impulse response +function $r$ by studying the amplitude and phase spectrum of its +transform $R$. In the example below, however, we simply use the +multiplication property to perform the same convolution in Fourier +space to confirm the numerical result from \textt{numpy.convolve}. + \lstinputlisting[label=code:convolution_demo,caption={IGNORED}]{skel/convolution_demo_skel.py} Modified: trunk/py4science/workbook/intro_stats.tex =================================================================== --- trunk/py4science/workbook/intro_stats.tex 2007-10-26 20:21:23 UTC (rev 4031) +++ trunk/py4science/workbook/intro_stats.tex 2007-10-27 04:00:59 UTC (rev 4032) @@ -1 +1,31 @@ -TODO \ No newline at end of file +\textt{R}, a statistical package based on \textt{S}, is viewd by some +as the best statistical software on the planet, and in the open source +world it is the clear choice for sophisticated statistical analysis. +Like python, \textt{R} is an interpreted language written in C with an +interactive shell. Unlike python, which is a general purpose +programming language, \textt{R} is a specialized statistical language. +Since python is a excellent glue language, with facilities for +providing a transparent interface to FORTRAN, C, C++ and other +languages, it should come as no surprise that you can harness +\textt{R}'s immense statistical power from python, through the +\texttt{rpy} third part extension library. + +However, \textt{R} is not without its warts. As a language, it lacks +python's elegance and advanced programming constructs and idioms. It +is also GPL, which means you cannot distribute code based upon it +unhindered: the code you distribute must be GPL as well (python, and +the core scientific extension libraries, carry a more permissive +license which support distribution in closed source, proprietary +application). + +Fortunately, the core tools scientific libraries for python (primarily +\textt{numpy} and \texttt{scipy.stats}) provide a wide array of +statistical tools, from basic descriptive statistics (mean, variance, +skew, kurtosis, correlation, \dots) to hypothesis testing (t-tests, +$\Chi$-Square, analysis of variance, general linear models, \dots) to +analytical and numerical tools for working with almost every discrete +and continuous statistical distribution you can think of (normal, +gamma, poisson, weibull, lognormal, levy stable, \dots). + + + Modified: trunk/py4science/workbook/stats_descriptives.tex =================================================================== --- trunk/py4science/workbook/stats_descriptives.tex 2007-10-26 20:21:23 UTC (rev 4031) +++ trunk/py4science/workbook/stats_descriptives.tex 2007-10-27 04:00:59 UTC (rev 4032) @@ -1,7 +1,49 @@ \section{Descriptive statistics} \label{sec:stats_descriptives} +The first step in any statistical analysis should be to describe, +charaterize and importantly, visualize your data. The normal +distribution (aka Gaussian or bell curve) lies at the heart of much of +formal statistical analysis, and normal distributions have the tidy +property that they are completely characterized by their mean and +variance. As you may have observed in your interactions with family +and friends, most of the world is not normal, and many statistical +analyses are flawed by summarizing data with just the mean and +standard deviation (square root of variance) and associated +signficance tests (eg the T-Test) as if it were normally distributed +data. +In the exercise below, we write a class to provide descriptive +statistics of a data set passed into the constructor, with class +methods to pretty print the results and to create a battery of +standard plots which may show structure missing in a casual analysis. +Many new programmers, or even experienced programmers used to a +proceedural environment, are uncomfortable with the idea of classes, +having hear their geekier programmer friends talk about them but not +really sure what to do with them. There are many interesting things +one can do with classes (aka object oriented programming) but at their +hear they are a way of bundling data with methods that operate on that +data. The \texttt{self} variable is special in python and is how the +class refers to its own data and methods. Here is a toy example + +\begin{lstlisting} + +In [115]: class MyData: + .....: def __init__(self, x): + .....: self.x = x + .....: def sumsquare(self): + .....: return (self.x**2).sum() + .....: + .....: + +In [116]: nse = npy.random.rand(100) + +In [117]: mydata.sumsquare() +Out[117]: 29.6851135284 + +\end{lstlisting} + + \lstinputlisting[label=code:stats_descriptives_skel,caption={IGNORED}]{skel/stats_descriptives_skel.py} \begin{figure} Modified: trunk/py4science/workbook/stats_distributions.tex =================================================================== --- trunk/py4science/workbook/stats_distributions.tex 2007-10-26 20:21:23 UTC (rev 4031) +++ trunk/py4science/workbook/stats_distributions.tex 2007-10-27 04:00:59 UTC (rev 4032) @@ -1,9 +1,83 @@ \section{Statistical distributions} \label{sec:stats_distributions} +We explore a handful of the statistical distributions in +\texttt{scipy.stats} module and the connections between them. The +organization of the distribution functions in \texttt{scipy.stats} is +quite elegant, with each distribution providing random variates +(\texttt{rvs}), analytical moments (mean, variance, skew, kurtosis), +analytic density (\texttt{pdf}, \texttt{cdf}) and survival functions +(\texttt{sf}, \textt{isf}) (where available) and tools for fitting +empirical distributions to the analytic distributions (\textt{fit}). +in the exercise below, we will simulate a radioactive particle +emitter, and look at the empirical distribution of waiting times +compared with the expected analytical distributions. Our radioative +particle emitter has an equal likelihood of emitting a particle in any +equal time interval, and emits particles at a rate of 20~Hz. We will +discretely sample time at a high frequency, and record a 1 of a +particle is emitted and a 0 otherwise, and then look at the +distribution of waiting times between emissions. The probability of a +particle emission in one of our sample intervals (assumed to be very +small compared to the average interval between emissions) is +proportional to the rate and the sample interval $\Delta t$, ie +$p(\Delta t) = \alpha \Delta t$ where $\alpha$ is the emission rate in +particles per second. +\begin{lstlisting} +# a uniform distribution [0..1] +In [62]: uniform = scipy.stats.uniform() + +# our sample interval in seconds +In [63]: deltat = 0.001 + +# the emission rate, 20Hz +In [65]: alpha = 20 + +# 1000 random numbers +In [66]: rvs = uniform.rvs(1000) + +# a look at the 1st 20 random variates +In [67]: rvs[:20] +Out[67]: +array([ 0.71167172, 0.01723161, 0.25849255, 0.00599207, 0.58656146, + 0.12765225, 0.17898621, 0.77724693, 0.18042977, 0.91935639, + 0.97659579, 0.59045477, 0.94730366, 0.00764026, 0.12153159, + 0.82286929, 0.18990484, 0.34608396, 0.63931108, 0.57199175]) + +# we simulate an emission when the random number is less than +# p(Delta t) = alpha * deltat +In [84]: emit = rvs < (alpha * deltat) + + +# there were 3 emissions in the first 20 observations +In [85]: emit[:20] +Out[85]: +array([False, True, False, True, False, False, False, False, False, + False, False, False, False, True, False, False, False, False, + False, False], dtype=bool) +\end{lstlisting} + +The waiting times between the emissions should follow an exponential +distribution (see \texttt{scipy.stats.expon}) with a mean of +$1/\alpha$. In the exercise below, you will generate a long array of +emissions, compute the waiting times between emissions, between 2 +emissions, and between 10 emissions. These should approach an 1st +order gamma (aka exponential) distribution, 2nd order gamma, and 10th +order gamma (see \texttt{scipy.stats.gamma}). Use the probability +density functions for these distributions in \texttt{scipy.stats} to +compare your simulated distributions and moments with the analytic +versions provided by \texttt{scipy.stats}. With 10 waiting times, we +should be approaching a normal distribution since we are summing 10 +waiting times and under the central limit theorem the sum of +independent samples from a finite variance process approaches the +normal distribution (see \texttt{scipy.stats.norm}). In the final +part of the exercise below, you will be asked to approximate the 10th +order gamma distribution with a normal distribution. The results +should look something like those in +Figure~\ref{fig:stats_distributions}. + \lstinputlisting[label=code:stats_distributions_skel,caption={IGNORED}]{skel/stats_distributions_skel.py} \begin{figure} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-27 12:36:41
|
Revision: 4037 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4037&view=rev Author: jdh2358 Date: 2007-10-27 05:36:39 -0700 (Sat, 27 Oct 2007) Log Message: ----------- final commit before workshop Modified Paths: -------------- trunk/py4science/doc/linkfest trunk/py4science/examples/skel/trapezoid_skel.py Modified: trunk/py4science/doc/linkfest =================================================================== --- trunk/py4science/doc/linkfest 2007-10-27 06:23:13 UTC (rev 4036) +++ trunk/py4science/doc/linkfest 2007-10-27 12:36:39 UTC (rev 4037) @@ -64,9 +64,8 @@ matplotlib: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/matplotlib - py4science: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/py4science + py4science workbook: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/py4science/workbook - Important commands: svn up : update the repo Modified: trunk/py4science/examples/skel/trapezoid_skel.py =================================================================== --- trunk/py4science/examples/skel/trapezoid_skel.py 2007-10-27 06:23:13 UTC (rev 4036) +++ trunk/py4science/examples/skel/trapezoid_skel.py 2007-10-27 12:36:39 UTC (rev 4037) @@ -14,6 +14,7 @@ y[i] = f(x[i]) for some function f to be integrated. Minimally modified from matplotlib.mlab.""" + raise NotImplementedError @@ -31,6 +32,11 @@ Output: - The value of the trapezoid-rule approximation to the integral.""" + + # you will need to apply the function f to easch element of the + # vector x. What are several ways to do this? Can you profile + # them to see what differences in timings result for long vectors + # x? raise NotImplementedError if __name__ == '__main__': This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-28 16:35:25
|
Revision: 4040 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4040&view=rev Author: jdh2358 Date: 2007-10-28 09:35:18 -0700 (Sun, 28 Oct 2007) Log Message: ----------- fixed some bugs in convolve Modified Paths: -------------- trunk/py4science/examples/skel/convolution_demo_skel.py trunk/py4science/workbook/convolution.tex trunk/py4science/workbook/intro_sigproc.tex Modified: trunk/py4science/examples/skel/convolution_demo_skel.py =================================================================== --- trunk/py4science/examples/skel/convolution_demo_skel.py 2007-10-28 15:18:02 UTC (rev 4039) +++ trunk/py4science/examples/skel/convolution_demo_skel.py 2007-10-28 16:35:18 UTC (rev 4040) @@ -40,7 +40,7 @@ # evaluate the impulse response function, and numerically convolve it # with the input x r = XXX # evaluate the impulse function -y = XXX # convultion of x with r +y = XXX # convolution of x with r y = XXX # extract just the length Nt part # compute y by applying F^-1[F(x) * F(r)]. The fft assumes the signal Modified: trunk/py4science/workbook/convolution.tex =================================================================== --- trunk/py4science/workbook/convolution.tex 2007-10-28 15:18:02 UTC (rev 4039) +++ trunk/py4science/workbook/convolution.tex 2007-10-28 16:35:18 UTC (rev 4040) @@ -3,9 +3,9 @@ The output of a linear system is given by the convolution of its impulse response function with the input. Mathematically -\[ +\begin{equation} y(t) = \int_0^t x(\tau)r(t-\tau)d\tau -\] +\end{equation} This fundamental relationship lies at the heart of linear systems analysis. It is used to model the dynamics of calcium buffers in neuronal synapses, where incoming action potentials are represented as Modified: trunk/py4science/workbook/intro_sigproc.tex =================================================================== --- trunk/py4science/workbook/intro_sigproc.tex 2007-10-28 15:18:02 UTC (rev 4039) +++ trunk/py4science/workbook/intro_sigproc.tex 2007-10-28 16:35:18 UTC (rev 4040) @@ -12,4 +12,4 @@ analyses, such as historgrams (\texttt{hist}), auto and cross correlations (\texttt{acorr} and \texttt{xcorr}), power spectra and coherence spectra (\texttt{psd}, \texttt{csd}, \texttt{cohere} and -\texttt{specgram}. +\texttt{specgram}). This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-10-29 14:48:25
|
Revision: 4048 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4048&view=rev Author: jdh2358 Date: 2007-10-29 07:48:20 -0700 (Mon, 29 Oct 2007) Log Message: ----------- added instructions for py4science contribs Added Paths: ----------- trunk/py4science/doc/py4science.patches Removed Paths: ------------- trunk/py4science/workbook/main.pdf Added: trunk/py4science/doc/py4science.patches =================================================================== --- trunk/py4science/doc/py4science.patches (rev 0) +++ trunk/py4science/doc/py4science.patches 2007-10-29 14:48:20 UTC (rev 4048) @@ -0,0 +1,52 @@ +How to submit a patch for the py4science course materials + + +1) get an svn checkout of the py4science dir. + + > svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/py4science + + If you already have a checkout (eg on the machine we worked on in + the classroom), you just need to do + + > svn up + + If you are a windows user, you may want to checkout TortoiseSVN at + http://tortoisesvn.tigris.org. + +2) Find something to fix or contribute. You can fix a typo in the + workbook, some code in the examples or skeletons, add your own + examples, write better explanations or comments in the workbbok, + examples, or skeletons, or even fix this document you are reading + now, which lives in doc/py4science.patches in the svn repository. + Make the changes in your local repository. + +3) If you fix something, test it. If you mkodify an example, make + sure it still runs and generates the desired output and figures. + If you modify the TeX source of the workbook, make sure you can + compile it with pdflatex and view the output main.pdf. Once you + patch is accepted, it will affect py4science users worldwide, so + try and get it right! + +4) Do an svn diff to create a patch file. Try and make the patch name + meaningful, eg if you are creating a patch for the FFT denoising + explanation in the workbook, do something like + + > svn diff > fft_denoise.patch + +5) Send the patch to the py4science mailing list by mailing + py4...@co.... If you are not already subscribed, you + can do so at + + http://code.astraw.com/cgi-bin/mailman/listinfo/py4science + + (after you subscribe, you will get a confirmation email and you + will need to click on the confirm link). When sending your patch, + send a brief explanation of the problemand solution with a helpful + subject header, and *attach* your patch rather than paste it into + the email browser. If you don't get any response on your patch + (eg, "Thanks, I've committed this to svn revision 4096" or "I don't + think this patch is a good idea because blah blah") then email + again in a few days to remind us to deal with it. + +6) Congratulations, you are now open source contributors. Don't + forget to pad your resume as needed. \ No newline at end of file Deleted: trunk/py4science/workbook/main.pdf =================================================================== --- trunk/py4science/workbook/main.pdf 2007-10-29 14:44:18 UTC (rev 4047) +++ trunk/py4science/workbook/main.pdf 2007-10-29 14:48:20 UTC (rev 4048) @@ -1,20230 +0,0 @@ -%PDF-1.4 -5 0 obj -<< /S /GoTo /D (chapter.1) >> -endobj -8 0 obj -(Chapter 1. Introduction) -endobj -9 0 obj -<< /S /GoTo /D (chapter.2) >> -endobj -12 0 obj -(Chapter 2. Simple non-numerical problems) -endobj -13 0 obj -<< /S /GoTo /D (section.2.1) >> -endobj -16 0 obj -(1. Sorting quickly with QuickSort ) -endobj -17 0 obj -<< /S /GoTo /D (section.2.2) >> -endobj -20 0 obj -(2. Dictionaries for counting words) -endobj -21 0 obj -<< /S /GoTo /D (chapter.3) >> -endobj -24 0 obj -(Chapter 3. Working with files, the internet, and numpy arrays) -endobj -25 0 obj -<< /S /GoTo /D (section.3.1) >> -endobj -28 0 obj -(1. Loading and saving ASCII data) -endobj -29 0 obj -<< /S /GoTo /D (section.3.2) >> -endobj -32 0 obj -(2. Working with CSV files) -endobj -33 0 obj -<< /S /GoTo /D (section.3.3) >> -endobj -36 0 obj -(3. Loading and saving binary data) -endobj -37 0 obj -<< /S /GoTo /D (chapter.4) >> -endobj -40 0 obj -(Chapter 4. Elementary Numerics) -endobj -41 0 obj -<< /S /GoTo /D (section.4.1) >> -endobj -44 0 obj -(1. Wallis' slow road to ) -endobj -45 0 obj -<< /S /GoTo /D (section.4.2) >> -endobj -48 0 obj -(2. Trapezoidal rule) -endobj -49 0 obj -<< /S /GoTo /D (section.4.3) >> -endobj -52 0 obj -(3. Newton's method) -endobj -53 0 obj -<< /S /GoTo /D (chapter.5) >> -endobj -56 0 obj -(Chapter 5. Linear algebra) -endobj -57 0 obj -<< /S /GoTo /D (section.5.1) >> -endobj -60 0 obj -(1. Glass Moir\351 Patterns) -endobj -61 0 obj -<< /S /GoTo /D (chapter.6) >> -endobj -64 0 obj -(Chapter 6. Signal processing) -endobj -65 0 obj -<< /S /GoTo /D (section.6.1) >> -endobj -68 0 obj -(1. Convolution) -endobj -69 0 obj -<< /S /GoTo /D (section.6.2) >> -endobj -72 0 obj -(2. FFT Image Denoising) -endobj -73 0 obj -<< /S /GoTo /D (chapter.7) >> -endobj -76 0 obj -(Chapter 7. Statistics) -endobj -77 0 obj -<< /S /GoTo /D (section.7.1) >> -endobj -80 0 obj -(1. Descriptive statistics) -endobj -81 0 obj -<< /S /GoTo /D (section.7.2) >> -endobj -84 0 obj -(2. Statistical distributions) -endobj -85 0 obj -<< /S /GoTo /D [86 0 R /Fit ] >> -endobj -88 0 obj << -/Length 321 -/Filter /FlateDecode ->> -stream -xڍQ;O\xC30\xDE\xF3+<\xDAC\x9F_\x8F\xBC -\xEAT\xA9\x91(CHB\x95:(jU\xC1\xAF\xC7NhU$dɖ}\xDF\xE3>22\xAF\xC1I\xA9i -\xDE\xB1z\x97I\xB6\x8E\xB5\x870F \xEF]\xBC\xFCQ\xCD-\xA0\xBD/X~)rSfW3m\xD0\xC6)V\xBE1%%(\xEB -\xE6PC\xA1#\xA3l\x9E\xF9b\xA8\xEA}WW\xEF"\xF8\xB2\xEE\xDA \xB4\xE4{\x81\xBC9\xF2\x95ԦNE\xC7o\xFB]z\xF98\x9C\x8Ba-^\xCA9#\x85hY\xAEPI\x95\xBB0I.>2Q6}\xE1\xB9R愞\xFA\xB8\x9E\xC0O\xC2+\xDE\xDB\xD7xE\xDE\xC7]\xF2~\x9BX1\x8E\xB9\x8C\x93+ "\x9Bb\x83&r\xA3ʼ\xDF$W$~\xE9,\xF8c\xF4=\xA1߷\xC3\xE4\x8E`1~\xC3/\xFB\x99 \xCF\xDB!T\xA1\xE9'\x81\x85P\xC4W\xDA\xE2\xD0~\x8D<\xAE\xB0\xB1k\xE3\xC18RSס\xDA\xE3DX\x8A\x942F\xAAD=&Rv_\x9E'u\x9A\xB55 \xFFߣ\xFEko~\x9Bendstream -endobj -86 0 obj << -/Type /Page -/Contents 88 0 R -/Resources 87 0 R -/MediaBox [0 0 612 792] -/Parent 97 0 R ->> endobj -89 0 obj << -/D [86 0 R /XYZ 93.6002 733.9477 null] ->> endobj -90 0 obj << -/D [86 0 R /XYZ 93.6002 720 null] ->> endobj -87 0 obj << -/Font << /F35 93 0 R /F34 96 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -100 0 obj << -/Length 92 -/Filter /FlateDecode ->> -stream -xڍ\x8D1\x800\xF7\xBE"h7iӼ\x80\x87t`\xE2\xFF+Ab@\x82y\xB1\xE5\x93 -\x92(\x94\x87H#W\xE50wZGڳ\xDB -nƚ\xB1G\x8Cmmp։\xCB\xE5Ğԛg\xC3\xECTG\xEF.\xF8y;"5endstream -endobj -99 0 obj << -/Type /Page -/Contents 100 0 R -/Resources 98 0 R -/MediaBox [0 0 612 792] -/Parent 97 0 R ->> endobj -101 0 obj << -/D [99 0 R /XYZ 93.6002 733.9477 null] ->> endobj -98 0 obj << -/ProcSet [ /PDF ] ->> endobj -104 0 obj << -/Length 1520 -/Filter /FlateDecode ->> -stream -xڝY\xDBn\xDC6}\xF7W\xE8-Z\xA0\xCB\xF2N\xC0E\xB4\xB5\xD1>4}\x90w7k!{q\xB5r\x8C\xF4\xEB;\xA4Hi\xB4\xBA\xA1\x82\x81ؒ\xA93Gg\x86C\x86%~Xbє\xF2\xC4A\xAC4&\xD9oh\xB2\x87gnX\xC0H.\x89\xB1V\xC3\xC5\xC0ӵb\xD6f\xC9O\xF2\xE3\xC3\xCD\xF7\xEF\x85J\x98$Bj\x9E<|N\xB8Q\x84Y\x93%ZP"\x84\xBB\xB9\xFD+}{>\xADM\xABKw\xCD_\x97\xD5\xDF?ݼ{h\xDEy*\xAB\x89Ԃ\xBBWO w\xFFP\x96\x94\xFB\xA4{\xE3w\xC41_\xE3\xF1\x9E"S\x89%Vs\xED\xF6\xDE\xE2 >\xE5ϫ5K\xAB]\xB9Z!RFVkkmzwZq\x93V%\xF0=\xAF\xD6<K\xB7/\xB7\xA9 -w\xE7t\xA7fg\xDDzj6\xA8\xAA\x8A "A\xCD.W5\xAA\x9B\xD1D\x89l\xB1l\xED\xF0 \xD5hP4D\xBBww\x9D@G\xFF\xFC\xE0>\xBBC\xC8\xF4\x92\xC1\x9D\xB5W\xF5\xE5\xB8sN\xDBb\x93\xEA9\x9E\xCB\xF3\xE3awtz\xE1\x99!L |
From: <js...@us...> - 2007-12-01 13:59:08
|
Revision: 4535 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4535&view=rev Author: jswhit Date: 2007-12-01 05:59:01 -0800 (Sat, 01 Dec 2007) Log Message: ----------- update basemap examples for version 0.9.8 Modified Paths: -------------- trunk/py4science/examples/basemap1.py trunk/py4science/examples/basemap2.py trunk/py4science/examples/basemap3.py trunk/py4science/examples/basemap4.py trunk/py4science/examples/basemap5.py trunk/py4science/examples/skel/basemap1_skel.py trunk/py4science/examples/skel/basemap2_skel.py trunk/py4science/examples/skel/basemap3_skel.py trunk/py4science/examples/skel/basemap4_skel.py trunk/py4science/examples/skel/basemap5_skel.py trunk/py4science/workbook/basemap.tex Modified: trunk/py4science/examples/basemap1.py =================================================================== --- trunk/py4science/examples/basemap1.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/basemap1.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -2,9 +2,7 @@ from matplotlib.toolkits.basemap import Basemap # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying lat/lon values at corners. resolution = 'l' projection = 'lcc' @@ -18,8 +16,10 @@ resolution=resolution,projection=projection) # draw coastlines. Make liness a little thinner than default. m.drawcoastlines(linewidth=0.5) -# fill continents. -m.fillcontinents(color='coral') +# background fill color will show ocean areas. +m.drawmapboundary(fill_color='aqua') +# fill continents, lakes within continents. +m.fillcontinents(color='coral',lake_color='aqua') # draw states and countries. m.drawcountries() m.drawstates() Modified: trunk/py4science/examples/basemap2.py =================================================================== --- trunk/py4science/examples/basemap2.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/basemap2.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -2,9 +2,7 @@ from matplotlib.toolkits.basemap import Basemap # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying width and height in km. resolution = 'l' projection = 'lcc' @@ -15,11 +13,9 @@ m = Basemap(lon_0=lon_0,lat_0=lat_0,\ width=width,height=height,\ resolution=resolution,projection=projection) -# draw coastlines. m.drawcoastlines(linewidth=0.5) -# fill continents. -m.fillcontinents(color='coral') -# draw states and countries. +m.drawmapboundary(fill_color='aqua') +m.fillcontinents(color='coral',lake_color='aqua') m.drawcountries() m.drawstates() pylab.title('map region specified using width and height') Modified: trunk/py4science/examples/basemap3.py =================================================================== --- trunk/py4science/examples/basemap3.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/basemap3.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -2,9 +2,7 @@ from matplotlib.toolkits.basemap import Basemap # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying width and height in km. resolution = 'l' lon_0 = -50 @@ -37,7 +35,8 @@ pylab.text(lon_x-100000,lon_y+100000,'London',fontsize=12,\ color='k',horizontalalignment='right',fontweight='bold') m.drawcoastlines(linewidth=0.5) -m.fillcontinents(color='coral') +m.drawmapboundary(fill_color='aqua') +m.fillcontinents(color='coral',lake_color='aqua') m.drawcountries() m.drawstates() pylab.title('NY to London Great Circle') Modified: trunk/py4science/examples/basemap4.py =================================================================== --- trunk/py4science/examples/basemap4.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/basemap4.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -1,9 +1,7 @@ import pylab, numpy from matplotlib.toolkits.basemap import Basemap # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying width and height in km. resolution = 'l' lon_0 = -50 @@ -15,7 +13,8 @@ width=width,height=height,\ resolution=resolution,projection=projection) m.drawcoastlines(linewidth=0.5) -m.fillcontinents(color='coral') +m.drawmapboundary(fill_color='aqua') +m.fillcontinents(color='coral',lake_color='aqua') m.drawcountries() m.drawstates() # label meridians where they intersect the left, right and bottom Modified: trunk/py4science/examples/basemap5.py =================================================================== --- trunk/py4science/examples/basemap5.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/basemap5.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -1,28 +1,22 @@ from matplotlib.toolkits.basemap import Basemap, NetCDFFile import pylab, numpy -from numpy import ma # read in netCDF sea-surface temperature data +# can be a local file, a URL for a remote opendap dataset, +# or (if PyNIO is installed) a GRIB or HDF file. ncfile = NetCDFFile('data/sst.nc') -sstv = ncfile.variables['analysed_sst'] -sst = ma.masked_values(numpy.squeeze(sstv[:]), sstv._FillValue) -sst = sstv.scale_factor*sst + sstv.add_offset +sst = ncfile.variables['analysed_sst'][:] lats = ncfile.variables['lat'][:] lons = ncfile.variables['lon'][:] + print sst.shape, sst.min(), sst.max() -# make sure middle of map region is middle of data grid. -lon_0 = lons.mean() -lat_0 = lats.mean() # set colormap cmap = pylab.cm.gist_ncar -# set so masked values in an image will be black -# (i.e. continents will be painted this color) -cmap.set_bad('k') # create Basemap instance for mollweide projection. # coastlines not used, so resolution set to None to skip # continent processing (this speeds things up a bit) -m = Basemap(projection='moll',lon_0=lon_0,lat_0=lat_0,resolution=None) +m = Basemap(projection='moll',lon_0=0,lat_0=0,resolution=None) # compute map projection coordinates of grid. x, y = m(*numpy.meshgrid(lons, lats)) # plot with pcolor @@ -31,8 +25,9 @@ m.drawparallels(numpy.arange(-90.,120.,30.)) m.drawmeridians(numpy.arange(0.,420.,60.)) # draw line around map projection limb. -m.drawmapboundary() +# color map region background black (missing values will be this color) +m.drawmapboundary(fill_color='k') # draw horizontal colorbar. pylab.colorbar(orientation='horizontal') -pylab.savefig('basemap5.pdf') # eps files are too huge when pcolor used. +pylab.savefig('basemap5.pdf') pylab.savefig('basemap5.png') Modified: trunk/py4science/examples/skel/basemap1_skel.py =================================================================== --- trunk/py4science/examples/skel/basemap1_skel.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/skel/basemap1_skel.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -2,9 +2,7 @@ from matplotlib.toolkits.basemap import Basemap # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying lat/lon values at corners. projection = 'lcc' # map projection resolution = XX # resolution of boundaries ('c','l','i',or 'h') @@ -18,8 +16,10 @@ resolution=resolution,projection=projection) # draw coastlines. Make liness a little thinner than default. m.drawcoastlines(linewidth=0.5) -# fill continents. -m.fillcontinents(color='coral') +# background fill color will show ocean areas. +m.drawmapboundary(fill_color='aqua') +# fill continents, lakes within continents. +m.fillcontinents(color='coral',lake_color='aqua') # draw states and countries. m.drawcountries() m.drawstates() Modified: trunk/py4science/examples/skel/basemap2_skel.py =================================================================== --- trunk/py4science/examples/skel/basemap2_skel.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/skel/basemap2_skel.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -2,9 +2,7 @@ from matplotlib.toolkits.basemap import Basemap, supported_projections # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying width and height in km. projection = XX # map projection ('lcc','stere','laea','aea' etc) # 'print supported_projections' gives a list @@ -16,11 +14,9 @@ m = Basemap(lon_0=lon_0,lat_0=lat_0,\ width=width,height=height,\ resolution=resolution,projection=projection) -# draw coastlines. m.drawcoastlines(linewidth=0.5) -# fill continents. -m.fillcontinents(color='coral') -# draw states and countries. +m.drawmapboundary(fill_color='aqua') +m.fillcontinents(color='coral',lake_color='aqua') m.drawcountries() m.drawstates() pylab.title('map region specified using width and height') Modified: trunk/py4science/examples/skel/basemap3_skel.py =================================================================== --- trunk/py4science/examples/skel/basemap3_skel.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/skel/basemap3_skel.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -4,7 +4,6 @@ # create figure. # background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying width and height in km. resolution = 'l' lon_0 = -50 @@ -39,7 +38,8 @@ pylab.text(x2-100000,y2+100000,name2,fontsize=12,\ color='k',horizontalalignment='right',fontweight='bold') m.drawcoastlines(linewidth=0.5) -m.fillcontinents(color='coral') +m.drawmapboundary(fill_color='aqua') +m.fillcontinents(color='coral',lake_color='aqua') m.drawcountries() m.drawstates() pylab.title(name1+' to '+name2+' Great Circle') Modified: trunk/py4science/examples/skel/basemap4_skel.py =================================================================== --- trunk/py4science/examples/skel/basemap4_skel.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/skel/basemap4_skel.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -1,9 +1,7 @@ import pylab, numpy from matplotlib.toolkits.basemap import Basemap # create figure. -# background color will be used for 'wet' areas. fig = pylab.figure() -fig.add_axes([0.1,0.1,0.8,0.8],axisbg='aqua') # create map by specifying width and height in km. resolution = 'l' lon_0 = -50 @@ -15,7 +13,8 @@ width=width,height=height,\ resolution=resolution,projection=projection) m.drawcoastlines(linewidth=0.5) -m.fillcontinents(color='coral') +m.drawmapboundary(fill_color='aqua') +m.fillcontinents(color='coral',lake_color='aqua') m.drawcountries() m.drawstates() # draw and label parallels. Modified: trunk/py4science/examples/skel/basemap5_skel.py =================================================================== --- trunk/py4science/examples/skel/basemap5_skel.py 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/examples/skel/basemap5_skel.py 2007-12-01 13:59:01 UTC (rev 4535) @@ -1,33 +1,24 @@ from matplotlib.toolkits.basemap import Basemap, NetCDFFile, cm import pylab, numpy -from numpy import ma # read in netCDF sea-surface temperature data +# can be a local file, a URL for a remote opendap dataset, +# or (if PyNIO is installed) a GRIB or HDF file. ncfile = NetCDFFile('data/sst.nc') -sstv = ncfile.variables['analysed_sst'] -sst = ma.masked_values(numpy.squeeze(sstv[:]), sstv._FillValue) -sst = sstv.scale_factor*sst + sstv.add_offset +sst = ncfile.variables['analysed_sst'][:] lats = ncfile.variables['lat'][:] lons = ncfile.variables['lon'][:] + print sst.shape, sst.min(), sst.max() -# make sure middle of map region is middle of data grid. -lon_0 = lons.mean() -lat_0 = lats.mean() -# set colormap -#cmap = pylab.cm.gist_ncar # Basemap comes with extra colormaps from Generic Mapping Tools # (imported as cm, pylab colormaps in pylab.cm) cmap = XX -# set so masked values in an image will be painted specified color -# (i.e. continents will be painted this color) -color = XX -cmap.set_bad(color) # create Basemap instance for mollweide projection. projection = XX # try moll, robin, sinu or ortho. # coastlines not used, so resolution set to None to skip # continent processing (this speeds things up a bit) -m = Basemap(projection=projection,lon_0=lon_0,lat_0=lat_0,resolution=None) +m = Basemap(projection=projection,lon_0=0,lat_0=0,resolution=None) # compute map projection coordinates of grid. x, y = m(*numpy.meshgrid(lons, lats)) # plot with pcolor @@ -36,7 +27,9 @@ m.drawparallels(numpy.arange(-90.,120.,30.)) m.drawmeridians(numpy.arange(0.,420.,60.)) # draw line around map projection limb. -m.drawmapboundary() +# color map region background (missing values will be this color) +color = XX +m.drawmapboundary(fill_color=color) # draw horizontal colorbar. pylab.colorbar(orientation='horizontal') pylab.show() Modified: trunk/py4science/workbook/basemap.tex =================================================================== --- trunk/py4science/workbook/basemap.tex 2007-11-30 20:06:59 UTC (rev 4534) +++ trunk/py4science/workbook/basemap.tex 2007-12-01 13:59:01 UTC (rev 4535) @@ -96,10 +96,16 @@ One of the most common uses of Basemap is to visualize earth science data, such as output from climate models. These data often come on latitude/longitude grids. One common data format for storing such -grids is NetCDF. Basemap includes a NetCDF file reader (written in -pure python by Roberto D'Almeida). There are python packages available -for reading just about every other scientific data format imaginable, -including HDF, GRIB, FITS and many others. Following is an example +grids is NetCDF. Basemap includes a NetCDF file reader (written in +pure python by Roberto D'Almeida). +You can also access remote datasets over the web using the OPeNDAP +protocol - just give the NetCDFFile function a URL instead of a local file name +and Roberto's pydap module (\texttt{http://pydap.org}) will be used. +The pydap client is included in Basemap. +If the PyNIO module (\texttt{http://www.pyngl.ucar.edu/Nio.shtml}) is installed, the +NetCDFFile function can also be used to open the formats that +PyNIO supports, like GRIB and HDF. +Following is an example of how to read sea-surface temperature data from a NetCDF file and plot it on a global mollweide projection. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fer...@us...> - 2007-12-03 01:51:00
|
Revision: 4551 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4551&view=rev Author: fer_perez Date: 2007-12-02 17:50:55 -0800 (Sun, 02 Dec 2007) Log Message: ----------- Update reST in requirements doc Modified Paths: -------------- trunk/py4science/classes/0712_ncar_agenda.txt trunk/py4science/doc/requirements.txt trunk/py4science/workbook/main.tex Modified: trunk/py4science/classes/0712_ncar_agenda.txt =================================================================== --- trunk/py4science/classes/0712_ncar_agenda.txt 2007-12-03 01:39:21 UTC (rev 4550) +++ trunk/py4science/classes/0712_ncar_agenda.txt 2007-12-03 01:50:55 UTC (rev 4551) @@ -4,161 +4,149 @@ Initials indicate who presents what: -JDH - John D. Hunter -FP - Fernando Perez -JW - Jeff Whitaker + * JDH: John D. Hunter + * FP: Fernando Perez + * JW: Jeff Whitaker Day 1 (Friday December 7) ========================= -830-900 Installation and configuration (optional) -This half hour will be spent helping with installation issues, before the -real workshop begins. If you've already set things up on your system -(meaning you have ipython, numpy, matplotlib and scipy installed and -running), feel free to skip this. +830-900: Installation and configuration (optional) + This half hour will be spent helping with installation issues, before the + real workshop begins. If you've already set things up on your system + (meaning you have ipython, numpy, matplotlib and scipy installed and + running), feel free to skip this. -900-905 Introduction -Official start of the workshop, introduce instructors. +900-905: Introduction + Official start of the workshop, introduce instructors. -905-945 JDH: Python for scientific computing -A high-level overview of the topic of Python in a scientific context. +905-945 (JDH): Python for scientific computing + A high-level overview of the topic of Python in a scientific context. -950-1045 FP: Workflow, guided by a simple example: trapezoid integration. +950-1045 (FP): Workflow, guided by a simple examples. + This section will be used to illustrate basic workflow for students, by + having them 'type along' a very simple exercise, trapezoid rule integration. + We'll discuss the basics of numpy arrays and will solve the trapezoid + integration exercise together. -This section will be used to illustrate basic workflow for students, by having -them 'type along' a very simple exercise, trapezoid rule integration. We'll -discuss the basics of numpy arrays and will solve the trapezoid integration -exercise together. +---- -Editor: (X)Emacs, Vi(m), etc. +1045-1100: Coffee break -ipython. Saving and reloading files, interactive use of variables, %run, -%debug, %xmode verbose. +---- -Getting help: - - pydoc (-g, -p) +1100-1145 (FP): Introductory examples. + We'll have two exercises, so students who finish the first one early don't + get bored and can do a second one: - - The standard docs (bookmark them) + * FFTs: 2-d image denoising via FFT. + * Numerical integration and root finding. - - ipython ?/??, help(), the tab key. numpy.*cos*? search. +---- - - The open source process: mailing lists, wikis, svn. Python - cookbook. Participate! +1145-1230: Lunch Break -Basic setup: - - ipython - - matplotlib (latex, etc). - - Modules: import/reload, PYTHONPATH. +---- -- Urllib Yahoo finance demo. - -ToDo: Add numerical error measure of trapezoid rule. +1300-1400 (JDH): Basic numpy/pylab usage. + A linear algebra/2d data visualization demo using numpy and matplotlib will + then be extended as an exercise by the students. If time allows, an ODE + example will be presented: -ToDo Add in workflow comparison with scipy's integration. compare timing and - eror. + * Glass2 demo: linear algebra, event handling in interactive plots. + * Glass1 exercise: simplified version of the above as an exercise. + * ODEs - Lotka Volterra equations. -ToDo: write cheat-sheet. +1400-1500 (JW): Basemap: geographical datasets. + Basemap_ is a matplotlib toolkit that plots data on map projections (with + continental and political boundaries). -1045:1100 --- Coffee break --- +.. _Basemap: http://matplotlib.sourceforge.net/matplotlib.toolkits.basemap.basemap.html +---- -1100:1145 FP: Introductory examples. +1500 End of main work for Friday -We'll have two exercises, so students who finish the first one early don't get -bored and can do a second one. +---- -FFTs: 2-d image denoising via FFT. +1500-1700: Open data access standards and protocols (optional material) + We realize there's a Christmas party, so we'll keep this part optional, feel + free to skip out as the needs for wine and cheese dictate. We'll look at the + Python implementation of the OpenDAP protocol and a package for easy + construction and manipulation of HDF5 datsets: -Numerical integration and root finding: Find t such that + * (FP) - OpenDAP_ via the PyDAP_ implementation. + * (JDH) - PyTables_: an HDF5 library. - \int_0^t{ f(s) ds} = u +.. _OPenDAP: http://pydap.org +.. _PyDAP: http://opendap.org +.. _PyTables: http://www.pytables.org -for a known, monotonically increasing f(s) and a fixed u. - -1145:12:30 --- Lunch Break --- - -1300:1400 JDH: Basic numpy/pylab - -* Glass2 demo: linear algebra, event handling in interactive plots. -* Glass1 exercise: simplified version of the above as an exercise. -* ODEs - Lotka Volterra equations. - -1400:1500 JW, Basemap: geographical datasets. - -1500 --- End of main work for Friday --- - -1500:1700: Optional material (there's a Christmas party) - -PyDAP/OpenDAP -PyTables - - + Day 2 (Saturday December 8) =========================== -900:930 FP: Traits, Mayavi2 demo. Automatic GUI generation, VTK library, the -MayaVi visualization application. This is a demo of capabilities, not an -exercise. +900-930 (FP): Traits_, TVTK_ and MayaVi2_ + Automatic GUI generation, VTK library, the MayaVi visualization application. + This is a demo of capabilities, not an exercise. -930:1030 FP - Lightweight tools for low-level code reuse +.. _Traits: http://code.enthought.com/traits +.. _TVTK: https://svn.enthought.com/enthought/wiki/TVTK +.. _MayaVi2: http://code.enthought.com/mayavi2 + +9300-1030 (FP): - Lightweight tools for low-level code reuse + These two tools ship by default with NumPy (f2py) and SciPy (weave), and + allow you to easily access low-level codes or optimize numerical hotspots: + + * f2py: Fortran code wrapping exercise. + * weave: C/C++ inlining exercise. -f2py: Fortran code wrapping exercise. -weave: C/C++ inlining exercise. +---- -1030:1045 --- Coffee break --- +1030-1045: Coffee break -1045:1200 JDH - Other tools for C/C++ code reuse, demos/slides. +---- -* ctypes: easy access to dynamically linked libraries. -* pyrex: blend of python/C for automatic generation of native code. -* SWIG: automatic wrapping of C/C++ libraries. -* Boost.Python: automatic wrapping of C++ libraries with template support. -* A tour of scipy's code base, which uses several of these techniques. - -1200:1300 --- Lunch break --- +1045-1200 (JDH): Other tools for C/C++ code reuse + This will be a demo of a number of other tools that exist in Python for + accessing C and C++ codes, each with its own set of strengths: + + * ctypes_: easy access to dynamically linked libraries. + * pyrex_: blend of python/C for automatic generation of native code. + * SWIG_: automatic wrapping of C/C++ libraries. + * `Boost.Python`_: automatic wrapping of C++ libraries with template support. + * A tour of scipy's code base, which uses several of these techniques. -1300:1330: JDH - SVN workflow, contributing to the workbook. (optional mailing list - subscription) +.. _ctypes: http://python.net/crew/theller/ctypes +.. _pyrex: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex +.. _SWIG: http://www.swig.org +.. _`Boost.Python`: http://www.boost.org/libs/python/doc -1330:1400: JDH - Type along data smoothing, convolutions, scipy.filter +---- -1400:1430: FP - Basic data fitting, scipy.optimize +1200-1300: Lunch break -1430:1500: FP - Sage intro/demo. +---- -1500:1515 - Wrapup. +1300-1330 (JDH): Participating in the open source process + We'll discuss the SVN workflow, contributing to the workbook and the projects + used in this course, etc. +1330-1400 (JDH): Data smoothing + Type along data smoothing, convolutions, scipy.filter +1400-1430 (FP): Fitting + Basic data fitting, scipy.optimize exercise. -Unused examples and exercises, extra ideas -========================================== +1430-1500 (FP): SAGE + An overview and brief demo of the Sage_ project, an ambitious and rapidly + growing Python project to offer free mathematical software (as well as + integration with commercial systems). -* Visual (VPython): Show some examples, explain. Target shooting exercise. +.. _Sage: http://sagemath.org -* One-dimensional FFT - Bode plot. - -* Spectral interpolation. - -* Steinman interpolation. - -* Extended precision root finding: manually implement newton's method using - clnum or mpfr. - -* Bessel functions: special functions library, array manipulations to check -recursion relation (30 min). - -* Descriptive statistics, statistical distributions (1 hr). - -* SVD/eigenfaces (1 hr). - -* Logistic map (1 hr). - -* Beautiful soup: screen-scraping HTML for data extraction (30 min). - -* Word frequencies: use of dictionaries and text processing (20 min). - -* Prime numbers: the Sieve of Erathostenes. Illustrates lists and sets (30 - min). - -* Wallis' pi: arbitrary precision integers (30 min). +1500-1515: Wrapup + We'll have a bit of time for discussion, feedback and any questions that may + have been left. + \ No newline at end of file Modified: trunk/py4science/doc/requirements.txt =================================================================== --- trunk/py4science/doc/requirements.txt 2007-12-03 01:39:21 UTC (rev 4550) +++ trunk/py4science/doc/requirements.txt 2007-12-03 01:50:55 UTC (rev 4551) @@ -1,3 +1,17 @@ +====================================== + Requirements for the Python workshop +====================================== + +.. contents:: +.. + 1 Core requirements + 2 Basic configuration + 3 Testing + 4 Checking your versions + 5 Platform specific instructions + 6 Optional packages + + Core requirements ================= @@ -42,7 +56,7 @@ with the rest of your matplotlib install. Create a directory in your home directory called .matplotlib and copy this file into it (or simply edit in place in mpl-data) and change the line that starts with -'backend' to +'backend' to:: backend : WXAgg @@ -53,7 +67,7 @@ If you can execute the following commands w/o error, and have a plot window pop up, you have an installation that will work for 90% of the -exercises in the workshop +exercises in the workshop:: > ipython -pylab Python 2.5 (r25:51918, Sep 19 2006, 08:49:13) @@ -82,7 +96,7 @@ - scipy >= 0.5.2 -The example code below shows you how to check your versions: +The example code below shows you how to check your versions:: In [4]: import numpy @@ -113,6 +127,7 @@ win32 + Optional packages ================= @@ -157,4 +172,3 @@ with documentation at http://matplotlib.sourceforge.net/matplotlib.toolkits.basemap.basemap.html - Modified: trunk/py4science/workbook/main.tex =================================================================== --- trunk/py4science/workbook/main.tex 2007-12-03 01:39:21 UTC (rev 4550) +++ trunk/py4science/workbook/main.tex 2007-12-03 01:50:55 UTC (rev 4551) @@ -22,7 +22,7 @@ \providecommand{\tabularnewline}{\\} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands. - \theoremstyle{plain} +\theoremstyle{plain} \newtheorem{thm}{Theorem}[section] \newenvironment{lyxcode} {\begin{list}{}{ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fer...@us...> - 2007-12-04 18:37:52
|
Revision: 4581 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4581&view=rev Author: fer_perez Date: 2007-12-04 10:37:40 -0800 (Tue, 04 Dec 2007) Log Message: ----------- Updates I forgot to commit yesterday... Modified Paths: -------------- trunk/py4science/workbook/fft_imdenoise.tex trunk/py4science/workbook/quad_newton.tex Added Paths: ----------- trunk/py4science/examples/stock_demo.py Added: trunk/py4science/examples/stock_demo.py =================================================================== --- trunk/py4science/examples/stock_demo.py (rev 0) +++ trunk/py4science/examples/stock_demo.py 2007-12-04 18:37:40 UTC (rev 4581) @@ -0,0 +1,42 @@ +"""Simple data access and manipulation demo, using Yahoo Finance data.""" + +# <demo> stop + +# Needed libraries +import urllib +import matplotlib.mlab as mlab # contains csv2rec +import pylab as p + +# <demo> stop + +# Choose a stock, make the URL for it and download it to a local file +ticker = 'CROX' # Boulder-based company Crocs + +url = 'http://ichart.finance.yahoo.com/table.csv?' +\ + 's=%s&d=9&e=20&f=2007&g=d&a=0&b=29&c=1993&ignore=.csv'%ticker + +fname = '%s.csv'% ticker +urllib.urlretrieve(url, fname) + +# <demo> stop + +# Now, make a Record Array out of this dataset: +r = mlab.csv2rec(fname) + +# note that the CSV file is sorted most recent date first, so you will probably +# want to sort the record array so most recent date is last +r.sort() +# A quick look at the data structure: +print 'dtype:',r.dtype +print 'shape:',r.shape + +# <demo> stop + +p.plot(r.date,r.adj_close) +p.show() + +# <demo> stop +# Now, make a slightly modified version of the file with cleaner formatting. +# We'll use this later... +mlab.rec2csv(r,'dap/myserver/data/sample.csv', + formatd={'date':mlab.FormatString()}) Modified: trunk/py4science/workbook/fft_imdenoise.tex =================================================================== --- trunk/py4science/workbook/fft_imdenoise.tex 2007-12-04 17:39:31 UTC (rev 4580) +++ trunk/py4science/workbook/fft_imdenoise.tex 2007-12-04 18:37:40 UTC (rev 4581) @@ -1,50 +1,52 @@ \section{FFT Image Denoising} \label{sec:fft_imdenoise} -Convolution of an input with with a linear filter in the termporal or -spatial domain is equivalent to multiplication by the fourier -transforms of the input and the filter in the spectral domain. This -provides a conceptually simple way to think about filtering: transform -your signal into the frequency domain, dampen the frequencies you are -not interested in by multiplying the frequency spectrum by the desired -weights, and then inverse transform the multiplies spectrum back into -the original domain. In the example below, we will simply set the -weights of the frequencies we are uninterested in (the high frequency -noise) to zero rather than dampening them with a smoothly varying -function. Although this is not usually the best thing to do, since -sharp edges in one domain usually introduce artifacts in another (eg -high frequency ``ringing''), it is easy to do and sometimes provides -satisfactory results. +Convolution of an input with with a linear filter in the termporal or spatial +domain is equivalent to multiplication by the fourier transforms of the input +and the filter in the spectral domain. This provides a conceptually simple way +to think about filtering: transform your signal into the frequency domain, +dampen the frequencies you are not interested in by multiplying the frequency +spectrum by the desired weights, and then apply the inverse transform to the +modified spectrum, back into the original domain. In the example below, we +will simply set the weights of the frequencies we are uninterested in (the high +frequency noise) to zero rather than dampening them with a smoothly varying +function. Although this is not usually the best thing to do, since sharp edges +in one domain usually introduce artifacts in another (eg high frequency +``ringing''), it is easy to do and sometimes provides satisfactory results. -The image in the upper left panel of Figure~\ref{fig:fft_imdenoise} is -a grayscale photo of the moon landing. There is a banded pattern of -high frequency noise polluting the image. In the upper right panel we -see the 2D spatial frequency spectrum. The FFT output in -\texttt{scipy} is packed with the lower freqeuencies starting in the -upper left, and proceeding to higher frequencies as one moves to the -center of the spectrum (this is the most efficient way numerically to -fill the output of the FFT algorithm). Because the input signal is -real, the output spectrum is complex and symmetrical: the -transformation values beyond the midpoint of the frequency spectrum -(the Nyquist frequency) correspond to the values for negative -frequencies and are simply the mirror image of the positive -frequencies below the Nyquist (this is true for the 1D, 2D and ND FFTs -in \texttt{numpy}). +The image in the upper left panel of Figure~\ref{fig:fft_imdenoise} is a +grayscale photo of the moon landing. There is a banded pattern of high +frequency noise polluting the image. In the upper right panel we see the 2D +spatial frequency spectrum. The FFT output in \texttt{scipy} is packed with +the lower freqeuencies starting in the upper left, and proceeding to higher +frequencies as one moves to the center of the spectrum (this is the most +efficient way numerically to fill the output of the FFT algorithm). Because +the input signal is real, the output spectrum is complex and symmetrical: the +transformation values beyond the midpoint of the frequency spectrum (the +Nyquist frequency) correspond to the values for negative frequencies and are +simply the mirror image of the positive frequencies below the Nyquist (this is +true for the 1D, 2D and ND FFTs in \texttt{numpy}). -In this exercise we will compute the 2D spatial frequency spectra of -the luminance image, zero out the high frequency components, and -inverse transform back into the time domain. We can plot the input -and output images with the \texttt{pylab.imshow} function, but the -images must first be scaled to be withing the 0..1 luminance range. -For best results, it helps to \textit{amplify} the image by some scale -factor, and then \textit{clip} it to set all values greater than one -to one. This serves to enhance contrast among the darker elements of -the image, so it is not completely dominated by the brighter segments +In this exercise we will compute the 2D spatial frequency spectra of the +luminance image, zero out the high frequency components, and inverse transform +back into the spatial domain. We can plot the input and output images with the +\texttt{pylab.imshow} function, but the images must first be scaled to be +within the 0..1 luminance range. For best results, it helps to +\textit{amplify} the image by some scale factor, and then \textit{clip} it to +set all values greater than one to one. This serves to enhance contrast among +the darker elements of the image, so it is not completely dominated by the +brighter segments \lstinputlisting[label=code:fft_imdenoise,caption={IGNORED}]{problems/fft_imdenoise.py} \begin{figure} -\begin{centering}\includegraphics[width=4in]{fig/fft_imdenoise}\par\end{centering} + \begin{centering} \includegraphics[width=4in]{fig/fft_imdenoise} \par + \end{centering} -\caption{\label{fig:fft_imdenoise}High freqeuency noise filtering of a 2D image in the Fourier domain. The upper panels show the original image (left) and spectral power (right) and the lower panels show the same data with the high frequency power set to zero. Although the input and output images are grayscale, you can provide colormaps to \texttt{pylab.imshow} to plot them in psudo-color} + \caption{\label{fig:fft_imdenoise}High freqeuency noise filtering of a 2D + image in the Fourier domain. The upper panels show the original image + (left) and spectral power (right) and the lower panels show the same data + with the high frequency power set to zero. Although the input and output + images are grayscale, you can provide colormaps to \texttt{pylab.imshow} to + plot them in psudo-color} \end{figure} Modified: trunk/py4science/workbook/quad_newton.tex =================================================================== --- trunk/py4science/workbook/quad_newton.tex 2007-12-04 17:39:31 UTC (rev 4580) +++ trunk/py4science/workbook/quad_newton.tex 2007-12-04 18:37:40 UTC (rev 4581) @@ -1,34 +1,35 @@ \section{Newton's method} \label{sec:quad_newton} -Consider the problem of solving for $t$ in\begin{equation} -\int_{o}^{t}f(s)ds=u\end{equation} - where $f(s)$ is a monotonically increasing function of $s$ and -$u>0$. +Consider the problem of solving for $t$ in +\begin{equation} + \int_{o}^{t}f(s)ds=u +\end{equation} +where $f(s)$ is a monotonically increasing function of $s$ and $u>0$. -This problem can be simply solved if seen as a root finding question. -Let\begin{equation} -g(t)=\int_{o}^{t}f(s)ds-u,\end{equation} +This problem can be simply solved if seen as a root finding question. Let +\begin{equation} +g(t)=\int_{o}^{t}f(s)ds-u, +\end{equation} then we just need to find the root for $g(t),$ which is guaranteed to be unique given the conditions above. The SciPy library includes an optimization package that contains a Newton-Raphson solver called \texttt{scipy.optimize.newton.} This solver can optionally take a known derivative for the function whose -roots are being sought, and in this case the derivative is simply -\begin{equation} -\frac{dg(t)}{dt}=f(t).\end{equation} +roots are being sought, and in this case the derivative can be trivially +computed in exact form. +For this exercise, implement the solution for the test function +\[ +f(t)=t\sin^{2}(t), +\] +using +\[ +u=\frac{1}{4}. +\] -For this exercise, implement the solution for the test function\[ -f(t)=t\sin^{2}(t),\] - using \[ -u=\frac{1}{4}.\] - - The listing~\ref{code:quad_newton} contains a skeleton that includes for comparison the correct numerical value. \lstinputlisting[label=code:quad_newton,caption={IGNORED}]{problems/quad_newton.py} - - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fer...@us...> - 2007-12-06 08:44:25
|
Revision: 4639 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4639&view=rev Author: fer_perez Date: 2007-12-06 00:44:18 -0800 (Thu, 06 Dec 2007) Log Message: ----------- Talk about pydap Added Paths: ----------- trunk/py4science/slides/ trunk/py4science/slides/pydap/ trunk/py4science/slides/pydap/pydap.lyx trunk/py4science/slides/pydap/pydap.pdf trunk/py4science/slides/pydap/pydap_arch.png Added: trunk/py4science/slides/pydap/pydap.lyx =================================================================== --- trunk/py4science/slides/pydap/pydap.lyx (rev 0) +++ trunk/py4science/slides/pydap/pydap.lyx 2007-12-06 08:44:18 UTC (rev 4639) @@ -0,0 +1,827 @@ +#LyX 1.5.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 276 +\begin_document +\begin_header +\textclass beamer +\begin_preamble +% Include only certain frames - this speeds up compilation +% The frames to be included need to be labeled, by using ERT +% as [label=LABELNAME] (no backslashes or {}) +%\includeonlyframes{currentt} + +% To make a printable handout (one page per frame), pass +% the handout option to the doc class (Layout menu) + +% For good fonts in PDFs, use pslatex fonts (Layout menu) + +% Colors and symbols +\usepackage{latexsym} +\usepackage{color} + +% Display covered items in transparent form (as opposed +% to not showing them at all) +\newcommand{\coveredinvisible}{ + \setbeamercovered{invisible} +} +\newcommand{\coveredvisible}{ + \setbeamercovered{highly dynamic} +} + +% Choose default setting here: +\coveredvisible + +\newcommand{\ps}{\vspace{-4mm} } + +% Theme configuration. I've basically built a custom theme out of +% Warsaw, adding infoline and changing the nav. symbol bar + +% Warning: the commands below are order-sensitive! + +% load the infolines theme, b/c I want the headline Warsaw +% uses (split), but the footline from infolines. +% In the document body, these will be deactivated for the title and +% turned on later +\useoutertheme{infolines} +% Main theme +\usetheme{Warsaw} +% Adjust the color for the center (title) box to be that of +% infolines, which Warsaw changes +\setbeamercolor*{title in head/foot}{parent=palette secondary} + +% Define a minimal set of navigation symbols +\defbeamertemplate*{navigation symbols}{minmal} +{% + \hbox{% + \hbox{\insertframenavigationsymbol} + \hbox{\insertdocnavigationsymbol} + \hbox{\insertbackfindforwardnavigationsymbol}% + }% +} +% activate the minimal navbar +\setbeamertemplate{navigation symbols}[minimal] + +%%%%% HACK %%%%% +% I started getting errors because LyX is emmitting a color 'none' +% call, which confuses xcolor. I'm defining 'none' to be black here. +\definecolor{none}{cmyk}{0,0,0,1} +%%%%% /HACK %%%%% +\end_preamble +\options compress +\language english +\inputencoding auto +\font_roman times +\font_sans helvet +\font_typewriter courier +\font_default_family default +\font_sc false +\font_osf false +\font_sf_scale 100 +\font_tt_scale 100 +\graphics default +\paperfontsize default +\spacing single +\papersize default +\use_geometry false +\use_amsmath 2 +\use_esint 0 +\cite_engine basic +\use_bibtopic false +\paperorientation landscape +\secnumdepth 2 +\tocdepth 2 +\paragraph_separation indent +\defskip medskip +\quotes_language english +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\author "" +\author "" +\end_header + +\begin_body + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Standard +Some things to fix in a future version: +\end_layout + +\begin_layout Standard +- trim a bit of time +\end_layout + +\begin_layout Standard +- add more about ipython and my own python work, reduce that of others +\end_layout + +\begin_layout Standard +- add a final python pros/cons, esp. + the cons part. + It will make things more balanced. +\end_layout + +\begin_layout Standard +- the PDE part repeats a bit the 'python benefits' which were already pounded + on. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Standard + +% disable the bottom bar for the title and outline pages +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + + +\backslash +setbeamertemplate{footline}{} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Standard + + +\backslash +vspace*{-5mm} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Title +PyDAP +\begin_inset OptArg +status open + +\begin_layout Standard +PyDAP +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subtitle +OpenDAP client and server in Python +\end_layout + +\begin_layout Author +Thanks and Credits: +\newline +Rob de Almeida +\newline + +\family typewriter +\size scriptsize +<ro...@py...> +\family default +\size default + +\newline + +\begin_inset OptArg +status open + +\begin_layout Standard +RdA +\begin_inset Note Note +status collapsed + +\begin_layout Standard +This is used by the 'split' footline theme on the left side of the page +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Standard + + +\backslash +vspace{5mm} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Institute +INPE - Brazilian Space Agency +\end_layout + +\begin_layout Institute +\begin_inset Note Note +status open + +\begin_layout Standard +- Use the +\backslash +inst command only if there are several affiliations. +\end_layout + +\begin_layout Standard +- Keep it simple, no one is interested in your street address. +\end_layout + +\end_inset + + +\begin_inset OptArg +status open + +\begin_layout Standard +INPE +\begin_inset Note Note +status open + +\begin_layout Standard +optional, but mostly needed +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Standard + + +\backslash +vspace{5mm} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Date +NCAR, Boulder +\newline +Dec 7, 2007 +\begin_inset OptArg +status open + +\begin_layout Standard +NCAR, 12/7/07 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Standard +If you have a file called "institution-logo-filename.xxx", where xxx is a + graphic format that can be processed by latex or pdflatex, resp., then you + can add a logo by uncommenting the following: +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +% +\backslash +pgfdeclareimage[height=0.5cm]{institution-logo}{institution-logo-filename} +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + +% +\backslash +logo{ +\backslash +pgfuseimage{institution-logo}} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Standard +The following causes the table of contents to be shown at the beginning + of every Section. + Delete this, if you do not want it. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + + +\backslash +AtBeginSection[]{ +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + + +\backslash +frame<beamer>{ +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + + +\backslash +frametitle{Outline} +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + + +\backslash +tableofcontents[currentsection] +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + +} +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Standard +If you wish to uncover everything in a step-wise fashion, uncomment the + following command: +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status collapsed + +\begin_layout Standard + +% +\backslash +beamerdefaultoverlayspecification{<+->} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Standard + +% reactivate the footline +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Standard + + +\backslash +setbeamertemplate{footline}[infolines theme] +\end_layout + +\end_inset + + +\end_layout + +\begin_layout BeginFrame +OpenDAP: The Data Access Protocol +\end_layout + +\begin_layout Itemize +You all know OpenDAP better than me! +\end_layout + +\begin_layout Itemize +OPeNDAP: Open-source Project for a Network Data Access Protocol +\end_layout + +\begin_layout Itemize +Expose a dataset over the network, in a self-describing way: +\end_layout + +\begin_deeper +\begin_layout Itemize +http://server/dataset: base URL +\end_layout + +\begin_layout Itemize +http://server/dataset.dds: +\color blue +structure +\end_layout + +\begin_layout Itemize +http://server/dataset.das: +\color blue + attributes +\end_layout + +\begin_layout Itemize +http://server/dataset.dods: +\color blue +actual data +\end_layout + +\end_deeper +\begin_layout BeginFrame +PyDAP 2.x +\end_layout + +\begin_layout Itemize +Pure Python, from scratch, written by Rob de Almeida based on DAP 2.0 spec + draft. +\end_layout + +\begin_layout Itemize +Developed as Google Summer of Code 2005 project. +\end_layout + +\begin_layout Itemize +Contains its own XDR library. +\end_layout + +\begin_layout Itemize +Server based on WSGI specification (common web services standard). +\end_layout + +\begin_layout Itemize +Fully buffered server, handles infinite datasets. +\end_layout + +\begin_layout Itemize +Approx. + 3k LOC for client and server. +\end_layout + +\begin_layout BeginFrame +Our simple Yahoo CSV data from this morning +\end_layout + +\begin_layout Standard + +\color blue +http://127.0.0.1:8080/sample.csv.dds +\end_layout + +\begin_layout LyX-Code +Dataset { +\end_layout + +\begin_layout LyX-Code + Sequence { +\end_layout + +\begin_layout LyX-Code + String date; +\end_layout + +\begin_layout LyX-Code + Int32 open; +\end_layout + +\begin_layout LyX-Code + Float64 high; +\end_layout + +\begin_layout LyX-Code + Float64 low; +\end_layout + +\begin_layout LyX-Code + Float64 close; +\end_layout + +\begin_layout LyX-Code + Int32 volume; +\end_layout + +\begin_layout LyX-Code + Float64 adj_close; +\end_layout + +\begin_layout LyX-Code + } sample; +\end_layout + +\begin_layout LyX-Code +} sample%2Ecsv; +\end_layout + +\begin_layout BeginFrame +PyDAP Client and Server +\end_layout + +\begin_layout Itemize +Pure Python implementation +\end_layout + +\begin_layout Itemize +Can be used interactively to explore a dataset (demo later) +\end_layout + +\begin_layout Itemize +Available via +\family typewriter +\color blue +setuptools +\family default +\color inherit +: +\end_layout + +\begin_deeper +\begin_layout Itemize + +\family typewriter +\color blue +easy_install dap +\end_layout + +\begin_layout Itemize + +\family typewriter +\color blue +easy_install +\begin_inset Quotes eld +\end_inset + +dap[server] +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout Itemize + +\family typewriter +\color blue +easy_install dap.plugins.netcdf dap.responses.wms dap.responses.html +\end_layout + +\end_deeper +\begin_layout BeginFrame +Plugins and responses: a modular architecture +\end_layout + +\begin_layout Standard +\align center +\begin_inset Graphics + filename pydap_arch.png + width 80text% + +\end_inset + + +\end_layout + +\begin_layout BeginFrame +Plugins +\end_layout + +\begin_layout FrameSubtitle +Convert data from any format to PyDAP types +\end_layout + +\begin_layout Standard +Already available: +\end_layout + +\begin_layout Itemize +netCDF +\end_layout + +\begin_layout Itemize +CSV +\end_layout + +\begin_layout Itemize +Matlab 4/5 +\end_layout + +\begin_layout Itemize +HDF5 +\end_layout + +\begin_layout Itemize +GrADS grib +\end_layout + +\begin_layout Itemize +GDAL, +\end_layout + +\begin_layout Itemize +DB API 2 (SQL) +\end_layout + +\begin_layout Itemize +grib2 +\end_layout + +\begin_layout Standard + +\color blue +Can be written in pure python and added by the user for exposing local data + types. +\end_layout + +\begin_layout BeginFrame +Responses +\end_layout + +\begin_layout FrameSubtitle +Return views of the data according to the requests of the user. +\end_layout + +\begin_layout Itemize + +\family typewriter +\color blue +dds +\family default +\color inherit +, +\family typewriter +\color blue +das +\family default +\color inherit +, +\family typewriter +\color blue +dods +\family default +\color inherit +: `standard' +\end_layout + +\begin_layout Itemize +ASCII for human consumption ( +\family typewriter +\color blue +ascii +\family default +\color inherit +) +\end_layout + +\begin_layout Itemize +HTML, with auto-generated forms ( +\family typewriter +\color blue +html +\family default +\color inherit +) +\end_layout + +\begin_layout Itemize +JSON ( +\family typewriter +\color blue +json +\family default +\color inherit +): lightweight alternative to XML for data exchange +\end_layout + +\begin_deeper +\begin_layout Itemize +JSON is valid Python code (dictionary)! +\end_layout + +\end_deeper +\begin_layout Itemize +WMS/Google Earth ( +\family typewriter +\color blue +kml +\family default +\color inherit +) +\end_layout + +\begin_layout Itemize +EditGrid/Google Spreadsheets +\end_layout + +\begin_layout EndFrame + +\end_layout + +\end_body +\end_document Added: trunk/py4science/slides/pydap/pydap.pdf =================================================================== (Binary files differ) Property changes on: trunk/py4science/slides/pydap/pydap.pdf ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/py4science/slides/pydap/pydap_arch.png =================================================================== (Binary files differ) Property changes on: trunk/py4science/slides/pydap/pydap_arch.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-12-06 21:32:02
|
Revision: 4656 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4656&view=rev Author: jdh2358 Date: 2007-12-06 13:31:53 -0800 (Thu, 06 Dec 2007) Log Message: ----------- reorg pyrex dir Added Paths: ----------- trunk/py4science/examples/ Removed Paths: ------------- trunk/py4science/examples/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2007-12-06 21:51:26
|
Revision: 4657 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4657&view=rev Author: jdh2358 Date: 2007-12-06 13:51:12 -0800 (Thu, 06 Dec 2007) Log Message: ----------- reor and fix pyrex examples Added Paths: ----------- trunk/py4science/examples/ trunk/py4science/examples/BeautifulSoup.py trunk/py4science/examples/__init__.py trunk/py4science/examples/basemap1.py trunk/py4science/examples/basemap2.py trunk/py4science/examples/basemap3.py trunk/py4science/examples/basemap4.py trunk/py4science/examples/basemap5.py trunk/py4science/examples/bessel.py trunk/py4science/examples/convolution_demo.py trunk/py4science/examples/data/ trunk/py4science/examples/data/HISTORY.gz trunk/py4science/examples/data/ascii_data.dat trunk/py4science/examples/data/ge.csv trunk/py4science/examples/data/hsales.dat trunk/py4science/examples/data/key_stats/ trunk/py4science/examples/data/key_stats/CROX_key_stats.html trunk/py4science/examples/data/key_stats/GE_key_stats.html trunk/py4science/examples/data/key_stats/GOOG_key_stats.html trunk/py4science/examples/data/key_stats/INTC_key_stats.html trunk/py4science/examples/data/key_stats/MSFT_key_stats.html trunk/py4science/examples/data/key_stats/WMT_key_stats.html trunk/py4science/examples/data/key_stats/YHOO_key_stats.html trunk/py4science/examples/data/monthly_sunspots.dat trunk/py4science/examples/data/moonlanding.jpg trunk/py4science/examples/data/moonlanding.png trunk/py4science/examples/data/nm560.dat trunk/py4science/examples/data/noisy_sine.dat trunk/py4science/examples/data/sst.nc trunk/py4science/examples/data/synapse_data.dat trunk/py4science/examples/data/synapse_times.dat trunk/py4science/examples/distributions.py trunk/py4science/examples/erathostenes.py trunk/py4science/examples/erathostenes_fperez.py trunk/py4science/examples/erathostenes_list.py trunk/py4science/examples/erathostenes_set.py trunk/py4science/examples/extras/ trunk/py4science/examples/extras/fft_demo.py trunk/py4science/examples/extras/spec_interp.py trunk/py4science/examples/extras/steinman_interp.py trunk/py4science/examples/extras/weave_examples.py trunk/py4science/examples/faces/ trunk/py4science/examples/faces/data_test/ trunk/py4science/examples/faces/data_test/face10tn.pcx trunk/py4science/examples/faces/data_test/face11tn.pcx trunk/py4science/examples/faces/data_test/face12tn.pcx trunk/py4science/examples/faces/data_test/face13tn.pcx trunk/py4science/examples/faces/data_test/face14tn.pcx trunk/py4science/examples/faces/data_test/face15tn.pcx trunk/py4science/examples/faces/data_test/face16tn.pcx trunk/py4science/examples/faces/data_test/face17tn.pcx trunk/py4science/examples/faces/data_test/face18tn.pcx trunk/py4science/examples/faces/data_test/face19tn.pcx trunk/py4science/examples/faces/data_test/face1tn.pcx trunk/py4science/examples/faces/data_test/face20tn.pcx trunk/py4science/examples/faces/data_test/face21tn.pcx trunk/py4science/examples/faces/data_test/face22tn.pcx trunk/py4science/examples/faces/data_test/face23tn.pcx trunk/py4science/examples/faces/data_test/face24tn.pcx trunk/py4science/examples/faces/data_test/face25tn.pcx trunk/py4science/examples/faces/data_test/face26tn.pcx trunk/py4science/examples/faces/data_test/face27tn.pcx trunk/py4science/examples/faces/data_test/face28tn.pcx trunk/py4science/examples/faces/data_test/face29tn.pcx trunk/py4science/examples/faces/data_test/face2tn.pcx trunk/py4science/examples/faces/data_test/face30tn.pcx trunk/py4science/examples/faces/data_test/face3tn.pcx trunk/py4science/examples/faces/data_test/face4tn.pcx trunk/py4science/examples/faces/data_test/face5tn.pcx trunk/py4science/examples/faces/data_test/face6tn.pcx trunk/py4science/examples/faces/data_test/face7tn.pcx trunk/py4science/examples/faces/data_test/face8tn.pcx trunk/py4science/examples/faces/data_test/face9tn.pcx trunk/py4science/examples/faces/data_train/ trunk/py4science/examples/faces/data_train/face10n.pcx trunk/py4science/examples/faces/data_train/face11n.pcx trunk/py4science/examples/faces/data_train/face12n.pcx trunk/py4science/examples/faces/data_train/face13n.pcx trunk/py4science/examples/faces/data_train/face14n.pcx trunk/py4science/examples/faces/data_train/face15n.pcx trunk/py4science/examples/faces/data_train/face16n.pcx trunk/py4science/examples/faces/data_train/face17n.pcx trunk/py4science/examples/faces/data_train/face18n.pcx trunk/py4science/examples/faces/data_train/face19n.pcx trunk/py4science/examples/faces/data_train/face1n.pcx trunk/py4science/examples/faces/data_train/face20n.pcx trunk/py4science/examples/faces/data_train/face21n.pcx trunk/py4science/examples/faces/data_train/face22n.pcx trunk/py4science/examples/faces/data_train/face23n.pcx trunk/py4science/examples/faces/data_train/face24n.pcx trunk/py4science/examples/faces/data_train/face25n.pcx trunk/py4science/examples/faces/data_train/face26n.pcx trunk/py4science/examples/faces/data_train/face27n.pcx trunk/py4science/examples/faces/data_train/face28n.pcx trunk/py4science/examples/faces/data_train/face29n.pcx trunk/py4science/examples/faces/data_train/face2n.pcx trunk/py4science/examples/faces/data_train/face30n.pcx trunk/py4science/examples/faces/data_train/face31n.pcx trunk/py4science/examples/faces/data_train/face32n.pcx trunk/py4science/examples/faces/data_train/face33n.pcx trunk/py4science/examples/faces/data_train/face34n.pcx trunk/py4science/examples/faces/data_train/face35n.pcx trunk/py4science/examples/faces/data_train/face36n.pcx trunk/py4science/examples/faces/data_train/face37n.pcx trunk/py4science/examples/faces/data_train/face38n.pcx trunk/py4science/examples/faces/data_train/face39n.pcx trunk/py4science/examples/faces/data_train/face3n.pcx trunk/py4science/examples/faces/data_train/face40n.pcx trunk/py4science/examples/faces/data_train/face41n.pcx trunk/py4science/examples/faces/data_train/face42n.pcx trunk/py4science/examples/faces/data_train/face43n.pcx trunk/py4science/examples/faces/data_train/face44n.pcx trunk/py4science/examples/faces/data_train/face45n.pcx trunk/py4science/examples/faces/data_train/face46n.pcx trunk/py4science/examples/faces/data_train/face47n.pcx trunk/py4science/examples/faces/data_train/face48n.pcx trunk/py4science/examples/faces/data_train/face49n.pcx trunk/py4science/examples/faces/data_train/face4n.pcx trunk/py4science/examples/faces/data_train/face50n.pcx trunk/py4science/examples/faces/data_train/face51n.pcx trunk/py4science/examples/faces/data_train/face52n.pcx trunk/py4science/examples/faces/data_train/face53n.pcx trunk/py4science/examples/faces/data_train/face54n.pcx trunk/py4science/examples/faces/data_train/face55n.pcx trunk/py4science/examples/faces/data_train/face56n.pcx trunk/py4science/examples/faces/data_train/face57n.pcx trunk/py4science/examples/faces/data_train/face58n.pcx trunk/py4science/examples/faces/data_train/face59n.pcx trunk/py4science/examples/faces/data_train/face5n.pcx trunk/py4science/examples/faces/data_train/face60n.pcx trunk/py4science/examples/faces/data_train/face61n.pcx trunk/py4science/examples/faces/data_train/face62n.pcx trunk/py4science/examples/faces/data_train/face63n.pcx trunk/py4science/examples/faces/data_train/face64n.pcx trunk/py4science/examples/faces/data_train/face65n.pcx trunk/py4science/examples/faces/data_train/face6n.pcx trunk/py4science/examples/faces/data_train/face7n.pcx trunk/py4science/examples/faces/data_train/face8n.pcx trunk/py4science/examples/faces/data_train/face9n.pcx trunk/py4science/examples/faces/faces.py trunk/py4science/examples/faces/fmatch.py trunk/py4science/examples/faces/imatch.py trunk/py4science/examples/faces/imatch2.py trunk/py4science/examples/faces/imtools.py trunk/py4science/examples/faces/test_imatch.py trunk/py4science/examples/fft_imdenoise.py trunk/py4science/examples/fit_synapse.py trunk/py4science/examples/fitting.py trunk/py4science/examples/getbibtex.py trunk/py4science/examples/glass_dots1.py trunk/py4science/examples/glass_dots2.py trunk/py4science/examples/logistic/ trunk/py4science/examples/logistic/__init__.py trunk/py4science/examples/logistic/exercise01.py trunk/py4science/examples/logistic/exercise02.py trunk/py4science/examples/logistic/maplib.py trunk/py4science/examples/logistic/maplib.pyc trunk/py4science/examples/logistic/sethna_ori/ trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ChaosLyapunov.pdf trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ChaosLyapunov.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/IterateMaps.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/IterateMaps.pyc trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps.pyc trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps2.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps2.pyc trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ori/ trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ori/ChaosLyapunov.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ori/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/InvariantMeasure.pdf trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/InvariantMeasure.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/IterateMaps.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/Maps.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ori/ trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ori/InvariantMeasure.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ori/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/IterateMaps.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/Maps.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/PeriodDoubling.pdf trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/PeriodDoubling.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ori/ trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ori/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ori/PeriodDoubling.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/ trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/FractalDimension.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/FractalDimensionHints.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/FractalDimensions.pdf trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/IterateLogisticHints.py trunk/py4science/examples/logistic/sethna_ori/README trunk/py4science/examples/logistic/sethna_ori/src_ori.tgz trunk/py4science/examples/lotka_volterra.py trunk/py4science/examples/lsys.py trunk/py4science/examples/montecarlo_pi.py trunk/py4science/examples/noisy_sine.py trunk/py4science/examples/numpy-blitz_1000.png trunk/py4science/examples/numpy-blitz_300.png trunk/py4science/examples/numpy-blitz_500.png trunk/py4science/examples/numpy_slicing.py trunk/py4science/examples/numpy_wrap/ trunk/py4science/examples/numpy_wrap/f2py/ trunk/py4science/examples/numpy_wrap/f2py/example1/ trunk/py4science/examples/numpy_wrap/f2py/example1/Makefile trunk/py4science/examples/numpy_wrap/f2py/example1/fib.f trunk/py4science/examples/numpy_wrap/f2py/example1/fib.pyf trunk/py4science/examples/numpy_wrap/f2py/example1/fib.pyf.new trunk/py4science/examples/numpy_wrap/f2py/example2/ trunk/py4science/examples/numpy_wrap/f2py/example2/fib2.f trunk/py4science/examples/numpy_wrap/f2py/example3/ trunk/py4science/examples/numpy_wrap/f2py/example3/Laurence Tratt on Fibonacci.html trunk/py4science/examples/numpy_wrap/f2py/example3/Makefile trunk/py4science/examples/numpy_wrap/f2py/example3/fib.py trunk/py4science/examples/numpy_wrap/f2py/example3/fib3.f trunk/py4science/examples/numpy_wrap/f2py/example3/test.py trunk/py4science/examples/numpy_wrap/pyrex/ trunk/py4science/examples/numpy_wrap/pyrex/MANIFEST trunk/py4science/examples/numpy_wrap/pyrex/Makefile trunk/py4science/examples/numpy_wrap/pyrex/c_numpy.pxd trunk/py4science/examples/numpy_wrap/pyrex/c_python.pxd trunk/py4science/examples/numpy_wrap/pyrex/notes trunk/py4science/examples/numpy_wrap/pyrex/numpyx.c trunk/py4science/examples/numpy_wrap/pyrex/numpyx.pyx trunk/py4science/examples/numpy_wrap/pyrex/run_test.py trunk/py4science/examples/numpy_wrap/pyrex/setup.py trunk/py4science/examples/numpy_wrap/swig/ trunk/py4science/examples/numpy_wrap/swig/HelperFunctions.txt trunk/py4science/examples/numpy_wrap/swig/Makefile trunk/py4science/examples/numpy_wrap/swig/README trunk/py4science/examples/numpy_wrap/swig/Series.i trunk/py4science/examples/numpy_wrap/swig/numpy.i trunk/py4science/examples/numpy_wrap/swig/series.cxx trunk/py4science/examples/numpy_wrap/swig/series.h trunk/py4science/examples/numpy_wrap/swig/setup.py trunk/py4science/examples/numpy_wrap/swig/testSeries.py trunk/py4science/examples/polyroots1d.py trunk/py4science/examples/pyrex/ trunk/py4science/examples/pyrex/movavg/ trunk/py4science/examples/pyrex/movavg/Makefile trunk/py4science/examples/pyrex/movavg/c_numpy.pxd trunk/py4science/examples/pyrex/movavg/c_python.pxd trunk/py4science/examples/pyrex/movavg/c_ringbuf.pxi trunk/py4science/examples/pyrex/movavg/circbuffer.py trunk/py4science/examples/pyrex/movavg/movavg.pyx trunk/py4science/examples/pyrex/movavg/movavg_test.py trunk/py4science/examples/pyrex/movavg/numpyx.pyx trunk/py4science/examples/pyrex/movavg/ringbuf.h trunk/py4science/examples/pyrex/movavg/ringbuf.pyx trunk/py4science/examples/pyrex/movavg/ringbuf_demo.py trunk/py4science/examples/pyrex/movavg/run_test.py trunk/py4science/examples/pyrex/movavg/setup.py trunk/py4science/examples/pyrex/sums/ trunk/py4science/examples/pyrex/sums/Makefile trunk/py4science/examples/pyrex/sums/c_numpy.pxd trunk/py4science/examples/pyrex/sums/c_python.pxd trunk/py4science/examples/pyrex/sums/numpyx.pyx trunk/py4science/examples/pyrex/sums/run_test.py trunk/py4science/examples/pyrex/sums/setup.py trunk/py4science/examples/pyrex/sums/sums.pyx trunk/py4science/examples/pyrex/sums/sums_test.py trunk/py4science/examples/qsort.py trunk/py4science/examples/quad_newton.py trunk/py4science/examples/quicksort.c trunk/py4science/examples/recarray_demo.py trunk/py4science/examples/regress.py trunk/py4science/examples/regress_demo.py trunk/py4science/examples/schrodinger/ trunk/py4science/examples/schrodinger/Schrodinger_FDTD.pdf trunk/py4science/examples/schrodinger/schrod_fdtd.py trunk/py4science/examples/scrape_key_stats.py trunk/py4science/examples/skel/ trunk/py4science/examples/skel/HISTORY.gz trunk/py4science/examples/skel/basemap1_skel.py trunk/py4science/examples/skel/basemap2_skel.py trunk/py4science/examples/skel/basemap3_skel.py trunk/py4science/examples/skel/basemap4_skel.py trunk/py4science/examples/skel/basemap5_skel.py trunk/py4science/examples/skel/convolution_demo_skel.py trunk/py4science/examples/skel/distributions_skel.py trunk/py4science/examples/skel/erathostenes_skel.py trunk/py4science/examples/skel/faces/ trunk/py4science/examples/skel/faces/faces_skel0.tgz trunk/py4science/examples/skel/faces/fmatch_skel1.py trunk/py4science/examples/skel/fft_imdenoise_skel.py trunk/py4science/examples/skel/fit_synapse_skel.py trunk/py4science/examples/skel/fitting_skel.py trunk/py4science/examples/skel/fortran_wrap/ trunk/py4science/examples/skel/fortran_wrap/Makefile trunk/py4science/examples/skel/fortran_wrap/fib3.f trunk/py4science/examples/skel/fortran_wrap/test.py trunk/py4science/examples/skel/glass_dots1_skel.py trunk/py4science/examples/skel/lotka_volterra_skel.py trunk/py4science/examples/skel/montecarlo_pi_skel.py trunk/py4science/examples/skel/moonlanding.jpg trunk/py4science/examples/skel/noisy_sine_skel.py trunk/py4science/examples/skel/polyroots1d_skel.py trunk/py4science/examples/skel/qsort_skel.py trunk/py4science/examples/skel/quad_newton_skel.py trunk/py4science/examples/skel/recarray_demo_skel.py trunk/py4science/examples/skel/regress_demo_skel.py trunk/py4science/examples/skel/scrape_key_stats_skel.py trunk/py4science/examples/skel/shoot_skel.py trunk/py4science/examples/skel/spline_demo_skel.py trunk/py4science/examples/skel/stats_descriptives_skel.py trunk/py4science/examples/skel/stats_distributions_skel.py trunk/py4science/examples/skel/stock_records_skel.py trunk/py4science/examples/skel/trapezoid_skel.py trunk/py4science/examples/skel/wallis_pi_skel.py trunk/py4science/examples/skel/wordfreqs_skel.py trunk/py4science/examples/spline_demo.py trunk/py4science/examples/stats_descriptives.py trunk/py4science/examples/stats_distributions.py trunk/py4science/examples/stock_demo.py trunk/py4science/examples/stock_records.py trunk/py4science/examples/test.ipy trunk/py4science/examples/trapezoid.py trunk/py4science/examples/visual/ trunk/py4science/examples/visual/bounce.py trunk/py4science/examples/visual/shoot.py trunk/py4science/examples/visual/shoot_t.py trunk/py4science/examples/visual/toroid_drag.py trunk/py4science/examples/wallis_pi.py trunk/py4science/examples/weave_blitz.py trunk/py4science/examples/weave_blitz0.py trunk/py4science/examples/weave_blitz_comp.png trunk/py4science/examples/weave_examples_simple.py trunk/py4science/examples/weave_exercises.py trunk/py4science/examples/wordfreqs.py Removed Paths: ------------- trunk/py4science/examples/ trunk/py4science/examples/BeautifulSoup.py trunk/py4science/examples/__init__.py trunk/py4science/examples/basemap1.py trunk/py4science/examples/basemap2.py trunk/py4science/examples/basemap3.py trunk/py4science/examples/basemap4.py trunk/py4science/examples/basemap5.py trunk/py4science/examples/bessel.py trunk/py4science/examples/convolution_demo.py trunk/py4science/examples/data/ trunk/py4science/examples/data/HISTORY.gz trunk/py4science/examples/data/ascii_data.dat trunk/py4science/examples/data/ge.csv trunk/py4science/examples/data/hsales.dat trunk/py4science/examples/data/key_stats/ trunk/py4science/examples/data/key_stats/CROX_key_stats.html trunk/py4science/examples/data/key_stats/GE_key_stats.html trunk/py4science/examples/data/key_stats/GOOG_key_stats.html trunk/py4science/examples/data/key_stats/INTC_key_stats.html trunk/py4science/examples/data/key_stats/MSFT_key_stats.html trunk/py4science/examples/data/key_stats/WMT_key_stats.html trunk/py4science/examples/data/key_stats/YHOO_key_stats.html trunk/py4science/examples/data/monthly_sunspots.dat trunk/py4science/examples/data/moonlanding.jpg trunk/py4science/examples/data/moonlanding.png trunk/py4science/examples/data/nm560.dat trunk/py4science/examples/data/noisy_sine.dat trunk/py4science/examples/data/sst.nc trunk/py4science/examples/data/synapse_data.dat trunk/py4science/examples/data/synapse_times.dat trunk/py4science/examples/distributions.py trunk/py4science/examples/erathostenes.py trunk/py4science/examples/erathostenes_fperez.py trunk/py4science/examples/erathostenes_list.py trunk/py4science/examples/erathostenes_set.py trunk/py4science/examples/extras/ trunk/py4science/examples/extras/fft_demo.py trunk/py4science/examples/extras/spec_interp.py trunk/py4science/examples/extras/steinman_interp.py trunk/py4science/examples/extras/weave_examples.py trunk/py4science/examples/faces/ trunk/py4science/examples/faces/data_test/ trunk/py4science/examples/faces/data_test/face10tn.pcx trunk/py4science/examples/faces/data_test/face11tn.pcx trunk/py4science/examples/faces/data_test/face12tn.pcx trunk/py4science/examples/faces/data_test/face13tn.pcx trunk/py4science/examples/faces/data_test/face14tn.pcx trunk/py4science/examples/faces/data_test/face15tn.pcx trunk/py4science/examples/faces/data_test/face16tn.pcx trunk/py4science/examples/faces/data_test/face17tn.pcx trunk/py4science/examples/faces/data_test/face18tn.pcx trunk/py4science/examples/faces/data_test/face19tn.pcx trunk/py4science/examples/faces/data_test/face1tn.pcx trunk/py4science/examples/faces/data_test/face20tn.pcx trunk/py4science/examples/faces/data_test/face21tn.pcx trunk/py4science/examples/faces/data_test/face22tn.pcx trunk/py4science/examples/faces/data_test/face23tn.pcx trunk/py4science/examples/faces/data_test/face24tn.pcx trunk/py4science/examples/faces/data_test/face25tn.pcx trunk/py4science/examples/faces/data_test/face26tn.pcx trunk/py4science/examples/faces/data_test/face27tn.pcx trunk/py4science/examples/faces/data_test/face28tn.pcx trunk/py4science/examples/faces/data_test/face29tn.pcx trunk/py4science/examples/faces/data_test/face2tn.pcx trunk/py4science/examples/faces/data_test/face30tn.pcx trunk/py4science/examples/faces/data_test/face3tn.pcx trunk/py4science/examples/faces/data_test/face4tn.pcx trunk/py4science/examples/faces/data_test/face5tn.pcx trunk/py4science/examples/faces/data_test/face6tn.pcx trunk/py4science/examples/faces/data_test/face7tn.pcx trunk/py4science/examples/faces/data_test/face8tn.pcx trunk/py4science/examples/faces/data_test/face9tn.pcx trunk/py4science/examples/faces/data_train/ trunk/py4science/examples/faces/data_train/face10n.pcx trunk/py4science/examples/faces/data_train/face11n.pcx trunk/py4science/examples/faces/data_train/face12n.pcx trunk/py4science/examples/faces/data_train/face13n.pcx trunk/py4science/examples/faces/data_train/face14n.pcx trunk/py4science/examples/faces/data_train/face15n.pcx trunk/py4science/examples/faces/data_train/face16n.pcx trunk/py4science/examples/faces/data_train/face17n.pcx trunk/py4science/examples/faces/data_train/face18n.pcx trunk/py4science/examples/faces/data_train/face19n.pcx trunk/py4science/examples/faces/data_train/face1n.pcx trunk/py4science/examples/faces/data_train/face20n.pcx trunk/py4science/examples/faces/data_train/face21n.pcx trunk/py4science/examples/faces/data_train/face22n.pcx trunk/py4science/examples/faces/data_train/face23n.pcx trunk/py4science/examples/faces/data_train/face24n.pcx trunk/py4science/examples/faces/data_train/face25n.pcx trunk/py4science/examples/faces/data_train/face26n.pcx trunk/py4science/examples/faces/data_train/face27n.pcx trunk/py4science/examples/faces/data_train/face28n.pcx trunk/py4science/examples/faces/data_train/face29n.pcx trunk/py4science/examples/faces/data_train/face2n.pcx trunk/py4science/examples/faces/data_train/face30n.pcx trunk/py4science/examples/faces/data_train/face31n.pcx trunk/py4science/examples/faces/data_train/face32n.pcx trunk/py4science/examples/faces/data_train/face33n.pcx trunk/py4science/examples/faces/data_train/face34n.pcx trunk/py4science/examples/faces/data_train/face35n.pcx trunk/py4science/examples/faces/data_train/face36n.pcx trunk/py4science/examples/faces/data_train/face37n.pcx trunk/py4science/examples/faces/data_train/face38n.pcx trunk/py4science/examples/faces/data_train/face39n.pcx trunk/py4science/examples/faces/data_train/face3n.pcx trunk/py4science/examples/faces/data_train/face40n.pcx trunk/py4science/examples/faces/data_train/face41n.pcx trunk/py4science/examples/faces/data_train/face42n.pcx trunk/py4science/examples/faces/data_train/face43n.pcx trunk/py4science/examples/faces/data_train/face44n.pcx trunk/py4science/examples/faces/data_train/face45n.pcx trunk/py4science/examples/faces/data_train/face46n.pcx trunk/py4science/examples/faces/data_train/face47n.pcx trunk/py4science/examples/faces/data_train/face48n.pcx trunk/py4science/examples/faces/data_train/face49n.pcx trunk/py4science/examples/faces/data_train/face4n.pcx trunk/py4science/examples/faces/data_train/face50n.pcx trunk/py4science/examples/faces/data_train/face51n.pcx trunk/py4science/examples/faces/data_train/face52n.pcx trunk/py4science/examples/faces/data_train/face53n.pcx trunk/py4science/examples/faces/data_train/face54n.pcx trunk/py4science/examples/faces/data_train/face55n.pcx trunk/py4science/examples/faces/data_train/face56n.pcx trunk/py4science/examples/faces/data_train/face57n.pcx trunk/py4science/examples/faces/data_train/face58n.pcx trunk/py4science/examples/faces/data_train/face59n.pcx trunk/py4science/examples/faces/data_train/face5n.pcx trunk/py4science/examples/faces/data_train/face60n.pcx trunk/py4science/examples/faces/data_train/face61n.pcx trunk/py4science/examples/faces/data_train/face62n.pcx trunk/py4science/examples/faces/data_train/face63n.pcx trunk/py4science/examples/faces/data_train/face64n.pcx trunk/py4science/examples/faces/data_train/face65n.pcx trunk/py4science/examples/faces/data_train/face6n.pcx trunk/py4science/examples/faces/data_train/face7n.pcx trunk/py4science/examples/faces/data_train/face8n.pcx trunk/py4science/examples/faces/data_train/face9n.pcx trunk/py4science/examples/faces/faces.py trunk/py4science/examples/faces/fmatch.py trunk/py4science/examples/faces/imatch.py trunk/py4science/examples/faces/imatch2.py trunk/py4science/examples/faces/imtools.py trunk/py4science/examples/faces/test_imatch.py trunk/py4science/examples/fft_imdenoise.py trunk/py4science/examples/fit_synapse.py trunk/py4science/examples/fitting.py trunk/py4science/examples/getbibtex.py trunk/py4science/examples/glass_dots1.py trunk/py4science/examples/glass_dots2.py trunk/py4science/examples/logistic/ trunk/py4science/examples/logistic/__init__.py trunk/py4science/examples/logistic/exercise01.py trunk/py4science/examples/logistic/exercise02.py trunk/py4science/examples/logistic/maplib.py trunk/py4science/examples/logistic/maplib.pyc trunk/py4science/examples/logistic/sethna_ori/ trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ChaosLyapunov.pdf trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ChaosLyapunov.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/IterateMaps.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/IterateMaps.pyc trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps.pyc trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps2.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/Maps2.pyc trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ori/ trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ori/ChaosLyapunov.py trunk/py4science/examples/logistic/sethna_ori/01-chaos_lyapunov/ori/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/InvariantMeasure.pdf trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/InvariantMeasure.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/IterateMaps.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/Maps.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ori/ trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ori/InvariantMeasure.py trunk/py4science/examples/logistic/sethna_ori/02-invariant_measures/ori/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/IterateMaps.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/Maps.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/PeriodDoubling.pdf trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/PeriodDoubling.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ori/ trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ori/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/03-period_doubling/ori/PeriodDoubling.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/ trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/FractalDimension.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/FractalDimensionHints.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/FractalDimensions.pdf trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/IterateLogistic.py trunk/py4science/examples/logistic/sethna_ori/04-fractal_dimensions/IterateLogisticHints.py trunk/py4science/examples/logistic/sethna_ori/README trunk/py4science/examples/logistic/sethna_ori/src_ori.tgz trunk/py4science/examples/lotka_volterra.py trunk/py4science/examples/lsys.py trunk/py4science/examples/montecarlo_pi.py trunk/py4science/examples/noisy_sine.py trunk/py4science/examples/numpy-blitz_1000.png trunk/py4science/examples/numpy-blitz_300.png trunk/py4science/examples/numpy-blitz_500.png trunk/py4science/examples/numpy_slicing.py trunk/py4science/examples/numpy_wrap/ trunk/py4science/examples/numpy_wrap/f2py/ trunk/py4science/examples/numpy_wrap/f2py/example1/ trunk/py4science/examples/numpy_wrap/f2py/example1/Makefile trunk/py4science/examples/numpy_wrap/f2py/example1/fib.f trunk/py4science/examples/numpy_wrap/f2py/example1/fib.pyf trunk/py4science/examples/numpy_wrap/f2py/example1/fib.pyf.new trunk/py4science/examples/numpy_wrap/f2py/example2/ trunk/py4science/examples/numpy_wrap/f2py/example2/fib2.f trunk/py4science/examples/numpy_wrap/f2py/example3/ trunk/py4science/examples/numpy_wrap/f2py/example3/Laurence Tratt on Fibonacci.html trunk/py4science/examples/numpy_wrap/f2py/example3/Makefile trunk/py4science/examples/numpy_wrap/f2py/example3/fib.py trunk/py4science/examples/numpy_wrap/f2py/example3/fib3.f trunk/py4science/examples/numpy_wrap/f2py/example3/test.py trunk/py4science/examples/numpy_wrap/pyrex/ trunk/py4science/examples/numpy_wrap/pyrex/MANIFEST trunk/py4science/examples/numpy_wrap/pyrex/Makefile trunk/py4science/examples/numpy_wrap/pyrex/c_numpy.pxd trunk/py4science/examples/numpy_wrap/pyrex/c_python.pxd trunk/py4science/examples/numpy_wrap/pyrex/notes trunk/py4science/examples/numpy_wrap/pyrex/numpyx.c trunk/py4science/examples/numpy_wrap/pyrex/numpyx.pyx trunk/py4science/examples/numpy_wrap/pyrex/run_test.py trunk/py4science/examples/numpy_wrap/pyrex/setup.py trunk/py4science/examples/numpy_wrap/swig/ trunk/py4science/examples/numpy_wrap/swig/HelperFunctions.txt trunk/py4science/examples/numpy_wrap/swig/Makefile trunk/py4science/examples/numpy_wrap/swig/README trunk/py4science/examples/numpy_wrap/swig/Series.i trunk/py4science/examples/numpy_wrap/swig/numpy.i trunk/py4science/examples/numpy_wrap/swig/series.cxx trunk/py4science/examples/numpy_wrap/swig/series.h trunk/py4science/examples/numpy_wrap/swig/setup.py trunk/py4science/examples/numpy_wrap/swig/testSeries.py trunk/py4science/examples/polyroots1d.py trunk/py4science/examples/qsort.py trunk/py4science/examples/quad_newton.py trunk/py4science/examples/quicksort.c trunk/py4science/examples/recarray_demo.py trunk/py4science/examples/regress.py trunk/py4science/examples/regress_demo.py trunk/py4science/examples/schrodinger/ trunk/py4science/examples/schrodinger/Schrodinger_FDTD.pdf trunk/py4science/examples/schrodinger/schrod_fdtd.py trunk/py4science/examples/scrape_key_stats.py trunk/py4science/examples/skel/ trunk/py4science/examples/skel/HISTORY.gz trunk/py4science/examples/skel/basemap1_skel.py trunk/py4science/examples/skel/basemap2_skel.py trunk/py4science/examples/skel/basemap3_skel.py trunk/py4science/examples/skel/basemap4_skel.py trunk/py4science/examples/skel/basemap5_skel.py trunk/py4science/examples/skel/convolution_demo_skel.py trunk/py4science/examples/skel/distributions_skel.py trunk/py4science/examples/skel/erathostenes_skel.py trunk/py4science/examples/skel/faces/ trunk/py4science/examples/skel/faces/faces_skel0.tgz trunk/py4science/examples/skel/faces/fmatch_skel1.py trunk/py4science/examples/skel/fft_imdenoise_skel.py trunk/py4science/examples/skel/fit_synapse_skel.py trunk/py4science/examples/skel/fitting_skel.py trunk/py4science/examples/skel/fortran_wrap/ trunk/py4science/examples/skel/fortran_wrap/Makefile trunk/py4science/examples/skel/fortran_wrap/fib3.f trunk/py4science/examples/skel/fortran_wrap/test.py trunk/py4science/examples/skel/glass_dots1_skel.py trunk/py4science/examples/skel/lotka_volterra_skel.py trunk/py4science/examples/skel/montecarlo_pi_skel.py trunk/py4science/examples/skel/moonlanding.jpg trunk/py4science/examples/skel/noisy_sine_skel.py trunk/py4science/examples/skel/polyroots1d_skel.py trunk/py4science/examples/skel/qsort_skel.py trunk/py4science/examples/skel/quad_newton_skel.py trunk/py4science/examples/skel/recarray_demo_skel.py trunk/py4science/examples/skel/regress_demo_skel.py trunk/py4science/examples/skel/scrape_key_stats_skel.py trunk/py4science/examples/skel/shoot_skel.py trunk/py4science/examples/skel/spline_demo_skel.py trunk/py4science/examples/skel/stats_descriptives_skel.py trunk/py4science/examples/skel/stats_distributions_skel.py trunk/py4science/examples/skel/stock_records_skel.py trunk/py4science/examples/skel/trapezoid_skel.py trunk/py4science/examples/skel/wallis_pi_skel.py trunk/py4science/examples/skel/wordfreqs_skel.py trunk/py4science/examples/spline_demo.py trunk/py4science/examples/stats_descriptives.py trunk/py4science/examples/stats_distributions.py trunk/py4science/examples/stock_demo.py trunk/py4science/examples/stock_records.py trunk/py4science/examples/test.ipy trunk/py4science/examples/trapezoid.py trunk/py4science/examples/visual/ trunk/py4science/examples/visual/bounce.py trunk/py4science/examples/visual/shoot.py trunk/py4science/examples/visual/shoot_t.py trunk/py4science/examples/visual/toroid_drag.py trunk/py4science/examples/wallis_pi.py trunk/py4science/examples/weave_blitz.py trunk/py4science/examples/weave_blitz0.py trunk/py4science/examples/weave_blitz_comp.png trunk/py4science/examples/weave_examples_simple.py trunk/py4science/examples/weave_exercises.py trunk/py4science/examples/wordfreqs.py Copied: trunk/py4science/examples (from rev 4639, trunk/py4science/examples) Deleted: trunk/py4science/examples/BeautifulSoup.py =================================================================== --- trunk/py4science/examples/BeautifulSoup.py 2007-12-06 08:44:18 UTC (rev 4639) +++ trunk/py4science/examples/BeautifulSoup.py 2007-12-06 21:51:12 UTC (rev 4657) @@ -1,1767 +0,0 @@ -"""Beautiful Soup -Elixir and Tonic -"The Screen-Scraper's Friend" -http://www.crummy.com/software/BeautifulSoup/ - -Beautiful Soup parses a (possibly invalid) XML or HTML document into a -tree representation. It provides methods and Pythonic idioms that make -it easy to navigate, search, and modify the tree. - -A well-formed XML/HTML document yields a well-formed data -structure. An ill-formed XML/HTML document yields a correspondingly -ill-formed data structure. If your document is only locally -well-formed, you can use this library to find and process the -well-formed part of it. The BeautifulSoup class - -Beautiful Soup works with Python 2.2 and up. It has no external -dependencies, but you'll have more success at converting data to UTF-8 -if you also install these three packages: - -* chardet, for auto-detecting character encodings - http://chardet.feedparser.org/ -* cjkcodecs and iconv_codec, which add more encodings to the ones supported - by stock Python. - http://cjkpython.i18n.org/ - -Beautiful Soup defines classes for two main parsing strategies: - - * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific - language that kind of looks like XML. - - * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid - or invalid. This class has web browser-like heuristics for - obtaining a sensible parse tree in the face of common HTML errors. - -Beautiful Soup also defines a class (UnicodeDammit) for autodetecting -the encoding of an HTML or XML document, and converting it to -Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. - -For more than you ever wanted to know about Beautiful Soup, see the -documentation: -http://www.crummy.com/software/BeautifulSoup/documentation.html - -""" -from __future__ import generators - -__author__ = "Leonard Richardson (leo...@se...)" -__version__ = "3.0.4" -__copyright__ = "Copyright (c) 2004-2007 Leonard Richardson" -__license__ = "PSF" - -from sgmllib import SGMLParser, SGMLParseError -import codecs -import types -import re -import sgmllib -try: - from htmlentitydefs import name2codepoint -except ImportError: - name2codepoint = {} - -#This hack makes Beautiful Soup able to parse XML with namespaces -sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') - -DEFAULT_OUTPUT_ENCODING = "utf-8" - -# First, the classes that represent markup elements. - -class PageElement: - """Contains the navigational information for some part of the page - (either a tag or a piece of text)""" - - def setup(self, parent=None, previous=None): - """Sets up the initial relations between this element and - other elements.""" - self.parent = parent - self.previous = previous - self.next = None - self.previousSibling = None - self.nextSibling = None - if self.parent and self.parent.contents: - self.previousSibling = self.parent.contents[-1] - self.previousSibling.nextSibling = self - - def replaceWith(self, replaceWith): - oldParent = self.parent - myIndex = self.parent.contents.index(self) - if hasattr(replaceWith, 'parent') and replaceWith.parent == self.parent: - # We're replacing this element with one of its siblings. - index = self.parent.contents.index(replaceWith) - if index and index < myIndex: - # Furthermore, it comes before this element. That - # means that when we extract it, the index of this - # element will change. - myIndex = myIndex - 1 - self.extract() - oldParent.insert(myIndex, replaceWith) - - def extract(self): - """Destructively rips this element out of the tree.""" - if self.parent: - try: - self.parent.contents.remove(self) - except ValueError: - pass - - #Find the two elements that would be next to each other if - #this element (and any children) hadn't been parsed. Connect - #the two. - lastChild = self._lastRecursiveChild() - nextElement = lastChild.next - - if self.previous: - self.previous.next = nextElement - if nextElement: - nextElement.previous = self.previous - self.previous = None - lastChild.next = None - - self.parent = None - if self.previousSibling: - self.previousSibling.nextSibling = self.nextSibling - if self.nextSibling: - self.nextSibling.previousSibling = self.previousSibling - self.previousSibling = self.nextSibling = None - - def _lastRecursiveChild(self): - "Finds the last element beneath this object to be parsed." - lastChild = self - while hasattr(lastChild, 'contents') and lastChild.contents: - lastChild = lastChild.contents[-1] - return lastChild - - def insert(self, position, newChild): - if (isinstance(newChild, basestring) - or isinstance(newChild, unicode)) \ - and not isinstance(newChild, NavigableString): - newChild = NavigableString(newChild) - - position = min(position, len(self.contents)) - if hasattr(newChild, 'parent') and newChild.parent != None: - # We're 'inserting' an element that's already one - # of this object's children. - if newChild.parent == self: - index = self.find(newChild) - if index and index < position: - # Furthermore we're moving it further down the - # list of this object's children. That means that - # when we extract this element, our target index - # will jump down one. - position = position - 1 - newChild.extract() - - newChild.parent = self - previousChild = None - if position == 0: - newChild.previousSibling = None - newChild.previous = self - else: - previousChild = self.contents[position-1] - newChild.previousSibling = previousChild - newChild.previousSibling.nextSibling = newChild - newChild.previous = previousChild._lastRecursiveChild() - if newChild.previous: - newChild.previous.next = newChild - - newChildsLastElement = newChild._lastRecursiveChild() - - if position >= len(self.contents): - newChild.nextSibling = None - - parent = self - parentsNextSibling = None - while not parentsNextSibling: - parentsNextSibling = parent.nextSibling - parent = parent.parent - if not parent: # This is the last element in the document. - break - if parentsNextSibling: - newChildsLastElement.next = parentsNextSibling - else: - newChildsLastElement.next = None - else: - nextChild = self.contents[position] - newChild.nextSibling = nextChild - if newChild.nextSibling: - newChild.nextSibling.previousSibling = newChild - newChildsLastElement.next = nextChild - - if newChildsLastElement.next: - newChildsLastElement.next.previous = newChildsLastElement - self.contents.insert(position, newChild) - - def findNext(self, name=None, attrs={}, text=None, **kwargs): - """Returns the first item that matches the given criteria and - appears after this Tag in the document.""" - return self._findOne(self.findAllNext, name, attrs, text, **kwargs) - - def findAllNext(self, name=None, attrs={}, text=None, limit=None, - **kwargs): - """Returns all items that match the given criteria and appear - before after Tag in the document.""" - return self._findAll(name, attrs, text, limit, self.nextGenerator) - - def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): - """Returns the closest sibling to this Tag that matches the - given criteria and appears after this Tag in the document.""" - return self._findOne(self.findNextSiblings, name, attrs, text, - **kwargs) - - def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, - **kwargs): - """Returns the siblings of this Tag that match the given - criteria and appear after this Tag in the document.""" - return self._findAll(name, attrs, text, limit, - self.nextSiblingGenerator, **kwargs) - fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x - - def findPrevious(self, name=None, attrs={}, text=None, **kwargs): - """Returns the first item that matches the given criteria and - appears before this Tag in the document.""" - return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) - - def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, - **kwargs): - """Returns all items that match the given criteria and appear - before this Tag in the document.""" - return self._findAll(name, attrs, text, limit, self.previousGenerator, - **kwargs) - fetchPrevious = findAllPrevious # Compatibility with pre-3.x - - def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): - """Returns the closest sibling to this Tag that matches the - given criteria and appears before this Tag in the document.""" - return self._findOne(self.findPreviousSiblings, name, attrs, text, - **kwargs) - - def findPreviousSiblings(self, name=None, attrs={}, text=None, - limit=None, **kwargs): - """Returns the siblings of this Tag that match the given - criteria and appear before this Tag in the document.""" - return self._findAll(name, attrs, text, limit, - self.previousSiblingGenerator, **kwargs) - fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x - - def findParent(self, name=None, attrs={}, **kwargs): - """Returns the closest parent of this Tag that matches the given - criteria.""" - # NOTE: We can't use _findOne because findParents takes a different - # set of arguments. - r = None - l = self.findParents(name, attrs, 1) - if l: - r = l[0] - return r - - def findParents(self, name=None, attrs={}, limit=None, **kwargs): - """Returns the parents of this Tag that match the given - criteria.""" - - return self._findAll(name, attrs, None, limit, self.parentGenerator, - **kwargs) - fetchParents = findParents # Compatibility with pre-3.x - - #These methods do the real heavy lifting. - - def _findOne(self, method, name, attrs, text, **kwargs): - r = None - l = method(name, attrs, text, 1, **kwargs) - if l: - r = l[0] - return r - - def _findAll(self, name, attrs, text, limit, generator, **kwargs): - "Iterates over a generator looking for things that match." - - if isinstance(name, SoupStrainer): - strainer = name - else: - # Build a SoupStrainer - strainer = SoupStrainer(name, attrs, text, **kwargs) - results = ResultSet(strainer) - g = generator() - while True: - try: - i = g.next() - except StopIteration: - break - if i: - found = strainer.search(i) - if found: - results.append(found) - if limit and len(results) >= limit: - break - return results - - #These Generators can be used to navigate starting from both - #NavigableStrings and Tags. - def nextGenerator(self): - i = self - while i: - i = i.next - yield i - - def nextSiblingGenerator(self): - i = self - while i: - i = i.nextSibling - yield i - - def previousGenerator(self): - i = self - while i: - i = i.previous - yield i - - def previousSiblingGenerator(self): - i = self - while i: - i = i.previousSibling - yield i - - def parentGenerator(self): - i = self - while i: - i = i.parent - yield i - - # Utility methods - def substituteEncoding(self, str, encoding=None): - encoding = encoding or "utf-8" - return str.replace("%SOUP-ENCODING%", encoding) - - def toEncoding(self, s, encoding=None): - """Encodes an object to a string in some encoding, or to Unicode. - .""" - if isinstance(s, unicode): - if encoding: - s = s.encode(encoding) - elif isinstance(s, str): - if encoding: - s = s.encode(encoding) - else: - s = unicode(s) - else: - if encoding: - s = self.toEncoding(str(s), encoding) - else: - s = unicode(s) - return s - -class NavigableString(unicode, PageElement): - - def __getattr__(self, attr): - """text.string gives you text. This is for backwards - compatibility for Navigable*String, but for CData* it lets you - get the string without the CData wrapper.""" - if attr == 'string': - return self - else: - raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) - - def __unicode__(self): - return self.__str__(None) - - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - if encoding: - return self.encode(encoding) - else: - return self - -class CData(NavigableString): - - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - return "<![CDATA[%s]]>" % NavigableString.__str__(self, encoding) - -class ProcessingInstruction(NavigableString): - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - output = self - if "%SOUP-ENCODING%" in output: - output = self.substituteEncoding(output, encoding) - return "<?%s?>" % self.toEncoding(output, encoding) - -class Comment(NavigableString): - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - return "<!--%s-->" % NavigableString.__str__(self, encoding) - -class Declaration(NavigableString): - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): - return "<!%s>" % NavigableString.__str__(self, encoding) - -class Tag(PageElement): - - """Represents a found HTML tag with its attributes and contents.""" - - XML_SPECIAL_CHARS_TO_ENTITIES = { "'" : "squot", - '"' : "quote", - "&" : "amp", - "<" : "lt", - ">" : "gt" } - - def __init__(self, parser, name, attrs=None, parent=None, - previous=None): - "Basic constructor." - - # We don't actually store the parser object: that lets extracted - # chunks be garbage-collected - self.parserClass = parser.__class__ - self.isSelfClosing = parser.isSelfClosingTag(name) - self.name = name - if attrs == None: - attrs = [] - self.attrs = attrs - self.contents = [] - self.setup(parent, previous) - self.hidden = False - self.containsSubstitutions = False - - def get(self, key, default=None): - """Returns the value of the 'key' attribute for the tag, or - the value given for 'default' if it doesn't have that - attribute.""" - return self._getAttrMap().get(key, default) - - def has_key(self, key): - return self._getAttrMap().has_key(key) - - def __getitem__(self, key): - """tag[key] returns the value of the 'key' attribute for the tag, - and throws an exception if it's not there.""" - return self._getAttrMap()[key] - - def __iter__(self): - "Iterating over a tag iterates over its contents." - return iter(self.contents) - - def __len__(self): - "The length of a tag is the length of its list of contents." - return len(self.contents) - - def __contains__(self, x): - return x in self.contents - - def __nonzero__(self): - "A tag is non-None even if it has no contents." - return True - - def __setitem__(self, key, value): - """Setting tag[key] sets the value of the 'key' attribute for the - tag.""" - self._getAttrMap() - self.attrMap[key] = value - found = False - for i in range(0, len(self.attrs)): - if self.attrs[i][0] == key: - self.attrs[i] = (key, value) - found = True - if not found: - self.attrs.append((key, value)) - self._getAttrMap()[key] = value - - def __delitem__(self, key): - "Deleting tag[key] deletes all 'key' attributes for the tag." - for item in self.attrs: - if item[0] == key: - self.attrs.remove(item) - #We don't break because bad HTML can define the same - #attribute multiple times. - self._getAttrMap() - if self.attrMap.has_key(key): - del self.attrMap[key] - - def __call__(self, *args, **kwargs): - """Calling a tag like a function is the same as calling its - findAll() method. Eg. tag('a') returns a list of all the A tags - found within this tag.""" - return apply(self.findAll, args, kwargs) - - def __getattr__(self, tag): - #print "Getattr %s.%s" % (self.__class__, tag) - if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3: - return self.find(tag[:-3]) - elif tag.find('__') != 0: - return self.find(tag) - - def __eq__(self, other): - """Returns true iff this tag has the same name, the same attributes, - and the same contents (recursively) as the given tag. - - NOTE: right now this will return false if two tags have the - same attributes in a different order. Should this be fixed?""" - if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other): - return False - for i in range(0, len(self.contents)): - if self.contents[i] != other.contents[i]: - return False - return True - - def __ne__(self, other): - """Returns true iff this tag is not identical to the other tag, - as defined in __eq__.""" - return not self == other - - def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): - """Renders this tag as a string.""" - return self.__str__(encoding) - - def __unicode__(self): - return self.__str__(None) - - def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, - prettyPrint=False, indentLevel=0): - """Returns a string or Unicode representation of this tag and - its contents. To get Unicode, pass None for encoding. - - NOTE: since Python's HTML parser consumes whitespace, this - method is not certain to reproduce the whitespace present in - the original string.""" - - encodedName = self.toEncoding(self.name, encoding) - - attrs = [] - if self.attrs: - for key, val in self.attrs: - fmt = '%s="%s"' - if isString(val): - if self.containsSubstitutions and '%SOUP-ENCODING%' in val: - val = self.substituteEncoding(val, encoding) - - # The attribute value either: - # - # * Contains no embedded double quotes or single quotes. - # No problem: we enclose it in double quotes. - # * Contains embedded single quotes. No problem: - # double quotes work here too. - # * Contains embedded double quotes. No problem: - # we enclose it in single quotes. - # * Embeds both single _and_ double quotes. This - # can't happen naturally, but it can happen if - # you modify an attribute value after parsing - # the document. Now we have a bit of a - # problem. We solve it by enclosing the - # attribute in single quotes, and escaping any - # embedded single quotes to XML entities. - if '"' in val: - fmt = "%s='%s'" - # This can't happen naturally, but it can happen - # if you modify an attribute value after parsing. - if "'" in val: - val = val.replace("'", "&squot;") - - # Now we're okay w/r/t quotes. But the attribute - # value might also contain angle brackets, or - # ampersands that aren't part of entities. We need - # to escape those to XML entities too. - val = re.sub("([<>]|&(?![^\s]+;))", - lambda x: "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";", - val) - - attrs.append(fmt % (self.toEncoding(key, encoding), - self.toEncoding(val, encoding))) - close = '' - closeTag = '' - if self.isSelfClosing: - close = ' /' - else: - closeTag = '</%s>' % encodedName - - indentTag, indentContents = 0, 0 - if prettyPrint: - indentTag = indentLevel - space = (' ' * (indentTag-1)) - indentContents = indentTag + 1 - contents = self.renderContents(encoding, prettyPrint, indentContents) - if self.hidden: - s = contents - else: - s = [] - attributeString = '' - if attrs: - attributeString = ' ' + ' '.join(attrs) - if prettyPrint: - s.append(space) - s.append('<%s%s%s>' % (encodedName, attributeString, close)) - if prettyPrint: - s.append("\n") - s.append(contents) - if prettyPrint and contents and contents[-1] != "\n": - s.append("\n") - if prettyPrint and closeTag: - s.append(space) - s.append(closeTag) - if prettyPrint and closeTag and self.nextSibling: - s.append("\n") - s = ''.join(s) - return s - - def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): - return self.__str__(encoding, True) - - def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, - prettyPrint=False, ... [truncated message content] |
From: <jd...@us...> - 2007-12-07 06:29:38
|
Revision: 4664 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4664&view=rev Author: jdh2358 Date: 2007-12-06 22:29:31 -0800 (Thu, 06 Dec 2007) Log Message: ----------- minor tweaks to pyrex Modified Paths: -------------- trunk/py4science/doc/requirements.txt trunk/py4science/workbook/intro_pyrex.tex trunk/py4science/workbook/main.tex Modified: trunk/py4science/doc/requirements.txt =================================================================== --- trunk/py4science/doc/requirements.txt 2007-12-07 04:48:30 UTC (rev 4663) +++ trunk/py4science/doc/requirements.txt 2007-12-07 06:29:31 UTC (rev 4664) @@ -153,9 +153,10 @@ users anyhow, like the abiliy to read and write MS Office documents via the COM API. -- ipython: grab the latest win32 exe installer from the `ipython - distributions`_ page +- install pyreadline_: ipython needs this for tab completion and other handy features +- ipython: grab the latest win32 exe installer from the `ipython distributions`_ page + - numpy: grab the latest exe or msi installer for your version of python at `numpy download`_ @@ -174,6 +175,8 @@ .. _win32com: http://sourceforge.net/project/showfiles.php?group_id=78018&package_id=79063&release_id=449591 +.. _pyreadline: http://ipython.scipy.org/moin/PyReadline/Intro + .. _`ipython distributions`: http://ipython.scipy.org/dist/ .. _`numpy download`: http://sourceforge.net/project/showfiles.php?group_id=1369&package_id=175103 Modified: trunk/py4science/workbook/intro_pyrex.tex =================================================================== --- trunk/py4science/workbook/intro_pyrex.tex 2007-12-07 04:48:30 UTC (rev 4663) +++ trunk/py4science/workbook/intro_pyrex.tex 2007-12-07 06:29:31 UTC (rev 4664) @@ -3,7 +3,7 @@ like python, but is converted by \texttt{pyrex} into python C extension code. It can be used to write custom C extension modules in a python like module to remove performance bottlenecks in code, as -well as to wrap and existing C API with a python binding. \textt{pyrex} +well as to wrap and existing C API with a python binding. \texttt{pyrex} generates C code, so you can use it to automatically generate C extensions that you can ship with your code and users can build your code without \texttt{pyrex} installed. @@ -116,11 +116,11 @@ \section{Working with \texttt{numpy} arrays} -\textt{numpy} arrays are the core of high performance computing in -python, and on of the most common data formats for passing large data +\texttt{numpy} arrays are the core of high performance computing in +python, and one of the most common data formats for passing large data sets around between pyhton code and other wrappers. There are many things that arrays do very well and are practically as fast as a -native C or Fortran implementations, eg convolutions and FFTs. But +native C or FORTRAN implementations, eg convolutions and FFTs. But there are somethings that can be painfully slow in python when working with arrays, for example iterative algorithms over an array of values. For these cases, it is nice to be able to quickly generate some python @@ -130,8 +130,8 @@ \texttt{pyrex} extension code, you can find it, and another file which \texttt{numpy} uses to expose the requisite bits of the Python C API which it needs, in the \texttt{numpy} source code directory -\texttt{numpy/doc/pyrex}. These files are \texttt{c_numpy.pxd} and -\texttt{c_python.pxd}. In addition, \texttt{numpy} provides and +\texttt{numpy/doc/pyrex}. These files are \texttt{c\_numpy.pxd} and +\texttt{c\_python.pxd}. In addition, \texttt{numpy} provides and example file \texttt{numpyx.pyx}that shows you how to build a pyx extension file for multi-dimensional array sof different data types (eg int, float, python object). Here we will be a little less Modified: trunk/py4science/workbook/main.tex =================================================================== --- trunk/py4science/workbook/main.tex 2007-12-07 04:48:30 UTC (rev 4663) +++ trunk/py4science/workbook/main.tex 2007-12-07 06:29:31 UTC (rev 4664) @@ -1,5 +1,3 @@ -%% LyX 1.4.3 created this file. For more info, see http://www.lyx.org/. -%% Do not edit unless you really know what you are doing. \documentclass[english]{amsbook} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2008-02-12 14:10:52
|
Revision: 4953 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4953&view=rev Author: jdh2358 Date: 2008-02-12 06:10:41 -0800 (Tue, 12 Feb 2008) Log Message: ----------- applied stefans intro patch Modified Paths: -------------- trunk/py4science/doc/rest_basics.txt trunk/py4science/intro_talk/intro_python_scicomp.lyx Modified: trunk/py4science/doc/rest_basics.txt =================================================================== --- trunk/py4science/doc/rest_basics.txt 2008-02-11 19:46:52 UTC (rev 4952) +++ trunk/py4science/doc/rest_basics.txt 2008-02-12 14:10:41 UTC (rev 4953) @@ -1,6 +1,6 @@ -_================================= +================================= reST (reSTructured Text) basics -=================================k +================================= .. Author: Fernando Perez .. Contact: Fer...@co... .. Time-stamp: "2007-08-29 15:50:06 fperez" Modified: trunk/py4science/intro_talk/intro_python_scicomp.lyx =================================================================== --- trunk/py4science/intro_talk/intro_python_scicomp.lyx 2008-02-11 19:46:52 UTC (rev 4952) +++ trunk/py4science/intro_talk/intro_python_scicomp.lyx 2008-02-12 14:10:41 UTC (rev 4953) @@ -1261,7 +1261,7 @@ \begin_layout Standard \align center \begin_inset Graphics - filename ../../../talks/0708_ncar/fig/Fluidlab5.png + filename fig/Fluidlab5.png lyxscale 50 width 90text% keepAspectRatio @@ -1278,7 +1278,7 @@ \begin_layout Standard \align center \begin_inset Graphics - filename ../../../talks/0708_ncar/fig/Fluidlab6.png + filename fig/Fluidlab6.png lyxscale 50 width 90text% keepAspectRatio @@ -1313,7 +1313,7 @@ \begin_layout Standard \align center \begin_inset Graphics - filename ../../../talks/0708_ncar/fig/sage-cube5plot-medium.jpg + filename fig/sage_notebook-medium.jpg lyxscale 50 width 90text% keepAspectRatio This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fer...@us...> - 2008-07-07 00:18:00
|
Revision: 5713 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=5713&view=rev Author: fer_perez Date: 2008-07-06 17:17:57 -0700 (Sun, 06 Jul 2008) Log Message: ----------- Add agenda for 2008 SciPy tutorial, plus misc. updates to scripts. Modified Paths: -------------- trunk/py4science/examples/fft_imdenoise.py trunk/py4science/examples/glass_dots1.py trunk/py4science/examples/lotka_volterra.py trunk/py4science/examples/numpy_wrap/f2py/example3/Makefile trunk/py4science/examples/skel/fft_imdenoise_skel.py trunk/py4science/examples/skel/fortran_wrap/Makefile trunk/py4science/examples/skel/fortran_wrap/fib3.f trunk/py4science/examples/skel/glass_dots1_skel.py trunk/py4science/examples/stock_demo.py trunk/py4science/examples/stock_records.py trunk/py4science/examples/weave_blitz.py trunk/py4science/examples/weave_examples_simple.py Added Paths: ----------- trunk/py4science/classes/0808_scipy_agenda.txt Added: trunk/py4science/classes/0808_scipy_agenda.txt =================================================================== --- trunk/py4science/classes/0808_scipy_agenda.txt (rev 0) +++ trunk/py4science/classes/0808_scipy_agenda.txt 2008-07-07 00:17:57 UTC (rev 5713) @@ -0,0 +1,94 @@ +========================================================= + Introduction to Scientific Computing in Python - Agenda +========================================================= + +.. contents:: +.. + 1 Introduction and resources + 2 Day 1 +.. + +Introduction and resources +========================== + +While the tutorial will begin with very basic concepts, we will assume that +attendees have given the free online `Python tutorial`_ a very decent read, and +will have installed on their systems all the prerequisite tools. + +.. _`Python tutorial`: http://docs.python.org/tut + +In addition, the following are good sources of information for the tools we'll +be using (all are linked from the main `SciPy documentation`_ page): + + * The `STSci tutorial`_ on interactive data analysis. + * The tentative `NumPy tutorial`_. + * The list of NumPy `functions with examples`_. + * The SciPy community cookbook_. + +.. _`SciPy documentation`: http://www.scipy.org/Documentation +.. _`STSci tutorial`: http://www.scipy.org/wikis/topical_software/Tutorial +.. _`NumPy tutorial`: http://www.scipy.org/Tentative_NumPy_Tutorial +.. _`functions with examples`: http://www.scipy.org/Numpy_Example_List_With_Doc +.. _`cookbook`: http://www.scipy.org/Cookbook + + +Initials indicate who presents what: + + * MD: Michael Droetboom + * PG: Perry Greenfield + * FP: Fernando Perez + + +Day 1 +===== + +* Python for scientific computing: A high-level overview of the topic of Python + in a scientific context ( simple 30 minute talk). + +* Workflow, guided by a simple examples and students typing along. Will show + basics of everyday workflow as we cover the core concepts. + + * Basic scalar types: strings and numbers (int, float, complex). Exercise: + Walli's infinte product formula for Pi. + + * Basic collections: lists and dicts (mention tuples and sets). Exercise: + word frequency counting. + + * Quick review of control flow: if, for, range, while, break, continue. + + * Defining functions. Arguments and docstrings. + + * Reusing your code: every script is a module, '__main__' (notes on module + loading and reloading) + + * Exceptions: a core concept in Python, you really can't use the language + without them. + + * Debugging your programs: + * Ye olde print statement. + * %debug in ipython. + * %run -d in ipython. + * winpdb - a free, cross-platform GUI debugger. + + * Testing your code: reproducible research from the start. Making a habit + out of having auto-validated code. + +* Introduction to NumPy arrays. + * Memory model. + * The dtype concept. + * Creating arrays. + * Basic operations: arithmetic and slicing. + * Indexing modes. Views vs. copies. + * Functions that operate on arrays: the builtins and making your own. + * Saving and reloading arrays on disk. + + Exercises: Trapezoid rule integration. Image denoising using FFTs. + +* Working with data + * Reading files. + * Simple text parsing. + * CSV files. + * Matplotlib's data loader. + + +* Python packages and modules, the very basics: __init__.py and $PYTHONPATH. Modified: trunk/py4science/examples/fft_imdenoise.py =================================================================== --- trunk/py4science/examples/fft_imdenoise.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/fft_imdenoise.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -3,14 +3,13 @@ import sys -import numpy as N -import pylab as P -import scipy as S +import numpy as np +from matplotlib import pyplot as plt def mag_phase(F): """Return magnitude and phase components of spectrum F.""" - return (N.absolute(F), N.angle(F)) + return (np.absolute(F), np.angle(F)) def plot_spectrum(F, amplify=1000): """Normalise, amplify and plot an amplitude spectrum.""" @@ -19,19 +18,19 @@ M[M > 1] = 1 print M.shape, M.dtype - P.imshow(M, P.cm.Blues) + plt.imshow(M, plt.cm.Blues) try: # Read in original image, convert to floating point for further # manipulation; imread returns a MxNx4 RGBA image. Since the # image is grayscale, just extrac the 1st channel - im = P.imread('data/moonlanding.png').astype(float)[:,:,0] + im = plt.imread('data/moonlanding.png').astype(float)[:,:,0] except: print "Could not open image." sys.exit(-1) # Compute the 2d FFT of the input image -F = N.fft.fft2(im) +F = np.fft.fft2(im) # Now, make a copy of the original spectrum and truncate coefficients. keep_fraction = 0.1 @@ -52,27 +51,27 @@ # Reconstruct the denoised image from the filtered spectrum, keep only the real # part for display -im_new = N.fft.ifft2(ff).real +im_new = np.fft.ifft2(ff).real # Show the results -P.figure() +plt.figure() -P.subplot(221) -P.title('Original image') -P.imshow(im, P.cm.gray) +plt.subplot(221) +plt.title('Original image') +plt.imshow(im, plt.cm.gray) -P.subplot(222) -P.title('Fourier transform') +plt.subplot(222) +plt.title('Fourier transform') plot_spectrum(F) -P.subplot(224) -P.title('Filtered Spectrum') +plt.subplot(224) +plt.title('Filtered Spectrum') plot_spectrum(ff) -P.subplot(223) -P.title('Reconstructed Image') -P.imshow(im_new, P.cm.gray) +plt.subplot(223) +plt.title('Reconstructed Image') +plt.imshow(im_new, plt.cm.gray) -P.savefig('fft_imdenoise.png', dpi=150) -P.savefig('fft_imdenoise.eps') -P.show() +plt.savefig('fft_imdenoise.png', dpi=150) +plt.savefig('fft_imdenoise.eps') +plt.show() Modified: trunk/py4science/examples/glass_dots1.py =================================================================== --- trunk/py4science/examples/glass_dots1.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/glass_dots1.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -5,17 +5,12 @@ See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). """ +import cmath from numpy import cos, sin, pi, matrix import numpy as npy import numpy.linalg as linalg from pylab import figure, show -def csqrt(x): - """ - sqrt func that handles returns sqrt(x)j for x<0 - """ - if x<0: return complex(0, npy.sqrt(abs(x))) - else: return npy.sqrt(x) def myeig(M): """ @@ -34,12 +29,13 @@ tau = a+d # the trace delta = a*d-b*c # the determinant - lambda1 = (tau + csqrt(tau**2 - 4*delta))/2. - lambda2 = (tau - csqrt(tau**2 - 4*delta))/2. + lambda1 = (tau + cmath.sqrt(tau**2 - 4*delta))/2. + lambda2 = (tau - cmath.sqrt(tau**2 - 4*delta))/2. return lambda1, lambda2 # 2000 random x,y points in the interval[-0.5 ... 0.5] -X1 = matrix(npy.random.rand(2,2000))-0.5 +X1 = matrix(npy.random.rand(2,2000) + )-0.5 name = 'saddle' sx, sy, angle = 1.05, 0.95, 0. Modified: trunk/py4science/examples/lotka_volterra.py =================================================================== --- trunk/py4science/examples/lotka_volterra.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/lotka_volterra.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -46,7 +46,7 @@ p.figure() -p.plot(r, f) +p.plot(r, f, color='red') p.xlabel('rabbits') p.ylabel('foxes') p.title('phase plane') @@ -65,8 +65,8 @@ dR = dr(R, F) dF = df(R, F) -p.contour(R, F, dR, levels=[0], linewidths=3, colors='black') -p.contour(R, F, dF, levels=[0], linewidths=3, colors='black') +p.contour(R, F, dR, levels=[0], linewidths=3, colors='blue') +p.contour(R, F, dF, levels=[0], linewidths=3, colors='green') p.ylabel('foxes') p.title('trajectory, direction field and null clines') Modified: trunk/py4science/examples/numpy_wrap/f2py/example3/Makefile =================================================================== --- trunk/py4science/examples/numpy_wrap/f2py/example3/Makefile 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/numpy_wrap/f2py/example3/Makefile 2008-07-07 00:17:57 UTC (rev 5713) @@ -1,10 +1,7 @@ -#F2PY=f2py +F2PY=f2py -F2PY=f2py2.4 -#F2PY=/usr/local/txpython/local/Frameworks/Python.framework/Versions/2.5/bin/f2py - clean: rm -f fib3.pyf example.so Modified: trunk/py4science/examples/skel/fft_imdenoise_skel.py =================================================================== --- trunk/py4science/examples/skel/fft_imdenoise_skel.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/skel/fft_imdenoise_skel.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -36,7 +36,7 @@ # channel from the MxNx4 RGBA matrix to represent the grayscale # intensities -F = # Compute the 2d FFT of the input image. Look for a 2-d FFT in N.dft +F = # Compute the 2d FFT of the input image. Look for a 2-d FFT in N.fft. # Define the fraction of coefficients (in each direction) we keep keep_fraction = 0.1 Modified: trunk/py4science/examples/skel/fortran_wrap/Makefile =================================================================== --- trunk/py4science/examples/skel/fortran_wrap/Makefile 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/skel/fortran_wrap/Makefile 2008-07-07 00:17:57 UTC (rev 5713) @@ -1,10 +1,7 @@ -#F2PY=f2py +F2PY=f2py -F2PY=f2py2.4 -#F2PY=/usr/local/txpython/local/Frameworks/Python.framework/Versions/2.5/bin/f2py - clean: rm -f fib3.pyf example.so Modified: trunk/py4science/examples/skel/fortran_wrap/fib3.f =================================================================== --- trunk/py4science/examples/skel/fortran_wrap/fib3.f 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/skel/fortran_wrap/fib3.f 2008-07-07 00:17:57 UTC (rev 5713) @@ -19,7 +19,7 @@ ENDDO END - SUBROUTINE CUMSUM(X, Y, N) +C SUBROUTINE CUMSUM(X, Y, N) C C COMPUTE THE CUMULATIVE SUM OF X C Modified: trunk/py4science/examples/skel/glass_dots1_skel.py =================================================================== --- trunk/py4science/examples/skel/glass_dots1_skel.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/skel/glass_dots1_skel.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -5,15 +5,12 @@ See L. Glass. 'Moire effect from random dots' Nature 223, 578580 (1969). """ +import cmath # provides complex math functions from numpy import cos, sin, pi, matrix import numpy as npy import numpy.linalg as linalg from pylab import figure, show -def csqrt(x): - 'sqrt func that handles returns sqrt(x)j for x<0' - XXX - def myeig(M): """ compute eigen values and eigenvectors analytically Modified: trunk/py4science/examples/stock_demo.py =================================================================== --- trunk/py4science/examples/stock_demo.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/stock_demo.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -38,5 +38,4 @@ # <demo> stop # Now, make a slightly modified version of the file with cleaner formatting. # We'll use this later... -mlab.rec2csv(r,'dap/myserver/data/sample.csv', - formatd={'date':mlab.FormatString()}) +# Modified: trunk/py4science/examples/stock_records.py =================================================================== --- trunk/py4science/examples/stock_records.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/stock_records.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -40,7 +40,7 @@ tickers = 'SPY', 'QQQQ', 'INTC', 'MSFT', 'YHOO', 'GOOG', 'GE', 'WMT', 'AAPL' # we want to compute returns since 2003, so define the start date -startdate = datetime.datetime(2003,1,1) +startdate = datetime.date(2003,1,1) # we'll store a list of each return and ticker for analysis later data = [] # a list of (return, ticker) for each stock Modified: trunk/py4science/examples/weave_blitz.py =================================================================== --- trunk/py4science/examples/weave_blitz.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/weave_blitz.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -5,12 +5,11 @@ import sys, time -import numpy -from numpy import zeros +import numpy as np from scipy import weave -from pylab import subplot, plot, show, legend, xlabel, ylabel, title +from pylab import figure,subplot, plot, show, legend, xlabel, ylabel, title -rand = numpy.random.rand +rand = np.random.rand Nadds = 12 Nevals = 10 @@ -45,7 +44,7 @@ # can disrupt timings if useWeave: # only weave needs to predefine result array - result= zeros(shape,dtype=float) + result= np.empty(shape,dtype=float) times[0] = now() for j in evalRng: blitz(s) @@ -67,9 +66,10 @@ nn, tn = repeat_nadds(Nadds, Nevals, useWeave=False) # plot weave versus Numeric +figure() ax = subplot(111) plot(nw, tw, 'go', nn, tn, 'bs') -legend( ('Weave', 'Numeric') ) +legend( ('Blitz', 'Numpy') ) xlabel('num adds') ylabel('time (s)') title('numpy vs weave; repeated adds, shape: %s' % (shape,)) Modified: trunk/py4science/examples/weave_examples_simple.py =================================================================== --- trunk/py4science/examples/weave_examples_simple.py 2008-07-04 19:20:43 UTC (rev 5712) +++ trunk/py4science/examples/weave_examples_simple.py 2008-07-07 00:17:57 UTC (rev 5713) @@ -1,9 +1,8 @@ #!/usr/bin/env python """Some simple examples of weave.inline use""" +import numpy as np from scipy.weave import inline,converters -import numpy as N -from pylab import rand #----------------------------------------------------------------------------- # Returning a scalar quantity computed from an array. @@ -37,16 +36,49 @@ inline(code,['num','mat','nrow','ncol'], type_converters = converters.blitz) -def main(): - zz = N.zeros([10,10]) +def prod(m, v): + #C++ version + nrows, ncolumns = m.shape + assert v.ndim==1 and ncolumns==v.shape[0],"Shape mismatch in prod" + + res = np.zeros(nrows, float) + code = r""" + for (int i=0; i<nrows; i++) + { + for (int j=0; j<ncolumns; j++) + { + res(i) += m(i,j)*v(j); + } + } + """ + err = inline(code,['nrows', 'ncolumns', 'res', 'm', 'v'], verbose=2, + type_converters=converters.blitz) + return res + + +if __name__=='__main__': + print 'zz is all zeros' + zz = np.zeros([10,10]) print 'tr(zz)=',trace(zz) - oo = N.ones([4,4],N.float) + print 'oo is all ones' + oo = np.ones([4,4],float) print 'tr(oo)=',trace(oo) - aa = rand(128,128) + print 'aa is random' + aa = np.random.rand(128,128) print 'tr(aa)=',trace(aa) + print 'tr(aa)=',np.trace(aa),' (via numpy)' + + print + print 'Modify oo in place:' print 'oo:',oo in_place_mult(3,oo) print '3*oo:',oo -if __name__=='__main__': - main() + print + print 'Simple matrix-vector multiply' + nr,nc = 20,10 + m = np.random.rand(nr,nc) + v = np.random.rand(nc) + mv = prod(m,v) + mvd = np.dot(m,v) + print 'Mat*vec error:',np.linalg.norm(mv-mvd) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |