]> git.donarmstrong.com Git - ape.git/blobdiff - src/rTrait.c
a fix in cophyloplot()
[ape.git] / src / rTrait.c
index 11cc63e2a0bdb2a66105873e690ab1e03d115074..43dc73ad85f3163b65e49333889a2088d30a06a5 100644 (file)
@@ -1,6 +1,6 @@
-/* rTrait.c       2010-07-26 */
+/* rTrait.c       2011-06-25 */
 
-/* Copyright 2010 Emmanuel Paradis */
+/* Copyright 2010-2011 Emmanuel Paradis */
 
 /* This file is part of the R-package `ape'. */
 /* See the file ../COPYING for licensing issues. */
@@ -12,6 +12,7 @@ void rTraitCont(int *model, int *Nedge, int *edge1, int *edge2, double *el,
 {
 /* The tree must be in pruningwise order */
        int i;
+       double alphaT, M, S;
 
        switch(*model) {
        case 1 : for (i = *Nedge - 1; i >= 0; i--) {
@@ -21,14 +22,16 @@ void rTraitCont(int *model, int *Nedge, int *edge1, int *edge2, double *el,
                }
                break;
        case 2 : for (i = *Nedge - 1; i >= 0; i--) {
+                       if (alpha[i]) {
+                               alphaT = alpha[i] * el[i];
+                               M = exp(-alphaT);
+                               S = sigma[i] * sqrt((1 - exp(-2 * alphaT))/(2 * alpha[i]));
+                       } else { /* same than if (alpha[i] ==0) */
+                               M = 1;
+                               S = sqrt(el[i]) * sigma[i];
+                       }
                        GetRNGstate();
-                       x[edge2[i]] = x[edge1[i]] - alpha[i]*el[i]*(x[edge1[i]] - theta[i]) + sqrt(el[i])*sigma[i]*norm_rand();
-                       PutRNGstate();
-               }
-               break;
-       case 3 : for (i = *Nedge - 1; i >= 0; i--) {
-                       GetRNGstate();
-                       x[edge2[i]] = x[edge1[i]] - (1 - exp(alpha[i]*el[i]))*(x[edge1[i]] - theta[i]) + sqrt(el[i])*sigma[i]*norm_rand();
+                       x[edge2[i]] = x[edge1[i]] * M +  theta[i] * (1 - M) + S * norm_rand();
                        PutRNGstate();
                }
                break;