diff --git a/Code/S_add_bf_on_numbers_on_pareto.py b/Code/S_add_bf_on_numbers_on_pareto.py index 6346ac2..de99770 100644 --- a/Code/S_add_bf_on_numbers_on_pareto.py +++ b/Code/S_add_bf_on_numbers_on_pareto.py @@ -72,30 +72,34 @@ def add_bf_on_numbers_on_pareto(pathdir, filename, PA, math_expr): eq_numbers = [subexpression for subexpression in preorder_traversal(expr) if is_atomic_number(subexpression)] # Do bf on one parameter at a time bf_on_numbers_expr = [] - for w in range(len(eq_numbers)): - param_dict = {} - unsnapped_param_dict = {'p':1} - eq_ = unsnap_recur(expr,param_dict,unsnapped_param_dict) - eq = eq_ - - np.savetxt(pathdir+"number_for_bf_%s.txt" %w, [eq_numbers[w]]) - brute_force_number(pathdir,"number_for_bf_%s.txt" %w) - # Load the predictions made by the bf code - bf_numbers = np.loadtxt("results.dat",usecols=(1,),dtype="str") - new_numbers = copy.deepcopy(eq_numbers) - - # replace the number under consideration by all the proposed bf numbers - for kk in range(len(bf_numbers)): + for w in range(len(eq_numbers)): + try: + param_dict = {} + unsnapped_param_dict = {'p':1} + eq_ = unsnap_recur(expr,param_dict,unsnapped_param_dict) eq = eq_ - new_numbers[w] = parse_expr(RPN_to_eq(bf_numbers[kk])) - jj = 0 - for parm in unsnapped_param_dict: - if parm!="p": - eq = eq.subs(parm, new_numbers[jj]) - jj = jj + 1 + np.savetxt(pathdir+"number_for_bf_%s.txt" %w, [eq_numbers[w]]) + brute_force_number(pathdir,"number_for_bf_%s.txt" %w) + # Load the predictions made by the bf code + bf_numbers = np.loadtxt("results.dat",usecols=(1,),dtype="str") + new_numbers = copy.deepcopy(eq_numbers) + + # replace the number under consideration by all the proposed bf numbers + for kk in range(len(bf_numbers)): + eq = eq_ + new_numbers[w] = parse_expr(RPN_to_eq(bf_numbers[kk])) + + jj = 0 + for parm in unsnapped_param_dict: + if parm!="p": + eq = eq.subs(parm, new_numbers[jj]) + jj = jj + 1 - bf_on_numbers_expr = bf_on_numbers_expr + [eq] + bf_on_numbers_expr = bf_on_numbers_expr + [eq] + except: + continue + for i in range(len(bf_on_numbers_expr)): try: # Calculate the error of the new, snapped expression diff --git a/Code/S_add_snap_expr_on_pareto.py b/Code/S_add_snap_expr_on_pareto.py index fde8182..e66f308 100644 --- a/Code/S_add_snap_expr_on_pareto.py +++ b/Code/S_add_snap_expr_on_pareto.py @@ -79,19 +79,22 @@ def add_snap_expr_on_pareto(pathdir, filename, math_expr, PA, DR_file=""): # Do integer snap one parameter at a time integer_snapped_expr = [] for w in range(len(eq_numbers)): - param_dict = {} - unsnapped_param_dict = {'p':1} - eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) - new_numbers = integerSnap(eq_numbers,w+1) - for kk in range(len(new_numbers)): - eq_numbers[new_numbers[kk][0]] = new_numbers[kk][1] - jj = 0 - for parm in unsnapped_param_dict: - if parm!="p": - eq = eq.subs(parm, eq_numbers[jj]) - jj = jj + 1 - integer_snapped_expr = integer_snapped_expr + [eq] - + try: + param_dict = {} + unsnapped_param_dict = {'p':1} + eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) + new_numbers = integerSnap(eq_numbers,w+1) + for kk in range(len(new_numbers)): + eq_numbers[new_numbers[kk][0]] = new_numbers[kk][1] + jj = 0 + for parm in unsnapped_param_dict: + if parm!="p": + eq = eq.subs(parm, eq_numbers[jj]) + jj = jj + 1 + integer_snapped_expr = integer_snapped_expr + [eq] + except: + continue + # Get the numbers appearing in the expression is_atomic_number = lambda expr: expr.is_Atom and expr.is_number eq_numbers = [subexpression for subexpression in preorder_traversal(expr) if is_atomic_number(subexpression)] @@ -99,18 +102,21 @@ def add_snap_expr_on_pareto(pathdir, filename, math_expr, PA, DR_file=""): # Do zero snap one parameter at a time zero_snapped_expr = [] for w in range(len(eq_numbers)): - param_dict = {} - unsnapped_param_dict = {'p':1} - eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) - new_numbers = zeroSnap(eq_numbers,w+1) - for kk in range(len(new_numbers)): - eq_numbers[new_numbers[kk][0]] = new_numbers[kk][1] - jj = 0 - for parm in unsnapped_param_dict: - if parm!="p": - eq = eq.subs(parm, eq_numbers[jj]) - jj = jj + 1 - zero_snapped_expr = zero_snapped_expr + [eq] + try: + param_dict = {} + unsnapped_param_dict = {'p':1} + eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) + new_numbers = zeroSnap(eq_numbers,w+1) + for kk in range(len(new_numbers)): + eq_numbers[new_numbers[kk][0]] = new_numbers[kk][1] + jj = 0 + for parm in unsnapped_param_dict: + if parm!="p": + eq = eq.subs(parm, eq_numbers[jj]) + jj = jj + 1 + zero_snapped_expr = zero_snapped_expr + [eq] + except: + continue # Get the numbers appearing in the expression is_atomic_number = lambda expr: expr.is_Atom and expr.is_number @@ -119,24 +125,27 @@ def add_snap_expr_on_pareto(pathdir, filename, math_expr, PA, DR_file=""): # Do rational snap one parameter at a time rational_snapped_expr = [] for w in range(len(eq_numbers)): - eq_numbers_snap = copy.deepcopy(eq_numbers) - param_dict = {} - unsnapped_param_dict = {'p':1} - eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) - new_numbers = rationalSnap(eq_numbers,w+1) - for kk in range(len(new_numbers)): - eq_numbers_snap[new_numbers[kk][0]] = new_numbers[kk][1][1:3] - jj = 0 - for parm in unsnapped_param_dict: - if parm!="p": - - try: - eq = eq.subs(parm, Rational(eq_numbers_snap[jj][0],eq_numbers_snap[jj][1])) - except: - eq = eq.subs(parm, eq_numbers_snap[jj]) - jj = jj + 1 - rational_snapped_expr = rational_snapped_expr + [eq] - + try: + eq_numbers_snap = copy.deepcopy(eq_numbers) + param_dict = {} + unsnapped_param_dict = {'p':1} + eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) + new_numbers = rationalSnap(eq_numbers,w+1) + for kk in range(len(new_numbers)): + eq_numbers_snap[new_numbers[kk][0]] = new_numbers[kk][1][1:3] + jj = 0 + for parm in unsnapped_param_dict: + if parm!="p": + + try: + eq = eq.subs(parm, Rational(eq_numbers_snap[jj][0],eq_numbers_snap[jj][1])) + except: + eq = eq.subs(parm, eq_numbers_snap[jj]) + jj = jj + 1 + rational_snapped_expr = rational_snapped_expr + [eq] + except: + continue + snapped_expr = np.append(integer_snapped_expr,zero_snapped_expr) snapped_expr = np.append(snapped_expr,rational_snapped_expr) diff --git a/Code/S_add_snap_expr_on_pareto_polyfit.py b/Code/S_add_snap_expr_on_pareto_polyfit.py index cfc96cd..7ee62b3 100644 --- a/Code/S_add_snap_expr_on_pareto_polyfit.py +++ b/Code/S_add_snap_expr_on_pareto_polyfit.py @@ -79,18 +79,21 @@ def add_snap_expr_on_pareto_polyfit(pathdir, filename, math_expr, PA): # Do zero snap one parameter at a time zero_snapped_expr = [] for w in range(len(eq_numbers)): - param_dict = {} - unsnapped_param_dict = {'p':1} - eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) - new_numbers = zeroSnap(eq_numbers,w+1) - for kk in range(len(new_numbers)): - eq_numbers[new_numbers[kk][0]] = new_numbers[kk][1] - jj = 0 - for parm in unsnapped_param_dict: - if parm!="p": - eq = eq.subs(parm, eq_numbers[jj]) - jj = jj + 1 - zero_snapped_expr = zero_snapped_expr + [eq] + try: + param_dict = {} + unsnapped_param_dict = {'p':1} + eq = unsnap_recur(expr,param_dict,unsnapped_param_dict) + new_numbers = zeroSnap(eq_numbers,w+1) + for kk in range(len(new_numbers)): + eq_numbers[new_numbers[kk][0]] = new_numbers[kk][1] + jj = 0 + for parm in unsnapped_param_dict: + if parm!="p": + eq = eq.subs(parm, eq_numbers[jj]) + jj = jj + 1 + zero_snapped_expr = zero_snapped_expr + [eq] + except: + continue for i in range(len(zero_snapped_expr)): try: diff --git a/Code/S_final_gd.py b/Code/S_final_gd.py index 6aac63c..b17febe 100644 --- a/Code/S_final_gd.py +++ b/Code/S_final_gd.py @@ -138,6 +138,10 @@ def final_gd(data_file, math_expr, lr = 1e-2, N_epochs = 5000): else: eq = eq.subs(parm, trainable_parameters[ii]) complexity = complexity + get_number_DL(trainable_parameters[ii].detach().numpy()) + n_variables = len(eq.free_symbols) + n_operations = len(count_ops(eq,visual=True).free_symbols) + if n_operations!=0 or n_variables!=0: + complexity = complexity + (n_variables+n_operations)*np.log2((n_variables+n_operations)) ii = ii+1