def set_optimization_tag(self, fractal_uri, tag, dataset_name):
        from qcportal.models.task_models import PriorityEnum

        client = FractalClient(fractal_uri, verify=False)

        optds = client.get_collection("OptimizationDataset", dataset_name)
        optds.status()
        opts = optds.df.values.flatten()

        optids = [opt.id for opt in opts if opt.status != 'COMPLETE']
        for id in optids:
            client.modify_tasks(operation='modify',
                                base_result=id,
                                new_tag=tag)
    def set_optimization_priority(self, fractal_uri, priority, dataset_name):
        from qcportal.models.task_models import PriorityEnum

        client = FractalClient(fractal_uri, verify=False)

        optds = client.get_collection("OptimizationDataset", dataset_name)
        optds.status()
        opts = optds.df.values.flatten()

        priority_map = {
            "high": PriorityEnum.HIGH,
            "normal": PriorityEnum.NORMAL,
            "low": PriorityEnum.LOW
        }

        optids = [opt.id for opt in opts if opt.status != 'COMPLETE']
        for id in optids:
            client.modify_tasks(operation='modify',
                                base_result=id,
                                new_priority=priority_map[priority])
    def errorcycle_optimizations(self,
                                 fractal_uri,
                                 dataset_name,
                                 client=None,
                                 compute_specs=None,
                                 molids=None):
        """Restart optimizations that have failed.

        Parameters
        ----------
        compute_specs : iterable 
            Iterable of compute spec names to error cycle only.
        molids : iterable 
            Iterable of molecule ids to error cycle only.
    
        """
        if client is None:
            client = FractalClient(fractal_uri, verify=False)

        optds = client.get_collection("OptimizationDataset", dataset_name)
        optds.status()

        df = optds.df

        if (molids is not None) and (len(molids) != 0):
            df = df.loc[list(molids)]

        if compute_specs is not None:
            df = df[compute_specs]

        for opt in df.values.flatten():
            if opt.status == 'ERROR':
                client.modify_tasks(operation='restart', base_result=opt.id)
                print(f"Restarted ERRORed optimization `{opt.id}`")
            if opt.status == 'INCOMPLETE' and (opt.final_molecule is not None):
                client.modify_tasks(operation='regenerate', base_result=opt.id)
                print(f"Regnerated INCOMPLETE optimization `{opt.id}`")