layer_updater_cuda_smart_ptr sigmoid_layer_updater_schema::create_updater_specific(
			const layer_configuration_specific& input_configuration_specific,
			const layer_configuration_specific& output_configuration_specific) const
		{
			nnforge_shared_ptr<const sigmoid_layer> layer_derived = nnforge_dynamic_pointer_cast<const sigmoid_layer>(layer_schema);

			if (layer_derived->affected_feature_map_id_list.empty())
				return layer_updater_cuda_smart_ptr(new activation_layer_cudnn_updater_cuda(CUDNN_ACTIVATION_SIGMOID));
			else
				return layer_updater_cuda_smart_ptr(new sigmoid_partial_layer_updater_cuda());
		}
		layer_updater_cuda_smart_ptr max_subsampling_layer_updater_schema::create_updater_specific(
			const layer_configuration_specific& hyperbolic_tangent_layer_hessian_schema,
			const layer_configuration_specific& output_configuration_specific) const
		{
			layer_updater_cuda_smart_ptr res;

			switch (output_configuration_specific.dimension_sizes.size())
			{
			case 2:
				res = layer_updater_cuda_smart_ptr(new max_subsampling_2d_layer_updater_cuda());
				break;
			default:
				throw neural_network_exception((boost::format("No CUDA updater for the max subsampling layer of %1% dimensions") % output_configuration_specific.dimension_sizes.size()).str());
				break;
			}

			return res;
		}
layer_updater_cuda_smart_ptr local_contrast_subtractive_layer_updater_schema::create_updater_specific(
    const layer_configuration_specific& input_configuration_specific,
    const layer_configuration_specific& output_configuration_specific) const
{
    layer_updater_cuda_smart_ptr res;

    switch (output_configuration_specific.dimension_sizes.size())
    {
    case 2:
        res = layer_updater_cuda_smart_ptr(new local_contrast_subtractive_2d_layer_updater_cuda());
        break;
    default:
        throw neural_network_exception((boost::format("No CUDA updater for the local contrast subtractive layer of %1% dimensions") % output_configuration_specific.dimension_sizes.size()).str());
        break;
    }

    return res;
}
		layer_updater_cuda_smart_ptr softmax_layer_updater_schema::create_updater_specific(
			const layer_configuration_specific& input_configuration_specific,
			const layer_configuration_specific& output_configuration_specific) const
		{
			return layer_updater_cuda_smart_ptr(new softmax_layer_updater_cuda());
		}
		layer_updater_cuda_smart_ptr hyperbolic_tangent_layer_updater_schema::create_updater_specific(
			const layer_configuration_specific& hyperbolic_tangent_layer_hessian_schema,
			const layer_configuration_specific& output_configuration_specific) const
		{
			return layer_updater_cuda_smart_ptr(new hyperbolic_tangent_layer_updater_cuda());
		}