def METHOD_NAME(self):
    """
    run one optimization cycle
    - determine the number of candidates to request from the generator
    - pass candidate request to generator
    - submit candidates to evaluator
    - wait until all (asynch == False) or at least one (asynch == True) evaluation
        is finished
    - update data storage and generator data storage (if applicable)
    """
    logger.info("Running Xopt step")
    # get number of candidates to generate
    n_generate = self.evaluator.max_workers
    # generate samples and submit to evaluator
    logger.debug(f"Generating {n_generate} candidates")
    new_samples = self.generator.generate(n_generate)
    # Evaluate data
    self.evaluate_data(new_samples)