Spaces:
Running
Running
| # *** Custom Functions | |
| ################################################################################################################################## | |
| # *** Will somewhere need to define a list TRUTHS of all valid auxliary truths | |
| struct Transformation | |
| type::Integer # 1 is symmetry, 2 is zero, 3 is equality | |
| params::Array{Int32} | |
| Transformation(type::Integer, params::Array{Int32}) = new(type, params) | |
| Transformation(type::Integer, params::Array{Int64}) = new(type, params) | |
| end | |
| struct Truth | |
| transformation::Transformation | |
| weights::Array{Float32} | |
| Truth(transformation::Transformation, weights::Array{Float32}) = new(transformation, weights) | |
| Truth(type::Int64, params::Array{Int64}, weights::Array{Float32}) = new(Transformation(type, params), weights) | |
| Truth(transformation::Transformation, weights::Array{Float64}) = new(transformation, weights) | |
| Truth(type::Int64, params::Array{Int64}, weights::Array{Float64}) = new(Transformation(type, params), weights) | |
| end | |
| # Returns a linear combination when given X of shape nxd, y of shape nx1 is f(x) and w of shape d+2x1, result is shape nx1 | |
| function LinearPrediction(cX::Array{Float32}, cy::Array{Float32}, w::Array{Float32})::Array{Float32} | |
| preds = 0 | |
| for i in 1:ndims(cX) | |
| preds = preds .+ cX[:,i].*w[i] | |
| end | |
| preds = preds .+ cy.*w[ndims(cX)+1] | |
| return preds .+ w[ndims(cX)+2] | |
| end | |
| # Returns a copy of the data with the two specified columns swapped | |
| function swapColumns(cX::Array{Float32, 2}, a::Integer, b::Integer)::Array{Float32, 2} | |
| X1 = copy(cX) | |
| X1[:, a] = cX[:, b] | |
| X1[:, b] = cX[:, a] | |
| return X1 | |
| end | |
| # Returns a copy of the data with the specified integers in the list set to value given | |
| function setVal(cX::Array{Float32, 2}, a::Array{Int32, 1}, val::Float32)::Array{Float32, 2} | |
| X1 = copy(cX) | |
| for i in 1:size(a)[1] | |
| X1[:, a[i]] = fill!(cX[:, a[i]], val) | |
| end | |
| return X1 | |
| end | |
| # Returns a copy of the data with the specified integer indices in the list set to the first item of that list | |
| function setEq(cX::Array{Float32, 2}, a::Array{Int32, 1})::Array{Float32, 2} | |
| X1 = copy(cX) | |
| val = X1[:, a[1]] | |
| for i in 1:size(a)[1] | |
| X1[:, a[i]] = val | |
| end | |
| return X1 | |
| end | |
| # Takes in a dataset and returns the transformed version of it as per the specified type and parameters | |
| function transform(cX::Array{Float32, 2}, transformation::Transformation)::Array{Float32, 2} | |
| if transformation.type==1 # then symmetry | |
| a = transformation.params[1] | |
| b = transformation.params[2] | |
| return swapColumns(cX, a, b) | |
| elseif transformation.type==2 # then zero condition | |
| return setVal(cX, transformation.params, Float32(0)) | |
| elseif transformation.type == 3 # then equality condition | |
| return setEq(cX, transformation.params) | |
| else # Then error return X | |
| return cX | |
| end | |
| end | |
| function transform(cX::Array{Float32, 2}, truth::Truth)::Array{Float32, 2} | |
| return transform(cX, truth.transformation) | |
| end | |
| # Takes in X that has been transformed and returns what the Truth projects the target values should be | |
| function truthPrediction(X_transformed::Array{Float32, 2}, cy::Array{Float32}, truth::Truth)::Array{Float32} | |
| return LinearPrediction(X_transformed, cy, truth.weights) | |
| end | |