Example #1
0
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;
}