import unittest import numpy as np from pysr import sympy2jax, PySRRegressor import pandas as pd from jax import numpy as jnp from jax import random import sympy from functools import partial class TestJAX(unittest.TestCase): def setUp(self): np.random.seed(0) def test_sympy2jax(self): x, y, z = sympy.symbols("x y z") cosx = 1.0 * sympy.cos(x) + y key = random.PRNGKey(0) X = random.normal(key, (1000, 2)) true = 1.0 * jnp.cos(X[:, 0]) + X[:, 1] f, params = sympy2jax(cosx, [x, y, z]) self.assertTrue(jnp.all(jnp.isclose(f(X, params), true)).item()) def test_pipeline_pandas(self): X = pd.DataFrame(np.random.randn(100, 10)) equations = pd.DataFrame( { "Equation": ["1.0", "cos(x1)", "square(cos(x1))"], "MSE": [1.0, 0.1, 1e-5], "Complexity": [1, 2, 3], } ) equations["Complexity MSE Equation".split(" ")].to_csv( "equation_file.csv.bkup", sep="|" ) model = PySRRegressor( equation_file="equation_file.csv", output_jax_format=True, variable_names="x1 x2 x3".split(" "), ) model.fit(X, y=np.ones(X.shape[0]), from_equation_file=True) model.refresh() jformat = model.jax() np.testing.assert_almost_equal( np.array(jformat["callable"](jnp.array(X), jformat["parameters"])), np.square(np.cos(X.values[:, 1])), # Select feature 1 decimal=4, ) def test_pipeline(self): X = np.random.randn(100, 10) equations = pd.DataFrame( { "Equation": ["1.0", "cos(x1)", "square(cos(x1))"], "MSE": [1.0, 0.1, 1e-5], "Complexity": [1, 2, 3], } ) equations["Complexity MSE Equation".split(" ")].to_csv( "equation_file.csv.bkup", sep="|" ) model = PySRRegressor( equation_file="equation_file.csv", output_jax_format=True, variable_names="x1 x2 x3".split(" "), ) model.fit(X, y=np.ones(X.shape[0]), from_equation_file=True) model.refresh() jformat = model.jax() np.testing.assert_almost_equal( np.array(jformat["callable"](jnp.array(X), jformat["parameters"])), np.square(np.cos(X[:, 1])), # Select feature 1 decimal=4, ) def test_feature_selection(self): X = pd.DataFrame({f"k{i}": np.random.randn(1000) for i in range(10, 21)}) y = X["k15"] ** 2 + np.cos(X["k20"]) model = PySRRegressor( unary_operators=["cos"], select_k_features=3, early_stop_condition=1e-5 ) model.fit(X.values, y.values) f, parameters = model.jax().values() np_prediction = model.predict jax_prediction = partial(f, parameters=parameters) np_output = np_prediction(X.values) jax_output = jax_prediction(X.values) np.testing.assert_almost_equal(np_output, jax_output, decimal=4)