// 1: lattice // 2: string or function // return: subset or array of subsets static int qopqdp_lattice_subset(lua_State *L) { BEGIN_ARGS; GET_LATTICE(lat); OPT_STRING(sn, NULL); OPT_FUNCTION_INDEX(fidx, 0); END_ARGS; int n = 0; QDP_Subset *qs = NULL; subsetGroup_t *group = NULL; if(fidx==0) { qs = qhmc_qopqdp_qsubset_from_string(L, lat, sn, &n); } else { // create qdp subsets // create subsetGroup } if(n==0) { lua_pushnil(L); } else if(n==1) { qopqdp_subset_create(L, qs[0], group); } else { lua_createtable(L, n, 0); for(int i=0; i<n; i++) { qopqdp_subset_create(L, qs[i], group); lua_rawseti(L, -2, i+1); } } return 1; }
static int opt_qsubset_real(lua_State *L, int idx, lattice_t *lat, QDP_Subset *t) { int len = 0; if(lua_isstring(L, idx)) { lua_pushvalue(L, idx); const char *s = lua_tostring(L, -1); lua_pop(L, 1); int n; QDP_Subset *qs = qhmc_qopqdp_qsubset_from_string(L, lat, s, &n); if(n) { len += n; if(t) for(int i=0; i<n; i++) t[i] = qs[i]; } } else { int tidx = idx; subset_t *ls = qhmc_qopqdp_opt_subset(L, &tidx, 0, NULL); if(ls) { len++; if(t) t[0] = ls->qsub; } } return len; }