Nlopt no catch ForcedStop в функции ограничений add_inequality_constraint

Я переписываю [LikelihoodProfiler]: https://github.com/insysbio/LikelihoodProfiler.jl с Julia на Python. Мне нужно написать функцию ограничений для [нелинейных ограничений]: https://nlopt.readthedocs.io/en/latest/NLopt_Python_Reference/#nonlinear-constraints, как будто мы получаем некоторые значения, которые мы бросаем [исключение принудительной остановки]: https://nlopt.readthedocs.io/en/latest/NLopt_Python_Reference/#exc Nlopt должен обрабатывать исключение и возвращать результат с помощью специального кода.

В [Юля так выглядит]: https://github.com/insysbio/LikelihoodProfiler.jl/blob/master/src/cico_one_pass.jl

function constraints_func(x, g)
        loss = loss_func(x)
        if (loss < 0.) && (scan_func(x) > scan_bound)
            throw(ForcedStop("Out of the scan bound but in ll constraint."))
        #elseif isapprox(loss, 0., atol=loss_tol)
        #    @warn "loss_tol reached... but..."
        #    return loss
        else
            return loss
        end
    end

 opt = Opt(:LN_AUGLAG, n_theta)
    ftol_abs!(opt, scan_tol)
    max_objective!(
        opt,
        (x, g) -> scan_func(x)
        )
    lb = [theta_bounds[i][1] for i in 1:n_theta] # minimum.(theta_bounds)
    ub = [theta_bounds[i][2] for i in 1:n_theta] # maximum.(theta_bounds)
    lower_bounds!(opt, lb)
    upper_bounds!(opt, ub)
    local_optimizer!(opt, local_opt)
    maxeval!(opt, max_iter)

    # inequality constraints
    inequality_constraint!(
        opt,
        constraints_func,
        loss_tol
    )

    # start optimization
    (optf, optx, ret) = optimize(opt, theta_init)

Я пытаюсь переписать его на python следующим образом:

 # Constraints function

    def constraints_func(x, g, opt):
        loss = loss_func(x)
        if (loss < 0) and (scan_func(x) > scan_bound):
            opt.force_stop()
            #raise nlopt.ForcedStop("Out of the scan bound but in ll constraint.")
        else:
            return loss

    # constrain optimizer
    opt = nlopt.opt(nlopt.LN_AUGLAG, n_theta)
    opt.set_ftol_abs(scan_tol)
    opt.set_max_objective(lambda x, g: scan_func(x))

    lb = [theta_bounds[i][0] for i in range(n_theta)]  # minimum.(theta_bounds)
    ub = [theta_bounds[i][1] for i in range(n_theta)]  # maximum.(theta_bounds)
    opt.set_lower_bounds(lb)
    opt.set_upper_bounds(ub)
    opt.set_local_optimizer(local_opt)
    opt.set_maxeval(max_iter)
    # print(max_iter)
    # inequality constraints
    opt.add_inequality_constraint(lambda x, g: constraints_func(x, g, opt), loss_tol)
    # start optimization
    optx = opt.optimize(theta_init)
    optf = opt.last_optimum_value()
    ret = opt.last_optimize_result()

Но когда я его запускаю, я получаю nlopt недопустимый аргумент, если вместо этого

opt.force_stop()

я использую

raise nlopt.ForcedStop("Out of the scan bound but in ll constraint.")

Я получаю nlopt.ForcedStop: вне границы сканирования, но в ограничении ll

Но я ожидал, что Nlopt обработает исключение и вернет результат оптимизации специальным кодом.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, я не могу решить эту проблему, но я использую стандартный метод Python

   try:
        optx = opt.optimize(theta_init)
        optf = opt.last_optimum_value()
        ret = opt.last_optimize_result()
    except nlopt.ForcedStop:
        ret = -5
def constraints_func(x, g):
        loss = loss_func(x)
        if (loss < 0) and (scan_func(x) > scan_bound):
            #return opt.force_stop()
            raise nlopt.ForcedStop("Out of the scan bound but in ll constraint.")
        else:
            return loss

Другие вопросы по теме