def test_to_latex(): kamodo = Kamodo(f='x**2', verbose=True) assert str(kamodo.to_latex()) == r'\begin{equation}f{\left(x \right)} = x^{2}\end{equation}' kamodo = Kamodo(g='x', verbose=True) assert str(kamodo.to_latex()) == r'\begin{equation}g{\left(x \right)} = x\end{equation}' kamodo['f(x[cm])[kg]'] = 'x**2' kamodo['g'] = kamodofy(lambda x: x**2, units='kg', arg_units=dict(x='cm'), equation='$x^2$') kamodo.to_latex()
def test_Kamodo_ambiguous_expr(): a, b, c, x, y, z = symbols('a b c x y z') with pytest.raises(NameError): kamodo = Kamodo() kamodo['a(b,c)'] = x ** 2 + y ** 2 kamodo = Kamodo() kamodo['a(x, y)'] = x ** 2 + y ** 2 assert kamodo.a(3, 4) == 3 ** 2 + 4 ** 2
def test_kamodo_inline_merge(): k1 = Kamodo(f='x**2') k2 = Kamodo(g=lambda y: y-1) # create a local namespace holding both kamodo objects ns = {'k1':k1, 'k2': k2} k3 = Kamodo(myf = sympify('k1.f(x) + k2.g(y)', locals=ns)) assert k3.myf(x=3, y=4) == 3**2 + 4 - 1
def test_unit_composition_registration(): server = Kamodo(**{'M': kamodofy(lambda r=3: r, units='kg'), 'V[m^3]': (lambda r: r**3)}, verbose=True) user = Kamodo(mass=server.M, vol=server.V, **{'rho(r)[g/cm^3]':'mass/vol'}, verbose=True) result = (3/3**3)*(1000)*(1/10**6) assert np.isclose(user.rho(3), result)
def test_compose(): k1 = Kamodo(f='x') k2 = Kamodo(g='y**2', h = kamodofy(lambda x: x**3)) k3 = compose(m1=k1, m2=k2) assert k3.f_m1(3) == 3 assert k3.g_m2(3) == 3**2 assert k3.h_m2(3) == 3**3 k3['h(f_m1)'] = 'f_m1' assert k3.h(3) == 3
def test_Kamodo_assign_by_callable(): kamodo = Kamodo(f=lambda x: x ** 2, verbose=False) assert kamodo['f'](3) == 3 ** 2 assert kamodo.f(3) == 3 ** 2 Kamodo(f=lambda x, y: x + y) def rho(x, y): return x + y kamodo['g'] = rho assert kamodo.g(3, 4) == 3 + 4
def test_symbol_key(): f = symbols('f', cls=UndefinedFunction) x = Symbol('x') f_ = f(x) kamodo = Kamodo(verbose=True) kamodo[f_] = x ** 2 assert kamodo.f(3) == 9
def test_Kamodo_reassignment(): a, b, c, x, y, z, r = symbols('a b c x y z r') kamodo = Kamodo('f(x) = 3*x+5', verbose=True) kamodo['r(x,y)'] = x + y kamodo['r(x,y)'] = "3*x + y" assert kamodo.r(1, 1) != 2 assert kamodo.r(1, 1) == 4
def test_simple_figure(): @kamodofy(units='kg', hidden_args=['ions']) def f_N(x_N): return x_N**2 kamodo = Kamodo(f_N=f_N,verbose=True) kamodo.plot(f_N=dict(x_N=np.linspace(-4, 3, 30)))
def test_to_latex(): warnings.simplefilter('error') kamodo = Kamodo(f='x**2', verbose=True) assert str(kamodo.to_latex(mode='inline')) == r'$f{\left(x \right)} = x^{2}$' kamodo = Kamodo(g='x', verbose=True) assert str(kamodo.to_latex(mode='inline')) == r'$g{\left(x \right)} = x$' kamodo['f(x[cm])[kg]'] = 'x**2' kamodo['g'] = kamodofy(lambda x: x**2, units='kg', arg_units=dict(x='cm'), equation='$x^2$') kamodo['h'] = kamodofy(lambda x: x**2, units='kg', arg_units=dict(x='cm')) @kamodofy(units = 'kg/m^3', citation = 'Bob et. al, 2018') def rho(x = np.array([3,4,5]), y = np.array([1,2,3])): """A function that computes density""" return x+y kamodo['rho'] = rho kamodo.to_latex()
def test_unavailable_4d_plot_type(): def g(x=np.array([1]), y=np.array([1]), z=np.array([1]), t=np.array([1])): return x**2 + y**2 + z**2 + t**2 kamodo = Kamodo(g=g, verbose=True) with pytest.raises(KeyError): kamodo.plot('g')
def test_compose_unit_raises(): with pytest.raises(NameError): kamodo = Kamodo('a(x[kg])[m] = x', 'b(y[cm])[km] = y', verbose=True) # this should fail since x is registered with kg kamodo['c(x[cm],y[cm])[km]'] = '2*a + 3*b'
def test_eval_no_defaults(): kamodo = Kamodo(f='x', verbose=True) kamodo['g'] = lambda x=3: x kamodo['h'] = kamodofy(lambda x=[2,3,4]: (kamodofy(lambda x_=np.array([1]): x_**2) for x_ in x)) assert kamodo.evaluate('f', x=3)['x'] == 3 assert kamodo.evaluate('g')['x'] == 3 assert kamodo.evaluate('h')['x_'][-2] == 1.
def test_kamodofy_update_attribute(): @kamodofy(units='cm', update='y') def f(x): return x # pragma: no cover kamodo = Kamodo(f=f) assert f.update == 'y'
def test_multi_unit_composition(): kamodo = Kamodo('a(x[s])[km] = x', verbose=True) kamodo['b(x[cm])[g]'] = 'x' kamodo['c'] = 'b(a)' print(kamodo.c.meta) assert kamodo.c.meta['units'] == 'g' assert kamodo.c.meta['arg_units']['x'] == str(get_abbrev(get_unit('s')))
def test_komodofy_register(): @kamodofy(units='kg/cm^3') def my_density(x, y, z): return x + y + z kamodo = Kamodo(rho=my_density) assert kamodo.rho.meta['units'] == 'kg/cm^3'
def test_tri_surface_plot(): R = 1 theta = np.linspace(.2 * np.pi, .8 * np.pi, 40) phi = np.linspace(0, 2 * np.pi, 50) theta_, phi_ = np.meshgrid(theta, phi) r = (R + .1 * (np.cos(10 * theta_) * np.sin(14 * phi_))) xx = r * np.sin(theta_) * np.cos(phi_) yy = r * np.sin(theta_) * np.sin(phi_) zz = r * np.cos(theta_) def tri_surface(x_NM=xx, y_NM=yy, z_NM=zz): return .1 * x_NM + x_NM ** 2 + y_NM ** 2 + z_NM ** 2 title = '$\\operatorname{h_{NM}}{\\left(x_{NM},y_{NM},z_{NM} \\right)} = \\lambda{\\left(x_{NM},y_{NM},' \ 'z_{NM} \\right)}$ ' kamodo = Kamodo(h_NM=tri_surface) results = kamodo.evaluate('h_NM') titles = dict(variable='h_NM', title=title) traces, chart_type, layout = tri_surface_plot(results, titles, True) assert chart_type == '3d-surface' assert layout['title']['text'] == title
def test_Kamodo_expr(): a, b, c, x, y, z = symbols('a b c x y z') kamodo = Kamodo(a=x ** 2, verbose=True) try: assert kamodo.a(3) == 3 ** 2 except: print(kamodo.symbol_registry) raise
def test_Kamodo_str(): kamodo = Kamodo('f(a,x,b) = a*x+b') try: assert kamodo.f(3, 4, 5) == 3 * 4 + 5 except: print(kamodo.signatures) print(list(kamodo.keys())) raise
def test_unit_composition_conversion(): kamodo = Kamodo('a(x[kg])[m] = x', verbose=True) kamodo['b(x[cm])[g]'] = 'x' kamodo['c'] = 'b(a)' assert kamodo.c.meta['units'] == 'g' assert kamodo.c.meta['arg_units']['x'] == 'kg' assert kamodo.c(3) == kamodo.b(100*kamodo.a(3))
def test_Kamodo_get(): kamodo = Kamodo('$f(a,x,b) = a^x+b $') try: assert kamodo['f'](3, 4, 5) == 3 ** 4 + 5 except: print(kamodo.signatures) print(list(kamodo.keys())) raise
def test_reserved_name(): kamodo = Kamodo(verbose=True) @kamodofy def test(x, y): return x+y with pytest.raises(NotImplementedError): kamodo['test'] = test
def test_vectorize(): @np.vectorize @kamodofy(units='kg') def f(x, y): return x + y kamodo = Kamodo(f=f) kamodo.f([3, 4, 5], 5) kamodo.evaluate('f', x=3,y=2)
def test_unit_composition(): kamodo = Kamodo('m[kg] = x', verbose=True) kamodo['v[km/s]'] = 'y' kamodo['p(x,y)'] = 'm*v' try: assert get_unit(kamodo.signatures['p']['units']) == get_unit('kg*km/s') except: print(kamodo.signatures) raise
def test_default_forwarding(): x = np.linspace(-5, 5, 12) def f(x=x): return x**2 k = Kamodo(f=f) k['g'] = 'f+2' assert len(k.g()) == 12
def test_image_plot(): def img(i=np.arange(33),j=np.arange(35)): ii, jj, kk = np.meshgrid(i,j,[100, 200, 255], indexing='ij') return kk kamodo = Kamodo(img=img) results = kamodo.evaluate('img') titles = dict(variable='img', title='mytitle') [trace], chart_type, layout = image(results, titles, True)
def test_unit_function_composition(): kamodo = Kamodo('X[m] = x', verbose=True) @kamodofy(units='km/s', arg_units=dict(x = 'm')) def v(x): return x kamodo['v'] = v kamodo['speed'] = 'v(X)' assert kamodo.speed.meta['units'] == 'km/s'
def test_contains(): kamodo = Kamodo(f='x', verbose=True) assert 'f' in kamodo assert 'f( x )' in kamodo f, x = symbols('f x') assert f in kamodo # f is a symbo f = Function(f) # f is an Unefined Function assert f in kamodo assert f(x) in kamodo assert f('x') in kamodo
def test_scatter_plot(): title = 'test plot title' kamodo_obj = Kamodo(f='x**3') result = kamodo_obj.evaluate('f', x=np.random.random((100, 3))) titles = dict(variable='x', title=title) [trace], plot_type, layout = scatter_plot(result, titles, True) assert trace['mode'] == 'markers' assert layout['title']['text'] == title assert plot_type == '3d-scatter'
def test_symbol_replace(): k = Kamodo(f='x', verbose=True) f1, f2 = list(k.keys()) print('\n|||||',f1, f2, '||||||') k[f1] = 'x**2' assert k.f(3) == 9 print('\n|||||', *list(k.keys()), '|||||') k[f2] = 'x**3' print('\n|||||', *list(k.keys()), '|||||') assert k.f(3) == 27