julia moduleの使いかた

前提

最近juliaを勉強し始めました。

同じフォルダー内にある2つのファイル(gradient_method.jl, myOptLib.jl)に、
mainの文とmoduleを書き分けました。

実現したいこと

1つのファイル(myOptLib.jl)に2つのmodule(Search, GradientMethod)を書いており、
GradientMethodのなか(81行目)でSearch内の関数(searchT)を使用しているのですが
下記のようなエラーが出力されます。

どのように対処すれば良いのでしょうか?

お手数おかけしますがよろしくお願いいたします。

発生している問題・エラーメッセージ

ERROR: LoadError: UndefVarError: Search not defined Stacktrace in expression starting at ~省略~/gradient_method.jl:27

gradient_method.jl(メイン)

julia

include("myOptLib.jl") using Plots using LinearAlgebra using .GradientMethod, .Search function main() initX::Float64 = -3. initY::Float64 = -6.5 eps::Float64 = 10^(-6) maxIter::Int32 = 10^4 initVars = GradientMethod.InitVars(initX, initY) params = GradientMethod.Params(eps, maxIter, f) x, y, z = GradientMethod.forward(initVars, params) println(z[end])end function f(x::Float64, y::Float64) return 5. * (x - 1)^2 + 2. * (y - 2.)^2end main()

myOptLib.jl(モジュールを書いたもの)

julia

using LinearAlgebra module Search _deltaH = 0.1_t = 0.1_epsilon = 10^(-5) function diffF(t::Float64, f::Function) deltaH = 10^(-5) return (f(t + deltaH) - f(t - deltaH)) / (2 * deltaH)end function searchT(f::Function) deltaH = _deltaH t = _t while abs(diffF(t, f)) > _epsilon delataH = - sign(diffF(t, f)) * deltaH T::Float64 = t Td::Float64 = T + deltaH if f(T) > f(Td) while f(T) >= f(Td) deltaH *= 2 T = Td Td = T + deltaH t = T deltaH /= 2 end else while f(T) < f(Td) deltaH /= deltaH Td -= deltaH t = Td h *= 2 end end end return t end end module GradientMethod _deltaH = 10^(-6) struct InitVars x0::Float64 y0::Float64 end struct Params eps::Float64 maxIter::Int32 func::Function end function forward(initVars, params) x = Array{Float64}(undef, params.maxIter+1) y = Array{Float64}(undef, params.maxIter+1) z = Array{Float64}(undef, params.maxIter+1) x[begin] = initVars.x0 y[begin] = initVars.y0 z[begin] = params.func(initVars.x0, initVars.y0) iter::Int32 = 0 for i = 1:params.maxIter+1 iter += 1 func = t -> params.func(x[i] - t * diffX(x[i], y[i], params.func), y[i] - t * diffY(x[i], y[i], params.func)) optT::Float64 = Search.searchT(func) #ここでSearch内の関数を使用 deltaX::Float64 = optT * diffX(x[i], y[i], params.func) deltaY::Float64 = optT * diffY(x[i], y[i], params.func) newX = x[i] + delataX newY = y[i] + deltaY x[i+1] = newX y[i+1] = newY z[i+1] = params.func(newX, newY) if sqrt(deltaX^2 + deltaY^2) < params.eps return copy(x[begin:iter+1]), copy(y[begin:iter+1]), copy(z[begin:iter+1]) break end end end function diffX(x::Float64, y::Float64, f::Function) return (f(x + _deltaH, y) - f(x - _deltaH, y)) / (2 * _deltaH)end function diffY(x::Float64, y::Float64, f::Function) return (f(x, y + _deltaH) - f(x, y - _deltaH)) / (2 * _deltaH)end end

コメントを投稿

0 コメント