Lines Matching defs:morph
24 isl_ctx *isl_morph_get_ctx(__isl_keep isl_morph *morph)
26 if (!morph)
28 return isl_basic_set_get_ctx(morph->dom);
35 isl_morph *morph;
40 morph = isl_alloc_type(dom->ctx, struct isl_morph);
41 if (!morph)
44 morph->ref = 1;
45 morph->dom = dom;
46 morph->ran = ran;
47 morph->map = map;
48 morph->inv = inv;
50 return morph;
59 __isl_give isl_morph *isl_morph_copy(__isl_keep isl_morph *morph)
61 if (!morph)
64 morph->ref++;
65 return morph;
68 __isl_give isl_morph *isl_morph_dup(__isl_keep isl_morph *morph)
70 if (!morph)
73 return isl_morph_alloc(isl_basic_set_copy(morph->dom),
74 isl_basic_set_copy(morph->ran),
75 isl_mat_copy(morph->map), isl_mat_copy(morph->inv));
78 __isl_give isl_morph *isl_morph_cow(__isl_take isl_morph *morph)
80 if (!morph)
83 if (morph->ref == 1)
84 return morph;
85 morph->ref--;
86 return isl_morph_dup(morph);
89 __isl_null isl_morph *isl_morph_free(__isl_take isl_morph *morph)
91 if (!morph)
94 if (--morph->ref > 0)
97 isl_basic_set_free(morph->dom);
98 isl_basic_set_free(morph->ran);
99 isl_mat_free(morph->map);
100 isl_mat_free(morph->inv);
101 free(morph);
106 /* Is "morph" an identity on the parameters?
108 static isl_bool identity_on_parameters(__isl_keep isl_morph *morph)
114 nparam = isl_morph_dom_dim(morph, isl_dim_param);
115 nparam_ran = isl_morph_ran_dim(morph, isl_dim_param);
122 sub = isl_mat_sub_alloc(morph->map, 0, 1 + nparam, 0, 1 + nparam);
129 /* Return an affine expression of the variables of the range of "morph"
130 * in terms of the parameters and the variables of the domain on "morph".
133 * that the parameters are not modified by "morph".
136 __isl_keep isl_morph *morph)
145 if (!morph)
148 is_identity = identity_on_parameters(morph);
152 isl_die(isl_morph_get_ctx(morph), isl_error_invalid,
155 dom = isl_morph_get_dom_space(morph);
157 ran = isl_morph_get_ran_space(morph);
170 v = isl_mat_get_row(morph->map, 1 + nparam + i);
172 val = isl_mat_get_element_val(morph->map, 0, 0);
182 /* Return the domain space of "morph".
185 __isl_keep isl_morph *morph)
187 if (!morph)
190 return isl_basic_set_peek_space(morph->dom);
193 /* Return a copy of the domain space of "morph".
195 __isl_give isl_space *isl_morph_get_dom_space(__isl_keep isl_morph *morph)
197 return isl_space_copy(isl_morph_peek_dom_space(morph));
213 /* Check that "morph" can be applied to the "space".
215 isl_stat isl_morph_check_applies(__isl_keep isl_morph *morph,
221 dom_space = isl_morph_peek_dom_space(morph);
226 __isl_give isl_space *isl_morph_get_ran_space(__isl_keep isl_morph *morph)
228 if (!morph)
231 return isl_space_copy(morph->ran->dim);
234 isl_size isl_morph_dom_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
236 if (!morph)
239 return isl_basic_set_dim(morph->dom, type);
242 isl_size isl_morph_ran_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
244 if (!morph)
247 return isl_basic_set_dim(morph->ran, type);
250 __isl_give isl_morph *isl_morph_remove_dom_dims(__isl_take isl_morph *morph,
256 return morph;
258 morph = isl_morph_cow(morph);
259 if (!morph)
262 dom_offset = isl_space_offset(morph->dom->dim, type);
264 return isl_morph_free(morph);
266 morph->dom = isl_basic_set_remove_dims(morph->dom, type, first, n);
268 morph->map = isl_mat_drop_cols(morph->map, 1 + dom_offset + first, n);
270 morph->inv = isl_mat_drop_rows(morph->inv, 1 + dom_offset + first, n);
272 if (morph->dom && morph->ran && morph->map && morph->inv)
273 return morph;
275 isl_morph_free(morph);
279 __isl_give isl_morph *isl_morph_remove_ran_dims(__isl_take isl_morph *morph,
285 return morph;
287 morph = isl_morph_cow(morph);
288 if (!morph)
291 ran_offset = isl_space_offset(morph->ran->dim, type);
293 return isl_morph_free(morph);
295 morph->ran = isl_basic_set_remove_dims(morph->ran, type, first, n);
297 morph->map = isl_mat_drop_rows(morph->map, 1 + ran_offset + first, n);
299 morph->inv = isl_mat_drop_cols(morph->inv, 1 + ran_offset + first, n);
301 if (morph->dom && morph->ran && morph->map && morph->inv)
302 return morph;
304 isl_morph_free(morph);
308 /* Project domain of morph onto its parameter domain.
310 __isl_give isl_morph *isl_morph_dom_params(__isl_take isl_morph *morph)
314 morph = isl_morph_cow(morph);
315 if (!morph)
317 n = isl_basic_set_dim(morph->dom, isl_dim_set);
319 return isl_morph_free(morph);
320 morph = isl_morph_remove_dom_dims(morph, isl_dim_set, 0, n);
321 if (!morph)
323 morph->dom = isl_basic_set_params(morph->dom);
324 if (morph->dom)
325 return morph;
327 isl_morph_free(morph);
331 /* Project range of morph onto its parameter domain.
333 __isl_give isl_morph *isl_morph_ran_params(__isl_take isl_morph *morph)
337 morph = isl_morph_cow(morph);
338 if (!morph)
340 n = isl_basic_set_dim(morph->ran, isl_dim_set);
342 return isl_morph_free(morph);
343 morph = isl_morph_remove_ran_dims(morph, isl_dim_set, 0, n);
344 if (!morph)
346 morph->ran = isl_basic_set_params(morph->ran);
347 if (morph->ran)
348 return morph;
350 isl_morph_free(morph);
354 /* Replace the identifier of the tuple of the range of the morph by "id".
357 __isl_take isl_morph *morph, __isl_keep isl_id *id)
359 morph = isl_morph_cow(morph);
360 if (!morph)
362 morph->ran = isl_basic_set_set_tuple_id(morph->ran, isl_id_copy(id));
363 if (!morph->ran)
364 return isl_morph_free(morph);
365 return morph;
368 void isl_morph_print_internal(__isl_take isl_morph *morph, FILE *out)
370 if (!morph)
373 isl_basic_set_dump(morph->dom);
374 isl_basic_set_dump(morph->ran);
375 isl_mat_print_internal(morph->map, out, 4);
376 isl_mat_print_internal(morph->inv, out, 4);
379 void isl_morph_dump(__isl_take isl_morph *morph)
381 isl_morph_print_internal(morph, stderr);
545 isl_morph *morph;
547 morph = isl_basic_set_variable_compression(bset, isl_dim_set);
548 morph = isl_morph_set_ran_tuple_id(morph, id);
549 return morph;
640 * in morph and intersect with the range of the morphism.
641 * Note that the mapping in morph applies to both parameters and set dimensions,
645 __isl_give isl_basic_set *isl_morph_basic_set(__isl_take isl_morph *morph,
652 if (!morph || isl_basic_set_check_equal_space(bset, morph->dom) < 0)
654 n_param = isl_basic_set_dim(morph->dom, isl_dim_param);
658 ma = isl_multi_aff_from_aff_mat_anonymous(isl_mat_copy(morph->inv));
663 space = isl_basic_set_get_space(morph->ran);
665 bset = isl_basic_set_intersect(bset, isl_basic_set_copy(morph->ran));
667 isl_morph_free(morph);
670 isl_morph_free(morph);
677 * in morph and intersect with the range of the morphism.
678 * Note that the mapping in morph applies to both parameters and set dimensions,
682 __isl_give isl_set *isl_morph_set(__isl_take isl_morph *morph,
690 if (!morph || isl_set_basic_set_check_equal_space(set, morph->dom) < 0)
692 n_param = isl_basic_set_dim(morph->dom, isl_dim_param);
696 ma = isl_multi_aff_from_aff_mat_anonymous(isl_mat_copy(morph->inv));
700 space = isl_basic_set_get_space(morph->ran);
702 ran = isl_basic_set_copy(morph->ran);
705 isl_morph_free(morph);
709 isl_morph_free(morph);
743 __isl_give isl_morph *isl_morph_inverse(__isl_take isl_morph *morph)
748 morph = isl_morph_cow(morph);
749 if (!morph)
752 bset = morph->dom;
753 morph->dom = morph->ran;
754 morph->ran = bset;
756 mat = morph->map;
757 morph->map = morph->inv;
758 morph->inv = mat;
760 return morph;
767 * quantified variables after applying the resulting morph, which
773 isl_morph *morph, *morph2;
778 morph = isl_basic_set_variable_compression(bset, isl_dim_param);
779 bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
784 morph = isl_morph_compose(morph2, morph);
789 morph = isl_morph_compose(morph2, morph);
791 return morph;
794 __isl_give isl_vec *isl_morph_vec(__isl_take isl_morph *morph,
797 if (!morph)
800 vec = isl_mat_vec_product(isl_mat_copy(morph->map), vec);
802 isl_morph_free(morph);
805 isl_morph_free(morph);