def solve_for_sub_subspace(matrixrows, sub_sub_space, coeffs, cvector, iofvars, subs_rules, fvargen, newfvars, tempgen, tempvars): sspacedict = dict(zip(sub_sub_space, range(len(sub_sub_space)))) length = len(sub_sub_space) augmatrixrows = [] rownumstore = [] #for debugging for rownum, row in matrixrows.items(): if row and row[0][0] in sub_sub_space: augmatrixrows.append(length*[0]+[cvector[rownum]]) rownumstore.append(rownum) for el in row: augmatrixrows[-1][sspacedict[el[0]]] = el[1] fvars = [coeffs[ind] for ind in sub_sub_space] augmatrix = Matrix(augmatrixrows) oldfvars = [] if iofvars: #ipdb.set_trace() atoms = augmatrix.atoms(sympy.Symbol) for iofvar in subs_rules: if iofvar in atoms: augmatrix = augmatrix.xreplace({iofvar: subs_rules[iofvar]}) atoms = augmatrix.atoms(sympy.Symbol) for iofvar in iofvars: if iofvar not in subs_rules and iofvar in atoms: fvars.append(iofvar) oldfvars.append(iofvar) augmatrix = augmatrix.col_insert(-1, sympy.zeros(augmatrix.rows,1)) for row_ind in range(len(augmatrix[:,0])): coeff_val = -sympy.expand(augmatrix[row_ind,-1]).coeff(iofvar) augmatrix[row_ind,-2] = coeff_val augmatrix[row_ind,-1] += coeff_val*iofvar sols, success = linear_solve(augmatrix, fvars, iofvars, fvargen, newfvars, tempgen, tempvars, len(oldfvars)) if not success: print(repr(augmatrix)) print(fvars) print(rownumstore) print(iofvars) print(subs_rules) raise ValueError("Failure. No solutions.") for oldfvar in oldfvars: if oldfvar in sols: subs_rules.update({var: rule.xreplace({oldfvar: sols[oldfvar]}) for var, rule in subs_rules.items()}) subs_rules[oldfvar] = default_simplify(sols[oldfvar]) return sols