#include <functional>
#include <random>
#include <vector>
#ifdef USE_CGAL
#include <CGAL/MP_Float.h>
#include <CGAL/QP_functions.h>
#include <CGAL/QP_models.h>
#include <CGAL/QP_solution.h>
#include <CGAL/basic.h>
typedef CGAL::MP_Float ET;
typedef CGAL::Quadratic_program_solution<ET> Solution;
typedef CGAL::Quadratic_program_from_iterators<
double**,
double*,
CGAL::Const_oneset_iterator<CGAL::Comparison_result>,
bool*,
double*,
bool*,
double*,
double**,
double*>
Program;
#endif
void calc_residual(Grid&
grid, DataMatrix& samples,
double lambda, DataVector&
alpha,
DataVector& result) {
size_t numSamples = samples.getNrows();
size_t storage_size =
grid.getStorage().getSize();
DensitySystemMatrix AlambC(A_op, B_op, C_op,
lambda, numSamples);
DataVector b(storage_size);
AlambC.generateb(b);
AlambC.mult(
alpha, result);
result.sub(b);
}
void randu(DataVector& rvar, std::mt19937& generator) {
std::normal_distribution<double> distribution(0.5, 0.1);
for (size_t j = 0; j < rvar.getSize(); ++j) {
rvar[j] = distribution(generator);
while (rvar[j] < 0 || rvar[j] > 1) rvar[j] = distribution(generator);
}
}
void createSamples(DataMatrix& rvar, std::uint64_t seedValue = std::mt19937_64::default_seed) {
size_t nsamples = rvar.getNrows(), ndim = rvar.getNcols();
std::mt19937 generator(static_cast<std::mt19937::result_type>(seedValue));
DataVector sample(ndim);
for (size_t i = 0; i < nsamples; ++i) {
randu(sample, generator);
rvar.setRow(i, sample);
}
}
void checkPositive(Grid&
grid,
const DataVector&
alpha) {
size_t dims =
grid.getDimension();
DataVector coords(dims);
for (
size_t i = 0;
i < storage_size;
i++) {
gp.getStandardCoordinates(coords);
if (op_eval->eval(
alpha, coords) < 0) {
std::cout <<
"f(" << coords.toString() <<
")=" << op_eval->eval(
alpha, coords) << std::endl;
}
}
}
#ifdef USE_CGAL
void solve_cgal(Grid&
grid, DataMatrix& samples,
double lambda, DataVector& result) {
std::cout << "storage size:" << storage_size << std::endl;
size_t numSamples =
samples.getNrows();
DataMatrix M(storage_size, storage_size);
DataMatrix
C(storage_size, storage_size);
DataVector
b(storage_size);
DataVector q(storage_size);
DensitySystemMatrix AlambC(A_op, B_op, C_op,
lambda, numSamples);
AlambC.generateb(b);
M.add(C);
M.mult(b, q);
q.mult(-1);
double** P_it = new double*[storage_size];
for (
size_t i = 0;
i < storage_size;
i++) {
P_it[
i] =
new double[storage_size];
}
for (
size_t i = 0;
i < storage_size;
i++) {
DataVector col(storage_size);
DataVector
tmp(storage_size);
M.getColumn(i, col);
M.mult(col, tmp);
P_it[
i] =
new double[storage_size];
for (
size_t j = 0;
j <=
i;
j++) {
}
}
for (
size_t i = 0;
i < storage_size;
i++) {
for (
size_t j = 0;
j < storage_size;
j++) {
std::cout << P_it[
j][
i] <<
" ";
}
std::cout << std::endl;
}
std::cout << "---------------" << std::endl;
DataMatrix gridPoints(storage_size, dims);
for (
size_t i = 0;
i < storage_size;
i++) {
DataVector coords(dims);
gp.getStandardCoordinates(coords);
gridPoints.setRow(i, coords);
}
double** G_it = new double*[storage_size];
for (
size_t i = 0;
i < storage_size;
i++) {
G_it[
i] =
new double[storage_size];
}
for (
size_t i = 0;
i < storage_size;
i++) {
DataVector tmp_result(storage_size);
DataVector
alpha(storage_size, 0.0);
G_op->mult(
alpha, tmp_result);
for (
size_t j = 0;
j < storage_size;
j++) {
G_it[
i][
j] = tmp_result.get(j);
}
}
for (
size_t i = 0;
i < storage_size;
i++) {
for (
size_t j = 0;
j < storage_size;
j++) {
std::cout << G_it[
j][
i] <<
" ";
}
std::cout << std::endl;
}
std::cout << q.toString() << std::endl;
CGAL::Const_oneset_iterator<CGAL::Comparison_result>
r(CGAL::LARGER);
bool* bounded = new bool[storage_size];
for (
size_t i = 0;
i < storage_size;
i++) {
}
DataVector bounds(storage_size, 0.0);
Program qp(static_cast<int>(storage_size), static_cast<int>(storage_size),
G_it, bounds.getPointer(), r,
bounded, bounds.getPointer(), bounded, bounds.getPointer(),
P_it, q.getPointer());
Solution
s = CGAL::solve_quadratic_program(qp, ET());
Solution::Variable_value_iterator it =
s.variable_values_begin();
for (
size_t i = 0;
i < storage_size;
i++) {
result.set(i, to_double(*it));
it++;
}
std::cout <<
"objective function:" << to_double(
s.objective_value()) << std::endl;
for (
size_t i = 0;
i < storage_size;
i++) {
}
delete P_it;
delete G_it;
delete bounded;
}
#endif
int main(
int argc,
char** argv) {
size_t d = 2;
gridConfig.
type_ = gridType;
DataMatrix trainSamples(1000, d);
createSamples(trainSamples, 1234567);
size_t storage_size =
grid->getStorage().getSize();
DataVector result(storage_size);
#ifdef USE_CGAL
std::cout << "Best alpha:" << result.toString() << std::endl;
calc_residual(*
grid, trainSamples,
lambda, result, residual);
std::cout <<
"residual:" <<
residual.l2Norm() << std::endl;
double al[17] = {18.90769281, -9.09911171, -9.0176581, 0.10785147, -1.18044529, -0.28708884,
0.15533845, -9.38380473, -9.00915268, -0.02802101, -2.24950203, -1.58041974,
-0.09580067, 5.12791209, 4.54942521, 4.66378412, 4.32550775};
DataVector cmp_alpha(al, 17);
std::cout <<
"compare residual:" <<
residual.l2Norm() << std::endl;
std::cout << "Non positive best_alpha:" << std::endl;
std::cout << "Non positive cmp_alpha:" << std::endl;
#endif
return 0;
}
base::DataVector & lambda
Definition AugmentedLagrangian.cpp:79
A class to store two-dimensional data.
Definition DataMatrix.hpp:28
A class to store one-dimensional data.
Definition DataVector.hpp:25
void set(size_t i, double value)
Sets the element at index i to value.
Definition DataVector.cpp:180
abstract base class for all types grids used in sgpp the class gives pure virtual function definition...
Definition Grid.hpp:191
static Grid * createGrid(RegularGridConfiguration gridConfig)
creates a grid defined by the grid configuration
Definition Grid.cpp:212
This Class represents one Gridpoint.
Definition HashGridPoint.hpp:34
Generic hash table based storage of grid points.
Definition HashGridStorage.hpp:42
Operation that evaluates the current sparse grid function defined by the coefficient vector alpha at ...
Definition OperationEval.hpp:23
Abstract definition of a matrix operator interface.
Definition OperationMatrix.hpp:22
Interface for multiplication with Matrices and .
Definition OperationMultipleEval.hpp:27
Class that implements the virtual class OperationMatrix for the application of classification for the...
Definition DensitySystemMatrix.hpp:23
int main()
Definition densityMultiplication.cpp:22
uint32_t level
Definition multHPX.cpp:26
std::unique_ptr< sgpp::base::Grid > grid(nullptr)
sgpp::base::DataVector alpha
Definition multHPX.cpp:40
tmp
Definition analyse_erg.py:46
float b
Definition chess.py:25
str s
Definition create_scripts.py:30
int samples
Definition parabolasimple.py:16
i
Definition statsfileInfo.py:101
C
Definition pca_normalize_dataset.py:133
gridStorage
Definition sg_projections.py:62
int j
Definition statsfile2gnuplot.py:87
HashGridStorage GridStorage
Main typedef for GridStorage.
Definition GridStorage.hpp:28
HashGridPoint GridPoint
Main typedef for GridPoint.
Definition GridStorage.hpp:23
GridType
enum to address different gridtypes in a standardized way
Definition Grid.hpp:26
base::OperationMultipleEval * createOperationMultipleEval(base::Grid &grid, base::DataMatrix &dataset)
Factory method, returning an OperationMultipleEval for the grid at hand.
Definition BaseOpFactory.cpp:595
base::OperationMatrix * createOperationLTwoDotExplicit(base::Grid &grid)
Factory method, returning an OperationLTwoDotExplicit (OperationMatrix) for the grid at hand.
Definition PdeOpFactory.cpp:200
base::OperationMatrix * createOperationLaplaceExplicit(base::Grid &grid)
Factory method, returning an OperationLaplaceExplicit (OperationMatrix) for the grid at hand.
Definition PdeOpFactory.cpp:133
base::OperationMatrix * createOperationLTwoDotProduct(base::Grid &grid)
Factory method, returning an OperationLTwoDotProduct (OperationMatrix) for the grid at hand.
Definition PdeOpFactory.cpp:159
base::OperationEval * createOperationEval(base::Grid &grid)
Factory method, returning an OperationEval for the grid at hand.
Definition BaseOpFactory.cpp:561
base::OperationMatrix * createOperationLaplace(base::Grid &grid)
Factory method, returning an OperationLaplace (OperationMatrix) for the grid at hand.
Definition PdeOpFactory.cpp:79
int level_
number of levels
Definition Grid.hpp:92
size_t maxDegree_
max. polynomial degree for poly basis
Definition Grid.hpp:97
size_t dim_
number of dimensions
Definition Grid.hpp:90
sgpp::base::GridType type_
Grid Type, see enum.
Definition Grid.hpp:88
structure that can be used by applications to cluster regular grid information
Definition Grid.hpp:111