|
|
@@ -96,15 +96,14 @@ class Fnc:
|
|
|
|
|
|
Args:
|
|
|
name (str): The name for the function.
|
|
|
- *args (Fnc): A list of arguments for the function.
|
|
|
|
|
|
Keyword Args:
|
|
|
time (Time): The current time for this function.
|
|
|
eq_time (Time): The current equation time for this function.
|
|
|
"""
|
|
|
- def __init__(self, name, *args, time=Time.now(), eq_time=Time.now()):
|
|
|
+ def __init__(self, name, time=Time.now(), eq_time=Time.now()):
|
|
|
self.name = name
|
|
|
- self.args = args
|
|
|
+ self.args = []
|
|
|
|
|
|
# Time properties
|
|
|
self.time = time
|
|
|
@@ -189,6 +188,89 @@ class Fnc:
|
|
|
return res
|
|
|
|
|
|
|
|
|
+class MultiFnc(Fnc):
|
|
|
+ """
|
|
|
+ Collection function for both the adder and the product blocks
|
|
|
+ """
|
|
|
+ def __init__(self, name, symbol, time=Time.now(), eq_time=Time.now()):
|
|
|
+ Fnc.__init__(self, name, time=time, eq_time=eq_time)
|
|
|
+ self.symbol = symbol
|
|
|
+
|
|
|
+ def eq(self):
|
|
|
+ return "(" + (" " + self.name + " ").join([a.eq() for a in self.args]) + ")"
|
|
|
+
|
|
|
+ def latex(self):
|
|
|
+ return "(" + (" " + self.name + " ").join([a.latex() for a in self.args]) + ")"
|
|
|
+
|
|
|
+
|
|
|
+class UnaryFnc(Fnc):
|
|
|
+ """
|
|
|
+ Collection function for unary input functions
|
|
|
+ """
|
|
|
+ def __init__(self, name, symbol, time=Time.now(), eq_time=Time.now()):
|
|
|
+ Fnc.__init__(self, name, time=time, eq_time=eq_time)
|
|
|
+ self.symbol = symbol
|
|
|
+
|
|
|
+ def eq(self):
|
|
|
+ return "(" + self.name + self.args[0].eq() + ")"
|
|
|
+
|
|
|
+ def latex(self):
|
|
|
+ return "(" + self.symbol + self.args[0].latex() + ")"
|
|
|
+
|
|
|
+
|
|
|
+class BinaryFnc(Fnc):
|
|
|
+ """
|
|
|
+ Collection function for binary input functions
|
|
|
+ """
|
|
|
+ def __init__(self, name, symbol, time=Time.now(), eq_time=Time.now()):
|
|
|
+ Fnc.__init__(self, name, time=time, eq_time=eq_time)
|
|
|
+ self.symbol = symbol
|
|
|
+
|
|
|
+ def eq(self):
|
|
|
+ return "(" + self.args[0].eq() + self.name + self.args[1].eq() + ")"
|
|
|
+
|
|
|
+ def latex(self):
|
|
|
+ return "(" + self.symbol.format(a=self.args[0].latex(), b=self.args[1].latex()) + ")"
|
|
|
+
|
|
|
+
|
|
|
+class ConstantFnc(Fnc):
|
|
|
+ """
|
|
|
+ Function that represents a constant value
|
|
|
+ """
|
|
|
+ def __init__(self, name, val, time=Time.now(), eq_time=Time.now()):
|
|
|
+ Fnc.__init__(self, name, time=time, eq_time=eq_time)
|
|
|
+ self.val = val
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return str(self.val)
|
|
|
+
|
|
|
+ def eq(self):
|
|
|
+ return str(self.val)
|
|
|
+
|
|
|
+ def latex(self):
|
|
|
+ return str(self.val)
|
|
|
+
|
|
|
+# TODO: der, delay, integrator
|
|
|
+_BLOCK_MAP = {
|
|
|
+ "ConstantBlock": lambda block: [ConstantFnc("C", block.getValue())],
|
|
|
+ "NegatorBlock": lambda block: [UnaryFnc("-", "-")],
|
|
|
+ "InverterBlock": lambda block: [UnaryFnc("~", "1 / ")],
|
|
|
+ "AdderBlock": lambda block: [MultiFnc("+", "+")],
|
|
|
+ "ProductBlock": lambda block: [MultiFnc("*", "\\cdot")],
|
|
|
+ "ModuloBlock": lambda block: [BinaryFnc("mod", "{a} % {b}")],
|
|
|
+ "RootBlock": lambda block: [BinaryFnc("root", "{a}^(1/{b})")],
|
|
|
+ "PowerBlock": lambda block: [BinaryFnc("pow", "{a}^{b}")],
|
|
|
+ "GenericBlock": lambda block: [Fnc(block.getBlockOperator())],
|
|
|
+ "LessThanBlock": lambda block: [BinaryFnc("<", "{a} < {b}")],
|
|
|
+ "LessThanOrEqualsBlock": lambda block: [BinaryFnc("<=", "{a} \\lte {b}")],
|
|
|
+ "EqualsBlock": lambda block: [BinaryFnc("==", "{a} \\leftrightarrow {b}")],
|
|
|
+ "NotBlock": lambda block: [UnaryFnc("!", "\\neg")],
|
|
|
+ "OrBlock": lambda block: [BinaryFnc("or", "{a} \\wedge {b}")],
|
|
|
+ "AndBlock": lambda block: [BinaryFnc("and", "{a} \\vee {b}")],
|
|
|
+ "TimeBlock": lambda block: [ConstantFnc("time", "i")],
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
if __name__ == '__main__':
|
|
|
l1 = [Fnc('+', Fnc('h', time=Time(-1, True)), Fnc('time', time=Time(-1, True))), Fnc('IC1', time=Time(0), eq_time=Time(0))]
|
|
|
l2 = [Fnc('IC2')]
|