def ConConDisjoint(
    n_experiences: int,
    *,
    seed: Optional[int] = None,
    shuffle_order: bool = False,
    train_transform: Optional[Any] = _default_train_transform,
    eval_transform: Optional[Any] = _default_eval_transform,
    dataset_root: Optional[Union[str, Path]] = None,
) -> CLScenario:
    """
    Creates a ConCon Disjoint benchmark.

    If the dataset is not present in the computer, this method will
    automatically download and store it.

    The returned benchmark will be a domain-incremental one, where each task
    is a different domain with different confounders. In this setting,
    task-specific confounders never appear in other tasks.

    The benchmark instance returned by this method will have two fields,
    `train_stream` and `test_stream`, which can be iterated to obtain
    training and test :class:`Experience`. Each Experience contains the
    `dataset` and the associated task label.

    :param dataset_root: The root directory of the dataset.
    :param n_experiences: The number of experiences to use.
    :param seed: The seed to use.
    :param shuffle_order: Whether to shuffle the order of the experiences.
    :param train_transform: The training transform to use.
    :param eval_transform: The evaluation transform to use.

    :returns: The ConCon Disjoint benchmark.
    """
    assert (
        n_experiences == 3 or n_experiences == 1
    ), "n_experiences must be 1 or 3 for ConCon Disjoint"
    list_train_dataset = []
    list_test_dataset = []

    for i in range(3):
        train_dataset = ConConDataset("disjoint", i, root=dataset_root, train=True)
        test_dataset = ConConDataset("disjoint", i, root=dataset_root, train=False)
        train_dataset = _as_taskaware_supervised_classification_dataset(
            train_dataset, transform=train_transform
        )
        test_dataset = _as_taskaware_supervised_classification_dataset(
            test_dataset, transform=eval_transform
        )
        list_train_dataset.append(train_dataset)
        list_test_dataset.append(test_dataset)

    return build_concon_scenario(
        list_train_dataset,
        list_test_dataset,
        seed=seed,
        n_experiences=n_experiences,
        shuffle_order=shuffle_order,
    )

    Creates a ConCon Disjoint benchmark.

    If the dataset is not present in the computer, this method will
    automatically download and store it.

    The returned benchmark will be a domain-incremental one, where each task
    is a different domain with different confounders. In this setting,
    task-specific confounders never appear in other tasks.

    The benchmark instance returned by this method will have two fields,
    `train_stream` and `test_stream`, which can be iterated to obtain
    training and test :class:`Experience`. Each Experience contains the
    `dataset` and the associated task label.

    :param dataset_root: The root directory of the dataset.
    :param n_experiences: The number of experiences to use.
    :param seed: The seed to use.
    :param shuffle_order: Whether to shuffle the order of the experiences.
    :param train_transform: The training transform to use.
    :param eval_transform: The evaluation transform to use.

    :returns: The ConCon Disjoint benchmark.
    
avalanche/benchmarks/classic/concon.py