/* * this function should be changed--the mask map stack is misused as * to define the topology of variogram maps. * * use min/max coordinates for block diagonal as maximum cutoff * Returns: about 1/3 the max. dist between any two points in data. */ void fill_cutoff_width(DATA *data /* pointer to DATA structure to derive the values from */, VARIOGRAM *v /* pointer to VARIOGRAM structure */) { double d = 0.0; int i; GRIDMAP *m; SAMPLE_VGM *ev; assert(data); assert(v); ev = v->ev; if (get_n_masks() > 0) { m = new_map(); m->is_write = 0; m->filename = get_mask_name(0); if ((m = map_read(m)) == NULL) ErrMsg(ER_READ, "cannot open map"); ev->iwidth = 1.0; ev->cutoff = m->rows * m->cols; /* not a real cutoff, but rather the size of the container array */ ev->map = m; } else if (gl_bounds != NULL) { i = 0; while (gl_bounds[i] >= 0.0) /* count length */ i++; ev->cutoff = gl_bounds[i-1]; ev->iwidth = ev->cutoff / i; } else { if (is_mv_double(&(ev->cutoff))) { if (gl_cutoff < 0.0) { d = data_block_diagonal(data); if (d == 0.0) ev->cutoff = 1.0; /* ha ha ha */ else ev->cutoff = d * gl_fraction; } else ev->cutoff = gl_cutoff; } if (is_mv_double(&(ev->iwidth))) { if (gl_iwidth < 0.0) ev->iwidth = ev->cutoff / gl_n_intervals; else ev->iwidth = gl_iwidth; } } }
static void exit_predictions(PRED_AT what) { int i; if (gl_nsim > 1 && gl_lhs) lhs(get_gstat_data(), get_n_vars(), get_mode() == STRATIFY); switch (what) { case AT_POINTS: write_points(NULL, NULL, NULL, NULL, 0); if (gl_nsim > 1) save_simulations_to_ascii(o_filename); break; case AT_GRIDMAP: if (gl_nsim > 1) { if (DEBUG_DUMP) printlog("\nWriting results to files..."); save_simulations_to_maps(masks[0]); if (DEBUG_DUMP) printlog("done"); } else { for (i = 0; i < get_n_outfile(); i++) { if (get_outfile_namei(i)) { map_sign(outmap[i], what_is_outfile(i)); (outmap[i])->write(outmap[i]); map_free(outmap[i]); } } } for (i = 0; i < get_n_masks(); i++) map_free(masks[i]); efree(masks); efree(outmap); break; } print_orvc(); efree(est); } /* exit_predictions() */
static void read_all_data(DATA **data, DATA *valdata, int n_vars) { int i; DATA *area; init_data_minmax(); area = get_data_area(); for (i = 0; i < n_vars; i++) { if (get_mode() == STRATIFY) printlog("stratum # %d:\n", i + strata_min); printlog("data(%s): ", name_identifier(i)); if (data[i]->id < 0) { message("data(%s) was not specified\n", name_identifier(i)); ErrMsg(ER_SYNTAX, "data specification error"); } read_gstat_data(data[i]); report_data(data[i]); } /* for i */ /* * what to do when area is specified, but no masks or data()? * default prediction to `area'. Create a valdata with one point at * centre of area (for select()); and centre area at (0,0,0) */ if (area && get_n_masks() <= 0 && valdata->id == -1) { valdata->id = ID_OF_VALDATA; valdata->centre = area->centre = 1; } /* * read data() data: */ if (valdata->id > -1) { setup_valdata_X(valdata); if (! valdata->centre) valdata = read_gstat_data(valdata); } /* * read area, if existed */ if (area != NULL && get_method() != POLY) { read_gstat_data(area); /* now, before centring area: */ if (valdata->centre) valdata = get_area_centre(area, valdata); if (area->centre) centre_area(area); printlog("area:%s\n", area->centre ? " (centred around 0)" : ""); report_data(area); if (DEBUG_DATA) print_data_list(area); } /* * read edges, if existed */ if (get_n_edges() > 0) { read_edges(); report_edges(); /* setup_visibility_graph(); */ /*setup_planar_subdivisions();*/ } /* * setup and report data */ if (valdata->id > -1) { printlog("data():%s ", valdata->centre ? " [at area centre]" : ""); report_data(valdata); } for (i = 0; i < n_vars; i++) setup_data_minmax(data[i]); if (valdata->id > -1) setup_data_minmax(valdata); for (i = 0; i < n_vars; i++) calc_polynomials(data[i]); if (valdata->id > -1) calc_polynomials(valdata); if (DEBUG_DATA) { for (i = 0; i < n_vars; i++) print_data_list(data[i]); if (valdata->id > -1) print_data_list(valdata); } }
void predict_all(DATA **data) { int i = 0, random_path = 0; DPOINT *here = NULL, *where = NULL; PRED_AT at_what; unsigned int row, col; n_done = 0; val_data = get_dataval(); if (val_data->id > -1) { at_what = AT_POINTS; n_pred_locs = val_data->n_list; if (val_data->colns) strata_min = val_data->minstratum; } else if (get_n_masks() > 0) { at_what = AT_GRIDMAP; here = (DPOINT *) emalloc(sizeof(DPOINT)); here->u.stratum = -2; /* only NON-MV cells */ if (max_block_dimension(0) > 0.0) SET_BLOCK(here); else SET_POINT(here); } else /* what else ? */ return; if (at_what == AT_GRIDMAP && get_n_outfile() == 0) { pr_warning("no output maps defined"); return; } init_predictions(at_what); if (at_what == AT_GRIDMAP && !data[0]->dummy) { if (data[0]->maxX < masks[0]->x_ul || data[0]->minX > (masks[0]->x_ul + masks[0]->cols * masks[0]->cellsizex) || data[0]->minY > masks[0]->y_ul || data[0]->maxY < (masks[0]->y_ul - masks[0]->rows * masks[0]->cellsizey)) { pr_warning("ALL data are outside the map boundaries"); printlog("data x[%g,%g], y[%g,%g]; map x[%g,%g], y[%g,%g]\n", data[0]->minX, data[0]->maxX, data[0]->minY, data[0]->maxY, masks[0]->x_ul, masks[0]->x_ul + masks[0]->cols * masks[0]->cellsizex, masks[0]->y_ul - masks[0]->rows * masks[0]->cellsizey, masks[0]->y_ul ); } else if (map_xy2rowcol(masks[0], data[0]->minX, data[0]->minY, &row, &col) || map_xy2rowcol(masks[0], data[0]->maxX, data[0]->minY, &row, &col) || map_xy2rowcol(masks[0], data[0]->minX, data[0]->maxY, &row, &col) || map_xy2rowcol(masks[0], data[0]->maxX, data[0]->maxY, &row, &col)) pr_warning("at least some data are outside the map boundaries"); /* this is not a sufficient test! */ } if (gl_rp) /* Yes, by default */ random_path = is_simulation(get_method()); row = col = 0; while ((where = next_location(here, at_what, random_path, &row, &col, data)) != NULL) { for (i = 0; i < get_n_outfile(); i++) set_mv_double(&(est[i])); /* initialize estimates */ if (where->u.stratum >= 0) { if (get_mode() != STRATIFY) { for (i = 0; i < get_n_vars(); i++) select_at(data[i], where); } else if (where->u.stratum < get_n_vars()) select_at(data[where->u.stratum], where); get_est(data, get_method(), where, est); } /* printf("%g %g\n", est[0], est[1]); */ write_output(est, at_what, where, row, col); } exit_predictions(at_what); if (here != NULL) efree(here); print_progress(100, 100); }
static double *get_maskX(DATA **data, DPOINT *p, unsigned int row, unsigned int col) { static double *d = NULL; static int totX = 0, *posMask = NULL; int i, j, k, l; static DATA *bl = NULL; static GRIDMAP **local_masks = NULL; if (data == NULL) { if (d != NULL) { efree(d); d = NULL; efree(posMask); posMask = NULL; local_masks = NULL; totX = 0; } return NULL; } if (d == NULL) { /* first time calling */ for (i = 0, totX = 0; i < get_n_vars(); i++) totX += data[i]->n_X; posMask = (int *) emalloc(totX * sizeof(int)); d = (double *) emalloc(totX * sizeof(double)); for (i = 0, k = 0; i < get_n_vars(); i++) { for (j = 0; j < data[i]->n_X; j++) { if (data[i]->colX[j] > 0) posMask[k] = 1; if (data[i]->colX[j] == 0) posMask[k] = 0; if (data[i]->colX[j] < -1) posMask[k] = -1; k++; } } if (get_mode() == STRATIFY) { if (get_n_masks() > 1) local_masks = masks + 1; /* skip the first (= strata) map */ } else local_masks = masks; } bl = block_discr(bl, get_block_p(), p); /* bl is a single point-list with p if IS_POINT(p) */ for (i = 0, k = 0; i < get_n_vars(); i++) { for (j = 0; j < data[i]->n_X; j++) { if (data[i]->colX[j] < -1) { /* do eventual block averaging here: */ for (l = 0, d[k] = 0.0; l < bl->n_list; l++) d[k] += bl->list[l]->u.weight * calc_polynomial(bl->list[l], data[i]->colX[j]); } k++; } } for (i = 0, j = 0; i < totX; i++) { switch(posMask[i]) { case -1: /* is done above */ break; case 1: if (map_cell_is_mv(local_masks[j], row, col)) ErrMsg(ER_IMPOSVAL, "missing value in one of the mask maps"); d[i] = map_get_cell(local_masks[j], row, col); j++; break; case 0: d[i] = (double) 1.0; break; default: ErrMsg(ER_IMPOSVAL, "get_maskX()"); break; } } return d; }
static void init_predictions(PRED_AT w) { int i; DPOINT *bp; DATA **d = NULL; #ifdef WITH_SPIRAL DATA_GRIDMAP *grid; #endif est = (double *) emalloc(get_n_outfile() * sizeof(double)); bp = get_block_p(); d = get_gstat_data(); switch (w) { case AT_POINTS: if (o_filename == NULL) ErrMsg(ER_VARNOTSET, "please specify output file"); write_points(o_filename, val_data, NULL, NULL, get_n_outfile()); if (bp->x == -1.0) { /* set default */ bp->x = bp->y = 1.0; pr_warning("default block size set to: dx=1, dy=1"); } break; case AT_GRIDMAP: /* open mask files: */ get_maskX(NULL, NULL, 0, 0); /* re-initializes static arrays */ masks = (GRIDMAP **) emalloc(get_n_masks() * sizeof(GRIDMAP *)); for (i = 0; i < get_n_masks(); i++) masks[i] = check_open(get_mask_name(i), i); /* read as float */ if (n_pred_locs > 0) strata_min = floor(masks[0]->cellmin); outmap = (GRIDMAP **) emalloc(get_n_outfile() * sizeof(GRIDMAP *)); printlog("initializing maps "); for (i = 0; i < get_n_outfile(); i++) { if (get_outfile_namei(i) != NULL) { printlog("."); /* creating maps ..... */ if (get_method() == ISI) masks[0]->celltype = CT_UINT8; outmap[i] = map_dup(get_outfile_namei(i), masks[0]); } else outmap[i] = NULL; } printlog("\n"); if (bp->x == -1.0) { /* set default to map cellsize */ bp->x = masks[0]->cellsizex; bp->y = masks[0]->cellsizey; pr_warning("default block size set to dx=%g, dy=%g", bp->x, bp->y); } for (i = 0; i < get_n_vars(); i++) { if (d[i]->dummy) { d[i]->minX = masks[0]->x_ul + 0.5 * masks[0]->cellsizex; d[i]->maxX = masks[0]->x_ul + masks[0]->cellsizex * (masks[0]->cols - 0.5); d[i]->maxY = masks[0]->y_ul - 0.5 * masks[0]->cellsizey; d[i]->minY = masks[0]->y_ul - masks[0]->cellsizey * (masks[0]->rows - 0.5); d[i]->minZ = d[i]->maxZ = 0.0; } if (d[i]->togrid) datagrid_rebuild(d[i], 1); } break; } if (gl_nsim > 1) init_simulations(d); if (is_simulation(get_method()) && get_n_beta_set() != get_n_vars()) setup_beta(d, get_n_vars(), gl_nsim); } /* init_predictions() */