#######################################################
# evaluate different # clusters
#######################################################
clusEval <- function(clusResult,minNum,maxNum) {
	require(cluster)
	require(MASS)
        require(fpc)

	#make columns for each # clusters 
	AvgBetween<-as.list(rep(0,maxNum - minNum + 1))
	AvgWithin<-as.list(rep(0,maxNum - minNum + 1))
	WBRatio<-as.list(rep(0,maxNum - minNum + 1))
	AvgSilWidth<-as.list(rep(0,maxNum - minNum + 1))
	PearsonGamma<-as.list(rep(0,maxNum - minNum + 1))
	Dunn<-as.list(rep(0,maxNum - minNum + 1))

	#matrix of individ cluster results
        #args are:
	#1 init value
	#2 # rows
	#3 # columns (from min to max # clusters)
	individClusterSizes<-matrix(0,maxNum,maxNum-minNum+1)
	individClusterDiam<-matrix(0,maxNum,maxNum-minNum+1)
	individClusterToOthers<-matrix(0,maxNum,maxNum-minNum+1)


        for (numClusters in minNum:maxNum) {
		clusterNum<-cutree(clusResult,numClusters)
		myStats<-cluster.stats(clusResult$diss,clusterNum,silhouette=TRUE)

		AvgBetween[1 + numClusters - minNum]<-myStats$average.between
		AvgWithin[1 + numClusters - minNum]<-myStats$average.within
		WBRatio[1 + numClusters - minNum]<-myStats$wb.ratio
		AvgSilWidth[1 + numClusters - minNum]<-myStats$avg.silwidth
		PearsonGamma[1 + numClusters - minNum]<-myStats$pearsongamma
		Dunn[1 + numClusters - minNum]<-myStats$dunn

		individClusterSizes[,1+numClusters-minNum]<-rbind(as.matrix(c(myStats$cluster.size)),as.matrix(c(rep(NA,(maxNum-numClusters)))))
		individClusterDiam[,1+numClusters-minNum]<-rbind(as.matrix(c(myStats$diameter)),as.matrix(c(rep(NA,(maxNum-numClusters)))))
		individClusterToOthers[,1+numClusters-minNum]<-rbind(as.matrix(c(myStats$average.toother)),as.matrix(c(rep(NA,(maxNum-numClusters)))))
	}

	#row-bind the one-per-cluster stats
	grandResult<-rbind(WBRatio,AvgSilWidth,PearsonGamma,Dunn,AvgBetween,AvgWithin)

	#name the rows
	numVec<-seq(1,maxNum)
	rownames(individClusterSizes)<-paste("Size: Cluster ",numVec,sep="")
	rownames(individClusterDiam)<-paste("Diameter C",numVec,":",sep="")
	rownames(individClusterToOthers)<-paste("Avg to Others C",numVec,":",sep="")

	#make a blank separator & name it
	blankRow<-t(as.matrix(rep(as.character(" "),1+maxNum-minNum)))
	rownames(blankRow)<-" "

	#append the blank row & matrix of cluster sizes
	grandResult<-rbind(as.data.frame(grandResult),as.data.frame(blankRow),as.data.frame(individClusterSizes))

	#append the blank row & matrix of cluster diameters
	rownames(blankRow)<-"  "
	grandResult<-rbind(as.data.frame(grandResult),as.data.frame(blankRow),as.data.frame(individClusterDiam))

	#append the blank row & matrix of cluster avg dist to otheres
	rownames(blankRow)<-"    "
	grandResult<-rbind(as.data.frame(grandResult),as.data.frame(blankRow),as.data.frame(individClusterToOthers))

	#name the columns
	colNumVec<-seq(minNum,maxNum)
	colnames(grandResult)<-paste("Choose_",colNumVec,sep="")

	return(grandResult)
}

#######################################################
# end of clusEval function
#######################################################
