diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/Ensemble_8hpp.html b/Ensemble_8hpp.html new file mode 100644 index 00000000..37b78d60 --- /dev/null +++ b/Ensemble_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble.hpp.

+
+
+ + + + diff --git a/Ensemble_8hpp_source.html b/Ensemble_8hpp_source.html new file mode 100644 index 00000000..72dde782 --- /dev/null +++ b/Ensemble_8hpp_source.html @@ -0,0 +1,279 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..3cd8719f --- /dev/null +++ b/Ensemble__C2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_C2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_C2.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_C2.hpp.

+
+
+ + + + diff --git a/Ensemble__C2_8hpp_source.html b/Ensemble__C2_8hpp_source.html new file mode 100644 index 00000000..551c49f9 --- /dev/null +++ b/Ensemble__C2_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_C2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..e4639a4e --- /dev/null +++ b/Ensemble__L_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_L.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_L.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_L.hpp.

+
+
+ + + + diff --git a/Ensemble__L_8hpp_source.html b/Ensemble__L_8hpp_source.html new file mode 100644 index 00000000..218994df --- /dev/null +++ b/Ensemble__L_8hpp_source.html @@ -0,0 +1,216 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_L.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..8d487b49 --- /dev/null +++ b/Ensemble__S2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_S2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_S2.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_S2.hpp.

+
+
+ + + + diff --git a/Ensemble__S2_8hpp_source.html b/Ensemble__S2_8hpp_source.html new file mode 100644 index 00000000..9687ecf2 --- /dev/null +++ b/Ensemble__S2_8hpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_S2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..a80382df --- /dev/null +++ b/Ensemble__W2_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_W2.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_W2.hpp.

+
+
+ + + + diff --git a/Ensemble__W2_8hpp_source.html b/Ensemble__W2_8hpp_source.html new file mode 100644 index 00000000..fa28d12f --- /dev/null +++ b/Ensemble__W2_8hpp_source.html @@ -0,0 +1,206 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..3b190c01 --- /dev/null +++ b/Ensemble__W2c_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_W2c.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_W2c.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_W2c.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_heightheight.hpp.

+
+
+ + + + diff --git a/Ensemble__heightheight_8hpp_source.html b/Ensemble__heightheight_8hpp_source.html new file mode 100644 index 00000000..79cae622 --- /dev/null +++ b/Ensemble__heightheight_8hpp_source.html @@ -0,0 +1,210 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_heightheight.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..a5cd2b14 --- /dev/null +++ b/Ensemble__mean_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_mean.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble_mean.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_mean.hpp.

+
+
+ + + + diff --git a/Ensemble__mean_8hpp_source.html b/Ensemble__mean_8hpp_source.html new file mode 100644 index 00000000..7b4aa2cf --- /dev/null +++ b/Ensemble__mean_8hpp_source.html @@ -0,0 +1,169 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble_mean.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..650d2b24 --- /dev/null +++ b/GooseEYE_8h.html @@ -0,0 +1,294 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE.h File Reference
+
+
+
#include "config.h"
+#include "detail.hpp"
+#include "version.h"
+#include <prrng.h>
+#include "Ensemble.hpp"
+#include "Ensemble_C2.hpp"
+#include "Ensemble_L.hpp"
+#include "Ensemble_S2.hpp"
+#include "Ensemble_W2.hpp"
+#include "Ensemble_W2c.hpp"
+#include "Ensemble_heightheight.hpp"
+#include "Ensemble_mean.hpp"
+#include "GooseEYE.hpp"
+#include "dilate.hpp"
+#include "kernel.hpp"
+
+

Go to the source code of this file.

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

+Classes

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

+Namespaces

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

+Enumerations

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

+Functions

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

Detailed Description

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

Definition in file GooseEYE.h.

+
+
+ + + + diff --git a/GooseEYE_8h.js b/GooseEYE_8h.js new file mode 100644 index 00000000..79d41ff7 --- /dev/null +++ b/GooseEYE_8h.js @@ -0,0 +1,43 @@ +var GooseEYE_8h = +[ + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "GooseEYE::Clusters", "classGooseEYE_1_1Clusters.html", "classGooseEYE_1_1Clusters" ], + [ "GooseEYE::Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ], + [ "path_mode", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320", [ + [ "Bresenham", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320a20b83bc3afd59d747cc745d5f70f3695", null ], + [ "actual", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e", null ], + [ "full", "GooseEYE_8h.html#a0b6a1f8a4e4366c6715246b5da57b320ae9dc924f238fa6cc29465942875fe8f0", null ] + ] ], + [ "C2", "GooseEYE_8h.html#a6f8454f08a6b048290f36618cc80986b", null ], + [ "C2", "GooseEYE_8h.html#a867ce41fed448b5442ad8f6e6011b8b1", null ], + [ "center_of_mass", "GooseEYE_8h.html#a532a7f3db5f55172b92169fa5171b335", null ], + [ "clusters", "GooseEYE_8h.html#a868d564546b23e37ecf3ccd510cf17a2", null ], + [ "dilate", "GooseEYE_8h.html#ae859f712898ed7d6e76a5ecaa114614a", null ], + [ "dilate", "GooseEYE_8h.html#a43f961d31fad8b606eedee2fcd4969b5", null ], + [ "dilate", "GooseEYE_8h.html#a4976e5bbf41b58472e028babb092bd85", null ], + [ "dilate", "GooseEYE_8h.html#a6bb0149c151f7255f796ac80bc57a031", null ], + [ "distance", "GooseEYE_8h.html#adf4657193fc58978eed6ef274ebb93ed", null ], + [ "distance", "GooseEYE_8h.html#a3097c5d07c0fe21227df46b79c133a23", null ], + [ "distance", "GooseEYE_8h.html#ab97f8ace23ac36134cfaab38a19b131b", null ], + [ "distance", "GooseEYE_8h.html#a3d0010a207abd86a2811edfb32d22e21", null ], + [ "dummy_circles", "GooseEYE_8h.html#a607337e83a0a65c41ded829114a17ac6", null ], + [ "dummy_circles", "GooseEYE_8h.html#ab3570c9c90ad8e21f2ddba6dae537e3f", null ], + [ "heightheight", "GooseEYE_8h.html#ae761eb00cac0021b5840df83814abf72", null ], + [ "heightheight", "GooseEYE_8h.html#a5f658c332d5fc69e86bb44cb14930ce5", null ], + [ "L", "GooseEYE_8h.html#a43454c98d88250a5693a3696ca978cb4", null ], + [ "labels_map", "GooseEYE_8h.html#a6094d2e17d15643de7c45abd30f5ee6c", null ], + [ "labels_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 ], + [ "nearest", "GooseEYE_8h.html#a306dfde37d04075f3a635200b2f528ed", null ], + [ "path", "GooseEYE_8h.html#ac27cb5922686e23dbd84d313579b2add", null ], + [ "pos2img", "GooseEYE_8h.html#a9f61eb8a8f1b67fa3cad845d0f1cdcc9", null ], + [ "relabel_map", "GooseEYE_8h.html#adf6675e27a31a0210c4bc94b09e814f3", null ], + [ "S2", "GooseEYE_8h.html#ae27103f5b7d6acda6fc2e14c8dfd11b3", null ], + [ "S2", "GooseEYE_8h.html#ac01c192a6d398e2befc3aca36e953f0e", null ], + [ "W2", "GooseEYE_8h.html#aaa2055a53f179e2ddd810ebaf9eaf837", null ], + [ "W2", "GooseEYE_8h.html#ab349faaa82c253cea9d67996cb9749c7", null ], + [ "W2c", "GooseEYE_8h.html#a989df0528b84e5e0f4da84062785ee8b", null ], + [ "W2c", "GooseEYE_8h.html#a55b550567256dee0da56ac22fd2be72a", null ] +]; \ No newline at end of file diff --git a/GooseEYE_8h_source.html b/GooseEYE_8h_source.html new file mode 100644 index 00000000..8a6ed6e6 --- /dev/null +++ b/GooseEYE_8h_source.html @@ -0,0 +1,1556 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE.h
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_H
+
8#define GOOSEEYE_H
+
9
+
10#include "config.h"
+
11#include "detail.hpp"
+
12#include "version.h"
+
13#include <prrng.h>
+
14
+
15namespace GooseEYE {
+
16
+
17namespace detail {
+
18
+
22inline std::string get_namespace()
+
23{
+
24 std::string ret = "GooseEYE";
+
25#ifdef GOOSEEYE_USE_XTENSOR_PYTHON
+
26 return ret + ".";
+
27#else
+
28 return ret + "::";
+
29#endif
+
30}
+
31
+
36template <class T>
+
37inline std::string shape_to_string(const T& shape)
+
38{
+
39 std::string ret = "[";
+
40 for (size_t i = 0; i < shape.size(); ++i) {
+
41 ret += std::to_string(shape[i]);
+
42 if (i < shape.size() - 1) {
+
43 ret += ", ";
+
44 }
+
45 }
+
46 ret += "]";
+
47 return ret;
+
48}
+
49
+
50} // namespace detail
+
51
+
+
55namespace kernel {
+
56
+
62inline array_type::array<int> nearest(size_t ndim);
+
63
+
64} // namespace kernel
+
+
65
+
+
69enum class path_mode {
+
70 Bresenham,
+
71 actual,
+
72 full
+
73};
+
+
74
+ + + + +
86
+
+ +
97 const std::vector<size_t>& shape,
+ + + +
101 bool periodic = true)
+
102{
+
103 GOOSEEYE_ASSERT(row.shape() == col.shape(), std::out_of_range);
+
104 GOOSEEYE_ASSERT(row.shape() == r.shape(), std::out_of_range);
+
105 GOOSEEYE_ASSERT(shape.size() == 2, std::out_of_range);
+
106
+
107 array_type::array<int> out = xt::zeros<int>(shape);
+
108
+
109 if (periodic) {
+
110 for (size_t i = 0; i < row.size(); ++i) {
+
111 for (int di = -r(i); di <= r(i); ++di) {
+
112 for (int dj = -r(i); dj <= r(i); ++dj) {
+
113 int dr = (int)(ceil(pow((double)(pow(di, 2) + pow(dj, 2)), 0.5)));
+
114 if (dr < r(i)) {
+
115 out.periodic(row(i) + di, col(i) + dj) = 1;
+
116 }
+
117 }
+
118 }
+
119 }
+
120
+
121 return out;
+
122 }
+
123
+
124 for (size_t i = 0; i < row.size(); ++i) {
+
125 for (int di = -r(i); di <= r(i); ++di) {
+
126 for (int dj = -r(i); dj <= r(i); ++dj) {
+
127 if (out.in_bounds(row(i) + di, col(i) + dj)) {
+
128 int dr = (int)(ceil(pow((double)(pow(di, 2) + pow(dj, 2)), 0.5)));
+
129 if (dr < r(i)) {
+
130 out(row(i) + di, col(i) + dj) = 1;
+
131 }
+
132 }
+
133 }
+
134 }
+
135 }
+
136
+
137 return out;
+
138}
+
+
139
+ +
+
148dummy_circles(const std::vector<size_t>& shape, bool periodic = true, uint64_t seed = 0)
+
149{
+
150 GOOSEEYE_ASSERT(shape.size() == 2, std::out_of_range);
+
151 prrng::pcg32 rng(seed);
+
152
+
153 // set default: number of circles in both directions and (constant) radius
+
154 size_t N = (size_t)(0.05 * (double)shape[0]);
+
155 size_t M = (size_t)(0.05 * (double)shape[1]);
+
156 size_t R = (size_t)(pow((0.3 * (double)(shape[0] * shape[1])) / (M_PI * (double)(N * M)), 0.5));
+
157
+
158 array_type::tensor<int, 1> row = xt::empty<int>({M * N});
+
159 array_type::tensor<int, 1> col = xt::empty<int>({M * N});
+
160 array_type::tensor<int, 1> r = xt::empty<int>({M * N});
+
161
+
162 // define regular grid of circles
+
163 for (size_t i = 0; i < N; i++) {
+
164 for (size_t j = 0; j < M; j++) {
+
165 row[i * M + j] = (int)((double)i * (double)shape[0] / (double)N);
+
166 col[i * M + j] = (int)((double)j * (double)shape[1] / (double)M);
+
167 r[i * M + j] = (int)R;
+
168 }
+
169 }
+
170
+
171 // distance between circles
+
172 int dN = (int)(0.5 * (double)shape[0] / (double)N);
+
173 int dM = (int)(0.5 * (double)shape[1] / (double)M);
+
174
+
175 // randomly perturb circles (move in any direction, enlarge/shrink)
+
176 for (size_t i = 0; i < N * M; i++) {
+
177 row(i) += rng.randint(2 * dN) - dN;
+
178 col(i) += rng.randint(2 * dM) - dM;
+
179 r(i) = (double)r(i) * 2.0 * rng.random();
+
180 }
+
181
+
182 // convert to image
+
183 return dummy_circles(shape, row, col, r, periodic);
+
184}
+
+
185
+
195template <
+
196 class T,
+
197 class S,
+
198 std::enable_if_t<
+
199 std::is_integral<typename T::value_type>::value &&
+
200 std::is_integral<typename S::value_type>::value,
+
201 int> = 0>
+
202inline T dilate(
+
203 const T& f,
+
204 const S& kernel,
+
205 const array_type::tensor<size_t, 1>& iterations,
+
206 bool periodic = true);
+
207
+
212template <class T, std::enable_if_t<std::is_integral<typename T::value_type>::value, int> = 0>
+
213inline T dilate(const T& f, const array_type::tensor<size_t, 1>& iterations, bool periodic = true);
+
214
+
219template <
+
220 class T,
+
221 class S,
+
222 std::enable_if_t<
+
223 std::is_integral<typename T::value_type>::value &&
+
224 std::is_integral<typename S::value_type>::value,
+
225 int> = 0>
+
226inline T dilate(const T& f, const S& kernel, size_t iterations = 1, bool periodic = true);
+
227
+
232template <class T, std::enable_if_t<std::is_integral<typename T::value_type>::value, int> = 0>
+
233inline T dilate(const T& f, size_t iterations = 1, bool periodic = true);
+
234
+
241template <class T, class S>
+
+
242[[deprecated]] array_type::tensor<size_t, 1> relabel_map(const T& a, const S& b)
+
243{
+
244 GOOSEEYE_WARNING_PYTHON("relabel_map is deprecated, use labels_map instead (new API) instead");
+
245 GOOSEEYE_ASSERT(xt::has_shape(a, b.shape()), std::out_of_range);
+
246
+
247 array_type::tensor<size_t, 1> ret = xt::zeros<size_t>({static_cast<size_t>(xt::amax(a)() + 1)});
+
248
+
249 for (size_t i = 0; i < a.size(); ++i) {
+
250 ret(a.flat(i)) = b.flat(i);
+
251 }
+
252
+
253 return ret;
+
254}
+
+
255
+
262template <class T>
+
+ +
264{
+
265 using value_type = typename T::value_type;
+
266 std::map<value_type, value_type> map;
+
267
+
268 for (size_t i = 0; i < a.size(); ++i) {
+
269 map.try_emplace(a.flat(i), b.flat(i));
+
270 }
+
271
+
272 size_t i = 0;
+ +
274 xt::empty<typename T::value_type>(std::array<size_t, 2>{map.size(), 2});
+
275
+
276 for (auto const& [key, val] : map) {
+
277 ret(i, 0) = key;
+
278 ret(i, 1) = val;
+
279 ++i;
+
280 }
+
281
+
282 return ret;
+
283}
+
+
284
+
291template <class L, class A>
+
+
292inline L labels_rename(const L& labels, const A& rename)
+
293{
+
294 GOOSEEYE_ASSERT(rename.dimension() == 2, std::out_of_range);
+
295 GOOSEEYE_ASSERT(rename.shape(1) == 2, std::out_of_range);
+
296 using value_type = typename A::value_type;
+
297 std::map<value_type, value_type> map;
+
298 for (size_t i = 0; i < rename.shape(0); ++i) {
+
299 map.emplace(rename(i, 0), rename(i, 1));
+
300 }
+
301
+
302#ifdef GOOSEEYE_ENABLE_ASSERT
+
303 auto l = xt::unique(labels);
+
304 for (size_t i = 0; i < l.size(); ++i) {
+
305 GOOSEEYE_ASSERT(map.count(l(i)) > 0, std::out_of_range);
+
306 }
+
307#endif
+
308
+
309 L ret = xt::empty_like(labels);
+
310 for (size_t i = 0; i < labels.size(); ++i) {
+
311 ret.flat(i) = map[labels.flat(i)];
+
312 }
+
313
+
314 return ret;
+
315}
+
+
316
+
324template <class T>
+
+
325inline T labels_prune(const T& labels)
+
326{
+
327 using value_type = typename T::value_type;
+
328 auto unq = xt::unique(labels);
+
329 bool background = xt::any(xt::equal(unq, 0));
+
330
+
331 std::array<size_t, 2> shape = {unq.size(), 2};
+
332 array_type::tensor<value_type, 2> rename = xt::empty<value_type>(shape);
+
333
+
334 if (background) {
+
335 rename(0, 0) = 0;
+
336 rename(0, 1) = 0;
+
337 if (unq(0) == 0) {
+
338 for (size_t i = 1; i < unq.size(); ++i) {
+
339 rename(i, 0) = unq(i);
+
340 rename(i, 1) = i;
+
341 }
+
342 }
+
343 else {
+
344 size_t row = 1;
+
345 for (size_t i = 0; i < unq.size(); ++i) {
+
346 if (unq(i) == 0) {
+
347 continue;
+
348 }
+
349 rename(row, 0) = unq(i);
+
350 rename(row, 1) = row;
+
351 row++;
+
352 }
+
353 }
+
354 }
+
355 else {
+
356 for (size_t i = 0; i < unq.size(); ++i) {
+
357 rename(i, 0) = unq(i);
+
358 rename(i, 1) = i + 1;
+
359 }
+
360 }
+
361 return labels_rename(labels, rename);
+
362}
+
+
363
+
370template <class L, class A>
+
+
371inline L labels_reorder(const L& labels, const A& order)
+
372{
+
373#ifdef GOOSEEYE_ENABLE_ASSERT
+
374 auto a = xt::unique(labels);
+
375 auto b = xt::unique(order);
+
376 GOOSEEYE_ASSERT(a.size() == b.size(), std::out_of_range);
+
377 GOOSEEYE_ASSERT(xt::all(xt::equal(a, b)), std::out_of_range);
+
378#endif
+
379
+
380 auto maxlab = *std::max_element(order.begin(), order.end());
+
381 std::vector<typename A::value_type> renum(maxlab + 1);
+
382
+
383 for (size_t i = 0; i < order.size(); ++i) {
+
384 renum[order[i]] = i;
+
385 }
+
386
+
387 L ret = xt::empty_like(labels);
+
388 for (size_t i = 0; i < labels.size(); ++i) {
+
389 ret.flat(i) = renum[labels.flat(i)];
+
390 }
+
391
+
392 return ret;
+
393}
+
+
394
+
400template <class T>
+
+ +
402{
+
403 using value_type = typename T::value_type;
+
404 std::map<value_type, value_type> map;
+
405
+
406 for (size_t i = 0; i < labels.size(); ++i) {
+
407 if (map.count(labels.flat(i)) == 0) {
+
408 map.emplace(labels.flat(i), 1);
+
409 }
+
410 else {
+
411 map[labels.flat(i)]++;
+
412 }
+
413 }
+
414
+
415 size_t i = 0;
+ +
417 xt::empty<value_type>(std::array<size_t, 2>{map.size(), 2});
+
418
+
419 for (auto const& [key, val] : map) {
+
420 ret(i, 0) = key;
+
421 ret(i, 1) = val;
+
422 ++i;
+
423 }
+
424
+
425 return ret;
+
426}
+
+
427
+
428namespace detail {
+
429
+
435template <size_t Dim, class T>
+
436inline array_type::tensor<ptrdiff_t, 2> kernel_to_dx(T kernel)
+
437{
+
438#ifdef GOOSEEYE_ENABLE_ASSERT
+
439 for (size_t i = 0; i < Dim; ++i) {
+
440 GOOSEEYE_ASSERT(kernel.shape(i) % 2 == 1, std::out_of_range);
+
441 }
+
442#endif
+
443
+
444 std::array<size_t, Dim> mid;
+
445 for (size_t i = 0; i < Dim; ++i) {
+
446 mid[i] = (kernel.shape(i) - 1) / 2;
+
447 }
+
448 size_t idx = 0;
+
449 for (size_t i = 0; i < Dim; ++i) {
+
450 idx += mid[i] * kernel.strides()[i];
+
451 }
+
452 GOOSEEYE_ASSERT(kernel.flat(idx) == 1, std::out_of_range);
+
453 kernel.flat(idx) = 0;
+
454
+
455 if constexpr (Dim == 1) {
+
456 auto i = xt::flatten_indices(xt::argwhere(kernel)) - mid[0];
+
457 array_type::tensor<ptrdiff_t, 2> ret = xt::empty<ptrdiff_t>({i.size(), size_t(1)});
+
458 std::copy(i.begin(), i.end(), ret.begin());
+
459 return ret;
+
460 }
+
461
+
462 auto ret = xt::from_indices(xt::argwhere(kernel));
+
463 for (size_t i = 0; i < Dim; ++i) {
+
464 xt::view(ret, xt::all(), i) -= mid[i];
+
465 }
+
466 return ret;
+
467}
+
468
+
469} // namespace detail
+
470
+
476template <size_t Dimension, bool Periodicity = true>
+
+ +
478public:
+
479 static constexpr size_t Dim = Dimension;
+
480 static constexpr bool Periodic = Periodicity;
+
481
+
482private:
+
483 std::array<ptrdiff_t, Dim> m_shape;
+ + +
486 ptrdiff_t m_new_label = 1;
+
487 size_t m_nmerge = 0;
+
488 std::array<ptrdiff_t, Dim> m_strides;
+
489
+
496 std::vector<ptrdiff_t> m_renum;
+
497
+
508 std::vector<ptrdiff_t> m_next;
+
509 std::vector<ptrdiff_t> m_connected;
+
510
+
511 typedef ptrdiff_t (ClusterLabeller<Dimension, Periodicity>::*CompareImpl)(size_t, size_t);
+ +
513
+
514public:
+
518 template <class T>
+
+ +
520 {
+
521 if constexpr (Dim == 1) {
+
522 // kernel = {1, 1, 1}
+
523 m_dx = {{-1}, {1}};
+
524 }
+
525 else if constexpr (Dim == 2) {
+
526 // kernel = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
+
527 m_dx = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
+
528 }
+
529 else if constexpr (Dim == 3) {
+
530 m_dx = {{-1, 0, 0}, {0, -1, 0}, {0, 0, -1}, {0, 0, 1}, {0, 1, 0}, {1, 0, 0}};
+
531 }
+
532 else {
+
533 throw std::runtime_error("Please specify the kernel in dimensions > 3.");
+
534 }
+
535 this->init(shape);
+
536 }
+
+
537
+
542 template <class T, class K>
+
+
543 ClusterLabeller(const T& shape, const K& kernel)
+
544 {
+
545 m_dx = detail::kernel_to_dx<Dim>(kernel);
+
546 this->init(shape);
+
547 }
+
+
548
+
549private:
+
550 template <class T>
+
551 void init(const T& shape)
+
552 {
+
553 m_label = xt::empty<ptrdiff_t>(shape);
+
554 m_renum.resize(m_label.size() + 1);
+
555 m_next.resize(m_label.size() + 1);
+
556 for (size_t i = 0; i < Dim; ++i) {
+
557 m_shape[i] = static_cast<ptrdiff_t>(shape[i]);
+
558 if constexpr (Dim >= 2) {
+
559 m_strides[i] = static_cast<ptrdiff_t>(m_label.strides()[i]);
+
560 }
+
561 }
+
562 this->reset();
+
563 m_connected.resize(m_dx.shape(0));
+
564
+
565 // Dim == 2: by default strides are assumed non-zero to avoid extra checks
+
566 // check once if zeros strides occur and if so use a special implementation of unravel_index
+
567 if constexpr (Dim == 2) {
+
568 if (m_shape[0] == 1) {
+
569 get_compare = &ClusterLabeller<Dimension, Periodicity>::get_compare_2d_1n;
+
570 }
+
571 else if (m_shape[1] == 1) {
+
572 get_compare = &ClusterLabeller<Dimension, Periodicity>::get_compare_2d_n1;
+
573 }
+
574 }
+
575 }
+
576
+
577public:
+
+
581 void reset()
+
582 {
+
583 std::fill(m_label.begin(), m_label.end(), 0);
+
584 std::iota(m_renum.begin(), m_renum.end(), 0);
+
585 m_new_label = 1;
+
586 this->clean_next();
+
587 }
+
+
588
+
+
593 void prune()
+
594 {
+
595 ptrdiff_t n = static_cast<ptrdiff_t>(m_new_label);
+
596 m_new_label = 1;
+
597 m_renum[0] = 0;
+
598 for (ptrdiff_t i = 1; i < n; ++i) {
+
599 if (m_renum[i] == i) {
+
600 m_renum[i] = m_new_label;
+
601 ++m_new_label;
+
602 }
+
603 }
+
604 this->private_renumber(m_renum);
+
605 std::iota(m_renum.begin(), m_renum.begin() + n, 0);
+
606 }
+
+
607
+
608private:
+
612 void clean_next()
+
613 {
+
614 std::fill(m_next.begin(), m_next.end(), -1);
+
615 }
+
616
+
621 template <class T>
+
622 void private_renumber(const T& renum)
+
623 {
+
624 for (size_t i = 0; i < m_label.size(); ++i) {
+
625 m_label.flat(i) = renum[m_label.flat(i)];
+
626 }
+
627 }
+
628
+
637 void merge_detail(ptrdiff_t a, ptrdiff_t b)
+
638 {
+
639 // -> head[list(b)] = head[a]
+
640 ptrdiff_t i = m_renum[b];
+
641 ptrdiff_t target = m_renum[a];
+
642 m_renum[b] = target;
+
643 while (true) {
+
644 i = m_next[i];
+
645 if (i == -1) {
+
646 break;
+
647 }
+
648 m_renum[i] = target;
+
649 }
+
650 // -> list(head[a]).append(list(b))
+
651 while (m_next[a] != -1) {
+
652 a = m_next[a];
+
653 }
+
654 m_next[a] = b;
+
655 }
+
656
+
664 ptrdiff_t merge(ptrdiff_t* labels, size_t nlabels)
+
665 {
+
666 std::sort(labels, labels + nlabels);
+
667 nlabels = std::unique(labels, labels + nlabels) - labels;
+
668 ptrdiff_t target = labels[0];
+
669 for (size_t i = 1; i < nlabels; ++i) {
+
670 this->merge_detail(target, labels[i]);
+
671 }
+
672 return target;
+
673 }
+
674
+
675 void apply_merge()
+
676 {
+
677 if (m_nmerge == 0) {
+
678 return;
+
679 }
+
680
+
681 this->private_renumber(m_renum);
+
682 this->clean_next();
+
683 m_nmerge = 0;
+
684 }
+
685
+
690 ptrdiff_t get_compare_2d_1n(size_t idx, size_t j)
+
691 {
+
692 if constexpr (Periodic) {
+
693 return (m_shape[1] + idx + m_dx(j, 1)) % m_shape[1];
+
694 }
+
695 if constexpr (!Periodic) {
+
696 ptrdiff_t compare = idx + m_dx(j, 1);
+
697 if (compare < 0 || compare >= m_shape[1]) {
+
698 return -1;
+
699 }
+
700 return compare;
+
701 }
+
702 }
+
703
+
708 ptrdiff_t get_compare_2d_n1(size_t idx, size_t j)
+
709 {
+
710 if constexpr (Periodic) {
+
711 return (m_shape[0] + idx + m_dx(j, 0)) % m_shape[0];
+
712 }
+
713 if constexpr (!Periodic) {
+
714 ptrdiff_t compare = idx + m_dx(j, 0);
+
715 if (compare < 0 || compare >= m_shape[0]) {
+
716 return -1;
+
717 }
+
718 return compare;
+
719 }
+
720 }
+
721
+
730 ptrdiff_t get_compare_default(size_t idx, size_t j)
+
731 {
+
732 if constexpr (Dim == 1 && Periodic) {
+
733 return (m_shape[0] + idx + m_dx.flat(j)) % m_shape[0];
+
734 }
+
735 if constexpr (Dim == 1 && !Periodic) {
+
736 ptrdiff_t compare = idx + m_dx.flat(j);
+
737 if (compare < 0 || compare >= m_shape[0]) {
+
738 return -1;
+
739 }
+
740 return idx + m_dx.flat(j);
+
741 }
+
742 if constexpr (Dim == 2 && Periodic) {
+
743 ptrdiff_t ii = (m_shape[0] + (idx / m_strides[0]) + m_dx(j, 0)) % m_shape[0];
+
744 ptrdiff_t jj = (m_shape[1] + (idx % m_strides[0]) + m_dx(j, 1)) % m_shape[1];
+
745 return ii * m_shape[1] + jj;
+
746 }
+
747 if constexpr (Dim == 2 && !Periodic) {
+
748 ptrdiff_t ii = (idx / m_strides[0]) + m_dx(j, 0);
+
749 ptrdiff_t jj = (idx % m_strides[0]) + m_dx(j, 1);
+
750 if (ii < 0 || ii >= m_shape[0] || jj < 0 || jj >= m_shape[1]) {
+
751 return -1;
+
752 }
+
753 return ii * m_shape[1] + jj;
+
754 }
+
755 else {
+
756 auto index = xt::unravel_from_strides(idx, m_strides, xt::layout_type::row_major);
+
757 for (size_t d = 0; d < Dim; ++d) {
+
758 index[d] += m_dx(j, d);
+
759 if constexpr (!Periodic) {
+
760 if (index[d] < 0 || index[d] >= m_shape[d]) {
+
761 return -1;
+
762 }
+
763 }
+
764 else {
+
765 auto n = m_shape[d];
+
766 index[d] = (n + (index[d] % n)) % n;
+
767 }
+
768 }
+
769 return xt::ravel_index(index, m_shape, xt::layout_type::row_major);
+
770 }
+
771 }
+
772
+
773 void label_impl(size_t idx)
+
774 {
+
775 size_t nconnected = 0;
+
776
+
777 for (size_t j = 0; j < m_dx.shape(0); ++j) {
+
778 ptrdiff_t compare = (this->*get_compare)(idx, j);
+
779 if constexpr (!Periodic) {
+
780 if (compare == -1) {
+
781 continue;
+
782 }
+
783 }
+
784 if (m_label.flat(compare) != 0) {
+
785 m_connected[nconnected] = m_renum[m_label.flat(compare)];
+
786 nconnected++;
+
787 }
+
788 }
+
789
+
790 if (nconnected == 0) {
+
791 m_label.flat(idx) = m_new_label;
+
792 m_new_label += 1;
+
793 return;
+
794 }
+
795
+
796 if (nconnected == 1) {
+
797 m_label.flat(idx) = m_connected[0];
+
798 return;
+
799 }
+
800
+
801 // mark all labels in the list for merging
+
802 // `m_label` is not yet updated to avoid looping over all blocks too frequently
+
803 // the new label can be read by `m_renum[lab]` (as done above)
+
804 m_label.flat(idx) = this->merge(&m_connected[0], nconnected);
+
805 m_nmerge++;
+
806 }
+
807
+
808public:
+
813 template <class T>
+
+
814 void add_image(const T& img)
+
815 {
+
816 GOOSEEYE_ASSERT(xt::has_shape(img, m_label.shape()), std::out_of_range);
+
817
+
818 for (size_t idx = 0; idx < img.size(); ++idx) {
+
819 if (img.flat(idx) == 0) {
+
820 continue;
+
821 }
+
822 if (m_label.flat(idx) != 0) {
+
823 continue;
+
824 }
+
825 this->label_impl(idx);
+
826 }
+
827 this->apply_merge();
+
828 }
+
+
829
+
835 template <class T>
+
+
836 void add_points(const T& begin, const T& end)
+
837 {
+
838#ifdef GOOSEEYE_ENABLE_ASSERT
+
839 size_t n = m_label.size();
+
840 if constexpr (std::is_signed_v<typename T::value_type>) {
+ +
842 !std::any_of(begin, end, [n](size_t i) { return i < 0 || i >= n; }),
+
843 std::out_of_range);
+
844 }
+
845 else {
+ +
847 !std::any_of(begin, end, [n](size_t i) { return i >= n; }), std::out_of_range);
+
848 }
+
849#endif
+
850
+
851 for (auto it = begin; it != end; ++it) {
+
852 if (m_label.flat(*it) != 0) {
+
853 continue;
+
854 }
+
855 this->label_impl(*it);
+
856 }
+
857 this->apply_merge();
+
858 }
+
+
859
+
864 template <class T>
+
+
865 void add_points(const T& idx)
+
866 {
+
867 GOOSEEYE_ASSERT(idx.dimension() == 1, std::out_of_range);
+
868 return this->add_points(idx.begin(), idx.end());
+
869 }
+
+
870
+
+
875 std::string repr() const
+
876 {
+
877 return detail::get_namespace() + "ClusterLabeller" + std::to_string(Dim) + " " +
+
878 detail::shape_to_string(m_shape);
+
879 }
+
+
880
+
+
885 const auto& shape() const
+
886 {
+
887 return m_label.shape();
+
888 }
+
+
889
+
+
894 auto size() const
+
895 {
+
896 return m_label.size();
+
897 }
+
+
898
+
899 // todo: allow resetting a cluster map ?
+
900
+
+
905 const auto& labels() const
+
906 {
+
907 return m_label;
+
908 }
+
+
909};
+
+
910
+
+
914class [[deprecated]] Clusters {
+
915public:
+
916 Clusters() = default;
+
917
+
924 template <class T>
+
+
925 Clusters(const T& f, bool periodic = true)
+
926 : Clusters(f, kernel::nearest(f.dimension()), periodic)
+
927 {
+
928 }
+
+
929
+
937 template <class T, class S>
+
+
938 Clusters(const T& f, const S& kernel, bool periodic = true) : m_periodic(periodic)
+
939 {
+
940 GOOSEEYE_WARNING_PYTHON("Clusters is deprecated, use ClusterLabeller (new API) instead "
+
941 "(please open a PR for missing functions)");
+
942
+
943 static_assert(std::is_integral<typename T::value_type>::value, "Integral labels required.");
+
944 static_assert(std::is_integral<typename S::value_type>::value, "Integral kernel required.");
+
945
+
946 GOOSEEYE_ASSERT(xt::all(xt::equal(f, 0) || xt::equal(f, 1)), std::out_of_range);
+
947 GOOSEEYE_ASSERT(xt::all(xt::equal(kernel, 0) || xt::equal(kernel, 1)), std::out_of_range);
+
948 GOOSEEYE_ASSERT(f.dimension() == kernel.dimension(), std::out_of_range);
+
949
+
950 m_shape = detail::shape(f);
+
951 m_kernel = xt::atleast_3d(kernel);
+
952 m_pad = detail::pad_width(m_kernel);
+
953 m_l = xt::atleast_3d(f);
+
954
+
955 // note that "m_l" contains the labels, but also the image:
+
956 // 0: background, 1: unlabelled, >= 2: labels
+
957 this->compute();
+
958
+
959 // connect labels periodically
+
960 if (m_periodic) {
+
961 m_l_np = m_l;
+
962 this->compute();
+
963 }
+
964
+
965 // rename labels to lowest possible label starting from 1
+
966 array_type::tensor<int, 1> labels = xt::unique(m_l);
+
967 array_type::tensor<int, 1> renum = xt::empty<int>({m_l.size()});
+
968 xt::view(renum, xt::keep(labels)) = xt::arange<int>(static_cast<int>(labels.size()));
+
969 for (auto& i : m_l) {
+
970 i = renum(i);
+
971 }
+
972 }
+
+
973
+
+ +
979 {
+
980 return xt::adapt(m_l.data(), m_shape);
+
981 }
+
+
982
+
+ +
988 {
+
989 array_type::tensor<size_t, 2> x = xt::floor(this->center_positions(true));
+
990 array_type::array<int> c = xt::zeros<int>(m_l.shape());
+
991
+
992 for (int l = 1; l < static_cast<int>(x.shape(0)); ++l) {
+
993 c(x(l, 0), x(l, 1), x(l, 2)) = l;
+
994 }
+
995
+
996 c.reshape(m_shape);
+
997 return c;
+
998 }
+
+
999
+
+ +
1005 {
+ +
1007
+
1008 if (m_periodic) {
+
1009 x = this->average_position_periodic();
+
1010 }
+
1011 else {
+
1012 x = this->average_position(m_l);
+
1013 }
+
1014
+
1015 if (as3d) {
+
1016 return x;
+
1017 }
+
1018
+
1019 array_type::tensor<size_t, 1> axes = detail::atleast_3d_axes(m_shape.size());
+
1020 return xt::view(x, xt::all(), xt::keep(axes));
+
1021 }
+
+
1022
+
+ +
1028 {
+
1029 GOOSEEYE_WARNING_PYTHON("Clusters.sizes() is deprecated, use labels_sizes() (new API)");
+
1030 array_type::tensor<size_t, 1> ret = xt::zeros<size_t>({xt::amax(m_l)() + size_t(1)});
+
1031
+
1032 for (size_t h = 0; h < m_l.shape(0); ++h) {
+
1033 for (size_t i = 0; i < m_l.shape(1); ++i) {
+
1034 for (size_t j = 0; j < m_l.shape(2); ++j) {
+
1035 ret(m_l(h, i, j))++;
+
1036 }
+
1037 }
+
1038 }
+
1039
+
1040 return ret;
+
1041 }
+
+
1042
+
1043private:
+
1044 void compute()
+
1045 {
+
1046 xt::pad_mode pad_mode = xt::pad_mode::constant;
+
1047 int pad_value = 0;
+
1048
+
1049 if (m_periodic) {
+
1050 pad_mode = xt::pad_mode::periodic;
+
1051 }
+
1052
+
1053 m_l = xt::pad(m_l, m_pad, pad_mode, pad_value);
+
1054
+
1055 // first new label (start at 2 to distinguish: 0 = background, 1 = unlabelled)
+
1056 int ilab = 2;
+
1057
+
1058 // list to renumber: used to link clusters to each other
+
1059 // N.B. By default the algorithm simply loops over the image, consequently it will miss that
+
1060 // clusters may touch further down in the image, labelling one cluster with several labels.
+
1061 // Using "renum" these touching clusters will glued and assigned one single label.
+
1062 array_type::tensor<int, 1> renum = xt::arange<int>(static_cast<int>(m_l.size()));
+
1063
+
1064 for (size_t h = m_pad[0][0]; h < m_l.shape(0) - m_pad[0][1]; ++h) {
+
1065 for (size_t i = m_pad[1][0]; i < m_l.shape(1) - m_pad[1][1]; ++i) {
+
1066 for (size_t j = m_pad[2][0]; j < m_l.shape(2) - m_pad[2][1]; ++j) {
+
1067 // - skip background voxels
+
1068 if (!m_l(h, i, j)) {
+
1069 continue;
+
1070 }
+
1071 // - get current labels in the ROI
+
1072 auto Li = xt::view(
+
1073 m_l,
+
1074 xt::range(h - m_pad[0][0], h + m_pad[0][1] + 1),
+
1075 xt::range(i - m_pad[1][0], i + m_pad[1][1] + 1),
+
1076 xt::range(j - m_pad[2][0], j + m_pad[2][1] + 1));
+
1077 // - apply kernel to the labels in the ROI
+
1078 auto Ni = Li * m_kernel;
+
1079 // - extract label to apply
+
1080 int l = xt::amax(Ni)();
+
1081 // - draw a new label, only if there is no previous label (>= 2)
+
1082 if (l == 1) {
+
1083 l = ilab;
+
1084 ++ilab;
+
1085 }
+
1086 // - apply label to all unlabelled voxels
+
1087 Li = xt::where(xt::equal(Ni, 1), l, Li);
+
1088 // - check if clusters have to be merged, if not: continue to the next voxel
+
1089 if (xt::all(xt::equal(Li, l) || xt::equal(Li, 0) || xt::equal(Li, 1))) {
+
1090 continue;
+
1091 }
+
1092 // - get the labels to be merged
+
1093 // (discard 0 and 1 by settings them to "l" in this copy)
+
1094 array_type::array<int> merge = xt::where(xt::less_equal(Li, 1), l, Li);
+
1095 merge = xt::unique(merge);
+
1096 // - merge labels (apply merge to other labels in cluster)
+
1097 int linkto = xt::amin(xt::view(renum, xt::keep(merge)))[0];
+
1098 for (auto& a : merge) {
+
1099 renum = xt::where(xt::equal(renum, renum(a)), linkto, renum);
+
1100 }
+
1101 }
+
1102 }
+
1103 }
+
1104
+
1105 // remove padding
+
1106 m_l = xt::view(
+
1107 m_l,
+
1108 xt::range(m_pad[0][0], m_l.shape(0) - m_pad[0][1]),
+
1109 xt::range(m_pad[1][0], m_l.shape(1) - m_pad[1][1]),
+
1110 xt::range(m_pad[2][0], m_l.shape(2) - m_pad[2][1]));
+
1111
+
1112 // apply renumbering: merges clusters
+
1113 for (auto& i : m_l) {
+
1114 i = renum(i);
+
1115 }
+
1116 }
+
1117
+
1118 template <class T>
+
1119 array_type::tensor<double, 2> average_position(const T& lab) const
+
1120 {
+
1121 // number of labels
+
1122 size_t N = xt::amax(lab)() + 1;
+
1123
+
1124 // allocate average position
+
1125 array_type::tensor<double, 2> x = xt::zeros<double>({N, size_t(3)});
+
1126 array_type::tensor<double, 1> n = xt::zeros<double>({N});
+
1127
+
1128 for (size_t h = 0; h < lab.shape(0); ++h) {
+
1129 for (size_t i = 0; i < lab.shape(1); ++i) {
+
1130 for (size_t j = 0; j < lab.shape(2); ++j) {
+
1131 // get label
+
1132 int l = lab(h, i, j);
+
1133 // update average position
+
1134 if (l) {
+
1135 x(l, 0) += (double)h;
+
1136 x(l, 1) += (double)i;
+
1137 x(l, 2) += (double)j;
+
1138 n(l) += 1.0;
+
1139 }
+
1140 }
+
1141 }
+
1142 }
+
1143
+
1144 // avoid zero division
+
1145 n = xt::where(xt::equal(n, 0), 1, n);
+
1146
+
1147 // normalise
+
1148 for (size_t i = 0; i < x.shape(1); ++i) {
+
1149 auto xi = xt::view(x, xt::all(), i);
+
1150 xi = xi / n;
+
1151 }
+
1152
+
1153 return x;
+
1154 }
+
1155
+
1156 array_type::tensor<double, 2> average_position_periodic() const
+
1157 {
+
1158 // get relabelling "m_l_np" -> "m_l"
+
1159 auto relabel = relabel_map(m_l_np, m_l);
+
1160
+
1161 // compute average position for the non-periodic labels
+
1162 auto x_np = this->average_position(m_l_np);
+
1163
+
1164 // get half size
+
1165 auto mid = detail::half_shape(m_shape);
+
1166
+
1167 // initialise shift to apply
+
1168 array_type::tensor<double, 2> shift = xt::zeros<double>({x_np.shape(0), size_t(3)});
+
1169
+
1170 // check to apply shift
+
1171 for (size_t i = 0; i < shift.shape(0); ++i) {
+
1172 for (size_t j = 0; j < shift.shape(1); ++j) {
+
1173 if (x_np(i, j) > mid[j]) {
+
1174 shift(i, j) = -(double)m_shape[j];
+
1175 }
+
1176 }
+
1177 }
+
1178
+
1179 // number of labels
+
1180 size_t N = xt::amax(m_l)() + 1;
+
1181
+
1182 // allocate average position
+
1183 array_type::tensor<double, 2> x = xt::zeros<double>({N, size_t(3)});
+
1184 array_type::tensor<double, 1> n = xt::zeros<double>({N});
+
1185
+
1186 for (size_t h = 0; h < m_l.shape(0); ++h) {
+
1187 for (size_t i = 0; i < m_l.shape(1); ++i) {
+
1188 for (size_t j = 0; j < m_l.shape(2); ++j) {
+
1189 // get label
+
1190 int l = m_l_np(h, i, j);
+
1191 // update average position
+
1192 if (l) {
+
1193 x(relabel(l), 0) += (double)h + shift(l, 0);
+
1194 x(relabel(l), 1) += (double)i + shift(l, 1);
+
1195 x(relabel(l), 2) += (double)j + shift(l, 2);
+
1196 n(relabel(l)) += 1.0;
+
1197 }
+
1198 }
+
1199 }
+
1200 }
+
1201
+
1202 // avoid zero division
+
1203 n = xt::where(xt::equal(n, 0), 1, n);
+
1204
+
1205 // normalise
+
1206 for (size_t i = 0; i < x.shape(1); ++i) {
+
1207 auto xi = xt::view(x, xt::all(), i);
+
1208 xi = xi / n;
+
1209 xi = xt::where(xi < 0, xi + m_shape[i], xi);
+
1210 }
+
1211
+
1212 return x;
+
1213 }
+
1214
+
1215 static const size_t MAX_DIM = 3;
+
1216 std::vector<size_t> m_shape; // shape of the input image
+
1217 std::vector<std::vector<size_t>> m_pad;
+
1218 array_type::tensor<int, 3> m_kernel;
+
1219 bool m_periodic;
+
1220 array_type::tensor<int, 3> m_l; // labels (>= 1, 0 = background), 3-d
+
1221 array_type::tensor<int, 3> m_l_np; // labels before applying periodicity
+
1222};
+
+
1223
+
1224namespace detail {
+
1225
+
1226template <size_t Dimension, bool Periodicity>
+
1227class ClusterLabellerOverload : public ClusterLabeller<Dimension, Periodicity> {
+
1228public:
+
1229 template <class T>
+
1230 ClusterLabellerOverload(const T& img) : ClusterLabeller<Dimension, Periodicity>(img.shape())
+
1231 {
+
1232 this->add_image(img);
+
1233 this->prune();
+
1234 }
+
1235
+
1236 auto get() const
+
1237 {
+
1238 return this->labels();
+
1239 }
+
1240};
+
1241
+
1242} // namespace detail
+
1243
+
1250template <class T>
+
+
1251array_type::array<int> clusters(const T& f, bool periodic = true)
+
1252{
+
1253 GOOSEEYE_ASSERT(f.layout() == xt::layout_type::row_major, std::runtime_error);
+
1254
+
1255 auto n = f.dimension();
+
1256 if (n == 1 && periodic) {
+
1257 return detail::ClusterLabellerOverload<1, true>(f).get();
+
1258 }
+
1259 if (n == 1 && !periodic) {
+
1260 return detail::ClusterLabellerOverload<1, false>(f).get();
+
1261 }
+
1262 if (n == 2 && periodic) {
+
1263 return detail::ClusterLabellerOverload<2, true>(f).get();
+
1264 }
+
1265 if (n == 2 && !periodic) {
+
1266 return detail::ClusterLabellerOverload<2, false>(f).get();
+
1267 }
+
1268 if (n == 3 && periodic) {
+
1269 return detail::ClusterLabellerOverload<3, true>(f).get();
+
1270 }
+
1271 if (n == 3 && !periodic) {
+
1272 return detail::ClusterLabellerOverload<3, false>(f).get();
+
1273 }
+
1274 throw std::runtime_error("Please use ClusterLabeller directly for dimensions > 3.");
+
1275}
+
+
1276
+
1284template <typename T, typename U, typename V>
+
+
1285inline T pos2img(const T& img, const U& positions, const V& labels)
+
1286{
+
1287 GOOSEEYE_ASSERT(img.dimension() > 0, std::out_of_range);
+
1288 GOOSEEYE_ASSERT(img.dimension() <= 3, std::out_of_range);
+
1289 GOOSEEYE_ASSERT(img.dimension() == positions.shape(1), std::out_of_range);
+
1290 GOOSEEYE_ASSERT(positions.shape(0) == labels.size(), std::out_of_range);
+
1291 GOOSEEYE_ASSERT(labels.dimension() == 1, std::out_of_range);
+
1292
+
1293 using value_type = typename T::value_type;
+
1294 T res = img;
+
1295
+
1296 if (res.dimension() == 1) {
+
1297 xt::view(res, xt::keep(positions)) = labels;
+
1298 }
+
1299 else if (res.dimension() == 2) {
+
1300 for (size_t i = 0; i < positions.shape(0); ++i) {
+
1301 res(positions(i, 0), positions(i, 1)) = static_cast<value_type>(labels(i));
+
1302 }
+
1303 }
+
1304 else {
+
1305 for (size_t i = 0; i < positions.shape(0); ++i) {
+
1306 res(positions(i, 0), positions(i, 1), positions(i, 2)) =
+
1307 static_cast<value_type>(labels(i));
+
1308 }
+
1309 }
+
1310
+
1311 return res;
+
1312}
+
+
1313
+
1325template <class T>
+
+
1326array_type::tensor<double, 2> center_of_mass(const T& labels, bool periodic = true)
+
1327{
+
1328 static_assert(std::is_integral<typename T::value_type>::value, "Integral labels required.");
+
1329
+
1330 GOOSEEYE_ASSERT(labels.dimension() > 0, std::out_of_range);
+
1331 GOOSEEYE_ASSERT(xt::all(labels >= 0), std::out_of_range);
+
1332
+
1333 double pi = xt::numeric_constants<double>::PI;
+
1334 size_t N = static_cast<size_t>(xt::amax(labels)(0)) + 1ul;
+
1335 size_t rank = labels.dimension();
+
1336 auto axes = detail::atleast_3d_axes(rank);
+
1337 array_type::tensor<double, 1> shape = xt::adapt(labels.shape());
+
1338 array_type::tensor<double, 2> ret = xt::zeros<double>({N, rank});
+
1339
+
1340 for (size_t l = 0; l < N; ++l) {
+ +
1342 xt::from_indices(xt::argwhere(xt::equal(labels, l)));
+
1343 if (positions.size() == 0) {
+
1344 continue;
+
1345 }
+
1346 if (!periodic) {
+
1347 xt::view(ret, l, xt::all()) = xt::mean(positions, 0);
+
1348 }
+
1349 else {
+
1350 if (xt::all(xt::equal(positions, 0.0))) {
+
1351 continue;
+
1352 }
+
1353 auto theta = 2.0 * pi * positions / shape;
+
1354 auto xi = xt::cos(theta);
+
1355 auto zeta = xt::sin(theta);
+
1356 auto xi_bar = xt::mean(xi, 0);
+
1357 auto zeta_bar = xt::mean(zeta, 0);
+
1358 auto theta_bar = xt::atan2(-zeta_bar, -xi_bar) + pi;
+
1359 auto positions_bar = shape * theta_bar / (2.0 * pi);
+
1360 xt::view(ret, l, xt::all()) = positions_bar;
+
1361 }
+
1362 }
+
1363
+
1364 return xt::view(ret, xt::all(), xt::keep(axes));
+
1365}
+
+
1366
+
+ +
1378public:
+
1382 Ensemble() = default;
+
1383
+
1390 Ensemble(const std::vector<size_t>& roi, bool periodic = true, bool variance = true);
+
1391
+ +
1397
+ +
1403
+ +
1409
+ +
1415
+ +
1421
+ +
1427
+
1434 array_type::array<double> distance(size_t axis) const;
+
1435
+
1442 array_type::array<double> distance(const std::vector<double>& h) const;
+
1443
+
1452 array_type::array<double> distance(const std::vector<double>& h, size_t axis) const;
+
1453
+
1458 template <class T>
+
1459 void mean(const T& f);
+
1460
+
1466 template <class T, class M>
+
1467 void mean(const T& f, const M& fmask);
+
1468
+
1474 template <class T>
+
1475 void S2(const T& f, const T& g);
+
1476
+
1484 template <class T, class M>
+
1485 void S2(const T& f, const T& g, const M& fmask, const M& gmask);
+
1486
+
1492 template <class T>
+
1493 void C2(const T& f, const T& g);
+
1494
+
1502 template <class T, class M>
+
1503 void C2(const T& f, const T& g, const M& fmask, const M& gmask);
+
1504
+
1510 template <class T>
+
1511 void W2(const T& w, const T& f);
+
1512
+
1519 template <class T, class M>
+
1520 void W2(const T& w, const T& f, const M& fmask);
+
1521
+
1529 template <class C, class T>
+
1530 void
+
1531 W2c(const C& clusters, const C& centers, const T& f, path_mode mode = path_mode::Bresenham);
+
1532
+
1541 template <class C, class T, class M>
+
1542 void
+
1543 W2c(const C& clusters,
+
1544 const C& centers,
+
1545 const T& f,
+
1546 const M& fmask,
+ +
1548
+
1556 template <class T>
+
1557 void heightheight(const T& f);
+
1558
+
1563 template <class T, class M>
+
1564 void heightheight(const T& f, const M& fmask);
+
1565
+
1571 template <class T>
+
1572 void L(const T& f, path_mode mode = path_mode::Bresenham);
+
1573
+
1574private:
+
1575 // Type: used to lock the ensemble to a certain measure.
+
1576 enum class Type { Unset, mean, S2, C2, W2, W2c, L, heightheight };
+
1577
+
1578 // Initialize class as unlocked.
+
1579 Type m_stat = Type::Unset;
+
1580
+
1581 // Maximum number of dimensions.
+
1582 static const size_t MAX_DIM = 3;
+
1583
+
1584 // Switch to assume periodicity (for the entire ensemble).
+
1585 bool m_periodic;
+
1586
+
1587 // Switch to compute the variance (for the entire ensemble).
+
1588 bool m_variance;
+
1589
+
1590 // Raw (not normalized) result, and normalization:
+
1591 // - sum of the first moment: x_1 + x_2 + ...
+ +
1593 // - sum of the second moment: x_1^2 + x_2^2 + ...
+ +
1595 // - number of measurements per pixel
+ +
1597
+
1598 // Shape of the region-of-interest, as specified.
+
1599 std::vector<size_t> m_shape_orig;
+
1600
+
1601 // 3d equivalent of "m_shape_orig".
+
1602 std::vector<size_t> m_shape;
+
1603
+
1604 // Pad size (3d).
+
1605 std::vector<std::vector<size_t>> m_pad;
+
1606};
+
+
1607
+
1608// ---------------------------------------------------------
+
1609// Wrapper functions to compute the statistics for one image
+
1610// ---------------------------------------------------------
+
1611
+
1617inline auto distance(const std::vector<size_t>& roi);
+
1618
+
1625inline auto distance(const std::vector<size_t>& roi, size_t axis);
+
1626
+
1633inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h);
+
1634
+
1642inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h, size_t axis);
+
1643
+
1651template <class T>
+
1652inline auto S2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic = true);
+
1653
+
1663template <class T, class M>
+
1664inline auto
+
1665S2(const std::vector<size_t>& roi,
+
1666 const T& f,
+
1667 const T& g,
+
1668 const M& fmask,
+
1669 const M& gmask,
+
1670 bool periodic = true);
+
1671
+
1679template <class T>
+
1680inline auto C2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic = true);
+
1681
+
1691template <class T, class M>
+
1692inline auto
+
1693C2(const std::vector<size_t>& roi,
+
1694 const T& f,
+
1695 const T& g,
+
1696 const M& fmask,
+
1697 const M& gmask,
+
1698 bool periodic = true);
+
1699
+
1707template <class T>
+
1708inline auto W2(const std::vector<size_t>& roi, const T& w, const T& f, bool periodic = true);
+
1709
+
1718template <class T, class M>
+
1719inline auto
+
1720W2(const std::vector<size_t>& roi, const T& w, const T& f, const M& fmask, bool periodic = true);
+
1721
+
1731template <class C, class T>
+
1732inline auto
+
1733W2c(const std::vector<size_t>& roi,
+
1734 const C& clusters,
+
1735 const C& centers,
+
1736 const T& f,
+ +
1738 bool periodic = true);
+
1739
+
1750template <class C, class T, class M>
+
1751inline auto
+
1752W2c(const std::vector<size_t>& roi,
+
1753 const C& clusters,
+
1754 const C& centers,
+
1755 const T& f,
+
1756 const M& fmask,
+ +
1758 bool periodic = true);
+
1759
+
1766template <class T>
+
1767inline auto heightheight(const std::vector<size_t>& roi, const T& f, bool periodic = true);
+
1768
+
1776template <class T, class M>
+
1777inline auto
+
1778heightheight(const std::vector<size_t>& roi, const T& f, const M& fmask, bool periodic = true);
+
1779
+
1787template <class T>
+
1788inline auto
+
1789L(const std::vector<size_t>& roi,
+
1790 const T& f,
+
1791 bool periodic = true,
+ +
1793
+
1794} // namespace GooseEYE
+
1795
+
1796#include "Ensemble.hpp"
+
1797#include "Ensemble_C2.hpp"
+
1798#include "Ensemble_L.hpp"
+
1799#include "Ensemble_S2.hpp"
+
1800#include "Ensemble_W2.hpp"
+
1801#include "Ensemble_W2c.hpp"
+ +
1803#include "Ensemble_mean.hpp"
+
1804#include "GooseEYE.hpp"
+
1805#include "dilate.hpp"
+
1806#include "kernel.hpp"
+
1807
+
1808#endif
+ + + + + + + + + +
(Incrementally) Label clusters (0 as background, 1..n as labels).
Definition GooseEYE.h:477
+
void prune()
Prune: renumber labels to lowest possible label, see also AvalancheSegmenter::nlabels.
Definition GooseEYE.h:593
+
void add_image(const T &img)
Add image.
Definition GooseEYE.h:814
+
auto size() const
Size of ClusterLabeller::s and ClusterLabeller::labels (== prod(shape)).
Definition GooseEYE.h:894
+
ClusterLabeller(const T &shape)
Definition GooseEYE.h:519
+
ClusterLabeller(const T &shape, const K &kernel)
Definition GooseEYE.h:543
+
std::string repr() const
Basic class info.
Definition GooseEYE.h:875
+
const auto & shape() const
Shape of ClusterLabeller::s and ClusterLabeller::labels.
Definition GooseEYE.h:885
+
static constexpr bool Periodic
Periodicity of the system.
Definition GooseEYE.h:480
+
void add_points(const T &begin, const T &end)
Add sequence of points.
Definition GooseEYE.h:836
+
const auto & labels() const
Per block, the label (0 for background).
Definition GooseEYE.h:905
+
void add_points(const T &idx)
Add sequence of points.
Definition GooseEYE.h:865
+
void reset()
Reset labels to zero.
Definition GooseEYE.h:581
+
static constexpr size_t Dim
Dimensionality of the system.
Definition GooseEYE.h:479
+
Compute clusters and obtain certain characteristic about them.
Definition GooseEYE.h:914
+
array_type::array< int > centers() const
Return label only in the center of gravity (1..n).
Definition GooseEYE.h:987
+
array_type::tensor< size_t, 1 > sizes() const
Return size per cluster.
Definition GooseEYE.h:1027
+
Clusters(const T &f, const S &kernel, bool periodic=true)
Constructor.
Definition GooseEYE.h:938
+
Clusters(const T &f, bool periodic=true)
Constructor.
Definition GooseEYE.h:925
+
array_type::array< int > labels() const
Return labels (1..n).
Definition GooseEYE.h:978
+
array_type::tensor< double, 2 > center_positions(bool as3d=false) const
Return positions of the centers of gravity (in the original rank, or as 3-d).
Definition GooseEYE.h:1004
+
Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statis...
Definition GooseEYE.h:1377
+
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
+
#define GOOSEEYE_WARNING_PYTHON(message)
Warnings specific to the Python API are implemented as:
Definition config.h:122
+ + + +
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.
+
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:325
+
array_type::tensor< double, 2 > center_of_mass(const T &labels, bool periodic=true)
Get the position of the center of each label.
Definition GooseEYE.h:1326
+
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:401
+
array_type::tensor< typename T::value_type, 2 > labels_map(const T &a, const T &b)
Get a map to relabel from a to b.
Definition GooseEYE.h:263
+
auto C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point cluster function: P(f(i) == g(i + di)).
Definition GooseEYE.hpp:75
+
array_type::array< int > clusters(const T &f, bool periodic=true)
Compute clusters.
Definition GooseEYE.h:1251
+
L labels_rename(const L &labels, const A &rename)
Rename labels.
Definition GooseEYE.h:292
+
T pos2img(const T &img, const U &positions, const V &labels)
Convert positions to an image.
Definition GooseEYE.h:1285
+
auto W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
Weighted 2-point correlation.
Definition GooseEYE.hpp:97
+
array_type::array< int > dummy_circles(const std::vector< size_t > &shape, const array_type::tensor< int, 1 > &row, const array_type::tensor< int, 1 > &col, const array_type::tensor< int, 1 > &r, bool periodic=true)
Dummy image with circles.
Definition GooseEYE.h:96
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
auto distance(const std::vector< size_t > &roi)
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition GooseEYE.hpp:28
+
array_type::tensor< size_t, 1 > relabel_map(const T &a, const S &b)
Find map to relabel from a to b.
Definition GooseEYE.h:242
+
auto S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point correlation: P(f(i) * g(i + di)).
Definition GooseEYE.hpp:53
+
auto heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)
Height-height correlation.
Definition GooseEYE.hpp:143
+
L labels_reorder(const L &labels, const A &order)
Reorder labels.
Definition GooseEYE.h:371
+ +
+
+ + + + diff --git a/GooseEYE_8hpp.html b/GooseEYE_8hpp.html new file mode 100644 index 00000000..c61f4a17 --- /dev/null +++ b/GooseEYE_8hpp.html @@ -0,0 +1,193 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

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

+Functions

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

Detailed Description

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

Definition in file GooseEYE.hpp.

+
+
+ + + + diff --git a/GooseEYE_8hpp.js b/GooseEYE_8hpp.js new file mode 100644 index 00000000..15c020be --- /dev/null +++ b/GooseEYE_8hpp.js @@ -0,0 +1,19 @@ +var GooseEYE_8hpp = +[ + [ "C2", "GooseEYE_8hpp.html#a6f8454f08a6b048290f36618cc80986b", null ], + [ "C2", "GooseEYE_8hpp.html#a867ce41fed448b5442ad8f6e6011b8b1", null ], + [ "distance", "GooseEYE_8hpp.html#adf4657193fc58978eed6ef274ebb93ed", null ], + [ "distance", "GooseEYE_8hpp.html#a3097c5d07c0fe21227df46b79c133a23", null ], + [ "distance", "GooseEYE_8hpp.html#ab97f8ace23ac36134cfaab38a19b131b", null ], + [ "distance", "GooseEYE_8hpp.html#a3d0010a207abd86a2811edfb32d22e21", null ], + [ "heightheight", "GooseEYE_8hpp.html#ae761eb00cac0021b5840df83814abf72", null ], + [ "heightheight", "GooseEYE_8hpp.html#a5f658c332d5fc69e86bb44cb14930ce5", null ], + [ "L", "GooseEYE_8hpp.html#a43454c98d88250a5693a3696ca978cb4", null ], + [ "path", "GooseEYE_8hpp.html#ac27cb5922686e23dbd84d313579b2add", null ], + [ "S2", "GooseEYE_8hpp.html#ae27103f5b7d6acda6fc2e14c8dfd11b3", null ], + [ "S2", "GooseEYE_8hpp.html#ac01c192a6d398e2befc3aca36e953f0e", null ], + [ "W2", "GooseEYE_8hpp.html#aaa2055a53f179e2ddd810ebaf9eaf837", null ], + [ "W2", "GooseEYE_8hpp.html#ab349faaa82c253cea9d67996cb9749c7", null ], + [ "W2c", "GooseEYE_8hpp.html#a989df0528b84e5e0f4da84062785ee8b", null ], + [ "W2c", "GooseEYE_8hpp.html#a55b550567256dee0da56ac22fd2be72a", null ] +]; \ No newline at end of file diff --git a/GooseEYE_8hpp_source.html b/GooseEYE_8hpp_source.html new file mode 100644 index 00000000..69991901 --- /dev/null +++ b/GooseEYE_8hpp_source.html @@ -0,0 +1,337 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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:1377
+
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:1251
+
auto W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
Weighted 2-point correlation.
Definition GooseEYE.hpp:97
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
auto distance(const std::vector< size_t > &roi)
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition GooseEYE.hpp:28
+
auto S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point correlation: P(f(i) * g(i + di)).
Definition GooseEYE.hpp:53
+
auto heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)
Height-height correlation.
Definition GooseEYE.hpp:143
+
+
+ + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 00000000..3467c175 --- /dev/null +++ b/annotated.html @@ -0,0 +1,120 @@ + + + + + + + +GooseEYE: Class List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + +
 NGooseEYEToolbox to compute statistics
 CClusterLabeller(Incrementally) Label clusters (0 as background, 1..n as labels)
 CClustersCompute clusters and obtain certain characteristic about them
 CEnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
+
+
+
+ + + + diff --git a/annotated_dup.js b/annotated_dup.js new file mode 100644 index 00000000..7a8dd255 --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,8 @@ +var annotated_dup = +[ + [ "GooseEYE", "namespaceGooseEYE.html", [ + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "Clusters", "classGooseEYE_1_1Clusters.html", "classGooseEYE_1_1Clusters" ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ] + ] ] +]; \ No newline at end of file diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 00000000..224b29aa Binary files /dev/null and b/bc_s.png differ diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 00000000..31ca888d Binary files /dev/null and b/bc_sd.png differ diff --git a/classGooseEYE_1_1ClusterLabeller-members.html b/classGooseEYE_1_1ClusterLabeller-members.html new file mode 100644 index 00000000..ac113579 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller-members.html @@ -0,0 +1,128 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE::ClusterLabeller< Dimension, Periodicity > Member List
+
+
+ +

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

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

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

+ +

#include <GooseEYE/GooseEYE.h>

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

+Public Member Functions

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

+Static Public Attributes

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

Detailed Description

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

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

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

Definition at line 477 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 519 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 543 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 814 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 836 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 865 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 905 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 593 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 875 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 581 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 885 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 894 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 479 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 480 of file GooseEYE.h.

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

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

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

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

+ +

#include <GooseEYE/GooseEYE.h>

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

+Public Member Functions

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

Detailed Description

+

Compute clusters and obtain certain characteristic about them.

+ +

Definition at line 914 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ Clusters() [1/2]

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

Constructor.

+

Use default kernel::nearest().

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

Definition at line 925 of file GooseEYE.h.

+ +
+
+ +

◆ Clusters() [2/2]

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

Constructor.

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

Definition at line 938 of file GooseEYE.h.

+ +
+
+

Member Function Documentation

+ +

◆ center_positions()

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

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

+
Returns
List of positions.
+ +

Definition at line 1004 of file GooseEYE.h.

+ +
+
+ +

◆ centers()

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

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

+
Returns
'Image'.
+ +

Definition at line 987 of file GooseEYE.h.

+ +
+
+ +

◆ labels()

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

Return labels (1..n).

+
Returns
'Image'.
+ +

Definition at line 978 of file GooseEYE.h.

+ +
+
+ +

◆ sizes()

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

Return size per cluster.

+
Returns
List.
+ +

Definition at line 1027 of file GooseEYE.h.

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

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

+ + + + + + + + + + + + + + + + + + + + + + + + + +
C2(const T &f, const T &g)GooseEYE::Ensembleinline
C2(const T &f, const T &g, const M &fmask, const M &gmask)GooseEYE::Ensembleinline
data_first() constGooseEYE::Ensembleinline
data_second() constGooseEYE::Ensembleinline
distance() constGooseEYE::Ensembleinline
distance(size_t axis) constGooseEYE::Ensembleinline
distance(const std::vector< double > &h) constGooseEYE::Ensembleinline
distance(const std::vector< double > &h, size_t axis) constGooseEYE::Ensembleinline
Ensemble()=defaultGooseEYE::Ensemble
Ensemble(const std::vector< size_t > &roi, bool periodic=true, bool variance=true)GooseEYE::Ensembleinline
heightheight(const T &f)GooseEYE::Ensembleinline
heightheight(const T &f, const M &fmask)GooseEYE::Ensembleinline
L(const T &f, path_mode mode=path_mode::Bresenham)GooseEYE::Ensembleinline
mean(const T &f)GooseEYE::Ensemble
mean(const T &f, const M &fmask)GooseEYE::Ensemble
norm() constGooseEYE::Ensembleinline
result() constGooseEYE::Ensembleinline
S2(const T &f, const T &g)GooseEYE::Ensembleinline
S2(const T &f, const T &g, const M &fmask, const M &gmask)GooseEYE::Ensembleinline
variance() constGooseEYE::Ensembleinline
W2(const T &w, const T &f)GooseEYE::Ensembleinline
W2(const T &w, const T &f, const M &fmask)GooseEYE::Ensembleinline
W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)GooseEYE::Ensembleinline
W2c(const C &clusters, const C &centers, const T &f, const M &fmask, path_mode mode=path_mode::Bresenham)GooseEYE::Ensembleinline
+
+ + + + diff --git a/classGooseEYE_1_1Ensemble.html b/classGooseEYE_1_1Ensemble.html new file mode 100644 index 00000000..4f646e6d --- /dev/null +++ b/classGooseEYE_1_1Ensemble.html @@ -0,0 +1,1261 @@ + + + + + + + +GooseEYE: GooseEYE::Ensemble Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 1377 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ Ensemble()

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

Constructor.

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

Definition at line 14 of file Ensemble.hpp.

+ +
+
+

Member Function Documentation

+ +

◆ C2() [1/2]

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

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

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

Definition at line 84 of file Ensemble_C2.hpp.

+ +
+
+ +

◆ C2() [2/2]

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

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

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

Definition at line 15 of file Ensemble_C2.hpp.

+ +
+
+ +

◆ data_first()

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

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

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

Definition at line 53 of file Ensemble.hpp.

+ +
+
+ +

◆ data_second()

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

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

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

Definition at line 59 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [1/4]

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

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

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

Definition at line 103 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [2/4]

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

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

+

Convert the distance to physical dimensions.

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

Definition at line 114 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [3/4]

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

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

+

Convert the distance to physical dimensions.

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

Definition at line 127 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [4/4]

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

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

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

Definition at line 71 of file Ensemble.hpp.

+ +
+
+ +

◆ heightheight() [1/2]

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

Add realization to height-height correlation.

+

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

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

Definition at line 80 of file Ensemble_heightheight.hpp.

+ +
+
+ +

◆ heightheight() [2/2]

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

Add realization to height-height correlation.

+

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

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

Definition at line 15 of file Ensemble_heightheight.hpp.

+ +
+
+ +

◆ L()

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

Add realization to lineal-path function.

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

Definition at line 15 of file Ensemble_L.hpp.

+ +
+
+ +

◆ mean() [1/2]

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

Add realization to arithmetic mean.

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

Definition at line 15 of file Ensemble_mean.hpp.

+ +
+
+ +

◆ mean() [2/2]

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

Add realization to arithmetic mean.

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

Definition at line 28 of file Ensemble_mean.hpp.

+ +
+
+ +

◆ norm()

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

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

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

Definition at line 65 of file Ensemble.hpp.

+ +
+
+ +

◆ result()

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

Get ensemble average.

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

Definition at line 26 of file Ensemble.hpp.

+ +
+
+ +

◆ S2() [1/2]

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

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

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

Definition at line 84 of file Ensemble_S2.hpp.

+ +
+
+ +

◆ S2() [2/2]

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

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

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

Definition at line 15 of file Ensemble_S2.hpp.

+ +
+
+ +

◆ variance()

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

Get ensemble variance.

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

Definition at line 37 of file Ensemble.hpp.

+ +
+
+ +

◆ W2() [1/2]

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

Add realization to weighted 2-point correlation.

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

Definition at line 76 of file Ensemble_W2.hpp.

+ +
+
+ +

◆ W2() [2/2]

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

Add realization to weighted 2-point correlation.

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

Definition at line 15 of file Ensemble_W2.hpp.

+ +
+
+ +

◆ W2c() [1/2]

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

Add realization to collapsed weighted 2-point correlation.

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

Definition at line 16 of file Ensemble_W2c.hpp.

+ +
+
+ +

◆ W2c() [2/2]

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

Add realization to collapsed weighted 2-point correlation.

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

Definition at line 123 of file Ensemble_W2c.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classGooseEYE_1_1Ensemble.js b/classGooseEYE_1_1Ensemble.js new file mode 100644 index 00000000..496d2916 --- /dev/null +++ b/classGooseEYE_1_1Ensemble.js @@ -0,0 +1,27 @@ +var classGooseEYE_1_1Ensemble = +[ + [ "Ensemble", "classGooseEYE_1_1Ensemble.html#a62c06a26344057024d5380c7b29199c4", null ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html#ab955729bb22bd3f210c97ff024136b10", null ], + [ "C2", "classGooseEYE_1_1Ensemble.html#af52ed25e986f699a846e09498fd25928", null ], + [ "C2", "classGooseEYE_1_1Ensemble.html#aa6b103383499bbce8a6dc4caebbfe710", null ], + [ "data_first", "classGooseEYE_1_1Ensemble.html#aa0c38a6aebc69df4cddeb4eb4c75e168", null ], + [ "data_second", "classGooseEYE_1_1Ensemble.html#a4ba619521dc4bb98711f9ef5810b83db", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#abd9e39c44a7363332312a57b72ce4115", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#a9ef3f93cdd7ec475454d57e8173f328e", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#ab77c6d1691fe0aefe770255d5948a404", null ], + [ "distance", "classGooseEYE_1_1Ensemble.html#ae77e609fabe6882c93e43915d817db45", null ], + [ "heightheight", "classGooseEYE_1_1Ensemble.html#a7906697fd025f364d280c04bf2c0f0a9", null ], + [ "heightheight", "classGooseEYE_1_1Ensemble.html#a798f357b778866b8824c6e5ec1d23b90", null ], + [ "L", "classGooseEYE_1_1Ensemble.html#a202f65fb4aa0358814a9f69e0e1de270", null ], + [ "mean", "classGooseEYE_1_1Ensemble.html#a06699953adf0931ee6cf3a150cf3d306", null ], + [ "mean", "classGooseEYE_1_1Ensemble.html#ad00333335de40cb6bfb1d1c410993cc0", null ], + [ "norm", "classGooseEYE_1_1Ensemble.html#ae970b7a00ed2e1ce8a631fb54fed206a", null ], + [ "result", "classGooseEYE_1_1Ensemble.html#aca0906b15fc229f1183e6cd45c398c0d", null ], + [ "S2", "classGooseEYE_1_1Ensemble.html#a3679472fd2dbcc55323beb3f8e5fa176", null ], + [ "S2", "classGooseEYE_1_1Ensemble.html#ab26b64c4d1dc58f5c9fedcc1fadc9f60", null ], + [ "variance", "classGooseEYE_1_1Ensemble.html#a75973e36d209e8a0b2a61c22a4bb7a4e", null ], + [ "W2", "classGooseEYE_1_1Ensemble.html#aaf81f5284e4e67d0e740a8a21d6072b4", null ], + [ "W2", "classGooseEYE_1_1Ensemble.html#a129ef0a0165a13f8c9d016e8bb02c7e3", null ], + [ "W2c", "classGooseEYE_1_1Ensemble.html#a99457cc94be42c86d6de699aa779ebea", null ], + [ "W2c", "classGooseEYE_1_1Ensemble.html#a95a025460b591dc74caeab3386e9cd7d", null ] +]; \ No newline at end of file diff --git a/classes.html b/classes.html new file mode 100644 index 00000000..234b1dd7 --- /dev/null +++ b/classes.html @@ -0,0 +1,121 @@ + + + + + + + +GooseEYE: Class Index + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
C | E
+ +
+
+ + + + diff --git a/closed.png b/closed.png new file mode 100644 index 00000000..98cc2c90 Binary files /dev/null and b/closed.png differ diff --git a/config_8h.html b/config_8h.html new file mode 100644 index 00000000..9b88010e --- /dev/null +++ b/config_8h.html @@ -0,0 +1,308 @@ + + + + + + + +GooseEYE: GooseEYE/config.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..b27a5c16 --- /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 00000000..0aaaa3cc --- /dev/null +++ b/config_8h_source.html @@ -0,0 +1,221 @@ + + + + + + + +GooseEYE: GooseEYE/config.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..0b27d4f6 --- /dev/null +++ b/darkmode_toggle.js @@ -0,0 +1,281 @@ +/** + +The code below is based on the Doxygen Awesome project with some minor modifications +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DarkModeToggle extends HTMLElement { + static icon = ''; + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DarkModeToggle.enableDarkMode(DarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('dark-mode-toggle') + toggleButton.title = DarkModeToggle.title + toggleButton.innerHTML = DarkModeToggle.icon + toggleButton.tabIndex = 0; + + function addButton() { + var titleArea = document.getElementById("titlearea"); + var searchBox = document.getElementById("MSearchBox"); + var mainMenu = document.getElementById("main-menu"); + var navRow1 = document.getElementById("navrow1"); + var mainMenuVisible = false; + if (mainMenu) { + var menuStyle = window.getComputedStyle(mainMenu); + mainMenuVisible = menuStyle.display!=='none' + } + var searchBoxPos1 = document.getElementById("searchBoxPos1"); + if (searchBox) { // (1) search box visible + searchBox.parentNode.appendChild(toggleButton) + } else if (navRow1) { // (2) no search box, static menu bar + var li = document.createElement('li'); + li.style = 'float: right;' + li.appendChild(toggleButton); + toggleButton.style = 'width: 24px; height: 25px; padding-top: 11px; float: right;'; + var row = document.querySelector('#navrow1 > ul:first-of-type'); + row.appendChild(li) + } else if (mainMenu && mainMenuVisible) { // (3) no search box + dynamic menu bar expanded + var li = document.createElement('li'); + li.style = 'float: right;' + li.appendChild(toggleButton); + toggleButton.style = 'width: 14px; height: 36px; padding-top: 10px; float: right;'; + mainMenu.appendChild(li) + } else if (searchBoxPos1) { // (4) no search box + dynamic menu bar collapsed + toggleButton.style = 'width: 24px; height: 36px; padding-top: 10px; float: right;'; + searchBoxPos1.style = 'top: 0px;' + searchBoxPos1.appendChild(toggleButton); + } else if (titleArea) { // (5) no search box and no navigation tabs + toggleButton.style = 'width: 24px; height: 24px; position: absolute; right: 0px; top: 34px;'; + titleArea.append(toggleButton); + } + } + + $(document).ready(function(){ + addButton(); + }) + $(window).resize(function(){ + addButton(); + }) + var inFocus = false; + $(document).focusin(function(e) { + inFocus = true; + }) + $(document).focusout(function(e) { + inFocus = false; + }) + $(document).keyup(function(e) { + if (e.keyCode==27 && !inFocus) { // escape key maps to keycode `27` + e.stopPropagation(); + DarkModeToggle.userPreference = !DarkModeToggle.userPreference + } + }) + DarkModeToggle.setDarkModeVisibility(DarkModeToggle.darkModeEnabled) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + this.onkeypress=function(e){if (e.keyCode==13) { this.toggleDarkMode(); }}; + } + + static createCookie(name, value, days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + var expires = "; expires=" + date.toGMTString(); + } + else var expires = ""; + + document.cookie = name + "=" + value + expires + "; path=/"; + } + + static readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); + } + return null; + } + + static eraseCookie(name) { + DarkModeToggle.createCookie(name, "", -1); + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + static get prefersDarkModeInLightMode() { + if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies + return localStorage.getItem(DarkModeToggle.prefersDarkModeInLightModeKey) + } else { // Other browsers support cookies in combination with file:// but not localStorage + return DarkModeToggle.readCookie('doxygen_prefers_dark')=='1' + } + } + + static set prefersDarkModeInLightMode(preference) { + if (window.chrome) { + if (preference) { + localStorage.setItem(DarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if (preference) { + DarkModeToggle.createCookie('doxygen_prefers_dark','1',365) + } else { + DarkModeToggle.eraseCookie('doxygen_prefers_dark') + } + } + } + + static get prefersLightModeInDarkMode() { + if (window.chrome) { // Chrome supports localStorage in combination with file:// but not cookies + return localStorage.getItem(DarkModeToggle.prefersLightModeInDarkModeKey) + } else { // Other browsers support cookies in combination with file:// but not localStorage + return DarkModeToggle.readCookie('doxygen_prefers_light')=='1' + } + } + + static set prefersLightModeInDarkMode(preference) { + if (window.chrome) { + if (preference) { + localStorage.setItem(DarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DarkModeToggle.prefersLightModeInDarkModeKey) + } + } else { + if (preference) { + DarkModeToggle.createCookie('doxygen_prefers_light','1',365) + } else { + DarkModeToggle.eraseCookie('doxygen_prefers_light') + } + } + } + + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DarkModeToggle.systemPreference && DarkModeToggle.prefersDarkModeInLightMode) || + (DarkModeToggle.systemPreference && !DarkModeToggle.prefersLightModeInDarkMode) + } + + static set userPreference(userPreference) { + DarkModeToggle.darkModeEnabled = userPreference + if (!userPreference) { + if (DarkModeToggle.systemPreference) { + DarkModeToggle.prefersLightModeInDarkMode = true + } else { + DarkModeToggle.prefersDarkModeInLightMode = false + } + } else { + if (!DarkModeToggle.systemPreference) { + DarkModeToggle.prefersDarkModeInLightMode = true + } else { + DarkModeToggle.prefersLightModeInDarkMode = false + } + } + DarkModeToggle.onUserPreferenceChanged() + } + + static setDarkModeVisibility(enable) { + var darkModeStyle, lightModeStyle; + if(enable) { + darkModeStyle = 'inline-block'; + lightModeStyle = 'none' + } else { + darkModeStyle = 'none'; + lightModeStyle = 'inline-block' + } + document.querySelectorAll('.dark-mode-visible').forEach(function(el) { + el.style.display = darkModeStyle; + }); + document.querySelectorAll('.light-mode-visible').forEach(function(el) { + el.style.display = lightModeStyle; + }); + } + static enableDarkMode(enable) { + if(enable) { + DarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + DarkModeToggle.setDarkModeVisibility(enable) + } + + static onSystemPreferenceChanged() { + DarkModeToggle.darkModeEnabled = DarkModeToggle.userPreference + DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DarkModeToggle.enableDarkMode(DarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DarkModeToggle.userPreference = !DarkModeToggle.userPreference + } +} + +customElements.define("dark-mode-toggle", DarkModeToggle); + +DarkModeToggle.init(); diff --git a/detail_8hpp.html b/detail_8hpp.html new file mode 100644 index 00000000..dd84c291 --- /dev/null +++ b/detail_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
detail.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file detail.hpp.

+
+
+ + + + diff --git a/detail_8hpp_source.html b/detail_8hpp_source.html new file mode 100644 index 00000000..16b049ec --- /dev/null +++ b/detail_8hpp_source.html @@ -0,0 +1,532 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..6c916a41 --- /dev/null +++ b/dilate_8hpp.html @@ -0,0 +1,151 @@ + + + + + + + +GooseEYE: GooseEYE/dilate.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
dilate.hpp File Reference
+
+
+
#include "GooseEYE.h"
+#include <xtensor/xstrided_view.hpp>
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

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

+Functions

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

Detailed Description

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

Definition in file dilate.hpp.

+
+
+ + + + diff --git a/dilate_8hpp.js b/dilate_8hpp.js new file mode 100644 index 00000000..15c524e8 --- /dev/null +++ b/dilate_8hpp.js @@ -0,0 +1,7 @@ +var dilate_8hpp = +[ + [ "dilate", "dilate_8hpp.html#ae859f712898ed7d6e76a5ecaa114614a", null ], + [ "dilate", "dilate_8hpp.html#a43f961d31fad8b606eedee2fcd4969b5", null ], + [ "dilate", "dilate_8hpp.html#a4976e5bbf41b58472e028babb092bd85", null ], + [ "dilate", "dilate_8hpp.html#a6bb0149c151f7255f796ac80bc57a031", null ] +]; \ No newline at end of file diff --git a/dilate_8hpp_source.html b/dilate_8hpp_source.html new file mode 100644 index 00000000..5846aed2 --- /dev/null +++ b/dilate_8hpp_source.html @@ -0,0 +1,331 @@ + + + + + + + +GooseEYE: GooseEYE/dilate.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..75794217 --- /dev/null +++ b/dir_1e7fc41d3d108c67da428f08b8cf70c8.html @@ -0,0 +1,149 @@ + + + + + + + +GooseEYE: GooseEYE Directory Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

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

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+ + +

- w -

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

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+ + +

- w -

+
+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 00000000..09faab08 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Class Members - Variables + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+
+ + + + diff --git a/globals.html b/globals.html new file mode 100644 index 00000000..18b936d9 --- /dev/null +++ b/globals.html @@ -0,0 +1,116 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented file members with links to the documentation:
+
+
+ + + + diff --git a/globals_defs.html b/globals_defs.html new file mode 100644 index 00000000..3df9cab1 --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,116 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+
+
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..d70c0ac5 --- /dev/null +++ b/index.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: GooseEYE + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+

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

+

+GooseEYE

+

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

+

https://gooseeye.readthedocs.io

+

+Credit / copyright

+

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

+

Contributors:

+ +

Tom de Geus was financially supported by:

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

Go to the source code of this file.

+ + + + + + + + +

+Namespaces

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

+Functions

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

Detailed Description

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

Definition in file kernel.hpp.

+
+
+ + + + diff --git a/kernel_8hpp.js b/kernel_8hpp.js new file mode 100644 index 00000000..2b961908 --- /dev/null +++ b/kernel_8hpp.js @@ -0,0 +1,4 @@ +var kernel_8hpp = +[ + [ "nearest", "kernel_8hpp.html#a306dfde37d04075f3a635200b2f528ed", null ] +]; \ No newline at end of file diff --git a/kernel_8hpp_source.html b/kernel_8hpp_source.html new file mode 100644 index 00000000..aed785c0 --- /dev/null +++ b/kernel_8hpp_source.html @@ -0,0 +1,163 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.8.2.dev4+g7a7beae +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
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 00000000..b0b26936 --- /dev/null +++ b/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 00000000..e96d651c --- /dev/null +++ b/menudata.js @@ -0,0 +1,93 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"n",url:"namespacemembers.html#index_n"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}, +{text:"v",url:"namespacemembers.html#index_v"}, +{text:"w",url:"namespacemembers.html#index_w"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"d",url:"namespacemembers_func.html#index_d"}, +{text:"h",url:"namespacemembers_func.html#index_h"}, +{text:"l",url:"namespacemembers_func.html#index_l"}, +{text:"n",url:"namespacemembers_func.html#index_n"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"v",url:"namespacemembers_func.html#index_v"}, +{text:"w",url:"namespacemembers_func.html#index_w"}]}, +{text:"Typedefs",url:"namespacemembers_type.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"h",url:"functions.html#index_h"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/minus.svg b/minus.svg new file mode 100644 index 00000000..f70d0c1a --- /dev/null +++ b/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/minusd.svg b/minusd.svg new file mode 100644 index 00000000..5f8e8796 --- /dev/null +++ b/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/namespaceGooseEYE.html b/namespaceGooseEYE.html new file mode 100644 index 00000000..5cac0382 --- /dev/null +++ b/namespaceGooseEYE.html @@ -0,0 +1,2088 @@ + + + + + + + +GooseEYE: GooseEYE Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.8.2.dev4+g7a7beae +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE Namespace Reference
    +
    +
    + +

    Toolbox to compute statistics. +More...

    + + + + + + + + +

    +Namespaces

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

    +Classes

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

    +Enumerations

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

    +Functions

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

    Detailed Description

    +

    Toolbox to compute statistics.

    +

    Enumeration Type Documentation

    + +

    ◆ path_mode

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

    Different methods to compute a pixel-path.

    + + + + +
    Enumerator
    Bresenham 

    Bresenham algorithm.

    +
    actual 

    The actual path.

    +
    full 

    Similar to actual selecting every voxel that is crossed.

    +
    + +

    Definition at line 69 of file GooseEYE.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ C2() [1/2]

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

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

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

    Definition at line 75 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ C2() [2/2]

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

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

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

    Definition at line 84 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ center_of_mass()

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

    Get the position of the center of each label.

    +

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

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

    Definition at line 1326 of file GooseEYE.h.

    + +
    +
    + +

    ◆ clusters()

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

    Compute clusters.

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

    Definition at line 1251 of file GooseEYE.h.

    + +
    +
    + +

    ◆ dilate() [1/4]

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

    Dilate image.

    +

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

    + +

    Definition at line 177 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [2/4]

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

    Dilate image.

    +

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

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

    Definition at line 96 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [3/4]

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

    Dilate image.

    +

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

    + +

    Definition at line 196 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [4/4]

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

    Dilate image.

    +

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

    + +

    Definition at line 183 of file dilate.hpp.

    + +
    +
    + +

    ◆ distance() [1/4]

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

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

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

    Definition at line 28 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [2/4]

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

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

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

    Definition at line 40 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [3/4]

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

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

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

    Definition at line 46 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [4/4]

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

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

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

    Definition at line 34 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ dummy_circles() [1/2]

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

    Dummy image with circles.

    +

    The positions and radii of the circles are randomly generated.

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

    Definition at line 148 of file GooseEYE.h.

    + +
    +
    + +

    ◆ dummy_circles() [2/2]

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

    Dummy image with circles.

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

    Definition at line 96 of file GooseEYE.h.

    + +
    +
    + +

    ◆ heightheight() [1/2]

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

    Height-height correlation.

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

    Definition at line 143 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ heightheight() [2/2]

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

    Height-height correlation.

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

    Definition at line 151 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ L()

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

    Lineal-path function.

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

    Definition at line 159 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ labels_map()

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

    Get a map to relabel from a to b.

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

    Definition at line 263 of file GooseEYE.h.

    + +
    +
    + +

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

    + +
    +
    + +

    ◆ labels_rename()

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

    Rename labels.

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

    Definition at line 292 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_reorder()

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

    Reorder labels.

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

    Definition at line 371 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_sizes()

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

    Size per label.

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

    Definition at line 401 of file GooseEYE.h.

    + +
    +
    + +

    ◆ path()

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

    Compute a path between two pixels.

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

    Definition at line 15 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ pos2img()

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

    Convert positions to an image.

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

    Definition at line 1285 of file GooseEYE.h.

    + +
    +
    + +

    ◆ relabel_map()

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

    Find map to relabel from a to b.

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

    Definition at line 242 of file GooseEYE.h.

    + +
    +
    + +

    ◆ S2() [1/2]

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

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

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

    Definition at line 53 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ S2() [2/2]

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

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

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

    Definition at line 62 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ version()

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

    Return version string, e.g.

    +

    "0.8.0"

    Returns
    String.
    + +

    Definition at line 25 of file version.hpp.

    + +
    +
    + +

    ◆ W2() [1/2]

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

    Weighted 2-point correlation.

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

    Definition at line 97 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2() [2/2]

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

    Weighted 2-point correlation.

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

    Definition at line 106 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2c() [1/2]

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

    Collapsed weighted 2-point correlation.

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

    Definition at line 129 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2c() [2/2]

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

    Collapsed weighted 2-point correlation.

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

    Definition at line 115 of file GooseEYE.hpp.

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

    Collect kernels. +More...

    + + + + + +

    +Functions

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

    Detailed Description

    +

    Collect kernels.

    +

    Function Documentation

    + +

    ◆ nearest()

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

    Return kernel with nearest neighbours.

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

    Definition at line 15 of file kernel.hpp.

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

    - a -

    + + +

    - c -

    + + +

    - d -

    + + +

    - h -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_enum.html b/namespacemembers_enum.html new file mode 100644 index 00000000..94e9e73b --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,112 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.8.2.dev4+g7a7beae +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace enums with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/namespacemembers_func.html b/namespacemembers_func.html new file mode 100644 index 00000000..0d4e0ae2 --- /dev/null +++ b/namespacemembers_func.html @@ -0,0 +1,170 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.8.2.dev4+g7a7beae +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    + +

    - c -

    + + +

    - d -

    + + +

    - h -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - v -

    + + +

    - w -

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

    Go to the source code of this file.

    + + + + + +

    +Namespaces

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

    +Macros

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

    +Functions

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

    Detailed Description

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

    Definition in file version.h.

    +

    Macro Definition Documentation

    + +

    ◆ GOOSEEYE_VERSION

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

    Current version.

    +

    Either:

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

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

    + +

    Definition at line 33 of file version.h.

    + +
    +
    +
    +
    + + + + diff --git a/version_8h.js b/version_8h.js new file mode 100644 index 00000000..0f077466 --- /dev/null +++ b/version_8h.js @@ -0,0 +1,5 @@ +var version_8h = +[ + [ "GOOSEEYE_VERSION", "version_8h.html#a741c94f281334d63b9f28dce5b22a515", null ], + [ "version", "version_8h.html#abc99a3a1ab42cd9514f08b7530d300f3", null ] +]; \ No newline at end of file diff --git a/version_8h_source.html b/version_8h_source.html new file mode 100644 index 00000000..27b1bfc5 --- /dev/null +++ b/version_8h_source.html @@ -0,0 +1,141 @@ + + + + + + + +GooseEYE: GooseEYE/version.h Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.8.2.dev4+g7a7beae +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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 00000000..e348426a --- /dev/null +++ b/version_8hpp.html @@ -0,0 +1,137 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.8.2.dev4+g7a7beae +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    version.hpp File Reference
    +
    +
    +
    #include "version.h"
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

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

    +Functions

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

    Detailed Description

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

    Definition in file version.hpp.

    +
    +
    + + + + diff --git a/version_8hpp.js b/version_8hpp.js new file mode 100644 index 00000000..94734383 --- /dev/null +++ b/version_8hpp.js @@ -0,0 +1,4 @@ +var version_8hpp = +[ + [ "version", "version_8hpp.html#abc99a3a1ab42cd9514f08b7530d300f3", null ] +]; \ No newline at end of file diff --git a/version_8hpp_source.html b/version_8hpp_source.html new file mode 100644 index 00000000..13742dea --- /dev/null +++ b/version_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.8.2.dev4+g7a7beae +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    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
    +
    +
    + + + +