/* Copyright 2025, Gurobi Optimization, LLC *//* This example considers the following separable, convex problem: minimize f(x) - y + g(z) subject to x + 2 y + 3 z <= 4 x + y >= 1 x, y, z <= 1 where f(u) = exp(-u) and g(u) = 2 u^2 - 4 u, for all real u. It formulates and solves a simpler LP model by approximating f and g with piecewise-linear functions. Then it transforms the model into a MIP by negating the approximation for f, which corresponds to a non-convex piecewise-linear function, and solves it again.*/usingSystem;usingGurobi;classpiecewise_cs{privatestaticdoublef(doubleu){returnMath.Exp(-u);}privatestaticdoubleg(doubleu){return2*u*u-4*u;}staticvoidMain(){try{// Create environmentGRBEnvenv=newGRBEnv();// Create a new modelGRBModelmodel=newGRBModel(env);// Create variablesdoublelb=0.0,ub=1.0;GRBVarx=model.AddVar(lb,ub,0.0,GRB.CONTINUOUS,"x");GRBVary=model.AddVar(lb,ub,0.0,GRB.CONTINUOUS,"y");GRBVarz=model.AddVar(lb,ub,0.0,GRB.CONTINUOUS,"z");// Set objective for ymodel.SetObjective(-y);// Add piecewise-linear objective functions for x and zintnpts=101;double[]ptu=newdouble[npts];double[]ptf=newdouble[npts];double[]ptg=newdouble[npts];for(inti=0;i<npts;i++){ptu[i]=lb+(ub-lb)*i/(npts-1);ptf[i]=f(ptu[i]);ptg[i]=g(ptu[i]);}model.SetPWLObj(x,ptu,ptf);model.SetPWLObj(z,ptu,ptg);// Add constraint: x + 2 y + 3 z <= 4model.AddConstr(x+2*y+3*z<=4.0,"c0");// Add constraint: x + y >= 1model.AddConstr(x+y>=1.0,"c1");// Optimize model as an LPmodel.Optimize();Console.WriteLine("IsMIP: "+model.IsMIP);Console.WriteLine(x.VarName+" "+x.X);Console.WriteLine(y.VarName+" "+y.X);Console.WriteLine(z.VarName+" "+z.X);Console.WriteLine("Obj: "+model.ObjVal);Console.WriteLine();// Negate piecewise-linear objective function for xfor(inti=0;i<npts;i++){ptf[i]=-ptf[i];}model.SetPWLObj(x,ptu,ptf);// Optimize model as a MIPmodel.Optimize();Console.WriteLine("IsMIP: "+model.IsMIP);Console.WriteLine(x.VarName+" "+x.X);Console.WriteLine(y.VarName+" "+y.X);Console.WriteLine(z.VarName+" "+z.X);Console.WriteLine("Obj: "+model.ObjVal);// Dispose of model and environmentmodel.Dispose();env.Dispose();}catch(GRBExceptione){Console.WriteLine("Error code: "+e.ErrorCode+". "+e.Message);}}}