This example shows how to generate a problem using CasADi and how to load and solve it using PANOC-ALM.
Problem generation using CasADi
1 from casadi
import SX, Function, CodeGenerator, vertcat, jtimes, gradient
5 print(f
"Usage: {argv[0]} <name>")
11 unknwns = vertcat(x, y, z)
19 cg = CodeGenerator(f
"{argv[1]}.c")
20 cg.add(Function(
"f", [unknwns],
23 cg.add(Function(
"grad_f", [unknwns],
24 [gradient(f, unknwns)],
26 cg.add(Function(
"g", [unknwns],
29 cg.add(Function(
"grad_g", [unknwns, w],
30 [jtimes(g, unknwns, w,
True)],
31 [
"x",
"w"], [
"grad_g"]))
Problem solution using PANOC-ALM
#include <iostream>
int main(
int argc,
char *argv[]) {
auto so_name = "examples/CasADi/Rosenbrock/librosenbrock_functions.so";
if (argc > 1)
so_name = argv[1];
p.C.upperbound = vec::Constant(3,
inf);
p.C.lowerbound = vec::Constant(3, -
inf);
p.D.upperbound = vec::Constant(1, 0.);
p.D.lowerbound = vec::Constant(1, 0.);
};
std::cout <<
"status: " <<
stats.status << std::endl;
std::cout <<
"x = " <<
x.transpose() << std::endl;
std::cout <<
"y = " <<
y.transpose() << std::endl;
std::cout <<
"g = " <<
g.transpose() << std::endl;
std::cout <<
"f = " <<
p.f(
x) << std::endl;
std::cout <<
"inner: " <<
stats.inner.iterations << std::endl;
std::cout <<
"outer: " <<
stats.outer_iterations << std::endl;
}
int main(int argc, char *argv[])
pa::Problem load_CasADi_problem(const std::string &filename, unsigned n, unsigned m, bool second_order=false)
Load a problem generated by CasADi (without parameters).