예제 #1
0
// tostring, not for drawing
void
gridfont_print
(
	gridfont *gf
)
{
	printf("GRID FONT\n");
	printf("State: %s\n", gridfont_statestrings[gf->state]); 
	if (gf->state & (GRIDFONT_BAD | GRIDFONT_EMPTY)) return;
	printf("Max width: %d\t Max height: %d\n", gf->maxwidth, gf->maxheight);
	printf("Midline: %d\t Baseline: %d\n", gf->midline, gf->baseline);
	printf("Letter space: %d\t Word space: %d\n", gf->letterspace, gf->wordspace);
	for (int i = 0; i < GRIDFONT_NUMCHARS; i++) {
		if (gf->chars[i] != NULL) {
			printf("%c:\t Width: %d\t", (char)i, gf->widths[i]);
			bitvector_print(gf->chars[i]);
		}
	}
}
예제 #2
0
파일: cdnf.c 프로젝트: rowangithub/DOrder
boolformula_t *learn_core (void *info,
                           uscalar_t num_vars,
                           membership_t membership, membership_t comembership,
                           equivalence_t equivalence, int mode)
{
    equivalence_result_t *eq_result;
    conjunction *conjecture;
    vector *bases;

    bases = vector_new (0);
    conjecture = get_conjecture (bases);
    boolformula_t* b_conjecture = cdnfformula_to_boolformula (conjecture);
    vector_free (conjecture);
    eq_result = (*equivalence) (info, num_vars, boolformula_copy (b_conjecture));
    if (eq_result->is_equal) {
        //fprintf(stderr,"Number of Variables Used : %d\n", (unsigned int)num_vars);
        free(eq_result);
        return b_conjecture;
    } else {
        boolformula_free(b_conjecture);
    }

#ifdef DEBUG
    fprintf (stderr, "add first basis with ");
    bitvector_print (eq_result->counterexample);
#endif

    assert (bitvector_length (eq_result->counterexample) == num_vars + 1);
    add_basis (bases, eq_result->counterexample);
    bitvector_free (eq_result->counterexample);
    free(eq_result);
    while (true) {
        vector *I;
        bitvector *v;
        uscalar_t j, length;

        conjecture = get_conjecture (bases);
#ifdef DEBUG
        fprintf (stderr, "new conjecture = ");
        boolformula_print (conjecture);
#endif
        boolformula_t* b_conjecture = cdnfformula_to_boolformula (conjecture);
        vector_free (conjecture);
        eq_result = (*equivalence) (info, num_vars, boolformula_copy (b_conjecture));

        if (eq_result->is_equal) {
            //fprintf(stderr,"Number of Variables Used : %d\n", (unsigned int)num_vars);
            cleanup (bases);
            free (eq_result);
            return b_conjecture;
        } else {
            boolformula_free(b_conjecture);
        }

        /* H_i's are still in bases, only free the conjunction */
        assert (bitvector_length (eq_result->counterexample) == num_vars + 1);
        v = eq_result->counterexample;
        I = get_indices_to_modify (bases, v);
        if (vector_length (I) == 0) {
            if(mode==CDNF_Plus3 && (*membership)(info,v)==true) {
#ifdef DEBUG
                fprintf (stderr, "conflict detected on: ");
                bitvector_print (v);
                fprintf (stderr, "num of variables: %d \n",num_vars);
#endif
                refine_bases(info, membership,comembership,bases,mode);
                num_vars++;
            } else {
#ifdef DEBUG
                fprintf (stderr, "add basis: ");
                bitvector_print (v);
#endif
                add_basis (bases, v);
            }
            bitvector_free (v);
            free(eq_result);
            vector_free (I);
            continue;
        }
        free(eq_result);

#ifdef DEBUG
        fprintf (stderr, "fix m_dnf with ");
        bitvector_print (v);
#endif
        length = vector_length (I);
        for (j = 0; j < length; j++) {
            uscalar_t i;
            basis *B;
            bitvector *a_i, *v_i, *xor;
            vector *T_i;
            disjunction *H_i;
            monomial *m;

            i = (uscalar_t) vector_get (I, j);
            B = (basis *) vector_get (bases, i);
            a_i = B->a;
            T_i = B->T;
            H_i = B->H;

            v_i = bitvector_copy (v);
            walk (info, membership, v_i, a_i);
            xor = bitvector_xor (v_i, a_i);
            /* when xor == 0, a conflict has occurred. */
            /* assert (!bitvector_is_zeros (xor)); */
            if (bitvector_is_zeros (xor)) {
#ifdef DEBUG
                fprintf (stderr, "conflict with the basis ");
                bitvector_print (a_i);
#endif
                bitvector_free (xor);
                bitvector_free (v_i);
                if(mode==CDNF_PlusPlus||mode==CDNF_Plus3) {
                    /* increase the number of variables */
#ifdef DEBUG
                    fprintf (stderr, "num of variables: %d \n",num_vars);
#endif
                    refine_bases (info, membership, comembership, bases,mode);
                    num_vars++;
                } else {
                    bitvector_free (v);
                    vector_free (I);
                    return NULL;
                }
                break;
            }
#ifdef DEBUG
            fprintf (stderr, "add support ");
            bitvector_print (v_i);
#endif
            /* store v_i in T_i */
            /* note that the original CDNF algorithm stores xor in S_i */
            vector_add (T_i, v_i);

            /* compute M_DNF (v_i + a_i) */
            m = cdnfformula_monomial_M_DNF (xor);
            /* compute m (x ^ a_i) */
            m = compute_m_of_x_xor_a (m, a_i);
            vector_add (H_i, m);
            bitvector_free (xor);
        }
        bitvector_free (v);
        vector_free (I);
    }
}
예제 #3
0
파일: cdnf.c 프로젝트: rowangithub/DOrder
void refine_bases (void *info,
                   membership_t membership, membership_t comembership,
                   vector *bases, int mode)
{
    uscalar_t i, length;

    length = vector_length (bases);
#ifdef DEBUG
    fprintf (stderr, "refine bases, num of DNF = %d",length);
#endif
    for (i = 0; i < length; i++) {
        basis *B;
        bitvector *a_i;
        vector *T_i;
        uscalar_t l, T_i_len, j;
        bool b;

        B = (basis *) vector_get (bases, i);
        /*
         * extends each unsatisfying assignment by FALSE
         */
        a_i = B->a;
        l = bitvector_length (a_i);
        bitvector_resize (a_i, l + 1);
        bitvector_set (a_i, l, false);
        if(mode==CDNF_PlusPlus)
            b = (*comembership) (info, a_i) == true ? false : true;
        else
            b=false;
        bitvector_set (a_i, l, b);
#ifdef DEBUG
        fprintf (stderr, "extends basis: ");
        bitvector_print (a_i);
#endif

#ifdef DEBUG
        fprintf (stderr, "extends support: ");
#endif
        T_i = B->T;
        T_i_len = vector_length (T_i);
        /* except the last basis, all bases have at least one support */
        assert (i == length - 1 || T_i_len > 0);
        for (j = 0; j < T_i_len; j++) {
            bitvector *v;
            bool c;

            /*
             * extends v to v+b if MEM (v+b) = YES
             *           to v+!b if MEM (v+b) = NO
             */
            v = (bitvector *)vector_get (T_i, j);
            assert (bitvector_length (v) == l);
            bitvector_resize (v, l + 1);
            bitvector_set (v, l, b);
            c = (*membership) (info, v) == true ? b : !b;
            if (c != b)
                bitvector_set (v, l, c);
#ifdef DEBUG
            bitvector_print (v);
#endif
        }
        /* clean up disjunction for the current basis */
        cdnfformula_disjunction_free (B->H);
        B->H = NULL;

        /* remove the last basis if it has no support */
        if (T_i_len == 0) {
            assert (i == length - 1);
            bitvector_free (a_i);
            vector_free (T_i);
            free (vector_get (bases, length - 1));
            vector_resize (bases, length - 1);
        }
    }
    /*
     * reconstruct disjunctions for the bases
     */
    rebuild_disjunctions (bases);
}