/* Authors Martin Schlather, schlather@math.uni-mannheim.de library for simulation of random fields -- get key strukture Copyright (C) 2001 -- 2017 Martin Schlather, This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //#include #include #include #include "questions.h" #include #include #include "Coordinate_systems.h" #include "operator.h" #include "Processes.h" #include "startGetNset.h" // PMI/PMI0 bool PMI_print_dollar = !true, PMI_print_mpp = !true, PMI_print_pgs = !true, PMI_print_details = !true, PMI_print_structure = !true, PMI_print_loc = true, PMI_print_fields = !true; int PMI_print_rect = 1; // 0, 1, 2 int MAX_PMI = 5; #define isInternalKappa(i) (!STRCMP(C->kappanames[i], INTERNAL_PARAM)) const char *FTshort[4] = {"-", "-", "F", "T"}; name_type FT = {"false", "true"}, TriNames = {"mismatch", "dep. next model", "dep. prev. model", "param. dependent", "false", "true", "normal mixture", "NaN"}; #define WHICH_USER 0 #define WHICH_INTERNAL 1 #define WHICH_CALL_USER 2 #define WHICH_CALL_INTERNAL 3 #define WHICH_USER_BUT_ONCE 4 #define WHICH_INTERNAL_BUT_ONCE 5 #define WHICH_USER_BUT_ONCE_JUMP 6 #define WHICH_INTERNAL_BUT_ONCE_JUMP 7 #define WHICH_ALL_USER 8 #define WHICH_ALL 3 model *WhichSub(model *cov, int which){ if (!equalsnowInterface(cov)) return cov; model *ans = cov; bool internfst = which == WHICH_INTERNAL || which == WHICH_USER_BUT_ONCE || which == WHICH_USER_BUT_ONCE_JUMP, userfst = which == WHICH_USER || which == WHICH_INTERNAL_BUT_ONCE || which==WHICH_INTERNAL_BUT_ONCE_JUMP; if (userfst || internfst){ if (cov->Splus != NULL && cov->Splus->keys_given) warning("for '+', it is unclear which path to take"); ans = internfst && ans->key != NULL ? ans->key : ans->sub[0]; if (ans == NULL) BUG; if (which == WHICH_USER_BUT_ONCE_JUMP) ans = ans->sub[0]; else if (which == WHICH_INTERNAL_BUT_ONCE_JUMP) ans = ans->key; if (ans == NULL) BUG; return ans; } // which == WHICH_ALL_USER return cov; } SEXP ScalarExtendedLogical(ext_bool x) { if (x == 0 || x == 1) return ScalarLogical(x); return ScalarInteger(x); } #define ExtBoolNames(x) \ ((x) == wahr ? "true" : \ (x) == falsch ? "false" : \ (x) == Paramdep ? "parameter dependent" : \ (x) == Submodeldep ? "depdending on submodel(s)" : \ (x) == Huetchenownsize ? "own gridsize" : \ "") SEXP RedMat(double* V, int row, int col, bool drop) { if (drop) return Num(V, row * col); return Mat(V, row, col); } SEXP RedMatInt(int* V, int row, int col, bool drop) { if (drop) return Int(V, row * col); return MatInt(V, row, col); } SEXP GetLocationUserInfo(location_type **loc) { int len; if (loc == NULL || (len = (*loc)->len) <= 0) return allocVector(VECSXP, 0); SEXP ans; PROTECT(ans = allocVector(VECSXP, len)); for (int i=0; iTime; if (L->distances) { int laenge = L->lx * (L->lx - 1) / 2; elmts += 2; PROTECT(namevec = allocVector(STRSXP, elmts)); PROTECT(l = allocVector(VECSXP, elmts)); SET_STRING_ELT(namevec, k, mkChar("distances")); SET_VECTOR_ELT(l, k++, RedMat(L->x, L->xdimOZ, laenge, L->xdimOZ == 1)); SET_STRING_ELT(namevec, k, mkChar("dim")); SET_VECTOR_ELT(l, k++, ScalarInteger(L->timespacedim)); } else { if (L->ly > 0) elmts++; elmts += 2; PROTECT(namevec = allocVector(STRSXP, elmts)); PROTECT(l = allocVector(VECSXP, elmts)); SET_STRING_ELT(namevec, k, mkChar("x")); if (L->grid) SET_VECTOR_ELT(l, k++, Mat(L->xgr[0], 3, L->spatialdim)); else SET_VECTOR_ELT(l, k++, Mat_t(L->x, L->lx, L->xdimOZ)); if (L->ly > 0) { SET_STRING_ELT(namevec, k, mkChar("y")); if (L->grid) SET_VECTOR_ELT(l, k++, Mat(L->ygr[0], 3, L->spatialdim)); else SET_VECTOR_ELT(l, k++, Mat_t(L->y, L->ly, L->xdimOZ)); } SET_STRING_ELT(namevec, k, mkChar("grid")); SET_VECTOR_ELT(l, k++, ScalarLogical(L->grid)); } if (L->Time) { SET_STRING_ELT(namevec, k, mkChar("T")); SET_VECTOR_ELT(l, k++, Num(L->T, 3)); } assert(k == elmts); setAttrib(l, R_NamesSymbol, namevec); SET_VECTOR_ELT(ans, i, l); UNPROTECT(2); } UNPROTECT(1); // l + namelvec return ans; } #define nlocinfo 13 SEXP GetLocationInfo(location_type *loc) { if (loc == NULL) return allocVector(VECSXP, 0); const char *info[nlocinfo] = {"timespacedim", "xdimOZ", "spatialdim", "spatialtotpts", "totpts", "distances", "grid", "has.time.comp", // Time geht nicht, da // Abkuerzungskollision mit "T" "xgr", "x", "T", "ygr", "y"}; SEXP namevec, l; int k, nloc = nlocinfo, timespacedim = loc->timespacedim, spdim = loc->spatialdim; if (loc->ly <= 0) nloc -= 2; PROTECT(l = allocVector(VECSXP, nloc)); PROTECT(namevec = allocVector(STRSXP, nloc)); for (k=0; kxdimOZ)); SET_VECTOR_ELT(l, k++, ScalarInteger(loc->spatialdim)); SET_VECTOR_ELT(l, k++, ScalarInteger((int) loc->spatialtotalpoints)); SET_VECTOR_ELT(l, k++, ScalarInteger((int) loc->totalpoints)); SET_VECTOR_ELT(l, k++, ScalarLogical(loc->distances)); SET_VECTOR_ELT(l, k++, ScalarLogical(loc->grid)); SET_VECTOR_ELT(l, k++, ScalarLogical(loc->Time)); SET_VECTOR_ELT(l, k++, Mat(loc->xgr[0], loc->grid ? 3 : 0, spdim)); // "xgr" SET_VECTOR_ELT(l, k++, Mat(loc->x, loc->xdimOZ, loc->grid ? 0 : loc->distances ? loc->lx * (loc->lx - 1) / 2 : loc->lx )); //"x" SET_VECTOR_ELT(l, k++, Num(loc->T, loc->Time ? 3 : 0));// "T" if (loc->ly > 0) { if (loc->distances) BUG; SET_VECTOR_ELT(l, k++, Mat(loc->ygr[0], loc->grid ? 3 : 0, spdim)); SET_VECTOR_ELT(l, k++, Mat(loc->y, loc->xdimOZ, loc->grid ? 0 : loc->ly)); } else { if (loc->ygr[0] != NULL || loc->y != NULL) BUG; } setAttrib(l, R_NamesSymbol, namevec); UNPROTECT(2); // l + namelvec assert(k == nloc); return l; } SEXP Param(model *cov, void* p, int nrow, int ncol, SEXPTYPE type, bool drop) { int i; if (p == NULL) { return allocVector(REALSXP, 0); } else { switch(type) { case REALSXP : return RedMat((double*) p, nrow, ncol, ncol==1 && drop); case INTSXP : return RedMatInt((int*) p, nrow, ncol, ncol==1 && drop); case STRSXP : return MatString((char**) p, nrow, ncol); case CLOSXP : BUG; case VECSXP : if (COVNR == COVARIATE) { return(GetLocationUserInfo(cov->Scovariate->loc)); } else { const char *info[1] = {"R list"}; return Char(info, 1); } break; case LANGSXP : { return Rf_duplicate(((sexp_type*) p)->sexp); // const char *info[1] = {"R object"}; return Char(info, 1); } break; case ENVSXP : { return Rf_duplicate(((sexp_type*) p)->sexp); // const char *info[1] = {"R environment"}; // return Char(info, 1); } break; default: if (type >= LISTOF){ SEXP dummy = NULL; PROTECT(dummy = allocVector(VECSXP, nrow)); listoftype *q = (listoftype *) p; for (i=0; ilpx[i], q->nrow[i], q->ncol[i], REALSXP, false)); } UNPROTECT(1); return dummy; } else { BUG; } } // switch } BUG; return NULL; } SEXP Param(model *cov, int i, SEXPTYPE type, bool drop) { return Param(cov, (void*) cov->px[i], cov->nrow[i], cov->ncol[i], type, drop); } #define nsimuinfo 3 SEXP GetSimuInfo(simu_storage *simu) { if (simu == NULL) return allocVector(VECSXP, 0); const char *info[nsimuinfo] = {"active", "pair", "expect.simu"}; SEXP namevec, l; int k; PROTECT(l = allocVector(VECSXP, nsimuinfo)); PROTECT(namevec = allocVector(STRSXP, nsimuinfo)); for (k=0; kactive)); SET_VECTOR_ELT(l, k++, ScalarLogical(simu->pair)); SET_VECTOR_ELT(l, k++, ScalarInteger(simu->expected_number_simu)); assert(k==nsimuinfo); setAttrib(l, R_NamesSymbol, namevec); UNPROTECT(2); // l + namelvec assert(k == nsimuinfo); return l; } SEXP IGetModelInfo(model *cov, int prlevel, bool both, int spConform, int whichSub, int Level, sort_origin origin) { // level 6 : only isoown assert(whichSub >=WHICH_USER && whichSub <= WHICH_ALL); // whichSub: 0=submodels, 1=keys, 2=both #include "primitive.h" #define ninfobase 3 #define ninfo0 0 #define ninfo1 6 #define ninfo2 9 #define ninfo3 6 #define ninfo4 4 /* !!!!! ACHTUNG !!!!! Wenn diese Funktion geaendert wird, muss auch GetModelInfo geaendert werden !!!!! !!!!! */ if (cov == NULL) return allocVector(VECSXP, 0); SEXP Model, submodels, nameMvec, param, pnames; int i, j, nmodelinfo, prL = prlevel > 5 ? 0 : prlevel, notnull = 0, k = 0; defn *C = DefList + COVNR; // nicht gatternr location_type *loc = cov->calling == NULL ? PrevLoc(cov) : Loc(cov); bool return_param, param_ok[MAXPARAM + 1], given_key = cov->Splus != NULL && cov->Splus->keys_given, return_key = given_key && whichSub != WHICH_USER, return_sub = cov->nsub > 0 && (whichSub != WHICH_INTERNAL || !given_key), show_param = prL >= 1; for (i=0; ikappas; i++) { int old_nn = notnull; sortsofparam sort = SortOf(cov, i, 1, 1, origin); if ((param_ok[i] = sort <= LASTRETURNED)) { if (both) { notnull += cov->nrow[i]>0 && cov->ncol[i]>0 && show_param; notnull += cov->kappasub[i] != NULL; } else { notnull += (cov->nrow[i]>0 && cov->ncol[i]>0 && show_param) || cov->kappasub[i] != NULL; } param_ok[i] = notnull > old_nn; } } return_param = notnull > 0; nmodelinfo = ninfobase + (int) return_param; switch(prL) { case 5 : nmodelinfo += ninfo4; FALLTHROUGH_OK; case 4 : nmodelinfo += ninfo3; FALLTHROUGH_OK; case 3 : nmodelinfo += ninfo2; FALLTHROUGH_OK; case 2 : nmodelinfo += ninfo1; FALLTHROUGH_OK; case 1 : nmodelinfo += ninfo0; break; default: { switch(prlevel) { case 0 : break; case 6 : nmodelinfo += 1; break; default : ERR("Possible 'level' values range from 0 to 6."); } } } if (!return_sub) nmodelinfo--; if (!return_key) nmodelinfo--; PROTECT(Model = allocVector(VECSXP, nmodelinfo)); PROTECT(nameMvec = allocVector(STRSXP, nmodelinfo)); SET_STRING_ELT(nameMvec, k, mkChar("name")); defn *CC = DefList + COVNR; // nicht gatternr579 while(STRNCMP(CC->name, InternalName, STRLEN(InternalName)) ==0) CC--; if (true || spConform) { SET_VECTOR_ELT(Model, k++, mkString(CC->nick)); } else { SET_VECTOR_ELT(Model, k++, mkString(CC->name)); } if (prlevel == 6) { SET_STRING_ELT(nameMvec, k, mkChar("coordinates")); SET_VECTOR_ELT(Model, k++, mkString(ISO_NAMES[CoordinateSystemOf(OWNISO(0))])); } if (return_param) { PROTECT(param = allocVector(VECSXP, notnull)); PROTECT(pnames = allocVector(STRSXP, notnull)); for (j=i=0; ikappas; i++) { if (!param_ok[i]) continue; if (cov->kappasub[i] != NULL) { SET_STRING_ELT(pnames, j, mkChar(OWNKAPPA(C, i))); SET_VECTOR_ELT(param, j, IGetModelInfo(cov->kappasub[i], prlevel, both, spConform, whichSub, Level + 1, origin)); j++; if (!both) continue; } if (show_param && cov->nrow[i]>0 && cov->ncol[i]>0) { if (isAnyDollar(cov) && i==DANISO) { SET_STRING_ELT(pnames, j, mkChar("Aniso")); double *Aniso = (double*) MALLOC(cov->nrow[i] * cov->ncol[i] * sizeof(double)); int t,l,m; for (t=l=0; lnrow[i]; l++) { for (m=0; mncol[i]; m++) { Aniso[t++] = P(DANISO)[m * cov->nrow[i] + l]; } } SET_VECTOR_ELT(param, j, Param(cov, (void*) Aniso, cov->nrow[i], cov->ncol[i], C->kappatype[i], true)); FREE(Aniso); j++; continue; } SET_STRING_ELT(pnames, j, mkChar(OWNKAPPA(C, i))); SET_VECTOR_ELT(param, j, Param(cov, i, C->kappatype[i], true)); j++; } } setAttrib(param, R_NamesSymbol, pnames); SET_STRING_ELT(nameMvec, k, mkChar(prlevel > 5 ? "submodels" : "param")); SET_VECTOR_ELT(Model, k++, param); UNPROTECT(2); } if (prL>=2) { SET_STRING_ELT(nameMvec, k, mkChar("covnr")); SET_VECTOR_ELT(Model, k++, ScalarInteger(COVNR)); SET_STRING_ELT(nameMvec, k, mkChar("vdim")); SET_VECTOR_ELT(Model, k++, ScalarInteger(VDIM0) // VDIM0 == VDIM1 // ? ScalarInteger(VDIM0) // : Int(cov->vdim, 2) ); // SET_STRING_ELT(nameMvec, k, mkChar("naturalscaling")); // SET_VECTOR_ELT(Model, k++, ScalarInteger(cov->naturalscaling)); SET_STRING_ELT(nameMvec, k, mkChar("logicaldim")); SET_VECTOR_ELT(Model, k++, ScalarInteger(OWNLOGDIM(0))); SET_STRING_ELT(nameMvec, k, mkChar("prev.xdim")); SET_VECTOR_ELT(Model, k++, ScalarInteger(PREVXDIM(0))); SET_STRING_ELT(nameMvec, k, mkChar("own.xdim")); SET_VECTOR_ELT(Model, k++, ScalarInteger(OWNXDIM(0))); SET_STRING_ELT(nameMvec, k, mkChar("indep.of.x")); SET_VECTOR_ELT(Model, k++, ScalarLogical(cov->matrix_indep_of_x)); } if (prL>=3) { SET_STRING_ELT(nameMvec, k, mkChar("type")); SET_VECTOR_ELT(Model, k++, Char(TYPE_NAMES + OWNTYPE(0), 1)); SET_STRING_ELT(nameMvec, k, mkChar("frame")); SET_VECTOR_ELT(Model, k++, Char(TYPE_NAMES + cov->frame, 1)); SET_STRING_ELT(nameMvec, k, mkChar("domown")); SET_VECTOR_ELT(Model, k++, mkString(DOMAIN_NAMES[OWNDOM(0)])); SET_STRING_ELT(nameMvec, k, mkChar("isoown")); SET_VECTOR_ELT(Model, k++, mkString(ISO_NAMES[OWNISO(0)])); if (prL >= 5) { SET_STRING_ELT(nameMvec, k, mkChar("isoprev")); SET_VECTOR_ELT(Model, k++, mkString(ISO_NAMES[PREVISO(0)])); } SET_STRING_ELT(nameMvec, k, mkChar("internalq")); SET_VECTOR_ELT(Model, k++, Num(cov->q, cov->qlen)); SET_STRING_ELT(nameMvec, k, mkChar("storage")); if (cov->SlocalCE != NULL) { int which = (VDIM0 > 1) * 2 + (CC->check != check_co); // 0:co; 1:intr; 2:multvariate co SEXP storage, namestorage; int L = 0, storage_size = 2 + (which <= 1 ? 4 : 8); localCE_storage *S0 = cov->SlocalCE; localvariab *S = S0->q + 0; PROTECT(storage = allocVector(VECSXP, storage_size)); PROTECT(namestorage = allocVector(STRSXP, storage_size)); SET_STRING_ELT(namestorage, L, mkChar("R")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->R)); SET_STRING_ELT(namestorage, L, mkChar("a")); SET_VECTOR_ELT(storage, L++, ScalarInteger(S->a)); switch(which) { case 0 : SET_STRING_ELT(namestorage, L, mkChar("constant")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cutoff.constant)); SET_STRING_ELT(namestorage, L, mkChar("b")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cutoff.b)); SET_STRING_ELT(namestorage, L, mkChar("asqrtr")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cutoff.asqrtr)); SET_STRING_ELT(namestorage, L, mkChar("R_theor")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cutoff.theor)); break; case 1: SET_STRING_ELT(namestorage, L, mkChar("A0")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->intrinsic.A0)); SET_STRING_ELT(namestorage, L, mkChar("A2")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->intrinsic.A2)); SET_STRING_ELT(namestorage, L, mkChar("B")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->intrinsic.B)); SET_STRING_ELT(namestorage, L, mkChar("MAX")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->intrinsic.MAX)); break; case 2: SET_STRING_ELT(namestorage, L, mkChar("constant")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.constant)); SET_STRING_ELT(namestorage, L, mkChar("R")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.R)); SET_STRING_ELT(namestorage, L, mkChar("A")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.A)); SET_STRING_ELT(namestorage, L, mkChar("B")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.B)); SET_STRING_ELT(namestorage, L, mkChar("C")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.C)); SET_STRING_ELT(namestorage, L, mkChar("N")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.N)); SET_STRING_ELT(namestorage, L, mkChar("M")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.M)); SET_STRING_ELT(namestorage, L, mkChar("L")); SET_VECTOR_ELT(storage, L++, ScalarReal(S->cube.L)); break; default : BUG; } assert(L == storage_size); setAttrib(storage, R_NamesSymbol, namestorage); SET_VECTOR_ELT(Model, k++, storage); UNPROTECT(2); } else SET_VECTOR_ELT(Model, k++, allocVector(VECSXP, 0)); SET_STRING_ELT(nameMvec, k, mkChar("pref")); SET_VECTOR_ELT(Model, k++, Int(cov->pref, Nothing + 1)); SET_STRING_ELT(nameMvec, k, mkChar("simu")); SET_VECTOR_ELT(Model, k++, GetSimuInfo(&(cov->simu))); SET_STRING_ELT(nameMvec, k, mkChar("loc")); if (Level == 0 || cov->calling == NULL || Loc(cov->calling) != Loc(cov)) SET_VECTOR_ELT(Model, k++, GetLocationInfo(loc)); else SET_VECTOR_ELT(Model, k++, mkString(Loc(cov) == NULL ? "no locations given" : "same as calling model")); } if (prL >= 4) { // printf("k=%d\n", k); SET_STRING_ELT(nameMvec, k, mkChar("logspeed")); SET_VECTOR_ELT(Model, k++, ScalarReal(cov->logspeed)); SET_STRING_ELT(nameMvec, k, mkChar("maxdim")); SET_VECTOR_ELT(Model, k++, ScalarInteger(MAXDIM(OWN, 0))); SET_STRING_ELT(nameMvec, k, mkChar("full_derivs")); SET_VECTOR_ELT(Model, k++, ScalarInteger(cov->full_derivs)); SET_STRING_ELT(nameMvec, k, mkChar("loggiven")); SET_VECTOR_ELT(Model, k++, ScalarLogical(cov->loggiven)); SET_STRING_ELT(nameMvec, k, mkChar("monotone")); int idx = cov->monotone - (int) MON_UNSET; if (idx < 0 || idx > BERNSTEIN - (int) MON_UNSET) { PRINTF("monotone %d %d %d\n", cov->monotone, MON_UNSET, cov->monotone - (int) MON_UNSET); BUG; } SET_VECTOR_ELT(Model, k++, Char(MONOTONE_NAMES + idx, 1)); SET_STRING_ELT(nameMvec, k, mkChar("finiterange")); SET_VECTOR_ELT(Model, k++, ScalarExtendedLogical(cov->finiterange)); // printf("ek=%d\n", k); } if (prL>=5) { mpp_properties *Mpp = &(cov->mpp); int vdim = VDIM0, nm = cov->mpp.moments, nmvdim = (nm + 1) * vdim; // SET_STRING_ELT(nameMvec, k, mkChar("mpp.refradius")); // SET_VECTOR_ELT(Model, k++, ScalarReal(mpp->refradius)); SET_STRING_ELT(nameMvec, k, mkChar("mpp.maxheight")); SET_VECTOR_ELT(Model, k++, Num(Mpp->maxheights, vdim, MAXINT)); SET_STRING_ELT(nameMvec, k, mkChar("mpp.M")); SET_STRING_ELT(nameMvec, k+1, mkChar("mpp.Mplus")); if (nm == 0) { SET_VECTOR_ELT(Model, k++, R_NilValue); SET_VECTOR_ELT(Model, k++, R_NilValue); } else { SET_VECTOR_ELT(Model, k++, Num(Mpp->mM, nmvdim, MAXINT)); SET_VECTOR_ELT(Model, k++, Num(Mpp->mMplus, nmvdim, MAXINT)); } } if (return_key) { if (cov->key != NULL) { SET_STRING_ELT(nameMvec, k, mkChar("internal")); SET_VECTOR_ELT(Model, k++, IGetModelInfo(cov->key, prlevel, both, spConform, whichSub, Level + 1, origin)); } else { /// COVNR == PLUS/M && cov->Splus != NULL int ii, n, subs = C->maxsub; SEXP keys; SET_STRING_ELT(nameMvec, k, mkChar("internal")); for (ii=n=0; iiSplus->keys[ii] != NULL) n++; PROTECT(keys = allocVector(VECSXP, n)); for (ii=n=0; iiSplus->keys[ii] != NULL) SET_VECTOR_ELT(keys, n++, IGetModelInfo(cov->Splus->keys[ii], prlevel, both, spConform, whichSub, Level + 1, origin)); SET_VECTOR_ELT(Model, k++, keys); UNPROTECT(1); } } if (return_sub) { SET_STRING_ELT(nameMvec, k, mkChar("submodels")); PROTECT(submodels = allocVector(VECSXP, cov->nsub)); int zaehler = 0; for (i=0; isub[i] != NULL) { SET_VECTOR_ELT(submodels, zaehler, IGetModelInfo(cov->sub[i], prlevel, both, spConform, whichSub, Level + 1, origin)); if (++zaehler >= cov->nsub) break; } } SET_VECTOR_ELT(Model, k++, submodels); UNPROTECT(1); } setAttrib(Model, R_NamesSymbol, nameMvec); assert(k==nmodelinfo); UNPROTECT(2); // model + nameModelvec return Model; } SEXP GetModelInfo(SEXP keynr, SEXP Prlevel, SEXP spConform, SEXP whichSub, SEXP origin) { int knr = INTEGER(keynr)[0], which = INTEGER(whichSub)[0] == WHICH_ALL_USER ? WHICH_ALL : INTEGER(whichSub)[0] % 2, prlevel = std::abs(INTEGER(Prlevel)[0]) % 10; bool both = INTEGER(Prlevel)[0] < 0, delete_call = std::abs(INTEGER(Prlevel)[0]) < 10; model *cov, *orig; SEXP res, names; model **key = KEY(); if (knr>=0 && knr <= MODEL_MAX && key[knr] != NULL) { orig = key[knr]; cov = WhichSub(orig, INTEGER(whichSub)[0]); res = IGetModelInfo(cov, prlevel, both, (bool) INTEGER(spConform)[0], which, 0, (sort_origin) INTEGER(origin)[0]); if (prlevel>=1 && delete_call) { PROTECT(names = getAttrib(res, R_NamesSymbol)); int i, len = length(names); for (i=0; icalling == NULL, cov, cov->calling); if (cov->calling == NULL) { PRINTF(" *** "); } else { // if (cov->calling == cov) crash(); assert(cov->calling != cov); Path(cov->calling, cov); } if (sub == NULL) return; if (cov->key == sub) { PRINTF("%s.key.%d%s", C->nick, cov->zaehler, sep); return; } int i; for (i=0; imaxsub; i++) { if (cov->sub[i] == sub) { PRINTF("%s[%s,%d].%d%s", C->nick, C->subnames[i], i, cov->zaehler, sep); return; } } //assert(cov->Splus == NULL || cov->Splus->keys_given); if (cov->Splus != NULL) { //&& cov->Splus->keys_given) { for (i=0; imaxsub; i++) { if (cov->Splus->keys[i] == sub) { PRINTF("%s.S[%d].%d%s", C->nick, i, cov->zaehler, sep); return; } } } for (i=0; ikappas; i++) { if (cov->kappasub[i] == sub) { PRINTF("%s.%s.%d%s", C->nick, OWNKAPPA(C, i), cov->zaehler, sep); return; } } PRINTF("%s (UNKNOWN,%d)%s", C->nick, cov->zaehler, sep); } void leer(int level){ char format[255]; if (level == 0) return; SPRINTF(format,"%%%ds", -level * 3); PRINTF(format, ""); } void PrintPoints(location_type *loc, char *name, double *x, coord_type xgr, long lx) { #ifndef SHOW_ADDRESSES return; // unclear Error below on CRAN #endif #define maxpts 100 int i; if (loc->grid) { PRINTF("loc:%sgr ", name); for (i=0; itimespacedim - loc->Time; i++) { PRINTF("(%3.3f, %3.3f, %2.0f) ", xgr[i][XSTART], xgr[i][XSTEP], xgr[i][XLENGTH]); } } else { PRINTF("loc:%s [%d] ", name, lx); if (lx <= 0) { PRINTF("not given! (%d)", addressbits(loc->x)); } else { long total = loc->distances ? lx * (lx-1) / 2 : lx * loc->xdimOZ, endfor = total; if (endfor > maxpts) endfor = maxpts; for (i=0; ixdimOZ == 0) { PRINTF(";"); } PRINTF(" "); } if (endfor < total) { PRINTF("... [%ld not shown]", total - endfor); } } } PRINTF("\n"); } void PrintLoc(int level, location_type *loc, bool own) { int i; if (loc == NULL) { leer(level); PRINTF("%-10s %s\n", "loc:", "not given"); return; } if (own) { leer(level); PRINTF("%-10s %d\n", "own is set:", addressbits(loc)); } leer(level); PRINTF("%-10s %d %d %d\n","loc:ts,sp,xdimOZ", loc->timespacedim, loc->spatialdim, loc->xdimOZ); leer(level); PRINTF("%-10s %d\n", "loc:lx", loc->lx); leer(level); PRINTF("%-10s %d %d\n","loc:totpts", loc->spatialtotalpoints, loc->totalpoints); leer(level); PRINTF("%-10s %d\n","loc:len", loc->len); leer(level); PRINTF("%-10s %s\n","loc:grid", FT[loc->grid]); leer(level); PRINTF("%-10s %s\n","loc:dist", FT[loc->distances]); leer(level); PRINTF("%-10s %s\n","loc:Time", FT[loc->Time]); #ifdef SHOW_ADDRESSES leer(level); PrintPoints(loc, (char *) "x", loc->x, loc->xgr, loc->lx); if (loc->y!=NULL || loc->ygr[0]!=NULL) { assert(loc->ly > 0); leer(level); PrintPoints(loc, (char*) "y", loc->y, loc->ygr, loc->ly); } #else leer(level); PRINTF("loc:x,y\t addresses not shown\n"); #endif if (loc->Time) { leer(level); PRINTF("%-10s (%g %g %g)\n", "loc:T", loc->T[0], loc->T[1], loc->T[2]); } leer(level); PRINTF("%-10s ","loc:cansio"); if (loc->caniso == NULL) { PRINTF("null\n"); } else { int endfor = loc->cani_nrow * loc->cani_ncol; PRINTF(" [%d, %d] ", loc->cani_nrow, loc->cani_ncol); if (endfor > MAX_PMI) endfor = MAX_PMI; for (i=0; icaniso[i]); PRINTF("\n"); } } void PRINTMAX(double *a, int n, int max) { if (n <= max + 2) for (int i=0; i") #define PRINTINT(X) \ if ((X) == NA_INTEGER) { PRINTF(" NA(int)");} else PRINTF(" %d", X) #define TREE_MAXSTORAGE 20 int getroot(model *root, model *storage[TREE_MAXSTORAGE]) { if (root->calling != NULL) { int n = getroot(root->calling, storage); if (n >= TREE_MAXSTORAGE) BUG; storage[n] = root; return n+1; } storage[0] = root; return 1; } #define P10(X,Y) PRINTF(FABS(Y) < 1e-6 || FABS(Y) > 1e8 ? "%-10s %10e\n" : "%-10s %g\n", X, Y); void pmi(model *cov, char all_subs, int level, int maxlevel, int stor_level, model *storage[TREE_MAXSTORAGE]) { int endfor; defn *C = DefList + COVNR; // nicht gatternr #define MNlength 4 char MN[Forbidden + 1][MNlength], name[100]; //if (storage != NULL) //printf("storage=%d %s %s \n", stor_level,NAME(storage[stor_level]),NAME(cov)); if (storage != NULL && storage[stor_level] != cov) return; //int n = 2; if (level > maxlevel) { leer(level); PRINTF("'%s' [%d] left out\n", NAME(cov), cov->zaehler); // printI(cov); return; } for (int i=0; i<=Forbidden; i++) { strcopyN(MN[i], METHOD_NAMES[i], MNlength); } defn *CC = C; while(STRCMP(CC->name, InternalName) ==0) CC--; if (level == 0) { PRINTF("****** %s (%d; V=%d of %d) ****** [%d]", CC->nick, COVNR, cov->variant, CC->variants, cov->zaehler); } else PRINTF(" **** %s (%d; %d of %d) **** [%d]", CC->nick, COVNR, cov->variant, CC->variants, cov->zaehler); PRINTF("\n"); // printI(cov);printD(cov); leer(level); PRINTF("%-10s %s\n", "param", C->kappas == 0 ? "none" : ""); for(int i=0; ikappas; i++) { // printf("[[ %s %s ]] ", C->kappanames[i], // cov->ownkappanames != NULL ? cov->ownkappanames[i] : "---"); STRCPY(name, OWNKAPPA(C, i)); name[9] = '\0'; if (PisNULL(i)) { if (i>0 && C->kappas > 6 && cov->kappasub[i] == NULL) { if (!PisNULL(i-1) || cov->kappasub[i-1] != NULL) leer(level + 1); else PRINTF(", "); PRINTF("%s", name); if (i+1 == C->kappas || (i+1 < C->kappas && (!PisNULL(i+1) || cov->kappasub[i+1] != NULL))){ PRINTF(": NULL"); } else continue; } else { leer(level + 1); PRINTF("%-10s", name); PRINTF(" NULL"); } } else { // ! PisNULL leer(level + 1); PRINTF("%-10s", name); int size = endfor = NROW(i) * NCOL(i); if (C->kappatype[i] < LISTOF) { if (endfor > MAX_PMI) endfor = MAX_PMI; if (NCOL(i)==1 && NROW(i) > 1) { PRINTF("[%d] ", NROW(i)); } else PRINTF("[%d, %d] ", NROW(i), NCOL(i)); } switch(C->kappatype[i]) { case REALSXP : for (int j=0; j"); break; case VECSXP : PRINTF("< some R list >"); break; case LANGSXP: PRINTF("< language expression >"); break; case ENVSXP : PRINTF("< R environment >"); break; case LISTOF + REALSXP : { int ende=0, k_max = 100, k_end = NROW(i); listoftype *p= PLIST(i); PRINTF("list [%d]\n", cov->nrow[i]); if (k_end > k_max) k_end = k_max; for (int k=0; kncol[k]==1) { if (p->nrow[k]==1) { PRINTREAL(p->lpx[k][0]); } else { PRINTF("[%d] ", p->nrow[k]); ende = endfor = p->nrow[k]; if (endfor > MAX_PMI) endfor = MAX_PMI; for (int j=0; jlpx[k][j]); } } else { PRINTF("[%d, %d] ", p->nrow[k], p->ncol[k]); ende = endfor = p->nrow[k] * p->ncol[k]; if (endfor > MAX_PMI) endfor = MAX_PMI; for (int j=0; jlpx[k][j]); } if (ende > MAX_PMI) { PRINTF("..."); } if (knrow[i]-1) { PRINTF("\n"); } } if (k_end < cov->nrow[i]) { leer(level + 2); PRINTF("...\n"); } } break; default: PRINTF("%s (%d)'s kappatype(%d) = %d\n", NAME(cov), COVNR, i, C->kappatype[i]); BUG; } // switch if (C->kappatype[i] < LISTOF && size > MAX_PMI) { PRINTF(" ..."); } } if (cov->kappasub[i] != NULL) { PRINTF(" <="); pmi(cov->kappasub[i], all_subs, level + 3, maxlevel, stor_level, storage); } PRINTF("\n"); } // for if (cov->Sset != NULL) { model *from = cov->Sset->remote; leer(level + 1); PRINTF("%-10s%s [s%d]\n", "", Nick(from), from->zaehler); } if (cov->SlocalCE != NULL) { int which = (VDIM0 > 1) * 2 + (CC->check != check_co); localCE_storage *S0 = cov->SlocalCE; localvariab *q = S0->q2; leer(level); PRINTF("%-10s\n", "SlocalCE->q2"); switch(which) { case 0 : leer(level + 1);PRINTF("%-10s %3.3f %3.3f %3.3f %g\n", "constant", q[0].cutoff.constant, q[1].cutoff.constant, q[2].cutoff.constant, q[3].cutoff.constant); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "b", q[0].cutoff.b, q[1].cutoff.b, q[2].cutoff.b, q[3].cutoff.b); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "asqrtr", q[0].cutoff.asqrtr, q[1].cutoff.asqrtr, q[2].cutoff.asqrtr, q[3].cutoff.asqrtr); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "R_theor", q[0].cutoff.theor, q[1].cutoff.theor, q[2].cutoff.theor, q[3].cutoff.theor); break; case 1: leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "A0", q[0].intrinsic.A0, q[1].intrinsic.A0, q[2].intrinsic.A0, q[3].intrinsic.A0); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "A2", q[0].intrinsic.A2, q[1].intrinsic.A2, q[2].intrinsic.A2, q[3].intrinsic.A2); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "B", q[0].intrinsic.B, q[1].intrinsic.B, q[2].intrinsic.B, q[3].intrinsic.B); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "MAX", q[0].intrinsic.MAX, q[1].intrinsic.MAX, q[2].intrinsic.MAX, q[3].intrinsic.MAX); break; case 2: leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "constant", q[0].cube.constant, q[1].cube.constant, q[2].cube.constant, q[3].cube.constant); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "R", q[0].cube.R, q[1].cube.R, q[2].cube.R, q[3].cube.R); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "A", q[0].cube.A, q[1].cube.A, q[2].cube.A,q[3].cube.A); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "B", q[0].cube.B, q[1].cube.B, q[2].cube.B,q[3].cube.B); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "C", q[0].cube.C, q[1].cube.C, q[2].cube.C,q[3].cube.C); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "N", q[0].cube.N, q[1].cube.N, q[2].cube.N,q[3].cube.N); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "M", q[0].cube.M, q[1].cube.M, q[2].cube.M,q[3].cube.M); leer(level + 1);PRINTF("%-10s %g %g %g %g\n", "L", q[0].cube.L, q[1].cube.L, q[2].cube.L,q[3].cube.L); break; default : BUG; } } else if (cov->qlen > 0) { leer(level); PRINTF("%-10s", "internal-q"); endfor = cov->qlen; if (endfor > MAX_PMI) endfor = MAX_PMI; for (int i=0; iq[i]); PRINTF("\n"); } if (cov->calling == NULL && level != 0) { PRINTF("current model is %s\n", NICK(cov)); BUG; } leer(level); if (cov->calling==NULL) { PRINTF("%-10s %s\n","calling", "NULL");} else PRINTF("%-10s %s [%d]\n","calling", Nick(cov->calling), cov->calling->zaehler); //if (cov->root == NULL) crash(); assert(cov->root != NULL); assert(cov->base != NULL); if (level == 0 || PMI_print_structure) { leer(level); PRINTF("%-10s %s [%d]; KEY=%lu (%d)\n", "root", NAME(cov->root), cov->root->zaehler, (uintptr_t) KEYtypeOf(cov), KEYtypeOf(cov)->currentRegister); } int o, g = NRi(GATTER[0]), // OK p = NRi(PREV[0]); // OK if (PMI_print_structure){ leer(level); PRINTF("%-10s %s (%d) / %s (%d)\n","prev/#", p==UNSET ? "unset" : p >=0 ? DefList[p].name : "none", p, g==UNSET ? "unset" : g >=0 ? DefList[g].name : "none", g); } // ACHTUNG: NICHT DIE ABKUERZUNGEN PREVDOM ETC VERWENDEN, DA HIER // KEIN PLAUSIBILITAETS C H E C K GEMACHT WERDEN SOLL p = (int) DOMi(PREV[0]); // OK g = (int) DOMi(GATTER[0]); // OK o = (int) DOMi(OWN[0]); // OK leer(level); PRINTF("%-10s %d/%d/%d (%s/%s/%s)\n","dom", p, g, o, DOMAIN_NAMES[(int) p], DOMAIN_NAMES[(int) g], DOMAIN_NAMES[(int) o]); p = (int) ISOi(PREV[0]); // OK g = (int) ISOi(GATTER[0]); // OK o = (int) ISOi(OWN[0]); // OK leer(level); PRINTF("%-10s %d/%d/%d (%s/%s/%s)\n","iso", p, g, o, ISO_NAMES[p], ISO_NAMES[g], ISO_NAMES[o]); p = (int) XDIMi(PREV[0]); // OK g = (int) XDIMi(GATTER[0]); // OK o = (int) XDIMi(OWN[0]); // OK int lp = (int) LOGDIMi(PREV[0]), // OK lg = (int) LOGDIMi(GATTER[0]), // OK lo = (int) LOGDIMi(OWN[0]); // OK leer(level); PRINTF("%-10s %d:%d:%d, %d:%d:%d, %d,%d\n","l-x-v-dim", lp, lg, lo, p, g, o, VDIM0, VDIM1); // OK if (PMI_print_structure) { leer(level); PRINTF("%-10s %s\n","rand.kappa", FT[cov->randomkappa]); leer(level); PRINTF("%-10s %d\n","variant", (int) cov->variant); o = (int) MAXDIMi(OWN[0]); // OK leer(level); PRINTF("%-10s %d\n","maxdim", o); leer(level); PRINTF("%-10s %d %d %d likeli==%d locCE=%d \n","stor/2/extra", addressbits(cov->Sgen), addressbits(cov->Sgatter), addressbits(cov->Sextra), addressbits(cov->Slikelihood), addressbits(cov->SlocalCE) ); leer(level); PRINTF("%-10s ","S"); #define S(X) if (cov->S##X == NULL) {} else{ PRINTF("%s, ", #X); } S(ce); S(localCE); S(approxCE); S(direct); S(hyper); S(nugget); S(plus); S(sequ); S(tbm); S(trend); S(br); S(get); S(pgs); S(set); S(polygon); S(rect); S(dollar); S(earth); S(extra); S(solve); S(biwm); S(bistable); S(scatter); S(mcmc); S(gen); S(likelihood); S(covariate); S(mle); if (cov->Sgatter == NULL) { PRINTF("gatter=NULL!, "); } PRINTF("\n"); if (cov->Splus != NULL) { leer(level); PRINTF("%-10s ","conform"); bool *conform = cov->Splus->conform; for (int i=0; insub; i++) PRINTF("%s", conform[i] ? "T" : "F"); PRINTF("\n"); } leer(level); PRINTF("%-10s %s\n","simu:activ", FT[cov->simu.active]); leer(level); PRINTF("%-10s %s\n"," pair", FT[cov->simu.pair]); leer(level); PRINTF("%-10s %d\n"," expect", cov->simu.expected_number_simu); } p = (int) TYPEi(PREV[0]); // OK g = (int) TYPEi(GATTER[0]); // OK o = (int) TYPEi(OWN[0]); // OK leer(level); PRINTF("%-10s %d/%d/%d %s/%s/%s\n", "type", p, g, o, TYPE_NAMES[p], TYPE_NAMES[g], TYPE_NAMES[o]); leer(level); PRINTF("%-10s %s\n","frame", TYPE_NAMES[cov->frame]); if (cov->err != NOERROR) { leer(level); PRINTF(" ! %-s ! level=%d err=%d (%s)\n","error", cov->err_level, cov->err, cov->err_msg); } if (PMI_print_details) { leer(level); PRINTF("%-10s %s\n","user_given", cov->user_given == ug_internal ? "internal" : cov->user_given == ug_explicit ? "explicit" : "implicit"); leer(level); P10("logspeed", cov->logspeed); leer(level); PRINTF("%-10s %d, %d\n","full/rese deriv's", cov->full_derivs, cov->rese_derivs); leer(level); PRINTF("%-10s %s\n","loggiven", FT[cov->loggiven]); int idx = cov->monotone - (int) MON_UNSET; if (idx < 0 || idx > BERNSTEIN - (int) MON_UNSET) { PRINTF("monotone %d %d %d\n", cov->monotone, MON_UNSET, cov->monotone - (int) MON_UNSET); BUG; } leer(level); PRINTF("%-10s %s (%d)\n","monotone", MONOTONE_NAMES[idx], cov->monotone); leer(level); PRINTF("%-10s %s (%d)\n","pointwise", POSITIVITY_NAMES[cov->ptwise_definite], cov->ptwise_definite); leer(level); PRINTF("%-10s %s\n","finiterng", TriNames[cov->finiterange - MISMATCH]); if (cov->taylorN > 0) { for (int d=0; dtaylorN; d++) { leer(level); PRINTF("%-10s c%d=%g p%d=%g\n", d==0 ? "taylor" : "", d, cov->taylor[d][TaylorConst], d, cov->taylor[d][TaylorPow]); } } else {leer(level); PRINTF("%-10s %s\n", "taylor", "undetermined");} if (cov->tailN > 0) { for (int d=0; dtailN; d++) { leer(level); PRINTF("%-10s c%d=%4.3f p%d=%4.3f ce%d=%4.3f pe%d=%4.3f\n", d==0 ? "tailtlr" : "", d, cov->tail[d][TaylorConst], d, cov->tail[d][TaylorPow], d, cov->tail[d][TaylorExpConst], d, cov->tail[d][TaylorExpPow]); } } else {leer(level); PRINTF("%-10s %s\n", "tailtlr", "undetermined");} } if (PMI_print_fields) { leer(level); PRINTF("%-10s %s\n","method", METHOD_NAMES[cov->method]); leer(level); PRINTF("%-10s %s\n","initialised", FT[cov->initialised]); leer(level); PRINTF("%-10s %s\n","fieldret",ExtBoolNames(cov->fieldreturn)); leer(level); PRINTF("%-10s %s\n","origrf", FT[cov->origrf]); leer(level); PRINTF("%-10s %d\n","rf", addressbits(cov->rf)); leer(level); PRINTF("%-10s %s\n","checked", FT[cov->checked]); leer(level); PRINTF("%-10s ", "pref"); int i; for (i=0; i<=Sequential; i++) PRINTF("%s:%d ", MN[i], (int) cov->pref[i]); PRINTF("\n"); leer(level); PRINTF("%-10s ", ""); for (; i<=Nothing; i++) PRINTF("%s:%d ", MN[i], (int) cov->pref[i]); PRINTF("\n"); } //leer(level); PRINTF("%-10s %d\n","naturalscaling", cov->naturalscaling); //leer(level); PRINTF("%-10s %d\n","init",DefList[COVNR].init!=init_failed); //leer(level); PRINTF("%-10s %d\n","spec:nmetro", cov->spec.nmetro); //leer(level); P10("spec:sigma", cov->spec.sigma); if (PMI_print_dollar && cov->Sdollar != NULL) { leer(level); PRINTF("%-10s ", "separabel", cov->Sdollar->separable); // currently none } if (PMI_print_details) { if (cov->Sextra != NULL) { extra_storage *s = cov->Sextra; #define PE(a1) \ if (s->a1 == NULL) {\ if (s->n_##a1!=0) { ERR1("%.50s=NULL; n<>0 !! ERROR !!\n", #a1); } \ } else if (s->n_##a1 == 0) { ERR1("%.50s<>NULL; n=0 !! ERROR !!\n", #a1); } \ else PRINTMAX(s->a1, s->n_##a1, 10) PE(a1);PE(a2);PE(a3);PE(b1);PE(b2);PE(c1);PE(c2); PE(i1);//PE(i2); PE(j1);//PE(j2); PE(k1);PE(k2); } } if (PMI_print_mpp) { int nm = cov->mpp.moments, vdim = VDIM0, nmvdim = (nm + 1) * vdim; if (R_FINITE(cov->mpp.maxheights[0])) { leer(level); PRINTF("%-10s ","mpp:maxhgt"); for (int i=0; i<=vdim; i++) PRINTF("%g, ",cov->mpp.maxheights[i]); PRINTF("\n"); } if (R_FINITE(cov->mpp.unnormedmass)) { leer(level); P10("mpp:u-mass", cov->mpp.unnormedmass); } leer(level); PRINTF("%-10s ","mpp:M+"); if (cov->mpp.mMplus == NULL) PRINTF("not initialized yet (size=%d)\n", nm); else { for (int i=0; impp.mMplus[i]); PRINTF("\n"); } leer(level); PRINTF("%-10s ","mpp:M"); if (cov->mpp.mM == NULL) { PRINTF("not initialized yet (size=%d)\n", nm); } else { for (int i=0; impp.mM[i]); PRINTF("\n"); } leer(level); PRINTF("%-10s %s\n","mpp:log", FT[DefList[COVNR].log != ErrLogCov]); leer(level); PRINTF("%-10s %s\n","mpplgnonst", FT[DefList[COVNR].nonstatlog != ErrLogCovNonstat]); leer(level); PRINTF("%-10s %s\n","mpp:do", FT[DefList[COVNR].Do != do_failed]); } if (PMI_print_pgs) { if (cov->Spgs == NULL) { } else { pgs_storage *pgs = cov->Spgs; int size = pgs->size, dim = OWNTOTALXDIM; leer(level); P10("pgs:mass", pgs->totalmass); leer(level); P10("pgs:logdens", pgs->log_density); leer(level); PRINTF("%-10s %d\n","pgs:size", size); leer(level); PRINTF("%-10s %d\n","pgs:dim", dim); leer(level); P10("pgs:threshold", pgs->currentthreshold); #define SHOWDEFAULT(Z, X, Y) if (pgs->X != NULL) { \ leer(level); PRINTF("%-10s ",Z); \ for (int d=0; dX[d]); PRINTF("\n");} #define SHOW(Z, X) SHOWDEFAULT(Z, X, "%g ") #define SHOWINT(Z, X) SHOWDEFAULT(Z, X, "%d ") if (R_FINITE(pgs->zhou_c)) { leer(level); P10("mpp:zhou_c", pgs->zhou_c); } SHOW("pgs:v", v); SHOW("pgs:x", x); SHOW("pgs:own_start", own_grid_start); SHOW("pgs:own_step", own_grid_step); SHOW("pgs:xstart", xstart); SHOW("pgs:inc", inc); SHOW("pgs:suppmin", supportmin); SHOW("pgs:suppmax", supportmax); SHOWINT("pgs:gridlen", gridlen); SHOWINT("pgs:start", start); SHOWINT("pgs:end", end); SHOWINT("pgs:nx", nx); if (pgs->pos != NULL) { // gauss #ifdef SHOW_ADDRESSES location_type *loc = Loc(cov); leer(level); PrintPoints(loc, (char *) "pgs.x", loc->x, pgs->xgr,loc->lx); #endif SHOW("pgs:y", y); SHOWINT("pgs:pos", pos); SHOWINT("pgs:min", min); SHOWINT("pgs:max", max); } if (pgs->halfstepvector != NULL) { // max-stable leer(level); PRINTF("%-10s %s\n","pgs:flathull", FT[pgs->flathull]); leer(level); P10("pgs:globmin", pgs->globalmin); leer(level); P10("pgs:cur.thres",pgs->currentthreshold); SHOW("pgs:half", halfstepvector); if (pgs->single != NULL) { leer(level); { PRINTF("%-10s ","pgs:single"); for (int d=0; dsingle[d]);PRINTF("\n"); } } if (pgs->total != NULL) { leer(level); { PRINTF("%-10s ","pgs:total"); for (int d=0; dtotal[d]); PRINTF("\n"); } } } else { // gauss oder poisson leer(level); P10("pgs:intens", pgs->intensity); } if (pgs->cov != NULL) { leer(level); PRINTF("%-10s %s [%d]\n","pgs:cov", Nick(pgs->cov), pgs->cov->zaehler); } } } if (PMI_print_rect) { if (cov->Srect != NULL) { rect_storage *r = cov->Srect; int nstepP2 = r->nstep + 2; leer(level); PRINTF("%-10s %g c=%g p=%g\n","rct:inner", r->inner, r->inner_const, r->inner_pow); leer(level); PRINTF("%-10s %g c=%g p=%g pc=%g\n","rct:outer", r->outer, r->outer_const, r->outer_pow, r->outer_pow_const); leer(level); P10("rct:step", r->step); leer(level); PRINTF("%-10s %d\n","rct:nstep", r->nstep); leer(level); PRINTF("%-10s %d\n","rct:ntmp", r->tmp_n); // leer(level); P10("rct:total", r->weight[1 + r->nstep]); if (PMI_print_rect > 1 && r->value != NULL) { leer(level); { PRINTF("%-10s ","rct:val"); for (int d=0; dvalue[d]); PRINTF("\n"); } leer(level); { PRINTF("%-10s ","rct:wght"); for (int d=0; dweight[d]); PRINTF("\n"); } } } } if (PMI_print_loc) { leer(level); // printf(" **** %ld %ld %ld\n", PLoc(cov), cov->ownloc, cov->prevloc); if (PLoc(cov) == NULL) { PRINTF("%-10s %s\n", "loc:", ""); } else { // printf(" **** %ld %ld %ld %d \n", PLoc(cov), cov->ownloc, cov->prevloc, cov->prevloc[0]->len); assert(PLoc(cov)[0] != NULL); PRINTF("%-10s %d\n", "loc:sets", (PLoc(cov)[0])->len); if (cov->ownloc != NULL) { PrintLoc(level, OwnLoc(cov), true); } else { location_type *prevloc = PrevLoc(cov); leer(level); if (cov->calling == NULL) { PRINTF("%-10s (%d)\n", "loc:extern", addressbits(prevloc)); PrintLoc(level, prevloc, false); } else if (prevloc == PrevLoc(cov->calling)) { PRINTF("%-10s (%d)\n", "loc:calling->prev", addressbits(prevloc)); // PrintLoc(level, prevloc, false); } else if (prevloc == OwnLoc(cov->calling)) { PRINTF("%-10s (%d)\n", "loc:calling->own", addressbits(prevloc)); // PrintLoc(level, prevloc, false); } else { PRINTF("%-10s (%d)\n", "loc:MISMATCH", addressbits(prevloc)); } if (level == 0) PrintLoc(4, prevloc, false); } } } bool givenkey; if ((givenkey = cov->key != NULL)) { leer(level); PRINTF("%-10s :", "key"); if (all_subs >= 0) pmi(cov->key, all_subs, level + 1, maxlevel, stor_level, storage); } bool Splus_given = cov->Splus != NULL && cov->Splus->keys_given; if (Splus_given) { givenkey = true; if (all_subs >= 0) { for (int i=0; i < cov->nsub; i++) { model *key = cov->Splus->keys[i]; leer(level); if (key != NULL) { PRINTF("%-10s ++ %d ++:", "plus.keys", i); pmi(key, all_subs, level + 1, maxlevel, stor_level, storage); } else PRINTF("%-10s ++ %d ++: %s\n","plus.key", i, "empty"); } } } if ((!givenkey && all_subs==0) || all_subs>0) { for (int i=0; imaxsub; i++) { if (cov->sub[i] == NULL) { continue; } leer(level); PRINTF("%s %d (%s) of '%s':", "submodel", i, C->subnames[i], C->nick); pmi(cov->sub[i], all_subs, level + 1, maxlevel, stor_level, storage); } } } void pmi(model *cov, int maxlevel) { // OK PRINTF("\n"); if (cov == NULL) { PRINTF("\nCovariance model is empty.\n\n"); } else { Path(cov, NULL); pmi(cov, !false, 0, maxlevel, 0, NULL); } } void pmiroot(model *cov, int maxlevel) { // OK model *storage[TREE_MAXSTORAGE]; getroot(cov, storage); pmi(storage[0], false, 0, maxlevel, 0, NULL); //storage); } void iexplDollar(model *cov, bool MLEnatsc_only) { /* get the naturalscaling values and devide the preceeding scale model by this value */ double *p, invscale; model *dollar = cov->calling; bool solving = dollar != NULL && isDollar(dollar) && (COVNR == NATSC_INTERN || (COVNR == NATSC_USER && !MLEnatsc_only)); if (solving) { model *next = cov->sub[0]; assert(dollar!=NULL && isDollar(dollar)); INVERSE(&GLOBAL.gauss.approx_zero, next, &invscale); //invscale = 1.0; if (ISNAN(invscale)) ERR("inverse function unknown when calculating explicite scale"); p = PARAM(dollar, DSCALE); if (p != NULL) { p[0] /= invscale; } else { p = PARAM(dollar, DANISO); if (p != NULL) { int n = dollar->nrow[DANISO] * dollar->ncol[DANISO]; for (int i=0; isub[i]: luecken erlaubt bei PSgen ! if (cov->sub[i] != NULL) iexplDollar(cov->sub[i], MLEnatsc_only); } } } SEXP IGetModel(model *cov, int modus, int spConform, bool solveRandom, sortsofparam whichparam, sort_origin origin) { // modus: // AS_SAVED : Modell wie gespeichert // DEL_NATSC : Modell unter Annahme PracticalRange>0 (natsc werden geloescht) // SOLVE_NATSC : natscale soweit wie moeglich zusammengezogen (natsc werden // drauf multipliziert; Rest wie gespeichert) // DEL_MLE : nur natscale_MLE werden geloescht // SOLVE_MLE : nur natscale_MLE zusammengezogen (natsc werden // drauf multipliziert; Rest wie gespeichert) // SEXP Model, nameMvec; int i, nmodelinfo, k = 0; defn *C = DefList + COVNR; // nicht gatternr bool ok[MAXPARAM]; if ((COVNR == NATSC_INTERN && modus != GETMODEL_AS_SAVED) || (COVNR == NATSC_USER && modus == GETMODEL_DEL_NATSC)) { return IGetModel(cov->sub[0], modus, spConform, solveRandom, whichparam, origin); } nmodelinfo = C->kappas + 1; for (i=0; isub[i] != NULL //&& MODELNR(cov->sub[i]) != IDCOORD ) // insb. !IDCOORD nmodelinfo++; } for (i=0; ikappas; i++) { if (cov->kappasub[i] != NULL && (!solveRandom || PisNULL(i))) continue; ok[i] = !PisNULL(i) && whichparam != NOPARAMETERS; if (!ok[i]) { nmodelinfo--; continue; } sortsofparam sort = SortOf(cov, i, 0, 0, origin); ok[i] = whichparam == ALLPARAMETERS || (whichparam == STANDARD && sort <= LASTUSERSORTOF) || (whichparam == INCLUDENOTRETURN && (sort <= LASTUSERSORTOF || sort == IGNOREPARAM)) || (whichparam == INTERNALPARAMETERS && isInternalKappa(i)); if (ok[i]) continue; ok[i] = SortOf(cov, i, 0, 0, origin) == whichparam; if (!ok[i]) nmodelinfo--; } PROTECT(Model = allocVector(VECSXP, nmodelinfo)); PROTECT(nameMvec = allocVector(STRSXP, nmodelinfo)); SET_STRING_ELT(nameMvec, k, mkChar("")); // name defn *CC = DefList + COVNR; // nicht gatternr while(STRNCMP(CC->name, InternalName, STRLEN(InternalName)) ==0) CC--; SET_VECTOR_ELT(Model, k++, mkString(CC->nick)); // if (spConform >= 1) { SET_VECTOR_ELT(Model, k++, mkString(CC->nick)); // } else { SET_VECTOR_ELT(Model, k++, mkString(CC->name)); } for(i=0; ikappas; i++) { if (cov->kappasub[i] != NULL && (!solveRandom || PisNULL(i))) { SET_STRING_ELT(nameMvec, k, mkChar(OWNKAPPA(C, i))); SET_VECTOR_ELT(Model, k++, IGetModel(cov->kappasub[i], modus, spConform, solveRandom, whichparam, origin)); continue; } if (!ok[i]) continue; SET_STRING_ELT(nameMvec, k, mkChar(OWNKAPPA(C, i))); if (C->kappaParamType[i] == CharInputType ) { int value = MISMATCH; if (C->kappatype[i] == INTSXP) value = P0INT(i); else if (C->kappatype[i] == REALSXP) value = P0(i); else BUG; assert(NROW(i) == 1 && NCOL(i) == 1); SET_VECTOR_ELT(Model, k++, Param(cov, C->kappaParamTypeNames[i] + value, NROW(i), NCOL(i), STRSXP, true)); } else if (C->kappaParamType[i] == MixedInputType && ( (C->kappatype[i] == INTSXP && P0INT(i) < 0) || (C->kappatype[i] == REALSXP && P0(i) < 0.0) )) {// pos numbers and string int value = MISMATCH; if (C->kappatype[i] == INTSXP) value -= P0INT(i); else if (C->kappatype[i] == REALSXP) value -= P0(i); else BUG; assert(NROW(i) == 1 && NCOL(i) == 1); SET_VECTOR_ELT(Model, k++, Param(cov, C->kappaParamTypeNames[i] + value, NROW(i), NCOL(i), STRSXP, true)); } else if (C->kappaParamType[i] >= NN1) { assert(NROW(i) == 1); SET_VECTOR_ELT(Model, k++, Param(cov, LIST_OF_NAMES[C->kappaParamType[i] - NN1] + P0INT(i), NROW(i), NCOL(i), STRSXP, true)); } else { SET_VECTOR_ELT(Model, k++, Param(cov, i, C->kappatype[i], true)); } } int zaehler = 0; for (i=0; isub[i] != NULL // && MODELNR(cov->sub[i]) != IDCOORD ) { SET_STRING_ELT(nameMvec, k, mkChar(C->subnames[i])); SET_VECTOR_ELT(Model, k++, IGetModel(cov->sub[i], modus, spConform, solveRandom, whichparam, original)); if (++zaehler >= cov->nsub) break; } } assert(k == nmodelinfo); setAttrib(Model, R_NamesSymbol, nameMvec); UNPROTECT(2); // model + namemodelvec return Model; } SEXP GetModel(SEXP keynr, SEXP Modus, SEXP SpConform, SEXP whichSub, SEXP SolveRandom, SEXP Whichparam, SEXP origin) { // modus: // AS_SAVED : Modell wie gespeichert // DEL_NATSC : Modell unter Annahme PracticalRange>0 (natsc werden geloescht) // SOLVE_NATSC : natscale soweit wie moeglich zusammengezogen (natsc werden // drauf multipliziert; Rest wie gespeichert) // DEL_MLE : nur natscale_MLE werden geloescht // SOLVE_MLE : nur natscale_MLE zusammengezogen (natsc werden // drauf multipliziert; Rest wie gespeichert) // whichSub: only "user" and "call+user" are/should be used! // Nutzer kann 3 Modifikationen des Models in MLE laufen lassen: // * keinen Praktikal range oder individuell angeben // * extern practical range definieren // * intern practical range verwenden lassen (use.naturalscaling) int knr = INTEGER(keynr)[0], spConform = INTEGER(SpConform)[0], modus = INTEGER(Modus)[0], whichparam = INTEGER(Whichparam)[0]; bool solveRandom = LOGICAL(SolveRandom)[0]; model *cov = NULL, **key = KEY(); if (whichparam < 0 || whichparam > LASTSORTOF) XERR(ERRORSORTOF); if (knr < 0 || knr > MODEL_MAX || key[knr] == NULL) XERR(ERRORREGISTER); if ((cov = key[knr]) == NULL) return R_NilValue; // return noError, nil cov = WhichSub(cov, INTEGER(whichSub)[0]); if (cov == NULL) BUG; bool na_ok =NAOK_RANGE;//erst nach cov definierbar; KEYtypeOf(cov)->naok_range // dummy erst abjetzt if (modus == GETMODEL_DEL_NATSC || modus == GETMODEL_DEL_MLE) return IGetModel(cov, modus, spConform, solveRandom, (sortsofparam) whichparam, (sort_origin) INTEGER(origin)[0]); // TREE(cov); SEXP value = R_NilValue; int err = NOERROR, skipchecks = GLOBAL_UTILS->basic.skipchecks; model *dummy = NULL; if (equalsnowInterface(cov)) err = covcpy(&dummy, true, cov, cov->prevloc, NULL, false, true, true); else err = covcpy(&dummy, cov); if (err != NOERROR) goto ErrorHandling; set_NAOK_RANGE(true); GLOBAL_UTILS->basic.skipchecks = true; SET_CALLING_NULL(dummy, cov); err = CHECK_ONLY(dummy); GLOBAL_UTILS->basic.skipchecks = skipchecks; // TREE(dummy); if (err != NOERROR) goto ErrorHandling; iexplDollar(dummy, modus == GETMODEL_SOLVE_MLE); if (modus == GETMODEL_SOLVE_NATSC) { modus = GETMODEL_DEL_NATSC; } else if (modus == GETMODEL_SOLVE_MLE) { modus = GETMODEL_DEL_MLE; } PROTECT(value = IGetModel(dummy, modus, spConform, solveRandom, (sortsofparam) whichparam, (sort_origin) INTEGER(origin)[0])); if (dummy != NULL) COV_DELETE_WITHOUT_LOC(&dummy, cov); UNPROTECT(1); set_NAOK_RANGE(na_ok); return(value); ErrorHandling: set_NAOK_RANGE(na_ok); if (dummy != NULL) COV_DELETE_WITHOUT_LOC(&dummy, cov); XERR(err); } void ple_intern(defn *C){ int i; PRINTF("pref: "); for (i=0; ipref[i]); PRINTF("\n"); } void ple_(model *cov) { PRINTF(" %s\n", NAME(cov)); ple_intern(DefList + COVNR); } void ple_(char *name) { PRINTF("PLE %s\n", name); ple_intern(DefList + getmodelnr(name)); } void PSTOR(model *cov, gen_storage *x) { if (x==NULL) { PRINTF("no storage information\n"); return; } assert(cov != NULL); int dim = OWNLOGDIM(0); for (int d=0; dwindow.min[d], x->window.max[d], x->window.centre[d], RF_NA, RF_NA, // pgs->mppinfo.min[d], x->mppinfo.max[d], x->spec.E[d], x->spec.sub_sd_cum[d]); } PRINTF("spec:step=%3.3f phi=%3.3f id=%3.3f grid=%s sig=%3.3f nmetr=%d\n", x->Sspectral.phistep2d, x->Sspectral.phi2d, x->Sspectral.prop_factor, FT[x->Sspectral.grid], x->spec.sigma,x->spec.nmetro); } void NoCurrentRegister() { set_currentRegister(UNSET); } void GetCurrentRegister(int *reg) { *reg = currentRegister(); } void psys(system_type *sys, bool earlybreak) { int last = LASTi(sys[0]); const char *nl1[2] = {" ", "\n"}; const char *nl2[2] = {"\n ", " "}; if (last < 0) last = 0; for (int s=0; s<=last; s++) { PRINTF(" s=%d(%d): nr=%d log=%d x=%d%smax=%d cum=%d%s %d:'%s' %d:'%s' %d:'%s'\n", s, LASTi(sys[s]), NRi(sys[s]), LOGDIMi(sys[s]), XDIMi(sys[s]), // OK nl1[earlybreak], MAXDIMi(sys[s]), // OK CUMXMITi(sys[s]), nl2[earlybreak], // OK TYPEi(sys[s]), TYPE_NAMES[TYPEi(sys[s])], // OK DOMi(sys[s]), DOMAIN_NAMES[DOMi(sys[s])], // OK ISOi(sys[s]), ISO_NAMES[ISOi(sys[s])]); // OK } } void psys(system_type *sys) { psys(sys, true); } void psys(model *cov) { PRINTF("\nprev: "); psys(PREV, false); PRINTF("gatter:"); psys(GATTER, false); PRINTF("own: "); psys(OWN, false); } void pcl(int nr) { defn *C = DefList + nr; int i; PRINTF("%s (%s)\n", C->name, C->nick); PRINTF(" pref:"); for (i=0; i<=Nothing; i++) { PRINTF("%s:%d ", METHOD_NAMES[i], C->pref[i]); if (i == Sequential) { PRINTF("\n\t"); } } PRINTF("\n"); int v = C->variants; PRINTF("derivs full=%d rese=%d var=%d\n", C->F_derivs, C->RS_derivs, v); for (i=0; isystems[v]; PRINTF("type=%d (%s) ", s->type, TYPE_NAMES[s->type]); PRINTF("dom=%d (%s) ", s->dom, DOMAIN_NAMES[s->dom]); PRINTF("\n"); } } void pcl(model *cov) { pcl(COVNR); } void pcl() { int nr; for (nr = 0; nrSplus != NULL; // && cov->Splus->keys_given; while(STRCMP(CC->name, InternalName) ==0) CC--; PRINTF("%s (V%d of %d) [%d", CC->name, //COVNR, cov->variant, CC->variants, cov->zaehler); if (true) { PRINTF(";%s%s", FTshort[cov->DallowedDone + 2 * (C->Dallowed != NULL)], FTshort[cov->IallowedDone + 2 * (C->Iallowed != NULL)]); } if (true) { PRINTF(";%d%d,%d%d", CONDPREVDOM(0), CONDPREVISO(0), CONDOWNDOM(0), CONDOWNISO(0)); } PRINTF("] %d %d", cov->zaehler, current); if ((found = cov->zaehler == current)) { PRINTF("\t***"); } else if (level < n && storage[level] == cov) { if (!false) { for (int j=level; j<=n; j++) PRINTF(" "); PRINTF("\t::"); } } else if (!alle) { bool further = cov->nsub > 0; if (!further) for (int i=0; ikappas; i++) if ((further = cov->kappasub[i] != NULL)) break; if (!further && Splus_given) for (int i=0; i < cov->nsub; i++) if ((further = cov->Splus->keys[i] != NULL)) break; if (further) { PRINTF(" ..."); } PRINTF("\n"); return false; } PRINTF("\n"); for (int i=0; ikappas; i++) { if (cov->kappasub[i] != NULL) { leer(level); PRINTF("%s (%d): ", C->kappanames[i], i); assert(cov->kappasub[i]->calling == cov); found |= tree(cov->kappasub[i], current, all_subs, level + 1,// TREE storage, n, alle); } } bool givenkey; if ((givenkey = cov->key != NULL) && all_subs >= 0) { leer(level); PRINTF("key: "); assert(cov->key->calling == cov); found |= tree(cov->key, current, all_subs, level+1, storage, n, alle);//TREE } //printf("%s %d %d\n", NAME(cov), Splus_given, all_subs); if (Splus_given && all_subs >= 0) for (int i=0; i < cov->nsub; i++) { model *key = cov->Splus->keys[i]; if (key != NULL) { givenkey = true; leer(level); PRINTF("array (%d): ", i); assert(key->calling == cov); found |= tree(key, current, all_subs, level+1, storage, n, alle);//TREE } } if ((!givenkey && all_subs==0) || all_subs>0 || !found) for (int i=0; imaxsub; i++) { if (cov->sub[i] != NULL) { leer(level); PRINTF("%s (%d): ", C->subnames[i], i); if (cov->sub[i]->calling != cov) { PRINTF("%s(%d) -> %s(%d)\n", NAME(cov), cov->zaehler, NAME(cov->sub[i]), (cov->sub[i]->zaehler)); // crash(); } assert(cov->sub[i]->calling == cov); found |= tree(cov->sub[i], current, all_subs, level + 1,// TREE storage, n, alle); } } return found; } void tree(model *cov, bool alle) {// TREE int current = cov->zaehler, all_subs = 0; // all_subs = 1; printf("all_subs=%d\n", all_subs); model *storage[TREE_MAXSTORAGE]; int n = getroot(cov, storage); if (!tree(storage[0], current, all_subs, 0, storage, n, alle) || // TREE all_subs < 0) { // printf("found = %d all_subs=%d\n", // tree(storage[0], current, all_subs, 0, storage, n, alle), all_subs); // PMI(cov); crash(); BUG; } // } void printD(allowedD_type allowedD) {// bool ok = false; for (int i = (int) FIRST_DOMAIN; i<=(int) LAST_DOMAINUSER; i++) { if (allowedD[i]) { ok = true; PRINTF("%s, ", DOMAIN_NAMES[i]); } } if (!ok) { PRINTF("no domains or all!"); } PRINTF("\n"); } void printD(model *cov) {// PRINTF("'%s' allows ", NAME(cov)); printD(cov->allowedD); // } void printI(allowedI_type allowedI) { // bool ok = false; for (int i = (int) FIRST_ISOUSER; i<=(int) LAST_ISOUSER; i++) if (allowedI[i]){ ok = true; PRINTF("%s, ", ISO_NAMES[i]); } if (!ok) { PRINTF("no isotropies or all!"); } PRINTF("\n"); } void printI(model *cov) { // PRINTF("'%s' allows ", NAME(cov)); printI(cov->allowedI); // }