Coincidentally enough, this week also marks the one year anniversary of my switch to work on OptimoJoe full time. As some back story, about a year ago, I left my position at Sandia National Laboratories to work exclusively on OptimoJoe. Overall, Sandia was a great place to work; I had fantastic coworkers and interesting technical problems to work on. In fact, I liked it enough to spend over a decade working for them off an on going to back to 1999. Nonetheless, I wanted to push my technical work and research in a different direction and I felt I’d be better equipped to do so while working for myself.
Thankfully, Sandia is a big proponent of open source software, so I given approval for the public release of an optimization code I wrote called PEOpt. The first release occurred in February 2012 and the last release occurred in May 2013. For the extra curious, you can find one of the OSTI publications here. In any case, PEOpt was a code that I wrote to specially handle very, very large PDE constrained optimization problems. To that end, I’d like to think it performed well.
Now, what’s the difference between Optizelle and PEOpt? As it turns out, quite a bit. At its core, both codes remain similar in the sense that I use relatively general vector space operations to write the optimization code. This makes it much easier to hook into a new application because the application, not the optimization code, defines how to compute the linear algebra. What changed were the nitty gritty details on how all of this was put together. Basically, I started getting customers and quickly realized that the code needed to be more reliable, consistent, and easy to use. That and I really needed to fix some long outstanding algorithmic bugs.
Over the coming weeks, I’ll try to elaborate on many of these technical issues. As a teaser, this will include
Why it’s more difficult to build scientific software on Windows
How we synchronize our manual to our code and why we couldn’t use doxygen
Our experience in migrating an SVN repository to Git with a minimal loss of history
How we maintain a (mostly) consistent interface across C++, Python, and MATLAB/Octave