00001
00002
00003
00004
00005 #include "mdd.h"
00006
00007 int
00008 mdd_bundle_variables(
00009 mdd_manager *mgr,
00010 array_t *bundle_vars,
00011 char *mdd_var_name,
00012 int *mdd_id)
00013 {
00014 array_t *mvar_list, *bvar_list;
00015 mvar_type var_i, new_var;
00016 int i, var_i_id;
00017 bvar_type *bit_i_ptr;
00018
00019 mvar_list = mdd_ret_mvar_list(mgr);
00020 bvar_list = mdd_ret_bvar_list(mgr);
00021
00022 new_var.mvar_id = array_n(mvar_list);
00023 *mdd_id = new_var.mvar_id;
00024
00025 new_var.name = ALLOC( char, MAX( (int) strlen(mdd_var_name),
00026 integer_get_num_of_digits(new_var.mvar_id) + 5 ) );
00027
00028 if ( strcmp(mdd_var_name,"") != 0)
00029 strcpy(new_var.name, mdd_var_name);
00030 else {
00031 strcpy(new_var.name,"");
00032 sprintf(new_var.name,"mv_%d", new_var.mvar_id);
00033 };
00034
00035 new_var.encode_length = array_n(bundle_vars);
00036 new_var.status = MDD_ACTIVE;
00037
00038 new_var.encoding = ALLOC(int, new_var.encode_length);
00039
00040 new_var.bvars = array_alloc(int, 0);
00041 new_var.values = 1;
00042
00043 for(i=0; i<array_n(bundle_vars); i++){
00044 var_i_id = array_fetch(int, bundle_vars, i);
00045 var_i = array_fetch(mvar_type, mvar_list, var_i_id);
00046 array_append(new_var.bvars, var_i.bvars);
00047 new_var.values *= var_i.values;
00048 if ( var_i.values != (int) pow(2.0, (double)var_i.encode_length) )
00049 printf("WARNING: Variable %s has %d values which is not a power of 2 \nmdd_bundle_variables: Bundling is ambiguous \n",var_i.name, var_i.values);
00050 var_i.status = MDD_BUNDLED;
00051 }
00052
00053 array_insert_last( mvar_type, mvar_list, new_var);
00054
00055 for(i=0; i< array_n(new_var.bvars); i++) {
00056 bit_i_ptr = array_fetch_p( bvar_type, bvar_list, mdd_ret_bvar_id(&new_var, i) );
00057 bit_i_ptr->mvar_id = new_var.mvar_id;
00058 }
00059
00060 return TRUE;
00061
00062 }
00063
00064
00065
00066
00067
00068