IsoSpec
Loading...
Searching...
No Matches
misc.h
1/*
2 * Copyright (C) 2015-2020 Mateusz Łącki and Michał Startek.
3 *
4 * This file is part of IsoSpec.
5 *
6 * IsoSpec is free software: you can redistribute it and/or modify
7 * it under the terms of the Simplified ("2-clause") BSD licence.
8 *
9 * IsoSpec is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 *
13 * You should have received a copy of the Simplified BSD Licence
14 * along with IsoSpec. If not, see <https://opensource.org/licenses/BSD-2-Clause>.
15 */
16
17#pragma once
18
19#include <iostream>
20#include <vector>
21#include <cstring>
22#include <algorithm>
23#include "isoMath.h"
24#include "pod_vector.h"
25
26namespace IsoSpec
27{
28
29inline double combinedSum(
30 const int* conf, const std::vector<double>** valuesContainer, int dimNumber
31){
32 double res = 0.0;
33 for(int i = 0; i < dimNumber; i++)
34 res += (*(valuesContainer[i]))[conf[i]];
35 return res;
36}
37
38inline double combinedSum(
39 const int* conf, const pod_vector<double>** valuesContainer, int dimNumber
40){
41 double res = 0.0;
42 for(int i = 0; i < dimNumber; i++)
43 res += (*(valuesContainer[i]))[conf[i]];
44 return res;
45}
46
47inline int* getConf(void* conf)
48{
49 return reinterpret_cast<int*>(
50 reinterpret_cast<char*>(conf) + sizeof(double)
51 );
52}
53
54inline double getLProb(void* conf)
55{
56 double ret = *reinterpret_cast<double*>(conf);
57 return ret;
58}
59
60
61inline double unnormalized_logProb(const int* conf, const double* logProbs, int dim)
62{
63 double res = 0.0;
64
65 for(int i = 0; i < dim; i++)
66 res += minuslogFactorial(conf[i]) + conf[i] * logProbs[i];
67
68 return res;
69}
70
71inline double calc_mass(const int* conf, const double* masses, int dim)
72{
73 double res = 0.0;
74
75 for(int i = 0; i < dim; i++)
76 {
77 res += conf[i] * masses[i];
78 }
79
80 return res;
81}
82
83
84
85template<typename T> void printArray(const T* array, size_t size, const char* prefix = "")
86{
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;
92}
93
94template<typename T> void printVector(const std::vector<T>& vec)
95{
96 printArray<T>(vec.data(), vec.size());
97}
98
99template<typename T> void printVector(const pod_vector<T>& vec)
100{
101 printArray<T>(vec.data(), vec.size());
102}
103
104template<typename T> void printOffsets(const T** array, size_t size, const T* offset, const char* prefix = "")
105{
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;
111}
112
113template<typename T> void printNestedArray(const T** array, const int* shape, size_t size)
114{
115 for (size_t i = 0; i < size; i++)
116 printArray(array[i], shape[i]);
117 std::cout << std::endl;
118}
119
121void* quickselect(const void** array, size_t n, size_t start, size_t end);
122
123
124template <typename T> inline static T* array_copy(const T* A, size_t size)
125{
126 T* ret = new T[size];
127 memcpy(ret, A, size*sizeof(T));
128 return ret;
129}
130
131template <typename T> static T* array_copy_nptr(const T* A, size_t size)
132{
133 if(A == nullptr)
134 return nullptr;
135 return array_copy(A, size);
136}
137
138template<typename T> void dealloc_table(T* tbl, int dim)
139{
140 for(int i = 0; i < dim; i++)
141 {
142 delete tbl[i];
143 }
144 delete[] tbl;
145}
146
147template<typename T> void realloc_append(T** array, T what, size_t old_array_size)
148{
149 T* newT = new T[old_array_size+1];
150 memcpy(newT, *array, old_array_size*sizeof(T));
151 newT[old_array_size] = what;
152 delete[] *array;
153 *array = newT;
154}
155
156template<typename T> size_t* get_order(T* order_array, size_t N)
157{
158 size_t* arr = new size_t[N];
159 for(size_t ii = 0; ii < N; ii++)
160 arr[ii] = ii;
161
162 std::sort(arr, arr + N, [&](size_t i, size_t j) { return order_array[i] < order_array[j]; });
163
164 return arr;
165}
166
167template<typename T> size_t* get_inverse_order(T* order_array, size_t N)
168{
169 size_t* arr = new size_t[N];
170 for(size_t ii = 0; ii < N; ii++)
171 arr[ii] = ii;
172
173 std::sort(arr, arr + N, [&](size_t i, size_t j) { return order_array[i] > order_array[j]; });
174
175 return arr;
176}
177
178template<typename TA, typename TB> void impose_order(size_t* O, size_t N, TA* A, TB* B)
179{
180 for(size_t ii = 0; ii < N; ii++)
181 {
182 if(ii != O[ii])
183 {
184 size_t curr_ii = ii;
185 TA ta = A[ii];
186 TB tb = B[ii];
187 size_t next_ii = O[ii];
188 while(next_ii != ii)
189 {
190 A[curr_ii] = A[next_ii];
191 B[curr_ii] = B[next_ii];
192 O[curr_ii] = curr_ii;
193 curr_ii = next_ii;
194 next_ii = O[next_ii];
195 }
196 A[curr_ii] = ta;
197 B[curr_ii] = tb;
198 O[curr_ii] = curr_ii;
199 }
200 }
201}
202
203
204} // namespace IsoSpec