コード例 #1
0
ファイル: saving_test.c プロジェクト: unixpickle/Cuboids
void test_save_data_list() {
    test_initiated("save_data_list");
    
    DataList * list = generate_data_list();
    FILE * temp = tmpfile();
    assert(temp != NULL);
    save_data_list(list, temp);
    fseek(temp, 0, SEEK_SET);
    DataList * loaded = load_data_list(temp);
    fclose(temp);
    
    if (loaded) {
        test_data_list_node_equality(loaded->rootNode, list->rootNode);
        if (loaded->dataSize != list->dataSize) {
            puts("Error: dataSize disagrees");
        }
        if (loaded->headerLen != list->headerLen) {
            puts("Error: headerLen disagrees");
        }
        if (loaded->depth != list->depth) {
            puts("Error: depth disagrees");
        }
    } else {
        puts("Error: failed to load data list.");
    }
    
    data_list_free(loaded);
    data_list_free(list);
    
    test_completed();
}
コード例 #2
0
ファイル: triangulate.c プロジェクト: rvanvenetie/AcuteTet
int main(int argc, char *argv[]) {
    int p = 31;
    tri_list t_list;

    tri_list_from_file(&t_list,"/local/rvveneti/tri_list_31.tet");
    edge_matrix mat = edge_matrix_init(p, 0);
    int row_size = edge_matrix_row_size(&mat);
    /*
     * All triangles in x = 0 plane are given by the indices
     * i < j < k < row_size. Note that an edge (i,j) exists if len > 0 for tri[i][j-i].len
     */
    //Loop over all edges in x = 0 plane
    size_t totalcnt = 0;
    size_t edge_cnt = 0;
    for (int i = 0; i < row_size; i++)
        for (int j = 0; j < row_size - i; j++) {
            for (int k = 0; k < t_list.t_arr[i][j].len; k++) {
                tri_index idx;
                idx[0] = i;
                idx[1] = i + j;
                idx[2] = i + j + t_list.t_arr[i][j].p_arr[k];
                if (idx[2] < row_size) { //Third point also in the x = 0 plane
                    totalcnt++;
                    //Edge_count, increase if mat.val = 0
                    edge_cnt += 1 - mat.val[idx[0]][idx[1]] + 1 - mat.val[idx[1]][idx[2]] + 1 - mat.val[idx[0]][idx[2]];

                    //Set all edges to one
                    mat.val[idx[0]][idx[1]] = mat.val[idx[1]][idx[0]] = 1;
                    mat.val[idx[1]][idx[2]] = mat.val[idx[2]][idx[1]] = 1;
                    mat.val[idx[0]][idx[2]] = mat.val[idx[2]][idx[0]] = 1;
                }
            }
        }
    triangle cur_tri;
    tri_mem_list sq_list = mem_list_square_init(p,0);

    //Loop over all triangles in the square
    size_t tri_cnt = 0;
    size_t tri_cnt_bla = 0;
    for (int i = 0; i < row_size; i++) {
        vertex_from_index_cube(i,mat.p, cur_tri.vertices[0]);
        for (int j = i; j < row_size; j++) {
            vertex_from_index_cube(j,mat.p, cur_tri.vertices[1]);
            for (int k = j; k < row_size; k++) {
                vertex_from_index_cube(k,mat.p, cur_tri.vertices[2]);
                //If triangle is acute and the sides are contained in the matrix
                if (arr3_triangle_acute(cur_tri.vertices[0],cur_tri.vertices[1],cur_tri.vertices[2]) &&
                        mat.val[i][j] &&
                        mat.val[i][k] &&
                        mat.val[j][k])
                {
                    if (tri_list_contains(&t_list, &cur_tri)) {
                        tri_cnt_bla++;

                        triangle_2d cur_tri_2d;
                        vertex_from_index_square(cur_tri_2d.vertices[0], i, mat.p);
                        vertex_from_index_square(cur_tri_2d.vertices[1], j, mat.p);
                        vertex_from_index_square(cur_tri_2d.vertices[2], k, mat.p);
                        mem_list_square_set(&sq_list, &cur_tri_2d);
                    }
                    tri_cnt++;
                }

            }
        }
    }
    printf("Sq_list   %zu\n", mem_list_count(&sq_list));
    printf("Tricnt    %zu\n", tri_cnt_bla);
    printf("Tri cnt   %zu\n", tri_cnt);
    printf("Totalcnt= %zu\n", totalcnt);
    printf("Edgecnt = %zu\n", edge_cnt);
    printf("Edge_mat= %zu\n", edge_matrix_count(&mat));
    edge_matrix_cosy_count(&mat, &totalcnt, &edge_cnt);
    printf("Cosy tri =%zu\n", totalcnt);
    printf("Cosy ara =%zu\n", edge_cnt);
    mem_list_to_file(&sq_list, "/var/scratch/rvveneti/tri_sq_31.tri", MEM_LIST_SAVE_CLEAN);
    edge_matrix_to_file(&mat, "/var/scratch/rvveneti/edge_sq_31.edg");
    return 1;
    /*
    	 tri_mem_list fund_list;
    	 tri_list     t_list;
    	 fprintf(stderr,"Start loading\n");
    	 if (mem_list_from_file(&fund_list, "/var/scratch/rvveneti/fund_conf_31.tet"))
    	 fprintf(stderr,"Loaded succesfuly\n");
    	 else
    	 {
    	 fprintf(stderr,"Failed loading..\n");
    	 return 0;
    	 }
    	 tri_mem_list cube_list;
    	 cube_list = mem_list_fund_to_cube(&fund_list);
    	 if (mem_list_to_file(&cube_list, "/local/rvveneti/cube_conf_31.tet", MEM_LIST_SAVE_CLEAN))
    	 fprintf(stderr,"Stored succesfully\n");
    	 else
    	 fprintf(stderr, "Failed storing\n");
    	 return 0;
    	 t_list = mem_list_to_tri_list(&fund_list);
    	 fprintf(stderr,"Not failed in mem_list_to_tri_list!\n");
    	 if (tri_list_to_file(&t_list, "/local/rvveneti/tri_list_31.tet"))
    	 fprintf(stderr,"Stored succesfully\n");
    	 else
    	 fprintf(stderr,"Failed storing..  tri list\n");
    	 return 0;
     */
    srand(1234);
    srand(time(NULL));
    char log_file[100];
    int dim = 10;
    data_list list;
    triangulation triang;
    while (1) {
        if (argc == 2 && isdigit(argv[1][0]))
            dim = atoi(argv[1]);
        int mode = DATA_TRI_LIST;
        if (argc == 2 && !isdigit(argv[1][0]))
        {
            if (strstr(argv[1], "cube")) //Cube in the name, must be cube
                mode = DATA_MEM_LIST_CUBE;
            fprintf(stderr,"Loading from: %s\n", argv[1]);
            if (data_list_from_file(&list, mode, argv[1]))
                fprintf(stderr,"Loaded succesfully from file\n");
            else {
                fprintf(stderr,"Failed loading from file\n");
                return -1;
            }
            dim = data_list_dim(&list);
        } else {
            fprintf(stderr,"Creating new tri_list\n");
            list = data_list_init(dim, mode, MEM_LIST_TRUE);
        }
        if (mode == DATA_TRI_LIST)
            sprintf(log_file, LOG, dim, "tri_list");
        else
            sprintf(log_file, LOG, dim, "cube");
        if (REDIRECT_OUTPUT) {
            if (freopen(log_file,"a",stdout) == NULL)
                printf("Redirecting output failed\n");
            setvbuf(stdout, NULL,_IOLBF, 1024);
        }
        printf("Triangulation for p = %d\n", dim);
        printf("Amount of triangles in the list = %zu\n", data_list_count(&list));
        printf("Memory of the triangle list = %zu\n",     data_list_memory(&list));

        printf("Finding triangulation.\n");
        //triang = triangulate_cube_random(&list);
        do {
            triang = triangulate_cube(&list,  TRIANG_TMP_FILE, TRIANG_TET_TMP_FILE);
            if (triang.bound_len == 0) //No boundary triangles!
            {
                printf("Triangulation found!");
                triangulation_to_file(&triang, TRIANG_FILE);
                data_list_to_file(&list, TRIANG_TET_FILE, MEM_LIST_SAVE_CLEAN);
                break;
            }

            triangulation_free(&triang);
        } while (mode == DATA_TRI_LIST && tri_list_update_from_file(&list.list, argv[1]));
        data_list_free(&list);
        fprintf(stderr, "Restarting loop\n\n");
    }
    triangulation_free(&triang);
    data_list_free(&list);
    return 0;
}