24#include "pod_vector.h"
29inline double combinedSum(
30 const int* conf,
const std::vector<double>** valuesContainer,
int dimNumber
33 for(
int i = 0; i < dimNumber; i++)
34 res += (*(valuesContainer[i]))[conf[i]];
38inline double combinedSum(
39 const int* conf,
const pod_vector<double>** valuesContainer,
int dimNumber
42 for(
int i = 0; i < dimNumber; i++)
43 res += (*(valuesContainer[i]))[conf[i]];
47inline int* getConf(
void* conf)
49 return reinterpret_cast<int*
>(
50 reinterpret_cast<char*
>(conf) +
sizeof(double)
54inline double getLProb(
void* conf)
56 double ret = *
reinterpret_cast<double*
>(conf);
61inline double unnormalized_logProb(
const int* conf,
const double* logProbs,
int dim)
65 for(
int i = 0; i < dim; i++)
66 res += minuslogFactorial(conf[i]) + conf[i] * logProbs[i];
71inline double calc_mass(
const int* conf,
const double* masses,
int dim)
75 for(
int i = 0; i < dim; i++)
77 res += conf[i] * masses[i];
85template<
typename T>
void printArray(
const T* array,
size_t size,
const char* prefix =
"")
87 if (strlen(prefix) > 0)
88 std::cout << prefix <<
" ";
89 for (
size_t i = 0; i < size; i++)
90 std::cout << array[i] <<
" ";
91 std::cout << std::endl;
94template<
typename T>
void printVector(
const std::vector<T>& vec)
96 printArray<T>(vec.data(), vec.size());
99template<
typename T>
void printVector(
const pod_vector<T>& vec)
101 printArray<T>(vec.data(), vec.size());
104template<
typename T>
void printOffsets(
const T** array,
size_t size,
const T* offset,
const char* prefix =
"")
106 if (strlen(prefix) > 0)
107 std::cout << prefix <<
" ";
108 for (
size_t i = 0; i < size; i++)
109 std::cout << array[i] - offset <<
" ";
110 std::cout << std::endl;
113template<
typename T>
void printNestedArray(
const T** array,
const int* shape,
size_t size)
115 for (
size_t i = 0; i < size; i++)
116 printArray(array[i], shape[i]);
117 std::cout << std::endl;
121void* quickselect(
const void** array,
size_t n,
size_t start,
size_t end);
124template <
typename T>
inline static T* array_copy(
const T* A,
size_t size)
126 T* ret =
new T[size];
127 memcpy(ret, A, size*
sizeof(T));
131template <
typename T>
static T* array_copy_nptr(
const T* A,
size_t size)
135 return array_copy(A, size);
138template<
typename T>
void dealloc_table(T* tbl,
int dim)
140 for(
int i = 0; i < dim; i++)
147template<
typename T>
void realloc_append(T** array, T what,
size_t old_array_size)
149 T* newT =
new T[old_array_size+1];
150 memcpy(newT, *array, old_array_size*
sizeof(T));
151 newT[old_array_size] = what;
156template<
typename T>
size_t* get_order(T* order_array,
size_t N)
158 size_t* arr =
new size_t[N];
159 for(
size_t ii = 0; ii < N; ii++)
162 std::sort(arr, arr + N, [&](
size_t i,
size_t j) {
return order_array[i] < order_array[j]; });
167template<
typename T>
size_t* get_inverse_order(T* order_array,
size_t N)
169 size_t* arr =
new size_t[N];
170 for(
size_t ii = 0; ii < N; ii++)
173 std::sort(arr, arr + N, [&](
size_t i,
size_t j) {
return order_array[i] > order_array[j]; });
178template<
typename TA,
typename TB>
void impose_order(
size_t* O,
size_t N, TA* A, TB* B)
180 for(
size_t ii = 0; ii < N; ii++)
187 size_t next_ii = O[ii];
190 A[curr_ii] = A[next_ii];
191 B[curr_ii] = B[next_ii];
192 O[curr_ii] = curr_ii;
194 next_ii = O[next_ii];
198 O[curr_ii] = curr_ii;