SFL / RegressorTest.py
amirhosseinkarami's picture
Add code files
bae498f
raw
history blame contribute delete
No virus
4.03 kB
"""""""""""""""""""""""""""""""""
This file is for running.
Do not modify this file.
For running: DiffEqnSolver.py
For modifying: settings.py
"""""""""""""""""""""""""""""""""
import os
import time
import numpy as np
from pysr import pysr, best
import DataUtils
import Settings as settings
from SymbolicFunctionLearner import SFL
# Dataset
X = 2 * np.random.randn(100, 5)
y = 2 * np.cos(X[:, 3]) + X[:, 0] ** 2 - 2
# Learn equations
equations = pysr(X, y, niterations=5,
binary_operators=["plus", "mult"],
unary_operators=[
"cos", "exp", "sin"])
# Pre-defined library of operators (see https://pysr.readthedocs.io/en/latest/docs/operators/)
# "inv(x) = 1/x"]) # Define your own operator! (Julia syntax)
... # (you can use ctl-c to exit early)
print(best(equations))
settings.mode = "sr"
if not os.path.exists('images'):
os.makedirs('images')
input_file = open("FeynmanEqns.txt", "r")
input_lines = input_file.readlines()
input_file.close()
for line in input_lines[1:]:
line_parts = line.strip().split(";")
eqn_name = line_parts[0].strip()
settings.n_tree_layers = int(line_parts[1].strip())
settings.num_features = int(line_parts[2].strip())
eqn_str = line_parts[3].strip()
print("True equation: {}".format(eqn_str))
settings.true_eqn = eqn_str
settings.initialize_ops = eval(line_parts[4].strip())
print(settings.initialize_ops)
# Set up data
fixed_x = DataUtils.generate_data(settings.train_N, n_vars=settings.num_features)
print(fixed_x.shape)
fixed_y = DataUtils.true_function(fixed_x)
print(len(fixed_y))
settings.fixed_x = []
settings.fixed_y = []
for i in range(settings.train_N):
settings.fixed_x.append(fixed_x[i, :].tolist()[0])
settings.fixed_y.append(fixed_y[i])
current_model = SFL()
print('\nBeginning experiment: {}'.format(current_model.name))
print("{} tree layers.".format(settings.n_tree_layers))
print("{} features of {} component(s) each.".format(settings.num_features, settings.num_dims_per_feature))
print("{} components in output.".format(settings.n_dims_in_output))
print("{} operators: {}.".format(len(current_model.function_set),
current_model.function_set))
train_errors = []
valid_errors = []
test_errors = []
true_eqns = []
# train_X = DataUtils.generate_data(settings.train_N, n_vars=current_model.n_input_variables,
# avoid_zero=settings.avoid_zero)
# valid_X = DataUtils.generate_data(settings.train_N, n_vars=current_model.n_input_variables,
# avoid_zero=settings.avoid_zero)
# test_X = DataUtils.generate_data(settings.test_N, n_vars=current_model.n_input_variables,
# min_x=settings.test_scope[0],
# max_x=settings.test_scope[1])
train_X = fixed_x
test_X = fixed_x
train_Y = fixed_y
test_Y = fixed_y
print("\n========================")
print("Starting Solver.")
print("==========================\n")
# Train the model from scratch several times, keeping the best one.
start_time = time.time()
best_model, best_iter, best_err = current_model.repeat_train(train_X, train_Y,
settings.num_train_repeat_processes,
test_x=test_X, test_y=test_Y)
running_time = time.time() - start_time
print("best_model: {}".format(best_model))
print("----------------------")
print("Finished regression. Took {:.2f} minutes.\n".format(running_time / 60))
print("Final solution found at attempt {}:".format(best_iter))
print("y = {}".format(best_model))
print("Test error: {}".format(best_err))
if best_err < 0.02:
print("Attained error less than 0.02 - great!")
print()