ParseBlock* TemporalConstrain::toBlock() const
{
  ParseBlock *ret = new ParseBlock;
  
  ret->setProperty("min_time", numberToString(min_time));
  ret->setProperty("max_time", numberToString(max_time));
  ret->setProperty("updraft_id", numberToString(updraft_id));
  
  return ret;
}
ParseBlock* FireworksConfig::toBlock() const
{
    ParseBlock *ret = resolution::CostConfig::toBlock();
    
    ret->setProperty("am", functions::numberToString(am));
    ret->setProperty("bm", functions::numberToString(bm));
    ret->setProperty("mm", functions::numberToString(mm));
    ret->setProperty("m", functions::numberToString(m));
    ret->setProperty("amplitude_mult", functions::numberToString(amplitude_mult));
    
    return ret;
}
ParseBlock* CRGenetics::toBlock() const
{
    ParseBlock *ret = resolution::CRAlgorithm::toBlock();
    
    ret->setProperty("algorithm", "Genetic");
    
    return ret;
}
ParseBlock* GeneticConfig::toBlock() const
{
    ParseBlock *ret = resolution::CostConfig::toBlock();
    
    ret->setProperty("initializer_type", initializer_type);
    ret->setProperty("crossover_type", crossover_type);
    ret->setProperty("mutator_type", mutator_type);
    ret->setProperty("custom_evolution", boolToString(custom_evolution));
    ret->setProperty("search_ratio", numberToString(search_ratio));
    ret->setProperty("max_checks", numberToString(max_checks));
    ret->setProperty("mutation_probability", numberToString(pMutation));
    ret->setProperty("crossover_probability", numberToString(pCrossover));
    ret->setProperty("mutation_deviation", numberToString(mutation_dev));
    
    return ret;
}
ParseBlock* AlgorithmConfig::toBlock() const
{
  ParseBlock *block = new ParseBlock;
  
  block->setProperty("export_trajectories", functions::boolToString(export_trajectories));
  block->setProperty("trajectory_filename", trajectory_filename);
  block->setProperty("export_solution", functions::boolToString(export_solution));
  block->setProperty("solution_filename", solution_filename);
  block->setProperty("debug", functions::boolToString(debug));
  block->setProperty("double_geometry", functions::printVector(double_geometry));
  block->setProperty("geometry_expansion", functions::numberToString(geometry_expansion));
  
  return block;
}
ParseBlock* CostConfig::toBlock() const
{
    ParseBlock *ret = resolution::AlgorithmConfig::toBlock();
    
    // Type
    ret->setProperty("cost_type", objective_type);
    
    // Bounds
    
    ParseBlock *bounds_block = new ParseBlock;
    
    bounds_block->setProperty("upper", functions::printVector(upper_bounds));
    bounds_block->setProperty("lower", functions::printVector(lower_bounds));
    bounds_block->setProperty("speed", functions::printVector(speed_bounds));
    
    ret->setBlock("bounds", bounds_block);

    
    // Cost parameters
    ParseBlock *cost_block = new ParseBlock;
    
    cost_block -> setProperty("distance", numberToString(distance_cost));
    cost_block -> setProperty("collision_penalty", numberToString(collision_penalty));
    ret->setBlock("cost", cost_block);
    
    // Sampling parameters
    ret->setProperty("population", numberToString(population));
    ret->setProperty("generations", numberToString(generations));
    ret->setProperty("max_time", numberToString(max_time));
    
    ret->setProperty("waypoint_dimension", numberToString(waypoint_dimension));
    ret->setProperty("intermediate_waypoints", numberToString(intermediate_waypoints));
    ret->setProperty("altitude_levels", boolToString(altitude_levels));
    ret->setProperty("altitude_step", numberToString(altitude_step));
    ret->setProperty("export_evolution", boolToString(export_evolution));
    ret->setProperty("evolution_filename", evolution_file);
    ret->setProperty("time_exploration", boolToString(time_exploration));
    switch (time_exploration_type) {
      case INDEPENDENT_VELOCITY:
	ret->setProperty("time_exploration_type", numberToString(INDEPENDENT_VELOCITY));
	break;
	
      default:
	ret->setProperty("time_exploration_type", numberToString(MANTAIN_ETA));
    }
    ret->setProperty("speed_factor", numberToString(speed_factor));
    
    // MS-PSO stuff
    ret->setProperty("manoeuvre_selection", boolToString(manoeuvre_selection));
    ret->setProperty("min_z", numberToString(min_z));
    ret->setProperty("max_z", numberToString(max_z));
    ret->setProperty("max_course", numberToString(max_course));
    
    return ret;
}