cwt_file <- tempfile(pattern="epclust_cwt.bin_")
# Compute the getSeries(indices) CWT, and store the results in the binary file
- computeSaveCWT <- function(indices)
+ computeSaveCWT <- function(inds)
{
+ if (verbose)
+ cat(" Compute save CWT on ",length(inds)," indices\n", sep="")
+
# Obtain CWT as big vectors of real part + imaginary part (concatenate)
- ts_cwt <- sapply(indices, function(i) {
+ ts_cwt <- sapply(inds, function(i) {
ts <- scale(ts(getSeries(i)), center=TRUE, scale=FALSE)
ts_cwt <- Rwave::cwt(ts, noctave, nvoice, w0=2*pi, twoD=TRUE, plot=FALSE)
c( as.double(Re(ts_cwt)),as.double(Im(ts_cwt)) )
Xwer_dist <- bigmemory::attach.big.matrix(Xwer_dist_desc)
}
- if (verbose && !parll)
+ if (verbose)
cat(paste(" Distances from ",i," to ",i+1,"...",n,"\n", sep=""))
# Get CWT of column i, and run computations for columns j>i
cat(paste("--- Precompute and serialize synchrones CWT\n", sep=""))
# Split indices by packets of length at most nb_cwt_per_chunk
- indices_cwt <- .splitIndices(seq_len(n), nb_cwt_per_chunk)
+ indices_cwt <- .splitIndices(indices, nb_cwt_per_chunk)
# NOTE: next loop could potentially be run in //. Indices would be permuted (by
# serialization order), and synchronicity would be required because of concurrent
- # writes. Probably not worth the effort - but possible to gain some bits of speed.
+ # writes. Probably not worth the effort - but possible.
for (inds in indices_cwt)
computeSaveCWT(inds)
#' @param ncores_tasks Number of parallel tasks ('1' == sequential tasks)
#' @param ncores_clust Number of parallel clusterings in one task
#' @param sep Separator in CSV input file (if any provided)
-#' @param nbytes Number of bytes to serialize a floating-point number: 4 or 8
+#' @param nbytes 4 or 8 bytes to (de)serialize a floating-point number
#' @param endian Endianness for (de)serialization: "little" or "big"
#' @param verbose FALSE: nothing printed; TRUE: some execution traces
#' @param parll TRUE: run in parallel. FALSE: run sequentially
-#' @param reuse_bin Re-use previously stored binary series and contributions
#'
#' @return A list:
#' \itemize{
#' @examples
#' \dontrun{
#' # WER distances computations are too long for CRAN (for now)
+#' parll = FALSE #on this small example, sequential run is faster
#'
#' # Random series around cos(x,2x,3x)/sin(x,2x,3x)
#' x <- seq(0,50,0.05)
#' permut <- (0:239)%%6 * 40 + (0:239)%/%6 + 1
#' series = series[,permut]
#' #dim(series) #c(240,1001)
-#' res_ascii <- claws(series, K1=30, K2=6, 100, random=FALSE, verbose=TRUE)
+#' res_ascii <- claws(series, K1=30, K2=6, nb_series_per_chunk=500,
+#' nb_items_clust=100, random=FALSE, verbose=TRUE, parll=parll)
#'
#' # Same example, from CSV file
#' csv_file <- tempfile(pattern="epclust_series.csv_")
#' write.table(t(series), csv_file, sep=",", row.names=FALSE, col.names=FALSE)
-#' res_csv <- claws(csv_file, K1=30, K2=6, 100, random=FALSE)
+#' res_csv <- claws(csv_file, 30, 6, 500, 100, random=FALSE, parll=parll)
#'
#' # Same example, from binary file
#' bin_file <- tempfile(pattern="epclust_series.bin_")
#' endian <- "little"
#' binarize(csv_file, bin_file, 500, ",", nbytes, endian)
#' getSeries <- function(indices) getDataInFile(indices, bin_file, nbytes, endian)
-#' res_bin <- claws(getSeries, K1=30, K2=6, 100, random=FALSE)
+#' res_bin <- claws(getSeries, 30, 6, 500, 100, random=FALSE, parll=parll)
#' unlink(csv_file)
#' unlink(bin_file)
#'
#' serie_length <- as.integer( dbGetQuery(series_db,
#' paste("SELECT COUNT(*) FROM times_values WHERE id == ",indexToID_inDB[1],sep="")) )
#' getSeries <- function(indices) {
+#' indices = indices[ indices <= length(indexToID_inDB) ]
+#' if (length(indices) == 0)
+#' return (NULL)
#' request <- "SELECT id,value FROM times_values WHERE id in ("
#' for (i in seq_along(indices)) {
#' request <- paste(request, indexToID_inDB[ indices[i] ], sep="")
#' }
#' request <- paste(request, ")", sep="")
#' df_series <- dbGetQuery(series_db, request)
-#' if (nrow(df_series) >= 1)
-#' matrix(df_series[,"value"], nrow=serie_length)
-#' else
-#' NULL
+#' matrix(df_series[,"value"], nrow=serie_length)
#' }
-#' # reuse_bin==FALSE: DB do not garantee ordering
-#' res_db <- claws(getSeries, K1=30, K2=6, 100, random=FALSE, reuse_bin=FALSE)
+#' res_db <- claws(getSeries, 30, 6, 500, 100, random=FALSE, parll=parll)
#' dbDisconnect(series_db)
#'
#' # All results should be equal:
#' & res_ascii$ranks == res_db$ranks)
#' }
#' @export
-claws <- function(series, K1, K2, nb_series_per_chunk, nb_items_clust=7*K1,
+claws <- function(series, K1, K2, nb_series_per_chunk, nb_items_clust=5*K1,
algoClust1=function(data,K) cluster::pam(t(data),K,diss=FALSE,pamonce=1)$id.med,
algoClust2=function(dists,K) cluster::pam(dists,K,diss=TRUE,pamonce=1)$id.med,
wav_filt="d8", contrib_type="absolute", WER="end", smooth_lvl=3, nvoice=4,
random=TRUE, ntasks=1, ncores_tasks=1, ncores_clust=3, sep=",", nbytes=4,
- endian=.Platform$endian, verbose=FALSE, parll=TRUE, reuse_bin=TRUE)
+ endian=.Platform$endian, verbose=FALSE, parll=TRUE)
{
-
-
-#TODO: comprendre differences.......... debuguer getSeries for DB
-
-
# Check/transform arguments
if (!is.matrix(series) && !bigmemory::is.big.matrix(series)
&& !is.function(series)
if (verbose)
cat("...Serialize time-series (or retrieve past binary file)\n")
series_file <- ".series.epclust.bin"
- if (!file.exists(series_file) || !reuse_bin)
- {
- unlink(series_file,)
+ if (!file.exists(series_file))
binarize(series, series_file, nb_series_per_chunk, sep, nbytes, endian)
- }
getSeries <- function(inds) getDataInFile(inds, series_file, nbytes, endian)
}
else
contribs_file <- ".contribs.epclust.bin"
if (verbose)
cat("...Compute contributions and serialize them (or retrieve past binary file)\n")
- if (!file.exists(contribs_file) || !reuse_bin)
+ if (!file.exists(contribs_file))
{
- unlink(contribs_file,)
nb_curves <- binarizeTransform(getSeries,
function(curves) curvesToContribs(curves, wav_filt, contrib_type),
contribs_file, nb_series_per_chunk, nbytes, endian)