MilesCranmer commited on
Commit
0a9f0c4
1 Parent(s): 1858959

Update API calls for SymbolicRegression.jl 0.13

Browse files
Files changed (1) hide show
  1. pysr/sr.py +48 -36
pysr/sr.py CHANGED
@@ -1518,25 +1518,22 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
1518
  str(self.early_stop_condition) if self.early_stop_condition else None
1519
  )
1520
 
1521
- mutation_weights = np.array(
1522
- [
1523
- self.weight_mutate_constant,
1524
- self.weight_mutate_operator,
1525
- self.weight_add_node,
1526
- self.weight_insert_node,
1527
- self.weight_delete_node,
1528
- self.weight_simplify,
1529
- self.weight_randomize,
1530
- self.weight_do_nothing,
1531
- ],
1532
- dtype=float,
1533
  )
1534
 
1535
  # Call to Julia backend.
1536
  # See https://github.com/MilesCranmer/SymbolicRegression.jl/blob/master/src/OptionsStruct.jl
1537
  options = SymbolicRegression.Options(
1538
- binary_operators=Main.eval(str(tuple(binary_operators)).replace("'", "")),
1539
- unary_operators=Main.eval(str(tuple(unary_operators)).replace("'", "")),
1540
  bin_constraints=bin_constraints,
1541
  una_constraints=una_constraints,
1542
  complexity_of_operators=complexity_of_operators,
@@ -1545,43 +1542,43 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
1545
  nested_constraints=nested_constraints,
1546
  loss=custom_loss,
1547
  maxsize=int(self.maxsize),
1548
- hofFile=_escape_filename(self.equation_file_),
1549
  npopulations=int(self.populations),
1550
  batching=self.batching,
1551
- batchSize=int(min([batch_size, len(X)]) if self.batching else len(X)),
1552
- mutationWeights=mutation_weights,
1553
- probPickFirst=self.tournament_selection_p,
1554
- ns=self.tournament_selection_n,
1555
  # These have the same name:
1556
  parsimony=self.parsimony,
1557
  alpha=self.alpha,
1558
  maxdepth=maxdepth,
1559
  fast_cycle=self.fast_cycle,
1560
  migration=self.migration,
1561
- hofMigration=self.hof_migration,
1562
- fractionReplacedHof=self.fraction_replaced_hof,
1563
- shouldOptimizeConstants=self.should_optimize_constants,
1564
- warmupMaxsizeBy=self.warmup_maxsize_by,
1565
- useFrequency=self.use_frequency,
1566
- useFrequencyInTournament=self.use_frequency_in_tournament,
1567
  npop=self.population_size,
1568
- ncyclesperiteration=self.ncyclesperiteration,
1569
- fractionReplaced=self.fraction_replaced,
1570
  topn=self.topn,
1571
  verbosity=self.verbosity,
1572
  optimizer_algorithm=self.optimizer_algorithm,
1573
  optimizer_nrestarts=self.optimizer_nrestarts,
1574
- optimize_probability=self.optimize_probability,
1575
  optimizer_iterations=self.optimizer_iterations,
1576
- perturbationFactor=self.perturbation_factor,
1577
  annealing=self.annealing,
1578
- stateReturn=True, # Required for state saving.
1579
  progress=progress,
1580
  timeout_in_seconds=self.timeout_in_seconds,
1581
- crossoverProbability=self.crossover_probability,
1582
  skip_mutation_failures=self.skip_mutation_failures,
1583
  max_evals=self.max_evals,
1584
- earlyStopCondition=early_stop_condition,
1585
  seed=seed,
1586
  deterministic=self.deterministic,
1587
  )
@@ -1603,19 +1600,34 @@ class PySRRegressor(MultiOutputMixin, RegressorMixin, BaseEstimator):
1603
  else:
1604
  Main.weights = None
1605
 
1606
- cprocs = 0 if multithreading else self.procs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1607
 
1608
  # Call to Julia backend.
1609
  # See https://github.com/MilesCranmer/SymbolicRegression.jl/blob/master/src/SymbolicRegression.jl
1610
- self.raw_julia_state_ = SymbolicRegression.EquationSearch(
1611
  Main.X,
1612
  Main.y,
1613
  weights=Main.weights,
1614
  niterations=int(self.niterations),
1615
  varMap=self.feature_names_in_.tolist(),
1616
  options=options,
1617
- numprocs=int(cprocs),
1618
- multithreading=bool(multithreading),
1619
  saved_state=self.raw_julia_state_,
1620
  addprocs_function=cluster_manager,
1621
  )
 
1518
  str(self.early_stop_condition) if self.early_stop_condition else None
1519
  )
1520
 
1521
+ mutation_weights = SymbolicRegression.MutationWeights(
1522
+ mutate_constant=self.weight_mutate_constant,
1523
+ mutate_operator=self.weight_mutate_operator,
1524
+ add_node=self.weight_add_node,
1525
+ insert_node=self.weight_insert_node,
1526
+ delete_node=self.weight_delete_node,
1527
+ simplify=self.weight_simplify,
1528
+ randomize=self.weight_randomize,
1529
+ do_nothing=self.weight_do_nothing,
 
 
 
1530
  )
1531
 
1532
  # Call to Julia backend.
1533
  # See https://github.com/MilesCranmer/SymbolicRegression.jl/blob/master/src/OptionsStruct.jl
1534
  options = SymbolicRegression.Options(
1535
+ binary_operators=Main.eval(str(binary_operators).replace("'", "")),
1536
+ unary_operators=Main.eval(str(unary_operators).replace("'", "")),
1537
  bin_constraints=bin_constraints,
1538
  una_constraints=una_constraints,
1539
  complexity_of_operators=complexity_of_operators,
 
1542
  nested_constraints=nested_constraints,
1543
  loss=custom_loss,
1544
  maxsize=int(self.maxsize),
1545
+ output_file=_escape_filename(self.equation_file_),
1546
  npopulations=int(self.populations),
1547
  batching=self.batching,
1548
+ batch_size=int(min([batch_size, len(X)]) if self.batching else len(X)),
1549
+ mutation_weights=mutation_weights,
1550
+ tournament_selection_p=self.tournament_selection_p,
1551
+ tournament_selection_n=self.tournament_selection_n,
1552
  # These have the same name:
1553
  parsimony=self.parsimony,
1554
  alpha=self.alpha,
1555
  maxdepth=maxdepth,
1556
  fast_cycle=self.fast_cycle,
1557
  migration=self.migration,
1558
+ hof_migration=self.hof_migration,
1559
+ fraction_replaced_hof=self.fraction_replaced_hof,
1560
+ should_optimize_constants=self.should_optimize_constants,
1561
+ warmup_maxsize_by=self.warmup_maxsize_by,
1562
+ use_frequency=self.use_frequency,
1563
+ use_frequency_in_tournament=self.use_frequency_in_tournament,
1564
  npop=self.population_size,
1565
+ ncycles_per_iteration=self.ncyclesperiteration,
1566
+ fraction_replaced=self.fraction_replaced,
1567
  topn=self.topn,
1568
  verbosity=self.verbosity,
1569
  optimizer_algorithm=self.optimizer_algorithm,
1570
  optimizer_nrestarts=self.optimizer_nrestarts,
1571
+ optimizer_probability=self.optimize_probability,
1572
  optimizer_iterations=self.optimizer_iterations,
1573
+ perturbation_factor=self.perturbation_factor,
1574
  annealing=self.annealing,
1575
+ return_state=True, # Required for state saving.
1576
  progress=progress,
1577
  timeout_in_seconds=self.timeout_in_seconds,
1578
+ crossover_probability=self.crossover_probability,
1579
  skip_mutation_failures=self.skip_mutation_failures,
1580
  max_evals=self.max_evals,
1581
+ early_stop_condition=early_stop_condition,
1582
  seed=seed,
1583
  deterministic=self.deterministic,
1584
  )
 
1600
  else:
1601
  Main.weights = None
1602
 
1603
+ if self.procs == 0 and not multithreading:
1604
+ parallelism = "serial"
1605
+ elif multithreading:
1606
+ parallelism = "multithreading"
1607
+ else:
1608
+ parallelism = "multiprocessing"
1609
+
1610
+ cprocs = (
1611
+ None if parallelism in ["serial", "multithreading"] else int(self.procs)
1612
+ )
1613
+
1614
+ # Can't pass symbol to PyJulia, so need to eval a function:
1615
+ Main.eval(
1616
+ "call_sr(@nospecialize args...; @nospecialize kws...)"
1617
+ " = SymbolicRegression.EquationSearch(args...;"
1618
+ f"parallelism=:{parallelism}, kws...)"
1619
+ )
1620
 
1621
  # Call to Julia backend.
1622
  # See https://github.com/MilesCranmer/SymbolicRegression.jl/blob/master/src/SymbolicRegression.jl
1623
+ self.raw_julia_state_ = Main.call_sr(
1624
  Main.X,
1625
  Main.y,
1626
  weights=Main.weights,
1627
  niterations=int(self.niterations),
1628
  varMap=self.feature_names_in_.tolist(),
1629
  options=options,
1630
+ numprocs=cprocs,
 
1631
  saved_state=self.raw_julia_state_,
1632
  addprocs_function=cluster_manager,
1633
  )