-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBasisBase.h
More file actions
92 lines (78 loc) · 2.59 KB
/
BasisBase.h
File metadata and controls
92 lines (78 loc) · 2.59 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#ifndef BASISBASE_H
#define BASISBASE_H
#include <string>
#include <vector>
#include "rhrand.h"
class LRL_Cell;
class C3;
class S6;
class D7;
class D13;
class B4;
class G6;
class S6;
class VecN;
template<typename T>
T CreateUnitOrthogonalVector(const T& t) {
RHrand ran;
// assume t is not null and rand is not parallel to t
const T base = t / t.norm();
T temp;
for (size_t i = 0; i < 6; ++i) temp[i] = ran.urand() - 0.5;
temp /= temp.norm();
const double d = dot(VecN(base.GetVector()), VecN(temp.GetVector()));
const T ortho = temp - d * base;
return ortho / ortho.norm();
}
template<typename T1, typename T2>
double dot(const T1& t1, const T2& t2) {
const T1 t1x(t2);
const size_t n1 = t1.size();
const size_t n2 = t2.size();
if (n1 != n2) return -19199;
double sum = 0.0;
for (size_t i = 0; i < n1; ++i)
sum += t1[i] * t1x[i];
return sum;
}
template<typename T, typename TELEMENT=double>
class BasisBase {
public:
BasisBase() {}
virtual ~BasisBase(void) {}
virtual T& operator= (const std::string& s) = 0;
virtual T& operator= (const D7& v) = 0;
virtual T& operator= (const S6& v) = 0;
virtual T& operator= (const B4& v) = 0;
virtual T& operator= (const LRL_Cell& v) = 0;
virtual T& operator= (const G6& v) = 0;
virtual T& operator= (const C3& v) = 0;
//virtual T& operator= (const D13& v) = 0;
virtual T& operator/= (const double d) = 0;
virtual T& operator*= (const double d) = 0;
virtual T operator+ (const T& v) const = 0;
virtual T operator- (const T& v) const = 0;
virtual T operator* (const double d) const = 0;
virtual T operator/ (const double d) const = 0;
virtual T operator- (void) const = 0; // unary
virtual T& operator+= (const T& v) = 0;
virtual T& operator-= (const T& v) = 0;
virtual bool operator== (const T& v) const = 0;
virtual bool operator!= (const T& v) const = 0;
virtual TELEMENT operator[](const size_t n) const = 0;
virtual TELEMENT& operator[](const size_t n) = 0;
//virtual double DistanceBetween(const T& v1, const T& v2) = 0; // this needs to be a friend
virtual size_t size(void) const = 0;
virtual double norm() const = 0;
virtual double norm(const T& t) const = 0;
virtual double Norm() const = 0;
virtual double Norm(const T& t) const = 0;
virtual std::vector<TELEMENT> GetVector(void) const = 0;
virtual void SetVector(const std::vector<TELEMENT>& v) = 0;
virtual void SetValid(const bool b) = 0;
virtual TELEMENT at(const size_t n) const {
return (*this)[n];
}
virtual TELEMENT* data(void) const = 0;
};
#endif // BASISBASE_H