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 test_compound(self): expr = Division( Addition( Integer(4), Division(Integer(2), Integer(5)), ), Multiplication( Subtraction( Multiplication(Integer(2), Integer(4)), Division(Integer(6), Integer(5)), ), Addition( Division(Integer(3), Integer(2)), Division(Integer(4), Integer(3)), ), ), ) self.assertEqual(expr.evaluate(), Fraction(66, 289))
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
def test_division(self): expr = Division(Integer(8), Integer(6)) self.assertEqual(expr.evaluate(), Fraction(4, 3))