1 /*
2  *  slibshuff.cpp
3  *  Mothur
4  *
5  *  Created by Pat Schloss on 4/8/09.
6  *  Copyright 2009 Patrick D. Schloss. All rights reserved.
7  *
8  */
9 
10 #include "slibshuff.h"
11 
12 /***********************************************************************/
13 
SLibshuff(FullMatrix * D,int it,float co)14 SLibshuff::SLibshuff(FullMatrix* D, int it, float co) : Libshuff(D, it, 0, co){}
15 
16 /***********************************************************************/
17 
evaluatePair(int i,int j)18 float SLibshuff::evaluatePair(int i, int j){
19 	return sCalculate(i,j);
20 }
21 
22 /***********************************************************************/
23 
evaluateAll()24 vector<vector<double> > SLibshuff::evaluateAll(){
25 	try{
26 		savedMins.resize(numGroups);
27 		vector<vector<double> > dCXYValues(numGroups);
28 
29 		for(int i=0;i<numGroups;i++){
30 			dCXYValues[i].resize(numGroups);
31 			savedMins[i].resize(numGroups);
32 			for(int j=0;j<numGroups;j++){
33 				if(i!=j){
34 					dCXYValues[i][j] = sCalculate(i,j);
35 					savedMins[i][j] = minXY;
36 				}
37 
38 				if(savedMins[i][i].size() == 0){
39 					savedMins[i][i] = minX;
40 				}
41 
42 			}
43 		}
44 		return dCXYValues;
45 	}
46 	catch(exception& e) {
47 		m->errorOut(e, "SLibshuff", "evaluateAll");
48 		exit(1);
49 	}
50 }
51 
52 /***********************************************************************/
53 
sCalculate(int x,int y)54 double SLibshuff::sCalculate(int x, int y){
55 	try{
56 		double sum = 0.0,t=0.0;
57 
58 		minX = getMinX(x);
59 
60 		if (m->getControl_pressed()) { return sum; }
61 
62 		minXY = getMinXY(x,y);
63 
64 		if (m->getControl_pressed()) { return sum; }
65 
66 		sort(minX.begin(), minX.end());
67 
68 		if (m->getControl_pressed()) { return sum; }
69 
70 		sort(minXY.begin(), minXY.end());
71 
72 		if (m->getControl_pressed()) { return sum; }
73 
74 		int ix=0,iy=0;
75 		while( (ix < groupSizes[x]) && (iy < groupSizes[x]) ) {
76 			double h = (ix-iy)/double(groupSizes[x]);
77 
78 			if(minX[ix] < minXY[iy]) {
79 				sum += (minX[ix] - t)*h*h;
80 				t = minX[ix++];
81 			}
82 			else {
83 				sum += (minXY[iy] - t)*h*h;
84 				t = minXY[iy++];
85 			}
86 
87 		}
88 
89 		if(ix < groupSizes[x]) {
90 
91 			while(ix < groupSizes[x]) {
92 				double h = (ix-iy)/double(groupSizes[x]);
93 				sum += (minX[ix] - t)*h*h;
94 				t = minX[ix++];
95 			}
96 
97 		}
98 		else {
99 
100 			while(iy < groupSizes[x]) {
101 				double h = (ix-iy)/double(groupSizes[x]);
102 				sum += (minXY[iy] - t)*h*h;
103 				t = minXY[iy++];
104 			}
105 
106 		}
107 
108 		return sum;
109 	}
110 	catch(exception& e) {
111 		m->errorOut(e, "SLibshuff", "sCalculate");
112 		exit(1);
113 	}
114 }
115 
116 /***********************************************************************/
117