15 NORMAL_DISTR_VAR = 10.0
16 GRADIENT_PERTURBATION_VARIANCE = 1e-2
17 HESSIAN_PERTURBATION_VARIANCE = 1e-1
34 solver_eiquadprog = tsid.SolverHQuadProg(
"eiquadprog solver")
35 solver_eiquadprog.resize(n, neq, nin)
36 solver_list.append((
"eiquadprog", solver_eiquadprog))
37 print(
"Adding eiquadprog to list of solvers to test")
40 solver_proxqp = tsid.SolverProxQP(
"proxqp solver")
41 solver_proxqp.resize(n, neq, nin)
42 solver_list.append((
"proxqp", solver_proxqp))
43 print(
"Adding proxqp to list of solvers to test")
45 except AttributeError:
49 solver_osqp = tsid.SolverOSQP(
"osqp solver")
50 solver_osqp.resize(n, neq, nin)
51 solver_list.append((
"osqp", solver_osqp))
52 print(
"Adding osqp to list of solvers to test")
54 except AttributeError:
57 HQPData = tsid.HQPData()
58 A1 = np.random.rand(n, n) + 0.001 * np.eye(n)
59 b1 = np.random.rand(n)
60 cost = tsid.ConstraintEquality(
"c1", A1, b1)
62 x = np.linalg.inv(A1).dot(b1)
63 A_in = np.random.rand(nin, n)
64 A_lb = np.random.rand(nin) * NORMAL_DISTR_VAR
65 A_ub = np.random.rand(nin) * NORMAL_DISTR_VAR
66 constrVal = A_in.dot(x)
68 for i
in range(0, nin):
69 if A_ub[i] <= A_lb[i]:
70 A_ub[i] = A_lb[i] + MARGIN_PERC * np.abs(A_lb[i])
71 A_lb[i] = A_lb[i] - MARGIN_PERC * np.abs(A_lb[i])
73 if constrVal[i] > A_ub[i]:
74 A_ub[i] = constrVal[i] + MARGIN_PERC * np.abs(constrVal[i])
75 elif constrVal[i] < A_lb[i]:
76 A_lb[i] = constrVal[i] - MARGIN_PERC * np.abs(constrVal[i])
78 in_const = tsid.ConstraintInequality(
"ini1", A_in, A_lb, A_ub)
79 A_eq = np.random.rand(neq, n)
81 eq_const = tsid.ConstraintEquality(
"eq1", A_eq, b_eq)
83 const1 = tsid.ConstraintLevel()
84 const1.append(1.0, eq_const)
85 const1.append(1.0, in_const)
86 print(
"check constraint level #0")
89 const2 = tsid.ConstraintLevel()
90 const2.append(1.0, cost)
91 print(
"check constraint level #1")
94 HQPData.append(const1)
95 HQPData.append(const2)
96 print(
"Check HQP DATA")
99 gradientPerturbations = []
100 hessianPerturbations = []
101 for i
in range(0, nTest):
102 gradientPerturbations.append(np.random.rand(n) * GRADIENT_PERTURBATION_VARIANCE)
103 hessianPerturbations.append(np.random.rand(n, n) * HESSIAN_PERTURBATION_VARIANCE)
105 for name, solver
in solver_list:
106 print(f
"Using {name}")
107 for i
in range(0, nTest):
108 cost.setMatrix(cost.matrix + hessianPerturbations[i])
109 cost.setVector(cost.vector + gradientPerturbations[i])
111 HQPoutput = solver.solve(HQPData)
113 assert np.linalg.norm(A_eq.dot(HQPoutput.x) - b_eq, 2) < EPS
114 assert (A_in.dot(HQPoutput.x) <= A_ub + EPS).all()
115 assert (A_in.dot(HQPoutput.x) > A_lb - EPS).all()
116 print(
"-> succesful")