def split_operations_by_type(operations: list) -> tuple:
    """
    Split input operations into sub-lists of each transformation type
    the normalization operation is placed last to apply correctly the other operations

    :param operations: list of pipeline operations
    :return: tuple of lists of the operations separated into color, geometry and independent
    """
    color, geometry, independent = [], [], []
    normalize = None
    for op in operations:
        if op.get_op_type() == 'color':
            color.append(op)
        elif op.get_op_type() == 'geometry':
            geometry.append(op)
        elif op.get_op_type() == 'normalize':
            normalize = op
        else:
            independent.append(op)
    if normalize is not None:
        color.append(normalize)  # normalization must be last color operation
    return color, geometry, independent