2020 */
2121
2222#include <stdio.h>
23+ #include <stdlib.h>
2324#include "{{meta.optimizer_name}}_bindings.h"
2425
2526/*
2627 * Feel free to customize the following code...
2728 */
2829
30+ static const char * exit_status_to_string ({{meta .optimizer_name }}ExitStatus exit_status ) {
31+ switch (exit_status ) {
32+ case {{meta .optimizer_name }}Converged :
33+ return "Converged" ;
34+ case {{meta .optimizer_name }}NotConvergedIterations :
35+ return "NotConvergedIterations" ;
36+ case {{meta .optimizer_name }}NotConvergedOutOfTime :
37+ return "NotConvergedOutOfTime" ;
38+ case {{meta .optimizer_name }}NotConvergedCost :
39+ return "NotConvergedCost" ;
40+ case {{meta .optimizer_name }}NotConvergedNotFiniteComputation :
41+ return "NotConvergedNotFiniteComputation" ;
42+ default :
43+ return "Unknown" ;
44+ }
45+ }
46+
2947int main (void ) {
3048 int i ;
3149
@@ -45,28 +63,18 @@ int main(void) {
4563
4664 /* obtain cache */
4765 {{meta .optimizer_name }}Cache * cache = {{meta .optimizer_name }}_new ();
66+ if (cache == NULL ) {
67+ fprintf (stderr , "Could not allocate solver cache\n" );
68+ return EXIT_FAILURE ;
69+ }
4870
4971 /* solve */
5072 {{meta .optimizer_name }}SolverStatus status = {{meta .optimizer_name }}_solve (cache , u , p , {% if problem .dim_constraints_aug_lagrangian () > 0 %}y {% else %}0 {% endif %}, & init_penalty );
5173
52- /* print results */
53- printf ("\n\n-------------------------------------------------\n" );
54- printf (" Solution\n" );
55- printf ("-------------------------------------------------\n" );
56-
57- for (i = 0 ; i < {{meta .optimizer_name |upper }}_NUM_DECISION_VARIABLES ; ++ i ) {
58- printf ("u[%d] = %g\n" , i , u [i ]);
59- }
60-
61- printf ("\n" );
62- for (i = 0 ; i < {{meta .optimizer_name |upper }}_N1 ; ++ i ) {
63- printf ("y[%d] = %g\n" , i , status .lagrange [i ]);
64- }
65-
6674 printf ("\n\n-------------------------------------------------\n" );
6775 printf (" Solver Statistics\n" );
6876 printf ("-------------------------------------------------\n" );
69- printf ("exit status : %d\n" , status .exit_status );
77+ printf ("exit status : %d (%s) \n" , status .exit_status , exit_status_to_string ( status . exit_status ) );
7078 printf ("error code : %d\n" , status .error_code );
7179 printf ("error message : %s\n" , status .error_message );
7280 printf ("iterations : %lu\n" , status .num_inner_iterations );
@@ -78,10 +86,34 @@ int main(void) {
7886 printf ("Cost : %f\n" , status .cost );
7987 printf ("||FRP|| : %f\n\n" , status .last_problem_norm_fpr );
8088
89+ if (status .error_code != 0 ) {
90+ fprintf (stderr , "Solver returned an error; solution vector is not printed.\n" );
91+ {{meta .optimizer_name }}_free (cache );
92+ return EXIT_FAILURE ;
93+ }
94+
95+ if (status .exit_status != {{meta .optimizer_name }}Converged ) {
96+ fprintf (stderr , "Warning: solver did not converge, printing best available iterate.\n" );
97+ }
98+
99+ /* print results */
100+ printf ("\n\n-------------------------------------------------\n" );
101+ printf (" Solution\n" );
102+ printf ("-------------------------------------------------\n" );
103+
104+ for (i = 0 ; i < {{meta .optimizer_name |upper }}_NUM_DECISION_VARIABLES ; ++ i ) {
105+ printf ("u[%d] = %g\n" , i , u [i ]);
106+ }
107+
108+ printf ("\n" );
109+ for (i = 0 ; i < {{meta .optimizer_name |upper }}_N1 ; ++ i ) {
110+ printf ("y[%d] = %g\n" , i , status .lagrange [i ]);
111+ }
112+
81113
82114
83115 /* free memory */
84116 {{meta .optimizer_name }}_free (cache );
85117
86- return 0 ;
118+ return EXIT_SUCCESS ;
87119}
0 commit comments