<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    backgroundColor="#FFFFFF"
    backgroundGradientAlphas="[1.0, 1.0]" 
    backgroundGradientColors="[#FFFFFF, #FFFFFF]" 
    viewSourceURL="srcview/index.html" width="397" height="411">
    
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import com.adm.nnetwork.TrainingResult;
            import com.adm.nnetwork.TrainingPattern;
            import com.adm.nnetwork.NNetwork;
            
            private var network : NNetwork;
            [Bindable]
            private var memory : ByteArray;
            
            [Bindable]
            private var created : Boolean = false
            
            private function create() : void {
                
                var inputNeurons : int = 2;
                var outputNeurons : int = 1;
                var hiddenNeuronsPerLayer : int = 3;
                var hiddenLayers : int = 2;
                var neuronalBias : Number = 1;
                var initialWeightRange : Number = 1;
                
                this.network = new NNetwork();
                this.network.create(inputNeurons, outputNeurons, hiddenNeuronsPerLayer, hiddenLayers, neuronalBias, initialWeightRange);
                
                startMSE.text = "0";
                endMSE.text = "0";
                executionTime.text = "0ms";
                epochs.text = "0";
                
                this.created = true;
            }
            
            private function trainNetwork() : void {
                var patterns : Array = [];
                /* Learn it the XOR problem */
                patterns.push(new TrainingPattern("00","0"));
                patterns.push(new TrainingPattern("01","1"));
                patterns.push(new TrainingPattern("11","0"));
                patterns.push(new TrainingPattern("10","1"));
                
                var epochsToRun : int = 10000;
                var learningRate : Number = 1;
                
                var result : TrainingResult = this.network.quickTrain(epochsToRun, learningRate,  patterns);
                
                /* show training results */
                startMSE.text = result.startMSE.toString();
                endMSE.text = result.endMSE.toString();
                executionTime.text = result.executionTime.toString() + "ms";
                epochs.text = result.epochs.toString();
            }
            
            private function run() : void {
                var startTime : Date = new Date();
                var result : Array = this.network.run(inputpattern.text.split(""));
                this.outvalue.text = result.join();
                this.interpretvalue.text = this.network.interpret(result).join();
                this.execTime.text = (new Date().time - startTime.time).toString() + "ms";
            }
            
            private function save() : void {
                memory = network.saveMemorySnapshot();
                /* 
                ..
                ..
                save memory to server 
                ..
                ..
                */
            }
            
            private function load() : void {
                /* 
                ..
                ..
                Load memory from server 
                ..
                ..*/
                this.network = new NNetwork(); // clear curent object or create it if not created
                if (this.network.loadMemorySnapshot(memory)) {
                    this.created = true;
                } else Alert.show("Failed to load memory snapshot from file");
                this.memory = null;
            }
                        
        ]]>
    </mx:Script>
    
    <mx:Button x="10" y="10" label="Create New Network" width="180" click="create()" />
    <mx:Button x="198" y="10" label="Load Saved Snapshot" width="188" click="load()" enabled="{memory != null}" />
    
    <mx:Canvas x="10" y="36" width="376" height="156" borderStyle="solid">
        <mx:Label x="10" y="10" text="Train network" fontWeight="bold"/>
        <mx:Label x="10" y="36" text="Start MSE:"/>
        <mx:Label x="113" y="36" text="0" fontWeight="bold" id="startMSE"/>
        <mx:Label x="10" y="62" text="End MSE:"/>
        <mx:Label x="113" y="62" text="0" fontWeight="bold" id="endMSE"/>
        <mx:Label x="10" y="88" text="Execution Time:"/>
        <mx:Label x="113" y="88" text="0" fontWeight="bold" id="executionTime"/>
        <mx:Label x="10" y="114" text="Epochs:"/>
        <mx:Label x="113" y="114" text="0" fontWeight="bold" id="epochs"/>
        <mx:Label x="178" y="36" text="Learn Patterns:"/>
        <mx:Text x="277" y="36" htmlText="00 =&gt; 0&lt;br&gt;01 =&gt; 1&lt;br&gt;10 =&gt; 1&lt;br&gt;11 =&gt; 0"/>
        <mx:Button x="249" y="112" label="Train" click="trainNetwork()" enabled="{this.created}" />
    </mx:Canvas>
    
    <mx:Canvas x="10" y="200" width="376" height="145" borderStyle="solid">
        <mx:Label x="10" y="10" text="Test network" fontWeight="bold"/>
        <mx:Label x="10" y="36" text="Input pattern (binary string):"/>
        <mx:TextInput x="185" y="34" id="inputpattern" maxChars="2" width="56"/>
        <mx:Label x="10" y="62" text="Value:"/>
        <mx:Label x="10" y="88" text="Interpretable:"/>
        <mx:Label x="185" y="62" fontWeight="bold" id="outvalue"/>
        <mx:Label x="185" y="88" fontWeight="bold" id="interpretvalue"/>
        <mx:Button x="249" y="34" label="Run" width="105" click="run()" enabled="{this.created}" />
        <mx:Label x="10" y="114" text="Execution Time:"/>
        <mx:Label x="185" y="114" text="0" fontWeight="bold" id="execTime" />
    </mx:Canvas>
    
    <mx:Button x="10" y="353" label="Save Network Snapshot" width="376" click="save()" enabled="{this.created}" />
    <mx:Label x="10" y="383" text="Saved Network Snapshot Size : "/>
    <mx:Label x="198" y="383" text="{memory != null ? memory.bytesAvailable.toString() : '0' } bytes" fontWeight="bold" id="memorySize"/>
    
</mx:Application>