load = ndlMacroDefine
run = DNN

ndlMacroDefine = [
    # Macro definitions
    MeanVarNorm(x) = [
        xMean    = Mean(x);
        xStdDev  = InvStdDev(x)
        xNorm    = PerDimMeanVarNormalization(x, xMean, xStdDev)
    ]
]

DNN = [
    #define basic i/o
    featDim = 363
    labelDim = 132
    hiddenDim = 512

    features = Input(featDim,  tag="feature")
    labels   = Input(labelDim, tag="label")

    globalMean   = Parameter(featDim,  1, init="fromFile", initFromFilePath="$globalMeanPath$",   computeGradient=false)
    globalInvStd = Parameter(featDim,  1, init="fromFile", initFromFilePath="$globalInvStdPath$", computeGradient=false)
    globalPrior  = Parameter(labelDim, 1, init="fromFile", initFromFilePath="$globalPriorPath$",  computeGradient=false)
    logPrior = Log(globalPrior)

    # define network
    featNorm = PerDimMeanVarNormalization(features, globalMean, globalInvStd)

    # layer 1   363 X 512
    z1 = DNNLayer(featDim, hiddenDim, featNorm); 
    # layer 2   512 X 512 
    z2 = DNNLayer(hiddenDim, hiddenDim, z1);
    # layer 3   512 X 512 
    z3 = DNNLayer(hiddenDim, hiddenDim, z2);
    # last layer 512 X 132 
    z4 = DNNLastLayer(hiddenDim, labelDim, z3);

    ce  = CrossEntropyWithSoftmax(labels, z4, tag="criterion");
    err = ClassificationError(labels, z4, tag="evaluation");
    scaledLogLikelihood = Minus(z4, logPrior, tag="output")
]
