char * vma_info(void *ptr) { FILE *fp; char *buf = NULL; char *line = NULL; char **pairs = NULL; unsigned pairs_cnt = 0; size_t line_n = 0; buf = malloc(2048); if (!buf) goto done; buf[0] = 0; fp = fopen("/proc/self/smaps", "r"); if (!fp) goto done; while (getline(&line, &line_n, fp) != -1) { unsigned long a, b; if (sscanf(line, "%lx-%lx", &a, &b) != 2) continue; if (a <= (unsigned long)ptr && (unsigned long)ptr < b) { /* OK, found it! */ strcat(buf, " "); strcat(buf, line); while (getline(&line, &line_n, fp) != -1) { if (line[0] >= 'A' && line[0] <= 'Z' && strchr(line, ':') != NULL) { pairs = realloc(pairs, (pairs_cnt+1) * sizeof(char *)); if (!pairs) goto done; pairs[pairs_cnt++] = line; line = NULL; line_n = 0; } else { free(line); goto done; } } } } done: add_smaps(buf, pairs, pairs_cnt); free_pairs(pairs, pairs_cnt); if (fp) fclose(fp); return buf; }
void GeneticAlgorithm::Crossover(std::vector<char***> &population, float probability, float infeasibilitiesWeight, float didacticDissatisfactionWeight, float organizationalDissatisfactionWeight) { int num_pairs = population.size() / 2; int size = population.size(); std::vector<bool> free_pairs(size, true); // Losowanie par. for(int i = 0; i < num_pairs; ++i) { int x = rand() % size; int y = rand() % size; while(!free_pairs[x]) { x++; if(x == size) x = 0; } free_pairs[x] = false; while(!free_pairs[y]) { y++; if(y == size) y = 0; } free_pairs[y] = false; // Krzy¿uj. if(rand() % 100 < probability * 100) { std::vector<std::pair<int, float>> x_fitness; for(int teacher = 0; teacher < teachers_count; ++teacher) { float xf = CalculateLocalFitnessFunction(population.data(), x, teacher, didacticDissatisfactionWeight, organizationalDissatisfactionWeight); std::pair<int, float> p_x(teacher, xf); x_fitness.push_back(p_x); } std::sort(x_fitness.begin(), x_fitness.end(), [] (std::pair<int, float> &_x, std::pair<int, float> &_y) -> bool { return _x.second < _y.second; } ); int k = teachers_count / 2; // TODO: wybieraæ k na podstawie œredniej. char ***timetable1 = new char**[teachers_count]; char ***timetable2 = new char**[teachers_count]; for(int t = 0; t < teachers_count; ++t) { if(t < k) { timetable1[x_fitness[t].first] = population[x][x_fitness[t].first]; timetable2[x_fitness[t].first] = population[y][x_fitness[t].first]; } else { timetable1[x_fitness[t].first] = population[y][x_fitness[t].first]; timetable2[x_fitness[t].first] = population[x][x_fitness[t].first]; } } delete [] population[x]; delete [] population[y]; population[x] = timetable1; population[y] = timetable2; } } }
Databox *ReadAVSField( char *file_name, double default_value) { Databox *v; FILE *fp; char *header = NULL; int header_size = 0; int count; int tokens; int c; char **token, **value; char begin[64]; int i, j; int NX = -1, NY = -1, NZ = -1; int datatype = -1; /* 0 = byte, 1 = int, 2 = float, 3 = double */ int is_rect = 0; int ndim = -1; int veclen = 1; double min[3], max[3]; double X, Y, Z; double DX, DY, DZ; double *ptr; /* open the input file */ if ((fp = fopen(file_name, "rb")) == NULL) return NULL; /* read in header info */ fgets(begin,64,fp); if (strncmp(begin,"# AVS",5) != 0) return NULL; while (begin[strlen(begin)-1] != '\n') fgets(begin,64,fp); header_size = HEADER_SIZE_INIT; header = (char *)malloc(header_size); count = 0; while ((c = fgetc(fp)) != EOF) { if (count == header_size) { header_size += HEADER_SIZE_INC; header = (char *)realloc(header,header_size); } if (c == 0xC) { /* end of header */ header[count] = '\0'; break; } else header[count++] = c; } fgetc(fp); /* == 0xC */ if (parse_fld_header(header,&tokens,&token,&value) != 1) return NULL; /* extract relevant info from token/value pairs */ for (i = 0; i < tokens; i++) { if (strcmp(token[i],"dim1") == 0) NX = atoi(value[i]); else if (strcmp(token[i],"dim2") == 0) NY = atoi(value[i]); else if (strcmp(token[i],"dim3") == 0) NZ = atoi(value[i]); else if (strcmp(token[i],"ndim") == 0) { switch (ndim = atoi(value[i])) { case 1: NY = 1; case 2: NZ = 1; case 3: break; default: free_pairs(tokens,token,value); return NULL; } } else if (strcmp(token[i],"veclen") == 0) { if ((veclen = atoi(value[i])) < 1) { free_pairs(tokens,token,value); return NULL; } } else if (strcmp(token[i],"field") == 0 && strcmp(value[i],"uniform") != 0) { if (strcmp(value[i],"rectilinear") == 0) /* treat rectilinear grid as uniform to convert */ is_rect = 1; else { free_pairs(tokens,token,value); return NULL; } } else if (strcmp(token[i],"data") == 0) { if (strcmp(value[i],"byte") == 0) datatype = 0; else if (strcmp(value[i],"int") == 0 || strcmp(value[i],"integer") == 0) datatype = 1; else if (strcmp(value[i],"float") == 0 || strcmp(value[i],"single") == 0) datatype = 2; else if (strcmp(value[i],"double") == 0) datatype = 3; else { free_pairs(tokens,token,value); return NULL; } } } free_pairs(tokens,token,value); free(header); if (NX == -1 || NY == -1 || NZ == -1) { return NULL; } if (datatype == -1) { /* datatype was not set */ return NULL; } /* create the new databox structure */ /* set X, Y, Z, DX, DY, DZ to 0 initially; will calculate and set later */ if ((v = NewDataboxDefault(NX, NY, NZ, 0, 0, 0, 0, 0, 0, default_value)) == NULL) { fclose(fp); return((Databox *)NULL); } { /* get data values */ char *barray; int *iarray; float *farray; double *darray; barray = (char *)malloc(veclen); iarray = (int *)malloc(veclen*sizeof(int)); farray = (float *)malloc(veclen*sizeof(float)); darray = (double *)malloc(veclen*sizeof(double)); ptr = DataboxCoeffs(v); for (i = 0; i < NX*NY*NZ; i++) { switch (datatype) { case 0: { fread(barray,sizeof(char),veclen,fp); for (j = 0; j < veclen; j++) darray[j] = barray[j]; break; } case 1: { fread(iarray,sizeof(int),veclen,fp); for (j = 0; j < veclen; j++) darray[j] = iarray[j]; break; } case 3: { fread(darray,sizeof(double),veclen,fp); break; } case 2: default: { fread(farray,sizeof(float),veclen,fp); for (j = 0; j < veclen; j++) darray[j] = farray[j]; break; } } /* use first component by default */ ptr[i] = darray[0]; } } if (is_rect) { /* hack in rectilinear data by keeping the min and max coordinates */ float *f; int xcoords, ycoords, zcoords; int coords; xcoords = NX; ycoords = NY; zcoords = NZ; switch (ndim) { case 1: ycoords = 0; case 2: zcoords = 0; break; case 3: break; default: return NULL; } coords = xcoords + ycoords + zcoords; f = (float *)malloc((coords)*sizeof(float)); fread(f,sizeof(float),coords,fp); min[0] = f[0]; max[0] = f[xcoords-1]; if (ndim == 2) min[2] = max[2] = 0; else min[2] = f[xcoords+ycoords]; max[2] = f[xcoords+ycoords+zcoords-1]; if (ndim == 1) min[1] = max[1] = 0; else min[1] = f[xcoords]; max[1] = f[xcoords+ycoords-1]; free(f); } else { /* true uniform data */ float f[6]; fread(f,sizeof(float),6,fp); min[0] = f[0]; min[1] = f[2]; min[2] = f[4]; max[0] = f[1]; max[1] = f[3]; max[2] = f[5]; } X = min[0]; Y = min[1]; Z = min[2]; /* set DX/DY/DZ to 1 if grid is only 1 wide in that dimension */ if (NX != 1) DX = (max[0]-min[0])/(NX-1); else DX = 1; if (NY != 1) DY = (max[1]-min[1])/(NY-1); else DY = 1; if (NZ != 1) DZ = (max[2]-min[2])/(NZ-1); else DZ = 1; DataboxX(v) = X; DataboxY(v) = Y; DataboxZ(v) = Z; DataboxDx(v) = DX; DataboxDy(v) = DY; DataboxDz(v) = DZ; fclose(fp); return v; }