1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
var extend = require('node.extend');

let MI={
	CalcLMI:function(req, res, next){
		let clusterdata = req.body.clusterdata
		let featureslength = req.body.featureslength
		let adjList = req.body.adjList
		let dataset = []
		for(let i=0;i<clusterdata.length;i++){
			for(let m=0;m<clusterdata[i].length;m++){
				dataset[clusterdata[i][m]] = CreateVector(clusterdata.length, i)
			}
		}
		let MeanV = CalcMean(dataset)

		let MI = []
		for(i=0;i<dataset.length;i++){
			MI.push (CalcByi(i,2,MeanV,dataset,featureslength, adjList))
		}

        let resj = JSON.stringify(MI);
        res.send(resj);
	}
}

function CreateVector(length,lebal){
	let a=[]
	for(let i=0;i<length;i++){
		if(i==lebal)
			a.push(1)
		
		else
			a.push(0)
	}
	return a;
}
function CalcMean(vectors){
	let result=null;
	for (let i=0;i<vectors.length;i++){
		if(result==null)
			result = extend( [], vectors[i])
		else{
			for(let m=0;m<vectors[i].length;m++){
				result[m]+=vectors[i][m]
			}
		}
	}
	for(let m=0;m<result.length;m++){
		result[m] = result[m]/vectors.length
	}
	return result
}

function CalcByi(id,adjnum,Mean,dataset,featureslength, adjList){
	let result=0;
	let list = getadjlist(adjnum, 1, new Map(), [id], adjList)
	list.forEach( (weight,thisid)=>{
		result = plusV(result, VmultiN(weight,minusV(dataset[thisid],Mean)))
	})
	result = multiV( result,minusV(dataset[id],Mean))

	//something start
	let something = 0 
	for(let i=0;i<featureslength;i++){
		if ( i != id)
			something += multiV(minusV(dataset[i],Mean), minusV(dataset[i],Mean))
	}
	something = something / (featureslength-1)
	result = result / something
	//something end

	//weight norm
	let weightsum=0
	list.forEach( (weight,thisid)=>{
		weightsum += weight
	})
	result = result / weightsum
	return result
}

function getadjlist(adjnum, weight,result, ids, adjList){
	if (adjnum==1){
		ids.forEach(id=>{
			for(let i=0;i<adjList[id].length;i++){
				if(!result.has(adjList[id][i])) {
					result.set(adjList[id][i],weight)
				}
			}
		})
	}else{
		ids.forEach(id=>{
			for(let i=0;i<adjList[id].length;i++){
				if(!result.has(adjList[id][i])) {
					result.set(adjList[id][i],weight)
				}
			}
			getadjlist(adjnum-1, weight/2,result, adjList[id], adjList)
		})
	}
	return result
}
function VmultiN(n,v){
	let result = extend( [], v)
	for(let i=0 ; i < result.length;i++){
		result[i]*=n
	}
	return result
}

function multiV(v1,v2){
	let result = 0;
	for(let i=0;i<v1.length;i++){
		result += v1[i]* v2[i]
	}
	return result
}
function minusV(v1,v2){
	let result = extend( [], v1)
	for(let i=0 ; i < result.length;i++){
		result[i] = result[i]-v2[i]*1
	}
	return result
}
function plusV(v1,v2){
	if(v1==0){
		return v2;
	}
	let result = extend( [], v1)
	for(let i=0 ; i < result.length;i++){
		result[i] = result[i]+v2[i]*1
	}
	return result;
}



module.exports = MI