Beispiel #1
0
void Solver::constraints_create(int s, int t, int n){

    // vector to store edges of complete graph
    std::vector<BIGINT> v;    

    // calculate edges
    int e=n*(n-1)/2, i;

    Constraint c;
    std::vector<int> tmp;    

    // computing minimum size of constraint
    int shift = (n-1)*(n-2)/2;

    // remove all unnecessary constraints
    BIGINT min_constraint = 1;
    min_constraint<<=shift;

    // get combinations for K_s 
    v.clear();
    tmp.clear();    
    get_combinations(v,n,s,tmp,-1);
    c.sign = '<';
    c.rhs = s*(s-1)/2;        
    for (i=0;i<v.size();++i){
        c.lhs = v[i];
        if (c.lhs >= min_constraint) constraint_add(c);
        //constraint_add(c);
    }


    // get combinations for K_t 
    v.clear();
    tmp.clear();
    get_combinations(v,n,t,tmp,-1);
    c.sign = '>';
    c.rhs = 0;
    for (i=0;i<v.size();++i){
        c.lhs = v[i];
        if (c.lhs >= min_constraint) constraint_add(c);
        //constraint_add(c);
    }    

}
Beispiel #2
0
int main_(){

    std::vector<BIGINT> v;    
    std::vector<int> tmp;    

    // get combinations for K_s 
    v.clear();
    tmp.clear();    

    int n = 6;
    int s = 3;

    get_combinations(v,n,s,tmp,-1);	

}
Beispiel #3
0
void do_statistical_tests()
{
    #ifndef TRACK_STATISTICS
        printf("Enable TRACK_STATISTICS to do statistical tests...\n");
        return ;
    #else
    /* some sizes test to see how the bitfield or rather hashing function behaves depending on its size. */
    unsigned int
            sizes_to_test[]     = {10000,   /* 10 thousands bits, about 1.25 kilobytes. */
                                   100000,  /* 12.5 kilobytes. */
                                   1000000, /* 125 kilobytes   */
                                   10000000 /* 1.25 megabytes. */},
             number_of_sizes    = 4,
             index_0, index_1,
             number_of_strings  = 10000;

    /* create two set of strings both of which are completely disjoint (if the empty string is excluded),
        in principles their shouldn't be any collisions.
    */
    char **inserted_strings     = get_combinations(number_of_strings, "abcdefghi"),
         **non_inserted_strings = get_combinations(number_of_strings, "jklmnopqr");

    printf("Testing with combinations.\n");
    membership_type *membership;
    for (index_0 = 0; index_0 < number_of_sizes; index_0++)
    {
        membership = create_membership(sizes_to_test[index_0]); /* create a new membership. */
        for (index_1 = 1; index_1 <= number_of_strings; index_1++) /* skip over the empty string */
            insert_string(membership, inserted_strings[index_1]);
        for (index_1 = 1; index_1 <= number_of_strings; index_1++) /* skip over the empty string */
            if (!is_member(membership, inserted_strings[index_1], 1))
                error("Failed to insert value!");
        for (index_1 = 1; index_1 <= number_of_strings; index_1++)
            is_member(membership, non_inserted_strings[index_1], 0);

        printf("Bitfield size %u number_of_strings %u\n", sizes_to_test[index_0], number_of_strings);

        printf("%u, %f%% collisions while inserting.\n",
                (unsigned int)(number_of_strings - membership->number_of_set_bits),
                (((unsigned int)(number_of_strings - membership->number_of_set_bits)/(double)(number_of_strings)) * 100));

        printf("%u, %f%% collisions while searching.\n",
                (unsigned int)(membership->number_of_false_positives),
                (((unsigned int)(membership->number_of_false_positives)/(double)(number_of_strings)) * 100) );
        printf("\n");

        free_membership(membership);
    }

    for (index_0 = 0; index_0 < number_of_strings + 1; index_0++)
    {
        free(inserted_strings[index_0]);
        free(non_inserted_strings[index_0]);
    }

    printf("Testing with permutations.\n");
    inserted_strings = permute_string("abcdefghi", number_of_strings);
    non_inserted_strings = permute_string("jklmnopqr", number_of_strings);
    for (index_0 = 0; index_0 < number_of_sizes; index_0++)
    {
        membership = create_membership(sizes_to_test[index_0]); /* create a new membership. */
        for (index_1 = 0; index_1 < number_of_strings; index_1++)
                insert_string(membership, inserted_strings[index_1]);
        for (index_1 = 0; index_1 < number_of_strings; index_1++)
                if (!is_member(membership, inserted_strings[index_1], 1))
                    error("Failed to insert value!");
        for (index_1 = 0; index_1 < number_of_strings; index_1++)
            is_member(membership, non_inserted_strings[index_1], 0);

        printf("Bitfield size %u number_of_strings %u\n", sizes_to_test[index_0], number_of_strings);

        printf("%u, %f%% collisions while inserting.\n",
                (unsigned int)(number_of_strings - membership->number_of_set_bits),
                (((unsigned int)(number_of_strings - membership->number_of_set_bits)/(double)(number_of_strings)) * 100));

        printf("%u, %f%% collisions while searching.\n",
                (unsigned int)(membership->number_of_false_positives),
                (((unsigned int)(membership->number_of_false_positives)/(double)(number_of_strings)) * 100) );
        printf("\n");

        free_membership(membership);
    }

    for (index_0 = 0; index_0 < number_of_strings; index_0++)
    {
        free(inserted_strings[index_0]);
        free(non_inserted_strings[index_0]);
    }
    #endif
}