+ # 3 gaussian clusters, 300 items; and then 7 gaussian clusters, 490 items
+ n = 300
+ d = 5
+ K = 3
+ for (ndK in list( c(300,5,3), c(490,10,7) ))
+ {
+ n = ndK[1] ; d = ndK[2] ; K = ndK[3]
+ cs = n/K #cluster size
+ Id = diag(d)
+ coefs = do.call(rbind,
+ lapply(1:K, function(i) MASS::mvrnorm(cs, c(rep(0,(i-1)),5,rep(0,d-i)), Id)))
+ indices_medoids = computeClusters1(coefs, K)
+ # Get coefs assignments (to medoids)
+ assignment = sapply(seq_len(n), function(i)
+ which.min( rowSums( sweep(coefs[indices_medoids,],2,coefs[i,],'-')^2 ) ) )
+ for (i in 1:K)
+ expect_equal(sum(assignment==i), cs, tolerance=5)
+
+ costs_matrix = matrix(nrow=K,ncol=K)
+ for (i in 1:K)
+ {
+ for (j in 1:K)
+ {
+ # assign i (in result) to j (order 1,2,3)
+ costs_matrix[i,j] = abs( mean(assignment[((i-1)*cs+1):(i*cs)]) - j )
+ }
+ }
+ permutation = as.integer( clue::solve_LSAP(costs_matrix) )
+ for (i in 1:K)
+ {
+ expect_equal(
+ mean(assignment[((i-1)*cs+1):(i*cs)]), permutation[i], tolerance=0.05)
+ }
+ }