Примечания к участию в разработке
Мы всегда рады получать помощь от людей, которые обычно не участвуют в создании пакета. Однако для того, чтобы процесс прошел наилучшим образом, рекомендуется прочитать эту страницу перед созданием запроса на вытягивание. Так будет больше шансов, что ваши изменения будут учтены, и в конечном итоге это означает меньше работы для всех.
Важные моменты
Предлагая изменения в Optim.jl, необходимо учитывать несколько моментов. Если вы сомневаетесь, не стесняйтесь обращаться к нам. Проще всего это можно сделать, присоединившись к нашему каналу на сервисе Gitter.
Прежде чем отправлять запрос на вытягивание, обратите внимание на следующие пункты.
-
Вы предоставили тесты для своих изменений? Если нет, то сделайте это или попросите помощи.
-
Добавило ли ваше изменение новую функциональность? Не забудьте добавить раздел в документацию.
-
Вы значительно изменили существующий код? Обязательно воспользуйтесь инструментами Julia по выводу из использования, чтобы помочь пользователям перейти на новый синтаксис.
-
Добавьте примечание в файл NEWS.md, чтобы мы могли отслеживать изменения между версиями.
Добавление решателя
Если вы создаете новый решатель, не нужно трогать код в src/optimize.jl. Вам следует добавить файл с именем (solver — имя решателя) solver.jl в src и убедиться, что вы определили подтип Optimizer struct Solver <: Optimizer end с соответствующими полями, конструктор по умолчанию с ключевым словом для каждого поля, тип состояния, который содержит все переменные, которые (повторно) используются в течение итеративной процедуры, функцию initial_state, которая инициализирует такое состояние, и метод update!, который выполняет фактическую работу. Допустим, вы хотите принять участие в разработке решателя Minim, тогда ваш файл src/minim.jl будет выглядеть примерно так
struct Minim{IF, F<:Function, T} <: Optimizer
alphaguess!::IF
linesearch!::F
minim_parameter::T
end
Minim(; alphaguess = LineSearches.InitialStatic(), linesearch = LineSearches.HagerZhang(), minim_parameter = 1.0) =
Minim(linesearch, minim_parameter)
type MinimState{T,N,G}
x::AbstractArray{T,N}
x_previous::AbstractArray{T,N}
f_x_previous::T
s::AbstractArray{T,N}
@add_linesearch_fields()
end
function initial_state(method::Minim, options, d, initial_x)
# подготовка переменных кэша и т. д. здесь
end
function update!{T}(d, state::MinimState{T}, method::Minim)
# код для Minim здесь
false # нужно ли принудительно прекращать процедуру?
end