<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Thinking About Bioinformatics</title>
	<atom:link href="http://thinking.bioinformatics.ucla.edu/feed/" rel="self" type="application/rss+xml" />
	<link>http://thinking.bioinformatics.ucla.edu</link>
	<description>A test of importing a blog into WordPress MU</description>
	<pubDate>Thu, 28 Aug 2008 23:44:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>The Feynmanization of Chapter 1</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/08/13/the-feynmanization-of-chapter-1/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/08/13/the-feynmanization-of-chapter-1/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 04:46:01 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[inference]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/08/13/the-feynmanization-of-chapter-1/</guid>
		<description><![CDATA[As I discussed in a previous post, I want to emulate the admirable clarity and accessibility of Feynman&#8217;s Lectures on Physics in my own attempt to write an introductory textbook on information metrics for statistical inference.  Below are my thoughts on how I can apply the lessons that I drew from Feynman in my previous [...]]]></description>
			<content:encoded><![CDATA[<p>As I discussed in a previous post, I want to emulate the admirable clarity and accessibility of <em>Feynman&#8217;s Lectures on Physics</em> in my own attempt to write an introductory textbook on information metrics for statistical inference.  Below are my thoughts on how I can apply the lessons that I drew from Feynman in my <a href="/2008/07/18/16/" title="Feynman’s Lectures">previous post</a>.</p>
<p>More to the point, I&#8217;ve rewritten Chapter 1  <a href="http://thinking.bioinformatics.ucla.edu/files/2008/08/chapter1.pdf" title="What is Inference?">What is Inference?</a> based on these lessons.  So now I ask you: is this a genuine improvement?  Note that this is an intro chapter with only the simplest math (some addition and multiplication), so anyone should be able to understand it and critique it!  Please add comments to this post to give your opinion of whether you think the specific changes I outline below improve the chapter, compared with the <a href="http://www.doe-mbi.ucla.edu/~leec/chapter1.pdf" title="Old version of Chapter 1">original version</a>.  I am particularly interested in both whether you think the ideas in my plan are the right direction to pursue, versus whether their actual &#8220;reduction to practice&#8221; in the new draft chapter works or not.  Above all, tell me how I need to improve my chapter and my writing!</p>
<p><span id="more-20"></span></p>
<p><strong> How can I apply Feynman&#8217;s lessons to my own writing? </strong></p>
<ul>
<li>
<p class="line862">Short, self-contained chapters following Feynman&#8217;s question and answer model. I&#8217;ve struggled a bit over where to put some topics in my current &#8220;whole subject&#8221; chapters. I think these topics (e.g. Law of Large Numbers; basic info theory relations, etc.) will work better as self-contained chapters, which also make the precise order of topics less important. This seems like a useful goal. It will force me to relate each topic to my fundamental questions. It makes the material more accessible, like John Baez&#8217;s introductions in each <em>This Week&#8217;s Finds</em>. Reducing the stress on exact linear order will make it much easier to use this material in multiple formats, and to get feedback from other people. (I&#8217;ve never been able to get feedback on more than one chapter, from anyone). Finally, it&#8217;s probably an egomaniacal delusion to stuff a whole subject entitled &#8220;Inference&#8221; into one chapter. This layout pretends that each subject can be treated separately. A larger number of short chapters may actually work better: while each chapter is self-contained, it will discuss fundamental questions that connect it to many other chapters. <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">
<p class="line862">I can rework much of my material into dialog form. For example, when I introduce the Monty Hall problem, I say there are two points of view on Monty&#8217;s &#8220;twist&#8221;: <em>it doesn&#8217;t make any difference: some people find the whole question odd&#8230;</em> vs. <em>it makes a difference: some people make the argument that&#8230;</em>.  This cries out to become an actual dialog (with named characters, quotes, exclamation points!).   <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">I definitely have a mild case of math-envy, and go out of my way to show that I can drop some equations where relevant. The problem is, this turns into a conventional authority / soporific effect. I&#8217;m not sure how to strike the right balance. I guess you just ask yourself what&#8217;s truly needed for learning the material best. For example, my little section on rearrangement rules seems more &#8220;optional&#8221; than &#8220;needed&#8221;.  <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">I need to define for my reader a &#8220;science of information&#8221; that is not just math. The subject matter (abstract information; statistical inference) implies that it is pure math, but I&#8217;m not sure that&#8217;s right (especially for me!). The whole point of my approach is to redefine information as empirical. This is not just a methodological detail. First and foremost, it&#8217;s my personality. I&#8217;m a scientist in outlook, not a mathematician. I can develop these ideas scientifically (i.e. &#8220;thought experiments&#8221; or computational experiments, or using math as a model just as people do in physics or any other science). It would be better for me to focus this text on my strengths, taking full advantage of the scientific approach that I can contribute, rather than allowing this to become a watered-down math textbook. What are the elements of my &#8220;science of information&#8221;? <span class="anchor"></span><span class="anchor"></span>
<ul>
<li>
<p class="line862">the key principle of <em>operational definitions</em> <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">
<p class="line862">the fundamental distinction between <em>observable</em> vs. <em>hidden</em> states as the foundation for all inference. <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">correspondingly, defining all information as empirical, i.e. measuring our ability to  predict observables.   <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">
<p class="line862">consequently, the focus on being able to <em>compute</em>: first, numerical models of actual data; second, measurements of information yield. <span class="anchor"></span><span class="anchor"></span></p>
</li>
</ul>
</li>
<li class="gap">
<p class="line862">An essential corollary is that I must articulate the fundamental questions of this new science. Each chapter introduction will raise these questions in dialog form, showing that our thinking about basic things is confused and incomplete. This will be a huge improvement over my existing introductions, which tend to be pompous, empty statements of grand intentions. Actually, it would do <em>me</em> a lot of good to have clear statements of these fundamental questions.  It will probably turn out that <em>I</em> am just as confused as everyone else, even about how to articulate what the key questions are.  Let&#8217;s try a few obvious questions: <span class="anchor"></span><span class="anchor"></span></p>
<ul>
<li>is there a quantitative, scientific theory of information? Can &#8220;information&#8221; be measured in a way that solves problems generally? <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">how can we establish a clear framework of operational definitions for the phenomena that matter in this field? E.g. &#8220;observable&#8221; vs. &#8220;hidden&#8221;; &#8220;prediction&#8221; in the absence of an &#8220;objective observer&#8221; etc. <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">what &#8220;counts&#8221; as information? This has a number of confusing aspects (randomness vs. uniformity; &#8220;hidden&#8221; information; mutual information; definition of &#8220;prediction&#8221;), and is the question that empirical information answers. <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">how can we do experiment planning (before we know the result!)? <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">
<p class="line862">what are the requirements for <em>sustainable</em> (unbounded) information production? What is the difference between biological evolution and, say, clouds forming in the sky (or geological formations underground)? What are the requirements for <em>scalable</em> information production, i.e. a powertool? <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">Can this be made a simple, general procedure for discovering any information structure, or solving any problem?</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/08/13/the-feynmanization-of-chapter-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>__getattr__ Considered Harmful</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/08/04/__getattr__-considered-harmful/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/08/04/__getattr__-considered-harmful/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 03:39:57 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[pygr]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/08/04/__getattr__-considered-harmful/</guid>
		<description><![CDATA[I just refactored a number of internal aspects of Pygr&#8217;s object-relational model, to make use of a new pattern I&#8217;m calling &#8220;subclass binding&#8221;, which I&#8217;ll try to explain a bit in this post.  First I&#8217;ll try to explain the problem from the viewpoint of a Python programmer.
Object-relational design makes modularity even more difficult than usual. [...]]]></description>
			<content:encoded><![CDATA[<p class="line862">I just refactored a number of internal aspects of <a href="http://code.google.com/p/pygr" title="The Pygr Project homepage">Pygr</a>&#8217;s object-relational model, to make use of a new pattern I&#8217;m calling &#8220;subclass binding&#8221;, which I&#8217;ll try to explain a bit in this post.  First I&#8217;ll try to explain the problem from the viewpoint of a <a href="http://www.python.org" title="learn about the Python language">Python</a> programmer.</p>
<p class="line862">Object-relational design makes modularity even more difficult than usual. It illustrates a general problem: when you try to combine two different behaviors (e.g. a local Python object and a back-end database) into one object, all sorts of confusion can ensue. <span class="anchor"></span><span class="anchor"></span></p>
<p class="line862"><span id="more-19"></span>My painful experience with annotation objects exemplified this problem. At first it seemed obvious that you want to have combined access to the sequence object and the annotation attributes. But this quickly turned into a nightmare: since there was no way for a user to indicate whether he wants to deal with the object as a sequence or as an annotation, the object constantly has to guess which behavior is desired. This quickly leads to nasty bugs in every case where the guessing policy fails&#8230; The solution was to separate the two behaviors absolutely, by providing a <em>sequence</em> attribute on the annotation object. <span class="anchor"></span><span class="anchor"></span></p>
<p class="line867">&nbsp;</p>
<h2>__setattr__ Considered Harmful</h2>
<p><span class="anchor"></span></p>
<p class="line862">These abstract issues turn painfully concrete when you write <span class="u">__getattr__</span> and <span class="u">__setattr__</span> methods.  These methods do not &#8220;play nice with others&#8221;, to put it mildly.  Any time you write a <span class="u">getattr</span> you create a modularity problem, because all attribute requests will come to this one method. If you later use multiple inheritance (i.e. &#8220;combine two behaviors in one object&#8221; as above) you will be obligated to write a new layer of <span class="u">getattr</span> to act as traffic cop for all the layers of <span class="u">getattr</span> below it.  This does <em>not</em> scale. Complexity begins to grow in a self-reinforcing way. For example, you&#8217;ll immediately start to get infinite loops (e.g. during unpickling, the unpickler will request attributes like <span class="u">reduce</span> and <span class="u">setstate</span> that may not exist, so <span class="u">getattr</span> gets called, it requests some attribute that doesn&#8217;t exist because the object hasn&#8217;t even been initialized yet, so <span class="u">getattr</span> calls itself&#8230;). This leads to what I&#8217;ll call &#8220;protective nonsense&#8221;, i.e. your code gets littered with protective tests to block certain vulnerabilities. <span class="anchor"></span><span class="anchor"></span></p>
<p class="line874">This whole approach is error-prone, unscalable and unmodular.  <span class="anchor"></span><span class="anchor"></span></p>
<p class="line867"><span class="u">setattr</span> makes this problem about a thousand times worse.  Whereas <span class="u">getattr</span> is &#8220;the method of last resort&#8221; (only gets called if the usual methods fail), <span class="u">setattr</span> is pre-emptive: the very act of adding it to a class re-directs <strong>all</strong> attribute writes to this one method.  So you should consider <span class="u">setattr</span> a form of contamination; it takes over everything that it touches.  Note that just the <em>threat</em> of <span class="u">setattr</span> can spread its baleful effect: even if you think a class <em>might</em> someday be subclassed with a <span class="u">setattr</span>, you have to rewrite all your attribute writes to evade it (e.g. by calling <span class="u">setitem</span> on the object&#8217;s <span class="u">dict</span>).  Note to self: this is ridiculous! <span class="anchor"></span><span class="anchor"></span></p>
<p class="line862">In my experience, the uses that <span class="u">getattr</span> and <span class="u">setattr</span> are applied to are usually very modest, and don&#8217;t justify all these disadvantages.  The one case that has some  is when one object strictly mirrors the attributes from another object.<span class="anchor"></span><span class="anchor"></span><span class="anchor"></span></p>
<p class="line867">&nbsp;</p>
<h2>Tentative Conclusions</h2>
<p><span class="anchor"></span></p>
<ul>
<li>
<p class="line891"><em>when in doubt, keep behavior separate</em>. The benefits of completely merging two things into a single object may actually not be very great, compared with simply having a standard way for accessing each object from the other. <span class="anchor"></span></p>
</li>
<li>
<p class="line891"><em>use properties (descriptors) instead of <span class="u">getattr</span> and <span class="u">setattr</span></em>: properties act like normal attributes (and thus are as modular as regular attributes), rather than taking over the class like <span class="u">getattr</span> and <span class="u">setattr</span> do.  I suspect we are biased against creating lots of separate properties when we could achieve the same effect with one <span class="u">getattr</span>() method. But in most cases this is a false economy &#8212; the same amount of code is required, but is handled once at &#8220;compile time&#8221; (by decorating a class with a number of properties) instead of repeatedly on every attribute request (in <span class="u">getattr</span>). The former is better. Perhaps more importantly, conflicting property names could be detected automatically (in theory), whereas sorting out potentially conflicting <span class="u">getattr</span> activities is for experts only. It also seems that properties can be added at any time &#8212; even after the shadow class already exists &#8212; unlike <span class="u">getattr</span> code, which is fixed prior to module import! It&#8217;s also interesting to override the property by simply setting a value in the object dictionary, in which case the property <span class="u">get</span> never gets called. <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">
<p class="line891"><em>This pattern should be done in a totally standard way</em>, specifically my current get_shadow_class() function.   <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">
<p class="line891"><em>I need a better name for this pattern</em> than &#8220;shadow classing&#8221;, which doesn&#8217;t explain anything. &#8220;Instance subclassing&#8221;? &#8220;subclass binding&#8221;? &#8220;automatic subclassing and binding&#8221;? I think a function name like get_bound_subclass() is much better than get_shadow_class(). So maybe &#8220;subclass binding&#8221; is the best suggestion. The name should communicate a couple key ideas <span class="anchor"></span></p>
<ul>
<li>we create a subclass for each database, in order to bind attributes that are specific to that database. <span class="anchor"></span></li>
<li>this is done automatically <span class="anchor"></span><span class="anchor"></span></li>
</ul>
</li>
</ul>
<p class="line867">&nbsp;</p>
<h2>Case Study: SQLSequence</h2>
<p><span class="anchor"></span></p>
<p class="line874">One object both acts as an interface to a row in an SQL database, and as a Pygr sequence object. That means some attributes are mirrored from the database, whereas others are purely local Python data, used for strictly internal purposes. So now we have a problem: how is the code supposed to know which attributes are purely internal, vs. which should be treated as queries to the database? This is obviously crucial for modularity. The SQL row class code should not have any dependency on knowing anything about what other classes it might get mixed with. <span class="anchor"></span><span class="anchor"></span></p>
<p class="line867">&nbsp;</p>
<h3>Proposal</h3>
<p><span class="anchor"></span></p>
<ul>
<li>
<p class="line862">instead of using <span class="u">getattr</span> on the SQL row class, use the shadow class approach and add descriptors (properties) for all the attributes that come from the back-end database. SQLTable already uses the shadow class mechanism, so why not use it to get rid of <span class="u">getattr</span> and <span class="u">setattr</span>? <span class="anchor"></span><span class="anchor"></span></p>
</li>
</ul>
<p class="line867"><strong>Comment</strong>: the current situation is quite a muddle.  SQLTableBase.objclass() is automatically adding <span class="nonexistent">ColumnDescriptor</span> properties in place of all actual SQL columns, in line with what I just proposed, but it clashes with what SQLRow expects (to store id attribute locally). I need to clean this up!! Actually, objclass()&#8217;s usage of the factory pattern is totally unnecessary. Descriptors can be added to a class at any time; that&#8217;s how pygr.Data does it. <span class="anchor"></span><span class="anchor"></span></p>
<p class="line867">&nbsp;</p>
<h2>Generalizing the Persistence Pattern</h2>
<p><span class="anchor"></span></p>
<p class="line862">Another interesting pattern to look at is the <strong>SQLTableBase.new</strong>() method. It calls the object constructor first, then inserts into the DB. The idea here is to preserve the usual distinction between <em>construction</em> (<span class="u">init</span>) vs <em>unpickling</em> (<span class="u">setstate</span>). Reading the object from the database is considered to be a form of persistence, so it gets treated using the unpickling route&#8230; This makes a lot of sense, to put Python&#8217;s built-in support for persistence to work as a systematic solution. The whole <span class="u">reduce</span>, <span class="u">getstate</span>, <span class="u">setstate</span> system is a much more general solution than just for pickling. The obvious implication is that classes like TupleO and SQLRow should be created using the <span class="nonexistent">ClassicUnpickler</span>(klass, state) rather than using the usual constructor pattern klass(**state).  The converse implication is that we should use <span class="u">getstate</span> to obtain the data to save into the database. <span class="anchor"></span><span class="anchor"></span></p>
<p class="line874">Does this make sense or does it clash with normal pickling usage? On the one hand, it does generalize the idea that you can save an object persistently to work equally well in regular pickling and other applications. On the other hand, this is quite different from the pygr.Data concept of &#8220;saving a reference to a persistent object&#8221;. That&#8217;s a separate issue. Two separate layers: <span class="anchor"></span></p>
<ul>
<li>standard persistence: extract the dictionary of attributes required for persistent storage. <span class="anchor"></span></li>
<li>persistent ID: look for a persistent ID to store as a reference, instead of actually saving the data (because we know the data is stored somewhere else, and will always be retrievable using its persistent ID). <span class="anchor"></span><span class="anchor"></span></li>
</ul>
<p class="line874">I&#8217;ve never had to think much about all these things, because almost all my usage has been read-only, accessing existing databases (that were created through other mechanisms). <span class="anchor"></span><span class="anchor"></span></p>
<p class="line867">&nbsp;</p>
<h3>Alternative Models</h3>
<p><span class="anchor"></span></p>
<p class="line874">I think I&#8217;m also confused about whether there&#8217;s a good way to make the object logic completely modular, separate from the storage implementation. There are several patterns to distinguish: <span class="anchor"></span><span class="anchor"></span></p>
<ul>
<li>
<p class="line862">What about &#8220;persistence proxy&#8221; methods, where data is not actually &#8220;unpickled&#8221; into a local object, but instead the object simply acts as a proxy that relays data requests to the persistent store&#8230; SQLRow is an example of this pattern. This doesn&#8217;t fit the standard <span class="u">getstate</span> / <span class="u">setstate</span> model. The persistence issue gets pushed down to the level of each individual attribute, which really means assuming that attributes are &#8220;natively&#8221; persistent, i.e. types that the transport mechanism can automatically convert like int, str, float. <span class="anchor"></span><span class="anchor"></span></p>
</li>
<li class="gap">&#8220;fine-grained persistence&#8221;: Writable classes like TupleRW and wildfire Row write each attribute back to the database immediately; there is no operation to &#8220;save the complete persistent state&#8221;. <span class="anchor"></span><span class="anchor"></span></li>
</ul>
<p class="line874">We often prefer to use these patterns over a &#8220;standard pickling&#8221; model for object-relational interfaces, for several reasons: <span class="anchor"></span></p>
<ul>
<li>
<p class="line891"><strong>memory &amp; speed</strong>: for really large datasets the standard Python attribute model (<span class="u">dict</span>) uses up too much memory.  A tuple or <span class="u">slots</span> can use five-fold less memory, and also be much faster. <span class="anchor"></span></p>
</li>
<li>
<p class="line891"><strong>write behavior</strong>: if the database is &#8220;writable&#8221;, then changing an attribute should be propagated to the database (and probably right away). That implies a descriptor. On the other hand, if the database is read-only, then we again need a descriptor to raise an <span class="nonexistent">AttributeError</span> on any setattr attempt. <span class="anchor"></span></p>
</li>
<li>
<p class="line862">if we want <strong>&#8220;fine-grained&#8221; interaction</strong> between the local object representation and a persistent store (which is typically what you want for an object-relational model). <span class="anchor"></span><span class="anchor"></span></p>
</li>
</ul>
<p class="line867">&nbsp;</p>
<h3>Whole Object Persistence vs. Attribute-level Persistence</h3>
<p><span class="anchor"></span></p>
<p class="line874">This all seems to boil down to just two basic patterns: <span class="anchor"></span></p>
<ul>
<li><em>conventional unpickling / pickling</em> takes the whole object as the unit of persistence: take data out from database, use it until done, then save back to database. This works OK for a read-only pattern (but doesn&#8217;t raise write errors as it should). <span class="anchor"></span></li>
<li><em>attribute-level persistence</em>: the persistence problem is pushed down to the individual attributes, typically with a descriptor handling all the requests. Any kind of proxy or fine-grained persistence uses this pattern. <span class="anchor"></span><span class="anchor"></span></li>
</ul>
<p class="line867">&nbsp;</p>
<h3>Descriptor Categories</h3>
<p><span class="anchor"></span></p>
<p class="line874">There are several kinds of descriptor usages that come up again and again: <span class="anchor"></span></p>
<ul>
<li>
<p class="line891"><strong>proxy</strong>: forwards query to someone else, typically a remote server <span class="anchor"></span></p>
</li>
<li>
<p class="line891"><strong>computed</strong>: computes the requested attribute either by external calls or based on other attributes of the object <span class="anchor"></span></p>
</li>
<li>
<p class="line891"><strong>read-only</strong>: raises appropriate exception if user tries to write the attribute. May also provide attribute interface to a more efficient internal storage mechanism (such as slots or tuple) <span class="anchor"></span></p>
</li>
<li>
<p class="line891"><strong>write-consequences</strong>: writing to this attribute triggers an action, such as value checking, saving to an external server, or other &#8220;consequences&#8221;</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/08/04/__getattr__-considered-harmful/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A model of clarity: Feynman&#8217;s Lectures</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/07/18/16/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/07/18/16/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 02:55:34 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/07/18/16/</guid>
		<description><![CDATA[ I&#8217;ve been thinking about how to make my draft textbook on &#8220;information metrics&#8221; more accessible.  In particular, I&#8217;ve spent some time looking at a text that I admire as very accessible &#8212; Feynman&#8217;s Lectures on Physics &#8212; to see what I could learn.  I thought I&#8217;d post some of my conclusions here.
Feynman achieves a remarkable [...]]]></description>
			<content:encoded><![CDATA[<p class="line874"> I&#8217;ve been thinking about how to make my draft textbook on &#8220;information metrics&#8221; more accessible.  In particular, I&#8217;ve spent some time looking at a text that I admire as very accessible &#8212; Feynman&#8217;s Lectures on Physics &#8212; to see what I could learn.  I thought I&#8217;d post some of my conclusions here.</p>
<p class="line874">Feynman achieves a remarkable combination of intellectual engagement &#8212; plugging you into the fundamental ideas of a problem area &#8212; and accessibility. Conventional textbook treatment uses formalism and jargon to elevate the author and distance the reader from the material. It feels like you are being inducted into the holy mysteries&#8230; which puts most people to sleep. Instead of stimulating your own questioning of the material, it implies that such Difficult and Important Ideas will require long, hard hours of study to get even a glimmer. Feynman could easily come across as &#8220;too smart for a normal human to understand&#8221;, but unlike some writers, that&#8217;s not what he wants. Somehow he is able to prick that bubble effortlessly and give you the feeling of a wonderful tour guide who is going to show you his favorite marvels. No barriers of jargon or &#8220;obfuscation-sophistication&#8221; get in the way of understanding him. He simply refuses the conventional academic tone. He doesn&#8217;t believe in it! <span class="anchor"></span><span class="anchor"></span></p>
<p class="line874"><span id="more-18"></span>There is much for me to learn from Feynman&#8217;s example.  <span class="anchor"></span></p>
<ul>
<li>One key to Feynman&#8217;s accessibility is his ability to break a complex body of material into short, self-contained &#8220;lectures&#8221; (especially in the 3 volume Feynman Lectures in Physics). Each lecture feels like a little guided tour, with very little barrier to entry, rather than &#8220;yet another chapter in a hefty textbook&#8221;. He takes your hand and whisks you off on the tour. Each chapter is only 8 - 10 pages long, which would probably be about 6 - 8 of my laTex pages, given the generous margins reserved in Feynman for his figures.</li>
</ul>
<ul>
<li>He keeps asking questions so basic that even a freshman would be embarrassed to ask them (for fear of being considered a simpleton). By asking fundamental questions, Feynman both reveals how interesting and useful they are, and liberates you (the reader) to ask such questions yourself.</li>
</ul>
<ul>
<li>This plays an important role in making each chapter approachable and self-contained. Each chapter starts with a thought-provoking introduction that asks basic questions anyone can understand &#8212; even if they haven&#8217;t read the preceding chapters. Even though the rest of the chapter gradually gets more technical (and requires background from previous chapters), he continuously re-raises the fundamental questions. Thus, it becomes possible to read Feynman on several different levels. You could read it just for the fundamental questions, observations and theories he presents so intuitively. You could actually learn a lot about physics even if you made little effort to master the equations. Since his math is as clear (and presented as simply) as his text, it will give you another level of understanding. At any rate, a principle emerges: fundamental questions make the material more approachable and easier to understand (on multiple levels), both by exciting our interest and by giving us the &#8220;bigger picture&#8221; in which we can see how each detail fits. Technicalities become integrated rather than fragmented.</li>
</ul>
<ul>
<li>Engaging the reader with fundamental questions can shift his/her relationship with the material from passive to active. Typical undergraduate coursework emphasizes &#8220;knowing the right answer&#8221;. Feynman shows you the importance of asking <em>the right question</em>, and implies that you too could do this, with a little common sense and imagination. Most readers won&#8217;t make that leap, but some will be inspired.</li>
<li class="gap">His tone is conversational. He uses exclamation points and italics liberally, turning the textbook into a conversation with an enthusiast. He peppers each chapter with dialogs that highlight possible confusions and subtleties. For example in a chapter selected at random (8), we find the following dialogs over the course of a few pages:
<ul>
<li class="gap">&#8220;Now, you may say, &#8216;This is all some kind of trivia,&#8217; and indeed it is. How can we describe such a one-dimensional motion&#8230;?&#8221;, which leads into a step by step description of a car&#8217;s motion.</li>
<li class="gap">&#8220;Perhaps you say, &#8216;That&#8217;s a terrible thing&#8211;I learned that in science we have to define <em>everything</em> precisely.&#8217;  We cannot define <em>anything</em> precisely! If we attempt to, we get&#8230; philosophers&#8230; one saying&#8230; &#8216;You don&#8217;t know what you are talking about!&#8217; The second one says, &#8216;What do you mean by <em>know</em>?  What do you mean by <em>talking</em>?  What do you mean by <em>you</em>?,&#8217; and so on.&#8221; <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">&#8220;Zeno produced a large number of paradoxes&#8230; &#8216;Listen,&#8217; he says, &#8216;to the following argument: Achilles runs 10 times as fast as a tortoise&#8230;&#8217;&#8221; <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">&#8220;In order to get to the subtleties in a clearer fashion, we remind you of a joke&#8230; the cop comes up to her and says, &#8216;Lady, you were going 60 miles an hour!&#8217; She says&#8230;&#8221; He follows out the implications of this dialog for 3 paragraphs. <span class="anchor"></span><span class="anchor"></span></li>
<li class="gap">The rest of the chapter follows this spirit of question and answer. He asks a question, tries out an answer, asks another question&#8230; The only difference is that this dialog is not quoted as a conversation between two named characters. Instead, this dialog is between Feynman and the reader. He always addresses the reader as &#8220;you&#8221;, as if he were writing a letter rather than a textbook. He always speaks as &#8220;we&#8221; (&#8221;Now we have to discuss the inverse problem&#8230; Let us say, &#8216;In the first second her speed was such and such&#8230;&#8217; &#8221; ) <span class="anchor"></span><span class="anchor"></span></li>
</ul>
</li>
</ul>
<ul>
<li class="gap">Feynman must have made a conscious decision to favor concepts over technicalities, and to govern the latter with a strict rule of necessity and clarity. His use of math is lucid and compact; he never allows it to take over the text or obscure the fundamental questions. His equations illuminate, and with the minimum effort necessary. This seems only sensible for a freshman course!</li>
<li class="gap">Unlike many theorists, Feynman highlights the difference between science and math, and unabashedly declares his purpose to be scientific. His fundamental questions are about the universe and how it works, not about equations and what we can prove about them. In his lectures math comes second, only when needed to clarify a physics problem. Many theorists don&#8217;t see it this way. They&#8217;re mathematicians first and foremost, devoted mainly to their mathematical model and techniques, and view the physics (especially its empirical side) as a bastardized approximation of the mathematical beauty that interests them. The machismo (and ego) of mathematical rigor often drives this tendency into places where it doesn&#8217;t really help the student. A physics class can easily become a watered-down math course; all you have to do is bring in your favorite mathematical methods, and before you know it&#8230; Feynman vigorously refuses this path.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/07/18/16/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Organization of Biological Networks Workshop Talk</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/03/09/organization-of-biological-networks-workshop-talk/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/03/09/organization-of-biological-networks-workshop-talk/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 03:35:04 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[evolution]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/03/09/organization-of-biological-networks-workshop-talk/</guid>
		<description><![CDATA[This week-long workshop was a highlight of my time at IMA.  I really enjoyed the diversity and excitement of this new field.  Here&#8217;s a video of my talk on HIV drug resistance evolution.
]]></description>
			<content:encoded><![CDATA[<p>This week-long <a href="http://www.ima.umn.edu/2007-2008/W3.3-7.08/">workshop</a> was a highlight of my time at IMA.  I really enjoyed the diversity and excitement of this new field.  Here&#8217;s a video of my talk on <a href="http://www.ima.umn.edu/videos/?id=219">HIV drug resistance evolution</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/03/09/organization-of-biological-networks-workshop-talk/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Seminar 4 at IMA</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/02/29/seminar-4-at-ima/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/02/29/seminar-4-at-ima/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 20:19:54 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[inference]]></category>

		<category><![CDATA[information]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/02/29/seminar-4-at-ima/</guid>
		<description><![CDATA[Yesterday I talked about applications of potential information to experiment planning, using the example of a robot seeking to discover the principles of genetics from the initial observation of a &#8220;mutant&#8221; pea plant with white flowers.  You can listen to the audio (right click on the audio link, and Save Link As, then listen [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I talked about applications of potential information to experiment planning, using the example of a robot seeking to discover the principles of genetics from the initial observation of a &#8220;mutant&#8221; pea plant with white flowers.  You can listen to the <a href="http://www.doe-mbi.ucla.edu/~leec/talks/ima4.amr" title="Right click, and choose Save Link As to download">audio</a> (right click on the audio link, and Save Link As, then listen to the downloaded file using QuickTime player or Real player).  I also captured most of the material I wrote on the <a href="http://www.doe-mbi.ucla.edu/~leec/talks/0335pm28Feb08.pdf">whiteboard</a>.  Some <a href="http://www.doe-mbi.ucla.edu/~leec/talks/ima3-background.pdf" title="draft text">relevant background</a> material (and detailed exposition of the RoboMendel example) is also available.</p>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/02/29/seminar-4-at-ima/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Notes for Third IMA Seminar</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/02/22/notes-for-third-ima-seminar/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/02/22/notes-for-third-ima-seminar/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 23:08:08 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[inference]]></category>

		<category><![CDATA[information]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/02/22/notes-for-third-ima-seminar/</guid>
		<description><![CDATA[Well, I failed to record my seminar audio, but here are some relevant notes for material discussed in the third seminar.  This time we discussed the application of information metrics to experiment planning, rather than just model selection.  One metric that I emphasized this time is the notion of potential information, which provides [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I failed to record my seminar audio, but here are some relevant <a href="http://www.doe-mbi.ucla.edu/~leec/talks/ima3-background.pdf" title="PDF notes">notes</a> for material discussed in the third seminar.  This time we discussed the application of information metrics to experiment planning, rather than just model selection.  One metric that I emphasized this time is the notion of <em>potential information</em>, which provides a signal for whether the current model needs to be expanded because its fit to the observations is inadequate.  The attached material discusses some concrete examples of potential information, for example, for experiment planning.</p>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/02/22/notes-for-third-ima-seminar/feed/</wfw:commentRss>
		</item>
		<item>
		<title>HIV Drug Resistance Evolution Talk at IMA</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/02/20/hiv-drug-resistance-evolution-talk-at-ima/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/02/20/hiv-drug-resistance-evolution-talk-at-ima/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 22:16:11 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[evolution]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/02/20/hiv-drug-resistance-evolution-talk-at-ima/</guid>
		<description><![CDATA[I gave a talk today on my lab&#8217;s work on HIV drug resistance evolution and conditional selection pressure &#8220;networks&#8221;.  The slides and audio are available here (to download the audio right-click the link and select Save Link As&#8230;).  To listen to the audio you can use the QuickTime player or Real player.  [...]]]></description>
			<content:encoded><![CDATA[<p>I gave a talk today on my lab&#8217;s work on HIV drug resistance evolution and conditional selection pressure &#8220;networks&#8221;.  The <a href="http://www.doe-mbi.ucla.edu/~leec/talks/IMA_HIV_08.pdf" title="slides in PDF format">slides</a> and audio are available here (to download the <a href="http://www.doe-mbi.ucla.edu/~leec/talks/IMA_HIV_08.amr" title="Right-click and Save Link As...">audio</a> right-click the link and select Save Link As&#8230;).  To listen to the audio you can use the QuickTime player or Real player.  For our publications on this topic, see our <a href="http://www.uclaaccess.ucla.edu/UCLAACCESS/Web/Faculty.aspx?ri=434" title="current publications list">publications page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/02/20/hiv-drug-resistance-evolution-talk-at-ima/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Empirical Information as a metric for Statistical Inference</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/02/15/empirical-information-as-a-metric-for-statistical-inference/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/02/15/empirical-information-as-a-metric-for-statistical-inference/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 20:14:49 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[inference]]></category>

		<category><![CDATA[information]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/02/15/empirical-information-as-a-metric-for-statistical-inference/</guid>
		<description><![CDATA[Here are my slides for my second talk at IMA on Feb. 14.  I tried to introduce some problems with typical information metrics as they apply to statistical inference problems.  Then I describe empirical information, my preferred information metric for statistical inference.  The slides are available as a PDF, and the audio [...]]]></description>
			<content:encoded><![CDATA[<p>Here are my slides for my second talk at <a href="http://www.ima.umn.edu">IMA</a> on Feb. 14.  I tried to introduce some problems with typical information metrics as they apply to statistical inference problems.  Then I describe empirical information, my preferred information metric for statistical inference.  The <a href="http://www.doe-mbi.ucla.edu/~leec/tb/ima2.pdf" title="seminar slides">slides</a> are available as a PDF, and the audio of the talk is also available &#8212; you can use either RealPlayer or the Quicktime player to listen to this.  To download the audio, right-click on <a href="http://www.doe-mbi.ucla.edu/~leec/tb/IMA2.amr" title="right-click this link, then choose Save Link As...">this link</a> and choose Save Link As&#8230;</p>
<p>I&#8217;ve also posted some <a href="http://www.doe-mbi.ucla.edu/~leec/tb/ima2-background.pdf" title="PDF material cut from chpt 2-5">background material</a> cut from different chapters of my draft textbook as a PDF.</p>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/02/15/empirical-information-as-a-metric-for-statistical-inference/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chapter 1 on probabilistic inference</title>
		<link>http://thinking.bioinformatics.ucla.edu/2008/02/07/chapter-1-on-probabilistic-inference/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2008/02/07/chapter-1-on-probabilistic-inference/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 21:46:31 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[inference]]></category>

		<category><![CDATA[information]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2008/02/07/chapter-1-on-probabilistic-inference/</guid>
		<description><![CDATA[Here are a couple of items relevant to my Feb. 7 intro session at IMA:

Chapter 1 draft introduction to probabilistic inference.
 Paper on identification of SNPs from EST chromatogram data.

]]></description>
			<content:encoded><![CDATA[<p>Here are a couple of items relevant to my Feb. 7 intro session at IMA:</p>
<ul>
<li><a href="http://www.doe-mbi.ucla.edu/~leec/chapter1.pdf" title="Download chapter1.pdf">Chapter 1</a> draft introduction to probabilistic inference.</li>
<li> Paper on <a href="http://www.doe-mbi.ucla.edu/~leec/irizarry2000.pdf" title="reprint">identification of SNPs</a> from EST chromatogram data.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2008/02/07/chapter-1-on-probabilistic-inference/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pygr.Data in A Web Browser!</title>
		<link>http://thinking.bioinformatics.ucla.edu/2007/11/26/pygrdata-in-a-web-browser/</link>
		<comments>http://thinking.bioinformatics.ucla.edu/2007/11/26/pygrdata-in-a-web-browser/#comments</comments>
		<pubDate>Mon, 26 Nov 2007 10:22:19 +0000</pubDate>
		<dc:creator>leec</dc:creator>
		
		<category><![CDATA[browser]]></category>

		<category><![CDATA[pygr]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://thinking.bioinformatics.ucla.edu/2007/11/26/pygrdata-in-a-web-browser/</guid>
		<description><![CDATA[I&#8217;ve been hacking a bit with Silverlight, Microsoft&#8217;s environment for running dynamic languages like Python and Ruby directly within a web browser like Firefox or IE.  It seems to work quite well, and it&#8217;s easy to get Python code up and running in Silverlight.  Indeed, it&#8217;s been surprisingly easy to get quite significant [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been hacking a bit with <a href="http://www.voidspace.org.uk/ironpython/silverlight/index.shtml">Silverlight</a>, Microsoft&#8217;s environment for running dynamic languages like <a href="http://www.python.org">Python</a> and Ruby directly within a web browser like Firefox or IE.  It seems to work quite well, and it&#8217;s easy to get Python code up and running in Silverlight.  Indeed, it&#8217;s been surprisingly easy to get quite significant chunks of Python running in Silverlight &#8212; specifically, <a href="http://www.bioinformatics.ucla.edu/pygr" title="Python Graph database framework for bioinformatics">pygr</a>, including large portions of code originally written for Pyrex (a mixed C / Python language environment).  First I&#8217;ll describe my impressions of Silverlight and its implications for Python, then what I&#8217;ve accomplished with it.</p>
<p><span id="more-10"></span>I think Silverlight potentially has a lot of importance for Python for several reasons.  Its basic function is fairly amazing: it lets you run Python inside your web browser with complete control over the web page contents and interactivity.  Those of us who feel that the web browser is the logical place for many kinds of interactive documents, visualization and rapid prototyping, but want to use a real language (instead of Javascript!), finally have a solution.  This is exciting!  It is thrilling to be creating interactive web pages whose interactivity is all done by Python code  &#8212; forget all that JavaScript!</p>
<p>But Pythonistas should also pay attention to Silverlight as a potential threat: this is Microsoft&#8217;s attempt to hijack Python&#8217;s many virtues and put them to work for Microsoft.  For example, Silverlight runs IronPython, and as such lacks most of the Python standard libraries that Pythonistas know and rely on.  In their place it gives you access to .NET.  Similarly, it redirects you away from open standards like SVG and into Microsoft&#8217;s WPF (Windows Presentation Framework?).  The concern here is that huge numbers of .Net and web developers will be taught a Python that is Not Python, i.e. they will be taught to write code that can&#8217;t run in standard Python, or indeed anywhere outside of Microsoft&#8217;s IronPython.  The good news, I think, is that Python is too dynamic to box in this way; it is very easy to port Python standard libraries to run in Silverlight.  I think Pythonistas should push very hard to provide as complete as possible a standard library for IronPython and Silverlight, so that developers in those environments are not forced over to the Dark Side.</p>
<p>Another interesting possibility is that Silverlight is the &#8220;restricted execution environment&#8221; Python has always lacked.  Python code running in Silverlight supposedly has no access to the file system or system calls, and no way to read or alter user files.  Since it runs in the web browser, and executes code sent by potentially malicious websites, logically it would have to be secure in this sense, or it will be worse than useless for Microsoft&#8217;s purposes.  Taking a cynical view, if Silverlight takes off, hackers are going to be attacking it from every angle, and Microsoft will be forced to patch up the holes.  So over time, Silverlight could evolve into a safe &#8220;sandbox&#8221; where you can run code that you want to confine to very limited privileges.</p>
<p>OK, so what have I done with Silverlight?</p>
<ul>
<li>I ported a fair number of missing standard library modules to get my own code working.  The most significant are <strong>pickle</strong>, <strong>types</strong>, <strong>xmllib</strong>, <strong>xmlrpclib</strong>, and <strong>urllib</strong> (only some functions; Silverlight already provides http connection objects).  This was amazingly easy.</li>
<li>I mainly did this to create an XML-RPC connection back to the server.  Silverlight 1.1 alpha refresh is restricted to only access the same server that the code was retrieved from.  I&#8217;ve written a combined HTTP/XML-RPC server (in Python, naturally, it&#8217;s dead easy) so that my Python code in Silverlight can communicate with the server via XML-RPC.  This is incredibly easy, just as you&#8217;re used to doing in Python:<br />
<code>import xmlrpclib<br />
server = xmlrpclib.ServerProxy('http://localhost:8000')<br />
result = server.some_method(*args)</code><br />
I will make all this available so Pythonistas can start playing with this by quickly launching the server and simply pointing their web browser at it.</li>
<li>I&#8217;ve got almost all of Pygr, including Pygr.Data, running in Silverlight.  The one module that required some porting was <strong>cnestedlist</strong>, which was written in a combination of C and Python.  I had to convert some things to pure Python and get rid of other things that aren&#8217;t relevant in Silverlight (e.g. file IO).</li>
<li>I have pygr.Data working great in Silverlight.  That is, the server is running an XML-RPC pygr.Data server, and in Silverlight I can just import pygr.Data as usual and immediately do everything I would usually do i.e. get both sequence databases / sequences and alignment databases (NLMSA) and work with them exactly as if I were in my usual Python interpreter.  This is a little mind blowing.  I can&#8217;t wait to demo this with access to a 28 vertebrate genome alignment in Firefox!</li>
<li>I&#8217;ve been learning all this in part via Michael Foord&#8217;s very helpful <a href="http://www.voidspace.org.uk/ironpython/silverlight/index.shtml#ironpython-silverlight" title="info on using Python in Silverlight">Silverlight / IronPython</a> pages.  I used his simple interactive console code to try all this out by hand.  But I hit a lot of crashes that killed Firefox.  At first I just thought Silverlight 1.1 alpha is really buggy, but finally I realized that the problem is not Silverlight itself, but apparently the interactive console.  When I just run my code directly in Silverlight (not through his interactive console) the crashing goes away.  I wrote my own much simpler interactive console to eliminate all that crashing.</li>
<li>Things I haven&#8217;t figured out: proper traceback printing; Silverlight&#8217;s odd handling of hierarchical module names.  It doesn&#8217;t seem to be able to handle them, so to start with I just put the pygr modules in a single directory and access them as <strong>import seqdb</strong> instead of <strong>from pygr import seqdb</strong>.  I had to kluge pickle.unpickling to follow this convention too.</li>
</ul>
<p>I will post a tar of the source code tomorrow, and update this page to link to it.  But now to bed.</p>
]]></content:encoded>
			<wfw:commentRss>http://thinking.bioinformatics.ucla.edu/2007/11/26/pygrdata-in-a-web-browser/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
