Skip to content
Snippets Groups Projects
Commit 9146b782 authored by Taddeus Kroes's avatar Taddeus Kroes
Browse files

Added possibility to pass an operator as an integer to the ExprexxionNode constructor.

parent 5cf274a2
No related branches found
No related tags found
No related merge requests found
...@@ -78,7 +78,6 @@ OP_MAP = { ...@@ -78,7 +78,6 @@ OP_MAP = {
'der': OP_DER, 'der': OP_DER,
'solve': OP_SOLVE, 'solve': OP_SOLVE,
'log': OP_LOG, 'log': OP_LOG,
'ln': OP_LOG,
'=': OP_EQ, '=': OP_EQ,
'??': OP_POSSIBILITIES, '??': OP_POSSIBILITIES,
'?': OP_HINT, '?': OP_HINT,
...@@ -86,6 +85,9 @@ OP_MAP = { ...@@ -86,6 +85,9 @@ OP_MAP = {
'@': OP_REWRITE, '@': OP_REWRITE,
} }
OP_VALUE_MAP = dict([(v, k) for k, v in OP_MAP.iteritems()])
OP_MAP['ln'] = OP_LOG
TOKEN_MAP = { TOKEN_MAP = {
OP_COMMA: 'COMMA', OP_COMMA: 'COMMA',
OP_ADD: 'PLUS', OP_ADD: 'PLUS',
...@@ -192,19 +194,20 @@ class ExpressionBase(object): ...@@ -192,19 +194,20 @@ class ExpressionBase(object):
return self.type & (TYPE_FLOAT | TYPE_INTEGER) return self.type & (TYPE_FLOAT | TYPE_INTEGER)
def __add__(self, other): def __add__(self, other):
return ExpressionNode('+', self, to_expression(other)) return ExpressionNode(OP_ADD, self, to_expression(other))
def __sub__(self, other): def __sub__(self, other):
return ExpressionNode('-', self, to_expression(other)) #FIXME: return ExpressionNode(OP_ADD, self, -to_expression(other))
return ExpressionNode(OP_SUB, self, to_expression(other))
def __mul__(self, other): def __mul__(self, other):
return ExpressionNode('*', self, to_expression(other)) return ExpressionNode(OP_MUL, self, to_expression(other))
def __div__(self, other): def __div__(self, other):
return ExpressionNode('/', self, to_expression(other)) return ExpressionNode(OP_DIV, self, to_expression(other))
def __pow__(self, other): def __pow__(self, other):
return ExpressionNode('^', self, to_expression(other)) return ExpressionNode(OP_POW, self, to_expression(other))
def __pos__(self): def __pos__(self):
return self.reduce_negation() return self.reduce_negation()
...@@ -238,7 +241,14 @@ class ExpressionNode(Node, ExpressionBase): ...@@ -238,7 +241,14 @@ class ExpressionNode(Node, ExpressionBase):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ExpressionNode, self).__init__(*args, **kwargs) super(ExpressionNode, self).__init__(*args, **kwargs)
self.type = TYPE_OPERATOR self.type = TYPE_OPERATOR
self.op = OP_MAP[args[0]] op = args[0]
if isinstance(op, str):
self.value = op
self.op = OP_MAP[op]
else:
self.value = OP_VALUE_MAP[op]
self.op = op
def construct_function(self, children): def construct_function(self, children):
if self.op == OP_DER: if self.op == OP_DER:
...@@ -296,13 +306,13 @@ class ExpressionNode(Node, ExpressionBase): ...@@ -296,13 +306,13 @@ class ExpressionNode(Node, ExpressionBase):
>>> from src.node import ExpressionNode as N, ExpressionLeaf as L >>> from src.node import ExpressionNode as N, ExpressionLeaf as L
>>> c, r, e = L('c'), L('r'), L('e') >>> c, r, e = L('c'), L('r'), L('e')
>>> n1 = N('*', c, N('^', r, e)) >>> n1 = N(OP_MUL), c, N('^', r, e))
>>> n1.extract_polynome() >>> n1.extract_polynome()
(c, r, e) (c, r, e)
>>> n2 = N('*', N('^', r, e), c) >>> n2 = N(OP_MUL, N('^', r, e), c)
>>> n2.extract_polynome() >>> n2.extract_polynome()
(c, r, e) (c, r, e)
>>> n3 = N('-', r) >>> n3 = -r
>>> n3.extract_polynome() >>> n3.extract_polynome()
(1, -r, 1) (1, -r, 1)
""" """
...@@ -512,7 +522,7 @@ class Scope(object): ...@@ -512,7 +522,7 @@ class Scope(object):
self.remove(node, replacement=replacement) self.remove(node, replacement=replacement)
def as_nary_node(self): def as_nary_node(self):
return nary_node(self.node.value, self.nodes).negate(self.node.negated) return nary_node(self.node.op, self.nodes).negate(self.node.negated)
def nary_node(operator, scope): def nary_node(operator, scope):
......
...@@ -16,7 +16,7 @@ from graph_drawing.graph import generate_graph ...@@ -16,7 +16,7 @@ from graph_drawing.graph import generate_graph
from node import ExpressionNode as Node, ExpressionLeaf as Leaf, OP_MAP, \ from node import ExpressionNode as Node, ExpressionLeaf as Leaf, OP_MAP, \
OP_DER, TOKEN_MAP, TYPE_OPERATOR, OP_COMMA, OP_NEG, OP_MUL, OP_DIV, \ OP_DER, TOKEN_MAP, TYPE_OPERATOR, OP_COMMA, OP_NEG, OP_MUL, OP_DIV, \
OP_LOG, Scope, PI, E, DEFAULT_LOGARITHM_BASE OP_LOG, OP_ADD, Scope, PI, E, DEFAULT_LOGARITHM_BASE, OP_VALUE_MAP
from rules import RULES from rules import RULES
from strategy import pick_suggestion from strategy import pick_suggestion
from possibilities import filter_duplicates, apply_suggestion from possibilities import filter_duplicates, apply_suggestion
...@@ -389,26 +389,24 @@ class Parser(BisonParser): ...@@ -389,26 +389,24 @@ class Parser(BisonParser):
op = values[0].split(' ', 1)[0] op = values[0].split(' ', 1)[0]
if op == 'ln': if op == 'ln':
return Node('log', values[1], Leaf(E)) return Node(OP_LOG, values[1], Leaf(E))
if values[1].is_op(OP_COMMA): if values[1].is_op(OP_COMMA):
return Node(op, *values[1]) return Node(op, *values[1])
if op == 'log': if op == OP_VALUE_MAP[OP_LOG]:
return Node('log', values[1], Leaf(DEFAULT_LOGARITHM_BASE)) return Node(OP_LOG, values[1], Leaf(DEFAULT_LOGARITHM_BASE))
m = re.match(r'^log_([0-9]+)', op) m = re.match(r'^log_([0-9]+)', op)
if m: if m:
return Node('log', values[1], Leaf(int(m.group(1)))) return Node(OP_LOG, values[1], Leaf(int(m.group(1))))
return Node(op, values[1]) return Node(op, values[1])
if option == 3: # rule: DERIVATIVE exp if option == 3: # rule: DERIVATIVE exp
op = [k for k, v in OP_MAP.iteritems() if v == OP_DER][0]
# DERIVATIVE looks like 'd/d*x*' -> extract the 'x' # DERIVATIVE looks like 'd/d*x*' -> extract the 'x'
return Node(op, values[1], Leaf(values[0][-2])) return Node(OP_DER, values[1], Leaf(values[0][-2]))
if option == 4: # rule: bracket_derivative if option == 4: # rule: bracket_derivative
return values[0] return values[0]
...@@ -422,13 +420,11 @@ class Parser(BisonParser): ...@@ -422,13 +420,11 @@ class Parser(BisonParser):
| bracket_derivative APOSTROPH | bracket_derivative APOSTROPH
""" """
op = [k for k, v in OP_MAP.iteritems() if v == OP_DER][0]
if option == 0: # rule: LBRACKET exp RBRACKET APOSTROPH if option == 0: # rule: LBRACKET exp RBRACKET APOSTROPH
return Node(op, values[1]) return Node(OP_DER, values[1])
if option == 1: # rule: bracket_derivative APOSTROPH if option == 1: # rule: bracket_derivative APOSTROPH
return Node(op, values[0]) return Node(OP_DER, values[0])
raise BisonSyntaxError('Unsupported option %d in target "%s".' raise BisonSyntaxError('Unsupported option %d in target "%s".'
% (option, target)) # pragma: nocover % (option, target)) # pragma: nocover
...@@ -459,7 +455,7 @@ class Parser(BisonParser): ...@@ -459,7 +455,7 @@ class Parser(BisonParser):
# Explicit call the hook handler on the created unary negation. # Explicit call the hook handler on the created unary negation.
node = self.hook_handler('binary', 4, names, values, node) node = self.hook_handler('binary', 4, names, values, node)
return Node('+', values[0], values[2]) return Node(OP_ADD, values[0], values[2])
raise BisonSyntaxError('Unsupported option %d in target "%s".' raise BisonSyntaxError('Unsupported option %d in target "%s".'
% (option, target)) # pragma: nocover % (option, target)) # pragma: nocover
......
...@@ -10,7 +10,7 @@ from ..translate import _ ...@@ -10,7 +10,7 @@ from ..translate import _
def der(f, x=None): def der(f, x=None):
return N('der', f, x) if x else N('der', f) return N(OP_DER, f, x) if x else N(OP_DER, f)
def second_arg(node): def second_arg(node):
......
from .utils import is_fraction from .utils import is_fraction
from ..node import ExpressionNode as N, ExpressionLeaf as L, Scope, OP_ADD, \ from ..node import ExpressionNode as N, ExpressionLeaf as L, Scope, OP_ADD, \
OP_POW, OP_MUL, OP_DIV, OP_SIN, OP_COS, OP_TAN, PI, TYPE_OPERATOR OP_POW, OP_MUL, OP_DIV, OP_SIN, OP_COS, OP_TAN, OP_SQRT, PI, \
TYPE_OPERATOR
from ..possibilities import Possibility as P, MESSAGES from ..possibilities import Possibility as P, MESSAGES
from ..translate import _ from ..translate import _
def sin(*args): def sin(*args):
return N('sin', *args) return N(OP_SIN, *args)
def cos(*args): def cos(*args):
return N('cos', *args) return N(OP_COS, *args)
def tan(*args): def tan(*args):
return N('tan', *args) return N(OP_TAN, *args)
def match_add_quadrants(node): def match_add_quadrants(node):
...@@ -102,6 +103,10 @@ def match_half_pi_subtraction(node): ...@@ -102,6 +103,10 @@ def match_half_pi_subtraction(node):
return [] return []
def half_pi_subtraction_sinus(root, args):
pass
def is_pi_frac(node, denominator): def is_pi_frac(node, denominator):
""" """
Check if a node is a fraction of 1 multiplied with PI. Check if a node is a fraction of 1 multiplied with PI.
...@@ -124,7 +129,7 @@ def is_pi_frac(node, denominator): ...@@ -124,7 +129,7 @@ def is_pi_frac(node, denominator):
def sqrt(value): def sqrt(value):
return N('sqrt', L(value)) return N(OP_SQRT, L(value))
l0, l1, sq2, sq3 = L(0), L(1), sqrt(2), sqrt(3) l0, l1, sq2, sq3 = L(0), L(1), sqrt(2), sqrt(3)
......
...@@ -7,7 +7,7 @@ def log(exponent, base=10): ...@@ -7,7 +7,7 @@ def log(exponent, base=10):
if not isinstance(base, L): if not isinstance(base, L):
base = L(base) base = L(base)
return N('log', exponent, base) return N(OP_LOG, exponent, base)
def ln(exponent): def ln(exponent):
......
from itertools import combinations from itertools import combinations
from ..node import ExpressionNode as N, ExpressionLeaf as L, Scope, \ from ..node import ExpressionNode as N, ExpressionLeaf as L, Scope, \
OP_MUL, OP_DIV, OP_POW, OP_ADD, negate OP_MUL, OP_DIV, OP_POW, OP_ADD, OP_SQRT, negate
from ..possibilities import Possibility as P, MESSAGES from ..possibilities import Possibility as P, MESSAGES
from ..translate import _ from ..translate import _
...@@ -238,7 +238,7 @@ def exponent_to_root(root, args): ...@@ -238,7 +238,7 @@ def exponent_to_root(root, args):
""" """
a, n, m = args a, n, m = args
return N('sqrt', a if n == 1 else a ** n, m) return N(OP_SQRT, a if n == 1 else a ** n, m)
def match_extend_exponent(node): def match_extend_exponent(node):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment