为什么 SharedArray 的 SetIndex 抱怨不可变类型?
Why are is SetIndex of a SharedArray complaining with Immutable types?
所以我有一个非常简单的问题。我有一个定义如下的类型:
# An internal type used only by the train function for caching between epochs.
immutable Residual
value::Float32
curr_error::Float32
prev_error::Float32
end
我正在 Julia 中研究机器学习算法,并希望通过在 @parrellel 循环结束时检查这些值来中断。为此,我使用了这样定义的 SharedArrays。
residuals = SharedArray(Residual, size(rating_set.training_set), init = S -> S[Base.localindexes(S)] = [Residual(rating.value, 0.0, 0.0) for rating in rating_set.training_set[Base.localindexes(S)]])
现在,在循环内,我想用一个简单的更新步骤来更新残差。由于它是不可变的,我假设我必须创建一个新的 Residual 对象并将其填充到 SharedArray 中。
residual[j] = Residual(residual.value, -user_feature * item_feature + residual.value, residual.curr_error)
但是,每当我 运行 代码时,我都会收到以下错误。
LoadError: MethodError: `setindex!` has no method matching setindex!(::Residual, ::Residual, ::Int64)
我不确定我做错了什么,我认为这与打字有关?还是我完全误解了 Julia 中的 SharedArrays?任何帮助将不胜感激。
好吧,这很尴尬,我在数组中遗漏了一个 s 所以它试图在不可变类型上设置索引...我会把这个问题留在这里以防其他人犯同样的错误.
所以我有一个非常简单的问题。我有一个定义如下的类型:
# An internal type used only by the train function for caching between epochs.
immutable Residual
value::Float32
curr_error::Float32
prev_error::Float32
end
我正在 Julia 中研究机器学习算法,并希望通过在 @parrellel 循环结束时检查这些值来中断。为此,我使用了这样定义的 SharedArrays。
residuals = SharedArray(Residual, size(rating_set.training_set), init = S -> S[Base.localindexes(S)] = [Residual(rating.value, 0.0, 0.0) for rating in rating_set.training_set[Base.localindexes(S)]])
现在,在循环内,我想用一个简单的更新步骤来更新残差。由于它是不可变的,我假设我必须创建一个新的 Residual 对象并将其填充到 SharedArray 中。
residual[j] = Residual(residual.value, -user_feature * item_feature + residual.value, residual.curr_error)
但是,每当我 运行 代码时,我都会收到以下错误。
LoadError: MethodError: `setindex!` has no method matching setindex!(::Residual, ::Residual, ::Int64)
我不确定我做错了什么,我认为这与打字有关?还是我完全误解了 Julia 中的 SharedArrays?任何帮助将不胜感激。
好吧,这很尴尬,我在数组中遗漏了一个 s 所以它试图在不可变类型上设置索引...我会把这个问题留在这里以防其他人犯同样的错误.