var OP_ONE = 'ONE';
var OP_TWO = 'TWO';
var OPKEY = 'opinion';
var changeMindThreshold = 0.8;
function setOpinion(v,op)
{
setVertexData(v,OPKEY,op);
}
function getOpinion(v)
{
if (v)
return v.getUserDatum(OPKEY);
}
function calcOpinion(v)
{
var neighbors = v.getNeighbors().toArray();
var op1Count = 0, op2Count = 0;
for (var i = 0; i < neighbors.length; i++)
{
var neighbor = neighbors[i];
var nOp = getOpinion(neighbor);
// msg('neighbor - ' + neighbor + ': ' + nOp);
if (nOp == OP_ONE)
{
op1Count++;
}
if (nOp == OP_TWO)
{
op2Count++;
}
}
var total = neighbors.length;
var op1Percent = op1Count / total;
var op2Percent = op2Count / total;
msg('op1% = ' + op1Percent);
msg('op2% = ' + op2Percent);
if (op1Percent > changeMindThreshold )
{
setOpinion(v,OP_ONE);
}
else if (op2Percent > changeMindThreshold )
{
setOpinion(v,OP_TWO);
}
}
var changedOp = false;
var prevOps = {};
function randOpinion()
{
var r = Math.random();
msg('random opinion: ' + (r > 0.5 ? OP_ONE : OP_TWO));
return r > 0.5 ? OP_ONE : OP_TWO;
}
function init()
{
applyToVertices
(
function(v)
{
setOpinion(v,randOpinion());
}
);
changedOp = false;
prevOps = {};
applyToVertices(showVertexOpinion);
GraphUI.refreshGraph();
}
function showVertexOpinion(v)
{
if (v)
{
var op = getOpinion(v);
// msg(v + ': ' + op);
var color = 'red';
if (op == OP_ONE)
color = 'blue';
else if (op == OP_TWO)
color = 'white';
setVertexColor(v,color);
setVertexLabel(v,op || 'NONE');
}
}
function keepOpinions()
{
applyToVertices(
function(v)
{
prevOps[v] = getOpinion(v);
}
);
}
function compareOpinions()
{
applyToVertices(
function(v)
{
var currOp = getOpinion(v);
// msg(v + ' currently: ' + currOp);
var prevOp = prevOps[v];
// msg(v + ' previously: ' + prevOp);
changedOp = changedOp || (currOp != prevOp);
}
);
}
var alg = createAlgorithm();
addAlgorithmStep
(
alg,
function()
{
changedOp = false;
keepOpinions(); //remember current opinions
applyToVertices(calcOpinion); //calc all opinions
applyToVertices(showVertexOpinion);
compareOpinions(); //see if any opinion changed
msg("changed op : " + changedOp);
return !changedOp; //stop if no opinion was changed
},
function() { return 0; } //return to the same step
);
setResetFunc(init);
init();
/*
applyToVertices(calcOpinion); //calc all opinions
applyToVertices(showVertexOpinion);
applyToVertices(calcOpinion); //calc all opinions
applyToVertices(showVertexOpinion);
*/
runAlgorithm(alg);