#ifndef _BLASR_SCORE_ANCHORS_HPP_
#define _BLASR_SCORE_ANCHORS_HPP_

#include <cmath>

#include <alignment/statistics/cdfs.hpp>
#include <alignment/statistics/pdfs.hpp>
#include <alignment/tuples/DNATuple.hpp>
#include <alignment/tuples/TupleCountTable.hpp>
#include <alignment/tuples/TupleMetrics.hpp>

template <typename TSequence, typename T_Tuple>
int GetTupleCount(TSequence &seq, DNALength startPos, TupleMetrics &tm,
                  TupleCountTable<TSequence, T_Tuple> &ct, int &count);

template <typename TSequence, typename T_Tuple>
int PMatch(TSequence &seq, DNALength startPos, DNALength length, TupleMetrics &tm,
           TupleCountTable<TSequence, T_Tuple> &ct, float &pMatch);

template <typename TSequence, typename T_Tuple>
int POneOrMoreMatches(TSequence &seq, DNALength startPos, DNALength length, TupleMetrics &tm,
                      TupleCountTable<TSequence, T_Tuple> &ct, float &pValue);

template <typename TSequence, typename T_Tuple>
int SumRightShiftMarginalTupleCounts(TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct,
                                     T_Tuple curTuple, int nextNuc, int &nextSeqCount);

template <typename TSequence, typename T_Tuple>
int ComputeTotalTupleCount(TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct,
                           TSequence &seq, int start = 0, int end = -1);

template <typename TSequence, typename T_Tuple>
int ComputeAverageTupleCount(TupleMetrics &tm, TupleCountTable<TSequence, T_Tuple> &ct,
                             TSequence &seq);

inline int ComputeExpectedFirstWaitingTime(float lambda);

#include "ScoreAnchorsImpl.hpp"

#endif
