def is_shift_of(self, other):
        """
        returns True if this context's shift set is a super-set of
        the other context's shift set
        """
        try:
            return self._is_shift_of_cache[other._id_obj]
        except __HOLE__:
            pass

        if self._parent is not (other._parent or other) \
        and self is not other:
            return False

        self_key = self._shift_key_set
        other_key = other._shift_key_set

        # if the keys are the same both contexts are shifts of each other        
        if self_key == other_key:
            self._is_shift_of_cache[other._id_obj] = True
            other._is_shift_of_cache[self._id_obj] = True
            return True

        # if self is a shift of other then other may not be a shift of self
        if self_key.issuperset(other_key):
            self._is_shift_of_cache[other._id_obj] = True 
            other._is_shift_of_cache[self._id_obj] = False
            return True

        # self is not a shift of other, but other may be a shift of self
        self._is_shift_of_cache[other._id_obj] = False
        return False
dataset/ETHPy150Open manahl/mdf/mdf/context.py/MDFContext.is_shift_of