Files
2026-05-22 11:14:29 +02:00

1323 lines
39 KiB
Plaintext

<snippet>
<subclass>afryca.ase.Snippet</subclass>
<file></file>
<category>Library</category>
<name>consensus</name>
<description></description>
<code>
var consensus = (typeof exports === "undefined")?(function consensus() {}):(exports);
if(typeof global !== "undefined") { global.consensus = consensus; }
/*
Minimum Cost Zhang 2011 using a vector with all experts for one i and j.
*/
consensus.zhang2011minimumcostVector = function zhang2011minimumcost(epsilon, cost, pref){
var stringData="";
var preferencesArray=[];
for(var i=0;i<cost.length;i++){
pref[i]=Math.round(pref[i]*100)/100;
cost[i]=Math.round(cost[i]*100)/100;
}
epsilon=Math.round(epsilon*100)/100;
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var o='o =c(';
var costAux='cost=c(';
for(var i=0;i<pref.length;i++){
costAux+=cost[i];
o+=pref[i];
if(i!=pref.length-1){
costAux+=',';
o+=',';
}
}
o+=');';
costAux+=');';
rengine = ase.evalCode('R', o);
rengine = ase.evalCode('R', costAux);
var n = 'n = length(o);';
rengine = ase.evalCode('R', n);
var epsilonAux='epsilon ='+epsilon+';';
var rengineEpsilon = ase.evalCode('R', epsilonAux);
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
rengine = ase.evalCode('R', fn1);
var ineq1 = 'ineq1 = function(x) { acum = (sum(x) - (max(x) + min(x))) / (n - 2); if(x >= min(x) && x <= max(x)){ return (abs(x - acum));} };';
rengine = ase.evalCode('R', ineq1);
var solnp='sol = solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n), ineqUB = rep(epsilon, n), LB=rep(0,n), UB=rep(1,n));';
rengine = ase.evalCode('R', solnp);
var fin='sol$pars';
rengine = ase.evalCode('R', fin);
stringData+=""+rengine;
stringData=stringData.split("(");
stringData=stringData[1].split(")");
stringData=stringData[0].split(",");
for(var m=0;m<pref.length;m++){
var fl=(parseFloat(stringData[m]));
preferencesArray.push(fl);
}
return preferencesArray;
}
/*
Minimum Cost Zhang 2011 using a vector with all experts for one i and j and weights vector.
*/
consensus.zhang2011minimumcostVectorWeights = function zhang2011minimumcostVectorWeights(epsilon,cost,pref,weights){
for(var i=0;i<cost.length;i++){
pref[i]=Math.round(pref[i]*100)/100;
cost[i]=Math.round(cost[i]*100)/100;
weights[i]=Math.round(weights[i]*1000)/1000;
}
epsilon=Math.round(epsilon*100)/100;
var library ='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var o='o =c(';
var costAux='cost=c(';
var w='weight =c(';
for(var i=0;i<pref.length;i++){
costAux+=cost[i];
o+=pref[i];
w+=weights[i];
if(i!=pref.length-1){
costAux+=',';
o+=',';
w+=',';
}
}
o+=');';
costAux+=');';
w+=');';
rengine = ase.evalCode('R', o);
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', w);
var n = 'n = length(o);';
rengine = ase.evalCode('R', n);
var epsilonAux = 'epsilon ='+epsilon+';';
var rengineEpsilon = ase.evalCode('R', epsilonAux);
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
rengine = ase.evalCode('R', fn1);
var ineq1 = 'ineq1 = function(x) { acum = sum(x * weight); return (abs(x - acum)); };';
rengine = ase.evalCode('R', ineq1);
var solnp ='sol = try(solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n), ineqUB = rep(epsilon, n), LB=rep(0,n), UB=rep(Inf,n), control=list(outer.iter=400,delta = 0.01, tol = 0.01)));';
var rengineSolnp = ase.evalCode('R', solnp);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var fin = 'sol$pars';
rengine = ase.evalCode('R', fin);
var stringData="";
var preferencesArray = new ArrayList();
stringData+=""+rengine;
stringData=stringData.split("(");
stringData=stringData[1].split(")");
stringData=stringData[0].split(",");
for(var m=0;m<pref.length;m++){
preferencesArray.add(stringData[m]);
}
return preferencesArray;
}
/*
Minimum Cost Zhang 2011 using a vector with all experts for one i and j.
Using for recommendation systems Raciel program
return -1 if solution not found or a value if solution is found
*/
consensus.zhang2011minimumcostvectorweightedaverage = function zhang2011minimumcostvectorweightedaverage(epsilon,cost,pref, weights){
var stringData="";
var preferencesArray=[];
for(var i=0;i<cost.length;i++){
pref[i]=Math.round(pref[i]*100)/100;
cost[i]=Math.round(cost[i]*100)/100;
weights[i]=Math.round(weights[i]*100)/100;
}
epsilon=Math.round(epsilon*100)/100;
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var o='o =c(';
var costAux='cost=c(';
var w='weight =c(';
for(var i=0;i<pref.length;i++){
costAux+=cost[i];
o+=pref[i];
w+=weights[i];
if(i!=pref.length-1){
costAux+=',';
o+=',';
w+=',';
}
}
o+=');';
costAux+=');';
w+=');';
rengine = ase.evalCode('R', o);
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', w);
var n = 'n = length(o);';
rengine = ase.evalCode('R', n);
var epsilonAux='epsilon ='+epsilon+';';
var rengineEpsilon = ase.evalCode('R', epsilonAux);
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
rengine = ase.evalCode('R', fn1);
var ineq1 = 'ineq1 = function(x) { acum = sum(x * weight); return (abs(x - acum)); };';
rengine = ase.evalCode('R', ineq1);
var solnp = 'sol = try(solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n), ineqUB = rep(epsilon, n), LB=rep(1, n), UB=rep(5, n), control=list(outer.iter=400,delta = 0.01, tol = 0.01)));';
rengine = ase.evalCode('R', solnp);
var iter='sol$outer.iter';
rengine = ase.evalCode('R', iter);
if(rengine!='[REAL* (400.0)]'){
var fin='sol$pars';
rengine = ase.evalCode('R', fin);
stringData+=""+rengine;
stringData=stringData.split("(");
stringData=stringData[1].split(")");
stringData=stringData[0].split(",");
for(var m=0;m<pref.length;m++){
var fl=(parseFloat(stringData[m]));
preferencesArray.push(fl);
}
return preferencesArray;
}else{
return -1;
}
}
/*
Minimum Cost Zhang 2011 using a vector with all experts for one i and j (including consensus).
*/
consensus.zhang2011minimumcostLinguistic = function zhang2011minimumcostLinguistic(epsilon, alpha, cost, weights, pref){
epsilon = Math.round(epsilon * 100) / 100;
alpha = Math.round(alpha * 100) / 100;
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var o = 'o = c(';
var costAux = 'cost = c(';
var weightsAux = 'weight = c(';
for(var i = 0; i < pref.length; i++){
if(pref[i] == 0) {
pref[i] = 0.01;
}
o += Math.round(pref[i] * 100) / 100;
costAux += Math.round(cost[i]);
weightsAux += Math.round(weights[i] * 100) / 100;
if(i != pref.length - 1){
o += ',';
costAux += ',';
weightsAux += ',';
}
}
o += ');';
costAux += ');';
weightsAux += ');';
rengine = ase.evalCode('R', o);
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', weightsAux);
var n = 'n = length(o);';
rengine = ase.evalCode('R', n);
var epsilonAux='epsilon ='+epsilon+';';
var rengineEpsilon = ase.evalCode('R', epsilonAux);
var alphaAux = 'alpha =' + alpha + ';';
var rengineAlpha = ase.evalCode('R', alphaAux);
var fn1='fn1 = function(x) { sum(cost * abs(o - x)); };';
rengine = ase.evalCode('R', fn1);
var ineq1 = 'ineq1 = function(x) {' +
'collective = (sum(x) - (max(x) + min(x))) / (n - 2);' +
'consensus = sum(weight * abs(x - collective));' +
'result = rep(0, n + 1);' +
'result = c(abs(x - collective), consensus);' +
'return (result);' +
'};';
rengine = ase.evalCode('R', ineq1);
var solnp ='sol = try(solnp(o, fun = fn1, ineqfun = ineq1, ineqLB = rep(0, n + 1), ineqUB = c(rep(epsilon, n), 1 - alpha), LB = rep(0, n), UB = rep(1, n), control = list(outer.iter = 400, delta = 0.01, tol = 0.01)));';
var rengineSolnp = ase.evalCode('R', solnp);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var fin ='sol$pars';
rengine = ase.evalCode('R', fin);
var stringData = "";
var preferencesArray = [];
stringData += "" + rengine;
stringData = stringData.split("(");
stringData = stringData[1].split(")");
stringData = stringData[0].split(",");
for(var m = 0; m < pref.length; m++){
preferencesArray[m] = (Math.round(parseFloat(stringData[m]) * 100) / 100);
}
return preferencesArray;
}
/*
Consensus model Zhang Minimum Cost 2011 with fpr
*/
consensus.zhang2011minimumcost = function (epsilon,cost, pref, alternatives){
epsilon = Math.round(epsilon * 100) / 100;
alternatives = Math.round(alternatives);
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var costAux ='cost = c(';
var o ='preferences = c(';
var fpr;
for(var i = 0;i < pref.length;i++){
fpr = pref[i];
for(var j = 0;j < alternatives;j++){
for(var l = 0;l < alternatives;l++){
if(fpr.getValue(j | 0, l | 0) == 0) {
o += 0.001;
} else {
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
}
o += ',';
}
}
costAux += Math.round(cost[i]);
if(i != pref.length - 1){
costAux += ',';
}
}
o = o.slice(0, -1);
costAux += ');';
o += ');';
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', o);
var n = 'n ='+alternatives+';';
rengine = ase.evalCode('R', n);
var m = 'm ='+cost.length+';';
rengine = ase.evalCode('R', m);
var epsilonAux ='epsilon = '+epsilon+';';
var alternativesAux ='alternatives = '+alternatives+';';
rengine = ase.evalCode('R', epsilonAux);
rengine = ase.evalCode('R', alternativesAux);
var fn1 = 'fn1 <- function(x) {'+
'result = 0;'+
'for(k in 1:m) {'+
'result = result + (cost[k] * computeDistancePreference(x, k));'+
'};'+
'return (result);'+
'};';
rengine = ase.evalCode('R', fn1);
var computeDistancePreference = 'computeDistancePreference = function(x, k) {'+
'acum = 0;'+
'distance = 0;'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - preferences[((i - 1) * n + j) + ((n^2) * (k - 1))])^2;'+
'};'+
'};'+
'distance = sqrt((2/(n*(n-1))) * acum);'+
'return (distance);'+
'};';
rengine = ase.evalCode('R', computeDistancePreference);
var eq1 = 'eq1 = function(x) {'+
'symmetric = rep(0, m * ((n * (n - 1)) / 2));'+
'cont2 = 1;'+
'for(k in 1: m) {'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'symmetric[cont2] = x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + i) + ((n^2) * (k - 1))];'+
'cont2 = cont2 + 1;'+
'};'+
'};'+
'};'+
'diagonal = rep(0, n * m);'+
'cont3 = 1;'+
'for(k in 1: m) {'+
'for(i in 1: n) {'+
'diagonal[cont3] = x[((i - 1) * n + i) + ((n^2) * (k - 1))];'+
'cont3 = cont3 + 1;'+
'};'+
'};'+
'equalities = c(symmetric, diagonal);'+
'return(equalities);'+
'};';
rengine = ase.evalCode('R', eq1);
var ineq1 = 'ineq1 = function(x) {'+
'collective = computeCollective(x);'+
'distance = 0;'+
'for(k in 1:m) {'+
'distance = distance + computeDistanceCollective(x, k, collective);'+
'};'+
'return(distance);'+
'};';
rengine = ase.evalCode('R', ineq1);
var computeCollective = 'computeCollective = function(x) {'+
'acum = 0;'+
'collective = rep(0, n * n);'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'acum = 0;'+
'for(k in 1: m) {'+
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))]);'+
'};'+
'acum = acum/m;'+
'collective[(i - 1) * n + j] = acum;'+
'collective[(j - 1) * n + i] = 1 - acum;'+
'collective[(i - 1) * n + i] = 0.5;'+
'collective[(j - 1) * n + j] = 0.5;'+
'};'+
'};'+
'return (collective);'+
'};';
rengine = ase.evalCode('R', computeCollective);
var computeDistanceCollective = 'computeDistanceCollective <- function(x, k, collective) {'+
'acum = 0;'+
'distance = 0;'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - collective[((i - 1) * n + j)])^2;'+
'};'+
'};'+
'distance = sqrt((2/(n*(n-1))) * acum);'+
'return (distance);'+
'};';
rengine = ase.evalCode('R', computeDistanceCollective);
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = eq1, eqB = c(rep(1, m * ((n * (n - 1)) / 2)), rep(0.5, n * m)), ineqfun = ineq1, ineqLB = 0, ineqUB = epsilon, LB = rep(0, n * n * m), UB = rep(1, n * n * m),control = list(outer.iter = 400, delta = 0.01, tol =0.01, trace = 1)))';
var rengineSolnp = ase.evalCode('R', sol);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var resultsSize = 'resultSize = length(sol$pars);';
rengine = ase.evalCode('R', resultsSize);
var preferencesArray = consensus.transformResults(rengine, cost.length);
var fprsRound = new ArrayList();
var fprRound;
var pr;
for(var k = 0; k < cost.length; k++) {
fprRound = new FPR(alternatives);
fprsRound.add(fprRound);
for(var i = 0; i < (alternatives - 1); i++) {
for(var j = i + 1; j < alternatives; j++) {
pr = preferencesArray[k];
fprRound.setValueSymmetrically(i | 0, j | 0, pr[(i * alternatives + j)]);
}
}
}
return fprsRound;
}
consensus.hliu2018minimumcost = function hongbin2018minimumcost(epsilon, alpha, cost, weights, pref, alternatives, model){
var result;
if(!model) {
result = consensus.distanceToCollective(epsilon, alpha, cost, weights, pref, alternatives);
} else {
result = consensus.distanceToExperts(epsilon, alpha, cost, weights, pref, alternatives);
}
return result;
}
consensus.distanceToCollective = function distanceToCollective(epsilon, alpha, cost, weights, pref, alternatives){
epsilon = Math.round(epsilon * 100) / 100;
alpha = Math.round(alpha * 100) / 100;
gamma = Math.round((1 - alpha)* 100) / 100;
alternatives = Math.round(alternatives);
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var costAux ='cost = c(';
var weightsAux ='weightsExperts = c(';
var o ='preferences = c(';
var fpr;
for(var i = 0;i < pref.length;i++){
fpr = pref[i];
for(var j = 0;j < alternatives - 1;j++){
for(var l = j+1;l < alternatives;l++){
if(fpr.getValue(j | 0, l | 0) == 0) {
o += 0.001;
} else {
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
}
o += ',';
costAux += Math.round(cost[i]);
costAux += ',';
}
}
weightsAux += Math.round(weights[i] * 1000) / 1000;
if(i != pref.length - 1){
weightsAux += ',';
}
}
o = o.slice(0, -1);
costAux = costAux.slice(0, -1);
costAux += ');';
weightsAux += ');';
o += ');';
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', weightsAux);
rengine = ase.evalCode('R', o);
var n = 'n ='+alternatives+';';
rengine = ase.evalCode('R', n);
var m = 'm ='+cost.length+';';
rengine = ase.evalCode('R', m);
var upperDiagonal = 'upperDiagonal =' + ((alternatives * (alternatives - 1)) / 2)+';';
rengine = ase.evalCode('R', upperDiagonal);
var epsilonAux ='epsilon = '+epsilon+';';
var alphaAux ='alpha = '+alpha+';';
var gammaAux ='gamma = '+gamma+';';
var alternativesAux ='alternatives = '+alternatives+';';
rengine = ase.evalCode('R', epsilonAux);
rengine = ase.evalCode('R', alphaAux);
rengine = ase.evalCode('R', gammaAux);
rengine = ase.evalCode('R', alternativesAux);
var fn1 = 'fn1 <- function(x) {'+
'return (sum(cost * abs(x - preferences)));'+
'};';
rengine = ase.evalCode('R', fn1);
var ineq1 = 'ineq1 = function(x) {'+
'collective = computeCollective(x);'+
'distance = rep(0, m * ((n * (n - 1)) / 2));'+
'cont2 = 1;'+
'for(k in 1:m) {'+
'for(i in 1: upperDiagonal) {'+
'distance[cont2] = abs(x[i + (upperDiagonal * (k - 1))] - collective[i]);'+
'cont2 = cont2 + 1;'+
'};'+
'};'+
'consensus = 0;'+
'for(k in 1:m) {'+
'for(i in 1: upperDiagonal) {'+
'consensus = consensus + weightsExperts[k] * abs(x[i + (upperDiagonal * (k - 1))] - collective[i]);'+
'};'+
'};'+
'consensus = (consensus * 2) / (n * (n - 1));'+
'constraints = c(distance, consensus);'+
'return(constraints);'+
'};';
rengine = ase.evalCode('R', ineq1);
var computeCollective = 'computeCollective = function(x) {'+
'acum = 0;'+
'collective = rep(0, (n * (n - 1)));'+
'for(i in 1: upperDiagonal) {'+
'acum = 0;'+
'for(k in 1: m) {'+
'acum = acum + (weightsExperts[k] * x[i + (upperDiagonal * (k - 1))]);'+
'};'+
'collective[i] = acum;'+
'};'+
'return (collective);'+
'};';
rengine = ase.evalCode('R', computeCollective);
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = NULL, eqB = NULL, ineqfun = ineq1, ineqLB = c(rep(0, m * ((n * (n - 1)) / 2)), 0), ineqUB = c(rep(epsilon, m * ((n * (n - 1)) / 2)), gamma), LB = rep(0, ((n * (n - 1)) / 2) * m), UB = rep(Inf, ((n * (n - 1)) / 2) * m), control = list(delta = 0.01, tol = 0.01)))';
var rengineSolnp = ase.evalCode('R', sol);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var lengthSol = 'length(sol$pars);';
var lengthSolRFormat = ase.evalCode('R', lengthSol);
var preferencesArray = consensus.transformResults(lengthSolRFormat, weights.length);
var fprsRound = new ArrayList();
var fprRound;
var pr;
var cont = 0;
for(var k = 0; k < preferencesArray.length; k++) {
fprRound = new FPR(alternatives);
fprsRound.add(fprRound);
cont = 0;
for(var i = 0; i < (alternatives - 1); i++) {
for(var j = i + 1; j < alternatives; j++) {
pr = preferencesArray[k];
fprRound.setValueSymmetrically(i | 0, j | 0, pr[cont]);
cont++;
}
}
}
return fprsRound;
}
consensus.transformResults = function transformResults(lengthSolRFormat, numExperts) {
var fin;
var stringData = "";
var fl;
var preferenceArray = [];
var preferencesArray = [];
var lengthSolString = "" + lengthSolRFormat;
lengthSolString = lengthSolString.replace("[INT* ", "");
lengthSolString = lengthSolString.replace("]", "");
lengthSolString = lengthSolString.replace("(", "");
lengthSolString = lengthSolString.replace(")", "");
var size = parseInt(lengthSolString);
for(var r = 1; r <= size; r++) {
fin = 'sol$pars['+ r +']';
rengine = ase.evalCode('R', fin);
stringData = "" + rengine;
stringData = stringData.replace("[REAL* ", "");
stringData = stringData.replace("]", "");
stringData = stringData.replace("(", "");
stringData = stringData.replace(")", "");
fl= Math.round(parseFloat(stringData) * 100) / 100;
preferenceArray.push(fl);
if(preferenceArray.length == parseInt(size / numExperts)) {
preferencesArray.push(preferenceArray);
preferenceArray = [];
}
}
return preferencesArray;
}
consensus.distanceToExperts = function distanceToExperts(epsilon, alpha, cost, weights, pref, alternatives){
epsilon = Math.round(epsilon * 100) / 100;
alpha = Math.round(alpha * 100) / 100;
gamma = Math.round((1 - alpha)* 100) / 100;
alternatives = Math.round(alternatives);
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var costAux ='cost = c(';
var weightsAux ='weightsExperts = c(';
var o ='preferences = c(';
var fpr;
for(var i = 0;i < pref.length;i++){
fpr = pref[i];
for(var j = 0;j < alternatives - 1;j++){
for(var l = j+1;l < alternatives;l++){
if(fpr.getValue(j | 0, l | 0) == 0) {
o += 0.001;
} else {
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
}
o += ',';
costAux += Math.round(cost[i]);
costAux += ',';
}
}
weightsAux += Math.round(weights[i] * 10000) / 10000;
if(i != pref.length - 1){
weightsAux += ',';
}
}
o = o.slice(0, -1);
costAux = costAux.slice(0, -1);
costAux += ');';
weightsAux += ');';
o += ');';
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', weightsAux);
rengine = ase.evalCode('R', o);
var n = 'n ='+alternatives+';';
rengine = ase.evalCode('R', n);
var m = 'm ='+cost.length+';';
rengine = ase.evalCode('R', m);
var upperDiagonal = 'upperDiagonal =' + ((alternatives * (alternatives - 1)) / 2)+';';
rengine = ase.evalCode('R', upperDiagonal);
var epsilonAux ='epsilon = '+epsilon+';';
var alphaAux ='alpha = '+alpha+';';
var gammaAux ='gamma = '+gamma+';';
var alternativesAux ='alternatives = '+alternatives+';';
rengine = ase.evalCode('R', epsilonAux);
rengine = ase.evalCode('R', alphaAux);
rengine = ase.evalCode('R', gammaAux);
rengine = ase.evalCode('R', alternativesAux);
var fn1 = 'fn1 <- function(x) {'+
'return (sum(cost * abs(x - preferences)));'+
'};';
rengine = ase.evalCode('R', fn1);
var ineq1 = 'ineq1 <- function(x) {'+
'collective = computeCollective(x);'+
'distance = rep(0, m * ((n * (n - 1)) / 2));'+
'cont2 = 1;'+
'for(k in 1:m) {'+
'for(i in 1: upperDiagonal) {'+
'distance[cont2] = abs(x[i + (upperDiagonal * (k - 1))] - collective[i]);'+
'cont2 = cont2 + 1;'+
'};'+
'};'+
'consensus = 0;'+
'for(k in 1:(m-1)) {'+
'for(r in (k+1):m) {'+
'for(i in 1: upperDiagonal) {'+
'consensus = consensus + ((weightsExperts[k] + weightsExperts[r]) / (m - 1)) * abs(x[i + (upperDiagonal * (k - 1))] - x[i + (upperDiagonal * (r - 1))]);'+
'};'+
'};'+
'};'+
'consensus = (consensus * 2) / (n * (n - 1));'+
'constraints = c(distance, consensus);'+
'return(constraints);'+
'};';
rengine = ase.evalCode('R', ineq1);
var computeCollective = 'computeCollective = function(x) {'+
'acum = 0;'+
'collective = rep(0, (n * (n - 1)));'+
'for(i in 1: upperDiagonal) {'+
'acum = 0;'+
'for(k in 1: m) {'+
'acum = acum + (weightsExperts[k] * x[i + (upperDiagonal * (k - 1))]);'+
'};'+
'collective[i] = acum;'+
'};'+
'return (collective);'+
'};';
rengine = ase.evalCode('R', computeCollective);
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = NULL, eqB = NULL, ineqfun = ineq1, ineqLB = c(rep(0, m * ((n * (n - 1)) / 2)), 0), ineqUB = c(rep(epsilon, m * ((n * (n - 1)) / 2)), gamma), LB = rep(0, ((n * (n - 1)) / 2) * m), UB = rep(Inf, ((n * (n - 1)) / 2) * m), control = list(delta = 0.01, tol = 0.01)))';
var rengineSolnp = ase.evalCode('R', sol);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var lengthSol = 'length(sol$pars);';
var lengthSolRFormat = ase.evalCode('R', lengthSol);
var preferencesArray = consensus.transformResults(lengthSolRFormat, weights.length);
var fprsRound = new ArrayList();
var fprRound;
var pr;
var cont = 0;
for(var k = 0; k < preferencesArray.length; k++) {
fprRound = new FPR(alternatives);
fprsRound.add(fprRound);
cont = 0;
for(var i = 0; i < (alternatives - 1); i++) {
for(var j = i + 1; j < alternatives; j++) {
pr = preferencesArray[k];
fprRound.setValueSymmetrically(i | 0, j | 0, pr[cont]);
cont++;
}
}
}
return fprsRound;
}
consensus.Rodriguez2017 = function (epsilon, cost, weights, pref, alternatives){
epsilon = Math.round(epsilon * 100) / 100;
alternatives = Math.round(alternatives);
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var costAux ='cost = c(';
var weightsAux ='weightsExperts = c(';
var o ='preferences = c(';
var fpr;
for(var i = 0;i < pref.length;i++){
fpr = pref[i];
for(var j = 0;j < alternatives;j++){
for(var l = 0;l < alternatives;l++){
if(fpr.getValue(j | 0, l | 0) == 0) {
o += 0.001;
} else {
o += Math.round(fpr.getValue(j | 0, l | 0) * 100) / 100;
}
o += ',';
}
}
costAux += Math.round(cost[i]);
weightsAux += Math.round(weights[i] * 100) / 100;
if(i != pref.length - 1){
costAux += ',';
weightsAux += ',';
}
}
o = o.slice(0, -1);
costAux += ');';
weightsAux += ');';
o += ');';
rengine = ase.evalCode('R', costAux);
rengine = ase.evalCode('R', weightsAux);
rengine = ase.evalCode('R', o);
var n = 'n ='+alternatives+';';
rengine = ase.evalCode('R', n);
var m = 'm ='+cost.length+';';
rengine = ase.evalCode('R', m);
var epsilonAux ='epsilon = '+epsilon+';';
var alternativesAux ='alternatives = '+alternatives+';';
rengine = ase.evalCode('R', epsilonAux);
rengine = ase.evalCode('R', alternativesAux);
var fn1 = 'fn1 <- function(x) {'+
'result = 0;'+
'for(k in 1:m) {'+
'result = result + (cost[k] * computeDistancePreference(x, k));'+
'};'+
'return (result);'+
'};';
rengine = ase.evalCode('R', fn1);
var computeDistancePreference = 'computeDistancePreference = function(x, k) {'+
'acum = 0;'+
'distance = 0;'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - preferences[((i - 1) * n + j) + ((n^2) * (k - 1))])^2;'+
'};'+
'};'+
'distance = sqrt((2/(n*(n-1))) * acum);'+
'return (distance);'+
'};';
rengine = ase.evalCode('R', computeDistancePreference);
var eq1 = 'eq1 = function(x) {'+
'symmetric = rep(0, m * ((n * (n - 1)) / 2));'+
'cont2 = 1;'+
'for(k in 1: m) {'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'symmetric[cont2] = x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + i) + ((n^2) * (k - 1))];'+
'cont2 = cont2 + 1;'+
'};'+
'};'+
'};'+
'diagonal = rep(0, n * m);'+
'cont3 = 1;'+
'for(k in 1: m) {'+
'for(i in 1: n) {'+
'diagonal[cont3] = x[((i - 1) * n + i) + ((n^2) * (k - 1))];'+
'cont3 = cont3 + 1;'+
'};'+
'};'+
'equalities = c(symmetric, diagonal);'+
'return(equalities);'+
'};';
rengine = ase.evalCode('R', eq1);
var ineq1 = 'ineq1 = function(x) {'+
'collective = computeCollective(x);'+
'distance = 0;'+
'for(k in 1:m) {'+
'distance = distance + computeDistanceCollective(x, k, collective);'+
'};'+
'return(distance);'+
'};';
rengine = ase.evalCode('R', ineq1);
var computeCollective = 'computeCollective = function(x) {'+
'acum = 0;'+
'collective = rep(0, n * n);'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'acum = 0;'+
'for(k in 1: m) {'+
'acum = acum + (weightsExperts[k] * (x[((i - 1) * n + j) + ((n^2) * (k - 1))]));'+
'};'+
'acum = acum;'+
'collective[(i - 1) * n + j] = acum;'+
'collective[(j - 1) * n + i] = 1 - acum;'+
'collective[(i - 1) * n + i] = 0.5;'+
'collective[(j - 1) * n + j] = 0.5;'+
'};'+
'};'+
'return (collective);'+
'};';
rengine = ase.evalCode('R', computeCollective);
var computeDistanceCollective = 'computeDistanceCollective <- function(x, k, collective) {'+
'acum = 0;'+
'distance = 0;'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'acum = acum + (x[((i - 1) * n + j) + ((n^2) * (k - 1))] - collective[((i - 1) * n + j)])^2;'+
'};'+
'};'+
'distance = sqrt((2/(n*(n-1))) * acum);'+
'return (distance);'+
'};';
rengine = ase.evalCode('R', computeDistanceCollective);
var sol = 'sol = try(solnp(preferences, fun = fn1, eqfun = eq1, eqB = c(rep(1, m * ((n * (n - 1)) / 2)), rep(0.5, n * m)), ineqfun = ineq1, ineqLB = 0, ineqUB = 1-epsilon, LB = rep(0, n * n * m), UB = rep(Inf, n * n * m), control = list(delta = 0.01, tol = 0.01)))';
var rengineSolnp = ase.evalCode('R', sol);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var resultsSize = 'resultSize = length(sol$pars);';
rengine = ase.evalCode('R', resultsSize);
var preferencesArray = consensus.transformResults(rengine, cost.length);
var fprsRound = new ArrayList();
var fprRound;
var pr;
for(var k = 0; k < cost.length; k++) {
fprRound = new FPR(alternatives);
fprsRound.add(fprRound);
for(var i = 0; i < (alternatives - 1); i++) {
for(var j = i + 1; j < alternatives; j++) {
pr = preferencesArray[k];
fprRound.setValueSymmetrically(i | 0, j | 0, pr[(i * alternatives + j)]);
}
}
}
return fprsRound;
}
consensus.zhang2011LinearOptimization = function zhang2011LinearOptimization(cl, ccl, prefs, numAlternatives, numExperts) {
cl = Math.round(cl * 100) / 100;
ccl = Math.round(ccl * 100) / 100;
var library='library(Rsolnp);';
var rengine = ase.evalCode('R', library);
var preferences='preferencesR = c(';
for(var i = 0;i < prefs.length;i++){
if(prefs[i] == 0) {
prefs[i] = 0.001;
}
preferences+=prefs[i];
if(i != prefs.length - 1){
preferences+=',';
}
}
preferences += ');';
ase.evalCode('R', preferences);
var n = 'n = '+numAlternatives+';';
ase.evalCode('R', n);
var m = 'm = '+numExperts+';';
ase.evalCode('R', m);
var clAux = 'CL = '+cl+';';
ase.evalCode('R', clAux);
var cclAux = 'CCL = '+ccl+';';
ase.evalCode('R', cclAux);
var fn1 ='fn1 = function(x) { acum = 0; for(k in 1:m) { for(i in 1:n) { for(j in 1:n) { acum = acum + abs(preferencesR[((i - 1) * n + j) + ((n^2) * (k - 1))] - x[((i - 1) * n + j) + ((n^2) * (k - 1))]); } } }; return ((1 /((n^2) * m)) * acum); };';
ase.evalCode('R', fn1);
var eq1 = 'eq1 = function(x) {'+
'symmetric = rep(0, m * ((n * (n - 1)) / 2));'+
'cont2 = 1;'+
'for(k in 1: m) {'+
'for(i in 1: (n-1)) {'+
'for(j in (i+1): n) {'+
'symmetric[cont2] = x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + i) + ((n^2) * (k - 1))];'+
'cont2 = cont2 + 1;'+
'};'+
'};'+
'};'+
'diagonal = rep(0, n * m);'+
'cont3 = 1;'+
'for(k in 1: m) {'+
'for(i in 1: n) {'+
'diagonal[cont3] = x[((i - 1) * n + i) + ((n^2) * (k - 1))];'+
'cont3 = cont3 + 1;'+
'};'+
'};'+
'equalities = c(symmetric, diagonal);'+
'return(equalities);'+
'};';
rengine = ase.evalCode('R', eq1);
var ineq1 = 'ineq1 = function(x) { experts = c(1:m); for(k in 1:m) { acum = 0; for(i in 1:n) { for(cc in 1:n) { if(i != cc) { for(j in 1:n) { if(j != i && j != cc) { acum = acum + abs(x[((i - 1) * n + j) + ((n^2) * (k - 1))] + x[((j - 1) * n + cc) + ((n^2) * (k - 1))] - x[((i - 1) * n + cc) + ((n^2) * (k - 1))] - 0.5); } } } } }; experts[k] = acum * (2 / ((3 * n) * (n - 1) * (n - 2))); }; acum2 = 0; for(i in 1:n) { for(j in 1:n) { if(j != i) { for(tt in 1:m) { for(r in 1:m) { if(tt >= r) { acum2 = acum2 + abs(x[((i - 1) * n + j) + ((n^2) * (r - 1))] - x[((i - 1) * n + j) + ((n^2) * (tt - 1))]); } } } } } }; acum2 = acum2 * (2 / ((n * m) * (m - 1) * (n - 1))); return (c(experts, acum2)); };';
rengine = ase.evalCode('R', ineq1);
var preferencesSize = 'psize = length(preferencesR)'
ase.evalCode('R', preferencesSize);
var constraintsLB = 'ineqLBCons = c(rep(0,m), rep(0,1))'
ase.evalCode('R', constraintsLB);
var inverseCL = Math.round((1 - cl) * 100) / 100;
var invclAux = 'invCL = '+inverseCL+';';
ase.evalCode('R', invclAux);
var inverseCCL = Math.round((1 - ccl) * 100) / 100;
var invcclAux = 'invCCL = '+inverseCCL+';';
ase.evalCode('R', invcclAux);
var constraintsUB = 'ineqUBCons = c(rep(invCL,m), rep(invCCL,1))'
rengine = ase.evalCode('R', constraintsUB);
var solnp ='sol = try(solnp(preferencesR, fun = fn1, eqfun = eq1, eqB = c(rep(1, m * ((n * (n - 1)) / 2)), rep(0.5, n * m)) , ineqfun = ineq1, ineqLB = c(rep(0, m), 0), ineqUB = c(rep(invCL, m), invCCL), LB = rep(0, length(preferencesR)), UB = rep(Inf, length(preferencesR)), control = list(delta = 0.01, tol = 0.01)));';
var rengineSolnp = ase.evalCode('R', solnp);
rengine = ase.evalCode('R', 'class(sol)');
if ((rengine.asString()).equals("try-error")) {
print(rengineSolnp.asString());
}
var resultsSize = 'resultSize = length(sol$pars);';
rengine = ase.evalCode('R', resultsSize);
var preferencesArray = consensus.transformResults(rengine, numExperts);
var fprsRound = new ArrayList();
var fprRound;
var pr;
for(var k = 0; k < numExperts; k++) {
fprRound = new FPR(numAlternatives);
fprsRound.add(fprRound);
for(var i = 0; i < (numAlternatives - 1); i++) {
for(var j = i + 1; j < numAlternatives; j++) {
pr = preferencesArray[k];
fprRound.setValueSymmetrically(i | 0, j | 0, pr[(i * numAlternatives + j)]);
}
}
}
return fprsRound;
}
consensus.groupPreferences = function groupPreferences(experts, alternatives, preferences) {
if(preferences.length % experts != 0){
var pref=[];
for(var i=0;i < experts;i++){
pref.push(preferences[i]);
}
preferences = [];
preferences = pref;
}
if(preferences.length == experts){
return consensus.group(experts, alternatives, preferences);
} else {
var result =[];
var numCriteria=preferences.length/experts;
for(var c=0;c<numCriteria;c++){
result[c]=new FPR(alternatives);
for (var i = 0; i < (alternatives - 1); i++) {
for (var j = i+1; j < alternatives; j++) {
var aux = 0;
for (var expert = 0; expert < experts; expert++) {
var k=(expert*numCriteria)+c;
aux += (Math.round(preferences[k].getValue(i | 0, j | 0)*10000)/10000);
}
aux /= experts;
result[c].setValueSymmetrically(i | 0, j | 0, aux);
}
}
}
return consensus.group(numCriteria, alternatives, result);
}
}
consensus.group = function group(experts, alternatives, preferences){
var result = new FPR(alternatives);
var aux;
for (var i = 0; i < (alternatives - 1); i++) {
for (var j = i+1; j < alternatives; j++) {
aux = 0;
for (var expert = 0; expert < experts; expert++) {
aux += (Math.round(preferences[expert].getValue(i | 0, j | 0)*10000)/10000);
}
aux /= experts;
result.setValueSymmetrically(i | 0, j | 0, (Math.round(aux*10000)/10000));
}
}
return result;
}
consensus.groupPreferencesMPR = function groupPreferences(experts, alternatives, preferences) {
if(preferences.length%experts !=0){
var pref=[];
for(var i=0;i<experts;i++){
pref.push(preferences[i]);
}
preferences=[];
preferences=pref;
}
if(preferences.length==experts){
return consensus.groupMPR(experts, alternatives, preferences);
} else {
var result =[];
var numCriteria=preferences.length/experts;
for(var c=0;c<numCriteria;c++){
result[c]=new MPR(alternatives);
for (var i = 0; i < (alternatives ); i++) {
for (var j = 0; j < alternatives; j++) {
var aux = 0;
for (var expert = 0; expert < experts; expert++) {
var k=(expert*numCriteria)+c;
aux += (Math.round(preferences[k].getValue(i | 0, j | 0)*10000)/10000);
}
aux /= experts;
result[c].setValueToPairOfAlternatives(i | 0, j | 0, aux);
}
}
}
return consensus.groupMPR(numCriteria, alternatives, result);
}
}
consensus.groupMPR=function(experts, alternatives, preferences){
var result = new MPR(alternatives);
var aux;
for (var i = 0; i < (alternatives); i++) {
for (var j = 0; j < alternatives; j++) {
aux = 0;
for (var expert = 0; expert < experts; expert++) {
aux += (Math.round(preferences[expert].getValue(i | 0, j | 0)*10000)/10000);
}
aux /= experts;
result.setValueToPairOfAlternatives(i | 0, j | 0, (Math.round(aux*10000)/10000));
}
}
return result;
}
/*
consensus.HierarchicalClustering(hpr,numElements)
Recibe un array de elementos(hpr)
Numero de cluster a obtener(numElements)
Devuelve una matriz con dos filas y tantas columnas como elementos tenga hpr.
En la fila 0 de la matriz obtenemos a que cluster pertenece cada elemento de la fila 1
Ejemplo:
matriz[0] = 1,1,1,2,2,2,2,3,3,3, 4, 4, 4
matriz[1] = 9,8,7,6,5,4,3,2,1,10,11,12,13
Esto quiere decir que:
el elemento 9 del array hpr esta en el cluster 1
el elemento 8 del array hpr esta en el cluster 1
...
el elemento 6 del array hpr esta en el cluster 2
...
el elemento 11 del array hpr esta en el cluster 4
*/
consensus.HierarchicalClustering = function HierarchicalClustering(hpr,numElements){
var stringData="";
var preferencesArray=[];
var numElements=Math.round(numElements);
var prefR='preferences =c(';
for(var i=0;i<hpr.length;i++){
prefR+=Math.round(hpr[i]*100)/100;
if(i!=hpr.length-1){
prefR+=',';
}
}
prefR+=');';
rengine = ase.evalCode('R', prefR);
var distance = 'd = dist(preferences,method="euclidean");';
rengine = ase.evalCode('R', distance);
var clusters='clusters = hclust(d,method="ward.D")';
rengine = ase.evalCode('R', clusters);
var cut = 'groups = cutree(clusters,k='+numElements+')';
rengine = ase.evalCode('R', cut);
var elementsCl = 'elementsCl<-groups[clusters$order]';
rengine = ase.evalCode('R', elementsCl);
var arrayECluster=consensus.transformResultsInteger('elementsCl',hpr.length);
var elementsO = 'clusters$order';
var elementsOrder = consensus.transformResultsInteger(elementsO,hpr.length);
var result=[];
result[0]=[];
result[1]=[];
for(var i=0;i<hpr.length;i++){
result[0][i]=arrayECluster[i]-1;
result[1][i]=elementsOrder[i]-1;
}
return result;
}
consensus.transformResultsInteger = function transformResultsInteger(funcR,numE) {
var fin;
var stringData = "";
var fl;
var preferenceArray = [];
for(var r = 1; r <= numE; r++) {
fin = funcR+'['+ r +']';
rengine = ase.evalCode('R', fin);
stringData = "" + rengine;
stringData = stringData.replace("[INT* ", "");
stringData = stringData.replace("]", "");
stringData = stringData.replace("(", "");
stringData = stringData.replace(")", "");
fl= Math.round(parseFloat(stringData));
preferenceArray.push(fl);
}
return preferenceArray;
}
consensus
</code>
</snippet>