]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/GeomeanFormulaFunction.java
Adopt spreadsheet changes made in Balas development
[simantics/platform.git] / bundles / org.simantics.spreadsheet / src / org / simantics / spreadsheet / solver / formula / GeomeanFormulaFunction.java
1 package org.simantics.spreadsheet.solver.formula;
2
3 import org.simantics.spreadsheet.SpreadsheetMatrix;
4 import org.simantics.spreadsheet.Spreadsheets;
5 import org.simantics.spreadsheet.solver.formula.parser.ast.AstArgList;
6 import org.simantics.spreadsheet.solver.formula.parser.ast.AstValue;
7
8 public class GeomeanFormulaFunction implements CellFormulaFunction<Object> {
9
10     @Override
11     public Object evaluate(CellValueVisitor visitor, AstArgList args) {
12         if (args.values.size() == 0)
13             throw new IllegalStateException();
14         double result = 1.0;
15         double count = 0.0;
16         for (AstValue value : args.values){
17             Object r = value.accept(visitor);
18             if (r instanceof SpreadsheetMatrix) {
19                 Object v = ((SpreadsheetMatrix) r).productWithFormulaError();
20                 if(v instanceof String) return v;
21                 double dval = ((Number)v).doubleValue();
22                 if(dval!=0.0){
23                     result = result*dval;
24                     count += ((SpreadsheetMatrix) r).countOfActualDoubleValues();
25                 }
26             } else {
27                 FormulaError2 error = FormulaError2.forObject(r);
28                 if(error!=null) return error.getString();
29
30                 Number vNum = Spreadsheets.asValidNumber(r);
31                 Double v = null;
32                 if(vNum!=null) v = vNum.doubleValue();
33
34                 if(v!=null){
35                     if(v<=0) return FormulaError2.NUM.getString();
36                     result = result*v;
37                     count++;
38                 }
39             }
40         }
41         if(result==0.0 || count==0.0) return FormulaError2.NUM.getString();
42         return Double.valueOf(Math.pow(result, (1.0/count)));
43     }
44
45 }