Spaces:
Runtime error
Runtime error
fixed demo
Browse files
app.py
CHANGED
|
@@ -8,7 +8,7 @@ import pandas as pd
|
|
| 8 |
from ControllableNesymres.architectures.data import compute_properties, create_negatives,\
|
| 9 |
prepare_negative_pool, sympify_equation,\
|
| 10 |
return_costants, description2tokens, prepare_pointers,\
|
| 11 |
-
tokenize, is_token_constant
|
| 12 |
import base64
|
| 13 |
import streamlit as st
|
| 14 |
from ControllableNesymres.dataset.generator import Generator
|
|
@@ -92,17 +92,25 @@ def main():
|
|
| 92 |
cfg.inference.bfgs.activated = True
|
| 93 |
cfg.inference.bfgs.n_restarts=10
|
| 94 |
cfg.inference.n_jobs=-1
|
|
|
|
|
|
|
| 95 |
cfg.inference.beam_size = beam_size
|
| 96 |
|
| 97 |
metadata = retrofit_word2id(metadata, cfg)
|
| 98 |
|
| 99 |
is_cuda = False #st.checkbox("Tick this if you want to load the models into the GPU", True)
|
| 100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
|
| 102 |
negative_pool = prepare_negative_pool(cfg)
|
| 103 |
|
| 104 |
st.markdown("### Define the equation to test")
|
| 105 |
-
equation_examples = ["0.01*x_1
|
| 106 |
eq_string = st.selectbox("Select an equation or select on 'other' to write your own equation to test", equation_examples, index=4)
|
| 107 |
|
| 108 |
if eq_string == "other":
|
|
@@ -116,18 +124,28 @@ def main():
|
|
| 116 |
variables = sorted([str(x) for x in tmp])
|
| 117 |
f = sympy.lambdify(variables, eq_sympy_infix_with_constants)
|
| 118 |
|
| 119 |
-
number_of_points = st.number_input("Select the number of points that you would like to be sampled", 10, 1000,
|
| 120 |
noise_applied = st.number_input("Select the amount of noise to be applied to the Y", 0.0, 1.0, 0.0)
|
| 121 |
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
| 130 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
if is_cuda:
|
| 132 |
X = torch.tensor(X).cuda()
|
| 133 |
y = torch.tensor(y).cuda()
|
|
@@ -144,7 +162,7 @@ def main():
|
|
| 144 |
"""
|
| 145 |
)
|
| 146 |
|
| 147 |
-
conditioning_to_give = st.multiselect("Select conditionings:", ["Complexity", "Symmetry", "Appearing branches", "Absent branches"], [])
|
| 148 |
pointer_words = None
|
| 149 |
description = {"positive_prefix_examples": [], "negative_prefix_examples": []}
|
| 150 |
if "Complexity" in conditioning_to_give:
|
|
@@ -164,7 +182,7 @@ def main():
|
|
| 164 |
if "Appearing branches" in conditioning_to_give:
|
| 165 |
st.markdown("###### Appearing branches")
|
| 166 |
gt_appearing_branches = properties["all_positives_examples"]
|
| 167 |
-
appearing_branches = st.multiselect("Select which appearing branches to pass (Max 2)", gt_appearing_branches, gt_appearing_branches[
|
| 168 |
assert len(appearing_branches) <= 2, "You can only select up to 2 appearing branches"
|
| 169 |
# for branch in appearing_branches:
|
| 170 |
# mix_ptr_constants(branch, cfg)
|
|
@@ -233,14 +251,10 @@ def main():
|
|
| 233 |
conditioning = {"symbolic_conditioning": cond_tokens, "numerical_conditioning": torch.tensor(numberical_conditioning).float()}
|
| 234 |
#conditioning = {"symbolic_conditioning": torch.tensor([1,2],device="cuda").long(), "numerical_conditioning": torch.tensor([],device="cuda").float()}
|
| 235 |
|
| 236 |
-
|
| 237 |
-
do_inference_with_also_nsr = st.checkbox("Tick this if you want to also run the NSR model", False)
|
| 238 |
-
if do_inference_with_also_nsr:
|
| 239 |
-
nsr = st.text_input("Path to the NSR model", "ControllableNeuralSymbolicRegressionWeights/nsr_200000000_epoch=149.ckpt")
|
| 240 |
-
|
| 241 |
fit = st.button("Run the model")
|
| 242 |
if fit:
|
| 243 |
-
st.write("Results are being computed,
|
| 244 |
if is_cuda:
|
| 245 |
fitfunc = return_fitfunc(cfg, metadata, nsrwh, device="cuda")
|
| 246 |
else:
|
|
@@ -248,7 +262,7 @@ def main():
|
|
| 248 |
|
| 249 |
new_outputs = fitfunc(X, y,conditioning, cond_str_tokens, is_batch=False)
|
| 250 |
|
| 251 |
-
st.markdown("###
|
| 252 |
st.markdown("#### NSRwH")
|
| 253 |
|
| 254 |
best_prediction = new_outputs["best_pred"]
|
|
@@ -265,9 +279,7 @@ def main():
|
|
| 265 |
st.latex(f"\\text{{Prediction {idx+1}: }} {sympy.latex(pred)}")
|
| 266 |
|
| 267 |
|
| 268 |
-
|
| 269 |
-
if do_inference_with_also_nsr:
|
| 270 |
-
st.write("Results for nsr are being computed, please wait...")
|
| 271 |
cfg_nsr = omegaconf.OmegaConf.load(Path("configs/nsr_network_config.yaml"))
|
| 272 |
cfg_nsr.inference.bfgs.activated = True
|
| 273 |
cfg_nsr.inference.bfgs.n_restarts=10
|
|
|
|
| 8 |
from ControllableNesymres.architectures.data import compute_properties, create_negatives,\
|
| 9 |
prepare_negative_pool, sympify_equation,\
|
| 10 |
return_costants, description2tokens, prepare_pointers,\
|
| 11 |
+
tokenize, is_token_constant, get_robust_random_data, return_support_limits,sample_support,sample_images
|
| 12 |
import base64
|
| 13 |
import streamlit as st
|
| 14 |
from ControllableNesymres.dataset.generator import Generator
|
|
|
|
| 92 |
cfg.inference.bfgs.activated = True
|
| 93 |
cfg.inference.bfgs.n_restarts=10
|
| 94 |
cfg.inference.n_jobs=-1
|
| 95 |
+
cfg.dataset.fun_support.max =5
|
| 96 |
+
cfg.dataset.fun_support.min = -5
|
| 97 |
cfg.inference.beam_size = beam_size
|
| 98 |
|
| 99 |
metadata = retrofit_word2id(metadata, cfg)
|
| 100 |
|
| 101 |
is_cuda = False #st.checkbox("Tick this if you want to load the models into the GPU", True)
|
| 102 |
+
|
| 103 |
+
do_inference_with_also_nsr = st.checkbox("Tick this if you want to also run the NSR model", True)
|
| 104 |
+
if do_inference_with_also_nsr:
|
| 105 |
+
nsr = "ControllableNeuralSymbolicRegressionWeights/nsr_200000000_epoch=149.ckpt"
|
| 106 |
+
else:
|
| 107 |
+
nsr = None
|
| 108 |
+
|
| 109 |
|
| 110 |
negative_pool = prepare_negative_pool(cfg)
|
| 111 |
|
| 112 |
st.markdown("### Define the equation to test")
|
| 113 |
+
equation_examples = ["0.01*x_1+x_2+exp(x_3)", "sin(x_1)+sqrt(x_2)+sin(x_3+x_4)", "0.5*x_1**(1/2)+x_2**2 + x_3**2", "exp(0.043*sin(x_1*x_2))+x_3", "x_1**2+log(x_3+x_2)", "other"]
|
| 114 |
eq_string = st.selectbox("Select an equation or select on 'other' to write your own equation to test", equation_examples, index=4)
|
| 115 |
|
| 116 |
if eq_string == "other":
|
|
|
|
| 124 |
variables = sorted([str(x) for x in tmp])
|
| 125 |
f = sympy.lambdify(variables, eq_sympy_infix_with_constants)
|
| 126 |
|
| 127 |
+
number_of_points = st.number_input("Select the number of points that you would like to be sampled", 10, 1000, 200)
|
| 128 |
noise_applied = st.number_input("Select the amount of noise to be applied to the Y", 0.0, 1.0, 0.0)
|
| 129 |
|
| 130 |
+
cnt = 0
|
| 131 |
+
MAX_ATTEMPTS = 5
|
| 132 |
+
while cnt < MAX_ATTEMPTS:
|
| 133 |
+
support_limits = return_support_limits(cfg, metadata, support=None)
|
| 134 |
+
support = sample_support(support_limits, variables, cfg.dataset.max_number_of_points*5, metadata.total_variables, cfg)
|
| 135 |
+
is_valid, data_points = sample_images(f, support, variables, cfg)
|
| 136 |
+
if is_valid:
|
| 137 |
+
break
|
| 138 |
+
cnt += 1
|
| 139 |
+
if not is_valid:
|
| 140 |
+
raise ValueError("Could not find a valid support")
|
| 141 |
|
| 142 |
+
# Shuffle the datapoints along the points dimension
|
| 143 |
+
data_points = data_points[:, :, torch.randperm(data_points.shape[2])]
|
| 144 |
+
data_points = data_points[:, :, :number_of_points]
|
| 145 |
+
X = data_points[0,:5,:].T
|
| 146 |
+
y = data_points[0,5,:]
|
| 147 |
+
|
| 148 |
+
|
| 149 |
if is_cuda:
|
| 150 |
X = torch.tensor(X).cuda()
|
| 151 |
y = torch.tensor(y).cuda()
|
|
|
|
| 162 |
"""
|
| 163 |
)
|
| 164 |
|
| 165 |
+
conditioning_to_give = st.multiselect("Select conditionings:", ["Complexity", "Symmetry", "Appearing branches", "Absent branches"], ["Appearing branches"])
|
| 166 |
pointer_words = None
|
| 167 |
description = {"positive_prefix_examples": [], "negative_prefix_examples": []}
|
| 168 |
if "Complexity" in conditioning_to_give:
|
|
|
|
| 182 |
if "Appearing branches" in conditioning_to_give:
|
| 183 |
st.markdown("###### Appearing branches")
|
| 184 |
gt_appearing_branches = properties["all_positives_examples"]
|
| 185 |
+
appearing_branches = st.multiselect("Select which appearing branches to pass (Max 2)", gt_appearing_branches, gt_appearing_branches[2:3]+ gt_appearing_branches[10:11])
|
| 186 |
assert len(appearing_branches) <= 2, "You can only select up to 2 appearing branches"
|
| 187 |
# for branch in appearing_branches:
|
| 188 |
# mix_ptr_constants(branch, cfg)
|
|
|
|
| 251 |
conditioning = {"symbolic_conditioning": cond_tokens, "numerical_conditioning": torch.tensor(numberical_conditioning).float()}
|
| 252 |
#conditioning = {"symbolic_conditioning": torch.tensor([1,2],device="cuda").long(), "numerical_conditioning": torch.tensor([],device="cuda").float()}
|
| 253 |
|
| 254 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
fit = st.button("Run the model")
|
| 256 |
if fit:
|
| 257 |
+
st.write("Results are being computed, will be displayed in a few seconds...")
|
| 258 |
if is_cuda:
|
| 259 |
fitfunc = return_fitfunc(cfg, metadata, nsrwh, device="cuda")
|
| 260 |
else:
|
|
|
|
| 262 |
|
| 263 |
new_outputs = fitfunc(X, y,conditioning, cond_str_tokens, is_batch=False)
|
| 264 |
|
| 265 |
+
st.markdown("### Results")
|
| 266 |
st.markdown("#### NSRwH")
|
| 267 |
|
| 268 |
best_prediction = new_outputs["best_pred"]
|
|
|
|
| 279 |
st.latex(f"\\text{{Prediction {idx+1}: }} {sympy.latex(pred)}")
|
| 280 |
|
| 281 |
|
| 282 |
+
if nsr is not None:
|
|
|
|
|
|
|
| 283 |
cfg_nsr = omegaconf.OmegaConf.load(Path("configs/nsr_network_config.yaml"))
|
| 284 |
cfg_nsr.inference.bfgs.activated = True
|
| 285 |
cfg_nsr.inference.bfgs.n_restarts=10
|