blob: c3445d2d4e6c86b0de10a537836e73d731382a40 [file] [log] [blame]
Austin Schuh9049e202022-02-20 17:34:16 -08001#include "osqp.h" // OSQP API
2#include "osqp_tester.h" // Basic testing script header
3
4
5#include "basic_qp2/data.h"
6
7
8void test_basic_qp2_solve()
9{
10 c_int exitflag;
11
12 // Problem settings
13 OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
14
15 // Structures
16 OSQPWorkspace *work; // Workspace
17 OSQPData *data; // Data
18 basic_qp2_sols_data *sols_data;
19
20
21 // Populate data
22 data = generate_problem_basic_qp2();
23 sols_data = generate_problem_basic_qp2_sols_data();
24
25
26 // Define Solver settings as default
27 osqp_set_default_settings(settings);
28 settings->alpha = 1.6;
29 settings->rho = 0.1;
30 settings->polish = 1;
31 settings->verbose = 1;
32
33 // Setup workspace
34 exitflag = osqp_setup(&work, data, settings);
35
36 // Setup correct
37 mu_assert("Basic QP 2 test solve: Setup error!", exitflag == 0);
38
39 // Solve Problem first time
40 osqp_solve(work);
41
42 // Compare solver statuses
43 mu_assert("Basic QP 2 test solve: Error in solver status!",
44 work->info->status_val == sols_data->status_test);
45
46 // Compare primal solutions
47 mu_assert("Basic QP 2 test solve: Error in primal solution!",
48 vec_norm_inf_diff(work->solution->x, sols_data->x_test,
49 data->n) /
50 vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
51
52
53 // Compare dual solutions
54 mu_assert("Basic QP 2 test solve: Error in dual solution!",
55 vec_norm_inf_diff(work->solution->y, sols_data->y_test,
56 data->m) /
57 vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
58
59 // Compare objective values
60 mu_assert("Basic QP 2 test solve: Error in objective value!",
61 c_absval(work->info->obj_val - sols_data->obj_value_test)/(c_absval(sols_data->obj_value_test)) < TESTS_TOL);
62
63 // Clean workspace
64 osqp_cleanup(work);
65
66 // Cleanup settings and data
67 c_free(settings);
68 clean_problem_basic_qp2(data);
69 clean_problem_basic_qp2_sols_data(sols_data);
70}
71
72#ifdef ENABLE_MKL_PARDISO
73void test_basic_qp2_solve_pardiso()
74{
75 c_int exitflag;
76
77 // Problem settings
78 OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
79
80 // Structures
81 OSQPWorkspace *work; // Workspace
82 OSQPData *data; // Data
83 basic_qp2_sols_data *sols_data;
84
85
86 // Populate data
87 data = generate_problem_basic_qp2();
88 sols_data = generate_problem_basic_qp2_sols_data();
89
90
91 // Define Solver settings as default
92 osqp_set_default_settings(settings);
93 settings->alpha = 1.6;
94 settings->rho = 0.1;
95 settings->polish = 1;
96 settings->verbose = 1;
97 settings->linsys_solver = MKL_PARDISO_SOLVER;
98
99 // Setup workspace
100 exitflag = osqp_setup(&work, data, settings);
101
102 // Setup correct
103 mu_assert("Basic QP 2 test solve: Setup error!", exitflag == 0);
104
105 // Solve Problem first time
106 osqp_solve(work);
107
108 // Compare solver statuses
109 mu_assert("Basic QP 2 test solve: Error in solver status!",
110 work->info->status_val == sols_data->status_test);
111
112 // Compare primal solutions
113 mu_assert("Basic QP 2 test solve: Error in primal solution!",
114 vec_norm_inf_diff(work->solution->x, sols_data->x_test,
115 data->n) /
116 vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
117
118
119 // Compare dual solutions
120 mu_assert("Basic QP 2 test solve: Error in dual solution!",
121 vec_norm_inf_diff(work->solution->y, sols_data->y_test,
122 data->m) /
123 vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
124
125
126 // Compare objective values
127 mu_assert("Basic QP 2 test solve: Error in objective value!",
128 c_absval(work->info->obj_val - sols_data->obj_value_test) <
129 TESTS_TOL);
130
131
132 // Clean workspace
133 osqp_cleanup(work);
134
135 // Cleanup settings and data
136 c_free(settings);
137 clean_problem_basic_qp2(data);
138 clean_problem_basic_qp2_sols_data(sols_data);
139}
140#endif
141
142void test_basic_qp2_update()
143{
144 c_int exitflag;
145
146 // Problem settings
147 OSQPSettings *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));
148
149 // Structures
150 OSQPWorkspace *work; // Workspace
151 OSQPData *data; // Data
152 basic_qp2_sols_data *sols_data;
153
154
155 // Populate data
156 data = generate_problem_basic_qp2();
157 sols_data = generate_problem_basic_qp2_sols_data();
158
159
160 // Define Solver settings as default
161 osqp_set_default_settings(settings);
162 settings->alpha = 1.6;
163
164 settings->warm_start = 1;
165 settings->polish = 1;
166 settings->verbose = 1;
167
168 // Setup workspace
169 exitflag = osqp_setup(&work, data, settings);
170
171 // Setup correct
172 mu_assert("Basic QP 2 test update: Setup error!", exitflag == 0);
173
174
175 // Modify linear cost and upper bound
176 osqp_update_lin_cost(work, sols_data->q_new);
177 osqp_update_upper_bound(work, sols_data->u_new);
178
179 // Solve Problem second time(with different data now)
180 osqp_solve(work);
181
182 // Compare solver statuses
183 mu_assert("Basic QP 2 test update: Error in solver status!",
184 work->info->status_val == sols_data->status_test_new);
185
186 // Compare primal solutions
187 mu_assert("Basic QP 2 test update: Error in primal solution!",
188 vec_norm_inf_diff(work->solution->x, sols_data->x_test_new,
189 data->n) /
190 vec_norm_inf(sols_data->x_test_new, data->n) < TESTS_TOL);
191
192 // Compare dual solutions
193 mu_assert("Basic QP 2 test update: Error in dual solution!",
194 vec_norm_inf_diff(work->solution->y, sols_data->y_test_new,
195 data->m) /
196 vec_norm_inf(sols_data->y_test_new, data->m) < TESTS_TOL);
197
198
199 // Compare objective values
200 mu_assert("Basic QP 2 test update: Error in objective value!",
201 c_absval(
202 work->info->obj_val - sols_data->obj_value_test_new)/(c_absval(sols_data->obj_value_test_new)) < TESTS_TOL);
203
204 // Clean workspace
205 osqp_cleanup(work);
206
207 // Cleanup settings and data
208 c_free(settings);
209 clean_problem_basic_qp2(data);
210 clean_problem_basic_qp2_sols_data(sols_data);
211}