def test_dependable_condition(): left = ast.BinNumExpr( ast.IfExpr( ast.CompExpr(ast.NumVal(1), ast.NumVal(1), ast.CompOpType.EQ), ast.NumVal(1), ast.NumVal(2)), ast.NumVal(2), ast.BinNumOpType.ADD) right = ast.BinNumExpr(ast.NumVal(1), ast.NumVal(2), ast.BinNumOpType.DIV) bool_test = ast.CompExpr(left, right, ast.CompOpType.GTE) expr = ast.IfExpr(bool_test, ast.NumVal(1), ast.FeatureRef(0)) expected_code = """ func score(input []float64) float64 { var var0 float64 var var1 float64 if (1) == (1) { var1 = 1 } else { var1 = 2 } if ((var1) + (2)) >= ((1) / (2)) { var0 = 1 } else { var0 = input[0] } return var0 }""" interpreter = interpreters.GoInterpreter() utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def test_bin_vector_num_expr(): expr = ast.BinVectorNumExpr( ast.VectorVal([ast.NumVal(1), ast.NumVal(2)]), ast.NumVal(1), ast.BinNumOpType.MUL) interpreter = interpreters.GoInterpreter() expected_code = """ func addVectors(v1, v2 []float64) []float64 { result := make([]float64, len(v1)) for i := 0; i < len(v1); i++ { result[i] = v1[i] + v2[i] } return result } func mulVectorNumber(v1 []float64, num float64) []float64 { result := make([]float64, len(v1)) for i := 0; i < len(v1); i++ { result[i] = v1[i] * num } return result } func score(input []float64) []float64 { return mulVectorNumber([]float64{1, 2}, 1) }""" utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def __init__(self, model): self.model = model self.interpreter = interpreters.GoInterpreter() assembler_cls = assemblers.get_assembler_cls(model) self.model_ast = assembler_cls(model).assemble() self._go = "go"
def test_raw_array(): expr = ast.VectorVal([ast.NumVal(3), ast.NumVal(4)]) expected_code = """ func score(input []float64) []float64 { return []float64{3, 4} }""" interpreter = interpreters.GoInterpreter() utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def __init__(self, model): self.model_name = "score" self.model = model self.interpreter = interpreters.GoInterpreter() assembler_cls = assemblers.get_assembler_cls(model) self.model_ast = assembler_cls(model).assemble() self.exec_path = None
def test_exp_expr(): expr = ast.ExpExpr(ast.NumVal(1.0)) interpreter = interpreters.GoInterpreter() expected_code = """ import "math" func score(input []float64) float64 { return math.Exp(1.0) }""" utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def test_pow_expr(): expr = ast.PowExpr(ast.NumVal(2.0), ast.NumVal(3.0)) interpreter = interpreters.GoInterpreter() expected_code = """ import "math" func score(input []float64) float64 { return math.Pow(2.0, 3.0) }""" utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def test_bin_num_expr(): expr = ast.BinNumExpr( ast.BinNumExpr(ast.FeatureRef(0), ast.NumVal(-2), ast.BinNumOpType.DIV), ast.NumVal(2), ast.BinNumOpType.MUL) interpreter = interpreters.GoInterpreter() expected_code = """ func score(input []float64) float64 { return ((input[0]) / (-2.0)) * (2.0) }""" utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def test_reused_expr(): reused_expr = ast.ExpExpr(ast.NumVal(1.0), to_reuse=True) expr = ast.BinNumExpr(reused_expr, reused_expr, ast.BinNumOpType.DIV) interpreter = interpreters.GoInterpreter() expected_code = """ import "math" func score(input []float64) float64 { var var0 float64 var0 = math.Exp(1.0) return (var0) / (var0) }""" utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def export_to_go(model, indent=4): """ Generates a Go code representation of the given model. Parameters ---------- model : object The model object that should be transpiled into code. indent : int, optional The size of indents in the generated code. Returns ------- code : string """ interpreter = interpreters.GoInterpreter(indent=indent) return _export(model, interpreter)
def test_nested_condition(): left = ast.BinNumExpr( ast.IfExpr( ast.CompExpr(ast.NumVal(1), ast.NumVal(1), ast.CompOpType.EQ), ast.NumVal(1), ast.NumVal(2)), ast.NumVal(2), ast.BinNumOpType.ADD) bool_test = ast.CompExpr(ast.NumVal(1), left, ast.CompOpType.EQ) expr_nested = ast.IfExpr(bool_test, ast.FeatureRef(2), ast.NumVal(2)) expr = ast.IfExpr(bool_test, expr_nested, ast.NumVal(2)) expected_code = """ func score(input []float64) float64 { var var0 float64 var var1 float64 if (1) == (1) { var1 = 1 } else { var1 = 2 } if (1) == ((var1) + (2)) { var var2 float64 if (1) == (1) { var2 = 1 } else { var2 = 2 } if (1) == ((var2) + (2)) { var0 = input[2] } else { var0 = 2 } } else { var0 = 2 } return var0 }""" interpreter = interpreters.GoInterpreter() utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def test_if_expr(): expr = ast.IfExpr( ast.CompExpr(ast.NumVal(1), ast.FeatureRef(0), ast.CompOpType.EQ), ast.NumVal(2), ast.NumVal(3)) interpreter = interpreters.GoInterpreter() expected_code = """ func score(input []float64) float64 { var var0 float64 if (1.0) == (input[0]) { var0 = 2.0 } else { var0 = 3.0 } return var0 }""" utils.assert_code_equal(interpreter.interpret(expr), expected_code)
def test_multi_output(): expr = ast.IfExpr( ast.CompExpr(ast.NumVal(1), ast.NumVal(1), ast.CompOpType.EQ), ast.VectorVal([ast.NumVal(1), ast.NumVal(2)]), ast.VectorVal([ast.NumVal(3), ast.NumVal(4)])) expected_code = """ func score(input []float64) []float64 { var var0 []float64 if (1.0) == (1.0) { var0 = []float64{1.0, 2.0} } else { var0 = []float64{3.0, 4.0} } return var0 }""" interpreter = interpreters.GoInterpreter() utils.assert_code_equal(interpreter.interpret(expr), expected_code)