Datatypes and functions are almost isomorphic to datatypes and functions for linear constraints.
typedef enum ap_gentyp_t { AP_GEN_LINE, AP_GEN_RAY, AP_GEN_VERTEX, AP_GEN_LINEMOD, AP_GEN_RAYMOD } ap_gentyp_t;
Datatype for type of generators.
typedef struct ap_generator0_t { ap_linexpr0_t* linexpr0; /* underlying expression. */ ap_gentyp_t gentyp; /* type of generator */ } ap_generator0_t;
Datatype for generators.
The constant of the expression is ignored, and the expression is assumed to be truly linear (without intervals).
typedef struct ap_generator0_array_t { ap_generator0_t* p; size_t size; } ap_generator0_array_t;
Datatype for arrays of generators.
ap_generator0_t
ap_generator0_make (ap_gentyp_t gentyp, ap_linexpr0_t* linexpr)
¶Create a generator of type gentyp with the expression linexpr.
The expression is not duplicated, just pointed to, so it becomes managed via the generator.
ap_generator0_t
ap_generator0_copy (gent ap_generator0_t* gen)
¶Duplication
void
ap_generator0_clear (ap_generator0_t* gen)
¶Clear the generator.
void
ap_generator0_fprint (FILE* stream, gent ap_generator0_t* gen, char** name_of_dim);
¶Print the linear generator on stream stream, using the array
name_of_dim to convert dimensions to variable names. If
name_of_dim is NULL
, the dimensions are named
x0,x1,...
.
Arrays are accessed directly, for example by writing
array->p[i]
(of type ap_generator0_t
),
array->p[i].gentyp
and array->p[i].linexpr0
.
One can assign a generator to the index index by writing:
array->p[index] = ap_generator0_make(gentyp,expr)
.
ap_generator0_array_t
ap_generator0_array_make (size_t size)
¶Allocate an array of size generators. The generators are initialized with NULL pointers for underlying expressions.
void
ap_generator0_array_clear (ap_generator0_array_t* array)
¶Clear the generators of the array, and then the array itself.
void
ap_generator0_array_fprint (FILE* stream, gent ap_generator0_array_t* array, char** name_of_dim)
¶Print the array on the stream.
void
ap_generator0_add_dimensions_with (ap_generator0_t* gen, gent ap_dimchange_t* dimchange)
¶ap_generator0_t
ap_generator0_add_dimensions (gent ap_generator0_t* gen, gent ap_dimchange_t* dimchange)
¶These two functions add dimensions to the generator, following
the semantics of dimchange (see the type definition of ap_dimchange_t
).
void
ap_generator0_permute_dimensions_with (ap_generator0_t* gen, gent ap_dimperm_t* perm)
¶ap_generator0_t
ap_generator0_permute_dimensions (gent ap_generator0_t* gen, gent ap_dimperm_t* perm)
¶These two functions apply the given permutation to the dimensions of gen.
void
ap_generator0_array_add_dimensions_with (ap_generator0_array_t* gen, gent ap_dimchange_t* dimchange)
¶ap_generator0_array_t
ap_generator0_array_add_dimensions (gent ap_generator0_array_t* gen, gent ap_dimchange_t* dimchange)
¶void
ap_generator0_array_permute_dimensions_with (ap_generator0_array_t* gen, gent ap_dimperm_t* perm)
¶ap_generator0_array_t
ap_generator0_array_permute_dimensions (gent ap_generator0_array_t* gen, gent ap_dimperm_t* perm)
¶Extension to arrays of the corresponding functions on generators.