def __getitem__(self, dimension_name): subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name( dimension_name) if subgrid_name is None: return self.dimensions_dict.get(dimension_name, None) subgrid = self.subgrids_by_name[subgrid_name] return subgrid[dimension_name_without_subgrid_name]
def join(self, subgrid: Hypergrid, on_external_dimension: Dimension): """ Joins the subgrid on the specified dimension. :param subgrid: :param on_external_dimension: :return: """ if subgrid is None: return self assert on_external_dimension is not None if subgrid.name in self.dimensions_dict.keys(): raise ValueError(f"{subgrid.name} collides with a dimension name.") external_dimension = on_external_dimension join_dimension_name = external_dimension.name subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name(join_dimension_name) if subgrid_name is None: self.add_subgrid_on_external_dimension(other_hypergrid=subgrid, external_dimension=external_dimension) else: existing_subgrid = self.subgrids_by_name.get(subgrid_name, None) assert existing_subgrid is not None external_dimension = external_dimension.copy() external_dimension.name = dimension_name_without_subgrid_name self.subgrids_by_name[subgrid_name] = existing_subgrid.join( subgrid=subgrid, on_external_dimension=external_dimension ) return self
def __contains__(self, dimension_name): subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name(dimension_name) if subgrid_name is None: return dimension_name in self.dimension_value_dict if subgrid_name not in self.dimension_value_dict: return False return dimension_name_without_subgrid_name in self[subgrid_name]
def __getitem__(self, dimension_name): if dimension_name not in self: raise KeyError(f"This Point does not have a value along dimension: {dimension_name}") subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name(dimension_name) if subgrid_name is None: return self.dimension_value_dict[dimension_name] return self[subgrid_name][dimension_name_without_subgrid_name]
def __getitem__(self, dimension_name): if dimension_name not in self: return None subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name( dimension_name) if subgrid_name is None: return self.dimension_value_dict.get(dimension_name, None) return self[subgrid_name][dimension_name_without_subgrid_name]
def __setitem__(self, dimension_name, value): subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name(dimension_name) if subgrid_name is None: self.dimension_value_dict[dimension_name] = value else: point_in_subgrid = self.dimension_value_dict.get(subgrid_name, Point()) point_in_subgrid[dimension_name_without_subgrid_name] = value self.dimension_value_dict[subgrid_name] = point_in_subgrid
def __getitem__(self, dimension_or_subgrid_name): subgrid_name, name_without_subgrid_name = Dimension.split_dimension_name(dimension_or_subgrid_name) if subgrid_name is None: if name_without_subgrid_name in self.dimensions_dict.keys(): return self.dimensions_dict[dimension_or_subgrid_name] if name_without_subgrid_name in self.subgrids_by_name.keys(): return self.subgrids_by_name[name_without_subgrid_name] raise KeyError(f"{dimension_or_subgrid_name} does not match any dimension names nor any subgrid names.") subgrid = self.subgrids_by_name[subgrid_name] return subgrid[name_without_subgrid_name]
def flat_copy(self): """ Creates a copy of the point but all dimension names are flattened. :return: """ flat_dict = { Dimension.flatten_dimension_name(dimension_name): value for dimension_name, value in self } return Point(**flat_dict)
def __setattr__(self, name, value): if name == "dimension_value_dict": self.__dict__[name] = value else: dimension_name = name subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name(dimension_name) if subgrid_name is None: self.dimension_value_dict[dimension_name] = value else: point_in_subgrid = self.dimension_value_dict.get(subgrid_name, Point()) point_in_subgrid[dimension_name_without_subgrid_name] = value self.dimension_value_dict[subgrid_name] = point_in_subgrid
def join(self, subgrid: Hypergrid, on_external_dimension: Dimension): """ Joins the subgrid on the specified dimension. :param subgrid: :param on_external_dimension: :return: """ assert on_external_dimension is not None external_dimension = on_external_dimension pivot_dimension_name = external_dimension.name subgrid_name, dimension_name_without_subgrid_name = Dimension.split_dimension_name( pivot_dimension_name) if subgrid_name is None: self.add_subgrid_on_external_dimension( other_hypergrid=subgrid, external_dimension=external_dimension) else: existing_subgrid = self.subgrids_by_name.get(subgrid_name, None) assert existing_subgrid is not None external_dimension = external_dimension.copy() external_dimension.name = dimension_name_without_subgrid_name self.subgrids_by_name[subgrid_name] = existing_subgrid.join( subgrid=subgrid, on_external_dimension=external_dimension) return self