ADPfusion: Efficient, high-level dynamic programming.

[ algorithms, bioinformatics, bsd3, data-structures, formal-languages, library ] [ Propose Tags ]

ADPfusion combines stream-fusion (using the stream interface provided by the vector library) and type-level programming to provide highly efficient dynamic programming combinators.

ADPfusion allows writing dynamic programs for single- and multi-tape problems. Inputs can be sequences, or sets. And new input types can be defined, without having to rewrite this library thanks to the open-world assumption of ADPfusion.

The library provides the machinery for Outside and Ensemble algorithms as well. Ensemble algorithms combine Inside and Outside calculations.

The homepage provides a number of tutorial-style examples, with linear and context-free grammars over sequence and set inputs.

Ideas implemented here are described in a couple of papers:

Christian Hoener zu Siederdissen
Sneaking Around ConcatMap: Efficient Combinators for Dynamic Programming
2012. Proceedings of the 17th ACM SIGPLAN international conference on Functional programming
http://doi.acm.org/10.1145/2364527.2364559 preprint: http://www.tbi.univie.ac.at/newpapers/pdfs/TBI-p-2012-2.pdf
Andrew Farmer, Christian Höner zu Siederdissen, and Andy Gill.
The HERMIT in the stream: fusing stream fusion’s concatMap.
2014. Proceedings of the ACM SIGPLAN 2014 workshop on Partial evaluation and program manipulation.
http://dl.acm.org/citation.cfm?doid=2543728.2543736
Christian Höner zu Siederdissen, Ivo L. Hofacker, and Peter F. Stadler.
Product Grammars for Alignment and Folding.
2014. IEEE/ACM Transactions on Computational Biology and Bioinformatics. 99.
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6819790
Christian Höner zu Siederdissen, Sonja J. Prohaska, and Peter F. Stadler.
Algebraic Dynamic Programming over General Data Structures.
2015. submitted.

[Skip to Readme]
Versions 0.0.1.0, 0.0.1.1, 0.0.1.2, 0.1.0.0, 0.2.0.0, 0.2.0.1, 0.2.0.2, 0.2.0.3, 0.2.0.4, 0.2.1.0, 0.4.0.0, 0.4.0.1, 0.4.0.2, 0.4.1.0, 0.4.1.1, 0.5.0.0, 0.5.1.0, 0.5.2.0, 0.5.2.2 (info)
Change log changelog.md
Dependencies base (>=4.7 && <4.9), bits (==0.4.*), mmorph (==1.0.*), monad-primitive (==0.1), mtl (==2.*), OrderedBits (==0.0.0.*), primitive (>=0.5.4 && <0.7), PrimitiveArray (==0.6.0.*), QuickCheck (>=2.7 && <2.9), strict (==0.3.*), template-haskell (==2.*), transformers (>=0.3 && <0.5), tuple (==0.3.*), vector (==0.10.*) [details]
License BSD-3-Clause
Copyright Christian Hoener zu Siederdissen, 2011-2015
Author Christian Hoener zu Siederdissen, 2011-2015
Maintainer choener@bioinf.uni-leipzig.de
Category Algorithms, Data Structures, Bioinformatics, Formal Languages
Home page http://www.bioinf.uni-leipzig.de/Software/gADP/
Source repo head: git clone git://github.com/choener/ADPfusion
Uploaded by ChristianHoener at Thu May 7 14:49:17 UTC 2015
Distributions NixOS:0.5.2.2
Executables Durbin, PartNussinov, Nussinov, NeedlemanWunsch
Downloads 8130 total (28 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2015-05-07 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Flags

NameDescriptionDefaultType
examples

build the examples

DisabledManual
llvm

build using LLVM

DisabledManual
debug

dump intermediate Core files

DisabledManual

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for ADPfusion-0.4.0.1

[back to package description]

ADPfusion

Build Status

generalized ADPfusion Homepage

Introduction

ADPfusion combines stream-fusion (using the stream interface provided by the vector library) and type-level programming to provide highly efficient dynamic programming combinators.

From the programmers' viewpoint, ADPfusion behaves very much like the original ADP implementation http://bibiserv.techfak.uni-bielefeld.de/adp/ developed by Robert Giegerich and colleagues, though both combinator semantics and backtracking are different.

The library internals, however, are designed not only to speed up ADP by a large margin (which this library does), but also to provide further runtime improvements by allowing the programmer to switch over to other kinds of data structures with better time and space behaviour. Most importantly, dynamic programming tables can be strict, removing indirections present in lazy, boxed tables.

As an example, even rather complex ADP code tends to be completely optimized to loops that use only unboxed variables (Int# and others, indexIntArray# and others).

Completely novel (compared to ADP), is the idea of allowing efficient monadic combinators. This facilitates writing code that performs backtracking, or samples structures stochastically, among others things.

This version is still highly experimental and makes use of multiple recent improvements in GHC. This is particularly true for the monadic interface.

Long term goals: Outer indices with more than two dimensions, specialized table design, a combinator library, a library for computational biology.

Two algorithms from the realm of computational biology are provided as examples on how to write dynamic programming algorithms using this library: http://hackage.haskell.org/package/Nussinov78 and http://hackage.haskell.org/package/RNAfold.

Installation

If GHC-7.2.2/GHC-7.4, LLVM and cabal-install are available, you should be all set. I recommend using cabal-dev as it provides a very nice sandbox (replace cabal-dev with cabal otherwise).

If you go with cabal-dev, no explicit installation is necessary and ADPfusion will be installed in the sandbox together with the example algorithms or your own.

For a more global installation, "cabal install ADPfusion" should do the trick.

To run the Quickcheck tests, do an additional "cabal-dev install QuickCheck", then "cabal-dev ghci", ":l ADP/Fusion/QuickCheck.hs", and "allProps". Loading the quickcheck module should take a bit due to compilation. "allProps" tests all properties and should yield no errors.

Notes

If you have problems, find bugs, or want to use this library to write your own DP algorithms, please send me a mail. I'm very interested in hearing what is missing.

One of the things I'll be integrating is an extension to higher dimensions (more than two).

Right now, I am not quite happy with the construction and destruction of the "Box" representations. These will change soon. In addition, an analysis of the actual combinators should remove the need for nested applications of objective functions in many cases.

Implementors Notes

  • The general inlining scheme is: (i) mkStream is {-# INLINE mkStream #-}, inner functions like mk, step, worker functions, and index-modifying functions get an {-# INLINE [0] funName #-}. Where there is no function to annotate, use delay_inline.

  • If you implement a new kind of memoizing table, like the dense Table.Array ones, you will have to implement mkStream code. When you hand to the left, the (i,j) indices and modify their extend (by, say, having NonEmpty table constaints), you have to delay_inline this (until inliner phase 0). Otherwise you will break fusion for mkStream.

Contact

Christian Hoener zu Siederdissen choener@bioinf.uni-leipzig.de Leipzig University, Leipzig, Germany