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_variable_constant(constant, variable, coeff): variable1 = copy.deepcopy(variable) variable1.coefficient /= evaluateConstant(constant) variable1.coefficient *= coeff # removeScopes.append(tokens[i].scope) # removeScopes.append(tokens[i-1].scope) return variable1
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_constantVariable(constant, variable, coeff): variable1 = Variable() variable1.coefficient = (evaluateConstant( constant) / variable.coefficient) * coeff variable1.value = [] variable1.power = [] for i, var in enumerate(variable): variable1.value.append(var) variable1.power.append(-variable.power[i]) return variable1
def getCoefficients(lTokens, rTokens, degree): '''Used by root finder modules to get a list of coefficients of equation Argument: lTokens {list} -- list of left side tokens rTokens {list} -- list of right side tokens degree {int} -- degree of equation Returns: coeffs {list} -- list of coefficients of equation (item at ith index is coefficient of x^i) ''' coeffs = [0] * (degree + 1) for i, token in enumerate(lTokens): if isinstance(token, Constant): cons = evaluateConstant(token) if i != 0: if isinstance(lTokens[i - 1], Binary): if lTokens[i - 1].value in ['-', '+']: if lTokens[i - 1].value == '-': cons *= -1 if (i + 1) < len(lTokens): if lTokens[i + 1].value not in ['*', '/']: coeffs[0] += cons else: return [] else: coeffs[0] += cons if isinstance(token, Variable): if len(token.value) == 1: var = token.coefficient if i != 0: if isinstance(lTokens[i - 1], Binary): if lTokens[i - 1].value in ['-', '+']: if lTokens[i - 1].value == '-': var *= -1 if (i + 1) < len(lTokens): if lTokens[i + 1].value not in ['*', '/']: if token.power[0] in [1, 2, 3, 4]: coeffs[int(token.power[0])] += var else: return [] else: return [] else: if token.power[0] in [1, 2, 3, 4]: coeffs[int(token.power[0])] += var else: return [] else: return [] return coeffs
def division_expression_constant(constant, expression, coeff): tokens = copy.deepcopy(expression) tokens.coefficient /= (evaluateConstant(constant)) tokens.coefficient *= coeff return tokens
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 multiply_expression_constant(constant, expression, coeff): tokens = copy.deepcopy(expression) tokens.coefficient *= (evaluateConstant(constant) * coeff) return tokens
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