예제 #1
0
def test_evaluate_simple_expression():
    expr = milisp.parse('(+ 1 2)')
    env = {
        '+': lambda e, a: milisp.evaluate(e, a[0]) + milisp.evaluate(e, a[1])
    }
    r = milisp.evaluate(env, expr)
    assert r == 3
예제 #2
0
def loop_op(env, args):
    var_name = mi.evaluate(env, args[0])
    first = mi.evaluate(env, args[1])
    last = mi.evaluate(env, args[2])
    for i in range(int(first), int(last) + 1):
        env[var_name] = float(i)
        mi.evaluate(env, args[3])
예제 #3
0
def test_evaluate_simple_with_strings():
    expr = milisp.parse('(concat x "World")')
    env = {
        'concat':
        lambda e, a: milisp.evaluate(e, a[0]) + milisp.evaluate(e, a[1]),
        'x': 'Hello',
    }
    r = milisp.evaluate(env, expr)
    assert r == 'HelloWorld'
예제 #4
0
def test_evaluate_nontrivial():
    expr = milisp.parse('((op "+") x 2)')
    env = {
        '+': lambda e, a: milisp.evaluate(e, a[0]) + milisp.evaluate(e, a[1]),
        'op': lambda e, a: e[milisp.evaluate(e, a[0])],
        'x': 1,
    }
    r = milisp.evaluate(env, expr)
    assert r == 3
예제 #5
0
def main_calc_one_vector_with_pure_python():
    env = {  # setup operations
        'vector': pure_vector_op,
        'and': pure_and_op,
        'in': pure_in_op,
        'exec': pure_exec_op,
        'set': pure_set_op,
    }
    mi.evaluate(env, mi.parse(CODE_INIT))  # run init code to setup constants
    prog = mi.parse(CODE_CALCULATE)  # prepere features calculator
    env.update({  # one raw data vector
        'phoneCountryCode': '+972',
        'phoneAreaCode': '3',
    })
    res = mi.evaluate(env, prog)  # calculate features
    assert res == [0.0, 1.0, 0.0]
    print(res)
예제 #6
0
def main_calc_using_numpy():
    text = """\
            CountryCode   AreaCode
                   +972          3
                     +7        095
                    +44        020
                    +44        023
                    +34        976
    """
    data = np.genfromtxt(io.StringIO(text),
                         skip_header=1,
                         dtype='|U4',
                         autostrip=True)
    env = {
        'vector': np_vector_op,
        'and': np_and_op,
        'in': np_in_op,
        'exec': pure_exec_op,
        'set': np_set_op,
    }
    mi.evaluate(env, mi.parse(CODE_INIT))
    env.update(zip(('phoneCountryCode', 'phoneAreaCode'), data.T))
    res = mi.evaluate(
        env,
        mi.parse(CODE_CALCULATE))  # process all data in one run using NumPy
    np.testing.assert_equal(
        res,
        [
            # LDN / TLV / MSK
            [0., 1., 0.],
            [0., 0., 1.],
            [1., 0., 0.],
            [0., 0., 0.],
            [0., 0., 0.]
        ])
    print(res)
예제 #7
0
def main_prepare_sql_request():
    table_alias = 'log'
    env = {
        'vector': SQLVectorOp('hive."default".events', table_alias),
        'and': sql_and_op,
        'in': sql_in_op,
        'exec': pure_exec_op,
        'set': pure_set_op,
    }
    mi.evaluate(env, mi.parse(CODE_INIT))
    prog = mi.parse(CODE_CALCULATE)
    env.update({
        'phoneCountryCode': f'{table_alias}.phone_country',
        'phoneAreaCode': f'{table_alias}.phone_area',
    })
    res = mi.evaluate(env, prog)
    assert res == """\
select
  (log.phone_country in ('+44')) and (log.phone_area in ('020')),
  (log.phone_country in ('+972')) and (log.phone_area in ('3')),
  (log.phone_country in ('+7')) and (log.phone_area in ('095', '495'))
from
  hive."default".events as log;"""
    print(res)
예제 #8
0
def main():
    text = """
    (prog                     # execute all following expressions and return result of last
        (set "x" 1)           # x = 1
        (loop "i" 1 N         # for i = 1; i <= N; i++
            (set "x" (* x i)) # x = x * i
        )
        x                     # return x
    )
    """
    env = {
        'prog': prog_op,
        'set': set_op,
        'loop': loop_op,
        '*': mul_op,
        'N': 5.,
    }
    expr = mi.parse(text)
    res = mi.evaluate(env, expr)
    assert res == 120.
    print(res)
예제 #9
0
def main():
    text = """
    (prog
        (def "F" "x" (if_gt_one   # if x > 1 then F(x-1) else 1
            x
            (* x (call "F" (+ x -1)))
            1
        ))
        (call "F" N)
    )
    """
    env = {
        'prog': prog_op,
        '*': mul_op,
        '+': plus_op,
        'def': def_op,
        'call': call_op,
        'if_gt_one': if_gt_one_op,
        'N': 5.,
    }
    expr = mi.parse(text)
    res = mi.evaluate(env, expr)
    assert res == 120.
    print(res)
예제 #10
0
def test_evaluate_none():
    r = milisp.evaluate(None, milisp.parse('()'))
    assert r is None
예제 #11
0
def mul_op(env, args):
    return mi.evaluate(env, args[0]) * mi.evaluate(env, args[1])
예제 #12
0
def pure_and_op(env, args):
    return any(bool(mi.evaluate(env, a)) for a in args)  # lazy in Python3
예제 #13
0
def plus_op(env, args):
    return mi.evaluate(env, args[0]) + mi.evaluate(env, args[1])
예제 #14
0
def test_evaluate_number():
    r = milisp.evaluate(None, milisp.parse('1'))
    assert r == 1
예제 #15
0
def np_vector_op(env, args):
    return np.stack([mi.evaluate(env, a) for a in args]).T.astype(np.float32)
예제 #16
0
def np_set_op(env, args):
    vals = [mi.evaluate(env, a) for a in args]
    env[vals[0]] = np.array(vals[1:])[:, np.newaxis]
예제 #17
0
def def_op(env, args):
    env[mi.evaluate(env, args[0])] = (mi.evaluate(env, args[1]), args[2])
예제 #18
0
def set_op(env, args):
    env[mi.evaluate(env, args[0])] = mi.evaluate(env, args[1])
예제 #19
0
def pure_exec_op(env, args):
    [mi.evaluate(env, a) for a in args]  # pylint:disable=expression-not-assigned
예제 #20
0
 def __call__(self, env, args):
     fields = ',\n'.join('  ' + mi.evaluate(env, a) for a in args)
     return f'select\n{fields}\nfrom\n  {self.table_name} as {self.table_alias};'
예제 #21
0
def pure_set_op(env, args):
    vals = [mi.evaluate(env, a) for a in args]
    env[vals[0]] = vals[1:]
예제 #22
0
def pure_in_op(env, args):
    pattern = mi.evaluate(env, args[0])
    lst = mi.evaluate(env, args[1])
    return pattern in lst  # by the way, "in" could be lazy too in more complex circumstance
예제 #23
0
def test_evaluate_var():
    r = milisp.evaluate({'x': 1}, milisp.parse('x'))
    assert r == 1
예제 #24
0
def call_op(env, args):
    argname, funcbody = env[mi.evaluate(env, args[0])]
    localenv = env.copy()  # shallow copy if enough for our purpose
    localenv[argname] = mi.evaluate(env, args[1])
    return mi.evaluate(localenv, funcbody)
예제 #25
0
def np_in_op(env, args):
    pattern = mi.evaluate(env, args[0])
    lst = mi.evaluate(env, args[1])
    return (lst == pattern).any(axis=0)
예제 #26
0
def if_gt_one_op(env, args):
    if mi.evaluate(env, args[0]) > 1.:
        return mi.evaluate(env, args[1])
    return mi.evaluate(env, args[2])
예제 #27
0
def np_and_op(env, args):
    return np.stack([mi.evaluate(env, a) for a in args]).all(axis=0)
예제 #28
0
def prog_op(env, args):
    for a in args:
        r = mi.evaluate(env, a)
    return r
예제 #29
0
def test_evaluate_string():
    r = milisp.evaluate(None, milisp.parse('"ok"'))
    assert r == 'ok'
예제 #30
0
def pure_vector_op(env, args):
    return [float(mi.evaluate(env, a)) for a in args]