210 lines
5.5 KiB
JavaScript
210 lines
5.5 KiB
JavaScript
(function() {
|
|
|
|
// Quick data generator
|
|
Data = function() {
|
|
this.layers = []
|
|
};
|
|
|
|
Data.prototype.add = function(fn) {
|
|
fn = fn ? fn : function(x) { return x; };
|
|
this.layers.push(fn);
|
|
return this;
|
|
};
|
|
|
|
Data.prototype.get = function(domain, step) {
|
|
domain = domain ? domain : [0, 10];
|
|
step = step ? step : 1;
|
|
|
|
var data = []
|
|
for (var i = 0; i < this.layers.length; i++) {
|
|
layer = { label: String.fromCharCode(i + 65), values: [] };
|
|
for (var x = domain[0]; x < domain[1]; x += step) {
|
|
layer.values.push({ x: x, y: this.layers[i](x) });
|
|
}
|
|
data.push(layer);
|
|
}
|
|
return data;
|
|
};
|
|
|
|
Data.prototype.random = function(entries, domain, range) {
|
|
entries = entries ? entries : 50;
|
|
domain = domain ? domain : [0, 100];
|
|
range = range ? range : [0, 100];
|
|
|
|
var values = [];
|
|
for (var i = 0; i < entries; i++) {
|
|
var x = (domain[1] - domain[0]) * Math.random() + domain[0],
|
|
y = (range[1] - range[0]) * Math.random() + range[1];
|
|
values.push({ x: x, y: y });
|
|
}
|
|
|
|
return [{ label: 'A', values: values }];
|
|
};
|
|
|
|
Data.prototype.multiRandom = function(numSeries, entries, domain, range) {
|
|
numSeries = numSeries ? numSeries : 3;
|
|
entries = entries ? entries : 50;
|
|
domain = domain ? domain : [0, 100];
|
|
range = range ? range : [0, 100];
|
|
|
|
var data = [];
|
|
|
|
for (var j = 0; j < numSeries; j++) {
|
|
var layer = { label: String.fromCharCode(65 + j), values: [] };
|
|
for (var i = 0; i < entries; i++) {
|
|
var x = (domain[1] - domain[0]) * Math.random() + domain[0],
|
|
y = (range[1] - range[0]) * Math.random() + range[1];
|
|
layer.values.push({ x: x, y: y });
|
|
}
|
|
data.push(layer);
|
|
}
|
|
|
|
return data;
|
|
};
|
|
|
|
window.data = function() { return new Data(); };
|
|
|
|
|
|
// Quick real-time data generator
|
|
Time = function() {
|
|
Data.call(this);
|
|
};
|
|
|
|
Time.prototype = new Data()
|
|
|
|
Time.prototype.get = function(domain, step) {
|
|
var data = Data.prototype.get.apply(this, arguments),
|
|
time = parseInt(new Date().getTime() / 1000);
|
|
|
|
for (var i = 0; i < data[0].values.length; i++) {
|
|
for (var j = 0; j < this.layers.length; j++) {
|
|
delete data[j].values[i].x;
|
|
data[j].values[i].time = time + i;
|
|
}
|
|
}
|
|
|
|
this.currentTime = time;
|
|
this.lastX = domain[1];
|
|
|
|
return data;
|
|
};
|
|
|
|
Time.prototype.next = function(step) {
|
|
this.currentTime++;
|
|
this.lastX += (step ? step : 1);
|
|
|
|
var data = [];
|
|
for (var j = 0; j < this.layers.length; j++) {
|
|
data.push({ time: this.currentTime, y: this.layers[j](this.lastX) })
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
window.time = function() { return new Time(); };
|
|
|
|
|
|
|
|
|
|
window.nextTime = (function() {
|
|
var currentTime = parseInt(new Date().getTime() / 1000);
|
|
return function() { return currentTime++; }
|
|
})();
|
|
|
|
|
|
/*
|
|
* Normal distribution random histogram data generator.
|
|
*/
|
|
var NormalData = function(layers) {
|
|
this.layers = layers;
|
|
this.timestamp = ((new Date()).getTime() / 1000)|0;
|
|
};
|
|
|
|
var normal = function() {
|
|
var U = Math.random(),
|
|
V = Math.random();
|
|
return Math.sqrt(-2*Math.log(U)) * Math.cos(2*Math.PI*V);
|
|
};
|
|
|
|
NormalData.prototype.sample = function() {
|
|
return parseInt(normal() * 12.5 + 50);
|
|
}
|
|
|
|
NormalData.prototype.rand = function() {
|
|
var histogram = {};
|
|
|
|
for (var i = 0; i < 1000; i ++) {
|
|
var r = this.sample();
|
|
if (!histogram[r]) {
|
|
histogram[r] = 1;
|
|
}
|
|
else {
|
|
histogram[r]++;
|
|
}
|
|
}
|
|
|
|
return histogram;
|
|
};
|
|
|
|
NormalData.prototype.history = function(entries) {
|
|
if (typeof(entries) != 'number' || !entries) {
|
|
entries = 60;
|
|
}
|
|
|
|
var history = [];
|
|
for (var k = 0; k < this.layers; k++) {
|
|
history.push({ label: String.fromCharCode(65+k), values: [] });
|
|
}
|
|
|
|
for (var i = 0; i < entries; i++) {
|
|
for (var j = 0; j < this.layers; j++) {
|
|
history[j].values.push({time: this.timestamp, histogram: this.rand()});
|
|
}
|
|
this.timestamp++;
|
|
}
|
|
|
|
return history;
|
|
};
|
|
|
|
NormalData.prototype.next = function() {
|
|
var entry = [];
|
|
for (var i = 0; i < this.layers; i++) {
|
|
entry.push({ time: this.timestamp, histogram: this.rand() });
|
|
}
|
|
this.timestamp++;
|
|
return entry;
|
|
}
|
|
|
|
window.NormalData = NormalData;
|
|
|
|
|
|
/*
|
|
* Beta distribution histogram data generator.
|
|
*/
|
|
var BetaData = function(alpha, beta, layers) {
|
|
this.alpha = alpha;
|
|
this.beta = beta;
|
|
this.layers = layers;
|
|
this.timestamp = ((new Date()).getTime() / 1000)|0;
|
|
};
|
|
|
|
BetaData.prototype = new NormalData();
|
|
|
|
BetaData.prototype.sample = function() {
|
|
var X = 0,
|
|
Y = 0;
|
|
|
|
for (var j = 1; j <= this.alpha; j++)
|
|
X += -Math.log(1 - Math.random());
|
|
|
|
for (var j = 1; j <= this.beta; j++)
|
|
Y += -Math.log(1 - Math.random());
|
|
|
|
return parseInt(100 * X / (X + Y));
|
|
}
|
|
|
|
window.BetaData = BetaData;
|
|
|
|
})();
|
|
|
|
|