| 1 | context("computeSynchrones") |
| 2 | |
| 3 | test_that("computeSynchrones behave as expected", |
| 4 | { |
| 5 | # Generate 300 sinusoïdal series of 3 kinds: all series of indices == 0 mod 3 are the same |
| 6 | # (plus noise), all series of indices == 1 mod 3 are the same (plus noise) ... |
| 7 | n <- 300 |
| 8 | x <- seq(0,9.5,0.1) |
| 9 | L <- length(x) #96 1/4h |
| 10 | K <- 3 |
| 11 | s1 <- cos(x) |
| 12 | s2 <- sin(x) |
| 13 | s3 <- c( s1[1:(L%/%2)] , s2[(L%/%2+1):L] ) |
| 14 | #sum((s1-s2)^2) == 96 |
| 15 | #sum((s1-s3)^2) == 58 |
| 16 | #sum((s2-s3)^2) == 38 |
| 17 | s <- list(s1, s2, s3) |
| 18 | series <- matrix(nrow=L, ncol=n) |
| 19 | for (i in seq_len(n)) |
| 20 | series[,i] <- s[[I(i,K)]] + rnorm(L,sd=0.01) |
| 21 | |
| 22 | getSeries <- function(indices) { |
| 23 | indices <- indices[indices <= n] |
| 24 | if (length(indices)>0) as.matrix(series[,indices]) else NULL |
| 25 | } |
| 26 | |
| 27 | synchrones <- computeSynchrones(cbind(s1,s2,s3),getSeries,n,100,verbose=TRUE) |
| 28 | |
| 29 | expect_equal(dim(synchrones), c(L,K)) |
| 30 | for (i in 1:K) |
| 31 | { |
| 32 | # Synchrones are (for each medoid) sums of closest curves. |
| 33 | # Here, we expect exactly 100 curves of each kind to be assigned respectively to |
| 34 | # synchrone 1, 2 and 3 => division by 100 should be very close to the ref curve |
| 35 | expect_equal(synchrones[,i]/100, s[[i]], tolerance=0.01) |
| 36 | } |
| 37 | }) |