SFL / LearnTriangles.py
amirhosseinkarami's picture
Add code files
bae498f
import numpy as np
def get_simple_data(num_points, max_domain):
full_data = []
for i in range(num_points):
new_datum = [np.random.uniform(0, max_domain),
np.random.uniform(0, max_domain),
np.random.uniform(0, max_domain)]
full_data.append(new_datum)
return full_data
def get_simple_var_names():
return ["a", "b", "c"]
def get_xy_var_names():
return ["x", "y"]
def get_angle_data(num_data):
full_data = []
for i in range(num_data):
theta = np.random.uniform(0, 2 * np.pi)
while np.abs(theta - np.pi / 2) < 1e-3 or np.abs(theta - 3 * np.pi / 2) < 1e-3:
theta = np.random.uniform(0, 2 * np.pi)
new_datum = [np.sin(theta), np.cos(theta), np.tan(theta)]
full_data.append(new_datum)
return full_data
def get_fake_angles(num_data):
full_data = []
for i in range(num_data):
[s, c] = np.random.uniform(-1, 1, 2)
t = np.random.uniform(-5, 5)
new_datum = [s, c, t]
full_data.append(new_datum)
return full_data
def get_xy_data(num_data, max_domain):
full_data = []
for i in range(num_data):
# t = np.random.uniform(0, 2 * np.pi)
# r = 2 + 3 * np.cos(t)
# # r = 5 * np.cos(2*t)/np.cos(t)
#
# x = r * np.cos(t)
# y = r * np.sin(t)
y = np.random.uniform(-3, 2)
sign = np.random.choice([-1, 1])
x = sign * np.sqrt(np.abs(2 * np.sin(y) + 5 - y ** 3))
full_data.append([x, y])
return full_data
def get_fake_xy_data(num_data, max_domain):
full_data = []
for i in range(num_data):
[x, y] = np.random.uniform(0, max_domain, 2)
full_data.append([x, y])
return full_data
def get_triangle_data(num_triangles, max_domain):
full_data = []
for i in range(num_triangles):
[x1, y1, x2, y2, x3, y3] = np.random.uniform(0, max_domain, 6)
a = np.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
b = np.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2)
c = np.sqrt((x1 - x3) ** 2 + (y1 - y3) ** 2)
va = np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c))
vb = np.arccos((c ** 2 + a ** 2 - b ** 2) / (2 * a * c))
vc = np.arccos((a ** 2 + b ** 2 - c ** 2) / (2 * b * a))
sa, sb, sc = np.sin([va, vb, vc])
ca, cb, cc = np.cos([va, vb, vc])
ta, tb, tc = np.tan([va, vb, vc])
new_datum = []
# new_datum.extend([x1, x2, x3])
# new_datum.extend([y1, y2, y3])
new_datum.extend([a, b, c])
# new_datum.extend([va, vb, vc])
# new_datum.extend([sa, sb, sc])
# new_datum.extend([ca, cb, cc])
# new_datum.extend([ta, tb, tc])
full_data.append(new_datum)
return full_data
def get_right_triangle_data(num_triangles, max_domain):
full_data = []
for i in range(num_triangles):
[s1, s2] = np.random.uniform(0, max_domain, 2)
c = max(s1, s2)
a = min(s1, s2)
b = np.sqrt(c * c - a * a)
va = np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c))
vb = np.arccos((c ** 2 + a ** 2 - b ** 2) / (2 * a * c))
vc = np.arccos((a ** 2 + b ** 2 - c ** 2) / (2 * b * a))
sa, sb, sc = np.sin([va, vb, vc])
ca, cb, cc = np.cos([va, vb, vc])
ta, tb, tc = np.tan([va, vb, vc])
new_datum = []
new_datum.extend([a, b, c])
# new_datum.extend([sa, sb, sc])
# new_datum.extend([ca, cb, cc])
# new_datum.extend([ta, tb, tc])
full_data.append(new_datum)
return full_data
def get_fake_triangle_data(num_triangles, max_domain):
full_data = []
for i in range(num_triangles):
[a, b, c] = np.random.uniform(0, max_domain, 3)
[sa, sb, sc] = np.random.uniform(-1, 1, 3)
[ca, cb, cc] = np.random.uniform(-1, 1, 3)
[ta, tb, tc] = np.random.uniform(-5, 5, 3)
new_datum = []
new_datum.extend([a, b, c])
# new_datum.extend([va, vb, vc])
new_datum.extend([sa, sb, sc])
new_datum.extend([ca, cb, cc])
new_datum.extend([ta, tb, tc])
# new_datum.extend([va, vb, vc])
# new_datum.extend([a, 2*a])
# new_datum.extend([ta, tb, tc])
full_data.append(new_datum)
return full_data
def get_non_triangle_data(num_triangles, max_domain):
full_data = []
for i in range(num_triangles):
[x1, y1, x2, y2, x3, y3, x4, y4] = np.random.uniform(0, max_domain, 8)
a = np.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
b = np.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2)
c = np.sqrt((x4 - x3) ** 2 + (y4 - y3) ** 2)
d = np.sqrt((x1 - x4) ** 2 + (y1 - y4) ** 2)
e24 = np.sqrt((x4 - x2) ** 2 + (y4 - y2) ** 2)
e13 = np.sqrt((x3 - x1) ** 2 + (y3 - y1) ** 2)
va = np.arccos((b ** 2 + c ** 2 - e24 ** 2) / (2 * b * c))
vb = np.arccos((d ** 2 + c ** 2 - e13 ** 2) / (2 * d * c))
vc = np.arccos((d ** 2 + a ** 2 - e24 ** 2) / (2 * d * a))
sa, sb, sc = np.sin([va, vb, vc])
ca, cb, cc = np.cos([va, vb, vc])
ta, tb, tc = np.tan([va, vb, vc])
new_datum = []
new_datum.extend([a, b, c])
# new_datum.extend([va, vb, vc])
new_datum.extend([sa, sb, sc])
new_datum.extend([ca, cb, cc])
# new_datum.extend([ta, tb, tc])
full_data.append(new_datum)
return full_data
def get_var_names():
# var_names = ["a", "b", "c"]
var_names = []
var_names.extend(["sin(x)", "cos(x)", "tan(x)"])
# var_names.extend(["A", "B", "C"])
var_names.extend(["sin(A)", "sin(B)", "sin(C)"])
var_names.extend(["cos(A)", "cos(B)", "cos(C)"])
var_names.extend(["tan(A)", "tan(B)", "tan(C)"])
return var_names
#
# our_results = []
#
# settings.true_eqn = "0*x1"
# settings.num_features = num_smp_features
# settings.show_output = False
# settings.keep_logs = False
#
# model = SFL()
#
# for trial_round in range(num_trials):
# sampled_features = np.random.choice(range(len(full_data[0])), num_smp_features, replace=True)
#
# # sampled_features = [3,6]
# data = [[row[smp_i] for smp_i in sampled_features] for row in full_data]
# smp_var_names = [var_names[smp_i] for smp_i in sampled_features]
# print("Trial round {} of {}.".format(trial_round + 1, num_trials))
# print(" Using variables {}.".format(smp_var_names))
#
# settings.fixed_x = []
# settings.fixed_y = []
# for line in data:
# settings.fixed_x.append(line)
# settings.fixed_y.append(0)
#
# model.reset(var_names=smp_var_names)
#
# # train_X = DataUtils.generate_data(settings.train_N, n_vars=model.n_input_variables,
# # avoid_zero=settings.avoid_zero)
# # valid_X = DataUtils.generate_data(settings.train_N, n_vars=model.n_input_variables,
# # avoid_zero=settings.avoid_zero)
# # test_X = DataUtils.generate_data(settings.test_N, n_vars=model.n_input_variables,
# # min_x=settings.test_scope[0],
# # max_x=settings.test_scope[1])
# train_X = np.array(data)
# valid_X = np.array(data)
# test_X = np.array(data)
#
# train_X = train_X.reshape([-1, settings.num_dims_per_feature, settings.num_features])
# valid_X = valid_X.reshape([-1, settings.num_dims_per_feature, settings.num_features])
# test_X = test_X.reshape([-1, settings.num_dims_per_feature, settings.num_features])
#
# start_time = time.time()
# best_model, best_iter, best_err = model.repeat_train(train_X,
# settings.num_train_repeat_processes,
# test_x=test_X)
# running_time = time.time() - start_time
#
# print("best_model: {}".format(best_model))
# print("----------------------")
# print("Finished this experiment. Took {:.2f} minutes.\n".format(running_time / 60))
#
# our_results.append([best_err, best_model, smp_var_names])
# our_results = sorted(our_results, key=lambda entry: entry[0])
#
# output_file = open("images/triangle_output.txt", "w")
# for entry in our_results:
# output_file.write("{}\n{}\n{}\n\n".format(entry[0], entry[2], entry[1]))
# output_file.close()
#
# 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()