Download source/tests/unit/models/test_peagle_data.py from khazic/spec-b300: direct link, hf CLI and curl.
- Browser
- Download file 3.77 kB
-
https://huggingface.co/khazic/spec-b300/resolve/main/source/tests/unit/models/test_peagle_data.py
- Command line
-
hf download hf://khazic/spec-b300/source/tests/unit/models/test_peagle_data.py
-
curl -L -o test_peagle_data.py https://huggingface.co/khazic/spec-b300/resolve/main/source/tests/unit/models/test_peagle_data.py
3.77 kB
| """Unit tests for P-EAGLE COD sampling with max_anchors.""" | |
| import torch | |
| from speculators.models.peagle.data import generate_cod_sample_indices | |
| def _loss_mask(seq_length: int) -> torch.Tensor: | |
| return torch.ones(1, seq_length, dtype=torch.float32) | |
| class TestMaxAnchors: | |
| def test_depth0_is_full_sequence(self): | |
| """Depth 0 should always be the full sequence regardless of max_anchors.""" | |
| seq_len = 32 | |
| anchor_pos, depth = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=_loss_mask(seq_len), | |
| num_depths=4, | |
| max_anchors=4, | |
| ) | |
| depth0_positions = anchor_pos[depth == 0] | |
| assert depth0_positions.shape[0] == seq_len | |
| assert torch.equal(depth0_positions, torch.arange(seq_len)) | |
| def test_max_anchors_caps_chains(self): | |
| """With max_anchors, depth-1+ chains should not exceed max_anchors.""" | |
| seq_len = 64 | |
| max_anchors = 8 | |
| anchor_pos, depth = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=_loss_mask(seq_len), | |
| num_depths=4, | |
| max_anchors=max_anchors, | |
| ) | |
| for d in range(1, 4): | |
| assert (depth == d).sum().item() <= max_anchors | |
| def test_max_anchors_preserves_full_depth0(self): | |
| """Depth 0 count should equal seq_length even with small max_anchors.""" | |
| seq_len = 128 | |
| anchor_pos, depth = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=_loss_mask(seq_len), | |
| num_depths=8, | |
| max_anchors=4, | |
| ) | |
| assert (depth == 0).sum().item() == seq_len | |
| def test_max_anchors_none_uses_all(self): | |
| """max_anchors=None should use all valid positions (default behavior).""" | |
| seq_len = 32 | |
| torch.manual_seed(42) | |
| anchor_pos_none, depth_none = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=_loss_mask(seq_len), | |
| num_depths=4, | |
| max_anchors=None, | |
| ) | |
| torch.manual_seed(42) | |
| anchor_pos_default, depth_default = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=_loss_mask(seq_len), | |
| num_depths=4, | |
| ) | |
| assert torch.equal(anchor_pos_none, anchor_pos_default) | |
| assert torch.equal(depth_none, depth_default) | |
| def test_max_anchors_fewer_valid_than_cap(self): | |
| """When valid positions < max_anchors, all valid positions are used.""" | |
| seq_len = 16 | |
| loss_mask = torch.zeros(1, seq_len) | |
| loss_mask[0, :5] = 1 | |
| torch.manual_seed(42) | |
| anchor_pos_capped, depth_capped = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=loss_mask, | |
| num_depths=4, | |
| max_anchors=100, | |
| ) | |
| torch.manual_seed(42) | |
| anchor_pos_none, depth_none = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=loss_mask, | |
| num_depths=4, | |
| max_anchors=None, | |
| ) | |
| assert (depth_capped == 0).sum().item() == seq_len | |
| assert torch.equal(anchor_pos_capped, anchor_pos_none) | |
| assert torch.equal(depth_capped, depth_none) | |
| def test_max_anchors_sorted_order(self): | |
| """Subsampled anchors should be in sorted order for causal masking.""" | |
| seq_len = 64 | |
| anchor_pos, depth = generate_cod_sample_indices( | |
| seq_length=seq_len, | |
| loss_mask=_loss_mask(seq_len), | |
| num_depths=4, | |
| max_anchors=8, | |
| ) | |
| for d in range(1, 4): | |
| d_anchors = anchor_pos[depth == d] | |
| if d_anchors.shape[0] > 1: | |
| assert torch.all(d_anchors[1:] >= d_anchors[:-1]) | |