| 801 | |
| 802 | # From RandomOrder |
| 803 | def inverse(self, data): |
| 804 | if len(self.transforms) == 0: |
| 805 | return data |
| 806 | |
| 807 | applied_order = None |
| 808 | if isinstance(data, monai.data.MetaTensor): |
| 809 | applied_order = self.pop_transform(data)[TraceKeys.EXTRA_INFO]["applied_order"] |
| 810 | elif isinstance(data, Mapping): |
| 811 | for key in data: |
| 812 | if isinstance(data[key], monai.data.MetaTensor) or self.trace_key(key) in data: |
| 813 | applied_order = self.pop_transform(data, key)[TraceKeys.EXTRA_INFO]["applied_order"] |
| 814 | else: |
| 815 | raise RuntimeError( |
| 816 | f"Inverse only implemented for Mapping (dictionary) or MetaTensor data, got type {type(data)}." |
| 817 | ) |
| 818 | if applied_order is None: |
| 819 | # no invertible transforms have been applied |
| 820 | return data |
| 821 | |
| 822 | # loop backwards over transforms |
| 823 | for o in reversed(applied_order): |
| 824 | if isinstance(self.transforms[o], InvertibleTransform): |
| 825 | data = _inverse_one(self.transforms[o], data, self.map_items, self.unpack_items, self.log_stats) |
| 826 | |
| 827 | return data |