<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Aaron Meurer&#039;s SymPy Blog</title>
	<atom:link href="http://asmeurersympy.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://asmeurersympy.wordpress.com</link>
	<description>My blog on my work on SymPy and other fun stuff.</description>
	<lastBuildDate>Mon, 30 Jan 2012 02:50:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='asmeurersympy.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/51b9e231856e8bf6de4f10e8251149d5?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Aaron Meurer&#039;s SymPy Blog</title>
		<link>http://asmeurersympy.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://asmeurersympy.wordpress.com/osd.xml" title="Aaron Meurer&#039;s SymPy Blog" />
	<atom:link rel='hub' href='http://asmeurersympy.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Vim vs. Emacs (Part 3)</title>
		<link>http://asmeurersympy.wordpress.com/2012/01/13/vim-vs-emacs-part-3/</link>
		<comments>http://asmeurersympy.wordpress.com/2012/01/13/vim-vs-emacs-part-3/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 23:01:39 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1077</guid>
		<description><![CDATA[See parts 1 and 2. Some more comments after using emacs for a while: I finally found the perfect tab completion solution. It took way too much searching for how awesome it is. It&#8217;s called auto-complete-mode. The best way to get an idea of what this is is to watch this screencast. Basically, it shows [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1077&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>See parts <a href="http://asmeurersympy.wordpress.com/2011/12/20/vim-vs-emacs-part-1/">1</a> and <a href="http://asmeurersympy.wordpress.com/2012/01/03/vim-vs-emacs-part-2/">2</a>.</p>
<p>Some more comments after using emacs for a while:</p>
<li>I finally found the perfect tab completion solution. It took way too much searching for how awesome it is.  It&#8217;s called <a href="http://cx4a.org/software/auto-complete/manual.html">auto-complete-mode</a>.  The best way to get an idea of what this is is to watch <a href="http://www.youtube.com/watch?v=rGVVnDxwJYE">this screencast</a>.  Basically, it shows you a completion list automatically.  It uses the <em>TAB</em> key to do completion (to me, this is a no brainer, but for some reason, no other completion extension that I found did this, requiring you to do all kinds of nonsense in your .emacs file).  It&#8217;s got cool features like simple fuzzy matching and intelligent matching (so the first completion is what you tend to use, instead of just the first one that matches).  To quote the author, &#8220;a goal of auto-complete-mode is to provide a system that does what users want without any command.&#8221; I couldn&#8217;t agree with that goal more. If you install it, I recommend adding <code>(define-key ac-mode-map (kbd "M-TAB") 'auto-complete)</code> to your .emacs, so that you can use M-TAB to force the completion menu to come up.  This generally happens automatically, but I think this is the only way to get fuzzy matching, for example. Actually, you can also just use <code>(ac-set-trigger-key "TAB")</code>, which intelligently sets TAB to complete or indent, based on which one you more likely want.  This seems to work pretty well to me.</li>
<li>Speaking of indenting, emacs has a pretty nice indentation feature for Python.  You just press <code>TAB</code> repeatedly, and it cycles through all the syntactically legal indentations.  I find this to be more useful than the usual <code>TAB</code> indents behavior of most editors. Note that by default, it won&#8217;t automatically indent, even with trivial indentations (i.e., keeping the previous indentation).  This is easy to fix, though.  Just add <code>(define-key global-map (kbd "RET") 'newline-and-indent)</code> to your .emacs file.  This will make <code>RET</code> do the same thing as <code>C-j</code>, i.e., basically the equivalent of <code>RET TAB</code>.</li>
<li>emacs comes with an extension that lets you work with version control systems, called VC.  I don&#8217;t use it.  I don&#8217;t like stuff messing with my git stuff behind my back (sounds like a good way to lose data to me), and I&#8217;m good enough with git commands straight that I don&#8217;t need the help.
<p>But unlike all the other hundreds of emacs features that I don&#8217;t use, this one was seriously slowing down my workflow.  It adds three or four seconds to the startup time of emacs when loading from within a git repository.  So I did some Googling and added this to my .emacs file:</p>
<p><pre class="brush: plain;">
;; Disable all the version control stuff         
;; Makes emacs load much faster inside git repos 

(setq vc-handled-backends nil)
</pre></p>
<p>(<em>unrelated: Why doesn&#8217;t WordPress support lisp as a language for syntax highlighting?</em>)</p>
<p>This disables the version control stuff, making emacs load fast again (virtually as fast as vim, actually).
</li>
<li>Speaking of making emacs go faster, make sure you compile all your extensions into byte code.  For whatever reason, emacs doesn&#8217;t do this automatically, even though compiled files run much faster, and it doesn&#8217;t take very long.  The easiest way is to use <code>M-x byte-compile-file</code> from within emacs.  Just make sure that if you modify the .el file that you recompile the byte code, or it will continue to use the old version.</li>
<li>I finally figured out how to enable mouse support.  For whatever reason, Googling got me nowhere with this, so I ended up asking on the <a href="https://lists.gnu.org/mailman/listinfo/help-gnu-emacs">help-gnu-emacs</a> list, which was very helpful.  The solution is to put
<p><pre class="brush: plain;">
;; ===== Enable mouse support ====
                                      
(require 'xt-mouse)                   
(xterm-mouse-mode)
</pre></p>
<p>in your .emacs file.  And then it just works.  It needs some tweaking (e.g., it doesn&#8217;t play so well with momentum scrolling), but at least it works. I thought I was going to hang myself without mouse support. Because frankly, as good as the movement commands are, moving with the mouse is so much easier sometimes (the same is true for vim too, btw).</li>
<li>I compiled the git version of emacs (it&#8217;s not very hard btw).  I did this to see if the mouse suport &#8220;bug&#8221; was fixed there, but I&#8217;ve gone ahead and kept using it, as it&#8217;s nicer.  But I didn&#8217;t figure out how to configure it to not load in an X window. So for now, I&#8217;ve aliased <code>emacs</code> to <code>emacs -nw</code>. I&#8217;m sure I just need to add some flag to <code>configure</code>, but I haven&#8217;t gotten around to looking it up yet.</li>
<li>I found out how to allow editing in the Isearch mode (again, thanks to the help-gnu-emacs list).  You need to install the <a href="https://github.com/asmeurer/dotfiles/blob/master/.emacs.d/lisp/isearch%2B.el">isearch+</a> extension, add the following to your .emacs,
<p><pre class="brush: plain;">
;; ===== isearch+ =====         

(require 'isearch+)
</pre></p>
<p>and most importantly, you need to edit the file and uncomment all the commmands you want to allow.  If you follow my link above, it goes to my personal dotfiles repo, where I&#8217;ve already done that.</li>
<li>On a related note, this is the first of several emacs extensions I&#8217;ve installed that I&#8217;ve edited the extension file itself for.  The rest, I just had to add some code to .emacs.  In most cases, there was already a variable or suggested code snippet to add to .emacs to get what I wanted.
<p>On the other hand, with vim, I had to edit virtually every extension I installed to make it do what I want.  I&#8217;m not sure what this means, though.  It could be a statement about one of many things: how the emacs community provides nicer defaults, how the vim language is easier to use, and hence more inviting for me to edit the files, or how I haven&#8217;t gotten around to messing with certain things yet.</li>
<li>If you do a lot of work with LaTeX, check out <a href="http://www.gnu.org/software/auctex/">AUCTeX</a>. I haven&#8217;t used it enough yet to say much about it, but from what I&#8217;ve played around with, it&#8217;s pretty awesome.  And if you use a windowed version of emacs, it&#8217;s got a really awesome preview mode.</li>
<li>If you&#8217;re bored, check out the <a href="http://www.dr-qubit.org/predictive/predictive-user-manual/html/index.php">predictive</a> extension.  It&#8217;s actually not as helpful as you&#8217;d think (unlike the very similar auto-complete-mode module mentioned above).  But it&#8217;s kind of cool to turn on and play around with when you&#8217;re typing something.  Maybe you&#8217;ll learn new words or something.</li>
<li>I could go on and on.  I haven&#8217;t mentioned the most basic customizations (like how to setup four-space tabs).  If you are starting to use emacs, I recommend going through <code>M-x customize</code>, and reading my <a href="https://github.com/asmeurer/dotfiles/blob/master/.emacs"><code>.emacs</code></a> file.  And my best advice: if you want emacs to do something, first do <code>M-x customize</code> and search for what you want (EDIT: apparently searching customize requires emacs 24, i.e., the development version).  If you don&#8217;t find what you want there (and you will surprisingly often), search Google.  There are so many emacs users, that the chances of someone else wanting what you want are very likely. I&#8217;ve found the results from the <a href="http://www.emacswiki.org/">emacs wiki</a> to be particularly helpful. And one more thing: if you find an extension you like, double check first to see if it&#8217;s not already included in emacs. Emacs seems to like including good extensions in future releases, so an older extension has a good chance of already being included.</li>
<p>Some emacs questions:</p>
<li>I tried <code>(define-abbrev global-abbrev-table "Ondrej" "Ondřej")</code>, so that when I type Ondrej it give me Ondřej.  But it doesn&#8217;t work.  Is this a bug or what? If I do <code>(define-abbrev global-abbrev-table "foo" "bar")</code> and type &#8220;foo&#8221;, it turns into &#8220;bar&#8221;, but the above leaves Ondrej alone.</li>
<li>Is there a way to reload .emacs without closing emacs? I&#8217;m doing that a lot these days.</li>
<li>Is there a good emacs equivalent of the vim <a href="http://www.vim.org/scripts/script.php?script_id=273">tag list plugin</a>  (thanks for commenter Scott for pointing me to that in the first place)?  I just want something that lists all the class and function definitions in a Python file in order, so I can easily jump to the one I want, or just get an overview of the file.  </li>
<p>This Tuesday will mark the point where I will have spend as long using emacs as I did using vim. But already, I feel more competent with emacs.  I won&#8217;t repeat what I said in my last post, but I just want to say that the ability to edit and write at the same time makes me way more productive.  The fact that it uses keyboard shortcuts that I&#8217;m already used to probably helps a lot too.  Even so, I&#8217;ve not used any kind of cheat sheet for emacs (since I never really found any that were any good), and yet I feel like I&#8217;ve memorized more key commands now than I ever did with vim, for which I did use a <a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html">cheat sheet</a>.  </p>
<p>So I really don&#8217;t see myself going back to vim at this point.</p>
<p>I&#8217;m actually surprised.  Virtually everyone I know who uses a command line editor uses vim.  It&#8217;s definitely the more popular of the two.  But having tried both, I can only speculate as to why.  Vim has a much higher learning curve than emacs.  Everybody grows up learning how to write text in editors like Microsoft Word, TextEdit, Notepad, etc., that all work fundamentally like emacs: if you type text, it enters the text.  If you want to do advanced editing with the keyboard, you hold down some meta keys and type chorded keyboard shortcuts.  The vim modal editing methodology is so different from this, that it surprises me that so many people go to the trouble of learning it (I mean, to the point that they are more efficient with it).  I can see the benefit over GUI editors, which have nothing on either vim or emacs with regards to customization, or just the plain editing power that is really necessary for coding. My guesses why people use vim:</p>
<li>They are shown vim first, so just use it.
</li>
<li>They are turned off by the massiveness of emacs (it seems contradictory to me, since the whole point of using a command line editor is to get more power, but I could see it).
</li>
<li>They are turned off by emacs lisp.
</li>
<li>Some combination of those.</li>
<p>Maybe the vim users out there could comment why they use vim.  Am I missing something?  Or are your heads just wired differently from mine? And if you use emacs (or anything else), I&#8217;d love to hear from you too?</p>
<p>At any rate, I recommend that anyone who wants to give command line editors a chance do what I did: learn both vim and emacs.  My blog posts should be enough to give you some good advice.  I went cold-turkey, and I recommend that you do too, but only do it if you won&#8217;t have any important editing to do for a few weeks, as your editing rate will slow down a lot as you are learning for both editors.  And even though I think I am going to stick with emacs, learning vim was still valuable.  Unlike emacs, vi is part of the POSIX standard, so it&#8217;s included in pretty much every UNIX distribution.  I&#8217;ll be glad when I find myself on a minimal command line and know how to use a decent text editor.  And anyway, you can&#8217;t really know which one will be your way until you try them both.  I really thought I would end up using vim, as it was so popular among all the people I know who use command line editors. But I guess there is only <a href="http://www.dina.dk/~abraham/religion/">One True Editor</a>.</p>
<p><strong>EDIT:</strong> I found out how to make emacs really fast.  The key is to run one process of emacs in daemon mode, and have the rest connect to that.  Then you only have to wait for the startup once (per computer session).  To do it, just set your <code>EDITOR</code> to <code>'emacsclient -a "" -nw'</code> (and you might also want to alias <code>emacs</code> to that as well).  What this does is connect to the emacs daemon.  The <code>-a ""</code> starts one if it isn&#8217;t already started (you can also do this yourself with <code>emacs --daemon</code>.  If you only want to use the daemon version if you&#8217;ve specifically started it, replace <code>""</code> with <code>emacs</code>.  This will connect to the daemon if it&#8217;s running, and otherwise just start a new emacs process.  </p>
<p>The <code>-nw</code> keeps it from running in window mode.  Remove this if you use the GUI version of emacs.  This is necessary to make it work correctly with multiple tabs.  This is so fast that you should never really even need to use <code>C-z</code> to quickly exit emacs.  <code>C-x C-c</code> is just fine, because reopening will be instantaneous.  I like this because I was starting to accumulate background emacs processes that I forgot about.</p>
<p>This probably requires a fairly new version of emacs, possibly even the development version.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1077/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1077/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1077/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1077/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1077/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1077/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1077/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1077/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1077&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2012/01/13/vim-vs-emacs-part-3/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>Vim vs. Emacs (Part 2)</title>
		<link>http://asmeurersympy.wordpress.com/2012/01/03/vim-vs-emacs-part-2/</link>
		<comments>http://asmeurersympy.wordpress.com/2012/01/03/vim-vs-emacs-part-2/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 07:30:37 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1070</guid>
		<description><![CDATA[As I noted in part 1, I have decided to switch to a command line text editor. I decided that, to be fair, I would try both vim and emacs. And to force myself to learn them, I decided to use them cold-turkey. Since I&#8217;m going cold-turkey, I am doing this over my break from [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1070&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As I noted in <a href="http://asmeurersympy.wordpress.com/2011/12/20/vim-vs-emacs-part-1/">part 1</a>, I have decided to switch to a command line text editor.  I decided that, to be fair, I would try both vim and emacs.  And to force myself to learn them, I decided to use them cold-turkey.  </p>
<p>Since I&#8217;m going cold-turkey, I am doing this over my break from classes, so that I can weed out any difficulties during a period when I can live with slow text editing if necessary.  This is a one month break.  I have reached (roughly) the half way point.  For the first half, I used nothing but vim to edit text.  Now, I will use nothing but emacs.</p>
<p>Now that I&#8217;ve stopped using vim (for now anyway), my view of it isn&#8217;t much different from what I wrote in the first part.  A lot of things there were addressed by commenters (or rather commenter).  I still feel that it&#8217;s not an a method of text editing that fits my head.  My entire life, I&#8217;ve used text editors where typing inserts text, and various control characters do things like move around faster.  </p>
<p>Enter emacs. It does exactly this.  Also a ton more.</p>
<p>I&#8217;ve only been using emacs for two days, but here are my impressions so far:</p>
<li><strong>The tutorial is better.</strong>  When you start emacs, it tells you how to start the tutorial.  Just type <code>C-h t</code> (if you don&#8217;t already know, in emacs <code>C-</code> means <code>CTRL-</code> and <code>M-</code> means <code>ALT-</code>).  Like I said last time, the very first thing you learn is how to scroll by more than one line at a time.  That turns out to be a very useful thing to do.  Also, the emacs tutorial did a better job of explaining how to use multiple files at once in emacs, which is something that I still don&#8217;t really know how to do very well in vim.
<p>I have to give the vim tutorial some credit for one thing, though.  It has better interactive examples.  For example, in the vim tutorial, you have stuff like </p>
<p><pre class="brush: plain;">
  1. Move the cursor to the second line in the phrase below.
  2. Type  dd  to delete the line.
  3. Now move to the fourth line.
  4. Type   2dd   to delete two lines.

---&gt;  1)  Roses are red,
---&gt;  2)  Mud is fun,
---&gt;  3)  Violets are blue,
---&gt;  4)  I have a car,
---&gt;  5)  Clocks tell time,
---&gt;  6)  Sugar is sweet
---&gt;  7)  And so are you.
</pre></p>
<p>whereas in the emacs tutorial, you just have</p>
<p><pre class="brush: plain;">
&gt;&gt; Kill a line, move around, kill another line.
   Then do C-y to get back the second killed line.
   Then do M-y and it will be replaced by the first killed line.
   Do more M-y's and see what you get.  Keep doing them until
   the second kill line comes back, and then a few more.
   If you like, you can try giving M-y positive and negative
   arguments.
</pre></p>
<p>which is a little more vague.  So I have to give vim credit for that.  </li>
<li><strong>Everything&#8217;s a buffer.</strong> This line from the emacs tutorial really stuck with me: &#8220;ANY text you see in an Emacs window is always part of some buffer.&#8221;  Emacs has really a awesome editing model, even simple things like <code>M-f</code> and <code>M-b</code> to move around words at a time, or <code>M-DEL</code> to delete whole words make things <strong>way</strong> faster.  Vim of course has all of these too, albiet in a different way, but they aren&#8217;t everywhere.  In emacs, everything is a buffer, which just means that everything supports all the standard emacs commands.  So if you type <code>M-x</code> (roughly the equivalent of vim&#8217;s <code>:</code>) and start typing a command, you can move around and edit your command with emacs commands.  One of the things that bothered me about vim was that when I was typing something with <code>:</code>, I couldn&#8217;t use vim&#8217;s text moving/modifying commands to manipulate the text.  Typing ESC just canceled the command.
<p>Exceptions: There are at least two exceptions I&#8217;ve found to this rule.  First, if you do a search with <code>C-s</code> or <code>C-r</code>, no control commands work.  If you type a search string, and then type <code>M-DEL</code> to try to delete the last word in your search string, you will instead delete the word where the cursor is!  The solution I think is to use something like <code>M-x re-builder</code> instead.  This was a little slow in my tests.</p>
<p>Second, the emacs manual is presented in the <code>info</code> program, which uses completely different key commands from every other program.  This irked me quite a bit, because as soon as I finished the emacs tutorial, it pointed me to the manual, which was in <code>info</code>.  Then, the first thing in <code>info</code> is a tutorial on how to use <code>info</code>!  I opted to skip this.  If I need any information on emacs, I&#8217;ll just do a Google search anyway, so I found this to be a waste of time.</li>
<li><strong>It&#8217;s a little slower.</strong> I do notice a speed difference between emacs and vim.  vim is much more lightweight, and it shows.  Starting up emacs takes a second or two.  Also, since a lot of the features are more interactive, they suffer from a speed delay.  It&#8217;s not nearly slow enough to be a serious issue, though, and it&#8217;s still way faster than the GUI program I was using before (start up time).
<p>The emacs tutorial suggests using <code>C-z</code> whenever you want to only temporarily close emacs.  This seems like a good idea, and has worked pretty well for me so far (though I still usually close the whole thing with <code>C-x C-c</code> out of habit).</p>
<p>On a related note, I noticed that doing type-ahead while waiting for emacs to start up didn&#8217;t always work, whereas it always worked in vim (I do this, e.g., when waiting for the editor to start up when writing commit messages).</li>
<li><strong>It&#8217;s way more user-friendly.</strong> Note that this is of course a relative term.  I mean more user-friendly than vim, and pretty user-friendly for a command line program.  Obviously, the most user-friendly text editors are the GUI ones used by the majority of the population (for that very reason).  Actually, both vim and emacs are user-unfriendly in that if you accidentally open them and don&#8217;t know what they are or how to use them, you have no idea how to close them.  But even <code>less</code> (i.e., <code>man</code>) is technically like this.
<p>I&#8217;m not even referring to the different editing &#8220;modes&#8221; of the two editors, though you could easily argue that emacs style editing is more user-friendly than vim style editing. What I mean here is that emacs interaction is nice. When you type <code>:</code> in vim, start typing a command, and type <code>TAB</code>, it enters the first completion, regardless if it&#8217;s unique.  Pressing <code>TAB</code> multiple times give the rest.  In emacs, if you type <code>M-x</code> and start typing a command and type <code>TAB</code>, it pops up a temporary window with the list of all completions.  It even colors the next character, so you can easily see what to type next to get what you want.  As soon as you enter the command, the window disappears. (yes, I know about <code>CTRL-D</code> in vim, but to me tab completion should <em>always</em> work like it does in bash: complete characters if and only if they are unique in the list of completions)</p>
<p>By the way, when I said everything&#8217;s a buffer, I mean everything.  If you want, you can exit the <code>M-x</code> entry (type <code>C-g</code>), type <code>C-x C-b</code> to show the list of buffers, <code>C-x o</code> to switch to it, scroll down to &#8220;Completions&#8221;, press Enter, and actually get in the completion list, as a buffer (there&#8217;s probably a less complicated way to get to it, by the way).  You can then do whatever your heart fancies with it (save it to a file, copy it, whatever).</li>
<li><strong>Customization is harder.</strong> This was expected, since I already knew that emacs used lisp.  vim uses a language that is really easy to understand.  I was able to modify all the vim plugins I installed very easily.  If you want to change a setting globally in vim, just Google it and add one line to your .vimrc.   In emacs, everything is in Emacs Lisp.  I suppose prior experience with Lisp would probably help here.
<p>In the vim tutorial, near the end, it told how to create a .vimrc file, and even gave a very useful sample one as a starter.  In emacs, it took me a while to figure out how to do the equivalent (it took me a few Google searches just to figure out that the name of the configuration file in emacs is .emacs).  </p>
<p>Actually, the emacs equivalent is way better than in vim, but it isn&#8217;t really mentioned anywhere. It took me probably a dozen Google searches before I learned about it (granted, I was looking for things in the same way I did for vim, lines to add to .emacs). What you have to do is type <code>M-x configure</code>.  This opens what is basically a huge preferences dialog for emacs.  You can then go through and set just about every settable emacs setting from there.  The interface is very nice, as it&#8217;s interactive and tells you all about each setting.  And you never have to touch Lisp.  I&#8217;m still going through it, so I can&#8217;t comment more on it yet.  But I recommend doing <code>M-x configure</code> as soon as you have finished the tutorial and have gotten used to editing with emacs, as you are invariably going to want to change some things (though I should note that emacs generally has nicer defaults than vim).</li>
<li><strong>Better text editing methodology?</strong> Like I&#8217;ve already mentioned a bunch of times, the emacs editing model seems to fit my head better than the vim model.  In emacs, you type text, and it inserts the text.  If you want to do some advanced modification or move around, you type a control sequence.  In vim, you type characters, and it does modifications or moves around.  If you want to type text, you type <code>i</code> (or one of a few other characters) and type it.  Then, if you want to move around or modify the text, you have to press <code>ESC</code>.  This so-called &#8220;modular editing&#8221; doesn&#8217;t seem to work for me.  For one thing, I like to rapidly switch back and forth between these two &#8220;modes&#8221; (editing and inserting) when I write things.  I type too fast and write something wrong, and have to delete some stuff. The <code>M-DEL</code> emacs command is probably my most used (this also works in Mac OS X text dialogs, so I&#8217;m used to it already).  In vim, there is <code>CTRL-w</code> and a few others, but if I want to do something more advanced, like rearranging a sentence, then half of my key presses would be <code>ESC</code> or <code>i</code>, i.e., just moving between the modes.  In emacs, I can always have my pinky by Control and Alt (especially as soon as I remap CAPS-LOCK to Control).
<p>Also, it really irks me how in vim, if you are at the end of a line and press <code>l</code> (or right-arrow), instead of moving to the beginning of the next line, it beeps!  In emacs, if you are at the end of a the line and type <code>C-f</code>, it moves to the beginning of the next line (actually, it technically moves just beyond the line, in case you want to append, which is another annoying thing about vim: you have to use <code>A</code>, not <code>i</code>,  to add text to the end of a line). </li>
<p>Well, that&#8217;s it for now.  I will hold off on the questions until after I go through all the customizations, as it seems that, unlike vim, emacs has many things already built-in (but we already knew that, didn&#8217;t we :).  So I have just one question for readers: does anyone know of a really good emacs cheatsheet?  The <a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html">one I used for vim</a> was really awesome, but I haven&#8217;t found anything equal for emacs.  I find myself searching the tutorial whenever I forget something, which is not very efficient, so I would appreciate something better. Otherwise, I&#8217;ll just find something decent and print it out, as it would be better than nothing.</p>
<p>And if anyone cares, you can see what I&#8217;ve got for my .emacs file so far at <a href="https://github.com/asmeurer/dotfiles/blob/master/.emacs">https://github.com/asmeurer/dotfiles/blob/master/.emacs</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1070/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1070/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1070/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1070/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1070/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1070/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1070/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1070/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1070&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2012/01/03/vim-vs-emacs-part-2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>2011 in review</title>
		<link>http://asmeurersympy.wordpress.com/2012/01/01/2011-in-review/</link>
		<comments>http://asmeurersympy.wordpress.com/2012/01/01/2011-in-review/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 00:00:49 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1068</guid>
		<description><![CDATA[The WordPress.com stats helper monkeys prepared a 2011 annual report for this blog. Here&#8217;s an excerpt: The concert hall at the Syndey Opera House holds 2,700 people. This blog was viewed about 11,000 times in 2011. If it were a concert at Sydney Opera House, it would take about 4 sold-out performances for that many [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1068&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The WordPress.com stats helper monkeys prepared a 2011 annual report for this blog.</p>
<div style="background:url('/wp-content/mu-plugins/annual-reports/img/emailteaser.jpg') no-repeat center center;height:300px;"></div>
<p>Here&#8217;s an excerpt:</p>
<blockquote><p>The concert hall at the Syndey Opera House holds 2,700 people.  This blog was viewed about <strong>11,000</strong> times in 2011.  If it were a concert at Sydney Opera House, it would take about 4 sold-out performances for that many people to see it.</p></blockquote>
<p><a href="/2011/annual-report/">Click here to see the complete report.</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1068/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1068/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1068/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1068/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1068/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1068/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1068/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1068/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1068&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2012/01/01/2011-in-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>Vim vs. Emacs (Part 1)</title>
		<link>http://asmeurersympy.wordpress.com/2011/12/20/vim-vs-emacs-part-1/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/12/20/vim-vs-emacs-part-1/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 08:17:43 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1059</guid>
		<description><![CDATA[So about a month or so ago, I decided that I needed to start learning a command line text editor. XCode, the editor I had been using for Python files, didn&#8217;t work very well with the new version (in particular, the essential plugin that I&#8217;d been using to clear trailing whitespace on save doesn&#8217;t yet [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1059&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So about a month or so ago, I decided that I needed to start learning a command line text editor.  XCode, the editor I had been using for Python files, didn&#8217;t work very well with the new version (in particular, the <a href="http://asmeurersympy.wordpress.com/2009/12/29/automatically-remove-trailing-whitespace-in-xcode/">essential plugin</a> that I&#8217;d been using to clear trailing whitespace on save doesn&#8217;t yet work in XCode 4).  I&#8217;d been using TextWrangler for other things, and started to switch to it for Python editing too.  As far as free GUI text editors on the Mac go, TextWrangler is the best.  </p>
<p>But I&#8217;d seen some of the nice features that vim has, like automatically keeping all lines under 80 characters, on a friend&#8217;s computer, and I decided that I should try it.</p>
<p>Now, I had had a little prior experience with both vim and emacs, but all that I remembered was for vim that <code>i</code> inserts and <code>ZZ</code> quits (for when I accidentally open it) and for emacs, that <code>M-X doctor</code> starts the psychiatrist. </p>
<p>So I&#8217;ve decided to try them out, doing it cold turkey.  To make sure that I choose the better one, I&#8217;ve decided to try both.  So, starting about a week ago, I&#8217;ve been using nothing but vim for all my text editing.  Starting in January, I will try using emacs, and after two weeks, I will see what I like better.</p>
<p>My opinions so far on vim:</p>
<li>The tutorials suck.  The best tutorial is <code>vimtutor</code> (type that in the command line), which I think comes with vim.  It&#8217;s not bad, but it leaves out a few things that I would consider to be essential to a tutorial, for example, how to scroll (answer: use CTRL-D and CTRL-U).  I started the emacs tutorial a while back, and while I never finished it, from what I remember, it was much better (and I also remember that the first thing it talked about was how to scroll by more than one line at a time). It also left out the <code>.</code> command, which I think is rather useful.  I did print out <a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html">this cheatsheet</a> and have it sitting next to me on my desk.  That has helped a lot.  I hope I can find something similar for emacs when I get to it.</li>
<li>vim is too line oriented.  vi started out as an extension to ed, the line editor, so this is not surprising.  But I still can&#8217;t understand why pressing <code>l</code> at the end of a line can&#8217;t bring me to the beginning of the next line.  Maybe I&#8217;m just still doing it wrong (supposedly, you should rarely use <code>h</code> and <code>l</code> over more efficient moving commands).  </li>
<li>Somewhat related to the last point, vim really likes to ring the terminal bell a lot. To quote <a href="http://en.wikipedia.org/wiki/Editor_war">Wikipedia</a>, &#8220;vi has two modes – &#8216;beep repeatedly&#8217; and &#8216;break everything&#8217;&#8221;</li>
<li>I managed to customize it to the point of usability (there are still several things I need to go in and figure out how to fix).  See https://github.com/asmeurer/dotfiles for my .vimrc and .vim/ files.  I found a decent Python syntax file, but it&#8217;s actually not that great.  I modified it to color single quoted strings different from double quoted strings (a feature I missed from Xcode). I still need to make a better color scheme (preferably the same as Xcode&#8217;s midnight), but this is enough work that I&#8217;ve put it off.</li>
<li>Pressing ESC all the time is really annoying.  Sometimes, I just arrow over, even though I know you&#8217;re not &#8220;supposed to&#8221;, just because my fingers don&#8217;t want to reach over and press ESC.  I&#8217;m also really used to using control sequences to move around while typing, which of course doesn&#8217;t work in vim.  In fact, so far, I&#8217;m suspecting that I&#8217;ll like emacs better.  But I&#8217;ve vowed to give both a fair chance.  But so far, my impression is that vim is a great for text <em>editing</em>, but not so hot for text <em>writing</em> (unless you always write text perfectly, so that you never need to leave insert mode until you are done typing).  Just the simple act of deleting a mistyped word (yes, word, that happens a lot when you are decently fast touch typist) takes several keystrokes, when it should in my opinion only take one (two if you count the meta-key).</li>
<li>The customizability is really nice.  So far, everything that I&#8217;ve thought of to change has been changeable.  Also, language is easy enough to understand that I was able to modify the Python syntax file without any difficulty.  </li>
<li>I like how it syntax highlights virtually everything I throw at it. </li>
<p>If there are any vim experts out there reading this, I have some questions:</p>
<li>Is there an easy way to get a list of and jump to a function/class definition in a Python file?  In Xcode and TextWrangler, there was a nice popup at the top of the window that I could access these from.  In vim, so far the best I&#8217;ve found is searching for it, which isn&#8217;t very efficient.</li>
<li>I got TAB to indent 4 spaces in Python, but for some reason, when I create a new line after a <code>:</code>, it puts 8 extra spaces. I wouldn&#8217;t be surprised if this is the result of some mismatch/error in <a href="https://github.com/asmeurer/dotfiles">my .vimrc or .vim/ files</a>, but I don&#8217;t know how to fix it</li>
<li>Any useful tricks to share?  Especially for editing Python files.</li>
<li>How long did it take you to become reasonably efficient with vim?</li>
<p><strong>EDIT: I thought of some more questions:</strong></p>
<li>Is there a way to make vim consider camelCase to be word boundaries?</li>
<p>Finally, if anyone else is thinking of starting vim, I have some useful things I&#8217;ve already found in my .vimrc. So you might take a look at that, and add the ones that you like to your .vimrc.  Finally, if you are on Mac OS X, you should use <a href="http://www.iterm2.com/#/section/home">iTerm2</a>.  Actually, you should use this regardless of what text editor you use.  It&#8217;s a very good Terminal.app replacement that has virtually all the features (with a couple of exceptions) as Terminal.app, and a ton of extra ones.  The one I want to mention here is mouse reporting support, so you can use your mouse to do things in vim.  This is very useful, as sometimes, e.g., when selecting text, using the mouse is just more efficient.  Also, if you get frustrated trying to remember the commands that will move around you faster than <code>h</code>, <code>j</code>, <code>k</code>, and <code>l</code>, you can just click on where you want to go.</p>
<p>:wq</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1059/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1059/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1059/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1059&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/12/20/vim-vs-emacs-part-1/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>sqrt(x) now prints as &quot;sqrt(x)&quot;</title>
		<link>http://asmeurersympy.wordpress.com/2011/08/18/sqrtx-now-prints-as-sqrtx/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/08/18/sqrtx-now-prints-as-sqrtx/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 03:11:32 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1042</guid>
		<description><![CDATA[Just a few moments ago, a branch was pushed in that fixed one of my biggest grievances in SymPy, if not the biggest. Previously we had this behavior: Now suppose you took the output of those expressions and pasted them into isympy: That&#8217;s with __future__.division. Here&#8217;s what would happen with old division: This is because [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1042&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Just a few moments ago, <a href="https://github.com/sympy/sympy/pull/548" target="_blank">a branch</a> was pushed in that fixed one of my biggest grievances in SymPy, if not the biggest.  Previously we had this behavior:</p>
<p><pre class="brush: python;">
In [1]: sqrt(x)
Out[1]: x**(1/2)

In [2]: solve(x**2 - 2, x)
Out[2]: [-2**(1/2), 2**(1/2)]
</pre></p>
<p>Now suppose you took the output of those expressions and pasted them into isympy:</p>
<p><pre class="brush: python;">
In [3]: x**(1/2)
Out[3]: x**0.5

In [4]: [-2**(1/2), 2**(1/2)]
Out[4]: [-1.41421356237, 1.41421356237]
</pre></p>
<p>That&#8217;s with <code>__future__.division</code>.  Here&#8217;s what would happen with old division:</p>
<p><pre class="brush: python;">
In [2]: x**(1/2)
Out[2]: 1

In [3]: [-2**(1/2), 2**(1/2)]
Out[3]: [-1, 1]
</pre></p>
<p>This is because with old division, <code>1/2</code> evaluates to <code>0</code>.</p>
<p>The problem is that Python evaluates <code>1/2</code> to <code>0.5</code> (or <code>0</code>) before SymPy has a change to convert it to a Rational.  There were several ways that people got around this.  If you copy an expression with number division in it and want to paste it into a SymPy session, the easiest way to do this was to pass it as a string to <code>sympify()</code>:</p>
<p><pre class="brush: python;">
In [1]: sympify(&quot;x**(1/2)&quot;)
Out[1]: x**(1/2)

In [2]: sympify(&quot;[-2**(1/2), 2**(1/2)]&quot;)
Out[2]: [-2**(1/2), 2**(1/2)]
</pre></p>
<p>If that was too much typing for you, you could use the <code>S()</code> shortcut to <code>sympify()</code></p>
<p><pre class="brush: python;">
In [3]: S(&quot;x**(1/2)&quot;)
Out[3]: x**(1/2)

In [4]: S(&quot;[-2**(1/2), 2**(1/2)]&quot;)
Out[4]: [-2**(1/2), 2**(1/2)]
</pre></p>
<p>This solution is fine if you want to paste an expression into a SymPy session, but it&#8217;s not a very clean one if you want to paste code into a script. For that, you need to modify the code so that it no longer contains Python int/Python int.  The easiest way to do this is to sympify one of the ints.  So you would do something like</p>
<p><pre class="brush: python;">
In [5]: x**(S(1)/2)
Out[5]: x**(1/2)

In [6]: [-2**(S(1)/2), 2**(S(1)/2)]
Out[6]: [-2**(1/2), 2**(1/2)]
</pre></p>
<p>This wasn&#8217;t terribly readable, though.  The <em>best</em> way to fix the problem when you had a power of one half was to use <code>sqrt()</code>, which is a shortcut to <code>Pow(…, Rational(1, 2))</code>.  </p>
<p>Well, this last item should make you think.  If <code>sqrt(x)</code> is more readable than <code>x**(S(1)/2)</code> or even <code>x**(1/2)</code>, why not print it like that in the first place.  Well, I thought so, so I changed the string printer, and now this is the way that SymPy works.  So 90% of the time, you can just paste the result of <code>str()</code> or <code>print</code>, and it will just work, because there won&#8217;t be any <code>**(1/2)</code>, which was by far the most common problem of &#8220;Python evaluating the expression to something before we can.&#8221;  In the git master, SymPy now behaves like</p>
<p><pre class="brush: python;">
In [1]: sqrt(x)
Out[1]: sqrt(x)

In [2]: solve(x**2 - 2, x)
Out[2]: [-sqrt(2), sqrt(2)]
</pre></p>
<p>You can obviously just copy and paste these results, and you get the exact same thing back.  Not only does this make expressions more copy-and-pastable, but the output is <em>much</em> nicer in terms of readability.  Here are some before and afters that come from actual SymPy doctests that I had to change after fixing the printer:</p>
<p><pre class="brush: python;">
Before:
&gt;&gt;&gt; e = ((2+2*sqrt(2))*x+(2+sqrt(8))*y)/(2+sqrt(2))
&gt;&gt;&gt; radsimp(e)
2**(1/2)*x + 2**(1/2)*y

After:
&gt;&gt;&gt; radsimp(e)
sqrt(2)*x + sqrt(2)*y
</pre></p>
<p><pre class="brush: python;">
Before:
&gt;&gt;&gt; b = besselj(n, z)
&gt;&gt;&gt; b.rewrite(jn)
2**(1/2)*z**(1/2)*jn(n - 1/2, z)/pi**(1/2)

After:
&gt;&gt;&gt; b.rewrite(jn)
sqrt(2)*sqrt(z)*jn(n - 1/2, z)/sqrt(pi)
</pre></p>
<p><pre class="brush: python;">
Before:
&gt;&gt;&gt; x = sympify('-1/(-3/2+(1/2)*sqrt(5))*sqrt(3/2-1/2*sqrt(5))')
&gt;&gt;&gt; x
(3/2 - 5**(1/2)/2)**(-1/2)

After
&gt;&gt;&gt; x
1/sqrt(3/2 - sqrt(5)/2)
</pre></p>
<p>And not only is <code>sqrt(x)</code> easier to read than <code>x**(1/2)</code> but it&#8217;s fewer characters.</p>
<p>In the course of changing this, I went ahead and did some greps of the repository to get rid of all <code>**(S(1)/2)</code>, <code>**Rational(1, 2)</code> and similar throughout the code base (not just in the output of doctests where the change had to be made), replacing them with just <code>sqrt</code>.  Big thanks to Chris Smith for helping me catch all instances of this.  Now the code should be a little easier to read and maintain.</p>
<p><strong>Future Work</strong></p>
<p>This is a big change, and I believe it will fix the copy-paste problem for 90% of expressions. But it does not solve it completely.  It is still possible to get int/int in the string form of an expression.  Only powers of 1/2 and -1/2 are converted to sqrt, so any other rational power will still print as a/b, like</p>
<p><pre class="brush: python;">
In [1]: x**Rational(3, 2)
Out[1]: x**(3/2)
</pre></p>
<p>Also, as you may have noticed in the last example above, a rational number that sits by itself will still be printed as int/int, like</p>
<p><pre class="brush: python;">
In [2]: (1 + x)/2
Out[2]: x/2 + 1/2
</pre></p>
<p>Therefore, I&#8217;m leaving the <a href="http://code.google.com/p/sympy/issues/detail?id=2359" target="_blank">issue for this</a> open to discuss potential future fixes to the string printer.  One idea is to create a <code>root</code> function that is a shortcut to <code>root(x, a) == x**(1/a)</code>. This would work for rational powers where the numerator is 1.  For other rational powers, we could then denest these with an integer power.  It&#8217;s important to do this in the right order, though, as they are not equivalent.  You can see that SymPy auto-simplifies it when it is mathematically correct in all cases, and not when it is not:</p>
<p><pre class="brush: python;">
In [3]: sqrt(x**3)
Out[3]: sqrt(x**3)

In [4]: sqrt(x)**3
Out[4]: x**(3/2)
</pre></p>
<p>Thus <img src='http://s0.wp.com/latex.php?latex=%5Cleft%28%5Csqrt%7Bx%7D%5Cright%29%5E3+%3D+x%5E%7B%5Cfrac%7B3%7D%7B2%7D%7D&amp;bg=ffffff&amp;fg=333333&amp;s=0' alt='&#92;left(&#92;sqrt{x}&#92;right)^3 = x^{&#92;frac{3}{2}}' title='&#92;left(&#92;sqrt{x}&#92;right)^3 = x^{&#92;frac{3}{2}}' class='latex' /> but <img src='http://s0.wp.com/latex.php?latex=%5Csqrt%7Bx%5E3%7D+%5Cneq+x%5E%7B%5Cfrac%7B3%7D%7B2%7D%7D&amp;bg=ffffff&amp;fg=333333&amp;s=0' alt='&#92;sqrt{x^3} &#92;neq x^{&#92;frac{3}{2}}' title='&#92;sqrt{x^3} &#92;neq x^{&#92;frac{3}{2}}' class='latex' /> (to see this, replace <img src='http://s0.wp.com/latex.php?latex=x&amp;bg=ffffff&amp;fg=333333&amp;s=0' alt='x' title='x' class='latex' /> with -1).</p>
<p>So the idea would be to print <code>Pow(expr, Rational(a, b))</code> as <code>root(expr, b)**a</code>.  </p>
<p>The merits of this are debatable, but anyway I think we should have this <code>root()</code> function in any case (see <a href="http://code.google.com/p/sympy/issues/detail?id=2643" target="_blank">issue 2643</a>).</p>
<p>Another idea, which is probably not a good one, is to always print <code>int/int</code> as <code>S(int)/int</code>.  So we would get</p>
<p><pre class="brush: python;">
&gt;&gt;&gt; Rational(1, 2)
S(1)/2
&gt;&gt;&gt; x**Rational(4, 5)
x**(S(4)/5)
</pre></p>
<p>This is probably a bad idea because even though expressions would always be copy-pastable, they would be slightly less readable.  </p>
<p>By the way, in case you didn&#8217;t catch it, all of these changes only affect the string printer.  The pretty printer remained unaffected, and would under any additional changes, as it isn&#8217;t copy-pastable anyway, and already does a superb job of printing roots.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1042/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1042/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1042/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1042/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1042/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1042/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1042/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1042/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1042&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/08/18/sqrtx-now-prints-as-sqrtx/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>Hacking PuDB: Now an even better Python debugger</title>
		<link>http://asmeurersympy.wordpress.com/2011/08/08/hacking-pudb-now-an-even-better-python-debugger/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/08/08/hacking-pudb-now-an-even-better-python-debugger/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 03:16:10 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1020</guid>
		<description><![CDATA[Readers of this blog may remember last year when I wrote about this awesome visual console Python debugger called PuDB. I suggest you read that post if you haven&#8217;t. At the end of that post, I noted that Ondřej and I had hacked it to make the colors more livable. Well, a couple of weeks [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1020&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Readers of this blog may remember last year when I <a href="http://asmeurersympy.wordpress.com/2010/06/04/pudb-a-better-python-debugger/" target="_blank">wrote</a> about this awesome visual console Python debugger called <a href="http://pypi.python.org/pypi/pudb" target="_blank">PuDB</a>.  I suggest you read that post if you haven&#8217;t.</p>
<p>At the end of that post, I noted that Ondřej and I had hacked it to make the colors more livable.  Well, a couple of weeks ago, GitHub user <a href="https://github.com/jtriley" target="_blank">jtriley</a> sent me an email asking me to back port my changes.</p>
<p>A lot has changed since I wrote my blog post last year.  PuDB now has an official <a href="http://lists.tiker.net/listinfo/pudb" target="_blank">mailing list</a> and an official <a href="https://github.com/inducer/pudb" target="_blank">GitHub repo</a>.</p>
<p>So I deleted my <a href="https://github.com/asmeurer/pudb" target="_blank">GitHub clone</a> and reforked from the official version.  </p>
<p>A lot has also changed in the official code.  Andreas had added config support, including a built-in prefs dialog that lets you set a few settings:  the ability to turn on or off line numbers and the ability to change themes.</p>
<p>So I took the new code and added my theme as an official theme.  This was pretty straight forward to do.</p>
<p>But then, I got a little carried away.  </p>
<p>I noticed that it was difficult to choose a theme with the built-in prefs window because you had to close and reopen the window each time you made a change.  So I added code to make it auto-update your changes as you made them.</p>
<p>Then I went back and looked at my original blog post and looked at the things that I didn&#8217;t like.  There were two things.  First, the default stringifier for variables is <code>type</code>, which is completely useless.  This is because <code>type</code> is very fast and stable to compute.  I had previously hacked this to be <code>str</code>, but now that there was an official config file with a prefs dialog, I figured it should go there. </p>
<p>So I added support to change this setting.  But this wasn&#8217;t enough for me.  I also added the ability to define your own custom stringifier.  You just create a Python file that defines a function called <code>pudb_stringifier(obj)</code>, which converts <code>obj</code> into the desired string representation.  I included an <a href="https://github.com/inducer/pudb/blob/master/example-stringifier.py" target="_blank">example file</a> that gives a fancy example that uses signals to compute the string value, but times out after one second and falls back to the type.  This alleviates one of the problems of using <code>str</code>, which is that it can be slow for objects with large string expressions, especially SymPy objects, where sometimes the printer can be slow.</p>
<p>The second thing I didn&#8217;t like was that although you can change the width of the right-hand side bar, you could not change the relative heights of the variables, stack, and breakpoints boxes.  I never use breakpoints, and rarely use the stack, so I would prefer to have those smaller and the variables larger.  So I implemented it so that the <code>[</code> and <code>]</code> keys make the selected view smaller or larger.  This information is all saved in the config file, so it&#8217;s remembered when you close and reopen PuDB.</p>
<p>There was one other thing that I didn&#8217;t like, which a change since my last blog post that reversed the order of the stack variables from what it was.  It used to be most recent at the bottom, but it was changed to most recent at the top.  This perhaps makes more sense, but the buttons to move around the stack, <code>u</code> and <code>d</code>, were still the same: <code>u</code> moves down the stack (i.e., less recent), and <code>d</code> moves up.  These keys were already well established—indeed, these are the same keys used in Python&#8217;s built-in debugger pdb—so I added a setting to change the stack order.  This was an easy change to make at this point, as I was already well aquatinted with the settings code, and only two lines of code needed to be changed when the setting changed.  Like all other settings, this uses the cool magic that changes the setting in real time, so you can see the effect without closing the settings window.</p>
<p>Then someone on the mailing list requested a feature that I realized I also wanted, the ability to wrap variables.  Previously, any variable that was longer than the variable view would just be cut off.  You could make it wider, but that only helped a little bit.  Otherwise, if you wanted to see the whole variable, you had to open IPython by pressing <code>!</code> and view it there.</p>
<p>So, I implemented this.  This was definitely the hardest thing to implement.  I found out that it&#8217;s ironically very difficult to debug PuDB itself.  You can&#8217;t run PuDB inside of PuDB if PuDB crashes, as both instances will just crash.  Also, PuDB eats any print statements.  The solution, suggested by PuDB author Andreas Klöckner, was to get the ttys file of another terminal (e.g., <code>/dev/ttys012</code>) and write the output to that.</p>
<p>I also made it so that non-wrapped variables show <code>...</code> at the end, at Andreas&#8217;s suggestion.  I wanted to use the unicode <code>…</code>, but this was not working at all.  I discovered how much unicode really is a mess in Python 2.  The problem has something to do with … being a three byte character, and I think it also has to do with the color codes that urwid uses.  I&#8217;ll try it again once PuDB is ported to Python 3, but for now,  we are going to have to do with the three ascii dots.</p>
<p>The wrapping code is waiting for merge, but the rest are already in.  Here is a screen shot demonstrating some of the things I did:</p>
<div id="attachment_1021" class="wp-caption alignnone" style="width: 310px"><a href="http://asmeurersympy.files.wordpress.com/2011/08/screen-shot-2011-08-07-at-8-28-11-pm.png"><img src="http://asmeurersympy.files.wordpress.com/2011/08/screen-shot-2011-08-07-at-8-28-11-pm.png?w=300&#038;h=245" alt="" title="Improved PuDB" width="300" height="245" class="size-medium wp-image-1021" /></a><p class="wp-caption-text">Click for full size image</p></div>
<p>Things that I implemented to notice here:</p>
<p>- The midnight theme.<br />
- The stack and breakpoints views have been shrunken.<br />
- The variables are wrapped.<br />
- Wrapping for the variable <code>fourhundred</code> has been turned off (you can turn wrapping on or off on a per-variable basis by selecting the variable and pressing <code>w</code>).   Notice that there is an ellipsis at the end to note it has been cut off.<br />
- Nested variables now have <code>|</code> before them, to distinguish them from wrapped variables, which are also indented.  This change may or may not be accepted by Andreas.</p>
<p>Here&#8217;s a screen shot showing the prefs window.  I did not implement this, but I did implement all but the first two preferences in the window. I&#8217;ve made my window tall so you can see all the options.  You really have to get the code and try it to see the auto-update awesomeness.  You can open the prefs window by pressing <code>Ctrl-p</code> (this was not at all obvious to me the first time I used it, so I also submitted a patch that makes it open the first time you use PuDB).</p>
<div id="attachment_1023" class="wp-caption alignnone" style="width: 253px"><a href="http://asmeurersympy.files.wordpress.com/2011/08/screen-shot-2011-08-07-at-8-41-30-pm.png"><img src="http://asmeurersympy.files.wordpress.com/2011/08/screen-shot-2011-08-07-at-8-41-30-pm.png?w=243&#038;h=300" alt="" title="PuDB Prefs Window" width="243" height="300" class="size-medium wp-image-1023" /></a><p class="wp-caption-text">Click to see full size image</p></div>
<p>So if you&#8217;re not already using this awesome Python debugger, you should.  You can <code>pip install pudb</code>, or <a href="https://github.com/inducer/pudb" target="_blank">fork it</a> at GitHub.</p>
<p>Running it in your code is very easy.  Just add</p>
<p><pre class="brush: python;">
import pudb;pudb.set_trace()
</pre></p>
<p>in your code wherever you want to set a break point, or you can do <code>python -m pudb.run script.py</code>.</p>
<p>This awesome tool has increased my productivity tenfold since I discovered it, and has helped me track down bugs that would have otherwise extremely difficult if not impossible to find.  And now, it&#8217;s just better.</p>
<p>PuDB uses the <a href="http://excess.org/urwid/" target="_blank">urwid library</a> to do all its console GUI magic.  This library makes it pretty easy to do a lot of stuff. For example, it automatically does relative sizing of widgets, so, for example, when you resize the variables, stack, or breakpoints views, you are actually increasing the relative size of each, not the size in characters.  This makes it portable against any terminal size.  The library also made coding the prefs window autoupdate magic very easy.</p>
<p>Also, I just want to note that git and GitHub make collaboration like this very easy.  I just forked his project, made some improvements, and submitted them as pull requests.  Then it was easy to discuss the changes.  If the code had not been on GitHub and especially if it had not been in git, I probably would have never bothered to submit my contributions upstream.  I highly recommend that every open source project use git and GitHub.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1020/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1020/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1020/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1020/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1020/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1020/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1020/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1020/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1020&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/08/08/hacking-pudb-now-an-even-better-python-debugger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>

		<media:content url="http://asmeurersympy.files.wordpress.com/2011/08/screen-shot-2011-08-07-at-8-28-11-pm.png?w=300" medium="image">
			<media:title type="html">Improved PuDB</media:title>
		</media:content>

		<media:content url="http://asmeurersympy.files.wordpress.com/2011/08/screen-shot-2011-08-07-at-8-41-30-pm.png?w=243" medium="image">
			<media:title type="html">PuDB Prefs Window</media:title>
		</media:content>
	</item>
		<item>
		<title>SymPy 0.7.1 Released</title>
		<link>http://asmeurersympy.wordpress.com/2011/07/30/sympy-0-7-1-released/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/07/30/sympy-0-7-1-released/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 05:19:14 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=1016</guid>
		<description><![CDATA[Cross posted on the official SymPy Blog SymPy 0.7.1 has been released on July 29, 2011. It is available at http://sympy.org The source distribution can be downloaded from: http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1.tar.gz You can get the Windows installer here: http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1.win32.exe And the html documentation here: http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1-docs-html.zip About SymPy SymPy is a Python library for symbolic mathematics. It aims [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1016&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>Cross posted on the <a href="http://sympy.blogspot.com/2011/07/sympy-071-released.html">official SymPy Blog</a></em></p>
<p>SymPy 0.7.1 has been released on July 29, 2011. It is available at</p>
<p><a href="http://sympy.org">http://sympy.org<br />
</a></p>
<p>The source distribution can be downloaded from:<br />
<a href="http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1.tar.gz">http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1.tar.gz<br />
</a></p>
<p>You can get the Windows installer here:<br />
<a href="http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1.win32.exe">http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1.win32.exe<br />
</a></p>
<p>And the html documentation here:<br />
<a href="http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1-docs-html.zip">http://code.google.com/p/sympy/downloads/detail?name=sympy-0.7.1-docs-html.zip<br />
</a></p>
<p><span style="font-weight:bold;">About SymPy<br />
</span></p>
<p>SymPy is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) while keeping the code as simple as possible in order to be comprehensible and easily extensible. SymPy is written entirely in Python.</p>
<p><span style="font-weight:bold;">Release notes<br />
</span></p>
<p><span style="font-weight:bold;">Major changes</span></p>
<p>- Python 2.4 is no longer supported.  SymPy will not work at all in<br />
  Python 2.4.  If you still need to use SymPy under Python 2.4 for some<br />
  reason, you will need to use SymPy 0.7.0 or earlier.</p>
<p>- The Pyglet plotting library is now an (optional) external dependency.<br />
  Previously, we shipped a version of Pyglet with SymPy, but this was<br />
  old and buggy.  The plan is to eventually make the plotting in SymPy<br />
  much more modular, so that it supports many backends, but this has not<br />
  been done yet.  For now, still only Pyglet is directly supported.<br />
  Note that Pyglet is only an optional dependency and is only needed for<br />
  plotting. The rest of SymPy can still be used without any dependencies<br />
  (except for Python).</p>
<p>- isympy now works with the new IPython 0.11.</p>
<p>- mpmath has been updated to 0.17.  See the corresponding mpmath release<br />
  notes at http://mpmath.googlecode.com/svn/trunk/CHANGES.</p>
<p>- Added a Subs object for representing unevaluated substitutions.  This<br />
  finally lets us represent derivatives evaluated at a point, i.e.,<br />
  `diff(f(x), x).subs(x, 0)` returns `Subs(Derivative(f(_x), _x), (_x,), (0,))`.<br />
  This also means that SymPy can now correctly compute the chain rule<br />
  when this functionality is required, such as with `f(g(x)).diff(x)`.</p>
<p><span style="font-weight:bold;">Hypergeometric functions/Meijer G-Functions</span></p>
<p>- Added classes hyper() and meijerg() to represent Hypergeometric and Meijer G-functions, respectively. They support numerical evaluation (using mpmath) and symbolic differentiation (not with respect to the parameters).</p>
<p>- Added an algorithm for rewriting hypergeometric and meijer g-functions in terms of more familiar, named special functions. It is accessible via the function hyperexpand(), or also via expand_func(). This algorithm recognises many elementary functions, and also complete and incomplete gamma functions, bessel functions, and error functions. It can easily be extended to handle more classes of special functions.</p>
<p><span style="font-weight:bold;">Sets</span></p>
<p>- Added FiniteSet class to mimic python set behavior while also interacting with existing Intervals and Unions</p>
<p>- FiniteSets and Intervals interact so that, for example `Interval(0, 10) &#8211; FiniteSet(0, 5)` produces `(0, 5) U (5, 10]`</p>
<p>- FiniteSets also handle non-numerical objects so the following is possible `{1, 2, &#8216;one&#8217;, &#8216;two&#8217;, {a, b}}`</p>
<p>- Added ProductSet to handle Cartesian products of sets</p>
<p>- Create using the `*` operator, i.e. `twodice = FiniteSet(1, 2, 3, 4, 5, 6) * FiniteSet(1, 2, 3, 4, 5, 6) or square = Interval(0, 1) * Interval(0, 1)`</p>
<p>- pow operator also works as expected: `R3 = Interval(-oo, oo)**3 ; (3, -5, 0) in R3 == True`</p>
<p>- Subtraction, union, measurement all work taking complex intersections into account. </p>
<p>- Added as_relational method to sets, producing boolean statements using And, Or, Eq, Lt, Gt, etc&#8230;</p>
<p>- Changed reduce_poly_inequalities to return unions of sets rather than lists of sets</p>
<p><span style="font-weight:bold;">Iterables</span></p>
<p>- Added generating routines for integer partitions and binary partitions. The routine for integer partitions takes 3 arguments, the number itself, the maximum possible element allowed in the partitions generated and the maximum possible number of elements that will be in the partition. Binary partitions are characterized by containing only powers of two.</p>
<p>- Added generating routine for multi-set partitions. Given a multiset, the algorithm implemented will generate all possible partitions of that multi-set.</p>
<p>- Added generating routines for bell permutations, derangements, and involutions. A bell permutation is one in which the cycles that compose it consist of integers in a decreasing order. A derangement is a permutation such that the ith element is not at the ith position. An involution is a permutation that when multiplied by itself gives the identity permutation.</p>
<p>- Added generating routine for unrestricted necklaces. An unrestricted necklace is an a-ary string of n characters, each of a possible types. These have been characterized by the parameters n and k in the routine.</p>
<p>- Added generating routine for oriented forests. This is an implementation of algorithm S in TAOCP Vol 4A.</p>
<p><span style="font-weight:bold;">xyz Spin bases</span></p>
<p>- The represent, rewrite and InnerProduct logic has been improved to work between any two spin bases. This was done by utilizing the Wigner-D matrix, implemented in the WignerD class, in defining the changes between the various bases. Representing a state, i.e. `represent(JzKet(1,0), basis=Jx)`, can be used to give the vector representation of any get in any of the x/y/z bases for numerical values of j and m in the spin eigenstate. Similarly, rewriting states into different bases, i.e. `JzKet(1,0).rewrite(&#8216;Jx&#8217;)`, will write the states as a linear combination of elements of the given basis. Because this relies on the represent function, this only works for numerical j and m values. The inner product of two eigenstates in different bases can be evaluated, i.e. `InnerProduct(JzKet(1,0),JxKet(1,1))`. When two different bases are used, one state is rewritten into the other basis, so this requires numerical values of j and m, but innerproducts of states in the same basis can still be done symbolically.</p>
<p>- The `Rotation.D` and `Rotation.d` methods, representing the Wigner-D function and the Wigner small-d function, return an instance of the WignerD class, which can be evaluated with the `doit()` method to give the corresponding matrix element of the Wigner-D matrix.</p>
<p><span style="font-weight:bold;">Other changes</span></p>
<p>- We now use MathJax in our docs. MathJax renders LaTeX math entierly in<br />
  the browser using Javascript.  This means that the math is much more<br />
  readable than the previous png math, which uses images.  MathJax is<br />
  only supported on modern browsers, so LaTeX math in the docs may not<br />
  work on older browsers.</p>
<p>- nroots() now lets you set the precision of computations</p>
<p>- Added support for gmpy and mpmath&#8217;s types to sympify()</p>
<p>- Fix some bugs with lambdify()</p>
<p>- Fix a bug with as_independent and non-commutative symbols.</p>
<p>- Fix a bug with collect (issue 2516)</p>
<p>- Many fixes relating to porting SymPy to Python 3.  Thanks to our GSoC<br />
  student Vladimir Perić, this task is almost completed.</p>
<p>- Some people were retroactively added to the AUTHORS file.</p>
<p>- Added a solver for a special case of the Riccati equation in the ODE<br />
  module.</p>
<p>- Iterated derivatives are pretty printed in a concise way.</p>
<p>- Fix a bug with integrating functions with multiple DiracDeltas.</p>
<p>- Add support for Matrix.norm() that works for Matrices (not just vectors).</p>
<p>- Improvements to the Groebner bases algorithm.</p>
<p>- Plot.saveimage now supports a StringIO outfile</p>
<p>- Expr.as_ordered_terms now supports non lex orderings.</p>
<p>- diff now canonicalizes the order of differentiation symbols.  This is<br />
  so it can simplify expressions like `f(x, y).diff(x, y) &#8211; f(x,<br />
  y).diff(y, x)`.  If you want to create a Derivative object without<br />
  sorting the args, you should create it explicitly with `Derivative`,<br />
  so that you will get `Derivative(f(x, y), x, y) != Derivative(f(x, y), y, x)`.<br />
  Note that internally, derivatives that can be computed are always<br />
  computed in the order that they are given in.</p>
<p>- Added functions `is_sequence()` and `iterable()` for determining if<br />
  something is an ordered iterable or normal iterable, respectively.</p>
<p>- Enabled an option in Sphinx that adds a `source` link next to each function, which links to a copy of the source code for that function.</p>
<p>In addition to the more noticeable changes listed above, there have been numerous other smaller additions, improvements and bug fixes in the ~300 commits in this release. See the git log for a full list of all changes.  The command `git log sympy-0.7.0..sympy-0.7.1` will show all commits made between this release and the last. You can also see the issues closed since the last release [here](http://code.google.com/p/sympy/issues/list?can=1&amp;q=closed-after%3A2010%2F6%2F13+closed-before%3A2011%2F7%2F30&amp;sort=-closed&amp;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary+Stars+Closed&amp;cells=tiles).</p>
<p><span style="font-weight:bold;">Authors</span></p>
<p>The following people contributed at least one patch to this release (names are given in alphabetical order by last name).  A total of 26 people contributed to this release.  People with a * by their names contributed a patch for the first time for this release.  Five people contributed for the first time for this release.  </p>
<p>Thanks to everyone who contributed to this release!</p>
<p>* Tom Bachmann<br />
* Ondřej Čertík<br />
* Renato Coutinho<br />
* Bill Flynn<br />
* Bradley Froehle*<br />
* Gilbert Gede<br />
* Brian Granger<br />
* Emma Hogan*<br />
* Yuri Karadzhov<br />
* Stefan Krastanov*<br />
* Ronan Lamy<br />
* Tomo Lazovich<br />
* Sam Magura*<br />
* Saptarshi Mandal<br />
* Aaron Meurer<br />
* Sherjil Ozair<br />
* Mateusz Paprocki<br />
* Vladimir Perić<br />
* Mario Pernici<br />
* Nicolas Pourcelot<br />
* Min Ragan-Kelley*<br />
* Matthew Rocklin<br />
* Chris Smith<br />
* Vinzent Steinberg<br />
* Sean Vig<br />
* Thomas Wiecki</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/1016/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/1016/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/1016/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/1016/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/1016/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/1016/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/1016/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/1016/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=1016&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/07/30/sympy-0-7-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>Merging integration3 with sympy-0.7.0 nightmare</title>
		<link>http://asmeurersympy.wordpress.com/2011/07/25/merging-integration3-with-sympy-0-7-0-nightmare/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/07/25/merging-integration3-with-sympy-0-7-0-nightmare/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 09:25:13 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=981</guid>
		<description><![CDATA[For a long time, there have been several problems in my integration3 branch that were fixed in master. I decided that as an incentive to finish the release, I would hold off on merging master into my branch until the 0.7.0 release was finished. Well, here&#8217;s a little timeline: June 28, 2011: SymPy 0.7.0 final [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=981&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For a long time, there have been several problems in my <code>integration3</code> branch that were fixed in <code>master</code>.  I decided that as an incentive to finish the release, I would hold off on merging <code>master</code> into my branch until the 0.7.0 release was finished.  Well, here&#8217;s a little timeline:</p>
<ul>
<li><strong>June 28, 2011:</strong> SymPy 0.7.0 final is released.</li>
<li><strong>June 29, 2011:</strong> I type <code>git merge sympy-0.7.0</code> in my <code>integration3</code> branch.</li>
<li><strong>July 24, 2011 (today; technically July 25 because it&#8217;s 2 AM):</strong> I finish merging <code>sympy-0.7.0</code> into <code>integration3</code>.</li>
</ul>
<p>That&#8217;s right, it took me over three weeks&#8212;almost a month&#8212;to merge <code>sympy-0.7.0</code> into <code>integration3</code> (granted, I worked on other things at the same time, such as the <a href="https://github.com/asmeurer/sympy/commit/52657848516ce7f4f7119b921d6b8d64131b58d3" target="_blank">SciPy 2011 conference</a>, but to me, any merge that takes longer than a day to complete is a problem).  This is because git decided that I needed to fix as a merge conflict just about every single change in the release branch since the base of <code>integration3</code>.  The total was over 100 files.  You can see the final merge commit <a href="https://github.com/asmeurer/sympy/commit/52657848516ce7f4f7119b921d6b8d64131b58d3" target="_blank">here</a>.</p>
<p>So I started <code>git mergetool</code>, without which this whole ordeal would have been 10 times worse.  The mergetool, which on my computer is opendiff, i.e., File Merge, gave the correct change by default in most cases, so I actually did not have to manually fix the majority of the conflicts.  But I did have to go through and do a lot of them.  I had to manually check each difference in the polys, as I had made several changes there in the course of working on <code>integration3</code>.  In several occisaions, I had to research a change using <code>git log -S</code> and fancy methods.  And I noticed at least two regressions in the polys, which I fixed.</p>
<p>mergetool was useless against <code>risch.py</code> and <code>test_risch.py</code>, because in my branch I had renamed these to <code>heurisch.py</code> and <code>test_heurisch.py</code>.  Fortunately, these were not really modified much by me, so I could basically just replace them with the <code>sympy-0.7.0</code> versions.</p>
<p>Once I finished merging I had to deal with test failures.  This was partly expected, as my branch has always had test failures due to my hack disabling algebraic substitution in <code>exp</code>, which is required for <code>risch_integrate()</code> to work, but there were also several unrelated ones.  </p>
<p>Some of these were caused by wrong merge conflict resolutions by me.  So I went through <code>git diff sympy-0.7.0</code> change by change and made sure that nothing was different that I didn&#8217;t want to be.  I would recommend doing this for any big merge.</p>
<p>Then, I had to fix a few bugs that caused test failures.  Several semantics were changed in the release.  I think the ones that I had to change were the renaming of <code>has_any_symbols</code> to just <code>has</code>, the renaming of <code>Poly.as_basic()</code> to <code>Poly.as_expr()</code>, and the swapping of the meanings of <code>quo</code> and <code>exquo</code> in the polys.  There were also some doctest failures due to the change to lexicographic ordering in the printer.</p>
<p>After all that, there were two regressions that caused test failures.  The first was the following:</p>
<p>Before:<br />
<pre class="brush: python;">
In [1]: Integral((exp(x*log(x))*log(x)), x).subs(exp(x*log(x)), x**x)
Out[1]: 
⌠             
⎮  x          
⎮ x ⋅log(x) dx
⌡             
</pre></p>
<p>After:<br />
<pre class="brush: python;">
In [1]: Integral((exp(x*log(x))*log(x)), x).subs(exp(x*log(x)), x**x)
Out[1]: 
⌠                    
⎮  x⋅log(x)          
⎮ ℯ        ⋅log(x) dx
⌡                    
</pre></p>
<p>This substitution is necessary because the Risch algorithm requires expressions like <img src='http://s0.wp.com/latex.php?latex=x%5Ex&amp;bg=ffffff&amp;fg=333333&amp;s=0' alt='x^x' title='x^x' class='latex' /> to be rewritten as <img src='http://s0.wp.com/latex.php?latex=e%5E%7Bx%5Clog%28x%29%7D&amp;bg=ffffff&amp;fg=333333&amp;s=0' alt='e^{x&#92;log(x)}' title='e^{x&#92;log(x)}' class='latex' /> before it can integrate them, but I try to convert them back after integrating so that the user gets the same thing in the result that he entered.  I created <a href="http://code.google.com/p/sympy/issues/detail?id=2571" target="_blank">issue 2571</a> for this.</p>
<p>The second was that I had several places in my docstrings with things like</p>
<blockquote><p>
Given a derivation D on k[t] and f, g in k(t) with f weakly normalized with respect to t, either raise NonElementaryIntegralException, in which case the equation Dy + f*y == g has no solution in k(t), or the quadruplet (a, b, c, h) such that a, h in k[t], b, c in k, and for any solution y in k(t) of Dy + f*y == g, q = y*h in k satisfies a*Dq + b*q == c.
</p></blockquote>
<p>The problem here is the &#8220;raise NonElementaryIntegralException,&#8221; part.  The code quality checker things that this is an old style exception (like <code>raise Exception, message</code>), due to a poorly formed regular expression.  I fixed this in a <a href="https://github.com/sympy/sympy/pull/511" target="_blank">pull request</a>.</p>
<p>The good news is that now a lot of stuff works that didn&#8217;t before because of fixes that were required that only existed in <code>master</code>.  For example, the following did not work before, but now does due to improvements to <code>RootSum</code>:</p>
<p><pre class="brush: python;">

In [1]: risch_integrate(1/(exp(5*x) + exp(x) + 1), x)
Out[1]: 
           ⎛    2                                                           
x + RootSum⎝21⋅z  + 6⋅z + 1, Lambda(_i, _i*log(-3381*_i**4/4 - 3381*_i**3/4 

                                       ⎞          ⎛     3        2          
- 625*_i**2/2 - 125*_i/2 + exp(x) - 5))⎠ + RootSum⎝161⋅z  + 115⋅z  + 19⋅z + 

                                                                            
1, Lambda(_i, _i*log(-3381*_i**4/4 - 3381*_i**3/4 - 625*_i**2/2 - 125*_i/2 +

             ⎞
 exp(x) - 5))⎠

In [2]: cancel(risch_integrate(1/(exp(5*x) + exp(x) + 1), x).diff(x))
Out[2]: 
      1      
─────────────
 5⋅x    x    
ℯ    + ℯ  + 1
</pre></p>
<p>The general definition of the logarithmic part of an integral is a sum over the roots of a polynomial, which must be expressed as a <code>RootSum</code> in the general case.  Previously, <code>RootSum.diff</code> did not work, but thanks to Mateusz, an algorithm for computing exactly the RootSum where the Lambda expression is a rational function was implemented (see <a href="http://mattpap.github.com/scipy-2011-tutorial/html/mathematics.html#summing-roots-of-polynomials" target="_blank">this bit</a> from our SciPy tutorial for an idea on how this works), so now the Risch Algorithm can work with RootSum objects just as well with as an ordinary sum of logarithms.</p>
<p>Also, there was a bug in the square free algorithm in my branch that was fixed in <code>master</code> that was causing wrong results (I don&#8217;t remember the expression that produced them right now), and also there was a fix by me in <code>master</code> to make <code>is_rational_function()</code> faster, as it was significantly slowing down the calculation of some integrals (for example, <code>risch_integrate(Add(*(exp(i*x) for i in range(1000))))</code>, which is still slow to calculate, but now it&#8217;s because of other things).</p>
<p><strong>About big branches</strong></p>
<p>So this merge, along with the poly12 fiasco (which by the way, I think part of the reason git made me do all these merge conflict resolutions was because <code>polys12</code> was rebased from the <code>polys11</code> I had merged into integration3), has shown me very clearly that it is very bad to go off with your own branch and do a lot of work and wait a long time before merging it back into the main repo.</p>
<p>This is what was done with <code>polys12</code>.  Mateusz had a lot of new polynomials code that he developed in one big branch, and when it finally came to merging it back in, it was a mess.  This was for several reasons, which I do not want to discuss too much here, but it became clear to everyone I think that doing this was bad, and that it would have been better to have submitted many changes as pull requests as they were made than keeping them all together in one big branch for a long time.</p>
<p>This model also affected my work, as I had to work off of latest the polys branch, not <code>master</code>, as my work relied heavily on the latest and greatest in the polys.  </p>
<p>Well, with this merge of the main repo into my branch, I see that my branch is starting to become the same way.  I originally thought that I should finish the Risch algorithm before submitting it to be merged into <code>master</code>.  I know know that this is the wrong approach.  Development in <code>master</code> is too fast to keep code away from it for too long.  The divergence makes it more and more difficult to merge back with every time.  Furthermore, there are regressions that were never noticed to be regressions because the code that would have shown them existed only in my branch.  Now I have to fix these, whereas if the code were in <code>master</code>, the regression would have never happened in the first place, because the author would have seen it immediately from the test failures.</p>
<p>I also thought that I should wait to merge because there were so many bugs in my code.  But I see now that this is also wrong.  Merging with <code>master</code> will help me find these bugs, as people will actually use my code.  Sure, I&#8217;ve asked people to try out <code>risch_integrate()</code>, and some people have (and I thank you), but having it in the default <code>integrate()</code> in <code>master</code> will result in finding more bugs in the code than I ever would alone, which is basically the way it is right now with the code living only in my own branch.</p>
<p>I would prepare my code for merging with <code>master</code> today, if it weren&#8217;t for this <code>exp.subs</code> hack, which causes test failures and is technically a regression, but is required for the preparsing code to the Risch algorithm to work.  This is why I <a href="http://groups.google.com/group/sympy/browse_thread/thread/4a19d0f39f51fda6#" target="_blank">wrote to the list</a> two weeks ago asking for advice on how to structure the substitution code so that we can nicely have various kinds of substitutions (e.g., exact like I need and algebraic like currently exists in <code>exp</code>) living together without cluttering up the code.</p>
<p>Therefore, I am going to focus my energies on fixing this subs problem so I can get my code merged with <code>master</code>.  Then, when this is done, I will continue my work on implementing the remaining cases of the Risch algorithm.  </p>
<p>So let this tale be a warning to people working on a lot of code in a big branch.  This especially applies to our GSoC students, as it&#8217;s extremely easy to let your code accumulate when you&#8217;re a GSoC student (technically this branch of mine is a GSoC branch).  I see that some of our students are doing a better job of this than others.  To those who have your code all in one big branch that hasn&#8217;t been merged, I recommend you ready your branch for merge now.  And in the future, try to break your code up into small but still meaningful chunks and submit those as pull requests.  With git, it&#8217;s easy to base the code you are currently working on on code that hasn&#8217;t been merged yet, while still keeping things in small chunks for the pull requests.  </p>
<p>On the other hand, git will only take you so far if you keep everything in a big branch, because there are going to be changes in <code>master</code> that will affect your work, no matter how isolated you think it is, and these are the sorts of things that it is impossible for git to fix for you.  But if your code is in <code>master</code>, it will be supported by everyone, and any major change that affects it will have to fix it. For example, if someone changes a printer and the doctests change, then he will have to change your doctest too if it&#8217;s in <code>master</code>, but if it&#8217;s in your branch, then you will have to fix it when you next merge/rebase with/against <code>master</code>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/981/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/981/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/981/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/981/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/981/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/981/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/981/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/981/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=981&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/07/25/merging-integration3-with-sympy-0-7-0-nightmare/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>The SciPy 2011 Conference</title>
		<link>http://asmeurersympy.wordpress.com/2011/07/17/the-scipy-2011-conference/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/07/17/the-scipy-2011-conference/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 16:32:31 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=965</guid>
		<description><![CDATA[So this past week, I attended the SciPy 2011 conference in Austin, TX, which was my first conference ever. Here are some highlights of the conference for me: I met a ton of cool people. This included meeting several people who I had previously known from mailing lists in person for the first time. I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=965&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So this past week, I attended the SciPy 2011 conference in Austin, TX, which was my first conference ever.  Here are some highlights of the conference for me:</p>
<ul>
<li>I met a <em>ton</em> of cool people.  This included meeting several people who I had previously known from mailing lists in person for the first time.  I met the SymPy developers Mateusz Paprocki and Andy Terrel, and I also had already known or heard about people like Fernando Perez, Gael Varoquaux, and Robert Kern.  There are a lot of people out there who are excited to be using Python for their research, which is a real refresher from my university, where everyone is using Matlab and Maple.</li>
<li>Mateusz and I gave a tutorial on SymPy.  This was one of the four introductory track tutorials.  This was a great experience to teach SymPy to people.  You can see the <a href="http://mattpap.github.com/scipy-2011-tutorial/html/index.html">Sphinx document</a> that we used, and there should eventually be a video posted at the <a href="http://conference.scipy.org/scipy2011/tutorials.php#mateusz">SciPy 2011 website</a>.</li>
<li>In addition to our tutorial, I attended some of the other tutorials.  I particularly enjoyed the NumPy tutorial. Having never used NumPy before, I now feel comfortable with the basics.  I also attended Gael Varoquaux&#8217;s tutorial on scikits.learn and Corran Webster&#8217;s tutorial on Matplotlib, Traits, and Chaco. My only regret is that the advanced track and introductory track tutorials were held at the same time, so I could not attend half of them.  I plan to watch the ones I missed online.</li>
<li>The general conference was excellent.  Some of the talks that I particularly enjoyed were:
<ul>
<li>The keynotes.  I found Eric Jone&#8217;s keynote particularly relevant as the leader of SymPy, as he talked about some of the good things to do and bad things to not do when leading a scientific project.  I also enjoyed Perry Greenfield&#8217;s talk about how the astronomy community moved from some old proprietary system to Python.</li>
<li>Mateusz gave a talk on his <a href="http://lab.femhub.org/">FEMhub online lab</a>, which a was very impressive system for using Python entirely in the web browser.</li>
<li>By far the best talk of the entire conference was Fernando Perez&#8217;s talk on the new IPython 0.11, which will be coming out in about a week or so.  His demo of the new features such as the QT console and html notebook were very impressive.  If you want to watch just one video from the conference, I would recommend that one.</li>
<li>Mark Dewing gave a talk about a system he wrote using SymPy to do automated derivation of equations.  The system is impressive, and contains some features that would be nice to backport to SymPy.  He told me that he wants to do this, so follow the mailing list.  You can see what he has so far on his <a href="https://github.com/markdewing/sympy/tree/derivation_modeling">derivation_modeling</a> branch at GitHub.</li>
<li>The lightning talks.  These are very short talks at the end of the conference that are only five minutes long.  In addition to many interesting talks, both Mateusz and I gave a lightning talk. Mateusz gave a talk on <a href="http://live.sympy.org/">SymPy Live</a>, which he recently improved to do things like give LaTeX output, and I gave a talk on my work with the Risch algorithm.  I would also highly recommend watch this talk once they post the videos.</li>
<li>Again, regrettably, I could not attend half of the talks because they were held at the same time.  Fortunately, they filmed all of them, so I hope to watch them all online when they are posted (and I recommend that you do too).</li>
</ul>
</li>
<li>The sprints were a great time for getting together and hacking together.  I worked with Min Ragan-Kelley to make isympy work with the new IPython.  Having fixed this, I now want to release 0.7.1 very soon, so I used some of the time during the sprints getting ready for that.  We already have <a href="https://github.com/sympy/sympy/wiki/Release-Notes-for-0.7.1">preliminary release notes</a>, and my hope is to create a release candidate on Monday (tomorrow).  I also finished up my <a href="https://github.com/sympy/sympy/pull/491">MathJax branch</a> and finished reviewing and pushed in Tom&#8217;s first GSoC pull request, which has a lot of really cool stuff relating to converting hypergeometric functions and Meijer G-functions into standard elementary functions.  This will all be in the release.
<p>Also at the sprints, Mateusz worked on an extension for our Sphinx docs that puts a SymPy Live console right in the docs.  You can then click on &#8220;evaluate&#8221; next to any of the code examples, and it will run it in SymPy live.  And of course, you can then edit it and play around with it.  He already had a working version of this by the end of the sprints (with a few bugs still), but I don&#8217;t think he has pushed it to GitHub yet.  I think this is going to be a landmark change for our documentation.  SymPy Live runs on the App Engine, so this approach can be applied to any library that can run in pure Python 2.5, and I think a lot of such projects are going to be jealous this and want to start using it, because it&#8217;s very impressive and useful.</p>
<p>We also had a couple of people from the conference come to our table and work on SymPy.  These were people who were new to SymPy, and I think attended our tutorial.  One of them, Emma Hogan, worked a little bit on improving our documentation, and has submitted a <a href="https://github.com/sympy/sympy/pull/490">pull request</a>.
</li>
<li>Austin, TX is a nice city with lots of fun places to go, but it is also very humid, which is something I could barely stand (I am used to the same heat, but in Albuquerque it is dry heat).  One interesting thing that some of us went and saw was the bats.  The bridge over this lake in Austin has over a million bats living under it, and at night they all fly out to feed.  </li>
</ul>
<p>There&#8217;s all kinds of fun and interesting stuff that happened that I did not mention here.  If you are interested in science and Python, I would highly recommend attending a future SciPy conference.  </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/965/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/965/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/965/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/965/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/965/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/965/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/965/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/965/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=965&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/07/17/the-scipy-2011-conference/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
		<item>
		<title>SymPy 0.7.0 released</title>
		<link>http://asmeurersympy.wordpress.com/2011/06/29/sympy-0-7-0-released/</link>
		<comments>http://asmeurersympy.wordpress.com/2011/06/29/sympy-0-7-0-released/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 08:00:38 +0000</pubDate>
		<dc:creator>asmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://asmeurersympy.wordpress.com/?p=950</guid>
		<description><![CDATA[Cross posted on the official SymPy blog SymPy 0.7.0 has been released on June 28, 2011. It is available athttp://sympy.org The source distribution can be downloaded from:http://sympy.googlecode.com/files/sympy-0.6.7.tar.gz You can get the Windows installer here:http://sympy.googlecode.com/files/sympy-0.6.7.win32.exe And the html documentation here:http://sympy.googlecode.com/files/sympy-0.6.7-docs-html.zip About SymPy SymPy is a Python library for symbolic mathematics. It aims to become a full-featured [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=950&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>Cross posted on the <a href="http://sympy.blogspot.com/2011/06/sympy-070-released.html" target="_blank">official SymPy blog</a></em></p>
<p>SymPy 0.7.0 has been released on June 28, 2011.  <span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:13px;color:rgb(51,51,51);line-height:18px;">It is available at<br /><a href="http://sympy.org/" style="color:rgb(34,85,136);"><br />http://sympy.org</a></p>
<p>The source distribution can be downloaded from:<br /><a href="http://sympy.googlecode.com/files/sympy-0.6.6.tar.gz" style="color:rgb(34,85,136);">http://sympy.googlecode.com/files/sympy-0.6.7.tar.gz</a></p>
<p>You can get the Windows installer here:<br /><a href="http://sympy.googlecode.com/files/sympy-0.6.6.win32.exe" style="color:rgb(34,85,136);">http://sympy.googlecode.com/files/sympy-0.6.7.win32.exe</a></p>
<p>And the html documentation here:<br /><a href="http://sympy.googlecode.com/files/sympy-0.6.6-docs-html.zip" style="color:rgb(34,85,136);">http://sympy.googlecode.com/files/sympy-0.6.7-docs-html.zip</a></span>
<div></div>
<div><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:13px;color:rgb(51,51,51);line-height:18px;"><span style="font-weight:bold;font-size:16px;">About SymPy</span></p>
<p>SymPy is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) while keeping the code as simple as possible in order to be comprehensible and easily extensible. SymPy is written entirely in Python.<br /><span style="font-size:16px;"><span class="Apple-style-span" style="font-size:13px;"><span style="font-size:16px;"><span style="font-weight:bold;"><br /></span></span></span></span></span></div>
<div><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:13px;color:rgb(51,51,51);line-height:18px;"><span style="font-size:16px;"><span class="Apple-style-span" style="font-size:13px;"><span style="font-size:16px;"><span style="font-weight:bold;">Changes since last stable release</span></span><br /></span></span></span></div>
<div><span class="Apple-style-span" style="font-family:helvetica, arial, freesans, clean, sans-serif;font-size:6px;"><span class="Apple-style-span" style="font-size:22px;"><b><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-weight:normal;font-size:13px;color:rgb(51,51,51);line-height:18px;"><br /></span></b></span></span></div>
<div><span class="Apple-style-span" style="font-family:helvetica, arial, freesans, clean, sans-serif;font-size:6px;"><span class="Apple-style-span" style="font-size:22px;"><b><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-weight:normal;font-size:13px;color:rgb(51,51,51);line-height:18px;">(from <a href="https://github.com/sympy/sympy/wiki/Release-Notes-for-0.7.0">https://github.com/sympy/sympy/wiki/Release-Notes-for-0.7.0</a>)</span></b></span></span></div>
<div><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;color:rgb(51,51,51);line-height:18px;"><b><span class="Apple-style-span" style="color:rgb(0,0,0);font-family:helvetica, arial, freesans, clean, sans-serif;font-weight:normal;line-height:23px;font-size:14px;"><br />
<h2 style="line-height:normal;border-top-width:4px;border-top-style:solid;border-top-color:rgb(204,204,204);font-size:22px;display:inline!important;margin:22px 0 0;padding:7px 0 0;"></h2>
<p></span></b></span></div>
<div><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;color:rgb(51,51,51);line-height:18px;"><b><span class="Apple-style-span" style="color:rgb(0,0,0);font-family:helvetica, arial, freesans, clean, sans-serif;font-weight:normal;line-height:23px;font-size:14px;"><br />
<h2 style="line-height:normal;border-top-width:4px;border-top-style:solid;border-top-color:rgb(204,204,204);font-size:22px;display:inline!important;margin:22px 0 0;padding:7px 0 0;">Backwards compatibility breaks</h2>
<p></span></b></span></div>
<div><span class="Apple-style-span" style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;color:#333333;"><span class="Apple-style-span" style="line-height:18px;"><b><span class="Apple-style-span" style="color:rgb(0,0,0);font-family:helvetica, arial, freesans, clean, sans-serif;font-weight:normal;line-height:23px;font-size:14px;">
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">This will be the last release of SymPy to support Python 2.4. Dropping support for Python 2.4 will let us move forward with things like supporting Python 3, and will let us use things that were introduced in Python 2.5, like with-statement context managers.</li>
<li style="line-height:1.4em;margin:0;padding:0;">no longer support creating matrices without brackets (see: issue 930)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Renamed <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sum()</code> to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">summation()</code> (see: 3e763a8, issues 1376, 1727). This was changed so that it no longer overrides the built-in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sum()</code>. The unevaluated summation is still called <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Sum()</code>.</li>
<li style="line-height:1.4em;margin:0;padding:0;">Renamed <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">abs()</code> to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Abs()</code> (see: 64a12a4, issue 1727). This was also changed so that it no longer overrides the built-in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">abs()</code>. Note that because of <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">__abs__</code> magic, you can still do <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">abs(expr)</code> with the built-in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">abs()</code>, and it will return <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Abs(expr)</code>.</li>
<li style="line-height:1.4em;margin:0;padding:0;">Renamed <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">max_()</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">min_()</code> to now <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Max()</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Min()</code> (see: 99a271e, issue 2153)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Changed behaviour of <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">symbols()</code>. <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">symbols('xyz')</code> gives now a single symbol (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">'xyz'</code>), not three (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">'x'</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">'y'</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">'z'</code>) (see: f6452a8). Use<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">symbols('x,y,z')</code> or <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">symbols('x y z')</code> to get three symbols. The &#8216;each_char&#8217; option will still work but is being deprecated.</li>
<li style="line-height:1.4em;margin:0;padding:0;">Split class <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Basic</code> into new classes <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Expr</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Boolean</code> (see: a0ab479, 635d89c). Classes that are designed to be part of standard symbolic expressions (like <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">x**2*sin(x)</code>) should subclass from <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Expr</code>. More generic objects that do not work in symbolic expressions but still want the basic SymPy structure like <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">.args</code> and basic methods like <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">.subs()</code> should only subclass from <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Basic</code>.</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">as_basic()</code> method was renamed to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">as_expr()</code> to reflect changes in the core (see: e61819d, 80dfe91)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Methods <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">as_coeff_terms</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">as_coeff_factors</code> were renamed to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">as_coeff_mul</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">as_coeff_add</code>, respectively.</li>
<li style="line-height:1.4em;margin:0;padding:0;">Removed the <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">trim()</code> function. The function is redundant with the new polys (see below). Use the <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">cancel()</code> function instead.</li>
</ul>
<h2 style="line-height:normal;border-top-width:4px;border-top-style:solid;border-top-color:rgb(204,204,204);font-size:22px;margin:22px 0 0;padding:7px 0 0;">Major Changes</h2>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Polys</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">New internal representations of dense and sparse polynomials (see: 6aecdb7, 31c9aa4)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented algorithms for real and complex root isolation and counting (see: 3acac67, 4b75dae, fa1206e, 103b928, 45c9b22, 8870c8b, b348b30)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Improved Gröbner bases algorithm (see: ff65e9f, 891e4de, 310a585)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Field isomorphism algorithm (see: b097b01, 08482bf)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented efficient orthogonal polynomials (see: b8fbd59)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added configuration framework for polys (see: 33d8cdb, 7eb81c9)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Function for computing minimal polynomials (see: 88bf187, f800f95)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Function for generating Viete&#8217;s formulas (see: 1027408)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">roots()</code> supports more classes of polynomials (e.g. cyclotomic) (see: d8c8768, 75c8d2d)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added a function for recognizing cyclotomic polynomials (see: b9c2a9a)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added a function for computing Horner form of polynomials (see: 8d235c7)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added a function for computing symmetric reductions of polynomials (see: 6d560f3)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added generators of Swinnerton-Dyer, cyclotomic, symmetric, random and interpolating polynomials (see: dad03dd, 6ccf20c, dc728d6, 2f17684, 3004db8)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added a function computing isolation intervals of algebraic numbers (see: 37a58f1)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Polynomial division (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">div()</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">rem()</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">quo()</code>) now defaults to a field (see: a72d188)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added wrappers for numerical root finding algorithms (see: 0d98945, f638fcf)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added symbolic capabilities to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">factor()</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sqf()</code> and related functions (see: d521c7f, 548120b, f6f74e6, b1c49cd, 3527b64)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">together()</code> was significantly improved (see: dc327fe)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added support for iterable containers to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">gcd()</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">lcm()</code> (see: e920870)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added a function for constructing domains from coefficient containers (see: a8f20e6)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented greatest factorial factorization (see: d4dbbb5)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added partial fraction decomposition algorithm based on undetermined coefficient approach (see: 9769d49, 496f08f)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">RootOf</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">RootSum</code> were significantly improved (see: f3e432, 4c88be6, 41502d7)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added support for gmpy (GNU Multiple Precision Arithmetic Library) (see: 38e1683)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Allow to compile <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.polys</code> with Cython (see: afb3886)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Improved configuration of variables in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Poly</code> (see: 22c4061)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added documentation based on Wester&#8217;s examples (see: 1c23792)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Irreducibility testing over finite fields (see: 17e8f1f)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Allow symmetric and non-symmetric representations over finite fields (see: 60fbff4)</li>
<li style="line-height:1.4em;margin:0;padding:0;">More consistent factorization forms from <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">factor()</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sqf()</code> (see: 5df77f5)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added support for automatic recognition algebraic extensions (see: 7de602c)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented Collins&#8217; modular algorithm for computing resultants (see: 950969b)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented Berlekamp&#8217;s algorithm for factorization over finite fields (see: 70353e9)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented Trager&#8217;s algorithm for factorization over algebraic number fields (see: bd0be06)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Improved Wang&#8217;s algorithm for efficient factorization of multivariate polynomials (see: 425e225)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Quantum</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Symbolic, abstract dirac notation in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum</code>. This includes operators, states (bras and kets), commutators, anticommutators, dagger, inner products, outer products, tensor products and Hilbert spaces</li>
<li style="line-height:1.4em;margin:0;padding:0;">Symbolic quantum computing framework that is based on the general capabilities in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum</code>. This includes qubits (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.qubit</code>), gates (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.gate</code>), Grover&#8217;s algorithm (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.grover</code>), the quantum Fourier transform (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.qft</code>), Shor&#8217;s algorithm (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.shor</code>) and circuit plotting (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.circuitplot</code>)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Second quantization framework that inclues creation/anihilation operators for both Fermions and Bosons and Wick&#8217;s theorem for Fermions (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.secondquant</code>).</li>
<li style="line-height:1.4em;margin:0;padding:0;">Symbolic quantum angular momentum (spin) algebra (<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.physics.quantum.spin</code>)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Hydrogen wave functions (Schroedinger) and energies (both Schroedinger and Dirac)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Wave functions and energies for 1D harmonic oscillator</li>
<li style="line-height:1.4em;margin:0;padding:0;">Wave functions and energies for 3D spherically symmetric harmonic oscillator</li>
<li style="line-height:1.4em;margin:0;padding:0;">Wigner and Clebsch Gordan coefficients</li>
</ul>
<h2 style="line-height:normal;border-top-width:4px;border-top-style:solid;border-top-color:rgb(204,204,204);font-size:22px;margin:22px 0 0;padding:7px 0 0;">Everything else</h2>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Implement symarray, providing numpy nd-arrays of symbols.</li>
<li style="line-height:1.4em;margin:0;padding:0;">update mpmath to 0.16</li>
<li style="line-height:1.4em;margin:0;padding:0;">Add a tensor module (see: <a href="http://code.google.com/p/sympy/wiki/CodeGenerationReport" style="line-height:1.4em;color:rgb(65,131,196);text-decoration:none;outline-style:none;outline-width:initial;outline-color:initial;margin:0;padding:0;">http://code.google.com/p/sympy/wiki/CodeGenerationReport</a>)</li>
<li style="line-height:1.4em;margin:0;padding:0;">A lot of stuff was being imported with <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">from sympy import *</code> that shouldn&#8217;t have been (like <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sys</code>). This has been fixed.</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Assumptions:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Refine</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added predicates (see: 7c0b857, 53f0e1a, d1dd6a3..)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added query handlers for algebraic numbers (see: f3bee7a)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implement a SAT solver (see: <a href="http://code.google.com/p/sympy/wiki/SuperchargingAssumptionsReport" style="line-height:1.4em;color:rgb(65,131,196);text-decoration:none;outline-style:none;outline-width:initial;outline-color:initial;margin:0;padding:0;">http://code.google.com/p/sympy/wiki/SuperchargingAssumptionsReport</a>, 2d96329, acfbe75, etc.)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Concrete</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Finalized implementation of Gosper&#8217;s algorithm (see: 0f187e5, 5888024)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Removed redundant <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Sum2</code> and related classes (see: ef1f6a7)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Core:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Split <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Atom</code> into <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Atom</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">AtomicExpr</code> (see: 965aa91)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Various <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympify()</code> improvements</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added functionality for action verbs (many functions can be called both as global functions and as methods e.g. <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">a.simplify() == simplify(a)</code>)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Improve handling of rational strings (see: 053a045, issue 1778)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Major changes to factoring of integers (see: 273f450, issue 2003)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Optimized <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">.has()</code> (see: c83c9b0, issue 1980; d86d08f)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Improvements to power (see: c8661ef, issue 1963)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added range and lexicographic syntax to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">symbols()</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">var()</code> (see: f6452a8, 9aeb220, 957745a)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">modulus</code> argument to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">expand()</code> (see: 1ea5be8)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Allow to convert <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Interval</code> to relational form (see: 4c269fe)</li>
<li style="line-height:1.4em;margin:0;padding:0;">SymPy won&#8217;t manipulate minus sign of expressions any more (see: 6a26941, 9c6bf0f, e9f4a0a)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Real</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">.is_Real</code> were renamed to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Float</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">.is_Float</code>. <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Real</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">.is_Real</code> still remain as deprecated shortcuts to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Float</code> and<code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">is_Float</code> for backwards compatibility. (see: abe1c49)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Methods coeff and as_coefficient are now non-commutative aware. (see a4ea170)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Geometry:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Various improvements to Ellipse</li>
<li style="line-height:1.4em;margin:0;padding:0;">Updated documentation to numpy standard</li>
<li style="line-height:1.4em;margin:0;padding:0;">Polygon and Line improvements</li>
<li style="line-height:1.4em;margin:0;padding:0;">Allow all geometry objects to accept a tuple as <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">Point</code> args</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Integrals:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Various improvements (see eg. issues 1772, 1999, 1992, 1987.. etc)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">isympy</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Fixed the <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">-p</code> switch (see: e8cb04a)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Caching can be disabled using <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">-C</code> switch (see: 0d8d748)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Ground types can be set using <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">-t</code> switch (see: 75734f8)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Printing ordering can be set using <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">-o</code> switch (see: fcc6b13, 4ec9dc5)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Logic</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">implies object adheres to negative normal form</li>
<li style="line-height:1.4em;margin:0;padding:0;">Create new boolean class, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">logic.boolalg.Boolean</code></li>
<li style="line-height:1.4em;margin:0;padding:0;">Added XOR operator (^) support</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added If-then-else (ITE) support</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added the dpll algorithm</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Functions:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Added Piecewise, B-splines</li>
<li style="line-height:1.4em;margin:0;padding:0;">Spherical Bessel function of the second kind implemented</li>
<li style="line-height:1.4em;margin:0;padding:0;">Add series expansions of multivariate functions (see: d4d351d)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Matrices:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Add elementwise product (Hadamard product)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Extended QR factorization for general full ranked mxn matrices</li>
<li style="line-height:1.4em;margin:0;padding:0;">Remove deprecated functions <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">zero()</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">zeronm()</code>, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">one()</code> (see: 5da0884)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added cholesky and LDL factorizations, and respective solves.</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added functions for efficient triangular and diagonal solves.</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">SMatrix</code> was renamed to <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">SparseMatrix</code> (see: acd1685)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Physics</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">See the Quantum section</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Printing:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Implemented pretty printing of binomials (see: 58c1dad)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented pretty printing of Sum() (see: 84f2c22, 95b4321)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">sympy.printing</code> now supports ordering of terms and factors (see: 859bb33)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Lexicographic order is now the default. Now finally things will print as <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">x**2 + x + 1</code> instead of <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">1 + x + x**2</code>, however series still print using reversed ordering, e.g. <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">x - x**3/6 + O(x**5)</code>. You can get the old order (and other orderings) by setting the <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">-o</code> option to isympy (see: 08b4932, a30c5a3)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Series:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Implement a function to calculate residues, <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">residue()</code></li>
<li style="line-height:1.4em;margin:0;padding:0;">Implement nseries and lseries to handle <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">x0 != 0</code>, series should be more robust now (see: 2c99999, issues 2122-2124)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Improvements to Gruntz algorithm</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Simplify:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Added <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">use()</code> (see: 147c142)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">ratsimp()</code> now uses <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">cancel()</code> and <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">reduced()</code> (see: 108fb41)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Implemented EPath (see: 696139d, bf90689)</li>
<li style="line-height:1.4em;margin:0;padding:0;">a new keyword <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">rational</code> was added to nsimplify which will replace Floats with Rational approximations. (see: 053a045)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Solvers:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">ODE improvements (see: d12a2aa, 3542041; 73fb9ac)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added support for solving inequalities (see: 328eaba, 8455147, f8fcaa7)</li>
</ul>
<h3 style="line-height:26px;font-size:16px;margin:0;padding:26px 0 0;">Utilities:</h3>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Improve cartes, for generating the Cartesian product (see: b1b10ed)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Added a function computing topological sort of graphs (see: b2ce27b)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Allow to setup a customized printer in <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">lambdify()</code> (see: c1ad905)</li>
<li style="line-height:1.4em;margin:0;padding:0;"><code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">flatten()</code> was significantly improved (see: 31ed8d7)</li>
<li style="line-height:1.4em;margin:0;padding:0;">Major improvements to the Fortran code generator (see: <a href="http://code.google.com/p/sympy/wiki/CodeGenerationReport" style="line-height:1.4em;color:rgb(65,131,196);text-decoration:none;outline-style:none;outline-width:initial;outline-color:initial;margin:0;padding:0;">http://code.google.com/p/sympy/wiki/CodeGenerationReport</a>, 3383aa3, 7ab2da2, etc.)</li>
</ul>
<p style="line-height:1.4em;margin:16px 0 0;padding:0;">In addition to the more noticeable changes listed above, there have been numerous other smaller additions, improvements and bug fixes in the ~2000 commits in this release. See the git log for a full list of all changes. The command <code style="font:normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace;line-height:1.4em;background-color:rgb(248,248,248);font-size:13px;border-top-left-radius:3px 3px;border-top-right-radius:3px 3px;border-bottom-right-radius:3px 3px;border-bottom-left-radius:3px 3px;border-color:rgb(222,222,222);border-style:solid;border-width:1px;margin:0;padding:0;">git log sympy-0.6.7..sympy-0.7.0</code> will show all commits made between this release and the last. You can also see the issues closed since the last release <a href="http://code.google.com/p/sympy/issues/list?can=1&amp;q=closed-after%3A2010%2F3%2F17+closed-before%3A2011%2F6%2F13&amp;sort=-closed&amp;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary+Stars+Closed&amp;cells=tiles" style="line-height:1.4em;color:rgb(65,131,196);text-decoration:none;outline-style:none;outline-width:initial;outline-color:initial;margin:0;padding:0;">here</a>.</p>
<h2 style="line-height:normal;border-top-width:4px;border-top-style:solid;border-top-color:rgb(204,204,204);font-size:22px;margin:22px 0 0;padding:7px 0 0;">Authors</h2>
<p style="line-height:1.4em;margin:16px 0 0;padding:0;">The following people contributed at least one patch to this release (names are given in alphabetical order by last name). A total of 64 people contributed to this release. People with a * by their names contributed a patch for the first time for this release. Thirty-seven people contributed for the first time for this release. Over half of the people who contributed to this release contributed for the first time!</p>
<p style="line-height:1.4em;margin:16px 0 0;padding:0;">Thanks to everyone who contributed to this release!</p>
<ul style="line-height:1.4em;margin:0 0 0 1.5em;padding:20px 0 0;">
<li style="line-height:1.4em;margin:0;padding:0;">Tom Bachmann*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Tomas Bambas*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Matthew Brett*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Ondřej Čertík</li>
<li style="line-height:1.4em;margin:0;padding:0;">Renato Coutinho</li>
<li style="line-height:1.4em;margin:0;padding:0;">Addison Cugini*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Matt Curry*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Raffaele De Feo*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Mark Dewing</li>
<li style="line-height:1.4em;margin:0;padding:0;">Thomas Dixon*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Harold Erbin</li>
<li style="line-height:1.4em;margin:0;padding:0;">Pavel Fedotov*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Gilbert Gede*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Oleksandr Gituliar*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Brian Granger</li>
<li style="line-height:1.4em;margin:0;padding:0;">Alexey U. Gudchenko*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Øyvind Jensen</li>
<li style="line-height:1.4em;margin:0;padding:0;">Fredrik Johansson</li>
<li style="line-height:1.4em;margin:0;padding:0;">Felix Kaiser</li>
<li style="line-height:1.4em;margin:0;padding:0;">Yuri Karadzhov*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Gary Kerr*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Kibeom Kim*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Nicholas J.S. Kinar*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Anatolii Koval*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Sebastian Krämer</li>
<li style="line-height:1.4em;margin:0;padding:0;">Ryan Krauss</li>
<li style="line-height:1.4em;margin:0;padding:0;">Gregory Ksionda*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Priit Laes</li>
<li style="line-height:1.4em;margin:0;padding:0;">Vladimir Lagunov</li>
<li style="line-height:1.4em;margin:0;padding:0;">Ronan Lamy</li>
<li style="line-height:1.4em;margin:0;padding:0;">Tomo Lazovich*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Saptarshi Mandal*</li>
<li style="line-height:1.4em;margin:0;padding:0;">David Marek</li>
<li style="line-height:1.4em;margin:0;padding:0;">Jack McCaffery*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Benjamin McDonald*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Aaron Meurer</li>
<li style="line-height:1.4em;margin:0;padding:0;">Christian Muise*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Óscar Nájera*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Jezreel Ng*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Sherjil Ozair*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Mateusz Paprocki</li>
<li style="line-height:1.4em;margin:0;padding:0;">James Pearson</li>
<li style="line-height:1.4em;margin:0;padding:0;">Fernando Perez</li>
<li style="line-height:1.4em;margin:0;padding:0;">Vladimir Perić*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Mario Pernici*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Nicolas Pourcelot</li>
<li style="line-height:1.4em;margin:0;padding:0;">rayman*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Matthew Rocklin*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Christian Schubert</li>
<li style="line-height:1.4em;margin:0;padding:0;">Andre de Fortier Smit*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Chris Smith</li>
<li style="line-height:1.4em;margin:0;padding:0;">Cristóvão Sousa*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Akshay Srinivasan</li>
<li style="line-height:1.4em;margin:0;padding:0;">Vinzent Steinberg</li>
<li style="line-height:1.4em;margin:0;padding:0;">Prafullkumar P. Tale*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Andy R. Terrel</li>
<li style="line-height:1.4em;margin:0;padding:0;">Kazuo Thow*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Toon Verstraelen</li>
<li style="line-height:1.4em;margin:0;padding:0;">Sean Vig*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Luca Weihs*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Thomas Wiecki</li>
<li style="line-height:1.4em;margin:0;padding:0;">Shai &#8216;Deshe&#8217; Wyborski*</li>
<li style="line-height:1.4em;margin:0;padding:0;">Jeremias Yehdegho*</li>
</ul>
<p></span></b></span></span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/asmeurersympy.wordpress.com/950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/asmeurersympy.wordpress.com/950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/asmeurersympy.wordpress.com/950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/asmeurersympy.wordpress.com/950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/asmeurersympy.wordpress.com/950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/asmeurersympy.wordpress.com/950/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/asmeurersympy.wordpress.com/950/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/asmeurersympy.wordpress.com/950/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=asmeurersympy.wordpress.com&amp;blog=7467151&amp;post=950&amp;subd=asmeurersympy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://asmeurersympy.wordpress.com/2011/06/29/sympy-0-7-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0383e4cae325f65a1bbd906be4be2276?s=96&#38;d=wavatar&#38;r=G" medium="image">
			<media:title type="html">asmeurer</media:title>
		</media:content>
	</item>
	</channel>
</rss>
