Skip to content

Commit

Permalink
Merge pull request #256 from probmods/stringify-fix
Browse files Browse the repository at this point in the history
Replace JSON.stringify with util.serialize in many places
  • Loading branch information
stuhlmueller committed Oct 20, 2015
2 parents 15b1f42 + 875812b commit 7f34689
Show file tree
Hide file tree
Showing 12 changed files with 34 additions and 29 deletions.
2 changes: 1 addition & 1 deletion src/aggregation.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ var Histogram = function() {
};

Histogram.prototype.add = function(value) {
var k = JSON.stringify(value);
var k = util.serialize(value);
if (this.hist[k] === undefined) {
this.hist[k] = { prob: 0, val: value };
}
Expand Down
12 changes: 6 additions & 6 deletions src/erp.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ ERP.prototype.isSerializeable = function() {
return this.support && !this.parameterized;
};

// ERP serializer (allows JSON.stringify)
// ERP serializer
ERP.prototype.toJSON = function() {
if (this.isSerializeable()) {
var support = this.support([]);
Expand Down Expand Up @@ -548,7 +548,7 @@ function makeMarginalERP(marginal) {
return marginal[i].val;
},
score: function(params, val) {
var lk = marginal[JSON.stringify(val)];
var lk = marginal[util.serialize(val)];
return lk ? Math.log(lk.prob) : -Infinity;
},
support: function(params) {
Expand All @@ -565,14 +565,14 @@ function makeMarginalERP(marginal) {
// note: ps is expected to be normalized
var makeCategoricalERP = function(ps, vs, extraParams) {
var dist = {};
vs.forEach(function(v, i) {dist[JSON.stringify(v)] = {val: v, prob: ps[i]}})
vs.forEach(function(v, i) {dist[util.serialize(v)] = {val: v, prob: ps[i]}})
var categoricalSample = vs.length === 1 ?
function(params) { return vs[0]; } :
function(params) { return vs[multinomialSample(ps)]; };
return new ERP(_.extendOwn({
sample: categoricalSample,
score: function(params, val) {
var lk = dist[JSON.stringify(val)];
var lk = dist[util.serialize(val)];
return lk ? Math.log(lk.prob) : -Infinity;
},
support: function(params) { return vs; },
Expand All @@ -583,9 +583,9 @@ var makeCategoricalERP = function(ps, vs, extraParams) {

// Make a parameterized ERP that selects among multiple (unparameterized) ERPs
var makeMultiplexERP = function(vs, erps) {
var stringifiedVals = vs.map(JSON.stringify);
var stringifiedVals = vs.map(util.serialize);
var selectERP = function(params) {
var stringifiedV = JSON.stringify(params[0]);
var stringifiedV = util.serialize(params[0]);
var i = _.indexOf(stringifiedVals, stringifiedV);
if (i === -1) {
return undefined;
Expand Down
5 changes: 3 additions & 2 deletions src/headerUtils.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use strict';

var serialize = require('./util').serialize

module.exports = function(env) {

Expand All @@ -16,15 +17,15 @@ module.exports = function(env) {
var c = {};
var cf = function(s, k, a) {
var args = Array.prototype.slice.call(arguments, 3);
var stringedArgs = JSON.stringify(args);
var stringedArgs = serialize(args);
if (stringedArgs in c) {
return k(s, c[stringedArgs]);
} else {
var newk = function(s, r) {
if (stringedArgs in c) {
// This can happen when cache is used on recursive functions
console.log('Already in cache:', stringedArgs);
if (JSON.stringify(c[stringedArgs]) !== JSON.stringify(r)) {
if (serialize(c[stringedArgs]) !== serialize(r)) {
console.log('OLD AND NEW CACHE VALUE DIFFER!');
console.log('Old value:', c[stringedArgs]);
console.log('New value:', r);
Expand Down
2 changes: 1 addition & 1 deletion src/inference/asyncpf.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ module.exports = function(env) {
this.activeParticle.weight += Math.log(this.activeParticle.multiplicity);
this.exitedParticles += 1;

var k = JSON.stringify(retval);
var k = util.serialize(retval);
if (this.hist[k] === undefined) this.hist[k] = {prob: 0, val: retval};
this.hist[k].prob += 1;

Expand Down
2 changes: 1 addition & 1 deletion src/inference/enumerate.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ module.exports = function(env) {

Enumerate.prototype.exit = function(s, retval) {
// We have reached an exit of the computation. Accumulate probability into retval bin.
var r = JSON.stringify(retval);
var r = util.serialize(retval);
if (this.score !== -Infinity) {
if (this.marginal[r] === undefined) {
this.marginal[r] = {val: retval, prob: -Infinity};
Expand Down
4 changes: 2 additions & 2 deletions src/inference/incrementalmh.js
Original file line number Diff line number Diff line change
Expand Up @@ -903,7 +903,7 @@ module.exports = function(env) {
if (this.returnSamps)
this.returnSamps.push({score: this.score, value: val})
else {
var stringifiedVal = JSON.stringify(val);
var stringifiedVal = util.serialize(val);
if (this.returnHist[stringifiedVal] === undefined) {
this.returnHist[stringifiedVal] = { prob: 0, val: val };
}
Expand Down Expand Up @@ -948,7 +948,7 @@ module.exports = function(env) {
var hist;
if (this.returnSamps || this.onlyMAP) {
hist = {};
hist[JSON.stringify(this.MAP.value)] = { prob: 1, val: this.MAP.value };
hist[util.serialize(this.MAP.value)] = { prob: 1, val: this.MAP.value };
} else {
hist = this.returnHist;
}
Expand Down
3 changes: 2 additions & 1 deletion src/inference/pmcmc.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

var _ = require('underscore');
var erp = require('../erp');
var util = require('../util')

module.exports = function(env) {

Expand Down Expand Up @@ -167,7 +168,7 @@ module.exports = function(env) {
if (this.sweep > 0) {
this.particles.concat(this.retainedParticle).forEach(
function(particle) {
var k = JSON.stringify(particle.value);
var k = util.serialize(particle.value);
if (this.returnHist[k] === undefined) {
this.returnHist[k] = {prob: 0, val: particle.value};
}
Expand Down
3 changes: 2 additions & 1 deletion src/inference/rejection.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

var erp = require('../erp');
var assert = require('assert');
var util = require('../util')

module.exports = function(env) {

Expand Down Expand Up @@ -62,7 +63,7 @@ module.exports = function(env) {

if (this.scoreSoFar > this.threshold) {
// Accept.
var r = JSON.stringify(retval);
var r = util.serialize(retval);
if (this.hist[r] === undefined) {
this.hist[r] = { prob: 0, val: retval };
}
Expand Down
6 changes: 3 additions & 3 deletions tests/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var _ = require('underscore');
var fs = require('fs');
var assert = require('assert');
var webppl = require('../src/main');

var serialize = require('../src/util').serialize

var getModelNames = function(testDataDir) {
var filenames = fs.readdirSync(testDataDir + 'models/');
Expand All @@ -22,8 +22,8 @@ var loadExpected = function(testDataDir, modelName) {
};

var testEqual = function(test, actual, expected, name) {
var msg = ['Expected ', name, ': ', JSON.stringify(expected),
', actual: ', JSON.stringify(actual)].join('');
var msg = ['Expected ', name, ': ', serialize(expected),
', actual: ', serialize(actual)].join('');
test.ok(_.isEqual(actual, expected), msg);
};

Expand Down
4 changes: 2 additions & 2 deletions tests/test-data/stochastic/expected/cache.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"hist": {
"0": 0.2053648535282959,
"1": 0.794635146471704
"true": 0.9734726625603055,
"false": 0.026527337439694768
}
}
15 changes: 9 additions & 6 deletions tests/test-data/stochastic/models/cache.wppl
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
var e = cache(function(x) {
var weirdFlipERP1 = categoricalERP([0.5, 0.5], [0, Infinity]);
var weirdFlipERP2 = categoricalERP([0.5, 0.5], [0, -Infinity]);

var e = cache(function(erp) {
return Enumerate(function() {
var a = flip(0.5) & flip(0.5);
var a = sample(erp) + sample(erp);
factor(a ? 2 : Math.log(0.3));
return a & x;
return a;
});
});

var model = function() {
var e1 = sample(e(true));
var e2 = sample(e(true));
return e1 & e2;
var e1 = sample(e(weirdFlipERP1));
var e2 = sample(e(weirdFlipERP2));
return _.isNaN(e1 + e2);
};
5 changes: 2 additions & 3 deletions tests/test-inference.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ var webppl = require('../src/main');
var erp = require('../src/erp');
var helpers = require('./helpers');


var testDataDir = './tests/test-data/stochastic/';

var tests = [
Expand Down Expand Up @@ -322,7 +321,7 @@ var performTest = function(modelName, testDef, test) {

var getInferenceArgs = function(testDef, model) {
var args = (testDef.models[model] && testDef.models[model].args) || testDef.settings.args;
return _.isArray(args) ? args.map(JSON.stringify) : JSON.stringify(args);
return _.isArray(args) ? args.map(util.serialize) : util.serialize(args);
};

var testFunctions = {
Expand Down Expand Up @@ -355,7 +354,7 @@ var testFunctions = {
var getHist = function(erp) {
var hist = {};
erp.support().forEach(function(value) {
hist[JSON.stringify(value)] = Math.exp(erp.score([], value));
hist[util.serialize(value)] = Math.exp(erp.score([], value));
});
return util.normalizeHist(hist);
};
Expand Down

0 comments on commit 7f34689

Please sign in to comment.