Source code for gefest.core.opt.adapters.structure

from golem.core.adapter.adapter import BaseOptimizationAdapter
from golem.core.optimisers.graph import OptGraph, OptNode
from loguru import logger

from gefest.core.geometry import Point, Polygon, Structure
from gefest.core.geometry.domain import Domain


[docs] class StructureAdapter(BaseOptimizationAdapter): """Adapter for GOLEM.""" def __init__(self, domain: Domain) -> None: super().__init__(base_graph_class=Structure) self.domain = domain def _point_to_node(self, point) -> OptNode: if type(point) is OptNode: self._log.warn('Unexpected: OptNode found in adapter instead' 'Point.') else: content = { 'name': f'pt_{point.x}_{point.y}', 'params': {}, } node = OptNode(content=content) node.content['params'] = { 'x': point.x, 'y': point.y, } return node
[docs] def _adapt(self, adaptee: Structure) -> OptGraph: """Convert Structure into OptGraph.""" nodes = [] for polygon in adaptee.polygons: if polygon[-1] == polygon[0]: polygon = polygon[:-1] prev_node = None for point_id in range(len(polygon.points)): node = self._point_to_node(polygon.points[point_id]) if prev_node: node.nodes_from = [prev_node] prev_node = node nodes.append(node) graph = OptGraph(nodes) return graph
[docs] def _restore(self, opt_graph: OptGraph) -> Structure: """Convert OptGraph into Structure.""" structure = [] poly = Polygon() first_node = opt_graph.nodes[0] if not len(first_node.nodes_from): poly.points.append( Point( first_node.content['params']['x'], first_node.content['params']['y'], ), ) else: logger.critical('Unexpected nodes order. First node is not root.') for node in opt_graph.nodes[1:]: if not len(node.nodes_from): if self.domain.geometry.is_closed: poly.points.append(poly[0]) structure.append(poly) poly = Polygon() poly.points.append( Point( node.content['params']['x'], node.content['params']['y'], ), ) if poly not in structure: if self.domain.geometry.is_closed: poly.points.append(poly[0]) structure.append(poly) return Structure(structure)