struct isl_basic_map *isl_map_affine_hull(struct isl_map *map) { int i; struct isl_basic_map *model = NULL; struct isl_basic_map *hull = NULL; struct isl_set *set; map = isl_map_detect_equalities(map); map = isl_map_align_divs(map); if (!map) return NULL; if (map->n == 0) { hull = isl_basic_map_empty_like_map(map); isl_map_free(map); return hull; } model = isl_basic_map_copy(map->p[0]); set = isl_map_underlying_set(map); set = isl_set_cow(set); if (!set) goto error; for (i = 0; i < set->n; ++i) { set->p[i] = isl_basic_set_cow(set->p[i]); set->p[i] = isl_basic_set_affine_hull(set->p[i]); set->p[i] = isl_basic_set_gauss(set->p[i], NULL); if (!set->p[i]) goto error; } set = isl_set_remove_empty_parts(set); if (set->n == 0) { hull = isl_basic_map_empty_like(model); isl_basic_map_free(model); } else { struct isl_basic_set *bset; while (set->n > 1) { set->p[0] = affine_hull(set->p[0], set->p[--set->n]); if (!set->p[0]) goto error; } bset = isl_basic_set_copy(set->p[0]); hull = isl_basic_map_overlying_set(bset, model); } isl_set_free(set); hull = isl_basic_map_simplify(hull); return isl_basic_map_finalize(hull); error: isl_basic_map_free(model); isl_set_free(set); return NULL; }
/// Translate a isl_map to a ScopLib matrix. /// /// @param map The map to be translated /// @return A ScopLib Matrix scoplib_matrix_p ScopLib::scatteringToMatrix(__isl_take isl_map *map) { map = isl_map_compute_divs (map); map = isl_map_align_divs (map); // Initialize the matrix. unsigned NbRows, NbColumns; NbRows = 0; NbColumns = isl_map_n_in(map) + isl_map_n_param(map) + 2; scoplib_matrix_p matrix = scoplib_matrix_malloc(NbRows, NbColumns); // Copy the content into the matrix. isl_map_foreach_basic_map(map, &scatteringToMatrix_basic_map, matrix); // Only keep the relevant rows. scoplib_matrix_p reduced = scoplib_matrix_ncopy(matrix, isl_map_n_in(map) * 2 + 1); scoplib_matrix_free (matrix); isl_map_free(map); return reduced; }