1 /*
2 * Boltzmann Sampling wrappers
3 *
4 * Ronny Lorenz
5 * ViennaRNA Package
6 */
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15
16 #include "ViennaRNA/utils/basic.h"
17 #include "ViennaRNA/boltzmann_sampling.h"
18
19
20 /*
21 #################################
22 # PREPROCESSOR DEFININTIONS #
23 #################################
24 */
25
26 struct structure_list {
27 unsigned int num;
28 char **list;
29 };
30
31
32 /*
33 #################################
34 # GLOBAL VARIABLES #
35 #################################
36 */
37
38 /*
39 #################################
40 # PRIVATE VARIABLES #
41 #################################
42 */
43
44 /*
45 #################################
46 # PRIVATE FUNCTION DECLARATIONS #
47 #################################
48 */
49
50 PRIVATE void
51 store_sample_list(const char *structure,
52 void *data);
53
54
55 PRIVATE void
56 store_sample(const char *structure,
57 void *data);
58
59
60 /*
61 #################################
62 # BEGIN OF FUNCTION DEFINITIONS #
63 #################################
64 */
65 PUBLIC char *
vrna_pbacktrack5(vrna_fold_compound_t * fc,unsigned int length)66 vrna_pbacktrack5(vrna_fold_compound_t *fc,
67 unsigned int length)
68 {
69 char *structure = NULL;
70 unsigned int i;
71
72 i = vrna_pbacktrack5_cb(fc,
73 1,
74 length,
75 &store_sample,
76 (void *)&structure,
77 VRNA_PBACKTRACK_DEFAULT);
78
79 if (i)
80 return structure;
81
82 free(structure);
83
84 return NULL;
85 }
86
87
88 PUBLIC char **
vrna_pbacktrack5_num(vrna_fold_compound_t * fc,unsigned int num_samples,unsigned int length,unsigned int options)89 vrna_pbacktrack5_num(vrna_fold_compound_t *fc,
90 unsigned int num_samples,
91 unsigned int length,
92 unsigned int options)
93 {
94 unsigned int i;
95 struct structure_list data;
96
97 data.num = 0;
98 data.list = (char **)vrna_alloc(sizeof(char *) * num_samples);
99 data.list[0] = NULL;
100
101 i = vrna_pbacktrack5_cb(fc,
102 num_samples,
103 length,
104 &store_sample_list,
105 (void *)&data,
106 options);
107
108 if (i > 0) {
109 /* re-allocate memory */
110 data.list = (char **)vrna_realloc(data.list, sizeof(char *) * (data.num + 1));
111 data.list[data.num] = NULL;
112 } else {
113 free(data.list);
114 return NULL;
115 }
116
117 return data.list;
118 }
119
120
121 PUBLIC unsigned int
vrna_pbacktrack5_cb(vrna_fold_compound_t * fc,unsigned int num_samples,unsigned int length,vrna_boltzmann_sampling_callback * bs_cb,void * data,unsigned int options)122 vrna_pbacktrack5_cb(vrna_fold_compound_t *fc,
123 unsigned int num_samples,
124 unsigned int length,
125 vrna_boltzmann_sampling_callback *bs_cb,
126 void *data,
127 unsigned int options)
128 {
129 unsigned int i;
130 vrna_pbacktrack_mem_t nr_mem = NULL;
131
132 i = vrna_pbacktrack5_resume_cb(fc,
133 num_samples,
134 length,
135 bs_cb,
136 data,
137 &nr_mem,
138 options);
139
140 vrna_pbacktrack_mem_free(nr_mem);
141
142 return i;
143 }
144
145
146 /*
147 * stochastic backtracking in pf_fold arrays
148 * returns random structure S with Boltzman probabilty
149 * p(S) = exp(-E(S)/kT)/Z
150 */
151 PUBLIC char *
vrna_pbacktrack(vrna_fold_compound_t * fc)152 vrna_pbacktrack(vrna_fold_compound_t *fc)
153 {
154 if (fc)
155 return vrna_pbacktrack5(fc, fc->length);
156
157 return NULL;
158 }
159
160
161 PUBLIC char **
vrna_pbacktrack_num(vrna_fold_compound_t * fc,unsigned int num_samples,unsigned int options)162 vrna_pbacktrack_num(vrna_fold_compound_t *fc,
163 unsigned int num_samples,
164 unsigned int options)
165 {
166 if (fc) {
167 return vrna_pbacktrack5_num(fc,
168 num_samples,
169 fc->length,
170 options);
171 }
172
173 return NULL;
174 }
175
176
177 PUBLIC unsigned int
vrna_pbacktrack_cb(vrna_fold_compound_t * fc,unsigned int num_samples,vrna_boltzmann_sampling_callback * bs_cb,void * data,unsigned int options)178 vrna_pbacktrack_cb(vrna_fold_compound_t *fc,
179 unsigned int num_samples,
180 vrna_boltzmann_sampling_callback *bs_cb,
181 void *data,
182 unsigned int options)
183 {
184 if (fc) {
185 return vrna_pbacktrack5_cb(fc,
186 num_samples,
187 fc->length,
188 bs_cb,
189 data,
190 options);
191 }
192
193 return 0;
194 }
195
196
197 PUBLIC char **
vrna_pbacktrack5_resume(vrna_fold_compound_t * vc,unsigned int num_samples,unsigned int length,vrna_pbacktrack_mem_t * nr_mem,unsigned int options)198 vrna_pbacktrack5_resume(vrna_fold_compound_t *vc,
199 unsigned int num_samples,
200 unsigned int length,
201 vrna_pbacktrack_mem_t *nr_mem,
202 unsigned int options)
203 {
204 unsigned int i;
205 struct structure_list data;
206
207 if (vc) {
208 data.num = 0;
209 data.list = (char **)vrna_alloc(sizeof(char *) * num_samples);
210 data.list[0] = NULL;
211
212 i = vrna_pbacktrack5_resume_cb(vc,
213 num_samples,
214 length,
215 &store_sample_list,
216 (void *)&data,
217 nr_mem,
218 options);
219
220 if (i > 0) {
221 /* re-allocate memory */
222 data.list = (char **)vrna_realloc(data.list, sizeof(char *) * (data.num + 1));
223 data.list[data.num] = NULL;
224 } else {
225 free(data.list);
226 return NULL;
227 }
228
229 return data.list;
230 }
231
232 return NULL;
233 }
234
235
236 PUBLIC char **
vrna_pbacktrack_resume(vrna_fold_compound_t * fc,unsigned int num_samples,vrna_pbacktrack_mem_t * nr_mem,unsigned int options)237 vrna_pbacktrack_resume(vrna_fold_compound_t *fc,
238 unsigned int num_samples,
239 vrna_pbacktrack_mem_t *nr_mem,
240 unsigned int options)
241 {
242 if (fc) {
243 return vrna_pbacktrack5_resume(fc,
244 num_samples,
245 fc->length,
246 nr_mem,
247 options);
248 }
249
250 return NULL;
251 }
252
253
254 PUBLIC unsigned int
vrna_pbacktrack_resume_cb(vrna_fold_compound_t * fc,unsigned int num_samples,vrna_boltzmann_sampling_callback * bs_cb,void * data,vrna_pbacktrack_mem_t * nr_mem,unsigned int options)255 vrna_pbacktrack_resume_cb(vrna_fold_compound_t *fc,
256 unsigned int num_samples,
257 vrna_boltzmann_sampling_callback *bs_cb,
258 void *data,
259 vrna_pbacktrack_mem_t *nr_mem,
260 unsigned int options)
261 {
262 if (fc) {
263 return vrna_pbacktrack5_resume_cb(fc,
264 num_samples,
265 fc->length,
266 bs_cb,
267 data,
268 nr_mem,
269 options);
270 }
271
272 return 0;
273 }
274
275
276 /*
277 #####################################
278 # BEGIN OF STATIC HELPER FUNCTIONS #
279 #####################################
280 */
281 PRIVATE void
store_sample_list(const char * structure,void * data)282 store_sample_list(const char *structure,
283 void *data)
284 {
285 struct structure_list *d = (struct structure_list *)data;
286
287 if (structure)
288 d->list[d->num++] = strdup(structure);
289 else
290 d->list[d->num++] = NULL;
291 }
292
293
294 PRIVATE void
store_sample(const char * structure,void * data)295 store_sample(const char *structure,
296 void *data)
297 {
298 char **s = (char **)data;
299
300 if (structure)
301 *s = strdup(structure);
302 else
303 *s = NULL;
304 }
305