def METHOD_NAME(self):
    if not any(socket.is_linked for socket in self.outputs):
        return
    surface_s = self.inputs['Surface'].sv_get()
    degree_s = self.inputs['Degree'].sv_get()
    tolerance_s = self.inputs['Tolerance'].sv_get()
    input_level = get_data_nesting_level(surface_s, data_types=(SvSurface,))
    flat_output = input_level < 2
    surface_s = ensure_nesting_level(surface_s, 2, data_types=(SvSurface,))
    degree_s = ensure_nesting_level(degree_s, 2)
    tolerance_s = ensure_nesting_level(tolerance_s, 2)
    surfaces_out = []
    for params in zip_long_repeat(surface_s, degree_s, tolerance_s):
        new_surfaces = []
        for surface, degree, tolerance in zip_long_repeat(*params):
            surface = SvNurbsSurface.get(surface)
            if surface is None:
                raise Exception("One of surfaces is not NURBS")
            if self.mode == 'DELTA':
                kwargs = dict(delta = degree)
            else:
                kwargs = dict(target = degree)
            surface = surface.reduce_degree(self.direction,
                        tolerance = tolerance,
                        logger = self.sv_logger,
                        **kwargs)
            new_surfaces.append(surface)
        if flat_output:
            surfaces_out.extend(new_surfaces)
        else:
            surfaces_out.append(new_surfaces)
    self.outputs['Surface'].sv_set(surfaces_out)