@@ -18,100 +18,106 @@ VectorXd C3MIQP::SolveSingleProjection(const MatrixXd& U,
1818                                       const  MatrixXd& H, const  VectorXd& c,
1919                                       const  int  admm_iteration,
2020                                       const  int & warm_start_index) {
21-   //  Create an environment
22-   GRBEnv env (true );
23-   env.set (" LogToConsole"  , " 0"  );
24-   env.set (" OutputFlag"  , " 0"  );
25-   env.set (" Threads"  , " 0"  );
26-   env.start ();
27-   //  set up linear term in cost
28-   VectorXd cost_lin = -2  * delta_c.transpose () * U;
29- 
30-   //  set up for constraints (Ex + F \lambda + Hu + c >= 0)
31-   MatrixXd Mcons1 (n_lambda_, n_x_ + n_lambda_ + n_u_);
32-   Mcons1 << E, F, H;
33- 
34-   //  set up for constraints (\lambda >= 0)
35-   MatrixXd MM1 = MatrixXd::Zero (n_lambda_, n_x_);
36-   MatrixXd MM2 = MatrixXd::Identity (n_lambda_, n_lambda_);
37-   MatrixXd MM3 = MatrixXd::Zero (n_lambda_, n_u_);
38-   MatrixXd Mcons2 (n_lambda_, n_x_ + n_lambda_ + n_u_);
39-   Mcons2 << MM1, MM2, MM3;
40- 
41-   GRBModel model = GRBModel (env);
42- 
43-   GRBVar delta_k[n_x_ + n_lambda_ + n_u_];
44-   GRBVar binary[n_lambda_];
45- 
46-   for  (int  i = 0 ; i < n_lambda_; i++) {
47-     binary[i] = model.addVar (0.0 , 1.0 , 0.0 , GRB_BINARY);
48-     if  (warm_start_index != -1 ) {
49-       binary[i].set (GRB_DoubleAttr_Start,
50-                     warm_start_binary_[admm_iteration][warm_start_index](i));
21+   try  {
22+     //  Create an environment
23+     GRBEnv env (true );
24+     env.set (" LogToConsole"  , " 0"  );
25+     env.set (" OutputFlag"  , " 0"  );
26+     env.set (" Threads"  , " 0"  );
27+     env.start ();
28+     //  set up linear term in cost
29+     VectorXd cost_lin = -2  * delta_c.transpose () * U;
30+ 
31+     //  set up for constraints (Ex + F \lambda + Hu + c >= 0)
32+     MatrixXd Mcons1 (n_lambda_, n_x_ + n_lambda_ + n_u_);
33+     Mcons1 << E, F, H;
34+ 
35+     //  set up for constraints (\lambda >= 0)
36+     MatrixXd MM1 = MatrixXd::Zero (n_lambda_, n_x_);
37+     MatrixXd MM2 = MatrixXd::Identity (n_lambda_, n_lambda_);
38+     MatrixXd MM3 = MatrixXd::Zero (n_lambda_, n_u_);
39+     MatrixXd Mcons2 (n_lambda_, n_x_ + n_lambda_ + n_u_);
40+     Mcons2 << MM1, MM2, MM3;
41+ 
42+     GRBModel model = GRBModel (env);
43+ 
44+     GRBVar delta_k[n_x_ + n_lambda_ + n_u_];
45+     GRBVar binary[n_lambda_];
46+ 
47+     for  (int  i = 0 ; i < n_lambda_; i++) {
48+       binary[i] = model.addVar (0.0 , 1.0 , 0.0 , GRB_BINARY);
49+       if  (warm_start_index != -1 ) {
50+         binary[i].set (GRB_DoubleAttr_Start,
51+                       warm_start_binary_[admm_iteration][warm_start_index](i));
52+       }
5153    }
52-   }
5354
54-   for  (int  i = 0 ; i < n_x_ + n_lambda_ + n_u_; i++) {
55-     delta_k[i] =
56-         model.addVar (-kVariableBounds , kVariableBounds , 0.0 , GRB_CONTINUOUS);
57-     if  (warm_start_index != -1 ) {
58-       delta_k[i].set (GRB_DoubleAttr_Start,
59-                      warm_start_delta_[admm_iteration][warm_start_index](i));
55+     for  (int  i = 0 ; i < n_x_ + n_lambda_ + n_u_; i++) {
56+       delta_k[i] =
57+           model.addVar (-kVariableBounds , kVariableBounds , 0.0 , GRB_CONTINUOUS);
58+       if  (warm_start_index != -1 ) {
59+         delta_k[i].set (GRB_DoubleAttr_Start,
60+                        warm_start_delta_[admm_iteration][warm_start_index](i));
61+       }
6062    }
61-   }
6263
63-   GRBQuadExpr obj = 0 ;
64+      GRBQuadExpr obj = 0 ;
6465
65-   for  (int  i = 0 ; i < n_x_ + n_lambda_ + n_u_; i++) {
66-     obj.addTerm (cost_lin (i), delta_k[i]);
67-     obj.addTerm (U (i, i), delta_k[i], delta_k[i]);
68-   }
66+      for  (int  i = 0 ; i < n_x_ + n_lambda_ + n_u_; i++) {
67+        obj.addTerm (cost_lin (i), delta_k[i]);
68+        obj.addTerm (U (i, i), delta_k[i], delta_k[i]);
69+      }
6970
70-   model.setObjective (obj, GRB_MINIMIZE);
71+      model.setObjective (obj, GRB_MINIMIZE);
7172
72-   double  coeff[n_x_ + n_lambda_ + n_u_];
73-   double  coeff2[n_x_ + n_lambda_ + n_u_];
73+      double  coeff[n_x_ + n_lambda_ + n_u_];
74+      double  coeff2[n_x_ + n_lambda_ + n_u_];
7475
75-   for  (int  i = 0 ; i < n_lambda_; i++) {
76-     GRBLinExpr lambda_expr = 0 ;
76+      for  (int  i = 0 ; i < n_lambda_; i++) {
77+        GRBLinExpr lambda_expr = 0 ;
7778
78-     // / convert VectorXd to double
79-     for  (int  j = 0 ; j < n_x_ + n_lambda_ + n_u_; j++) {
80-       coeff[j] = Mcons2 (i, j);
81-     }
79+        // / convert VectorXd to double
80+        for  (int  j = 0 ; j < n_x_ + n_lambda_ + n_u_; j++) {
81+          coeff[j] = Mcons2 (i, j);
82+        }
8283
83-     lambda_expr.addTerms (coeff, delta_k, n_x_ + n_lambda_ + n_u_);
84-     model.addConstr (lambda_expr >= 0 );
85-     model.addConstr (lambda_expr <= M_ * (1  - binary[i]));
84+        lambda_expr.addTerms (coeff, delta_k, n_x_ + n_lambda_ + n_u_);
85+        model.addConstr (lambda_expr >= 0 );
86+        model.addConstr (lambda_expr <= M_ * (1  - binary[i]));
8687
87-     GRBLinExpr activation_expr = 0 ;
88+        GRBLinExpr activation_expr = 0 ;
8889
89-     // / convert VectorXd to double
90-     for  (int  j = 0 ; j < n_x_ + n_lambda_ + n_u_; j++) {
91-       coeff2[j] = Mcons1 (i, j);
92-     }
90+        // / convert VectorXd to double
91+        for  (int  j = 0 ; j < n_x_ + n_lambda_ + n_u_; j++) {
92+          coeff2[j] = Mcons1 (i, j);
93+        }
9394
94-     activation_expr.addTerms (coeff2, delta_k, n_x_ + n_lambda_ + n_u_);
95-     model.addConstr (activation_expr + c (i) >= 0 );
96-     model.addConstr (activation_expr + c (i) <= M_ * binary[i]);
97-   }
95+        activation_expr.addTerms (coeff2, delta_k, n_x_ + n_lambda_ + n_u_);
96+        model.addConstr (activation_expr + c (i) >= 0 );
97+        model.addConstr (activation_expr + c (i) <= M_ * binary[i]);
98+      }
9899
99-   model.optimize ();
100+      model.optimize ();
100101
101-   VectorXd delta_kc (n_x_ + n_lambda_ + n_u_);
102-   VectorXd binaryc (n_lambda_);
103-   for  (int  i = 0 ; i < n_x_ + n_lambda_ + n_u_; i++) {
104-     delta_kc (i) = delta_k[i].get (GRB_DoubleAttr_X);
105-   }
106-   for  (int  i = 0 ; i < n_lambda_; i++) {
107-     binaryc (i) = binary[i].get (GRB_DoubleAttr_X);
108-   }
102+      VectorXd delta_kc (n_x_ + n_lambda_ + n_u_);
103+      VectorXd binaryc (n_lambda_);
104+      for  (int  i = 0 ; i < n_x_ + n_lambda_ + n_u_; i++) {
105+        delta_kc (i) = delta_k[i].get (GRB_DoubleAttr_X);
106+      }
107+      for  (int  i = 0 ; i < n_lambda_; i++) {
108+        binaryc (i) = binary[i].get (GRB_DoubleAttr_X);
109+      }
109110
110-   if  (warm_start_index != -1 ) {
111-     warm_start_delta_[admm_iteration][warm_start_index] = delta_kc;
112-     warm_start_binary_[admm_iteration][warm_start_index] = binaryc;
111+     if  (warm_start_index != -1 ) {
112+       warm_start_delta_[admm_iteration][warm_start_index] = delta_kc;
113+       warm_start_binary_[admm_iteration][warm_start_index] = binaryc;
114+     }
115+     return  delta_kc;
116+   } catch  (GRBException& e) {
117+     std::cerr << " Error code = "   << e.getErrorCode () << std::endl;
118+     std::cerr << e.getMessage () << std::endl;
119+     throw  std::runtime_error (" Gurobi optimization failed."  );
113120  }
114-   return  delta_kc;
115121}
116122
117123}  //  namespace c3
0 commit comments