--- /dev/null
+#ifndef __VIENNA_RNA_PACKAGE_PART_FUNC_CO_H__
+#define __VIENNA_RNA_PACKAGE_PART_FUNC_CO_H__
+
+#include "data_structures.h"
+
+#ifdef __GNUC__
+#define DEPRECATED(func) func __attribute__ ((deprecated))
+#else
+#define DEPRECATED(func) func
+#endif
+
+/**
+ * \addtogroup pf_cofold
+ * \brief Partition Function Cofolding
+ *
+ * To simplify the implementation the partition function computation is done
+ * internally in a null model that does not include the duplex initiation
+ * energy, i.e. the entropic penalty for producing a dimer from two
+ * monomers). The resulting free energies and pair probabilities are initially
+ * relative to that null model. In a second step the free energies can be
+ * corrected to include the dimerization penalty, and the pair probabilities
+ * can be divided into the conditional pair probabilities given that a re
+ * dimer is formed or not formed. See \cite bernhart:2006 for further details.
+ * @{
+ * \file part_func_co.h
+ *
+ * \brief Partition function for two RNA sequences
+ *
+ * As for folding one RNA molecule, this computes the partition function
+ * of all possible structures and the base pair probabilities. Uses the
+ * same global #pf_scale variable to avoid overflows.
+ *
+ * To simplify the implementation the partition function computation is done
+ * internally in a null model that does not include the duplex initiation
+ * energy, i.e. the entropic penalty for producing a dimer from two
+ * monomers). The resulting free energies and pair probabilities are initially
+ * relative to that null model. In a second step the free energies can be
+ * corrected to include the dimerization penalty, and the pair probabilities
+ * can be divided into the conditional pair probabilities given that a re
+ * dimer is formed or not formed.
+ *
+ * After computing the partition functions of all possible dimeres one
+ * can compute the probabilities of base pairs, the concentrations out of
+ * start concentrations and sofar and soaway.
+ *
+ * Dimer formation is inherently concentration dependent. Given the free
+ * energies of the monomers A and B and dimers AB, AA, and BB one can compute
+ * the equilibrium concentrations, given input concentrations of A and B, see
+ * e.g. Dimitrov & Zuker (2004)
+ */
+
+/**
+ * \brief Toggles no intrabp in 2nd mol
+ */
+extern int mirnatog;
+
+/**
+ * \brief Free energies of the two monomers
+ */
+extern double F_monomer[2];
+
+/**
+ * \brief Calculate partition function and base pair probabilities
+ *
+ * This is the cofold partition function folding. The second molecule starts
+ * at the #cut_point nucleotide.
+ *
+ * \note OpenMP: Since this function relies on the global parameters
+ * #do_backtrack, #dangles, #temperature and #pf_scale it is not
+ * threadsafe according to concurrent changes in these variables!
+ * Use co_pf_fold_par() instead to circumvent this issue.
+ *
+ * \see co_pf_fold_par()
+ *
+ * \param sequence Concatenated RNA sequences
+ * \param structure Will hold the structure or constraints
+ * \return cofoldF structure containing a set of energies needed for
+ * concentration computations.
+ */
+cofoldF co_pf_fold( char *sequence,
+ char *structure);
+
+/**
+ * \brief Calculate partition function and base pair probabilities
+ *
+ * This is the cofold partition function folding. The second molecule starts
+ * at the #cut_point nucleotide.
+ *
+ * \see get_boltzmann_factors(), co_pf_fold()
+ *
+ * \param sequence Concatenated RNA sequences
+ * \param structure Pointer to the structure constraint
+ * \param parameters Data structure containing the precalculated Boltzmann factors
+ * \param calculate_bppm Switch to turn Base pair probability calculations on/off (0==off)
+ * \param is_constrained Switch to indicate that a structure contraint is passed via the
+ * structure argument (0==off)
+ * \return cofoldF structure containing a set of energies needed for
+ * concentration computations.
+ */
+cofoldF co_pf_fold_par( char *sequence,
+ char *structure,
+ pf_paramT *parameters,
+ int calculate_bppm,
+ int is_constrained);
+
+/**
+ * \brief Get a pointer to the base pair probability array
+ *
+ * Accessing the base pair probabilities for a pair (i,j) is achieved by
+ * \verbatim FLT_OR_DBL *pr = export_bppm(); pr_ij = pr[iindx[i]-j]; \endverbatim
+ *
+ * \see get_iindx()
+ * \return A pointer to the base pair probability array
+ */
+FLT_OR_DBL *export_co_bppm(void);
+
+/**
+ * \brief Free the memory occupied by co_pf_fold()
+ */
+void free_co_pf_arrays(void);
+
+/**
+ * \brief Recalculate energy parameters
+ *
+ * This function recalculates all energy parameters given
+ * the current model settings.
+ *
+ * \note This function relies on the global variables #pf_scale, #dangles and
+ * #temperature. Thus it might not be threadsafe in certain situations.
+ * Use update_co_pf_params_par() instead.
+ *
+ * \see get_boltzmann_factors(), update_co_pf_params_par()
+ *
+ * \param length Length of the current RNA sequence
+ */
+void update_co_pf_params(int length);
+
+/**
+ * \brief Recalculate energy parameters
+ *
+ * This function recalculates all energy parameters given
+ * the current model settings.
+ * It's second argument can either be NULL or a data structure
+ * containing the precomputed Boltzmann factors. In the first
+ * scenario, the necessary data structure will be created automatically
+ * according to the current global model settings, i.e. this
+ * mode might not be threadsafe.
+ * However, if the provided data structure is not NULL, threadsafety
+ * for the model parameters #dangles, #pf_scale and #temperature is regained, since their
+ * values are taken from this data structure during subsequent calculations.
+ *
+ * \see get_boltzmann_factors(), update_co_pf_params()
+ *
+ * \param length Length of the current RNA sequence
+ * \param parameters data structure containing the precomputed Boltzmann factors
+ */
+void update_co_pf_params_par(int length,
+ pf_paramT *parameters);
+
+/**
+ * \brief Compute Boltzmann probabilities of dimerization without homodimers
+ *
+ * Given the pair probabilities and free energies (in the null model) for a
+ * dimer AB and the two constituent monomers A and B, compute the conditional pair
+ * probabilities given that a dimer AB actually forms.
+ * Null model pair probabilities are given as a list as produced by
+ * assign_plist_from_pr(), the dimer probabilities 'prAB' are modified in place.
+ *
+ * \param FAB free energy of dimer AB
+ * \param FEA free energy of monomer A
+ * \param FEB free energy of monomer B
+ * \param prAB pair probabilities for dimer
+ * \param prA pair probabilities monomer
+ * \param prB pair probabilities monomer
+ * \param Alength Length of molecule A
+ */
+void compute_probabilities(double FAB,
+ double FEA,
+ double FEB,
+ struct plist *prAB,
+ struct plist *prA,
+ struct plist *prB,
+ int Alength);
+
+/**
+ * \brief Given two start monomer concentrations a and b, compute the
+ * concentrations in thermodynamic equilibrium of all dimers and the monomers.
+ *
+ * This function takes an array 'startconc' of input concentrations with alternating
+ * entries for the initial concentrations of molecules A and B (terminated by
+ * two zeroes), then computes the resulting equilibrium concentrations
+ * from the free energies for the dimers. Dimer free energies should be the
+ * dimer-only free energies, i.e. the FcAB entries from the #cofoldF struct.
+ *
+ * \param FEAB Free energy of AB dimer (FcAB entry)
+ * \param FEAA Free energy of AA dimer (FcAB entry)
+ * \param FEBB Free energy of BB dimer (FcAB entry)
+ * \param FEA Free energy of monomer A
+ * \param FEB Free energy of monomer B
+ * \param startconc List of start concentrations [a0],[b0],[a1],[b1],...,[an][bn],[0],[0]
+ * \return ConcEnt array containing the equilibrium energies and start concentrations
+ */
+ConcEnt *get_concentrations(double FEAB,
+ double FEAA,
+ double FEBB,
+ double FEA,
+ double FEB,
+ double *startconc);
+
+
+/**
+ * @}
+ */
+
+/*
+#################################################
+# DEPRECATED FUNCTIONS #
+#################################################
+*/
+
+/**
+ * DO NOT USE THIS FUNCTION ANYMORE
+ * \deprecated{ This function is deprecated and will be removed soon!}
+ * use \ref assign_plist_from_pr() instead!
+ */
+DEPRECATED(plist *get_plist( struct plist *pl,
+ int length,
+ double cut_off));
+/**
+ * DO NOT USE THIS FUNCTION ANYMORE
+ * \deprecated{ This function is deprecated and will be removed soon!}
+ */
+DEPRECATED(void init_co_pf_fold(int length));
+
+#endif