Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import logging | |
| from gradio_log import Log | |
| from numpy import asarray | |
| from numpy import exp | |
| from numpy.random import randn | |
| from numpy.random import rand | |
| from numpy.random import seed | |
| from matplotlib import pyplot | |
| # setup logging | |
| LOG_FILE = "sim-ann.log" | |
| logging.basicConfig( | |
| filename=LOG_FILE, | |
| level=logging.INFO, | |
| format="%(levelname)s: %(asctime)s %(message)s", | |
| datefmt="%m/%d/%Y %I:%M:%S", | |
| ) | |
| # clear the log file | |
| with open(LOG_FILE, "w"): | |
| pass | |
| # Define the objective function | |
| def objective(x): | |
| return x[0] ** 2.0 | |
| # Simulated Annealing algorithm | |
| def simulated_annealing(objective, bounds, n_iterations, step_size, temp): | |
| # Generate an initial point | |
| best = bounds[:, 0] + rand(len(bounds)) * (bounds[:, 1] - bounds[:, 0]) | |
| # Evaluate the initial point | |
| best_eval = objective(best) | |
| # Current working solution | |
| curr, curr_eval = best, best_eval | |
| scores = list() | |
| # Run the algorithm | |
| for i in range(n_iterations): | |
| # Take a step | |
| candidate = curr + randn(len(bounds)) | |
| candidate = curr + randn(len(bounds)) * step_size | |
| # Evaluate the candidate point | |
| candidate_eval = objective(candidate) | |
| # Check for a new best solution | |
| if candidate_eval < best_eval: | |
| # Store the new best point | |
| best, best_eval = candidate, candidate_eval | |
| # Keep track of scores | |
| scores.append(best_eval) | |
| # Report progress | |
| logging.info(">%d f(%s) = %.10f" % (i, best, best_eval)) | |
| # Difference between candidate and current point evaluation | |
| diff = candidate_eval - curr_eval | |
| # Calculate temperature for the current epoch | |
| t = temp / float(i + 1) | |
| # Calculate Metropolis acceptance criterion | |
| metropolis = exp(-diff / t) | |
| # Check if we should keep the new point | |
| if diff < 0 or rand() < metropolis: | |
| # Store the new current point | |
| curr, curr_eval = candidate, candidate_eval | |
| return [best, best_eval, scores] | |
| def run(s=1, l_bound=-0.5, u_bound=0.5, n_iterations=1000, step_size=0.1, temp=10): | |
| # Seed the pseudorandom number generator | |
| seed(s) | |
| # Define the range for input | |
| bounds = asarray([[l_bound, u_bound]]) | |
| # Perform the simulated annealing search | |
| best, score, scores = simulated_annealing( | |
| objective, bounds, n_iterations, step_size, temp | |
| ) | |
| logging.info("Done!") | |
| logging.info("f(%s) = %.10f" % (best, score)) | |
| with gr.Blocks(title="Simulated Annealing") as demo: | |
| title = gr.Markdown("## Simulated Annealing") | |
| with gr.Row(): | |
| with gr.Column(): | |
| s = gr.Number(label="Seed", value=1) | |
| l_bound = gr.Number(label="Lower Bound", value=-0.5) | |
| u_bound = gr.Number(label="Upper Bound", value=0.5) | |
| with gr.Column(): | |
| n_iterations = gr.Number(label="# Iterations", value=1000) | |
| step_size = gr.Number(label="Step Size", value=0.1) | |
| temp = gr.Number(label="Temperature", value=10) | |
| # output = gr.Textbox() | |
| with gr.Row(): | |
| btn = gr.Button("Run") | |
| btn.click( | |
| fn=run, | |
| inputs=[s, l_bound, u_bound, n_iterations, step_size, temp], | |
| # outputs=[output], | |
| ) | |
| Log(LOG_FILE, dark=True, xterm_font_size=12) | |
| if __name__ == "__main__": | |
| demo.launch(share=True) | |