test_Solvers.py
Go to the documentation of this file.
1 import numpy as np
2 import tsid
3 
4 print("")
5 print("Test Solvers")
6 print("")
7 
8 rng = np.random.default_rng(seed=0)
9 
10 EPS = 1e-3
11 nTest = 100
12 n = 60
13 neq = 36
14 nin = 40
15 damping = 1e-10
16 
17 NORMAL_DISTR_VAR = 10.0
18 GRADIENT_PERTURBATION_VARIANCE = 1e-2
19 HESSIAN_PERTURBATION_VARIANCE = 1e-1
20 MARGIN_PERC = 1e-3
21 
22 print(
23  "Gonna perform",
24  nTest,
25  "tests with",
26  n,
27  "variables, ",
28  neq,
29  "equalities",
30  nin,
31  "inequalities",
32 )
33 
34 solver_list = []
35 
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")
40 
41 try:
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")
47 
48 except AttributeError:
49  pass
50 
51 try:
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")
58 
59 except AttributeError:
60  pass
61 
62 HQPData = tsid.HQPData()
63 A1 = rng.random((n, n)) + 0.001 * np.eye(n)
64 b1 = rng.random(n)
65 cost = tsid.ConstraintEquality("c1", A1, b1)
66 
67 x = np.linalg.solve(A1, b1)
68 
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)
73 
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])
78 
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])
83 
84 in_const = tsid.ConstraintInequality("ini1", A_in, A_lb, A_ub)
85 A_eq = rng.random((neq, n))
86 b_eq = A_eq.dot(x)
87 eq_const = tsid.ConstraintEquality("eq1", A_eq, b_eq)
88 
89 const1 = tsid.ConstraintLevel()
90 const1.append(1.0, eq_const)
91 const1.append(1.0, in_const)
92 print("check constraint level #0")
93 const1.print_all()
94 
95 const2 = tsid.ConstraintLevel()
96 const2.append(1.0, cost)
97 print("check constraint level #1")
98 const2.print_all()
99 
100 HQPData.append(const1)
101 HQPData.append(const2)
102 print("Check HQP DATA")
103 HQPData.print_all()
104 
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)
110 
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])
116 
117  HQPoutput = solver.solve(HQPData)
118 
119  assert HQPoutput.status == 0 # HQP_STATUS_OPTIMAL = 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")


tsid
Author(s): Andrea Del Prete, Justin Carpentier
autogenerated on Sat May 3 2025 02:48:17