2012 Grant Accomplishment Report

The following two projects have been completed, and their deliverables have been accepted by the grant committee.

 The summary of their final reports is as follows:

SciRuby and NMatrix

Ruby Science Foundation

NMatrix is a fast, modern linear algebra library for Ruby with support for dense as well as two types of sparse matrices. Written in C, NMatrix makes use of ATLAS for floating point matrix operations, but is also working toward rational and Ruby object matrix support.

NMatrix is a core component of the SciRuby Project, under the umbrella of the Ruby Science Foundation. We believe that adoption for Ruby in the sciences is currently limited by the lack of numerical, visualization, and scientific libraries -- but that interest in these areas is high.

We utilized our Ruby Association grant to hire three student fellows to work on NMatrix.

GSL Support

Ruby/GSL (rb-gsl), the gem that allows Ruby to make use of the GNU Scientific Library, previously worked with NArray, but not NMatrix. Masaomi Hatakeyama, together with John Woods, wrote a fork which will eventually be submitted as a patch to enable rb-gsl to work with NMatrix. The fork is currently available at http://github.com/sciruby/rb-gsl/, and is the most critical step in allowing interoperability between NMatrix and the other SciRuby component projects (e.g., Statsample).

Masa also wrote a benchmark script for comparing some operations between GSL, NMatrix, and NArray (https://github.com/masaomi/benchmark) and dramatically improved RSpec coverage for NMatrix.

The full version of Masa's final report

Documentation & Usability

Carlos Agarie worked to improve the documentation for NMatrix and SciRuby in general, ensuring that nearly all user-exposed functions are properly documented. He also submitted a patch to the RDoc project to improve parsing of C++ source code.

Generally, Carlos worked on improving usability of NMatrix, by introducing shortcut functions such as #row and #column. Carlos has also been working steadily on rational support for matrix inversion and determinant calculation.

It is worth noting that Carlos wrote SciRuby's successful application to Google Summer of Code 2013, and he plans to serve as a mentor this summer.

The full version of Carlos's final report

Stability and Basic Features

Ryan's fellowship term began after Carlos' and Masa's, so his work is ongoing. He has been working on implementing an #each_stored_with_indices iterator for sparse matrices, which allows a programmer to iterate only across the values stored in a matrix rather than every cell. In addition, Ryan is working on eigenvector and eigenvalue decomposition, as well as row reduction.

Creosote - A Mathematics Package for Ruby

Sam Rawlins

The Creosote project under the Ruby Association 2012 Grant aims to:

   - Support up-to-date GMP, MPFR, and Msieve libraries, and extensive
   documentation for each,
   - Create Ruby bindings for GMP-ECM
   - Create Ruby bindings for MPC
   - Create Creosote, a library that allows various mathematical libraries
   to be bridged, in Ruby

Source Code:

https://github.com/srawlins/gmp (bindings for GMP and MPFR)

GMP gem

   - At this point, the gmp gem exposes over 70 functions from GMP’s Integer
   Functions interface, over 25 from the Rational Number Functions interface,
   and over 33 from the Floating-point Functions interface.
   - In addition, seven Ruby methods expose the Random Number Functions
   - The gmp gem is currently documented with a 31-page manual and rdoc.

MPFR bindings

   - At this point the gmp gem exposes over 55 functions from MPFR’s


   - The GMP-ECM API consists entirely of one very large struct, *ecm_params
   * (with 29 members), and one method (*ecm_factor(mpz_t, mpz_t, double,
   ecm_params)*). *ecm_factor* was bridged to Ruby as *GMP::Z#ecm_factor*.
   The difficult component of these bindings is supporting all of the types of
   fields in *ecm_params*. In total, the parameter types include *mpz_t* (*
   GMP::Z* in Ruby), *int* (*Fixnum* in Ruby), *double* (*Float* in Ruby), *
   FILE** (*IO* in Ruby), *char** (*String* in Ruby), and *gmp_randstate_t*(
   *GMP::RandState* in Ruby).
   - During the grant period, support was written in the bindings for about
   half of the fields in *ecm_params*, which can be found in the gmp_ecm


   - more than 40 functions from the MPC Complex Numbers interface have
   been bridged in the gnu_mpc gem.
   - more than 90% of the methods exposed in the gnu_mpc gem are heavily
   tested. The test suite includes over 160 test examples.
   - Approximately 10 functions from the MPC interface have not been
   - The gnu_mpc gem has largely been documented in *manual.md*, which gets
   compiled into a 12-page *manual.pdf* and *manual.html*, using Pandoc (*
   make* will compile the manual if Pandoc is installed).


   - Creosote is a library with two goals. It allows Ruby users to install
   C Extension gems and their prerequisites, similar to rvm installing libyaml
   et al. in order to install a Ruby. Its end goal, however, is to allow
   various mathematical C Extension libraries to share data.
   - This libaray is largely ready for a public release. At present, the
   library “knows about” GMP, MPFR, MPC, and Msieve. It can be queried for the
   latest version of each package. It can also unpack, configure, make, check,
   and install each of these packages. The packages install to *
   - Installing the packages is made useful when we install certain gems
   and specify specific arguments for *ruby extconf.rb*. This is made
   possible with the *creosote gem install* command.

Full Final Report