Update vignette + optim code
[morpheus.git] / pkg / R / optimParams.R
index 1ef1494..2eada8f 100644 (file)
@@ -213,13 +213,23 @@ setRefClass(
                {
                        "Run optimization from x0 with solver..."
 
-                       if (!is.numeric(x0) || any(is.na(x0)) || length(x0) != (d+2)*K-1
-                               || any(x0[1:(K-1)] < 0) || sum(x0[1:(K-1)]) > 1)
-                       {
-                               stop("x0: numeric vector, no NA, length (d+2)*K-1, sum(x0[1:(K-1) >= 0]) <= 1")
-                       }
-
-                       op_res = constrOptim( x0, .self$f, .self$grad_f,
+           if (!is.list(x0))
+                   stop("x0: list")
+      if (is.null(x0$β))
+        stop("At least x0$β must be provided")
+                       if (!is.matrix(x0$β) || any(is.na(x0$β)) || ncol(x0$β) != K)
+                               stop("x0$β: matrix, no NA, ncol == K")
+      if (is.null(x0$p))
+        x0$p = rep(1/K, K-1)
+      else if (length(x0$p) != K-1 || sum(x0$p) > 1)
+        stop("x0$p should contain positive integers and sum to < 1")
+      # Next test = heuristic to detect missing b (when matrix is called "beta")
+      if (is.null(x0$b) || all(x0$b == x0$β))
+        x0$b = rep(0, K)
+      else if (any(is.na(x0$b)))
+        stop("x0$b cannot have missing values")
+
+                       op_res = constrOptim( linArgs(x0), .self$f, .self$grad_f,
                                ui=cbind(
                                        rbind( rep(-1,K-1), diag(K-1) ),
                                        matrix(0, nrow=K, ncol=(d+1)*K) ),