1 package org.simantics.spreadsheet.graph.formula;
3 import org.simantics.spreadsheet.graph.CellFormulaFunction;
4 import org.simantics.spreadsheet.graph.CellValueVisitor;
5 import org.simantics.spreadsheet.graph.SpreadsheetGraphUtils;
6 import org.simantics.spreadsheet.graph.SpreadsheetMatrix;
7 import org.simantics.spreadsheet.graph.parser.ast.AstArgList;
8 import org.simantics.spreadsheet.graph.parser.ast.AstValue;
10 public class GeomeanFormulaFunction implements CellFormulaFunction<Object> {
13 public Object evaluate(CellValueVisitor visitor, AstArgList args) {
14 if (args.values.size() == 0)
15 throw new IllegalStateException();
18 for (AstValue value : args.values){
19 Object r = value.accept(visitor);
20 if (r instanceof SpreadsheetMatrix) {
21 Object v = ((SpreadsheetMatrix) r).productWithFormulaError();
22 if(v instanceof String) return v;
23 double dval = ((Number)v).doubleValue();
26 count += ((SpreadsheetMatrix) r).countOfActualDoubleValues();
29 FormulaError2 error = FormulaError2.forObject(r);
30 if(error!=null) return error.getString();
32 Number vNum = SpreadsheetGraphUtils.asValidNumber(r);
34 if(vNum!=null) v = vNum.doubleValue();
37 if(v<=0) return FormulaError2.NUM.getString();
43 if(result==0.0 || count==0.0) return FormulaError2.NUM.getString();
44 return Double.valueOf(Math.pow(result, (1.0/count)));