Author: yxjiang
Date: Tue Sep 24 14:49:52 2013
New Revision: 1525911
URL: http://svn.apache.org/r1525911
Log:
HAMA-804: Create NeuralNetwork Example.
Added:
hama/trunk/examples/src/main/java/org/apache/hama/examples/NeuralNetwork.java
hama/trunk/examples/src/test/java/org/apache/hama/examples/NeuralNetworkTest.java
hama/trunk/examples/src/test/resources/neuralnets_classification_label.txt
hama/trunk/examples/src/test/resources/neuralnets_classification_test.txt
hama/trunk/examples/src/test/resources/neuralnets_classification_training.txt
Modified:
hama/trunk/CHANGES.txt
hama/trunk/examples/src/main/java/org/apache/hama/examples/ExampleDriver.java
Modified: hama/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hama/trunk/CHANGES.txt?rev=1525911&r1=1525910&r2=1525911&view=diff
==============================================================================
--- hama/trunk/CHANGES.txt (original)
+++ hama/trunk/CHANGES.txt Tue Sep 24 14:49:52 2013
@@ -3,7 +3,7 @@ Hama Change Log
Release 0.6.3 (unreleased changes)
NEW FEATURES
-
+ HAMA-804: Create NeuralNetwork Example (Yexi Jiang)
HAMA-795: Implement Autoencoder based on NeuralNetwork (Yexi Jiang)
HAMA-767: Add vertex addition/removal APIs (Anastasis Andronidis via
edwardyoon)
HAMA-594: Semi-Clustering Algorithm Implementation (Renil Jeseph via
edwardyoon)
Modified:
hama/trunk/examples/src/main/java/org/apache/hama/examples/ExampleDriver.java
URL:
http://svn.apache.org/viewvc/hama/trunk/examples/src/main/java/org/apache/hama/examples/ExampleDriver.java?rev=1525911&r1=1525910&r2=1525911&view=diff
==============================================================================
---
hama/trunk/examples/src/main/java/org/apache/hama/examples/ExampleDriver.java
(original)
+++
hama/trunk/examples/src/main/java/org/apache/hama/examples/ExampleDriver.java
Tue Sep 24 14:49:52 2013
@@ -39,6 +39,7 @@ public class ExampleDriver {
pgd.addClass("semi", SemiClusterJobDriver.class, "Semi Clustering");
pgd.addClass("kmeans", Kmeans.class, "K-Means Clustering");
pgd.addClass("gd", GradientDescentExample.class, "Gradient Descent");
+ pgd.addClass("neuralnets", NeuralNetwork.class, "Neural Network
classification");
pgd.addClass("gen", Generator.class, "Random Data Generator Util");
pgd.driver(args);
Added:
hama/trunk/examples/src/main/java/org/apache/hama/examples/NeuralNetwork.java
URL:
http://svn.apache.org/viewvc/hama/trunk/examples/src/main/java/org/apache/hama/examples/NeuralNetwork.java?rev=1525911&view=auto
==============================================================================
---
hama/trunk/examples/src/main/java/org/apache/hama/examples/NeuralNetwork.java
(added)
+++
hama/trunk/examples/src/main/java/org/apache/hama/examples/NeuralNetwork.java
Tue Sep 24 14:49:52 2013
@@ -0,0 +1,197 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hama.examples;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hama.ml.ann.SmallLayeredNeuralNetwork;
+import org.apache.hama.ml.math.DenseDoubleVector;
+import org.apache.hama.ml.math.DoubleVector;
+import org.apache.hama.ml.math.FunctionFactory;
+
+/**
+ *
+ *
+ */
+public class NeuralNetwork {
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 3) {
+ printUsage();
+ return;
+ }
+ String mode = args[0];
+ if (mode.equalsIgnoreCase("label")) {
+ if (args.length < 4) {
+ printUsage();
+ return;
+ }
+
+ String modelPath = args[1];
+ String featureDataPath = args[2];
+ String resultDataPath = args[3];
+
+ SmallLayeredNeuralNetwork ann = new SmallLayeredNeuralNetwork(modelPath);
+
+ // process data in streaming approach
+ FileSystem fs = FileSystem.get(new URI(featureDataPath), new
Configuration());
+ BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(new
Path(featureDataPath))));
+ Path outputPath = new Path(resultDataPath);
+ if (fs.exists(outputPath)) {
+ fs.delete(outputPath, true);
+ }
+ BufferedWriter bw = new BufferedWriter(new
OutputStreamWriter(fs.create(outputPath)));
+
+ String line = null;
+
+ while ((line = br.readLine()) != null) {
+ if (line.trim().length() == 0) {
+ continue;
+ }
+ String[] tokens = line.trim().split(",");
+ double[] vals = new double[tokens.length];
+ for (int i = 0; i < tokens.length; ++i) {
+ vals[i] = Double.parseDouble(tokens[i]);
+ }
+ DoubleVector instance = new DenseDoubleVector(vals);
+ DoubleVector result = ann.getOutput(instance);
+ double[] arrResult = result.toArray();
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < arrResult.length; ++i) {
+ sb.append(arrResult[i]);
+ if (i != arrResult.length - 1) {
+ sb.append(",");
+ }
+ else {
+ sb.append("\n");
+ }
+ }
+ bw.write(sb.toString());
+ }
+
+ br.close();
+ bw.close();
+ }
+ else if (mode.equals("train")) {
+ if (args.length < 5) {
+ printUsage();
+ return;
+ }
+
+ String trainingDataPath = args[1];
+ String trainedModelPath = args[2];
+
+ int featureDimension = Integer.parseInt(args[3]);
+ int labelDimension = Integer.parseInt(args[4]);
+
+ int iteration = 1000;
+ double learningRate = 0.4;
+ double momemtumWeight = 0.2;
+ double regularizationWeight = 0.01;
+
+ // parse parameters
+ if (args.length >= 6) {
+ try {
+ iteration = Integer.parseInt(args[5]);
+ System.out.printf("Iteration: %d\n", iteration);
+ } catch (NumberFormatException e) {
+ System.err.println("MAX_ITERATION format invalid. It should be a
positive number.");
+ return;
+ }
+ }
+ if (args.length >= 7) {
+ try {
+ learningRate = Double.parseDouble(args[6]);
+ System.out.printf("Learning rate: %f\n", learningRate);
+ } catch (NumberFormatException e) {
+ System.err.println("LEARNING_RATE format invalid. It should be a
positive double in range (0, 1.0)");
+ return;
+ }
+ }
+ if (args.length >= 8) {
+ try {
+ momemtumWeight = Double.parseDouble(args[7]);
+ System.out.printf("Momemtum weight: %f\n", momemtumWeight);
+ } catch (NumberFormatException e) {
+ System.err.println("MOMEMTUM_WEIGHT format invalid. It should be a
positive double in range (0, 1.0)");
+ return;
+ }
+ }
+ if (args.length >= 9) {
+ try {
+ regularizationWeight = Double.parseDouble(args[8]);
+ System.out.printf("Regularization weight: %f\n",
regularizationWeight);
+ } catch (NumberFormatException e) {
+ System.err.println("REGULARIZATION_WEIGHT format invalid. It should
be a positive double in range (0, 1.0)");
+ return;
+ }
+ }
+
+ // train the model
+ SmallLayeredNeuralNetwork ann = new SmallLayeredNeuralNetwork();
+ ann.setLearningRate(learningRate);
+ ann.setMomemtumWeight(momemtumWeight);
+ ann.setRegularizationWeight(regularizationWeight);
+ ann.addLayer(featureDimension, false,
+ FunctionFactory.createDoubleFunction("Sigmoid"));
+ ann.addLayer(featureDimension, false,
+ FunctionFactory.createDoubleFunction("Sigmoid"));
+ ann.addLayer(labelDimension, true,
FunctionFactory.createDoubleFunction("Sigmoid"));
+ ann.setCostFunction(FunctionFactory
+ .createDoubleDoubleFunction("CrossEntropy"));
+ ann.setModelPath(trainedModelPath);
+
+ Map<String, String> trainingParameters = new HashMap<String, String>();
+ trainingParameters.put("tasks", "5");
+ trainingParameters.put("training.max.iterations", "" + iteration);
+ trainingParameters.put("training.batch.size", "300");
+ trainingParameters.put("convergence.check.interval", "1000");
+ ann.train(new Path(trainingDataPath), trainingParameters);
+ }
+
+ }
+
+ private static void printUsage() {
+ System.out.println("USAGE: <MODE> <INPUT_PATH> <OUTPUT_PATH>
<MODEL_PATH>|<FEATURE_DIMENSION> <LABEL_DIMENSION> [<MAX_ITERATION>
<LEARNING_RATE> <MOMEMTUM_WEIGHT> <REGULARIZATION_WEIGHT>]");
+ System.out.println("\tMODE\t- train: train the model with given training
data.");
+ System.out.println("\t\t- evaluate: obtain the result by feeding the
features to the neural network.");
+ System.out.println("\tINPUT_PATH\tin 'train' mode, it is the path of the
training data; in 'evaluate' mode, it is the path of the to be evaluated data
that lacks the label.");
+ System.out.println("\tOUTPUT_PATH\tin 'train' mode, it is where the
trained model is stored; in 'evaluate' mode, it is where the labeled data is
stored.");
+ System.out.println("\n\tConditional Parameters:");
+ System.out.println("\tMODEL_PATH\tonly required in 'evaluate' mode. It
specifies where to load the trained neural network model.");
+ System.out.println("\tMAX_ITERATION\tonly used in 'train' mode. It
specifies how many iterations for the neural network to run. Default is 0.01.");
+ System.out.println("\tLEARNING_RATE\tonly used to 'train' mode. It
specifies the degree of aggregation for learning, usually in range (0, 1.0).
Default is 0.1.");
+ System.out.println("\tMOMEMTUM_WEIGHT\tonly used to 'train' mode. It
specifies the weight of momemtum. Default is 0.");
+ System.out.println("\tREGULARIZATION_WEIGHT\tonly required in 'train'
model. It specifies the weight of reqularization.");
+ System.out.println("\nExample:");
+ System.out.println("Train a neural network with default
setting:\n\tneuralnets train hdfs://localhost:30002/training_data
hdfs://localhost:30002/model 8 1");
+ System.out.println("Train a neural network by specify learning rate as
0.1, momemtum rate as 0.2, and regularization weight as
0.01:\n\tneuralnets.train hdfs://localhost:30002/training_data
hdfs://localhost:30002/model 0.1 0.2 0.01");
+ System.out.println("Label the data with trained model:\n\tneuralnets
evaluate hdfs://localhost:30002/unlabeled_data hdfs://localhost:30002/result
hdfs://localhost:30002/model");
+ }
+
+}
Added:
hama/trunk/examples/src/test/java/org/apache/hama/examples/NeuralNetworkTest.java
URL:
http://svn.apache.org/viewvc/hama/trunk/examples/src/test/java/org/apache/hama/examples/NeuralNetworkTest.java?rev=1525911&view=auto
==============================================================================
---
hama/trunk/examples/src/test/java/org/apache/hama/examples/NeuralNetworkTest.java
(added)
+++
hama/trunk/examples/src/test/java/org/apache/hama/examples/NeuralNetworkTest.java
Tue Sep 24 14:49:52 2013
@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hama.examples;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.SequenceFile;
+import org.apache.hama.ml.math.DenseDoubleVector;
+import org.apache.hama.ml.writable.VectorWritable;
+import org.junit.Test;
+
+/**
+ * Test the functionality of NeuralNetwork Example.
+ *
+ */
+public class NeuralNetworkTest {
+
+ @Test
+ public void testNeuralnetsLabeling() {
+ this.testNeuralNetworkTraining();
+
+ String dataPath = "src/test/resources/neuralnets_classification_test.txt";
+ String modelPath = "tmp/neuralnets.model";
+ String resultPath = "tmp/neuralnets.txt";
+ String mode = "label";
+ try {
+ NeuralNetwork
+ .main(new String[] { mode, modelPath, dataPath, resultPath });
+
+ // compare results with ground-truth
+ BufferedReader groundTruthReader = new BufferedReader(new FileReader(
+ "src/test/resources/neuralnets_classification_label.txt"));
+ List<Double> groundTruthList = new ArrayList<Double>();
+ String line = null;
+ while ((line = groundTruthReader.readLine()) != null) {
+ groundTruthList.add(Double.parseDouble(line));
+ }
+ groundTruthReader.close();
+
+ BufferedReader resultReader = new BufferedReader(new
FileReader(resultPath));
+ List<Double> resultList = new ArrayList<Double>();
+ while ((line = resultReader.readLine()) != null) {
+ resultList.add(Double.parseDouble(line));
+ }
+ resultReader.close();
+ int total = resultList.size();
+ double correct = 0;
+ for (int i = 0; i < groundTruthList.size(); ++i) {
+ double actual = resultList.get(i);
+ double expected = groundTruthList.get(i);
+ if (actual < 0.5 && expected < 0.5 || actual >= 0.5 && expected >=
0.5) {
+ ++correct;
+ }
+ }
+ System.out.printf("Precision: %f\n", correct / total);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testNeuralNetworkTraining() {
+ String mode = "train";
+ String strTrainingDataPath =
"src/test/resources/neuralnets_classification_training.txt";
+ String strSequenceTrainingDataPath = "tmp/test-neuralnets.data";
+ int featureDimension = 8;
+ int labelDimension = 1;
+
+ Path sequenceTrainingDataPath = new Path(strSequenceTrainingDataPath);
+ Configuration conf = new Configuration();
+ try {
+ FileSystem fs = FileSystem.get(conf);
+ SequenceFile.Writer writer = new SequenceFile.Writer(fs, conf,
+ sequenceTrainingDataPath, LongWritable.class, VectorWritable.class);
+ BufferedReader br = new BufferedReader(
+ new FileReader(strTrainingDataPath));
+ String line = null;
+ // convert the data in sequence file format
+ while ((line = br.readLine()) != null) {
+ String[] tokens = line.split(",");
+ double[] vals = new double[tokens.length];
+ for (int i = 0; i < tokens.length; ++i) {
+ vals[i] = Double.parseDouble(tokens[i]);
+ }
+ writer.append(new LongWritable(), new VectorWritable(
+ new DenseDoubleVector(vals)));
+ }
+ writer.close();
+ br.close();
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+
+ String modelPath = "tmp/neuralnets.model";
+ try {
+ NeuralNetwork.main(new String[] { mode, strSequenceTrainingDataPath,
+ modelPath, "" + featureDimension, "" + labelDimension });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
Added:
hama/trunk/examples/src/test/resources/neuralnets_classification_label.txt
URL:
http://svn.apache.org/viewvc/hama/trunk/examples/src/test/resources/neuralnets_classification_label.txt?rev=1525911&view=auto
==============================================================================
--- hama/trunk/examples/src/test/resources/neuralnets_classification_label.txt
(added)
+++ hama/trunk/examples/src/test/resources/neuralnets_classification_label.txt
Tue Sep 24 14:49:52 2013
@@ -0,0 +1 @@
+1
0
0
0
0
0
0
0
1
1
0
1
0
0
1
0
1
0
0
0
0
0
1
0
1
0
1
0
1
1
0
0
0
0
1
1
0
0
0
1
0
1
1
0
0
1
0
0
1
1
0
0
1
0
0
1
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
1
1
0
0
1
0
0
1
0
1
1
1
0
0
1
1
1
0
1
0
1
0
1
0
0
0
0
1
\ No newline at end of file
Added: hama/trunk/examples/src/test/resources/neuralnets_classification_test.txt
URL:
http://svn.apache.org/viewvc/hama/trunk/examples/src/test/resources/neuralnets_classification_test.txt?rev=1525911&view=auto
==============================================================================
--- hama/trunk/examples/src/test/resources/neuralnets_classification_test.txt
(added)
+++ hama/trunk/examples/src/test/resources/neuralnets_classification_test.txt
Tue Sep 24 14:49:52 2013
@@ -0,0 +1 @@
+0.588235294,0.557788945,0.573770492,0.272727273,0,0.409836066,0.026900085,0.316666667
0.352941176,0.492462312,0.475409836,0.333333333,0.224586288,0.506706408,0.15029889,0.366666667
0.529411765,0.773869347,0.639344262,0.303030303,0.11820331,0.460506706,0.036720751,0.4
0.352941176,0.829145729,0.557377049,0.262626263,0.19858156,0.500745156,0.236122972,0.466666667
0.058823529,0.497487437,0.475409836,0.101010101,0,0.378539493,0.201964133,0
0.588235294,0.341708543,0.868852459,0.232323232,0.057919622,0.529061103,0.088385995,0.433333333
0.176470588,0.618090452,0.819672131,0.353535354,0.283687943,0.853949329,0.342442357,0.016666667
0.470588235,0.457286432,0.672131148,0,0,0.530551416,0.217335611,0.783333333
0.352941176,0.979899497,0.573770492,0,0,0.460506706,0.106746371,0.166666667
0.529411765,0.783919598,0.704918033,0,0,0.369597615,0.064901793,0.533333333
0,0.467336683,0.491803279,0,0,0.526080477,0.078992314,0.066666667
0.176470588,0.608040201,0.426229508,0,0,0.536512668,0.020922289,0.066666667
0.117647059,0.507537688,0.475409836,0.171717172,0.313238771,0.360655738,0.228864219,0.033333333
0.117647059,0.281407035,0.459016393,0.282828283,0.053191489,0.360655738,0.108454313,0.016666667
0,0.814070352,0.62295082,0.363636364,0,0.739195231,0.122117848,0.083333333
0,0.477386935,0.524590164,0.393939394,0.124113475,0.664679583,0.122971819,0.016666667
0.235294118,0.628140704,0.655737705,0,0,0.481371088,0.195559351,0.1
0.294117647,0.683417085,0.672131148,0,0,0,0.239965841,0.8
0.117647059,0.648241206,0.606557377,0.262626263,0.242316785,0.494783905,0.219043553,0.066666667
0.176470588,0.653266332,0.524590164,0,0,0.344262295,0.100768574,0.016666667
0.058823529,0.537688442,0.409836066,0.191919192,0,0.421758569,0.043979505,0.133333333
0.058823529,0.703517588,0.606557377,0.262626263,0.212765957,0.359165425,0.320239112,0.033333333
0.058823529,0.72361809,0.672131148,0.464646465,0.212765957,0.687034277,0.109735269,0.416666667
0.470588235,0.537688442,0.655737705,0,0,0.36661699,0.332194705,0.216666667
0.764705882,0.793969849,0.93442623,0,0,0.630402385,0.076430401,0.383333333
0.117647059,0.608040201,0.573770492,0.323232323,0.112293144,0.58271237,0.34500427,0.033333333
0.411764706,0.648241206,0.557377049,0.494949495,0.147754137,0.573770492,0.154141759,0.366666667
0.117647059,0.452261307,0.491803279,0,0,0.350223547,0.04824936,0.066666667
0.411764706,0.713567839,0.737704918,0.242424242,0.567375887,0.453055142,0.021349274,0.366666667
0.176470588,0.849246231,0.606557377,0.191919192,0.147754137,0.445603577,0.081127242,0.166666667
0,0.497487437,0,0,0,0.372578241,0.074722459,0.016666667
0.235294118,0.638190955,0.721311475,0.111111111,0.18321513,0.514157973,0.222032451,0.116666667
0.235294118,0.592964824,0.573770492,0,0,0.66318927,0.352690009,0.083333333
0.117647059,0.613065327,0.62295082,0.272727273,0.236406619,0.535022355,0.17292912,0.083333333
0.352941176,0.628140704,0.639344262,0.313131313,0,0.411326379,0.20794193,0.466666667
0.058823529,0.844221106,0.721311475,0.292929293,0,0.521609538,0.353116994,0.516666667
0.117647059,0.648241206,0,0,0,0.573770492,0.096498719,0.333333333
0.235294118,0.552763819,0.62295082,0.202020202,0.11820331,0.423248882,0.017079419,0.1
0.352941176,0.40201005,0.655737705,0.363636364,0,0.59314456,0.042271563,0.116666667
0.588235294,0.577889447,0,0,0,0,0.078138343,0.15
0.117647059,0.638190955,0.37704918,0.212121212,0.395981087,0.51266766,0.041844577,0.016666667
0.529411765,0.824120603,0.639344262,0,0,0.488822653,0.029888984,0.4
0.117647059,0.467336683,0.524590164,0.323232323,0.189125296,0.566318927,0.254483348,0.033333333
0.176470588,0.793969849,0.524590164,0.131313131,0.457446809,0.464977645,0.09265585,0.05
0.294117647,0.633165829,0.639344262,0.272727273,0.026004728,0.441132638,0.154141759,0.316666667
0.588235294,0.648241206,0.508196721,0.363636364,0,0.614008942,0.15499573,0.283333333
0,0.673366834,0.475409836,0.202020202,0.343971631,0.393442623,0.116994022,0
0.176470588,0.512562814,0.606557377,0,0,0.439642325,0.018360376,0.183333333
0.411764706,0.939698492,0.409836066,0.333333333,0.463356974,0.505216095,0.319385141,0.216666667
0.176470588,0.869346734,0.639344262,0.393939394,0.218676123,0.503725782,0.38087105,0.166666667
0.588235294,0.472361809,0.590163934,0.181818182,0,0.344262295,0.220751494,0.583333333
0.058823529,0.542713568,0.491803279,0.464646465,0.210401891,0.529061103,0.143894108,0.05
0.294117647,0.487437186,0.62295082,0.272727273,0,0.530551416,0.128095645,0.516666667
0.235294118,0.417085427,0.704918033,0.191919192,0,0.436661699,0.10204953,0.216666667
0.058823529,0.572864322,0.540983607,0.363636364,0.236406619,0.56780924,0.090093937,0
0.058823529,0.748743719,0.557377049,0.292929293,0.150118203,0.436661699,0.115713066,0.35
0.294117647,0.587939698,0.704918033,0.303030303,0.124113475,0.58271237,0.073868488,0.35
0.058823529,0.557788945,0.770491803,0,0,0.488822653,0.079846285,0.4
0.235294118,0.56281407,0.639344262,0.404040404,0,0.587183308,0.067463706,0.283333333
0.058823529,0.582914573,0.639344262,0.292929293,0.212765957,0.538002981,0.178479932,0.066666667
0,0.708542714,0.68852459,0.262626263,0,0.482861401,0.151579846,0.016666667
0.117647059,0.879396985,0.721311475,0,0,0.341281669,0.1058924,0.016666667
0.117647059,0.462311558,0.426229508,0,0,0.448584203,0.026900085,0.016666667
0.176470588,0.653266332,0.639344262,0.232323232,0.093380615,0.423248882,0.104611443,0.216666667
0.470588235,0.603015075,0.704918033,0,0,0.423248882,0.077284372,0.016666667
0.117647059,0.874371859,0.721311475,0.373737374,0.141843972,0.66318927,0.242527754,0.05
0.117647059,0.532663317,0.459016393,0.272727273,0.195035461,0.43219076,0.148590948,0.016666667
0.117647059,0.527638191,0.614754098,0,0,0.347242921,0.205807003,0.533333333
0.235294118,0.477386935,0.491803279,0.323232323,0,0.52757079,0.087959009,0.116666667
0,0.633165829,0.704918033,0.272727273,0.141843972,0.408345753,0.186592656,0
0.470588235,0.326633166,0.590163934,0.232323232,0,0.476900149,0.222886422,0.35
0.117647059,0.497487437,0.491803279,0.171717172,0.189125296,0.545454545,0.160119556,0
0.058823529,0.512562814,0.606557377,0,0,0.588673621,0.091801879,0.35
0.647058824,0.603015075,0.655737705,0.373737374,0.177304965,0.630402385,0.301878736,0.45
0.176470588,0.512562814,0.360655738,0.202020202,0.111111111,0.459016393,0.137489325,0.083333333
0.058823529,0.547738693,0.475409836,0.181818182,0.137115839,0.424739195,0.060204953,0.016666667
0.529411765,0.703517588,0.770491803,0,0,0.48733234,0.280102477,0.4
0.764705882,0.768844221,0.721311475,0.373737374,0.165484634,0.605067064,0.467976089,0.3
0.705882353,0.502512563,0.68852459,0.333333333,0.124113475,0.44709389,0.175064048,0.416666667
0.058823529,0.738693467,0.770491803,0.414141414,0,0.734724292,0.119555935,0.1
0.058823529,0.407035176,0.606557377,0.414141414,0.067375887,0.690014903,0.434671221,0.183333333
0.176470588,0.939698492,0.573770492,0.222222222,0.236406619,0.54247392,0.140905209,0.25
0.352941176,0.814070352,0.508196721,0,0,0.362146051,0.042698548,0.483333333
0.235294118,0.683417085,0.573770492,0,0,0.464977645,0.471391973,0.016666667
0.058823529,0.608040201,0.639344262,0.393939394,0.087470449,0.581222057,0.078138343,0.116666667
0.176470588,0.542713568,0.508196721,0.242424242,0,0.387481371,0.061912895,0.066666667
0,0.909547739,0.721311475,0.444444444,0.602836879,0.645305514,0.061485909,0.083333333
0.470588235,0.773869347,0.639344262,0.323232323,0,0.482861401,0.155849701,0.4
0.058823529,0.64321608,0.721311475,0.393939394,0.130023641,0.543964232,0.418018787,0.266666667
0.411764706,0.688442211,0.737704918,0.414141414,0,0.476900149,0.133646456,0.3
0,0.618090452,0.590163934,0,0,0.540983607,0.076857387,0.516666667
0.058823529,0.532663317,0.62295082,0,0,0.558867362,0.050811272,0.083333333
0.352941176,0.954773869,0.754098361,0,0,0.529061103,0.085397096,0.75
0.117647059,0.442211055,0.475409836,0.262626263,0.01891253,0.423248882,0.293766012,0.016666667
0.529411765,0.854271357,0.606557377,0.313131313,0,0.655737705,0.138770282,0.366666667
0.529411765,0.447236181,0.508196721,0,0,0.335320417,0.027327071,0.2
0.588235294,0.507537688,0.62295082,0.484848485,0.212765957,0.490312966,0.03970965,0.7
0.117647059,0.613065327,0.573770492,0.272727273,0,0.548435171,0.111870196,0.1
0.294117647,0.608040201,0.590163934,0.232323232,0.132387707,0.390461997,0.071306576,0.15
0.058823529,0.633165829,0.491803279,0,0,0.448584203,0.115713066,0.433333333
\ No newline at end of file