auto A = new_array_ptr<double, 2>({{-0.470233, 0.882543, 0},
{0.470233, -0.882543, 0},
{-0.807883, -0.430453, 0.402535},
{0.807883, 0.430453, -0.402535},
{-0.355254, -0.189285, -0.915405},
{0.355254, 0.189285, 0.915405}});
auto b = new_array_ptr<double, 1>({3.21407,
0.785929,
4.81961,
-1.40824,
0.878975,
1.12103});
auto end_ = new_array_ptr<double, 1>({-1, -1, 1});
auto start_ = new_array_ptr<double, 1>({-4, 0, 2});
auto x = M->variable("x", new_array_ptr<int,1>({dim_space, num_steps}), Domain::unbounded());
auto z = M->variable("z", new_array_ptr<int,1>({dim_space, num_steps-1}), Domain::unbounded());
auto z_norm = M->variable("z_norm", num_steps-1,Domain::unbounded());
auto tstart = M->variable("ts", dim_space, Domain::unbounded());
auto tstart_t = M->variable("ts_norm", Domain::unbounded());
auto tend = M->variable("te", dim_space, Domain::unbounded());
auto tend_t = M->variable("te_norm",Domain::unbounded());
// Absolute value
// t >= |x|, where t, x have the same shape
// 1-norm
// t >= sum( |x_i| ), x is a vector variable
M->constraint(Expr::add(tstart,
Expr::sub(x->slice(nint(0,0), nint(dim_space, 1))->reshape(nint1(dim_space)), start_)), Domain::greaterThan(0.0));
M->constraint(Expr::sub(tstart,
Expr::sub(x->slice(nint(0,0), nint(dim_space, 1))->reshape(nint1(dim_space)), start_)), Domain::greaterThan(0.0));
M->constraint(Expr::sub(tstart_t, Expr::sum(tstart)), Domain::greaterThan(0.0));
M->constraint(Expr::add(tend,
Expr::sub(x->slice(nint(0,num_steps-1), nint(dim_space,num_steps))->reshape(nint1(dim_space)), end_)), Domain::greaterThan(0.0));
M->constraint(Expr::sub(tend,
Expr::sub(x->slice(nint(0,num_steps-1), nint(dim_space,num_steps))->reshape(nint1(dim_space)), end_)), Domain::greaterThan(0.0));
M->constraint(Expr::sub(tend_t, Expr::sum(tend)), Domain::greaterThan(0.0));
M->constraint(Expr::add(z, Expr::sub(x->slice(nint(0,0), nint(dim_space,num_steps-1)),x->slice(nint(0,1), nint(dim_space, num_steps))))
, Domain::greaterThan(0.0));
M->constraint(Expr::sub(z, Expr::sub(x->slice(nint(0,0), nint(dim_space,num_steps-1)), x->slice(nint(0,1), nint(dim_space, num_steps))))
, Domain::greaterThan(0.0));
M->constraint(Expr::sub(z_norm, Expr::sum(z, 0)), Domain::greaterThan(0.0));
for (int i = 0; i < num_steps; i++){
M->constraint(Expr::mul(A, x->slice(nint(0,i), nint(3,i+1))->reshape(nint1(dim_space))), Domain::lessThan(b));
}
M->objective(ObjectiveSense::Minimize, Expr::add(Expr::sum(Expr::mul(lambda2_val, z_norm)), Expr::add(Expr::mul(lambda1_val, tstart_t), Expr::mul(lambda3_val, tend_t))));
M->writeTask("problem.ptf");
M->setLogHandler([](const std::string & msg) { std::cout << msg << std::flush; } );
M->solve();
std::cout<< *(x->level()) << std::endl;
}
Output
where black dots depict the result of Matlab implementation, C++ version all the time, i.e., for different step sizes, get only three points, i.e., start, end, one point with the constraint space (Ax<=b).
If someone could explain to me where I did wrong in the 1-norm implementation. Here I attached the ptf file; it seems to be fine when I go through it.
Thanks,
Geesara