28 #ifndef __BeagleCPUImpl__
29 #define __BeagleCPUImpl__
32 #include "libhmsbeagle/config.h"
35 #include "libhmsbeagle/BeagleImpl.h"
36 #include "libhmsbeagle/CPU/Precision.h"
37 #include "libhmsbeagle/CPU/EigenDecomposition.h"
41 #define BEAGLE_CPU_GENERIC REALTYPE, T_PAD, P_PAD
42 #define BEAGLE_CPU_TEMPLATE template <typename REALTYPE, int T_PAD, int P_PAD>
44 #define BEAGLE_CPU_FACTORY_GENERIC REALTYPE
45 #define BEAGLE_CPU_FACTORY_TEMPLATE template <typename REALTYPE>
48 #define T_PAD_DEFAULT 1 // Pad transition matrix rows with an extra 1.0 for ambiguous characters
49 #define P_PAD_DEFAULT 0 // No partials padding necessary for non-SSE implementations
69 int kPartialsPaddedStateCount;
70 int kEigenDecompCount;
72 int kScaleBufferCount;
82 int scalingExponentThreshhold;
86 double* gCategoryRates;
87 double* gPatternWeights;
89 REALTYPE** gCategoryWeights;
90 REALTYPE** gStateFrequencies;
97 REALTYPE** gScaleBuffers;
99 signed short** gAutoScaleBuffers;
101 int* gActiveScalingFactors;
106 REALTYPE** gTransitionMatrices;
108 REALTYPE* integrationTmp;
109 REALTYPE* firstDerivTmp;
110 REALTYPE* secondDerivTmp;
112 REALTYPE* outLogLikelihoodsTmp;
113 REALTYPE* outFirstDerivativesTmp;
114 REALTYPE* outSecondDerivativesTmp;
123 int createInstance(
int tipCount,
124 int partialsBufferCount,
125 int compactBufferCount,
128 int eigenDecompositionCount,
131 int scaleBufferCount,
133 long preferenceFlags,
134 long requirementFlags);
143 int setTipStates(
int tipIndex,
144 const int* inStates);
150 int setTipPartials(
int tipIndex,
151 const double* inPartials);
154 int setPartials(
int bufferIndex,
155 const double* inPartials);
157 int getPartials(
int bufferIndex,
159 double* outPartials);
167 int setEigenDecomposition(
int eigenIndex,
168 const double* inEigenVectors,
169 const double* inInverseEigenVectors,
170 const double* inEigenValues);
172 int setStateFrequencies(
int stateFrequenciesIndex,
173 const double* inStateFrequencies);
175 int setCategoryWeights(
int categoryWeightsIndex,
176 const double* inCategoryWeights);
178 int setPatternWeights(
const double* inPatternWeights);
183 int setCategoryRates(
const double* inCategoryRates);
185 int setTransitionMatrix(
int matrixIndex,
186 const double* inMatrix,
189 int setTransitionMatrices(
const int* matrixIndices,
190 const double* inMatrices,
191 const double* paddedValues,
194 int getTransitionMatrix(
int matrixIndex,
203 int updateTransitionMatrices(
int eigenIndex,
204 const int* probabilityIndices,
205 const int* firstDerivativeIndices,
206 const int* secondDerivativeIndices,
207 const double* edgeLengths,
216 int updatePartials(
const int* operations,
218 int cumulativeScalingIndex);
233 int waitForPartials(
const int* destinationPartials,
234 int destinationPartialsCount);
237 int accumulateScaleFactors(
const int* scalingIndices,
239 int cumulativeScalingIndex);
241 int removeScaleFactors(
const int* scalingIndices,
243 int cumulativeScalingIndex);
245 int resetScaleFactors(
int cumulativeScalingIndex);
247 int copyScaleFactors(
int destScalingIndex,
248 int srcScalingIndex);
254 int calculateRootLogLikelihoods(
const int* bufferIndices,
255 const int* categoryWeightsIndices,
256 const int* stateFrequenciesIndices,
257 const int* cumulativeScaleIndices,
259 double* outSumLogLikelihood);
263 int calculateEdgeLogLikelihoods(
const int* parentBufferIndices,
264 const int* childBufferIndices,
265 const int* probabilityIndices,
266 const int* firstDerivativeIndices,
267 const int* secondDerivativeIndices,
268 const int* categoryWeightsIndices,
269 const int* stateFrequenciesIndices,
270 const int* cumulativeScaleIndices,
272 double* outSumLogLikelihood,
273 double* outSumFirstDerivative,
274 double* outSumSecondDerivative);
276 int getSiteLogLikelihoods(
double* outLogLikelihoods);
278 int getSiteDerivatives(
double* outFirstDerivatives,
279 double* outSecondDerivatives);
283 virtual const char* getName();
285 virtual const long getFlags();
288 virtual void calcStatesStates(REALTYPE* destP,
290 const REALTYPE* matrices1,
292 const REALTYPE* matrices2);
295 virtual void calcStatesPartials(REALTYPE* destP,
297 const REALTYPE* matrices1,
298 const REALTYPE* partials2,
299 const REALTYPE* matrices2);
301 virtual void calcPartialsPartials(REALTYPE* destP,
302 const REALTYPE* partials1,
303 const REALTYPE* matrices1,
304 const REALTYPE* partials2,
305 const REALTYPE* matrices2);
307 virtual int calcRootLogLikelihoods(
const int bufferIndex,
308 const int categoryWeightsIndex,
309 const int stateFrequenciesIndex,
310 const int scaleBufferIndex,
311 double* outSumLogLikelihood);
313 virtual int calcRootLogLikelihoodsMulti(
const int* bufferIndices,
314 const int* categoryWeightsIndices,
315 const int* stateFrequenciesIndices,
316 const int* scaleBufferIndices,
318 double* outSumLogLikelihood);
320 virtual int calcEdgeLogLikelihoods(
const int parentBufferIndex,
321 const int childBufferIndex,
322 const int probabilityIndex,
323 const int categoryWeightsIndex,
324 const int stateFrequenciesIndex,
325 const int scalingFactorsIndex,
326 double* outSumLogLikelihood);
328 virtual int calcEdgeLogLikelihoodsMulti(
const int* parentBufferIndices,
329 const int* childBufferIndices,
330 const int* probabilityIndices,
331 const int* categoryWeightsIndices,
332 const int* stateFrequenciesIndices,
333 const int* scalingFactorsIndices,
335 double* outSumLogLikelihood);
337 virtual int calcEdgeLogLikelihoodsFirstDeriv(
const int parentBufferIndex,
338 const int childBufferIndex,
339 const int probabilityIndex,
340 const int firstDerivativeIndex,
341 const int categoryWeightsIndex,
342 const int stateFrequenciesIndex,
343 const int scalingFactorsIndex,
344 double* outSumLogLikelihood,
345 double* outSumFirstDerivative);
347 virtual int calcEdgeLogLikelihoodsSecondDeriv(
const int parentBufferIndex,
348 const int childBufferIndex,
349 const int probabilityIndex,
350 const int firstDerivativeIndex,
351 const int secondDerivativeIndex,
352 const int categoryWeightsIndex,
353 const int stateFrequenciesIndex,
354 const int scalingFactorsIndex,
355 double* outSumLogLikelihood,
356 double* outSumFirstDerivative,
357 double* outSumSecondDerivative);
359 virtual void calcStatesStatesFixedScaling(REALTYPE *destP,
360 const int *child0States,
361 const REALTYPE *child0TransMat,
362 const int *child1States,
363 const REALTYPE *child1TransMat,
364 const REALTYPE *scaleFactors);
366 virtual void calcStatesPartialsFixedScaling(REALTYPE *destP,
367 const int *child0States,
368 const REALTYPE *child0TransMat,
369 const REALTYPE *child1Partials,
370 const REALTYPE *child1TransMat,
371 const REALTYPE *scaleFactors);
373 virtual void calcPartialsPartialsFixedScaling(REALTYPE *destP,
374 const REALTYPE *child0States,
375 const REALTYPE *child0TransMat,
376 const REALTYPE *child1Partials,
377 const REALTYPE *child1TransMat,
378 const REALTYPE *scaleFactors);
380 virtual void calcPartialsPartialsAutoScaling(REALTYPE* destP,
381 const REALTYPE* partials1,
382 const REALTYPE* matrices1,
383 const REALTYPE* partials2,
384 const REALTYPE* matrices2,
385 int* activateScaling);
387 virtual void rescalePartials(REALTYPE *destP,
388 REALTYPE *scaleFactors,
389 REALTYPE *cumulativeScaleFactors,
390 const int fillWithOnes);
392 virtual void autoRescalePartials(REALTYPE *destP,
393 signed short *scaleFactors);
395 virtual int getPaddedPatternsModulus();
397 void* mallocAligned(
size_t size);
401 BEAGLE_CPU_FACTORY_TEMPLATE
405 int partialsBufferCount,
406 int compactBufferCount,
409 int eigenBufferCount,
410 int matrixBufferCount,
412 int scaleBufferCount,
414 long preferenceFlags,
415 long requirementFlags,
418 virtual const char* getName();
419 virtual const long getFlags();
428 #include "libhmsbeagle/CPU/BeagleCPUImpl.hpp"
430 #endif // __BeagleCPUImpl__