void Solution::dump() {
    computeCosts();
    std::cout << "Solution: totalDistance: " << totalDistance
              << ", totalCost: " << totalCost
              << std::endl << "Routes:" << std::endl;
    for (int i=0; i<R.size(); i++)
        R[i].dump();
    std::cout << "mapOtoR: ";
    for (int i=0; i<mapOtoR.size(); i++) {
        if (i) std::cout << ", ";
        std::cout << mapOtoR[i];
    }
    std::cout << std::endl;
}
bool StompOptimizationTask::execute(std::vector<Eigen::VectorXd>& parameters,
                     std::vector<Eigen::VectorXd>& projected_parameters,
                     Eigen::VectorXd& costs,
                     Eigen::MatrixXd& weighted_feature_values,
                     const int iteration_number,
                     const int rollout_number,
                     int thread_id,
                     bool compute_gradients,
                     std::vector<Eigen::VectorXd>& gradients,
                     bool& validity)
{
  int rollout_id = num_rollouts_;
  if (rollout_number >= 0)
  {
    rollout_id = rollout_number;
    last_executed_rollout_ = rollout_number;
  }

  computeFeatures(parameters, rollout_id, validity);
  computeCosts(trajectories_[rollout_id]->features_, costs, weighted_feature_values);

  return true;
}