"""Proposers for budgeted molecular optimization.

Available proposers:
- MoltenFlowProposer: Guided flow optimization (can also do gradient ascent with use_flow=False)
- TwoGPProposer: Bayesian optimization with two independent GPs (requires botorch)
- MOGPProposer: Bayesian optimization with multi-output GP (requires botorch)
"""

from .base import BaseProposer, ObservedData, ProposalResult
from .moltenflow import MoltenFlowProposer

# BO proposers are optional (require botorch)
try:
    from .bo import LatentAggregation, MOGPProposer, TwoGPProposer, has_botorch
except ImportError:
    TwoGPProposer = None
    MOGPProposer = None
    LatentAggregation = None

    def has_botorch():
        return False


__all__ = [
    "BaseProposer",
    "ObservedData",
    "ProposalResult",
    "MoltenFlowProposer",
    "TwoGPProposer",
    "MOGPProposer",
    "LatentAggregation",
    "has_botorch",
]
