void noise_data_transformer::transform(
		const void * input_data,
		void * output_data,
		neuron_data_type::input_type type,
		const layer_configuration_specific& original_config)
	{
		if (type != neuron_data_type::type_byte)
			throw neural_network_exception("noise_data_transformer is implemented for data stored as bytes only");

		unsigned char * data = static_cast<unsigned char *>(output_data);
		unsigned int elem_count = original_config.get_neuron_count();

		for(unsigned char * data_it = data; data_it != (data + elem_count); data_it++)
		{
			int shift = max_noise_distribution(generator);
			*data_it = static_cast<unsigned char>(std::min<int>(std::max<int>((shift + static_cast<int>(*data_it)), 0), 255));
		}
	}
	void noise_data_transformer::transform(
		const float * data,
		float * data_transformed,
		const layer_configuration_specific& original_config,
		unsigned int sample_id)
	{
		unsigned int elem_count = original_config.get_neuron_count();

		{
			std::lock_guard<std::mutex> lock(gen_stream_mutex);

			for(unsigned int elem_id = 0; elem_id < elem_count; ++elem_id)
			{
				float shift = max_noise_distribution.min();
				if (max_noise_distribution.max() > max_noise_distribution.min())
					shift = max_noise_distribution(generator);
				data_transformed[elem_id] = data[elem_id] + shift;
			}
		}
	}