17#include "../_definitions/definitions.h"
18#if defined(USE_OPENMP) && (USE_OPENMP == 1)
25#include "../_random_generator/random_array_generator.h"
28#include "../_utilities/timer.h"
194template <
typename DataType>
197 DataType* parameters,
201 const DataType exponent,
205 const DataType lanczos_tol,
208 const DataType error_atol,
209 const DataType error_rtol,
210 const DataType confidence_level,
211 const DataType outlier_significance_level,
220 double& alg_wall_time)
226 #if defined(USE_OPENMP) && (USE_OPENMP == 1)
235 IndexType random_vectors_size = matrix_size * num_threads;
236 DataType* random_vectors =
new DataType[random_vectors_size];
251 unsigned int chunk_size =
static_cast<int>(
252 std::sqrt(
static_cast<DataType
>(max_num_samples) / \
253 static_cast<DataType
>(num_threads)));
265 #if defined(USE_OPENMP) && (USE_OPENMP == 1)
266 #pragma omp parallel for \
267 schedule(dynamic, chunk_size) \
268 if (max_num_samples >= num_threads)
270 for (i=0; i < max_num_samples; ++i)
272 if (!
static_cast<bool>(all_converged))
275 #if defined(USE_OPENMP) && (USE_OPENMP == 1)
283 A, parameters, num_inquiries, matrix_function, gram,
284 exponent, orthogonalize, lanczos_degree, lanczos_tol,
285 random_number_generator,
286 &random_vectors[matrix_size*thread_id], converged,
290 #if defined(USE_OPENMP) && (USE_OPENMP == 1)
295 processed_samples_indices[num_processed_samples] = i;
296 ++num_processed_samples;
302 samples, min_num_samples, num_inquiries,
303 processed_samples_indices, num_processed_samples,
304 confidence_level, error_atol, error_rtol, error,
305 num_samples_used, converged);
312 alg_wall_time = timer.
elapsed();
316 confidence_level, outlier_significance_level, num_inquiries,
317 max_num_samples, num_samples_used, processed_samples_indices,
318 samples, num_outliers, trace, error);
321 delete[] random_vectors;
323 return all_converged;
427template <
typename DataType>
430 DataType* parameters,
434 const DataType exponent,
437 const DataType lanczos_tol,
439 DataType* random_vector,
441 DataType* trace_estimate)
452 random_number_generator, random_vector, matrix_size, num_threads);
455 DataType* alpha =
new DataType[lanczos_degree];
456 DataType* beta =
new DataType[lanczos_degree];
460 DataType* eigenvectors = NULL;
461 DataType* left_singularvectors = NULL;
462 DataType* right_singularvectors_transposed = NULL;
465 IndexType required_num_inquiries = num_inquiries;
473 required_num_inquiries = 1;
479 DataType** theta =
new DataType*[num_inquiries];
480 for (j=0; j < num_inquiries; ++j)
482 theta[j] =
new DataType[lanczos_degree];
485 for (i=0; i < lanczos_degree; ++i)
492 DataType** tau =
new DataType*[num_inquiries];
493 for (j=0; j < num_inquiries; ++j)
495 tau[j] =
new DataType[lanczos_degree];
498 for (i=0; i < lanczos_degree; ++i)
514 for (j=0; j < required_num_inquiries; ++j)
520 if ((converged[j] == 1) && (required_num_inquiries == num_inquiries))
532 A, random_vector, matrix_size, lanczos_degree, lanczos_tol,
533 orthogonalize, alpha, beta);
536 left_singularvectors = \
537 new DataType[lanczos_size[j] * lanczos_size[j]];
538 right_singularvectors_transposed = \
539 new DataType[lanczos_size[j] * lanczos_size[j]];
543 alpha, beta, left_singularvectors,
544 right_singularvectors_transposed, lanczos_size[j]);
547 for (i=0; i < lanczos_size[j]; ++i)
549 theta[j][i] = alpha[i] * alpha[i];
550 tau[j][i] = right_singularvectors_transposed[i];
557 A, random_vector, matrix_size, lanczos_degree, lanczos_tol,
558 orthogonalize, alpha, beta);
561 eigenvectors =
new DataType[lanczos_size[j] * lanczos_size[j]];
565 alpha, beta, eigenvectors, lanczos_size[j]);
568 for (i=0; i < lanczos_size[j]; ++i)
570 theta[j][i] = alpha[i];
571 tau[j][i] = eigenvectors[i * lanczos_size[j]];
588 for (j=0; j < num_inquiries; ++j)
594 for (j=1; j < num_inquiries; ++j)
597 lanczos_size[j] = lanczos_size[0];
599 for (i=0; i < lanczos_size[j]; ++i)
605 ¶meters[j*num_parameters]);
608 tau[j][i] = tau[0][i];
614 DataType quadrature_sum;
615 for (j=0; j < num_inquiries; ++j)
618 if (converged[j] == 1)
624 quadrature_sum = 0.0;
631 for (i=0; i < lanczos_size[j]; ++i)
633 quadrature_sum += tau[j][i] * tau[j][i] * \
634 matrix_function->
function(std::pow(theta[j][i], exponent));
637 trace_estimate[j] = \
638 static_cast<DataType>(matrix_size) * quadrature_sum;
644 delete[] lanczos_size;
646 for (j=0; j < required_num_inquiries; ++j)
652 for (j=0; j < required_num_inquiries; ++j)
658 if (eigenvectors != NULL)
660 delete[] eigenvectors;
663 if (left_singularvectors != NULL)
665 delete[] left_singularvectors;
668 if (right_singularvectors_transposed != NULL)
670 delete[] right_singularvectors_transposed;
IndexType c_golub_kahn_bidiagonalization(cLinearOperator< DataType > *A, const DataType *v, const LongIndexType n, const IndexType m, const DataType lanczos_tol, const FlagType orthogonalize, DataType *alpha, DataType *beta)
Bi-diagonalizes the positive-definite matrix A using Golub-Kahn-Lanczos method.
IndexType c_lanczos_tridiagonalization(cLinearOperator< DataType > *A, const DataType *v, const LongIndexType n, const IndexType m, const DataType lanczos_tol, const FlagType orthogonalize, DataType *alpha, DataType *beta)
Tri-diagonalizes matrix A to T using the start vector v. is the Lanczos degree, which will be the siz...
static int eigh_tridiagonal(DataType *diagonals, DataType *subdiagonals, DataType *eigenvectors, IndexType matrix_size)
Computes all eigenvalues and eigenvectors of a real and symmetric tridiagonal matrix.
static int svd_bidiagonal(DataType *diagonals, DataType *subdiagonals, DataType *U, DataType *Vt, IndexType matrix_size)
Computes all singular-values and left and right eigenvectors of a real and symmetric upper bi-diagona...
virtual float function(const float lambda_) const =0
static void generate_random_array(RandomNumberGenerator &random_number_generator, DataType *array, const LongIndexType array_size, const IndexType num_threads)
Generates a pseudo-random array with Rademacher distribution where elements are either +1 or -1.
Generates 64-bit integers on multiple parallel threads.
Records elasped wall time between two events.
void start()
Starts the timer.
void stop()
Stops the timer.
double elapsed() const
Returns the elapsed time in seconds.
IndexType get_num_parameters() const
Returns the number of parameters of the linear operator.
LongIndexType get_num_rows() const
Returns the number of rows of the matrix.
FlagType is_eigenvalue_relation_known() const
Returns a flag that determines whether a relation between the parameters of the operator and its eige...
Base class for linear operators. This class serves as interface for all derived classes.
virtual DataType get_eigenvalue(const DataType *known_parameters, const DataType known_eigenvalue, const DataType *inquiry_parameters) const =0
void set_parameters(DataType *parameters_)
Sets the scalar parameter this->parameters. Parameter is initialized to NULL. However,...
A static class to compute the trace of implicit matrix functions using stochastic Lanczos quadrature ...
static void _c_stochastic_lanczos_quadrature(cLinearOperator< DataType > *A, DataType *parameters, const IndexType num_inquiries, const Function *matrix_function, const FlagType gram, const DataType exponent, const FlagType orthogonalize, const IndexType lanczos_degree, const DataType lanczos_tol, RandomNumberGenerator &random_number_generator, DataType *random_vector, FlagType *converged, DataType *trace_estimate)
For a given random input vector, computes one Monte-Carlo sample to estimate trace using Lanczos quad...
static FlagType c_trace_estimator(cLinearOperator< DataType > *A, DataType *parameters, const IndexType num_inquiries, const Function *matrix_function, const FlagType gram, const DataType exponent, const FlagType orthogonalize, const int64_t seed, const IndexType lanczos_degree, const DataType lanczos_tol, const IndexType min_num_samples, const IndexType max_num_samples, const DataType error_atol, const DataType error_rtol, const DataType confidence_level, const DataType outlier_significance_level, const IndexType num_threads, DataType *trace, DataType *error, DataType **samples, IndexType *processed_samples_indices, IndexType *num_samples_used, IndexType *num_outliers, FlagType *converged, double &alg_wall_time)
Stochastic Lanczos quadrature method to estimate trace of a function of a linear operator....
void omp_set_num_threads(int num_threads)