Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# helpful link:
#https://stackoverflow.com/questions/27644586/how-to-set-up-travis-ci-with-multiple-languages


matrix:
include:

- language: cpp
compiler: gcc
# "dist" specifies the operating system ("bionic"=ubuntu18.04)
dist: bionic
# OPTIONAL
#install:
# - sudo apt-get install -qq cppcheck
# - git clone https://github.com/kward/shunit2 shunit2
script:
- g++ -std=c++14 -I./include ./src/lambda_lanczos_test/lambda_lanczos_test.cpp -o lambda_lanczos_test
# OPTIONAL (not sure what this does...)
#- cppcheck --quiet --error-exitcode=1
- ./lambda_lanczos_test
- cd ../


- language: cpp
compiler: clang
# "dist" specifies the operating system ("bionic"=ubuntu18.04)
dist: bionic
# OPTIONAL
#install:
# - sudo apt-get install -qq cppcheck
script:
- clang++ -std=c++14 -I./include ./src/lambda_lanczos_test/lambda_lanczos_test.cpp -o lambda_lanczos_test
# OPTIONAL (not sure what this does...)
#- cppcheck --quiet --error-exitcode=1
- ./lambda_lanczos_test
- cd ../

8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# Lambda Lanczos
[![Build Status](https://travis-ci.org/mrcdr/lambda-lanczos.svg?branch=master)](https://travis-ci.org/mrcdr/lambda-lanczos.svg?branch=master)
[![License](https://img.shields.io/badge/License-MIT-green.svg)]()
[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/mrcdr/lambda-lanczos)]()


Lambda Lanczos
===========

C++ adaptive and header-only Lanczos algorithm library

Expand Down
68 changes: 66 additions & 2 deletions include/lambda_lanczos/lambda_lanczos.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,10 @@ struct VectorRandomInitializer<complex<T>> {
template <typename T>
class LambdaLanczos {
public:
LambdaLanczos();
LambdaLanczos(std::function<void(const vector<T>&, vector<T>&)> mv_mul, int matrix_size, bool find_maximum);
LambdaLanczos(std::function<void(const vector<T>&, vector<T>&)> mv_mul, int matrix_size) : LambdaLanczos(mv_mul, matrix_size, false) {}

int matrix_size;
int max_iteration;
real_t<T> eps = minimum_effective_decimal<real_t<T>>() * 1e3;
Expand All @@ -60,9 +61,16 @@ class LambdaLanczos {

std::function<void(const vector<T>&, vector<T>&)> mv_mul;
std::function<void(vector<T>&)> init_vector = VectorRandomInitializer<T>::init;

int run(real_t<T>&, vector<T>&) const;

int SetSize(int matrix_size);
void SetInitVec(std::function<void(vector<T>&)> init_vector);
void SetMul(std::function<void(const vector<T>&, vector<T>&)> mv_mul);
void SetFindMax(bool find_maximum);
void SetEvalOffset(T offset);
void SetEpsilon(T epsilon);
void SetTriEpsRatio(T tri_eps_ratio);

private:
static void schmidt_orth(vector<T>&, const vector<vector<T>>&);
real_t<T> find_minimum_eigenvalue(const vector<real_t<T>>&,
Expand All @@ -81,6 +89,14 @@ class LambdaLanczos {

/* Implementation */

template <typename T>
inline LambdaLanczos<T>::LambdaLanczos() {
this->matrix_size = 0;
this->max_iteration = 0;
this->find_maximum = 0;
}


template <typename T>
inline LambdaLanczos<T>::LambdaLanczos(std::function<void(const vector<T>&, vector<T>&)> mv_mul,
int matrix_size, bool find_maximum) {
Expand All @@ -93,6 +109,7 @@ inline LambdaLanczos<T>::LambdaLanczos(std::function<void(const vector<T>&, vect

template <typename T>
inline int LambdaLanczos<T>::run(real_t<T>& eigvalue, vector<T>& eigvec) const {
assert(matrix_size > 0);
assert(0 < this->tridiag_eps_ratio && this->tridiag_eps_ratio < 1);

vector<vector<T>> u; // Lanczos vectors
Expand Down Expand Up @@ -340,6 +357,53 @@ inline int LambdaLanczos<T>::num_of_eigs_smaller_than(real_t<T> c,
}


template <typename T>
inline int LambdaLanczos<T>::SetSize(int matrix_size)
{
this->matrix_size = matrix_size;
this->max_iteration = matrix_size;
return matrix_size;
}

template <typename T>
inline void LambdaLanczos<T>::SetMul(std::function<void(const vector<T>&, vector<T>&)> mv_mul)
{
this->mv_mul = mv_mul;
}

template <typename T>
inline void LambdaLanczos<T>::SetInitVec(std::function<void(vector<T>&)> init_vector)
{
this->init_vector = init_vector;
}

template <typename T>
inline void LambdaLanczos<T>::SetFindMax(bool find_maximum) {
this->find_maximum = find_maximum;
}

template <typename T>
inline void LambdaLanczos<T>::SetEvalOffset(T offset)
{
this->eigenvalue_offset = offset;
}

template <typename T>
inline void LambdaLanczos<T>::SetEpsilon(T epsilon)
{
this->eps = epsilon;
}

template <typename T>
inline void LambdaLanczos<T>::SetTriEpsRatio(T tri_eps_ratio)
{
this->tridiag_eps_ratio = tri_eps_ratio;
}





template <typename T>
inline void VectorRandomInitializer<T>::init(vector<T>& v) {
std::random_device dev;
Expand Down
26 changes: 26 additions & 0 deletions src/lambda_lanczos_test/lambda_lanczos_test.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cassert>
#include <lambda_lanczos/lambda_lanczos.hpp>

using std::cout;
Expand All @@ -14,6 +15,11 @@ using vector = std::vector<T>;
template<typename T>
using complex = std::complex<T>;

template<typename T>
inline static bool Similar(T a, T b, T eps=1.0e-06) {
return std::abs(a - b) < std::abs(eps);
}

void sig_digit_test() {
cout << endl << "-- Significant decimal digit test --" << endl;
cout << "float " << lambda_lanczos_util::sig_decimal_digit<float>() << " "
Expand Down Expand Up @@ -88,8 +94,14 @@ void test1() {
cout << eigvec[i] << " ";
}
cout << endl;

assert(Similar(eigvalue, 4.0));
assert(Similar(std::abs(eigvec[0]), 0.57735026919));
assert(Similar(std::abs(eigvec[1]), 0.57735026919));
assert(Similar(std::abs(eigvec[2]), 0.57735026919));
}


void test2() {
cout << endl << "-- Diagonalization test (real symmetric, large) --" << endl;

Expand Down Expand Up @@ -125,9 +137,13 @@ void test2() {
vector<double> eigvec(n);
int itern = engine.run(eigvalue, eigvec);

assert(Similar(eigvalue, -2.0, 0.002));

cout << "Iteration count: " << itern << endl;
cout << "Eigen value: " << setprecision(16) << eigvalue << endl;
cout << "Eigen vector:" << endl;


for(int i = 0;i < n;i++) {
cout << eigvec[i] << endl;
}
Expand Down Expand Up @@ -172,6 +188,14 @@ void test3() {
cout << eigvec[i] << " ";
}
cout << endl;

assert(Similar(eigvalue, 4.0));
assert(Similar(eigvec[0].real(), 0.0));
assert(Similar(eigvec[1].real(), 0.0));
assert(Similar(eigvec[2].real(), 0.0));
assert(Similar(std::abs(eigvec[0].imag()), 0.57735026919));
assert(Similar(std::abs(eigvec[1].imag()), 0.57735026919));
assert(Similar(std::abs(eigvec[2].imag()), 0.57735026919));
}

void test4() {
Expand Down Expand Up @@ -205,6 +229,8 @@ void test4() {
cout << eigvec[i] << " ";
}
cout << endl;

assert(Similar(eigvalue, -2.0));
}

int main() {
Expand Down