# TODO: Add comment
# 
# Author: E.Korsching Jun 19, 2012
###############################################################################


delta.vec.similarity <- function(x, theo.max, theo.min, n.mean=F, d.var=F, verbose=F){
	# computes the similarity between two vectors,  minimal length of vector: 2
	#  NA values are not allowed
	# resulting similarity ranges from -1 (maximal different) to 1 (identical)
	# x: data.frame/matrix, cols correspond to vectors, all vectors must be normalized according to the same theoretical spread (range)
	#  theo.max, theo.min: theoretical maximum, theoretical minimum
	# result: similarity value
	
	#ini
	if(sum(is.na(x))>0){ cat("\n no NA values are allowed in x"); break }
	nr <- nrow(x)
	nc <- ncol(x)
	if(nr<2){ cat("\n minimal length of both vectors are 2"); break }
	real.max <- max(x)
	real.min <- min(x)
	maxS <- nr * abs( (theo.max - theo.min) )		#source scale maximum - maximal (theoretical) delta between vectors
	minS <- 0								#definition - source scale minimum - minimal (theoretical) delta between vectors
	#invers transformation
	maxT <- -1						#definition - target scale maximum
	minT <- 1				#definition - target scale minimum
	if(verbose){ cat("\n #rows ", nr, " #cols ", nc, " max. x ", real.max, " / ", theo.max, " min. x ", real.min, " / ", theo.min, " maxS ", maxS, "\n") }
	
	#work
	if(n.mean){			# normalization according to the means
		cat("\n x ",x)
		tmp <- colMeans(x)
		cat("\n tmp ",tmp)
		tmp <- tmp - ((abs( (theo.max - theo.min) )/2)+theo.min)	#delta to half of range
		cat("\n tmp ",tmp)
		x[,1] <- x[,1] - tmp[1]
		x[,2] <- x[,2] - tmp[2]
		cat("\n x ",x)
	}
	
	f1 <- function(x){
		y <- abs(x[1]-x[2])		# delta per row
	}
	y <- apply(x, 1, f1)		# all deltas
	cat("\n deltas ",y)
	
	if(d.var){		#calc of the x1,x2,delta variance
		x1.var <- var( x[,1] )
		x2.var <- var( x[,2] )
		delta.var <- var( y )		#real var  [0..inf]
		cat("\n x1.var ",x1.var," x2.var ",x2.var," delta.var ",delta.var)
	}
	
	y <- sum( y )		# sum of deltas
	z <- ((y-minS)*(maxT-minT)/(maxS-minS))+minT		#linear transformation of the real scale to -1..1
	
	if(d.var){		#correct z score by delta variance
		max.var <- var( rep(c(theo.max,theo.min), nr) )	#max sample var  ? check ?
		c.factor <- (x1.var + x2.var + delta.var) / (3 * max.var )		#normalized var  [0..1]
		cat("\n max.var ",max.var," c.factor ",c.factor," z vorher ",z)
		z <- z * c.factor		#correct towards 0 by c.factor
		cat("\n z final ",z)
	}
	
	return(z)
}

#Version with delta only
#delta.vec.similarity(x=matrix(c(1,2,1,3,2,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			# -0.33
#delta.vec.similarity(x=matrix(c(1,3,1,3,1,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			# -1   max delta
#delta.vec.similarity(x=matrix(c(1,2,1,1,2,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			#  1   min delta
#delta.vec.similarity(x=matrix(c(1,1,1,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			#  1
#delta.vec.similarity(x=matrix(c(1,1,1,3,3,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			# -1
#delta.vec.similarity(x=matrix(c(1,1,1,2,2,2),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			#  0
#delta.vec.similarity(x=matrix(c(1,1,1,1.5,1.5,1.5),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)		#  0.5
#delta.vec.similarity(x=matrix(c(1.5,1.5,1.5,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)		#  0.5
#delta.vec.similarity(x=matrix(c(1,1,1,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, verbose=T)			#  1

#delta.vec.similarity(x=horstLCA.2[,c(4,14)], theo.max=4, theo.min=1, verbose=T)			#  0.9764706		GianK workspace
#delta.vec.similarity(x=horstLCA.2[,c(5,14)], theo.max=4, theo.min=1, verbose=T)			#  0.9921569
#proximity.bootstrap.sampling(x=horstLCA.2, reiheRef=c(4,5), reiheTest=14, anzBoots=0, method="cor", output="matrix")
#           CK1      CK10
#AR -0.06151166 0.1104002	#aber beim Bootstrap kommt es zu artifiziellen Situationen mit 1.0

#Version with delta + mean normalization
#delta.vec.similarity(x=matrix(c(1,2,1,3,2,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			#  0.11
#delta.vec.similarity(x=matrix(c(1,3,1,3,1,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			# -0.77   max delta
#delta.vec.similarity(x=matrix(c(1,2,1,1,2,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			#  1   min delta
#delta.vec.similarity(x=matrix(c(1,1,1,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			#  1
#delta.vec.similarity(x=matrix(c(1,1,1,3,3,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			#  1
#delta.vec.similarity(x=matrix(c(1,1,1,2,2,2),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			#  1
#delta.vec.similarity(x=matrix(c(1,1,1,1.5,1.5,1.5),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)	#  1
#delta.vec.similarity(x=matrix(c(1.5,1.5,1.5,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)	#  1
#delta.vec.similarity(x=matrix(c(1,1,1,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=T, verbose=T)			#  1

#Version with delta + var correction
#delta.vec.similarity(x=matrix(c(1,2,1,3,2,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			# -0.18
#delta.vec.similarity(x=matrix(c(1,3,1,3,1,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			# -0.74   max delta
#delta.vec.similarity(x=matrix(c(1,2,1,1,2,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			#  0.18   min delta
#delta.vec.similarity(x=matrix(c(1,1,1,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			#  0
#delta.vec.similarity(x=matrix(c(1,1,1,3,3,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			#  0
#delta.vec.similarity(x=matrix(c(1,1,1,2,2,2),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			#  0
#delta.vec.similarity(x=matrix(c(1,1,1,1.5,1.5,1.5),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)	#  0
#delta.vec.similarity(x=matrix(c(1.5,1.5,1.5,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)	#  0
#delta.vec.similarity(x=matrix(c(1,1,1,1,1,1),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			#  0

#delta.vec.similarity(x=matrix(c(1,2,1,3,2,3),nrow=3,ncol=2,byrow=F), theo.max=3, theo.min=1, n.mean=F, d.var=T, verbose=T)			# -0.18

cor(c(4,4,1,2,4,1),c(6,6,1.3,6.75,6,1.3))
cor(c(4,4,1,2,4,1),c(4,4,1,2,4,1))
cor(c(0,4,1,2,4,1),c(0,4,1,2,4,1)+5)
cor(c(0,4,1,2,4,1),c(0,4,1,2,4,1)*5)
cor(c(0,4,1,2,4,1),c(0,4,1,2,4,1)/5)
cor(c(0,4,1,2,4,1),c(0,4,1,2,4,1)^1)



