From 4204e8774fdafe2db7ed44cd8cae018bc0c4e9d7 Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Thu, 9 Mar 2017 17:04:05 +0100 Subject: [PATCH] add submodule enercast --- .enercast | 1 + .gitmodules | 3 ++ epclust/R/clustering.R | 94 ++++++++++++++++++++---------------------- 3 files changed, 49 insertions(+), 49 deletions(-) create mode 160000 .enercast diff --git a/.enercast b/.enercast new file mode 160000 index 0000000..35da9ea --- /dev/null +++ b/.enercast @@ -0,0 +1 @@ +Subproject commit 35da9ea4a4caaac6124c0807fb8fcbd8d5e1c7ca diff --git a/.gitmodules b/.gitmodules index 16826ed..2b8ef9a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule ".nbstripout"] path = .nbstripout url = https://github.com/kynan/nbstripout.git +[submodule ".enercast"] + path = .enercast + url = https://github.com/cugliari/enercast.git diff --git a/epclust/R/clustering.R b/epclust/R/clustering.R index c226786..4519f44 100644 --- a/epclust/R/clustering.R +++ b/epclust/R/clustering.R @@ -208,15 +208,6 @@ computeWerDists = function(synchrones, ncores_clust=1,verbose=FALSE,parll=TRUE) if (verbose) cat(paste("--- Compute WER dists\n", sep="")) - - - -#TODO: serializer les CWT, les récupérer via getDataInFile -#--> OK, faut juste stocker comme séries simples de taille delta*ncol (53*17519) - - - - n <- nrow(synchrones) delta <- ncol(synchrones) #TODO: automatic tune of all these parameters ? (for other users) @@ -235,24 +226,52 @@ computeWerDists = function(synchrones, ncores_clust=1,verbose=FALSE,parll=TRUE) Xwer_dist <- bigmemory::big.matrix(nrow=n, ncol=n, type="double") + cwt_file = ".epclust_bin/cwt" + #TODO: args, nb_per_chunk, nbytes, endian + # Generate n(n-1)/2 pairs for WER distances computations -# pairs = list() -# V = seq_len(n) -# for (i in 1:n) -# { -# V = V[-1] -# pairs = c(pairs, lapply(V, function(v) c(i,v))) -# } - # Generate "smart" pairs for WER distances computations pairs = list() - F = floor(2*n/3) - for (i in 1:F) - pairs = c(pairs, lapply((i+1):n, function(v) c(i,v))) - V = (F+1):n - for (i in (F+1):(n-1)) + V = seq_len(n) + for (i in 1:n) { V = V[-1] - pairs = c(pairs, + pairs = c(pairs, lapply(V, function(v) c(i,v))) + } + + computeSaveCWT = function(index) + { + ts <- scale(ts(synchrones[index,]), center=TRUE, scale=scaled) + totts.cwt = Rwave::cwt(ts, totnoct, nvoice, w0, plot=FALSE) + ts.cwt = totts.cwt[,s0log:(s0log+noctave*nvoice)] + #Normalization + sqs <- sqrt(2^(0:(noctave*nvoice)/nvoice)*s0) + sqres <- sweep(ts.cwt,2,sqs,'*') + res <- sqres / max(Mod(sqres)) + #TODO: serializer les CWT, les récupérer via getDataInFile ; + #--> OK, faut juste stocker comme séries simples de taille delta*ncol (53*17519) + binarize(res, cwt_file, 100, ",", nbytes, endian) + } + + if (parll) + { + cl = parallel::makeCluster(ncores_clust) + synchrones_desc <- bigmemory::describe(synchrones) + Xwer_dist_desc <- bigmemory::describe(Xwer_dist) + parallel::clusterExport(cl, varlist=c("synchrones_desc","Xwer_dist_desc","totnoct", + "nvoice","w0","s0log","noctave","s0","verbose","getCWT"), envir=environment()) + } + + #precompute and serialize all CWT + ignored <- + if (parll) + parallel::parLapply(cl, 1:n, computeSaveCWT) + else + lapply(1:n, computeSaveCWT) + + getCWT = function(index) + { + #from cwt_file ... + } # Distance between rows i and j computeDistancesIJ = function(pair) @@ -265,44 +284,21 @@ computeWerDists = function(synchrones, ncores_clust=1,verbose=FALSE,parll=TRUE) Xwer_dist <- bigmemory::attach.big.matrix(Xwer_dist_desc) } - computeCWT = function(index) - { - ts <- scale(ts(synchrones[index,]), center=TRUE, scale=scaled) - totts.cwt = Rwave::cwt(ts, totnoct, nvoice, w0, plot=FALSE) - ts.cwt = totts.cwt[,s0log:(s0log+noctave*nvoice)] - #Normalization - sqs <- sqrt(2^(0:(noctave*nvoice)/nvoice)*s0) - sqres <- sweep(ts.cwt,2,sqs,'*') - sqres / max(Mod(sqres)) - } - i = pair[1] ; j = pair[2] if (verbose && j==i+1) cat(paste(" Distances (",i,",",j,"), (",i,",",j+1,") ...\n", sep="")) - cwt_i <- computeCWT(i) - cwt_j <- computeCWT(j) + cwt_i <- getCWT(i) + cwt_j <- getCWT(j) -#print(system.time( { num <- epclustFilter(Mod(cwt_i * Conj(cwt_j))) WX <- epclustFilter(Mod(cwt_i * Conj(cwt_i))) - WY <- epclustFilter(Mod(cwt_j * Conj(cwt_j))) + WY <- epclustFilter(Mod(cwt_j * Conj(cwt_j))) wer2 <- sum(colSums(num)^2) / sum(colSums(WX) * colSums(WY)) Xwer_dist[i,j] <- sqrt(delta * ncol(cwt_i) * max(1 - wer2, 0.)) #FIXME: wer2 should be < 1 Xwer_dist[j,i] <- Xwer_dist[i,j] -#} ) ) Xwer_dist[i,i] = 0. } - if (parll) - { - cl = parallel::makeCluster(ncores_clust) - synchrones_desc <- bigmemory::describe(synchrones) - Xwer_dist_desc <- bigmemory::describe(Xwer_dist) - - parallel::clusterExport(cl, varlist=c("synchrones_desc","Xwer_dist_desc","totnoct", - "nvoice","w0","s0log","noctave","s0","verbose"), envir=environment()) - } - ignored <- if (parll) parallel::parLapply(cl, pairs, computeDistancesIJ) -- 2.44.0