powerit
C++ implementation for power iterations
Loading...
Searching...
No Matches
core.hpp
Go to the documentation of this file.
1#ifndef POWERIT_CORE_HPP
2#define POWERIT_CORE_HPP
3
4#include <vector>
5#include <cmath>
6#include <algorithm>
7#include "aarand/aarand.hpp"
8
15namespace powerit {
16
20struct Options {
25 int iterations = 500;
26
32 double tolerance = 0.000001;
33
40 int num_threads = 1;
41};
42
46template<typename Data_>
47Data_ normalize(int ndim, Data_* x) {
48 Data_ ss = 0;
49 for (int d = 0; d < ndim; ++d) {
50 ss += x[d] * x[d];
51 }
52
53 if (ss) {
54 ss = std::sqrt(ss);
55 for (int d = 0; d < ndim; ++d) {
56 x[d] /= ss;
57 }
58 }
59 return ss;
60}
69template<typename Data_>
70struct Result {
74 Data_ value;
75
81};
82
92template<typename Data_, class Engine_>
93void fill_starting_vector(size_t order, Data_* vector, Engine_& engine) {
94 while (1) {
95 for (size_t d = 1; d < order; d += 2) {
96 auto sampled = aarand::standard_normal<Data_>(engine);
97 vector[d - 1] = sampled.first;
98 vector[d] = sampled.second;
99 }
100 if (order % 2) {
101 vector[order - 1] = aarand::standard_normal<Data_>(engine).first;
102 }
103 if (normalize(order, vector)) {
104 break;
105 }
106 }
107}
108
130template<class Multiply_, typename Data_>
131Result<Data_> compute_core(size_t order, Multiply_ multiply, Data_* vector, const Options& opt) {
132 Result<Data_> stats;
133 auto& l2 = stats.value;
134 stats.iterations = -1;
135 std::vector<Data_> buffer(order);
136
137 for (int i = 0; i < opt.iterations; ++i) {
138 multiply(buffer, vector);
139 l2 = normalize(order, buffer.data());
140
141 // Assuming convergence if the vector did not change much from the last iteration.
142 Data_ err = 0;
143 for (size_t d = 0; d < order; ++d) {
144 Data_ diff = buffer[d] - vector[d];
145 err += diff * diff;
146 }
147 if (std::sqrt(err) < opt.tolerance) {
148 stats.iterations = i + 1;
149 break;
150 }
151
152 std::copy(buffer.begin(), buffer.end(), vector);
153 }
154
155 return stats;
156}
157
158}
159
160#endif
Namespace for power iterations.
Definition core.hpp:15
Result< Data_ > compute_core(size_t order, Multiply_ multiply, Data_ *vector, const Options &opt)
Definition core.hpp:131
void fill_starting_vector(size_t order, Data_ *vector, Engine_ &engine)
Definition core.hpp:93
Options for compute().
Definition core.hpp:20
double tolerance
Definition core.hpp:32
int num_threads
Definition core.hpp:40
int iterations
Definition core.hpp:25
Result of compute().
Definition core.hpp:70
Data_ value
Definition core.hpp:74
int iterations
Definition core.hpp:80