00001 #include "mdd.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 mdd_t *
00019 mdd_and_smooth(
00020 mdd_manager *mgr,
00021 mdd_t *f,
00022 mdd_t *g,
00023 array_t *mvars)
00024 {
00025 int i, j, mv_no;
00026 mvar_type mv;
00027 mdd_t *top;
00028 bdd_t *temp;
00029
00030 array_t *bdd_vars = array_alloc(bdd_t *, 0);
00031 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00032
00033
00034 if ( mvars == NIL( array_t ) || array_n(mvars) == 0) {
00035 printf("\nWARNING: Empty Array of Smoothing Variables\n");
00036 array_free(bdd_vars);
00037 return ( bdd_and(f, g, 1, 1) ) ;
00038 }
00039
00040 for (i=0; i<array_n(mvars); i++) {
00041 mv_no = array_fetch(int, mvars, i);
00042 mv = array_fetch(mvar_type, mvar_list, mv_no);
00043 if (mv.status == MDD_BUNDLED) {
00044 (void) fprintf(stderr,
00045 "\nmdd_andsmooth: bundled variable %s used\n",mv.name);
00046 fail("");
00047 }
00048
00049 for (j = 0; j < mv.encode_length; j++) {
00050 temp = bdd_get_variable(mgr, mdd_ret_bvar_id(&mv,j) );
00051 array_insert_last(bdd_t *, bdd_vars, temp);
00052 }
00053 }
00054
00055 assert( array_n(bdd_vars) != 0 );
00056 top = bdd_and_smooth(f, g, bdd_vars);
00057
00058 for (i = 0; i < array_n(bdd_vars); i++) {
00059 temp = array_fetch(bdd_t *, bdd_vars, i);
00060 bdd_free(temp);
00061 }
00062 array_free(bdd_vars);
00063
00064 return top;
00065 }
00066
00067
00068 mdd_t *
00069 mdd_and_smooth_with_limit(
00070 mdd_manager *mgr,
00071 mdd_t *f,
00072 mdd_t *g,
00073 array_t *mvars,
00074 unsigned int limit)
00075 {
00076 int i, j, mv_no;
00077 mvar_type mv;
00078 mdd_t *top;
00079 bdd_t *temp;
00080
00081 array_t *bdd_vars = array_alloc(bdd_t *, 0);
00082 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00083
00084
00085 if ( mvars == NIL( array_t ) ) {
00086 printf("\nWARNING: Empty Array of Smoothing Variables\n");
00087 array_free(bdd_vars);
00088 return ( bdd_and_with_limit(f, g, 1, 1, limit) ) ;
00089 }
00090 else if ( array_n(mvars) == 0) {
00091 printf("\nWARNING: Empty Array of Smoothing Variables\n");
00092 array_free(bdd_vars);
00093 return ( bdd_and_with_limit(f, g, 1, 1, limit) ) ;
00094 }
00095
00096 for (i=0; i<array_n(mvars); i++) {
00097 mv_no = array_fetch(int, mvars, i);
00098 mv = array_fetch(mvar_type, mvar_list, mv_no);
00099 if (mv.status == MDD_BUNDLED) {
00100 (void) fprintf(stderr,
00101 "\nmdd_andsmooth: bundled variable %s used\n",mv.name);
00102 fail("");
00103 }
00104
00105 for (j = 0; j < mv.encode_length; j++) {
00106 temp = bdd_get_variable(mgr, mdd_ret_bvar_id(&mv,j) );
00107 array_insert_last(bdd_t *, bdd_vars, temp);
00108 }
00109 }
00110
00111 assert( array_n(bdd_vars) != 0 );
00112 top = bdd_and_smooth_with_limit(f, g, bdd_vars, limit);
00113
00114 for (i = 0; i < array_n(bdd_vars); i++) {
00115 temp = array_fetch(bdd_t *, bdd_vars, i);
00116 bdd_free(temp);
00117 }
00118 array_free(bdd_vars);
00119
00120 return top;
00121 }
00122
00123
00124
00125
00126
00127