/HMMoC-BFloat-Algebra

A tiny C++ library supplying the Algebra<> template, for polymorphic representation of non-negative floating-point values in either native (eg double), log-transformed, or BFloat representations. BFloat is the Buoyant Float type, allowing fixed-precision representation at an arbitrary precision range. The library is based on code from: Lunter G. HMMoC—a compiler for hidden Markov models. Bioinformatics (2007) 23(18): 2485-2487. The code was derived by Ian Holmes and Gerton Lunter from Holmes I, Rubin GM. An expectation maximization algorithm for training hidden substitution models. J Mol Biol. 2002 Apr 12;317(5):753-64. You may use at will, subject to the license, but *please cite those two papers* in your academic publications associated with uses of this library. Thank you!

Primary LanguageC++Apache License 2.0Apache-2.0

This is HMMoC-BFloat-Algebra, a tiny C++ library supplying the
Algebra<> template, for polymorphic representation of non-negative
floating-point values in either native (eg double), log-transformed,
or BFloat representations.  BFloat is the Buoyant Float type, allowing
fixed-precision representation at an arbitrary precision range.  The
library is based on code from: Lunter G. HMMoC—a compiler for hidden
Markov models. Bioinformatics (2007) 23(18): 2485-2487. The code was
derived by Ian Holmes and Gerton Lunter from Holmes I, Rubin GM. An
expectation maximization algorithm for training hidden substitution
models.  J Mol Biol. 2002 Apr 12;317(5):753-64.  You may use at will,
subject to the license (Apache v2.0), but *please cite those two papers*
in your documentation and publications associated with uses of this
library.  Thank you!

Copyright (C) 2011 by Paul T Edlefsen, Fred Hutchinson Cancer Research
Center.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-----
To use, simply include Algebra.hpp in your code, and compile-in
Algebra.cpp.  Alternately, use the provided Makefile to make the
HMMoC-BFloat-Algebra library, and compile that into your code.  An
example is provided (make tests) -- note that this isn't so much a
test of the library as it is a test of the compilation and linking.

-- BOOST serialization support:
By default, boost serialization support is compiled in, so you'll need to link with -lboost_serialization (and make sure the boost dirs are in your include and linking paths) -- or if you don't want boost, compile with -DNBOOST_SERIALIZATION (or just #define NBOOST_SERIALIZATION in your code before #include -ing Algebra.hpp).  If you use the provided Makefile, see where BOOST_CFLAGS is defined.

On my system, the boost libraries are in /usr/local/lib, and boost includes are in /usr/local/include.  I got them there like so:
# Retrieve boost from http://sourceforge.net/projects/boost/files/boost/1.46.1/
# Unpack it.  From one dir above it:
cd boost_1_46_1
./bootstrap.sh 
# Skip unless you want to use MPI in boost:
echo "using mpi ;" >> project-config.jam
sudo bjam install
# Now go into the HMMoC-BFloat-Algebra directory.
cd HMMoC-BFloat-Algebra
ln -s /usr/local/include boost-include
ln -s /usr/local/lib boost-lib

-- BOOST bjam support:
If you are a boost bjam user, a Jamroot is provided as an alternative
to the Makefile.  After creating the boost-include and boost-lib links
(see above), do:
bjam release
bjam dist
..and you'll find that libHMMoC-BFloat-Algebra.a is now in the current directory
..or if you have su permissions and want to install it in /usr/local/lib, do:
sudo bjam install

-- #defines
There are convenient #defines at the bottom of Algebra.hpp for simple
use.  For instance:
  typedef bfloat ProbabilityType;
  //typedef logspace ProbabilityType;
  //typedef floatrealspace ProbabilityType;
  //typedef doublerealspace ProbabilityType;

-- Negative values
Note that some of the Algebra types must never go negative (so
effectively to remain polymorphic, none of them can).  If you compile
with -DNDEBUG, there will be no sanity checking in the code to help
prevent negative values (but it will run much faster without those
checks!).  If you find yourself performing subtractions that might
result in negative results, you must implement the checking yourself
and make sure to subtract the smaller from the larger value.

-----
This code has not been rigourously tested, so use it at your own
risk/peril.  If you find something amiss, please let us know!  Please
fix it if you are able!  Your contributions are most welcome.

Lastly, though we don't require it, we'd love to hear about it if you
use these classes in your own code.  Find the HMMoC-BFloat-Algebra
project on GitHub and leave us a note!  Or email me: pedlefsen at
gmail dot com.  And please, don't forget to cite the papers listed at
the top of this document.

Thank you,
  Paul

Paul T. Edlefsen
June 18, 2011