static cline_t make_cline(char month, int yoff) { cline_t res; unsigned int mo; if (!(mo = m_to_i(month))) { return NULL; } /* otherwise alloc and populate RES */ res = malloc(sizeof(*res)); res->month = i_to_m(mo); res->year_off = (int8_t)yoff; res->nn = 0; return res; }
static cutflo_trans_t cut_sparse(struct __cutflo_st_s *st, trcut_t c, idate_t dt) { double res = 0.0; const double *new_v = NULL; int is_non_nil = 0; int has_trans = 0; for (size_t i = st->dvv_idx; i < st->tsc->ndvvs; i++) { if (st->tsc->dvvs[i].d == dt) { new_v = st->tsc->dvvs[i].v; st->dvv_idx = i + 1; break; } } for (size_t i = 0; i < c->ncomps; i++) { unsigned int mo = m_to_i(c->comps[i].month); unsigned int yr = c->comps[i].year; trym_t ym = cym_to_trym(yr, mo); double expo; ssize_t idx; double flo; if (ym == 0) { continue; } expo = c->comps[i].y * st->tick_val; if ((idx = tsc_find_cym_idx(st->tsc, ym)) < 0 || isnan(new_v[idx])) { if (expo != 0.0) { warn_noquo(dt, ym, expo); } else { cut_rem_cc(c, c->comps + i); } continue; } /* check for transition changes */ if (st->expos[idx] != expo) { if (st->expos[idx] != 0.0) { double tot_flo = new_v[idx] - st->bases[idx]; double trans_expo = st->expos[idx] - expo; flo = tot_flo * trans_expo; } else { flo = 0.0; /* guess a basis if the user asked us to */ if (isnan(st->basis)) { st->basis = 0.0; } } TRUF_DEBUG_TR( "TR %+.8g @ %.8g -> %+.8g @ %.8g -> %.8g\n", expo - st->expos[idx], new_v[idx], expo, st->bases[idx], flo); /* record bases */ if (st->expos[idx] == 0.0 || expo == 0.0) { st->bases[idx] = new_v[idx]; } st->expos[idx] = expo; is_non_nil = 1; has_trans = 1; } else { /* st->expos[idx] == 0.0 && st->expos[idx] == expo */ flo = 0.0; has_trans = 0; cut_rem_cc(c, c->comps + i); } /* munch it all together */ res += flo; } st->has_trans = has_trans; st->was_non_nil = st->is_non_nil; st->is_non_nil = is_non_nil; st->inc_flo = res; st->cum_flo += res; return st->e; }
static cutflo_trans_t cut_base(struct __cutflo_st_s *st, trcut_t c, idate_t dt) { double res = 0.0; const double *new_v = NULL; int is_non_nil = 0; for (size_t i = st->dvv_idx; i < st->tsc->ndvvs; i++) { if (st->tsc->dvvs[i].d == dt) { new_v = st->tsc->dvvs[i].v; st->dvv_idx = i + 1; break; } } for (size_t i = 0; i < c->ncomps; i++) { unsigned int mo = m_to_i(c->comps[i].month); unsigned int yr = c->comps[i].year; trym_t ym = cym_to_trym(yr, mo); double expo; ssize_t idx; double flo; if (ym == 0) { continue; } expo = c->comps[i].y * st->tick_val; if ((idx = tsc_find_cym_idx(st->tsc, ym)) < 0 || isnan(new_v[idx])) { if (expo != 0.0) { warn_noquo(dt, ym, expo); } else { cut_rem_cc(c, c->comps + i); } continue; } /* check for transition changes */ if (expo != 0.0) { double tot_flo; if (UNLIKELY(isnan(st->basis))) { st->basis = 0.0; } tot_flo = (new_v[idx] - st->basis); flo = tot_flo * expo; TRUF_DEBUG_TR( "NO %+.8g @ %.8g => %.8g\n", expo, tot_flo, flo); is_non_nil = 1; } else { flo = 0.0; cut_rem_cc(c, c->comps + i); } /* munch it all together */ res += flo; } st->was_non_nil = st->is_non_nil; st->is_non_nil = is_non_nil; st->inc_flo = res; st->cum_flo += res; return st->e; }