// Path: LUDecomposition/src/lud/Utils.java
// public class Utils {
// 	
// 	public static String arrayToCSV(Double[] nVal2) {
//         String result = "";
// 
//         if (nVal2.length > 0) {
//             StringBuilder sb = new StringBuilder();
// 
//             for (Double s : nVal2) {
//                 sb.append(s).append(",");
//             }
// 
//             result = sb.deleteCharAt(sb.length() - 1).toString();
//         }
//         return result;
//     }
// 	
// 	public static Double[] stringToDoubleArray(String[] a) {
// 		Double[] x = new Double[a.length];
// 		for(int i = 0; i < a.length ; i++)
// 			x[i] = Double.valueOf(a[i]);
// 		return x;
// 	}
// 
// 	public static void storeToHDFS(String data, String output, Configuration conf) throws IOException {
// 		
// 		FileSystem hdfs=FileSystem.get(conf);
// 		Path find_nth_row_output_path = new Path(conf.get("find_nth_row_output"));
// 		try {
// 		    if (hdfs.exists(find_nth_row_output_path)) {
// 		        hdfs.delete(find_nth_row_output_path, true);
// 		    }
// 		    DataOutputStream outStream = hdfs.create(find_nth_row_output_path);
// 		    BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(outStream, "UTF-8" ) );
// 		    bw.write(data);
// 		    bw.close();
// 		    hdfs.close();
// 		    outStream.close();
// 		}
// 		catch (Exception e) {
// 			System.out.println(e.getMessage());
// 		}
// 	}
// 
// 	public static String readFromHDFS(String path, Configuration conf) throws IOException {
// 		
// 		FileSystem hdfs=FileSystem.get(conf);
// 		BufferedReader br = new BufferedReader(new InputStreamReader(hdfs.open(new Path(path))));
// 		String records = br.readLine().trim();
// 		br.close();
// 		hdfs.close();
// 		
// 		return records;
// 	}
// }
// 
// Path: LUDecomposition/src/lud/io/TextPair.java
// public class TextPair implements WritableComparable<TextPair> {
// 	
// 	private String t1;
// 	private String t2;
// 	
// 	public String getFirst() {
// 		return this.t1;
// 	}
// 	
// 	public String getSecond() {
// 		return this.t2;
// 	}
// 
// 	@Override
// 	public void readFields(DataInput in) throws IOException {
// 		this.t1 = in.readUTF();
// 		this.t2 = in.readUTF();
// 	}
// 
// 	@Override
// 	public void write(DataOutput out) throws IOException {
// 		out.writeUTF(this.t1);
// 		out.writeUTF(this.t2);
// 	}
// 	
// 	public TextPair() {
//         this.t1 = new String();
//         this.t2 = new String();
//     }
// 	
// 	public TextPair(String t1, String t2) {
//         this.t1 = new String(t1);
//         this.t2 = new String(t2);
//     }
// 	
// 	public int compareTo(TextPair tp) {
//         int sortKey = this.t1.compareTo(tp.getFirst());
//         if (sortKey == 0) {
//         	sortKey = this.t2.compareTo(tp.getSecond());
//         }
//         return sortKey;
//     }
// 	
// 	public String toString () {
// 		String s = "";
// 		if (this.t2.compareTo("") == 0) {
// 			s += this.t1;
// 		}
// 		else {
// 			s += this.t1 + "," + this.t2;
// 		}
// 		return s;
// 	}
// 	
// }


import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import lud.Utils;
import lud.io.TextPair;
	@Override
	public void setup (Context context) {
		this.upper = context.getConfiguration().getBoolean("upper", false);
		this.total_records = (int) context.getConfiguration().getLong("total_records", 0);
	}
	
	public static String arrayToCSV(String[] a) {
        String result = "";
        if (a.length > 0) {
            StringBuilder sb = new StringBuilder();
            for (String s : a) {
                sb.append(s).append(",");
            }
            result = sb.deleteCharAt(sb.length() - 1).toString();
        }
        return result;
    }
	
	public void reduce(TextPair key, Iterable<Text> values, Context context)
			throws IOException, InterruptedException {
		if (this.upper) {
			for (Text val:values) {
				context.write(new TextPair(key.getFirst(),""), val);
			}
		}
		else {
			Double[] rowElements = new Double[this.total_records];
			int row = Integer.valueOf(key.getFirst());
			for (Text val:values) {
				String[] parts = val.toString().split(",");
// Path: LUDecomposition/src/lud/Utils.java
// public class Utils {
// 	
// 	public static String arrayToCSV(Double[] nVal2) {
//         String result = "";
// 
//         if (nVal2.length > 0) {
//             StringBuilder sb = new StringBuilder();
// 
//             for (Double s : nVal2) {
//                 sb.append(s).append(",");
//             }
// 
//             result = sb.deleteCharAt(sb.length() - 1).toString();
//         }
//         return result;
//     }
// 	
// 	public static Double[] stringToDoubleArray(String[] a) {
// 		Double[] x = new Double[a.length];
// 		for(int i = 0; i < a.length ; i++)
// 			x[i] = Double.valueOf(a[i]);
// 		return x;
// 	}
// 
// 	public static void storeToHDFS(String data, String output, Configuration conf) throws IOException {
// 		
// 		FileSystem hdfs=FileSystem.get(conf);
// 		Path find_nth_row_output_path = new Path(conf.get("find_nth_row_output"));
// 		try {
// 		    if (hdfs.exists(find_nth_row_output_path)) {
// 		        hdfs.delete(find_nth_row_output_path, true);
// 		    }
// 		    DataOutputStream outStream = hdfs.create(find_nth_row_output_path);
// 		    BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(outStream, "UTF-8" ) );
// 		    bw.write(data);
// 		    bw.close();
// 		    hdfs.close();
// 		    outStream.close();
// 		}
// 		catch (Exception e) {
// 			System.out.println(e.getMessage());
// 		}
// 	}
// 
// 	public static String readFromHDFS(String path, Configuration conf) throws IOException {
// 		
// 		FileSystem hdfs=FileSystem.get(conf);
// 		BufferedReader br = new BufferedReader(new InputStreamReader(hdfs.open(new Path(path))));
// 		String records = br.readLine().trim();
// 		br.close();
// 		hdfs.close();
// 		
// 		return records;
// 	}
// }
// 
// Path: LUDecomposition/src/lud/io/TextPair.java
// public class TextPair implements WritableComparable<TextPair> {
// 	
// 	private String t1;
// 	private String t2;
// 	
// 	public String getFirst() {
// 		return this.t1;
// 	}
// 	
// 	public String getSecond() {
// 		return this.t2;
// 	}
// 
// 	@Override
// 	public void readFields(DataInput in) throws IOException {
// 		this.t1 = in.readUTF();
// 		this.t2 = in.readUTF();
// 	}
// 
// 	@Override
// 	public void write(DataOutput out) throws IOException {
// 		out.writeUTF(this.t1);
// 		out.writeUTF(this.t2);
// 	}
// 	
// 	public TextPair() {
//         this.t1 = new String();
//         this.t2 = new String();
//     }
// 	
// 	public TextPair(String t1, String t2) {
//         this.t1 = new String(t1);
//         this.t2 = new String(t2);
//     }
// 	
// 	public int compareTo(TextPair tp) {
//         int sortKey = this.t1.compareTo(tp.getFirst());
//         if (sortKey == 0) {
//         	sortKey = this.t2.compareTo(tp.getSecond());
//         }
//         return sortKey;
//     }
// 	
// 	public String toString () {
// 		String s = "";
// 		if (this.t2.compareTo("") == 0) {
// 			s += this.t1;
// 		}
// 		else {
// 			s += this.t1 + "," + this.t2;
// 		}
// 		return s;
// 	}
// 	
// }


// Path: LUDecomposition/src/lud/naiveGaussian/mergeResults/merge_results_reducer.java
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import lud.Utils;
import lud.io.TextPair;

	@Override
	public void setup (Context context) {
		this.upper = context.getConfiguration().getBoolean("upper", false);
		this.total_records = (int) context.getConfiguration().getLong("total_records", 0);
	}
	
	public static String arrayToCSV(String[] a) {
        String result = "";
        if (a.length > 0) {
            StringBuilder sb = new StringBuilder();
            for (String s : a) {
                sb.append(s).append(",");
            }
            result = sb.deleteCharAt(sb.length() - 1).toString();
        }
        return result;
    }
	
	public void reduce(TextPair key, Iterable<Text> values, Context context)
			throws IOException, InterruptedException {
		if (this.upper) {
			for (Text val:values) {
				context.write(new TextPair(key.getFirst(),""), val);
			}
		}
		else {
			Double[] rowElements = new Double[this.total_records];
			int row = Integer.valueOf(key.getFirst());
			for (Text val:values) {
				String[] parts = val.toString().split(",");
				int j = Integer.valueOf(parts[0]);