Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Gattermeier/8c3f99ddeb75aa995c27 to your computer and use it in GitHub Desktop.
Save Gattermeier/8c3f99ddeb75aa995c27 to your computer and use it in GitHub Desktop.
reactiveCircuit.js
'use strict';
var Rx = require('rx');
var EventEmitter = require('events').EventEmitter;
var inputs = { // defaults
x: -2,
y: 5,
z: -4,
h: 0.001
}
// Helper Functions
var forwardMultiplyGate = function(a, b) {
return a * b;
};
var forwardAddGate = function(a, b) {
return a + b;
};
var backwardPropagation = function(data) {
// derivate of multiplyGate wrt its inputs
var derivative_f_wrt_z = data.q;
var derivative_f_wrt_q = data.z;
// derivative of the addGate wrt its inputs
var derivative_q_wrt_x = 1.0;
var derivative_q_wrt_y = 1.0;
// chain derivates
var derivative_f_wrt_x = derivative_q_wrt_x * derivative_f_wrt_q;
var derivative_f_wrt_y = derivative_q_wrt_y * derivative_f_wrt_q;
data.x = data.x + data.h * derivative_f_wrt_x;
data.y = data.y + data.h * derivative_f_wrt_y;
data.z = data.z + data.h * derivative_f_wrt_z;
return data
};
// Reactive Implementation of Circuit
var inputEmitter = new EventEmitter();
var circuit = Rx.Observable.fromEvent(inputEmitter, 'data');
var circuit = circuit.map(data => { // addGate
data = data || inputs; // defaults
data.q = forwardAddGate(data.x, data.y);
return data
})
.map(data => { // multiplyGate
data.f = forwardMultiplyGate(data.q, data.z);
return data
})
.map(data => { // backward Propagation
inputs = backwardPropagation(data);
return inputs
});
circuit.subscribe(function(data) {
console.log(data);
});
inputEmitter.emit('data', inputs);
inputEmitter.emit('data', inputs);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment