24 #include "pod_vector.h"
29 inline 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]];
38 inline double combinedSum(
42 for(
int i = 0; i < dimNumber; i++)
43 res += (*(valuesContainer[i]))[conf[i]];
47 inline int* getConf(
void* conf)
49 return reinterpret_cast<int*
>(
50 reinterpret_cast<char*
>(conf) +
sizeof(
double)
54 inline double getLProb(
void* conf)
56 double ret = *
reinterpret_cast<double*
>(conf);
61 inline 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];
71 inline 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];
85 template<
typename T>
void printArray(
const T* array,
int size,
const char* prefix =
"")
87 if (strlen(prefix) > 0)
88 std::cout << prefix <<
" ";
89 for (
int i = 0; i < size; i++)
90 std::cout << array[i] <<
" ";
91 std::cout << std::endl;
94 template<
typename T>
void printVector(
const std::vector<T>& vec)
96 printArray<T>(vec.data(), vec.size());
99 template<
typename T>
void printOffsets(
const T** array,
int size,
const T* offset,
const char* prefix =
"")
101 if (strlen(prefix) > 0)
102 std::cout << prefix <<
" ";
103 for (
int i = 0; i < size; i++)
104 std::cout << array[i] - offset <<
" ";
105 std::cout << std::endl;
108 template<
typename T>
void printNestedArray(
const T** array,
const int* shape,
int size)
110 for (
int i = 0; i < size; i++)
111 printArray(array[i], shape[i]);
112 std::cout << std::endl;
116 void* quickselect(
const void** array,
int n,
int start,
int end);
119 template <
typename T>
inline static T* array_copy(
const T* A,
int size)
121 T* ret =
new T[size];
122 memcpy(ret, A, size*
sizeof(T));
126 template <
typename T>
static T* array_copy_nptr(
const T* A,
int size)
130 return array_copy(A, size);
133 template<
typename T>
void dealloc_table(T* tbl,
int dim)
135 for(
int i = 0; i < dim; i++)
142 template<
typename T>
void realloc_append(T** array, T what,
size_t old_array_size)
144 T* newT =
new T[old_array_size+1];
145 memcpy(newT, *array, old_array_size*
sizeof(T));
146 newT[old_array_size] = what;
151 template<
typename T>
size_t* get_order(T* order_array,
size_t N)
153 size_t* arr =
new size_t[N];
154 for(
size_t ii = 0; ii < N; ii++)
157 std::sort(arr, arr + N, [&](
int i,
int j) {
return order_array[i] < order_array[j]; });
162 template<
typename T>
size_t* get_inverse_order(T* order_array,
size_t N)
164 size_t* arr =
new size_t[N];
165 for(
size_t ii = 0; ii < N; ii++)
168 std::sort(arr, arr + N, [&](
int i,
int j) {
return order_array[i] > order_array[j]; });
173 template<
typename TA,
typename TB>
void impose_order(
size_t* O,
size_t N, TA* A, TB* B)
175 for(
size_t ii = 0; ii < N; ii++)
182 size_t next_ii = O[ii];
185 A[curr_ii] = A[next_ii];
186 B[curr_ii] = B[next_ii];
187 O[curr_ii] = curr_ii;
189 next_ii = O[next_ii];
193 O[curr_ii] = curr_ii;