code: def is_sub_plate(self, other):
          
          if all(v in set(other.values) for v in self.values):
              return True
          if all(any(all(spv in m for spv in v) for m in map(set, other.values)) for v in self.values):
              return True
          if other in self.ancestor_plates:  # added by MK, but still not sure whether all cases are covered
              return True
          return False
docs: Determines if this plate is a sub-plate of another plate -
          i.e. has the same meta data but a restricted set of values
  
          :param other: The other plate
          :return: True if this plate is a sub-plate of the other plate