benchmarks/matrix-multiplication/src/main/java/org/apidesign/benchmark/matrixmul/Matrix.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 24 Feb 2015 11:12:53 +0100
changeset 1787 ea12a3bb4b33
parent 520 b03a2d2b1fdc
permissions -rw-r--r--
Using year range 2012-2015 in copyright header
jaroslav@314
     1
/**
jaroslav@314
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1787
     3
 * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@314
     4
 *
jaroslav@314
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@314
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@314
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@314
     8
 *
jaroslav@314
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@314
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@314
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@314
    12
 * GNU General Public License for more details.
jaroslav@314
    13
 *
jaroslav@314
    14
 * You should have received a copy of the GNU General Public License
jaroslav@314
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@314
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@314
    17
 */
Martin@268
    18
package org.apidesign.benchmark.matrixmul;
Martin@268
    19
jaroslav@381
    20
import java.io.IOException;
jaroslav@381
    21
import java.util.Arrays;
Martin@268
    22
Martin@268
    23
public class Matrix {
Martin@268
    24
    private final int rank;
jaroslav@381
    25
    private final float data[][];
Martin@268
    26
    
Martin@268
    27
    public Matrix(int r) {
jaroslav@381
    28
        this(r, new float[r][r]);
jaroslav@381
    29
    }
jaroslav@381
    30
    
jaroslav@381
    31
    private Matrix(int r, float[][] data) {
jaroslav@381
    32
        this.rank = r;
jaroslav@381
    33
        this.data = data;
Martin@268
    34
    }
Martin@268
    35
    
Martin@268
    36
    public void setElement(int i, int j, float value) {
Martin@268
    37
        data[i][j] = value;
Martin@268
    38
    }
Martin@268
    39
    public float getElement(int i, int j) {
Martin@268
    40
        return data[i][j];
Martin@268
    41
    }
Martin@268
    42
    
Martin@268
    43
    public void generateData() {
Martin@268
    44
        //final Random rand = new Random();
Martin@268
    45
        //final int x = 10;
Martin@268
    46
        for (int i = 0; i < rank; i++) {
Martin@268
    47
            for (int j = 0; j < rank; j++) {
jaroslav@520
    48
                data[i][j] = 1 / (1 + i + j);
Martin@268
    49
            }
Martin@268
    50
        }
Martin@268
    51
    }
Martin@268
    52
Martin@268
    53
    public Matrix multiply(Matrix m) {
Martin@268
    54
        if (rank != m.rank) {
Martin@268
    55
            throw new IllegalArgumentException("Rank doesn't match");
Martin@268
    56
        }
Martin@268
    57
        
Martin@268
    58
        final float res[][] = new float[rank][rank];
Martin@268
    59
        for (int i = 0; i < rank; i++) {
Martin@268
    60
            for (int j = 0; j < rank; j++) {
Martin@268
    61
                float ij = 0;
Martin@268
    62
                for (int q = 0; q < rank; q++) {
Martin@268
    63
                    ij += data[i][q] * m.data[q][j];
Martin@268
    64
                }
Martin@268
    65
                res[i][j] = ij;
Martin@268
    66
            }
Martin@268
    67
        }
jaroslav@381
    68
        return new Matrix(rank, res);
Martin@268
    69
    }
Martin@268
    70
    
jaroslav@381
    71
    public void printOn(Appendable s) throws IOException {
Martin@268
    72
        for (int i = 0; i < rank; i++) {
jaroslav@381
    73
            String sep = "";
Martin@268
    74
            for (int j = 0; j < rank; j++) {
jaroslav@381
    75
                s.append(sep + data[i][j]);
jaroslav@381
    76
                sep = " ";
Martin@268
    77
            }
jaroslav@381
    78
            s.append("\n");
Martin@268
    79
        }
Martin@268
    80
    }
jaroslav@381
    81
jaroslav@381
    82
    @Override
jaroslav@381
    83
    public boolean equals(Object obj) {
jaroslav@381
    84
        if (obj instanceof Matrix) {
jaroslav@381
    85
            Matrix snd = (Matrix)obj;
jaroslav@381
    86
            if (snd.rank != rank) {
jaroslav@381
    87
                return false;
jaroslav@381
    88
            }
jaroslav@381
    89
            for (int i = 0; i < rank; i++) {
jaroslav@381
    90
                for (int j = 0; j < rank; j++) {
jaroslav@381
    91
                    if (data[i][j] != snd.data[i][j]) {
jaroslav@381
    92
                        return false;
jaroslav@381
    93
                    }
jaroslav@381
    94
                }
jaroslav@381
    95
            }
jaroslav@381
    96
            return true;
jaroslav@381
    97
        }
jaroslav@381
    98
        return false;
jaroslav@381
    99
    }
jaroslav@381
   100
jaroslav@381
   101
    @Override
jaroslav@381
   102
    public int hashCode() {
jaroslav@381
   103
        int hash = 3;
jaroslav@381
   104
        hash = 97 * hash + this.rank;
jaroslav@409
   105
        hash = 97 * hash + Arrays.deepHashCode(this.data);
jaroslav@381
   106
        return hash;
jaroslav@381
   107
    }
Martin@268
   108
}