import Random: randperm # Sum of square error between two arrays function SSE(x::Array{Float32}, y::Array{Float32})::Float32 diff = (x - y) return sum(diff .* diff) end function SSE(x::Nothing, y::Array{Float32})::Float32 return 1f9 end # Sum of square error between two arrays, with weights function SSE(x::Array{Float32}, y::Array{Float32}, w::Array{Float32})::Float32 diff = (x - y) return sum(diff .* diff .* w) end function SSE(x::Nothing, y::Array{Float32}, w::Array{Float32})::Float32 return Nothing end # Mean of square error between two arrays function MSE(x::Nothing, y::Array{Float32})::Float32 return 1f9 end # Mean of square error between two arrays function MSE(x::Array{Float32}, y::Array{Float32})::Float32 return SSE(x, y)/size(x)[1] end # Mean of square error between two arrays function MSE(x::Nothing, y::Array{Float32}, w::Array{Float32})::Float32 return 1f9 end # Mean of square error between two arrays function MSE(x::Array{Float32}, y::Array{Float32}, w::Array{Float32})::Float32 return SSE(x, y, w)/sum(w) end if weighted const avgy = sum(y .* weights)/sum(weights) const baselineMSE = MSE(y, convert(Array{Float32, 1}, ones(len) .* avgy), weights) else const avgy = sum(y)/len const baselineMSE = MSE(y, convert(Array{Float32, 1}, ones(len) .* avgy)) end # Score an equation function scoreFunc(tree::Node)::Float32 prediction = evalTreeArray(tree) if prediction === nothing return 1f9 end if weighted mse = MSE(prediction, y, weights) else mse = MSE(prediction, y) end return mse / baselineMSE + countNodes(tree)*parsimony end # Score an equation with a small batch function scoreFuncBatch(tree::Node)::Float32 # batchSize batch_idx = randperm(len)[1:batchSize] batch_X = X[batch_idx, :] prediction = evalTreeArray(tree, batch_X) if prediction === nothing return 1f9 end size_adjustment = 1f0 batch_y = y[batch_idx] if weighted batch_w = weights[batch_idx] mse = MSE(prediction, batch_y, batch_w) size_adjustment = 1f0 * len / batchSize else mse = MSE(prediction, batch_y) end return size_adjustment * mse / baselineMSE + countNodes(tree)*parsimony end