diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/Ensemble_8hpp.html b/Ensemble_8hpp.html new file mode 100644 index 00000000..727fe797 --- /dev/null +++ b/Ensemble_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble.hpp.

+
+
+ + + + diff --git a/Ensemble_8hpp_source.html b/Ensemble_8hpp_source.html new file mode 100644 index 00000000..59520d8b --- /dev/null +++ b/Ensemble_8hpp_source.html @@ -0,0 +1,279 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_HPP
+
8#define GOOSEEYE_ENSEMBLE_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
+
14inline Ensemble::Ensemble(const std::vector<size_t>& roi, bool periodic, bool variance)
+
15 : m_periodic(periodic), m_variance(variance), m_shape_orig(roi)
+
16{
+
17 GOOSEEYE_ASSERT(m_shape_orig.size() <= MAX_DIM, std::out_of_range);
+
18
+
19 m_first = xt::atleast_3d(xt::zeros<double>(m_shape_orig));
+
20 m_second = zeros_like(m_first);
+
21 m_norm = zeros_like(m_first);
+
22 m_shape = std::vector<size_t>(m_first.shape().begin(), m_first.shape().end());
+
23 m_pad = detail::pad_width(m_shape);
+
24}
+
+
25
+
+ +
27{
+
28 array_type::array<double> ret = m_first / xt::where(m_norm <= 0, 1.0, m_norm);
+
29
+
30 if (m_stat == Type::heightheight) {
+
31 ret = xt::pow(ret, 0.5);
+
32 }
+
33
+
34 return ret.reshape(m_shape_orig);
+
35}
+
+
36
+
+ +
38{
+
39 array_type::tensor<double, 3> norm = xt::where(m_norm <= 0, 1.0, m_norm);
+ +
41 (m_second / norm - xt::pow(m_first / norm, 2.0)) * norm / (norm - 1);
+
42
+
43 if (m_stat == Type::heightheight) {
+
44 ret = xt::pow(ret, 0.5);
+
45 }
+
46 else if (m_stat != Type::mean) {
+
47 throw std::runtime_error("Not implemented");
+
48 }
+
49
+
50 return ret.reshape(m_shape_orig);
+
51}
+
+
52
+
+ +
54{
+
55 array_type::array<double> ret = m_first;
+
56 return ret.reshape(m_shape_orig);
+
57}
+
+
58
+
+ +
60{
+
61 array_type::array<double> ret = m_second;
+
62 return ret.reshape(m_shape_orig);
+
63}
+
+
64
+
+ +
66{
+
67 array_type::array<double> ret = m_norm;
+
68 return ret.reshape(m_shape_orig);
+
69}
+
+
70
+
+ +
72{
+
73 GOOSEEYE_ASSERT(axis < m_shape_orig.size(), std::out_of_range);
+
74 axis = detail::atleast_3d_axis(m_shape_orig.size(), axis);
+
75
+
76 array_type::tensor<double, 3> dist = xt::empty<double>(m_shape);
+
77
+
78 array_type::array<double> D = xt::linspace<double>(
+
79 -1.0 * static_cast<double>(m_pad[axis][0]),
+
80 static_cast<double>(m_pad[axis][1]),
+
81 m_shape[axis]);
+
82
+
83 for (size_t h = 0; h < m_shape[0]; ++h) {
+
84 for (size_t i = 0; i < m_shape[1]; ++i) {
+
85 for (size_t j = 0; j < m_shape[2]; ++j) {
+
86 if (axis == 0) {
+
87 dist(h, i, j) = D(h);
+
88 }
+
89 else if (axis == 1) {
+
90 dist(h, i, j) = D(i);
+
91 }
+
92 else if (axis == 2) {
+
93 dist(h, i, j) = D(j);
+
94 }
+
95 }
+
96 }
+
97 }
+
98
+
99 array_type::array<double> ret = std::move(dist);
+
100 return ret.reshape(m_shape_orig);
+
101}
+
+
102
+
+ +
104{
+
105 array_type::array<double> ret = xt::zeros<double>(m_shape_orig);
+
106
+
107 for (size_t i = 0; i < m_shape_orig.size(); ++i) {
+
108 ret += xt::pow(this->distance(i), 2.0);
+
109 }
+
110
+
111 return xt::pow(ret, 0.5);
+
112}
+
+
113
+
+
114inline array_type::array<double> Ensemble::distance(const std::vector<double>& h) const
+
115{
+
116 GOOSEEYE_ASSERT(m_shape_orig.size() == h.size(), std::out_of_range);
+
117
+
118 array_type::array<double> ret = xt::zeros<double>(m_shape_orig);
+
119
+
120 for (size_t i = 0; i < m_shape_orig.size(); ++i) {
+
121 ret += xt::pow(this->distance(i) * h[i], 2.0);
+
122 }
+
123
+
124 return xt::pow(ret, 0.5);
+
125}
+
+
126
+
+
127inline array_type::array<double> Ensemble::distance(const std::vector<double>& h, size_t axis) const
+
128{
+
129 GOOSEEYE_ASSERT(m_shape_orig.size() == h.size(), std::out_of_range);
+
130 return this->distance(axis) * h[axis];
+
131}
+
+
132
+
133} // namespace GooseEYE
+
134
+
135#endif
+ +
array_type::array< double > data_second() const
Get raw-data: ensemble sum of the second moment: x_1^2 + x_2^2 + ...
Definition Ensemble.hpp:59
+
Ensemble()=default
Constructor.
+
array_type::array< double > variance() const
Get ensemble variance.
Definition Ensemble.hpp:37
+
array_type::array< double > data_first() const
Get raw-data: ensemble sum of the first moment: x_1 + x_2 + ...
Definition Ensemble.hpp:53
+
array_type::array< double > distance() const
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition Ensemble.hpp:103
+
array_type::array< double > result() const
Get ensemble average.
Definition Ensemble.hpp:26
+
array_type::array< double > norm() const
Get raw-data: normalisation (number of measurements per pixel).
Definition Ensemble.hpp:65
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/Ensemble__C2_8hpp.html b/Ensemble__C2_8hpp.html new file mode 100644 index 00000000..acb2bfd0 --- /dev/null +++ b/Ensemble__C2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_C2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_C2.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_C2.hpp.

+
+
+ + + + diff --git a/Ensemble__C2_8hpp_source.html b/Ensemble__C2_8hpp_source.html new file mode 100644 index 00000000..f36ed36d --- /dev/null +++ b/Ensemble__C2_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_C2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_C2.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_C2_HPP
+
8#define GOOSEEYE_ENSEMBLE_C2_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class T, class M>
+
+
15inline void Ensemble::C2(const T& f, const T& g, const M& fmask, const M& gmask)
+
16{
+
17 using value_type = typename T::value_type;
+
18 using mask_type = typename M::value_type;
+
19
+
20 static_assert(std::is_integral<value_type>::value, "Integral image required.");
+
21 static_assert(std::is_integral<mask_type>::value, "Integral mask required.");
+
22
+
23 GOOSEEYE_ASSERT(xt::has_shape(f, g.shape()), std::out_of_range);
+
24 GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range);
+
25 GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape()), std::out_of_range);
+
26 GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range);
+
27 GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range);
+
28 GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1)), std::out_of_range);
+
29 GOOSEEYE_ASSERT(m_stat == Type::C2 || m_stat == Type::Unset, std::out_of_range);
+
30
+
31 // lock statistic
+
32 m_stat = Type::C2;
+
33
+
34 // not periodic (default): mask padded items
+
35 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
36 int mask_value = 1;
+
37
+
38 // periodic: unmask padded items
+
39 if (m_periodic) {
+
40 pad_mode = xt::pad_mode::periodic;
+
41 mask_value = 0;
+
42 }
+
43
+
44 // apply padding
+
45 array_type::tensor<value_type, 3> F = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
46 array_type::tensor<value_type, 3> G = xt::pad(xt::atleast_3d(g), m_pad, pad_mode);
+ +
48 xt::pad(xt::atleast_3d(fmask), m_pad, xt::pad_mode::constant, mask_value);
+ +
50 xt::pad(xt::atleast_3d(gmask), m_pad, xt::pad_mode::constant, mask_value);
+
51
+
52 // compute correlation
+
53 for (size_t h = m_pad[0][0]; h < F.shape(0) - m_pad[0][1]; ++h) {
+
54 for (size_t i = m_pad[1][0]; i < F.shape(1) - m_pad[1][1]; ++i) {
+
55 for (size_t j = m_pad[2][0]; j < F.shape(2) - m_pad[2][1]; ++j) {
+
56 // - skip masked
+
57 if (Fmask(h, i, j)) {
+
58 continue;
+
59 }
+
60 // - get comparison sub-matrix
+
61 auto Gi = xt::view(
+
62 G,
+
63 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
64 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
65 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
66 // - get inverse of comparison mask
+
67 auto Gmii = 1.0 - xt::view(
+
68 Gmask,
+
69 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
70 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
71 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
72 // - correlation (account for mask)
+
73 if (F(h, i, j) != 0) {
+
74 m_first += xt::where(xt::equal(F(h, i, j), Gi), Gmii, 0.0);
+
75 }
+
76 // - normalisation
+
77 m_norm += Gmii;
+
78 }
+
79 }
+
80 }
+
81}
+
+
82
+
83template <class T>
+
+
84inline void Ensemble::C2(const T& f, const T& g)
+
85{
+
86 array_type::array<int> mask = xt::zeros<int>(f.shape());
+
87 C2(f, g, mask, mask);
+
88}
+
+
89
+
90} // namespace GooseEYE
+
91
+
92#endif
+ +
void C2(const T &f, const T &g)
Add realization to 2-point cluster function: P(f(i) == g(i + di)).
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/Ensemble__L_8hpp.html b/Ensemble__L_8hpp.html new file mode 100644 index 00000000..16877fca --- /dev/null +++ b/Ensemble__L_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_L.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_L.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_L.hpp.

+
+
+ + + + diff --git a/Ensemble__L_8hpp_source.html b/Ensemble__L_8hpp_source.html new file mode 100644 index 00000000..c8ab5634 --- /dev/null +++ b/Ensemble__L_8hpp_source.html @@ -0,0 +1,216 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_L.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_L.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_L_HPP
+
8#define GOOSEEYE_ENSEMBLE_L_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class T>
+
+
15inline void Ensemble::L(const T& f, path_mode mode)
+
16{
+
17 using value_type = typename T::value_type;
+
18
+
19 static_assert(std::is_integral<value_type>::value, "Integral image required.");
+
20
+
21 GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range);
+
22 GOOSEEYE_ASSERT(m_stat == Type::L || m_stat == Type::Unset, std::out_of_range);
+
23
+
24 // lock statistics
+
25 m_stat = Type::L;
+
26
+
27 // not periodic (default): mask padded items
+
28 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
29
+
30 // periodic: unmask padded items
+
31 if (m_periodic) {
+
32 pad_mode = xt::pad_mode::periodic;
+
33 }
+
34
+
35 // apply padding & convert to quasi-3d
+
36 array_type::tensor<value_type, 3> F = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
37
+
38 // ROI-shaped array used to extract a pixel stamp:
+
39 // a set of end-points over which to loop and check the statics
+
40 // - initialize to 1
+
41 array_type::tensor<int, 3> r = xt::ones<int>(m_shape);
+
42 // - determine interior pixels (account for quasi-3D images)
+
43 auto ix = m_shape[0] > 1 ? xt::range(1, m_shape[0] - 1) : xt::range(0, m_shape[0]);
+
44 auto iy = m_shape[1] > 1 ? xt::range(1, m_shape[1] - 1) : xt::range(0, m_shape[1]);
+
45 auto iz = m_shape[2] > 1 ? xt::range(1, m_shape[2] - 1) : xt::range(0, m_shape[2]);
+
46 // - set interior pixels to 0
+
47 xt::view(r, ix, iy, iz) = 0;
+
48
+
49 // get stamp, from the matrix "r"
+
50 array_type::tensor<int, 2> stamp = xt::from_indices(xt::argwhere(r));
+
51 for (size_t i = 0; i < MAX_DIM; ++i) {
+
52 xt::view(stamp, xt::all(), xt::keep(i)) -= m_pad[i][0];
+
53 }
+
54
+
55 // correlation
+
56 // N.B. getting the pixel paths is relatively expensive, so it is the output-most loop
+
57 for (size_t istamp = 0; istamp < stamp.shape(0); ++istamp) {
+
58
+
59 // pixel path between the center of the ROI and the current stamp point
+ +
61 GooseEYE::path({0, 0, 0}, {stamp(istamp, 0), stamp(istamp, 1), stamp(istamp, 2)}, mode);
+
62
+
63 // compute correlation along this path, for the entire image
+
64 for (size_t h = m_pad[0][0]; h < F.shape(0) - m_pad[0][1]; ++h) {
+
65 for (size_t i = m_pad[1][0]; i < F.shape(1) - m_pad[1][1]; ++i) {
+
66 for (size_t j = m_pad[2][0]; j < F.shape(2) - m_pad[2][1]; ++j) {
+
67 for (size_t p = 0; p < path.shape(0); ++p) {
+
68 // - get current relative position
+
69 int dh = path(p, 0);
+
70 int di = path(p, 1);
+
71 int dj = path(p, 2);
+
72 // - check to terminal walking along this path
+
73 if (!F(h + dh, i + di, j + dj)) {
+
74 break;
+
75 }
+
76 // - update the result
+
77 m_first(m_pad[0][0] + dh, m_pad[1][0] + di, m_pad[2][0] + dj) += 1.0;
+
78 }
+
79 }
+
80 }
+
81 }
+
82
+
83 // normalisation
+
84 for (size_t p = 0; p < path.shape(0); ++p) {
+
85 int dh = path(p, 0);
+
86 int di = path(p, 1);
+
87 int dj = path(p, 2);
+
88 m_norm(m_pad[0][0] + dh, m_pad[1][0] + di, m_pad[2][0] + dj) += f.size();
+
89 }
+
90 }
+
91}
+
+
92
+
93} // namespace GooseEYE
+
94
+
95#endif
+ +
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
path_mode
Different methods to compute a pixel-path.
Definition GooseEYE.h:69
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
+
+ + + + diff --git a/Ensemble__S2_8hpp.html b/Ensemble__S2_8hpp.html new file mode 100644 index 00000000..7efb7db8 --- /dev/null +++ b/Ensemble__S2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_S2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_S2.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_S2.hpp.

+
+
+ + + + diff --git a/Ensemble__S2_8hpp_source.html b/Ensemble__S2_8hpp_source.html new file mode 100644 index 00000000..32497ee7 --- /dev/null +++ b/Ensemble__S2_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_S2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_S2.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_S2_HPP
+
8#define GOOSEEYE_ENSEMBLE_S2_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class T, class M>
+
+
15inline void Ensemble::S2(const T& f, const T& g, const M& fmask, const M& gmask)
+
16{
+
17 using value_type = typename T::value_type;
+
18 using mask_type = typename M::value_type;
+
19
+
20 static_assert(std::is_integral<mask_type>::value, "Integral mask required.");
+
21
+
22 GOOSEEYE_ASSERT(xt::has_shape(f, g.shape()), std::out_of_range);
+
23 GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range);
+
24 GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape()), std::out_of_range);
+
25 GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range);
+
26 GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range);
+
27 GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1)), std::out_of_range);
+
28 GOOSEEYE_ASSERT(m_stat == Type::S2 || m_stat == Type::Unset, std::out_of_range);
+
29
+
30 // lock statistic
+
31 m_stat = Type::S2;
+
32
+
33 // not periodic (default): mask padded items
+
34 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
35 int mask_value = 1;
+
36
+
37 // periodic: unmask padded items
+
38 if (m_periodic) {
+
39 pad_mode = xt::pad_mode::periodic;
+
40 mask_value = 0;
+
41 }
+
42
+
43 // apply padding
+
44 array_type::tensor<value_type, 3> F = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
45 array_type::tensor<double, 3> Fd = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
46 array_type::tensor<double, 3> G = xt::pad(xt::atleast_3d(g), m_pad, pad_mode);
+ +
48 xt::pad(xt::atleast_3d(fmask), m_pad, xt::pad_mode::constant, mask_value);
+ +
50 xt::pad(xt::atleast_3d(gmask), m_pad, xt::pad_mode::constant, mask_value);
+
51
+
52 // compute correlation
+
53 for (size_t h = m_pad[0][0]; h < F.shape(0) - m_pad[0][1]; ++h) {
+
54 for (size_t i = m_pad[1][0]; i < F.shape(1) - m_pad[1][1]; ++i) {
+
55 for (size_t j = m_pad[2][0]; j < F.shape(2) - m_pad[2][1]; ++j) {
+
56 // - skip masked
+
57 if (Fmask(h, i, j)) {
+
58 continue;
+
59 }
+
60 // - get comparison sub-matrix
+
61 auto Gi = xt::view(
+
62 G,
+
63 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
64 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
65 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
66 // - get inverse of comparison mask
+
67 auto Gmii = 1.0 - xt::view(
+
68 Gmask,
+
69 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
70 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
71 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
72 // - correlation (account for mask)
+
73 if (F(h, i, j) != 0) {
+
74 m_first += Fd(h, i, j) * Gi * Gmii;
+
75 }
+
76 // - normalisation
+
77 m_norm += Gmii;
+
78 }
+
79 }
+
80 }
+
81}
+
+
82
+
83template <class T>
+
+
84inline void Ensemble::S2(const T& f, const T& g)
+
85{
+
86 array_type::array<int> mask = xt::zeros<int>(f.shape());
+
87 S2(f, g, mask, mask);
+
88}
+
+
89
+
90} // namespace GooseEYE
+
91
+
92#endif
+ +
void S2(const T &f, const T &g)
Add realization to 2-point correlation: P(f(i) * g(i + di)).
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/Ensemble__W2_8hpp.html b/Ensemble__W2_8hpp.html new file mode 100644 index 00000000..20de29c5 --- /dev/null +++ b/Ensemble__W2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_W2.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_W2.hpp.

+
+
+ + + + diff --git a/Ensemble__W2_8hpp_source.html b/Ensemble__W2_8hpp_source.html new file mode 100644 index 00000000..72821ad7 --- /dev/null +++ b/Ensemble__W2_8hpp_source.html @@ -0,0 +1,206 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_W2.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_W2_HPP
+
8#define GOOSEEYE_ENSEMBLE_W2_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class T, class M>
+
+
15inline void Ensemble::W2(const T& f, const T& g, const M& gmask)
+
16{
+
17 using value_type = typename T::value_type;
+
18 using mask_type = typename M::value_type;
+
19
+
20 static_assert(std::is_integral<mask_type>::value, "Integral mask required.");
+
21
+
22 GOOSEEYE_ASSERT(xt::has_shape(f, g.shape()), std::out_of_range);
+
23 GOOSEEYE_ASSERT(xt::has_shape(f, gmask.shape()), std::out_of_range);
+
24 GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range);
+
25 GOOSEEYE_ASSERT(xt::all(xt::equal(gmask, 0) || xt::equal(gmask, 1)), std::out_of_range);
+
26 GOOSEEYE_ASSERT(m_stat == Type::W2 || m_stat == Type::Unset, std::out_of_range);
+
27
+
28 // lock statistic
+
29 m_stat = Type::W2;
+
30
+
31 // not periodic (default): mask padded items
+
32 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
33 int mask_value = 1;
+
34
+
35 // periodic: unmask padded items
+
36 if (m_periodic) {
+
37 pad_mode = xt::pad_mode::periodic;
+
38 mask_value = 0;
+
39 }
+
40
+
41 // apply padding
+
42 array_type::tensor<value_type, 3> F = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
43 array_type::tensor<double, 3> Fd = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
44 array_type::tensor<double, 3> G = xt::pad(xt::atleast_3d(g), m_pad, pad_mode);
+ +
46 xt::pad(xt::atleast_3d(gmask), m_pad, xt::pad_mode::constant, mask_value);
+
47
+
48 // compute correlation
+
49 for (size_t h = m_pad[0][0]; h < F.shape(0) - m_pad[0][1]; ++h) {
+
50 for (size_t i = m_pad[1][0]; i < F.shape(1) - m_pad[1][1]; ++i) {
+
51 for (size_t j = m_pad[2][0]; j < F.shape(2) - m_pad[2][1]; ++j) {
+
52 // - get comparison sub-matrix
+
53 auto Gi = xt::view(
+
54 G,
+
55 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
56 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
57 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
58 // - get inverse of comparison mask
+
59 auto Gmii = 1.0 - xt::view(
+
60 Gmask,
+
61 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
62 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
63 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
64 // - correlation (account for mask)
+
65 if (F(h, i, j) != 0) {
+
66 m_first += Fd(h, i, j) * Gi * Gmii;
+
67 }
+
68 // - normalisation
+
69 m_norm += F(h, i, j) * Gmii;
+
70 }
+
71 }
+
72 }
+
73}
+
+
74
+
75template <class T>
+
+
76inline void Ensemble::W2(const T& f, const T& g)
+
77{
+
78 array_type::array<int> mask = xt::zeros<int>(f.shape());
+
79 W2(f, g, mask);
+
80}
+
+
81
+
82} // namespace GooseEYE
+
83
+
84#endif
+ +
void W2(const T &w, const T &f)
Add realization to weighted 2-point correlation.
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/Ensemble__W2c_8hpp.html b/Ensemble__W2c_8hpp.html new file mode 100644 index 00000000..fd2127c2 --- /dev/null +++ b/Ensemble__W2c_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2c.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_W2c.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_W2c.hpp.

+
+
+ + + + diff --git a/Ensemble__W2c_8hpp_source.html b/Ensemble__W2c_8hpp_source.html new file mode 100644 index 00000000..f176222f --- /dev/null +++ b/Ensemble__W2c_8hpp_source.html @@ -0,0 +1,257 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2c.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_W2c.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_W2C_HPP
+
8#define GOOSEEYE_ENSEMBLE_W2C_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class C, class T, class M>
+
15inline void
+
+
16Ensemble::W2c(const C& clusters, const C& centers, const T& f, const M& fmask, path_mode mode)
+
17{
+
18 using value_type = typename T::value_type;
+
19 using mask_type = typename M::value_type;
+
20 using cluster_type = typename C::value_type;
+
21
+
22 static_assert(std::is_integral<cluster_type>::value, "Integral clusters required.");
+
23 static_assert(std::is_integral<mask_type>::value, "Integral mask required.");
+
24
+
25 GOOSEEYE_ASSERT(f.shape() == clusters.shape(), std::out_of_range);
+
26 GOOSEEYE_ASSERT(f.shape() == centers.shape(), std::out_of_range);
+
27 GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range);
+
28 GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range);
+
29 GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range);
+
30 GOOSEEYE_ASSERT(m_stat == Type::W2c || m_stat == Type::Unset, std::out_of_range);
+
31
+
32 // lock statistic
+
33 m_stat = Type::W2c;
+
34
+
35 // not periodic (default): mask padded items
+
36 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
37
+
38 // periodic: unmask padded items
+
39 if (m_periodic) {
+
40 pad_mode = xt::pad_mode::periodic;
+
41 }
+
42
+
43 // apply padding
+
44 array_type::tensor<value_type, 3> F = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
45 array_type::tensor<double, 3> Fd = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+
46 array_type::tensor<mask_type, 3> Fmask = xt::pad(xt::atleast_3d(fmask), m_pad, pad_mode);
+ +
48 xt::pad(xt::atleast_3d(clusters), m_pad, pad_mode);
+
49 array_type::tensor<cluster_type, 3> Centers = xt::pad(xt::atleast_3d(centers), m_pad, pad_mode);
+
50
+
51 // ROI-shaped array used to extract a pixel stamp:
+
52 // a set of end-points over which to loop and check the statics
+
53 // - initialize to 1
+
54 array_type::tensor<int, 3> r = xt::ones<int>(m_shape);
+
55 // - determine interior pixels (account for quasi-3D images)
+
56 auto ix = m_shape[0] > 1 ? xt::range(1, m_shape[0] - 1) : xt::range(0, m_shape[0]);
+
57 auto iy = m_shape[1] > 1 ? xt::range(1, m_shape[1] - 1) : xt::range(0, m_shape[1]);
+
58 auto iz = m_shape[2] > 1 ? xt::range(1, m_shape[2] - 1) : xt::range(0, m_shape[2]);
+
59 // - set interior pixels to 0
+
60 xt::view(r, ix, iy, iz) = 0;
+
61
+
62 // get stamp, from the matrix "r"
+
63 array_type::tensor<int, 2> stamp = xt::from_indices(xt::argwhere(r));
+
64 for (size_t i = 0; i < MAX_DIM; ++i) {
+
65 xt::view(stamp, xt::all(), xt::keep(i)) -= m_pad[i][0];
+
66 }
+
67
+
68 // correlation
+
69 // N.B. getting the pixel paths is relatively expensive, so it is the output-most loop
+
70 for (size_t istamp = 0; istamp < stamp.shape(0); ++istamp) {
+
71
+
72 // pixel path between the center of the ROI and the current stamp point
+ +
74 GooseEYE::path({0, 0, 0}, {stamp(istamp, 0), stamp(istamp, 1), stamp(istamp, 2)}, mode);
+
75
+
76 for (size_t h = m_pad[0][0]; h < F.shape(0) - m_pad[0][1]; ++h) {
+
77 for (size_t i = m_pad[1][0]; i < F.shape(1) - m_pad[1][1]; ++i) {
+
78 for (size_t j = m_pad[2][0]; j < F.shape(2) - m_pad[2][1]; ++j) {
+
79
+
80 auto label = Centers(h, i, j);
+
81 int q = -1;
+
82
+
83 // proceed only when the centre is inside the cluster
+
84 if (!label || Clusters(h, i, j) != label) {
+
85 continue;
+
86 }
+
87
+
88 for (size_t p = 0; p < path.shape(0); ++p) {
+
89
+
90 int dh = path(p, 0);
+
91 int di = path(p, 1);
+
92 int dj = path(p, 2);
+
93
+
94 // loop through the voxel-path until the end of a cluster
+
95 if (Clusters(h + dh, i + di, j + dj) != label && q < 0) {
+
96 q = 0;
+
97 }
+
98
+
99 // loop from the beginning of the path and store there
+
100 if (q >= 0) {
+
101 if (!Fmask(h + dh, i + di, j + dj)) {
+
102 m_norm(
+
103 m_pad[0][0] + path(q, 0),
+
104 m_pad[1][0] + path(q, 1),
+
105 m_pad[1][0] + path(q, 2)) += 1;
+
106
+
107 m_first(
+
108 m_pad[0][0] + path(q, 0),
+
109 m_pad[1][0] + path(q, 1),
+
110 m_pad[1][0] + path(q, 2)) += Fd(h + dh, i + di, j + dj);
+
111 }
+
112 }
+
113
+
114 q++;
+
115 }
+
116 }
+
117 }
+
118 }
+
119 }
+
120}
+
+
121
+
122template <class C, class T>
+
+
123inline void Ensemble::W2c(const C& clusters, const C& centers, const T& f, path_mode mode)
+
124{
+
125 array_type::array<int> mask = xt::zeros<int>(f.shape());
+
126 W2c(clusters, centers, f, mask, mode);
+
127}
+
+
128
+
129} // namespace GooseEYE
+
130
+
131#endif
+ +
Compute clusters and obtain certain characteristic about them.
Definition GooseEYE.h:770
+
void W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)
Add realization to collapsed weighted 2-point correlation.
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
path_mode
Different methods to compute a pixel-path.
Definition GooseEYE.h:69
+
array_type::array< int > clusters(const T &f, bool periodic=true)
Compute clusters.
Definition GooseEYE.h:1107
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
+
+ + + + diff --git a/Ensemble__heightheight_8hpp.html b/Ensemble__heightheight_8hpp.html new file mode 100644 index 00000000..56043ffd --- /dev/null +++ b/Ensemble__heightheight_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_heightheight.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_heightheight.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_heightheight.hpp.

+
+
+ + + + diff --git a/Ensemble__heightheight_8hpp_source.html b/Ensemble__heightheight_8hpp_source.html new file mode 100644 index 00000000..385f231b --- /dev/null +++ b/Ensemble__heightheight_8hpp_source.html @@ -0,0 +1,210 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_heightheight.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_heightheight.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_HEIGHTHEIGHT_HPP
+
8#define GOOSEEYE_ENSEMBLE_HEIGHTHEIGHT_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class T, class M>
+
+
15inline void Ensemble::heightheight(const T& f, const M& fmask)
+
16{
+
17 using mask_type = typename M::value_type;
+
18
+
19 static_assert(std::is_integral<mask_type>::value, "Integral mask required.");
+
20
+
21 GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range);
+
22 GOOSEEYE_ASSERT(f.dimension() == m_shape_orig.size(), std::out_of_range);
+
23 GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range);
+
24 GOOSEEYE_ASSERT(m_stat == Type::heightheight || m_stat == Type::Unset, std::out_of_range);
+
25
+
26 // lock statistic
+
27 m_stat = Type::heightheight;
+
28
+
29 // not periodic (default): mask padded items
+
30 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
31 int mask_value = 1;
+
32
+
33 // periodic: unmask padded items
+
34 if (m_periodic) {
+
35 pad_mode = xt::pad_mode::periodic;
+
36 mask_value = 0;
+
37 }
+
38
+
39 // apply padding
+
40 array_type::tensor<double, 3> F = xt::pad(xt::atleast_3d(f), m_pad, pad_mode);
+ +
42 xt::pad(xt::atleast_3d(fmask), m_pad, xt::pad_mode::constant, mask_value);
+ +
44 xt::pad(xt::atleast_3d(fmask), m_pad, xt::pad_mode::constant, mask_value);
+
45
+
46 // compute correlation
+
47 for (size_t h = m_pad[0][0]; h < F.shape(0) - m_pad[0][1]; ++h) {
+
48 for (size_t i = m_pad[1][0]; i < F.shape(1) - m_pad[1][1]; ++i) {
+
49 for (size_t j = m_pad[2][0]; j < F.shape(2) - m_pad[2][1]; ++j) {
+
50 // - skip masked
+
51 if (Fmask(h, i, j)) {
+
52 continue;
+
53 }
+
54 // - get comparison sub-matrix
+
55 auto Fi = xt::view(
+
56 F,
+
57 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
58 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
59 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
60 // - get inverse of comparison mask
+
61 auto Fmii = 1.0 - xt::view(
+
62 Fmaskd,
+
63 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
64 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
65 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
66 // - update sum of the m_first moment
+
67 m_first += xt::pow(Fi - F(h, i, j), 2.0) * Fmii;
+
68 // - update sum of the m_second moment
+
69 if (m_variance) {
+
70 m_second += xt::pow(Fi - F(h, i, j), 4.0) * Fmii;
+
71 }
+
72 // - normalisation
+
73 m_norm += Fmii;
+
74 }
+
75 }
+
76 }
+
77}
+
+
78
+
79template <class T>
+
+
80inline void Ensemble::heightheight(const T& f)
+
81{
+
82 array_type::array<int> mask = xt::zeros<int>(f.shape());
+
83 heightheight(f, mask);
+
84}
+
+
85
+
86} // namespace GooseEYE
+
87
+
88#endif
+ +
void heightheight(const T &f)
Add realization to height-height correlation.
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/Ensemble__mean_8hpp.html b/Ensemble__mean_8hpp.html new file mode 100644 index 00000000..a6a34b3e --- /dev/null +++ b/Ensemble__mean_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_mean.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_mean.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file Ensemble_mean.hpp.

+
+
+ + + + diff --git a/Ensemble__mean_8hpp_source.html b/Ensemble__mean_8hpp_source.html new file mode 100644 index 00000000..8db9c92b --- /dev/null +++ b/Ensemble__mean_8hpp_source.html @@ -0,0 +1,169 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_mean.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Ensemble_mean.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_ENSEMBLE_MEAN_HPP
+
8#define GOOSEEYE_ENSEMBLE_MEAN_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+
14template <class T>
+
+
15void Ensemble::mean(const T& f)
+
16{
+
17 GOOSEEYE_ASSERT(m_shape == std::vector<size_t>(MAX_DIM, 1), std::out_of_range);
+
18 GOOSEEYE_ASSERT(m_stat == Type::mean || m_stat == Type::Unset, std::out_of_range);
+
19
+
20 m_stat = Type::mean;
+
21
+
22 m_first(0) += static_cast<double>(xt::sum(f)[0]);
+
23 m_second(0) += static_cast<double>(xt::sum(xt::pow(f, 2.0))[0]);
+
24 m_norm(0) += static_cast<double>(f.size());
+
25}
+
+
26
+
27template <class T, class M>
+
+
28void Ensemble::mean(const T& f, const M& fmask)
+
29{
+
30 static_assert(std::is_integral<typename M::value_type>::value, "Integral mask required.");
+
31
+
32 GOOSEEYE_ASSERT(xt::has_shape(f, fmask.shape()), std::out_of_range);
+
33 GOOSEEYE_ASSERT(xt::all(xt::equal(fmask, 0) || xt::equal(fmask, 1)), std::out_of_range);
+
34 GOOSEEYE_ASSERT(m_shape == std::vector<size_t>(MAX_DIM, 1), std::out_of_range);
+
35 GOOSEEYE_ASSERT(m_stat == Type::mean || m_stat == Type::Unset, std::out_of_range);
+
36
+
37 m_stat = Type::mean;
+
38
+
39 m_first(0) += static_cast<double>(xt::sum(xt::where(xt::equal(fmask, 0), f, 0.0))[0]);
+
40
+
41 m_second(0) +=
+
42 static_cast<double>(xt::sum(xt::where(xt::equal(fmask, 0), xt::pow(f, 2.0), 0.0))[0]);
+
43
+
44 m_norm(0) += static_cast<double>(xt::sum(1 - fmask)[0]);
+
45}
+
+
46
+
47} // namespace GooseEYE
+
48
+
49#endif
+ +
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/GooseEYE_8h.html b/GooseEYE_8h.html new file mode 100644 index 00000000..083815b5 --- /dev/null +++ b/GooseEYE_8h.html @@ -0,0 +1,290 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE.h File Reference
+
+
+
#include "config.h"
+#include "detail.hpp"
+#include "version.h"
+#include <prrng.h>
+#include "Ensemble.hpp"
+#include "Ensemble_C2.hpp"
+#include "Ensemble_L.hpp"
+#include "Ensemble_S2.hpp"
+#include "Ensemble_W2.hpp"
+#include "Ensemble_W2c.hpp"
+#include "Ensemble_heightheight.hpp"
+#include "Ensemble_mean.hpp"
+#include "GooseEYE.hpp"
+#include "dilate.hpp"
+#include "kernel.hpp"
+
+

Go to the source code of this file.

+ + + + + + + + + + + +

+Classes

class  GooseEYE::ClusterLabeller< Dimension, Periodicity >
 (Incrementally) Label clusters (0 as background, 1..n as labels). More...
 
class  GooseEYE::Clusters
 Compute clusters and obtain certain characteristic about them. More...
 
class  GooseEYE::Ensemble
 Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data. More...
 
+ + + + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
namespace  GooseEYE::kernel
 Collect kernels.
 
+ + + + +

+Enumerations

enum class  GooseEYE::path_mode { GooseEYE::Bresenham +, GooseEYE::actual +, GooseEYE::full + }
 Different methods to compute a pixel-path. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

array_type::array< int > GooseEYE::kernel::nearest (size_t ndim)
 Return kernel with nearest neighbours.
 
array_type::tensor< int, 2 > GooseEYE::path (const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
 Compute a path between two pixels.
 
array_type::array< int > GooseEYE::dummy_circles (const std::vector< size_t > &shape, const array_type::tensor< int, 1 > &row, const array_type::tensor< int, 1 > &col, const array_type::tensor< int, 1 > &r, bool periodic=true)
 Dummy image with circles.
 
array_type::array< int > GooseEYE::dummy_circles (const std::vector< size_t > &shape, bool periodic=true, uint64_t seed=0)
 Dummy image with circles.
 
template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
GooseEYE::dilate (const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)
 Dilate image.
 
template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
GooseEYE::dilate (const T &f, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)
 Dilate image.
 
template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
GooseEYE::dilate (const T &f, const S &kernel, size_t iterations=1, bool periodic=true)
 Dilate image.
 
template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
GooseEYE::dilate (const T &f, size_t iterations=1, bool periodic=true)
 Dilate image.
 
template<class T , class S >
array_type::tensor< size_t, 1 > GooseEYE::relabel_map (const T &a, const S &b)
 Find map to relabel from a to b.
 
template<class T >
array_type::tensor< typename T::value_type, 2 > GooseEYE::labels_map (const T &a, const T &b)
 Get a map to relabel from a to b.
 
template<class L , class A >
L GooseEYE::labels_rename (const L &labels, const A &rename)
 Rename labels.
 
template<class L , class A >
L GooseEYE::labels_reorder (const L &labels, const A &order)
 Reorder labels.
 
template<class T >
array_type::tensor< typename T::value_type, 2 > GooseEYE::labels_sizes (const T &labels)
 Size per label.
 
template<class T >
array_type::array< int > GooseEYE::clusters (const T &f, bool periodic=true)
 Compute clusters.
 
template<typename T , typename U , typename V >
GooseEYE::pos2img (const T &img, const U &positions, const V &labels)
 Convert positions to an image.
 
template<class T >
array_type::tensor< double, 2 > GooseEYE::center_of_mass (const T &labels, bool periodic=true)
 Get the position of the center of each label.
 
auto GooseEYE::distance (const std::vector< size_t > &roi)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
auto GooseEYE::distance (const std::vector< size_t > &roi, size_t axis)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
auto GooseEYE::distance (const std::vector< size_t > &roi, const std::vector< double > &h)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
auto GooseEYE::distance (const std::vector< size_t > &roi, const std::vector< double > &h, size_t axis)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
template<class T >
auto GooseEYE::S2 (const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
 2-point correlation: P(f(i) * g(i + di)).
 
template<class T , class M >
auto GooseEYE::S2 (const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)
 2-point correlation: P(f(i) * g(i + di)).
 
template<class T >
auto GooseEYE::C2 (const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
 2-point cluster function: P(f(i) == g(i + di)).
 
template<class T , class M >
auto GooseEYE::C2 (const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)
 2-point cluster function: P(f(i) == g(i + di)).
 
template<class T >
auto GooseEYE::W2 (const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
 Weighted 2-point correlation.
 
template<class T , class M >
auto GooseEYE::W2 (const std::vector< size_t > &roi, const T &w, const T &f, const M &fmask, bool periodic=true)
 Weighted 2-point correlation.
 
template<class C , class T >
auto GooseEYE::W2c (const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)
 Collapsed weighted 2-point correlation.
 
template<class C , class T , class M >
auto GooseEYE::W2c (const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham, bool periodic=true)
 Collapsed weighted 2-point correlation.
 
template<class T >
auto GooseEYE::heightheight (const std::vector< size_t > &roi, const T &f, bool periodic=true)
 Height-height correlation.
 
template<class T , class M >
auto GooseEYE::heightheight (const std::vector< size_t > &roi, const T &f, const M &fmask, bool periodic=true)
 Height-height correlation.
 
template<class T >
auto GooseEYE::L (const std::vector< size_t > &roi, const T &f, bool periodic=true, path_mode mode=path_mode::Bresenham)
 Lineal-path function.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file GooseEYE.h.

+
+
+ + + + diff --git a/GooseEYE_8h.js b/GooseEYE_8h.js new file mode 100644 index 00000000..f2558a60 --- /dev/null +++ b/GooseEYE_8h.js @@ -0,0 +1,42 @@ +var GooseEYE_8h = +[ + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "GooseEYE::Clusters", "classGooseEYE_1_1Clusters.html", "classGooseEYE_1_1Clusters" ], + [ "GooseEYE::Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ], + [ "path_mode", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320", [ + [ "Bresenham", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320a20b83bc3afd59d747cc745d5f70f3695", null ], + [ "actual", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e", null ], + [ "full", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320ae9dc924f238fa6cc29465942875fe8f0", null ] + ] ], + [ "C2", "GooseEYE_8h.html#a6f8454f08a6b048290f36618cc80986b", null ], + [ "C2", "GooseEYE_8h.html#a867ce41fed448b5442ad8f6e6011b8b1", null ], + [ "center_of_mass", "GooseEYE_8h.html#a532a7f3db5f55172b92169fa5171b335", null ], + [ "clusters", "GooseEYE_8h.html#a868d564546b23e37ecf3ccd510cf17a2", null ], + [ "dilate", "GooseEYE_8h.html#ae859f712898ed7d6e76a5ecaa114614a", null ], + [ "dilate", "GooseEYE_8h.html#a43f961d31fad8b606eedee2fcd4969b5", null ], + [ "dilate", "GooseEYE_8h.html#a4976e5bbf41b58472e028babb092bd85", null ], + [ "dilate", "GooseEYE_8h.html#a6bb0149c151f7255f796ac80bc57a031", null ], + [ "distance", "GooseEYE_8h.html#adf4657193fc58978eed6ef274ebb93ed", null ], + [ "distance", "GooseEYE_8h.html#a3097c5d07c0fe21227df46b79c133a23", null ], + [ "distance", "GooseEYE_8h.html#ab97f8ace23ac36134cfaab38a19b131b", null ], + [ "distance", "GooseEYE_8h.html#a3d0010a207abd86a2811edfb32d22e21", null ], + [ "dummy_circles", "GooseEYE_8h.html#a607337e83a0a65c41ded829114a17ac6", null ], + [ "dummy_circles", "GooseEYE_8h.html#ab3570c9c90ad8e21f2ddba6dae537e3f", null ], + [ "heightheight", "GooseEYE_8h.html#ae761eb00cac0021b5840df83814abf72", null ], + [ "heightheight", "GooseEYE_8h.html#a5f658c332d5fc69e86bb44cb14930ce5", null ], + [ "L", "GooseEYE_8h.html#a43454c98d88250a5693a3696ca978cb4", null ], + [ "labels_map", "GooseEYE_8h.html#a6094d2e17d15643de7c45abd30f5ee6c", null ], + [ "labels_rename", "GooseEYE_8h.html#a9ec9f5ff4d454ff11259bd8605b6ca2a", null ], + [ "labels_reorder", "GooseEYE_8h.html#aff1767fb399e78e3eb58f1938ec9d115", null ], + [ "labels_sizes", "GooseEYE_8h.html#a574f4bf714a747297f82c835f806f314", null ], + [ "nearest", "GooseEYE_8h.html#a306dfde37d04075f3a635200b2f528ed", null ], + [ "path", "GooseEYE_8h.html#ac27cb5922686e23dbd84d313579b2add", null ], + [ "pos2img", "GooseEYE_8h.html#a9f61eb8a8f1b67fa3cad845d0f1cdcc9", null ], + [ "relabel_map", "GooseEYE_8h.html#adf6675e27a31a0210c4bc94b09e814f3", null ], + [ "S2", "GooseEYE_8h.html#ae27103f5b7d6acda6fc2e14c8dfd11b3", null ], + [ "S2", "GooseEYE_8h.html#ac01c192a6d398e2befc3aca36e953f0e", null ], + [ "W2", "GooseEYE_8h.html#aaa2055a53f179e2ddd810ebaf9eaf837", null ], + [ "W2", "GooseEYE_8h.html#ab349faaa82c253cea9d67996cb9749c7", null ], + [ "W2c", "GooseEYE_8h.html#a989df0528b84e5e0f4da84062785ee8b", null ], + [ "W2c", "GooseEYE_8h.html#a55b550567256dee0da56ac22fd2be72a", null ] +]; \ No newline at end of file diff --git a/GooseEYE_8h_source.html b/GooseEYE_8h_source.html new file mode 100644 index 00000000..b96ab91b --- /dev/null +++ b/GooseEYE_8h_source.html @@ -0,0 +1,1427 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE.h
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_H
+
8#define GOOSEEYE_H
+
9
+
10#include "config.h"
+
11#include "detail.hpp"
+
12#include "version.h"
+
13#include <prrng.h>
+
14
+
15namespace GooseEYE {
+
16
+
17namespace detail {
+
18
+
22inline std::string get_namespace()
+
23{
+
24 std::string ret = "GooseEYE";
+
25#ifdef GOOSEEYE_USE_XTENSOR_PYTHON
+
26 return ret + ".";
+
27#else
+
28 return ret + "::";
+
29#endif
+
30}
+
31
+
36template <class T>
+
37inline std::string shape_to_string(const T& shape)
+
38{
+
39 std::string ret = "[";
+
40 for (size_t i = 0; i < shape.size(); ++i) {
+
41 ret += std::to_string(shape[i]);
+
42 if (i < shape.size() - 1) {
+
43 ret += ", ";
+
44 }
+
45 }
+
46 ret += "]";
+
47 return ret;
+
48}
+
49
+
50} // namespace detail
+
51
+
+
55namespace kernel {
+
56
+
62inline array_type::array<int> nearest(size_t ndim);
+
63
+
64} // namespace kernel
+
+
65
+
+
69enum class path_mode {
+
70 Bresenham,
+
71 actual,
+
72 full
+
73};
+
+
74
+ + + + +
86
+
+ +
97 const std::vector<size_t>& shape,
+ + + +
101 bool periodic = true)
+
102{
+
103 GOOSEEYE_ASSERT(row.shape() == col.shape(), std::out_of_range);
+
104 GOOSEEYE_ASSERT(row.shape() == r.shape(), std::out_of_range);
+
105 GOOSEEYE_ASSERT(shape.size() == 2, std::out_of_range);
+
106
+
107 array_type::array<int> out = xt::zeros<int>(shape);
+
108
+
109 if (periodic) {
+
110 for (size_t i = 0; i < row.size(); ++i) {
+
111 for (int di = -r(i); di <= r(i); ++di) {
+
112 for (int dj = -r(i); dj <= r(i); ++dj) {
+
113 int dr = (int)(ceil(pow((double)(pow(di, 2) + pow(dj, 2)), 0.5)));
+
114 if (dr < r(i)) {
+
115 out.periodic(row(i) + di, col(i) + dj) = 1;
+
116 }
+
117 }
+
118 }
+
119 }
+
120
+
121 return out;
+
122 }
+
123
+
124 for (size_t i = 0; i < row.size(); ++i) {
+
125 for (int di = -r(i); di <= r(i); ++di) {
+
126 for (int dj = -r(i); dj <= r(i); ++dj) {
+
127 if (out.in_bounds(row(i) + di, col(i) + dj)) {
+
128 int dr = (int)(ceil(pow((double)(pow(di, 2) + pow(dj, 2)), 0.5)));
+
129 if (dr < r(i)) {
+
130 out(row(i) + di, col(i) + dj) = 1;
+
131 }
+
132 }
+
133 }
+
134 }
+
135 }
+
136
+
137 return out;
+
138}
+
+
139
+ +
+
148dummy_circles(const std::vector<size_t>& shape, bool periodic = true, uint64_t seed = 0)
+
149{
+
150 GOOSEEYE_ASSERT(shape.size() == 2, std::out_of_range);
+
151 prrng::pcg32 rng(seed);
+
152
+
153 // set default: number of circles in both directions and (constant) radius
+
154 size_t N = (size_t)(0.05 * (double)shape[0]);
+
155 size_t M = (size_t)(0.05 * (double)shape[1]);
+
156 size_t R = (size_t)(pow((0.3 * (double)(shape[0] * shape[1])) / (M_PI * (double)(N * M)), 0.5));
+
157
+
158 array_type::tensor<int, 1> row = xt::empty<int>({M * N});
+
159 array_type::tensor<int, 1> col = xt::empty<int>({M * N});
+
160 array_type::tensor<int, 1> r = xt::empty<int>({M * N});
+
161
+
162 // define regular grid of circles
+
163 for (size_t i = 0; i < N; i++) {
+
164 for (size_t j = 0; j < M; j++) {
+
165 row[i * M + j] = (int)((double)i * (double)shape[0] / (double)N);
+
166 col[i * M + j] = (int)((double)j * (double)shape[1] / (double)M);
+
167 r[i * M + j] = (int)R;
+
168 }
+
169 }
+
170
+
171 // distance between circles
+
172 int dN = (int)(0.5 * (double)shape[0] / (double)N);
+
173 int dM = (int)(0.5 * (double)shape[1] / (double)M);
+
174
+
175 // randomly perturb circles (move in any direction, enlarge/shrink)
+
176 for (size_t i = 0; i < N * M; i++) {
+
177 row(i) += rng.randint(2 * dN) - dN;
+
178 col(i) += rng.randint(2 * dM) - dM;
+
179 r(i) = (double)r(i) * 2.0 * rng.random();
+
180 }
+
181
+
182 // convert to image
+
183 return dummy_circles(shape, row, col, r, periodic);
+
184}
+
+
185
+
195template <
+
196 class T,
+
197 class S,
+
198 std::enable_if_t<
+
199 std::is_integral<typename T::value_type>::value &&
+
200 std::is_integral<typename S::value_type>::value,
+
201 int> = 0>
+
202inline T dilate(
+
203 const T& f,
+
204 const S& kernel,
+
205 const array_type::tensor<size_t, 1>& iterations,
+
206 bool periodic = true);
+
207
+
212template <class T, std::enable_if_t<std::is_integral<typename T::value_type>::value, int> = 0>
+
213inline T dilate(const T& f, const array_type::tensor<size_t, 1>& iterations, bool periodic = true);
+
214
+
219template <
+
220 class T,
+
221 class S,
+
222 std::enable_if_t<
+
223 std::is_integral<typename T::value_type>::value &&
+
224 std::is_integral<typename S::value_type>::value,
+
225 int> = 0>
+
226inline T dilate(const T& f, const S& kernel, size_t iterations = 1, bool periodic = true);
+
227
+
232template <class T, std::enable_if_t<std::is_integral<typename T::value_type>::value, int> = 0>
+
233inline T dilate(const T& f, size_t iterations = 1, bool periodic = true);
+
234
+
241template <class T, class S>
+
+
242[[deprecated]] array_type::tensor<size_t, 1> relabel_map(const T& a, const S& b)
+
243{
+
244 GOOSEEYE_WARNING_PYTHON("relabel_map is deprecated, use labels_map instead (new API) instead");
+
245 GOOSEEYE_ASSERT(xt::has_shape(a, b.shape()), std::out_of_range);
+
246
+
247 array_type::tensor<size_t, 1> ret = xt::zeros<size_t>({static_cast<size_t>(xt::amax(a)() + 1)});
+
248
+
249 for (size_t i = 0; i < a.size(); ++i) {
+
250 ret(a.flat(i)) = b.flat(i);
+
251 }
+
252
+
253 return ret;
+
254}
+
+
255
+
262template <class T>
+
+ +
264{
+
265 using value_type = typename T::value_type;
+
266 std::map<value_type, value_type> map;
+
267
+
268 for (size_t i = 0; i < a.size(); ++i) {
+
269 map.try_emplace(a.flat(i), b.flat(i));
+
270 }
+
271
+
272 size_t i = 0;
+ +
274 xt::empty<typename T::value_type>(std::array<size_t, 2>{map.size(), 2});
+
275
+
276 for (auto const& [key, val] : map) {
+
277 ret(i, 0) = key;
+
278 ret(i, 1) = val;
+
279 ++i;
+
280 }
+
281
+
282 return ret;
+
283}
+
+
284
+
291template <class L, class A>
+
+
292inline L labels_rename(const L& labels, const A& rename)
+
293{
+
294 GOOSEEYE_ASSERT(rename.dimension() == 2, std::out_of_range);
+
295 GOOSEEYE_ASSERT(rename.shape(1) == 2, std::out_of_range);
+
296 using value_type = typename A::value_type;
+
297 std::map<value_type, value_type> map;
+
298 for (size_t i = 0; i < rename.shape(0); ++i) {
+
299 map.emplace(rename(i, 0), rename(i, 1));
+
300 }
+
301
+
302#ifdef GOOSEEYE_ENABLE_ASSERT
+
303 auto l = xt::unique(labels);
+
304 for (size_t i = 0; i < l.size(); ++i) {
+
305 GOOSEEYE_ASSERT(map.count(l(i)) > 0, std::out_of_range);
+
306 }
+
307#endif
+
308
+
309 L ret = xt::empty_like(labels);
+
310 for (size_t i = 0; i < labels.size(); ++i) {
+
311 ret.flat(i) = map[labels.flat(i)];
+
312 }
+
313
+
314 return ret;
+
315}
+
+
316
+
323template <class L, class A>
+
+
324inline L labels_reorder(const L& labels, const A& order)
+
325{
+
326#ifdef GOOSEEYE_ENABLE_ASSERT
+
327 auto a = xt::unique(labels);
+
328 auto b = xt::unique(order);
+
329 GOOSEEYE_ASSERT(a.size() == b.size(), std::out_of_range);
+
330 GOOSEEYE_ASSERT(xt::all(xt::equal(a, b)), std::out_of_range);
+
331#endif
+
332
+
333 auto maxlab = *std::max_element(order.begin(), order.end());
+
334 std::vector<typename A::value_type> renum(maxlab + 1);
+
335
+
336 for (size_t i = 0; i < order.size(); ++i) {
+
337 renum[order[i]] = i;
+
338 }
+
339
+
340 L ret = xt::empty_like(labels);
+
341 for (size_t i = 0; i < labels.size(); ++i) {
+
342 ret.flat(i) = renum[labels.flat(i)];
+
343 }
+
344
+
345 return ret;
+
346}
+
+
347
+
353template <class T>
+
+ +
355{
+
356 using value_type = typename T::value_type;
+
357 std::map<value_type, value_type> map;
+
358
+
359 for (size_t i = 0; i < labels.size(); ++i) {
+
360 if (map.count(labels.flat(i)) == 0) {
+
361 map.emplace(labels.flat(i), 1);
+
362 }
+
363 else {
+
364 map[labels.flat(i)]++;
+
365 }
+
366 }
+
367
+
368 size_t i = 0;
+ +
370 xt::empty<value_type>(std::array<size_t, 2>{map.size(), 2});
+
371
+
372 for (auto const& [key, val] : map) {
+
373 ret(i, 0) = key;
+
374 ret(i, 1) = val;
+
375 ++i;
+
376 }
+
377
+
378 return ret;
+
379}
+
+
380
+
381namespace detail {
+
382
+
388template <size_t Dim, class T>
+
389inline array_type::tensor<ptrdiff_t, Dim> kernel_to_dx(T kernel)
+
390{
+
391#ifdef GOOSEEYE_ENABLE_ASSERT
+
392 for (size_t i = 0; i < Dim; ++i) {
+
393 GOOSEEYE_ASSERT(kernel.shape(i) % 2 == 1, std::out_of_range);
+
394 }
+
395#endif
+
396
+
397 std::array<size_t, Dim> mid;
+
398 for (size_t i = 0; i < Dim; ++i) {
+
399 mid[i] = (kernel.shape(i) - 1) / 2;
+
400 }
+
401 size_t idx = 0;
+
402 for (size_t i = 0; i < Dim; ++i) {
+
403 idx += mid[i] * kernel.strides()[i];
+
404 }
+
405 GOOSEEYE_ASSERT(kernel.flat(idx) == 1, std::out_of_range);
+
406 kernel.flat(idx) = 0;
+
407
+
408 if constexpr (Dim == 1) {
+
409 return xt::flatten_indices(xt::argwhere(kernel)) - mid[0];
+
410 }
+
411
+
412 auto ret = xt::from_indices(xt::argwhere(kernel));
+
413 for (size_t i = 0; i < Dim; ++i) {
+
414 xt::view(ret, xt::all(), i) -= mid[i];
+
415 }
+
416 return ret;
+
417}
+
418
+
419} // namespace detail
+
420
+
426template <size_t Dimension, bool Periodicity = true>
+
+ +
428public:
+
429 static constexpr size_t Dim = Dimension;
+
430 static constexpr bool Periodic = Periodicity;
+
431
+
432private:
+
433 std::array<ptrdiff_t, Dim> m_shape;
+ + +
436 ptrdiff_t m_new_label = 1;
+
437 size_t m_nmerge = 0;
+
438 std::array<ptrdiff_t, Dim> m_strides;
+
439
+
446 std::vector<ptrdiff_t> m_renum;
+
447
+
458 std::vector<ptrdiff_t> m_next;
+
459 std::vector<ptrdiff_t> m_connected;
+
460
+
461public:
+
465 template <class T>
+
+ +
467 {
+
468 if constexpr (Dim == 1) {
+
469 // kernel = {1, 1, 1}
+
470 m_dx = {-1, 1};
+
471 }
+
472 else if constexpr (Dim == 2) {
+
473 // kernel = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
+
474 m_dx = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
+
475 }
+
476 this->init(shape);
+
477 }
+
+
478
+
483 template <class T, class K>
+
+
484 ClusterLabeller(const T& shape, const K& kernel)
+
485 {
+
486 m_dx = detail::kernel_to_dx<Dim>(kernel);
+
487 this->init(shape);
+
488 }
+
+
489
+
490private:
+
491 template <class T>
+
492 void init(const T& shape)
+
493 {
+
494 static_assert(Dim == 1 || Dim == 2, "WIP: 1d and 2d supported.");
+
495 m_label = xt::empty<ptrdiff_t>(shape);
+
496 m_renum.resize(m_label.size() + 1);
+
497 m_next.resize(m_label.size() + 1);
+
498 for (size_t i = 0; i < Dim; ++i) {
+
499 m_shape[i] = static_cast<ptrdiff_t>(shape[i]);
+
500 m_strides[i] = static_cast<ptrdiff_t>(m_label.strides()[i]);
+
501 }
+
502 GOOSEEYE_ASSERT(m_strides.back() == 1, std::out_of_range);
+
503 this->reset();
+
504 m_connected.resize(m_dx.shape(0));
+
505 }
+
506
+
507public:
+
+
511 void reset()
+
512 {
+
513 std::fill(m_label.begin(), m_label.end(), 0);
+
514 std::iota(m_renum.begin(), m_renum.end(), 0);
+
515 m_new_label = 1;
+
516 this->clean_next();
+
517 }
+
+
518
+
+
523 void prune()
+
524 {
+
525 ptrdiff_t n = static_cast<ptrdiff_t>(m_new_label);
+
526 m_new_label = 1;
+
527 m_renum[0] = 0;
+
528 for (ptrdiff_t i = 1; i < n; ++i) {
+
529 if (m_renum[i] == i) {
+
530 m_renum[i] = m_new_label;
+
531 ++m_new_label;
+
532 }
+
533 }
+
534 this->private_renumber(m_renum);
+
535 std::iota(m_renum.begin(), m_renum.begin() + n, 0);
+
536 }
+
+
537
+
538private:
+
542 void clean_next()
+
543 {
+
544 std::fill(m_next.begin(), m_next.end(), -1);
+
545 }
+
546
+
551 template <class T>
+
552 void private_renumber(const T& renum)
+
553 {
+
554 for (size_t i = 0; i < m_label.size(); ++i) {
+
555 m_label.flat(i) = renum[m_label.flat(i)];
+
556 }
+
557 }
+
558
+
567 void merge_detail(ptrdiff_t a, ptrdiff_t b)
+
568 {
+
569 // -> head[list(b)] = head[a]
+
570 ptrdiff_t i = m_renum[b];
+
571 ptrdiff_t target = m_renum[a];
+
572 m_renum[b] = target;
+
573 while (true) {
+
574 i = m_next[i];
+
575 if (i == -1) {
+
576 break;
+
577 }
+
578 m_renum[i] = target;
+
579 }
+
580 // -> list(head[a]).append(list(b))
+
581 while (m_next[a] != -1) {
+
582 a = m_next[a];
+
583 }
+
584 m_next[a] = b;
+
585 }
+
586
+
594 ptrdiff_t merge(ptrdiff_t* labels, size_t nlabels)
+
595 {
+
596 std::sort(labels, labels + nlabels);
+
597 nlabels = std::unique(labels, labels + nlabels) - labels;
+
598 ptrdiff_t target = labels[0];
+
599 for (size_t i = 1; i < nlabels; ++i) {
+
600 this->merge_detail(target, labels[i]);
+
601 }
+
602 return target;
+
603 }
+
604
+
605 void apply_merge()
+
606 {
+
607 if (m_nmerge == 0) {
+
608 return;
+
609 }
+
610
+
611 this->private_renumber(m_renum);
+
612 this->clean_next();
+
613 m_nmerge = 0;
+
614 }
+
615
+
616 void label_impl(size_t idx)
+
617 {
+
618 static_assert(Dim == 1 || Dim == 2, "WIP: 1d and 2d supported.");
+
619
+
620 ptrdiff_t compare;
+
621 size_t nconnected = 0;
+
622
+
623 for (size_t j = 0; j < m_dx.shape(0); ++j) {
+
624 if constexpr (Dim == 1 && Periodic) {
+
625 compare = (m_shape[0] + idx + m_dx(j)) % m_shape[0];
+
626 }
+
627 else if constexpr (Dim == 1 && !Periodic) {
+
628 if (compare < 0 || compare >= m_shape[0]) {
+
629 continue;
+
630 }
+
631 compare = idx + m_dx(j);
+
632 }
+
633 else if constexpr (Dim == 2 && Periodic) {
+
634 ptrdiff_t ii = (m_shape[0] + (idx / m_strides[0]) + m_dx(j, 0)) % m_shape[0];
+
635 ptrdiff_t jj = (m_shape[1] + (idx % m_strides[0]) + m_dx(j, 1)) % m_shape[1];
+
636 compare = ii * m_shape[1] + jj;
+
637 }
+
638 else if constexpr (Dim == 2 && !Periodic) {
+
639 ptrdiff_t ii = (idx / m_strides[0]) + m_dx(j, 0);
+
640 ptrdiff_t jj = (idx % m_strides[0]) + m_dx(j, 1);
+
641 if (ii < 0 || ii >= m_shape[0] || jj < 0 || jj >= m_shape[1]) {
+
642 continue;
+
643 }
+
644 compare = ii * m_shape[1] + jj;
+
645 }
+
646
+
647 if (m_label.flat(compare) != 0) {
+
648 m_connected[nconnected] = m_renum[m_label.flat(compare)];
+
649 nconnected++;
+
650 }
+
651 }
+
652
+
653 if (nconnected == 0) {
+
654 m_label.flat(idx) = m_new_label;
+
655 m_new_label += 1;
+
656 return;
+
657 }
+
658
+
659 if (nconnected == 1) {
+
660 m_label.flat(idx) = m_connected[0];
+
661 return;
+
662 }
+
663
+
664 // mark all labels in the list for merging
+
665 // `m_label` is not yet updated to avoid looping over all blocks too frequently
+
666 // the new label can be read by `m_renum[lab]` (as done above)
+
667 m_label.flat(idx) = this->merge(&m_connected[0], nconnected);
+
668 m_nmerge++;
+
669 }
+
670
+
671public:
+
676 template <class T>
+
+
677 void add_image(const T& img)
+
678 {
+
679 GOOSEEYE_ASSERT(xt::has_shape(img, m_label.shape()), std::out_of_range);
+
680
+
681 for (size_t idx = 0; idx < img.size(); ++idx) {
+
682 if (img.flat(idx) == 0) {
+
683 continue;
+
684 }
+
685 if (m_label.flat(idx) != 0) {
+
686 continue;
+
687 }
+
688 this->label_impl(idx);
+
689 }
+
690 this->apply_merge();
+
691 }
+
+
692
+
698 template <class T>
+
+
699 void add_points(const T& begin, const T& end)
+
700 {
+
701#ifdef GOOSEEYE_ENABLE_ASSERT
+
702 size_t n = m_label.size();
+ +
704 !std::any_of(begin, end, [n](size_t i) { return i < 0 || i >= n; }), std::out_of_range);
+
705#endif
+
706
+
707 for (auto it = begin; it != end; ++it) {
+
708 if (m_label.flat(*it) != 0) {
+
709 continue;
+
710 }
+
711 this->label_impl(*it);
+
712 }
+
713 this->apply_merge();
+
714 }
+
+
715
+
720 template <class T>
+
+
721 void add_points(const T& idx)
+
722 {
+
723 GOOSEEYE_ASSERT(idx.dimension() == 1, std::out_of_range);
+
724 return this->add_points(idx.begin(), idx.end());
+
725 }
+
+
726
+
+
731 std::string repr() const
+
732 {
+
733 return detail::get_namespace() + "ClusterLabeller" + std::to_string(Dim) + " " +
+
734 detail::shape_to_string(m_shape);
+
735 }
+
+
736
+
+
741 const auto& shape() const
+
742 {
+
743 return m_label.shape();
+
744 }
+
+
745
+
+
750 auto size() const
+
751 {
+
752 return m_label.size();
+
753 }
+
+
754
+
755 // todo: allow resetting a cluster map ?
+
756
+
+
761 const auto& labels() const
+
762 {
+
763 return m_label;
+
764 }
+
+
765};
+
+
766
+
+
770class [[deprecated]] Clusters {
+
771public:
+
772 Clusters() = default;
+
773
+
780 template <class T>
+
+
781 Clusters(const T& f, bool periodic = true)
+
782 : Clusters(f, kernel::nearest(f.dimension()), periodic)
+
783 {
+
784 }
+
+
785
+
793 template <class T, class S>
+
+
794 Clusters(const T& f, const S& kernel, bool periodic = true) : m_periodic(periodic)
+
795 {
+
796 GOOSEEYE_WARNING_PYTHON("Clusters is deprecated, use ClusterLabeller (new API) instead "
+
797 "(please open a PR for missing functions)");
+
798
+
799 static_assert(std::is_integral<typename T::value_type>::value, "Integral labels required.");
+
800 static_assert(std::is_integral<typename S::value_type>::value, "Integral kernel required.");
+
801
+
802 GOOSEEYE_ASSERT(xt::all(xt::equal(f, 0) || xt::equal(f, 1)), std::out_of_range);
+
803 GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1)), std::out_of_range);
+
804 GOOSEEYE_ASSERT(f.dimension() == kernel.dimension(), std::out_of_range);
+
805
+
806 m_shape = detail::shape(f);
+
807 m_kernel = xt::atleast_3d(kernel);
+
808 m_pad = detail::pad_width(m_kernel);
+
809 m_l = xt::atleast_3d(f);
+
810
+
811 // note that "m_l" contains the labels, but also the image:
+
812 // 0: background, 1: unlabelled, >= 2: labels
+
813 this->compute();
+
814
+
815 // connect labels periodically
+
816 if (m_periodic) {
+
817 m_l_np = m_l;
+
818 this->compute();
+
819 }
+
820
+
821 // rename labels to lowest possible label starting from 1
+
822 array_type::tensor<int, 1> labels = xt::unique(m_l);
+
823 array_type::tensor<int, 1> renum = xt::empty<int>({m_l.size()});
+
824 xt::view(renum, xt::keep(labels)) = xt::arange<int>(static_cast<int>(labels.size()));
+
825 for (auto& i : m_l) {
+
826 i = renum(i);
+
827 }
+
828 }
+
+
829
+
+ +
835 {
+
836 return xt::adapt(m_l.data(), m_shape);
+
837 }
+
+
838
+
+ +
844 {
+
845 array_type::tensor<size_t, 2> x = xt::floor(this->center_positions(true));
+
846 array_type::array<int> c = xt::zeros<int>(m_l.shape());
+
847
+
848 for (int l = 1; l < static_cast<int>(x.shape(0)); ++l) {
+
849 c(x(l, 0), x(l, 1), x(l, 2)) = l;
+
850 }
+
851
+
852 c.reshape(m_shape);
+
853 return c;
+
854 }
+
+
855
+
+ +
861 {
+ +
863
+
864 if (m_periodic) {
+
865 x = this->average_position_periodic();
+
866 }
+
867 else {
+
868 x = this->average_position(m_l);
+
869 }
+
870
+
871 if (as3d) {
+
872 return x;
+
873 }
+
874
+
875 array_type::tensor<size_t, 1> axes = detail::atleast_3d_axes(m_shape.size());
+
876 return xt::view(x, xt::all(), xt::keep(axes));
+
877 }
+
+
878
+
+ +
884 {
+
885 GOOSEEYE_WARNING_PYTHON("Clusters.sizes() is deprecated, use labels_sizes() (new API)");
+
886 array_type::tensor<size_t, 1> ret = xt::zeros<size_t>({xt::amax(m_l)() + size_t(1)});
+
887
+
888 for (size_t h = 0; h < m_l.shape(0); ++h) {
+
889 for (size_t i = 0; i < m_l.shape(1); ++i) {
+
890 for (size_t j = 0; j < m_l.shape(2); ++j) {
+
891 ret(m_l(h, i, j))++;
+
892 }
+
893 }
+
894 }
+
895
+
896 return ret;
+
897 }
+
+
898
+
899private:
+
900 void compute()
+
901 {
+
902 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
903 int pad_value = 0;
+
904
+
905 if (m_periodic) {
+
906 pad_mode = xt::pad_mode::periodic;
+
907 }
+
908
+
909 m_l = xt::pad(m_l, m_pad, pad_mode, pad_value);
+
910
+
911 // first new label (start at 2 to distinguish: 0 = background, 1 = unlabelled)
+
912 int ilab = 2;
+
913
+
914 // list to renumber: used to link clusters to each other
+
915 // N.B. By default the algorithm simply loops over the image, consequently it will miss that
+
916 // clusters may touch further down in the image, labelling one cluster with several labels.
+
917 // Using "renum" these touching clusters will glued and assigned one single label.
+
918 array_type::tensor<int, 1> renum = xt::arange<int>(static_cast<int>(m_l.size()));
+
919
+
920 for (size_t h = m_pad[0][0]; h < m_l.shape(0) - m_pad[0][1]; ++h) {
+
921 for (size_t i = m_pad[1][0]; i < m_l.shape(1) - m_pad[1][1]; ++i) {
+
922 for (size_t j = m_pad[2][0]; j < m_l.shape(2) - m_pad[2][1]; ++j) {
+
923 // - skip background voxels
+
924 if (!m_l(h, i, j)) {
+
925 continue;
+
926 }
+
927 // - get current labels in the ROI
+
928 auto Li = xt::view(
+
929 m_l,
+
930 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
931 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
932 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
933 // - apply kernel to the labels in the ROI
+
934 auto Ni = Li * m_kernel;
+
935 // - extract label to apply
+
936 int l = xt::amax(Ni)();
+
937 // - draw a new label, only if there is no previous label (>= 2)
+
938 if (l == 1) {
+
939 l = ilab;
+
940 ++ilab;
+
941 }
+
942 // - apply label to all unlabelled voxels
+
943 Li = xt::where(xt::equal(Ni, 1), l, Li);
+
944 // - check if clusters have to be merged, if not: continue to the next voxel
+
945 if (xt::all(xt::equal(Li, l) || xt::equal(Li, 0) || xt::equal(Li, 1))) {
+
946 continue;
+
947 }
+
948 // - get the labels to be merged
+
949 // (discard 0 and 1 by settings them to "l" in this copy)
+
950 array_type::array<int> merge = xt::where(xt::less_equal(Li, 1), l, Li);
+
951 merge = xt::unique(merge);
+
952 // - merge labels (apply merge to other labels in cluster)
+
953 int linkto = xt::amin(xt::view(renum, xt::keep(merge)))[0];
+
954 for (auto& a : merge) {
+
955 renum = xt::where(xt::equal(renum, renum(a)), linkto, renum);
+
956 }
+
957 }
+
958 }
+
959 }
+
960
+
961 // remove padding
+
962 m_l = xt::view(
+
963 m_l,
+
964 xt::range(m_pad[0][0], m_l.shape(0) - m_pad[0][1]),
+
965 xt::range(m_pad[1][0], m_l.shape(1) - m_pad[1][1]),
+
966 xt::range(m_pad[2][0], m_l.shape(2) - m_pad[2][1]));
+
967
+
968 // apply renumbering: merges clusters
+
969 for (auto& i : m_l) {
+
970 i = renum(i);
+
971 }
+
972 }
+
973
+
974 template <class T>
+
975 array_type::tensor<double, 2> average_position(const T& lab) const
+
976 {
+
977 // number of labels
+
978 size_t N = xt::amax(lab)() + 1;
+
979
+
980 // allocate average position
+
981 array_type::tensor<double, 2> x = xt::zeros<double>({N, size_t(3)});
+
982 array_type::tensor<double, 1> n = xt::zeros<double>({N});
+
983
+
984 for (size_t h = 0; h < lab.shape(0); ++h) {
+
985 for (size_t i = 0; i < lab.shape(1); ++i) {
+
986 for (size_t j = 0; j < lab.shape(2); ++j) {
+
987 // get label
+
988 int l = lab(h, i, j);
+
989 // update average position
+
990 if (l) {
+
991 x(l, 0) += (double)h;
+
992 x(l, 1) += (double)i;
+
993 x(l, 2) += (double)j;
+
994 n(l) += 1.0;
+
995 }
+
996 }
+
997 }
+
998 }
+
999
+
1000 // avoid zero division
+
1001 n = xt::where(xt::equal(n, 0), 1, n);
+
1002
+
1003 // normalise
+
1004 for (size_t i = 0; i < x.shape(1); ++i) {
+
1005 auto xi = xt::view(x, xt::all(), i);
+
1006 xi = xi / n;
+
1007 }
+
1008
+
1009 return x;
+
1010 }
+
1011
+
1012 array_type::tensor<double, 2> average_position_periodic() const
+
1013 {
+
1014 // get relabelling "m_l_np" -> "m_l"
+
1015 auto relabel = relabel_map(m_l_np, m_l);
+
1016
+
1017 // compute average position for the non-periodic labels
+
1018 auto x_np = this->average_position(m_l_np);
+
1019
+
1020 // get half size
+
1021 auto mid = detail::half_shape(m_shape);
+
1022
+
1023 // initialise shift to apply
+
1024 array_type::tensor<double, 2> shift = xt::zeros<double>({x_np.shape(0), size_t(3)});
+
1025
+
1026 // check to apply shift
+
1027 for (size_t i = 0; i < shift.shape(0); ++i) {
+
1028 for (size_t j = 0; j < shift.shape(1); ++j) {
+
1029 if (x_np(i, j) > mid[j]) {
+
1030 shift(i, j) = -(double)m_shape[j];
+
1031 }
+
1032 }
+
1033 }
+
1034
+
1035 // number of labels
+
1036 size_t N = xt::amax(m_l)() + 1;
+
1037
+
1038 // allocate average position
+
1039 array_type::tensor<double, 2> x = xt::zeros<double>({N, size_t(3)});
+
1040 array_type::tensor<double, 1> n = xt::zeros<double>({N});
+
1041
+
1042 for (size_t h = 0; h < m_l.shape(0); ++h) {
+
1043 for (size_t i = 0; i < m_l.shape(1); ++i) {
+
1044 for (size_t j = 0; j < m_l.shape(2); ++j) {
+
1045 // get label
+
1046 int l = m_l_np(h, i, j);
+
1047 // update average position
+
1048 if (l) {
+
1049 x(relabel(l), 0) += (double)h + shift(l, 0);
+
1050 x(relabel(l), 1) += (double)i + shift(l, 1);
+
1051 x(relabel(l), 2) += (double)j + shift(l, 2);
+
1052 n(relabel(l)) += 1.0;
+
1053 }
+
1054 }
+
1055 }
+
1056 }
+
1057
+
1058 // avoid zero division
+
1059 n = xt::where(xt::equal(n, 0), 1, n);
+
1060
+
1061 // normalise
+
1062 for (size_t i = 0; i < x.shape(1); ++i) {
+
1063 auto xi = xt::view(x, xt::all(), i);
+
1064 xi = xi / n;
+
1065 xi = xt::where(xi < 0, xi + m_shape[i], xi);
+
1066 }
+
1067
+
1068 return x;
+
1069 }
+
1070
+
1071 static const size_t MAX_DIM = 3;
+
1072 std::vector<size_t> m_shape; // shape of the input image
+
1073 std::vector<std::vector<size_t>> m_pad;
+
1074 array_type::tensor<int, 3> m_kernel;
+
1075 bool m_periodic;
+
1076 array_type::tensor<int, 3> m_l; // labels (>= 1, 0 = background), 3-d
+
1077 array_type::tensor<int, 3> m_l_np; // labels before applying periodicity
+
1078};
+
+
1079
+
1080namespace detail {
+
1081
+
1082template <size_t Dimension, bool Periodicity>
+
1083class ClusterLabellerOverload : public ClusterLabeller<Dimension, Periodicity> {
+
1084public:
+
1085 template <class T>
+
1086 ClusterLabellerOverload(const T& img) : ClusterLabeller<Dimension, Periodicity>(img.shape())
+
1087 {
+
1088 this->add_image(img);
+
1089 this->prune();
+
1090 }
+
1091
+
1092 auto get() const
+
1093 {
+
1094 return this->labels();
+
1095 }
+
1096};
+
1097
+
1098} // namespace detail
+
1099
+
1106template <class T>
+
+
1107array_type::array<int> clusters(const T& f, bool periodic = true)
+
1108{
+
1109 auto n = f.dimension();
+
1110 if (n == 1 && periodic) {
+
1111 return detail::ClusterLabellerOverload<1, true>(f).get();
+
1112 }
+
1113 if (n == 1 && !periodic) {
+
1114 return detail::ClusterLabellerOverload<1, false>(f).get();
+
1115 }
+
1116 if (n == 2 && periodic) {
+
1117 return detail::ClusterLabellerOverload<2, true>(f).get();
+
1118 }
+
1119 if (n == 2 && !periodic) {
+
1120 return detail::ClusterLabellerOverload<2, false>(f).get();
+
1121 }
+
1122
+
1123 GOOSEEYE_WARNING("WIP: updated 3d implementation needs to be completed. Please file a PR.");
+
1124 return Clusters(f, kernel::nearest(f.dimension()), periodic).labels();
+
1125}
+
+
1126
+
1134template <typename T, typename U, typename V>
+
+
1135inline T pos2img(const T& img, const U& positions, const V& labels)
+
1136{
+
1137 GOOSEEYE_ASSERT(img.dimension() > 0, std::out_of_range);
+
1138 GOOSEEYE_ASSERT(img.dimension() <= 3, std::out_of_range);
+
1139 GOOSEEYE_ASSERT(img.dimension() == positions.shape(1), std::out_of_range);
+
1140 GOOSEEYE_ASSERT(positions.shape(0) == labels.size(), std::out_of_range);
+
1141 GOOSEEYE_ASSERT(labels.dimension() == 1, std::out_of_range);
+
1142
+
1143 using value_type = typename T::value_type;
+
1144 T res = img;
+
1145
+
1146 if (res.dimension() == 1) {
+
1147 xt::view(res, xt::keep(positions)) = labels;
+
1148 }
+
1149 else if (res.dimension() == 2) {
+
1150 for (size_t i = 0; i < positions.shape(0); ++i) {
+
1151 res(positions(i, 0), positions(i, 1)) = static_cast<value_type>(labels(i));
+
1152 }
+
1153 }
+
1154 else {
+
1155 for (size_t i = 0; i < positions.shape(0); ++i) {
+
1156 res(positions(i, 0), positions(i, 1), positions(i, 2)) =
+
1157 static_cast<value_type>(labels(i));
+
1158 }
+
1159 }
+
1160
+
1161 return res;
+
1162}
+
+
1163
+
1175template <class T>
+
+
1176array_type::tensor<double, 2> center_of_mass(const T& labels, bool periodic = true)
+
1177{
+
1178 static_assert(std::is_integral<typename T::value_type>::value, "Integral labels required.");
+
1179
+
1180 GOOSEEYE_ASSERT(labels.dimension() > 0, std::out_of_range);
+
1181 GOOSEEYE_ASSERT(xt::all(labels >= 0), std::out_of_range);
+
1182
+
1183 double pi = xt::numeric_constants<double>::PI;
+
1184 size_t N = static_cast<size_t>(xt::amax(labels)(0)) + 1ul;
+
1185 size_t rank = labels.dimension();
+
1186 auto axes = detail::atleast_3d_axes(rank);
+
1187 array_type::tensor<double, 1> shape = xt::adapt(labels.shape());
+
1188 array_type::tensor<double, 2> ret = xt::zeros<double>({N, rank});
+
1189
+
1190 for (size_t l = 0; l < N; ++l) {
+ +
1192 xt::from_indices(xt::argwhere(xt::equal(labels, l)));
+
1193 if (positions.size() == 0) {
+
1194 continue;
+
1195 }
+
1196 if (!periodic) {
+
1197 xt::view(ret, l, xt::all()) = xt::mean(positions, 0);
+
1198 }
+
1199 else {
+
1200 if (xt::all(xt::equal(positions, 0.0))) {
+
1201 continue;
+
1202 }
+
1203 auto theta = 2.0 * pi * positions / shape;
+
1204 auto xi = xt::cos(theta);
+
1205 auto zeta = xt::sin(theta);
+
1206 auto xi_bar = xt::mean(xi, 0);
+
1207 auto zeta_bar = xt::mean(zeta, 0);
+
1208 auto theta_bar = xt::atan2(-zeta_bar, -xi_bar) + pi;
+
1209 auto positions_bar = shape * theta_bar / (2.0 * pi);
+
1210 xt::view(ret, l, xt::all()) = positions_bar;
+
1211 }
+
1212 }
+
1213
+
1214 return xt::view(ret, xt::all(), xt::keep(axes));
+
1215}
+
+
1216
+
+ +
1228public:
+
1232 Ensemble() = default;
+
1233
+
1240 Ensemble(const std::vector<size_t>& roi, bool periodic = true, bool variance = true);
+
1241
+ +
1247
+ +
1253
+ +
1259
+ +
1265
+ +
1271
+ +
1277
+
1284 array_type::array<double> distance(size_t axis) const;
+
1285
+
1292 array_type::array<double> distance(const std::vector<double>& h) const;
+
1293
+
1302 array_type::array<double> distance(const std::vector<double>& h, size_t axis) const;
+
1303
+
1308 template <class T>
+
1309 void mean(const T& f);
+
1310
+
1316 template <class T, class M>
+
1317 void mean(const T& f, const M& fmask);
+
1318
+
1324 template <class T>
+
1325 void S2(const T& f, const T& g);
+
1326
+
1334 template <class T, class M>
+
1335 void S2(const T& f, const T& g, const M& fmask, const M& gmask);
+
1336
+
1342 template <class T>
+
1343 void C2(const T& f, const T& g);
+
1344
+
1352 template <class T, class M>
+
1353 void C2(const T& f, const T& g, const M& fmask, const M& gmask);
+
1354
+
1360 template <class T>
+
1361 void W2(const T& w, const T& f);
+
1362
+
1369 template <class T, class M>
+
1370 void W2(const T& w, const T& f, const M& fmask);
+
1371
+
1379 template <class C, class T>
+
1380 void
+
1381 W2c(const C& clusters, const C& centers, const T& f, path_mode mode = path_mode::Bresenham);
+
1382
+
1391 template <class C, class T, class M>
+
1392 void
+
1393 W2c(const C& clusters,
+
1394 const C& centers,
+
1395 const T& f,
+
1396 const M& fmask,
+ +
1398
+
1406 template <class T>
+
1407 void heightheight(const T& f);
+
1408
+
1413 template <class T, class M>
+
1414 void heightheight(const T& f, const M& fmask);
+
1415
+
1421 template <class T>
+
1422 void L(const T& f, path_mode mode = path_mode::Bresenham);
+
1423
+
1424private:
+
1425 // Type: used to lock the ensemble to a certain measure.
+
1426 enum class Type { Unset, mean, S2, C2, W2, W2c, L, heightheight };
+
1427
+
1428 // Initialize class as unlocked.
+
1429 Type m_stat = Type::Unset;
+
1430
+
1431 // Maximum number of dimensions.
+
1432 static const size_t MAX_DIM = 3;
+
1433
+
1434 // Switch to assume periodicity (for the entire ensemble).
+
1435 bool m_periodic;
+
1436
+
1437 // Switch to compute the variance (for the entire ensemble).
+
1438 bool m_variance;
+
1439
+
1440 // Raw (not normalized) result, and normalization:
+
1441 // - sum of the first moment: x_1 + x_2 + ...
+ +
1443 // - sum of the second moment: x_1^2 + x_2^2 + ...
+ +
1445 // - number of measurements per pixel
+ +
1447
+
1448 // Shape of the region-of-interest, as specified.
+
1449 std::vector<size_t> m_shape_orig;
+
1450
+
1451 // 3d equivalent of "m_shape_orig".
+
1452 std::vector<size_t> m_shape;
+
1453
+
1454 // Pad size (3d).
+
1455 std::vector<std::vector<size_t>> m_pad;
+
1456};
+
+
1457
+
1458// ---------------------------------------------------------
+
1459// Wrapper functions to compute the statistics for one image
+
1460// ---------------------------------------------------------
+
1461
+
1467inline auto distance(const std::vector<size_t>& roi);
+
1468
+
1475inline auto distance(const std::vector<size_t>& roi, size_t axis);
+
1476
+
1483inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h);
+
1484
+
1492inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h, size_t axis);
+
1493
+
1501template <class T>
+
1502inline auto S2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic = true);
+
1503
+
1513template <class T, class M>
+
1514inline auto
+
1515S2(const std::vector<size_t>& roi,
+
1516 const T& f,
+
1517 const T& g,
+
1518 const M& fmask,
+
1519 const M& gmask,
+
1520 bool periodic = true);
+
1521
+
1529template <class T>
+
1530inline auto C2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic = true);
+
1531
+
1541template <class T, class M>
+
1542inline auto
+
1543C2(const std::vector<size_t>& roi,
+
1544 const T& f,
+
1545 const T& g,
+
1546 const M& fmask,
+
1547 const M& gmask,
+
1548 bool periodic = true);
+
1549
+
1557template <class T>
+
1558inline auto W2(const std::vector<size_t>& roi, const T& w, const T& f, bool periodic = true);
+
1559
+
1568template <class T, class M>
+
1569inline auto
+
1570W2(const std::vector<size_t>& roi, const T& w, const T& f, const M& fmask, bool periodic = true);
+
1571
+
1581template <class C, class T>
+
1582inline auto
+
1583W2c(const std::vector<size_t>& roi,
+
1584 const C& clusters,
+
1585 const C& centers,
+
1586 const T& f,
+ +
1588 bool periodic = true);
+
1589
+
1600template <class C, class T, class M>
+
1601inline auto
+
1602W2c(const std::vector<size_t>& roi,
+
1603 const C& clusters,
+
1604 const C& centers,
+
1605 const T& f,
+
1606 const M& fmask,
+ +
1608 bool periodic = true);
+
1609
+
1616template <class T>
+
1617inline auto heightheight(const std::vector<size_t>& roi, const T& f, bool periodic = true);
+
1618
+
1626template <class T, class M>
+
1627inline auto
+
1628heightheight(const std::vector<size_t>& roi, const T& f, const M& fmask, bool periodic = true);
+
1629
+
1637template <class T>
+
1638inline auto
+
1639L(const std::vector<size_t>& roi,
+
1640 const T& f,
+
1641 bool periodic = true,
+ +
1643
+
1644} // namespace GooseEYE
+
1645
+
1646#include "Ensemble.hpp"
+
1647#include "Ensemble_C2.hpp"
+
1648#include "Ensemble_L.hpp"
+
1649#include "Ensemble_S2.hpp"
+
1650#include "Ensemble_W2.hpp"
+
1651#include "Ensemble_W2c.hpp"
+ +
1653#include "Ensemble_mean.hpp"
+
1654#include "GooseEYE.hpp"
+
1655#include "dilate.hpp"
+
1656#include "kernel.hpp"
+
1657
+
1658#endif
+ + + + + + + + + +
(Incrementally) Label clusters (0 as background, 1..n as labels).
Definition GooseEYE.h:427
+
void prune()
Prune: renumber labels to lowest possible label, see also AvalancheSegmenter::nlabels.
Definition GooseEYE.h:523
+
void add_image(const T &img)
Add image.
Definition GooseEYE.h:677
+
auto size() const
Size of ClusterLabeller::s and ClusterLabeller::labels (== prod(shape)).
Definition GooseEYE.h:750
+
ClusterLabeller(const T &shape)
Definition GooseEYE.h:466
+
ClusterLabeller(const T &shape, const K &kernel)
Definition GooseEYE.h:484
+
std::string repr() const
Basic class info.
Definition GooseEYE.h:731
+
const auto & shape() const
Shape of ClusterLabeller::s and ClusterLabeller::labels.
Definition GooseEYE.h:741
+
static constexpr bool Periodic
Periodicity of the system.
Definition GooseEYE.h:430
+
void add_points(const T &begin, const T &end)
Add sequence of points.
Definition GooseEYE.h:699
+
const auto & labels() const
Per block, the label (0 for background).
Definition GooseEYE.h:761
+
void add_points(const T &idx)
Add sequence of points.
Definition GooseEYE.h:721
+
void reset()
Reset labels to zero.
Definition GooseEYE.h:511
+
static constexpr size_t Dim
Dimensionality of the system.
Definition GooseEYE.h:429
+
Compute clusters and obtain certain characteristic about them.
Definition GooseEYE.h:770
+
array_type::array< int > centers() const
Return label only in the center of gravity (1..n).
Definition GooseEYE.h:843
+
array_type::tensor< size_t, 1 > sizes() const
Return size per cluster.
Definition GooseEYE.h:883
+
Clusters(const T &f, const S &kernel, bool periodic=true)
Constructor.
Definition GooseEYE.h:794
+
Clusters(const T &f, bool periodic=true)
Constructor.
Definition GooseEYE.h:781
+
array_type::array< int > labels() const
Return labels (1..n).
Definition GooseEYE.h:834
+
array_type::tensor< double, 2 > center_positions(bool as3d=false) const
Return positions of the centers of gravity (in the original rank, or as 3-d).
Definition GooseEYE.h:860
+
Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statis...
Definition GooseEYE.h:1227
+
void mean(const T &f)
Add realization to arithmetic mean.
+
void L(const T &f, path_mode mode=path_mode::Bresenham)
Add realization to lineal-path function.
+
void S2(const T &f, const T &g)
Add realization to 2-point correlation: P(f(i) * g(i + di)).
+
array_type::array< double > data_second() const
Get raw-data: ensemble sum of the second moment: x_1^2 + x_2^2 + ...
Definition Ensemble.hpp:59
+
Ensemble()=default
Constructor.
+
array_type::array< double > variance() const
Get ensemble variance.
Definition Ensemble.hpp:37
+
void heightheight(const T &f)
Add realization to height-height correlation.
+
void W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)
Add realization to collapsed weighted 2-point correlation.
+
array_type::array< double > data_first() const
Get raw-data: ensemble sum of the first moment: x_1 + x_2 + ...
Definition Ensemble.hpp:53
+
void W2(const T &w, const T &f)
Add realization to weighted 2-point correlation.
+
array_type::array< double > distance() const
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition Ensemble.hpp:103
+
array_type::array< double > result() const
Get ensemble average.
Definition Ensemble.hpp:26
+
array_type::array< double > norm() const
Get raw-data: normalisation (number of measurements per pixel).
Definition Ensemble.hpp:65
+
void C2(const T &f, const T &g)
Add realization to 2-point cluster function: P(f(i) == g(i + di)).
+ +
#define GOOSEEYE_WARNING(message)
Warnings are implemented as:
Definition config.h:97
+
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
#define GOOSEEYE_WARNING_PYTHON(message)
Warnings specific to the Python API are implemented as:
Definition config.h:115
+ + + +
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:121
+
path_mode
Different methods to compute a pixel-path.
Definition GooseEYE.h:69
+
@ Bresenham
Bresenham algorithm.
+
@ actual
The actual path.
+
@ full
Similar to actual selecting every voxel that is crossed.
+
auto L(const std::vector< size_t > &roi, const T &f, bool periodic=true, path_mode mode=path_mode::Bresenham)
Lineal-path function.
Definition GooseEYE.hpp:159
+
T dilate(const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic)
Dilate image.
Definition dilate.hpp:96
+
array_type::tensor< double, 2 > center_of_mass(const T &labels, bool periodic=true)
Get the position of the center of each label.
Definition GooseEYE.h:1176
+
auto W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)
Collapsed weighted 2-point correlation.
Definition GooseEYE.hpp:115
+
array_type::tensor< typename T::value_type, 2 > labels_sizes(const T &labels)
Size per label.
Definition GooseEYE.h:354
+
array_type::tensor< typename T::value_type, 2 > labels_map(const T &a, const T &b)
Get a map to relabel from a to b.
Definition GooseEYE.h:263
+
auto C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point cluster function: P(f(i) == g(i + di)).
Definition GooseEYE.hpp:75
+
array_type::array< int > clusters(const T &f, bool periodic=true)
Compute clusters.
Definition GooseEYE.h:1107
+
L labels_rename(const L &labels, const A &rename)
Rename labels.
Definition GooseEYE.h:292
+
T pos2img(const T &img, const U &positions, const V &labels)
Convert positions to an image.
Definition GooseEYE.h:1135
+
auto W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
Weighted 2-point correlation.
Definition GooseEYE.hpp:97
+
array_type::array< int > dummy_circles(const std::vector< size_t > &shape, const array_type::tensor< int, 1 > &row, const array_type::tensor< int, 1 > &col, const array_type::tensor< int, 1 > &r, bool periodic=true)
Dummy image with circles.
Definition GooseEYE.h:96
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
auto distance(const std::vector< size_t > &roi)
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition GooseEYE.hpp:28
+
array_type::tensor< size_t, 1 > relabel_map(const T &a, const S &b)
Find map to relabel from a to b.
Definition GooseEYE.h:242
+
auto S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point correlation: P(f(i) * g(i + di)).
Definition GooseEYE.hpp:53
+
auto heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)
Height-height correlation.
Definition GooseEYE.hpp:143
+
L labels_reorder(const L &labels, const A &order)
Reorder labels.
Definition GooseEYE.h:324
+ +
+
+ + + + diff --git a/GooseEYE_8hpp.html b/GooseEYE_8hpp.html new file mode 100644 index 00000000..05b460eb --- /dev/null +++ b/GooseEYE_8hpp.html @@ -0,0 +1,193 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

array_type::tensor< int, 2 > GooseEYE::path (const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
 Compute a path between two pixels.
 
auto GooseEYE::distance (const std::vector< size_t > &roi)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
auto GooseEYE::distance (const std::vector< size_t > &roi, size_t axis)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
auto GooseEYE::distance (const std::vector< size_t > &roi, const std::vector< double > &h)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
auto GooseEYE::distance (const std::vector< size_t > &roi, const std::vector< double > &h, size_t axis)
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
template<class T >
auto GooseEYE::S2 (const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
 2-point correlation: P(f(i) * g(i + di)).
 
template<class T , class M >
auto GooseEYE::S2 (const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)
 2-point correlation: P(f(i) * g(i + di)).
 
template<class T >
auto GooseEYE::C2 (const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
 2-point cluster function: P(f(i) == g(i + di)).
 
template<class T , class M >
auto GooseEYE::C2 (const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)
 2-point cluster function: P(f(i) == g(i + di)).
 
template<class T >
auto GooseEYE::W2 (const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
 Weighted 2-point correlation.
 
template<class T , class M >
auto GooseEYE::W2 (const std::vector< size_t > &roi, const T &w, const T &f, const M &fmask, bool periodic=true)
 Weighted 2-point correlation.
 
template<class C , class T >
auto GooseEYE::W2c (const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)
 Collapsed weighted 2-point correlation.
 
template<class C , class T , class M >
auto GooseEYE::W2c (const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham, bool periodic=true)
 Collapsed weighted 2-point correlation.
 
template<class T >
auto GooseEYE::heightheight (const std::vector< size_t > &roi, const T &f, bool periodic=true)
 Height-height correlation.
 
template<class T , class M >
auto GooseEYE::heightheight (const std::vector< size_t > &roi, const T &f, const M &fmask, bool periodic=true)
 Height-height correlation.
 
template<class T >
auto GooseEYE::L (const std::vector< size_t > &roi, const T &f, bool periodic=true, path_mode mode=path_mode::Bresenham)
 Lineal-path function.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file GooseEYE.hpp.

+
+
+ + + + diff --git a/GooseEYE_8hpp.js b/GooseEYE_8hpp.js new file mode 100644 index 00000000..15c020be --- /dev/null +++ b/GooseEYE_8hpp.js @@ -0,0 +1,19 @@ +var GooseEYE_8hpp = +[ + [ "C2", "GooseEYE_8hpp.html#a6f8454f08a6b048290f36618cc80986b", null ], + [ "C2", "GooseEYE_8hpp.html#a867ce41fed448b5442ad8f6e6011b8b1", null ], + [ "distance", "GooseEYE_8hpp.html#adf4657193fc58978eed6ef274ebb93ed", null ], + [ "distance", "GooseEYE_8hpp.html#a3097c5d07c0fe21227df46b79c133a23", null ], + [ "distance", "GooseEYE_8hpp.html#ab97f8ace23ac36134cfaab38a19b131b", null ], + [ "distance", "GooseEYE_8hpp.html#a3d0010a207abd86a2811edfb32d22e21", null ], + [ "heightheight", "GooseEYE_8hpp.html#ae761eb00cac0021b5840df83814abf72", null ], + [ "heightheight", "GooseEYE_8hpp.html#a5f658c332d5fc69e86bb44cb14930ce5", null ], + [ "L", "GooseEYE_8hpp.html#a43454c98d88250a5693a3696ca978cb4", null ], + [ "path", "GooseEYE_8hpp.html#ac27cb5922686e23dbd84d313579b2add", null ], + [ "S2", "GooseEYE_8hpp.html#ae27103f5b7d6acda6fc2e14c8dfd11b3", null ], + [ "S2", "GooseEYE_8hpp.html#ac01c192a6d398e2befc3aca36e953f0e", null ], + [ "W2", "GooseEYE_8hpp.html#aaa2055a53f179e2ddd810ebaf9eaf837", null ], + [ "W2", "GooseEYE_8hpp.html#ab349faaa82c253cea9d67996cb9749c7", null ], + [ "W2c", "GooseEYE_8hpp.html#a989df0528b84e5e0f4da84062785ee8b", null ], + [ "W2c", "GooseEYE_8hpp.html#a55b550567256dee0da56ac22fd2be72a", null ] +]; \ No newline at end of file diff --git a/GooseEYE_8hpp_source.html b/GooseEYE_8hpp_source.html new file mode 100644 index 00000000..879ff3b6 --- /dev/null +++ b/GooseEYE_8hpp_source.html @@ -0,0 +1,337 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_HPP
+
8#define GOOSEEYE_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+ +
+ +
16{
+
17 if (mode == path_mode::Bresenham) {
+
18 return detail::path::bresenham(x0, x1);
+
19 }
+
20 else if (mode == path_mode::actual) {
+
21 return detail::path::actual(x0, x1);
+
22 }
+
23 else {
+
24 return detail::path::full(x0, x1);
+
25 }
+
26}
+
+
27
+
+
28inline auto distance(const std::vector<size_t>& roi)
+
29{
+
30 Ensemble ensemble(roi);
+
31 return ensemble.distance();
+
32}
+
+
33
+
+
34inline auto distance(const std::vector<size_t>& roi, size_t dim)
+
35{
+
36 Ensemble ensemble(roi);
+
37 return ensemble.distance(dim);
+
38}
+
+
39
+
+
40inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h)
+
41{
+
42 Ensemble ensemble(roi);
+
43 return ensemble.distance(h);
+
44}
+
+
45
+
+
46inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h, size_t dim)
+
47{
+
48 Ensemble ensemble(roi);
+
49 return ensemble.distance(h, dim);
+
50}
+
+
51
+
52template <class T>
+
+
53inline auto S2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic)
+
54{
+
55 Ensemble ensemble(roi, periodic);
+
56 ensemble.S2(f, g);
+
57 return ensemble.result();
+
58}
+
+
59
+
60template <class T, class M>
+
61inline auto
+
+
62S2(const std::vector<size_t>& roi,
+
63 const T& f,
+
64 const T& g,
+
65 const M& fmask,
+
66 const M& gmask,
+
67 bool periodic)
+
68{
+
69 Ensemble ensemble(roi, periodic);
+
70 ensemble.S2(f, g, fmask, gmask);
+
71 return ensemble.result();
+
72}
+
+
73
+
74template <class T>
+
+
75inline auto C2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic)
+
76{
+
77 Ensemble ensemble(roi, periodic);
+
78 ensemble.C2(f, g);
+
79 return ensemble.result();
+
80}
+
+
81
+
82template <class T, class M>
+
83inline auto
+
+
84C2(const std::vector<size_t>& roi,
+
85 const T& f,
+
86 const T& g,
+
87 const M& fmask,
+
88 const M& gmask,
+
89 bool periodic)
+
90{
+
91 Ensemble ensemble(roi, periodic);
+
92 ensemble.C2(f, g, fmask, gmask);
+
93 return ensemble.result();
+
94}
+
+
95
+
96template <class T>
+
+
97inline auto W2(const std::vector<size_t>& roi, const T& w, const T& f, bool periodic)
+
98{
+
99 Ensemble ensemble(roi, periodic);
+
100 ensemble.W2(w, f);
+
101 return ensemble.result();
+
102}
+
+
103
+
104template <class T, class M>
+
105inline auto
+
+
106W2(const std::vector<size_t>& roi, const T& w, const T& f, const M& fmask, bool periodic)
+
107{
+
108 Ensemble ensemble(roi, periodic);
+
109 ensemble.W2(w, f, fmask);
+
110 return ensemble.result();
+
111}
+
+
112
+
113template <class C, class T>
+
114inline auto
+
+
115W2c(const std::vector<size_t>& roi,
+
116 const C& clusters,
+
117 const C& centers,
+
118 const T& f,
+
119 path_mode mode,
+
120 bool periodic)
+
121{
+
122 Ensemble ensemble(roi, periodic);
+
123 ensemble.W2c(clusters, centers, f, mode);
+
124 return ensemble.result();
+
125}
+
+
126
+
127template <class C, class T, class M>
+
128inline auto
+
+
129W2c(const std::vector<size_t>& roi,
+
130 const C& clusters,
+
131 const C& centers,
+
132 const T& f,
+
133 const M& fmask,
+
134 path_mode mode,
+
135 bool periodic)
+
136{
+
137 Ensemble ensemble(roi, periodic);
+
138 ensemble.W2c(clusters, centers, f, fmask, mode);
+
139 return ensemble.result();
+
140}
+
+
141
+
142template <class T>
+
+
143inline auto heightheight(const std::vector<size_t>& roi, const T& f, bool periodic)
+
144{
+
145 Ensemble ensemble(roi, periodic);
+
146 ensemble.heightheight(f);
+
147 return ensemble.result();
+
148}
+
+
149
+
150template <class T, class M>
+
+
151inline auto heightheight(const std::vector<size_t>& roi, const T& f, const M& fmask, bool periodic)
+
152{
+
153 Ensemble ensemble(roi, periodic);
+
154 ensemble.heightheight(f, fmask);
+
155 return ensemble.result();
+
156}
+
+
157
+
158template <class T>
+
+
159inline auto L(const std::vector<size_t>& roi, const T& f, bool periodic, path_mode mode)
+
160{
+
161 Ensemble ensemble(roi, periodic);
+
162 ensemble.L(f, mode);
+
163 return ensemble.result();
+
164}
+
+
165
+
166} // namespace GooseEYE
+
167
+
168#endif
+ +
Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statis...
Definition GooseEYE.h:1227
+
void L(const T &f, path_mode mode=path_mode::Bresenham)
Add realization to lineal-path function.
+
void S2(const T &f, const T &g)
Add realization to 2-point correlation: P(f(i) * g(i + di)).
+
void heightheight(const T &f)
Add realization to height-height correlation.
+
void W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)
Add realization to collapsed weighted 2-point correlation.
+
void W2(const T &w, const T &f)
Add realization to weighted 2-point correlation.
+
array_type::array< double > distance() const
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition Ensemble.hpp:103
+
array_type::array< double > result() const
Get ensemble average.
Definition Ensemble.hpp:26
+
void C2(const T &f, const T &g)
Add realization to 2-point cluster function: P(f(i) == g(i + di)).
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
path_mode
Different methods to compute a pixel-path.
Definition GooseEYE.h:69
+
@ Bresenham
Bresenham algorithm.
+
@ actual
The actual path.
+
auto L(const std::vector< size_t > &roi, const T &f, bool periodic=true, path_mode mode=path_mode::Bresenham)
Lineal-path function.
Definition GooseEYE.hpp:159
+
auto W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)
Collapsed weighted 2-point correlation.
Definition GooseEYE.hpp:115
+
auto C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point cluster function: P(f(i) == g(i + di)).
Definition GooseEYE.hpp:75
+
array_type::array< int > clusters(const T &f, bool periodic=true)
Compute clusters.
Definition GooseEYE.h:1107
+
auto W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
Weighted 2-point correlation.
Definition GooseEYE.hpp:97
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
auto distance(const std::vector< size_t > &roi)
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition GooseEYE.hpp:28
+
auto S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point correlation: P(f(i) * g(i + di)).
Definition GooseEYE.hpp:53
+
auto heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)
Height-height correlation.
Definition GooseEYE.hpp:143
+
+
+ + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 00000000..4a93bb22 --- /dev/null +++ b/annotated.html @@ -0,0 +1,120 @@ + + + + + + + +GooseEYE: Class List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + +
 NGooseEYEToolbox to compute statistics
 CClusterLabeller(Incrementally) Label clusters (0 as background, 1..n as labels)
 CClustersCompute clusters and obtain certain characteristic about them
 CEnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
+
+
+
+ + + + diff --git a/annotated_dup.js b/annotated_dup.js new file mode 100644 index 00000000..7a8dd255 --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,8 @@ +var annotated_dup = +[ + [ "GooseEYE", "namespaceGooseEYE.html", [ + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "Clusters", "classGooseEYE_1_1Clusters.html", "classGooseEYE_1_1Clusters" ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ] + ] ] +]; \ No newline at end of file diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 00000000..224b29aa Binary files /dev/null and b/bc_s.png differ diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 00000000..31ca888d Binary files /dev/null and b/bc_sd.png differ diff --git a/classGooseEYE_1_1ClusterLabeller-members.html b/classGooseEYE_1_1ClusterLabeller-members.html new file mode 100644 index 00000000..a53c448a --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller-members.html @@ -0,0 +1,128 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE::ClusterLabeller< Dimension, Periodicity > Member List
+
+
+ +

This is the complete list of members for GooseEYE::ClusterLabeller< Dimension, Periodicity >, including all inherited members.

+ + + + + + + + + + + + + + +
add_image(const T &img)GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
add_points(const T &begin, const T &end)GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
add_points(const T &idx)GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
ClusterLabeller(const T &shape)GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
ClusterLabeller(const T &shape, const K &kernel)GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
DimGooseEYE::ClusterLabeller< Dimension, Periodicity >static
labels() constGooseEYE::ClusterLabeller< Dimension, Periodicity >inline
PeriodicGooseEYE::ClusterLabeller< Dimension, Periodicity >static
prune()GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
repr() constGooseEYE::ClusterLabeller< Dimension, Periodicity >inline
reset()GooseEYE::ClusterLabeller< Dimension, Periodicity >inline
shape() constGooseEYE::ClusterLabeller< Dimension, Periodicity >inline
size() constGooseEYE::ClusterLabeller< Dimension, Periodicity >inline
+
+ + + + diff --git a/classGooseEYE_1_1ClusterLabeller.html b/classGooseEYE_1_1ClusterLabeller.html new file mode 100644 index 00000000..c7062707 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller.html @@ -0,0 +1,654 @@ + + + + + + + +GooseEYE: GooseEYE::ClusterLabeller< Dimension, Periodicity > Class Template Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE::ClusterLabeller< Dimension, Periodicity > Class Template Reference
+
+
+ +

(Incrementally) Label clusters (0 as background, 1..n as labels). + More...

+ +

#include <GooseEYE/GooseEYE.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

template<class T >
 ClusterLabeller (const T &shape)
 
template<class T , class K >
 ClusterLabeller (const T &shape, const K &kernel)
 
void reset ()
 Reset labels to zero.
 
void prune ()
 Prune: renumber labels to lowest possible label, see also AvalancheSegmenter::nlabels.
 
template<class T >
void add_image (const T &img)
 Add image.
 
template<class T >
void add_points (const T &begin, const T &end)
 Add sequence of points.
 
template<class T >
void add_points (const T &idx)
 Add sequence of points.
 
std::string repr () const
 Basic class info.
 
const auto & shape () const
 Shape of ClusterLabeller::s and ClusterLabeller::labels.
 
auto size () const
 Size of ClusterLabeller::s and ClusterLabeller::labels (== prod(shape)).
 
const auto & labels () const
 Per block, the label (0 for background).
 
+ + + + + + + +

+Static Public Attributes

static constexpr size_t Dim = Dimension
 Dimensionality of the system.
 
static constexpr bool Periodic = Periodicity
 Periodicity of the system.
 
+

Detailed Description

+
template<size_t Dimension, bool Periodicity = true>
+class GooseEYE::ClusterLabeller< Dimension, Periodicity >

(Incrementally) Label clusters (0 as background, 1..n as labels).

+
Template Parameters
+ + +
DimensionThe rank (a.k.a. dimension) of the image.
+
+
+
Note
The default kernel is GooseEYE::kernel::nearest().
+ +

Definition at line 427 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ ClusterLabeller() [1/2]

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+
+template<class T >
+ + + + + +
+ + + + + + + + +
GooseEYE::ClusterLabeller< Dimension, Periodicity >::ClusterLabeller (const T & shape)
+
+inline
+
+
Parameters
+ + +
shapeShape of the system.
+
+
+ +

Definition at line 466 of file GooseEYE.h.

+ +
+
+ +

◆ ClusterLabeller() [2/2]

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+
+template<class T , class K >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
GooseEYE::ClusterLabeller< Dimension, Periodicity >::ClusterLabeller (const T & shape,
const K & kernel 
)
+
+inline
+
+
Parameters
+ + + +
shapeShape of the system.
kernelKernel (e.g. GooseEYE::kernel::nearest()).
+
+
+ +

Definition at line 484 of file GooseEYE.h.

+ +
+
+

Member Function Documentation

+ +

◆ add_image()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void GooseEYE::ClusterLabeller< Dimension, Periodicity >::add_image (const T & img)
+
+inline
+
+ +

Add image.

+

Previous labels are not overwritten.

Parameters
+ + +
imgImage (can be incremental only).
+
+
+ +

Definition at line 677 of file GooseEYE.h.

+ +
+
+ +

◆ add_points() [1/2]

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::ClusterLabeller< Dimension, Periodicity >::add_points (const T & begin,
const T & end 
)
+
+inline
+
+ +

Add sequence of points.

+
Parameters
+ + + +
beginIterator to first point.
endIterator to last point.
+
+
+ +

Definition at line 699 of file GooseEYE.h.

+ +
+
+ +

◆ add_points() [2/2]

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void GooseEYE::ClusterLabeller< Dimension, Periodicity >::add_points (const T & idx)
+
+inline
+
+ +

Add sequence of points.

+
Parameters
+ + +
idxList of points.
+
+
+ +

Definition at line 721 of file GooseEYE.h.

+ +
+
+ +

◆ labels()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + + + + +
const auto & GooseEYE::ClusterLabeller< Dimension, Periodicity >::labels () const
+
+inline
+
+ +

Per block, the label (0 for background).

+
Returns
array of signed integers.
+ +

Definition at line 761 of file GooseEYE.h.

+ +
+
+ +

◆ prune()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + + + + +
void GooseEYE::ClusterLabeller< Dimension, Periodicity >::prune ()
+
+inline
+
+ +

Prune: renumber labels to lowest possible label, see also AvalancheSegmenter::nlabels.

+
Note
This might change all labels.
+ +

Definition at line 523 of file GooseEYE.h.

+ +
+
+ +

◆ repr()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + + + + +
std::string GooseEYE::ClusterLabeller< Dimension, Periodicity >::repr () const
+
+inline
+
+ +

Basic class info.

+
Returns
std::string
+ +

Definition at line 731 of file GooseEYE.h.

+ +
+
+ +

◆ reset()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + + + + +
void GooseEYE::ClusterLabeller< Dimension, Periodicity >::reset ()
+
+inline
+
+ +

Reset labels to zero.

+ +

Definition at line 511 of file GooseEYE.h.

+ +
+
+ +

◆ shape()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + + + + +
const auto & GooseEYE::ClusterLabeller< Dimension, Periodicity >::shape () const
+
+inline
+
+ +

Shape of ClusterLabeller::s and ClusterLabeller::labels.

+
Returns
Shape
+ +

Definition at line 741 of file GooseEYE.h.

+ +
+
+ +

◆ size()

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + + + + +
auto GooseEYE::ClusterLabeller< Dimension, Periodicity >::size () const
+
+inline
+
+ +

Size of ClusterLabeller::s and ClusterLabeller::labels (== prod(shape)).

+
Returns
Size
+ +

Definition at line 750 of file GooseEYE.h.

+ +
+
+

Member Data Documentation

+ +

◆ Dim

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + +
constexpr size_t GooseEYE::ClusterLabeller< Dimension, Periodicity >::Dim = Dimension
+
+staticconstexpr
+
+ +

Dimensionality of the system.

+ +

Definition at line 429 of file GooseEYE.h.

+ +
+
+ +

◆ Periodic

+ +
+
+
+template<size_t Dimension, bool Periodicity = true>
+ + + + + +
+ + + + +
constexpr bool GooseEYE::ClusterLabeller< Dimension, Periodicity >::Periodic = Periodicity
+
+staticconstexpr
+
+ +

Periodicity of the system.

+ +

Definition at line 430 of file GooseEYE.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classGooseEYE_1_1ClusterLabeller.js b/classGooseEYE_1_1ClusterLabeller.js new file mode 100644 index 00000000..5d6380f3 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller.js @@ -0,0 +1,14 @@ +var classGooseEYE_1_1ClusterLabeller = +[ + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html#a259275eedd9e65e152c01eff377c5344", null ], + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html#a4937ee10526225c0f985c1c19347cef6", null ], + [ "add_image", "classGooseEYE_1_1ClusterLabeller.html#a141c63eddd8e766741ebf08b2b473136", null ], + [ "add_points", "classGooseEYE_1_1ClusterLabeller.html#a9a88b743156388bf650af378c93d1ef4", null ], + [ "add_points", "classGooseEYE_1_1ClusterLabeller.html#ac239e876dfcf25f34748cf7b8ca8d704", null ], + [ "labels", "classGooseEYE_1_1ClusterLabeller.html#aa2bd8cf38cd68889140ab55b461056d3", null ], + [ "prune", "classGooseEYE_1_1ClusterLabeller.html#a009856504d69238a7f0950599827da60", null ], + [ "repr", "classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7", null ], + [ "reset", "classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024", null ], + [ "shape", "classGooseEYE_1_1ClusterLabeller.html#a845972ee4e7dfe96242b56115d6f124c", null ], + [ "size", "classGooseEYE_1_1ClusterLabeller.html#a150bfedd947d3492b1afe732a9a9a650", null ] +]; \ No newline at end of file diff --git a/classGooseEYE_1_1Clusters-members.html b/classGooseEYE_1_1Clusters-members.html new file mode 100644 index 00000000..64929525 --- /dev/null +++ b/classGooseEYE_1_1Clusters-members.html @@ -0,0 +1,122 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE::Clusters Member List
+
+
+ +

This is the complete list of members for GooseEYE::Clusters, including all inherited members.

+ + + + + + + + +
center_positions(bool as3d=false) constGooseEYE::Clustersinline
centers() constGooseEYE::Clustersinline
Clusters()=default (defined in GooseEYE::Clusters)GooseEYE::Clusters
Clusters(const T &f, bool periodic=true)GooseEYE::Clustersinline
Clusters(const T &f, const S &kernel, bool periodic=true)GooseEYE::Clustersinline
labels() constGooseEYE::Clustersinline
sizes() constGooseEYE::Clustersinline
+
+ + + + diff --git a/classGooseEYE_1_1Clusters.html b/classGooseEYE_1_1Clusters.html new file mode 100644 index 00000000..30280ff7 --- /dev/null +++ b/classGooseEYE_1_1Clusters.html @@ -0,0 +1,381 @@ + + + + + + + +GooseEYE: GooseEYE::Clusters Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE::Clusters Class Reference
+
+
+ +

Compute clusters and obtain certain characteristic about them. + More...

+ +

#include <GooseEYE/GooseEYE.h>

+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

template<class T >
 Clusters (const T &f, bool periodic=true)
 Constructor.
 
template<class T , class S >
 Clusters (const T &f, const S &kernel, bool periodic=true)
 Constructor.
 
array_type::array< int > labels () const
 Return labels (1..n).
 
array_type::array< int > centers () const
 Return label only in the center of gravity (1..n).
 
array_type::tensor< double, 2 > center_positions (bool as3d=false) const
 Return positions of the centers of gravity (in the original rank, or as 3-d).
 
array_type::tensor< size_t, 1 > sizes () const
 Return size per cluster.
 
+

Detailed Description

+

Compute clusters and obtain certain characteristic about them.

+ +

Definition at line 770 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ Clusters() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
GooseEYE::Clusters::Clusters (const T & f,
bool periodic = true 
)
+
+inline
+
+ +

Constructor.

+

Use default kernel::nearest().

+
Parameters
+ + + +
fImage.
periodicInterpret image as periodic.
+
+
+ +

Definition at line 781 of file GooseEYE.h.

+ +
+
+ +

◆ Clusters() [2/2]

+ +
+
+
+template<class T , class S >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
GooseEYE::Clusters::Clusters (const T & f,
const S & kernel,
bool periodic = true 
)
+
+inline
+
+ +

Constructor.

+
Parameters
+ + + + +
fImage.
kernelKernel.
periodicInterpret image as periodic.
+
+
+ +

Definition at line 794 of file GooseEYE.h.

+ +
+
+

Member Function Documentation

+ +

◆ center_positions()

+ +
+
+ + + + + +
+ + + + + + + + +
array_type::tensor< double, 2 > GooseEYE::Clusters::center_positions (bool as3d = false) const
+
+inline
+
+ +

Return positions of the centers of gravity (in the original rank, or as 3-d).

+
Returns
List of positions.
+ +

Definition at line 860 of file GooseEYE.h.

+ +
+
+ +

◆ centers()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< int > GooseEYE::Clusters::centers () const
+
+inline
+
+ +

Return label only in the center of gravity (1..n).

+
Returns
'Image'.
+ +

Definition at line 843 of file GooseEYE.h.

+ +
+
+ +

◆ labels()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< int > GooseEYE::Clusters::labels () const
+
+inline
+
+ +

Return labels (1..n).

+
Returns
'Image'.
+ +

Definition at line 834 of file GooseEYE.h.

+ +
+
+ +

◆ sizes()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::tensor< size_t, 1 > GooseEYE::Clusters::sizes () const
+
+inline
+
+ +

Return size per cluster.

+
Returns
List.
+ +

Definition at line 883 of file GooseEYE.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classGooseEYE_1_1Clusters.js b/classGooseEYE_1_1Clusters.js new file mode 100644 index 00000000..e841f209 --- /dev/null +++ b/classGooseEYE_1_1Clusters.js @@ -0,0 +1,9 @@ +var classGooseEYE_1_1Clusters = +[ + [ "Clusters", "classGooseEYE_1_1Clusters.html#a7d29a717247b02b7510c3598472eaa69", null ], + [ "Clusters", "classGooseEYE_1_1Clusters.html#a6e1d03b02054326ab6cb3eaead9ca0c5", null ], + [ "center_positions", "classGooseEYE_1_1Clusters.html#af483dfcd99cbde06752540688f65a630", null ], + [ "centers", "classGooseEYE_1_1Clusters.html#a0831a128220907113b24b1fcd8ebb292", null ], + [ "labels", "classGooseEYE_1_1Clusters.html#aa21d853c25654cc1814600baba3abdcf", null ], + [ "sizes", "classGooseEYE_1_1Clusters.html#a1b80ce240c3308714115338d190b353a", null ] +]; \ No newline at end of file diff --git a/classGooseEYE_1_1Ensemble-members.html b/classGooseEYE_1_1Ensemble-members.html new file mode 100644 index 00000000..3e669c54 --- /dev/null +++ b/classGooseEYE_1_1Ensemble-members.html @@ -0,0 +1,139 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE::Ensemble Member List
+
+
+ +

This is the complete list of members for GooseEYE::Ensemble, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
C2(const T &f, const T &g)GooseEYE::Ensembleinline
C2(const T &f, const T &g, const M &fmask, const M &gmask)GooseEYE::Ensembleinline
data_first() constGooseEYE::Ensembleinline
data_second() constGooseEYE::Ensembleinline
distance() constGooseEYE::Ensembleinline
distance(size_t axis) constGooseEYE::Ensembleinline
distance(const std::vector< double > &h) constGooseEYE::Ensembleinline
distance(const std::vector< double > &h, size_t axis) constGooseEYE::Ensembleinline
Ensemble()=defaultGooseEYE::Ensemble
Ensemble(const std::vector< size_t > &roi, bool periodic=true, bool variance=true)GooseEYE::Ensembleinline
heightheight(const T &f)GooseEYE::Ensembleinline
heightheight(const T &f, const M &fmask)GooseEYE::Ensembleinline
L(const T &f, path_mode mode=path_mode::Bresenham)GooseEYE::Ensembleinline
mean(const T &f)GooseEYE::Ensemble
mean(const T &f, const M &fmask)GooseEYE::Ensemble
norm() constGooseEYE::Ensembleinline
result() constGooseEYE::Ensembleinline
S2(const T &f, const T &g)GooseEYE::Ensembleinline
S2(const T &f, const T &g, const M &fmask, const M &gmask)GooseEYE::Ensembleinline
variance() constGooseEYE::Ensembleinline
W2(const T &w, const T &f)GooseEYE::Ensembleinline
W2(const T &w, const T &f, const M &fmask)GooseEYE::Ensembleinline
W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)GooseEYE::Ensembleinline
W2c(const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham)GooseEYE::Ensembleinline
+
+ + + + diff --git a/classGooseEYE_1_1Ensemble.html b/classGooseEYE_1_1Ensemble.html new file mode 100644 index 00000000..4500ea82 --- /dev/null +++ b/classGooseEYE_1_1Ensemble.html @@ -0,0 +1,1261 @@ + + + + + + + +GooseEYE: GooseEYE::Ensemble Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE::Ensemble Class Reference
+
+
+ +

Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data. + More...

+ +

#include <GooseEYE/GooseEYE.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Ensemble ()=default
 Constructor.
 
 Ensemble (const std::vector< size_t > &roi, bool periodic=true, bool variance=true)
 Constructor.
 
array_type::array< double > result () const
 Get ensemble average.
 
array_type::array< double > variance () const
 Get ensemble variance.
 
array_type::array< double > data_first () const
 Get raw-data: ensemble sum of the first moment: x_1 + x_2 + ...
 
array_type::array< double > data_second () const
 Get raw-data: ensemble sum of the second moment: x_1^2 + x_2^2 + ...
 
array_type::array< double > norm () const
 Get raw-data: normalisation (number of measurements per pixel).
 
array_type::array< double > distance () const
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
array_type::array< double > distance (size_t axis) const
 Get the relative distance of each pixel in the 'region-of-interest' to its center, along a specific axis (distance can now be positive and negative).
 
array_type::array< double > distance (const std::vector< double > &h) const
 Get the relative distance of each pixel in the 'region-of-interest' to its center.
 
array_type::array< double > distance (const std::vector< double > &h, size_t axis) const
 Get the relative distance of each pixel in the 'region-of-interest' to its center, along a specific axis (distance can now be positive and negative).
 
template<class T >
void mean (const T &f)
 Add realization to arithmetic mean.
 
template<class T , class M >
void mean (const T &f, const M &fmask)
 Add realization to arithmetic mean.
 
template<class T >
void S2 (const T &f, const T &g)
 Add realization to 2-point correlation: P(f(i) * g(i + di)).
 
template<class T , class M >
void S2 (const T &f, const T &g, const M &fmask, const M &gmask)
 Add realization to 2-point correlation: P(f(i) * g(i + di)).
 
template<class T >
void C2 (const T &f, const T &g)
 Add realization to 2-point cluster function: P(f(i) == g(i + di)).
 
template<class T , class M >
void C2 (const T &f, const T &g, const M &fmask, const M &gmask)
 Add realization to 2-point cluster function: P(f(i) == g(i + di)).
 
template<class T >
void W2 (const T &w, const T &f)
 Add realization to weighted 2-point correlation.
 
template<class T , class M >
void W2 (const T &w, const T &f, const M &fmask)
 Add realization to weighted 2-point correlation.
 
template<class C , class T >
void W2c (const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)
 Add realization to collapsed weighted 2-point correlation.
 
template<class C , class T , class M >
void W2c (const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham)
 Add realization to collapsed weighted 2-point correlation.
 
template<class T >
void heightheight (const T &f)
 Add realization to height-height correlation.
 
template<class T , class M >
void heightheight (const T &f, const M &fmask)
 Add realization to height-height correlation.
 
template<class T >
void L (const T &f, path_mode mode=path_mode::Bresenham)
 Add realization to lineal-path function.
 
+

Detailed Description

+

Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data.

+

Note:

    +
  • One class instance can only be used to compute one statistical measure.
  • +
  • Simple wrapper functions are provided to compute the statistical measure on one image.
  • +
  • The normalized result can be read at any moment using 'result', without affecting the raw-data.
  • +
  • The raw-data and normalization are separately stored as class member variables.
  • +
+ +

Definition at line 1227 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ Ensemble()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
GooseEYE::Ensemble::Ensemble (const std::vector< size_t > & roi,
bool periodic = true,
bool variance = true 
)
+
+inline
+
+ +

Constructor.

+
Parameters
+ + + + +
roiShape of the 'region-of-interest' on which the statistics are computed.
periodicSwitch to assume image periodic.
varianceSwitch to compute the variance together with the mean.
+
+
+ +

Definition at line 14 of file Ensemble.hpp.

+ +
+
+

Member Function Documentation

+ +

◆ C2() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::C2 (const T & f,
const T & g 
)
+
+inline
+
+ +

Add realization to 2-point cluster function: P(f(i) == g(i + di)).

+
Parameters
+ + + +
fThe image.
gThe comparison image.
+
+
+ +

Definition at line 84 of file Ensemble_C2.hpp.

+ +
+
+ +

◆ C2() [2/2]

+ +
+
+
+template<class T , class M >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::C2 (const T & f,
const T & g,
const M & fmask,
const M & gmask 
)
+
+inline
+
+ +

Add realization to 2-point cluster function: P(f(i) == g(i + di)).

+
Parameters
+ + + + + +
fThe image.
gThe comparison image.
fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
gmaskMask certain pixels of g (binary, 1: masked, 0: not masked).
+
+
+ +

Definition at line 15 of file Ensemble_C2.hpp.

+ +
+
+ +

◆ data_first()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< double > GooseEYE::Ensemble::data_first () const
+
+inline
+
+ +

Get raw-data: ensemble sum of the first moment: x_1 + x_2 + ...

+
Returns
The sum along the 'region-of-interest' set at construction.
+ +

Definition at line 53 of file Ensemble.hpp.

+ +
+
+ +

◆ data_second()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< double > GooseEYE::Ensemble::data_second () const
+
+inline
+
+ +

Get raw-data: ensemble sum of the second moment: x_1^2 + x_2^2 + ...

+
Returns
The sum along the 'region-of-interest' set at construction.
+ +

Definition at line 59 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [1/4]

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< double > GooseEYE::Ensemble::distance () const
+
+inline
+
+ +

Get the relative distance of each pixel in the 'region-of-interest' to its center.

+
Returns
The distances along the 'region-of-interest' set at construction.
+ +

Definition at line 103 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [2/4]

+ +
+
+ + + + + +
+ + + + + + + + +
array_type::array< double > GooseEYE::Ensemble::distance (const std::vector< double > & h) const
+
+inline
+
+ +

Get the relative distance of each pixel in the 'region-of-interest' to its center.

+

Convert the distance to physical dimensions.

Parameters
+ + +
hThe physical dimensions of one pixel (in each direction).
+
+
+
Returns
The distances along the 'region-of-interest' set at construction.
+ +

Definition at line 114 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [3/4]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
array_type::array< double > GooseEYE::Ensemble::distance (const std::vector< double > & h,
size_t axis 
) const
+
+inline
+
+ +

Get the relative distance of each pixel in the 'region-of-interest' to its center, along a specific axis (distance can now be positive and negative).

+

Convert the distance to physical dimensions.

Parameters
+ + + +
hThe physical dimensions of one pixel (in each direction).
axisSelect axis.
+
+
+
Returns
The distances along the 'region-of-interest' set at construction.
+ +

Definition at line 127 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [4/4]

+ +
+
+ + + + + +
+ + + + + + + + +
array_type::array< double > GooseEYE::Ensemble::distance (size_t axis) const
+
+inline
+
+ +

Get the relative distance of each pixel in the 'region-of-interest' to its center, along a specific axis (distance can now be positive and negative).

+
Parameters
+ + +
axisSelect axis.
+
+
+
Returns
The distances along the 'region-of-interest' set at construction.
+ +

Definition at line 71 of file Ensemble.hpp.

+ +
+
+ +

◆ heightheight() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void GooseEYE::Ensemble::heightheight (const T & f)
+
+inline
+
+ +

Add realization to height-height correlation.

+

The height-height correlation, at position \( \Delta i \), is defined as: \( \frac{1}{N} \left( \sum_{i=1}^{N} (f_i - f_{i + \Delta i})^2 \right)^{1/2} \)

+
Parameters
+ + +
fThe image.
+
+
+ +

Definition at line 80 of file Ensemble_heightheight.hpp.

+ +
+
+ +

◆ heightheight() [2/2]

+ +
+
+
+template<class T , class M >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::heightheight (const T & f,
const M & fmask 
)
+
+inline
+
+ +

Add realization to height-height correlation.

+

The height-height correlation, at position \( \Delta i \), is defined as: \( \frac{1}{N} \left( \sum_{i=1}^{N} (f_i - f_{i + \Delta i})^2 \right)^{1/2} \)

+
Parameters
+ + + +
fThe image.
fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
+
+
+ +

Definition at line 15 of file Ensemble_heightheight.hpp.

+ +
+
+ +

◆ L()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::L (const T & f,
path_mode mode = path_mode::Bresenham 
)
+
+inline
+
+ +

Add realization to lineal-path function.

+
Parameters
+ + + +
fThe image.
modeMethod to use (see "path_mode").
+
+
+ +

Definition at line 15 of file Ensemble_L.hpp.

+ +
+
+ +

◆ mean() [1/2]

+ +
+
+
+template<class T >
+ + + + + + + + +
void GooseEYE::Ensemble::mean (const T & f)
+
+ +

Add realization to arithmetic mean.

+
Parameters
+ + +
fThe image.
+
+
+ +

Definition at line 15 of file Ensemble_mean.hpp.

+ +
+
+ +

◆ mean() [2/2]

+ +
+
+
+template<class T , class M >
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::mean (const T & f,
const M & fmask 
)
+
+ +

Add realization to arithmetic mean.

+
Parameters
+ + + +
fThe image.
fmaskMask certain pixels (binary, 1: masked, 0: not masked).
+
+
+ +

Definition at line 28 of file Ensemble_mean.hpp.

+ +
+
+ +

◆ norm()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< double > GooseEYE::Ensemble::norm () const
+
+inline
+
+ +

Get raw-data: normalisation (number of measurements per pixel).

+
Returns
The norm along the 'region-of-interest' set at construction.
+ +

Definition at line 65 of file Ensemble.hpp.

+ +
+
+ +

◆ result()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< double > GooseEYE::Ensemble::result () const
+
+inline
+
+ +

Get ensemble average.

+
Returns
The average along the 'region-of-interest' set at construction.
+ +

Definition at line 26 of file Ensemble.hpp.

+ +
+
+ +

◆ S2() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::S2 (const T & f,
const T & g 
)
+
+inline
+
+ +

Add realization to 2-point correlation: P(f(i) * g(i + di)).

+
Parameters
+ + + +
fThe image.
gThe comparison image.
+
+
+ +

Definition at line 84 of file Ensemble_S2.hpp.

+ +
+
+ +

◆ S2() [2/2]

+ +
+
+
+template<class T , class M >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::S2 (const T & f,
const T & g,
const M & fmask,
const M & gmask 
)
+
+inline
+
+ +

Add realization to 2-point correlation: P(f(i) * g(i + di)).

+
Parameters
+ + + + + +
fThe image.
gThe comparison image.
fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
gmaskMask certain pixels of g (binary, 1: masked, 0: not masked).
+
+
+ +

Definition at line 15 of file Ensemble_S2.hpp.

+ +
+
+ +

◆ variance()

+ +
+
+ + + + + +
+ + + + + + + +
array_type::array< double > GooseEYE::Ensemble::variance () const
+
+inline
+
+ +

Get ensemble variance.

+
Returns
The variance along the 'region-of-interest' set at construction.
+ +

Definition at line 37 of file Ensemble.hpp.

+ +
+
+ +

◆ W2() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::W2 (const T & w,
const T & f 
)
+
+inline
+
+ +

Add realization to weighted 2-point correlation.

+
Parameters
+ + + +
wThe weights.
fThe image.
+
+
+ +

Definition at line 76 of file Ensemble_W2.hpp.

+ +
+
+ +

◆ W2() [2/2]

+ +
+
+
+template<class T , class M >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::W2 (const T & w,
const T & f,
const M & fmask 
)
+
+inline
+
+ +

Add realization to weighted 2-point correlation.

+
Parameters
+ + + + +
wThe weights.
fThe image.
fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
+
+
+ +

Definition at line 15 of file Ensemble_W2.hpp.

+ +
+
+ +

◆ W2c() [1/2]

+ +
+
+
+template<class C , class T , class M >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::W2c (const C & clusters,
const C & centers,
const T & f,
const M & fmask,
path_mode mode = path_mode::Bresenham 
)
+
+inline
+
+ +

Add realization to collapsed weighted 2-point correlation.

+
Parameters
+ + + + + + +
clustersThe clusters.
centersThe cluster-centers: label only at the center.
fThe image.
modeMethod to use (see "path_mode").
fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
+
+
+ +

Definition at line 16 of file Ensemble_W2c.hpp.

+ +
+
+ +

◆ W2c() [2/2]

+ +
+
+
+template<class C , class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void GooseEYE::Ensemble::W2c (const C & clusters,
const C & centers,
const T & f,
path_mode mode = path_mode::Bresenham 
)
+
+inline
+
+ +

Add realization to collapsed weighted 2-point correlation.

+
Parameters
+ + + + + +
clustersThe clusters.
centersThe cluster-centers: label only at the center.
fThe image.
modeMethod to use (see "path_mode").
+
+
+ +

Definition at line 123 of file Ensemble_W2c.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classGooseEYE_1_1Ensemble.js b/classGooseEYE_1_1Ensemble.js new file mode 100644 index 00000000..496d2916 --- /dev/null +++ b/classGooseEYE_1_1Ensemble.js @@ -0,0 +1,27 @@ +var classGooseEYE_1_1Ensemble = +[ + [ "Ensemble", "classGooseEYE_1_1Ensemble.html#a62c06a26344057024d5380c7b29199c4", null ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html#ab955729bb22bd3f210c97ff024136b10", null ], + [ "C2", "classGooseEYE_1_1Ensemble.html#af52ed25e986f699a846e09498fd25928", null ], + [ "C2", "classGooseEYE_1_1Ensemble.html#aa6b103383499bbce8a6dc4caebbfe710", null ], + [ "data_first", "classGooseEYE_1_1Ensemble.html#aa0c38a6aebc69df4cddeb4eb4c75e168", null ], + [ "data_second", "classGooseEYE_1_1Ensemble.html#a4ba619521dc4bb98711f9ef5810b83db", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#abd9e39c44a7363332312a57b72ce4115", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#a9ef3f93cdd7ec475454d57e8173f328e", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#ab77c6d1691fe0aefe770255d5948a404", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#ae77e609fabe6882c93e43915d817db45", null ], + [ "heightheight", "classGooseEYE_1_1Ensemble.html#a7906697fd025f364d280c04bf2c0f0a9", null ], + [ "heightheight", "classGooseEYE_1_1Ensemble.html#a798f357b778866b8824c6e5ec1d23b90", null ], + [ "L", "classGooseEYE_1_1Ensemble.html#a202f65fb4aa0358814a9f69e0e1de270", null ], + [ "mean", "classGooseEYE_1_1Ensemble.html#a06699953adf0931ee6cf3a150cf3d306", null ], + [ "mean", "classGooseEYE_1_1Ensemble.html#ad00333335de40cb6bfb1d1c410993cc0", null ], + [ "norm", "classGooseEYE_1_1Ensemble.html#ae970b7a00ed2e1ce8a631fb54fed206a", null ], + [ "result", "classGooseEYE_1_1Ensemble.html#aca0906b15fc229f1183e6cd45c398c0d", null ], + [ "S2", "classGooseEYE_1_1Ensemble.html#a3679472fd2dbcc55323beb3f8e5fa176", null ], + [ "S2", "classGooseEYE_1_1Ensemble.html#ab26b64c4d1dc58f5c9fedcc1fadc9f60", null ], + [ "variance", "classGooseEYE_1_1Ensemble.html#a75973e36d209e8a0b2a61c22a4bb7a4e", null ], + [ "W2", "classGooseEYE_1_1Ensemble.html#aaf81f5284e4e67d0e740a8a21d6072b4", null ], + [ "W2", "classGooseEYE_1_1Ensemble.html#a129ef0a0165a13f8c9d016e8bb02c7e3", null ], + [ "W2c", "classGooseEYE_1_1Ensemble.html#a99457cc94be42c86d6de699aa779ebea", null ], + [ "W2c", "classGooseEYE_1_1Ensemble.html#a95a025460b591dc74caeab3386e9cd7d", null ] +]; \ No newline at end of file diff --git a/classes.html b/classes.html new file mode 100644 index 00000000..838726b2 --- /dev/null +++ b/classes.html @@ -0,0 +1,121 @@ + + + + + + + +GooseEYE: Class Index + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
C | E
+ +
+
+ + + + diff --git a/closed.png b/closed.png new file mode 100644 index 00000000..98cc2c90 Binary files /dev/null and b/closed.png differ diff --git a/config_8h.html b/config_8h.html new file mode 100644 index 00000000..7e48a0a4 --- /dev/null +++ b/config_8h.html @@ -0,0 +1,272 @@ + + + + + + + +GooseEYE: GooseEYE/config.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
config.h File Reference
+
+
+
#include <algorithm>
+#include <assert.h>
+#include <cstdlib>
+#include <exception>
+#include <iomanip>
+#include <iostream>
+#include <limits>
+#include <map>
+#include <math.h>
+#include <memory>
+#include <numeric>
+#include <string>
+#include <vector>
+#include <xtensor/xadapt.hpp>
+#include <xtensor/xarray.hpp>
+#include <xtensor/xio.hpp>
+#include <xtensor/xmath.hpp>
+#include <xtensor/xpad.hpp>
+#include <xtensor/xsort.hpp>
+#include <xtensor/xtensor.hpp>
+#include <xtensor/xview.hpp>
+
+

Go to the source code of this file.

+ + + + + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
namespace  GooseEYE::array_type
 Container type.
 
+ + + + + + + + + + +

+Macros

#define GOOSEEYE_ASSERT(expr, assertion)
 All assertions are implemented as:
 
#define GOOSEEYE_WARNING(message)   GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
 Warnings are implemented as:
 
#define GOOSEEYE_WARNING_PYTHON(message)
 Warnings specific to the Python API are implemented as:
 
+ + + + + + + + + +

+Typedefs

template<typename T , size_t N>
using GooseEYE::array_type::tensor = xt::xtensor< T, N >
 Fixed (static) rank array.
 
template<typename T >
using GooseEYE::array_type::array = xt::xarray< T >
 Dynamic rank array.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file config.h.

+

Macro Definition Documentation

+ +

◆ GOOSEEYE_ASSERT

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define GOOSEEYE_ASSERT( expr,
 assertion 
)
+
+ +

All assertions are implemented as:

+
GOOSEEYE_ASSERT(...)
+

They can be enabled by:

#define GOOSEEYE_ENABLE_ASSERT
+

(before including GooseEYE). The advantage is that:

+
    +
  • File and line-number are displayed if the assertion fails.
  • +
  • GooseEYE's assertions can be enabled/disabled independently from those of other libraries.
  • +
+
Exceptions
+ + +
std::runtime_error
+
+
+ +

Definition at line 84 of file config.h.

+ +
+
+ +

◆ GOOSEEYE_WARNING

+ +
+
+ + + + + + + + +
#define GOOSEEYE_WARNING( message)   GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
+ +

Warnings are implemented as:

+
 GOOSEEYE_WARNING(...)
+

They can be disables by:

 #define GOOSEEYE_DISABLE_WARNING
+
+

Definition at line 97 of file config.h.

+ +
+
+ +

◆ GOOSEEYE_WARNING_PYTHON

+ +
+
+ + + + + + + + +
#define GOOSEEYE_WARNING_PYTHON( message)
+
+ +

Warnings specific to the Python API are implemented as:

+
 GOOSEEYE_WARNING_PYTHON(...)
+

They can be enabled by:

 #define GOOSEEYE_ENABLE_WARNING_PYTHON
+
+

Definition at line 115 of file config.h.

+ +
+
+
+
+ + + + diff --git a/config_8h.js b/config_8h.js new file mode 100644 index 00000000..295d1753 --- /dev/null +++ b/config_8h.js @@ -0,0 +1,8 @@ +var config_8h = +[ + [ "GOOSEEYE_ASSERT", "config_8h.html#a5f979e87d380e183a469f67875767599", null ], + [ "GOOSEEYE_WARNING", "config_8h.html#a37bc6256ee9c5c2734fbb59e6cd64a46", null ], + [ "GOOSEEYE_WARNING_PYTHON", "config_8h.html#aa6b4e708f9162a83e53eb97bfd0298ca", null ], + [ "array", "config_8h.html#ab865d9e3da9ba91db40f43c14b26f51f", null ], + [ "tensor", "config_8h.html#a2990d2b991e50171d4d24abe34bf15e3", null ] +]; \ No newline at end of file diff --git a/config_8h_source.html b/config_8h_source.html new file mode 100644 index 00000000..0245a930 --- /dev/null +++ b/config_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +GooseEYE: GooseEYE/config.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
config.h
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_CONFIG_H
+
8#define GOOSEEYE_CONFIG_H
+
9
+
13#define _USE_MATH_DEFINES
+
18#include <algorithm>
+
19#include <assert.h>
+
20#include <cstdlib>
+
21#include <exception>
+
22#include <iomanip>
+
23#include <iostream>
+
24#include <limits>
+
25#include <map>
+
26#include <math.h>
+
27#include <memory>
+
28#include <numeric>
+
29#include <string>
+
30#include <vector>
+
31
+
32#include <xtensor/xadapt.hpp>
+
33#include <xtensor/xarray.hpp>
+
34#include <xtensor/xio.hpp>
+
35#include <xtensor/xmath.hpp>
+
36#include <xtensor/xpad.hpp>
+
37#include <xtensor/xsort.hpp>
+
38#include <xtensor/xtensor.hpp>
+
39#include <xtensor/xview.hpp>
+
40
+
44#define Q(x) #x
+
45#define QUOTE(x) Q(x)
+
46
+
47#define GOOSEEYE_WARNING_IMPL(message, file, line, function) \
+
48 std::cout << std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + \
+
49 ")" + ": " message ") \n\t";
+
50
+
51#define GOOSEEYE_ASSERT_IMPL(expr, assertion, file, line, function) \
+
52 if (!(expr)) { \
+
53 throw assertion( \
+
54 std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + ")" + \
+
55 ": assertion failed (" #expr ") \n\t"); \
+
56 }
+
57
+
58#define SIGN(a) ((a < 0) ? -1 : a > 0 ? 1 : 0)
+
80#ifdef GOOSEEYE_ENABLE_ASSERT
+
81#define GOOSEEYE_ASSERT(expr, assertion) \
+
82 GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
+
83#else
+
84#define GOOSEEYE_ASSERT(expr, assertion)
+
85#endif
+
86
+
96#ifndef GOOSEEYE_DISABLE_WARNING
+
97#define GOOSEEYE_WARNING(message) GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
98#else
+
99#define GOOSEEYE_WARNING(message)
+
100#endif
+
101
+
111#ifdef GOOSEEYE_ENABLE_WARNING_PYTHON
+
112#define GOOSEEYE_WARNING_PYTHON(message) \
+
113 GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
114#else
+
115#define GOOSEEYE_WARNING_PYTHON(message)
+
116#endif
+
117
+
+
121namespace GooseEYE {
+
122
+
+
126namespace array_type {
+
127
+
128#ifdef GOOSEEYE_USE_XTENSOR_PYTHON
+
129
+
133template <typename T, size_t N>
+
134using tensor = xt::pytensor<T, N>;
+
135
+
139template <typename T>
+
140using array = xt::pyarray<T>;
+
141
+
142#else
+
143
+
147template <typename T, size_t N>
+
148using tensor = xt::xtensor<T, N>;
+
149
+
153template <typename T>
+
154using array = xt::xarray<T>;
+
155
+
156#endif
+
157
+
158} // namespace array_type
+
+
159
+
160} // namespace GooseEYE
+
+
161
+
162#endif
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
xt::xarray< T > array
Dynamic rank array.
Definition config.h:154
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/darkmode_toggle.js b/darkmode_toggle.js new file mode 100644 index 00000000..0b27d4f6 --- /dev/null +++ b/darkmode_toggle.js @@ -0,0 +1,281 @@ +/** + +The code below is based on the Doxygen Awesome project with some minor modifications +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DarkModeToggle extends HTMLElement { + static icon = ''; + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DarkModeToggle.enableDarkMode(DarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('dark-mode-toggle') + toggleButton.title = DarkModeToggle.title + toggleButton.innerHTML = DarkModeToggle.icon + toggleButton.tabIndex = 0; + + function addButton() { + var titleArea = document.getElementById("titlearea"); + var searchBox = document.getElementById("MSearchBox"); + var mainMenu = document.getElementById("main-menu"); + var navRow1 = document.getElementById("navrow1"); + var mainMenuVisible = false; + if (mainMenu) { + var menuStyle = window.getComputedStyle(mainMenu); + mainMenuVisible = menuStyle.display!=='none' + } + var searchBoxPos1 = document.getElementById("searchBoxPos1"); + if (searchBox) { // (1) search box visible + searchBox.parentNode.appendChild(toggleButton) + } else if (navRow1) { // (2) no search box, static menu bar + var li = document.createElement('li'); + li.style = 'float: right;' + li.appendChild(toggleButton); + toggleButton.style = 'width: 24px; height: 25px; padding-top: 11px; float: right;'; + var row = document.querySelector('#navrow1 > ul:first-of-type'); + row.appendChild(li) + } else if (mainMenu && mainMenuVisible) { // (3) no search box + dynamic menu bar expanded + var li = document.createElement('li'); + li.style = 'float: right;' + li.appendChild(toggleButton); + toggleButton.style = 'width: 14px; height: 36px; padding-top: 10px; float: right;'; + mainMenu.appendChild(li) + } else if (searchBoxPos1) { // (4) no search box + dynamic menu bar collapsed + toggleButton.style = 'width: 24px; height: 36px; padding-top: 10px; float: right;'; + searchBoxPos1.style = 'top: 0px;' + searchBoxPos1.appendChild(toggleButton); + } else if (titleArea) { // (5) no search box and no navigation tabs + toggleButton.style = 'width: 24px; height: 24px; position: absolute; right: 0px; top: 34px;'; + titleArea.append(toggleButton); + } + } + + $(document).ready(function(){ + addButton(); + }) + $(window).resize(function(){ + addButton(); + }) + var inFocus = false; + $(document).focusin(function(e) { + inFocus = true; + }) + $(document).focusout(function(e) { + inFocus = false; + }) + $(document).keyup(function(e) { + if (e.keyCode==27 && !inFocus) { // escape key maps to keycode `27` + e.stopPropagation(); + DarkModeToggle.userPreference = !DarkModeToggle.userPreference + } + }) + DarkModeToggle.setDarkModeVisibility(DarkModeToggle.darkModeEnabled) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + this.onkeypress=function(e){if (e.keyCode==13) { this.toggleDarkMode(); }}; + } + + static createCookie(name, value, days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + var expires = "; expires=" + date.toGMTString(); + } + else var expires = ""; + + document.cookie = name + "=" + value + expires + "; path=/"; + } + + static readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); + } + return null; + } + + static eraseCookie(name) { + DarkModeToggle.createCookie(name, "", -1); + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + static get prefersDarkModeInLightMode() { + if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies + return localStorage.getItem(DarkModeToggle.prefersDarkModeInLightModeKey) + } else { // Other browsers support cookies in combination with file:// but not localStorage + return DarkModeToggle.readCookie('doxygen_prefers_dark')=='1' + } + } + + static set prefersDarkModeInLightMode(preference) { + if (window.chrome) { + if (preference) { + localStorage.setItem(DarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if (preference) { + DarkModeToggle.createCookie('doxygen_prefers_dark','1',365) + } else { + DarkModeToggle.eraseCookie('doxygen_prefers_dark') + } + } + } + + static get prefersLightModeInDarkMode() { + if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies + return localStorage.getItem(DarkModeToggle.prefersLightModeInDarkModeKey) + } else { // Other browsers support cookies in combination with file:// but not localStorage + return DarkModeToggle.readCookie('doxygen_prefers_light')=='1' + } + } + + static set prefersLightModeInDarkMode(preference) { + if (window.chrome) { + if (preference) { + localStorage.setItem(DarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DarkModeToggle.prefersLightModeInDarkModeKey) + } + } else { + if (preference) { + DarkModeToggle.createCookie('doxygen_prefers_light','1',365) + } else { + DarkModeToggle.eraseCookie('doxygen_prefers_light') + } + } + } + + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DarkModeToggle.systemPreference && DarkModeToggle.prefersDarkModeInLightMode) || + (DarkModeToggle.systemPreference && !DarkModeToggle.prefersLightModeInDarkMode) + } + + static set userPreference(userPreference) { + DarkModeToggle.darkModeEnabled = userPreference + if (!userPreference) { + if (DarkModeToggle.systemPreference) { + DarkModeToggle.prefersLightModeInDarkMode = true + } else { + DarkModeToggle.prefersDarkModeInLightMode = false + } + } else { + if (!DarkModeToggle.systemPreference) { + DarkModeToggle.prefersDarkModeInLightMode = true + } else { + DarkModeToggle.prefersLightModeInDarkMode = false + } + } + DarkModeToggle.onUserPreferenceChanged() + } + + static setDarkModeVisibility(enable) { + var darkModeStyle, lightModeStyle; + if(enable) { + darkModeStyle = 'inline-block'; + lightModeStyle = 'none' + } else { + darkModeStyle = 'none'; + lightModeStyle = 'inline-block' + } + document.querySelectorAll('.dark-mode-visible').forEach(function(el) { + el.style.display = darkModeStyle; + }); + document.querySelectorAll('.light-mode-visible').forEach(function(el) { + el.style.display = lightModeStyle; + }); + } + static enableDarkMode(enable) { + if(enable) { + DarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + DarkModeToggle.setDarkModeVisibility(enable) + } + + static onSystemPreferenceChanged() { + DarkModeToggle.darkModeEnabled = DarkModeToggle.userPreference + DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DarkModeToggle.userPreference = !DarkModeToggle.userPreference + } +} + +customElements.define("dark-mode-toggle", DarkModeToggle); + +DarkModeToggle.init(); diff --git a/detail_8hpp.html b/detail_8hpp.html new file mode 100644 index 00000000..32e282d3 --- /dev/null +++ b/detail_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
detail.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file detail.hpp.

+
+
+ + + + diff --git a/detail_8hpp_source.html b/detail_8hpp_source.html new file mode 100644 index 00000000..ad8936e2 --- /dev/null +++ b/detail_8hpp_source.html @@ -0,0 +1,532 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
detail.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_DETAIL_HPP
+
8#define GOOSEEYE_DETAIL_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13namespace detail {
+
14
+
15/*
+
16Get the axis after converting an array to 3d.
+
17See: https://xtensor.readthedocs.io/en/latest/api/xmanipulation.html?highlight=atleast_Nd
+
18
+
19@arg rank : Rank of the input array.
+
20@arg axis : Axis along the input array.
+
21@ret Axis along the 3d-equivalent-array.
+
22*/
+
23inline size_t atleast_3d_axis(size_t rank, size_t axis)
+
24{
+
25 size_t N = 3;
+
26 assert(axis < rank);
+
27 assert(rank <= N);
+
28 size_t end = static_cast<size_t>(std::round(double(N - rank) / double(N)));
+
29 return axis + end;
+
30}
+
31
+
32/*
+
33Get the axes after converting an array to 3d.
+
34See: https://xtensor.readthedocs.io/en/latest/api/xmanipulation.html?highlight=atleast_Nd
+
35
+
36@arg rank : Rank of the input array.
+
37@arg axes : Axes along the input array.
+
38@ret Axes along the 3d-equivalent-array.
+
39*/
+ +
41atleast_3d_axes(size_t rank, const array_type::tensor<size_t, 1>& axes)
+
42{
+
43 array_type::tensor<size_t, 1> ret = xt::empty_like(axes);
+
44 for (size_t i = 0; i < axes.size(); ++i) {
+
45 ret(i) = atleast_3d_axis(rank, axes(i));
+
46 }
+
47 return ret;
+
48}
+
49
+
50/*
+
51Get the axes after converting an array to 3d.
+
52See: https://xtensor.readthedocs.io/en/latest/api/xmanipulation.html?highlight=atleast_Nd
+
53
+
54@arg rank : Rank of the input array.
+
55@ret Axes along the 3d-equivalent-array.
+
56*/
+
57inline array_type::tensor<size_t, 1> atleast_3d_axes(size_t rank)
+
58{
+
59 return atleast_3d_axes(rank, xt::arange<size_t>(rank));
+
60}
+
61
+
62/*
+
63Return shape as vector.
+
64
+
65@arg mat : An n-d array.
+
66@ret The shape of `arg` as `std::vector<size_t>`.
+
67*/
+
68template <class T>
+
69inline std::vector<size_t> shape(T&& mat)
+
70{
+
71 return std::vector<size_t>(mat.shape().cbegin(), mat.shape().cend());
+
72}
+
73
+
74/*
+
75Compute "shape / 2".
+
76
+
77@arg shape : A vector.
+
78@ret The floored-result.
+
79*/
+
80inline std::vector<size_t> half_shape(const std::vector<size_t>& shape)
+
81{
+
82 std::vector<size_t> ret = shape;
+
83
+
84 for (size_t i = 0; i < ret.size(); ++i) {
+
85 ret[i] = (shape[i] - shape[i] % 2) / 2;
+
86 }
+
87
+
88 return ret;
+
89}
+
90
+
91/*
+
92Compute padding-width for a certain kernel.
+
93This is the number of voxels by which a kernel will overlap along each axis when it is
+
94convoluted over an image.
+
95The output is {{begin_1, end_1}, {begin_2, end_2}, ... {begin_N, end_N}}
+
96
+
97@arg shape : Shape of the kernel.
+
98@ret Pad-width.
+
99*/
+
100inline std::vector<std::vector<size_t>> pad_width(const std::vector<size_t>& shape)
+
101{
+
102 std::vector<std::vector<size_t>> pad(shape.size(), std::vector<size_t>(2));
+
103
+
104 for (size_t i = 0; i < shape.size(); ++i) {
+
105 if (shape[i] % 2 == 0) {
+
106 pad[i][0] = shape[i] / 2 - 1;
+
107 pad[i][1] = shape[i] / 2;
+
108 }
+
109 else {
+
110 pad[i][0] = (shape[i] - 1) / 2;
+
111 pad[i][1] = (shape[i] - 1) / 2;
+
112 }
+
113 }
+
114
+
115 return pad;
+
116}
+
117
+
118/*
+
119Overload to compute directly on the object itself, not on its shape.
+
120*/
+
121template <class T>
+
122inline std::vector<std::vector<size_t>> pad_width(const T& a)
+
123{
+
124 std::vector<size_t> shape(a.shape().cbegin(), a.shape().cend());
+
125 return pad_width(shape);
+
126}
+
127
+
128/*
+
129Compute pixel-path using the Bresenham-algorithm.
+
130See: https://www.geeksforgeeks.org/bresenhams-algorithm-for-3-d-line-drawing/
+
131
+
132@arg xa : Pixel coordinate (e.g. {0, 0, 0}).
+
133@arg xb : Pixel coordinate (e.g. {10, 5, 0}).
+
134@ret The path: the coordinate of one pixel per row.
+
135*/
+
136namespace path {
+
137
+
138template <class T>
+
139inline array_type::tensor<int, 2> bresenham(const T& xa, const T& xb)
+
140{
+
141 int ndim = static_cast<int>(xa.size());
+
142 std::vector<int> ret;
+
143
+
144 // see http://www.luberth.com/plotter/line3d.c.txt.html
+
145 int a[3], s[3], x[3], d[3], in[2], j, i, iin, nnz = 0;
+
146
+
147 // set defaults
+
148 for (i = 0; i < 3; i++) {
+
149 a[i] = 1;
+
150 s[i] = 0;
+
151 x[i] = 0;
+
152 d[i] = 0;
+
153 }
+
154
+
155 // calculate:
+
156 // absolute distance, set to "1" if the distance is zero
+
157 // sign of the distance (can be -1/+1 or 0)
+
158 // current position (temporary value)
+
159 for (i = 0; i < ndim; i++) {
+
160 a[i] = std::abs((int)xb[i] - (int)xa[i]) << 1;
+
161 s[i] = SIGN((int)xb[i] - (int)xa[i]);
+
162 x[i] = (int)xa[i];
+
163 }
+
164
+
165 // determine which direction is dominant
+
166 for (j = 0; j < 3; j++) {
+
167 // set the remaining directions
+
168 iin = 0;
+
169 for (i = 0; i < 3; i++) {
+
170 if (i != j) {
+
171 in[iin] = i;
+
172 iin += 1;
+
173 }
+
174 }
+
175 // determine if the current direction is dominant
+
176 if (a[j] >= std::max(a[in[0]], a[in[1]]))
+
177 break;
+
178 }
+
179
+
180 // set increment in non-dominant directions
+
181 for (i = 0; i < 2; i++)
+
182 d[in[i]] = a[in[i]] - (a[j] >> 1);
+
183 // loop until "x" coincides with "xb"
+
184 while (true) {
+
185 // add current voxel to path
+
186 for (i = 0; i < ndim; i++)
+
187 ret.push_back(x[i]);
+
188 // update voxel counter
+
189 nnz += 1;
+
190 // check convergence
+
191 if (x[j] == xb[j])
+
192 return xt::adapt(ret, {static_cast<size_t>(nnz), static_cast<size_t>(ndim)});
+
193 // check increment in other directions
+
194 for (i = 0; i < 2; i++) {
+
195 if (d[in[i]] >= 0) {
+
196 x[in[i]] += s[in[i]];
+
197 d[in[i]] -= a[j];
+
198 }
+
199 }
+
200 // increment
+
201 x[j] += s[j];
+
202 for (i = 0; i < 2; i++)
+
203 d[in[i]] += a[in[i]];
+
204 }
+
205
+
206 return xt::adapt(ret, {static_cast<size_t>(nnz), static_cast<size_t>(ndim)});
+
207}
+
208} // namespace path
+
209
+
210/*
+
211Compute pixel-path.
+
212
+
213@arg xa : Pixel coordinate (e.g. {0, 0, 0}).
+
214@arg xb : Pixel coordinate (e.g. {10, 5, 0}).
+
215@ret The path: the coordinate of one pixel per row.
+
216*/
+
217namespace path {
+
218
+
219template <class T>
+
220inline array_type::tensor<int, 2> actual(const T& xa, const T& xb)
+
221{
+
222 int ndim = static_cast<int>(xa.size());
+
223 std::vector<int> ret;
+
224
+
225 // position, slope, (length to) next intersection
+
226 double x[3], v[3], t[3], next[3], sign[3];
+
227 int isign[3];
+
228 // active dimensions (for in-plane paths dimension have to be skipped
+
229 // to avoid dividing by zero)
+
230 int in[3], iin, nin;
+
231 // path of the current voxel
+
232 int cindex[3];
+
233 int nnz = 1;
+
234 // counters
+
235 int i, imin, n;
+
236
+
237 // set the direction coefficient in all dimensions; if it is zero this
+
238 // dimension is excluded from further analysis (i.e. in-plane growth)
+
239 nin = 0;
+
240 for (i = 0; i < ndim; i++) {
+
241 // set origin, store to output array; initiate the position
+
242 cindex[i] = xa[i];
+
243 ret.push_back(cindex[i]);
+
244 // initiate position, set slope
+
245 x[i] = (double)(xa[i]);
+
246 v[i] = (double)(xb[i] - xa[i]);
+
247 // non-zero slope: calculate the sign and the next intersection
+
248 // with a voxel's edges, and update the list to include this dimension
+
249 // in the further analysis
+
250 if (v[i]) {
+
251 sign[i] = v[i] / fabs(v[i]);
+
252 isign[i] = (int)sign[i];
+
253 next[i] = sign[i] * 0.5;
+
254 in[nin] = i;
+
255 nin++;
+
256 }
+
257 }
+
258
+
259 // starting from "xa" loop to "xb"
+
260 while (true) {
+
261 // find translation coefficient "t" for each next intersection
+
262 // (only include dimensions with non-zero slope)
+
263 for (iin = 0; iin < nin; iin++) {
+
264 i = in[iin];
+
265 t[iin] = (next[i] - x[i]) / v[i];
+
266 }
+
267 // find the minimum "t": the intersection which is closet along the line
+
268 // from the current position -> proceed in this direction
+
269 imin = 0;
+
270 for (iin = 1; iin < nin; iin++) {
+
271 if (t[iin] < t[imin]) {
+
272 imin = iin;
+
273 }
+
274 }
+
275
+
276 // update path: proceed in dimension of minimum "t"
+
277 // note: if dimensions have equal "t" -> proceed in each dimension
+
278 for (iin = 0; iin < nin; iin++) {
+
279 if (fabs(t[iin] - t[imin]) < 1.e-6) {
+
280 cindex[in[iin]] += isign[in[iin]];
+
281 next[in[iin]] += sign[in[iin]];
+
282 }
+
283 }
+
284 // store only the next voxel
+
285 for (i = 0; i < ndim; i++) {
+
286 ret.push_back(cindex[i]);
+
287 }
+
288 nnz++;
+
289 // update position, and current path
+
290 for (i = 0; i < ndim; i++) {
+
291 x[i] = xa[i] + v[i] * t[imin];
+
292 }
+
293
+
294 // check convergence: stop when "xb" is reached
+
295 n = 0;
+
296 for (i = 0; i < ndim; i++) {
+
297 if (cindex[i] == xb[i]) {
+
298 n++;
+
299 }
+
300 }
+
301 if (n == ndim) {
+
302 break;
+
303 }
+
304 }
+
305
+
306 return xt::adapt(ret, {static_cast<size_t>(nnz), static_cast<size_t>(ndim)});
+
307}
+
308} // namespace path
+
309
+
310/*
+
311Compute pixel-path.
+
312
+
313@arg xa : Pixel coordinate (e.g. {0, 0, 0}).
+
314@arg xb : Pixel coordinate (e.g. {10, 5, 0}).
+
315@ret The path: the coordinate of one pixel per row.
+
316*/
+
317namespace path {
+
318
+
319template <class T>
+
320inline array_type::tensor<int, 2> full(const T& xa, const T& xb)
+
321{
+
322 int ndim = static_cast<int>(xa.size());
+
323 std::vector<int> ret;
+
324
+
325 // position, slope, (length to) next intersection
+
326 double x[3], v[3], t[3], next[3], sign[3];
+
327 int isign[3];
+
328 // active dimensions (for in-plane paths dimension have to be skipped
+
329 // to avoid dividing by zero)
+
330 int in[3], iin, nin;
+
331 // path of the current voxel
+
332 int cindex[3];
+
333 int nnz = 1;
+
334 // counters
+
335 int i, imin, n;
+
336
+
337 // set the direction coefficient in all dimensions; if it is zero this
+
338 // dimension is excluded from further analysis (i.e. in-plane growth)
+
339 nin = 0;
+
340 for (i = 0; i < ndim; i++) {
+
341 // set origin, store to output array; initiate the position
+
342 cindex[i] = xa[i];
+
343 ret.push_back(cindex[i]);
+
344 // initiate position, set slope
+
345 x[i] = (double)(xa[i]);
+
346 v[i] = (double)(xb[i] - xa[i]);
+
347 // non-zero slope: calculate the sign and the next intersection
+
348 // with a voxel's edges, and update the list to include this dimension
+
349 // in the further analysis
+
350 if (v[i]) {
+
351 sign[i] = v[i] / fabs(v[i]);
+
352 isign[i] = (int)sign[i];
+
353 next[i] = sign[i] * 0.5;
+
354 in[nin] = i;
+
355 nin++;
+
356 }
+
357 }
+
358
+
359 // starting from "xa" loop to "xb"
+
360 while (true) {
+
361 // find translation coefficient "t" for each next intersection
+
362 // (only include dimensions with non-zero slope)
+
363 for (iin = 0; iin < nin; iin++) {
+
364 i = in[iin];
+
365 t[iin] = (next[i] - x[i]) / v[i];
+
366 }
+
367 // find the minimum "t": the intersection which is closet along the line
+
368 // from the current position -> proceed in this direction
+
369 imin = 0;
+
370 for (iin = 1; iin < nin; iin++) {
+
371 if (t[iin] < t[imin]) {
+
372 imin = iin;
+
373 }
+
374 }
+
375
+
376 // update path: proceed in dimension of minimum "t"
+
377 // note: if dimensions have equal "t" -> proceed in each dimension
+
378 for (iin = 0; iin < nin; iin++) {
+
379 if (fabs(t[iin] - t[imin]) < 1.e-6) {
+
380 cindex[in[iin]] += isign[in[iin]];
+
381 next[in[iin]] += sign[in[iin]];
+
382 // store all the face crossings ("mode")
+
383 for (i = 0; i < ndim; i++) {
+
384 ret.push_back(cindex[i]);
+
385 }
+
386 nnz++;
+
387 }
+
388 }
+
389 // update position, and current path
+
390 for (i = 0; i < ndim; i++) {
+
391 x[i] = xa[i] + v[i] * t[imin];
+
392 }
+
393
+
394 // check convergence: stop when "xb" is reached
+
395 n = 0;
+
396 for (i = 0; i < ndim; i++) {
+
397 if (cindex[i] == xb[i]) {
+
398 n++;
+
399 }
+
400 }
+
401 if (n == ndim) {
+
402 break;
+
403 }
+
404 }
+
405
+
406 return xt::adapt(ret, {static_cast<size_t>(nnz), static_cast<size_t>(ndim)});
+
407}
+
408} // namespace path
+
409
+
410} // namespace detail
+
411} // namespace GooseEYE
+
412
+
413#endif
+ +
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
Toolbox to compute statistics.
Definition config.h:121
+
@ actual
The actual path.
+
@ full
Similar to actual selecting every voxel that is crossed.
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
+
+ + + + diff --git a/dilate_8hpp.html b/dilate_8hpp.html new file mode 100644 index 00000000..8ac8e269 --- /dev/null +++ b/dilate_8hpp.html @@ -0,0 +1,151 @@ + + + + + + + +GooseEYE: GooseEYE/dilate.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
dilate.hpp File Reference
+
+
+
#include "GooseEYE.h"
+#include <xtensor/xstrided_view.hpp>
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+ + + + + + + + + + + + + + + + + +

+Functions

template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
GooseEYE::dilate (const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)
 Dilate image.
 
template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
GooseEYE::dilate (const T &f, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)
 Dilate image.
 
template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
GooseEYE::dilate (const T &f, size_t iterations=1, bool periodic=true)
 Dilate image.
 
template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
GooseEYE::dilate (const T &f, const S &kernel, size_t iterations=1, bool periodic=true)
 Dilate image.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file dilate.hpp.

+
+
+ + + + diff --git a/dilate_8hpp.js b/dilate_8hpp.js new file mode 100644 index 00000000..15c524e8 --- /dev/null +++ b/dilate_8hpp.js @@ -0,0 +1,7 @@ +var dilate_8hpp = +[ + [ "dilate", "dilate_8hpp.html#ae859f712898ed7d6e76a5ecaa114614a", null ], + [ "dilate", "dilate_8hpp.html#a43f961d31fad8b606eedee2fcd4969b5", null ], + [ "dilate", "dilate_8hpp.html#a4976e5bbf41b58472e028babb092bd85", null ], + [ "dilate", "dilate_8hpp.html#a6bb0149c151f7255f796ac80bc57a031", null ] +]; \ No newline at end of file diff --git a/dilate_8hpp_source.html b/dilate_8hpp_source.html new file mode 100644 index 00000000..447bf961 --- /dev/null +++ b/dilate_8hpp_source.html @@ -0,0 +1,331 @@ + + + + + + + +GooseEYE: GooseEYE/dilate.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
dilate.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_DILATE_HPP
+
8#define GOOSEEYE_DILATE_HPP
+
9
+
10#include "GooseEYE.h"
+
11#include <xtensor/xstrided_view.hpp>
+
12
+
13namespace GooseEYE {
+
14
+
15namespace detail {
+
16
+
17template <class S, class U>
+
18inline void periodic_copy_below_to_above(S&& F, const U& Pad)
+
19{
+
20 xt::xstrided_slice_vector sbelow(F.dimension());
+
21 xt::xstrided_slice_vector sabove(F.dimension());
+
22
+
23 for (size_t ax = 0; ax < F.dimension(); ++ax) {
+
24 if (F.shape(ax) <= 1) {
+
25 continue;
+
26 }
+
27
+
28 for (size_t i = 0; i < ax; ++i) {
+
29 sbelow[i] = xt::all();
+
30 sabove[i] = xt::all();
+
31 }
+
32
+
33 sbelow[ax] = xt::range(0, Pad[ax][0]);
+
34 sabove[ax] = xt::range(F.shape(ax) - Pad[ax][1] - Pad[ax][0], F.shape(ax) - Pad[ax][1]);
+
35
+
36 for (size_t i = ax + 1; i < F.dimension(); ++i) {
+
37 sbelow[i] = xt::all();
+
38 sabove[i] = xt::all();
+
39 }
+
40
+
41 auto below = xt::strided_view(F, sbelow);
+
42 auto above = xt::strided_view(F, sabove);
+
43
+
44 above = xt::where(xt::not_equal(below, 0), below, above);
+
45 }
+
46}
+
47
+
48template <class S, class U>
+
49inline void periodic_copy_above_to_below(S&& F, const U& Pad)
+
50{
+
51 xt::xstrided_slice_vector sbelow(F.dimension());
+
52 xt::xstrided_slice_vector sabove(F.dimension());
+
53
+
54 for (size_t ax = 0; ax < F.dimension(); ++ax) {
+
55 if (F.shape(ax) <= 1) {
+
56 continue;
+
57 }
+
58
+
59 for (size_t i = 0; i < ax; ++i) {
+
60 sbelow[i] = xt::all();
+
61 sabove[i] = xt::all();
+
62 }
+
63
+
64 sbelow[ax] = xt::range(Pad[ax][0], Pad[ax][0] + Pad[ax][1]);
+
65 sabove[ax] = xt::range(F.shape(ax) - Pad[ax][1], F.shape(ax));
+
66
+
67 for (size_t i = ax + 1; i < F.dimension(); ++i) {
+
68 sbelow[i] = xt::all();
+
69 sabove[i] = xt::all();
+
70 }
+
71
+
72 auto below = xt::strided_view(F, sbelow);
+
73 auto above = xt::strided_view(F, sabove);
+
74
+
75 below = xt::where(xt::not_equal(above, 0), above, below);
+
76 }
+
77}
+
78
+
79template <class S, class U>
+
80inline void periodic_copy(S&& F, const U& Pad)
+
81{
+
82 periodic_copy_above_to_below(F, Pad);
+
83 periodic_copy_below_to_above(F, Pad);
+
84}
+
85
+
86} // namespace detail
+
87
+
88template <
+
89 class T,
+
90 class S,
+
91 std::enable_if_t<
+
92 std::is_integral<typename T::value_type>::value &&
+
93 std::is_integral<typename S::value_type>::value,
+
94 int>>
+
95inline T
+
+
96dilate(const T& f, const S& kernel, const array_type::tensor<size_t, 1>& iterations, bool periodic)
+
97{
+
98 using value_type = typename T::value_type;
+
99 GOOSEEYE_ASSERT(f.dimension() <= 3, std::out_of_range);
+
100 GOOSEEYE_ASSERT(f.dimension() == kernel.dimension(), std::out_of_range);
+
101 GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1)), std::out_of_range);
+
102 GOOSEEYE_ASSERT(static_cast<size_t>(xt::amax(f)()) <= iterations.size() + 1, std::out_of_range);
+
103
+
104 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
105 int pad_value = 0;
+
106
+
107 if (periodic) {
+
108 pad_mode = xt::pad_mode::periodic;
+
109 }
+
110
+
111 array_type::tensor<typename S::value_type, 3> K = xt::atleast_3d(kernel);
+
112 auto Pad = detail::pad_width(K);
+
113 array_type::tensor<value_type, 3> F = xt::pad(xt::atleast_3d(f), Pad, pad_mode, pad_value);
+
114 array_type::tensor<value_type, 3> G = F; // copy to list added labels added in the iteration
+
115
+
116 for (size_t iter = 0; iter < xt::amax(iterations)(0); ++iter) {
+
117
+
118 for (size_t h = Pad[0][0]; h < F.shape(0) - Pad[0][1]; ++h) {
+
119 for (size_t i = Pad[1][0]; i < F.shape(1) - Pad[1][1]; ++i) {
+
120 for (size_t j = Pad[2][0]; j < F.shape(2) - Pad[2][1]; ++j) {
+
121
+
122 // get label
+
123 value_type l = F(h, i, j);
+
124
+
125 // skip if needed:
+
126 // - do not dilate background or labels added in this iteration
+
127 // - check the maximum number of iterations per label
+
128 if (l == 0) {
+
129 continue;
+
130 }
+
131 if (iter >= iterations(l)) {
+
132 continue;
+
133 }
+
134
+
135 // get sub-matrix around (h, i, j)
+
136 auto Fi = xt::view(
+
137 F,
+
138 xt::range(h - Pad[0][0], h + Pad[0][1] + 1),
+
139 xt::range(i - Pad[1][0], i + Pad[1][1] + 1),
+
140 xt::range(j - Pad[2][0], j + Pad[2][1] + 1));
+
141
+
142 auto Gi = xt::view(
+
143 G,
+
144 xt::range(h - Pad[0][0], h + Pad[0][1] + 1),
+
145 xt::range(i - Pad[1][0], i + Pad[1][1] + 1),
+
146 xt::range(j - Pad[2][0], j + Pad[2][1] + 1));
+
147
+
148 // dilate where needed: dilated labels are added as negative numbers
+
149 Gi = xt::where(xt::equal(Fi, 0) && xt::equal(K, 1), l, Gi);
+
150 }
+
151 }
+
152 }
+
153
+
154 // apply periodicity
+
155 if (periodic) {
+
156 detail::periodic_copy(G, Pad);
+
157 }
+
158
+
159 // flip added label
+
160 F = G;
+
161 G = F;
+
162 }
+
163
+
164 // remove padding
+
165 F = xt::view(
+
166 F,
+
167 xt::range(Pad[0][0], F.shape(0) - Pad[0][1]),
+
168 xt::range(Pad[1][0], F.shape(1) - Pad[1][1]),
+
169 xt::range(Pad[2][0], F.shape(2) - Pad[2][1]));
+
170
+
171 T ret = f;
+
172 std::copy(F.cbegin(), F.cend(), ret.begin());
+
173 return ret;
+
174}
+
+
175
+
176template <class T, std::enable_if_t<std::is_integral<typename T::value_type>::value, int>>
+
+
177inline T dilate(const T& f, const array_type::tensor<size_t, 1>& iterations, bool periodic)
+
178{
+
179 return dilate(f, kernel::nearest(f.dimension()), iterations, periodic);
+
180}
+
+
181
+
182template <class T, std::enable_if_t<std::is_integral<typename T::value_type>::value, int>>
+
+
183inline T dilate(const T& f, size_t iterations, bool periodic)
+
184{
+
185 array_type::tensor<size_t, 1> iter = iterations * xt::ones<size_t>({xt::amax(f)(0) + 1ul});
+
186 return dilate(f, kernel::nearest(f.dimension()), iter, periodic);
+
187}
+
+
188
+
189template <
+
190 class T,
+
191 class S,
+
192 std::enable_if_t<
+
193 std::is_integral<typename T::value_type>::value &&
+
194 std::is_integral<typename S::value_type>::value,
+
195 int>>
+
+
196inline T dilate(const T& f, const S& kernel, size_t iterations, bool periodic)
+
197{
+
198 array_type::tensor<size_t, 1> iter = iterations * xt::ones<size_t>({xt::amax(f)(0) + 1ul});
+
199 return dilate(f, kernel, iter, periodic);
+
200}
+
+
201
+
202} // namespace GooseEYE
+
203
+
204#endif
+ +
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:121
+
T dilate(const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic)
Dilate image.
Definition dilate.hpp:96
+
+
+ + + + diff --git a/dir_1e7fc41d3d108c67da428f08b8cf70c8.html b/dir_1e7fc41d3d108c67da428f08b8cf70c8.html new file mode 100644 index 00000000..68888d43 --- /dev/null +++ b/dir_1e7fc41d3d108c67da428f08b8cf70c8.html @@ -0,0 +1,149 @@ + + + + + + + +GooseEYE: GooseEYE Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

 config.h
 
 detail.hpp
 
 dilate.hpp
 
 Ensemble.hpp
 
 Ensemble_C2.hpp
 
 Ensemble_heightheight.hpp
 
 Ensemble_L.hpp
 
 Ensemble_mean.hpp
 
 Ensemble_S2.hpp
 
 Ensemble_W2.hpp
 
 Ensemble_W2c.hpp
 
 GooseEYE.h
 
 GooseEYE.hpp
 
 kernel.hpp
 
 version.h
 
 version.hpp
 
+
+
+ + + + diff --git a/dir_1e7fc41d3d108c67da428f08b8cf70c8.js b/dir_1e7fc41d3d108c67da428f08b8cf70c8.js new file mode 100644 index 00000000..5ef2ed2e --- /dev/null +++ b/dir_1e7fc41d3d108c67da428f08b8cf70c8.js @@ -0,0 +1,19 @@ +var dir_1e7fc41d3d108c67da428f08b8cf70c8 = +[ + [ "config.h", "config_8h.html", "config_8h" ], + [ "detail.hpp", "detail_8hpp.html", null ], + [ "dilate.hpp", "dilate_8hpp.html", "dilate_8hpp" ], + [ "Ensemble.hpp", "Ensemble_8hpp.html", null ], + [ "Ensemble_C2.hpp", "Ensemble__C2_8hpp.html", null ], + [ "Ensemble_heightheight.hpp", "Ensemble__heightheight_8hpp.html", null ], + [ "Ensemble_L.hpp", "Ensemble__L_8hpp.html", null ], + [ "Ensemble_mean.hpp", "Ensemble__mean_8hpp.html", null ], + [ "Ensemble_S2.hpp", "Ensemble__S2_8hpp.html", null ], + [ "Ensemble_W2.hpp", "Ensemble__W2_8hpp.html", null ], + [ "Ensemble_W2c.hpp", "Ensemble__W2c_8hpp.html", null ], + [ "GooseEYE.h", "GooseEYE_8h.html", "GooseEYE_8h" ], + [ "GooseEYE.hpp", "GooseEYE_8hpp.html", "GooseEYE_8hpp" ], + [ "kernel.hpp", "kernel_8hpp.html", "kernel_8hpp" ], + [ "version.h", "version_8h.html", "version_8h" ], + [ "version.hpp", "version_8hpp.html", "version_8hpp" ] +]; \ No newline at end of file diff --git a/doc.svg b/doc.svg new file mode 100644 index 00000000..0b928a53 --- /dev/null +++ b/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/docd.svg b/docd.svg new file mode 100644 index 00000000..ac18b275 --- /dev/null +++ b/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 00000000..08fb5e6f --- /dev/null +++ b/doxygen.css @@ -0,0 +1,2043 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +html.dark-mode { +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doxygen.svg b/doxygen.svg new file mode 100644 index 00000000..79a76354 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 00000000..9b281563 --- /dev/null +++ b/dynsections.js @@ -0,0 +1,199 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ +$(document).ready(function() { + $('.code,.codeRef').each(function() { + $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); + $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; + $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true }); + }); +}); diff --git a/files.html b/files.html new file mode 100644 index 00000000..782c8116 --- /dev/null +++ b/files.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: File List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
+
+ + + + diff --git a/files_dup.js b/files_dup.js new file mode 100644 index 00000000..a1952aff --- /dev/null +++ b/files_dup.js @@ -0,0 +1,4 @@ +var files_dup = +[ + [ "GooseEYE", "dir_1e7fc41d3d108c67da428f08b8cf70c8.html", "dir_1e7fc41d3d108c67da428f08b8cf70c8" ] +]; \ No newline at end of file diff --git a/folderclosed.svg b/folderclosed.svg new file mode 100644 index 00000000..b04bed2e --- /dev/null +++ b/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderclosedd.svg b/folderclosedd.svg new file mode 100644 index 00000000..52f0166a --- /dev/null +++ b/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderopen.svg b/folderopen.svg new file mode 100644 index 00000000..f6896dd2 --- /dev/null +++ b/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/folderopend.svg b/folderopend.svg new file mode 100644 index 00000000..2d1f06e7 --- /dev/null +++ b/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/functions.html b/functions.html new file mode 100644 index 00000000..07af1224 --- /dev/null +++ b/functions.html @@ -0,0 +1,190 @@ + + + + + + + +GooseEYE: Class Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+ + +

- w -

+
+
+ + + + diff --git a/functions_func.html b/functions_func.html new file mode 100644 index 00000000..82254df8 --- /dev/null +++ b/functions_func.html @@ -0,0 +1,188 @@ + + + + + + + +GooseEYE: Class Members - Functions + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+ + +

- w -

+
+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 00000000..5a4e2f67 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Class Members - Variables + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+
+ + + + diff --git a/globals.html b/globals.html new file mode 100644 index 00000000..53e9f9a0 --- /dev/null +++ b/globals.html @@ -0,0 +1,115 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented file members with links to the documentation:
+
+
+ + + + diff --git a/globals_defs.html b/globals_defs.html new file mode 100644 index 00000000..87a635dc --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,115 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+
+
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..21f2d9cd --- /dev/null +++ b/index.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: GooseEYE + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+

CI Doxygen -> gh-pages Documentation Status Conda Version Conda Version

+

+GooseEYE

+

Library to evaluate several geometrical statistical measures on (ensembles of) 'images' (i.e. 1-D, 2-D, or 3-D matrices). The core of the implementation is a C++ library. For user convenience a Python interface is provided too. Please consult the documentation for more information:

+

https://gooseeye.readthedocs.io

+

+Credit / copyright

+

(c) T.W.J. de Geus | www.geus.me | tom@geus.me

+

Contributors:

+ +

Tom de Geus was financially supported by:

+ +
+
+
+ + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 00000000..1dffb65b --- /dev/null +++ b/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/kernel_8hpp.html b/kernel_8hpp.html new file mode 100644 index 00000000..2c019698 --- /dev/null +++ b/kernel_8hpp.html @@ -0,0 +1,140 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
kernel.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
namespace  GooseEYE::kernel
 Collect kernels.
 
+ + + + +

+Functions

array_type::array< int > GooseEYE::kernel::nearest (size_t ndim)
 Return kernel with nearest neighbours.
 
+

Detailed Description

+
+
License: This project is released under the GPLv3 License.
+ +

Definition in file kernel.hpp.

+
+
+ + + + diff --git a/kernel_8hpp.js b/kernel_8hpp.js new file mode 100644 index 00000000..2b961908 --- /dev/null +++ b/kernel_8hpp.js @@ -0,0 +1,4 @@ +var kernel_8hpp = +[ + [ "nearest", "kernel_8hpp.html#a306dfde37d04075f3a635200b2f528ed", null ] +]; \ No newline at end of file diff --git a/kernel_8hpp_source.html b/kernel_8hpp_source.html new file mode 100644 index 00000000..0b4e5509 --- /dev/null +++ b/kernel_8hpp_source.html @@ -0,0 +1,163 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.7.2.dev18+g9cd2bce +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
kernel.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_KERNEL_HPP
+
8#define GOOSEEYE_KERNEL_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13namespace kernel {
+
14
+
+ +
16{
+
17 GOOSEEYE_ASSERT(ndim > 0 && ndim <= 3, std::out_of_range);
+
18
+
19 std::vector<size_t> shape(ndim, 3);
+
20
+
21 array_type::array<int> kern = xt::zeros<int>(shape);
+
22
+
23 if (ndim == 1) {
+
24 xt::view(kern, xt::all()) = 1;
+
25 return kern;
+
26 }
+
27
+
28 if (ndim == 2) {
+
29 xt::view(kern, xt::keep(1), xt::all()) = 1;
+
30 xt::view(kern, xt::all(), xt::keep(1)) = 1;
+
31 return kern;
+
32 }
+
33
+
34 xt::view(kern, xt::keep(1), xt::all(), xt::all()) = 1;
+
35 xt::view(kern, xt::all(), xt::keep(1), xt::all()) = 1;
+
36 xt::view(kern, xt::all(), xt::all(), xt::keep(1)) = 1;
+
37 return kern;
+
38}
+
+
39
+
40} // namespace kernel
+
41} // namespace GooseEYE
+
42
+
43#endif
+ +
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:84
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:148
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:121
+
+
+ + + + diff --git a/menu.js b/menu.js new file mode 100644 index 00000000..b0b26936 --- /dev/null +++ b/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 00000000..e96d651c --- /dev/null +++ b/menudata.js @@ -0,0 +1,93 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"n",url:"namespacemembers.html#index_n"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}, +{text:"v",url:"namespacemembers.html#index_v"}, +{text:"w",url:"namespacemembers.html#index_w"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"d",url:"namespacemembers_func.html#index_d"}, +{text:"h",url:"namespacemembers_func.html#index_h"}, +{text:"l",url:"namespacemembers_func.html#index_l"}, +{text:"n",url:"namespacemembers_func.html#index_n"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"v",url:"namespacemembers_func.html#index_v"}, +{text:"w",url:"namespacemembers_func.html#index_w"}]}, +{text:"Typedefs",url:"namespacemembers_type.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"h",url:"functions.html#index_h"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/minus.svg b/minus.svg new file mode 100644 index 00000000..f70d0c1a --- /dev/null +++ b/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/minusd.svg b/minusd.svg new file mode 100644 index 00000000..5f8e8796 --- /dev/null +++ b/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/namespaceGooseEYE.html b/namespaceGooseEYE.html new file mode 100644 index 00000000..5ab613d7 --- /dev/null +++ b/namespaceGooseEYE.html @@ -0,0 +1,2044 @@ + + + + + + + +GooseEYE: GooseEYE Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE Namespace Reference
    +
    +
    + +

    Toolbox to compute statistics. +More...

    + + + + + + + + +

    +Namespaces

    namespace  array_type
     Container type.
     
    namespace  kernel
     Collect kernels.
     
    + + + + + + + + + + +

    +Classes

    class  ClusterLabeller
     (Incrementally) Label clusters (0 as background, 1..n as labels). More...
     
    class  Clusters
     Compute clusters and obtain certain characteristic about them. More...
     
    class  Ensemble
     Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data. More...
     
    + + + + +

    +Enumerations

    enum class  path_mode { Bresenham +, actual +, full + }
     Different methods to compute a pixel-path. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
    dilate (const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)
     Dilate image.
     
    template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
    dilate (const T &f, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)
     Dilate image.
     
    template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
    dilate (const T &f, size_t iterations=1, bool periodic=true)
     Dilate image.
     
    template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
    dilate (const T &f, const S &kernel, size_t iterations=1, bool periodic=true)
     Dilate image.
     
    array_type::tensor< int, 2 > path (const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
     Compute a path between two pixels.
     
    array_type::array< int > dummy_circles (const std::vector< size_t > &shape, const array_type::tensor< int, 1 > &row, const array_type::tensor< int, 1 > &col, const array_type::tensor< int, 1 > &r, bool periodic=true)
     Dummy image with circles.
     
    array_type::array< int > dummy_circles (const std::vector< size_t > &shape, bool periodic=true, uint64_t seed=0)
     Dummy image with circles.
     
    template<class T , class S >
    array_type::tensor< size_t, 1 > relabel_map (const T &a, const S &b)
     Find map to relabel from a to b.
     
    template<class T >
    array_type::tensor< typename T::value_type, 2 > labels_map (const T &a, const T &b)
     Get a map to relabel from a to b.
     
    template<class L , class A >
    L labels_rename (const L &labels, const A &rename)
     Rename labels.
     
    template<class L , class A >
    L labels_reorder (const L &labels, const A &order)
     Reorder labels.
     
    template<class T >
    array_type::tensor< typename T::value_type, 2 > labels_sizes (const T &labels)
     Size per label.
     
    template<class T >
    array_type::array< int > clusters (const T &f, bool periodic=true)
     Compute clusters.
     
    template<typename T , typename U , typename V >
    pos2img (const T &img, const U &positions, const V &labels)
     Convert positions to an image.
     
    template<class T >
    array_type::tensor< double, 2 > center_of_mass (const T &labels, bool periodic=true)
     Get the position of the center of each label.
     
    auto distance (const std::vector< size_t > &roi)
     Get the relative distance of each pixel in the 'region-of-interest' to its center.
     
    auto distance (const std::vector< size_t > &roi, size_t axis)
     Get the relative distance of each pixel in the 'region-of-interest' to its center.
     
    auto distance (const std::vector< size_t > &roi, const std::vector< double > &h)
     Get the relative distance of each pixel in the 'region-of-interest' to its center.
     
    auto distance (const std::vector< size_t > &roi, const std::vector< double > &h, size_t axis)
     Get the relative distance of each pixel in the 'region-of-interest' to its center.
     
    template<class T >
    auto S2 (const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
     2-point correlation: P(f(i) * g(i + di)).
     
    template<class T , class M >
    auto S2 (const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)
     2-point correlation: P(f(i) * g(i + di)).
     
    template<class T >
    auto C2 (const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
     2-point cluster function: P(f(i) == g(i + di)).
     
    template<class T , class M >
    auto C2 (const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)
     2-point cluster function: P(f(i) == g(i + di)).
     
    template<class T >
    auto W2 (const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
     Weighted 2-point correlation.
     
    template<class T , class M >
    auto W2 (const std::vector< size_t > &roi, const T &w, const T &f, const M &fmask, bool periodic=true)
     Weighted 2-point correlation.
     
    template<class C , class T >
    auto W2c (const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)
     Collapsed weighted 2-point correlation.
     
    template<class C , class T , class M >
    auto W2c (const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham, bool periodic=true)
     Collapsed weighted 2-point correlation.
     
    template<class T >
    auto heightheight (const std::vector< size_t > &roi, const T &f, bool periodic=true)
     Height-height correlation.
     
    template<class T , class M >
    auto heightheight (const std::vector< size_t > &roi, const T &f, const M &fmask, bool periodic=true)
     Height-height correlation.
     
    template<class T >
    auto L (const std::vector< size_t > &roi, const T &f, bool periodic=true, path_mode mode=path_mode::Bresenham)
     Lineal-path function.
     
    std::string version ()
     Return version string, e.g.
     
    +

    Detailed Description

    +

    Toolbox to compute statistics.

    +

    Enumeration Type Documentation

    + +

    ◆ path_mode

    + +
    +
    + + + + + +
    + + + + +
    enum class GooseEYE::path_mode
    +
    +strong
    +
    + +

    Different methods to compute a pixel-path.

    + + + + +
    Enumerator
    Bresenham 

    Bresenham algorithm.

    +
    actual 

    The actual path.

    +
    full 

    Similar to actual selecting every voxel that is crossed.

    +
    + +

    Definition at line 69 of file GooseEYE.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ C2() [1/2]

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::C2 (const std::vector< size_t > & roi,
    const T & f,
    const T & g,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    2-point cluster function: P(f(i) == g(i + di)).

    +
    Parameters
    + + + + + +
    roiRegion-of-interest.
    fThe image.
    gThe comparison image.
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 75 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ C2() [2/2]

    + +
    +
    +
    +template<class T , class M >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::C2 (const std::vector< size_t > & roi,
    const T & f,
    const T & g,
    const M & fmask,
    const M & gmask,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    2-point cluster function: P(f(i) == g(i + di)).

    +
    Parameters
    + + + + + + + +
    roiRegion-of-interest.
    fThe image.
    gThe comparison image.
    fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
    gmaskMask certain pixels of g (binary, 1: masked, 0: not masked).
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 84 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ center_of_mass()

    + +
    +
    +
    +template<class T >
    + + + + + + + + + + + + + + + + + + +
    array_type::tensor< double, 2 > GooseEYE::center_of_mass (const T & labels,
    bool periodic = true 
    )
    +
    + +

    Get the position of the center of each label.

    +

    For periodic algorithm, see: https://en.wikipedia.org/wiki/Center_of_mass#Systems_with_periodic_boundary_conditions

    +
    Parameters
    + + + +
    labelsAn image with labels [0..N].
    periodicSwitch to assume image periodic.
    +
    +
    +
    Returns
    The position of the center of each label.
    + +

    Definition at line 1176 of file GooseEYE.h.

    + +
    +
    + +

    ◆ clusters()

    + +
    +
    +
    +template<class T >
    + + + + + + + + + + + + + + + + + + +
    array_type::array< int > GooseEYE::clusters (const T & f,
    bool periodic = true 
    )
    +
    + +

    Compute clusters.

    +
    Parameters
    + + + +
    fImage.
    periodicInterpret image as periodic.
    +
    +
    +
    Returns
    'Image' with labels (1..n) for labels, 0 for background.
    + +

    Definition at line 1107 of file GooseEYE.h.

    + +
    +
    + +

    ◆ dilate() [1/4]

    + +
    +
    +
    +template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    T GooseEYE::dilate (const T & f,
    const array_type::tensor< size_t, 1 > & iterations,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Dilate image.

    +

    Select "kernel::nearest" as kernel. See above for parameters.

    + +

    Definition at line 177 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [2/4]

    + +
    +
    +
    +template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    T GooseEYE::dilate (const T & f,
    const S & kernel,
    const array_type::tensor< size_t, 1 > & iterations,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Dilate image.

    +

    The input image can be binary (1), or have integer labels (>=1). In each case the background are 0.

    Parameters
    + + + + + +
    fThe image (integer).
    kernelThe kernel with which to dilate (binary).
    iterationsNumber of iterations per label.
    periodicSwitch to assume image periodic.
    +
    +
    +
    Returns
    The dilated image.
    + +

    Definition at line 96 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [3/4]

    + +
    +
    +
    +template<class T , class S , std::enable_if_t< std::is_integral< typename T::value_type >::value &&std::is_integral< typename S::value_type >::value, int > >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    T GooseEYE::dilate (const T & f,
    const S & kernel,
    size_t iterations = 1,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Dilate image.

    +

    Fixed number of iterations for all labels. See above for parameters.

    + +

    Definition at line 196 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [4/4]

    + +
    +
    +
    +template<class T , std::enable_if_t< std::is_integral< typename T::value_type >::value, int > >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    T GooseEYE::dilate (const T & f,
    size_t iterations = 1,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Dilate image.

    +

    Fixed number of iterations for all labels. Select "kernel::nearest" as kernel. See above for parameters.

    + +

    Definition at line 183 of file dilate.hpp.

    + +
    +
    + +

    ◆ distance() [1/4]

    + +
    +
    + + + + + +
    + + + + + + + + +
    auto GooseEYE::distance (const std::vector< size_t > & roi)
    +
    +inline
    +
    + +

    Get the relative distance of each pixel in the 'region-of-interest' to its center.

    +
    Parameters
    + + +
    roiRegion-of-interest.
    +
    +
    +
    Returns
    The distances along the 'region-of-interest' set at construction.
    + +

    Definition at line 28 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [2/4]

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::distance (const std::vector< size_t > & roi,
    const std::vector< double > & h 
    )
    +
    +inline
    +
    + +

    Get the relative distance of each pixel in the 'region-of-interest' to its center.

    +
    Parameters
    + + + +
    roiRegion-of-interest.
    hThe physical dimensions of one pixel (in each direction).
    +
    +
    +
    Returns
    The distances along the 'region-of-interest' set at construction.
    + +

    Definition at line 40 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [3/4]

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::distance (const std::vector< size_t > & roi,
    const std::vector< double > & h,
    size_t axis 
    )
    +
    +inline
    +
    + +

    Get the relative distance of each pixel in the 'region-of-interest' to its center.

    +
    Parameters
    + + + + +
    roiRegion-of-interest.
    hThe physical dimensions of one pixel (in each direction).
    axisSelect axis.
    +
    +
    +
    Returns
    The distances along the 'region-of-interest' set at construction.
    + +

    Definition at line 46 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [4/4]

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::distance (const std::vector< size_t > & roi,
    size_t axis 
    )
    +
    +inline
    +
    + +

    Get the relative distance of each pixel in the 'region-of-interest' to its center.

    +
    Parameters
    + + + +
    roiRegion-of-interest.
    axisSelect axis.
    +
    +
    +
    Returns
    The distances along the 'region-of-interest' set at construction.
    + +

    Definition at line 34 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ dummy_circles() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    array_type::array< int > GooseEYE::dummy_circles (const std::vector< size_t > & shape,
    bool periodic = true,
    uint64_t seed = 0 
    )
    +
    +inline
    +
    + +

    Dummy image with circles.

    +

    The positions and radii of the circles are randomly generated.

    Parameters
    + + + + +
    shapeShape of the output image.
    periodicSwitch to assume image periodic.
    seedSeed for the random number generator.
    +
    +
    +
    Returns
    The dummy image.
    + +

    Definition at line 148 of file GooseEYE.h.

    + +
    +
    + +

    ◆ dummy_circles() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    array_type::array< int > GooseEYE::dummy_circles (const std::vector< size_t > & shape,
    const array_type::tensor< int, 1 > & row,
    const array_type::tensor< int, 1 > & col,
    const array_type::tensor< int, 1 > & r,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Dummy image with circles.

    +
    Parameters
    + + + + + + +
    shapeShape of the output image.
    rowThe x-position of each circle.
    colThe y-position of each circle.
    rThe radius of each circle.
    periodicSwitch to assume image periodic.
    +
    +
    +
    Returns
    The dummy image.
    + +

    Definition at line 96 of file GooseEYE.h.

    + +
    +
    + +

    ◆ heightheight() [1/2]

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::heightheight (const std::vector< size_t > & roi,
    const T & f,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Height-height correlation.

    +
    Parameters
    + + + + +
    roiRegion-of-interest.
    fThe image.
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 143 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ heightheight() [2/2]

    + +
    +
    +
    +template<class T , class M >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::heightheight (const std::vector< size_t > & roi,
    const T & f,
    const M & fmask,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Height-height correlation.

    +
    Parameters
    + + + + + +
    roiRegion-of-interest.
    fThe image.
    fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 151 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ L()

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::L (const std::vector< size_t > & roi,
    const T & f,
    bool periodic = true,
    path_mode mode = path_mode::Bresenham 
    )
    +
    +inline
    +
    + +

    Lineal-path function.

    +
    Parameters
    + + + + + +
    roiRegion-of-interest.
    fThe image.
    periodicSwitch to assume image periodic.
    modeMethod to use (see path_mode()).
    +
    +
    + +

    Definition at line 159 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ labels_map()

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    array_type::tensor< typename T::value_type, 2 > GooseEYE::labels_map (const T & a,
    const T & b 
    )
    +
    +inline
    +
    + +

    Get a map to relabel from a to b.

    +
    Parameters
    + + + +
    aImage with labels.
    bImage with labels.
    +
    +
    +
    Returns
    Array with each row the pair (old_label, new_label).
    + +

    Definition at line 263 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_rename()

    + +
    +
    +
    +template<class L , class A >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    L GooseEYE::labels_rename (const Llabels,
    const A & rename 
    )
    +
    +inline
    +
    + +

    Rename labels.

    +
    Parameters
    + + + +
    labelsImage with labels.
    renameArray with each row the pair (old_label, new_label).
    +
    +
    +
    Returns
    Image with reordered labels.
    + +

    Definition at line 292 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_reorder()

    + +
    +
    +
    +template<class L , class A >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    L GooseEYE::labels_reorder (const Llabels,
    const A & order 
    )
    +
    +inline
    +
    + +

    Reorder labels.

    +
    Parameters
    + + + +
    labelsImage with labels.
    orderList of new order of labels (unique(labels) in desired order).
    +
    +
    +
    Returns
    Image with reordered labels.
    + +

    Definition at line 324 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_sizes()

    + +
    +
    +
    +template<class T >
    + + + + + + + + +
    array_type::tensor< typename T::value_type, 2 > GooseEYE::labels_sizes (const T & labels)
    +
    + +

    Size per label.

    +
    Parameters
    + + +
    labelsImage with labels (0..n).
    +
    +
    +
    Returns
    List of size n + 1 with the size per label.
    + +

    Definition at line 354 of file GooseEYE.h.

    + +
    +
    + +

    ◆ path()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    array_type::tensor< int, 2 > GooseEYE::path (const array_type::tensor< int, 1 > & x0,
    const array_type::tensor< int, 1 > & x1,
    path_mode mode = path_mode::Bresenham 
    )
    +
    +inline
    +
    + +

    Compute a path between two pixels.

    +
    Parameters
    + + + + +
    x0Pixel coordinate (e.g. {0, 0}).
    x1Pixel coordinate (e.g. {10, 5}).
    modeMethod to use (see "path_mode").
    +
    +
    +
    Returns
    The path: the coordinate of one pixel per row.
    + +

    Definition at line 15 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ pos2img()

    + +
    +
    +
    +template<typename T , typename U , typename V >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    T GooseEYE::pos2img (const T & img,
    const U & positions,
    const V & labels 
    )
    +
    +inline
    +
    + +

    Convert positions to an image.

    +
    Parameters
    + + + + +
    imgThe image.
    positionsThe position.
    labelsThe label to apply for each image.
    +
    +
    +
    Returns
    The image, with labels inserted (overwritten) at the positions.
    + +

    Definition at line 1135 of file GooseEYE.h.

    + +
    +
    + +

    ◆ relabel_map()

    + +
    +
    +
    +template<class T , class S >
    + + + + + + + + + + + + + + + + + + +
    array_type::tensor< size_t, 1 > GooseEYE::relabel_map (const T & a,
    const S & b 
    )
    +
    + +

    Find map to relabel from a to b.

    +
    Parameters
    + + + +
    aImage.
    bImage.
    +
    +
    +
    Returns
    List of length max(a) + 1 with per label in a the corresponding label in b.
    + +

    Definition at line 242 of file GooseEYE.h.

    + +
    +
    + +

    ◆ S2() [1/2]

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::S2 (const std::vector< size_t > & roi,
    const T & f,
    const T & g,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    2-point correlation: P(f(i) * g(i + di)).

    +
    Parameters
    + + + + + +
    roiRegion-of-interest.
    fThe image.
    gThe comparison image.
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 53 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ S2() [2/2]

    + +
    +
    +
    +template<class T , class M >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::S2 (const std::vector< size_t > & roi,
    const T & f,
    const T & g,
    const M & fmask,
    const M & gmask,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    2-point correlation: P(f(i) * g(i + di)).

    +
    Parameters
    + + + + + + + +
    roiRegion-of-interest.
    fThe image.
    gThe comparison image.
    fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
    gmaskMask certain pixels of g (binary, 1: masked, 0: not masked).
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 62 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ version()

    + +
    +
    + + + + + +
    + + + + + + + +
    std::string GooseEYE::version ()
    +
    +inline
    +
    + +

    Return version string, e.g.

    +

    "0.8.0"

    Returns
    String.
    + +

    Definition at line 25 of file version.hpp.

    + +
    +
    + +

    ◆ W2() [1/2]

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::W2 (const std::vector< size_t > & roi,
    const T & w,
    const T & f,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Weighted 2-point correlation.

    +
    Parameters
    + + + + + +
    roiRegion-of-interest.
    wWeights.
    fThe image.
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 97 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2() [2/2]

    + +
    +
    +
    +template<class T , class M >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::W2 (const std::vector< size_t > & roi,
    const T & w,
    const T & f,
    const M & fmask,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Weighted 2-point correlation.

    +
    Parameters
    + + + + + + +
    roiRegion-of-interest.
    wWeights.
    fThe image.
    fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 106 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2c() [1/2]

    + +
    +
    +
    +template<class C , class T , class M >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::W2c (const std::vector< size_t > & roi,
    const C & clusters,
    const C & centers,
    const T & f,
    const M & fmask,
    path_mode mode = path_mode::Bresenham,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Collapsed weighted 2-point correlation.

    +
    Parameters
    + + + + + + + + +
    roiRegion-of-interest.
    clustersThe clusters.
    centersThe cluster-centers: label only at the center.
    fThe image.
    fmaskMask certain pixels of f (binary, 1: masked, 0: not masked).
    modeMethod to use (see path_mode()).
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 129 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2c() [2/2]

    + +
    +
    +
    +template<class C , class T >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    auto GooseEYE::W2c (const std::vector< size_t > & roi,
    const C & clusters,
    const C & centers,
    const T & f,
    path_mode mode = path_mode::Bresenham,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Collapsed weighted 2-point correlation.

    +
    Parameters
    + + + + + + + +
    roiRegion-of-interest.
    clustersThe clusters.
    centersThe cluster-centers: label only at the center.
    fThe image.
    modeMethod to use (see path_mode()).
    periodicSwitch to assume image periodic.
    +
    +
    + +

    Definition at line 115 of file GooseEYE.hpp.

    + +
    +
    +
    +
    + + + + diff --git a/namespaceGooseEYE.js b/namespaceGooseEYE.js new file mode 100644 index 00000000..53a6d9d9 --- /dev/null +++ b/namespaceGooseEYE.js @@ -0,0 +1,49 @@ +var namespaceGooseEYE = +[ + [ "array_type", "namespaceGooseEYE_1_1array__type.html", [ + [ "array", "namespaceGooseEYE_1_1array__type.html#ab865d9e3da9ba91db40f43c14b26f51f", null ], + [ "tensor", "namespaceGooseEYE_1_1array__type.html#a2990d2b991e50171d4d24abe34bf15e3", null ] + ] ], + [ "kernel", "namespaceGooseEYE_1_1kernel.html", [ + [ "nearest", "namespaceGooseEYE_1_1kernel.html#a306dfde37d04075f3a635200b2f528ed", null ] + ] ], + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "Clusters", "classGooseEYE_1_1Clusters.html", "classGooseEYE_1_1Clusters" ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ], + [ "path_mode", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320", [ + [ "Bresenham", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a20b83bc3afd59d747cc745d5f70f3695", null ], + [ "actual", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e", null ], + [ "full", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320ae9dc924f238fa6cc29465942875fe8f0", null ] + ] ], + [ "C2", "namespaceGooseEYE.html#a6f8454f08a6b048290f36618cc80986b", null ], + [ "C2", "namespaceGooseEYE.html#a867ce41fed448b5442ad8f6e6011b8b1", null ], + [ "center_of_mass", "namespaceGooseEYE.html#a532a7f3db5f55172b92169fa5171b335", null ], + [ "clusters", "namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2", null ], + [ "dilate", "namespaceGooseEYE.html#ae859f712898ed7d6e76a5ecaa114614a", null ], + [ "dilate", "namespaceGooseEYE.html#a43f961d31fad8b606eedee2fcd4969b5", null ], + [ "dilate", "namespaceGooseEYE.html#a4976e5bbf41b58472e028babb092bd85", null ], + [ "dilate", "namespaceGooseEYE.html#a6bb0149c151f7255f796ac80bc57a031", null ], + [ "distance", "namespaceGooseEYE.html#adf4657193fc58978eed6ef274ebb93ed", null ], + [ "distance", "namespaceGooseEYE.html#a3097c5d07c0fe21227df46b79c133a23", null ], + [ "distance", "namespaceGooseEYE.html#ab97f8ace23ac36134cfaab38a19b131b", null ], + [ "distance", "namespaceGooseEYE.html#a3d0010a207abd86a2811edfb32d22e21", null ], + [ "dummy_circles", "namespaceGooseEYE.html#a607337e83a0a65c41ded829114a17ac6", null ], + [ "dummy_circles", "namespaceGooseEYE.html#ab3570c9c90ad8e21f2ddba6dae537e3f", null ], + [ "heightheight", "namespaceGooseEYE.html#ae761eb00cac0021b5840df83814abf72", null ], + [ "heightheight", "namespaceGooseEYE.html#a5f658c332d5fc69e86bb44cb14930ce5", null ], + [ "L", "namespaceGooseEYE.html#a43454c98d88250a5693a3696ca978cb4", null ], + [ "labels_map", "namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c", null ], + [ "labels_rename", "namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a", null ], + [ "labels_reorder", "namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115", null ], + [ "labels_sizes", "namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314", null ], + [ "path", "namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add", null ], + [ "pos2img", "namespaceGooseEYE.html#a9f61eb8a8f1b67fa3cad845d0f1cdcc9", null ], + [ "relabel_map", "namespaceGooseEYE.html#adf6675e27a31a0210c4bc94b09e814f3", null ], + [ "S2", "namespaceGooseEYE.html#ae27103f5b7d6acda6fc2e14c8dfd11b3", null ], + [ "S2", "namespaceGooseEYE.html#ac01c192a6d398e2befc3aca36e953f0e", null ], + [ "version", "namespaceGooseEYE.html#abc99a3a1ab42cd9514f08b7530d300f3", null ], + [ "W2", "namespaceGooseEYE.html#aaa2055a53f179e2ddd810ebaf9eaf837", null ], + [ "W2", "namespaceGooseEYE.html#ab349faaa82c253cea9d67996cb9749c7", null ], + [ "W2c", "namespaceGooseEYE.html#a989df0528b84e5e0f4da84062785ee8b", null ], + [ "W2c", "namespaceGooseEYE.html#a55b550567256dee0da56ac22fd2be72a", null ] +]; \ No newline at end of file diff --git a/namespaceGooseEYE_1_1array__type.html b/namespaceGooseEYE_1_1array__type.html new file mode 100644 index 00000000..0c2557f8 --- /dev/null +++ b/namespaceGooseEYE_1_1array__type.html @@ -0,0 +1,173 @@ + + + + + + + +GooseEYE: GooseEYE::array_type Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE::array_type Namespace Reference
    +
    +
    + +

    Container type. +More...

    + + + + + + + + + + +

    +Typedefs

    template<typename T , size_t N>
    using tensor = xt::xtensor< T, N >
     Fixed (static) rank array.
     
    template<typename T >
    using array = xt::xarray< T >
     Dynamic rank array.
     
    +

    Detailed Description

    +

    Container type.

    +

    Typedef Documentation

    + +

    ◆ array

    + +
    +
    +
    +template<typename T >
    + + + + +
    using GooseEYE::array_type::array = typedef xt::xarray<T>
    +
    + +

    Dynamic rank array.

    + +

    Definition at line 154 of file config.h.

    + +
    +
    + +

    ◆ tensor

    + +
    +
    +
    +template<typename T , size_t N>
    + + + + +
    using GooseEYE::array_type::tensor = typedef xt::xtensor<T, N>
    +
    + +

    Fixed (static) rank array.

    + +

    Definition at line 148 of file config.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespaceGooseEYE_1_1kernel.html b/namespaceGooseEYE_1_1kernel.html new file mode 100644 index 00000000..a27ae025 --- /dev/null +++ b/namespaceGooseEYE_1_1kernel.html @@ -0,0 +1,165 @@ + + + + + + + +GooseEYE: GooseEYE::kernel Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE::kernel Namespace Reference
    +
    +
    + +

    Collect kernels. +More...

    + + + + + +

    +Functions

    array_type::array< int > nearest (size_t ndim)
     Return kernel with nearest neighbours.
     
    +

    Detailed Description

    +

    Collect kernels.

    +

    Function Documentation

    + +

    ◆ nearest()

    + +
    +
    + + + + + +
    + + + + + + + + +
    array_type::array< int > GooseEYE::kernel::nearest (size_t ndim)
    +
    +inline
    +
    + +

    Return kernel with nearest neighbours.

    +
    Parameters
    + + +
    ndimNumber of dimensions (rank).
    +
    +
    +
    Returns
    The kernel.
    + +

    Definition at line 15 of file kernel.hpp.

    + +
    +
    +
    +
    + + + + diff --git a/namespacemembers.html b/namespacemembers.html new file mode 100644 index 00000000..e6f097be --- /dev/null +++ b/namespacemembers.html @@ -0,0 +1,180 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    + +

    - a -

    + + +

    - c -

    + + +

    - d -

    + + +

    - h -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_enum.html b/namespacemembers_enum.html new file mode 100644 index 00000000..ffdc8ee7 --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,112 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace enums with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/namespacemembers_func.html b/namespacemembers_func.html new file mode 100644 index 00000000..7c3b8b0e --- /dev/null +++ b/namespacemembers_func.html @@ -0,0 +1,169 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    + +

    - c -

    + + +

    - d -

    + + +

    - h -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_type.html b/namespacemembers_type.html new file mode 100644 index 00000000..c05eacf9 --- /dev/null +++ b/namespacemembers_type.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace typedefs with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/namespaces.html b/namespaces.html new file mode 100644 index 00000000..976f1ef8 --- /dev/null +++ b/namespaces.html @@ -0,0 +1,122 @@ + + + + + + + +GooseEYE: Namespace List + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Namespace List
    +
    +
    +
    Here is a list of all documented namespaces with brief descriptions:
    +
    [detail level 12]
    + + + + + + +
     NGooseEYEToolbox to compute statistics
     Narray_typeContainer type
     NkernelCollect kernels
     CClusterLabeller(Incrementally) Label clusters (0 as background, 1..n as labels)
     CClustersCompute clusters and obtain certain characteristic about them
     CEnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
    +
    +
    +
    + + + + diff --git a/namespaces_dup.js b/namespaces_dup.js new file mode 100644 index 00000000..f9a9d392 --- /dev/null +++ b/namespaces_dup.js @@ -0,0 +1,4 @@ +var namespaces_dup = +[ + [ "GooseEYE", "namespaceGooseEYE.html", "namespaceGooseEYE" ] +]; \ No newline at end of file diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 00000000..72a58a52 Binary files /dev/null and b/nav_f.png differ diff --git a/nav_fd.png b/nav_fd.png new file mode 100644 index 00000000..032fbdd4 Binary files /dev/null and b/nav_fd.png differ diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 00000000..2093a237 Binary files /dev/null and b/nav_g.png differ diff --git a/nav_h.png b/nav_h.png new file mode 100644 index 00000000..33389b10 Binary files /dev/null and b/nav_h.png differ diff --git a/nav_hd.png b/nav_hd.png new file mode 100644 index 00000000..de80f18a Binary files /dev/null and b/nav_hd.png differ diff --git a/navtree.css b/navtree.css new file mode 100644 index 00000000..69211d4a --- /dev/null +++ b/navtree.css @@ -0,0 +1,149 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: var(--nav-text-active-color); + text-shadow: var(--nav-text-active-shadow); +} + +#nav-tree .selected .arrow { + color: var(--nav-arrow-selected-color); + text-shadow: none; +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--nav-text-active-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: $width; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:var(--nav-splitbar-image); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-repeat:repeat-x; + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/navtree.js b/navtree.js new file mode 100644 index 00000000..93dd3d46 --- /dev/null +++ b/navtree.js @@ -0,0 +1,559 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +var navTreeSubIndices = new Array(); +var arrowDown = '▼'; +var arrowRight = '►'; + +function getData(varName) +{ + var i = varName.lastIndexOf('/'); + var n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, setFocus) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + var topOffset=5; + if (typeof page_layout!=='undefined' && page_layout==1) { + topOffset+=$('#top').outerHeight(); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ + + + + + + + + diff --git a/plusd.svg b/plusd.svg new file mode 100644 index 00000000..0c65bfe9 --- /dev/null +++ b/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resize.js b/resize.js new file mode 100644 index 00000000..aaeb6fc0 --- /dev/null +++ b/resize.js @@ -0,0 +1,155 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +var once=1; +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,barWidth=6,desktop_vp=768,titleHeight; + + function readSetting(cookie) + { + if (window.chrome) { + var val = localStorage.getItem(cookie_namespace+'_width'); + if (val) return val; + } else { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + } + return 250; + } + + function writeSetting(cookie, val) + { + if (window.chrome) { + localStorage.setItem(cookie_namespace+"_width",val); + } else { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/"; + } + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + writeSetting('width',sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height(); + var contentHeight,navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + content.css({height:contentHeight + "px"}); + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() + { + var newWidth; + if (sidenav.width()>0) { + newWidth=0; + } + else { + var width = readSetting('width'); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + var sidenavWidth = $(sidenav).outerWidth(); + writeSetting('width',sidenavWidth-barWidth); + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readSetting('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + if (once) { + $(".ui-resizable-handle").dblclick(collapseExpand); + once=0 + } + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 00000000..cea3e99f --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['actual_0',['actual',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e',1,'GooseEYE']]], + ['add_5fimage_1',['add_image',['../classGooseEYE_1_1ClusterLabeller.html#a141c63eddd8e766741ebf08b2b473136',1,'GooseEYE::ClusterLabeller']]], + ['add_5fpoints_2',['add_points',['../classGooseEYE_1_1ClusterLabeller.html#a9a88b743156388bf650af378c93d1ef4',1,'GooseEYE::ClusterLabeller::add_points(const T &begin, const T &end)'],['../classGooseEYE_1_1ClusterLabeller.html#ac239e876dfcf25f34748cf7b8ca8d704',1,'GooseEYE::ClusterLabeller::add_points(const T &idx)']]], + ['array_3',['array',['../namespaceGooseEYE_1_1array__type.html#ab865d9e3da9ba91db40f43c14b26f51f',1,'GooseEYE::array_type']]] +]; diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 00000000..fa6180b9 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bresenham_0',['Bresenham',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a20b83bc3afd59d747cc745d5f70f3695',1,'GooseEYE']]] +]; diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 00000000..c972d23e --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['variance_0',['variance',['../classGooseEYE_1_1Ensemble.html#a75973e36d209e8a0b2a61c22a4bb7a4e',1,'GooseEYE::Ensemble']]], + ['version_1',['version',['../namespaceGooseEYE.html#abc99a3a1ab42cd9514f08b7530d300f3',1,'GooseEYE']]], + ['version_2eh_2',['version.h',['../version_8h.html',1,'']]], + ['version_2ehpp_3',['version.hpp',['../version_8hpp.html',1,'']]] +]; diff --git a/search/all_11.js b/search/all_11.js new file mode 100644 index 00000000..94e3868a --- /dev/null +++ b/search/all_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['w2_0',['w2',['../classGooseEYE_1_1Ensemble.html#aaf81f5284e4e67d0e740a8a21d6072b4',1,'GooseEYE::Ensemble::W2(const T &w, const T &f)'],['../classGooseEYE_1_1Ensemble.html#a129ef0a0165a13f8c9d016e8bb02c7e3',1,'GooseEYE::Ensemble::W2(const T &w, const T &f, const M &fmask)'],['../namespaceGooseEYE.html#aaa2055a53f179e2ddd810ebaf9eaf837',1,'GooseEYE::W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)'],['../namespaceGooseEYE.html#ab349faaa82c253cea9d67996cb9749c7',1,'GooseEYE::W2(const std::vector< size_t > &roi, const T &w, const T &f, const M &fmask, bool periodic=true)']]], + ['w2c_1',['w2c',['../classGooseEYE_1_1Ensemble.html#a95a025460b591dc74caeab3386e9cd7d',1,'GooseEYE::Ensemble::W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)'],['../classGooseEYE_1_1Ensemble.html#a99457cc94be42c86d6de699aa779ebea',1,'GooseEYE::Ensemble::W2c(const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham)'],['../namespaceGooseEYE.html#a55b550567256dee0da56ac22fd2be72a',1,'GooseEYE::W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)'],['../namespaceGooseEYE.html#a989df0528b84e5e0f4da84062785ee8b',1,'GooseEYE::W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham, bool periodic=true)']]] +]; diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 00000000..b8199a77 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['c2_0',['c2',['../namespaceGooseEYE.html#a867ce41fed448b5442ad8f6e6011b8b1',1,'GooseEYE::C2()'],['../classGooseEYE_1_1Ensemble.html#af52ed25e986f699a846e09498fd25928',1,'GooseEYE::Ensemble::C2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#aa6b103383499bbce8a6dc4caebbfe710',1,'GooseEYE::Ensemble::C2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#a6f8454f08a6b048290f36618cc80986b',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)']]], + ['center_5fof_5fmass_1',['center_of_mass',['../namespaceGooseEYE.html#a532a7f3db5f55172b92169fa5171b335',1,'GooseEYE']]], + ['center_5fpositions_2',['center_positions',['../classGooseEYE_1_1Clusters.html#af483dfcd99cbde06752540688f65a630',1,'GooseEYE::Clusters']]], + ['centers_3',['centers',['../classGooseEYE_1_1Clusters.html#a0831a128220907113b24b1fcd8ebb292',1,'GooseEYE::Clusters']]], + ['clusterlabeller_4',['clusterlabeller',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE::ClusterLabeller< Dimension, Periodicity >'],['../classGooseEYE_1_1ClusterLabeller.html#a259275eedd9e65e152c01eff377c5344',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape)'],['../classGooseEYE_1_1ClusterLabeller.html#a4937ee10526225c0f985c1c19347cef6',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape, const K &kernel)']]], + ['clusterlabeller_3c_20dimension_2c_20periodicity_20_3e_5',['ClusterLabeller< Dimension, Periodicity >',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]], + ['clusters_6',['clusters',['../classGooseEYE_1_1Clusters.html#a6e1d03b02054326ab6cb3eaead9ca0c5',1,'GooseEYE::Clusters::Clusters(const T &f, const S &kernel, bool periodic=true)'],['../classGooseEYE_1_1Clusters.html#a7d29a717247b02b7510c3598472eaa69',1,'GooseEYE::Clusters::Clusters(const T &f, bool periodic=true)'],['../classGooseEYE_1_1Clusters.html',1,'GooseEYE::Clusters'],['../namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2',1,'GooseEYE::clusters(const T &f, bool periodic=true)']]], + ['config_2eh_7',['config.h',['../config_8h.html',1,'']]], + ['copyright_8',['Credit / copyright',['../index.html#autotoc_md1',1,'']]], + ['credit_20copyright_9',['Credit / copyright',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 00000000..0a8c81ae --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['data_5ffirst_0',['data_first',['../classGooseEYE_1_1Ensemble.html#aa0c38a6aebc69df4cddeb4eb4c75e168',1,'GooseEYE::Ensemble']]], + ['data_5fsecond_1',['data_second',['../classGooseEYE_1_1Ensemble.html#a4ba619521dc4bb98711f9ef5810b83db',1,'GooseEYE::Ensemble']]], + ['detail_2ehpp_2',['detail.hpp',['../detail_8hpp.html',1,'']]], + ['dilate_3',['dilate',['../namespaceGooseEYE.html#a4976e5bbf41b58472e028babb092bd85',1,'GooseEYE::dilate(const T &f, const S &kernel, size_t iterations=1, bool periodic=true)'],['../namespaceGooseEYE.html#a6bb0149c151f7255f796ac80bc57a031',1,'GooseEYE::dilate(const T &f, size_t iterations=1, bool periodic=true)'],['../namespaceGooseEYE.html#ae859f712898ed7d6e76a5ecaa114614a',1,'GooseEYE::dilate(const T &f, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)'],['../namespaceGooseEYE.html#a43f961d31fad8b606eedee2fcd4969b5',1,'GooseEYE::dilate(const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)']]], + ['dilate_2ehpp_4',['dilate.hpp',['../dilate_8hpp.html',1,'']]], + ['dim_5',['Dim',['../classGooseEYE_1_1ClusterLabeller.html#aef8c9c224f4e93c2569a7dcf90af2fd0',1,'GooseEYE::ClusterLabeller']]], + ['distance_6',['distance',['../classGooseEYE_1_1Ensemble.html#ab77c6d1691fe0aefe770255d5948a404',1,'GooseEYE::Ensemble::distance(const std::vector< double > &h, size_t axis) const'],['../classGooseEYE_1_1Ensemble.html#a9ef3f93cdd7ec475454d57e8173f328e',1,'GooseEYE::Ensemble::distance(const std::vector< double > &h) const'],['../classGooseEYE_1_1Ensemble.html#ae77e609fabe6882c93e43915d817db45',1,'GooseEYE::Ensemble::distance(size_t axis) const'],['../classGooseEYE_1_1Ensemble.html#abd9e39c44a7363332312a57b72ce4115',1,'GooseEYE::Ensemble::distance() const'],['../namespaceGooseEYE.html#adf4657193fc58978eed6ef274ebb93ed',1,'GooseEYE::distance(const std::vector< size_t > &roi)'],['../namespaceGooseEYE.html#a3d0010a207abd86a2811edfb32d22e21',1,'GooseEYE::distance(const std::vector< size_t > &roi, size_t axis)'],['../namespaceGooseEYE.html#a3097c5d07c0fe21227df46b79c133a23',1,'GooseEYE::distance(const std::vector< size_t > &roi, const std::vector< double > &h)'],['../namespaceGooseEYE.html#ab97f8ace23ac36134cfaab38a19b131b',1,'GooseEYE::distance(const std::vector< size_t > &roi, const std::vector< double > &h, size_t axis)']]], + ['dummy_5fcircles_7',['dummy_circles',['../namespaceGooseEYE.html#ab3570c9c90ad8e21f2ddba6dae537e3f',1,'GooseEYE::dummy_circles(const std::vector< size_t > &shape, const array_type::tensor< int, 1 > &row, const array_type::tensor< int, 1 > &col, const array_type::tensor< int, 1 > &r, bool periodic=true)'],['../namespaceGooseEYE.html#a607337e83a0a65c41ded829114a17ac6',1,'GooseEYE::dummy_circles(const std::vector< size_t > &shape, bool periodic=true, uint64_t seed=0)']]] +]; diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 00000000..0695e4b3 --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['ensemble_0',['ensemble',['../classGooseEYE_1_1Ensemble.html',1,'GooseEYE::Ensemble'],['../classGooseEYE_1_1Ensemble.html#a62c06a26344057024d5380c7b29199c4',1,'GooseEYE::Ensemble::Ensemble()=default'],['../classGooseEYE_1_1Ensemble.html#ab955729bb22bd3f210c97ff024136b10',1,'GooseEYE::Ensemble::Ensemble(const std::vector< size_t > &roi, bool periodic=true, bool variance=true)']]], + ['ensemble_2ehpp_1',['Ensemble.hpp',['../Ensemble_8hpp.html',1,'']]], + ['ensemble_5fc2_2ehpp_2',['Ensemble_C2.hpp',['../Ensemble__C2_8hpp.html',1,'']]], + ['ensemble_5fheightheight_2ehpp_3',['Ensemble_heightheight.hpp',['../Ensemble__heightheight_8hpp.html',1,'']]], + ['ensemble_5fl_2ehpp_4',['Ensemble_L.hpp',['../Ensemble__L_8hpp.html',1,'']]], + ['ensemble_5fmean_2ehpp_5',['Ensemble_mean.hpp',['../Ensemble__mean_8hpp.html',1,'']]], + ['ensemble_5fs2_2ehpp_6',['Ensemble_S2.hpp',['../Ensemble__S2_8hpp.html',1,'']]], + ['ensemble_5fw2_2ehpp_7',['Ensemble_W2.hpp',['../Ensemble__W2_8hpp.html',1,'']]], + ['ensemble_5fw2c_2ehpp_8',['Ensemble_W2c.hpp',['../Ensemble__W2c_8hpp.html',1,'']]] +]; diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 00000000..dceee598 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['full_0',['full',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320ae9dc924f238fa6cc29465942875fe8f0',1,'GooseEYE']]] +]; diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 00000000..f435a52b --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['gooseeye_0',['gooseeye',['../namespaceGooseEYE.html',1,'GooseEYE'],['../index.html',1,'GooseEYE'],['../index.html#autotoc_md0',1,'GooseEYE']]], + ['gooseeye_2eh_1',['GooseEYE.h',['../GooseEYE_8h.html',1,'']]], + ['gooseeye_2ehpp_2',['GooseEYE.hpp',['../GooseEYE_8hpp.html',1,'']]], + ['gooseeye_3a_3aarray_5ftype_3',['array_type',['../namespaceGooseEYE_1_1array__type.html',1,'GooseEYE']]], + ['gooseeye_3a_3akernel_4',['kernel',['../namespaceGooseEYE_1_1kernel.html',1,'GooseEYE']]], + ['gooseeye_5fassert_5',['GOOSEEYE_ASSERT',['../config_8h.html#a5f979e87d380e183a469f67875767599',1,'config.h']]], + ['gooseeye_5fversion_6',['GOOSEEYE_VERSION',['../version_8h.html#a741c94f281334d63b9f28dce5b22a515',1,'version.h']]], + ['gooseeye_5fwarning_7',['GOOSEEYE_WARNING',['../config_8h.html#a37bc6256ee9c5c2734fbb59e6cd64a46',1,'config.h']]], + ['gooseeye_5fwarning_5fpython_8',['GOOSEEYE_WARNING_PYTHON',['../config_8h.html#aa6b4e708f9162a83e53eb97bfd0298ca',1,'config.h']]] +]; diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 00000000..d8a01da4 --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['heightheight_0',['heightheight',['../classGooseEYE_1_1Ensemble.html#a7906697fd025f364d280c04bf2c0f0a9',1,'GooseEYE::Ensemble::heightheight(const T &f)'],['../classGooseEYE_1_1Ensemble.html#a798f357b778866b8824c6e5ec1d23b90',1,'GooseEYE::Ensemble::heightheight(const T &f, const M &fmask)'],['../namespaceGooseEYE.html#ae761eb00cac0021b5840df83814abf72',1,'GooseEYE::heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)'],['../namespaceGooseEYE.html#a5f658c332d5fc69e86bb44cb14930ce5',1,'GooseEYE::heightheight(const std::vector< size_t > &roi, const T &f, const M &fmask, bool periodic=true)']]] +]; diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 00000000..eb1b8864 --- /dev/null +++ b/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['kernel_2ehpp_0',['kernel.hpp',['../kernel_8hpp.html',1,'']]] +]; diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 00000000..e931cac9 --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['l_0',['l',['../classGooseEYE_1_1Ensemble.html#a202f65fb4aa0358814a9f69e0e1de270',1,'GooseEYE::Ensemble::L()'],['../namespaceGooseEYE.html#a43454c98d88250a5693a3696ca978cb4',1,'GooseEYE::L()']]], + ['labels_1',['labels',['../classGooseEYE_1_1ClusterLabeller.html#aa2bd8cf38cd68889140ab55b461056d3',1,'GooseEYE::ClusterLabeller::labels()'],['../classGooseEYE_1_1Clusters.html#aa21d853c25654cc1814600baba3abdcf',1,'GooseEYE::Clusters::labels()']]], + ['labels_5fmap_2',['labels_map',['../namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c',1,'GooseEYE']]], + ['labels_5frename_3',['labels_rename',['../namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a',1,'GooseEYE']]], + ['labels_5freorder_4',['labels_reorder',['../namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115',1,'GooseEYE']]], + ['labels_5fsizes_5',['labels_sizes',['../namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314',1,'GooseEYE']]] +]; diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 00000000..980fc32a --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mean_0',['mean',['../classGooseEYE_1_1Ensemble.html#a06699953adf0931ee6cf3a150cf3d306',1,'GooseEYE::Ensemble::mean(const T &f)'],['../classGooseEYE_1_1Ensemble.html#ad00333335de40cb6bfb1d1c410993cc0',1,'GooseEYE::Ensemble::mean(const T &f, const M &fmask)']]] +]; diff --git a/search/all_b.js b/search/all_b.js new file mode 100644 index 00000000..ce49179a --- /dev/null +++ b/search/all_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['nearest_0',['nearest',['../namespaceGooseEYE_1_1kernel.html#a306dfde37d04075f3a635200b2f528ed',1,'GooseEYE::kernel']]], + ['norm_1',['norm',['../classGooseEYE_1_1Ensemble.html#ae970b7a00ed2e1ce8a631fb54fed206a',1,'GooseEYE::Ensemble']]] +]; diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 00000000..7f132e25 --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['path_0',['path',['../namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add',1,'GooseEYE']]], + ['path_5fmode_1',['path_mode',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320',1,'GooseEYE']]], + ['periodic_2',['Periodic',['../classGooseEYE_1_1ClusterLabeller.html#a8c247970f5c488e63eac7ca3035370c4',1,'GooseEYE::ClusterLabeller']]], + ['pos2img_3',['pos2img',['../namespaceGooseEYE.html#a9f61eb8a8f1b67fa3cad845d0f1cdcc9',1,'GooseEYE']]], + ['prune_4',['prune',['../classGooseEYE_1_1ClusterLabeller.html#a009856504d69238a7f0950599827da60',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 00000000..04d416ed --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['relabel_5fmap_0',['relabel_map',['../namespaceGooseEYE.html#adf6675e27a31a0210c4bc94b09e814f3',1,'GooseEYE']]], + ['repr_1',['repr',['../classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7',1,'GooseEYE::ClusterLabeller']]], + ['reset_2',['reset',['../classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024',1,'GooseEYE::ClusterLabeller']]], + ['result_3',['result',['../classGooseEYE_1_1Ensemble.html#aca0906b15fc229f1183e6cd45c398c0d',1,'GooseEYE::Ensemble']]] +]; diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 00000000..4b9497aa --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['s2_0',['s2',['../classGooseEYE_1_1Ensemble.html#a3679472fd2dbcc55323beb3f8e5fa176',1,'GooseEYE::Ensemble::S2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#ab26b64c4d1dc58f5c9fedcc1fadc9f60',1,'GooseEYE::Ensemble::S2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#ae27103f5b7d6acda6fc2e14c8dfd11b3',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#ac01c192a6d398e2befc3aca36e953f0e',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['shape_1',['shape',['../classGooseEYE_1_1ClusterLabeller.html#a845972ee4e7dfe96242b56115d6f124c',1,'GooseEYE::ClusterLabeller']]], + ['size_2',['size',['../classGooseEYE_1_1ClusterLabeller.html#a150bfedd947d3492b1afe732a9a9a650',1,'GooseEYE::ClusterLabeller']]], + ['sizes_3',['sizes',['../classGooseEYE_1_1Clusters.html#a1b80ce240c3308714115338d190b353a',1,'GooseEYE::Clusters']]] +]; diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 00000000..332e67ff --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tensor_0',['tensor',['../namespaceGooseEYE_1_1array__type.html#a2990d2b991e50171d4d24abe34bf15e3',1,'GooseEYE::array_type']]] +]; diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 00000000..e59fc132 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['clusterlabeller_0',['ClusterLabeller',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]], + ['clusterlabeller_3c_20dimension_2c_20periodicity_20_3e_1',['ClusterLabeller< Dimension, Periodicity >',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]], + ['clusters_2',['Clusters',['../classGooseEYE_1_1Clusters.html',1,'GooseEYE']]] +]; diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 00000000..5dc5b8d6 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ensemble_0',['Ensemble',['../classGooseEYE_1_1Ensemble.html',1,'GooseEYE']]] +]; diff --git a/search/close.svg b/search/close.svg new file mode 100644 index 00000000..337d6cc1 --- /dev/null +++ b/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/search/defines_0.js b/search/defines_0.js new file mode 100644 index 00000000..b8683897 --- /dev/null +++ b/search/defines_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['gooseeye_5fassert_0',['GOOSEEYE_ASSERT',['../config_8h.html#a5f979e87d380e183a469f67875767599',1,'config.h']]], + ['gooseeye_5fversion_1',['GOOSEEYE_VERSION',['../version_8h.html#a741c94f281334d63b9f28dce5b22a515',1,'version.h']]], + ['gooseeye_5fwarning_2',['GOOSEEYE_WARNING',['../config_8h.html#a37bc6256ee9c5c2734fbb59e6cd64a46',1,'config.h']]], + ['gooseeye_5fwarning_5fpython_3',['GOOSEEYE_WARNING_PYTHON',['../config_8h.html#aa6b4e708f9162a83e53eb97bfd0298ca',1,'config.h']]] +]; diff --git a/search/enums_0.js b/search/enums_0.js new file mode 100644 index 00000000..7e5a6785 --- /dev/null +++ b/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['path_5fmode_0',['path_mode',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320',1,'GooseEYE']]] +]; diff --git a/search/enumvalues_0.js b/search/enumvalues_0.js new file mode 100644 index 00000000..e6f413d7 --- /dev/null +++ b/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['actual_0',['actual',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e',1,'GooseEYE']]] +]; diff --git a/search/enumvalues_1.js b/search/enumvalues_1.js new file mode 100644 index 00000000..fa6180b9 --- /dev/null +++ b/search/enumvalues_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bresenham_0',['Bresenham',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a20b83bc3afd59d747cc745d5f70f3695',1,'GooseEYE']]] +]; diff --git a/search/enumvalues_2.js b/search/enumvalues_2.js new file mode 100644 index 00000000..dceee598 --- /dev/null +++ b/search/enumvalues_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['full_0',['full',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320ae9dc924f238fa6cc29465942875fe8f0',1,'GooseEYE']]] +]; diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 00000000..822b58c1 --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['config_2eh_0',['config.h',['../config_8h.html',1,'']]] +]; diff --git a/search/files_1.js b/search/files_1.js new file mode 100644 index 00000000..bdbea89f --- /dev/null +++ b/search/files_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['detail_2ehpp_0',['detail.hpp',['../detail_8hpp.html',1,'']]], + ['dilate_2ehpp_1',['dilate.hpp',['../dilate_8hpp.html',1,'']]] +]; diff --git a/search/files_2.js b/search/files_2.js new file mode 100644 index 00000000..0eef1b06 --- /dev/null +++ b/search/files_2.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ensemble_2ehpp_0',['Ensemble.hpp',['../Ensemble_8hpp.html',1,'']]], + ['ensemble_5fc2_2ehpp_1',['Ensemble_C2.hpp',['../Ensemble__C2_8hpp.html',1,'']]], + ['ensemble_5fheightheight_2ehpp_2',['Ensemble_heightheight.hpp',['../Ensemble__heightheight_8hpp.html',1,'']]], + ['ensemble_5fl_2ehpp_3',['Ensemble_L.hpp',['../Ensemble__L_8hpp.html',1,'']]], + ['ensemble_5fmean_2ehpp_4',['Ensemble_mean.hpp',['../Ensemble__mean_8hpp.html',1,'']]], + ['ensemble_5fs2_2ehpp_5',['Ensemble_S2.hpp',['../Ensemble__S2_8hpp.html',1,'']]], + ['ensemble_5fw2_2ehpp_6',['Ensemble_W2.hpp',['../Ensemble__W2_8hpp.html',1,'']]], + ['ensemble_5fw2c_2ehpp_7',['Ensemble_W2c.hpp',['../Ensemble__W2c_8hpp.html',1,'']]] +]; diff --git a/search/files_3.js b/search/files_3.js new file mode 100644 index 00000000..7d7c4a8f --- /dev/null +++ b/search/files_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gooseeye_2eh_0',['GooseEYE.h',['../GooseEYE_8h.html',1,'']]], + ['gooseeye_2ehpp_1',['GooseEYE.hpp',['../GooseEYE_8hpp.html',1,'']]] +]; diff --git a/search/files_4.js b/search/files_4.js new file mode 100644 index 00000000..eb1b8864 --- /dev/null +++ b/search/files_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['kernel_2ehpp_0',['kernel.hpp',['../kernel_8hpp.html',1,'']]] +]; diff --git a/search/files_5.js b/search/files_5.js new file mode 100644 index 00000000..48238f1a --- /dev/null +++ b/search/files_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['version_2eh_0',['version.h',['../version_8h.html',1,'']]], + ['version_2ehpp_1',['version.hpp',['../version_8hpp.html',1,'']]] +]; diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 00000000..8c012f23 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['add_5fimage_0',['add_image',['../classGooseEYE_1_1ClusterLabeller.html#a141c63eddd8e766741ebf08b2b473136',1,'GooseEYE::ClusterLabeller']]], + ['add_5fpoints_1',['add_points',['../classGooseEYE_1_1ClusterLabeller.html#a9a88b743156388bf650af378c93d1ef4',1,'GooseEYE::ClusterLabeller::add_points(const T &begin, const T &end)'],['../classGooseEYE_1_1ClusterLabeller.html#ac239e876dfcf25f34748cf7b8ca8d704',1,'GooseEYE::ClusterLabeller::add_points(const T &idx)']]] +]; diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 00000000..ad019af8 --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['c2_0',['c2',['../classGooseEYE_1_1Ensemble.html#af52ed25e986f699a846e09498fd25928',1,'GooseEYE::Ensemble::C2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#aa6b103383499bbce8a6dc4caebbfe710',1,'GooseEYE::Ensemble::C2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#a6f8454f08a6b048290f36618cc80986b',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#a867ce41fed448b5442ad8f6e6011b8b1',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['center_5fof_5fmass_1',['center_of_mass',['../namespaceGooseEYE.html#a532a7f3db5f55172b92169fa5171b335',1,'GooseEYE']]], + ['center_5fpositions_2',['center_positions',['../classGooseEYE_1_1Clusters.html#af483dfcd99cbde06752540688f65a630',1,'GooseEYE::Clusters']]], + ['centers_3',['centers',['../classGooseEYE_1_1Clusters.html#a0831a128220907113b24b1fcd8ebb292',1,'GooseEYE::Clusters']]], + ['clusterlabeller_4',['clusterlabeller',['../classGooseEYE_1_1ClusterLabeller.html#a259275eedd9e65e152c01eff377c5344',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape)'],['../classGooseEYE_1_1ClusterLabeller.html#a4937ee10526225c0f985c1c19347cef6',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape, const K &kernel)']]], + ['clusters_5',['clusters',['../classGooseEYE_1_1Clusters.html#a7d29a717247b02b7510c3598472eaa69',1,'GooseEYE::Clusters::Clusters(const T &f, bool periodic=true)'],['../classGooseEYE_1_1Clusters.html#a6e1d03b02054326ab6cb3eaead9ca0c5',1,'GooseEYE::Clusters::Clusters(const T &f, const S &kernel, bool periodic=true)'],['../namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2',1,'GooseEYE::clusters()']]] +]; diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 00000000..4434156b --- /dev/null +++ b/search/functions_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['data_5ffirst_0',['data_first',['../classGooseEYE_1_1Ensemble.html#aa0c38a6aebc69df4cddeb4eb4c75e168',1,'GooseEYE::Ensemble']]], + ['data_5fsecond_1',['data_second',['../classGooseEYE_1_1Ensemble.html#a4ba619521dc4bb98711f9ef5810b83db',1,'GooseEYE::Ensemble']]], + ['dilate_2',['dilate',['../namespaceGooseEYE.html#a43f961d31fad8b606eedee2fcd4969b5',1,'GooseEYE::dilate(const T &f, const S &kernel, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)'],['../namespaceGooseEYE.html#ae859f712898ed7d6e76a5ecaa114614a',1,'GooseEYE::dilate(const T &f, const array_type::tensor< size_t, 1 > &iterations, bool periodic=true)'],['../namespaceGooseEYE.html#a6bb0149c151f7255f796ac80bc57a031',1,'GooseEYE::dilate(const T &f, size_t iterations=1, bool periodic=true)'],['../namespaceGooseEYE.html#a4976e5bbf41b58472e028babb092bd85',1,'GooseEYE::dilate(const T &f, const S &kernel, size_t iterations=1, bool periodic=true)']]], + ['distance_3',['distance',['../classGooseEYE_1_1Ensemble.html#abd9e39c44a7363332312a57b72ce4115',1,'GooseEYE::Ensemble::distance() const'],['../classGooseEYE_1_1Ensemble.html#ae77e609fabe6882c93e43915d817db45',1,'GooseEYE::Ensemble::distance(size_t axis) const'],['../classGooseEYE_1_1Ensemble.html#a9ef3f93cdd7ec475454d57e8173f328e',1,'GooseEYE::Ensemble::distance(const std::vector< double > &h) const'],['../classGooseEYE_1_1Ensemble.html#ab77c6d1691fe0aefe770255d5948a404',1,'GooseEYE::Ensemble::distance(const std::vector< double > &h, size_t axis) const'],['../namespaceGooseEYE.html#adf4657193fc58978eed6ef274ebb93ed',1,'GooseEYE::distance(const std::vector< size_t > &roi)'],['../namespaceGooseEYE.html#a3d0010a207abd86a2811edfb32d22e21',1,'GooseEYE::distance(const std::vector< size_t > &roi, size_t axis)'],['../namespaceGooseEYE.html#a3097c5d07c0fe21227df46b79c133a23',1,'GooseEYE::distance(const std::vector< size_t > &roi, const std::vector< double > &h)'],['../namespaceGooseEYE.html#ab97f8ace23ac36134cfaab38a19b131b',1,'GooseEYE::distance(const std::vector< size_t > &roi, const std::vector< double > &h, size_t axis)']]], + ['dummy_5fcircles_4',['dummy_circles',['../namespaceGooseEYE.html#ab3570c9c90ad8e21f2ddba6dae537e3f',1,'GooseEYE::dummy_circles(const std::vector< size_t > &shape, const array_type::tensor< int, 1 > &row, const array_type::tensor< int, 1 > &col, const array_type::tensor< int, 1 > &r, bool periodic=true)'],['../namespaceGooseEYE.html#a607337e83a0a65c41ded829114a17ac6',1,'GooseEYE::dummy_circles(const std::vector< size_t > &shape, bool periodic=true, uint64_t seed=0)']]] +]; diff --git a/search/functions_3.js b/search/functions_3.js new file mode 100644 index 00000000..0044ed57 --- /dev/null +++ b/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ensemble_0',['ensemble',['../classGooseEYE_1_1Ensemble.html#a62c06a26344057024d5380c7b29199c4',1,'GooseEYE::Ensemble::Ensemble()=default'],['../classGooseEYE_1_1Ensemble.html#ab955729bb22bd3f210c97ff024136b10',1,'GooseEYE::Ensemble::Ensemble(const std::vector< size_t > &roi, bool periodic=true, bool variance=true)']]] +]; diff --git a/search/functions_4.js b/search/functions_4.js new file mode 100644 index 00000000..d8a01da4 --- /dev/null +++ b/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['heightheight_0',['heightheight',['../classGooseEYE_1_1Ensemble.html#a7906697fd025f364d280c04bf2c0f0a9',1,'GooseEYE::Ensemble::heightheight(const T &f)'],['../classGooseEYE_1_1Ensemble.html#a798f357b778866b8824c6e5ec1d23b90',1,'GooseEYE::Ensemble::heightheight(const T &f, const M &fmask)'],['../namespaceGooseEYE.html#ae761eb00cac0021b5840df83814abf72',1,'GooseEYE::heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)'],['../namespaceGooseEYE.html#a5f658c332d5fc69e86bb44cb14930ce5',1,'GooseEYE::heightheight(const std::vector< size_t > &roi, const T &f, const M &fmask, bool periodic=true)']]] +]; diff --git a/search/functions_5.js b/search/functions_5.js new file mode 100644 index 00000000..e931cac9 --- /dev/null +++ b/search/functions_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['l_0',['l',['../classGooseEYE_1_1Ensemble.html#a202f65fb4aa0358814a9f69e0e1de270',1,'GooseEYE::Ensemble::L()'],['../namespaceGooseEYE.html#a43454c98d88250a5693a3696ca978cb4',1,'GooseEYE::L()']]], + ['labels_1',['labels',['../classGooseEYE_1_1ClusterLabeller.html#aa2bd8cf38cd68889140ab55b461056d3',1,'GooseEYE::ClusterLabeller::labels()'],['../classGooseEYE_1_1Clusters.html#aa21d853c25654cc1814600baba3abdcf',1,'GooseEYE::Clusters::labels()']]], + ['labels_5fmap_2',['labels_map',['../namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c',1,'GooseEYE']]], + ['labels_5frename_3',['labels_rename',['../namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a',1,'GooseEYE']]], + ['labels_5freorder_4',['labels_reorder',['../namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115',1,'GooseEYE']]], + ['labels_5fsizes_5',['labels_sizes',['../namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314',1,'GooseEYE']]] +]; diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 00000000..980fc32a --- /dev/null +++ b/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mean_0',['mean',['../classGooseEYE_1_1Ensemble.html#a06699953adf0931ee6cf3a150cf3d306',1,'GooseEYE::Ensemble::mean(const T &f)'],['../classGooseEYE_1_1Ensemble.html#ad00333335de40cb6bfb1d1c410993cc0',1,'GooseEYE::Ensemble::mean(const T &f, const M &fmask)']]] +]; diff --git a/search/functions_7.js b/search/functions_7.js new file mode 100644 index 00000000..ce49179a --- /dev/null +++ b/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['nearest_0',['nearest',['../namespaceGooseEYE_1_1kernel.html#a306dfde37d04075f3a635200b2f528ed',1,'GooseEYE::kernel']]], + ['norm_1',['norm',['../classGooseEYE_1_1Ensemble.html#ae970b7a00ed2e1ce8a631fb54fed206a',1,'GooseEYE::Ensemble']]] +]; diff --git a/search/functions_8.js b/search/functions_8.js new file mode 100644 index 00000000..a15bd426 --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['path_0',['path',['../namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add',1,'GooseEYE']]], + ['pos2img_1',['pos2img',['../namespaceGooseEYE.html#a9f61eb8a8f1b67fa3cad845d0f1cdcc9',1,'GooseEYE']]], + ['prune_2',['prune',['../classGooseEYE_1_1ClusterLabeller.html#a009856504d69238a7f0950599827da60',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/functions_9.js b/search/functions_9.js new file mode 100644 index 00000000..04d416ed --- /dev/null +++ b/search/functions_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['relabel_5fmap_0',['relabel_map',['../namespaceGooseEYE.html#adf6675e27a31a0210c4bc94b09e814f3',1,'GooseEYE']]], + ['repr_1',['repr',['../classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7',1,'GooseEYE::ClusterLabeller']]], + ['reset_2',['reset',['../classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024',1,'GooseEYE::ClusterLabeller']]], + ['result_3',['result',['../classGooseEYE_1_1Ensemble.html#aca0906b15fc229f1183e6cd45c398c0d',1,'GooseEYE::Ensemble']]] +]; diff --git a/search/functions_a.js b/search/functions_a.js new file mode 100644 index 00000000..4b9497aa --- /dev/null +++ b/search/functions_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['s2_0',['s2',['../classGooseEYE_1_1Ensemble.html#a3679472fd2dbcc55323beb3f8e5fa176',1,'GooseEYE::Ensemble::S2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#ab26b64c4d1dc58f5c9fedcc1fadc9f60',1,'GooseEYE::Ensemble::S2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#ae27103f5b7d6acda6fc2e14c8dfd11b3',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#ac01c192a6d398e2befc3aca36e953f0e',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['shape_1',['shape',['../classGooseEYE_1_1ClusterLabeller.html#a845972ee4e7dfe96242b56115d6f124c',1,'GooseEYE::ClusterLabeller']]], + ['size_2',['size',['../classGooseEYE_1_1ClusterLabeller.html#a150bfedd947d3492b1afe732a9a9a650',1,'GooseEYE::ClusterLabeller']]], + ['sizes_3',['sizes',['../classGooseEYE_1_1Clusters.html#a1b80ce240c3308714115338d190b353a',1,'GooseEYE::Clusters']]] +]; diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 00000000..c650ba82 --- /dev/null +++ b/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['variance_0',['variance',['../classGooseEYE_1_1Ensemble.html#a75973e36d209e8a0b2a61c22a4bb7a4e',1,'GooseEYE::Ensemble']]], + ['version_1',['version',['../namespaceGooseEYE.html#abc99a3a1ab42cd9514f08b7530d300f3',1,'GooseEYE']]] +]; diff --git a/search/functions_c.js b/search/functions_c.js new file mode 100644 index 00000000..94e3868a --- /dev/null +++ b/search/functions_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['w2_0',['w2',['../classGooseEYE_1_1Ensemble.html#aaf81f5284e4e67d0e740a8a21d6072b4',1,'GooseEYE::Ensemble::W2(const T &w, const T &f)'],['../classGooseEYE_1_1Ensemble.html#a129ef0a0165a13f8c9d016e8bb02c7e3',1,'GooseEYE::Ensemble::W2(const T &w, const T &f, const M &fmask)'],['../namespaceGooseEYE.html#aaa2055a53f179e2ddd810ebaf9eaf837',1,'GooseEYE::W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)'],['../namespaceGooseEYE.html#ab349faaa82c253cea9d67996cb9749c7',1,'GooseEYE::W2(const std::vector< size_t > &roi, const T &w, const T &f, const M &fmask, bool periodic=true)']]], + ['w2c_1',['w2c',['../classGooseEYE_1_1Ensemble.html#a95a025460b591dc74caeab3386e9cd7d',1,'GooseEYE::Ensemble::W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)'],['../classGooseEYE_1_1Ensemble.html#a99457cc94be42c86d6de699aa779ebea',1,'GooseEYE::Ensemble::W2c(const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham)'],['../namespaceGooseEYE.html#a55b550567256dee0da56ac22fd2be72a',1,'GooseEYE::W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)'],['../namespaceGooseEYE.html#a989df0528b84e5e0f4da84062785ee8b',1,'GooseEYE::W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham, bool periodic=true)']]] +]; diff --git a/search/mag.svg b/search/mag.svg new file mode 100644 index 00000000..ffb6cf0d --- /dev/null +++ b/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/search/mag_d.svg b/search/mag_d.svg new file mode 100644 index 00000000..4122773f --- /dev/null +++ b/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/search/mag_sel.svg b/search/mag_sel.svg new file mode 100644 index 00000000..553dba87 --- /dev/null +++ b/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/search/mag_seld.svg b/search/mag_seld.svg new file mode 100644 index 00000000..c906f84c --- /dev/null +++ b/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/search/namespaces_0.js b/search/namespaces_0.js new file mode 100644 index 00000000..c0e264c8 --- /dev/null +++ b/search/namespaces_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['gooseeye_0',['GooseEYE',['../namespaceGooseEYE.html',1,'']]], + ['gooseeye_3a_3aarray_5ftype_1',['array_type',['../namespaceGooseEYE_1_1array__type.html',1,'GooseEYE']]], + ['gooseeye_3a_3akernel_2',['kernel',['../namespaceGooseEYE_1_1kernel.html',1,'GooseEYE']]] +]; diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 00000000..5c803263 --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gooseeye_0',['GooseEYE',['../index.html',1,'']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 00000000..19f76f9d --- /dev/null +++ b/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 00000000..6fd40c67 --- /dev/null +++ b/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; eli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/version_8h.html b/version_8h.html new file mode 100644 index 00000000..99009327 --- /dev/null +++ b/version_8h.html @@ -0,0 +1,173 @@ + + + + + + + +GooseEYE: GooseEYE/version.h File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    version.h File Reference
    +
    +
    +
    #include "config.h"
    +#include "version.hpp"
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

    namespace  GooseEYE
     Toolbox to compute statistics.
     
    + + + + +

    +Macros

    #define GOOSEEYE_VERSION   "@PROJECT_VERSION@"
     Current version.
     
    + + + + +

    +Functions

    std::string GooseEYE::version ()
     Return version string, e.g.
     
    +

    Detailed Description

    +
    +
    License: This project is released under the GPLv3 License.
    + +

    Definition in file version.h.

    +

    Macro Definition Documentation

    + +

    ◆ GOOSEEYE_VERSION

    + +
    +
    + + + + +
    #define GOOSEEYE_VERSION   "@PROJECT_VERSION@"
    +
    + +

    Current version.

    +

    Either:

    +
      +
    • Configure using CMake at install time. Internally uses::
      python -c "from setuptools_scm import get_version; print(get_version())"
      +
    • +
    • Define externally using::
      MYVERSION=`python -c "from setuptools_scm import get_version; print(get_version())"`
      +-DGOOSEEYE_VERSION="$MYVERSION"
      +
      From the root of this project. This is what setup.py does.
    • +
    +

    Note that both CMakeLists.txt and setup.py will construct the version using setuptools_scm. Tip: use the environment variable SETUPTOOLS_SCM_PRETEND_VERSION to overwrite the automatic version.

    + +

    Definition at line 33 of file version.h.

    + +
    +
    +
    +
    + + + + diff --git a/version_8h.js b/version_8h.js new file mode 100644 index 00000000..0f077466 --- /dev/null +++ b/version_8h.js @@ -0,0 +1,5 @@ +var version_8h = +[ + [ "GOOSEEYE_VERSION", "version_8h.html#a741c94f281334d63b9f28dce5b22a515", null ], + [ "version", "version_8h.html#abc99a3a1ab42cd9514f08b7530d300f3", null ] +]; \ No newline at end of file diff --git a/version_8h_source.html b/version_8h_source.html new file mode 100644 index 00000000..4a833263 --- /dev/null +++ b/version_8h_source.html @@ -0,0 +1,141 @@ + + + + + + + +GooseEYE: GooseEYE/version.h Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    version.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    7#ifndef GOOSEEYE_VERSION_H
    +
    8#define GOOSEEYE_VERSION_H
    +
    9
    +
    10#include "config.h"
    +
    11
    +
    32#ifndef GOOSEEYE_VERSION
    +
    33#define GOOSEEYE_VERSION "@PROJECT_VERSION@"
    +
    34#endif
    +
    35
    +
    36namespace GooseEYE {
    +
    37
    +
    42inline std::string version();
    +
    43
    +
    44} // namespace GooseEYE
    +
    45
    +
    46#include "version.hpp"
    +
    47
    +
    48#endif
    + +
    Toolbox to compute statistics.
    Definition config.h:121
    +
    std::string version()
    Return version string, e.g.
    Definition version.hpp:25
    + +
    +
    + + + + diff --git a/version_8hpp.html b/version_8hpp.html new file mode 100644 index 00000000..a731382c --- /dev/null +++ b/version_8hpp.html @@ -0,0 +1,137 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    version.hpp File Reference
    +
    +
    +
    #include "version.h"
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

    namespace  GooseEYE
     Toolbox to compute statistics.
     
    + + + + +

    +Functions

    std::string GooseEYE::version ()
     Return version string, e.g.
     
    +

    Detailed Description

    +
    +
    License: This project is released under the GPLv3 License.
    + +

    Definition in file version.hpp.

    +
    +
    + + + + diff --git a/version_8hpp.js b/version_8hpp.js new file mode 100644 index 00000000..94734383 --- /dev/null +++ b/version_8hpp.js @@ -0,0 +1,4 @@ +var version_8hpp = +[ + [ "version", "version_8hpp.html#abc99a3a1ab42cd9514f08b7530d300f3", null ] +]; \ No newline at end of file diff --git a/version_8hpp_source.html b/version_8hpp_source.html new file mode 100644 index 00000000..868ce64b --- /dev/null +++ b/version_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.7.2.dev18+g9cd2bce +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    version.hpp
    +
    +
    +Go to the documentation of this file.
    1
    +
    7#ifndef GOOSEEYE_VERSION_HPP
    +
    8#define GOOSEEYE_VERSION_HPP
    +
    9
    +
    10#include "version.h"
    +
    11
    +
    12namespace GooseEYE {
    +
    13
    +
    14namespace detail {
    +
    15
    +
    16inline std::string unquote(const std::string& arg)
    +
    17{
    +
    18 std::string ret = arg;
    +
    19 ret.erase(std::remove(ret.begin(), ret.end(), '\"'), ret.end());
    +
    20 return ret;
    +
    21}
    +
    22
    +
    23} // namespace detail
    +
    24
    +
    +
    25inline std::string version()
    +
    26{
    +
    27 return detail::unquote(std::string(QUOTE(GOOSEEYE_VERSION)));
    +
    28}
    +
    +
    29
    +
    30} // namespace GooseEYE
    +
    31
    +
    32#endif
    +
    Toolbox to compute statistics.
    Definition config.h:121
    +
    std::string version()
    Return version string, e.g.
    Definition version.hpp:25
    + +
    #define GOOSEEYE_VERSION
    Current version.
    Definition version.h:33
    +
    +
    + + + +