MilesCranmer commited on
Commit
3f4ce91
1 Parent(s): d6b0684

Add functionality to save hall of fame to file

Browse files
Files changed (4) hide show
  1. .gitignore +1 -0
  2. README.md +1 -1
  3. eureqa.jl +16 -12
  4. eureqa.py +5 -2
.gitignore CHANGED
@@ -1,2 +1,3 @@
1
  .dataset.jl
2
  .hyperparams.jl
 
 
1
  .dataset.jl
2
  .hyperparams.jl
3
+ *.csv
README.md CHANGED
@@ -1,6 +1,6 @@
1
  # Eureqa.jl
2
 
3
- Symbolic regression built on Eureqa, and interfaced by Python.
4
  Uses regularized evolution and simulated annealing.
5
 
6
  ## Running:
 
1
  # Eureqa.jl
2
 
3
+ Symbolic regression built on Julia, and interfaced by Python.
4
  Uses regularized evolution and simulated annealing.
5
 
6
  ## Running:
eureqa.jl CHANGED
@@ -592,21 +592,25 @@ function fullRun(niterations::Integer;
592
  end
593
 
594
  dominating = PopMember[]
595
- debug(verbosity, "Hall of Fame:")
596
- debug(verbosity, "-----------------------------------------")
597
- debug(verbosity, "Complexity \t MSE \t Equation")
598
- for size=1:maxsize
599
- if hallOfFame.exists[size]
600
- member = hallOfFame.members[size]
601
- numberSmallerAndBetter = sum([member.score > hallOfFame.members[i].score for i=1:(size-1)])
602
- betterThanAllSmaller = (numberSmallerAndBetter == 0)
603
- if betterThanAllSmaller
604
- debug(verbosity, "$size \t $(member.score-parsimony*size) \t $(stringTree(member.tree))")
605
- push!(dominating, member)
 
 
 
 
606
  end
607
  end
 
608
  end
609
- debug(verbosity, "")
610
 
611
  # Migration
612
  if migration
 
592
  end
593
 
594
  dominating = PopMember[]
595
+ open(hofFile, "w") do io
596
+ debug(verbosity, "Hall of Fame:")
597
+ debug(verbosity, "-----------------------------------------")
598
+ debug(verbosity, "Complexity \t MSE \t Equation")
599
+ println(io,"Complexity|MSE|Equation")
600
+ for size=1:maxsize
601
+ if hallOfFame.exists[size]
602
+ member = hallOfFame.members[size]
603
+ numberSmallerAndBetter = sum([member.score > hallOfFame.members[i].score for i=1:(size-1)])
604
+ betterThanAllSmaller = (numberSmallerAndBetter == 0)
605
+ if betterThanAllSmaller
606
+ debug(verbosity, "$size \t $(member.score-parsimony*size) \t $(stringTree(member.tree))")
607
+ println(io, "$size|$(member.score-parsimony*size)|$(stringTree(member.tree))")
608
+ push!(dominating, member)
609
+ end
610
  end
611
  end
612
+ debug(verbosity, "")
613
  end
 
614
 
615
  # Migration
616
  if migration
eureqa.py CHANGED
@@ -11,7 +11,7 @@ def eureqa(threads=4, parsimony=1e-3, alpha=10,
11
  unary_operators=["cos", "exp", "sin"],
12
  niterations=20, npop=100, annealing=True,
13
  ncyclesperiteration=5000, fractionReplaced=0.1,
14
- topn=10
15
  ):
16
 
17
  def_hyperparams = f"""
@@ -42,6 +42,8 @@ def eureqa(threads=4, parsimony=1e-3, alpha=10,
42
  const fractionReplacedHof = {fractionReplacedHof}f0
43
  # Optimize constants
44
  const shouldOptimizeConstants = {'true' if shouldOptimizeConstants else 'false'}
 
 
45
  ##################
46
  """
47
 
@@ -64,7 +66,7 @@ def eureqa(threads=4, parsimony=1e-3, alpha=10,
64
  'julia -O3',
65
  f'--threads {threads}',
66
  '-e',
67
- 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})\''
68
  ])
69
  import os
70
  os.system(command)
@@ -87,6 +89,7 @@ if __name__ == "__main__":
87
  parser.add_argument("--hofMigration", type=bool, default=True, help="Whether to have hall of fame migration")
88
  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)")
89
  parser.add_argument("--annealing", type=bool, default=True, help="Whether to use simulated annealing")
 
90
 
91
  parser.add_argument(
92
  "--binary-operators", type=str, nargs="+", default=["plus", "mul"],
 
11
  unary_operators=["cos", "exp", "sin"],
12
  niterations=20, npop=100, annealing=True,
13
  ncyclesperiteration=5000, fractionReplaced=0.1,
14
+ topn=10, equation_file='hall_of_fame.csv'
15
  ):
16
 
17
  def_hyperparams = f"""
 
42
  const fractionReplacedHof = {fractionReplacedHof}f0
43
  # Optimize constants
44
  const shouldOptimizeConstants = {'true' if shouldOptimizeConstants else 'false'}
45
+ # File to put operators
46
+ const hofFile = "{equation_file}"
47
  ##################
48
  """
49
 
 
66
  'julia -O3',
67
  f'--threads {threads}',
68
  '-e',
69
+ f'\'include("eureqa.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})\''
70
  ])
71
  import os
72
  os.system(command)
 
89
  parser.add_argument("--hofMigration", type=bool, default=True, help="Whether to have hall of fame migration")
90
  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)")
91
  parser.add_argument("--annealing", type=bool, default=True, help="Whether to use simulated annealing")
92
+ parser.add_argument("--equation_file", type=str, default='hall_of_fame.csv', help="File to dump best equations to")
93
 
94
  parser.add_argument(
95
  "--binary-operators", type=str, nargs="+", default=["plus", "mul"],