seed 12345

addNet GEaH-GA
addGroup input 26 INPUT
addGroup context 200 ELMAN
addGroup hidden 200 -RESET_ON_EXAMPLE
addGroup output 26 OUTPUT SOFT_MAX

elmanConnect hidden context
connectGroups context hidden
connectGroups input hidden
connectGroups hidden output

loadExamples GEaH_ex.txt -s GEaH -exmode ORDERED
loadExamples GA_ex.txt   -s GA   -exmode ORDERED

useTrainingSet GEaH
useTestingSet  GEaH

setObj learningRate 0.00001
setObj numUpdates   20000

#
# This command pre-sets the training algorithm to Delta-Bar-Delta, but is
# commented out so that you can run the network with lens (rather than alens)
# If you want to train the network, run alens and either set the "Training
# Procedure" to "Delta-Bar-Delta" in the main console, or just uncomment this
# line
#
#train -algorithm deltaBarDelta -setOnly
#

#
# define network display
#
setObj input.numColumns  26
setObj context.numColumns 25
setObj hidden.numColumns 25
setObj output.numColumns 26
setObj unitCellSize 28
autoPlot
resetNet

#
# rename input and output units
#
setObj input.unit(0).name  a 
setObj input.unit(1).name  b 
setObj input.unit(2).name  c 
setObj input.unit(3).name  d 
setObj input.unit(4).name  e 
setObj input.unit(5).name  f 
setObj input.unit(6).name  g 
setObj input.unit(7).name  h 
setObj input.unit(8).name  i 
setObj input.unit(9).name  j 
setObj input.unit(10).name k 
setObj input.unit(11).name l 
setObj input.unit(12).name m 
setObj input.unit(13).name n 
setObj input.unit(14).name o 
setObj input.unit(15).name p 
setObj input.unit(16).name q 
setObj input.unit(17).name r 
setObj input.unit(18).name s 
setObj input.unit(19).name t 
setObj input.unit(20).name u 
setObj input.unit(21).name v 
setObj input.unit(22).name w 
setObj input.unit(23).name x
setObj input.unit(24).name y
setObj input.unit(25).name z

setObj output.unit(0).name  a 
setObj output.unit(1).name  b 
setObj output.unit(2).name  c 
setObj output.unit(3).name  d 
setObj output.unit(4).name  e 
setObj output.unit(5).name  f 
setObj output.unit(6).name  g 
setObj output.unit(7).name  h 
setObj output.unit(8).name  i 
setObj output.unit(9).name  j 
setObj output.unit(10).name k 
setObj output.unit(11).name l 
setObj output.unit(12).name m 
setObj output.unit(13).name n 
setObj output.unit(14).name o 
setObj output.unit(15).name p 
setObj output.unit(16).name q 
setObj output.unit(17).name r 
setObj output.unit(18).name s 
setObj output.unit(19).name t 
setObj output.unit(20).name u 
setObj output.unit(21).name v 
setObj output.unit(22).name w 
setObj output.unit(23).name x
setObj output.unit(24).name y
setObj output.unit(25).name z

#
# reset activations (for first example; called within each example set)
#
proc resetGroup { group value } {
  set N [getObj $group.numUnits]
  for {set i 0} { $i < $N } { incr i } {
    setObj $group.output($i) $value
  }
}

#
# this procedure periodically saves weight files during training, and is not
# relevant if you're just running the pretrained network
#
proc checkpoint { filename checkpointInterval minSaveInterval maxSaveInterval } {
    set epoch [getObj totalUpdates] 
    set saveInterval [expr int(pow(10,floor(log10($epoch))))]
    if { $saveInterval < $minSaveInterval } {
	set saveInterval $minSaveInterval
    } elseif { $saveInterval > $maxSaveInterval } {
	set saveInterval $maxSaveInterval
    }
    if { [expr $epoch % $saveInterval] == 0 } {
	puts "Saving weights to $filename.$epoch.wt"
	saveWeights $filename.$epoch.wt -values 3
    } elseif { [expr $epoch % $checkpointInterval] == 0 } {
	puts "Checkpointing to $filename.ckp.wt"
	saveWeights $filename.ckp.wt -values 3
    }
}

setObj postUpdateProc { checkpoint [getObj trainingSet.name] 1000 1000 1000 }

