Defining n_cores in optimization problem results in error

Hi there,

I have done some simple optimizations using the U_NSGA3() optimizer, where the default number of ncores = 1 was sufficient computational power.

Now, I’d like to estimate multiple variables with the U_NSGA3() optimizer (adsorption_rate, desorption_rate, and characteristic_charge of the Steric Mass Action binding model).

Since this particular optimization did not yield to results after a couple of hours, I tried to increase the n_cores, to have more computational power.

Unfortunately, I ran into an error message:

---------------------------------------------------------------------------
RemoteTraceback                           Traceback (most recent call last)
RemoteTraceback: 
"""
Traceback (most recent call last):
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\multiprocess\pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\multiprocess\pool.py", line 48, in mapstar
    return list(map(*args))
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\pathos\helpers\mp_helper.py", line 15, in <lambda>
    func = lambda args: f(*args)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 645, in eval_fun_wrapper
    results = eval_fun(ind, force=force)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 131, in wrapper
    return func(self, x, *args, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 975, in evaluate_objectives
    f = self._evaluate_individual(self.objectives, x, force=force)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 601, in _evaluate_individual
    value = self._evaluate(x, eval_fun, force)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 131, in wrapper
    return func(self, x, *args, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 737, in _evaluate
    result = step.evaluate(current_request)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 2868, in __call__
    results = self.evaluator(request, *args, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\simulator\simulator.py", line 199, in simulate
    results = self.simulate_n_cycles(
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\log.py", line 150, in wrapper
    result = function(*args, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\log.py", line 201, in wrapper
    results = function(*args, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\log.py", line 180, in wrapper
    raise e
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\log.py", line 172, in wrapper
    return function(*args, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\simulator\simulator.py", line 253, in simulate_n_cycles
    return self.run(process, **kwargs)
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\CADETProcess\simulator\cadetAdapter.py", line 261, in run
    if cadet.is_file:
  File "C:\Users\samue\anaconda3\envs\cadet\lib\site-packages\cadet\cadet.py", line 169, in is_file
    if self._is_file_class is not None:
AttributeError: 'Cadet' object has no attribute '_is_file_class'
"""

The above exception was the direct cause of the following exception:

AttributeError                            Traceback (most recent call last)
C:/Users/samue/kcadet/00_Lonza/SystemChara/03_GradientElutions/48CV/pymoo_U_NSGA3_SSE/tmp\ipykernel_8272\3904066991.py in <module>
      6     print('Starting Optimization')
      7 
----> 8     optimization_results = optimizer.optimize(optimization_problem, x0=None, save_results=True, 
      9                                               results_directory=None, use_checkpoint=False,
     10                                               overwrite_results_directory=True, exist_ok=True,

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizer.py in optimize(self, optimization_problem, x0, save_results, results_directory, use_checkpoint, overwrite_results_directory, exist_ok, log_level, reinit_cache, delete_cache, *args, **kwargs)
    208         start = time.time()
    209 
--> 210         self.run(self.optimization_problem, x0, *args, **kwargs)
    211 
    212         self.results.time_elapsed = time.time() - start

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\pymooAdapter.py in run(self, optimization_problem, x0)
    157 
    158             # Evaluate objectives and report results
--> 159             algorithm.evaluator.eval(problem, pop)
    160 
    161             F = pop.get("F").tolist()

~\anaconda3\envs\cadet\lib\site-packages\pymoo\core\evaluator.py in eval(self, problem, pop, skip_already_evaluated, evaluate_values_of, count_evals, **kwargs)
     67 
     68             # do the actual evaluation - call the sub-function to set the corresponding values to the population
---> 69             self._eval(problem, pop[I], evaluate_values_of, **kwargs)
     70 
     71         # update the function evaluation counter

~\anaconda3\envs\cadet\lib\site-packages\pymoo\core\evaluator.py in _eval(self, problem, pop, evaluate_values_of, **kwargs)
     88 
     89         # call the problem to evaluate the solutions
---> 90         out = problem.evaluate(X, return_values_of=evaluate_values_of, return_as_dictionary=True, **kwargs)
     91 
     92         # for each of the attributes set it to the problem

~\anaconda3\envs\cadet\lib\site-packages\pymoo\core\problem.py in evaluate(self, X, return_values_of, return_as_dictionary, *args, **kwargs)
    185 
    186         # this is where the actual evaluation takes place
--> 187         _out = self.do(X, return_values_of, *args, **kwargs)
    188 
    189         out = {}

~\anaconda3\envs\cadet\lib\site-packages\pymoo\core\problem.py in do(self, X, return_values_of, *args, **kwargs)
    227             self._evaluate_elementwise(X, out, *args, **kwargs)
    228         else:
--> 229             self._evaluate_vectorized(X, out, *args, **kwargs)
    230 
    231         # finally format the output dictionary

~\anaconda3\envs\cadet\lib\site-packages\pymoo\core\problem.py in _evaluate_vectorized(self, X, out, *args, **kwargs)
    235 
    236     def _evaluate_vectorized(self, X, out, *args, **kwargs):
--> 237         self._evaluate(X, out, *args, **kwargs)
    238 
    239     def _evaluate_elementwise(self, X, out, *args, **kwargs):

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\pymooAdapter.py in _evaluate(self, x, out, *args, **kwargs)
    238         opt = self.optimization_problem
    239         if opt.n_objectives > 0:
--> 240             F = opt.evaluate_objectives_population(
    241                 x,
    242                 untransform=True,

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in wrapper(self, x, untransform, *args, **kwargs)
    129                 x = self.untransform(x)
    130 
--> 131             return func(self, x, *args, **kwargs)
    132 
    133         return wrapper

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in wrapper(self, population, *args, **kwargs)
    150             population = np.array(population, ndmin=2)
    151 
--> 152             return func(self, population, *args, **kwargs)
    153 
    154         return wrapper

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in evaluate_objectives_population(self, population, force, n_cores)
   1005         _evaluate
   1006         """
-> 1007         results = self._evaluate_population(
   1008             self.evaluate_objectives, population, force, n_cores
   1009         )

~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in _evaluate_population(self, eval_fun, population, force, n_cores)
    660 
    661             with pathos.pools.ProcessPool(ncpus=n_cores) as pool:
--> 662                 results = pool.map(eval_fun_wrapper, population)
    663 
    664         return np.array(results, ndmin=2)

~\anaconda3\envs\cadet\lib\site-packages\pathos\multiprocessing.py in map(self, f, *args, **kwds)
    133         AbstractWorkerPool._AbstractWorkerPool__map(self, f, *args, **kwds)
    134         _pool = self._serve()
--> 135         return _pool.map(star(f), zip(*args)) # chunksize
    136     map.__doc__ = AbstractWorkerPool.map.__doc__
    137     def imap(self, f, *args, **kwds):

~\anaconda3\envs\cadet\lib\site-packages\multiprocess\pool.py in map(self, func, iterable, chunksize)
    362         in a list that is returned.
    363         '''
--> 364         return self._map_async(func, iterable, mapstar, chunksize).get()
    365 
    366     def starmap(self, func, iterable, chunksize=None):

~\anaconda3\envs\cadet\lib\site-packages\multiprocess\pool.py in get(self, timeout)
    769             return self._value
    770         else:
--> 771             raise self._value
    772 
    773     def _set(self, i, obj):

AttributeError: 'Cadet' object has no attribute '_is_file_class'

This error only occurs after increasing n_cores. When n_cores is left equal to 1, no error occurs.

How can I increase the n_cores, in order to have more computational power, and to yield a result more quickly in the optimization?

Thank you!
Samuel

My guess is that there are additional packages required for parallel processing, although I am not sure what they are.

Alternatively, you can increase the number of threads used in CADET; but there are diminishing returns beyond 4 threads which is shown in @s.leweke 2018 paper “Chromatography Analysis and Design Toolkit (CADET)” in Figure 4.

Hi Samuel,

we’re trying to figure out what the issue is. So far, we could only reproduce it when running the code in a jupyter notebook on windows.
If you run it a proper IDE (e.g. pycharm, spyder, vscode), it runs fine. Also, on Linux, it even runs in the notebook. It’s quite peculiar but we hope to find the root cause of it soon. In the meantime, please use a proper script to execute your code.

Please let us know if the issue persists.

Best

Johannes

Hi there,

could you please also let us know on which OS you’re working, give us a dump of the package versions in your python environment and if you’re using Jupyter Notebooks / Lab to execute the code? That might help us further narrow down the search.

Thanks!

Hi Ron,

I am currently using JupyterLab (3.4.4) as a local host in Firefox on Windows 10 Enterprise. My version of CADET-Process is 0.7.3. In my script, I import matplotlib (3.5.2), numpy (1.21.5) and pandas (1.4.4).

@j.schmoelder thanks for combining our posts. I receive a very similar but longer error message for my code as @s.zurbriggen. And yes, with n_cores = 1, I also do not receive an error message.

I hope this helps! Have a nice weekend,
N

---------------------------------------------------------------------------
RemoteTraceback                           Traceback (most recent call last)
RemoteTraceback: 
"""
Traceback (most recent call last):
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\multiprocess\pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\multiprocess\pool.py", line 48, in mapstar
    return list(map(*args))
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\pathos\helpers\mp_helper.py", line 15, in <lambda>
    func = lambda args: f(*args)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 645, in eval_fun_wrapper
    results = eval_fun(ind, force=force)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 131, in wrapper
    return func(self, x, *args, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 975, in evaluate_objectives
    f = self._evaluate_individual(self.objectives, x, force=force)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 601, in _evaluate_individual
    value = self._evaluate(x, eval_fun, force)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 131, in wrapper
    return func(self, x, *args, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 737, in _evaluate
    result = step.evaluate(current_request)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py", line 2868, in __call__
    results = self.evaluator(request, *args, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\simulator\simulator.py", line 199, in simulate
    results = self.simulate_n_cycles(
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\log.py", line 150, in wrapper
    result = function(*args, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\log.py", line 201, in wrapper
    results = function(*args, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\log.py", line 180, in wrapper
    raise e
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\log.py", line 172, in wrapper
    return function(*args, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\simulator\simulator.py", line 253, in simulate_n_cycles
    return self.run(process, **kwargs)
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\CADETProcess\simulator\cadetAdapter.py", line 261, in run
    if cadet.is_file:
  File "C:\Users\nils.gehrmann\Anaconda3\lib\site-packages\cadet\cadet.py", line 169, in is_file
    if self._is_file_class is not None:
AttributeError: 'Cadet' object has no attribute '_is_file_class'
"""

The above exception was the direct cause of the following exception:

AttributeError                            Traceback (most recent call last)
C:/Users/nils.gehrmann/tmp\ipykernel_15584\1856837322.py in <module>
      5 optimizer.n_cores = 6
      6 
----> 7 optimization_results = optimizer.optimize(optimization_problem, use_checkpoint=False)

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizer.py in optimize(self, optimization_problem, x0, save_results, results_directory, use_checkpoint, overwrite_results_directory, exist_ok, log_level, reinit_cache, delete_cache, *args, **kwargs)
    208         start = time.time()
    209 
--> 210         self.run(self.optimization_problem, x0, *args, **kwargs)
    211 
    212         self.results.time_elapsed = time.time() - start

~\Anaconda3\lib\site-packages\CADETProcess\optimization\pymooAdapter.py in run(self, optimization_problem, x0)
    157 
    158             # Evaluate objectives and report results
--> 159             algorithm.evaluator.eval(problem, pop)
    160 
    161             F = pop.get("F").tolist()

~\Anaconda3\lib\site-packages\pymoo\core\evaluator.py in eval(self, problem, pop, skip_already_evaluated, evaluate_values_of, count_evals, **kwargs)
     67 
     68             # do the actual evaluation - call the sub-function to set the corresponding values to the population
---> 69             self._eval(problem, pop[I], evaluate_values_of, **kwargs)
     70 
     71         # update the function evaluation counter

~\Anaconda3\lib\site-packages\pymoo\core\evaluator.py in _eval(self, problem, pop, evaluate_values_of, **kwargs)
     88 
     89         # call the problem to evaluate the solutions
---> 90         out = problem.evaluate(X, return_values_of=evaluate_values_of, return_as_dictionary=True, **kwargs)
     91 
     92         # for each of the attributes set it to the problem

~\Anaconda3\lib\site-packages\pymoo\core\problem.py in evaluate(self, X, return_values_of, return_as_dictionary, *args, **kwargs)
    185 
    186         # this is where the actual evaluation takes place
--> 187         _out = self.do(X, return_values_of, *args, **kwargs)
    188 
    189         out = {}

~\Anaconda3\lib\site-packages\pymoo\core\problem.py in do(self, X, return_values_of, *args, **kwargs)
    227             self._evaluate_elementwise(X, out, *args, **kwargs)
    228         else:
--> 229             self._evaluate_vectorized(X, out, *args, **kwargs)
    230 
    231         # finally format the output dictionary

~\Anaconda3\lib\site-packages\pymoo\core\problem.py in _evaluate_vectorized(self, X, out, *args, **kwargs)
    235 
    236     def _evaluate_vectorized(self, X, out, *args, **kwargs):
--> 237         self._evaluate(X, out, *args, **kwargs)
    238 
    239     def _evaluate_elementwise(self, X, out, *args, **kwargs):

~\Anaconda3\lib\site-packages\CADETProcess\optimization\pymooAdapter.py in _evaluate(self, x, out, *args, **kwargs)
    238         opt = self.optimization_problem
    239         if opt.n_objectives > 0:
--> 240             F = opt.evaluate_objectives_population(
    241                 x,
    242                 untransform=True,

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in wrapper(self, x, untransform, *args, **kwargs)
    129                 x = self.untransform(x)
    130 
--> 131             return func(self, x, *args, **kwargs)
    132 
    133         return wrapper

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in wrapper(self, population, *args, **kwargs)
    150             population = np.array(population, ndmin=2)
    151 
--> 152             return func(self, population, *args, **kwargs)
    153 
    154         return wrapper

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in evaluate_objectives_population(self, population, force, n_cores)
   1005         _evaluate
   1006         """
-> 1007         results = self._evaluate_population(
   1008             self.evaluate_objectives, population, force, n_cores
   1009         )

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in _evaluate_population(self, eval_fun, population, force, n_cores)
    660 
    661             with pathos.pools.ProcessPool(ncpus=n_cores) as pool:
--> 662                 results = pool.map(eval_fun_wrapper, population)
    663 
    664         return np.array(results, ndmin=2)

~\Anaconda3\lib\site-packages\pathos\multiprocessing.py in map(self, f, *args, **kwds)
    133         AbstractWorkerPool._AbstractWorkerPool__map(self, f, *args, **kwds)
    134         _pool = self._serve()
--> 135         return _pool.map(star(f), zip(*args)) # chunksize
    136     map.__doc__ = AbstractWorkerPool.map.__doc__
    137     def imap(self, f, *args, **kwds):

~\Anaconda3\lib\site-packages\multiprocess\pool.py in map(self, func, iterable, chunksize)
    362         in a list that is returned.
    363         '''
--> 364         return self._map_async(func, iterable, mapstar, chunksize).get()
    365 
    366     def starmap(self, func, iterable, chunksize=None):

~\Anaconda3\lib\site-packages\multiprocess\pool.py in get(self, timeout)
    769             return self._value
    770         else:
--> 771             raise self._value
    772 
    773     def _set(self, i, obj):

~\Anaconda3\lib\site-packages\multiprocess\pool.py in worker()
    123         job, i, func, args, kwds = task
    124         try:
--> 125             result = (True, func(*args, **kwds))
    126         except Exception as e:
    127             if wrap_exception and func is not _helper_reraises_exception:

~\Anaconda3\lib\site-packages\multiprocess\pool.py in mapstar()
     46 
     47 def mapstar(args):
---> 48     return list(map(*args))
     49 
     50 def starmapstar(args):

~\Anaconda3\lib\site-packages\pathos\helpers\mp_helper.py in <lambda>()
     13 def starargs(f):
     14     """decorator to convert a many-arg function to a single-arg function"""
---> 15     func = lambda args: f(*args)
     16    #func.__module__ = f.__module__
     17    #func.__name__ = f.__name__

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in eval_fun_wrapper()
    643 
    644         def eval_fun_wrapper(ind):
--> 645             results = eval_fun(ind, force=force)
    646             self.cache.close()
    647 

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in wrapper()
    129                 x = self.untransform(x)
    130 
--> 131             return func(self, x, *args, **kwargs)
    132 
    133         return wrapper

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in evaluate_objectives()
    973         self.logger.debug(f'Evaluate objectives at {x}.')
    974 
--> 975         f = self._evaluate_individual(self.objectives, x, force=force)
    976 
    977         return f

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in _evaluate_individual()
    599         for eval_fun in eval_funs:
    600             try:
--> 601                 value = self._evaluate(x, eval_fun, force)
    602                 results = np.hstack((results, value))
    603             except CADETProcessError as e:

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in wrapper()
    129                 x = self.untransform(x)
    130 
--> 131             return func(self, x, *args, **kwargs)
    132 
    133         return wrapper

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in _evaluate()
    735                     result = np.empty((0))
    736                 else:
--> 737                     result = step.evaluate(current_request)
    738                 if step not in self.cached_steps:
    739                     tag = 'temp'

~\Anaconda3\lib\site-packages\CADETProcess\optimization\optimizationProblem.py in __call__()
   2866             kwargs = self.kwargs
   2867 
-> 2868         results = self.evaluator(request, *args, **kwargs)
   2869 
   2870         return results

~\Anaconda3\lib\site-packages\CADETProcess\simulator\simulator.py in simulate()
    197         process.lock = True
    198         if not self.evaluate_stationarity:
--> 199             results = self.simulate_n_cycles(
    200                 process, self.n_cycles, previous_results, **kwargs
    201             )

~\Anaconda3\lib\site-packages\CADETProcess\log.py in wrapper()
    148         def wrapper(*args, **kwargs):
    149             start = time.time()
--> 150             result = function(*args, **kwargs)
    151             elapsed = time.time() - start
    152             logger = get_logger(logger_name, level=None)

~\Anaconda3\lib\site-packages\CADETProcess\log.py in wrapper()
    199             logger.debug('{} was called with {}, {}'.format(
    200                     function, *args, **kwargs))
--> 201             results = function(*args, **kwargs)
    202             logger.debug(f'Results: {results}')
    203 

~\Anaconda3\lib\site-packages\CADETProcess\log.py in wrapper()
    178 
    179                 # re-raise the exception
--> 180                 raise e
    181 
    182         return wrapper

~\Anaconda3\lib\site-packages\CADETProcess\log.py in wrapper()
    170             logger = get_logger(logger_name, level=None)
    171             try:
--> 172                 return function(*args, **kwargs)
    173             except Exception as e:
    174                 # log the exception

~\Anaconda3\lib\site-packages\CADETProcess\simulator\simulator.py in simulate_n_cycles()
    251             self.set_state_from_results(process, previous_results)
    252 
--> 253         return self.run(process, **kwargs)
    254 
    255         self.n_cycles = n_cyc_orig

~\Anaconda3\lib\site-packages\CADETProcess\simulator\cadetAdapter.py in run()
    259         cadet.root = self.get_process_config(process)
    260 
--> 261         if cadet.is_file:
    262             if file_path is None:
    263                 cadet.filename = self.get_tempfile_name()

~\Anaconda3\lib\site-packages\cadet\cadet.py in is_file()
    167         if self._is_file is not None:
    168             return bool(self._is_file)
--> 169         if self._is_file_class is not None:
    170             return bool(self._is_file_class)
    171 

AttributeError: 'Cadet' object has no attribute '_is_file_class'

Thanks, and which version of Python are you using?

Anaconda Prompt, version 22.9.0

Looked into it a bit more today and I can’t solve it right now. It appears to be a pickling issue with ipython.

The workaround that works for me is to run the script with regular python instead of ipython. So in a console run $python “path/to/your/script.py”.

Hi Samuel,

We have been working on a fix that hasn’t made it into the stable release yet. You can try the version of CADET-Process which includes the fix with this pip command:

pip install -e git+https://github.com/fau-advanced-separations/CADET-Process.git@add_selector_for_parallelization_backend#egg=CADET-Process