actions.h
9.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
* actions.h
*
* Created on: 15/12/2017
* Author: Pedro
*/
#ifndef SRC_UTILS_FLATZINC_ACTIONS_H
#define SRC_UTILS_FLATZINC_ACTIONS_H
#include "../../config.h"
#include "../../split.h"
#include "../../variables.h"
#if COMPILE_FZN
#define FZN_NE2ALL_DIFF 1 // Try to detect MiniZinc ALL DIFFERENT constraints that were changed to FlatZinc NE constraints, and reverse the change
#define FZN_REPLACE_INT_EQ 1 // Set to 1 to ignore bool2int and bool_eq and int_eq constraints and merge both variables
#define FZN_VERBOSE 0 // Print some information during the interpretation process
#define FZN_DEBUG 0 // Print some more information from yacc and bison
#define FZN_PRINT_CSP 0 // Print the CSP model loaded from the FZN file
#define FZN_STATS 0 // Print the number of variables, constraints, types of constraints and maximum domain value of the FlatZinc model
#define FZN_MAP_FZN2PHACT 0 // Print PHACT variables and constraints ID followed by the FZN correspondent
#define FZN_LABEL_ALL_VARS 0 // Mark all the CSP variables for labeling
#define FZN_LABEL_DEFINED_VARS 0 // Set for labeling all the variables marked as "is_defined_var"
#define FZN_LABEL_OUTPUT_VS 0 // Set to 1 to mark for label only the variables marked for output, when no variables are marked for labeling
#define FZN_REMOVE_DUPLICATE_CONSTRS 0 // Remove some duplicated constraints (disabled due to much time increment when dealing with many constraints)
#define FZN_SORT_CONSTR_VARS 0 // For some constraints, sort their constrained variable for FZN file input order
#define FZN_REMOVE_ACHIEVED_CONSTRS 0 // Remove some constraints already meet (done by PHACT when initial filtering is enabled)
#define FZN_MAX_ELEMENTS 300 // Maximum initial number of elements for the FlatZinc interpreter structures
#define FZN_MAX_ARRAYS 50 // Maximum initial number of elements for FlatZinc interpreter arrays
#define FZN_MAX_ANNOTATIONS 50 // Maximum initial number of elements for FlatZinc interpreter annotations
// if the the optimization is for minimize or maximize
extern int FZN_OPTIMIZE;
#define FZN_MINIMIZE 1
#define FZN_MAXIMIZE 2
typedef struct fzn_object fzn_object; // FlatZinc object used until identification as an array, constraint or variable
typedef struct fzn_var fzn_var; // Flatzinc representation of a CSP variable
typedef struct fzn_var fzn_var; // Flatzinc representation of a CSP variable
typedef struct fzn_array fzn_array; // Array for storing values that may be the ID of variables or constant values
typedef struct fzn_constr fzn_constr; // Flatzinc representation of a CSP constraint
typedef struct fzn_output_array fzn_output_array; // output arrays
typedef struct fzn_search_annotat fzn_search_annotat; // FZN search annotations
// FlatZinc object used until identification as an array, constraint or variable
struct fzn_object {
char **annots; // array with all the annotations
char **annots_aux; // to extend annotations array
int next_annot; // index of the next annotation to add to annotations array
int max_annots; // maximum current size of the annotations array
int *elements; // number of var_idx for arrays and constraints
int *elements_aux; // to extend the elements array
bool *element_is_var; // if each element on the elements array is a number or a variable ID
bool *element_is_var_aux; // to extend element_is_var array
int next_element; // next position to add an element to elements array
int max_elements; // current maximum elements in the elements array
bool is_array; // true if it is an array
bool is_constraint; // true if it is a constraint
bool is_bool; // true if it is a boolean
bool range; // true if the correspondent variable will have a range domain
int pos_init_2_array; // position of elements where second array of elements begins (for bool_clause constraint only)
};
// Flatzinc representation of a CSP variable
struct fzn_var {
unsigned int *values; // domain values
unsigned int *values_aux; // to increase domain values array
int max_values; // maximum number of values in values array
int next_position; // next position in values array where to put the next value
int min; // minimum domain value when range domain
int max; // maximum domain value when range domain
bool range; // if the variable domain its a range
int id; // id o the PHACT variable, after creating it in PHACT structures
char *name; // FlatZinc name of the variable
bool to_label; // if marked as labeled
bool var_is_introduced; // FlatZinc flag
bool is_defined_var; // FlatZinc flag
int defined_by_constr_idx; // number of the variable that de fines it if marked as is_defined_var
bool output_var; // FlatZinc flag. If to be output
bool ignore; // If must be ignored after analyzing the constraints
int replace_by_v_id; // If ignored, than must be replaced by variable with this ID
bool replace_other_v; // If this variable replaces other variables that were ignored
bool created; // if already created in PHACT variable structure
#if FZN_SEQ
label_heur label_h; // heuristic for labeling this variable, if exists and it is marked for labeling
assign_heur assign_h; // heuristic for assignment this variable, if exists and it is marked for labeling
#endif
};
// Flatzinc representation of a CSP constraint
struct fzn_constr {
char *name; // FlatZinc name of the constraint
unsigned int *vars_id; // array with the FlatZinc ID of the variables that it constrains
unsigned int *vars_id_aux; // to extend vars_id array
int next_var_to_add; // index of the vars_id to add the ID of the next constrained variable
int max_vars; // maximum variables that fit in vars_id
int *consts; // array with the constraint constants
int *consts_aux; // to extend consts array
int next_const_to_add; // index of the consts to add the next constant
int max_consts; // maximum constants that fit in consts
int defines_var_id; // FlatZinc ID of the variable that this constraint defines
bool ignore; // if this constraint must be ignored after analyzing it
bool boundsZ; // FlatZinc flag
bool boundsR; // FlatZinc flag
bool boundsD; // FlatZinc flag
bool domain; // FlatZinc flag
bool priority; // FlatZinc flag
bool priority_v_id; // FlatZinc flag
int id; // ID of the constraint after creating it in PHACT structures
int pos_init_2_array; // position of elements where second array of elements begins (for constraints that input to arrays of variables)
};
// Array for storing values that may be the ID of variables or constant values
struct fzn_array {
int *values; // array values
int *values_aux; // to extend values array
int max_values; // maximum values in values array
int next_position; // position to add the next value to values array
char *name; // FlatZinc name of the array
bool output_array; // if this array is marked to output
bool to_label; // if this array is marked to label
bool var_is_introduced; // FlatZinc flag
bool is_defined_var; // FlatZinc flag
bool output_var; // FlatZinc flag
bool var_array; // if its a variable domain
};
// Output arrays
struct fzn_output_array {
unsigned int *vars_id; // FlatZinc IDs of the variables to output
unsigned int *vars_id_aux; // To extend vars_id
char *name; // Name of the FlatZinc array
int max_vars; // Maximum elements id vars_id
int next_position; // Position in vars_id to add the next variable ID
};
// Search annotations
struct fzn_search_annotat {
char *search_type; // Flatzinc search type
char *label_array_name; // Name of the array contained the list of variables to label
char *label_heur; // labeling heuristic to use when solving the CSP
char *assign_heur; // assignment heuristic to use when solving the CSP
char *search_strategy; // strategy to use when solving the CSP
};
extern int yylex();
extern int yyparse();
extern FILE *yyin;
void yyerror(const char *s);
void parse(char *fzn_file_name);
void fzn_solve();
void fzn_add_val_to_object(int val);
void fzn_add_var_or_array_to_object(char *name);
void fzn_set_fzn_obj_range(bool range);
void fzn_add_annot_to_object(char *annot);
void fzn_set_2array_init_pos();
void fzn_extend_object_elements();
void fzn_reset_object_elements();
void fzn_new_fzn_obj_array();
void fzn_add_var_to_array(char *var_name);
void fzn_add_val_to_array(int value);
void fzn_array_copy(fzn_array *dest, fzn_array *src, int n_arrays);
int fzn_new_fzn_var_range(int min, int max);
int fzn_new_fzn_obj_var_value(int val);
int fzn_new_fzn_obj_var();
void fzn_vars_copy(fzn_var *dest, fzn_var *src, int n_vs);
void fzn_vars_extend();
void fzn_set_var_to_optimize(char *var_name);
void fzn_new_output_array();
void fzn_output_array_copy(fzn_output_array *dest, fzn_output_array *src, int n_arrays);
void fzn_add_var_id_to_output_array(unsigned int v_id);
void fzn_new_fzn_obj_constr();
void fzn_add_fzn_obj_elem_var_to_constr(int e_idx);
void fzn_add_fzn_obj_elem_val_to_constr(int e_idx);
void fzn_constrs_copy(fzn_constr *dest, fzn_constr *src, int n_constrs);
void fzn_add_fzn_obj_search_annot();
void fzn_search_annots_copy(fzn_search_annotat *dest, fzn_search_annotat *src, int n_search_annots);
void fzn_replace_fzn_v_id(int v_id_to_be_replaced, int v_id_to_replace_the_other);
void fzn_intersect_fzn_vars(int v_id_to_be_replaced, int v_id_to_replace_the_other);
void fzn_set_var_or_array_to_label(char *name);
void fzn_sort_constr_vars();
void fzn_new_csp_var(int var_idx);
void fzn_new_csp_constr(int constr_idx);
void fzn_print_csp();
void fzn_map_fzn2phact();
void fzn_print_stats();
void fzn_init_search_annots();
#endif
#endif /* SRC_UTILS_FLATZINC_ACTIONS_H */