|
1 |
| -from ..metasum import MetaSummary, ValueIndices |
| 1 | +import random |
2 | 2 |
|
3 | 3 | import pytest
|
| 4 | +import numpy as np |
| 5 | + |
| 6 | +from ..metasum import DimIndex, DimTypes, MetaSummary, ValueIndices |
4 | 7 |
|
5 | 8 |
|
6 | 9 | vidx_test_patterns = ([0] * 8,
|
|
14 | 17 |
|
15 | 18 | @pytest.mark.parametrize("in_list", vidx_test_patterns)
|
16 | 19 | def test_value_indices_basics(in_list):
|
17 |
| - '''Test we can roundtrip list -> ValueIndices -> list''' |
| 20 | + '''Test basic ValueIndices behavior''' |
18 | 21 | vidx = ValueIndices(in_list)
|
19 | 22 | assert vidx.n_input == len(in_list)
|
20 | 23 | assert len(vidx) == len(set(in_list))
|
21 | 24 | assert sorted(vidx.values()) == sorted(list(set(in_list)))
|
22 | 25 | for val in vidx.values():
|
23 | 26 | assert vidx.count(val) == in_list.count(val)
|
24 | 27 | for in_idx in vidx[val]:
|
25 |
| - assert in_list[in_idx] == val |
| 28 | + assert in_list[in_idx] == val == vidx.get_value(in_idx) |
26 | 29 | out_list = vidx.to_list()
|
27 | 30 | assert in_list == out_list
|
28 | 31 |
|
@@ -78,3 +81,73 @@ def test_meta_summary_basics(in_dicts):
|
78 | 81 | assert out_dict == in_dicts[in_idx]
|
79 | 82 | for key, in_val in in_dicts[in_idx].items():
|
80 | 83 | assert in_val == msum.get_val(in_idx, key)
|
| 84 | + |
| 85 | + |
| 86 | +def _make_nd_meta(shape, dim_info, const_meta=None): |
| 87 | + if const_meta is None: |
| 88 | + const_meta = {'series_number': '5'} |
| 89 | + meta_seq = [] |
| 90 | + for nd_idx in np.ndindex(*shape): |
| 91 | + curr_meta = {} |
| 92 | + curr_meta.update(const_meta) |
| 93 | + for dim, dim_idx in zip(dim_info, nd_idx): |
| 94 | + curr_meta[dim.key] = dim_idx |
| 95 | + meta_seq.append(curr_meta) |
| 96 | + return meta_seq |
| 97 | + |
| 98 | + |
| 99 | +ndsort_test_args = (((3,), |
| 100 | + (DimIndex(DimTypes.SLICE, 'slice_location'),), |
| 101 | + None), |
| 102 | + ((3, 5), |
| 103 | + (DimIndex(DimTypes.SLICE, 'slice_location'), |
| 104 | + DimIndex(DimTypes.TIME, 'acq_time')), |
| 105 | + None), |
| 106 | + ((3, 5), |
| 107 | + (DimIndex(DimTypes.SLICE, 'slice_location'), |
| 108 | + DimIndex(DimTypes.PARAM, 'inversion_time')), |
| 109 | + None), |
| 110 | + ((3, 5, 7), |
| 111 | + (DimIndex(DimTypes.SLICE, 'slice_location'), |
| 112 | + DimIndex(DimTypes.TIME, 'acq_time'), |
| 113 | + DimIndex(DimTypes.PARAM, 'echo_time')), |
| 114 | + None), |
| 115 | + ((3, 5, 7), |
| 116 | + (DimIndex(DimTypes.SLICE, 'slice_location'), |
| 117 | + DimIndex(DimTypes.PARAM, 'inversion_time'), |
| 118 | + DimIndex(DimTypes.PARAM, 'echo_time')), |
| 119 | + None), |
| 120 | + ((5, 3), |
| 121 | + (DimIndex(DimTypes.TIME, 'acq_time'), |
| 122 | + DimIndex(DimTypes.PARAM, 'echo_time')), |
| 123 | + None), |
| 124 | + ((3, 5, 7), |
| 125 | + (DimIndex(DimTypes.TIME, 'acq_time'), |
| 126 | + DimIndex(DimTypes.PARAM, 'inversion_time'), |
| 127 | + DimIndex(DimTypes.PARAM, 'echo_time')), |
| 128 | + None), |
| 129 | + ((5, 7), |
| 130 | + (DimIndex(DimTypes.PARAM, 'inversion_time'), |
| 131 | + DimIndex(DimTypes.PARAM, 'echo_time')), |
| 132 | + None), |
| 133 | + ((5, 7, 3), |
| 134 | + (DimIndex(DimTypes.PARAM, 'inversion_time'), |
| 135 | + DimIndex(DimTypes.PARAM, 'echo_time'), |
| 136 | + DimIndex(DimTypes.PARAM, 'repetition_time')), |
| 137 | + None), |
| 138 | + ) |
| 139 | + |
| 140 | + |
| 141 | +@pytest.mark.parametrize("shape,dim_info,const_meta", ndsort_test_args) |
| 142 | +def test_ndsort(shape, dim_info, const_meta): |
| 143 | + meta_seq = _make_nd_meta(shape, dim_info, const_meta) |
| 144 | + rand_idx_seq = [(i, m) for i, m in enumerate(meta_seq)] |
| 145 | + # TODO: Use some pytest plugin to manage randomness? Just use fixed seed? |
| 146 | + random.shuffle(rand_idx_seq) |
| 147 | + rand_idx = [x[0] for x in rand_idx_seq] |
| 148 | + rand_seq = [x[1] for x in rand_idx_seq] |
| 149 | + msum = MetaSummary() |
| 150 | + for meta in rand_seq: |
| 151 | + msum.append(meta) |
| 152 | + out_shape, out_idxs = msum.nd_sort(dim_info) |
| 153 | + assert shape == out_shape |
0 commit comments