> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bioptimus.com/llms.txt
> Use this file to discover all available pages before exploring further.

# multi_model_dataset

Multi-model dataset for joint histology and omics inference.

Wraps a single WSI together with optional bulk RNA data, providing lazy patch access and a PyTorch-compatible `__getitem__` interface.

## MultiModelData

```python theme={null}
class MultiModelData()
```

Wraps a single Whole Slide Image with its extraction plan.

On construction the slide is opened via `WSI` and the extractor is fitted + executed to produce a list of `RegionSpec`.  Each spec describes one tile/patch location.  Patches are read lazily via `get_patch`.

<ParamField body="wsi_path">
  Path to the WSI file (any format supported by `WSI`).
</ParamField>

<ParamField body="bulk_rna_path">
  Optional path to bulk RNA CSV.
</ParamField>

<ParamField body="extractor">
  A *configured* `TileExtractor`.  A fresh `fit_extract` is called for every slide so the same extractor object can be reused across slides.
</ParamField>

<ParamField body="transform">
  Optional callable applied to the raw `np.ndarray` patch **before** it is returned.  Receives `(H, W, C)` uint8 and should return a transformed array (or tensor).
</ParamField>

<ParamField body="path" type="Path">
  Resolved slide path.
</ParamField>

<ParamField body="bulk_rna_path" type="Path | None">
  Resolved path to bulk RNA CSV.
</ParamField>

<ParamField body="reader" type="WSIReader">
  Open reader for the slide.
</ParamField>

<ParamField body="specs" type="List[RegionSpec]">
  Extraction plan (one entry per patch).
</ParamField>

<ParamField body="slide_name" type="str">
  Stem of the slide filename.
</ParamField>

**Example:**

```python theme={null}
wsi = MultiModelData("tissue.svs", extractor)
patch, meta = wsi.get_patch(0)
```

#### get\_patch

```python theme={null}
def get_patch(idx: int) -> Tuple[Any, Dict[str, Any]]
```

Reads a single patch from the slide.

<ParamField body="idx" type="int" required>
  Index into `specs`.
</ParamField>

<ResponseField name="returns" type="Tuple[Any, Dict[str, Any]]">
  A tuple `(patch, metadata)` where *patch* is an `np.ndarray` of shape `(H, W, C)` (or whatever the transform returns), and *metadata* is a dict with at minimum `source`, `x`, `y`, `width`, `height`, `slide_name`, and `tissue_ratio`.
</ResponseField>

**Raises:**

* `IndexError` — If *idx* is out of range.

#### close

```python theme={null}
def close() -> None
```

Closes the underlying WSI reader and releases resources.

**Example**:

```pycon theme={null}
>>> wsi.close()
```
