diff --git a/scvi/model/base/_base_model.py b/scvi/model/base/_base_model.py index 1e0a5c3992..1f1efdb82d 100644 --- a/scvi/model/base/_base_model.py +++ b/scvi/model/base/_base_model.py @@ -255,10 +255,12 @@ def get_anndata_manager( adata_manager = cls._per_instance_manager_store[self.id][adata_id] if adata_manager.adata is not adata: - raise ValueError( - "The provided AnnData object does not match the AnnData object " - "previously provided for setup. Did you make a copy?" + logger.info( + "AnnData object appears to be a copy. Attempting to transfer setup." ) + _assign_adata_uuid(adata, overwrite=True) + adata_manager = self.adata_manager.transfer_fields(adata) + self._register_manager_for_instance(adata_manager) return adata_manager @@ -355,7 +357,7 @@ def _validate_anndata( if adata.is_view: if copy_if_view: logger.info("Received view of anndata, making copy.") - adata = adata.copy() + adata._init_as_actual(adata.copy()) # Reassign AnnData UUID to produce a separate AnnDataManager. _assign_adata_uuid(adata, overwrite=True) else: diff --git a/tests/models/test_models.py b/tests/models/test_models.py index 9c2e00378c..f68705592d 100644 --- a/tests/models/test_models.py +++ b/tests/models/test_models.py @@ -225,7 +225,7 @@ def test_scvi(save_path): model._validate_anndata(adata2) model.get_elbo(adata2) - # test automatic transfer_anndata_setup + on a view + # test automatic transfer_anndata_setup on a view adata = synthetic_iid() SCVI.setup_anndata( adata, @@ -236,6 +236,18 @@ def test_scvi(save_path): adata2 = synthetic_iid() model.get_elbo(adata2[:10]) + # test automatic transfer_anndata_setup on a copy + adata = synthetic_iid() + SCVI.setup_anndata( + adata, + batch_key="batch", + labels_key="labels", + ) + model = SCVI(adata) + adata2 = adata.copy() + model.get_elbo(adata2) + assert adata.uns[_constants._SCVI_UUID_KEY] != adata2.uns[_constants._SCVI_UUID_KEY] + # test mismatched categories raises ValueError adata2 = synthetic_iid() adata2.obs.labels.cat.rename_categories(["a", "b", "c"], inplace=True)