//
// ML: Fully-Connected module
//
// Thras Karydis
// (c) Massachusetts Institute of Technology 2018
//
// This work may be reproduced, modified, distributed, performed, and
// displayed for any purpose, but must acknowledge the mods
// project. Copyright is retained and must be preserved. The work is
// provided as is; no warranty is provided, and users accept all
// liability.
//
// closure
//
(function(){
//
// module globals
//
    var mod = {w: []}
//
// name
//
    var name = 'Fully-Connected'
//
// initialization
//
    var init = function() {
        mod.x = [0.1, 0.7]
        mod.w = [0.5, 0.5]
        mod.xtext.value = mod.x
        mod.wtext.value = mod.w
        outputs.y.event()
    }
//
// inputs
//
    var inputs = {
        x:{type:'vector1d',
            event:function(evt){
                mod.x = evt.detail
                mod.xtext.value = mod.x
                outputs.y.event()}}}
//
// outputs
//
    var outputs = {
        y:{type:'number',
            event:function(){
                var x = mod.x
                var w = mod.w
                var y = linearSum(x, w)
                mod.ytext.value = y
                mods.output(mod,'y',y)}}}
//
// interface
//
    var interface = function(div){
        mod.div = div
        div.appendChild(document.createTextNode('x: '))
        var input = document.createElement('input')
        input.type = 'text'
        input.size = 6
        input.addEventListener('input',function(evt){
            mod.x = parseFloat(mod.xtext.value)
            outputs.y.event()
        })
        div.appendChild(input)
        mod.xtext = input
        div.appendChild(document.createElement('br'))
        div.appendChild(document.createTextNode('w: '))
        var input = document.createElement('input')
        input.type = 'text'
        input.size = 6
        input.addEventListener('input',function(evt){
            mod.w = parseFloat(mod.wtext.value)
            outputs.y.event()
        })
        div.appendChild(input)
        mod.wtext = input
        div.appendChild(document.createTextNode('y: '))
        var input = document.createElement('input')
        input.type = 'text'
        input.size = 6
        div.appendChild(input)
        mod.ytext = input
    }
//
// local functions
//

    function linearSum(arr1, arr2) {
        var sum = 0;
        for (var i = 0; i < arr1.length; i++) {
            sum += arr1[i] * arr2[i];
        }
        return sum
    }



//
// return values
//
    return ({
        name:name,
        init:init,
        inputs:inputs,
        outputs:outputs,
        interface:interface
    })
}())