tag:blogger.com,1999:blog-41703326004416878132024-03-14T01:04:32.571-07:00Advances in Pencil ScienceMichael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.comBlogger80125tag:blogger.com,1999:blog-4170332600441687813.post-72390945576014463102016-12-10T09:50:00.003-08:002020-01-16T12:24:46.766-08:00Word GameFor fun, and to prove to myself that I still have coding chops after my hiatus, I put together a generalization of the game Boggle few months ago.<br />
<br />
It's an extension to Boggle because it supports alternative rectangular grids to the standard 4x4. As published it uses the bsd unix wordlist but other wordlists can be used; this allows easy portability to other languages, though it is still hard-wired to the 26 character alphabet used in English.
<br />
The task of finding all solutions, i.e. words of arbitrary length, in a standard-sized or larger boggle array is nontrivial. Pruning the search tree is necessary, as the number of all possible sequences is immense. One version of the game that I often play on my iPhone limits solutions to 7 letter lengths, which is exasperating when you find an 8 or 9 letter word! My version does not have this limitation.
<br />
Also I have a version, a little behind the main one, played with the Python curses library, because I can be a bit old-fashioned.
<br />
All visible here:
<a href="https://github.com/mtobis/mt_word_game">https://github.com/mtobis/mt_word_game</a>
<br />
<br />
Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-85730126113628154222016-12-10T09:43:00.001-08:002016-12-10T09:55:08.827-08:00Work done at U Texas for ensemble managementWork done at U Texas for management of large ensembles of large scientific calculations, with robustness to job failure or resource allocation expiry, is visible here:
<p>
<a href="https://bitbucket.org/mtobis/tex-mecs ">https://bitbucket.org/mtobis/tex-mecs</a>
<p>
This is structured as a framework. The computation code and the analysis code are plugged into the framework by the end user. This is designed to be minimally intrusive. If the varied parameters of interest are already read in from a file and the code is runnable on the target machine, the user need only understand a fairly simple method for declaring the structure of the computation in ensemble parameter files.
<p>
Because the models are presumed coarse-grained (running for hours, not milliseconds) operating system calls are not costly. Consequently it is possible to wrap the executables into python objects, which makes the underlying code quite clean.
Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-33534046517545872732013-04-12T10:42:00.001-07:002013-04-12T10:42:29.208-07:00Re: "SEND ME YOUR DATA - PDF IS FINE," SAID NO ONE EVER<a href="http://www.caitlinrivers.com/1/post/2013/04/send-me-your-data-pdf-is-fine-said-no-one-ever-how-to-share-your-data-effectively.html">http://www.caitlinrivers.com/1/post/2013/04/send-me-your-data-pdf-is-fine-said-no-one-ever-how-to-share-your-data-effectively.html</a><br />
<br />
<span style="background-color: white; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px;">There's a serious problem with the current state of shared data - it is almost completely unusable! Here are some ideas for sharing more effectively.</span><br />
<span style="background-color: white; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px;"><br /></span>
<br />Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-57969669878322851392012-02-29T14:29:00.004-08:002016-12-10T09:35:53.913-08:00CAM3 fails on namelist read at TACCArticle moved <a href="http://aardvarknoplay.blogspot.com/2016/12/fix-for-running-cam3-on-tacc.html">here</a>.Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-29966708712594508122012-01-18T15:58:00.000-08:002012-01-18T15:59:33.988-08:00Environment variables in scriptsNice tutorial <a href="http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm">here</a>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-15970181414048979032011-08-12T07:58:00.000-07:002011-08-12T08:12:43.278-07:00Fixing Excel text exports in OS XExcel exports .tsv and .csv with a broken linefeed character.<div>
<br /></div><div>To fix: copy this file to "fixcel.py"</div><div>
<br />
<br /><code><pre># fixcel.py
<br />from sys import argv
<br />infnam, outfnam = argv[1:]
<br />inf = file(infnam)
<br />indata = inf.read()
<br />inf.close()
<br />outdata = ""
<br />for ch in indata:
<br />if ord(ch) == 13:
<br /> outdata += "\n"
<br />else:
<br /> outdata += ch
<br />outf = file(outfnam,"w")
<br />outf.write(outdata)
<br />outf.close()
<br />#
<br /></pre></code></div><div>
<br /></div><div>Then invoke with:</div><div>
<br /></div><div><span class="Apple-style-span" style="font-family:'courier new';">python fixcel.py <b>oldfilename</b> <b>newfilename</b></span></div><div><span class="Apple-style-span" style="font-family:'courier new';"><b>
<br /></b></span></div>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com2tag:blogger.com,1999:blog-4170332600441687813.post-41713811511637097682010-12-09T23:43:00.000-08:002010-12-09T23:55:16.377-08:00WordifyThis code can count to a million in words. It could probably be refactored so it was shorter and could count to any number. If you were patient enough. <br /><br />The "-b" flag puts "and" in the places a Brit would put it. It's optional but preferred.<br />I have random stopping points to increase the modest entertainment value of it running.<br /><br />Can you recursively get wordify up to the quintillions? How should the "-b" flag be handled?<br /><br />Can you do this in French?<br /><br /><pre><br />from string import ascii_lowercase as alphabet<br />from sys import argv<br /><br />units = [""] + "one two three four five six seven eight nine".split()<br />teens = "ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split()<br />tenties = 2 * [""] + "twenty thirty forty fifty sixty seventy eighty ninety".split() <br /><br /><br />def name(number,terminate = True,continued = False,brit=False):<br /> assert type(number) == int<br /> assert number > 0 and number < 1001<br /> if number == 1000: return "one thousand"<br /> hundreds,residual = divmod(number,100)<br /> tens,ones = divmod(residual,10)<br /> result = ""<br /> if hundreds:<br /> result += units[hundreds] + " hundred"<br /> if residual and hundreds:<br /> result += " "<br /> if brit and residual and (hundreds or continued):<br /> result += "and "<br /> if (tens == 1):<br /> result += teens[ones] <br /> if terminate:<br /> result += "."<br /> else:<br /> if tens:<br /> result += tenties[tens]<br /> if ones: result += "-"<br /> if ones:<br /> result += units[ones]<br /> if terminate:<br /> result += "."<br /> return result<br /><br />def wordify(number,brit=False):<br /> assert type(number) == int<br /> assert number > 0 and number < 1000000<br /> thousands,residual = divmod(number,1000)<br /> result = ""<br /> if thousands:<br /> result = name(thousands,False,brit=brit) + " thousand"<br /> if residual:<br /> result += " "<br /> result += name(residual,continued = True,brit=brit)<br /> else:<br /> result += "."<br /> else:<br /> result = name(number)<br /> return result<br /><br />if __name__ == "__main__":<br /><br /> from time import sleep<br /> from random import randint<br /><br /> brit = "-b" in argv<br /> <br /> sleeper = 30<br /> for i in range(1,1000000):<br /> if i == sleeper:<br /> sleep(3)<br /> sleeper += randint(3000,90000)<br /> print wordify(i,brit=brit)<br /><br /></pre><br /><br />output:<br /><br /><pre><br />one.<br />two.<br />three.<br />four.<br />five.<br />six.<br />seven.<br />eight.<br />nine.<br />ten.<br />eleven.<br />twelve.<br />...<br />nine hundred and ninety-nine thousand nine hundred and ninety-six.<br />nine hundred and ninety-nine thousand nine hundred and ninety-seven.<br />nine hundred and ninety-nine thousand nine hundred and ninety-eight.<br />nine hundred and ninety-nine thousand nine hundred and ninety-nine.<br /></pre><br /><br />That's as far as it goes so far. Go fix it.Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-81680878293650064602010-12-09T17:50:00.000-08:002010-12-09T17:54:29.300-08:00Up to 11I managed to confuse myself for hours on #11 trying to be elegant. But I really like this solution:<br /><br /><pre><br />grid = [[0]*23]*3 + [[int(x) for x in line.split()]+[0,0,0] for line in<br />'''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08<br />49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00<br />81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65<br />52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91<br />22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80<br />24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50<br />32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70<br />67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21<br />24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72<br />21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95<br />78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92<br />16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57<br />86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58<br />19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40<br />04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66<br />88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69<br />04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36<br />20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16<br />20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54<br />01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''.split('\n')<br />] + [[0]*23]*3<br /><br />import operator<br /><br />print max([reduce(operator.mul, [grid[y+n*d[0]][x+n*d[1]] for n in (0,1,2,3)])<br />for x in xrange(0,20) for y in xrange(3,23)<br />for d in ((0,1),(1,0),(1,1),(-1,1))]) <br /></pre><br /><br />The halo of zeros is very clever and completely works around what made mine confusing, and despite everything, inelegant:<br /><br /><pre><br /><br />linelen = len(array[0])<br />for line in array:<br /> assert len(line) == linelen<br /><br />numlines = len(array)<br />offset = 4<br /><br />directions = {<br /> "row":(0,linelen-offset+1,numlines,(0,1)),<br /> "column":(0,linelen,numlines-offset+1,(1,0)),<br /> "slash":(offset-1,linelen-offset+1,numlines-offset+1,(-1,1)),<br /> "backslash":(0,linelen-offset+1,numlines-offset+1,(1,1))<br /> }<br /><br />maxprod = None<br />valmax = 0<br /><br />for direction in directions.keys():<br /> x0, xlen, yrg, delta = directions[direction]<br /> vec0 = [(x0 + i * delta[0] ,i * delta[1]) for i in range(offset)]<br /> for y in range(yrg):<br /> vec1 = [(item[0]+y,item[1]) for item in vec0]<br /> for x in range(xlen):<br /> vec = [(item[0],item[1]+x) for item in vec1]<br /> vals = [array[item[0]][item[1]] for item in vec]<br /> prod = reduce(mul,vals,1)<br /> if prod > maxprod:<br /> valmax = vals<br /> maxprod = prod<br /><br />print valmax, maxprod<br /></pre>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-25364574081530999142010-12-05T22:22:00.000-08:002010-12-05T22:33:10.745-08:00Puzzle 5Profiting from my overwrought example 3<br /><br /><pre><br />from bf7 import *<br />from sys import argv<br /><br />if __name__ == "__main__":<br /> if len(argv) == 1:<br /> upto = 10<br /> else:<br /> upto = int(argv[1]) <br /> allprimes = primesupto(upto)<br /><br /> result = 1<br /> for prime in allprimes:<br /> factor = prime<br /> while factor < upto:<br /> result *= prime<br /> factor *= prime<br /> print result<br /></pre><br /><br />For me it would have been less work to just write<br /><br />print 2 * 2 * 2 * 2 * 3 * 3 * 5 * 7 * 11 * 13 * 17 * 19<br /><br />Best solution, for those who can remember grade school:<br /><br /><pre><br /><br />def gcd(a, b):<br /> while(b != 0):<br /> a, b = b, a%b<br /> return a<br /> <br />def lcm(a,b):<br /> return a * b / gcd(a, b)<br /> <br />print reduce(lcm, range(2, 21))<br /><br /></pre>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-9935638392037366922010-12-05T21:48:00.000-08:002010-12-05T21:56:27.354-08:00Puzzle 4What's the largest palindrome number that is the product of two three digit numbers.<br /><br />This time I have one of the better solutions:<br /><br /><pre><br />def nextpal(low,high,reversed=False):<br /> assert low < high<br /><br /> if reversed:<br /> candidate = high<br /> final = low<br /> increment = -1<br /> else:<br /> candidate = low<br /> final = high<br /> increment = 1<br /> while candidate != final:<br /> if str(candidate) == str(candidate)[-1::-1]:<br /> yield candidate<br /> candidate += increment<br /><br />def getfactor(low,high,target):<br /> for test in range(low,high):<br /> if not target % test:<br /> residual = target/test<br /> if residual in range(low,high):<br /> return test, residual<br /> return None<br /><br />if __name__ == "__main__":<br /> from time import time<br /> start = time()<br /> pal = nextpal(10000,1000000, reversed=True)<br /> while True:<br /> target = pal.next()<br /> result = getfactor(100,1000,target)<br /> if result:<br /> print target<br /> print result<br /> break<br /> end = time()<br /> print end - start<br /></pre><br /><br />Most started from the factors to see if they built palindromes. Much better to go the other way; far fewer tests (the 94th palindrome succeeded, so less than 9400 calculations. The cast to string for the palindrome test is easy, but is it efficient?<br /><br />The most interesting items on the discussion were the Pytho one-liner:<br /><br />max(map(lambda s: bool(s) and max(s) or 0, [(filter(lambda n: n == int(str(n)[::-1]), map(lambda n: i*n, range(999, 99, -1)))) for i in range(999, 99, -1)]))<br /><br />and the pen-and-paper solution<br /><br /><blockquote>You can also do this with pen and paper. You have a number: <br /><br />(100a + 10b + c)(100d + 10e + f) <br /><br />Which is a palindrone. This factors out to: <br /><br />100cd + 10ce + cf + <br />1000bd + 100be + 10bf + <br />10000ad + 1000ae + 100af <br /><br />Assuming the first digit is 9, then cf must be equal to nine. <br />Also, both a and d must then be equal to nine. The only ways <br />to make the last digit of the product of two integers 9 would <br />be if those integers were either of: <br /><br />1 and 9 <br />3 and 3 <br />7 and 7 <br /><br />So, both numbers must start with 9, end with either 1, 3, 7, <br />or 9, and one of them must be divisible by 11. The only <br />numbers divisible by 11 from 900 - 1000 are: <br /><br />902 <br />913 <br />924 <br />935 <br />946 <br />957 <br />968 <br />979 <br />990 <br /><br />You can discard all of those that do not end in either 1, 3, <br />7, or 9, and you are left with: <br /><br />913 <br />957 <br />979 <br /><br />So now the presumed answer is either: <br /><br />(900 + 10 + 3)(900 + 10x + 3) <br />(900 + 50 + 7)(900 + 10x + 7) <br />(900 + 70 + 9)(900 + 10x + 1) <br /><br />Factoring all those out, you get: <br /><br />810000 + 9000x + 2700 + 9000 + 100x + 30 + 2700 + 30x + 9 <br />824439 + 9130x <br /><br />Now, for the first digit 824439 + 9130x to be 9, x must be 9 <br />(if x were 8, then 824439 + 9130x = 897479, and the first <br />digit is 8). And so you have 913 * 993, which is the answer. <br />You can factor the others out to see if they produce a bigger <br />answer, which they don't.<br /></blockquote>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-9282268944363188392010-12-04T22:55:00.000-08:002010-12-04T23:32:49.098-08:00Puzzle 3 without cheatingI am about 2800 times slower than the cheat I downloaded. But I get the right answer, and in a tolerable time (30 seconds). Pure brute forcing this seems like it would take much longer.<br /><br /><pre><br />from sys import argv<br />from math import sqrt<br />from time import time<br /><br /># PRIME GENERATOR<br /><br />def nextprime():<br /> """ generate next prime """<br /><br /> myprimes = [2]<br /> candidate = 3<br /> yield 2<br /> while True:<br /> factors = factorize(candidate,myprimes)<br /> if len(factors.keys()) == 1:<br /> myprimes.append(candidate)<br /> yield candidate<br /> candidate += 2<br /><br />def primesupto(upto):<br /> """ collect primes from the generator"""<br /><br /> result = []<br /> primes = nextprime()<br /> p = None<br /> while not p or p < upto:<br /> if p:<br /> result.append(p)<br /> p = primes.next()<br /> return result<br /><br />def factorize(target,allprimes=None,verbose=False):<br /> """ get factors of an integer<br /><br /> this works but is very slow if the primes aren't cached """<br /><br /> factors = {}<br /> upto = int(sqrt(target))<br /> residual = target<br /> prime = nextprime()<br /><br /> if allprimes:<br /> prime = allprimes.__iter__()<br /><br /> while True: # get factors and multiplicities up to sqrt(N)<br /> try:<br /> factor = prime.next()<br /> except StopIteration:<br /> break<br /> if factor > upto:<br /> break<br /> while not residual % factor:<br /> residual /= factor<br /> factors[factor] = factors.get(factor,0) + 1 <br /><br /> if residual > 1: # if anything is left it is the sole prime factor > sqrt(N)<br /> factors[residual] = 1<br /><br /> return factors<br /> <br />if __name__ == "__main__":<br /> target = int(argv[1]) # get target from command line<br /> upto = sqrt(target)<br /> starttime = time()<br /> allprimes = primesupto(upto)<br /> print max(factorize(int(argv[1]),allprimes).keys())<br /> endtime = time()<br /> print endtime - starttime<br /></pre><br /><br />Update:<br /><br />Best answer, wow!<br /><br /><pre><br />from time import time<br />from sys import argv<br /><br />n = int(argv[1])<br />d = 3<br /><br />starttime = time()<br />while (d * d < n):<br /> if n % d == 0: n /= d<br /> else: d += 2<br />endtime = time()<br />print n<br />print endtime - startime<br /></pre><br /><br />Runs in 0.7 msec. I feel like a complete idiot now. Oh well, it was interesting anyway.Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-91738242983031105112010-12-04T12:10:00.000-08:002010-12-04T12:11:39.068-08:00Cheating, sortaWhat is the largest prime factor of the number 600851475143 ?<br /><pre><br />from os import system<br />from os.path import isfile<br />from sys import argv<br /><br />try:<br /> import numbthy<br />except:<br /> if not isfile("numbthy.py"): # don't mess with it if it's already there and broken<br /> system("wget http://userpages.umbc.edu/~rcampbel/Computers/Python/lib/numb<br />thy.py")<br /> import numbthy<br /><br />f = numbthy.factors(int(argv[1]))<br />if f: print f[-1]<br /><br /></pre>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-27572376938832680792010-12-04T08:01:00.001-08:002010-12-04T08:05:22.258-08:00Level 2I'm mostly at level 2 <a href="http://www.starling-software.com/employment/programmer-competency-matrix.html">in this chart</a>, except for IDEs. I don't really use them. I like aquamacs for an editor but even there I'm not good at it. I'm also pretty lame at version control, never having had the opportunity to work closely with others; hence never having run into a merge problem in real life.<br /><br />I read some of the sorts of books he calls level 3.Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-60745229560176528992010-12-03T13:58:00.001-08:002010-12-03T15:06:37.906-08:00Number TwoPython shines on this one. Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million.<br /><br /><pre><br />from itertools import ifilterfalse<br /><br />def fib(n1=1,n2=1,fmax=4000000):<br /> "terminating fibonacci sequence"<br /><br /> assert 0 < n1 <= n2 < fmax<br /> l = [n2,n1]<br /> while l:<br /> if l[0] < fmax/2:<br /> l.append(sum(l))<br /> yield l.pop(0)<br /><br />if __name__ == "__main__":<br /> print sum(ifilterfalse(lambda x: x % 2,fib()))<br /></pre>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-60968575502520497002010-12-03T13:13:00.000-08:002010-12-03T13:18:37.697-08:00Euler Project<a href="http://projecteuler.net/index.php?section=problems&id=1">prob 1</a><br /><br />A one-liner.<br /><br /><pre><br />>>> sum([i for i in range(10) if not (i%3 and i%5)])<br />23<br />>>> sum([i for i in range(1000) if not (i%3 and i%5)])<br />233168<br /></pre><br /><br />So it's surprisingly interesting:<br /><br /><pre><br />>>> for n in range(1,9):<br />... print sum([i for i in range(10**n) if not (i%3 and i%5)])<br />... <br />23<br />2318<br />233168<br />23331668<br />2333316668<br />233333166668<br />23333331666668<br />2333333316666668<br /></pre><br /><br />Can't even come up with a succinct notation for the theorem, never mind any idea how to prove it.Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-85129740845041674812010-11-30T13:08:00.000-08:002010-11-30T13:09:34.617-08:00Moving notes to selfNotes to self or those interested in my daily pain will be moved to <a href="http://aardvarknoplay.blogspot.com/">http://aardvarknoplay.blogspot.com/</a> . Old notes being moved.<div><br /></div><div>This blog will actually have content that others may find interesting.</div><div><br /></div>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-55529556902090893012010-10-21T20:43:00.000-07:002016-12-10T09:20:43.179-08:00Some Key Papers in Climate Modeling HistoryA first pass at a greatest hits list; updates will not necessarily be noted as such. I had a request for key papers in the history of modeling so the emphasis leans that way. Nominations welcome.<br />
<br />
Charney, Fjortofft & von Neumann 1950: Numerical integration of the barotropic vorticity equation, Tellus 2:237-254<br />
<br />
Lorenz 1963: Deterministic Nonperiodic Flow J. Atmos. Sci 20:130-141<br />
<br />
Lorenz 1967: The nature and theory of the general circulation of the atmosphere. WMO. http://eapsweb.mit.edu/research/Lorenz/General_Circ_WMO_1967_Part1.pdf<br />
<br />
Manabe & Bryan 1969: Climate calculations with a combined ocean-atmosphere model.<br />
<br />
Bryan & Cox 1972: <span style="font-size: 100%;"><a class="yC10" href="http://www.gfdl.noaa.gov/bibliography/related_files/kb7201.pdf">The circulation of the world <b>ocean</b>: a numerical study. Part I, a homogeneous model</a> J Phys Oceanog<br /></span>Arakawa & Lamb 1977: Computational Design of the basic processes of the UCLA general circulation model. Methods in Computational Physics 17:173-265<br />
<br />
Charney et al 1979: Ad Hoc Study Group on Carbon Dioxide and Climate. http://www.atmos.ucla.edu/~brianpm/charneyreport.html<br />
<br />
Manabe & Stouffer 1988: Two stable equilibria of a coupled ocean-atmosphere model<br />
<br />
Ramanathan et al 1985: Trace gas trends and their potential role in climate change. J Geophys Res 90:5547-5566<br />
<br />
Cess et al 1990: Intercomparison and interpretation of climate feedback processes in seventeen atmospheric general circulation models<br />
<br />
Bryan 1991: Poleward heat transport in the ocean: a reviwe of a hierarchy of models of incerasing resolution. J Phys Oceanog 18:851-867<br />
<br />
Cubasch et al 1992: Time-dependent greenhouse warming computations with a coupled ocean-atmosphere model<br />
<br />
Hansen et al 1992: <span style="font-size: 100%;"><a class="yC1D" href="http://www.agu.org/pubs/crossref/1992/91GL02788.shtml">Potential climate impact of Mount Pinatubo eruption</a></span> GEOPHYSICAL RESEARCH LETTERS, VOL. 19, NO. 2, PP. 215-218, 1992<br />
doi:10.1029/91GL02788 <br />
<br />
Hasselmann 1997: Multi-pattern fingerprint method for detection and attribution of climate change. Climate Dynamics 13:601-612<br />
<br />
Hansen et al 1998: Climate Forings in the Industrial Era. PNAS<br />
<br />
Bengtsson 1999: From short-range barotropic modeling to extended-range global weather prediction. Tellus 51 A-B:13-23<br />
<br />
Randall 2000: <span style="font-size: 100%;"><span id="btAsinTitle">General Circulation Model Development: Past, Present, and Future (International Geophysics) <span style="font-size: 16px; text-transform: capitalize;">[Hardcover]</span></span></span><br />
<br />
Hansen et al 2005: Earth's Energy Imbalance: Confirmation and Implications. Science.<br />
<br />
Hack et al 2006: Simulation of the Global Hydrological Cycle in the CCSM Community Atmosphere Model Version 3. J Clim Volume 19, Issue 11 (June 2006)<br />
<br />
Schmidt et al 2006: Present-Day Atmospheric Simulations Using GISS ModelE: Comparison to In Situ, Satellite, and Reanalysis Data. <i>J. Climate</i>, <b>19</b>, 153–192. <br />
<br />
Rahmstorf et al 2007: Recent Climate Observations Compared to Predictions. Science 316:709 DOI: 10.1126/science.1136843Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com1tag:blogger.com,1999:blog-4170332600441687813.post-22031882469271966642010-10-12T13:59:00.000-07:002010-10-12T14:46:45.550-07:00More Adventures in Climate Analysis Installs<div>So here I document getting Ferret to work on a Mac; getting it to run on the super is another problem. I assumed no privileges and more or less succeeded. However, the install instructions are (as is normal with scientist code) broken.</div><div><br /><div>Here are the absurd installation instructions:</div><div><br /></div><div><a href="http://ferret.pmel.noaa.gov/static/Downloads/mac_intel_downloads.html">http://ferret.pmel.noaa.gov/static/Downloads/mac_intel_downloads.html</a></div><div><br /></div><div>This is basically just three useful links to the actual binaries under "Environment and Executable files"; ignore the rest of it.</div><div><br /></div><div>Then proceed to </div><div><br /></div><div><a href="http://ferret.pmel.noaa.gov/static/Downloads/ferret_installation_and_update_guide_v600.html">http://ferret.pmel.noaa.gov/static/Downloads/ferret_installation_and_update_guide_v600.html<br /></a><div><br /></div><div>If you don;t knwo about environment variables in bash, go study up on them.</div><div><br /></div><div>The first step 1 should be </div><div><span class="Apple-style-span" style="font-family: Times; font-size: medium; "><pre>tar xf $GET_LOCATION/fer_environment.tar</pre></span></div><div><br /></div><div>The second step 1 and step 2 [sic] work as noted. Step 3 should be</div><div><span class="Apple-style-span" style="font-family: Times; font-size: medium; "><pre>tar xf $GET_LOCATION/fer_dsets.tar</pre></span></div><div>as the Mac ungzips behind your back. Your next step will have to be backwards, as the Finstall script expects the exectuables to be gzipped. So go back to your download directory and type</div><div><br /></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: medium; ">gzip fer_executables.tar</span></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: medium; "><br /></span></div><div><span class="Apple-style-span" style="font-family:monospace;"><span class="Apple-style-span" style="font-size: medium;"><br /></span></span></div><div>Also, you will have to find a place for an extra file in the middle of the next step. Be sensible, create a ~/.Ferret directory before doing the next step. Use that for your $SET_FER .</div><div><br /></div><div>Now you can run the Finstall per instructions. But the script you ghet out will be a csh script not a bash script. The following edits worked for me:</div><div><br /><pre><br />export FER_DIR=/Users/tobis/Ferret<br />export FER_DSETS=/Users/tobis/FerSamp<br /><br /># if ( $PATH !~ *ferret* ) then<br /># export PATH={$PATH}:$FER_DIR/bin<br /># else<br /># echo replacing ferret path<br /># export PATH=`echo $PATH | awk -F: '{for (i=1; i<=NF; i++) {if ($i \!~ /ferret\/bin/) {printf "%s:",$i}}}'`<br /># export PATH={$PATH}$FER_DIR/bin<br /># endif<br /> <br /># =========== Initially make no modifications below this line ===========<br /><br /># Default Ferret document browser<br /># export FER_WEB_BROWSER="netscape -ncols 60"<br /> export FER_EXTERNAL_FUNCTIONS="$FER_DIR/ext_func/libs"<br /> export FER_GO=". $FER_DIR/go $FER_DIR/examples $FER_DIR/contrib"<br /> export FER_DATA=". $FER_DSETS/data $FER_DIR/go $FER_DIR/examples $FER_DIR/contrib"<br /> export FER_DESCR=". $FER_DSETS/descr"<br /> export FER_GRIDS=". $FER_DSETS/grids"<br /> export TMAP="$FER_DIR/fmt"<br /> export PLOTFONTS="$FER_DIR/ppl/fonts"<br /> export SPECTRA="$FER_DIR/ppl" # for old ferret versions<br /> export FER_PALETTE=". $FER_DIR/ppl" # palette search list<br /></pre><br /><br /></div><div>So basically, change all the setenvs to exports, put in the equal sign, comment out the if/else block. If you are better with bash scripts, the if/else thing looks harmless.<br /></div><br /><div>I did not uncomment the reference to netscape. I don;t know where to get a netscape for os X 10.6 anyway. Sigh.<br /></div><br /><div> This actually works!</div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi20oguYU_55HtkVeTbvssb4MsY8Dw1WM755P2CTpT_3TTNLTtU6wj28OQVEMb3ADgm7KaP8ZmX5e1Eg1wjhAGJ9acLvvvxqBbiP4JWPkzknUCKxAXyATCmVciQu3pDxWlUnYkAEKhovkk/s1600/Picture+2.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 281px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi20oguYU_55HtkVeTbvssb4MsY8Dw1WM755P2CTpT_3TTNLTtU6wj28OQVEMb3ADgm7KaP8ZmX5e1Eg1wjhAGJ9acLvvvxqBbiP4JWPkzknUCKxAXyATCmVciQu3pDxWlUnYkAEKhovkk/s400/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5527279038688272418" /></a><br /><div><span class="Apple-style-span" style="font-size: small;">Meanwhile Chas has bunches of hoops for me to jump through. Will keep you posted, if you exist.</span></div></div></div>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-6533496212212662332010-10-06T12:17:00.000-07:002010-10-06T12:26:06.655-07:00PyNGL Even worse than CDAT?Undecided as yet. More to follow. But plenty of the same signs of cluelessness.<br /><br />I am still hopeful that the interpolation routine I need will work. And the install is much more straightforward, there being suitable binaries for the machines I care about.<br /><br />But the test routine starts with an absolute path to a python installation at NCAR!<br /><br />And this is unpythonic, though perhaps this is a Fortran 77 constraint rearing its ugly head<br /><pre><blockquote><br />import Ngl<br />import Nio<br />import numpy<br /><br /># create an array and make a netcdf file<br /><br />ff = Nio.open_file("foo.nc","c")<br />ff.create_dimension("x",10)<br />ff.create_dimension("y",10)<br /><br />ff.create_variable("u","f",("x","y"))<br /><br />z = numpy.zeros((10,10),"f")<br /><br /># ff.variables["u"] = z doesn't work<br /><br />ff.variables["u"].assign_value(z)<br /><br /># assignment is by value, as the name indicates<br /><br />z[3,3] = 3.3<br /><br />ff.variables["u"][4,4] = 4.4<br /><br /># but after assignment you can pick up a reference<br /><br />u = ff.variables["u"]<br /><br />u[2,2] = 2.2<br /><br />"""<br />>>> ff.variables["u"][:]<br />array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 2.2, 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 4.4, 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],<br /> [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)<br />"""</blockquote><blockquote><br />ff.close()</blockquote><blockquote><br /></blockquote></pre>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-22910249608518505202010-09-25T11:15:00.000-07:002010-09-25T11:29:06.315-07:00Anthony Doerr<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tripadvisor.files.wordpress.com/2010/02/anthony-doerr.jpg?w=300&h=300"><img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 300px;" src="http://tripadvisor.files.wordpress.com/2010/02/anthony-doerr.jpg?w=300&h=300" border="0" alt="" /></a>Read <a href="http://www.themorningnews.org/archives/opinions/planet_zoo.php">the whole thing</a>. It starts<br /><blockquote><span class="Apple-style-span" style="font-family:arial;">During my sophomore year, 1992, 1,500 scientists, including more than half the living Nobel laureates, admonished in their Warning to Humanity: “A great change in our stewardship of the earth and the life on it is required if vast human misery is to be avoided and our global home on this planet is not to be irretrievably mutilated.”<br /><br />So what have we done? Not much. From 1992 to 2007, global CO2 emissions from burning fossil fuels rose 38 percent. Emissions in 2008 rose a full 2 percent despite a global economic slump. Honeybees are dying by the billions1, amphibians by the millions, and shallow Caribbean reefs are mostly dead already.2 Our soil is disappearing faster than ever before, half of all mammals are in decline, and a recent climate change model predicts that the Arctic could have ice-free summers by 2013. Unchecked, carbon emissions from China alone will probably match the current global level by 2030.<br /><br />“</span><b><span class="Apple-style-span" style="font-family:arial;">The god thou servest</span></b><span class="Apple-style-span" style="font-family:arial;">,” Marlowe wrote in Dr. Faustus, almost four hundred years before the invention of internet shopping, “is </span><b><span class="Apple-style-span" style="font-family:arial;">thine own appetite</span></b><span class="Apple-style-span" style="font-family:arial;">.” Was he wrong? How significantly have you reduced your own emissions since you first heard the phrase “climate change?” By a tenth? A quarter? A half? That’s better than I’m doing. The shirt I’m wearing was shipped here from Thailand. The Twinkie I just ate had 37 ingredients in it. I biked to work through 91-degree heat this morning but back at my house the air conditioner is grinding away, keeping all three bedrooms a pleasant 74 degrees.<br /><br />My computer is on; my desk lamp is glowing. The vent on the wall is blowing a steady, soothing stream of cool air onto my shoes. </span></blockquote>h/t Andrew Sullivan. Anthony Doerr, whom I had not heard of until today, lives in Idaho, writes "on Science" column for the Boston Globe, and is a 2010 Fellow of the John Simon Guggenheim Memorial Foundation.Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-66119745856082401682010-09-24T12:51:00.000-07:002010-09-24T15:13:31.788-07:00Exploring NIOThe PyNIO install from binary went more or less without incident; I had to dig up a conformant numpy (1.5 is out but the binary required 1.4)<br /><br />I am deferring a PyNGL install until I figure out what PyNIO can do.<br /><br />So now I have py 2.5.1, numpy 1.4.1, Nio 1.4.0 and a doc.<br /><br />The main doc is <a href="http://www.pyngl.ucar.edu/Nio.shtml">here</a> <br /><br />Not hard for me to dig up a netcdf file from the CAM distribution; let's take a 2 D dataset from the land surface model. No idea what is in it.<br /><br /><pre><br />-rwxr-x--- 1 tobis G-25522 7671124 Oct 22 2009 clms_64x128_USGS_c030605.nc<br /></pre><br /><br />seems to work! The data object has some attributes set by the data file.<br /><br /><pre><br />>>> import numpy as np<br />>>> import Nio<br />>>> data = Nio.open_file("nctest.nc")<br />>>> data<br /><Nio.NioFile object at 0x6fc530><br />>>> dir(data)<br />['Conventions', 'Glacier_raw_data_file_name', 'History_Log', 'Host', 'Inland_water_raw_data_file_name', 'Input_navy_oro_dataset', 'Lai_raw_data_file_name', 'Logname', 'Revision_Id', 'Run_mode', 'Soil_color_raw_data_file_name', 'Soil_texture_raw_data_file_name', 'Source', 'Urban_raw_data_file_name', 'Vegetation_type_raw_data_filename', 'Version', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'close', 'create_dimension', 'create_variable', 'set_option']<br /></pre><br />but how to get at the actual contents?<br /><br />Ah; the directory is incomplete. Apparently the extension module wasn't Pythonic. This can be patched.<br /><br />So we can get at dv = data.variables() yielding <br /><br /><pre><br />['PCT_CLAY', 'LATIXY', 'LANDMASK', 'LANDFRAC_PFT', 'PCT_LAKE', 'LANDFRAC', 'NUMLON', 'LONGXY', 'MONTHLY_HEIGHT_BOT', 'PCT_WETLAND', 'MONTHLY_SAI', 'PCT_URBAN', 'PCT_SAND', 'MONTHLY_HEIGHT_TOP', 'PCT_PFT', 'MONTHLY_LAI', 'SOIL_COLOR', 'PCT_GLACIER', 'PFT']<br /></pre><br /><br />Now, just printing (__str__) data tells us<br /><br /><pre><br /> dimensions:<br /> lsmlon = 128<br /> lsmlat = 64<br />...<br /> variables:<br />...<br /> float PCT_LAKE [ lsmlat, lsmlon ]<br /></pre><br /><br />so dv['PCT_LAKE'] ought to be a 128 x 64 array<br /><br />but dv[2000,0] works. Apparently an overflow is treated as a [-1] index and an underflow as a [0] index. Not very reassuring.<br /><br />Exasperatingly, though PyNIO is available for py2.5 and numpy 1.4, PyNGL is not. Must get python 2.6... boring...Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-71026478237341926192010-09-21T13:11:00.000-07:002010-09-21T14:58:57.584-07:00Install confusionTrying to install PyNCL on a Red Hat machine without sudo priv's.<br /><br />1) Py2.7 from source. Builds fine. Runs fine.<br /><br />2) numpy from source using aforesaid python. atlas/blas instructions aren't too clear, proceed blindly ahead. build works fine.<br /><br />3) import numpy or import numarray fails:<br /><br /><span style="font-family: courier new;">ImportError: Error importing numpy: you should not try to import numpy from</span><br /><span style="font-family: courier new;"> its source directory; please exit the numpy source tree, and relaunch</span><br /><span style="font-family: courier new;"> your python intepreter from there.</span><br /><br />very little info on Google about this. Try various versions of current working directory. Failure all the same.<br /><br />4) looks like this code:<br /><br /><pre><br />if __NUMPY_SETUP__:<br /> import sys as _sys<br /> print >> _sys.stderr, 'Running from numpy source directory.'<br /> del _sys<br />else:<br /> try:<br /> from numpy.__config__ import show as show_config<br /> except ImportError, e:<br /> msg = """Error importing numpy: you should not try to import numpy from<br /> its source directory; please exit the numpy source tree, and relaunch<br /> your python intepreter from there."""<br /> raise ImportError(msg)<br /> from version import version as __version__<br /><br /></pre><br /> is getting invoked. Try setup command, but it tries to install in /usr/local/lib/python2.7<br /><br />5) How to tell setup where to put the numpy?<br /><br />setup.py install --help <br /><br />helps, yielding<br /><br /><pre><br />Options for 'install' command:<br /> --prefix installation prefix<br /> --exec-prefix (Unix only) prefix for platform-specific files<br /> --home (Unix only) home directory to install under<br /> --install-base base installation directory (instead of --prefix or --<br /> home)<br /> --install-platbase base installation directory for platform-specific files<br /> (instead of --exec-prefix or --home)<br /> --root install everything relative to this alternate root<br /> directory<br /> --install-purelib installation directory for pure Python module<br /> distributions<br /> --install-platlib installation directory for non-pure module distributions<br /> --install-lib installation directory for all module distributions<br /> (overrides --install-purelib and --install-platlib)<br /> --install-headers installation directory for C/C++ headers<br /> --install-scripts installation directory for Python scripts<br /> --install-data installation directory for data files<br /></pre><br /><br />It must be one of those!<br /><br />6) Used "--prefix". setup.py runs without complaint.<br /><br />Haha! New error. "{PATH}/multiarray.so: cannot open shared object file: No such file"<br /><br />but the file exists! Now what?<br /><br />7) Wait - no. I used the system python not the self-installed 2.7. It works! numpy is imported.<br /><br />8) Now get PyNCL? (ncl is already working on this machine)<br /><br />NO! Looks like I have to do the numpy thing again, because PyNGL recommends against the g77 compiler and requires gfortran. So my numpy, though working, is wrong.<br /><br />9) While I'm at it, no BLAS/ATLAS? etc?Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-25734905899479296122010-08-11T20:49:00.000-07:002010-08-11T21:12:16.799-07:00The Russia Thing<blockquote></blockquote><blockquote></blockquote>I am not sure how to take being definitely regarded as climate scientist by both <a href="http://rogerpielkejr.blogspot.com/2010/07/honest-broker.html">Roger Pielke Jr</a> (who is in and out of the Tobis-ooh-scary club) and <a href="http://wonkroom.thinkprogress.org/2010/08/11/global-boiling-russia/">Brad Johnson</a> (a Romm protege), but not quite so definitively by anyone commonly regarded as a climate scientist. I suppose I should accept it as better than nothing. But Johnson's topic is worth following up. And I really liked that Brad got an actual meteorologist to back me up:<div><div><blockquote><span class="Apple-style-span" style="font-family:arial;">Like Dr. Tobis, Carver [Meteorologist Rob Carver, the Research and Development Scientist for Weather Underground] believes that manmade global warming has fundamentally altered weather patterns to produce the killer Russian heat wave. “Without contributions from anthropogenic climate change,” Carver said in an email interview with the Wonk Room, “I don’t think this event would have reached such extremes or even happened at all”:</span></blockquote><blockquote><blockquote><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="font-size: small;">I agree with Michael Tobis’s take at Only In It For the Gold that something systematic has changed to alter the global circulation and you’ll need a coupled atmosphere/ocean global model to understand what’s going on. My hunch is that a warming Arctic combined with sea-surface-temperature teleconnections altered the global circulation such that a blocking ridge formed over western Russia leading to the unprecedented drought/heat wave conditions. Without contributions from anthropogenic climate change, I don’t think this event would have reached such extremes or even happened at all. (You may quote me on that.)</span></span></blockquote></blockquote>Cool. Thanks for taking the heat, making a stronger claim than I did, Rob! And thanks for the work on this, Brad!</div><div><br /></div><div>I want to explain my thinking in some detail on this, but I really don't have the time to do it justice right now. Of course it will be half-wittedly nitpicked and mocked to oblivion if I post it on a blog whether it's brilliant or foolish. I wonder if it rates a real paper somewhere. That would be a novelty...</div><div><br /></div><div>But a short version occurs to me. Remember when I tried to explain that "global warming" and "anthropogenic climate change" don't mean exactly the same thing? Well, the fact that we now have situations like this one, and last year's in Australia, allows for making the point clear with some examples.</div><div><br /></div><div>See, what we are worried about is not global warming. Global warming itself causes relatively little damage, at least at first. What we are worried about is climate change. </div><div><br /></div><div><b>Anthropogenic global warming does not cause climate change. </b></div><div><b><br /></b></div><div><b>Anthropogenic climate change causes global warming,. </b></div><div><br /></div><div>Global warming (at the surface, just like global cooling in the stratosphere) is one of the more predictable symptoms of anthropogenic climate change. But if you change the forcing, you change the response. That's not a very deep scientific result, is it? </div><div><br /></div><div>"Anthropogenic climate change" - well that's a tedious mouthful, isn't it? Not in a sense, no, not really. Not as tedious as what is happening this instant in Pakistan and in Russia, anyway. That's what abrupt climate change looks like.</div><div><br /></div></div>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com0tag:blogger.com,1999:blog-4170332600441687813.post-55359016433792179142010-08-10T12:47:00.000-07:002010-08-10T14:17:00.577-07:00<span style="font-family:courier new;"><span style="font-family:arial;">Handy FIR filter inherits from list:</span><br /></span><blockquote><span style="font-family:courier new;"><br /><pre><br /> class filter(list):<br /><br /> """real valued F I R filter with memory"""<br /><br /> def __init__(self, coeffs, data=None):<br /> list.__init__([float(item) for item in coeffs])<br /> if data:<br /> assert len(data) == len(coeffs)<br /> self.data =[float(datum) for datum in data]<br /> else:<br /> self.data = len(self) * [0.]<br /><br /> def __call__(self,value=0.):<br /> return self.filter(value)<br /><br /> def output(self):<br /> return sum(map(mul, self.coeffs, self.data))<br /><br /> def update(self,value):<br /> self.pop(0)<br /> self.append(value)<br /><br /> def filter(self, value=0.):<br /> value = float(value)<br /> self.update(value)<br /> return self.output()<br /><br /> def innovate(self):<br /> return self.filter(white())<br /><br /></pre></blockquote></span>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com3tag:blogger.com,1999:blog-4170332600441687813.post-51909043229385931742009-11-03T19:08:00.000-08:002009-11-03T19:09:26.717-08:00I'll just use Python<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsy9Uq4qiU2Xy27sdpPSEHxiVLZBD-j7J0AbQTu2IjgejZdDFflANgnLplHP_6gbN4jbDIz4YZusFo6pmSiOUen426If6I0G5NVtqcZAWWoKP7uFmAFHhcCxYnRI4HzYCqS7LfkPbeISI/s1600-h/Picture+18.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 207px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsy9Uq4qiU2Xy27sdpPSEHxiVLZBD-j7J0AbQTu2IjgejZdDFflANgnLplHP_6gbN4jbDIz4YZusFo6pmSiOUen426If6I0G5NVtqcZAWWoKP7uFmAFHhcCxYnRI4HzYCqS7LfkPbeISI/s400/Picture+18.png" alt="" id="BLOGGER_PHOTO_ID_5400080213283464146" border="0" /></a>Michael Tobishttp://www.blogger.com/profile/08229460438349093944noreply@blogger.com1