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