1 #ifdef _WIN32
2 # include <malloc.h>
3 #else
4 #include <stdlib.h>
5 #endif
6 #include <assert.h>
7 
8 #include "repair.h"
9 
repair(struct rcps_problem * problem,struct rcps_genome * genome)10 int repair(struct rcps_problem *problem, struct rcps_genome *genome) {
11 	int i, j, k;
12 	struct rcps_mode *cmode;
13 	struct rcps_alternative *calternative;
14 	struct rcps_alternative *palternative;
15 	int icalternative;
16 	int ipalternative;
17 	// XXX perhasp only allocate this once in solver
18 	int *load;
19 
20 	load = (int*)malloc(sizeof(int)*problem->resource_count);
21 
22 	for (i = 0; i < problem->job_count; i++) {
23 		if (problem->jobs[i]->genome_position == -1) {
24 			continue;
25 		}
26 		cmode = problem->jobs[i]->modes[genome->modes[
27 			problem->jobs[i]->genome_position]];
28 		/* check this job */
29 		for (j = 0; j < problem->resource_count; j++) {
30 			load[j] = 0;
31 		}
32 		for (j = 0; j < cmode->request_count; j++) {
33 			// XXX genome_index stuff
34 			if (cmode->requests[j]->genome_position == -1) {
35 				icalternative = 0;
36 			}
37 			else {
38 				icalternative =	genome->alternatives[
39 					cmode->requests[j]->genome_position];
40 			}
41 			calternative = cmode->requests[j]->alternatives[icalternative];
42 			load[icalternative] += calternative->amount;
43 			if (load[calternative->resource->index] >
44 					calternative->resource->avail) {
45 				/* this one needs repairs */
46 				for (k = 0; k < cmode->requests[j]->alternative_count; k++) {
47 					if (cmode->requests[j]->alternatives[k] == calternative) {
48 						continue;
49 					}
50 					palternative = cmode->requests[j]->alternatives[k];
51 					ipalternative = k;
52 					load[icalternative] -= calternative->amount;
53 					if ((load[ipalternative] + palternative->amount)
54 							<= palternative->resource->avail) {
55 						load[ipalternative] += palternative->amount;
56 						genome->alternatives[j]	= k;
57 						break;
58 					}
59 					load[icalternative] += calternative->amount;
60 				}
61 				if (k == cmode->requests[j]->alternative_count) {
62 					free(load);
63 					return 0;
64 				}
65 			}
66 		}
67 	}
68 	free(load);
69 	return 1;
70 }
71