def gen_division_with_result(self, result, depth=0): """Generate a, b with a / b = result.""" left, right = self._gen_division_operand(result) return Division( self.gen_expr_with_result(left, depth + 1, [2, 2, 1, 1]), self.gen_expr_with_result(right, depth + 1, [2, 2, 1, 1]), )
def gen_expr_with_result(self, result, depth=0, op_weight=None): """Generate a random expression with given result.""" if op_weight is None: op_weight = [1, 1, 1, 1] if random.random() < self._ending_prob(depth): if result.denominator == 1: return Integer(result.numerator) return Division( Integer(result.numerator), Integer(result.denominator), ) ans = None while ans is None: meth = weighted_choice(list(zip(self.op_gen_methods, op_weight))) ans = meth(result, depth) return ans