void test_add_lincons(void) { printf("\nadd lincons\n"); LOOP { size_t i, dim = 5, nb = 4; ap_abstract0_t* pka,*pkr, *ppla,*pplr; ap_lincons0_array_t ar = ap_lincons0_array_make(nb); pka = random_poly(pk,dim); ppla = convert(ppl,pka); for (i=0;i<nb;i++) { ar.p[i] = ap_lincons0_make((rand()%100>=90)?AP_CONS_EQ: (rand()%100>=90)?AP_CONS_SUP:AP_CONS_SUPEQ, random_linexpr(dim),NULL); } pkr = ap_abstract0_meet_lincons_array(pk,false,pka,&ar); pplr = ap_abstract0_meet_lincons_array(ppl,false,ppla,&ar); RESULT('*'); if (!is_eq(pkr,pplr)) { ERROR("different results"); ap_lincons0_array_fprint(stderr,&ar,NULL); print_poly("pka",pka); print_poly("pkr",pkr); print_poly("pplr",pplr); } ap_abstract0_free(pk,pka); ap_abstract0_free(ppl,ppla); ap_abstract0_free(pk,pkr); ap_abstract0_free(ppl,pplr); ap_lincons0_array_clear(&ar); } ENDLOOP; }
/* convert to specified manager */ ap_abstract0_t* convert(ap_manager_t* man, ap_abstract0_t* a) { ap_lincons0_array_t l; ap_dimension_t d = ap_abstract0_dimension(a->man,a); if (a->man==man) return a; l = ap_abstract0_to_lincons_array(a->man,a); a = ap_abstract0_of_lincons_array(man,d.intdim,d.realdim,&l); ap_lincons0_array_clear(&l); return a; }
void mset_fprint_smtlib (FILE * stream, mset_internal_t * pr, mset_t * a, char **name_of_dim) { if (!a) { fprintf (stream, "\t\t;; mset constraints empty\n"); return; } size_t i, size; size = (a->datadim + 2 * a->segmdim); // print data constraints // initialize data and len node names char **dname = ap_dimension_to_smt (size, a->datadim, a->segmdim, 0, name_of_dim); // print the list of constraints ap_lincons0_array_t arr = ap_abstract0_to_lincons_array (pr->man_dcons, a->dcons); ap_lincons0_array_fprint_smtlib (stream, &arr, dname); ap_lincons0_array_clear (&arr); // print the mset constraints // initialize mset node names for (i = 0; i < a->segmdim; i++) { char *name = shape_name_of_dim (a->datadim + i); size_t lsize = (8 + strlen (name)); if (dname[a->datadim + a->segmdim + i]) free (dname[a->datadim + a->segmdim + i]); dname[a->datadim + a->segmdim + i] = (char *) malloc (lsize * sizeof (char)); snprintf (dname[a->datadim + a->segmdim + i], lsize, "(mset %s)", name); } // print the list of constraints arr = ap_abstract0_to_lincons_array (pr->man_mscons, a->mscons); ap_lincons0_array_fprint_smtlib (stream, &arr, dname); ap_lincons0_array_clear (&arr); mset_free_name (a, dname); }
/** * @brief Print the abstract value using the ACSL format. * * Use the ACSL format to print the abstract value in the * file @p stream. * * @param[in] stream Output stream * @param[in] pr Internal manager * @param[in] a Abstract value to be print * @param[in] name_of_dim Names for the array represented */ void mset_fprint_acsl (FILE * stream, mset_internal_t * pr, mset_t * a, char **name_of_dim) { if (!a) fprintf (stream, "EMPTY"); else { if (!name_of_dim) shape_init_name_of_dim (a->datadim, a->segmdim); char **dname = mset_init_name_data (a, name_of_dim); ap_lincons0_array_t arr = ap_abstract0_to_lincons_array (pr->man_dcons, a->dcons); ap_lincons0_array_fprint_acsl (stream, &arr, dname); ap_lincons0_array_clear (&arr); mset_free_name (a, dname); dname = mset_init_name_mset (a, name_of_dim); arr = ap_abstract0_to_lincons_array (pr->man_mscons, a->mscons); ap_lincons0_array_fprint_acsl (stream, &arr, dname); ap_lincons0_array_clear (&arr); mset_free_name (a, dname); } }
/** * @brief Build an abstract value using the code in @p ptr. * * Read at @p ptr tree size_t numbers representing * the code (datasim, segmentdim, code) then build the * abstract value for the code. * * @param[in] man Global manager * @param[in] ptr Address storing the code * @param[in] size Number of size_t to be read * @return The abstract value represented by the code */ mset_t * mset_deserialize_raw (ap_manager_t * man, void *ptr, size_t * size) { mset_internal_t *pr = mset_init_from_manager (man, AP_FUNID_DESERIALIZE_RAW, 0); if (size != size) return NULL; /* to remove warning on unused parameter */ size_t *mset_raw = (size_t *) ptr; size_t datadim = mset_raw[0]; size_t segmdim = mset_raw[1]; size_t code = mset_raw[2]; ap_dim_t l = 0; ap_dim_t S = 2; // TODO: take care of collapse with the sum domain ap_dim_t T = 3; size_t nodex = 1; size_t nodey = 2; size_t nodez = 3; mset_t *r = mset_top (man, datadim, segmdim); /* common constraints l[x]==_l>=1 and M[x]==S */ if (code != 1) { assert (segmdim >= 2); ap_lincons0_array_t arr = ap_lincons0_array_make (3); arr.p[0] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_LEN, 1, datadim + nodex, 0, 0, -1, l, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst (AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodex, 0, 0, 0, 0, -1, datadim, segmdim); arr.p[2] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_MSET, 1, datadim + nodex, 0, 0, -1, S, 0, datadim, segmdim); r = mset_meet_lincons_array (man, true, r, &arr); ap_lincons0_array_clear (&arr); } /* common constraint l[x]==l[y] and l[y]>=1 */ if (code == 2 || code == 4) { assert (segmdim >= 3); ap_lincons0_array_t arr = ap_lincons0_array_make (2); arr.p[0] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_LEN, 1, datadim + nodex, -1, datadim + nodey, 0, 0, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst (AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodey, 0, 0, 0, 0, -1, datadim, segmdim); r = mset_meet_lincons_array (man, true, r, &arr); ap_lincons0_array_clear (&arr); } /* specific constraints */ switch (code) { case 1: /* l[x]+l[y]==_l and l[x]>=1 and l[y]>=1 and M[x]+M[y]==S */ { assert (segmdim >= 2); ap_lincons0_array_t arr = ap_lincons0_array_make (4); arr.p[0] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_LEN, 1, datadim + nodex, 1, datadim + nodey, -1, l, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst (AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodex, 0, 0, 0, 0, -1, datadim, segmdim); arr.p[2] = shape_lincons_x_y_v_cst (AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodey, 0, 0, 0, 0, -1, datadim, segmdim); arr.p[3] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_MSET, 1, datadim + nodex, 1, datadim + nodey, -1, S, 0, datadim, segmdim); r = mset_meet_lincons_array (man, true, r, &arr); ap_lincons0_array_clear (&arr); break; } case 3: /* non-equal length lists: l[y]+1<=_l and l[y]>=1 */ { assert (segmdim >= 3); ap_lincons0_array_t arr = ap_lincons0_array_make (2); arr.p[0] = shape_lincons_x_y_v_cst (AP_CONS_SUPEQ, OFFSET_LEN, -1, datadim + nodey, 0, 0, 1, l, -1, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst (AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodey, 0, 0, 0, 0, -1, datadim, segmdim); r = mset_meet_lincons_array (man, true, r, &arr); ap_lincons0_array_clear (&arr); break; } case 4: /* equal length lists: l[z]=l[x] and M[y]=T */ { assert (segmdim >= 4 && datadim >= 4); ap_lincons0_array_t arr = ap_lincons0_array_make (2); arr.p[0] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_LEN, -1, datadim + nodex, 1, datadim + nodez, 0, 0, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst (AP_CONS_EQ, OFFSET_MSET, 1, datadim + nodey, 0, 0, -1, T, 0, datadim, segmdim); r = mset_meet_lincons_array (man, true, r, &arr); ap_lincons0_array_clear (&arr); break; } default: break; } return r; }
/* Builds a value from a code! * The ptr is an array of 3 size_t [datadim, segmdim, codeop] */ ucons_t * ucons_deserialize_raw(ap_manager_t * man, void *ptr, size_t * size) { ucons_internal_t *pr = ucons_init_from_manager(man, AP_FUNID_DESERIALIZE_RAW, 0); size_t *ucons_raw = (size_t *) ptr; size_t datadim = ucons_raw[0]; size_t segmdim = ucons_raw[1]; size_t code = ucons_raw[2]; ap_dim_t l = 0; size_t nodex = 1; size_t nodey = 2; size_t nodez = 3; ucons_t *r = ucons_top(man, datadim, segmdim); // for initial pointers set to null if(code == 5) return r; /* common constraints l[x]==_l and _l>=1 */ if (code != 1) { assert(segmdim >= 2 && datadim >= 1); ap_lincons0_array_t arr = ap_lincons0_array_make(2); arr.p[0] = shape_lincons_x_y_v_cst(AP_CONS_EQ, OFFSET_LEN, 1, datadim + nodex, 0, 0, -1, l, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst(AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodex, 0, 0, 0, 0, -1, datadim, segmdim); r = ucons_meet_lincons_array(man, true, r, &arr); ap_lincons0_array_clear(&arr); } /* common constraint l[x]==l[y] and l[y]>=1 */ if (code == 2 || code == 4) { assert(segmdim >= 3 && datadim >= 1); ap_lincons0_array_t arr = ap_lincons0_array_make(2); arr.p[0] = shape_lincons_x_y_v_cst(AP_CONS_EQ, OFFSET_LEN, 1, datadim + nodex, -1, datadim + nodey, 0, 0, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst(AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodey, 0, 0, 0, 0, -1, datadim, segmdim); // arr.p[2] = // shape_lincons_x_y_v_cst (AP_CONS_EQMOD, var_ptr_null, 1, // nodey, -1, nodex, 0, 0, 0, datadim, // segmdim); r = ucons_meet_lincons_array(man, true, r, &arr); ap_lincons0_array_clear(&arr); } /* specific constraints */ switch (code) { case 1: /* l[x]+l[y]==_l and l[x]>=1 and l[y]>=1 */ { assert(segmdim >= 2 && datadim >= 1); ap_lincons0_array_t arr = ap_lincons0_array_make(3); arr.p[0] = shape_lincons_x_y_v_cst(AP_CONS_EQ, OFFSET_LEN, 1, datadim + nodex, 1, datadim + nodey, -1, l, 0, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst(AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodex, 0, 0, 0, 0, -1, datadim, segmdim); arr.p[2] = shape_lincons_x_y_v_cst(AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodey, 0, 0, 0, 0, -1, datadim, segmdim); r = ucons_meet_lincons_array(man, true, r, &arr); ap_lincons0_array_clear(&arr); break; } case 3: /* non-equal length lists: l[y]+1<=_l and l[y]>=1 */ { assert(segmdim >= 3 && datadim >= 1); ap_lincons0_array_t arr = ap_lincons0_array_make(2); arr.p[0] = shape_lincons_x_y_v_cst(AP_CONS_SUPEQ, OFFSET_LEN, -1, datadim + nodey, 0, 0, 1, l, -1, datadim, segmdim); arr.p[1] = shape_lincons_x_y_v_cst(AP_CONS_SUPEQ, OFFSET_LEN, 1, datadim + nodey, 0, 0, 0, 0, -1, datadim, segmdim); r = ucons_meet_lincons_array(man, true, r, &arr); ap_lincons0_array_clear(&arr); break; } case 4: /* equal length lists: l[z]=l[x] */ { assert(segmdim >= 4); ap_lincons0_array_t arr = ap_lincons0_array_make(1); arr.p[0] = shape_lincons_x_y_v_cst(AP_CONS_EQ, OFFSET_LEN, -1, datadim + nodex, 1, datadim + nodez, 0, 0, 0, datadim, segmdim); r = ucons_meet_lincons_array(man, true, r, &arr); ap_lincons0_array_clear(&arr); break; } default: break; } return r; }