X-Git-Url: https://git.auder.net/?p=valse.git;a=blobdiff_plain;f=src%2Fsources%2FEMGLLF.c;h=14394164b62b8450cf06d4e2bcc843ded95a66f0;hp=42419acd24ab2a8c3e524e0c5b635298c01629a0;hb=afa07d41c7592ac0ccd55d7af23c3bfef213291e;hpb=7ea8c1e58b3ab98eda5b003ccdffe5e35222bb4f diff --git a/src/sources/EMGLLF.c b/src/sources/EMGLLF.c index 42419ac..1439416 100644 --- a/src/sources/EMGLLF.c +++ b/src/sources/EMGLLF.c @@ -5,23 +5,23 @@ // TODO: don't recompute indexes every time...... void EMGLLF_core( // IN parameters - const double* phiInit, // parametre initial de moyenne renormalisé - const double* rhoInit, // parametre initial de variance renormalisé - const double* piInit, // parametre initial des proportions - const double* gamInit, // paramètre initial des probabilités a posteriori de chaque échantillon + const float* phiInit, // parametre initial de moyenne renormalisé + const float* rhoInit, // parametre initial de variance renormalisé + const float* piInit, // parametre initial des proportions + const float* gamInit, // paramètre initial des probabilités a posteriori de chaque échantillon int mini, // nombre minimal d'itérations dans l'algorithme EM int maxi, // nombre maximal d'itérations dans l'algorithme EM - double gamma, // puissance des proportions dans la pénalisation pour un Lasso adaptatif - double lambda, // valeur du paramètre de régularisation du Lasso - const double* X, // régresseurs - const double* Y, // réponse - double tau, // seuil pour accepter la convergence + float gamma, // puissance des proportions dans la pénalisation pour un Lasso adaptatif + float lambda, // valeur du paramètre de régularisation du Lasso + const float* X, // régresseurs + const float* Y, // réponse + float tau, // seuil pour accepter la convergence // OUT parameters (all pointers, to be modified) - double* phi, // parametre de moyenne renormalisé, calculé par l'EM - double* rho, // parametre de variance renormalisé, calculé par l'EM - double* pi, // parametre des proportions renormalisé, calculé par l'EM - double* LLF, // log vraisemblance associée à cet échantillon, pour les valeurs estimées des paramètres - double* S, + float* phi, // parametre de moyenne renormalisé, calculé par l'EM + float* rho, // parametre de variance renormalisé, calculé par l'EM + float* pi, // parametre des proportions renormalisé, calculé par l'EM + float* LLF, // log vraisemblance associée à cet échantillon, pour les valeurs estimées des paramètres + float* S, // additional size parameters int n, // nombre d'echantillons int p, // nombre de covariables @@ -37,32 +37,32 @@ void EMGLLF_core( //Other local variables //NOTE: variables order is always [maxi],n,p,m,k - double* gam = (double*)malloc(n*k*sizeof(double)); + float* gam = (float*)malloc(n*k*sizeof(float)); copyArray(gamInit, gam, n*k); - double* b = (double*)malloc(k*sizeof(double)); - double* Phi = (double*)malloc(p*m*k*sizeof(double)); - double* Rho = (double*)malloc(m*m*k*sizeof(double)); - double* Pi = (double*)malloc(k*sizeof(double)); - double* gam2 = (double*)malloc(k*sizeof(double)); - double* pi2 = (double*)malloc(k*sizeof(double)); - double* Gram2 = (double*)malloc(p*p*k*sizeof(double)); - double* ps = (double*)malloc(m*k*sizeof(double)); - double* nY2 = (double*)malloc(m*k*sizeof(double)); - double* ps1 = (double*)malloc(n*m*k*sizeof(double)); - double* ps2 = (double*)malloc(p*m*k*sizeof(double)); - double* nY21 = (double*)malloc(n*m*k*sizeof(double)); - double* Gam = (double*)malloc(n*k*sizeof(double)); - double* X2 = (double*)malloc(n*p*k*sizeof(double)); - double* Y2 = (double*)malloc(n*m*k*sizeof(double)); + float* b = (float*)malloc(k*sizeof(float)); + float* Phi = (float*)malloc(p*m*k*sizeof(float)); + float* Rho = (float*)malloc(m*m*k*sizeof(float)); + float* Pi = (float*)malloc(k*sizeof(float)); + float* gam2 = (float*)malloc(k*sizeof(float)); + float* pi2 = (float*)malloc(k*sizeof(float)); + float* Gram2 = (float*)malloc(p*p*k*sizeof(float)); + float* ps = (float*)malloc(m*k*sizeof(float)); + float* nY2 = (float*)malloc(m*k*sizeof(float)); + float* ps1 = (float*)malloc(n*m*k*sizeof(float)); + float* ps2 = (float*)malloc(p*m*k*sizeof(float)); + float* nY21 = (float*)malloc(n*m*k*sizeof(float)); + float* Gam = (float*)malloc(n*k*sizeof(float)); + float* X2 = (float*)malloc(n*p*k*sizeof(float)); + float* Y2 = (float*)malloc(n*m*k*sizeof(float)); gsl_matrix* matrix = gsl_matrix_alloc(m, m); gsl_permutation* permutation = gsl_permutation_alloc(m); - double* YiRhoR = (double*)malloc(m*sizeof(double)); - double* XiPhiR = (double*)malloc(m*sizeof(double)); - double dist = 0.; - double dist2 = 0.; + float* YiRhoR = (float*)malloc(m*sizeof(float)); + float* XiPhiR = (float*)malloc(m*sizeof(float)); + float dist = 0.; + float dist2 = 0.; int ite = 0; - double EPS = 1e-15; - double* dotProducts = (double*)malloc(k*sizeof(double)); + float EPS = 1e-15; + float* dotProducts = (float*)malloc(k*sizeof(float)); while (ite < mini || (ite < maxi && (dist >= tau || dist2 >= sqrt(tau)))) { @@ -90,7 +90,7 @@ void EMGLLF_core( //ps2(:,mm,r)=transpose(X2(:,:,r))*Y2(:,mm,r); for (int u=0; u - double dotProduct = 0.0; + float dotProduct = 0.0; for (int u=0; udata[u*m+v] = rho[ai(u,v,r,m,m,k)]; } gsl_linalg_LU_decomp(matrix, permutation, &signum); - double detRhoR = gsl_linalg_LU_det(matrix, signum); + float detRhoR = gsl_linalg_LU_det(matrix, signum); Gam[mi(i,r,n,k)] = pi[r] * detRhoR * exp(-0.5*dotProducts[r] + shift); sumLLF1 += Gam[mi(i,r,n,k)] / pow(2*M_PI,m/2.0); @@ -327,7 +327,7 @@ void EMGLLF_core( } //sum(pen(ite,:)) - double sumPen = 0.0; + float sumPen = 0.0; for (int r=0; r Dist1) Dist1 = tmpDist; @@ -353,14 +353,14 @@ void EMGLLF_core( } } //Dist2=max(max((abs(rho-Rho))./(1+abs(rho)))); - double Dist2 = 0.0; + float Dist2 = 0.0; for (int u=0; u Dist2) Dist2 = tmpDist; @@ -368,12 +368,12 @@ void EMGLLF_core( } } //Dist3=max(max((abs(pi-Pi))./(1+abs(Pi)))); - double Dist3 = 0.0; + float Dist3 = 0.0; for (int u=0; u Dist3) Dist3 = tmpDist; }