double Lasso(size_t m, size_t n) { std::vector<T> A(m * n); std::vector<T> b(m); std::default_random_engine generator; std::uniform_real_distribution<T> u_dist(static_cast<T>(0), static_cast<T>(1)); std::normal_distribution<T> n_dist(static_cast<T>(0), static_cast<T>(1)); for (unsigned int i = 0; i < m * n; ++i) A[i] = n_dist(generator); std::vector<T> x_true(n); for (unsigned int i = 0; i < n; ++i) x_true[i] = u_dist(generator) < static_cast<T>(0.8) ? static_cast<T>(0) : n_dist(generator) / static_cast<T>(std::sqrt(n)); #ifdef _OPENMP #pragma omp parallel for #endif for (unsigned int i = 0; i < m; ++i) for (unsigned int j = 0; j < n; ++j) b[i] += A[i * n + j] * x_true[j]; // b[i] += A[i + j * m] * x_true[j]; for (unsigned int i = 0; i < m; ++i) b[i] += static_cast<T>(0.5) * n_dist(generator); T lambda_max = static_cast<T>(0); #ifdef _OPENMP #pragma omp parallel for reduction(max : lambda_max) #endif for (unsigned int j = 0; j < n; ++j) { T u = 0; for (unsigned int i = 0; i < m; ++i) //u += A[i * n + j] * b[i]; u += A[i + j * m] * b[i]; lambda_max = std::max(lambda_max, std::abs(u)); } pogs::MatrixDense<T> A_('r', m, n, A.data()); pogs::PogsDirect<T, pogs::MatrixDense<T> > pogs_data(A_); std::vector<FunctionObj<T> > f; std::vector<FunctionObj<T> > g; f.reserve(m); for (unsigned int i = 0; i < m; ++i) f.emplace_back(kSquare, static_cast<T>(1), b[i]); g.reserve(n); for (unsigned int i = 0; i < n; ++i) g.emplace_back(kAbs, static_cast<T>(0.2) * lambda_max); double t = timer<double>(); pogs_data.Solve(f, g); return timer<double>() - t; }
/* Function to decide which router new packet is sent to * */ bool pickLink(int phi) { std::random_device rd; std::uniform_int_distribution<int> u_dist(0,100); if (u_dist(rd) > phi) { return false; } return true; }
double LpEq(int m, int n, int nnz) { std::vector<T> val(nnz); std::vector<int> col_ind(nnz); std::vector<int> row_ptr(m + 2); std::vector<T> x(n); std::vector<T> y(m + 1); std::default_random_engine generator; std::uniform_real_distribution<T> u_dist(static_cast<T>(0), static_cast<T>(1)); // Enforce c == rand(n, 1) std::vector<std::tuple<int, int, T>> entries; entries.reserve(n); for (int i = 0; i < n; ++i) { entries.push_back(std::make_tuple(m, i, u_dist(generator))); } // Generate A and c according to: // A = 4 / n * rand(m, n) nnz = MatGenApprox(m + 1, n, nnz, val.data(), row_ptr.data(), col_ind.data(), static_cast<T>(0), static_cast<T>(4.0 / n), entries); pogs::MatrixSparse<T> A_('r', m + 1, n, nnz, val.data(), row_ptr.data(), col_ind.data()); pogs::PogsIndirect<T, pogs::MatrixSparse<T>> pogs_data(A_); std::vector<FunctionObj<T> > f; std::vector<FunctionObj<T> > g; // Generate b according to: // v = rand(n, 1) // b = A * v std::vector<T> v(n); for (unsigned int i = 0; i < n; ++i) v[i] = u_dist(generator); f.reserve(m + 1); for (unsigned int i = 0; i < m; ++i) { T b_i = static_cast<T>(0); for (unsigned int j = row_ptr[i]; j < row_ptr[i + 1]; ++j) b_i += val[j] * v[col_ind[j]]; f.emplace_back(kIndEq0, static_cast<T>(1), b_i); } f.emplace_back(kIdentity); g.reserve(n); for (unsigned int i = 0; i < n; ++i) g.emplace_back(kIndGe0); double t = timer<double>(); pogs_data.Solve(f, g); return timer<double>() - t; }
T LpIneq(size_t m, size_t n) { std::vector<T> A(m * n); std::vector<T> x(n); std::vector<T> y(m); std::default_random_engine generator; std::uniform_real_distribution<T> u_dist(static_cast<T>(0), static_cast<T>(1)); // Generate A according to: // A = [-1 / n *rand(m - n, n); -eye(n)] for (unsigned int i = 0; i < (m - n) * n; ++i) A[i] = -static_cast<T>(1) / static_cast<T>(n) * u_dist(generator); for (unsigned int i = static_cast<unsigned int>((m - n) * n); i < m * n; ++i) A[i] = (i - (m - n) * n) % (n + 1) == 0 ? -1 : 0; PogsData<T, T*> pogs_data(A.data(), m, n); pogs_data.x = x.data(); pogs_data.y = y.data(); // Generate b according to: // b = A * rand(n, 1) + 0.2 * rand(m, 1) pogs_data.f.reserve(m); for (unsigned int i = 0; i < m; ++i) { T b_i = static_cast<T>(0); for (unsigned int j = 0; j < n; ++j) b_i += A[i * n + j] * u_dist(generator); b_i += static_cast<T>(0.2) * u_dist(generator); pogs_data.f.emplace_back(kIndLe0, static_cast<T>(1), b_i); } // Generate c according to: // c = rand(n, 1) pogs_data.g.reserve(n); for (unsigned int i = 0; i < n; ++i) pogs_data.g.emplace_back(kIdentity, u_dist(generator)); T t = timer<T>(); Pogs(&pogs_data); return timer<T>() - t; }
double Logistic(size_t m, size_t n) { std::vector<T> A(m * (n + 1)); std::vector<T> d(m); std::vector<T> x(n + 1); std::vector<T> y(m); std::default_random_engine generator; std::uniform_real_distribution<T> u_dist(static_cast<T>(0), static_cast<T>(1)); std::normal_distribution<T> n_dist(static_cast<T>(0), static_cast<T>(1)); for (unsigned int i = 0; i < m; ++i) { for (unsigned int j = 0; j < n; ++j) A[i * (n + 1) + j] = n_dist(generator); A[i * (n + 1) + n] = 1; } std::vector<T> x_true(n + 1); for (unsigned int i = 0; i < n; ++i) x_true[i] = u_dist(generator) < 0.8 ? 0 : n_dist(generator) / n; x_true[n] = n_dist(generator) / n; #pragma omp parallel for for (unsigned int i = 0; i < m; ++i) { d[i] = 0; for (unsigned int j = 0; j < n + 1; ++j) // u += A[i + j * m] * x_true[j]; d[i] += A[i * n + j] * x_true[j]; } for (unsigned int i = 0; i < m; ++i) d[i] = 1 / (1 + std::exp(-d[i])) > u_dist(generator); T lambda_max = static_cast<T>(0); #pragma omp parallel for reduction(max : lambda_max) for (unsigned int j = 0; j < n; ++j) { T u = 0; for (unsigned int i = 0; i < m; ++i) // u += A[i * n + j] * (static_cast<T>(0.5) - d[i]); u += A[i + j * m] * (static_cast<T>(0.5) - d[i]); lambda_max = std::max(lambda_max, std::abs(u)); } Dense<T, ROW> A_(A.data()); PogsData<T, Dense<T, ROW>> pogs_data(A_, m, n + 1); pogs_data.x = x.data(); pogs_data.y = y.data(); pogs_data.f.reserve(m); for (unsigned int i = 0; i < m; ++i) pogs_data.f.emplace_back(kLogistic, 1, 0, 1, -d[i]); pogs_data.g.reserve(n + 1); for (unsigned int i = 0; i < n; ++i) pogs_data.g.emplace_back(kAbs, static_cast<T>(0.5) * lambda_max); pogs_data.g.emplace_back(kZero); double t = timer<double>(); Pogs(&pogs_data); return timer<double>() - t; }