def division(tokens, direct=False): """Function deals with division related operations (driver function in division module) Arguments: tokens {list} -- list of tokens direct {bool} -- True when we are only concerned about multiplications terms in the input Returns: availableOperations {list} -- list of operations which can be performed on a equation token token_string {string} -- final result stored in a string animation {list} -- list of equation solving process comments {list} -- list of comments in equation solving process """ animation = [copy.deepcopy(tokens)] comments = [] if direct: comments = [[]] variables = [] variables.extend(getLevelVariables(tokens)) availableOperations = getOperationsExpression(variables, tokens) while '/' in availableOperations: _, tok, rem, com = expressionDivision(variables, tokens) tokens = removeToken(tok, rem) comments.append(com) animation.append(copy.deepcopy(tokens)) variables = getLevelVariables(tokens) availableOperations = getOperationsExpression(variables, tokens) token_string = tokensToString(tokens) return tokens, availableOperations, token_string, animation, comments
def division(tokens, direct=False): animation = [copy.deepcopy(tokens)] comments = [] if direct: comments = [[]] variables = [] variables.extend(getLevelVariables(tokens)) availableOperations = getOperationsExpression(variables, tokens) while '/' in availableOperations: _, tok, rem, com = expressionDivision(variables, tokens) tokens = removeToken(tok, rem) comments.append(com) animation.append(copy.deepcopy(tokens)) variables = getLevelVariables(tokens) availableOperations = getOperationsExpression(variables, tokens) token_string = tokensToString(tokens) return tokens, availableOperations, token_string, animation, comments
def multiplication(tokens, direct=False): # FIXME: Fix multiplication for variables (Ex: x^-1 * x^2) animation = [copy.deepcopy(tokens)] comments = [] if direct: comments = [[]] variables = [] variables.extend(getLevelVariables(tokens)) availableOperations = getOperationsExpression(variables, tokens) while '*' in availableOperations: _, tok, rem, com = expressionMultiplication(variables, tokens) tokens = removeToken(tok, rem) comments.append(com) animation.append(copy.deepcopy(tokens)) variables = getLevelVariables(tokens) availableOperations = getOperationsExpression(variables, tokens) token_string = tokensToString(tokens) return tokens, availableOperations, token_string, animation, comments
def simplifification(tokens): """Simplifies given expression tokens Arguments: tokens {list} -- tokens list Returns: tokens {list} -- tokens list availableOperations {list} -- list of operations token_string {string} -- simplified result in string animation {list} -- list of equation simplification progress comments {list} -- list of solution steps """ tokens_orig = copy.deepcopy(tokens) animation = [tokens_orig] variables = [] comments = [] variables.extend(getLevelVariables(tokens)) availableOperations = getOperationsExpression(variables, tokens) while len(availableOperations) > 0: if '/' in availableOperations: tokens_temp = copy.deepcopy(tokens) tokens, availableOperations, token_string, anim, com = division( tokens_temp) animation.pop(len(animation) - 1) animation.extend(anim) comments.extend(com) elif '*' in availableOperations: tokens_temp = copy.deepcopy(tokens) tokens, availableOperations, token_string, anim, com = multiplication( tokens_temp) animation.pop(len(animation) - 1) animation.extend(anim) comments.extend(com) elif '+' in availableOperations: tokens_temp = copy.deepcopy(tokens) tokens, availableOperations, token_string, anim, com = addition( tokens_temp) animation.pop(len(animation) - 1) animation.extend(anim) comments.extend(com) elif '-' in availableOperations: tokens_temp = copy.deepcopy(tokens) tokens, availableOperations, token_string, anim, com = subtraction( tokens_temp) animation.pop(len(animation) - 1) animation.extend(anim) comments.extend(com) tokens, animation = postSimplification(tokens, animation) token_string = tokensToString(tokens) return tokens, availableOperations, token_string, animation, comments
def divisionEquation(lToks, rToks, direct=False): lTokens = copy.deepcopy(lToks) rTokens = copy.deepcopy(rToks) animation = [] comments = [] if direct: comments = [[]] animBuilder = lToks lenToks = len(lToks) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' animBuilder.append(equalTo) if len(rToks) == 0: zero = Zero() zero.scope = [lenToks + 1] animBuilder.append(zero) else: animBuilder.extend(rToks) animation.append(copy.deepcopy(animBuilder)) lVariables = [] lVariables.extend(getLevelVariables(lTokens)) rVariables = [] rVariables.extend(getLevelVariables(rTokens)) availableOperations = getOperationsExpression(lVariables, lTokens) while '/' in availableOperations: _, tok, rem, com = expressionDivision(lVariables, lTokens) lTokens = removeToken(tok, rem) comments.append(com) animBuilder = copy.deepcopy(lTokens) lenToks = len(lTokens) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' animBuilder.append(equalTo) if len(rTokens) == 0: zero = Zero() zero.scope = [lenToks + 1] animBuilder.append(zero) else: animBuilder.extend(rTokens) animation.append(copy.deepcopy(animBuilder)) lVariables = getLevelVariables(lTokens) availableOperations = getOperationsExpression(lVariables, lTokens) availableOperations = getOperationsExpression(rVariables, rTokens) while '/' in availableOperations: _, tok, rem, com = expressionDivision(rVariables, rTokens) rTokens = removeToken(tok, rem) comments.append(com) animBuilder = copy.deepcopy(lTokens) lenToks = len(lTokens) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' animBuilder.append(equalTo) if len(rTokens) == 0: zero = Zero() zero.scope = [lenToks + 1] animBuilder.append(zero) else: animBuilder.extend(rTokens) animation.append(copy.deepcopy(animBuilder)) rVariables = getLevelVariables(rTokens) availableOperations = getOperationsExpression(rVariables, rTokens) tokenToStringBuilder = copy.deepcopy(lTokens) lenToks = len(lTokens) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' tokenToStringBuilder.append(equalTo) if len(rTokens) == 0: zero = Zero() zero.scope = [lenToks + 1] tokenToStringBuilder.append(zero) else: tokenToStringBuilder.extend(rTokens) token_string = tokensToString(tokenToStringBuilder) lVariables = getLevelVariables(lTokens) rVariables = getLevelVariables(rTokens) availableOperations = getOperationsEquation( lVariables, lTokens, rVariables, rTokens) return lTokens, rTokens, availableOperations, token_string, animation, comments
def divisionEquation(lToks, rToks, direct=False): """Function deals with division related operations FOR EQUATIONS (driver function in division module) Arguments: rtoks {list} -- list of right tokens ltoks {list} -- list of left tokens direct {bool} -- True when we are only concerned about multiplications terms in the input Returns: availableOperations {list} -- list of operations which can be performed on a equation token token_string {string} -- final result stored in a string animation {list} -- list of equation solving process comments {list} -- list of comments in equation solving process """ lTokens = copy.deepcopy(lToks) rTokens = copy.deepcopy(rToks) animation = [] comments = [] if direct: comments = [[]] animBuilder = lToks lenToks = len(lToks) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' animBuilder.append(equalTo) if len(rToks) == 0: zero = Zero() zero.scope = [lenToks + 1] animBuilder.append(zero) else: animBuilder.extend(rToks) animation.append(copy.deepcopy(animBuilder)) lVariables = [] lVariables.extend(getLevelVariables(lTokens)) rVariables = [] rVariables.extend(getLevelVariables(rTokens)) availableOperations = getOperationsExpression(lVariables, lTokens) while '/' in availableOperations: _, tok, rem, com = expressionDivision(lVariables, lTokens) lTokens = removeToken(tok, rem) comments.append(com) animBuilder = copy.deepcopy(lTokens) lenToks = len(lTokens) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' animBuilder.append(equalTo) if len(rTokens) == 0: zero = Zero() zero.scope = [lenToks + 1] animBuilder.append(zero) else: animBuilder.extend(rTokens) animation.append(copy.deepcopy(animBuilder)) lVariables = getLevelVariables(lTokens) availableOperations = getOperationsExpression(lVariables, lTokens) availableOperations = getOperationsExpression(rVariables, rTokens) while '/' in availableOperations: _, tok, rem, com = expressionDivision(rVariables, rTokens) rTokens = removeToken(tok, rem) comments.append(com) animBuilder = copy.deepcopy(lTokens) lenToks = len(lTokens) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' animBuilder.append(equalTo) if len(rTokens) == 0: zero = Zero() zero.scope = [lenToks + 1] animBuilder.append(zero) else: animBuilder.extend(rTokens) animation.append(copy.deepcopy(animBuilder)) rVariables = getLevelVariables(rTokens) availableOperations = getOperationsExpression(rVariables, rTokens) tokenToStringBuilder = copy.deepcopy(lTokens) lenToks = len(lTokens) equalTo = Binary() equalTo.scope = [lenToks] equalTo.value = '=' tokenToStringBuilder.append(equalTo) if len(rTokens) == 0: zero = Zero() zero.scope = [lenToks + 1] tokenToStringBuilder.append(zero) else: tokenToStringBuilder.extend(rTokens) token_string = tokensToString(tokenToStringBuilder) lVariables = getLevelVariables(lTokens) rVariables = getLevelVariables(rTokens) availableOperations = getOperationsEquation(lVariables, lTokens, rVariables, rTokens) return lTokens, rTokens, availableOperations, token_string, animation, comments