isotree 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -1
- data/LICENSE.txt +2 -2
- data/README.md +32 -14
- data/ext/isotree/ext.cpp +144 -31
- data/ext/isotree/extconf.rb +7 -7
- data/lib/isotree/isolation_forest.rb +110 -30
- data/lib/isotree/version.rb +1 -1
- data/vendor/isotree/LICENSE +1 -1
- data/vendor/isotree/README.md +165 -27
- data/vendor/isotree/include/isotree.hpp +2111 -0
- data/vendor/isotree/include/isotree_oop.hpp +394 -0
- data/vendor/isotree/inst/COPYRIGHTS +62 -0
- data/vendor/isotree/src/RcppExports.cpp +525 -52
- data/vendor/isotree/src/Rwrapper.cpp +1931 -268
- data/vendor/isotree/src/c_interface.cpp +953 -0
- data/vendor/isotree/src/crit.hpp +4232 -0
- data/vendor/isotree/src/dist.hpp +1886 -0
- data/vendor/isotree/src/exp_depth_table.hpp +134 -0
- data/vendor/isotree/src/extended.hpp +1444 -0
- data/vendor/isotree/src/external_facing_generic.hpp +399 -0
- data/vendor/isotree/src/fit_model.hpp +2401 -0
- data/vendor/isotree/src/{dealloc.cpp → headers_joined.hpp} +38 -22
- data/vendor/isotree/src/helpers_iforest.hpp +813 -0
- data/vendor/isotree/src/{impute.cpp → impute.hpp} +353 -122
- data/vendor/isotree/src/indexer.cpp +515 -0
- data/vendor/isotree/src/instantiate_template_headers.cpp +118 -0
- data/vendor/isotree/src/instantiate_template_headers.hpp +240 -0
- data/vendor/isotree/src/isoforest.hpp +1659 -0
- data/vendor/isotree/src/isotree.hpp +1804 -392
- data/vendor/isotree/src/isotree_exportable.hpp +99 -0
- data/vendor/isotree/src/merge_models.cpp +159 -16
- data/vendor/isotree/src/mult.hpp +1321 -0
- data/vendor/isotree/src/oop_interface.cpp +842 -0
- data/vendor/isotree/src/oop_interface.hpp +278 -0
- data/vendor/isotree/src/other_helpers.hpp +219 -0
- data/vendor/isotree/src/predict.hpp +1932 -0
- data/vendor/isotree/src/python_helpers.hpp +134 -0
- data/vendor/isotree/src/ref_indexer.hpp +154 -0
- data/vendor/isotree/src/robinmap/LICENSE +21 -0
- data/vendor/isotree/src/robinmap/README.md +483 -0
- data/vendor/isotree/src/robinmap/include/tsl/robin_growth_policy.h +406 -0
- data/vendor/isotree/src/robinmap/include/tsl/robin_hash.h +1620 -0
- data/vendor/isotree/src/robinmap/include/tsl/robin_map.h +807 -0
- data/vendor/isotree/src/robinmap/include/tsl/robin_set.h +660 -0
- data/vendor/isotree/src/serialize.cpp +4300 -139
- data/vendor/isotree/src/sql.cpp +141 -59
- data/vendor/isotree/src/subset_models.cpp +174 -0
- data/vendor/isotree/src/utils.hpp +3808 -0
- data/vendor/isotree/src/xoshiro.hpp +467 -0
- data/vendor/isotree/src/ziggurat.hpp +405 -0
- metadata +38 -104
- data/vendor/cereal/LICENSE +0 -24
- data/vendor/cereal/README.md +0 -85
- data/vendor/cereal/include/cereal/access.hpp +0 -351
- data/vendor/cereal/include/cereal/archives/adapters.hpp +0 -163
- data/vendor/cereal/include/cereal/archives/binary.hpp +0 -169
- data/vendor/cereal/include/cereal/archives/json.hpp +0 -1019
- data/vendor/cereal/include/cereal/archives/portable_binary.hpp +0 -334
- data/vendor/cereal/include/cereal/archives/xml.hpp +0 -956
- data/vendor/cereal/include/cereal/cereal.hpp +0 -1089
- data/vendor/cereal/include/cereal/details/helpers.hpp +0 -422
- data/vendor/cereal/include/cereal/details/polymorphic_impl.hpp +0 -796
- data/vendor/cereal/include/cereal/details/polymorphic_impl_fwd.hpp +0 -65
- data/vendor/cereal/include/cereal/details/static_object.hpp +0 -127
- data/vendor/cereal/include/cereal/details/traits.hpp +0 -1411
- data/vendor/cereal/include/cereal/details/util.hpp +0 -84
- data/vendor/cereal/include/cereal/external/base64.hpp +0 -134
- data/vendor/cereal/include/cereal/external/rapidjson/allocators.h +0 -284
- data/vendor/cereal/include/cereal/external/rapidjson/cursorstreamwrapper.h +0 -78
- data/vendor/cereal/include/cereal/external/rapidjson/document.h +0 -2652
- data/vendor/cereal/include/cereal/external/rapidjson/encodedstream.h +0 -299
- data/vendor/cereal/include/cereal/external/rapidjson/encodings.h +0 -716
- data/vendor/cereal/include/cereal/external/rapidjson/error/en.h +0 -74
- data/vendor/cereal/include/cereal/external/rapidjson/error/error.h +0 -161
- data/vendor/cereal/include/cereal/external/rapidjson/filereadstream.h +0 -99
- data/vendor/cereal/include/cereal/external/rapidjson/filewritestream.h +0 -104
- data/vendor/cereal/include/cereal/external/rapidjson/fwd.h +0 -151
- data/vendor/cereal/include/cereal/external/rapidjson/internal/biginteger.h +0 -290
- data/vendor/cereal/include/cereal/external/rapidjson/internal/diyfp.h +0 -271
- data/vendor/cereal/include/cereal/external/rapidjson/internal/dtoa.h +0 -245
- data/vendor/cereal/include/cereal/external/rapidjson/internal/ieee754.h +0 -78
- data/vendor/cereal/include/cereal/external/rapidjson/internal/itoa.h +0 -308
- data/vendor/cereal/include/cereal/external/rapidjson/internal/meta.h +0 -186
- data/vendor/cereal/include/cereal/external/rapidjson/internal/pow10.h +0 -55
- data/vendor/cereal/include/cereal/external/rapidjson/internal/regex.h +0 -740
- data/vendor/cereal/include/cereal/external/rapidjson/internal/stack.h +0 -232
- data/vendor/cereal/include/cereal/external/rapidjson/internal/strfunc.h +0 -69
- data/vendor/cereal/include/cereal/external/rapidjson/internal/strtod.h +0 -290
- data/vendor/cereal/include/cereal/external/rapidjson/internal/swap.h +0 -46
- data/vendor/cereal/include/cereal/external/rapidjson/istreamwrapper.h +0 -128
- data/vendor/cereal/include/cereal/external/rapidjson/memorybuffer.h +0 -70
- data/vendor/cereal/include/cereal/external/rapidjson/memorystream.h +0 -71
- data/vendor/cereal/include/cereal/external/rapidjson/msinttypes/inttypes.h +0 -316
- data/vendor/cereal/include/cereal/external/rapidjson/msinttypes/stdint.h +0 -300
- data/vendor/cereal/include/cereal/external/rapidjson/ostreamwrapper.h +0 -81
- data/vendor/cereal/include/cereal/external/rapidjson/pointer.h +0 -1414
- data/vendor/cereal/include/cereal/external/rapidjson/prettywriter.h +0 -277
- data/vendor/cereal/include/cereal/external/rapidjson/rapidjson.h +0 -656
- data/vendor/cereal/include/cereal/external/rapidjson/reader.h +0 -2230
- data/vendor/cereal/include/cereal/external/rapidjson/schema.h +0 -2497
- data/vendor/cereal/include/cereal/external/rapidjson/stream.h +0 -223
- data/vendor/cereal/include/cereal/external/rapidjson/stringbuffer.h +0 -121
- data/vendor/cereal/include/cereal/external/rapidjson/writer.h +0 -709
- data/vendor/cereal/include/cereal/external/rapidxml/license.txt +0 -52
- data/vendor/cereal/include/cereal/external/rapidxml/manual.html +0 -406
- data/vendor/cereal/include/cereal/external/rapidxml/rapidxml.hpp +0 -2624
- data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_iterators.hpp +0 -175
- data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_print.hpp +0 -428
- data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_utils.hpp +0 -123
- data/vendor/cereal/include/cereal/macros.hpp +0 -154
- data/vendor/cereal/include/cereal/specialize.hpp +0 -139
- data/vendor/cereal/include/cereal/types/array.hpp +0 -79
- data/vendor/cereal/include/cereal/types/atomic.hpp +0 -55
- data/vendor/cereal/include/cereal/types/base_class.hpp +0 -203
- data/vendor/cereal/include/cereal/types/bitset.hpp +0 -176
- data/vendor/cereal/include/cereal/types/boost_variant.hpp +0 -164
- data/vendor/cereal/include/cereal/types/chrono.hpp +0 -72
- data/vendor/cereal/include/cereal/types/common.hpp +0 -129
- data/vendor/cereal/include/cereal/types/complex.hpp +0 -56
- data/vendor/cereal/include/cereal/types/concepts/pair_associative_container.hpp +0 -73
- data/vendor/cereal/include/cereal/types/deque.hpp +0 -62
- data/vendor/cereal/include/cereal/types/forward_list.hpp +0 -68
- data/vendor/cereal/include/cereal/types/functional.hpp +0 -43
- data/vendor/cereal/include/cereal/types/list.hpp +0 -62
- data/vendor/cereal/include/cereal/types/map.hpp +0 -36
- data/vendor/cereal/include/cereal/types/memory.hpp +0 -425
- data/vendor/cereal/include/cereal/types/optional.hpp +0 -66
- data/vendor/cereal/include/cereal/types/polymorphic.hpp +0 -483
- data/vendor/cereal/include/cereal/types/queue.hpp +0 -132
- data/vendor/cereal/include/cereal/types/set.hpp +0 -103
- data/vendor/cereal/include/cereal/types/stack.hpp +0 -76
- data/vendor/cereal/include/cereal/types/string.hpp +0 -61
- data/vendor/cereal/include/cereal/types/tuple.hpp +0 -123
- data/vendor/cereal/include/cereal/types/unordered_map.hpp +0 -36
- data/vendor/cereal/include/cereal/types/unordered_set.hpp +0 -99
- data/vendor/cereal/include/cereal/types/utility.hpp +0 -47
- data/vendor/cereal/include/cereal/types/valarray.hpp +0 -89
- data/vendor/cereal/include/cereal/types/variant.hpp +0 -109
- data/vendor/cereal/include/cereal/types/vector.hpp +0 -112
- data/vendor/cereal/include/cereal/version.hpp +0 -52
- data/vendor/isotree/src/Makevars +0 -4
- data/vendor/isotree/src/crit.cpp +0 -912
- data/vendor/isotree/src/dist.cpp +0 -749
- data/vendor/isotree/src/extended.cpp +0 -790
- data/vendor/isotree/src/fit_model.cpp +0 -1090
- data/vendor/isotree/src/helpers_iforest.cpp +0 -324
- data/vendor/isotree/src/isoforest.cpp +0 -771
- data/vendor/isotree/src/mult.cpp +0 -607
- data/vendor/isotree/src/predict.cpp +0 -853
- data/vendor/isotree/src/utils.cpp +0 -1566
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* Isolation forests and variations thereof, with adjustments for incorporation
|
|
2
|
+
* of categorical variables and missing values.
|
|
3
|
+
* Writen for C++11 standard and aimed at being used in R and Python.
|
|
4
|
+
*
|
|
5
|
+
* This library is based on the following works:
|
|
6
|
+
* [1] Liu, Fei Tony, Kai Ming Ting, and Zhi-Hua Zhou.
|
|
7
|
+
* "Isolation forest."
|
|
8
|
+
* 2008 Eighth IEEE International Conference on Data Mining. IEEE, 2008.
|
|
9
|
+
* [2] Liu, Fei Tony, Kai Ming Ting, and Zhi-Hua Zhou.
|
|
10
|
+
* "Isolation-based anomaly detection."
|
|
11
|
+
* ACM Transactions on Knowledge Discovery from Data (TKDD) 6.1 (2012): 3.
|
|
12
|
+
* [3] Hariri, Sahand, Matias Carrasco Kind, and Robert J. Brunner.
|
|
13
|
+
* "Extended Isolation Forest."
|
|
14
|
+
* arXiv preprint arXiv:1811.02141 (2018).
|
|
15
|
+
* [4] Liu, Fei Tony, Kai Ming Ting, and Zhi-Hua Zhou.
|
|
16
|
+
* "On detecting clustered anomalies using SCiForest."
|
|
17
|
+
* Joint European Conference on Machine Learning and Knowledge Discovery in Databases. Springer, Berlin, Heidelberg, 2010.
|
|
18
|
+
* [5] https://sourceforge.net/projects/iforest/
|
|
19
|
+
* [6] https://math.stackexchange.com/questions/3388518/expected-number-of-paths-required-to-separate-elements-in-a-binary-tree
|
|
20
|
+
* [7] Quinlan, J. Ross. C4. 5: programs for machine learning. Elsevier, 2014.
|
|
21
|
+
* [8] Cortes, David.
|
|
22
|
+
* "Distance approximation using Isolation Forests."
|
|
23
|
+
* arXiv preprint arXiv:1910.12362 (2019).
|
|
24
|
+
* [9] Cortes, David.
|
|
25
|
+
* "Imputing missing values with unsupervised random trees."
|
|
26
|
+
* arXiv preprint arXiv:1911.06646 (2019).
|
|
27
|
+
* [10] https://math.stackexchange.com/questions/3333220/expected-average-depth-in-random-binary-tree-constructed-top-to-bottom
|
|
28
|
+
* [11] Cortes, David.
|
|
29
|
+
* "Revisiting randomized choices in isolation forests."
|
|
30
|
+
* arXiv preprint arXiv:2110.13402 (2021).
|
|
31
|
+
* [12] Guha, Sudipto, et al.
|
|
32
|
+
* "Robust random cut forest based anomaly detection on streams."
|
|
33
|
+
* International conference on machine learning. PMLR, 2016.
|
|
34
|
+
* [13] Cortes, David.
|
|
35
|
+
* "Isolation forests: looking beyond tree depth."
|
|
36
|
+
* arXiv preprint arXiv:2111.11639 (2021).
|
|
37
|
+
* [14] Ting, Kai Ming, Yue Zhu, and Zhi-Hua Zhou.
|
|
38
|
+
* "Isolation kernel and its effect on SVM"
|
|
39
|
+
* Proceedings of the 24th ACM SIGKDD
|
|
40
|
+
* International Conference on Knowledge Discovery & Data Mining. 2018.
|
|
41
|
+
*
|
|
42
|
+
* BSD 2-Clause License
|
|
43
|
+
* Copyright (c) 2019-2022, David Cortes
|
|
44
|
+
* All rights reserved.
|
|
45
|
+
* Redistribution and use in source and binary forms, with or without
|
|
46
|
+
* modification, are permitted provided that the following conditions are met:
|
|
47
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
|
48
|
+
* list of conditions and the following disclaimer.
|
|
49
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
50
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
51
|
+
* and/or other materials provided with the distribution.
|
|
52
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
53
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
54
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
55
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
56
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
57
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
58
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
59
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
60
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
61
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
62
|
+
*/
|
|
63
|
+
#include "isotree.hpp"
|
|
64
|
+
|
|
65
|
+
#define real_t double
|
|
66
|
+
#define sparse_ix int
|
|
67
|
+
#include "external_facing_generic.hpp"
|
|
68
|
+
#undef real_t
|
|
69
|
+
#undef sparse_ix
|
|
70
|
+
|
|
71
|
+
#define real_t double
|
|
72
|
+
#define sparse_ix int64_t
|
|
73
|
+
#include "external_facing_generic.hpp"
|
|
74
|
+
#undef real_t
|
|
75
|
+
#undef sparse_ix
|
|
76
|
+
|
|
77
|
+
#define real_t double
|
|
78
|
+
#define sparse_ix size_t
|
|
79
|
+
#include "external_facing_generic.hpp"
|
|
80
|
+
#undef real_t
|
|
81
|
+
#undef sparse_ix
|
|
82
|
+
|
|
83
|
+
#define real_t float
|
|
84
|
+
#define sparse_ix int
|
|
85
|
+
#include "external_facing_generic.hpp"
|
|
86
|
+
#undef real_t
|
|
87
|
+
#undef sparse_ix
|
|
88
|
+
|
|
89
|
+
#define real_t float
|
|
90
|
+
#define sparse_ix int64_t
|
|
91
|
+
#include "external_facing_generic.hpp"
|
|
92
|
+
#undef real_t
|
|
93
|
+
#undef sparse_ix
|
|
94
|
+
|
|
95
|
+
#define real_t float
|
|
96
|
+
#define sparse_ix size_t
|
|
97
|
+
#include "external_facing_generic.hpp"
|
|
98
|
+
#undef real_t
|
|
99
|
+
#undef sparse_ix
|
|
@@ -18,11 +18,29 @@
|
|
|
18
18
|
* [5] https://sourceforge.net/projects/iforest/
|
|
19
19
|
* [6] https://math.stackexchange.com/questions/3388518/expected-number-of-paths-required-to-separate-elements-in-a-binary-tree
|
|
20
20
|
* [7] Quinlan, J. Ross. C4. 5: programs for machine learning. Elsevier, 2014.
|
|
21
|
-
* [8] Cortes, David.
|
|
22
|
-
*
|
|
21
|
+
* [8] Cortes, David.
|
|
22
|
+
* "Distance approximation using Isolation Forests."
|
|
23
|
+
* arXiv preprint arXiv:1910.12362 (2019).
|
|
24
|
+
* [9] Cortes, David.
|
|
25
|
+
* "Imputing missing values with unsupervised random trees."
|
|
26
|
+
* arXiv preprint arXiv:1911.06646 (2019).
|
|
27
|
+
* [10] https://math.stackexchange.com/questions/3333220/expected-average-depth-in-random-binary-tree-constructed-top-to-bottom
|
|
28
|
+
* [11] Cortes, David.
|
|
29
|
+
* "Revisiting randomized choices in isolation forests."
|
|
30
|
+
* arXiv preprint arXiv:2110.13402 (2021).
|
|
31
|
+
* [12] Guha, Sudipto, et al.
|
|
32
|
+
* "Robust random cut forest based anomaly detection on streams."
|
|
33
|
+
* International conference on machine learning. PMLR, 2016.
|
|
34
|
+
* [13] Cortes, David.
|
|
35
|
+
* "Isolation forests: looking beyond tree depth."
|
|
36
|
+
* arXiv preprint arXiv:2111.11639 (2021).
|
|
37
|
+
* [14] Ting, Kai Ming, Yue Zhu, and Zhi-Hua Zhou.
|
|
38
|
+
* "Isolation kernel and its effect on SVM"
|
|
39
|
+
* Proceedings of the 24th ACM SIGKDD
|
|
40
|
+
* International Conference on Knowledge Discovery & Data Mining. 2018.
|
|
23
41
|
*
|
|
24
42
|
* BSD 2-Clause License
|
|
25
|
-
* Copyright (c)
|
|
43
|
+
* Copyright (c) 2019-2022, David Cortes
|
|
26
44
|
* All rights reserved.
|
|
27
45
|
* Redistribution and use in source and binary forms, with or without
|
|
28
46
|
* modification, are permitted provided that the following conditions are met:
|
|
@@ -94,23 +112,148 @@
|
|
|
94
112
|
* Hyperparameters related to imputation might differ between 'imputer' and 'iother' ('imputer' will preserve its
|
|
95
113
|
* hyperparameters after the merge).
|
|
96
114
|
* Pass NULL if this is not to be used.
|
|
115
|
+
* - indexer (in, out)
|
|
116
|
+
* Pointer to indexer object which has already been fit through 'fit_iforest' along with
|
|
117
|
+
* either 'model' or 'ext_model' in the same call to 'fit_iforest' or through another specialized function.
|
|
118
|
+
* The imputation nodes from 'ind_other' will be merged into this (will be at the end of vector member 'indices').
|
|
119
|
+
* Reference points should not differ between 'indexer' and 'ind_other'.
|
|
120
|
+
* Pass NULL if this is not to be used.
|
|
121
|
+
* - ind_other
|
|
122
|
+
* Pointer to indexer object which has already been fit through 'fit_iforest' along with
|
|
123
|
+
* either 'model' or 'ext_model' in the same call to 'fit_iforest' or through another specialized function.
|
|
124
|
+
* The imputation nodes from this object will be added into 'imputer' (this object will not be modified).
|
|
125
|
+
* Reference points should not differ between 'indexer' and 'ind_other'.
|
|
126
|
+
* Pass NULL if this is not to be used.
|
|
97
127
|
*/
|
|
98
128
|
void merge_models(IsoForest* model, IsoForest* other,
|
|
99
129
|
ExtIsoForest* ext_model, ExtIsoForest* ext_other,
|
|
100
|
-
Imputer* imputer, Imputer* iother
|
|
130
|
+
Imputer* imputer, Imputer* iother,
|
|
131
|
+
TreesIndexer* indexer, TreesIndexer* ind_other)
|
|
101
132
|
{
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
133
|
+
size_t curr_size_model = (model != NULL)? (model->trees.size()) : 0;
|
|
134
|
+
size_t curr_size_model_ext = (ext_model != NULL)? (ext_model->hplanes.size()) : 0;
|
|
135
|
+
size_t curr_size_imputer = (imputer != NULL)? (imputer->imputer_tree.size()) : 0;
|
|
136
|
+
size_t curr_size_indexer = (indexer != NULL)? (indexer->indices.size()) : 0;
|
|
137
|
+
|
|
138
|
+
if (imputer != NULL && iother == NULL)
|
|
139
|
+
throw std::runtime_error("Model to append trees to has imputer, but model to take trees from doesn't.\n");
|
|
140
|
+
if (indexer != NULL && ind_other == NULL)
|
|
141
|
+
throw std::runtime_error("Model to append trees to has indexer, but model to take trees from doesn't.\n");
|
|
142
|
+
if (indexer != NULL && ind_other != NULL)
|
|
143
|
+
{
|
|
144
|
+
bool indexer_is_empty = indexer->indices.empty();
|
|
145
|
+
bool ind_other_is_empty = ind_other->indices.empty();
|
|
146
|
+
bool model_is_empty = (model != NULL && model->trees.empty()) || (ext_model != NULL && ext_model->hplanes.empty());
|
|
147
|
+
bool other_is_empty = (other != NULL && other->trees.empty()) || (ext_model != NULL && ext_other->hplanes.empty());
|
|
148
|
+
|
|
149
|
+
if (indexer_is_empty && !model_is_empty && ind_other_is_empty && !other_is_empty) {
|
|
150
|
+
indexer = NULL;
|
|
151
|
+
ind_other = NULL;
|
|
152
|
+
goto skip_indexers;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (!model_is_empty && !indexer_is_empty && !other_is_empty && ind_other_is_empty)
|
|
156
|
+
throw std::runtime_error("Model to append trees to has indexer, but model to take trees from doesn't.\n");
|
|
157
|
+
if (!model_is_empty && indexer_is_empty && !other_is_empty && !ind_other_is_empty)
|
|
158
|
+
throw std::runtime_error("Model to take trees from has indexer, but model to append trees to doesn't.\n");
|
|
159
|
+
|
|
160
|
+
if (
|
|
161
|
+
!indexer_is_empty && !ind_other_is_empty &&
|
|
162
|
+
indexer->indices.front().reference_points.size() != ind_other->indices.front().reference_points.size()
|
|
163
|
+
) {
|
|
164
|
+
throw std::runtime_error("Model to append trees to and model to take trees from have different number of reference points.\n");
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
if (
|
|
169
|
+
!indexer_is_empty &&
|
|
170
|
+
!ind_other_is_empty &&
|
|
171
|
+
!indexer->indices.front().node_distances.empty() &&
|
|
172
|
+
ind_other->indices.front().node_distances.empty()
|
|
173
|
+
) {
|
|
174
|
+
throw std::runtime_error("Model to append trees to has indexer with distances, but model to take trees from has indexer without distances.\n");
|
|
175
|
+
}
|
|
176
|
+
if (
|
|
177
|
+
!indexer_is_empty &&
|
|
178
|
+
!ind_other_is_empty &&
|
|
179
|
+
!indexer->indices.front().reference_points.empty() &&
|
|
180
|
+
ind_other->indices.front().reference_points.empty()
|
|
181
|
+
) {
|
|
182
|
+
throw std::runtime_error("Model to append trees to has indexer with reference points, but model to take trees from has indexer without reference points.\n");
|
|
183
|
+
}
|
|
184
|
+
if (
|
|
185
|
+
!indexer_is_empty &&
|
|
186
|
+
!ind_other_is_empty &&
|
|
187
|
+
!indexer->indices.front().reference_indptr.empty() &&
|
|
188
|
+
ind_other->indices.front().reference_indptr.empty()
|
|
189
|
+
) {
|
|
190
|
+
throw std::runtime_error("Model to append trees to has indexer with kernel reference points, but model to take trees from has indexer without kernel reference points.\n");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
skip_indexers:
|
|
194
|
+
|
|
195
|
+
try
|
|
196
|
+
{
|
|
197
|
+
if (model != NULL && other != NULL)
|
|
198
|
+
{
|
|
199
|
+
if (model == other)
|
|
200
|
+
{
|
|
201
|
+
auto other_copy = *other;
|
|
202
|
+
merge_models(model, &other_copy, NULL, NULL, NULL, NULL, NULL, NULL);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
model->trees.insert(model->trees.end(),
|
|
206
|
+
other->trees.begin(),
|
|
207
|
+
other->trees.end());
|
|
208
|
+
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (ext_model != NULL && ext_other != NULL)
|
|
212
|
+
{
|
|
213
|
+
if (ext_model == ext_other)
|
|
214
|
+
{
|
|
215
|
+
auto other_copy = *ext_other;
|
|
216
|
+
merge_models(NULL, NULL, ext_model, &other_copy, NULL, NULL, NULL, NULL);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
ext_model->hplanes.insert(ext_model->hplanes.end(),
|
|
220
|
+
ext_other->hplanes.begin(),
|
|
221
|
+
ext_other->hplanes.end());
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (imputer != NULL && iother != NULL)
|
|
225
|
+
{
|
|
226
|
+
if (imputer == iother)
|
|
227
|
+
{
|
|
228
|
+
auto other_copy = *iother;
|
|
229
|
+
merge_models(NULL, NULL, NULL, NULL, imputer, &other_copy, NULL, NULL);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
imputer->imputer_tree.insert(imputer->imputer_tree.end(),
|
|
233
|
+
iother->imputer_tree.begin(),
|
|
234
|
+
iother->imputer_tree.end());
|
|
235
|
+
}
|
|
106
236
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
237
|
+
if (indexer != NULL && ind_other != NULL)
|
|
238
|
+
{
|
|
239
|
+
if (indexer == ind_other)
|
|
240
|
+
{
|
|
241
|
+
auto other_copy = *ind_other;
|
|
242
|
+
merge_models(NULL, NULL, NULL, NULL, NULL, NULL, indexer, &other_copy);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
indexer->indices.insert(indexer->indices.end(),
|
|
246
|
+
ind_other->indices.begin(),
|
|
247
|
+
ind_other->indices.end());
|
|
248
|
+
}
|
|
249
|
+
}
|
|
111
250
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
251
|
+
catch (...)
|
|
252
|
+
{
|
|
253
|
+
if (model != NULL) model->trees.resize(curr_size_model);
|
|
254
|
+
if (ext_model != NULL) ext_model->hplanes.resize(curr_size_model_ext);
|
|
255
|
+
if (imputer != NULL) imputer->imputer_tree.resize(curr_size_imputer);
|
|
256
|
+
if (indexer != NULL) indexer->indices.resize(curr_size_indexer);
|
|
257
|
+
throw;
|
|
258
|
+
}
|
|
116
259
|
}
|