+/**************************************************************************/
+//print out matrix
+void FullMatrix::printMinsForRows(ostream& out) {
+ try{
+ for (int j = 0; j < minsForRows.size(); j++) {
+ out << minsForRows[j] << " ";
+ }
+ out << endl;
+
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function printMatrix. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the FullMatrix class function printMatrix. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+
+}
+/**************************************************************************/
+//shuffles the sequences in the 2 groups passed in.
+void FullMatrix::shuffle(int box){
+ try{
+ vector<int> rows2Swap;
+ vector<int> shuffled;
+ float y = 0;
+ string name = "";
+
+ /****************************/
+ //find the box the user wants
+ /****************************/
+ int count = 0;
+ int lowBoundy = bounds[0]; //where first group starts
+ int highBoundy = bounds[1]; //where second group starts
+ int county = 1; //index in bound
+
+ //find the bounds for the box the user wants
+ for (int i = 0; i < (numGroups * numGroups); i++) {
+
+ //are you at the box?
+ if (count == box) { break; }
+ else { count++; }
+
+ //move to next box
+ if (county < numGroups) {
+ county++;
+ highBoundy = bounds[county];
+ lowBoundy = bounds[county-1];
+ }else{ //you are moving to a new row of "boxes"
+ county = 1;
+ highBoundy = bounds[county];
+ lowBoundy = bounds[county-1];
+ }
+ }
+
+ /************************/
+ //save its rows locations
+ /************************/
+ //go through the matrix map to find the rows from groups you want to randomize
+ for (int y = lowBoundy; y < highBoundy; y++) {
+ rows2Swap.push_back(y);
+ shuffled.push_back(y);
+ }
+
+ //randomize rows to shuffle in shuffled
+ random_shuffle(shuffled.begin(), shuffled.end());
+
+ /***************************************/
+ //swap rows and columns to randomize box
+ /***************************************/
+ for (int i = 0; i < shuffled.size(); i++) {
+ //record the swaps you are making so you can undo them in restore function
+ restoreIndex[i].a = shuffled[i];
+ restoreIndex[i].b = rows2Swap[i];
+
+ /* swap rows*/
+ for (int h = 0; h < numSeqs; h++) {
+ y = matrix[shuffled[i]][h];
+ matrix[shuffled[i]][h] = matrix[rows2Swap[i]][h];
+ matrix[rows2Swap[i]][h] = y;
+ }
+
+ /* swap columns */
+ for (int b = 0; b < numSeqs; b++) {
+ y = matrix[b][shuffled[i]];
+ matrix[b][shuffled[i]] = matrix[b][rows2Swap[i]];
+ matrix[b][rows2Swap[i]] = y;
+ }
+
+ //swap map elements
+ name = index[shuffled[i]].seqName;
+ index[shuffled[i]].seqName = index[rows2Swap[i]].seqName;
+ index[rows2Swap[i]].seqName = name;
+ }
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function shuffle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the FullMatrix class function shuffle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+}
+/**************************************************************************/
+//unshuffles the matrix.
+void FullMatrix::restore(){
+ try{
+ float y = 0;
+ string name = "";
+
+ //reverse iterate through swaps and undo them to restore original matrix and index map.
+ for(it2 = restoreIndex.rbegin(); it2 != restoreIndex.rend(); it2++) {
+ /* swap rows */
+ for (int h = 0; h < numSeqs; h++) {
+ y = matrix[it2->second.a][h];
+ matrix[it2->second.a][h] = matrix[it2->second.b][h];
+ matrix[it2->second.b][h] = y;
+ }
+
+ /* swap columns */
+ for (int b = 0; b < numSeqs; b++) {
+ y = matrix[b][it2->second.a];
+ matrix[b][it2->second.a] = matrix[b][it2->second.b];
+ matrix[b][it2->second.b] = y;
+ }
+
+
+ //swap map elements
+ name = index[it2->second.a].seqName;
+ index[it2->second.a].seqName = index[it2->second.b].seqName;
+ index[it2->second.b].seqName = name;
+ }
+
+ //clear restore for next shuffle
+ restoreIndex.clear();
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the FullMatrix class function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+}
+/**************************************************************************/
+void FullMatrix::getDist(vector<float>& distances) {
+ try{
+ map<float, float> dist; //holds the distances for the integral form
+ map<float, float>::iterator it;
+
+ /************************************************************/
+ //fill the minsForRows vectors for each group the user wants
+ /************************************************************/
+ int lowBoundx = bounds[0]; //where first group starts
+ int lowBoundy = bounds[0];
+ int highBoundx = bounds[1]; //where second group starts
+ int highBoundy = bounds[1];
+
+ int countx = 1; //index in bound
+ int county = 1; //index in bound
+
+ //go through each "box" in the matrix
+ for (int i = 0; i < (numGroups * numGroups); i++) {
+ //each row in the box
+ for (int x = lowBoundx; x < highBoundx; x++) {
+ float min4Row = 100000.0;
+ //each entry in that row
+ for (int y = lowBoundy; y < highBoundy; y++) {
+ //if you are not on the diagonal and you are less than previous minimum
+ if ((x != y) && (matrix[x][y] < min4Row)){
+ min4Row = matrix[x][y];
+ }
+ }
+ //save minimum value
+ dist[min4Row] = min4Row;
+ }
+
+ //****** reset bounds to process next "box" ********
+ //if you still have more "boxes" in that row
+ if (county < numGroups) {
+ county++;
+ highBoundy = bounds[county];
+ lowBoundy = bounds[county-1];
+ }else{ //you are moving to a new row of "boxes"
+ county = 1;
+ countx++;
+ highBoundx = bounds[countx];
+ lowBoundx = bounds[countx-1];
+ highBoundy = bounds[county];
+ lowBoundy = bounds[county-1];
+ }
+ }
+
+ //store distances in users vector
+ for (it = dist.begin(); it != dist.end(); it++) {
+ distances.push_back(it->first);
+ }
+
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the FullMatrix class function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+}
+