From 4147292b1ca7afc3a13e3ad1ac36b0dc268350e0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 14:49:51 +0000 Subject: [PATCH] Deploy to GitHub pages --- .nojekyll | 0 Ensemble_8hpp.html | 130 + Ensemble_8hpp_source.html | 279 ++ Ensemble__C2_8hpp.html | 130 + Ensemble__C2_8hpp_source.html | 214 ++ Ensemble__L_8hpp.html | 130 + Ensemble__L_8hpp_source.html | 216 ++ Ensemble__S2_8hpp.html | 130 + Ensemble__S2_8hpp_source.html | 214 ++ Ensemble__W2_8hpp.html | 130 + Ensemble__W2_8hpp_source.html | 206 ++ Ensemble__W2c_8hpp.html | 130 + Ensemble__W2c_8hpp_source.html | 256 ++ Ensemble__heightheight_8hpp.html | 130 + Ensemble__heightheight_8hpp_source.html | 210 ++ Ensemble__mean_8hpp.html | 130 + Ensemble__mean_8hpp_source.html | 169 ++ GooseEYE_8h.html | 297 +++ GooseEYE_8h.js | 44 + GooseEYE_8h_source.html | 1377 ++++++++++ GooseEYE_8hpp.html | 193 ++ GooseEYE_8hpp.js | 19 + GooseEYE_8hpp_source.html | 337 +++ annotated.html | 119 + annotated_dup.js | 7 + bc_s.png | Bin 0 -> 676 bytes bc_sd.png | Bin 0 -> 635 bytes classGooseEYE_1_1ClusterLabeller-members.html | 129 + classGooseEYE_1_1ClusterLabeller.html | 700 +++++ classGooseEYE_1_1ClusterLabeller.js | 15 + classGooseEYE_1_1Ensemble-members.html | 139 + classGooseEYE_1_1Ensemble.html | 1261 +++++++++ classGooseEYE_1_1Ensemble.js | 27 + classes.html | 121 + closed.png | Bin 0 -> 132 bytes config_8h.html | 308 +++ config_8h.js | 9 + config_8h_source.html | 221 ++ darkmode_toggle.js | 281 ++ detail_8hpp.html | 130 + detail_8hpp_source.html | 532 ++++ dilate_8hpp.html | 151 ++ dilate_8hpp.js | 7 + dilate_8hpp_source.html | 331 +++ dir_1e7fc41d3d108c67da428f08b8cf70c8.html | 149 ++ dir_1e7fc41d3d108c67da428f08b8cf70c8.js | 19 + doc.svg | 12 + docd.svg | 12 + doxygen.css | 2043 +++++++++++++++ doxygen.svg | 28 + dynsections.js | 199 ++ files.html | 133 + files_dup.js | 4 + folderclosed.svg | 11 + folderclosedd.svg | 11 + folderopen.svg | 17 + folderopend.svg | 12 + functions.html | 187 ++ functions_func.html | 185 ++ functions_vars.html | 113 + globals.html | 116 + globals_defs.html | 116 + hierarchy.html | 119 + hierarchy.js | 6 + index.html | 133 + jquery.js | 34 + kernel_8hpp.html | 140 + kernel_8hpp.js | 4 + kernel_8hpp_source.html | 163 ++ menu.js | 136 + menudata.js | 92 + minus.svg | 8 + minusd.svg | 8 + namespaceGooseEYE.html | 2273 +++++++++++++++++ namespaceGooseEYE.js | 51 + namespaceGooseEYE_1_1array__type.html | 173 ++ namespaceGooseEYE_1_1kernel.html | 165 ++ namespacemembers.html | 178 ++ namespacemembers_enum.html | 112 + namespacemembers_func.html | 167 ++ namespacemembers_type.html | 113 + namespaces.html | 121 + namespaces_dup.js | 4 + nav_f.png | Bin 0 -> 153 bytes nav_fd.png | Bin 0 -> 169 bytes nav_g.png | Bin 0 -> 95 bytes nav_h.png | Bin 0 -> 98 bytes nav_hd.png | Bin 0 -> 114 bytes navtree.css | 149 ++ navtree.js | 559 ++++ navtreedata.js | 65 + navtreeindex0.js | 242 ++ open.png | Bin 0 -> 123 bytes plus.svg | 9 + plusd.svg | 9 + resize.js | 155 ++ search/all_0.js | 8 + search/all_1.js | 4 + search/all_10.js | 7 + search/all_11.js | 5 + search/all_2.js | 12 + search/all_3.js | 11 + search/all_4.js | 12 + search/all_5.js | 4 + search/all_6.js | 13 + search/all_7.js | 4 + search/all_8.js | 4 + search/all_9.js | 12 + search/all_a.js | 4 + search/all_b.js | 5 + search/all_c.js | 7 + search/all_d.js | 6 + search/all_e.js | 6 + search/all_f.js | 4 + search/classes_0.js | 5 + search/classes_1.js | 4 + search/close.svg | 18 + search/defines_0.js | 8 + search/enums_0.js | 4 + search/enumvalues_0.js | 4 + search/enumvalues_1.js | 4 + search/enumvalues_2.js | 4 + search/files_0.js | 4 + search/files_1.js | 5 + search/files_2.js | 11 + search/files_3.js | 5 + search/files_4.js | 4 + search/files_5.js | 5 + search/functions_0.js | 6 + search/functions_1.js | 8 + search/functions_2.js | 8 + search/functions_3.js | 4 + search/functions_4.js | 4 + search/functions_5.js | 12 + search/functions_6.js | 4 + search/functions_7.js | 5 + search/functions_8.js | 5 + search/functions_9.js | 6 + search/functions_a.js | 6 + search/functions_b.js | 5 + search/functions_c.js | 5 + search/mag.svg | 24 + search/mag_d.svg | 24 + search/mag_sel.svg | 31 + search/mag_seld.svg | 31 + search/namespaces_0.js | 6 + search/pages_0.js | 4 + search/search.css | 291 +++ search/search.js | 840 ++++++ search/searchdata.js | 45 + search/typedefs_0.js | 4 + search/typedefs_1.js | 4 + search/variables_0.js | 4 + search/variables_1.js | 4 + splitbar.png | Bin 0 -> 314 bytes splitbard.png | Bin 0 -> 282 bytes sync_off.png | Bin 0 -> 853 bytes sync_on.png | Bin 0 -> 845 bytes tab_a.png | Bin 0 -> 142 bytes tab_ad.png | Bin 0 -> 135 bytes tab_b.png | Bin 0 -> 169 bytes tab_bd.png | Bin 0 -> 173 bytes tab_h.png | Bin 0 -> 177 bytes tab_hd.png | Bin 0 -> 180 bytes tab_s.png | Bin 0 -> 184 bytes tab_sd.png | Bin 0 -> 188 bytes tabs.css | 1 + version_8h.html | 173 ++ version_8h.js | 5 + version_8h_source.html | 141 + version_8hpp.html | 137 + version_8hpp.js | 4 + version_8hpp_source.html | 151 ++ 173 files changed, 20529 insertions(+) create mode 100644 .nojekyll create mode 100644 Ensemble_8hpp.html create mode 100644 Ensemble_8hpp_source.html create mode 100644 Ensemble__C2_8hpp.html create mode 100644 Ensemble__C2_8hpp_source.html create mode 100644 Ensemble__L_8hpp.html create mode 100644 Ensemble__L_8hpp_source.html create mode 100644 Ensemble__S2_8hpp.html create mode 100644 Ensemble__S2_8hpp_source.html create mode 100644 Ensemble__W2_8hpp.html create mode 100644 Ensemble__W2_8hpp_source.html create mode 100644 Ensemble__W2c_8hpp.html create mode 100644 Ensemble__W2c_8hpp_source.html create mode 100644 Ensemble__heightheight_8hpp.html create mode 100644 Ensemble__heightheight_8hpp_source.html create mode 100644 Ensemble__mean_8hpp.html create mode 100644 Ensemble__mean_8hpp_source.html create mode 100644 GooseEYE_8h.html create mode 100644 GooseEYE_8h.js create mode 100644 GooseEYE_8h_source.html create mode 100644 GooseEYE_8hpp.html create mode 100644 GooseEYE_8hpp.js create mode 100644 GooseEYE_8hpp_source.html create mode 100644 annotated.html create mode 100644 annotated_dup.js create mode 100644 bc_s.png create mode 100644 bc_sd.png create mode 100644 classGooseEYE_1_1ClusterLabeller-members.html create mode 100644 classGooseEYE_1_1ClusterLabeller.html create mode 100644 classGooseEYE_1_1ClusterLabeller.js create mode 100644 classGooseEYE_1_1Ensemble-members.html create mode 100644 classGooseEYE_1_1Ensemble.html create mode 100644 classGooseEYE_1_1Ensemble.js create mode 100644 classes.html create mode 100644 closed.png create mode 100644 config_8h.html create mode 100644 config_8h.js create mode 100644 config_8h_source.html create mode 100644 darkmode_toggle.js create mode 100644 detail_8hpp.html create mode 100644 detail_8hpp_source.html create mode 100644 dilate_8hpp.html create mode 100644 dilate_8hpp.js create mode 100644 dilate_8hpp_source.html create mode 100644 dir_1e7fc41d3d108c67da428f08b8cf70c8.html create mode 100644 dir_1e7fc41d3d108c67da428f08b8cf70c8.js create mode 100644 doc.svg create mode 100644 docd.svg create mode 100644 doxygen.css create mode 100644 doxygen.svg create mode 100644 dynsections.js create mode 100644 files.html create mode 100644 files_dup.js create mode 100644 folderclosed.svg create mode 100644 folderclosedd.svg create mode 100644 folderopen.svg create mode 100644 folderopend.svg create mode 100644 functions.html create mode 100644 functions_func.html create mode 100644 functions_vars.html create mode 100644 globals.html create mode 100644 globals_defs.html create mode 100644 hierarchy.html create mode 100644 hierarchy.js create mode 100644 index.html create mode 100644 jquery.js create mode 100644 kernel_8hpp.html create mode 100644 kernel_8hpp.js create mode 100644 kernel_8hpp_source.html create mode 100644 menu.js create mode 100644 menudata.js create mode 100644 minus.svg create mode 100644 minusd.svg create mode 100644 namespaceGooseEYE.html create mode 100644 namespaceGooseEYE.js create mode 100644 namespaceGooseEYE_1_1array__type.html create mode 100644 namespaceGooseEYE_1_1kernel.html create mode 100644 namespacemembers.html create mode 100644 namespacemembers_enum.html create mode 100644 namespacemembers_func.html create mode 100644 namespacemembers_type.html create mode 100644 namespaces.html create mode 100644 namespaces_dup.js create mode 100644 nav_f.png create mode 100644 nav_fd.png create mode 100644 nav_g.png create mode 100644 nav_h.png create mode 100644 nav_hd.png create mode 100644 navtree.css create mode 100644 navtree.js create mode 100644 navtreedata.js create mode 100644 navtreeindex0.js create mode 100644 open.png create mode 100644 plus.svg create mode 100644 plusd.svg create mode 100644 resize.js create mode 100644 search/all_0.js create mode 100644 search/all_1.js create mode 100644 search/all_10.js create mode 100644 search/all_11.js create mode 100644 search/all_2.js create mode 100644 search/all_3.js create mode 100644 search/all_4.js create mode 100644 search/all_5.js create mode 100644 search/all_6.js create mode 100644 search/all_7.js create mode 100644 search/all_8.js create mode 100644 search/all_9.js create mode 100644 search/all_a.js create mode 100644 search/all_b.js create mode 100644 search/all_c.js create mode 100644 search/all_d.js create mode 100644 search/all_e.js create mode 100644 search/all_f.js create mode 100644 search/classes_0.js create mode 100644 search/classes_1.js create mode 100644 search/close.svg create mode 100644 search/defines_0.js create mode 100644 search/enums_0.js create mode 100644 search/enumvalues_0.js create mode 100644 search/enumvalues_1.js create mode 100644 search/enumvalues_2.js create mode 100644 search/files_0.js create mode 100644 search/files_1.js create mode 100644 search/files_2.js create mode 100644 search/files_3.js create mode 100644 search/files_4.js create mode 100644 search/files_5.js create mode 100644 search/functions_0.js create mode 100644 search/functions_1.js create mode 100644 search/functions_2.js create mode 100644 search/functions_3.js create mode 100644 search/functions_4.js create mode 100644 search/functions_5.js create mode 100644 search/functions_6.js create mode 100644 search/functions_7.js create mode 100644 search/functions_8.js create mode 100644 search/functions_9.js create mode 100644 search/functions_a.js create mode 100644 search/functions_b.js create mode 100644 search/functions_c.js create mode 100644 search/mag.svg create mode 100644 search/mag_d.svg create mode 100644 search/mag_sel.svg create mode 100644 search/mag_seld.svg create mode 100644 search/namespaces_0.js create mode 100644 search/pages_0.js create mode 100644 search/search.css create mode 100644 search/search.js create mode 100644 search/searchdata.js create mode 100644 search/typedefs_0.js create mode 100644 search/typedefs_1.js create mode 100644 search/variables_0.js create mode 100644 search/variables_1.js create mode 100644 splitbar.png create mode 100644 splitbard.png create mode 100644 sync_off.png create mode 100644 sync_on.png create mode 100644 tab_a.png create mode 100644 tab_ad.png create mode 100644 tab_b.png create mode 100644 tab_bd.png create mode 100644 tab_h.png create mode 100644 tab_hd.png create mode 100644 tab_s.png create mode 100644 tab_sd.png create mode 100644 tabs.css create mode 100644 version_8h.html create mode 100644 version_8h.js create mode 100644 version_8h_source.html create mode 100644 version_8hpp.html create mode 100644 version_8hpp.js create mode 100644 version_8hpp_source.html 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..6b67b9ae --- /dev/null +++ b/Ensemble_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/Ensemble.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Ensemble.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_C2.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_L.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_S2.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_W2.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_W2c.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_heightheight.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file Ensemble_mean.hpp.

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

Go to the source code of this file.

+ + + + + + + + +

+Classes

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

+Namespaces

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

+Enumerations

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

+Functions

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

Detailed Description

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

Definition in file GooseEYE.h.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

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

+Functions

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

Detailed Description

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

Definition in file GooseEYE.hpp.

+
+
+ + + + diff --git a/GooseEYE_8hpp.js b/GooseEYE_8hpp.js new file mode 100644 index 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..cc2666b7 --- /dev/null +++ b/GooseEYE_8hpp_source.html @@ -0,0 +1,337 @@ + + + + + + + +GooseEYE: GooseEYE/GooseEYE.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_HPP
+
8#define GOOSEEYE_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13
+ +
+ +
16{
+
17 if (mode == path_mode::Bresenham) {
+
18 return detail::path::bresenham(x0, x1);
+
19 }
+
20 else if (mode == path_mode::actual) {
+
21 return detail::path::actual(x0, x1);
+
22 }
+
23 else {
+
24 return detail::path::full(x0, x1);
+
25 }
+
26}
+
+
27
+
+
28inline auto distance(const std::vector<size_t>& roi)
+
29{
+
30 Ensemble ensemble(roi);
+
31 return ensemble.distance();
+
32}
+
+
33
+
+
34inline auto distance(const std::vector<size_t>& roi, size_t dim)
+
35{
+
36 Ensemble ensemble(roi);
+
37 return ensemble.distance(dim);
+
38}
+
+
39
+
+
40inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h)
+
41{
+
42 Ensemble ensemble(roi);
+
43 return ensemble.distance(h);
+
44}
+
+
45
+
+
46inline auto distance(const std::vector<size_t>& roi, const std::vector<double>& h, size_t dim)
+
47{
+
48 Ensemble ensemble(roi);
+
49 return ensemble.distance(h, dim);
+
50}
+
+
51
+
52template <class T>
+
+
53inline auto S2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic)
+
54{
+
55 Ensemble ensemble(roi, periodic);
+
56 ensemble.S2(f, g);
+
57 return ensemble.result();
+
58}
+
+
59
+
60template <class T, class M>
+
61inline auto
+
+
62S2(const std::vector<size_t>& roi,
+
63 const T& f,
+
64 const T& g,
+
65 const M& fmask,
+
66 const M& gmask,
+
67 bool periodic)
+
68{
+
69 Ensemble ensemble(roi, periodic);
+
70 ensemble.S2(f, g, fmask, gmask);
+
71 return ensemble.result();
+
72}
+
+
73
+
74template <class T>
+
+
75inline auto C2(const std::vector<size_t>& roi, const T& f, const T& g, bool periodic)
+
76{
+
77 Ensemble ensemble(roi, periodic);
+
78 ensemble.C2(f, g);
+
79 return ensemble.result();
+
80}
+
+
81
+
82template <class T, class M>
+
83inline auto
+
+
84C2(const std::vector<size_t>& roi,
+
85 const T& f,
+
86 const T& g,
+
87 const M& fmask,
+
88 const M& gmask,
+
89 bool periodic)
+
90{
+
91 Ensemble ensemble(roi, periodic);
+
92 ensemble.C2(f, g, fmask, gmask);
+
93 return ensemble.result();
+
94}
+
+
95
+
96template <class T>
+
+
97inline auto W2(const std::vector<size_t>& roi, const T& w, const T& f, bool periodic)
+
98{
+
99 Ensemble ensemble(roi, periodic);
+
100 ensemble.W2(w, f);
+
101 return ensemble.result();
+
102}
+
+
103
+
104template <class T, class M>
+
105inline auto
+
+
106W2(const std::vector<size_t>& roi, const T& w, const T& f, const M& fmask, bool periodic)
+
107{
+
108 Ensemble ensemble(roi, periodic);
+
109 ensemble.W2(w, f, fmask);
+
110 return ensemble.result();
+
111}
+
+
112
+
113template <class C, class T>
+
114inline auto
+
+
115W2c(const std::vector<size_t>& roi,
+
116 const C& clusters,
+
117 const C& centers,
+
118 const T& f,
+
119 path_mode mode,
+
120 bool periodic)
+
121{
+
122 Ensemble ensemble(roi, periodic);
+
123 ensemble.W2c(clusters, centers, f, mode);
+
124 return ensemble.result();
+
125}
+
+
126
+
127template <class C, class T, class M>
+
128inline auto
+
+
129W2c(const std::vector<size_t>& roi,
+
130 const C& clusters,
+
131 const C& centers,
+
132 const T& f,
+
133 const M& fmask,
+
134 path_mode mode,
+
135 bool periodic)
+
136{
+
137 Ensemble ensemble(roi, periodic);
+
138 ensemble.W2c(clusters, centers, f, fmask, mode);
+
139 return ensemble.result();
+
140}
+
+
141
+
142template <class T>
+
+
143inline auto heightheight(const std::vector<size_t>& roi, const T& f, bool periodic)
+
144{
+
145 Ensemble ensemble(roi, periodic);
+
146 ensemble.heightheight(f);
+
147 return ensemble.result();
+
148}
+
+
149
+
150template <class T, class M>
+
+
151inline auto heightheight(const std::vector<size_t>& roi, const T& f, const M& fmask, bool periodic)
+
152{
+
153 Ensemble ensemble(roi, periodic);
+
154 ensemble.heightheight(f, fmask);
+
155 return ensemble.result();
+
156}
+
+
157
+
158template <class T>
+
+
159inline auto L(const std::vector<size_t>& roi, const T& f, bool periodic, path_mode mode)
+
160{
+
161 Ensemble ensemble(roi, periodic);
+
162 ensemble.L(f, mode);
+
163 return ensemble.result();
+
164}
+
+
165
+
166} // namespace GooseEYE
+
167
+
168#endif
+ +
Compute ensemble averaged statistics, by repetitively calling the member-function of a certain statis...
Definition GooseEYE.h:1216
+
void L(const T &f, path_mode mode=path_mode::Bresenham)
Add realization to lineal-path function.
+
void S2(const T &f, const T &g)
Add realization to 2-point correlation: P(f(i) * g(i + di)).
+
void heightheight(const T &f)
Add realization to height-height correlation.
+
void W2c(const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham)
Add realization to collapsed weighted 2-point correlation.
+
void W2(const T &w, const T &f)
Add realization to weighted 2-point correlation.
+
array_type::array< double > distance() const
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition Ensemble.hpp:103
+
array_type::array< double > result() const
Get ensemble average.
Definition Ensemble.hpp:26
+
void C2(const T &f, const T &g)
Add realization to 2-point cluster function: P(f(i) == g(i + di)).
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
Toolbox to compute statistics.
Definition config.h:128
+
path_mode
Different methods to compute a pixel-path.
Definition GooseEYE.h:69
+
@ Bresenham
Bresenham algorithm.
+
@ actual
The actual path.
+
auto L(const std::vector< size_t > &roi, const T &f, bool periodic=true, path_mode mode=path_mode::Bresenham)
Lineal-path function.
Definition GooseEYE.hpp:159
+
auto W2c(const std::vector< size_t > &roi, const C &clusters, const C &centers, const T &f, path_mode mode=path_mode::Bresenham, bool periodic=true)
Collapsed weighted 2-point correlation.
Definition GooseEYE.hpp:115
+
auto C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point cluster function: P(f(i) == g(i + di)).
Definition GooseEYE.hpp:75
+
array_type::array< int > clusters(const T &f, bool periodic=true)
Compute clusters.
Definition GooseEYE.h:1012
+
auto W2(const std::vector< size_t > &roi, const T &w, const T &f, bool periodic=true)
Weighted 2-point correlation.
Definition GooseEYE.hpp:97
+
array_type::tensor< int, 2 > path(const array_type::tensor< int, 1 > &x0, const array_type::tensor< int, 1 > &x1, path_mode mode=path_mode::Bresenham)
Compute a path between two pixels.
Definition GooseEYE.hpp:15
+
auto distance(const std::vector< size_t > &roi)
Get the relative distance of each pixel in the 'region-of-interest' to its center.
Definition GooseEYE.hpp:28
+
auto S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)
2-point correlation: P(f(i) * g(i + di)).
Definition GooseEYE.hpp:53
+
auto heightheight(const std::vector< size_t > &roi, const T &f, bool periodic=true)
Height-height correlation.
Definition GooseEYE.hpp:143
+
+
+ + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 00000000..7ee5d8d6 --- /dev/null +++ b/annotated.html @@ -0,0 +1,119 @@ + + + + + + + +GooseEYE: Class List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + +
 NGooseEYEToolbox to compute statistics
 CClusterLabeller(Incrementally) Label clusters (0 as background, 1..n as labels)
 CEnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
+
+
+
+ + + + diff --git a/annotated_dup.js b/annotated_dup.js new file mode 100644 index 00000000..3ce9623a --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,7 @@ +var annotated_dup = +[ + [ "GooseEYE", "namespaceGooseEYE.html", [ + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ] + ] ] +]; \ No newline at end of file diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/classGooseEYE_1_1ClusterLabeller-members.html b/classGooseEYE_1_1ClusterLabeller-members.html new file mode 100644 index 00000000..8e725e78 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller-members.html @@ -0,0 +1,129 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/classGooseEYE_1_1ClusterLabeller.html b/classGooseEYE_1_1ClusterLabeller.html new file mode 100644 index 00000000..a4530eb2 --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller.html @@ -0,0 +1,700 @@ + + + + + + + +GooseEYE: GooseEYE::ClusterLabeller< Dimension, Periodicity > Class Template Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
GooseEYE::ClusterLabeller< Dimension, Periodicity > Class Template Reference
+
+
+ +

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

+ +

#include <GooseEYE/GooseEYE.h>

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

+Public Member Functions

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

+Static Public Attributes

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

Detailed Description

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

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

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

Definition at line 486 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ ClusterLabeller() [1/2]

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

Definition at line 528 of file GooseEYE.h.

+ +
+
+ +

◆ ClusterLabeller() [2/2]

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

Definition at line 552 of file GooseEYE.h.

+ +
+
+

Member Function Documentation

+ +

◆ add_image()

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

Add image.

+

Previous labels are not overwritten.

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

Definition at line 839 of file GooseEYE.h.

+ +
+
+ +

◆ add_points() [1/2]

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

Add sequence of points.

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

Definition at line 875 of file GooseEYE.h.

+ +
+
+ +

◆ add_points() [2/2]

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

Add sequence of points.

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

Definition at line 892 of file GooseEYE.h.

+ +
+
+ +

◆ add_sequence()

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

Add a sequence of points.

+

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

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

Definition at line 907 of file GooseEYE.h.

+ +
+
+ +

◆ labels()

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

Per block, the label (0 for background).

+
Returns
array of signed integers.
+ +

Definition at line 979 of file GooseEYE.h.

+ +
+
+ +

◆ prune()

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

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

+
Note
This might change all labels.
+ +

Definition at line 602 of file GooseEYE.h.

+ +
+
+ +

◆ repr()

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

Basic class info.

+
Returns
std::string
+ +

Definition at line 949 of file GooseEYE.h.

+ +
+
+ +

◆ reset()

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

Reset labels to zero.

+ +

Definition at line 590 of file GooseEYE.h.

+ +
+
+ +

◆ shape()

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

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

+
Returns
Shape
+ +

Definition at line 959 of file GooseEYE.h.

+ +
+
+ +

◆ size()

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

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

+
Returns
Size
+ +

Definition at line 968 of file GooseEYE.h.

+ +
+
+

Member Data Documentation

+ +

◆ Dim

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

Dimensionality of the system.

+ +

Definition at line 488 of file GooseEYE.h.

+ +
+
+ +

◆ Periodic

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

Periodicity of the system.

+ +

Definition at line 489 of file GooseEYE.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classGooseEYE_1_1ClusterLabeller.js b/classGooseEYE_1_1ClusterLabeller.js new file mode 100644 index 00000000..c4c3689e --- /dev/null +++ b/classGooseEYE_1_1ClusterLabeller.js @@ -0,0 +1,15 @@ +var classGooseEYE_1_1ClusterLabeller = +[ + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html#a259275eedd9e65e152c01eff377c5344", null ], + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html#a4937ee10526225c0f985c1c19347cef6", null ], + [ "add_image", "classGooseEYE_1_1ClusterLabeller.html#a141c63eddd8e766741ebf08b2b473136", null ], + [ "add_points", "classGooseEYE_1_1ClusterLabeller.html#a9a88b743156388bf650af378c93d1ef4", null ], + [ "add_points", "classGooseEYE_1_1ClusterLabeller.html#ac239e876dfcf25f34748cf7b8ca8d704", null ], + [ "add_sequence", "classGooseEYE_1_1ClusterLabeller.html#aa42138736b811d6edd6c2d664d67563b", null ], + [ "labels", "classGooseEYE_1_1ClusterLabeller.html#aa2bd8cf38cd68889140ab55b461056d3", null ], + [ "prune", "classGooseEYE_1_1ClusterLabeller.html#a009856504d69238a7f0950599827da60", null ], + [ "repr", "classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7", null ], + [ "reset", "classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024", null ], + [ "shape", "classGooseEYE_1_1ClusterLabeller.html#a845972ee4e7dfe96242b56115d6f124c", null ], + [ "size", "classGooseEYE_1_1ClusterLabeller.html#a150bfedd947d3492b1afe732a9a9a650", null ] +]; \ No newline at end of file diff --git a/classGooseEYE_1_1Ensemble-members.html b/classGooseEYE_1_1Ensemble-members.html new file mode 100644 index 00000000..32fb516d --- /dev/null +++ b/classGooseEYE_1_1Ensemble-members.html @@ -0,0 +1,139 @@ + + + + + + + +GooseEYE: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GooseEYE::Ensemble Member List
+
+
+ +

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

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

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

+ +

#include <GooseEYE/GooseEYE.h>

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

+Public Member Functions

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

Detailed Description

+

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

+

Note:

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

Definition at line 1216 of file GooseEYE.h.

+

Constructor & Destructor Documentation

+ +

◆ Ensemble()

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

Constructor.

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

Definition at line 14 of file Ensemble.hpp.

+ +
+
+

Member Function Documentation

+ +

◆ C2() [1/2]

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

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

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

Definition at line 84 of file Ensemble_C2.hpp.

+ +
+
+ +

◆ C2() [2/2]

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

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

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

Definition at line 15 of file Ensemble_C2.hpp.

+ +
+
+ +

◆ data_first()

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

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

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

Definition at line 53 of file Ensemble.hpp.

+ +
+
+ +

◆ data_second()

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

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

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

Definition at line 59 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [1/4]

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

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

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

Definition at line 103 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [2/4]

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

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

+

Convert the distance to physical dimensions.

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

Definition at line 114 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [3/4]

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

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

+

Convert the distance to physical dimensions.

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

Definition at line 127 of file Ensemble.hpp.

+ +
+
+ +

◆ distance() [4/4]

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

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

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

Definition at line 71 of file Ensemble.hpp.

+ +
+
+ +

◆ heightheight() [1/2]

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

Add realization to height-height correlation.

+

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

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

Definition at line 80 of file Ensemble_heightheight.hpp.

+ +
+
+ +

◆ heightheight() [2/2]

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

Add realization to height-height correlation.

+

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

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

Definition at line 15 of file Ensemble_heightheight.hpp.

+ +
+
+ +

◆ L()

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

Add realization to lineal-path function.

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

Definition at line 15 of file Ensemble_L.hpp.

+ +
+
+ +

◆ mean() [1/2]

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

Add realization to arithmetic mean.

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

Definition at line 15 of file Ensemble_mean.hpp.

+ +
+
+ +

◆ mean() [2/2]

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

Add realization to arithmetic mean.

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

Definition at line 28 of file Ensemble_mean.hpp.

+ +
+
+ +

◆ norm()

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

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

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

Definition at line 65 of file Ensemble.hpp.

+ +
+
+ +

◆ result()

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

Get ensemble average.

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

Definition at line 26 of file Ensemble.hpp.

+ +
+
+ +

◆ S2() [1/2]

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

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

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

Definition at line 84 of file Ensemble_S2.hpp.

+ +
+
+ +

◆ S2() [2/2]

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

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

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

Definition at line 15 of file Ensemble_S2.hpp.

+ +
+
+ +

◆ variance()

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

Get ensemble variance.

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

Definition at line 37 of file Ensemble.hpp.

+ +
+
+ +

◆ W2() [1/2]

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

Add realization to weighted 2-point correlation.

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

Definition at line 76 of file Ensemble_W2.hpp.

+ +
+
+ +

◆ W2() [2/2]

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

Add realization to weighted 2-point correlation.

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

Definition at line 15 of file Ensemble_W2.hpp.

+ +
+
+ +

◆ W2c() [1/2]

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

Add realization to collapsed weighted 2-point correlation.

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

Definition at line 16 of file Ensemble_W2c.hpp.

+ +
+
+ +

◆ W2c() [2/2]

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

Add realization to collapsed weighted 2-point correlation.

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

Definition at line 123 of file Ensemble_W2c.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classGooseEYE_1_1Ensemble.js b/classGooseEYE_1_1Ensemble.js new file mode 100644 index 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..bea42e63 --- /dev/null +++ b/classes.html @@ -0,0 +1,121 @@ + + + + + + + +GooseEYE: Class Index + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
C | E
+ +
+
+ + + + diff --git a/closed.png b/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/config_8h.html b/config_8h.html new file mode 100644 index 00000000..aceb3b87 --- /dev/null +++ b/config_8h.html @@ -0,0 +1,308 @@ + + + + + + + +GooseEYE: GooseEYE/config.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
config.h File Reference
+
+
+
#include <algorithm>
+#include <assert.h>
+#include <cstdlib>
+#include <exception>
+#include <iomanip>
+#include <iostream>
+#include <limits>
+#include <map>
+#include <math.h>
+#include <memory>
+#include <numeric>
+#include <string>
+#include <type_traits>
+#include <vector>
+#include <xtensor/xadapt.hpp>
+#include <xtensor/xarray.hpp>
+#include <xtensor/xio.hpp>
+#include <xtensor/xmath.hpp>
+#include <xtensor/xpad.hpp>
+#include <xtensor/xsort.hpp>
+#include <xtensor/xtensor.hpp>
+#include <xtensor/xview.hpp>
+
+

Go to the source code of this file.

+ + + + + + + + +

+Namespaces

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

+Macros

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

+Typedefs

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

Detailed Description

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

Definition in file config.h.

+

Macro Definition Documentation

+ +

◆ GOOSEEYE_ASSERT

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

All assertions are implemented as:

+
GOOSEEYE_ASSERT(...)
+

They can be enabled by:

#define GOOSEEYE_ENABLE_ASSERT
+

(before including GooseEYE). The advantage is that:

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

Definition at line 91 of file config.h.

+ +
+
+ +

◆ GOOSEEYE_REQUIRE

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

Assertions that are always enabled.

+ +

Definition at line 67 of file config.h.

+ +
+
+ +

◆ GOOSEEYE_WARNING

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

Warnings are implemented as:

+
 GOOSEEYE_WARNING(...)
+

They can be disables by:

 #define GOOSEEYE_DISABLE_WARNING
+
+

Definition at line 104 of file config.h.

+ +
+
+ +

◆ GOOSEEYE_WARNING_PYTHON

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

Warnings specific to the Python API are implemented as:

+
 GOOSEEYE_WARNING_PYTHON(...)
+

They can be enabled by:

 #define GOOSEEYE_ENABLE_WARNING_PYTHON
+
+

Definition at line 122 of file config.h.

+ +
+
+
+
+ + + + diff --git a/config_8h.js b/config_8h.js new file mode 100644 index 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..9224bd6e --- /dev/null +++ b/config_8h_source.html @@ -0,0 +1,221 @@ + + + + + + + +GooseEYE: GooseEYE/config.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
config.h
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_CONFIG_H
+
8#define GOOSEEYE_CONFIG_H
+
9
+
13#define _USE_MATH_DEFINES
+
18#include <algorithm>
+
19#include <assert.h>
+
20#include <cstdlib>
+
21#include <exception>
+
22#include <iomanip>
+
23#include <iostream>
+
24#include <limits>
+
25#include <map>
+
26#include <math.h>
+
27#include <memory>
+
28#include <numeric>
+
29#include <string>
+
30#include <type_traits>
+
31#include <vector>
+
32
+
33#include <xtensor/xadapt.hpp>
+
34#include <xtensor/xarray.hpp>
+
35#include <xtensor/xio.hpp>
+
36#include <xtensor/xmath.hpp>
+
37#include <xtensor/xpad.hpp>
+
38#include <xtensor/xsort.hpp>
+
39#include <xtensor/xtensor.hpp>
+
40#include <xtensor/xview.hpp>
+
41
+
45#define Q(x) #x
+
46#define QUOTE(x) Q(x)
+
47
+
48#define GOOSEEYE_WARNING_IMPL(message, file, line, function) \
+
49 std::cout << std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + \
+
50 ")" + ": " message ") \n\t";
+
51
+
52#define GOOSEEYE_ASSERT_IMPL(expr, assertion, file, line, function) \
+
53 if (!(expr)) { \
+
54 throw assertion( \
+
55 std::string(file) + ":" + std::to_string(line) + " (" + std::string(function) + ")" + \
+
56 ": assertion failed (" #expr ") \n\t"); \
+
57 }
+
58
+
59#define SIGN(a) ((a < 0) ? -1 : a > 0 ? 1 : 0)
+
+
67#define GOOSEEYE_REQUIRE(expr, assertion) \
+
68 GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
+
+
69
+
87#ifdef GOOSEEYE_ENABLE_ASSERT
+
88#define GOOSEEYE_ASSERT(expr, assertion) \
+
89 GOOSEEYE_ASSERT_IMPL(expr, assertion, __FILE__, __LINE__, __FUNCTION__)
+
90#else
+
91#define GOOSEEYE_ASSERT(expr, assertion)
+
92#endif
+
93
+
103#ifndef GOOSEEYE_DISABLE_WARNING
+
104#define GOOSEEYE_WARNING(message) GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
105#else
+
106#define GOOSEEYE_WARNING(message)
+
107#endif
+
108
+
118#ifdef GOOSEEYE_ENABLE_WARNING_PYTHON
+
119#define GOOSEEYE_WARNING_PYTHON(message) \
+
120 GOOSEEYE_WARNING_IMPL(message, __FILE__, __LINE__, __FUNCTION__)
+
121#else
+
122#define GOOSEEYE_WARNING_PYTHON(message)
+
123#endif
+
124
+
+
128namespace GooseEYE {
+
129
+
+
133namespace array_type {
+
134
+
135#ifdef GOOSEEYE_USE_XTENSOR_PYTHON
+
136
+
140template <typename T, size_t N>
+
141using tensor = xt::pytensor<T, N>;
+
142
+
146template <typename T>
+
147using array = xt::pyarray<T>;
+
148
+
149#else
+
150
+
154template <typename T, size_t N>
+
155using tensor = xt::xtensor<T, N>;
+
156
+
160template <typename T>
+
161using array = xt::xarray<T>;
+
162
+
163#endif
+
164
+
165} // namespace array_type
+
+
166
+
167} // namespace GooseEYE
+
+
168
+
169#endif
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
xt::xarray< T > array
Dynamic rank array.
Definition config.h:161
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/darkmode_toggle.js b/darkmode_toggle.js new file mode 100644 index 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..5c93c158 --- /dev/null +++ b/detail_8hpp.html @@ -0,0 +1,130 @@ + + + + + + + +GooseEYE: GooseEYE/detail.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
detail.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

namespace  GooseEYE
 Toolbox to compute statistics.
 
+

Detailed Description

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

Definition in file detail.hpp.

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

Go to the source code of this file.

+ + + + + +

+Namespaces

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

+Functions

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

Detailed Description

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

Definition in file dilate.hpp.

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

+Files

 config.h
 
 detail.hpp
 
 dilate.hpp
 
 Ensemble.hpp
 
 Ensemble_C2.hpp
 
 Ensemble_heightheight.hpp
 
 Ensemble_L.hpp
 
 Ensemble_mean.hpp
 
 Ensemble_S2.hpp
 
 Ensemble_W2.hpp
 
 Ensemble_W2c.hpp
 
 GooseEYE.h
 
 GooseEYE.hpp
 
 kernel.hpp
 
 version.h
 
 version.hpp
 
+
+
+ + + + diff --git a/dir_1e7fc41d3d108c67da428f08b8cf70c8.js b/dir_1e7fc41d3d108c67da428f08b8cf70c8.js new file mode 100644 index 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..152f215d --- /dev/null +++ b/files.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: File List + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
+
+ + + + diff --git a/files_dup.js b/files_dup.js new file mode 100644 index 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..d7b96fb4 --- /dev/null +++ b/functions.html @@ -0,0 +1,187 @@ + + + + + + + +GooseEYE: Class Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+ + +

- w -

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

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+ + +

- w -

+
+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 00000000..d003e5f2 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Class Members - Variables + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+
+ + + + diff --git a/globals.html b/globals.html new file mode 100644 index 00000000..0b4d343e --- /dev/null +++ b/globals.html @@ -0,0 +1,116 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented file members with links to the documentation:
+
+
+ + + + diff --git a/globals_defs.html b/globals_defs.html new file mode 100644 index 00000000..4b6c1bba --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,116 @@ + + + + + + + +GooseEYE: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+
+
+ + + + diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 00000000..a413fcd6 --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,119 @@ + + + + + + + +GooseEYE: Class Hierarchy + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+ + + + +
 CGooseEYE::ClusterLabeller< Dimension, Periodicity >(Incrementally) Label clusters (0 as background, 1..n as labels)
 CGooseEYE::ClusterLabeller< Dimension, Periodicity >
 CGooseEYE::EnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
+
+
+
+ + + + diff --git a/hierarchy.js b/hierarchy.js new file mode 100644 index 00000000..838f1428 --- /dev/null +++ b/hierarchy.js @@ -0,0 +1,6 @@ +var hierarchy = +[ + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", null ], + [ "GooseEYE::ClusterLabeller< Dimension, Periodicity >", "classGooseEYE_1_1ClusterLabeller.html", null ], + [ "GooseEYE::Ensemble", "classGooseEYE_1_1Ensemble.html", null ] +]; \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..13f1b0a2 --- /dev/null +++ b/index.html @@ -0,0 +1,133 @@ + + + + + + + +GooseEYE: GooseEYE + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+

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

+

+GooseEYE

+

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

+

https://gooseeye.readthedocs.io

+

+Credit / copyright

+

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

+

Contributors:

+ +

Tom de Geus was financially supported by:

+ +
+
+
+ + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 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..be480672 --- /dev/null +++ b/kernel_8hpp.html @@ -0,0 +1,140 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
kernel.hpp File Reference
+
+
+
#include "GooseEYE.h"
+
+

Go to the source code of this file.

+ + + + + + + + +

+Namespaces

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

+Functions

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

Detailed Description

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

Definition in file kernel.hpp.

+
+
+ + + + diff --git a/kernel_8hpp.js b/kernel_8hpp.js new file mode 100644 index 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..a1585b12 --- /dev/null +++ b/kernel_8hpp_source.html @@ -0,0 +1,163 @@ + + + + + + + +GooseEYE: GooseEYE/kernel.hpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
GooseEYE 0.9.1.dev5+g3ca3064 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
kernel.hpp
+
+
+Go to the documentation of this file.
1
+
7#ifndef GOOSEEYE_KERNEL_HPP
+
8#define GOOSEEYE_KERNEL_HPP
+
9
+
10#include "GooseEYE.h"
+
11
+
12namespace GooseEYE {
+
13namespace kernel {
+
14
+
+ +
16{
+
17 GOOSEEYE_ASSERT(ndim > 0 && ndim <= 3, std::out_of_range);
+
18
+
19 std::vector<size_t> shape(ndim, 3);
+
20
+
21 array_type::array<int> kern = xt::zeros<int>(shape);
+
22
+
23 if (ndim == 1) {
+
24 xt::view(kern, xt::all()) = 1;
+
25 return kern;
+
26 }
+
27
+
28 if (ndim == 2) {
+
29 xt::view(kern, xt::keep(1), xt::all()) = 1;
+
30 xt::view(kern, xt::all(), xt::keep(1)) = 1;
+
31 return kern;
+
32 }
+
33
+
34 xt::view(kern, xt::keep(1), xt::all(), xt::all()) = 1;
+
35 xt::view(kern, xt::all(), xt::keep(1), xt::all()) = 1;
+
36 xt::view(kern, xt::all(), xt::all(), xt::keep(1)) = 1;
+
37 return kern;
+
38}
+
+
39
+
40} // namespace kernel
+
41} // namespace GooseEYE
+
42
+
43#endif
+ +
#define GOOSEEYE_ASSERT(expr, assertion)
All assertions are implemented as:
Definition config.h:91
+
xt::xtensor< T, N > tensor
Fixed (static) rank array.
Definition config.h:155
+
array_type::array< int > nearest(size_t ndim)
Return kernel with nearest neighbours.
Definition kernel.hpp:15
+
Toolbox to compute statistics.
Definition config.h:128
+
+
+ + + + diff --git a/menu.js b/menu.js new file mode 100644 index 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..fcff837a --- /dev/null +++ b/menudata.js @@ -0,0 +1,92 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"n",url:"namespacemembers.html#index_n"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}, +{text:"v",url:"namespacemembers.html#index_v"}, +{text:"w",url:"namespacemembers.html#index_w"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"d",url:"namespacemembers_func.html#index_d"}, +{text:"h",url:"namespacemembers_func.html#index_h"}, +{text:"l",url:"namespacemembers_func.html#index_l"}, +{text:"n",url:"namespacemembers_func.html#index_n"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"v",url:"namespacemembers_func.html#index_v"}, +{text:"w",url:"namespacemembers_func.html#index_w"}]}, +{text:"Typedefs",url:"namespacemembers_type.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"h",url:"functions.html#index_h"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/minus.svg b/minus.svg new file mode 100644 index 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..213c8cf9 --- /dev/null +++ b/namespaceGooseEYE.html @@ -0,0 +1,2273 @@ + + + + + + + +GooseEYE: GooseEYE Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE Namespace Reference
    +
    +
    + +

    Toolbox to compute statistics. +More...

    + + + + + + + + +

    +Namespaces

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

    +Classes

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

    +Enumerations

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

    +Functions

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

    Detailed Description

    +

    Toolbox to compute statistics.

    +

    Enumeration Type Documentation

    + +

    ◆ path_mode

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

    Different methods to compute a pixel-path.

    + + + + +
    Enumerator
    Bresenham 

    Bresenham algorithm.

    +
    actual 

    The actual path.

    +
    full 

    Similar to actual selecting every voxel that is crossed.

    +
    + +

    Definition at line 69 of file GooseEYE.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ C2() [1/2]

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

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

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

    Definition at line 75 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ C2() [2/2]

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

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

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

    Definition at line 84 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ center()

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

    Return the geometric center of a list of positions.

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

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

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

    Definition at line 1060 of file GooseEYE.h.

    + +
    +
    + +

    ◆ center_of_mass()

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

    Return the geometric center of a list of positions.

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

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

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

    Definition at line 1088 of file GooseEYE.h.

    + +
    +
    + +

    ◆ clusters()

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

    Compute clusters.

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

    Definition at line 1012 of file GooseEYE.h.

    + +
    +
    + +

    ◆ dilate() [1/4]

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

    Dilate image.

    +

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

    + +

    Definition at line 177 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [2/4]

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

    Dilate image.

    +

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

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

    Definition at line 96 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [3/4]

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

    Dilate image.

    +

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

    + +

    Definition at line 196 of file dilate.hpp.

    + +
    +
    + +

    ◆ dilate() [4/4]

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

    Dilate image.

    +

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

    + +

    Definition at line 183 of file dilate.hpp.

    + +
    +
    + +

    ◆ distance() [1/4]

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

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

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

    Definition at line 28 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [2/4]

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

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

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

    Definition at line 40 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [3/4]

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

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

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

    Definition at line 46 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ distance() [4/4]

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

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

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

    Definition at line 34 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ dummy_circles() [1/2]

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

    Dummy image with circles.

    +

    The positions and radii of the circles are randomly generated.

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

    Definition at line 148 of file GooseEYE.h.

    + +
    +
    + +

    ◆ dummy_circles() [2/2]

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

    Dummy image with circles.

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

    Definition at line 96 of file GooseEYE.h.

    + +
    +
    + +

    ◆ heightheight() [1/2]

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

    Height-height correlation.

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

    Definition at line 143 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ heightheight() [2/2]

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

    Height-height correlation.

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

    Definition at line 151 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ L()

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

    Lineal-path function.

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

    Definition at line 159 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ labels_centers()

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

    Get the position of the center of each label.

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

    Definition at line 1154 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_centers_of_mass()

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

    Get the position of the center of each label.

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

    Definition at line 1182 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_map()

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

    Get a map to relabel from a to b.

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

    Definition at line 242 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_prune()

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

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

    +

    Note that the background 0 is always kept 0.

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

    Definition at line 304 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_rename()

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

    Rename labels.

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

    Definition at line 271 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_reorder()

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

    Reorder labels.

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

    Definition at line 350 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_sizes() [1/2]

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

    Size per label.

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

    Definition at line 402 of file GooseEYE.h.

    + +
    +
    + +

    ◆ labels_sizes() [2/2]

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

    Size per label.

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

    Definition at line 426 of file GooseEYE.h.

    + +
    +
    + +

    ◆ path()

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

    Compute a path between two pixels.

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

    Definition at line 15 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ S2() [1/2]

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

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

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

    Definition at line 53 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ S2() [2/2]

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

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

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

    Definition at line 62 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ version()

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

    Return version string, e.g.

    +

    "0.8.0"

    Returns
    String.
    + +

    Definition at line 25 of file version.hpp.

    + +
    +
    + +

    ◆ W2() [1/2]

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

    Weighted 2-point correlation.

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

    Definition at line 97 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2() [2/2]

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

    Weighted 2-point correlation.

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

    Definition at line 106 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2c() [1/2]

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

    Collapsed weighted 2-point correlation.

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

    Definition at line 129 of file GooseEYE.hpp.

    + +
    +
    + +

    ◆ W2c() [2/2]

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

    Collapsed weighted 2-point correlation.

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

    Definition at line 115 of file GooseEYE.hpp.

    + +
    +
    +
    +
    + + + + diff --git a/namespaceGooseEYE.js b/namespaceGooseEYE.js new file mode 100644 index 00000000..9ebd35f5 --- /dev/null +++ b/namespaceGooseEYE.js @@ -0,0 +1,51 @@ +var namespaceGooseEYE = +[ + [ "array_type", "namespaceGooseEYE_1_1array__type.html", [ + [ "array", "namespaceGooseEYE_1_1array__type.html#ab865d9e3da9ba91db40f43c14b26f51f", null ], + [ "tensor", "namespaceGooseEYE_1_1array__type.html#a2990d2b991e50171d4d24abe34bf15e3", null ] + ] ], + [ "kernel", "namespaceGooseEYE_1_1kernel.html", [ + [ "nearest", "namespaceGooseEYE_1_1kernel.html#a306dfde37d04075f3a635200b2f528ed", null ] + ] ], + [ "ClusterLabeller", "classGooseEYE_1_1ClusterLabeller.html", "classGooseEYE_1_1ClusterLabeller" ], + [ "Ensemble", "classGooseEYE_1_1Ensemble.html", "classGooseEYE_1_1Ensemble" ], + [ "path_mode", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320", [ + [ "Bresenham", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a20b83bc3afd59d747cc745d5f70f3695", null ], + [ "actual", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e", null ], + [ "full", "namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320ae9dc924f238fa6cc29465942875fe8f0", null ] + ] ], + [ "C2", "namespaceGooseEYE.html#a6f8454f08a6b048290f36618cc80986b", null ], + [ "C2", "namespaceGooseEYE.html#a867ce41fed448b5442ad8f6e6011b8b1", null ], + [ "center", "namespaceGooseEYE.html#a31035d0d76c452f5c68ef4cfabaaa843", null ], + [ "center_of_mass", "namespaceGooseEYE.html#a22b5a1880c3622fcf4d1113f997567cd", null ], + [ "clusters", "namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2", null ], + [ "dilate", "namespaceGooseEYE.html#ae859f712898ed7d6e76a5ecaa114614a", null ], + [ "dilate", "namespaceGooseEYE.html#a43f961d31fad8b606eedee2fcd4969b5", null ], + [ "dilate", "namespaceGooseEYE.html#a4976e5bbf41b58472e028babb092bd85", null ], + [ "dilate", "namespaceGooseEYE.html#a6bb0149c151f7255f796ac80bc57a031", null ], + [ "distance", "namespaceGooseEYE.html#adf4657193fc58978eed6ef274ebb93ed", null ], + [ "distance", "namespaceGooseEYE.html#a3097c5d07c0fe21227df46b79c133a23", null ], + [ "distance", "namespaceGooseEYE.html#ab97f8ace23ac36134cfaab38a19b131b", null ], + [ "distance", "namespaceGooseEYE.html#a3d0010a207abd86a2811edfb32d22e21", null ], + [ "dummy_circles", "namespaceGooseEYE.html#a607337e83a0a65c41ded829114a17ac6", null ], + [ "dummy_circles", "namespaceGooseEYE.html#ab3570c9c90ad8e21f2ddba6dae537e3f", null ], + [ "heightheight", "namespaceGooseEYE.html#ae761eb00cac0021b5840df83814abf72", null ], + [ "heightheight", "namespaceGooseEYE.html#a5f658c332d5fc69e86bb44cb14930ce5", null ], + [ "L", "namespaceGooseEYE.html#a43454c98d88250a5693a3696ca978cb4", null ], + [ "labels_centers", "namespaceGooseEYE.html#a8cb5ff11ff0e2202efd518578aec7bb9", null ], + [ "labels_centers_of_mass", "namespaceGooseEYE.html#a0b7623525069f7e1839f9981bd74bbd5", null ], + [ "labels_map", "namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c", null ], + [ "labels_prune", "namespaceGooseEYE.html#a45d7b4463cd0c2c10fbe2b6827900cda", null ], + [ "labels_rename", "namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a", null ], + [ "labels_reorder", "namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115", null ], + [ "labels_sizes", "namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314", null ], + [ "labels_sizes", "namespaceGooseEYE.html#a3ad17cff4b60d439cb1a817ebf8588ee", null ], + [ "path", "namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add", null ], + [ "S2", "namespaceGooseEYE.html#ae27103f5b7d6acda6fc2e14c8dfd11b3", null ], + [ "S2", "namespaceGooseEYE.html#ac01c192a6d398e2befc3aca36e953f0e", null ], + [ "version", "namespaceGooseEYE.html#abc99a3a1ab42cd9514f08b7530d300f3", null ], + [ "W2", "namespaceGooseEYE.html#aaa2055a53f179e2ddd810ebaf9eaf837", null ], + [ "W2", "namespaceGooseEYE.html#ab349faaa82c253cea9d67996cb9749c7", null ], + [ "W2c", "namespaceGooseEYE.html#a989df0528b84e5e0f4da84062785ee8b", null ], + [ "W2c", "namespaceGooseEYE.html#a55b550567256dee0da56ac22fd2be72a", null ] +]; \ No newline at end of file diff --git a/namespaceGooseEYE_1_1array__type.html b/namespaceGooseEYE_1_1array__type.html new file mode 100644 index 00000000..59d9b9ab --- /dev/null +++ b/namespaceGooseEYE_1_1array__type.html @@ -0,0 +1,173 @@ + + + + + + + +GooseEYE: GooseEYE::array_type Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE::array_type Namespace Reference
    +
    +
    + +

    Container type. +More...

    + + + + + + + + + + +

    +Typedefs

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

    Detailed Description

    +

    Container type.

    +

    Typedef Documentation

    + +

    ◆ array

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

    Dynamic rank array.

    + +

    Definition at line 161 of file config.h.

    + +
    +
    + +

    ◆ tensor

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

    Fixed (static) rank array.

    + +

    Definition at line 155 of file config.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespaceGooseEYE_1_1kernel.html b/namespaceGooseEYE_1_1kernel.html new file mode 100644 index 00000000..577e5e24 --- /dev/null +++ b/namespaceGooseEYE_1_1kernel.html @@ -0,0 +1,165 @@ + + + + + + + +GooseEYE: GooseEYE::kernel Namespace Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    GooseEYE::kernel Namespace Reference
    +
    +
    + +

    Collect kernels. +More...

    + + + + + +

    +Functions

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

    Detailed Description

    +

    Collect kernels.

    +

    Function Documentation

    + +

    ◆ nearest()

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

    Return kernel with nearest neighbours.

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

    Definition at line 15 of file kernel.hpp.

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

    - a -

    + + +

    - c -

    + + +

    - d -

    + + +

    - h -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - s -

    + + +

    - t -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_enum.html b/namespacemembers_enum.html new file mode 100644 index 00000000..0e64efab --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,112 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace enums with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/namespacemembers_func.html b/namespacemembers_func.html new file mode 100644 index 00000000..9aed7ad9 --- /dev/null +++ b/namespacemembers_func.html @@ -0,0 +1,167 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    + +

    - c -

    + + +

    - d -

    + + +

    - h -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - s -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_type.html b/namespacemembers_type.html new file mode 100644 index 00000000..fe074ba9 --- /dev/null +++ b/namespacemembers_type.html @@ -0,0 +1,113 @@ + + + + + + + +GooseEYE: Namespace Members + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace typedefs with links to the namespaces they belong to:
    +
    +
    + + + + diff --git a/namespaces.html b/namespaces.html new file mode 100644 index 00000000..26c13727 --- /dev/null +++ b/namespaces.html @@ -0,0 +1,121 @@ + + + + + + + +GooseEYE: Namespace List + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Namespace List
    +
    +
    +
    Here is a list of all documented namespaces with brief descriptions:
    +
    [detail level 12]
    + + + + + +
     NGooseEYEToolbox to compute statistics
     Narray_typeContainer type
     NkernelCollect kernels
     CClusterLabeller(Incrementally) Label clusters (0 as background, 1..n as labels)
     CEnsembleCompute ensemble averaged statistics, by repetitively calling the member-function of a certain statistical measure with different data
    +
    +
    +
    + + + + diff --git a/namespaces_dup.js b/namespaces_dup.js new file mode 100644 index 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 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/nav_fd.png b/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 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(/1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + + + 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..80f08a1f --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['actual_0',['actual',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320a5157e3c765af93679ea07052f30f0a6e',1,'GooseEYE']]], + ['add_5fimage_1',['add_image',['../classGooseEYE_1_1ClusterLabeller.html#a141c63eddd8e766741ebf08b2b473136',1,'GooseEYE::ClusterLabeller']]], + ['add_5fpoints_2',['add_points',['../classGooseEYE_1_1ClusterLabeller.html#a9a88b743156388bf650af378c93d1ef4',1,'GooseEYE::ClusterLabeller::add_points(const T &begin, const T &end)'],['../classGooseEYE_1_1ClusterLabeller.html#ac239e876dfcf25f34748cf7b8ca8d704',1,'GooseEYE::ClusterLabeller::add_points(const T &idx)']]], + ['add_5fsequence_3',['add_sequence',['../classGooseEYE_1_1ClusterLabeller.html#aa42138736b811d6edd6c2d664d67563b',1,'GooseEYE::ClusterLabeller']]], + ['array_4',['array',['../namespaceGooseEYE_1_1array__type.html#ab865d9e3da9ba91db40f43c14b26f51f',1,'GooseEYE::array_type']]] +]; diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 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..0b33ba0d --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['c2_0',['c2',['../classGooseEYE_1_1Ensemble.html#af52ed25e986f699a846e09498fd25928',1,'GooseEYE::Ensemble::C2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#aa6b103383499bbce8a6dc4caebbfe710',1,'GooseEYE::Ensemble::C2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#a6f8454f08a6b048290f36618cc80986b',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#a867ce41fed448b5442ad8f6e6011b8b1',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['center_1',['center',['../namespaceGooseEYE.html#a31035d0d76c452f5c68ef4cfabaaa843',1,'GooseEYE']]], + ['center_5fof_5fmass_2',['center_of_mass',['../namespaceGooseEYE.html#a22b5a1880c3622fcf4d1113f997567cd',1,'GooseEYE']]], + ['clusterlabeller_3',['clusterlabeller',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE::ClusterLabeller< Dimension, Periodicity >'],['../classGooseEYE_1_1ClusterLabeller.html#a259275eedd9e65e152c01eff377c5344',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape)'],['../classGooseEYE_1_1ClusterLabeller.html#a4937ee10526225c0f985c1c19347cef6',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape, const K &kernel)']]], + ['clusterlabeller_3c_20dimension_2c_20periodicity_20_3e_4',['ClusterLabeller< Dimension, Periodicity >',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]], + ['clusters_5',['clusters',['../namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2',1,'GooseEYE']]], + ['config_2eh_6',['config.h',['../config_8h.html',1,'']]], + ['copyright_7',['Credit / copyright',['../index.html#autotoc_md1',1,'']]], + ['credit_20copyright_8',['Credit / copyright',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 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..a6eda693 --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['l_0',['l',['../classGooseEYE_1_1Ensemble.html#a202f65fb4aa0358814a9f69e0e1de270',1,'GooseEYE::Ensemble::L()'],['../namespaceGooseEYE.html#a43454c98d88250a5693a3696ca978cb4',1,'GooseEYE::L()']]], + ['labels_1',['labels',['../classGooseEYE_1_1ClusterLabeller.html#aa2bd8cf38cd68889140ab55b461056d3',1,'GooseEYE::ClusterLabeller']]], + ['labels_5fcenters_2',['labels_centers',['../namespaceGooseEYE.html#a8cb5ff11ff0e2202efd518578aec7bb9',1,'GooseEYE']]], + ['labels_5fcenters_5fof_5fmass_3',['labels_centers_of_mass',['../namespaceGooseEYE.html#a0b7623525069f7e1839f9981bd74bbd5',1,'GooseEYE']]], + ['labels_5fmap_4',['labels_map',['../namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c',1,'GooseEYE']]], + ['labels_5fprune_5',['labels_prune',['../namespaceGooseEYE.html#a45d7b4463cd0c2c10fbe2b6827900cda',1,'GooseEYE']]], + ['labels_5frename_6',['labels_rename',['../namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a',1,'GooseEYE']]], + ['labels_5freorder_7',['labels_reorder',['../namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115',1,'GooseEYE']]], + ['labels_5fsizes_8',['labels_sizes',['../namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314',1,'GooseEYE::labels_sizes(const T &labels)'],['../namespaceGooseEYE.html#a3ad17cff4b60d439cb1a817ebf8588ee',1,'GooseEYE::labels_sizes(const T &labels, const N &names)']]] +]; diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 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..b61cbcf7 --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['path_0',['path',['../namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add',1,'GooseEYE']]], + ['path_5fmode_1',['path_mode',['../namespaceGooseEYE.html#a0b6a1f8a4e4366c6715246b5da57b320',1,'GooseEYE']]], + ['periodic_2',['Periodic',['../classGooseEYE_1_1ClusterLabeller.html#a8c247970f5c488e63eac7ca3035370c4',1,'GooseEYE::ClusterLabeller']]], + ['prune_3',['prune',['../classGooseEYE_1_1ClusterLabeller.html#a009856504d69238a7f0950599827da60',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 00000000..4f3a55c2 --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['repr_0',['repr',['../classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7',1,'GooseEYE::ClusterLabeller']]], + ['reset_1',['reset',['../classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024',1,'GooseEYE::ClusterLabeller']]], + ['result_2',['result',['../classGooseEYE_1_1Ensemble.html#aca0906b15fc229f1183e6cd45c398c0d',1,'GooseEYE::Ensemble']]] +]; diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 00000000..a8d9e33b --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['s2_0',['s2',['../classGooseEYE_1_1Ensemble.html#a3679472fd2dbcc55323beb3f8e5fa176',1,'GooseEYE::Ensemble::S2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#ab26b64c4d1dc58f5c9fedcc1fadc9f60',1,'GooseEYE::Ensemble::S2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#ae27103f5b7d6acda6fc2e14c8dfd11b3',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#ac01c192a6d398e2befc3aca36e953f0e',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['shape_1',['shape',['../classGooseEYE_1_1ClusterLabeller.html#a845972ee4e7dfe96242b56115d6f124c',1,'GooseEYE::ClusterLabeller']]], + ['size_2',['size',['../classGooseEYE_1_1ClusterLabeller.html#a150bfedd947d3492b1afe732a9a9a650',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 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..ff5a5d05 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['clusterlabeller_0',['ClusterLabeller',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]], + ['clusterlabeller_3c_20dimension_2c_20periodicity_20_3e_1',['ClusterLabeller< Dimension, Periodicity >',['../classGooseEYE_1_1ClusterLabeller.html',1,'GooseEYE']]] +]; diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 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..f044a541 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['add_5fimage_0',['add_image',['../classGooseEYE_1_1ClusterLabeller.html#a141c63eddd8e766741ebf08b2b473136',1,'GooseEYE::ClusterLabeller']]], + ['add_5fpoints_1',['add_points',['../classGooseEYE_1_1ClusterLabeller.html#a9a88b743156388bf650af378c93d1ef4',1,'GooseEYE::ClusterLabeller::add_points(const T &begin, const T &end)'],['../classGooseEYE_1_1ClusterLabeller.html#ac239e876dfcf25f34748cf7b8ca8d704',1,'GooseEYE::ClusterLabeller::add_points(const T &idx)']]], + ['add_5fsequence_2',['add_sequence',['../classGooseEYE_1_1ClusterLabeller.html#aa42138736b811d6edd6c2d664d67563b',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 00000000..806dfbd5 --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['c2_0',['c2',['../classGooseEYE_1_1Ensemble.html#af52ed25e986f699a846e09498fd25928',1,'GooseEYE::Ensemble::C2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#aa6b103383499bbce8a6dc4caebbfe710',1,'GooseEYE::Ensemble::C2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#a6f8454f08a6b048290f36618cc80986b',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#a867ce41fed448b5442ad8f6e6011b8b1',1,'GooseEYE::C2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['center_1',['center',['../namespaceGooseEYE.html#a31035d0d76c452f5c68ef4cfabaaa843',1,'GooseEYE']]], + ['center_5fof_5fmass_2',['center_of_mass',['../namespaceGooseEYE.html#a22b5a1880c3622fcf4d1113f997567cd',1,'GooseEYE']]], + ['clusterlabeller_3',['clusterlabeller',['../classGooseEYE_1_1ClusterLabeller.html#a259275eedd9e65e152c01eff377c5344',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape)'],['../classGooseEYE_1_1ClusterLabeller.html#a4937ee10526225c0f985c1c19347cef6',1,'GooseEYE::ClusterLabeller::ClusterLabeller(const T &shape, const K &kernel)']]], + ['clusters_4',['clusters',['../namespaceGooseEYE.html#a868d564546b23e37ecf3ccd510cf17a2',1,'GooseEYE']]] +]; diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 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..a6eda693 --- /dev/null +++ b/search/functions_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['l_0',['l',['../classGooseEYE_1_1Ensemble.html#a202f65fb4aa0358814a9f69e0e1de270',1,'GooseEYE::Ensemble::L()'],['../namespaceGooseEYE.html#a43454c98d88250a5693a3696ca978cb4',1,'GooseEYE::L()']]], + ['labels_1',['labels',['../classGooseEYE_1_1ClusterLabeller.html#aa2bd8cf38cd68889140ab55b461056d3',1,'GooseEYE::ClusterLabeller']]], + ['labels_5fcenters_2',['labels_centers',['../namespaceGooseEYE.html#a8cb5ff11ff0e2202efd518578aec7bb9',1,'GooseEYE']]], + ['labels_5fcenters_5fof_5fmass_3',['labels_centers_of_mass',['../namespaceGooseEYE.html#a0b7623525069f7e1839f9981bd74bbd5',1,'GooseEYE']]], + ['labels_5fmap_4',['labels_map',['../namespaceGooseEYE.html#a6094d2e17d15643de7c45abd30f5ee6c',1,'GooseEYE']]], + ['labels_5fprune_5',['labels_prune',['../namespaceGooseEYE.html#a45d7b4463cd0c2c10fbe2b6827900cda',1,'GooseEYE']]], + ['labels_5frename_6',['labels_rename',['../namespaceGooseEYE.html#a9ec9f5ff4d454ff11259bd8605b6ca2a',1,'GooseEYE']]], + ['labels_5freorder_7',['labels_reorder',['../namespaceGooseEYE.html#aff1767fb399e78e3eb58f1938ec9d115',1,'GooseEYE']]], + ['labels_5fsizes_8',['labels_sizes',['../namespaceGooseEYE.html#a574f4bf714a747297f82c835f806f314',1,'GooseEYE::labels_sizes(const T &labels)'],['../namespaceGooseEYE.html#a3ad17cff4b60d439cb1a817ebf8588ee',1,'GooseEYE::labels_sizes(const T &labels, const N &names)']]] +]; diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 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..dac970c9 --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['path_0',['path',['../namespaceGooseEYE.html#ac27cb5922686e23dbd84d313579b2add',1,'GooseEYE']]], + ['prune_1',['prune',['../classGooseEYE_1_1ClusterLabeller.html#a009856504d69238a7f0950599827da60',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/functions_9.js b/search/functions_9.js new file mode 100644 index 00000000..4f3a55c2 --- /dev/null +++ b/search/functions_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['repr_0',['repr',['../classGooseEYE_1_1ClusterLabeller.html#a6685c9e4514a6d1621eb03da13da96e7',1,'GooseEYE::ClusterLabeller']]], + ['reset_1',['reset',['../classGooseEYE_1_1ClusterLabeller.html#aea5340437032740571480fecea6c9024',1,'GooseEYE::ClusterLabeller']]], + ['result_2',['result',['../classGooseEYE_1_1Ensemble.html#aca0906b15fc229f1183e6cd45c398c0d',1,'GooseEYE::Ensemble']]] +]; diff --git a/search/functions_a.js b/search/functions_a.js new file mode 100644 index 00000000..a8d9e33b --- /dev/null +++ b/search/functions_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['s2_0',['s2',['../classGooseEYE_1_1Ensemble.html#a3679472fd2dbcc55323beb3f8e5fa176',1,'GooseEYE::Ensemble::S2(const T &f, const T &g)'],['../classGooseEYE_1_1Ensemble.html#ab26b64c4d1dc58f5c9fedcc1fadc9f60',1,'GooseEYE::Ensemble::S2(const T &f, const T &g, const M &fmask, const M &gmask)'],['../namespaceGooseEYE.html#ae27103f5b7d6acda6fc2e14c8dfd11b3',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, bool periodic=true)'],['../namespaceGooseEYE.html#ac01c192a6d398e2befc3aca36e953f0e',1,'GooseEYE::S2(const std::vector< size_t > &roi, const T &f, const T &g, const M &fmask, const M &gmask, bool periodic=true)']]], + ['shape_1',['shape',['../classGooseEYE_1_1ClusterLabeller.html#a845972ee4e7dfe96242b56115d6f124c',1,'GooseEYE::ClusterLabeller']]], + ['size_2',['size',['../classGooseEYE_1_1ClusterLabeller.html#a150bfedd947d3492b1afe732a9a9a650',1,'GooseEYE::ClusterLabeller']]] +]; diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 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; e-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/splitbard.png b/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/tab_ad.png b/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/tab_s.png b/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/tab_sd.png b/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css new file mode 100644 index 00000000..71c8a470 --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>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..413d2412 --- /dev/null +++ b/version_8h.html @@ -0,0 +1,173 @@ + + + + + + + +GooseEYE: GooseEYE/version.h File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    version.h File Reference
    +
    +
    +
    #include "config.h"
    +#include "version.hpp"
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

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

    +Macros

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

    +Functions

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

    Detailed Description

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

    Definition in file version.h.

    +

    Macro Definition Documentation

    + +

    ◆ GOOSEEYE_VERSION

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

    Current version.

    +

    Either:

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

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

    + +

    Definition at line 33 of file version.h.

    + +
    +
    +
    +
    + + + + diff --git a/version_8h.js b/version_8h.js new file mode 100644 index 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..d750cd96 --- /dev/null +++ b/version_8h_source.html @@ -0,0 +1,141 @@ + + + + + + + +GooseEYE: GooseEYE/version.h Source File + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    version.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    7#ifndef GOOSEEYE_VERSION_H
    +
    8#define GOOSEEYE_VERSION_H
    +
    9
    +
    10#include "config.h"
    +
    11
    +
    32#ifndef GOOSEEYE_VERSION
    +
    33#define GOOSEEYE_VERSION "@PROJECT_VERSION@"
    +
    34#endif
    +
    35
    +
    36namespace GooseEYE {
    +
    37
    +
    42inline std::string version();
    +
    43
    +
    44} // namespace GooseEYE
    +
    45
    +
    46#include "version.hpp"
    +
    47
    +
    48#endif
    + +
    Toolbox to compute statistics.
    Definition config.h:128
    +
    std::string version()
    Return version string, e.g.
    Definition version.hpp:25
    + +
    +
    + + + + diff --git a/version_8hpp.html b/version_8hpp.html new file mode 100644 index 00000000..232a74be --- /dev/null +++ b/version_8hpp.html @@ -0,0 +1,137 @@ + + + + + + + +GooseEYE: GooseEYE/version.hpp File Reference + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    GooseEYE 0.9.1.dev5+g3ca3064 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    version.hpp File Reference
    +
    +
    +
    #include "version.h"
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

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

    +Functions

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

    Detailed Description

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

    Definition in file version.hpp.

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