import re import pandas as pd import numpy as np from sympy import sympify, Eq from sympy.parsing.sympy_parser import parse_expr from sympy.core.sympify import SympifyError from concurrent.futures import ProcessPoolExecutor import multiprocessing as mp from sympy import simplify, sympify from sympy.core.sympify import SympifyError import swifter import random from joblib import Parallel, delayed from tqdm.auto import tqdm def apply_chunk(chunk, func): """Helper function to apply a function to a chunk of data.""" return chunk.apply(func) def parallel_apply(series, func, n_jobs=None): n_jobs = mp.cpu_count() if n_jobs is None else n_jobs # Split into roughly equal chunks chunks = np.array_split(series, n_jobs) with mp.Pool(n_jobs) as pool: # Use the helper function instead of a lambda results = pool.starmap(apply_chunk, [(chunk, func) for chunk in chunks]) # Concatenate the resulting Series return pd.concat(results) def canonicalize_expr(expr, canonicalizer=simplify): canon = canonicalizer(expr) return (hash(canon), canon, expr) def replace_constants(equation): # Match positive/negative floats and integers not part of variable names pattern = r'(?