nodes_value_containers.hpp 8.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
/** @file feature_creation/node/value_storage/node_value_containers.hpp
 *  @brief Centeral storage area for all descriptor matrix data
 *
 *  This file contains definitions where all descriptor/feature data is stored permanently or in temporary storage arrays
 *  All Nodes's (except ModelNodes) value_ptr/test_value_ptrs point to data here.
 *
 *  @author Thomas A. R. Purcell (tpurcell)
 *  @bug No known bugs.
 */
10
11
#ifndef NODE_VALUE_ARR
#define NODE_VALUE_ARR
Thomas Purcell's avatar
Thomas Purcell committed
12

Thomas Purcell's avatar
Thomas Purcell committed
13
#include <algorithm>
Thomas Purcell's avatar
Thomas Purcell committed
14
#include <memory>
Thomas Purcell's avatar
Thomas Purcell committed
15
#include <numeric>
Thomas Purcell's avatar
Thomas Purcell committed
16
17
#include <vector>

18
19
#include <omp.h>

Thomas Purcell's avatar
Thomas Purcell committed
20
21
22
23
#include<utils/enum.hpp>

namespace node_value_arrs
{
24
25
26
27
    extern std::vector<double> TEMP_STORAGE_ARR; //!< Array to temporarily store feature training data
    extern std::vector<double> VALUES_ARR; //!< Training data of the stored features
    extern std::vector<double> TEMP_STORAGE_TEST_ARR; //!< Array to temporarily store feature test data
    extern std::vector<double> TEST_VALUES_ARR; //!< Value of the stored features test data
Thomas Purcell's avatar
Thomas Purcell committed
28
    extern std::vector<double> D_MATRIX; //!< The descriptor matrix
29
30
    extern std::vector<int> TEMP_STORAGE_REG; //!< Register to see which feature is stored in each slot for the training data
    extern std::vector<int> TEMP_STORAGE_TEST_REG; //!< Register to see which feature is stored in each slot for the test data
Thomas Purcell's avatar
Thomas Purcell committed
31

Thomas Purcell's avatar
Thomas Purcell committed
32
33
34
    extern std::vector<int> TASK_SZ_TRAIN; //!< Number of training samples per task
    extern std::vector<int> TASK_SZ_TEST; //!< Number of test sample per task

35
    extern int N_SELECTED; //!< Number of features selected
36
37
    extern int N_SAMPLES; //!< Number of training samples for each feature
    extern int N_SAMPLES_TEST; //!< Number of test samples for each feature
Thomas Purcell's avatar
Thomas Purcell committed
38
    extern unsigned long int N_STORE_FEATURES; //!< Number of features with stored values
Thomas Purcell's avatar
Thomas Purcell committed
39
    extern int N_RUNGS_STORED; //!< Number of rungs with values stored
40
    extern int MAX_N_THREADS; //!< Get the maximum number of threads possible
Thomas Purcell's avatar
Thomas Purcell committed
41
42
    extern unsigned long int NEXT_IND; //!< The next array index to use

Thomas Purcell's avatar
Thomas Purcell committed
43
    /**
44
45
     * @brief Initialize the node value arrays
     * @details Using the size of the initial feature space constructor the storage arrays
Thomas Purcell's avatar
Thomas Purcell committed
46
     *
47
48
49
     * @param n_samples Number of training samples for each feature
     * @param n_samples_test Number of test samples for each feature
     * @param n_primary_feat Number of primary features
Thomas Purcell's avatar
Thomas Purcell committed
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
     * @param set_test_task_sz If True reset the task_sz vectors
     */
    void initialize_values_arr(int n_samples, int n_samples_test, int n_primary_feat, bool et_task_sz);

    /**
     * @brief Initialize the node value arrays
     * @details Using the size of the initial feature space constructor the storage arrays
     *
     * @param n_samples Number of training samples for each feature
     * @param n_samples_test Number of test samples for each feature
     * @param n_primary_feat Number of primary features
     */
    inline void initialize_values_arr(int n_samples, int n_samples_test, int n_primary_feat)
    {
        initialize_values_arr(n_samples, n_samples_test, n_primary_feat, true);
    }

    /**
     * @brief Initialize the node value arrays
     * @details Using the size of the initial feature space constructor the storage arrays
     *
     * @param task_sz_train Number of training samples per task
     * @param task_sz_test Number of test sample per task
     * @param n_primary_feat Number of primary features
Thomas Purcell's avatar
Thomas Purcell committed
74
     */
Thomas Purcell's avatar
Thomas Purcell committed
75
    void initialize_values_arr(std::vector<int> task_sz_train, std::vector<int> task_sz_test, int n_primary_feat);
Thomas Purcell's avatar
Thomas Purcell committed
76
77

    /**
78
79
     * @brief Resize the node value arrays
     * @details Using the updated number of features increase the size of the storage arrays
Thomas Purcell's avatar
Thomas Purcell committed
80
81
82
83
84
     *
     * @param n_dims Number of dimensions to store
     * @param n_feat number of features to store
     * @param use_temp If true keep the temporary_storage
     */
Thomas Purcell's avatar
Thomas Purcell committed
85
    void resize_values_arr(int n_dims, unsigned long int n_feat, bool use_temp);
Thomas Purcell's avatar
Thomas Purcell committed
86

87
    /**
88
89
     * @brief Initialize the descriptor matrix
     * @details Initialize an empty descriptor matrix
90
91
92
93
94
     *
     */
    void initialize_d_matrix_arr();

    /**
95
96
     * @brief Resize the descriptor matrix
     * @details Using the number of newly selected features increase the size of the descriptor matrix
97
98
99
100
101
     *
     * @param n_select Number of features to select
     */
    void resize_d_matrix_arr(int n_select);

Thomas Purcell's avatar
Thomas Purcell committed
102
103
104
105
106
107
108
109
110
111
112
113
114
115
    /**
     * @brief Reset the global TASK_SZ_TRAIN vector
     *
     * @param task_sz_train the new task_sz train
     */
    void set_task_sz_train(std::vector<int> task_sz_train);

    /**
     * @brief Reset the global TASK_SZ_TEST vector
     *
     * @param task_sz_train the new test_sz train
     */
    void set_task_sz_test(std::vector<int> task_sz_test);

Thomas Purcell's avatar
Thomas Purcell committed
116
    /**
117
     * @brief Get a reference slot/feature register of the training data
Thomas Purcell's avatar
Thomas Purcell committed
118
     *
119
     * @param ind The Node's arr_ind
120
     * @param offset(int) Offset integer for TEMP_STORE_ARRAY
Thomas Purcell's avatar
Thomas Purcell committed
121
122
123
     *
     * @return The register element for a given feature index and offset
     */
124
    inline int& temp_storage_reg(unsigned long int ind, int offset = 0){return TEMP_STORAGE_REG[(ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * 3 + 1)];}
Thomas Purcell's avatar
Thomas Purcell committed
125

126
    /**
127
     * @brief Get a reference slot/feature register of the test data
128
     *
129
     * @param ind The Node's arr_ind
130
     * @param offset(int) Offset integer for TEMP_STORE_TEST_ARRAY
131
132
133
     *
     * @return The register element for a given feature index and offset
     */
134
    inline int& temp_storage_test_reg(unsigned long int ind, int offset = 0){return TEMP_STORAGE_TEST_REG[(ind % N_STORE_FEATURES) + (offset % 3) * N_STORE_FEATURES + omp_get_thread_num() * (N_STORE_FEATURES * 3 + 1)];}
135

Thomas Purcell's avatar
Thomas Purcell committed
136
    /**
137
     * @brief Access element of the permanent training data storage array
Thomas Purcell's avatar
Thomas Purcell committed
138
     *
139
     * @param feature_ind The _arr_ind of Node to get the training data of
Thomas Purcell's avatar
Thomas Purcell committed
140
     *
141
     * @return pointer to the Node's training data
Thomas Purcell's avatar
Thomas Purcell committed
142
     */
143
    inline double* access_value_arr(unsigned long int feature_ind){return VALUES_ARR.data() + feature_ind*N_SAMPLES;}
144

145
    /**
146
     * @brief Access element of the permanent test data storage array
147
     *
148
     * @param feature_ind The _arr_ind of Node to get the test data of
149
     *
150
     * @return pointer to the Node's test data
151
     */
152
    inline double* access_test_value_arr(unsigned long int feature_ind){return TEST_VALUES_ARR.data() + feature_ind*N_SAMPLES_TEST;}
153

Thomas Purcell's avatar
Thomas Purcell committed
154
    /**
155
     * @brief Access element of temporary storage array for the training data
Thomas Purcell's avatar
Thomas Purcell committed
156
     *
157
     * @param slot The slot of the temporary storage array
Thomas Purcell's avatar
Thomas Purcell committed
158
     *
159
     * @return pointer to the data stored in the specified slot
Thomas Purcell's avatar
Thomas Purcell committed
160
     */
161
    inline double* access_temp_storage(unsigned long int slot){return TEMP_STORAGE_ARR.data() + slot*N_SAMPLES;}
162

163
    /**
164
     * @brief Access element of temporary storage array for the test data
165
     *
166
     * @param slot The slot of the temporary storage array
167
     *
168
     * @return pointer to the data stored in the specified slot
169
     */
170
    inline double* access_temp_storage_test(unsigned long int slot){return TEMP_STORAGE_TEST_ARR.data() + slot*N_SAMPLES_TEST;}
171

Thomas Purcell's avatar
Thomas Purcell committed
172
    /**
173
     * @brief Get a Node's value_ptr
Thomas Purcell's avatar
Thomas Purcell committed
174
     *
175
176
     * @param arr_ind Nodes _arr_ind
     * @param feat_ind Nodes _feat_ind
177
     * @param offset(int) the offset for temporary storage access
Thomas Purcell's avatar
Thomas Purcell committed
178
179
180
     *
     * @return The value pointer
     */
181
    double* get_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int offset = 0);
Thomas Purcell's avatar
Thomas Purcell committed
182

183
    /**
184
     * @brief Get a Node's test_value_ptr
185
     *
186
187
     * @param arr_ind Nodes _arr_ind
     * @param feat_ind Nodes _feat_ind
188
     * @param offset(int) the offset for temporary storage access
189
190
191
     *
     * @return The value pointer
     */
192
    double* get_test_value_ptr(unsigned long int arr_ind, unsigned long int feat_ind, int offset = 0);
193

194
    /**
195
     * @brief Get the pointer to a particular selected Node from sis
196
     *
197
     * @param ind Index of the data in the descriptor matrix
198
     * @return The pointer to the descriptor matrix's data
199
     */
200
    inline double* get_d_matrix_ptr(int ind)
Thomas Purcell's avatar
Thomas Purcell committed
201
    {
202
        return D_MATRIX.data() + ind * N_SAMPLES;
Thomas Purcell's avatar
Thomas Purcell committed
203
    }
Thomas Purcell's avatar
Bug Fix    
Thomas Purcell committed
204

205
206
207
208
    /**
     * @brief Flush the temporary storage register (training data)
     * @details Reset all slots in the register to -1
     */
Thomas Purcell's avatar
Bug Fix    
Thomas Purcell committed
209
    inline void clear_temp_reg(){std::fill_n(TEMP_STORAGE_REG.data(), TEMP_STORAGE_REG.size(), -1);}
210

211
212
213
214
215
216
    /**
     * @brief Flush the temporary storage register (training data)
     * @details Reset all slots in the register to -1
     */
    inline void clear_temp_reg_thread(){std::fill_n(TEMP_STORAGE_REG.data() + N_STORE_FEATURES * 3 * omp_get_thread_num(), N_STORE_FEATURES * 3, -1);}

217
218
219
220
    /**
     * @brief Flush the temporary storage register (test data)
     * @details Reset all slots in the register to -1
     */
Thomas Purcell's avatar
Bug Fix    
Thomas Purcell committed
221
    inline void clear_temp_test_reg(){std::fill_n(TEMP_STORAGE_TEST_REG.data(), TEMP_STORAGE_TEST_REG.size(), -1);}
222

Thomas Purcell's avatar
Thomas Purcell committed
223
224
}

225
#endif