HMSBEAGLE  1.0.0
libhmsbeagle/CPU/BeagleCPU4StateImpl.h
00001 /*
00002  *  BeagleCPU4StateImpl.h
00003  *  BEAGLE
00004  *
00005  * Copyright 2009 Phylogenetic Likelihood Working Group
00006  *
00007  * This file is part of BEAGLE.
00008  *
00009  * BEAGLE is free software: you can redistribute it and/or modify
00010  * it under the terms of the GNU Lesser General Public License as
00011  * published by the Free Software Foundation, either version 3 of
00012  * the License, or (at your option) any later version.
00013  *
00014  * BEAGLE is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  * GNU Lesser General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with BEAGLE.  If not, see
00021  * <http://www.gnu.org/licenses/>.
00022  *
00023  * @author Andrew Rambaut
00024  * @author Marc Suchard
00025  * @author Daniel Ayres
00026  */
00027 
00028 #ifndef __BeagleCPU4StateImpl__
00029 #define __BeagleCPU4StateImpl__
00030 
00031 #ifdef HAVE_CONFIG_H
00032 #include "libhmsbeagle/config.h"
00033 #endif
00034 
00035 #include "libhmsbeagle/CPU/BeagleCPUImpl.h"
00036 
00037 #include <vector>
00038 
00039 namespace beagle {
00040 namespace cpu {
00041 
00042 //const char* beagleCPU4StateImplDoubleName = "CPU-4State-Double";
00043 //const char* beagleCPU4StateImplSingleName = "CPU-4State-Single";
00044 
00045 BEAGLE_CPU_TEMPLATE
00046 class BeagleCPU4StateImpl : public BeagleCPUImpl<BEAGLE_CPU_GENERIC> {
00047 
00048 protected:
00049         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kFlags;
00050         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kTipCount;
00051         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gPartials;
00052         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::integrationTmp;
00053         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gTransitionMatrices;
00054         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kPatternCount;
00055         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kPaddedPatternCount;
00056         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kExtraPatterns;
00057         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kStateCount;
00058         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gTipStates;
00059         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::kCategoryCount;
00060         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gScaleBuffers;
00061         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gStateFrequencies;
00062         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gCategoryWeights;
00063         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::gPatternWeights;
00064         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::outLogLikelihoodsTmp;
00065         using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::realtypeMin;
00066     using BeagleCPUImpl<BEAGLE_CPU_GENERIC>::scalingExponentThreshhold;
00067 
00068 public:
00069     virtual ~BeagleCPU4StateImpl();
00070     virtual const char* getName();
00071 
00072 
00073     virtual void calcStatesStates(REALTYPE* destP,
00074                                     const int* states1,
00075                                     const REALTYPE* matrices1,
00076                                     const int* states2,
00077                                     const REALTYPE* matrices2);
00078     
00079     virtual void calcStatesPartials(REALTYPE* destP,
00080                                     const int* states1,
00081                                     const REALTYPE* matrices1,
00082                                     const REALTYPE* partials2,
00083                                     const REALTYPE* matrices2);
00084     
00085     virtual void calcPartialsPartials(REALTYPE* destP,
00086                                     const REALTYPE* partials1,
00087                                     const REALTYPE* matrices1,
00088                                     const REALTYPE* partials2,
00089                                     const REALTYPE* matrices2);
00090     
00091     virtual int calcRootLogLikelihoods(const int bufferIndex,
00092                                         const int categoryWeightsIndex,
00093                                         const int stateFrequenciesIndex,
00094                                         const int scalingFactorsIndex,
00095                                         double* outSumLogLikelihood);
00096     
00097     virtual int calcRootLogLikelihoodsMulti(const int* bufferIndices,
00098                                              const int* categoryWeightsIndices,
00099                                              const int* stateFrequenciesIndices,
00100                                              const int* scaleBufferIndices,
00101                                              int count,
00102                                              double* outSumLogLikelihood);    
00103         
00104     virtual int calcEdgeLogLikelihoods(const int parentBufferIndex,
00105                                         const int childBufferIndex,
00106                                         const int probabilityIndex,
00107                                         const int categoryWeightsIndex,
00108                                         const int stateFrequenciesIndex,
00109                                         const int scalingFactorsIndex,
00110                                         double* outSumLogLikelihood);
00111     
00112     virtual void calcStatesStatesFixedScaling(REALTYPE *destP,
00113                                            const int *child0States,
00114                                         const REALTYPE *child0TransMat,
00115                                            const int *child1States,
00116                                         const REALTYPE *child1TransMat,
00117                                         const REALTYPE *scaleFactors);
00118 
00119     virtual void calcStatesPartialsFixedScaling(REALTYPE *destP,
00120                                              const int *child0States,
00121                                           const REALTYPE *child0TransMat,
00122                                           const REALTYPE *child1Partials,
00123                                           const REALTYPE *child1TransMat,
00124                                           const REALTYPE *scaleFactors);
00125 
00126     virtual void calcPartialsPartialsFixedScaling(REALTYPE *destP,
00127                                             const REALTYPE *child0Partials,
00128                                             const REALTYPE *child0TransMat,
00129                                             const REALTYPE *child1Partials,
00130                                             const REALTYPE *child1TransMat,
00131                                             const REALTYPE *scaleFactors);
00132     
00133     virtual void calcPartialsPartialsAutoScaling(REALTYPE *destP,
00134                                                   const REALTYPE *child0Partials,
00135                                                   const REALTYPE *child0TransMat,
00136                                                   const REALTYPE *child1Partials,
00137                                                   const REALTYPE *child1TransMat,
00138                                                   int *activateScaling);
00139     
00140     
00141     inline int integrateOutStatesAndScale(const REALTYPE* integrationTmp,
00142                                            const int stateFrequenciesIndex,
00143                                            const int scalingFactorsIndex,
00144                                            double* outSumLogLikelihood);
00145 
00146     virtual void rescalePartials(REALTYPE *destP,
00147                                      REALTYPE *scaleFactors,
00148                                  REALTYPE *cumulativeScaleFactors,
00149                                  const int  fillWithOnes);
00150 
00151 };
00152 
00153 BEAGLE_CPU_FACTORY_TEMPLATE
00154 class BeagleCPU4StateImplFactory : public BeagleImplFactory {
00155 public:
00156     virtual BeagleImpl* createImpl(int tipCount,
00157                                    int partialsBufferCount,
00158                                    int compactBufferCount,
00159                                    int stateCount,
00160                                    int patternCount,
00161                                    int eigenBufferCount,
00162                                    int matrixBufferCount,
00163                                    int categoryCount,
00164                                    int scaleBufferCount,
00165                                    int resourceNumber,
00166                                    long preferenceFlags,
00167                                    long requirementFlags,
00168                                    int* errorCode);
00169 
00170     virtual const char* getName();
00171     virtual const long getFlags();
00172 };
00173 
00174 }       // namespace cpu
00175 }       // namespace beagle
00176 
00177 // now include the file containing template function implementations
00178 #include "libhmsbeagle/CPU/BeagleCPU4StateImpl.hpp"
00179 
00180 #endif // __BeagleCPU4StateImpl__