actions.h
6.47 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
/*
* 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"
#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_BOOL2INT 1 // Set to 1 to ignore bool2int 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_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
#define FZN_MAX_ARRAYS 50
#define FZN_MAX_ANNOTATIONS 50
extern int FZN_OPTIMIZE; // if the the optimization is for minimize or maximize
#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 idx
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 {
int* values;
int* values_aux;
int max_values;
int next_position;
int min;
int max;
unsigned int id;
char* name;
bool to_label;
bool var_is_introduced;
bool is_defined_var;
int defined_by_constr_idx;
bool output_var;
bool ignore;
int replace_by_v_id;
bool range;
bool created;
};
// Flatzinc representation of a CSP constraint
struct fzn_constr {
char* name;
unsigned int* vars_id;
unsigned int* vars_id_aux;
int next_var_to_add;
int max_vars;
int* consts;
int* consts_aux;
int next_const_to_add;
int max_consts;
int defines_var_idx;
bool ignore;
bool boundsZ;
bool boundsR;
bool boundsD;
bool domain;
bool priority;
bool priority_v_id;
unsigned int id;
int pos_init_2_array; // position of elements where second array of elements begins (for bool_clause constraint only)
};
// Array for storing values that may be the ID of variables or constant values
struct fzn_array {
int* values;
int* values_aux;
int max_values;
int next_position;
char* name;
bool output_array;
bool to_label;
bool var_is_introduced;
bool is_defined_var;
bool output_var;
bool var_array;
};
// Output arrays
struct fzn_output_array {
unsigned int* vars_id;
unsigned int* vars_id_aux;
char *name;
int max_vars;
int next_position;
};
// Search annotations
struct fzn_search_annotat {
char* search_type;
char* label_array_name;
char* label_heur;
char* assign_heur;
char* search_strategy;
};
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_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 /* SRC_UTILS_FLATZINC_ACTIONS_H */