#Exercise 3.8
wine = read.table("../data/wine.dat",header=T)

#Calculating objective function
rss = function(x,lab)
{
 rss = 0
 for(j in 1:3)
 {
   z = x[lab==j,]
   mu = colMeans(z)
#   show(z)
#   show(mu)
   res = t(z)-mu
#   show(dim(res))
   rss = rss + sum(colSums(res^2))
 }
 rss
}

#Initialization
n = nrow(wine)
lab = sample(1:3,n,replace=T)
#lab = wine[,1]
rss.cur = rss(wine[,-1],lab)
#Defining neighborhood to be change of one label

#Steepest descent
more = TRUE;r=rep(NA,3)
while(more)
{
  more = FALSE
  for(i in 1:n)
  {
    lab.cur = lab[i]
    for(j in 1:3)
    {
      lab[i] = j
      r[j] = rss(wine[,-1],lab)
    }
    jopt = which.min(r)
    lab[i] = jopt
    if(jopt!=lab.cur)
      more = TRUE
  }
  show(min(r))
}
show(table(wine[,1],lab))

#Simulated annealing
lab = sample(1:3,n,replace=T)
rss.cur = rss(wine[,-1],lab)
for(it in c(1:100))
{
  temp = 10/(1+it)
  for(i in 1:n)
  {
    lab.cur = lab[i]
    lab[i] = sample(1:3,1)
    rss.prop = rss(wine[,-1],lab)
    if(runif(1)<exp(-(rss.prop-rss.cur)/temp))
      rss.cur = rss.prop
    else
      lab[i] = lab.cur
  }
  show(rss(wine[,-1],lab))
}
show(table(wine[,1],lab))