More docs
This commit is contained in:
parent
04fed97deb
commit
7ffba9a295
4 changed files with 283 additions and 2 deletions
|
|
@ -4,33 +4,94 @@ from typing import Any, List
|
||||||
|
|
||||||
|
|
||||||
class Bottom:
|
class Bottom:
|
||||||
|
"""
|
||||||
|
Implements services for LTM bottom (not yet explicitly modelled).
|
||||||
|
Implemented using the (Modelverse) state graph data structure
|
||||||
|
"""
|
||||||
def __init__(self, state: State):
|
def __init__(self, state: State):
|
||||||
self.state = state
|
self.state = state
|
||||||
|
|
||||||
def create_node(self, value=None) -> UUID:
|
def create_node(self, value=None) -> UUID:
|
||||||
|
"""
|
||||||
|
Creates a node, which optionally contains a value.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
value: value to be stored in the node
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
UUID of the node.
|
||||||
|
"""
|
||||||
if value is None:
|
if value is None:
|
||||||
return self.state.create_node()
|
return self.state.create_node()
|
||||||
else:
|
else:
|
||||||
return self.state.create_nodevalue(value)
|
return self.state.create_nodevalue(value)
|
||||||
|
|
||||||
def create_edge(self, source: UUID, target: UUID, label=None):
|
def create_edge(self, source: UUID, target: UUID, label=None):
|
||||||
|
"""
|
||||||
|
Creates an edge, which optionally is labelled.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
source: source element of the edge
|
||||||
|
target: target element of the edge
|
||||||
|
label: value to label the edge with
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
UUID of the edge.
|
||||||
|
"""
|
||||||
if label is None:
|
if label is None:
|
||||||
return self.state.create_edge(source, target)
|
return self.state.create_edge(source, target)
|
||||||
else:
|
else:
|
||||||
return self.state.create_dict(source, label, target)
|
return self.state.create_dict(source, label, target)
|
||||||
|
|
||||||
def read_value(self, node: UUID) -> Any:
|
def read_value(self, node: UUID) -> Any:
|
||||||
|
"""
|
||||||
|
Reads value stored in a node.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
node: UUID of the node to read value from
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Value contained in the node. If no value is found, returns None
|
||||||
|
"""
|
||||||
return self.state.read_value(node)
|
return self.state.read_value(node)
|
||||||
|
|
||||||
def read_edge_source(self, edge: UUID) -> UUID:
|
def read_edge_source(self, edge: UUID) -> UUID:
|
||||||
|
"""
|
||||||
|
Reads source element of an edge.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
edge: UUID of the edge to read source element of
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
UUID of source element of the edge
|
||||||
|
"""
|
||||||
result = self.state.read_edge(edge)
|
result = self.state.read_edge(edge)
|
||||||
return result[0] if result is not None else result
|
return result[0] if result is not None else result
|
||||||
|
|
||||||
def read_edge_target(self, edge: UUID) -> UUID:
|
def read_edge_target(self, edge: UUID) -> UUID:
|
||||||
|
"""
|
||||||
|
Reads target element of an edge.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
edge: UUID of the edge to read target element of
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
UUID of target element of the edge
|
||||||
|
"""
|
||||||
result = self.state.read_edge(edge)
|
result = self.state.read_edge(edge)
|
||||||
return result[1] if result is not None else result
|
return result[1] if result is not None else result
|
||||||
|
|
||||||
def read_incoming_edges(self, target: UUID, label=None) -> List[UUID]:
|
def read_incoming_edges(self, target: UUID, label=None) -> List[UUID]:
|
||||||
|
"""
|
||||||
|
Reads incoming edges of an element. Optionally, filter them based on their label
|
||||||
|
|
||||||
|
Args:
|
||||||
|
target: UUID of the element to read incoming edges for
|
||||||
|
label: value to filter edge labels by
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of UUIDs of incoming edges
|
||||||
|
"""
|
||||||
def read_label(_edge: UUID):
|
def read_label(_edge: UUID):
|
||||||
try:
|
try:
|
||||||
label_edge, = self.state.read_outgoing(_edge)
|
label_edge, = self.state.read_outgoing(_edge)
|
||||||
|
|
@ -48,6 +109,16 @@ class Bottom:
|
||||||
return edges
|
return edges
|
||||||
|
|
||||||
def read_outgoing_edges(self, source: UUID, label=None) -> List[UUID]:
|
def read_outgoing_edges(self, source: UUID, label=None) -> List[UUID]:
|
||||||
|
"""
|
||||||
|
Reads outgoing edges of an element. Optionally, filter them based on their label
|
||||||
|
|
||||||
|
Args:
|
||||||
|
source: UUID of the element to read outgoing edges for
|
||||||
|
label: value to filter edge labels by
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of UUIDs of outgoing edges
|
||||||
|
"""
|
||||||
def read_label(_edge: UUID):
|
def read_label(_edge: UUID):
|
||||||
try:
|
try:
|
||||||
label_edge, = self.state.read_outgoing(_edge)
|
label_edge, = self.state.read_outgoing(_edge)
|
||||||
|
|
@ -65,6 +136,17 @@ class Bottom:
|
||||||
return edges
|
return edges
|
||||||
|
|
||||||
def read_incoming_elements(self, target: UUID, label=None) -> List[UUID]:
|
def read_incoming_elements(self, target: UUID, label=None) -> List[UUID]:
|
||||||
|
"""
|
||||||
|
Reads elements connected to given element via incoming edges.
|
||||||
|
Optionally, filter them based on the edge label.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
target: UUID of the element to read incoming elements for
|
||||||
|
label: value to filter edge labels by
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of UUIDs of elements connected via incoming edges
|
||||||
|
"""
|
||||||
edges = self.read_incoming_edges(target, label)
|
edges = self.read_incoming_edges(target, label)
|
||||||
if edges is None or len(edges) == 0:
|
if edges is None or len(edges) == 0:
|
||||||
return []
|
return []
|
||||||
|
|
@ -72,6 +154,17 @@ class Bottom:
|
||||||
return [self.read_edge_source(e) for e in edges]
|
return [self.read_edge_source(e) for e in edges]
|
||||||
|
|
||||||
def read_outgoing_elements(self, source: UUID, label=None) -> List[UUID]:
|
def read_outgoing_elements(self, source: UUID, label=None) -> List[UUID]:
|
||||||
|
"""
|
||||||
|
Reads elements connected to given element via outgoing edges.
|
||||||
|
Optionally, filter them based on the edge label.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
source: UUID of the element to read outgoing elements for
|
||||||
|
label: value to filter edge labels by
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of UUIDs of elements connected via outgoing edges
|
||||||
|
"""
|
||||||
edges = self.read_outgoing_edges(source, label)
|
edges = self.read_outgoing_edges(source, label)
|
||||||
if edges is None or len(edges) == 0:
|
if edges is None or len(edges) == 0:
|
||||||
return []
|
return []
|
||||||
|
|
@ -79,11 +172,29 @@ class Bottom:
|
||||||
return [self.read_edge_target(e) for e in edges]
|
return [self.read_edge_target(e) for e in edges]
|
||||||
|
|
||||||
def read_keys(self, element: UUID) -> List[str]:
|
def read_keys(self, element: UUID) -> List[str]:
|
||||||
|
"""
|
||||||
|
Retrieve list of outgoing edge labels
|
||||||
|
|
||||||
|
Args:
|
||||||
|
element: UUID of the element to read outgoing edge labels for
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of outgoing edge labels
|
||||||
|
"""
|
||||||
key_nodes = self.state.read_dict_keys(element)
|
key_nodes = self.state.read_dict_keys(element)
|
||||||
unique_keys = {self.state.read_value(node) for node in key_nodes}
|
unique_keys = {self.state.read_value(node) for node in key_nodes}
|
||||||
return list(unique_keys)
|
return list(unique_keys)
|
||||||
|
|
||||||
def delete_element(self, element: UUID):
|
def delete_element(self, element: UUID):
|
||||||
|
"""
|
||||||
|
Delete an element
|
||||||
|
|
||||||
|
Args:
|
||||||
|
element: UUID of the element to be deleted
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing
|
||||||
|
"""
|
||||||
src, tgt = self.state.read_edge(element)
|
src, tgt = self.state.read_edge(element)
|
||||||
if src is None and tgt is None:
|
if src is None and tgt is None:
|
||||||
# node
|
# node
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@ from services.bottom.V0 import Bottom as BottomV0
|
||||||
|
|
||||||
|
|
||||||
class Bottom:
|
class Bottom:
|
||||||
|
"""
|
||||||
|
Implements services for LTM bottom.
|
||||||
|
Implemented using V0.Bottom
|
||||||
|
"""
|
||||||
def __init__(self, model: UUID, state: State):
|
def __init__(self, model: UUID, state: State):
|
||||||
type_model_id = state.read_dict(state.read_root(), "Bottom")
|
type_model_id = state.read_dict(state.read_root(), "Bottom")
|
||||||
self.type_model = UUID(state.read_value(type_model_id))
|
self.type_model = UUID(state.read_value(type_model_id))
|
||||||
|
|
@ -11,7 +15,16 @@ class Bottom:
|
||||||
self.bottom = BottomV0(state)
|
self.bottom = BottomV0(state)
|
||||||
|
|
||||||
def create_node(self, name: str, value=None):
|
def create_node(self, name: str, value=None):
|
||||||
|
"""
|
||||||
|
Creates a node.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: node name in model
|
||||||
|
value: value to be stored in the node
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing
|
||||||
|
"""
|
||||||
if value is None:
|
if value is None:
|
||||||
n = self.bottom.create_node()
|
n = self.bottom.create_node()
|
||||||
else:
|
else:
|
||||||
|
|
@ -19,6 +32,17 @@ class Bottom:
|
||||||
self.bottom.create_edge(self.model, n, label=name)
|
self.bottom.create_edge(self.model, n, label=name)
|
||||||
|
|
||||||
def create_edge(self, name: str, source: str, target: str):
|
def create_edge(self, name: str, source: str, target: str):
|
||||||
|
"""
|
||||||
|
Creates an edge.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: edge name in model
|
||||||
|
source: source element of the edge
|
||||||
|
target: target element of the edge
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
src, = self.bottom.read_outgoing_elements(self.model, source)
|
src, = self.bottom.read_outgoing_elements(self.model, source)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
|
@ -31,6 +55,15 @@ class Bottom:
|
||||||
self.bottom.create_edge(self.model, e, label=name)
|
self.bottom.create_edge(self.model, e, label=name)
|
||||||
|
|
||||||
def read_value(self, name: str):
|
def read_value(self, name: str):
|
||||||
|
"""
|
||||||
|
Reads value stored in a node.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: name of the node to read value from
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Value contained in the node. If no value is found, returns None
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
element, = self.bottom.read_outgoing_elements(self.model, name)
|
element, = self.bottom.read_outgoing_elements(self.model, name)
|
||||||
return self.bottom.read_value(element)
|
return self.bottom.read_value(element)
|
||||||
|
|
@ -38,16 +71,47 @@ class Bottom:
|
||||||
raise RuntimeError(f"No element named {name}")
|
raise RuntimeError(f"No element named {name}")
|
||||||
|
|
||||||
def read_edge_source(self, name: str):
|
def read_edge_source(self, name: str):
|
||||||
|
"""
|
||||||
|
Reads source element of an edge.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: name of the edge to read source element of
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
UUID of source element of the edge
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
element, = self.bottom.read_outgoing_elements(self.model, name)
|
element, = self.bottom.read_outgoing_elements(self.model, name)
|
||||||
return self.bottom.read_value(element)
|
return self.bottom.read_edge_source(element)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise RuntimeError(f"No element named {name}")
|
raise RuntimeError(f"No element named {name}")
|
||||||
|
|
||||||
def read_edge_target(self, name: str):
|
def read_edge_target(self, name: str):
|
||||||
pass
|
"""
|
||||||
|
Reads target element of an edge.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: name of the edge to read target element of
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
UUID of target element of the edge
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
element, = self.bottom.read_outgoing_elements(self.model, name)
|
||||||
|
return self.bottom.read_edge_target(element)
|
||||||
|
except ValueError:
|
||||||
|
raise RuntimeError(f"No element named {name}")
|
||||||
|
|
||||||
def delete_element(self, name: str):
|
def delete_element(self, name: str):
|
||||||
|
"""
|
||||||
|
Delete an element
|
||||||
|
|
||||||
|
Args:
|
||||||
|
element: UUID of the element to be deleted
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
element, = self.bottom.read_outgoing_elements(self.model, name)
|
element, = self.bottom.read_outgoing_elements(self.model, name)
|
||||||
self.bottom.delete_element(element)
|
self.bottom.delete_element(element)
|
||||||
|
|
@ -55,6 +119,12 @@ class Bottom:
|
||||||
raise RuntimeError(f"No element named {name}")
|
raise RuntimeError(f"No element named {name}")
|
||||||
|
|
||||||
def list_elements(self):
|
def list_elements(self):
|
||||||
|
"""
|
||||||
|
Lists elements in the model.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of elements in alphabetical order.
|
||||||
|
"""
|
||||||
tm_names = {}
|
tm_names = {}
|
||||||
for key in self.bottom.read_keys(self.type_model):
|
for key in self.bottom.read_keys(self.type_model):
|
||||||
element, = self.bottom.read_outgoing_elements(self.type_model, key)
|
element, = self.bottom.read_outgoing_elements(self.type_model, key)
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,10 @@ from services.primitives.float_type import Float
|
||||||
|
|
||||||
|
|
||||||
class PointCartesian:
|
class PointCartesian:
|
||||||
|
"""
|
||||||
|
Implements services for the point cartesian LTM.
|
||||||
|
Implementation is done in terms of Python data structures
|
||||||
|
"""
|
||||||
def __init__(self, model: UUID, state: State):
|
def __init__(self, model: UUID, state: State):
|
||||||
type_model_id = state.read_dict(state.read_root(), "PointCartesian")
|
type_model_id = state.read_dict(state.read_root(), "PointCartesian")
|
||||||
self.type_model = UUID(state.read_value(type_model_id))
|
self.type_model = UUID(state.read_value(type_model_id))
|
||||||
|
|
@ -14,27 +18,66 @@ class PointCartesian:
|
||||||
self.point = None
|
self.point = None
|
||||||
|
|
||||||
def create_point(self, x: float, y: float):
|
def create_point(self, x: float, y: float):
|
||||||
|
"""
|
||||||
|
Creates a point.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
x: x coordinate
|
||||||
|
y: y coordinate
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
if self.point is None:
|
if self.point is None:
|
||||||
self.point = (x, y)
|
self.point = (x, y)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("A PointCartesian model can contain at most 1 point.")
|
raise RuntimeError("A PointCartesian model can contain at most 1 point.")
|
||||||
|
|
||||||
def read_point(self):
|
def read_point(self):
|
||||||
|
"""
|
||||||
|
Reads point.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Textual representation of the point data.
|
||||||
|
"""
|
||||||
if self.point is None:
|
if self.point is None:
|
||||||
raise RuntimeError("No point found in model.")
|
raise RuntimeError("No point found in model.")
|
||||||
else:
|
else:
|
||||||
return f"(X = {self.point[0]}, Y = {self.point[1]})"
|
return f"(X = {self.point[0]}, Y = {self.point[1]})"
|
||||||
|
|
||||||
def delete_point(self):
|
def delete_point(self):
|
||||||
|
"""
|
||||||
|
Deletes point.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
self.point = None
|
self.point = None
|
||||||
|
|
||||||
def apply_movement(self, delta_x: float, delta_y: float):
|
def apply_movement(self, delta_x: float, delta_y: float):
|
||||||
|
"""
|
||||||
|
Moves point.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
delta_x: change in x dimension
|
||||||
|
delta_y: change in y dimension
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
if self.point is not None:
|
if self.point is not None:
|
||||||
self.point = (self.point[0] + delta_x, self.point[1] + delta_y)
|
self.point = (self.point[0] + delta_x, self.point[1] + delta_y)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("No point found in model.")
|
raise RuntimeError("No point found in model.")
|
||||||
|
|
||||||
def to_bottom(self):
|
def to_bottom(self):
|
||||||
|
"""
|
||||||
|
Converts implementation specific model representation to
|
||||||
|
canonical representation.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
bottom = Bottom(self.state)
|
bottom = Bottom(self.state)
|
||||||
# clear residual model
|
# clear residual model
|
||||||
for element in bottom.read_outgoing_elements(self.model):
|
for element in bottom.read_outgoing_elements(self.model):
|
||||||
|
|
@ -69,6 +112,13 @@ class PointCartesian:
|
||||||
bottom.create_edge(c2_link, ltm_point_link, "Morphism")
|
bottom.create_edge(c2_link, ltm_point_link, "Morphism")
|
||||||
|
|
||||||
def from_bottom(self):
|
def from_bottom(self):
|
||||||
|
"""
|
||||||
|
Converts canonical representation to
|
||||||
|
implementation specific model representation.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
bottom = Bottom(self.state)
|
bottom = Bottom(self.state)
|
||||||
keys = bottom.read_keys(self.model)
|
keys = bottom.read_keys(self.model)
|
||||||
x_key, = filter(lambda k: k.endswith(".c1"), keys)
|
x_key, = filter(lambda k: k.endswith(".c1"), keys)
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ import math
|
||||||
|
|
||||||
|
|
||||||
class PointPolar:
|
class PointPolar:
|
||||||
|
"""
|
||||||
|
Implements services for the point polar LTM.
|
||||||
|
Implementation is done in terms of Python data structures
|
||||||
|
"""
|
||||||
def __init__(self, model: UUID, state: State):
|
def __init__(self, model: UUID, state: State):
|
||||||
type_model_id = state.read_dict(state.read_root(), "PointPolar")
|
type_model_id = state.read_dict(state.read_root(), "PointPolar")
|
||||||
self.type_model = UUID(state.read_value(type_model_id))
|
self.type_model = UUID(state.read_value(type_model_id))
|
||||||
|
|
@ -16,27 +20,66 @@ class PointPolar:
|
||||||
self.point = None
|
self.point = None
|
||||||
|
|
||||||
def create_point(self, r: float, theta: float):
|
def create_point(self, r: float, theta: float):
|
||||||
|
"""
|
||||||
|
Creates a point.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
r: distance from pole
|
||||||
|
theta: angle from polar axis
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
if self.point is None:
|
if self.point is None:
|
||||||
self.point = (r, theta)
|
self.point = (r, theta)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("A PointPolar model can contain at most 1 point.")
|
raise RuntimeError("A PointPolar model can contain at most 1 point.")
|
||||||
|
|
||||||
def read_point(self):
|
def read_point(self):
|
||||||
|
"""
|
||||||
|
Reads point.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Textual representation of the point data.
|
||||||
|
"""
|
||||||
if self.point is None:
|
if self.point is None:
|
||||||
raise RuntimeError("No point found in model.")
|
raise RuntimeError("No point found in model.")
|
||||||
else:
|
else:
|
||||||
return f"(r = {self.point[0]}, \u03B8 = {self.point[1]})"
|
return f"(r = {self.point[0]}, \u03B8 = {self.point[1]})"
|
||||||
|
|
||||||
def delete_point(self):
|
def delete_point(self):
|
||||||
|
"""
|
||||||
|
Deletes point.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
self.point = None
|
self.point = None
|
||||||
|
|
||||||
def apply_movement(self, delta_r: float, delta_theta: float):
|
def apply_movement(self, delta_r: float, delta_theta: float):
|
||||||
|
"""
|
||||||
|
Moves point.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
delta_r: change in distance from pole
|
||||||
|
delta_theta: change in angle from polar axis
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
if self.point is not None:
|
if self.point is not None:
|
||||||
self.point = (self.point[0] + delta_r, self.point[1] + delta_theta)
|
self.point = (self.point[0] + delta_r, self.point[1] + delta_theta)
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("No point found in model.")
|
raise RuntimeError("No point found in model.")
|
||||||
|
|
||||||
def to_bottom(self):
|
def to_bottom(self):
|
||||||
|
"""
|
||||||
|
Converts implementation specific model representation to
|
||||||
|
canonical representation.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
x = self.point[0]*math.cos(self.point[1]) # x = r * cos(theta)
|
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)
|
y = self.point[0]*math.sin(self.point[1]) # y = r * sin(theta)
|
||||||
bottom = Bottom(self.state)
|
bottom = Bottom(self.state)
|
||||||
|
|
@ -73,6 +116,13 @@ class PointPolar:
|
||||||
bottom.create_edge(c2_link, ltm_point_link, "Morphism")
|
bottom.create_edge(c2_link, ltm_point_link, "Morphism")
|
||||||
|
|
||||||
def from_bottom(self):
|
def from_bottom(self):
|
||||||
|
"""
|
||||||
|
Converts canonical representation to
|
||||||
|
implementation specific model representation.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nothing.
|
||||||
|
"""
|
||||||
bottom = Bottom(self.state)
|
bottom = Bottom(self.state)
|
||||||
keys = bottom.read_keys(self.model)
|
keys = bottom.read_keys(self.model)
|
||||||
x_key, = filter(lambda k: k.endswith(".c1"), keys)
|
x_key, = filter(lambda k: k.endswith(".c1"), keys)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue