Update starting point in optimParams::run()
[morpheus.git] / pkg / R / optimParams.R
index d8e2cf9..039070c 100644 (file)
@@ -51,6 +51,8 @@ optimParams <- function(X, Y, K, link=c("logit","probit"), M=NULL)
     M3 <- as.double(Mtmp[[3]])
     M <- c(M1, M2, M3)
   }
+  else
+    M <- c(M[[1]], M[[2]], M[[3]])
 
   # Build and return optimization algorithm object
   methods::new("OptimParams", "li"=link, "X"=X,
@@ -100,7 +102,7 @@ setRefClass(
 
       n <<- nrow(X)
       d <<- ncol(X)
-      W <<- diag(d+d^2+d^3) #initialize at W = Identity
+      # W will be initialized when calling run()
     },
 
     expArgs = function(v)
@@ -262,17 +264,22 @@ setRefClass(
         θ0$b = rep(0, K)
       else if (!is.numeric(θ0$b) || length(θ0$b) != K || any(is.na(θ0$b)))
         stop("θ0$b: length K, no NA")
-      # TODO: stopping condition? N iterations? Delta <= epsilon ?
-      loopMax <- 2
+
+      # (Re)Set W to identity, to allow several run from the same object
+      W <<- diag(d+d^2+d^3)
+
+      loopMax <- 2 #TODO: loopMax = 3 ? Seems not improving...
+      x_init <- linArgs(θ0)
       for (loop in 1:loopMax)
       {
-        op_res = constrOptim( linArgs(θ0), .self$f, .self$grad_f,
+        op_res = constrOptim( x_init, .self$f, .self$grad_f,
           ui=cbind(
             rbind( rep(-1,K-1), diag(K-1) ),
             matrix(0, nrow=K, ncol=(d+1)*K) ),
           ci=c(-1,rep(0,K-1)) )
         if (loop < loopMax) #avoid computing an extra W
           W <<- computeW(expArgs(op_res$par))
+        x_init <- op_res$par
         #print(op_res$value) #debug
         #print(expArgs(op_res$par)) #debug
       }