static GnmExpr const * xlsx_func_map_in (GnmConventions const *convs, G_GNUC_UNUSED Workbook *scope, char const *name, GnmExprList *args) { XLSXExprConventions const *xconv = (XLSXExprConventions const *)convs; GnmExpr const * (*handler) (GnmConventions const *convs, Workbook *scope, GnmExprList *args); GnmFunc *f; char const *new_name; if (0 == g_ascii_strncasecmp (name, "_xlfn.", 6)) { if (NULL != xconv->xlfn_map && NULL != (new_name = g_hash_table_lookup (xconv->xlfn_map, name + 6))) name = new_name; else name = name + 6; handler = g_hash_table_lookup (xconv->xlfn_handler_map, name); if (handler != NULL) { GnmExpr const * res = handler (convs, scope, args); if (res != NULL) return res; } } else if (0 == g_ascii_strncasecmp (name, "_xlfnodf.", 9)) /* This should at most happen for ODF functions incorporated */ /* in an xlsx file, we should perform the appropriate translation! */ name = name + 9; else if (0 == g_ascii_strncasecmp (name, "_xlfngnumeric.", 9)) /* These are Gnumeric's own functions */ name = name + 14; f = gnm_func_lookup_or_add_placeholder (name); return gnm_expr_new_funcall (f, args); }
static GnmExpr const * xlsx_func_binominv_handler (G_GNUC_UNUSED GnmConventions const *convs, G_GNUC_UNUSED Workbook *scope, GnmExprList *args) /* BINOM.INV(a,b,c) --> R.QBINOM(c,a,b) */ { GnmFunc *f = gnm_func_lookup_or_add_placeholder ("r.qbinom"); GnmExprList *arg; arg = g_slist_nth (args, 2); args = g_slist_remove_link (args, arg); args = g_slist_concat (arg, args); return gnm_expr_new_funcall (f, args); }
static GnmExpr const * xlsx_func_dist_handler (GnmExprList *args, guint n_args, char const *name, char const *name_p, char const *name_d) { if (gnm_expr_list_length (args) != n_args) { GnmFunc *f = gnm_func_lookup_or_add_placeholder (name); return gnm_expr_new_funcall (f, args); } else { GnmFunc *f_if = gnm_func_lookup_or_add_placeholder ("if"); GnmFunc *f_p = gnm_func_lookup_or_add_placeholder (name_p); GnmFunc *f_d = gnm_func_lookup_or_add_placeholder (name_d); GnmExprList *arg_cum, *args_c; GnmExpr const *cum; GnmValue const *constant; arg_cum = g_slist_nth (args, n_args - 1); args = g_slist_remove_link (args, arg_cum); cum = arg_cum->data; gnm_expr_list_free (arg_cum); constant = gnm_expr_get_constant (cum); if (constant == NULL || !VALUE_IS_NUMBER (constant)) { args_c = gnm_expr_list_copy (args); return gnm_expr_new_funcall3 (f_if, cum, gnm_expr_new_funcall (f_p, args), gnm_expr_new_funcall (f_d, args_c)); } else if (value_is_zero (constant)) { gnm_expr_free (cum); return gnm_expr_new_funcall (f_d, args); } else { gnm_expr_free (cum); return gnm_expr_new_funcall (f_p, args); } } }
static gboolean analysis_tool_principal_components_engine_run (data_analysis_output_t *dao, analysis_tools_data_generic_t *info) { int l = g_slist_length (info->input), i; GSList *inputdata; GnmFunc *fd_mean; GnmFunc *fd_var; GnmFunc *fd_eigen; GnmFunc *fd_mmult; GnmFunc *fd_munit; GnmFunc *fd_sqrt; GnmFunc *fd_count; GnmFunc *fd_sum; GnmFunc *fd_and; GnmFunc *fd_if; GnmExpr const *expr; GnmExpr const *expr_count; GnmExpr const *expr_munit; GnmExpr const *expr_and; int data_points; GnmExprList *and_args = NULL; if (!dao_cell_is_visible (dao, l, 9 + 3 * l)) { dao_set_bold (dao, 0, 0, 0, 0); dao_set_italic (dao, 0, 0, 0, 0); dao_set_cell (dao, 0, 0, _("Principal components analysis has " "insufficient space.")); return 0; } fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_mean); fd_var = gnm_func_lookup_or_add_placeholder ("VAR", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_var); fd_eigen = gnm_func_lookup_or_add_placeholder ("EIGEN", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_eigen); fd_mmult = gnm_func_lookup_or_add_placeholder ("MMULT", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_mmult); fd_munit = gnm_func_lookup_or_add_placeholder ("MUNIT", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_munit); fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_sqrt); fd_count = gnm_func_lookup_or_add_placeholder ("COUNT", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_count); fd_sum = gnm_func_lookup_or_add_placeholder ("SUM", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_sum); fd_and = gnm_func_lookup_or_add_placeholder ("AND", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_and); fd_if = gnm_func_lookup_or_add_placeholder ("IF", dao->sheet ? dao->sheet->workbook : NULL, FALSE); gnm_func_ref (fd_if); dao_set_bold (dao, 0, 0, 0, 0); dao_set_italic (dao, 0, 0, 0, 11 + 3 * l); dao_set_format (dao, 0, 0, 0, 0, _("\"Principal Components Analysis\";" "[Red]\"Principal Components Analysis is invalid.\"")); dao_set_align (dao, 0, 0, 0, 0, HALIGN_LEFT, VALIGN_BOTTOM); dao->offset_row++; analysis_tool_table (dao, info, _("Covariances:"), "COVAR", TRUE); dao->offset_row--; for (i = 1, inputdata = info->input; inputdata != NULL; i++, inputdata = inputdata->next) analysis_tools_write_label (inputdata->data, dao, info, 0, 9 + 2 * l + i, i); data_points = value_area_get_width (info->input->data, NULL) * value_area_get_height (info->input->data, NULL); for (i = 0; i < l; i++) and_args = gnm_expr_list_prepend (and_args, gnm_expr_new_binary (gnm_expr_new_constant (value_new_int (data_points)), GNM_EXPR_OP_EQUAL, make_cellref (1 + i, 3 + l))); expr_and = gnm_expr_new_funcall (fd_and, and_args); dao_set_cell_expr (dao, 0, 0, gnm_expr_new_funcall3 (fd_if, expr_and, gnm_expr_new_constant (value_new_int (1)), gnm_expr_new_constant (value_new_int (-1)))); dao_set_merge (dao,0,0,2,0); set_cell_text_col (dao, 0, 3 + l, _("/Count:" "/Mean:" "/Variance:" "//Eigenvalues:" "/Eigenvectors:")); dao_set_cell (dao, 0, 11 + 3 * l, _("Percent of Trace:")); dao_set_italic (dao, 0, 9 + 2 * l, 1 + l, 9 + 2 * l); dao_set_percent (dao, 1, 11 + 3 * l, 1 + l, 11 + 3 * l); for (i = 1, inputdata = info->input; inputdata != NULL; i++, inputdata = inputdata->next) { expr = gnm_expr_new_constant (value_dup (inputdata->data)); dao_set_cell_expr (dao, i, 3 + l, gnm_expr_new_funcall1 (fd_count, gnm_expr_copy (expr))); dao_set_cell_expr (dao, i, 4 + l, gnm_expr_new_funcall1 (fd_mean, gnm_expr_copy (expr))); dao_set_cell_expr (dao, i, 5 + l, gnm_expr_new_funcall1 (fd_var, expr)); } expr_count = gnm_expr_new_binary (make_cellref (0,-4), GNM_EXPR_OP_DIV, gnm_expr_new_binary (make_cellref (0,-4), GNM_EXPR_OP_SUB, gnm_expr_new_constant (value_new_int (1)))); expr = gnm_expr_new_funcall1 (fd_eigen, gnm_expr_new_binary (expr_count, GNM_EXPR_OP_MULT, make_rangeref (0, - (5 + l), l - 1, - 6))); dao_set_array_expr (dao, 1, 7 + l, l, l + 1, expr); for (i = 1; i <= l; i++) { dao_set_align (dao, i, 9 + 2 * l, i, 9 + 2 * l, HALIGN_CENTER, VALIGN_BOTTOM); dao_set_cell_printf (dao, i, 9 + 2 * l, "\xce\xbe%i", i); dao_set_cell_expr (dao, i, 11 + 3 * l, gnm_expr_new_binary (make_cellref (0,- 4 - 2 * l), GNM_EXPR_OP_DIV, gnm_expr_new_funcall1 (fd_sum, dao_get_rangeref (dao, 1, 7 + l, l, 7 + l)))); } expr_munit = gnm_expr_new_funcall1 (fd_munit, gnm_expr_new_constant (value_new_int (l))); expr = gnm_expr_new_funcall2 (fd_mmult, gnm_expr_new_binary (gnm_expr_new_funcall1 (fd_sqrt, gnm_expr_new_binary (gnm_expr_new_constant (value_new_int (1)), GNM_EXPR_OP_DIV, make_rangeref (0, - 5 - l, l - 1, - 5 - l))), GNM_EXPR_OP_MULT, gnm_expr_copy (expr_munit)), make_rangeref (0, - 2 - l, l - 1, - 3)); expr = gnm_expr_new_funcall2 (fd_mmult, expr, gnm_expr_new_binary (gnm_expr_new_funcall1 (fd_sqrt, make_rangeref (0, - 3 - l, l - 1, - 3 - l)), GNM_EXPR_OP_MULT, expr_munit)); dao_set_array_expr (dao, 1, 10 + 2 * l, l, l, expr); gnm_func_unref (fd_mean); gnm_func_unref (fd_var); gnm_func_unref (fd_eigen); gnm_func_unref (fd_mmult); gnm_func_unref (fd_munit); gnm_func_unref (fd_sqrt); gnm_func_unref (fd_count); gnm_func_unref (fd_sum); gnm_func_unref (fd_and); gnm_func_unref (fd_if); dao_redraw_respan (dao); return 0; }