hama-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From yxji...@apache.org
Subject svn commit: r1525911 [1/2] - in /hama/trunk: ./ examples/src/main/java/org/apache/hama/examples/ examples/src/test/java/org/apache/hama/examples/ examples/src/test/resources/
Date Tue, 24 Sep 2013 14:49:52 GMT
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



Mime
View raw message