]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/SpreadsheetMatrix.java
Adopt spreadsheet changes made in Balas development
[simantics/platform.git] / bundles / org.simantics.spreadsheet / src / org / simantics / spreadsheet / SpreadsheetMatrix.java
1 package org.simantics.spreadsheet;
2
3 import java.io.Serializable;
4
5 import org.simantics.spreadsheet.solver.formula.FormulaError2;
6
7 public class SpreadsheetMatrix implements Serializable {
8
9     private static final long serialVersionUID = 5729700370527844640L;
10
11     private int w;
12     private int h;
13     public Object[] values;
14
15     public SpreadsheetMatrix(int w, int h) {
16         this.w = w;
17         this.h = h;
18         this.values = new Object[w*h];
19     }
20
21     public Object get(int row, int column) {
22         return values[w*row+column];
23     }
24
25     public void set(int row, int column, Object value) {
26         values[w*row+column] = value;
27     }
28
29     public int getWidth() {
30         return w;
31     }
32
33     public int getHeight() {
34         return h;
35     }
36
37     public double sum() {
38         double result = 0;
39         for(int i=0;i<values.length;i++) {
40             Number n = Spreadsheets.asValidNumber(values[i]);
41             if(n != null) result += n.doubleValue();
42         }
43         return result;
44     }
45
46     public Object sumWithFormulaError(){
47         Double result = 0.0;
48         for(int i = 0; i < values.length; i++){
49             Object obj = values[i];
50             if(obj != null){
51                 FormulaError2 error = FormulaError2.forObject(obj);
52                 if(error!=null) return error.getString();
53
54                 Number n = Spreadsheets.asValidNumber(obj);
55                 if(n != null) result += n.doubleValue();
56             }
57         }
58         return result;
59     }
60
61     public double average() {
62         double result = 0;
63         double count = 0;
64         for(int i=0;i<values.length;i++) {
65             Number n = Spreadsheets.asValidNumber(values[i]);
66             if(n != null) {
67                 result += n.doubleValue();
68                 count++;
69             }
70         }
71         if(count == 0) return result;
72         return result / count;
73     }
74
75     public double countOfActualDoubleValues(){
76         double count = 0.0;
77         for(int i = 0; i < values.length; i++){
78             Number n = Spreadsheets.asValidNumber(values[i]);
79             if(n!=null) count++;
80         }
81         return count;
82     }
83
84     public Object productWithFormulaError(){
85         Double result = 1.0;
86         boolean atLeastOne = false;
87         for(int i = 0; i < values.length; i++){
88             Object obj = values[i];
89             if(obj != null){
90                 FormulaError2 error = FormulaError2.forObject(obj);
91                 if(error!=null) return error.getString();
92
93                 Number n = Spreadsheets.asValidNumber(values[i]);
94                 if(n != null) {
95                     double dval = n.doubleValue();
96                     if(dval<=0) return FormulaError2.NUM.getString();
97                     result = result*dval;
98                     atLeastOne = true;
99                 }
100             }
101         }
102         if(atLeastOne) return result;
103         else return 0.0;
104     }
105
106     public SpreadsheetMatrix pow(Object exponent_) {
107         if(exponent_ instanceof SpreadsheetMatrix) {
108             SpreadsheetMatrix exponent = (SpreadsheetMatrix)exponent_;
109             SpreadsheetMatrix result = new SpreadsheetMatrix(exponent.w, h);
110             for(int i=0;i<h;i++) {
111                 for(int j=0;j<exponent.w;j++) {
112                     result.set(i,j, Math.pow(Spreadsheets.asNumber(get(i, 0)),
113                             Spreadsheets.asNumber(exponent.get(0, j))));
114                 }
115             }
116             return result;
117         } else {
118             double n = Spreadsheets.asNumber(exponent_);
119             SpreadsheetMatrix result = new SpreadsheetMatrix(w, h);
120             for(int i=0;i<result.values.length;i++) {
121                 result.values[i] = Math.pow(Spreadsheets.asNumber(values[i]), n);
122             }
123             return result;
124         }
125     }
126
127
128 }