156 {
157 SCANNED_ARG *s_arg;
159 long i, j, alldone = 0, ready, tree_ID;
160 char *inputFile = NULL, *outputFile = NULL;
162 char **badBase = NULL, **goodBase = NULL, **failedTree = NULL;
163 long badBases = 0, goodBases = 0, failedTrees = 0, i_arg, tmpfile_used = 0, compute = 0;
164 unsigned long pipeFlags = 0;
165
166 argc =
scanargs(&s_arg, argc, argv);
167 if (argc < 3) {
168 fprintf(stderr, "Error: Insufficient arguments provided.\n\n%s", USAGE);
169 exit(EXIT_FAILURE);
170 }
171
172 for (i_arg = 1; i_arg < argc; i_arg++) {
173 if (s_arg[i_arg].arg_type == OPTION) {
175 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
176 case CLO_GOOD_ELEMENTS:
177 goodBases = s_arg[i_arg].n_items - 1;
178 goodBase = malloc(sizeof(*goodBase) * goodBases);
179 if (!goodBase) {
180 fprintf(stderr, "Error: Memory allocation failed for goodBase.\n");
181 exit(EXIT_FAILURE);
182 }
183 for (i = 0; i < goodBases; i++)
184 goodBase[i] = s_arg[i_arg].list[i + 1];
185 break;
186 case CLO_BAD_ELEMENTS:
187 badBases = s_arg[i_arg].n_items - 1;
188 badBase = malloc(sizeof(*badBase) * badBases);
189 if (!badBase) {
190 fprintf(stderr, "Error: Memory allocation failed for badBase.\n");
191 exit(EXIT_FAILURE);
192 }
193 for (i = 0; i < badBases; i++)
194 badBase[i] = s_arg[i_arg].list[i + 1];
195 break;
196 case CLO_FAILED_SUB_TREES:
197 failedTrees = s_arg[i_arg].n_items - 1;
198 failedTree = malloc(sizeof(*failedTree) * failedTrees);
199 if (!failedTree) {
200 fprintf(stderr, "Error: Memory allocation failed for failedTree.\n");
201 exit(EXIT_FAILURE);
202 }
203 for (i = 0; i < failedTrees; i++)
204 failedTree[i] = s_arg[i_arg].list[i + 1];
205 break;
206 case CLO_PIPE:
207 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags)) {
208 fprintf(stderr, "Error: Invalid -pipe syntax.\n");
209 exit(EXIT_FAILURE);
210 }
211 break;
212 case CLO_VERBOSE:
213 verbose = 1;
214 break;
215 default:
216 fprintf(stderr, "Unknown option: %s\n", s_arg[i_arg].list[0]);
217 exit(EXIT_FAILURE);
218 }
219 } else {
220 if (!inputFile)
221 inputFile = s_arg[i_arg].list[0];
222 else if (!outputFile)
223 outputFile = s_arg[i_arg].list[0];
224 else {
225 fprintf(stderr, "Error: Too many filenames provided (%s).\n", s_arg[i_arg].list[0]);
226 exit(EXIT_FAILURE);
227 }
228 }
229 }
230
231 processFilenames(
"convert_to_bdd", &inputFile, &outputFile, pipeFlags, 1, &tmpfile_used);
232
233 load_data_base(inputFile);
234 locate_tree_id();
235
236 if (goodBases) {
237 for (i = 0; i < goodBases; i++) {
238 for (j = 0; j < bases; j++) {
239 if (strcmp(goodBase[i], base[j]->label) == 0) {
240 base[j]->probability = 0.0;
241 break;
242 }
243 }
244 }
245 free(goodBase);
246 }
247
248 if (badBases) {
249 for (i = 0; i < badBases; i++) {
250 for (j = 0; j < bases; j++) {
251 if (strcmp(badBase[i], base[j]->label) == 0) {
252 base[j]->probability = 1.0;
253 break;
254 }
255 }
256 }
257 free(badBase);
258 }
259
260 SetupOutputFile(outputFile, &outData);
261
262 for (i = 0; i < sub_trees; i++) {
263 compute = 0;
264 if (sub_tree[i].all_base) {
265 if (verbose) {
266 fprintf(stdout, "\nSub-tree Name: %s, ID: %d, ITE Structure:\n", sub_tree[i].tree_name, sub_tree[i].ID);
267 print_sub_tree(sub_tree[i].CAL_ITE);
268 }
269 if (failedTrees) {
270 for (j = 0; j < failedTrees; j++) {
271 if (strcmp(sub_tree[i].tree_name, failedTree[j]) == 0) {
272 compute = 1;
273 break;
274 }
275 }
276 } else {
277 compute = 1;
278 }
279 if (compute)
280 compute_sub_tree_ps(sub_tree[i].CAL_ITE, &outData, i);
281 }
282 }
283
284 while (1) {
285 alldone = 1;
286 for (i = 0; i < sub_trees; i++) {
287 if (sub_tree[i].calculated)
288 continue;
289 else {
290 alldone = 0;
291 ready = 1;
292 for (j = 0; j < sub_tree[i].ites; j++) {
293 tree_ID = sub_tree[i].tree_ID[j];
294 if (tree_ID >= 0 && sub_tree[tree_ID].calculated == 0) {
295 ready = 0;
296 break;
297 }
298 }
299 if (ready) {
300 if (sub_tree[i].ites == 1)
301 sub_tree[i].CAL_ITE = sub_tree[i].ite_ptr[0];
302 else {
303 if (sub_tree[i].ite_ptr[0]->base && is_base(sub_tree[i].ite_ptr[0]))
304 ite1 = sub_tree[i].ite_ptr[0];
305 else
306 ite1 = sub_tree[sub_tree[i].tree_ID[0]].CAL_ITE;
307
308 if (sub_tree[i].ite_ptr[1]->base && is_base(sub_tree[i].ite_ptr[1]))
309 ite2 = sub_tree[i].ite_ptr[1];
310 else
311 ite2 = sub_tree[sub_tree[i].tree_ID[1]].CAL_ITE;
312
313 sub_tree[i].CAL_ITE = bdd_ite_cal(ite1, ite2, sub_tree[i].type);
314
315 for (j = 2; j < sub_tree[i].ites; j++) {
316 if (sub_tree[i].ite_ptr[j]->base && is_base(sub_tree[i].ite_ptr[j]))
317 ite1 = sub_tree[i].ite_ptr[j];
318 else
319 ite1 = sub_tree[sub_tree[i].tree_ID[j]].CAL_ITE;
320
321 sub_tree[i].CAL_ITE = bdd_ite_cal(sub_tree[i].CAL_ITE, ite1, sub_tree[i].type);
322 }
323
324 if (verbose) {
325 fprintf(stdout, "\nSub-tree Name: %s, ID: %d, ITE Structure:\n", sub_tree[i].tree_name, sub_tree[i].ID);
326 print_sub_tree(sub_tree[i].CAL_ITE);
327 }
328
329 compute = 0;
330 if (failedTrees) {
331 for (j = 0; j < failedTrees; j++) {
332 if (strcmp(sub_tree[i].tree_name, failedTree[j]) == 0) {
333 compute = 1;
334 break;
335 }
336 }
337 } else {
338 compute = 1;
339 }
340 if (compute)
341 compute_sub_tree_ps(sub_tree[i].CAL_ITE, &outData, i);
342 }
343 sub_tree[i].calculated = 1;
344 }
345 }
346 }
347 if (alldone)
348 break;
349 }
350
351 if (failedTrees)
352 free(failedTree);
353
356
357
358 for (i = 0; i < bases; i++) {
359 free(base[i]->guidance);
360 free(base[i]->label);
361 free(base[i]->description);
362 free(base[i]);
363 }
364 free(base);
365
366 for (i = 0; i < ites; i++) {
367 if (ite[i]->left)
368 free((
ITE *)(ite[i]->left));
369 if (ite[i]->right)
370 free((
ITE *)(ite[i]->right));
371 free(ite[i]->description);
372 free(ite[i]->guidance);
373 free(ite[i]->label);
374 free(ite[i]);
375 }
376 free(ite);
377
378 for (i = 0; i < sub_trees; i++) {
379 free(sub_tree[i].description);
380 free(sub_tree[i].tree_name);
381 free(sub_tree[i].typeDesc);
382 free(sub_tree[i].ite_ptr);
383 free(sub_tree[i].tree_ID);
384 }
385 free(sub_tree);
386
387 for (i = 0; i < ite_ptrs; i++) {
388 if (ite_ptr[i]->guidance)
389 free(ite_ptr[i]->guidance);
390 if (ite_ptr[i]->description)
391 free(ite_ptr[i]->description);
392 if (ite_ptr[i]->label)
393 free(ite_ptr[i]->label);
394 free(ite_ptr[i]);
395 }
396 free(ite_ptr);
398
399 return EXIT_SUCCESS;
400}
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
long match_string(char *string, char **option, long n_options, long mode)
Matches a given string against an array of option strings based on specified modes.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
void free_scanargs(SCANNED_ARG **scanned, int argc)