Blame view

src/constraints/var_eq_minus.c 15.8 KB
94b2b13d   Pedro Roque   PHACT source
1
2
3
4
/*
 * var_eq_minus.c
 *
 *  Created on: 16/12/2014
4d26a735   Pedro Roque   Increased recogni...
5
 *      Author: pedro
94b2b13d   Pedro Roque   PHACT source
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
 */

#ifndef __OPENCL_VERSION__

#include <stddef.h>
#include <stdio.h>

#include "var_eq_minus.h"

#include "../bitmaps.h"
#include "../config.h"
#include "../variables.h"

#endif

#include "../kernels/cl_aux_functions.h"
#if CL_D_TYPE == CL_BITMAP
#include "../kernels/cl_bitmaps.h"
#elif CL_D_TYPE == CL_INTERVAL
#include  "../kernels/cl_intervals.h"
#endif
#include "../kernels/cl_constraints.h"
#include "../kernels/cl_variables.h"
#include "../kernels/cl_ttl.h"

#ifndef __OPENCL_VERSION__

/*
 * Creates a new constraint of the var_eq_minus type and return the constraint ID
 * x = y − z
 * x_id - ID of variable x
 * y_id - ID of variable y
 * z_id - ID of variable z
 */
unsigned int c_var_eq_minus(unsigned int x_id, unsigned int y_id, unsigned int z_id) {

	// set to include in kernel compilation
	USE_CS[VAR_EQ_MINUS] = 1;
	USE_NON_CS_REIFI[VAR_EQ_MINUS] = 1;
	REV = 1;

	unsigned int c_vs[3];
	c_vs[0] = x_id;
	c_vs[1] = y_id;
	c_vs[2] = z_id;

	// creates a new generic constraint
	unsigned int c_id = c_new(c_vs, 3, NULL, 0, -1);

	// pointers to this type of constraint functions
	CS[c_id].kind = VAR_EQ_MINUS;
	CS[c_id].check_sol_f = &var_eq_minus_check;
	CS[c_id].constant_val = 0;

	return c_id;
}

/*
 * Creates a new reified constraint of the var_eq_minus type and return the constraint ID
 * x = y − z
 * x_id - ID of variable x
 * y_id - ID of variable y
 * z_id - ID of variable z
 * reif_v_id - ID of the reification variable
 */
unsigned int c_var_eq_minus_reif(unsigned int x_id, unsigned int y_id, unsigned int z_id, int reif_v_id) {

	if (VS[reif_v_id].max > 1) {
		v_del_gt(&VS[reif_v_id], 1);

		if (VS[reif_v_id].n_vals == 0) {
4d26a735   Pedro Roque   Increased recogni...
77
78
79
80
81
82
83
84
			fprintf(stderr, "\nError: Constraint VAR_EQ_MINUS_REIF makes model inconsistent at creation:\n");
			exit(-1);
		}
	}

	// set to include in kernel compilation
	USE_CS[VAR_EQ_MINUS] = 1;
	USE_CS_REIFI[VAR_EQ_MINUS] = 1;
94b2b13d   Pedro Roque   PHACT source
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
	REV = 1;

	unsigned int c_vs[3];
	c_vs[0] = x_id;
	c_vs[1] = y_id;
	c_vs[2] = z_id;

	// creates a new generic constraint
	unsigned int c_id = c_new(c_vs, 3, NULL, 0, reif_v_id);

	// pointers to this type of constraint functions
	CS[c_id].kind = VAR_EQ_MINUS;
	CS[c_id].check_sol_f = &var_eq_minus_check;
	CS[c_id].constant_val = 0;

	return c_id;
}

/*
 * Return true if the var_eq_minus constraint is respected or false if not
 * x = y − z
 * c - constraint to check if is respected
 * explored - if the CSP was already explored, which mean that all the variables must already be singletons
 * */
bool var_eq_minus_check(constr* c, bool explored) {

	// check if any variable inside same a_eq_b_minus_c constraint has domain 0, more than one value
	// or if the sum is not correct. If so, return false. Else return true.
	if (
#if CHECK_SOL_N_VALS
4d26a735   Pedro Roque   Increased recogni...
115
			(c->c_vs[0]->to_label && c->c_vs[0]->n_vals != 1) || (c->c_vs[1]->to_label && c->c_vs[1]->n_vals != 1) || (c->c_vs[2]->to_label && c->c_vs[2]->n_vals != 1) ||
94b2b13d   Pedro Roque   PHACT source
116
#endif
4d26a735   Pedro Roque   Increased recogni...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
			(c->c_vs[0]->min != c->c_vs[1]->min - c->c_vs[2]->min)) {

		if (explored) {
			fprintf(stderr, "\nError: Constraint VAR_EQ_MINUS (%d) not respected:\n", c->c_id);

			fprintf(stderr, "Variable ID=%u -> minimum=%u, maximum=%u, number of values=%u\n\n", c->c_vs[0]->v_id, b_get_min_val(&c->c_vs[0]->domain_b),
					b_get_max_val(&c->c_vs[0]->domain_b), b_cnt_vals(&c->c_vs[0]->domain_b));
			fprintf(stderr, "Variable ID=%u -> minimum=%u, maximum=%u, number of values=%u\n\n", c->c_vs[1]->v_id, b_get_min_val(&c->c_vs[1]->domain_b),
					b_get_max_val(&c->c_vs[1]->domain_b), b_cnt_vals(&c->c_vs[1]->domain_b));
			fprintf(stderr, "Variable ID=%u -> minimum=%u, maximum=%u, number of values=%u\n\n", c->c_vs[2]->v_id, b_get_min_val(&c->c_vs[2]->domain_b),
					b_get_max_val(&c->c_vs[2]->domain_b), b_cnt_vals(&c->c_vs[2]->domain_b));
		}
		return false;
	}

	return true;
}

#endif
94b2b13d   Pedro Roque   PHACT source
136
137

#if CS_VAR_EQ_MINUS == 1
4d26a735   Pedro Roque   Increased recogni...
138
139
140
141
142
143
144
145
146
/*
 * Propagate the domain of the variable with the ID prop_v_id through all the other variables on the same c_numb ID var_eq_minus constraint
 * x = y − z
 * prop_ok will be set to 1 if success or to 0 if any domain became empty
 * vs_per_c_idx - vector with all constrained variables ID per constraint, per constraint ID order
 * vs_prop_ - all CSP variables with current step values
 * prop_v_id - variable ID to propagate
 * current_cs - constraint that should be propagated for the variable with prop_v_id ID
 * vs_id_to_prop_ - circular vector with the ids of the variables to propagate
94b2b13d   Pedro Roque   PHACT source
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
 */
CUDA_FUNC void var_eq_minus_prop(CL_INTS_MEM int* vs_per_c_idx, CL_MEMORY VARS_PROP* vs_prop_, unsigned int prop_v_id, CL_MEMORY unsigned short* vs_id_to_prop_,
		bool* prop_ok TTL_CTR) {

	int x_id = vs_per_c_idx[0];
	int y_id = vs_per_c_idx[1];
	int z_id = vs_per_c_idx[2];
	bool changed_x1;
	bool changed_y1;
	bool changed_z1;
	bool changed_x2;
	bool changed_y2;
	bool changed_z2;

	if (prop_v_id == (unsigned int)x_id) {

		cl_v_del_lt_m(&changed_y1, &vs_prop_[y_id], V_MIN(vs_prop_[x_id]) + V_MIN(vs_prop_[z_id]) TTL_CTR_V);
		if (changed_y1) {
			if (V_IS_EMPTY(vs_prop_[y_id])) {
				*prop_ok = 0;
94b2b13d   Pedro Roque   PHACT source
167
168
				return;
			}
94b2b13d   Pedro Roque   PHACT source
169
		}
4d26a735   Pedro Roque   Increased recogni...
170
		cl_v_del_gt_m(&changed_y2, &vs_prop_[y_id], V_MAX(vs_prop_[x_id]) + V_MAX(vs_prop_[z_id]) TTL_CTR_V);
94b2b13d   Pedro Roque   PHACT source
171
		if (changed_y2) {
4d26a735   Pedro Roque   Increased recogni...
172
173
			if (V_IS_EMPTY(vs_prop_[y_id])) {
				*prop_ok = 0;
94b2b13d   Pedro Roque   PHACT source
174
175
176
177
				return;
			}
		}
		cl_v_del_lt_m(&changed_z1, &vs_prop_[z_id], V_MIN(vs_prop_[y_id]) - V_MAX(vs_prop_[x_id]) TTL_CTR_V);
4d26a735   Pedro Roque   Increased recogni...
178
		if (changed_z1) {
94b2b13d   Pedro Roque   PHACT source
179
			if (V_IS_EMPTY(vs_prop_[z_id])) {
4d26a735   Pedro Roque   Increased recogni...
180
181
				*prop_ok = 0;
				return;
94b2b13d   Pedro Roque   PHACT source
182
183
184
185
			}
		}
		cl_v_del_gt_m(&changed_z2, &vs_prop_[z_id], V_MAX(vs_prop_[y_id]) - V_MIN(vs_prop_[x_id]) TTL_CTR_V);
		if (changed_z2) {
4d26a735   Pedro Roque   Increased recogni...
186
			if (V_IS_EMPTY(vs_prop_[z_id])) {
94b2b13d   Pedro Roque   PHACT source
187
				*prop_ok = 0;
4d26a735   Pedro Roque   Increased recogni...
188
189
				return;
			}
94b2b13d   Pedro Roque   PHACT source
190
191
192
193
		}

		if (changed_y1 || changed_y2) {
			v_add_to_prop(vs_id_to_prop_, vs_prop_, y_id);
4d26a735   Pedro Roque   Increased recogni...
194
		}
94b2b13d   Pedro Roque   PHACT source
195
		if (changed_z1 || changed_z2) {
4d26a735   Pedro Roque   Increased recogni...
196
197
198
			v_add_to_prop(vs_id_to_prop_, vs_prop_, z_id);
		}
		return;
94b2b13d   Pedro Roque   PHACT source
199
200
201
202
	}

	if (prop_v_id == (unsigned int)y_id) {
		cl_v_del_lt_m(&changed_x1, &vs_prop_[x_id], V_MIN(vs_prop_[y_id]) - V_MAX(vs_prop_[z_id]) TTL_CTR_V);
4d26a735   Pedro Roque   Increased recogni...
203
		if (changed_x1) {
94b2b13d   Pedro Roque   PHACT source
204
			if (V_IS_EMPTY(vs_prop_[x_id])) {
4d26a735   Pedro Roque   Increased recogni...
205
206
				*prop_ok = 0;
				return;
94b2b13d   Pedro Roque   PHACT source
207
208
209
210
			}
		}
		cl_v_del_gt_m(&changed_x2, &vs_prop_[x_id], V_MAX(vs_prop_[y_id]) - V_MIN(vs_prop_[z_id]) TTL_CTR_V);
		if (changed_x2) {
4d26a735   Pedro Roque   Increased recogni...
211
			if (V_IS_EMPTY(vs_prop_[x_id])) {
94b2b13d   Pedro Roque   PHACT source
212
213
				*prop_ok = 0;
				return;
4d26a735   Pedro Roque   Increased recogni...
214
215
216
217
218
219
220
			}
		}
		cl_v_del_lt_m(&changed_z1, &vs_prop_[z_id], V_MIN(vs_prop_[y_id]) - V_MAX(vs_prop_[x_id]) TTL_CTR_V);
		if (changed_z1) {
			if (V_IS_EMPTY(vs_prop_[z_id])) {
				*prop_ok = 0;
				return;
94b2b13d   Pedro Roque   PHACT source
221
			}
4d26a735   Pedro Roque   Increased recogni...
222
223
224
225
226
227
228
		}
		cl_v_del_gt_m(&changed_z2, &vs_prop_[z_id], V_MAX(vs_prop_[y_id]) - V_MIN(vs_prop_[x_id]) TTL_CTR_V);
		if (changed_z2) {
			if (V_IS_EMPTY(vs_prop_[z_id])) {
				*prop_ok = 0;
				return;
			}
94b2b13d   Pedro Roque   PHACT source
229
230
231
232
233
234
235
236
237
238
239
240
		}

		if (changed_x1 || changed_x2) {
			v_add_to_prop(vs_id_to_prop_, vs_prop_, x_id);
		}
		if (changed_z1 || changed_z2) {
			v_add_to_prop(vs_id_to_prop_, vs_prop_, z_id);
		}
		return;
	}

	// prop_v_id == z_id
4d26a735   Pedro Roque   Increased recogni...
241
242
	cl_v_del_lt_m(&changed_x1, &vs_prop_[x_id], V_MIN(vs_prop_[y_id]) - V_MAX(vs_prop_[z_id]) TTL_CTR_V);
	if (changed_x1) {
94b2b13d   Pedro Roque   PHACT source
243
244
245
246
247
248
		if (V_IS_EMPTY(vs_prop_[x_id])) {
			*prop_ok = 0;
			return;
		}
	}
	cl_v_del_gt_m(&changed_x2, &vs_prop_[x_id], V_MAX(vs_prop_[y_id]) - V_MIN(vs_prop_[z_id]) TTL_CTR_V);
4d26a735   Pedro Roque   Increased recogni...
249
250
	if (changed_x2) {
		if (V_IS_EMPTY(vs_prop_[x_id])) {
94b2b13d   Pedro Roque   PHACT source
251
252
			*prop_ok = 0;
			return;
4d26a735   Pedro Roque   Increased recogni...
253
		}
94b2b13d   Pedro Roque   PHACT source
254
255
256
257
258
259
260
	}
	cl_v_del_lt_m(&changed_y1, &vs_prop_[y_id], V_MIN(vs_prop_[x_id]) + V_MIN(vs_prop_[z_id]) TTL_CTR_V);
	if (changed_y1) {
		if (V_IS_EMPTY(vs_prop_[y_id])) {
			*prop_ok = 0;
			return;
		}
94b2b13d   Pedro Roque   PHACT source
261
262
263
	}
	cl_v_del_gt_m(&changed_y2, &vs_prop_[y_id], V_MAX(vs_prop_[x_id]) + V_MAX(vs_prop_[z_id]) TTL_CTR_V);
	if (changed_y2) {
4d26a735   Pedro Roque   Increased recogni...
264
		if (V_IS_EMPTY(vs_prop_[y_id])) {
94b2b13d   Pedro Roque   PHACT source
265
266
			*prop_ok = 0;
			return;
4d26a735   Pedro Roque   Increased recogni...
267
		}
94b2b13d   Pedro Roque   PHACT source
268
269
	}

4d26a735   Pedro Roque   Increased recogni...
270
	if (changed_x1 || changed_x2) {
94b2b13d   Pedro Roque   PHACT source
271
272
		v_add_to_prop(vs_id_to_prop_, vs_prop_, x_id);
	}
4d26a735   Pedro Roque   Increased recogni...
273
	if (changed_y1 || changed_y2) {
94b2b13d   Pedro Roque   PHACT source
274
275
276
277
278
279
		v_add_to_prop(vs_id_to_prop_, vs_prop_, y_id);
	}
}

#if CS_R_VAR_EQ_MINUS == 1
/*
4d26a735   Pedro Roque   Increased recogni...
280
 * Validate var_eq_minus constraint to be normally propagated, when reified
94b2b13d   Pedro Roque   PHACT source
281
282
 * x = y − z
 * vs_per_c_idx - vector with all constrained variables ID per constraint, per constraint ID order
4d26a735   Pedro Roque   Increased recogni...
283
 * vs_prop_ - all CSP variables with current step values
94b2b13d   Pedro Roque   PHACT source
284
285
 * current_cs - constraint that should be propagated for the variable with prop_v_id ID
 * vs_id_to_prop_ - circular vector with the ids of the variables to propagate
4d26a735   Pedro Roque   Increased recogni...
286
 */
94b2b13d   Pedro Roque   PHACT source
287
288
CUDA_FUNC void var_eq_minus_reif( CL_INTS_MEM int* vs_per_c_idx, CL_MEMORY VARS_PROP* vs_prop_, unsigned int prop_v_id, CL_CS_MEM cl_constr* current_cs, CL_MEMORY unsigned short* vs_id_to_prop_
		CS_IGNORE_FUNC TTL_CTR) {
4d26a735   Pedro Roque   Increased recogni...
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306

	int x_id = vs_per_c_idx[0];
	int y_id = vs_per_c_idx[1];
	int z_id = vs_per_c_idx[2];
	bool changed = 0;

	if (V_N_VALS(vs_prop_[x_id]) == 1 && V_N_VALS(vs_prop_[y_id]) == 1 && V_N_VALS(vs_prop_[z_id]) == 1
			&& V_MIN(vs_prop_[x_id]) == V_MIN(vs_prop_[y_id]) - V_MIN(vs_prop_[z_id])) {

		cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 0 TTL_CTR_V);
		v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));

#if CL_CS_IGNORE
		cs_ignore[current_cs->c_id] = 1;
#endif
		return;
	}

94b2b13d   Pedro Roque   PHACT source
307
308
309
310
311
312
313
314
	if (prop_v_id == (unsigned int)x_id) {
		VARS_PROP y;
		cl_v_copy_pm(&y, &vs_prop_[y_id] TTL_CTR_V);

		cl_v_del_lt_n(&changed, &y, V_MIN(vs_prop_[x_id]) + V_MIN(vs_prop_[z_id]) TTL_CTR_V);
		if (V_IS_EMPTY(y)) {
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
94b2b13d   Pedro Roque   PHACT source
315
316
			return;
		}
4d26a735   Pedro Roque   Increased recogni...
317
		cl_v_del_gt_n(&changed, &y, V_MAX(vs_prop_[x_id]) + V_MAX(vs_prop_[z_id]) TTL_CTR_V);
94b2b13d   Pedro Roque   PHACT source
318
319
320
321
322
323
324
		if (V_IS_EMPTY(y)) {
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
			return;
		}

		VARS_PROP z;
4d26a735   Pedro Roque   Increased recogni...
325
326
		cl_v_copy_pm(&z, &vs_prop_[z_id] TTL_CTR_V);

94b2b13d   Pedro Roque   PHACT source
327
328
329
330
331
332
333
334
		cl_v_del_lt_n(&changed, &z, V_MIN(y) - V_MAX(vs_prop_[x_id]) TTL_CTR_V);
		if (V_IS_EMPTY(z)) {
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
			return;
		}
		cl_v_del_gt_n(&changed, &z, V_MAX(y) - V_MIN(vs_prop_[x_id]) TTL_CTR_V);
		if (V_IS_EMPTY(z)) {
4d26a735   Pedro Roque   Increased recogni...
335
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
94b2b13d   Pedro Roque   PHACT source
336
337
338
339
340
341
342
343
344
345
346
347
348
349
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
			return;
		}
		return;
	}

	if (prop_v_id == (unsigned int)y_id) {

		VARS_PROP x;
		cl_v_copy_pm(&x, &vs_prop_[x_id] TTL_CTR_V);

		cl_v_del_lt_n(&changed, &x, V_MIN(vs_prop_[y_id]) - V_MAX(vs_prop_[z_id]) TTL_CTR_V);
		if (V_IS_EMPTY(x)) {
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
4d26a735   Pedro Roque   Increased recogni...
350
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
94b2b13d   Pedro Roque   PHACT source
351
352
353
354
355
356
357
358
359
360
361
362
363
364
			return;
		}
		cl_v_del_gt_n(&changed, &x, V_MAX(vs_prop_[y_id]) - V_MIN(vs_prop_[z_id]) TTL_CTR_V);
		if (V_IS_EMPTY(x)) {
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
			return;
		}

		VARS_PROP z;
		cl_v_copy_pm(&z, &vs_prop_[z_id] TTL_CTR_V);

		cl_v_del_lt_n(&changed, &z, V_MIN(vs_prop_[y_id]) - V_MAX(x) TTL_CTR_V);
		if (V_IS_EMPTY(z)) {
4d26a735   Pedro Roque   Increased recogni...
365
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
94b2b13d   Pedro Roque   PHACT source
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
			return;
		}
		cl_v_del_gt_n(&changed, &z, V_MAX(vs_prop_[y_id]) - V_MIN(x) TTL_CTR_V);
		if (V_IS_EMPTY(z)) {
			cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
			v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
			return;
		}
		return;
	}

	// if prop_v_id == z_id
	VARS_PROP x;
	cl_v_copy_pm(&x, &vs_prop_[x_id] TTL_CTR_V);

	cl_v_del_lt_n(&changed, &x, V_MIN(vs_prop_[y_id]) - V_MAX(vs_prop_[z_id]) TTL_CTR_V);
	if (V_IS_EMPTY(x)) {
		cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
		v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
4d26a735   Pedro Roque   Increased recogni...
386
387
388
389
390
391
392
393
394
395
		return;
	}
	cl_v_del_gt_n(&changed, &x, V_MAX(vs_prop_[y_id]) - V_MIN(vs_prop_[z_id]) TTL_CTR_V);
	if (V_IS_EMPTY(x)) {
		cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
		v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
		return;
	}

	VARS_PROP y;
94b2b13d   Pedro Roque   PHACT source
396
397
	cl_v_copy_pm(&y, &vs_prop_[y_id] TTL_CTR_V);

4d26a735   Pedro Roque   Increased recogni...
398
	cl_v_del_lt_n(&changed, &y, V_MIN(x) + V_MIN(vs_prop_[z_id]) TTL_CTR_V);
94b2b13d   Pedro Roque   PHACT source
399
400
401
	if (V_IS_EMPTY(y)) {
		cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
		v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
4d26a735   Pedro Roque   Increased recogni...
402
		return;
94b2b13d   Pedro Roque   PHACT source
403
404
	}
	cl_v_del_gt_n(&changed, &y, V_MAX(x) + V_MAX(vs_prop_[z_id]) TTL_CTR_V);
4d26a735   Pedro Roque   Increased recogni...
405
406
407
408
409
410
411
412
	if (V_IS_EMPTY(y)) {
		cl_v_bool_del_val_m(&vs_prop_[current_cs->reif_var_id], 1 TTL_CTR_V);
		v_add_to_prop(vs_id_to_prop_, vs_prop_, convert_int(current_cs->reif_var_id));
	}
}

/*
 * Propagate the domain of the variable with the ID prop_v_id through all the other variables on the same c_numb ID var_eq_minus opposite constraint
94b2b13d   Pedro Roque   PHACT source
413
 * x != y − z
94b2b13d   Pedro Roque   PHACT source
414
 * vs_per_c_idx - vector with all constrained variables ID per constraint, per constraint ID order
4d26a735   Pedro Roque   Increased recogni...
415
 * vs_prop_ - all CSP variables with current step values
94b2b13d   Pedro Roque   PHACT source
416
 * prop_v_id - variable ID to propagate
94b2b13d   Pedro Roque   PHACT source
417
418
 * current_cs - constraint that should be propagated for the variable with prop_v_id ID
 * vs_id_to_prop_ - circular vector with the ids of the variables to propagate
4d26a735   Pedro Roque   Increased recogni...
419
 */
94b2b13d   Pedro Roque   PHACT source
420
421
422
423
424
425
426
427
428
#ifndef __OPENCL_VERSION__
#if CS_IGNORE == 0
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#endif
#endif
CUDA_FUNC void var_eq_minus_prop_opposite(CL_INTS_MEM int* vs_per_c_idx, CL_MEMORY VARS_PROP* vs_prop_, CL_CS_MEM cl_constr* current_cs,
		bool* prop_ok CS_IGNORE_FUNC TTL_CTR) {