def multiplyVariables(variable1, variable2, coeff): variable = Variable() variable.value = [] variable.value.extend(variable1.value) variable.power = [] variable.power.extend(variable1.power) if isNumber(variable1.coefficient): variable.coefficient = float(variable1.coefficient) elif isinstance(variable1.coefficient, Function): variable.coefficient = evaluateConstant(variable1.coefficient) else: variable.coefficient = variable1.coefficient for j, var in enumerate(variable.value): found = False for k, var2 in enumerate(variable2.value): if var == var2: if isNumber(variable.power[j]) and isNumber(variable2.power[k]): variable.power[j] += variable2.power[k] found = True break if not found: variable.value.append(variable2.value[j]) variable.power.append(variable2.power[j]) variable.coefficient *= variable2.coefficient variable.coefficient *= coeff # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i+1].scope) return variable
def division_variables(variable1, variable2, coeff): variable = copy.deepcopy(variable1) for j, var in enumerate(variable.value): found = False for k, var2 in enumerate(variable2.value): if var == var2: if isNumber(variable.power[j]) and isNumber(variable2.power[k]): variable.power[j] -= variable2.power[k] found = True break if not found: variable.value.append(variable2.value[j]) variable.power.append(-variable2.power[j]) variable.coefficient /= variable2.coefficient variable.coefficient *= coeff # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i+1].scope) return variable
def __mul__(self, other): from visma.io.checks import isNumber from visma.functions.constant import Constant if isinstance(other, Variable): for j, var in enumerate(other.value): found = False for k, var2 in enumerate(self.value): self.coefficient *= other.coefficient if var == var2: if isNumber(other.power[j]) and isNumber( self.power[k]): self.power[k] += other.power[j] if self.power[k] == 0: del self.power[k] del self.value[k] found = True break if not found: self.value.append(other.value[j]) self.power.append(other.power[j]) if len(self.value) == 0: result = Constant(self.coefficient) result.scope = self.scope result.power = 1 result.value = self.coefficient self = result return self elif isinstance(other, Constant): self.coefficient *= other.calculate() return self elif isinstance(other, Expression): result = Expression() for _, token in enumerate(other.tokens): if isinstance(token, Variable) or isinstance(token, Constant): c = copy.deepcopy(self) result.tokens.extend([c * token]) else: result.tokens.extend([token]) return result
def multiplyVariableConstant(constant, variable, coeff): variable1 = Variable() variable1.value = [] variable1.value.extend(variable.value) variable1.power = [] variable1.power.extend(variable.power) if isNumber(variable.coefficient): variable1.coefficient = float(variable.coefficient) elif isinstance(variable.coefficient, Function): variable1.coefficient = evaluateConstant(variable.coefficient) else: variable.coefficient = variable1.coefficient variable1.coefficient *= evaluateConstant(constant) variable1.coefficient *= coeff # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i-1].scope) return variable1
def division_constants(constant1, constant2, coeff): no_1 = False no_2 = False constant = Constant() if isNumber(constant1.value): no_1 = True if isNumber(constant2.value): no_2 = True if no_1 and no_2: constant.value = (evaluateConstant( constant1) / evaluateConstant(constant2)) * coeff constant.power = 1 # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i-1].scope) elif no_1 and not no_2: constant.value = [constant1.value] constant.power = [constant1.power] for i, val in enumerate(constant2.value): done = False for j, val2 in enumerate(constant.value): if val == val2: constant.power[j] -= constant2.power[i] done = True break if not done: constant.value.append(val) constant.power.append(-constant2.power[i]) constant.value.append(coeff) constant.power.append(1) # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i-1].scope) elif not no_1 and no_2: constant.value = constant1.value constant.power = constant1.power done = False for i, val in enumerate(constant.value): if val == constant2.value: constant.power[i] -= constant2.power done = True break if not done: constant.value.append(constant2.value) constant.power.append(-constant2.power) constant.value.append(coeff) constant.power.append(1) # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i+1].scope) elif not no_1 and not no_2: constant.value = constant1.value constant.power = constant1.power for i, val in enumerate(constant2.value): done = False for j, val2 in enumerate(constant.value): if val == val2: constant.power[j] -= constant2.power[i] done = True break if not done: constant.value.append(val) constant.power.append(-constant2.power[i]) constant.value.append(coeff) constant.power.append(1) # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i-1].scope) return constant
def expressionDivision(variables, tokens): removeScopes = [] comments = [] for i, token in enumerate(tokens): if isinstance(token, Binary): if token.value in ['/']: prev = False nxt = False if i != 0: if tokens[i - 1].__class__ in [Variable, Constant]: prev = True if i + 1 < len(tokens): if tokens[i + 1].__class__ in [Variable, Constant]: nxt = True if nxt and prev: if isinstance(tokens[i + 1], Constant) and isinstance(tokens[i - 1], Constant): comments.append("Dividing " + r"$" + tokens[i - 1].__str__() + r"$" + " by " + r"$" + tokens[i + 1].__str__() + r"$") no_1 = False no_2 = False if isNumber(tokens[i - 1].value): no_1 = True if isNumber(tokens[i + 1].value): no_2 = True if no_1 and no_2: tokens[i + 1].value = evaluateConstant( tokens[i - 1]) / evaluateConstant(tokens[i + 1]) tokens[i + 1].power = 1 removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) elif no_1 and not no_2: value = tokens[i - 1].value power = tokens[i - 1].power tokens[i - 1].value = [value] tokens[i - 1].power = [power] for val in tokens[i + 1].value: tokens[i - 1].value.append(val) for pows in tokens[i + 1].power: tokens[i - 1].power.append(-pows) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) elif not no_1 and no_2: tokens[i - 1].value.append(tokens[i + 1].value) tokens[i - 1].power.append(-tokens[i + 1].power) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) elif not no_1 and not no_2: for vals in tokens[i + 1].value: tokens[i - 1].value.append(vals) for pows in tokens[i + 1].power: tokens[i - 1].power.append(pows) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments elif isinstance(tokens[i + 1], Variable) and isinstance(tokens[i - 1], Variable): comments.append("Dividing " + r"$" + tokens[i - 1].__str__() + r"$" + " by " + r"$" + tokens[i + 1].__str__() + r"$") for j, var in enumerate(tokens[i + 1].value): found = False for k, var2 in enumerate(tokens[i - 1].value): tokens[i-1].coefficient /= tokens[i+1].coefficient if var == var2: if isNumber(tokens[i + 1].power[j]) and isNumber(tokens[i - 1].power[k]): tokens[i - 1].power[k] -= tokens[i + 1].power[j] if tokens[i - 1].power[k] == 0: del tokens[i - 1].power[k] del tokens[i - 1].value[k] found = True break if not found: tokens[i - 1].value.append(tokens[i + 1].value[j]) tokens[i - 1].power.append(-tokens[i + 1].power[j]) if len(tokens[i - 1].value) == 0: constant = Constant() constant.scope = tokens[i - 1].scope constant.power = 1 constant.value = tokens[i - 1].coefficient tokens[i - 1] = constant removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments elif (isinstance(tokens[i + 1], Variable) and isinstance(tokens[i - 1], Constant)): comments.append("Dividing " + r"$" + tokens[i - 1].__str__() + r"$" + " by " + r"$" + tokens[i + 1].__str__() + r"$") val = evaluateConstant(tokens[i - 1]) scope = tokens[i - 1].scope tokens[i - 1] = Variable() tokens[i - 1].value = tokens[i + 1].value tokens[i - 1].coefficient = val / \ tokens[i + 1].coefficient tokens[i - 1].power = [] tokens[i - 1].scope = scope for pows in tokens[i + 1].power: tokens[i - 1].power.append(-pows) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments elif (isinstance(tokens[i - 1], Variable) and isinstance(tokens[i + 1], Constant)): comments.append("Dividing " + r"$" + tokens[i - 1].__str__() + r"$" + " by " + r"$" + tokens[i + 1].__str__() + r"$") tokens[i - 1].coefficient /= evaluateConstant(tokens[i + 1]) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments return variables, tokens, removeScopes, comments
def expressionMultiplication(variables, tokens): removeScopes = [] comments = [] for i, token in enumerate(tokens): if isinstance(token, Binary): if token.value in ['*']: prev = False nxt = False if i != 0: if tokens[i - 1].__class__ in [Variable, Constant]: prev = True if i + 1 < len(tokens): if tokens[i + 1].__class__ in [Variable, Constant]: nxt = True if nxt and prev: if isinstance(tokens[i + 1], Constant) and isinstance(tokens[i - 1], Constant): comments.append("Multiplying " + r"$" + tokens[i-1].__str__() + r"$" + " and " + r"$" + tokens[i+1].__str__() + r"$") no_1 = False no_2 = False if isNumber(tokens[i - 1].value): no_1 = True if isNumber(tokens[i + 1].value): no_2 = True if no_1 and no_2: tokens[i + 1].value = evaluateConstant( tokens[i - 1]) * evaluateConstant(tokens[i + 1]) tokens[i + 1].power = 1 removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) elif no_1 and not no_2: tokens[i + 1].value.append(tokens[i - 1].value) tokens[i + 1].power.append(tokens[i - 1].power) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) elif not no_1 and no_2: tokens[i - 1].value.append(tokens[i + 1].value) tokens[i - 1].power.append(tokens[i + 1].power) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) elif not no_1 and not no_2: for vals in tokens[i - 1].value: tokens[i + 1].value.append(vals) for pows in tokens[i - 1].power: tokens[i + 1].power.append(pows) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) return variables, tokens, removeScopes, comments elif isinstance(tokens[i + 1], Variable) and isinstance(tokens[i - 1], Variable): comments.append("Multiplying " + r"$" + tokens[i - 1].__str__() + r"$" + " and " + r"$" + tokens[i + 1].__str__() + r"$") for j, var in enumerate(tokens[i + 1].value): found = False for k, var2 in enumerate(tokens[i - 1].value): tokens[i - 1].coefficient *= tokens[i + 1].coefficient if var == var2: if tokens[i + 1].power[j] == tokens[i - 1].power[k]: if isNumber(tokens[i + 1].power[j]) and isNumber(tokens[i - 1].power[k]): tokens[i - 1].power[k] += tokens[i + 1].power[j] found = True break if not found: tokens[i - 1].value.append(tokens[i + 1].value[j]) tokens[i - 1].power.append(tokens[i + 1].power[j]) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments elif (isinstance(tokens[i + 1], Variable) and isinstance(tokens[i - 1], Constant)): comments.append("Multiplying " + r"$" + tokens[i - 1].__str__() + "}" + r"$" + " and " + r"$" + tokens[i + 1].__str__() + r"$") tokens[i + 1].coefficient *= evaluateConstant(tokens[i - 1]) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) return variables, tokens, removeScopes, comments elif (isinstance(tokens[i - 1], Variable) and isinstance(tokens[i + 1], Constant)): comments.append("Multiplying " + r"$" + tokens[i - 1].__str__() + r"$" + " and " + r"$" + tokens[i + 1].__str__() + r"$") tokens[i - 1].coefficient *= evaluateConstant(tokens[i + 1]) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments return variables, tokens, removeScopes, comments
def expressionMultiplication(variables, tokens): removeScopes = [] comments = [] for i, token in enumerate(tokens): if isinstance(token, Binary): if token.value in ['*']: prev = False nxt = False if i != 0: if tokens[i - 1].__class__ in [Variable, Constant]: prev = True if i + 1 < len(tokens): if tokens[i + 1].__class__ in [Variable, Constant]: nxt = True if nxt and prev: comments.append("Multiplying " + r"$" + tokens[i - 1].__str__() + r"$" + " and " + r"$" + tokens[i + 1].__str__() + r"$") if isinstance(tokens[i + 1], Constant) and isinstance( tokens[i - 1], Constant): tokens[i + 1].value = evaluateConstant( tokens[i - 1]) * evaluateConstant(tokens[i + 1]) tokens[i + 1].power = 1 removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) return variables, tokens, removeScopes, comments elif isinstance(tokens[i + 1], Variable) and isinstance( tokens[i - 1], Variable): for j, var in enumerate(tokens[i + 1].value): found = False for k, var2 in enumerate(tokens[i - 1].value): tokens[i - 1].coefficient *= tokens[i + 1].coefficient if var == var2: if isNumber( tokens[i + 1].power[j]) and isNumber( tokens[i - 1].power[k]): tokens[i - 1].power[k] += tokens[ i + 1].power[j] if tokens[i - 1].power[k] == 0: del tokens[i - 1].power[k] del tokens[i - 1].value[k] found = True break if not found: tokens[i - 1].value.append(tokens[i + 1].value[j]) tokens[i - 1].power.append(tokens[i + 1].power[j]) if len(tokens[i - 1].value) == 0: constant = Constant() constant.scope = tokens[i - 1].scope constant.power = 1 constant.value = tokens[i - 1].coefficient tokens[i - 1] = constant removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments elif (isinstance(tokens[i + 1], Variable) and isinstance(tokens[i - 1], Constant)): tokens[i + 1].coefficient *= evaluateConstant( tokens[i - 1]) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i - 1].scope) return variables, tokens, removeScopes, comments elif (isinstance(tokens[i - 1], Variable) and isinstance(tokens[i + 1], Constant)): tokens[i - 1].coefficient *= evaluateConstant( tokens[i + 1]) removeScopes.append(tokens[i].scope) removeScopes.append(tokens[i + 1].scope) return variables, tokens, removeScopes, comments return variables, tokens, removeScopes, comments
def tokensToString(tokens): """Converts tokens to text string Arguments: tokens {list} -- list of function tokens Returns: tokenString {string} -- equation string """ # FIXME: tokensToString method tokenString = '' for token in tokens: if isinstance(token, Constant): if isinstance(token.value, list): for j, val in token.value: if token['power'][j] != 1: tokenString += (str(val) + '^(' + str(token.power[j]) + ')') else: tokenString += str(val) elif isNumber(token.value): if token.power != 1: tokenString += (str(token.value) + '^(' + str(token.power) + ')') else: tokenString += str(token.value) elif isinstance(token, Variable): if token.coefficient == 1: pass elif token.coefficient == -1: tokenString += '-' else: tokenString += str(token.coefficient) for j, val in enumerate(token.value): if token.power[j] != 1: tokenString += (str(val) + '^(' + str(token.power[j]) + ')') else: tokenString += str(val) elif isinstance(token, Binary): tokenString += ' ' + str(token.value) + ' ' elif isinstance(token, Expression): if token.coefficient != 1: tokenString += str(token.coefficient) + '*' tokenString += '(' tokenString += tokensToString(token.tokens) tokenString += ')' if token.power != 1: tokenString += '^(' + str(token.power) + ')' elif isinstance(token, Sqrt): tokenString += 'sqrt[' if isinstance(token.power, Constant): tokenString += tokensToString([token.power]) elif isinstance(token.power, Variable): tokenString += tokensToString([token.power]) elif isinstance(token.power, Expression): tokenString += tokensToString(token.power.tokens) tokenString += '](' if isinstance(token.operand, Constant): tokenString += tokensToString([token.operand]) elif isinstance(token.operand, Variable): tokenString += tokensToString([token.operand]) elif isinstance(token.operand, Expression): tokenString += tokensToString(token.operand.tokens) tokenString += ')' elif isinstance(token, Logarithm): if token.coefficient == 1: pass elif token.coefficient == -1: tokenString += '-' else: tokenString += str(token.coefficient) if token.operand is not None: tokenString += token.value if token.power != 1: tokenString += "^" + "(" + str(token.power) + ")" tokenString += "(" + tokensToString([token.operand]) + ")" elif isinstance(token, Matrix): tokenString += "[" for i in range(token.dim[0]): for j in range(token.dim[1]): tokenString += tokensToString(token.value[i][j]) tokenString += "," tokenString = tokenString[:-1] + ";" tokenString = tokenString[:-1] + "]" return tokenString