void network_trainer_sgd::train_step(
		supervised_data_reader& reader,
		training_task_state& task)
	{
		boost::chrono::steady_clock::time_point start = boost::chrono::high_resolution_clock::now();

		std::pair<std::vector<std::vector<float> >, std::string> lr_and_comment = prepare_learning_rates(task.get_current_epoch(), task.data);
		task.comments.push_back(lr_and_comment.second);

		std::pair<testing_result_smart_ptr, training_stat_smart_ptr> train_result = updater->update(
			reader,
			lr_and_comment.first,
			task.data,
			batch_size,
			weight_decay,
			momentum,
			layer_to_dropout_rate_map);

		boost::chrono::duration<float> sec = (boost::chrono::high_resolution_clock::now() - start);

		float flops = updater->get_flops_for_single_entry();

		train_result.first->time_to_complete_seconds = sec.count();
		train_result.first->flops = static_cast<float>(train_result.first->get_entry_count()) * flops;

		task.history.push_back(train_result);
	}
	void network_trainer_sgd::train_step(
		structured_data_bunch_reader& reader,
		training_task_state& task)
	{
		boost::chrono::steady_clock::time_point start = boost::chrono::high_resolution_clock::now();

		std::pair<std::map<std::string, std::vector<float> >, std::string> lr_and_comment = prepare_learning_rates(task.get_current_epoch(), task.data);
		task.comments.push_back(lr_and_comment.second);

		neuron_value_set_data_bunch_writer writer;
		backward_propagation::stat training_stat = backprop->run(
			reader,
			writer,
			*task.data,
			task.momentum_data,
			lr_and_comment.first,
			batch_size,
			weight_decay,
			momentum);
		std::map<std::string, std::pair<layer_configuration_specific, nnforge_shared_ptr<std::vector<float> > > > output_data_average_results;
		for(std::map<std::string, std::pair<layer_configuration_specific, neuron_value_set::ptr> >::const_iterator it = writer.layer_name_to_config_and_value_set_map.begin(); it != writer.layer_name_to_config_and_value_set_map.end(); ++it)
			output_data_average_results.insert(std::make_pair(it->first, std::make_pair(it->second.first, it->second.second->get_average())));

		task.history.push_back(std::make_pair(training_stat, output_data_average_results));
	}