diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/Ensemble_8hpp.html b/Ensemble_8hpp.html new file mode 100644 index 0000000..6b67b9a --- /dev/null +++ b/Ensemble_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..a0a34ee --- /dev/null +++ b/Ensemble_8hpp_source.html @@ -0,0 +1,279 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/Ensemble__C2_8hpp.html b/Ensemble__C2_8hpp.html new file mode 100644 index 0000000..571dda7 --- /dev/null +++ b/Ensemble__C2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_C2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..e2fef41 --- /dev/null +++ b/Ensemble__C2_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_C2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/Ensemble__L_8hpp.html b/Ensemble__L_8hpp.html new file mode 100644 index 0000000..a75ed32 --- /dev/null +++ b/Ensemble__L_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_L.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..49456ae --- /dev/null +++ b/Ensemble__L_8hpp_source.html @@ -0,0 +1,216 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_L.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
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 0000000..17a3589 --- /dev/null +++ b/Ensemble__S2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_S2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..81a8772 --- /dev/null +++ b/Ensemble__S2_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_S2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/Ensemble__W2_8hpp.html b/Ensemble__W2_8hpp.html new file mode 100644 index 0000000..9fddccb --- /dev/null +++ b/Ensemble__W2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..6937b0c --- /dev/null +++ b/Ensemble__W2_8hpp_source.html @@ -0,0 +1,206 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/Ensemble__W2c_8hpp.html b/Ensemble__W2c_8hpp.html new file mode 100644 index 0000000..18030ae --- /dev/null +++ b/Ensemble__W2c_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2c.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..4de11ae --- /dev/null +++ b/Ensemble__W2c_8hpp_source.html @@ -0,0 +1,256 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2c.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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
+ +
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
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:1012
+
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 0000000..e2c95a2 --- /dev/null +++ b/Ensemble__heightheight_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_heightheight.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..a30172f --- /dev/null +++ b/Ensemble__heightheight_8hpp_source.html @@ -0,0 +1,210 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_heightheight.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/Ensemble__mean_8hpp.html b/Ensemble__mean_8hpp.html new file mode 100644 index 0000000..8056989 --- /dev/null +++ b/Ensemble__mean_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_mean.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..6083ec3 --- /dev/null +++ b/Ensemble__mean_8hpp_source.html @@ -0,0 +1,169 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_mean.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/GooseEYE_8h.html b/GooseEYE_8h.html new file mode 100644 index 0000000..f48f51a --- /dev/null +++ b/GooseEYE_8h.html @@ -0,0 +1,297 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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::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 >
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 T >
GooseEYE::labels_prune (const T &labels)
 Prune labels: renumber labels to lowest possible label starting from 1.
 
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 , class N >
array_type::tensor< typename T::value_type, 1 > GooseEYE::labels_sizes (const T &labels, const N &names)
 Size per label.
 
template<class T >
array_type::array< int > GooseEYE::clusters (const T &f, bool periodic=true)
 Compute clusters.
 
array_type::tensor< double, 1 > GooseEYE::center (const array_type::tensor< double, 1 > &shape, const array_type::tensor< double, 2 > &positions, bool periodic=true)
 Return the geometric center of a list of positions.
 
array_type::tensor< double, 1 > GooseEYE::center_of_mass (const array_type::tensor< double, 1 > &shape, const array_type::tensor< double, 2 > &positions, const array_type::tensor< double, 1 > &weights, bool periodic=true)
 Return the geometric center of a list of positions.
 
template<class T , class N >
array_type::tensor< double, 2 > GooseEYE::labels_centers (const T &labels, const N &names, bool periodic=true)
 Get the position of the center of each label.
 
template<class T , class W , class N >
array_type::tensor< double, 2 > GooseEYE::labels_centers_of_mass (const T &labels, const W &weights, const N &names, 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 0000000..9a1d892 --- /dev/null +++ b/GooseEYE_8h.js @@ -0,0 +1,44 @@ +var GooseEYE_8h = +[ + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "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", "GooseEYE_8h.html#a31035d0d76c452f5c68ef4cfabaaa843", null ], + [ "center_of_mass", "GooseEYE_8h.html#a22b5a1880c3622fcf4d1113f997567cd", 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_centers", "GooseEYE_8h.html#a8cb5ff11ff0e2202efd518578aec7bb9", null ], + [ "labels_centers_of_mass", "GooseEYE_8h.html#a0b7623525069f7e1839f9981bd74bbd5", null ], + [ "labels_map", "GooseEYE_8h.html#a6094d2e17d15643de7c45abd30f5ee6c", null ], + [ "labels_prune", "GooseEYE_8h.html#a45d7b4463cd0c2c10fbe2b6827900cda", null ], + [ "labels_rename", "GooseEYE_8h.html#a9ec9f5ff4d454ff11259bd8605b6ca2a", null ], + [ "labels_reorder", "GooseEYE_8h.html#aff1767fb399e78e3eb58f1938ec9d115", null ], + [ "labels_sizes", "GooseEYE_8h.html#a574f4bf714a747297f82c835f806f314", null ], + [ "labels_sizes", "GooseEYE_8h.html#a3ad17cff4b60d439cb1a817ebf8588ee", null ], + [ "nearest", "GooseEYE_8h.html#a306dfde37d04075f3a635200b2f528ed", null ], + [ "path", "GooseEYE_8h.html#ac27cb5922686e23dbd84d313579b2add", 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 0000000..965009e --- /dev/null +++ b/GooseEYE_8h_source.html @@ -0,0 +1,1377 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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>
+
+ +
243{
+
244 using value_type = typename T::value_type;
+
245 std::map<value_type, value_type> map;
+
246
+
247 for (size_t i = 0; i < a.size(); ++i) {
+
248 map.try_emplace(a.flat(i), b.flat(i));
+
249 }
+
250
+
251 size_t i = 0;
+ +
253 xt::empty<typename T::value_type>(std::array<size_t, 2>{map.size(), 2});
+
254
+
255 for (auto const& [key, val] : map) {
+
256 ret(i, 0) = key;
+
257 ret(i, 1) = val;
+
258 ++i;
+
259 }
+
260
+
261 return ret;
+
262}
+
+
263
+
270template <class L, class A>
+
+
271inline L labels_rename(const L& labels, const A& rename)
+
272{
+
273 GOOSEEYE_ASSERT(rename.dimension() == 2, std::out_of_range);
+
274 GOOSEEYE_ASSERT(rename.shape(1) == 2, std::out_of_range);
+
275 using value_type = typename A::value_type;
+
276 std::map<value_type, value_type> map;
+
277 for (size_t i = 0; i < rename.shape(0); ++i) {
+
278 map.emplace(rename(i, 0), rename(i, 1));
+
279 }
+
280
+
281#ifdef GOOSEEYE_ENABLE_ASSERT
+
282 auto l = xt::unique(labels);
+
283 for (size_t i = 0; i < l.size(); ++i) {
+
284 GOOSEEYE_ASSERT(map.count(l(i)) > 0, std::out_of_range);
+
285 }
+
286#endif
+
287
+
288 L ret = xt::empty_like(labels);
+
289 for (size_t i = 0; i < labels.size(); ++i) {
+
290 ret.flat(i) = map[labels.flat(i)];
+
291 }
+
292
+
293 return ret;
+
294}
+
+
295
+
303template <class T>
+
+
304inline T labels_prune(const T& labels)
+
305{
+
306 using value_type = typename T::value_type;
+
307 auto unq = xt::unique(labels);
+
308 bool background = xt::any(xt::equal(unq, 0));
+
309
+
310 std::array<size_t, 2> shape = {unq.size(), 2};
+
311 array_type::tensor<value_type, 2> rename = xt::empty<value_type>(shape);
+
312
+
313 if (background) {
+
314 rename(0, 0) = 0;
+
315 rename(0, 1) = 0;
+
316 if (unq(0) == 0) {
+
317 for (size_t i = 1; i < unq.size(); ++i) {
+
318 rename(i, 0) = unq(i);
+
319 rename(i, 1) = i;
+
320 }
+
321 }
+
322 else {
+
323 size_t row = 1;
+
324 for (size_t i = 0; i < unq.size(); ++i) {
+
325 if (unq(i) == 0) {
+
326 continue;
+
327 }
+
328 rename(row, 0) = unq(i);
+
329 rename(row, 1) = row;
+
330 row++;
+
331 }
+
332 }
+
333 }
+
334 else {
+
335 for (size_t i = 0; i < unq.size(); ++i) {
+
336 rename(i, 0) = unq(i);
+
337 rename(i, 1) = i + 1;
+
338 }
+
339 }
+
340 return labels_rename(labels, rename);
+
341}
+
+
342
+
349template <class L, class A>
+
+
350inline L labels_reorder(const L& labels, const A& order)
+
351{
+
352#ifdef GOOSEEYE_ENABLE_ASSERT
+
353 auto a = xt::unique(labels);
+
354 auto b = xt::unique(order);
+
355 GOOSEEYE_ASSERT(a.size() == b.size(), std::out_of_range);
+
356 GOOSEEYE_ASSERT(xt::all(xt::equal(a, b)), std::out_of_range);
+
357#endif
+
358
+
359 auto maxlab = *std::max_element(order.begin(), order.end());
+
360 std::vector<typename A::value_type> renum(maxlab + 1);
+
361
+
362 for (size_t i = 0; i < order.size(); ++i) {
+
363 renum[order[i]] = i;
+
364 }
+
365
+
366 L ret = xt::empty_like(labels);
+
367 for (size_t i = 0; i < labels.size(); ++i) {
+
368 ret.flat(i) = renum[labels.flat(i)];
+
369 }
+
370
+
371 return ret;
+
372}
+
+
373
+
374namespace detail {
+
375
+
376template <class T>
+
377inline auto labels_sizes_impl(const T& labels)
+
378{
+
379 using value_type = typename T::value_type;
+
380 std::map<value_type, value_type> map;
+
381
+
382 for (size_t i = 0; i < labels.size(); ++i) {
+
383 if (map.count(labels.flat(i)) == 0) {
+
384 map.emplace(labels.flat(i), 1);
+
385 }
+
386 else {
+
387 map[labels.flat(i)]++;
+
388 }
+
389 }
+
390
+
391 return map;
+
392}
+
393
+
394} // namespace detail
+
395
+
401template <class T>
+
+ +
403{
+
404 using value_type = typename T::value_type;
+
405 auto map = detail::labels_sizes_impl(labels);
+
406 std::array<size_t, 2> shape = {map.size(), 2};
+
407 array_type::tensor<value_type, 2> ret = xt::empty<value_type>(shape);
+
408 size_t i = 0;
+
409
+
410 for (auto const& [key, val] : map) {
+
411 ret(i, 0) = key;
+
412 ret(i, 1) = val;
+
413 ++i;
+
414 }
+
415
+
416 return ret;
+
417}
+
+
418
+
425template <class T, class N>
+
+
426inline array_type::tensor<typename T::value_type, 1> labels_sizes(const T& labels, const N& names)
+
427{
+
428 using value_type = typename T::value_type;
+
429 auto map = detail::labels_sizes_impl(labels);
+
430 array_type::tensor<value_type, 1> ret = xt::zeros<value_type>({names.size()});
+
431 for (size_t i = 0; i < names.size(); ++i) {
+
432 ret(i) = map[names(i)];
+
433 }
+
434 return ret;
+
435}
+
+
436
+
437namespace detail {
+
438
+
444template <size_t Dim, class T>
+
445inline array_type::tensor<ptrdiff_t, 2> kernel_to_dx(T kernel)
+
446{
+
447#ifdef GOOSEEYE_ENABLE_ASSERT
+
448 for (size_t i = 0; i < Dim; ++i) {
+
449 GOOSEEYE_ASSERT(kernel.shape(i) % 2 == 1, std::out_of_range);
+
450 }
+
451#endif
+
452
+
453 std::array<size_t, Dim> mid;
+
454 for (size_t i = 0; i < Dim; ++i) {
+
455 mid[i] = (kernel.shape(i) - 1) / 2;
+
456 }
+
457 size_t idx = 0;
+
458 for (size_t i = 0; i < Dim; ++i) {
+
459 idx += mid[i] * kernel.strides()[i];
+
460 }
+
461 GOOSEEYE_ASSERT(kernel.flat(idx) == 1, std::out_of_range);
+
462 kernel.flat(idx) = 0;
+
463
+
464 if constexpr (Dim == 1) {
+
465 auto i = xt::flatten_indices(xt::argwhere(kernel)) - mid[0];
+
466 array_type::tensor<ptrdiff_t, 2> ret = xt::empty<ptrdiff_t>({i.size(), size_t(1)});
+
467 std::copy(i.begin(), i.end(), ret.begin());
+
468 return ret;
+
469 }
+
470
+
471 auto ret = xt::from_indices(xt::argwhere(kernel));
+
472 for (size_t i = 0; i < Dim; ++i) {
+
473 xt::view(ret, xt::all(), i) -= mid[i];
+
474 }
+
475 return ret;
+
476}
+
477
+
478} // namespace detail
+
479
+
485template <size_t Dimension, bool Periodicity = true>
+
+ +
487public:
+
488 static constexpr size_t Dim = Dimension;
+
489 static constexpr bool Periodic = Periodicity;
+
490
+
491private:
+
492 std::array<ptrdiff_t, Dim> m_shape;
+ + +
495 ptrdiff_t m_new_label = 1;
+
496 size_t m_nmerge = 0;
+
497 std::array<ptrdiff_t, Dim> m_strides;
+
498
+
505 std::vector<ptrdiff_t> m_renum;
+
506
+
517 std::vector<ptrdiff_t> m_next;
+
518 std::vector<ptrdiff_t> m_connected;
+
519
+
520 typedef ptrdiff_t (ClusterLabeller<Dimension, Periodicity>::*CompareImpl)(size_t, size_t);
+ +
522
+
523public:
+
527 template <class T>
+
+ +
529 {
+
530 if constexpr (Dim == 1) {
+
531 // kernel = {1, 1, 1}
+
532 m_dx = {{-1}, {1}};
+
533 }
+
534 else if constexpr (Dim == 2) {
+
535 // kernel = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
+
536 m_dx = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
+
537 }
+
538 else if constexpr (Dim == 3) {
+
539 m_dx = {{-1, 0, 0}, {0, -1, 0}, {0, 0, -1}, {0, 0, 1}, {0, 1, 0}, {1, 0, 0}};
+
540 }
+
541 else {
+
542 throw std::runtime_error("Please specify the kernel in dimensions > 3.");
+
543 }
+
544 this->init(shape);
+
545 }
+
+
546
+
551 template <class T, class K>
+
+
552 ClusterLabeller(const T& shape, const K& kernel)
+
553 {
+
554 m_dx = detail::kernel_to_dx<Dim>(kernel);
+
555 this->init(shape);
+
556 }
+
+
557
+
558private:
+
559 template <class T>
+
560 void init(const T& shape)
+
561 {
+
562 m_label = xt::empty<ptrdiff_t>(shape);
+
563 m_renum.resize(m_label.size() + 1);
+
564 m_next.resize(m_label.size() + 1);
+
565 for (size_t i = 0; i < Dim; ++i) {
+
566 m_shape[i] = static_cast<ptrdiff_t>(shape[i]);
+
567 if constexpr (Dim >= 2) {
+
568 m_strides[i] = static_cast<ptrdiff_t>(m_label.strides()[i]);
+
569 }
+
570 }
+
571 this->reset();
+
572 m_connected.resize(m_dx.shape(0));
+
573
+
574 // Dim == 2: by default strides are assumed non-zero to avoid extra checks
+
575 // check once if zeros strides occur and if so use a special implementation of unravel_index
+
576 if constexpr (Dim == 2) {
+
577 if (m_shape[0] == 1) {
+
578 get_compare = &ClusterLabeller<Dimension, Periodicity>::get_compare_2d_1n;
+
579 }
+
580 else if (m_shape[1] == 1) {
+
581 get_compare = &ClusterLabeller<Dimension, Periodicity>::get_compare_2d_n1;
+
582 }
+
583 }
+
584 }
+
585
+
586public:
+
+
590 void reset()
+
591 {
+
592 std::fill(m_label.begin(), m_label.end(), 0);
+
593 std::iota(m_renum.begin(), m_renum.end(), 0);
+
594 m_new_label = 1;
+
595 this->clean_next();
+
596 }
+
+
597
+
+
602 void prune()
+
603 {
+
604 ptrdiff_t n = static_cast<ptrdiff_t>(m_new_label);
+
605 m_new_label = 1;
+
606 m_renum[0] = 0;
+
607 for (ptrdiff_t i = 1; i < n; ++i) {
+
608 if (m_renum[i] == i) {
+
609 m_renum[i] = m_new_label;
+
610 ++m_new_label;
+
611 }
+
612 }
+
613 this->private_renumber(m_renum);
+
614 std::iota(m_renum.begin(), m_renum.begin() + n, 0);
+
615 }
+
+
616
+
617private:
+
621 void clean_next()
+
622 {
+
623 std::fill(m_next.begin(), m_next.end(), -1);
+
624 }
+
625
+
630 template <class T>
+
631 void private_renumber(const T& renum)
+
632 {
+
633 for (size_t i = 0; i < m_label.size(); ++i) {
+
634 m_label.flat(i) = renum[m_label.flat(i)];
+
635 }
+
636 }
+
637
+
646 void merge_detail(ptrdiff_t a, ptrdiff_t b)
+
647 {
+
648 // -> head[list(b)] = head[a]
+
649 ptrdiff_t i = m_renum[b];
+
650 ptrdiff_t target = m_renum[a];
+
651 m_renum[b] = target;
+
652 while (true) {
+
653 i = m_next[i];
+
654 if (i == -1) {
+
655 break;
+
656 }
+
657 m_renum[i] = target;
+
658 }
+
659 // -> list(head[a]).append(list(b))
+
660 while (m_next[a] != -1) {
+
661 a = m_next[a];
+
662 }
+
663 m_next[a] = b;
+
664 }
+
665
+
672 size_t unique(ptrdiff_t* labels, size_t nlabels)
+
673 {
+
674 std::sort(labels, labels + nlabels);
+
675 return std::unique(labels, labels + nlabels) - labels;
+
676 }
+
677
+
685 ptrdiff_t merge(ptrdiff_t* labels, size_t nlabels)
+
686 {
+
687 ptrdiff_t target = labels[0];
+
688 for (size_t i = 1; i < nlabels; ++i) {
+
689 this->merge_detail(target, labels[i]);
+
690 }
+
691 return target;
+
692 }
+
693
+
694 void apply_merge()
+
695 {
+
696 if (m_nmerge == 0) {
+
697 return;
+
698 }
+
699
+
700 this->private_renumber(m_renum);
+
701 this->clean_next();
+
702 m_nmerge = 0;
+
703 }
+
704
+
709 ptrdiff_t get_compare_2d_1n(size_t idx, size_t j)
+
710 {
+
711 if constexpr (Periodic) {
+
712 return (m_shape[1] + idx + m_dx(j, 1)) % m_shape[1];
+
713 }
+
714 if constexpr (!Periodic) {
+
715 ptrdiff_t compare = idx + m_dx(j, 1);
+
716 if (compare < 0 || compare >= m_shape[1]) {
+
717 return -1;
+
718 }
+
719 return compare;
+
720 }
+
721 }
+
722
+
727 ptrdiff_t get_compare_2d_n1(size_t idx, size_t j)
+
728 {
+
729 if constexpr (Periodic) {
+
730 return (m_shape[0] + idx + m_dx(j, 0)) % m_shape[0];
+
731 }
+
732 if constexpr (!Periodic) {
+
733 ptrdiff_t compare = idx + m_dx(j, 0);
+
734 if (compare < 0 || compare >= m_shape[0]) {
+
735 return -1;
+
736 }
+
737 return compare;
+
738 }
+
739 }
+
740
+
749 ptrdiff_t get_compare_default(size_t idx, size_t j)
+
750 {
+
751 if constexpr (Dim == 1 && Periodic) {
+
752 return (m_shape[0] + idx + m_dx.flat(j)) % m_shape[0];
+
753 }
+
754 if constexpr (Dim == 1 && !Periodic) {
+
755 ptrdiff_t compare = idx + m_dx.flat(j);
+
756 if (compare < 0 || compare >= m_shape[0]) {
+
757 return -1;
+
758 }
+
759 return idx + m_dx.flat(j);
+
760 }
+
761 if constexpr (Dim == 2 && Periodic) {
+
762 ptrdiff_t ii = (m_shape[0] + (idx / m_strides[0]) + m_dx(j, 0)) % m_shape[0];
+
763 ptrdiff_t jj = (m_shape[1] + (idx % m_strides[0]) + m_dx(j, 1)) % m_shape[1];
+
764 return ii * m_shape[1] + jj;
+
765 }
+
766 if constexpr (Dim == 2 && !Periodic) {
+
767 ptrdiff_t ii = (idx / m_strides[0]) + m_dx(j, 0);
+
768 ptrdiff_t jj = (idx % m_strides[0]) + m_dx(j, 1);
+
769 if (ii < 0 || ii >= m_shape[0] || jj < 0 || jj >= m_shape[1]) {
+
770 return -1;
+
771 }
+
772 return ii * m_shape[1] + jj;
+
773 }
+
774 else {
+
775 auto index = xt::unravel_from_strides(idx, m_strides, xt::layout_type::row_major);
+
776 for (size_t d = 0; d < Dim; ++d) {
+
777 index[d] += m_dx(j, d);
+
778 if constexpr (!Periodic) {
+
779 if (index[d] < 0 || index[d] >= m_shape[d]) {
+
780 return -1;
+
781 }
+
782 }
+
783 else {
+
784 auto n = m_shape[d];
+
785 index[d] = (n + (index[d] % n)) % n;
+
786 }
+
787 }
+
788 return xt::ravel_index(index, m_shape, xt::layout_type::row_major);
+
789 }
+
790 }
+
791
+
792 void label_impl(size_t idx)
+
793 {
+
794 size_t nconnected = 0;
+
795
+
796 for (size_t j = 0; j < m_dx.shape(0); ++j) {
+
797 ptrdiff_t compare = (this->*get_compare)(idx, j);
+
798 if constexpr (!Periodic) {
+
799 if (compare == -1) {
+
800 continue;
+
801 }
+
802 }
+
803 if (m_label.flat(compare) != 0) {
+
804 m_connected[nconnected] = m_renum[m_label.flat(compare)];
+
805 nconnected++;
+
806 }
+
807 }
+
808
+
809 if (nconnected == 0) {
+
810 m_label.flat(idx) = m_new_label;
+
811 m_new_label += 1;
+
812 return;
+
813 }
+
814
+
815 if (nconnected == 1) {
+
816 m_label.flat(idx) = m_connected[0];
+
817 return;
+
818 }
+
819
+
820 nconnected = this->unique(&m_connected[0], nconnected);
+
821 if (nconnected == 1) {
+
822 m_label.flat(idx) = m_connected[0];
+
823 return;
+
824 }
+
825
+
826 // mark all labels in the list for merging
+
827 // `m_label` is not yet updated to avoid looping over all blocks too frequently
+
828 // the new label can be read by `m_renum[lab]` (as done above)
+
829 m_label.flat(idx) = this->merge(&m_connected[0], nconnected);
+
830 m_nmerge++;
+
831 }
+
832
+
833public:
+
838 template <class T>
+
+
839 void add_image(const T& img)
+
840 {
+
841 GOOSEEYE_ASSERT(xt::has_shape(img, m_label.shape()), std::out_of_range);
+
842
+
843 for (size_t idx = 0; idx < img.size(); ++idx) {
+
844 if (img.flat(idx) == 0) {
+
845 continue;
+
846 }
+
847 if (m_label.flat(idx) != 0) {
+
848 continue;
+
849 }
+
850 this->label_impl(idx);
+
851 }
+
852 this->apply_merge();
+
853 }
+
+
854
+
855private:
+
856 template <class T>
+
857 bool legal_points(const T& begin, const T& end)
+
858 {
+
859 size_t n = m_label.size();
+
860 if constexpr (std::is_signed_v<typename T::value_type>) {
+
861 return !std::any_of(begin, end, [n](size_t i) { return i < 0 || i >= n; });
+
862 }
+
863 else {
+
864 return !std::any_of(begin, end, [n](size_t i) { return i >= n; });
+
865 }
+
866 }
+
867
+
868public:
+
874 template <class T>
+
+
875 void add_points(const T& begin, const T& end)
+
876 {
+
877 GOOSEEYE_ASSERT(this->legal_points(begin, end), std::out_of_range);
+
878 for (auto it = begin; it != end; ++it) {
+
879 if (m_label.flat(*it) != 0) {
+
880 continue;
+
881 }
+
882 this->label_impl(*it);
+
883 }
+
884 this->apply_merge();
+
885 }
+
+
886
+
891 template <class T>
+
+
892 void add_points(const T& idx)
+
893 {
+
894 GOOSEEYE_ASSERT(idx.dimension() == 1, std::out_of_range);
+
895 return this->add_points(idx.begin(), idx.end());
+
896 }
+
+
897
+
906 template <class T>
+
+
907 std::vector<size_t> add_sequence(const T& idx)
+
908 {
+
909 GOOSEEYE_ASSERT(idx.dimension() == 1, std::out_of_range);
+
910 GOOSEEYE_ASSERT(idx.size() >= 1, std::out_of_range);
+
911 GOOSEEYE_ASSERT(this->legal_points(idx.begin(), idx.end()), std::out_of_range);
+
912 std::vector<size_t> ret;
+
913 size_t i = 0;
+
914 while (true) {
+
915 auto nl = m_new_label;
+
916 auto nm = m_nmerge;
+
917 auto lab = m_label.flat(idx(i));
+
918
+
919 for (; i < idx.size(); ++i) {
+
920 auto l = m_label.flat(idx(i));
+
921 if (l != lab && l != 0) {
+
922 ret.push_back(i);
+
923 break;
+
924 }
+
925 if (l != 0) {
+
926 continue;
+
927 }
+
928 this->label_impl(idx(i));
+
929 if (m_new_label != nl || m_nmerge != nm) {
+
930 ret.push_back(i);
+
931 break;
+
932 }
+
933 }
+
934
+
935 if (i == idx.size()) {
+
936 break;
+
937 }
+
938 }
+
939
+
940 this->apply_merge();
+
941 ret.push_back(idx.size());
+
942 return ret;
+
943 }
+
+
944
+
+
949 std::string repr() const
+
950 {
+
951 return detail::get_namespace() + "ClusterLabeller" + std::to_string(Dim) + " " +
+
952 detail::shape_to_string(m_shape);
+
953 }
+
+
954
+
+
959 const auto& shape() const
+
960 {
+
961 return m_label.shape();
+
962 }
+
+
963
+
+
968 auto size() const
+
969 {
+
970 return m_label.size();
+
971 }
+
+
972
+
973 // todo: allow resetting a cluster map ?
+
974
+
+
979 const auto& labels() const
+
980 {
+
981 return m_label;
+
982 }
+
+
983};
+
+
984
+
985namespace detail {
+
986
+
987template <size_t Dimension, bool Periodicity>
+
988class ClusterLabellerOverload : public ClusterLabeller<Dimension, Periodicity> {
+
989public:
+
990 template <class T>
+
991 ClusterLabellerOverload(const T& img) : ClusterLabeller<Dimension, Periodicity>(img.shape())
+
992 {
+
993 this->add_image(img);
+
994 this->prune();
+
995 }
+
996
+
997 auto get() const
+
998 {
+
999 return this->labels();
+
1000 }
+
1001};
+
1002
+
1003} // namespace detail
+
1004
+
1011template <class T>
+
+
1012inline array_type::array<int> clusters(const T& f, bool periodic = true)
+
1013{
+
1014 GOOSEEYE_ASSERT(f.layout() == xt::layout_type::row_major, std::runtime_error);
+
1015
+
1016 auto n = f.dimension();
+
1017 if (n == 1 && periodic) {
+
1018 return detail::ClusterLabellerOverload<1, true>(f).get();
+
1019 }
+
1020 if (n == 1 && !periodic) {
+
1021 return detail::ClusterLabellerOverload<1, false>(f).get();
+
1022 }
+
1023 if (n == 2 && periodic) {
+
1024 return detail::ClusterLabellerOverload<2, true>(f).get();
+
1025 }
+
1026 if (n == 2 && !periodic) {
+
1027 return detail::ClusterLabellerOverload<2, false>(f).get();
+
1028 }
+
1029 if (n == 3 && periodic) {
+
1030 return detail::ClusterLabellerOverload<3, true>(f).get();
+
1031 }
+
1032 if (n == 3 && !periodic) {
+
1033 return detail::ClusterLabellerOverload<3, false>(f).get();
+
1034 }
+
1035 throw std::runtime_error("Please use ClusterLabeller directly for dimensions > 3.");
+
1036}
+
+
1037
+
+ +
1061 const array_type::tensor<double, 1>& shape,
+
1062 const array_type::tensor<double, 2>& positions,
+
1063 bool periodic = true)
+
1064{
+
1065 if (positions.size() == 0) {
+
1066 return xt::zeros<double>({shape.size()});
+
1067 }
+
1068
+
1069 if (!periodic) {
+
1070 return xt::mean(positions, 0);
+
1071 }
+
1072 else {
+
1073 double pi = xt::numeric_constants<double>::PI;
+
1074 auto theta = 2.0 * pi * positions / shape;
+
1075 auto xi = xt::cos(theta);
+
1076 auto zeta = xt::sin(theta);
+
1077 auto xi_bar = xt::mean(xi, 0);
+
1078 auto zeta_bar = xt::mean(zeta, 0);
+
1079 auto theta_bar = xt::atan2(-zeta_bar, -xi_bar) + pi;
+
1080 return shape * theta_bar / (2.0 * pi);
+
1081 }
+
1082}
+
+
1083
+
+ +
1089 const array_type::tensor<double, 1>& shape,
+
1090 const array_type::tensor<double, 2>& positions,
+
1091 const array_type::tensor<double, 1>& weights,
+
1092 bool periodic = true)
+
1093{
+
1094 if (positions.size() == 0) {
+
1095 return xt::zeros<double>({shape.size()});
+
1096 }
+
1097
+
1098 if (!periodic) {
+
1099 return xt::average(positions, weights, 0);
+
1100 }
+
1101 else {
+
1102 double pi = xt::numeric_constants<double>::PI;
+
1103 auto theta = 2.0 * pi * positions / shape;
+
1104 auto xi = xt::cos(theta);
+
1105 auto zeta = xt::sin(theta);
+
1106 auto xi_bar = xt::average(xi, weights, 0);
+
1107 auto zeta_bar = xt::average(zeta, weights, 0);
+
1108 auto theta_bar = xt::atan2(-zeta_bar, -xi_bar) + pi;
+
1109 return shape * theta_bar / (2.0 * pi);
+
1110 }
+
1111}
+
+
1112
+
1113namespace detail {
+
1114
+
1115class PositionList {
+
1116public:
+ + +
1119
+
1120 PositionList() = default;
+
1121
+
1122 template <class T>
+
1123 void set(const T& condition)
+
1124 {
+
1125 positions = xt::from_indices(xt::argwhere(condition));
+
1126 }
+
1127
+
1128 template <class T, class W>
+
1129 void set(const T& condition, const W& w)
+
1130 {
+
1131 auto pos = xt::argwhere(condition);
+
1132 weights = xt::empty<double>({pos.size()});
+
1133 for (size_t i = 0; i < pos.size(); ++i) {
+
1134 weights(i) = w[pos[i]];
+
1135 }
+
1136 positions = xt::from_indices(pos);
+
1137 }
+
1138};
+
1139
+
1140} // namespace detail
+
1141
+
1152template <class T, class N>
+ +
+
1154labels_centers(const T& labels, const N& names, bool periodic = true)
+
1155{
+
1156 static_assert(std::is_integral<typename T::value_type>::value, "Integral labels required.");
+
1157 GOOSEEYE_ASSERT(labels.dimension() > 0, std::out_of_range);
+
1158 GOOSEEYE_ASSERT(names.dimension() == 1, std::out_of_range);
+
1159
+
1160 size_t rank = labels.dimension();
+
1161 array_type::tensor<double, 1> shape = xt::adapt(labels.shape());
+
1162 array_type::tensor<double, 2> ret = xt::zeros<double>({names.size(), rank});
+
1163 detail::PositionList plist;
+
1164
+
1165 for (size_t l = 0; l < names.size(); ++l) {
+
1166 plist.set(xt::equal(labels, names(l)));
+
1167 if (plist.positions.size() == 0) {
+
1168 continue;
+
1169 }
+
1170 xt::view(ret, l, xt::all()) = center(shape, plist.positions, periodic);
+
1171 }
+
1172
+
1173 return ret;
+
1174}
+
+
1175
+
1180template <class T, class W, class N>
+ +
+
1182labels_centers_of_mass(const T& labels, const W& weights, const N& names, bool periodic = true)
+
1183{
+
1184 static_assert(std::is_integral<typename T::value_type>::value, "Integral labels required.");
+
1185 GOOSEEYE_ASSERT(xt::has_shape(labels, weights.shape()), std::out_of_range);
+
1186 GOOSEEYE_ASSERT(labels.dimension() > 0, std::out_of_range);
+
1187 GOOSEEYE_ASSERT(names.dimension() == 1, std::out_of_range);
+
1188
+
1189 size_t rank = labels.dimension();
+
1190 array_type::tensor<double, 1> shape = xt::adapt(labels.shape());
+
1191 array_type::tensor<double, 2> ret = xt::zeros<double>({names.size(), rank});
+
1192 detail::PositionList plist;
+
1193
+
1194 for (size_t l = 0; l < names.size(); ++l) {
+
1195 plist.set(xt::equal(labels, names(l)), weights);
+
1196 if (plist.positions.size() == 0) {
+
1197 continue;
+
1198 }
+
1199 xt::view(ret, l, xt::all()) =
+
1200 center_of_mass(shape, plist.positions, plist.weights, periodic);
+
1201 }
+
1202
+
1203 return ret;
+
1204}
+
+
1205
+
+ +
1217public:
+
1221 Ensemble() = default;
+
1222
+
1229 Ensemble(const std::vector<size_t>& roi, bool periodic = true, bool variance = true);
+
1230
+ +
1236
+ +
1242
+ +
1248
+ +
1254
+ +
1260
+ +
1266
+
1273 array_type::array<double> distance(size_t axis) const;
+
1274
+
1281 array_type::array<double> distance(const std::vector<double>& h) const;
+
1282
+
1291 array_type::array<double> distance(const std::vector<double>& h, size_t axis) const;
+
1292
+
1297 template <class T>
+
1298 void mean(const T& f);
+
1299
+
1305 template <class T, class M>
+
1306 void mean(const T& f, const M& fmask);
+
1307
+
1313 template <class T>
+
1314 void S2(const T& f, const T& g);
+
1315
+
1323 template <class T, class M>
+
1324 void S2(const T& f, const T& g, const M& fmask, const M& gmask);
+
1325
+
1331 template <class T>
+
1332 void C2(const T& f, const T& g);
+
1333
+
1341 template <class T, class M>
+
1342 void C2(const T& f, const T& g, const M& fmask, const M& gmask);
+
1343
+
1349 template <class T>
+
1350 void W2(const T& w, const T& f);
+
1351
+
1358 template <class T, class M>
+
1359 void W2(const T& w, const T& f, const M& fmask);
+
1360
+
1368 template <class C, class T>
+
1369 void
+
1370 W2c(const C& clusters, const C& centers, const T& f, path_mode mode = path_mode::Bresenham);
+
1371
+
1380 template <class C, class T, class M>
+
1381 void
+
1382 W2c(const C& clusters,
+
1383 const C& centers,
+
1384 const T& f,
+
1385 const M& fmask,
+ +
1387
+
1395 template <class T>
+
1396 void heightheight(const T& f);
+
1397
+
1402 template <class T, class M>
+
1403 void heightheight(const T& f, const M& fmask);
+
1404
+
1410 template <class T>
+
1411 void L(const T& f, path_mode mode = path_mode::Bresenham);
+
1412
+
1413private:
+
1414 // Type: used to lock the ensemble to a certain measure.
+
1415 enum class Type { Unset, mean, S2, C2, W2, W2c, L, heightheight };
+
1416
+
1417 // Initialize class as unlocked.
+
1418 Type m_stat = Type::Unset;
+
1419
+
1420 // Maximum number of dimensions.
+
1421 static const size_t MAX_DIM = 3;
+
1422
+
1423 // Switch to assume periodicity (for the entire ensemble).
+
1424 bool m_periodic;
+
1425
+
1426 // Switch to compute the variance (for the entire ensemble).
+
1427 bool m_variance;
+
1428
+
1429 // Raw (not normalized) result, and normalization:
+
1430 // - sum of the first moment: x_1 + x_2 + ...
+ +
1432 // - sum of the second moment: x_1^2 + x_2^2 + ...
+ +
1434 // - number of measurements per pixel
+ +
1436
+
1437 // Shape of the region-of-interest, as specified.
+
1438 std::vector<size_t> m_shape_orig;
+
1439
+
1440 // 3d equivalent of "m_shape_orig".
+
1441 std::vector<size_t> m_shape;
+
1442
+
1443 // Pad size (3d).
+
1444 std::vector<std::vector<size_t>> m_pad;
+
1445};
+
+
1446
+
1447// ---------------------------------------------------------
+
1448// Wrapper functions to compute the statistics for one image
+
1449// ---------------------------------------------------------
+
1450
+
1456inline auto distance(const std::vector<size_t>& roi);
+
1457
+
1464inline auto distance(const std::vector<size_t>& roi, size_t axis);
+
1465
+
1472inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h);
+
1473
+
1481inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h, size_t axis);
+
1482
+
1490template <class T>
+
1491inline auto S2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic = true);
+
1492
+
1502template <class T, class M>
+
1503inline auto
+
1504S2(const std::vector<size_t>& roi,
+
1505 const T& f,
+
1506 const T& g,
+
1507 const M& fmask,
+
1508 const M& gmask,
+
1509 bool periodic = true);
+
1510
+
1518template <class T>
+
1519inline auto C2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic = true);
+
1520
+
1530template <class T, class M>
+
1531inline auto
+
1532C2(const std::vector<size_t>& roi,
+
1533 const T& f,
+
1534 const T& g,
+
1535 const M& fmask,
+
1536 const M& gmask,
+
1537 bool periodic = true);
+
1538
+
1546template <class T>
+
1547inline auto W2(const std::vector<size_t>& roi, const T& w, const T& f, bool periodic = true);
+
1548
+
1557template <class T, class M>
+
1558inline auto
+
1559W2(const std::vector<size_t>& roi, const T& w, const T& f, const M& fmask, bool periodic = true);
+
1560
+
1570template <class C, class T>
+
1571inline auto
+
1572W2c(const std::vector<size_t>& roi,
+
1573 const C& clusters,
+
1574 const C& centers,
+
1575 const T& f,
+ +
1577 bool periodic = true);
+
1578
+
1589template <class C, class T, class M>
+
1590inline auto
+
1591W2c(const std::vector<size_t>& roi,
+
1592 const C& clusters,
+
1593 const C& centers,
+
1594 const T& f,
+
1595 const M& fmask,
+ +
1597 bool periodic = true);
+
1598
+
1605template <class T>
+
1606inline auto heightheight(const std::vector<size_t>& roi, const T& f, bool periodic = true);
+
1607
+
1615template <class T, class M>
+
1616inline auto
+
1617heightheight(const std::vector<size_t>& roi, const T& f, const M& fmask, bool periodic = true);
+
1618
+
1626template <class T>
+
1627inline auto
+
1628L(const std::vector<size_t>& roi,
+
1629 const T& f,
+
1630 bool periodic = true,
+ +
1632
+
1633} // namespace GooseEYE
+
1634
+
1635#include "Ensemble.hpp"
+
1636#include "Ensemble_C2.hpp"
+
1637#include "Ensemble_L.hpp"
+
1638#include "Ensemble_S2.hpp"
+
1639#include "Ensemble_W2.hpp"
+
1640#include "Ensemble_W2c.hpp"
+ +
1642#include "Ensemble_mean.hpp"
+
1643#include "GooseEYE.hpp"
+
1644#include "dilate.hpp"
+
1645#include "kernel.hpp"
+
1646
+
1647#endif
+ + + + + + + + + +
(Incrementally) Label clusters (0 as background, 1..n as labels).
Definition GooseEYE.h:486
+
void prune()
Prune: renumber labels to lowest possible label, see also AvalancheSegmenter::nlabels.
Definition GooseEYE.h:602
+
void add_image(const T &img)
Add image.
Definition GooseEYE.h:839
+
auto size() const
Size of ClusterLabeller::s and ClusterLabeller::labels (== prod(shape)).
Definition GooseEYE.h:968
+
ClusterLabeller(const T &shape)
Definition GooseEYE.h:528
+
ClusterLabeller(const T &shape, const K &kernel)
Definition GooseEYE.h:552
+
std::string repr() const
Basic class info.
Definition GooseEYE.h:949
+
const auto & shape() const
Shape of ClusterLabeller::s and ClusterLabeller::labels.
Definition GooseEYE.h:959
+
static constexpr bool Periodic
Periodicity of the system.
Definition GooseEYE.h:489
+
void add_points(const T &begin, const T &end)
Add sequence of points.
Definition GooseEYE.h:875
+
const auto & labels() const
Per block, the label (0 for background).
Definition GooseEYE.h:979
+
std::vector< size_t > add_sequence(const T &idx)
Add a sequence of points.
Definition GooseEYE.h:907
+
void add_points(const T &idx)
Add sequence of points.
Definition GooseEYE.h:892
+
void reset()
Reset labels to zero.
Definition GooseEYE.h:590
+
static constexpr size_t Dim
Dimensionality of the system.
Definition GooseEYE.h:488
+
Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statis...
Definition GooseEYE.h:1216
+
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_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:91
+ + + +
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:128
+
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.
+
array_type::tensor< double, 2 > labels_centers_of_mass(const T &labels, const W &weights, const N &names, bool periodic=true)
Get the position of the center of each label.
Definition GooseEYE.h:1182
+
array_type::tensor< double, 1 > center_of_mass(const array_type::tensor< double, 1 > &shape, const array_type::tensor< double, 2 > &positions, const array_type::tensor< double, 1 > &weights, bool periodic=true)
Return the geometric center of a list of positions.
Definition GooseEYE.h:1088
+
array_type::tensor< double, 1 > center(const array_type::tensor< double, 1 > &shape, const array_type::tensor< double, 2 > &positions, bool periodic=true)
Return the geometric center of a list of positions.
Definition GooseEYE.h:1060
+
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
+
T labels_prune(const T &labels)
Prune labels: renumber labels to lowest possible label starting from 1.
Definition GooseEYE.h:304
+
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:402
+
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:242
+
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:1012
+
array_type::tensor< double, 2 > labels_centers(const T &labels, const N &names, bool periodic=true)
Get the position of the center of each label.
Definition GooseEYE.h:1154
+
L labels_rename(const L &labels, const A &rename)
Rename labels.
Definition GooseEYE.h:271
+
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
+
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:350
+ +
+
+ + + + diff --git a/GooseEYE_8hpp.html b/GooseEYE_8hpp.html new file mode 100644 index 0000000..6ea47c1 --- /dev/null +++ b/GooseEYE_8hpp.html @@ -0,0 +1,193 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..15c020b --- /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 0000000..cc2666b --- /dev/null +++ b/GooseEYE_8hpp_source.html @@ -0,0 +1,337 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:1216
+
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:155
+
Toolbox to compute statistics.
Definition config.h:128
+
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:1012
+
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 0000000..7ee5d8d --- /dev/null +++ b/annotated.html @@ -0,0 +1,119 @@ + + + + + + + +GooseEYE: Class List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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)
 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 0000000..3ce9623 --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,7 @@ +var annotated_dup = +[ + [ "GooseEYE", "namespaceGooseEYE.html", [ + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "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 0000000..224b29a 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 0000000..31ca888 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 0000000..8e725e7 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller-members.html @@ -0,0 +1,129 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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
add_sequence(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 0000000..a4530eb --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller.html @@ -0,0 +1,700 @@ + + + + + + + +GooseEYE: GooseEYE::ClusterLabeller< Dimension, Periodicity > Class Template Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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.
 
template<class T >
std::vector< size_t > add_sequence (const T &idx)
 Add a 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 486 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 528 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 552 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 839 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 875 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 892 of file GooseEYE.h.

+ +
+
+ +

◆ add_sequence()

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

Add a sequence of points.

+

Mark index every time a new cluster is started or a cluster is merged.

+
Parameters
+ + +
idxList of points.
+
+
+
Returns
List of indices.
+ +

Definition at line 907 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 979 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 602 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 949 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 590 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 959 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 968 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 488 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 489 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 0000000..c4c3689 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller.js @@ -0,0 +1,15 @@ +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 ], + [ "add_sequence", "classGooseEYE_1_1ClusterLabeller.html#aa42138736b811d6edd6c2d664d67563b", 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_1Ensemble-members.html b/classGooseEYE_1_1Ensemble-members.html new file mode 100644 index 0000000..32fb516 --- /dev/null +++ b/classGooseEYE_1_1Ensemble-members.html @@ -0,0 +1,139 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..308e782 --- /dev/null +++ b/classGooseEYE_1_1Ensemble.html @@ -0,0 +1,1261 @@ + + + + + + + +GooseEYE: GooseEYE::Ensemble Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 1216 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 0000000..496d291 --- /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 0000000..bea42e6 --- /dev/null +++ b/classes.html @@ -0,0 +1,121 @@ + + + + + + + +GooseEYE: Class Index + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
C | E
+ +
+
+ + + + diff --git a/closed.png b/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/closed.png differ diff --git a/config_8h.html b/config_8h.html new file mode 100644 index 0000000..aceb3b8 --- /dev/null +++ b/config_8h.html @@ -0,0 +1,308 @@ + + + + + + + +GooseEYE: GooseEYE/config.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 <type_traits>
+#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_REQUIRE(expr, assertion)    GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
 Assertions that are always enabled.
 
#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 91 of file config.h.

+ +
+
+ +

◆ GOOSEEYE_REQUIRE

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define GOOSEEYE_REQUIRE( expr,
 assertion 
)    GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
+
+ +

Assertions that are always enabled.

+ +

Definition at line 67 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 104 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 122 of file config.h.

+ +
+
+
+
+ + + + diff --git a/config_8h.js b/config_8h.js new file mode 100644 index 0000000..b27a5c1 --- /dev/null +++ b/config_8h.js @@ -0,0 +1,9 @@ +var config_8h = +[ + [ "GOOSEEYE_ASSERT", "config_8h.html#a5f979e87d380e183a469f67875767599", null ], + [ "GOOSEEYE_REQUIRE", "config_8h.html#ac1d2584c7f566d0a24bfb6db8b5ec015", 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 0000000..9224bd6 --- /dev/null +++ b/config_8h_source.html @@ -0,0 +1,221 @@ + + + + + + + +GooseEYE: GooseEYE/config.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 <type_traits>
+
31#include <vector>
+
32
+
33#include <xtensor/xadapt.hpp>
+
34#include <xtensor/xarray.hpp>
+
35#include <xtensor/xio.hpp>
+
36#include <xtensor/xmath.hpp>
+
37#include <xtensor/xpad.hpp>
+
38#include <xtensor/xsort.hpp>
+
39#include <xtensor/xtensor.hpp>
+
40#include <xtensor/xview.hpp>
+
41
+
45#define Q(x) #x
+
46#define QUOTE(x) Q(x)
+
47
+
48#define GOOSEEYE_WARNING_IMPL(message, file, line, function) \
+
49 std::cout << std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + \
+
50 ")" + ": " message ") \n\t";
+
51
+
52#define GOOSEEYE_ASSERT_IMPL(expr, assertion, file, line, function) \
+
53 if (!(expr)) { \
+
54 throw assertion( \
+
55 std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + ")" + \
+
56 ": assertion failed (" #expr ") \n\t"); \
+
57 }
+
58
+
59#define SIGN(a) ((a < 0) ? -1 : a > 0 ? 1 : 0)
+
+
67#define GOOSEEYE_REQUIRE(expr, assertion) \
+
68 GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
+
+
69
+
87#ifdef GOOSEEYE_ENABLE_ASSERT
+
88#define GOOSEEYE_ASSERT(expr, assertion) \
+
89 GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
+
90#else
+
91#define GOOSEEYE_ASSERT(expr, assertion)
+
92#endif
+
93
+
103#ifndef GOOSEEYE_DISABLE_WARNING
+
104#define GOOSEEYE_WARNING(message) GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
105#else
+
106#define GOOSEEYE_WARNING(message)
+
107#endif
+
108
+
118#ifdef GOOSEEYE_ENABLE_WARNING_PYTHON
+
119#define GOOSEEYE_WARNING_PYTHON(message) \
+
120 GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
121#else
+
122#define GOOSEEYE_WARNING_PYTHON(message)
+
123#endif
+
124
+
+
128namespace GooseEYE {
+
129
+
+
133namespace array_type {
+
134
+
135#ifdef GOOSEEYE_USE_XTENSOR_PYTHON
+
136
+
140template <typename T, size_t N>
+
141using tensor = xt::pytensor<T, N>;
+
142
+
146template <typename T>
+
147using array = xt::pyarray<T>;
+
148
+
149#else
+
150
+
154template <typename T, size_t N>
+
155using tensor = xt::xtensor<T, N>;
+
156
+
160template <typename T>
+
161using array = xt::xarray<T>;
+
162
+
163#endif
+
164
+
165} // namespace array_type
+
+
166
+
167} // namespace GooseEYE
+
+
168
+
169#endif
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
xt::xarray< T > array
Dynamic rank array.
Definition config.h:161
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/darkmode_toggle.js b/darkmode_toggle.js new file mode 100644 index 0000000..0b27d4f --- /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 0000000..5c93c15 --- /dev/null +++ b/detail_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..abfbb73 --- /dev/null +++ b/detail_8hpp_source.html @@ -0,0 +1,532 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:155
+
Toolbox to compute statistics.
Definition config.h:128
+
@ 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 0000000..4cbff3e --- /dev/null +++ b/dilate_8hpp.html @@ -0,0 +1,151 @@ + + + + + + + +GooseEYE: GooseEYE/dilate.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..15c524e --- /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 0000000..3a702e1 --- /dev/null +++ b/dilate_8hpp_source.html @@ -0,0 +1,331 @@ + + + + + + + +GooseEYE: GooseEYE/dilate.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:128
+
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 0000000..1d8e718 --- /dev/null +++ b/dir_1e7fc41d3d108c67da428f08b8cf70c8.html @@ -0,0 +1,149 @@ + + + + + + + +GooseEYE: GooseEYE Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..5ef2ed2 --- /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 0000000..0b928a5 --- /dev/null +++ b/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/docd.svg b/docd.svg new file mode 100644 index 0000000..ac18b27 --- /dev/null +++ b/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 0000000..08fb5e6 --- /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 0000000..79a7635 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 0000000..9b28156 --- /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 0000000..152f215 --- /dev/null +++ b/files.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: File List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..a1952af --- /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 0000000..b04bed2 --- /dev/null +++ b/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderclosedd.svg b/folderclosedd.svg new file mode 100644 index 0000000..52f0166 --- /dev/null +++ b/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderopen.svg b/folderopen.svg new file mode 100644 index 0000000..f6896dd --- /dev/null +++ b/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/folderopend.svg b/folderopend.svg new file mode 100644 index 0000000..2d1f06e --- /dev/null +++ b/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/functions.html b/functions.html new file mode 100644 index 0000000..d7b96fb --- /dev/null +++ b/functions.html @@ -0,0 +1,187 @@ + + + + + + + +GooseEYE: Class Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..a950ec9 --- /dev/null +++ b/functions_func.html @@ -0,0 +1,185 @@ + + + + + + + +GooseEYE: Class Members - Functions + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..d003e5f --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Class Members - Variables + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..0b4d343 --- /dev/null +++ b/globals.html @@ -0,0 +1,116 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..4b6c1bb --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,116 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+
+
+ + + + diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 0000000..a413fcd --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,119 @@ + + + + + + + +GooseEYE: Class Hierarchy + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+ + + + +
 CGooseEYE::ClusterLabeller< Dimension, Periodicity >(Incrementally) Label clusters (0 as background, 1..n as labels)
 CGooseEYE::ClusterLabeller< Dimension, Periodicity >
 CGooseEYE::EnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
+
+
+
+ + + + diff --git a/hierarchy.js b/hierarchy.js new file mode 100644 index 0000000..838f142 --- /dev/null +++ b/hierarchy.js @@ -0,0 +1,6 @@ +var hierarchy = +[ + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", null ], + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", null ], + [ "GooseEYE::Ensemble", "classGooseEYE_1_1Ensemble.html", null ] +]; \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..13f1b0a --- /dev/null +++ b/index.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: GooseEYE + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..1dffb65 --- /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 0000000..be48067 --- /dev/null +++ b/kernel_8hpp.html @@ -0,0 +1,140 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 0000000..2b96190 --- /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 0000000..a1585b1 --- /dev/null +++ b/kernel_8hpp_source.html @@ -0,0 +1,163 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/menu.js b/menu.js new file mode 100644 index 0000000..b0b2693 --- /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 0000000..fcff837 --- /dev/null +++ b/menudata.js @@ -0,0 +1,92 @@ +/* + @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:"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:"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 Hierarchy",url:"hierarchy.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 0000000..f70d0c1 --- /dev/null +++ b/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/minusd.svg b/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/namespaceGooseEYE.html b/namespaceGooseEYE.html new file mode 100644 index 0000000..213c8cf --- /dev/null +++ b/namespaceGooseEYE.html @@ -0,0 +1,2273 @@ + + + + + + + +GooseEYE: GooseEYE Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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  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 >
    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 T >
    labels_prune (const T &labels)
     Prune labels: renumber labels to lowest possible label starting from 1.
     
    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 , class N >
    array_type::tensor< typename T::value_type, 1 > labels_sizes (const T &labels, const N &names)
     Size per label.
     
    template<class T >
    array_type::array< int > clusters (const T &f, bool periodic=true)
     Compute clusters.
     
    array_type::tensor< double, 1 > center (const array_type::tensor< double, 1 > &shape, const array_type::tensor< double, 2 > &positions, bool periodic=true)
     Return the geometric center of a list of positions.
     
    array_type::tensor< double, 1 > center_of_mass (const array_type::tensor< double, 1 > &shape, const array_type::tensor< double, 2 > &positions, const array_type::tensor< double, 1 > &weights, bool periodic=true)
     Return the geometric center of a list of positions.
     
    template<class T , class N >
    array_type::tensor< double, 2 > labels_centers (const T &labels, const N &names, bool periodic=true)
     Get the position of the center of each label.
     
    template<class T , class W , class N >
    array_type::tensor< double, 2 > labels_centers_of_mass (const T &labels, const W &weights, const N &names, 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()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    array_type::tensor< double, 1 > GooseEYE::center (const array_type::tensor< double, 1 > & shape,
    const array_type::tensor< double, 2 > & positions,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Return the geometric center of a list of positions.

    +
    Note
    The positions are organised as one column per dimension. For example, in 2d, the positions are organised as positions = np.hstack((rows.reshape(-1, 1), cols.reshape(-1, 1))). You can also use positions = np.argwhere(condition). This means that the following two calls are equivalent:
    >>> centers(shape=labels.shape, positions=np.argwhere(labels == 1), periodic=True)
    +>>> labels_centers(labels=labels, names=[1], periodic=True)[0, :]
    +
    +

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

    +
    Parameters
    + + + + +
    shapeShape of the box to which the coordinates below (needed to apply periodicity).
    positionsList of positions (in array coordinates, e.g. [rows, columns]).
    periodicSwitch to assume array periodic.
    +
    +
    +
    Returns
    Coordinates of the center (in array coordinates, e.g. [center_row, center_col]).
    + +

    Definition at line 1060 of file GooseEYE.h.

    + +
    +
    + +

    ◆ center_of_mass()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    array_type::tensor< double, 1 > GooseEYE::center_of_mass (const array_type::tensor< double, 1 > & shape,
    const array_type::tensor< double, 2 > & positions,
    const array_type::tensor< double, 1 > & weights,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Return the geometric center of a list of positions.

    +
    Note
    The positions are organised as one column per dimension. For example, in 2d, the positions are organised as positions = np.hstack((rows.reshape(-1, 1), cols.reshape(-1, 1))). You can also use positions = np.argwhere(condition). This means that the following two calls are equivalent:
    >>> centers(shape=labels.shape, positions=np.argwhere(labels == 1), periodic=True)
    +>>> labels_centers(labels=labels, names=[1], periodic=True)[0, :]
    +
    +

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

    +
    Parameters
    + + + + +
    shapeShape of the box to which the coordinates below (needed to apply periodicity).
    positionsList of positions (in array coordinates, e.g. [rows, columns]).
    periodicSwitch to assume array periodic.
    +
    +
    +
    Returns
    Coordinates of the center (in array coordinates, e.g. [center_row, center_col]).
    +
    Parameters
    + + +
    weightsWeight for each position.
    +
    +
    + +

    Definition at line 1088 of file GooseEYE.h.

    + +
    +
    + +

    ◆ clusters()

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

    Compute clusters.

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

    Definition at line 1012 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_centers()

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

    Get the position of the center of each label.

    +
    Note
    To compute the center of a single label, you can also use GooseEYE::center().
    +
    Parameters
    + + + + +
    labelsAn image with labels.
    namesList of labels to compute the center for.
    periodicSwitch to assume image periodic.
    +
    +
    +
    Returns
    Coordinates of the center (in array coordinates), in order of the unique (sorted) labels.
    + +

    Definition at line 1154 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_centers_of_mass()

    + +
    +
    +
    +template<class T , class W , class N >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    array_type::tensor< double, 2 > GooseEYE::labels_centers_of_mass (const T & labels,
    const W & weights,
    const N & names,
    bool periodic = true 
    )
    +
    +inline
    +
    + +

    Get the position of the center of each label.

    +
    Note
    To compute the center of a single label, you can also use GooseEYE::center().
    +
    Parameters
    + + + + +
    labelsAn image with labels.
    namesList of labels to compute the center for.
    periodicSwitch to assume image periodic.
    +
    +
    +
    Returns
    Coordinates of the center (in array coordinates), in order of the unique (sorted) labels.
    +
    Parameters
    + + +
    weightsWeight for each pixel.
    +
    +
    + +

    Definition at line 1182 of file GooseEYE.h.

    + +
    +
    + +

    ◆ 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 242 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_prune()

    + +
    +
    +
    +template<class T >
    + + + + + +
    + + + + + + + + +
    T GooseEYE::labels_prune (const T & labels)
    +
    +inline
    +
    + +

    Prune labels: renumber labels to lowest possible label starting from 1.

    +

    Note that the background 0 is always kept 0.

    +
    Parameters
    + + +
    labelsImage with labels.
    +
    +
    +
    Returns
    Image with reordered labels.
    + +

    Definition at line 304 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 271 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 350 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_sizes() [1/2]

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

    Size per label.

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

    Definition at line 402 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_sizes() [2/2]

    + +
    +
    +
    +template<class T , class N >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    array_type::tensor< typename T::value_type, 1 > GooseEYE::labels_sizes (const T & labels,
    const N & names 
    )
    +
    +inline
    +
    + +

    Size per label.

    +
    Parameters
    + + + +
    labelsImage with labels.
    namesList of 'names' to extract.
    +
    +
    +
    Returns
    Size of each label in names.
    + +

    Definition at line 426 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.

    + +
    +
    + +

    ◆ 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 0000000..9ebd35f --- /dev/null +++ b/namespaceGooseEYE.js @@ -0,0 +1,51 @@ +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" ], + [ "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", "namespaceGooseEYE.html#a31035d0d76c452f5c68ef4cfabaaa843", null ], + [ "center_of_mass", "namespaceGooseEYE.html#a22b5a1880c3622fcf4d1113f997567cd", 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_centers", "namespaceGooseEYE.html#a8cb5ff11ff0e2202efd518578aec7bb9", null ], + [ "labels_centers_of_mass", "namespaceGooseEYE.html#a0b7623525069f7e1839f9981bd74bbd5", null ], + [ "labels_map", "namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c", null ], + [ "labels_prune", "namespaceGooseEYE.html#a45d7b4463cd0c2c10fbe2b6827900cda", null ], + [ "labels_rename", "namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a", null ], + [ "labels_reorder", "namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115", null ], + [ "labels_sizes", "namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314", null ], + [ "labels_sizes", "namespaceGooseEYE.html#a3ad17cff4b60d439cb1a817ebf8588ee", null ], + [ "path", "namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add", 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 0000000..59d9b9a --- /dev/null +++ b/namespaceGooseEYE_1_1array__type.html @@ -0,0 +1,173 @@ + + + + + + + +GooseEYE: GooseEYE::array_type Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 161 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 155 of file config.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespaceGooseEYE_1_1kernel.html b/namespaceGooseEYE_1_1kernel.html new file mode 100644 index 0000000..577e5e2 --- /dev/null +++ b/namespaceGooseEYE_1_1kernel.html @@ -0,0 +1,165 @@ + + + + + + + +GooseEYE: GooseEYE::kernel Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 0000000..285f7d9 --- /dev/null +++ b/namespacemembers.html @@ -0,0 +1,178 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 -

    + + +

    - s -

    + + +

    - t -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_enum.html b/namespacemembers_enum.html new file mode 100644 index 0000000..0e64efa --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,112 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 0000000..9aed7ad --- /dev/null +++ b/namespacemembers_func.html @@ -0,0 +1,167 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 -

    + + +

    - s -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_type.html b/namespacemembers_type.html new file mode 100644 index 0000000..fe074ba --- /dev/null +++ b/namespacemembers_type.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 0000000..26c1372 --- /dev/null +++ b/namespaces.html @@ -0,0 +1,121 @@ + + + + + + + +GooseEYE: Namespace List + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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)
     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 0000000..f9a9d39 --- /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 0000000..72a58a5 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 0000000..032fbdd 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 0000000..2093a23 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 0000000..33389b1 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 0000000..de80f18 Binary files /dev/null and b/nav_hd.png differ diff --git a/navtree.css b/navtree.css new file mode 100644 index 0000000..69211d4 --- /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 0000000..93dd3d4 --- /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 0000000..0c65bfe --- /dev/null +++ b/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resize.js b/resize.js new file mode 100644 index 0000000..aaeb6fc --- /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 0000000..80f08a1 --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,8 @@ +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)']]], + ['add_5fsequence_3',['add_sequence',['../classGooseEYE_1_1ClusterLabeller.html#aa42138736b811d6edd6c2d664d67563b',1,'GooseEYE::ClusterLabeller']]], + ['array_4',['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 0000000..fa6180b --- /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 0000000..c972d23 --- /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 0000000..94e3868 --- /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 0000000..0b33ba0 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,12 @@ +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_1',['center',['../namespaceGooseEYE.html#a31035d0d76c452f5c68ef4cfabaaa843',1,'GooseEYE']]], + ['center_5fof_5fmass_2',['center_of_mass',['../namespaceGooseEYE.html#a22b5a1880c3622fcf4d1113f997567cd',1,'GooseEYE']]], + ['clusterlabeller_3',['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_4',['ClusterLabeller< Dimension, Periodicity >',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]], + ['clusters_5',['clusters',['../namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2',1,'GooseEYE']]], + ['config_2eh_6',['config.h',['../config_8h.html',1,'']]], + ['copyright_7',['Credit / copyright',['../index.html#autotoc_md1',1,'']]], + ['credit_20copyright_8',['Credit / copyright',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 0000000..0a8c81a --- /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 0000000..0695e4b --- /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 0000000..dceee59 --- /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 0000000..1de0cad --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,13 @@ +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_5frequire_6',['GOOSEEYE_REQUIRE',['../config_8h.html#ac1d2584c7f566d0a24bfb6db8b5ec015',1,'config.h']]], + ['gooseeye_5fversion_7',['GOOSEEYE_VERSION',['../version_8h.html#a741c94f281334d63b9f28dce5b22a515',1,'version.h']]], + ['gooseeye_5fwarning_8',['GOOSEEYE_WARNING',['../config_8h.html#a37bc6256ee9c5c2734fbb59e6cd64a46',1,'config.h']]], + ['gooseeye_5fwarning_5fpython_9',['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 0000000..d8a01da --- /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 0000000..eb1b886 --- /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 0000000..a6eda69 --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,12 @@ +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_5fcenters_2',['labels_centers',['../namespaceGooseEYE.html#a8cb5ff11ff0e2202efd518578aec7bb9',1,'GooseEYE']]], + ['labels_5fcenters_5fof_5fmass_3',['labels_centers_of_mass',['../namespaceGooseEYE.html#a0b7623525069f7e1839f9981bd74bbd5',1,'GooseEYE']]], + ['labels_5fmap_4',['labels_map',['../namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c',1,'GooseEYE']]], + ['labels_5fprune_5',['labels_prune',['../namespaceGooseEYE.html#a45d7b4463cd0c2c10fbe2b6827900cda',1,'GooseEYE']]], + ['labels_5frename_6',['labels_rename',['../namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a',1,'GooseEYE']]], + ['labels_5freorder_7',['labels_reorder',['../namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115',1,'GooseEYE']]], + ['labels_5fsizes_8',['labels_sizes',['../namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314',1,'GooseEYE::labels_sizes(const T &labels)'],['../namespaceGooseEYE.html#a3ad17cff4b60d439cb1a817ebf8588ee',1,'GooseEYE::labels_sizes(const T &labels, const N &names)']]] +]; diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 0000000..980fc32 --- /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 0000000..ce49179 --- /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 0000000..b61cbcf --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,7 @@ +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']]], + ['prune_3',['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 0000000..4f3a55c --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['repr_0',['repr',['../classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7',1,'GooseEYE::ClusterLabeller']]], + ['reset_1',['reset',['../classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024',1,'GooseEYE::ClusterLabeller']]], + ['result_2',['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 0000000..a8d9e33 --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,6 @@ +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']]] +]; diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 0000000..332e67f --- /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 0000000..ff5a5d0 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,5 @@ +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']]] +]; diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 0000000..5dc5b8d --- /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 0000000..337d6cc --- /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 0000000..68721be --- /dev/null +++ b/search/defines_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['gooseeye_5fassert_0',['GOOSEEYE_ASSERT',['../config_8h.html#a5f979e87d380e183a469f67875767599',1,'config.h']]], + ['gooseeye_5frequire_1',['GOOSEEYE_REQUIRE',['../config_8h.html#ac1d2584c7f566d0a24bfb6db8b5ec015',1,'config.h']]], + ['gooseeye_5fversion_2',['GOOSEEYE_VERSION',['../version_8h.html#a741c94f281334d63b9f28dce5b22a515',1,'version.h']]], + ['gooseeye_5fwarning_3',['GOOSEEYE_WARNING',['../config_8h.html#a37bc6256ee9c5c2734fbb59e6cd64a46',1,'config.h']]], + ['gooseeye_5fwarning_5fpython_4',['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 0000000..7e5a678 --- /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 0000000..e6f413d --- /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 0000000..fa6180b --- /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 0000000..dceee59 --- /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 0000000..822b58c --- /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 0000000..bdbea89 --- /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 0000000..0eef1b0 --- /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 0000000..7d7c4a8 --- /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 0000000..eb1b886 --- /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 0000000..48238f1 --- /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 0000000..f044a54 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,6 @@ +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)']]], + ['add_5fsequence_2',['add_sequence',['../classGooseEYE_1_1ClusterLabeller.html#aa42138736b811d6edd6c2d664d67563b',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 0000000..806dfbd --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,8 @@ +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_1',['center',['../namespaceGooseEYE.html#a31035d0d76c452f5c68ef4cfabaaa843',1,'GooseEYE']]], + ['center_5fof_5fmass_2',['center_of_mass',['../namespaceGooseEYE.html#a22b5a1880c3622fcf4d1113f997567cd',1,'GooseEYE']]], + ['clusterlabeller_3',['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_4',['clusters',['../namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2',1,'GooseEYE']]] +]; diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 0000000..4434156 --- /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 0000000..0044ed5 --- /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 0000000..d8a01da --- /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 0000000..a6eda69 --- /dev/null +++ b/search/functions_5.js @@ -0,0 +1,12 @@ +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_5fcenters_2',['labels_centers',['../namespaceGooseEYE.html#a8cb5ff11ff0e2202efd518578aec7bb9',1,'GooseEYE']]], + ['labels_5fcenters_5fof_5fmass_3',['labels_centers_of_mass',['../namespaceGooseEYE.html#a0b7623525069f7e1839f9981bd74bbd5',1,'GooseEYE']]], + ['labels_5fmap_4',['labels_map',['../namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c',1,'GooseEYE']]], + ['labels_5fprune_5',['labels_prune',['../namespaceGooseEYE.html#a45d7b4463cd0c2c10fbe2b6827900cda',1,'GooseEYE']]], + ['labels_5frename_6',['labels_rename',['../namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a',1,'GooseEYE']]], + ['labels_5freorder_7',['labels_reorder',['../namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115',1,'GooseEYE']]], + ['labels_5fsizes_8',['labels_sizes',['../namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314',1,'GooseEYE::labels_sizes(const T &labels)'],['../namespaceGooseEYE.html#a3ad17cff4b60d439cb1a817ebf8588ee',1,'GooseEYE::labels_sizes(const T &labels, const N &names)']]] +]; diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 0000000..980fc32 --- /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 0000000..ce49179 --- /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 0000000..dac970c --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['path_0',['path',['../namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add',1,'GooseEYE']]], + ['prune_1',['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 0000000..4f3a55c --- /dev/null +++ b/search/functions_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['repr_0',['repr',['../classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7',1,'GooseEYE::ClusterLabeller']]], + ['reset_1',['reset',['../classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024',1,'GooseEYE::ClusterLabeller']]], + ['result_2',['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 0000000..a8d9e33 --- /dev/null +++ b/search/functions_a.js @@ -0,0 +1,6 @@ +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']]] +]; diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 0000000..c650ba8 --- /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 0000000..94e3868 --- /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 0000000..ffb6cf0 --- /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 0000000..4122773 --- /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 0000000..553dba8 --- /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 0000000..c906f84 --- /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 0000000..c0e264c --- /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 0000000..5c80326 --- /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 0000000..19f76f9 --- /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 0000000..6fd40c6 --- /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 0000000..413d241 --- /dev/null +++ b/version_8h.html @@ -0,0 +1,173 @@ + + + + + + + +GooseEYE: GooseEYE/version.h File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 0000000..0f07746 --- /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 0000000..d750cd9 --- /dev/null +++ b/version_8h_source.html @@ -0,0 +1,141 @@ + + + + + + + +GooseEYE: GooseEYE/version.h Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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:128
    +
    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 0000000..232a74b --- /dev/null +++ b/version_8hpp.html @@ -0,0 +1,137 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 0000000..9473438 --- /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 0000000..fa6b67f --- /dev/null +++ b/version_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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:128
    +
    std::string version()
    Return version string, e.g.
    Definition version.hpp:25
    + +
    #define GOOSEEYE_VERSION
    Current version.
    Definition version.h:33
    +
    +
    + + + +