File: slibshuff.cpp

package info (click to toggle)
mothur 1.24.1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 7,868 kB
  • sloc: cpp: 110,948; ansic: 2,037; fortran: 665; makefile: 74; sh: 59
file content (116 lines) | stat: -rw-r--r-- 2,359 bytes parent folder | download | duplicates (3)
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
/*
 *  slibshuff.cpp
 *  Mothur
 *
 *  Created by Pat Schloss on 4/8/09.
 *  Copyright 2009 Patrick D. Schloss. All rights reserved.
 *
 */

#include "slibshuff.h"

/***********************************************************************/

SLibshuff::SLibshuff(FullMatrix* D, int it, float co) : Libshuff(D, it, 0, co){}

/***********************************************************************/

float SLibshuff::evaluatePair(int i, int j){
	return sCalculate(i,j);
}

/***********************************************************************/

vector<vector<double> > SLibshuff::evaluateAll(){
	try{
		savedMins.resize(numGroups);
		vector<vector<double> > dCXYValues(numGroups);

		for(int i=0;i<numGroups;i++){
			dCXYValues[i].resize(numGroups);
			savedMins[i].resize(numGroups);
			for(int j=0;j<numGroups;j++){
				if(i!=j){
					dCXYValues[i][j] = sCalculate(i,j);	
					savedMins[i][j] = minXY;
				}

				if(savedMins[i][i].size() == 0){
					savedMins[i][i] = minX;
				}

			}
		}		
		return dCXYValues;
	}
	catch(exception& e) {
		m->errorOut(e, "SLibshuff", "evaluateAll");
		exit(1);
	}
}

/***********************************************************************/

double SLibshuff::sCalculate(int x, int y){
	try{
		double sum = 0.0,t=0.0;
		
		minX = getMinX(x);
		
		if (m->control_pressed) { return sum; }
		
		minXY = getMinXY(x,y);
		
		if (m->control_pressed) { return sum; }

		sort(minX.begin(), minX.end());
		
		if (m->control_pressed) { return sum; }
		
		sort(minXY.begin(), minXY.end());
		
		if (m->control_pressed) { return sum; }

		int ix=0,iy=0;
		while( (ix < groupSizes[x]) && (iy < groupSizes[x]) ) {
			double h = (ix-iy)/double(groupSizes[x]);
			
			if(minX[ix] < minXY[iy]) {
				sum += (minX[ix] - t)*h*h;
				t = minX[ix++];
			}
			else {
				sum += (minXY[iy] - t)*h*h;
				t = minXY[iy++];
			}
			
		}
		
		if(ix < groupSizes[x]) {
			
			while(ix < groupSizes[x]) {
				double h = (ix-iy)/double(groupSizes[x]);
				sum += (minX[ix] - t)*h*h;
				t = minX[ix++];
			}
			
		}
		else {
			
			while(iy < groupSizes[x]) {
				double h = (ix-iy)/double(groupSizes[x]);
				sum += (minXY[iy] - t)*h*h;
				t = minXY[iy++];
			}
			
		}
		
		return sum;
	}
	catch(exception& e) {
		m->errorOut(e, "SLibshuff", "sCalculate");
		exit(1);
	}
}

/***********************************************************************/