8 rng = np.random.default_rng(seed=0)
17 NORMAL_DISTR_VAR = 10.0
18 GRADIENT_PERTURBATION_VARIANCE = 1e-2
19 HESSIAN_PERTURBATION_VARIANCE = 1e-1
36 solver_eiquadprog = tsid.SolverHQuadProg(
"eiquadprog solver")
37 solver_eiquadprog.resize(n, neq, nin)
38 solver_list.append((
"eiquadprog", solver_eiquadprog))
39 print(
"Adding eiquadprog to list of solvers to test")
42 solver_proxqp = tsid.SolverProxQP(
"proxqp solver")
43 solver_proxqp.set_epsilon_absolute(1e-6)
44 solver_proxqp.resize(n, neq, nin)
45 solver_list.append((
"proxqp", solver_proxqp))
46 print(
"Adding proxqp to list of solvers to test")
48 except AttributeError:
52 solver_osqp = tsid.SolverOSQP(
"osqp solver")
53 solver_osqp.set_epsilon_absolute(1e-6)
54 solver_osqp.set_maximum_iterations(10_000)
55 solver_osqp.resize(n, neq, nin)
56 solver_list.append((
"osqp", solver_osqp))
57 print(
"Adding osqp to list of solvers to test")
59 except AttributeError:
62 HQPData = tsid.HQPData()
63 A1 = rng.random((n, n)) + 0.001 * np.eye(n)
65 cost = tsid.ConstraintEquality(
"c1", A1, b1)
67 x = np.linalg.solve(A1, b1)
69 A_in = rng.random((nin, n))
70 A_lb = rng.random(nin) * NORMAL_DISTR_VAR
71 A_ub = rng.random(nin) * NORMAL_DISTR_VAR
72 constrVal = A_in.dot(x)
74 for i
in range(0, nin):
75 if A_ub[i] <= A_lb[i]:
76 A_ub[i] = A_lb[i] + MARGIN_PERC * np.abs(A_lb[i])
77 A_lb[i] = A_lb[i] - MARGIN_PERC * np.abs(A_lb[i])
79 if constrVal[i] > A_ub[i]:
80 A_ub[i] = constrVal[i] + MARGIN_PERC * np.abs(constrVal[i])
81 elif constrVal[i] < A_lb[i]:
82 A_lb[i] = constrVal[i] - MARGIN_PERC * np.abs(constrVal[i])
84 in_const = tsid.ConstraintInequality(
"ini1", A_in, A_lb, A_ub)
85 A_eq = rng.random((neq, n))
87 eq_const = tsid.ConstraintEquality(
"eq1", A_eq, b_eq)
89 const1 = tsid.ConstraintLevel()
90 const1.append(1.0, eq_const)
91 const1.append(1.0, in_const)
92 print(
"check constraint level #0")
95 const2 = tsid.ConstraintLevel()
96 const2.append(1.0, cost)
97 print(
"check constraint level #1")
100 HQPData.append(const1)
101 HQPData.append(const2)
102 print(
"Check HQP DATA")
105 gradientPerturbations = []
106 hessianPerturbations = []
107 for _
in range(0, nTest):
108 gradientPerturbations.append(rng.random(n) * GRADIENT_PERTURBATION_VARIANCE)
109 hessianPerturbations.append(rng.random((n, n)) * HESSIAN_PERTURBATION_VARIANCE)
111 for name, solver
in solver_list:
112 print(f
"Using {name}")
113 for i
in range(0, nTest):
114 cost.setMatrix(cost.matrix + hessianPerturbations[i])
115 cost.setVector(cost.vector + gradientPerturbations[i])
117 HQPoutput = solver.solve(HQPData)
119 assert HQPoutput.status == 0
120 assert np.linalg.norm(A_eq.dot(HQPoutput.x) - b_eq, 2) < EPS
121 assert (A_in.dot(HQPoutput.x) <= A_ub + EPS).all()
122 assert (A_in.dot(HQPoutput.x) > A_lb - EPS).all()
123 print(
"-> succesful")