Как передать дополнительные аргументы в функцию ограничения - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь использовать алгоритм SLSQP в R, однако я не могу передать дополнительные аргументы в функцию 'constraint'.Он принимает эти аргументы для целевой функции, но выдает ошибку, когда они передаются функции «ограничения».Я не понимаю, почему и как это исправить?

Настройка функции браузера в разных точках.Кроме того, он, похоже, не попадает внутрь функции, которая вычисляет градиент "gr_obj_fn".

#objective function
obj_fn <- function(theta,dvec,Dmat,H)
{
  browser()
  theta_mat <- rbind(theta[1],theta[2],theta[3])
  #as.numeric((0.5)*t(theta_mat)%*%t(Dmat)%*%theta_mat - t(dvec)%*%theta_mat)
  return(as.numeric((0.5)*t(theta_mat)%*%t(Dmat)%*%theta_mat - t(dvec)%*%theta_mat))
}

#constraint function
constr <- function(theta,dvec,Dmat,H)
{
  browser()
  theta_mat <- rbind(theta[1],theta[2],theta[3])
  return(as.numeric(0.66 - mean(plogis(H%*%theta_mat))))
}  

#gradient of the objective function
gr_obj_fn <- function(theta,dvec,Dmat,H)
{
  browser()
  theta_mat <- rbind(theta[1],theta[2],theta[3])
  #as.numeric(diag(Dmat)%*%theta_mat - t(dvec))
  return(as.numeric(diag(Dmat)%*%theta_mat - t(dvec)))
}

#jacobian of the constraint function
jac_constr <- function(theta,dvec,Dmat,H)
{
  theta_mat <- rbind(theta[1],theta[2],theta[3])

  J <- cbind((1/nrow(H))*sum(dlogis(H%*%theta_mat)),(1/nrow(H))*t(H[,2])%*%dlogis(H%*%theta_mat),(1/nrow(H))*t((H[,3])^2)%*%dlogis(H%*%theta_mat))

  return(as.numeric(J))
}

#SQLSQP
opt <- slsqp(x0=c(-1,0,0), fn=obj_fn, gr= gr_obj_fn, lower = c(-10,0,0), upper = rep(100, 3), hin = NULL, hinjac = NULL,
              heq = constr, heqjac = jac_constr, nl.info = FALSE, control =list(stopval = -Inf, 
                           xtol_rel = 1e-9, maxeval = 100000),dvec=dvec, Dmat=Dmat, H=H)


Я ожидаю, что дополнительные аргументы в SLSQP, которые являются dvec, Dmat и H, будут переданы всем функциям - obj_fn, gr_obj_fn, const и jac_constr.Они передаются в obj_fn, но не в const.

Это ошибка, которую я получаю -

Ошибка в журнале (H% *% theta_mat): отсутствует аргумент "H" без значения по умолчанию

Кроме того, браузерне показывает, что код идет внутри функции 'gr_obj_fn'

...