Run FastGapFill gap-filling algorithm by calling
    :func:`psamm.fastcore.fastcore`.

    FastGapFill will try to find a minimum subset of reactions that includes
    the core reactions and it also has no blocked reactions.
    Return the set of reactions in the minimum subset. An extended model that
    includes artificial transport and exchange reactions can be generated by
    calling :func:`.create_extended_model`.

    Args:
        model: :class:`psamm.metabolicmodel.MetabolicModel`.
        core: reactions in the original metabolic model.
        weights: a weight dictionary for reactions in the model.
        solver: linear programming library to use.
        epsilon: float number, threshold for Fastcore algorithm.

def fastgapfill(model_extended, core, solver, weights={}, epsilon=1e-5):
    """Run FastGapFill gap-filling algorithm by calling
    :func:`psamm.fastcore.fastcore`.

    FastGapFill will try to find a minimum subset of reactions that includes
    the core reactions and it also has no blocked reactions.
    Return the set of reactions in the minimum subset. An extended model that
    includes artificial transport and exchange reactions can be generated by
    calling :func:`.create_extended_model`.

    Args:
        model: :class:`psamm.metabolicmodel.MetabolicModel`.
        core: reactions in the original metabolic model.
        weights: a weight dictionary for reactions in the model.
        solver: linear programming library to use.
        epsilon: float number, threshold for Fastcore algorithm.
    """

    # Run Fastcore and print the induced reaction set
    logger.info('Calculating Fastcore induced set on model')
    induced = fastcore(
        model_extended, core, epsilon=epsilon, weights=weights, solver=solver)
    logger.debug('Result: |A| = {}, A = {}'.format(len(induced), induced))
    added_reactions = induced - core
    logger.debug('Extended: |E| = {}, E = {}'.format(
        len(added_reactions), added_reactions))
    return induced