-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathwalker.cpp
More file actions
42 lines (37 loc) · 1.49 KB
/
walker.cpp
File metadata and controls
42 lines (37 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "walker.h"
#include <unsupported/Eigen/KroneckerProduct>
#include <unsupported/Eigen/MatrixFunctions>
Walker::Walker(const decltype(state) & initState, const Eigen::Matrix2d & coin) {
isQuantum = (coin == hadamardCoin());
state = initState;
const auto length = state.rows()/2;
auto outcomesMatrix = Eigen::kroneckerProduct(Eigen::MatrixXd::Identity(length, length), coin);
walkMatrix = permutationMatrix() * outcomesMatrix;
}
decltype(Walker::state) Walker::step(const std::size_t n) {
state = walkMatrix.pow(n) * state;
return state;
}
Eigen::PermutationMatrix<Eigen::Dynamic> Walker::permutationMatrix() const {
Eigen::VectorXi permutation(state.rows());
for (int idx = 0; idx < state.rows() - 1; idx+=2) {
permutation[idx]= (idx - 2)%(state.rows());
permutation[idx+1] = (idx+1 + 2)%(state.rows());
}
permutation[0] = state.rows() - 2;
Eigen::PermutationMatrix<Eigen::Dynamic> permMatrix(permutation);
return permMatrix;
}
Eigen::VectorXd Walker::getProbabilities() const {
Eigen::VectorXd probabilities(state.rows()/2);
if (isQuantum) {
for (std::size_t idx = 0; idx < probabilities.rows(); ++idx) {
probabilities[idx] = std::abs(std::pow(state[idx*2], 2)) + std::abs(std::pow(state[idx*2 + 1], 2));
}
} else {
for (std::size_t idx = 0; idx < probabilities.rows(); ++idx) {
probabilities[idx] = std::abs(state[idx*2] + state[idx*2 + 1]);
}
}
return probabilities;
}