Mercurial > hg > kwantix
annotate include/interpolator.hpp @ 6:188facdd5a60
Still buggy. Need a better way to precompute RBFs.
author | Jordi Guitérrez Hermoso <jordigh@gmail.com> |
---|---|
date | Sun, 29 Jun 2008 05:00:15 -0500 |
parents | 9d4fda54a41d |
children | d0076d9b2ef1 |
rev | line source |
---|---|
0 | 1 #ifndef __INTERPOLATOR_H__ |
2 #define __INTERPOLATOR_H__ | |
3 | |
4 #include <vector> | |
5 #include <map> | |
6 #include <boost/shared_ptr.hpp> | |
7 #include "bvp.hpp" | |
8 #include "linalg.hpp" | |
9 #include "func.hpp" | |
10 #include "diff_op.hpp" | |
11 | |
12 namespace bvp{ | |
13 using std::map; | |
14 using boost::shared_ptr; | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
15 |
0 | 16 template<typename RBF> |
17 class interpolator : public realfunc{ | |
18 public: | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
19 |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
20 /** @name Constructors |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
21 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
22 * Constructors that take interpolation data perform the |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
23 * interpolation as part of the initialisation, which includes |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
24 * factoring a matrix |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
25 */ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
26 //@{ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
27 ///Does not initialise the interpolator. |
0 | 28 interpolator(); |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
29 |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
30 ///Interpolate given a BVP |
0 | 31 interpolator(shared_ptr<linear_BVP2> bvp); |
32 | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
33 ///Interpolate given some data points and the value at those points |
0 | 34 interpolator(const map<point, double>& Xi); |
35 | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
36 /** \short Interpolate given a domain, data points and the value |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
37 * at those points |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
38 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
39 * Must provide domain information. The values of Xi must match |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
40 * points on the given domain Omega. |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
41 */ |
0 | 42 interpolator(shared_ptr<domain> Omega, const map<point, double>& Xi); |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
43 //@} |
0 | 44 |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
45 /** @name Interpolation |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
46 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
47 * Interpolate again either given new data or a different BVP. |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
48 */ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
49 //@{ |
0 | 50 void interpolate(const map<point, double>& Xi); |
51 void interpolate(shared_ptr<linear_BVP2> bvp); | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
52 //@} |
0 | 53 |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
54 /** @name Evaluations and derivatives |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
55 */ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
56 //@{ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
57 ///Evaluation |
0 | 58 double operator()(const point& p) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
59 ///Evaluation |
0 | 60 double at(const point& p) const; |
61 | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
62 /// First derivative |
0 | 63 double d(const point& p, size_t k) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
64 /// Second derivatives |
0 | 65 double d2(const point &p, size_t k1, size_t k2) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
66 //@} |
0 | 67 |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
68 /** @name Partial redefinitions |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
69 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
70 * These functions allow for partial redefinition of the BVP as |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
71 * equired for the additive Schwartz domain decomposition method, |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
72 * a nd for other methods. They do not factor a matrix again. |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
73 */ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
74 //@{ |
0 | 75 void set_f(const realfunc &f); |
76 void set_g(const realfunc &g); | |
77 void set_f(const map<point, double>& f); | |
78 void set_g(const map<point, double>& g); | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
79 //@} |
0 | 80 |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
81 /** @name Linear arithmetic operators |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
82 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
83 * These functions return a new interpolator. They are pointwise |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
84 * linear operations. |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
85 */ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
86 //@{ |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
87 /// Needs two operators on the same domain. |
0 | 88 interpolator<RBF> operator+(const interpolator<RBF>& u) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
89 /// Needs two operators on the same domain. |
0 | 90 interpolator<RBF> operator-(const interpolator<RBF>& u) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
91 /// Returns a scaled interpolator. |
0 | 92 interpolator<RBF> operator*(double a) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
93 /// Returns a scaled interpolator. |
0 | 94 interpolator<RBF> operator/(double a) const; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
95 //@} |
0 | 96 |
6
188facdd5a60
Still buggy. Need a better way to precompute RBFs.
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
4
diff
changeset
|
97 //debug |
188facdd5a60
Still buggy. Need a better way to precompute RBFs.
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
4
diff
changeset
|
98 mutable map<std::vector<size_t>, matrix> precomp_rbfs; |
0 | 99 private: |
100 //Once the matrix is defined, this function inverts it. | |
101 void computecoeffs(); | |
102 | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
103 //Perform the actual interpolation. |
0 | 104 void init(shared_ptr<linear_BVP2> bvp); |
105 | |
106 shared_ptr<linear_BVP2> thebvp; | |
107 | |
108 //Number of interior points. | |
109 size_t n; | |
110 //Number of boundary points. | |
111 size_t m; | |
112 | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
113 //The matrix to invert. |
0 | 114 matrix M; |
115 | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
116 //Is the interpolator ready for use? |
0 | 117 bool initted; |
118 void not_initted(int line, string file) const; //Exception thrower | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
119 |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
120 //Coefficients of the RBFs |
0 | 121 linalg::vector coeffs; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
122 //The RBFS |
0 | 123 std::vector<RBF> rbfs; |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
124 //Their hash |
0 | 125 size_t rbfs_hash; |
126 | |
127 size_t hash_value(const std::vector<RBF>& rbfs_in); | |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
128 |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
129 /** \short Precomputed RBFs |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
130 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
131 * For all points on the domain, this stores all the RBFs |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
132 * evaluated at those points, as well as the derivatives on where |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
133 * the RBFs have been evaluated. This is to speed up successive |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
134 * evaluations of the interpolator when the interpolator's domain |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
135 * doesn't change. |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
136 * |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
137 * The keys in this vector are vectors that represent the |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
138 * multindex for the derivative, where missing trailing entries in |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
139 * the vector represents zeros. Thus, an empty vector represents |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
140 * evaluation instead of derivatives. |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
141 */ |
6
188facdd5a60
Still buggy. Need a better way to precompute RBFs.
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
4
diff
changeset
|
142 |
4
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
143 |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
144 /// Precomputed values using precomp_rbfs |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
145 mutable map<std::vector<size_t>, map<point, double> > precomp_values; |
9d4fda54a41d
Buggy, must check why interpolator assignment destroys precomputed
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents:
0
diff
changeset
|
146 map<point, double> precompute_values(const matrix& phis) const; |
0 | 147 }; |
148 | |
149 //For comfortable syntax | |
150 template <typename RBF> | |
151 interpolator<RBF> operator*(double a, const interpolator<RBF>& u) | |
152 { | |
153 return u*a; | |
154 } | |
155 } | |
156 | |
157 #endif |