001/*
002        AUTOMATICALLY GENERATED BY jTemp FROM
003        /Users/jsh2/Work/openimaj/target/checkout/machine-learning/clustering/src/main/jtemp/org/openimaj/ml/clustering/#T#CentroidsResult.jtemp
004*/
005/**
006 * Copyright (c) 2011, The University of Southampton and the individual contributors.
007 * All rights reserved.
008 *
009 * Redistribution and use in source and binary forms, with or without modification,
010 * are permitted provided that the following conditions are met:
011 *
012 *   *  Redistributions of source code must retain the above copyright notice,
013 *      this list of conditions and the following disclaimer.
014 *
015 *   *  Redistributions in binary form must reproduce the above copyright notice,
016 *      this list of conditions and the following disclaimer in the documentation
017 *      and/or other materials provided with the distribution.
018 *
019 *   *  Neither the name of the University of Southampton nor the names of its
020 *      contributors may be used to endorse or promote products derived from this
021 *      software without specific prior written permission.
022 *
023 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
024 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
025 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
026 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
027 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
028 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
029 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
030 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
031 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
032 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
033 */
034   
035package org.openimaj.ml.clustering;
036
037import java.io.DataInput;
038import java.io.DataOutput;
039import java.io.IOException;
040import java.io.PrintWriter;
041import java.util.Arrays;
042import java.util.Scanner;
043
044import org.openimaj.ml.clustering.CentroidsProvider;
045import org.openimaj.ml.clustering.Clusters;
046import org.openimaj.ml.clustering.SpatialClusters;
047import org.openimaj.ml.clustering.assignment.HardAssigner;
048import org.openimaj.ml.clustering.assignment.hard.ExactFloatAssigner;
049import org.openimaj.util.pair.IntFloatPair;
050
051/**
052 * The result of a {@link SpatialClusterer} that just produces a flat set of centroids.
053 * 
054 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
055 */
056public class FloatCentroidsResult implements SpatialClusters<float[]>, CentroidsProvider<float[]> {
057        final static String HEADER = Clusters.CLUSTER_HEADER + "Float".charAt(0) + "Cen";
058        
059        /** The centroids of the clusters */
060        public float[][] centroids;
061                
062        @Override
063        public boolean equals(Object obj){
064                if(!(obj instanceof FloatCentroidsResult)) 
065                        return false;
066                        
067                FloatCentroidsResult other = (FloatCentroidsResult)obj;
068                for (int i = 0; i < this.centroids.length; i++) {
069                        if (!Arrays.equals(this.centroids[i], other.centroids[i]))
070                                return false;
071                }
072                return true;
073        }
074
075        @Override
076        public String asciiHeader() {
077                return "ASCII"+HEADER ;
078        }
079
080        @Override
081        public byte[] binaryHeader() {
082                return HEADER.getBytes();
083        }
084
085        @Override
086        public void readASCII(Scanner br) throws IOException {
087                // Read Header
088                final int K = Integer.parseInt(br.nextLine().trim());
089                final int M = Integer.parseInt(br.nextLine().trim());
090                
091                centroids = new float[K][M];
092                for (int k=0; k<K; k++) {
093                        String [] parts = br.nextLine().split(",");
094                        
095                        for (int d=0; d<M; d++) {
096                                centroids[k][d] = Float.parseFloat(parts[d]);
097                        }
098                }
099        }
100
101        @Override
102        public void readBinary(DataInput in) throws IOException {
103                final int K = in.readInt();
104                final int M = in.readInt();
105                                
106                centroids = new float[K][M];
107                
108                for (int k=0; k<K; k++) {
109                        for (int d=0; d<M; d++) {
110                                centroids[k][d] = in.readFloat();
111                        }
112                }
113        }
114
115        @Override
116        public void writeASCII(PrintWriter writer) throws IOException {
117                writer.println(centroids.length);
118                writer.println(centroids[0].length);
119                
120                for (int k=0; k<centroids.length; k++) {
121                        for (int d=0; d<centroids[0].length; d++) {
122                                writer.print(centroids[k][d] + ",");
123                        }
124                        writer.println();
125                }
126        }
127
128        @Override
129        public void writeBinary(DataOutput out) throws IOException {
130                out.writeInt(centroids.length);
131                out.writeInt(centroids[0].length);
132                                
133                for (int k=0; k<centroids.length; k++) {
134                        for (int d=0; d<centroids[0].length; d++) {
135                                out.writeFloat(centroids[k][d]);
136                        }
137                }
138        }
139        
140        @Override
141        public String toString() {
142                String str = "";
143                str += "FloatCentroidsResult" + "\n";
144                str += "No. of Clusters: "  + centroids.length + "\n";
145                str += "No. of Dimensions: "  + centroids[0].length + "\n";
146                return str;
147        }
148        
149        @Override
150        public float[][] getCentroids() {
151                return this.centroids;
152        }
153        
154        @Override
155        public HardAssigner<float[], float[], IntFloatPair> defaultHardAssigner() {
156                return new ExactFloatAssigner(this);
157        }
158        
159        @Override
160        public int numDimensions() {
161                return centroids[0].length;
162        }
163
164        @Override
165        public int numClusters() {
166                return centroids.length;
167        }
168}