28 #include "socp/socp.h"
51 const std::vector<double> &d,
53 std::vector<double> &w)
57 BIASASSERT((
int)f.
Size() == m);
58 BIASASSERT((
int)x.
Size() == m);
59 BIASASSERT((
int)N.size() == L);
60 BIASASSERT((
int)A.size() == L);
61 BIASASSERT((
int)b.size() == L);
62 BIASASSERT((
int)c.size() == L);
63 BIASASSERT((
int)d.size() == L);
64 BIASASSERT((
int)z.size() == L);
65 BIASASSERT((
int)w.size() == L);
66 for (
int i = 0; i < L; i++) {
67 BIASASSERT((
int)A[i].GetRows() == N[i] && (
int)A[i].GetCols() == m);
68 BIASASSERT((
int)b[i].Size() == N[i]);
69 BIASASSERT((
int)c[i].Size() == m);
70 BIASASSERT((
int)z[i].Size() == N[i]);
75 int *in_N =
new int[L];
76 for (
int i = 0; i < L; i++)
81 double *in_f =
new double[m];
82 double *in_Ac =
new double[(n+L)*m];
83 double *in_bd =
new double[n+L];
84 double *inout_x =
new double[m];
85 double *inout_zw =
new double[n+L];
87 for (
int i = 0; i < L; i++) {
88 for (
int col = 0; col < m; col++) {
89 for (
int row = 0; row < N[i]; row++)
90 *(ptr++) = A[i][row][col];
95 for (
int i = 0; i < L; i++) {
96 for (
int row = 0; row < N[i]; row++)
100 for (
int j = 0; j < m; j++) {
105 for (
int i = 0; i < L; i++) {
106 for (
int row = 0; row < N[i]; row++)
107 *(ptr++) = z[i][row];
112 int dblSize, intSize, mhist, nhist;
113 socp_getwork(L, in_N, m, MaxIters_, 0, &mhist, &nhist, &dblSize, &intSize);
114 double* dblWorkspace =
new double[dblSize];
115 int* intWorkspace =
new int[intSize];
117 int iter = MaxIters_, info = 0;
118 int res = socp(L, in_N, m, in_f, in_Ac, in_bd, inout_x, inout_zw,
119 AbsTolerance_, RelTolerance_, TargetValue_, &iter, Nu_,
120 &info, 0, (
double*)0, dblWorkspace, intWorkspace);
123 for (
int j = 0; j < m; j++)
126 for (
int i = 0; i < L; i++) {
127 for (
int row = 0; row < N[i]; row++)
128 z[i][row] = *(ptr++);
139 delete[] dblWorkspace;
140 delete[] intWorkspace;
142 return (res != 0) ? -1 : 0;
152 BIASASSERT((
int)f.
Size() == m);
153 BIASASSERT((
int)x.
Size() == m);
155 BIASASSERT((
int)b.
Size() == n);
156 BIASASSERT((
int)c.
Size() == m);
157 BIASASSERT((
int)z.
Size() == n)
162 double *in_f =
new double[m];
163 double *in_Ac =
new double[(n+L)*m];
164 double *in_bd =
new double[n+L];
165 double *inout_x =
new double[m];
166 double *inout_zw =
new double[n+L];
168 for (
int col = 0; col < m; col++) {
169 for (
int row = 0; row < n; row++)
170 *(ptr++) = A[row][col];
174 for (
int row = 0; row < n; row++)
177 for (
int j = 0; j < m; j++) {
182 for (
int row = 0; row < n; row++)
187 int dblSize, intSize, mhist, nhist;
188 socp_getwork(L, &in_N, m, MaxIters_, 0, &mhist, &nhist, &dblSize, &intSize);
189 double* dblWorkspace =
new double[dblSize];
190 int* intWorkspace =
new int[intSize];
192 int iter = MaxIters_, info = 0;
193 int res = socp(L, &in_N, m, in_f, in_Ac, in_bd, inout_x, inout_zw,
194 AbsTolerance_, RelTolerance_, TargetValue_, &iter, Nu_,
195 &info, 0, (
double*)0, dblWorkspace, intWorkspace);
198 for (
int j = 0; j < m; j++)
201 for (
int row = 0; row < n; row++)
211 delete[] dblWorkspace;
212 delete[] intWorkspace;
214 return (res != 0) ? -1 : 0;
unsigned int Size() const
length of the vector
unsigned int GetRows() const
int Compute(int L, int m, const std::vector< int > &N, const Vector< double > &f, const std::vector< Matrix< double > > &A, const std::vector< Vector< double > > &b, const std::vector< Vector< double > > &c, const std::vector< double > &d, Vector< double > &x, std::vector< Vector< double > > &z, std::vector< double > &w)
Solve Second-Order Cone Programming instance with L constraints.
unsigned int GetCols() const
~SOCP()
Release memory used.
SOCP()
Create SOCP solver with default parameters.