Spaces:
Sleeping
Sleeping
| import os | |
| from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter | |
| from collections import namedtuple | |
| def eureqa(threads=4, parsimony=1e-3, alpha=10, | |
| maxsize=20, migration=True, | |
| hofMigration=True, fractionReplacedHof=0.1, | |
| shouldOptimizeConstants=True, | |
| binary_operators=["plus", "mult"], | |
| unary_operators=["cos", "exp", "sin"], | |
| niterations=20, npop=100, annealing=True, | |
| ncyclesperiteration=5000, fractionReplaced=0.1, | |
| topn=10 | |
| ): | |
| def_hyperparams = f""" | |
| include("operators.jl") | |
| ########################## | |
| # # Allowed operators | |
| # (Apparently using const for globals helps speed) | |
| const binops = {'[' + ', '.join(binary_operators) + ']'} | |
| const unaops = {'[' + ', '.join(unary_operators) + ']'} | |
| ########################## | |
| # How many equations to search when replacing | |
| const ns=10; | |
| ################## | |
| # Hyperparameters | |
| # How much to punish complexity | |
| const parsimony = {parsimony:f}f0 | |
| # How much to scale temperature by (T between 0 and 1) | |
| const alpha = {alpha:f}f0 | |
| # Max size of an equation (too large will slow program down) | |
| const maxsize = {maxsize:d} | |
| # Whether to migrate between threads (you should) | |
| const migration = {'true' if migration else 'false'} | |
| # Whether to re-introduce best examples seen (helps a lot) | |
| const hofMigration = {'true' if hofMigration else 'false'} | |
| # Fraction of population to replace with hall of fame | |
| const fractionReplacedHof = {fractionReplacedHof}f0 | |
| # Optimize constants | |
| const shouldOptimizeConstants = {'true' if shouldOptimizeConstants else 'false'} | |
| ################## | |
| """ | |
| def_datasets = """ | |
| # Here is the function we want to learn (x2^2 + cos(x3) + 5) | |
| ########################## | |
| # # Dataset to learn | |
| const X = convert(Array{Float32, 2}, randn(100, 5)*2) | |
| const y = convert(Array{Float32, 1}, ((cx,)->cx^2).(X[:, 2]) + cos.(X[:, 3]) .- 5) | |
| ########################## | |
| """ | |
| with open('.hyperparams.jl', 'w') as f: | |
| print(def_hyperparams, file=f) | |
| with open('.dataset.jl', 'w') as f: | |
| print(def_datasets, file=f) | |
| command = ' '.join([ | |
| 'julia -O3', | |
| f'--threads {threads}', | |
| '-e', | |
| f'\'include("paralleleureqa.jl"); fullRun({niterations:d}, npop={npop:d}, annealing={"true" if annealing else "false"}, ncyclesperiteration={ncyclesperiteration:d}, fractionReplaced={fractionReplaced:f}f0, verbosity=round(Int32, 1e9), topn={topn:d})\'' | |
| ]) | |
| import os | |
| os.system(command) | |
| if __name__ == "__main__": | |
| parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) | |
| parser.add_argument("--threads", type=int, default=4, help="Number of threads") | |
| parser.add_argument("--parsimony", type=float, default=0.001, help="How much to punish complexity") | |
| parser.add_argument("--alpha", type=int, default=10, help="Scaling of temperature") | |
| parser.add_argument("--maxsize", type=int, default=20, help="Max size of equation") | |
| parser.add_argument("--niterations", type=int, default=20, help="Number of total migration periods") | |
| parser.add_argument("--npop", type=int, default=100, help="Number of members per population") | |
| parser.add_argument("--ncyclesperiteration", type=int, default=5000, help="Number of evolutionary cycles per migration") | |
| parser.add_argument("--topn", type=int, default=10, help="How many best species to distribute from each population") | |
| parser.add_argument("--fractionReplacedHof", type=float, default=0.1, help="Fraction of population to replace with hall of fame") | |
| parser.add_argument("--fractionReplaced", type=float, default=0.1, help="Fraction of population to replace with best from other populations") | |
| parser.add_argument("--migration", type=bool, default=True, help="Whether to migrate") | |
| parser.add_argument("--hofMigration", type=bool, default=True, help="Whether to have hall of fame migration") | |
| parser.add_argument("--shouldOptimizeConstants", type=bool, default=True, help="Whether to use classical optimization on constants before every migration (doesn't impact performance that much)") | |
| parser.add_argument("--annealing", type=bool, default=True, help="Whether to use simulated annealing") | |
| parser.add_argument( | |
| "--binary-operators", type=str, nargs="+", default=["plus", "mul"], | |
| help="Binary operators. Make sure they are defined in operators.jl") | |
| parser.add_argument( | |
| "--unary-operators", type=str, default=["exp", "sin", "cos"], | |
| help="Unary operators. Make sure they are defined in operators.jl") | |
| args = vars(parser.parse_args()) #dict | |
| eureqa(**args) | |