Points example working

This commit is contained in:
Andrei Bondarenko 2021-08-27 09:46:44 +02:00
parent dfcc24f487
commit 6df566373d
13 changed files with 518 additions and 50 deletions

View file

View file

@ -0,0 +1,83 @@
from uuid import UUID
from state.base import State
from services.bottom.V0 import Bottom
from services.primitives.float_type import Float
class PointCartesian:
def __init__(self, model: UUID, state: State):
type_model_id = state.read_dict(state.read_root(), "PointCartesian")
self.type_model = UUID(state.read_value(type_model_id))
self.model = model
self.state = state
self.point = None
def create_point(self, x: float, y: float):
if self.point is None:
self.point = (x, y)
else:
raise RuntimeError("A PointCartesian model can contain at most 1 point.")
def read_point(self):
if self.point is None:
raise RuntimeError("No point found in model.")
else:
return f"(X = {self.point[0]}, Y = {self.point[1]})"
def delete_point(self):
self.point = None
def apply_movement(self, delta_x: float, delta_y: float):
if self.point is not None:
self.point = (self.point[0] + delta_x, self.point[1] + delta_y)
else:
raise RuntimeError("No point found in model.")
def to_bottom(self):
bottom = Bottom(self.state)
# clear residual model
for element in bottom.read_outgoing_elements(self.model):
bottom.delete_element(element)
# create primitive models
c1_model = bottom.create_node()
c2_model = bottom.create_node()
Float(c1_model, self.state).create(self.point[0])
Float(c2_model, self.state).create(self.point[1])
# instantiate Point class
point_node = bottom.create_node() # create point node
bottom.create_edge(self.model, point_node, "point") # attach to model
morph_node, = bottom.read_outgoing_elements(self.type_model, "PointCartesian") # retrieve type
bottom.create_edge(point_node, morph_node, "Morphism") # create morphism link
# instantiate c1 attribute
c1_node = bottom.create_node(str(c1_model))
bottom.create_edge(self.model, c1_node, "point.c1")
c1_link = bottom.create_edge(point_node, c1_node)
bottom.create_edge(self.model, c1_link, "point.c1_link")
ltm_point_node, = bottom.read_outgoing_elements(self.type_model, "Float")
ltm_point_link, = bottom.read_outgoing_elements(self.type_model, "PointCartesian_c1")
bottom.create_edge(c1_node, ltm_point_node, "Morphism")
bottom.create_edge(c1_link, ltm_point_link, "Morphism")
# instantiate c2 attribute
c2_node = bottom.create_node(str(c2_model))
bottom.create_edge(self.model, c2_node, "point.c2")
c2_link = bottom.create_edge(point_node, c2_node)
bottom.create_edge(self.model, c2_link, "point.c2_link")
ltm_point_node, = bottom.read_outgoing_elements(self.type_model, "Float")
ltm_point_link, = bottom.read_outgoing_elements(self.type_model, "PointCartesian_c2")
bottom.create_edge(c2_node, ltm_point_node, "Morphism")
bottom.create_edge(c2_link, ltm_point_link, "Morphism")
def from_bottom(self):
bottom = Bottom(self.state)
keys = bottom.read_keys(self.model)
x_key, = filter(lambda k: k.endswith(".c1"), keys)
y_key, = filter(lambda k: k.endswith(".c2"), keys)
x_ref_node, = bottom.read_outgoing_elements(self.model, x_key)
y_ref_node, = bottom.read_outgoing_elements(self.model, y_key)
x_model = UUID(bottom.read_value(x_ref_node))
y_model = UUID(bottom.read_value(y_ref_node))
x_val_node, = bottom.read_outgoing_elements(x_model)
y_val_node, = bottom.read_outgoing_elements(y_model)
self.point = (bottom.read_value(x_val_node), bottom.read_value(y_val_node))

90
services/point/polar.py Normal file
View file

@ -0,0 +1,90 @@
from uuid import UUID
from state.base import State
from services.bottom.V0 import Bottom
from services.primitives.float_type import Float
import math
class PointPolar:
def __init__(self, model: UUID, state: State):
type_model_id = state.read_dict(state.read_root(), "PointPolar")
self.type_model = UUID(state.read_value(type_model_id))
self.model = model
self.state = state
self.point = None
def create_point(self, r: float, theta: float):
if self.point is None:
self.point = (r, theta)
else:
raise RuntimeError("A PointPolar model can contain at most 1 point.")
def read_point(self):
if self.point is None:
raise RuntimeError("No point found in model.")
else:
return f"(r = {self.point[0]}, \u03B8 = {self.point[1]})"
def delete_point(self):
self.point = None
def apply_movement(self, delta_r: float, delta_theta: float):
if self.point is not None:
self.point = (self.point[0] + delta_r, self.point[1] + delta_theta)
else:
raise RuntimeError("No point found in model.")
def to_bottom(self):
x = self.point[0]*math.cos(self.point[1]) # x = r * cos(theta)
y = self.point[0]*math.sin(self.point[1]) # y = r * sin(theta)
bottom = Bottom(self.state)
# clear residual model
for element in bottom.read_outgoing_elements(self.model):
bottom.delete_element(element)
# create primitive models
c1_model = bottom.create_node()
c2_model = bottom.create_node()
Float(c1_model, self.state).create(x)
Float(c2_model, self.state).create(y)
# instantiate Point class
point_node = bottom.create_node() # create point node
bottom.create_edge(self.model, point_node, "point") # attach to model
morph_node, = bottom.read_outgoing_elements(self.type_model, "PointPolar") # retrieve type
bottom.create_edge(point_node, morph_node, "Morphism") # create morphism link
# instantiate c1 attribute
c1_node = bottom.create_node(str(c1_model))
bottom.create_edge(self.model, c1_node, "point.c1")
c1_link = bottom.create_edge(point_node, c1_node)
bottom.create_edge(self.model, c1_link, "point.c1_link")
ltm_point_node, = bottom.read_outgoing_elements(self.type_model, "Float")
ltm_point_link, = bottom.read_outgoing_elements(self.type_model, "PointPolar_c1")
bottom.create_edge(c1_node, ltm_point_node, "Morphism")
bottom.create_edge(c1_link, ltm_point_link, "Morphism")
# instantiate c2 attribute
c2_node = bottom.create_node(str(c2_model))
bottom.create_edge(self.model, c2_node, "point.c2")
c2_link = bottom.create_edge(point_node, c2_node)
bottom.create_edge(self.model, c2_link, "point.c2_link")
ltm_point_node, = bottom.read_outgoing_elements(self.type_model, "Float")
ltm_point_link, = bottom.read_outgoing_elements(self.type_model, "PointPolar_c2")
bottom.create_edge(c2_node, ltm_point_node, "Morphism")
bottom.create_edge(c2_link, ltm_point_link, "Morphism")
def from_bottom(self):
bottom = Bottom(self.state)
keys = bottom.read_keys(self.model)
x_key, = filter(lambda k: k.endswith(".c1"), keys)
y_key, = filter(lambda k: k.endswith(".c2"), keys)
x_ref_node, = bottom.read_outgoing_elements(self.model, x_key)
y_ref_node, = bottom.read_outgoing_elements(self.model, y_key)
x_model = UUID(bottom.read_value(x_ref_node))
y_model = UUID(bottom.read_value(y_ref_node))
x_val_node, = bottom.read_outgoing_elements(x_model)
y_val_node, = bottom.read_outgoing_elements(y_model)
x = bottom.read_value(x_val_node)
y = bottom.read_value(y_val_node)
r = math.sqrt(math.pow(x, 2) + math.pow(y, 2))
theta = math.atan2(y, x)
self.point = (r, theta)