private void RunUnitLoop(HH hh, List <Person> tu) { // store the "running" variables (yem_unit, ils_earns_unit), and take the level into account foreach (StoreVar v in vars) { if (v.iteration != NOTAP) { continue; // is handled below } if (hh.GetPersonValue(varIndexCurElig, tu[0].indexInHH) <= 0) { continue; // store only for the (head of the) "currently elig" unit } List <Person> altTU = hh.GetAlternativeTU(v.level, tu, description); // on may consider performance here, but let's first get it right double levVal = v.unitLoopILPar == null?hh.GetTUValue(v.origVar.index, altTU) : v.unitLoopILPar.GetValue(hh, altTU); hh.SetPersonValue(levVal, v.storeVar.index, tu[0].indexInHH); } // store the "on demand" variables (e.g. yem_unit1) - they are stored the same way as for a normal loops (i.e. no level-stuff) foreach (StoreVar v in vars) { if (v.iteration != NOTAP && v.iteration == hh.GetPersonValue(varIndexLoopCounter, 0)) { hh.SetTUValue(hh.GetTUValue(v.origVar.index, tu), v.storeVar.index, tu); } } }
internal double GetValueTarget(HH hh, List <Person> tu, Person person = null) { double val; if (isTULevel) { val = hh.GetTUValue(index, tu); } else { if (person == null || target == DefPar.PREFIX.HEAD) { val = hh.GetPersonValue(index, tu[0].indexInHH); } else if (target == DefPar.PREFIX.PARTNER) { if (tu[0].partnerIndexInHH == byte.MaxValue) // "no partner found! issue error" This is NOT the case in the old executable... for now, just give the Head value instead { // infoStore.communicator.ReportError(new Communicator.ErrorInfo() // { isWarning = false, message = $"{description.Get()}: no partner found in assessment unit" }); val = double.NaN; } else { val = hh.GetPersonValue(index, tu[0].partnerIndexInHH); } } else { val = hh.GetPersonValue(index, person.indexInHH); } } return(val); }
private void SetCurElig(HH hh, double curIter) { foreach (List <Person> tu in hh.GetTUs(eligUnit)) // set the variable for each TU in the HH { double eligInIter = hh.GetTUValue(varIndexIsEligInIter, tu); // assess in which iteration the TU is "elig" hh.SetTUValue(eligInIter == curIter ? 1 : 0, varIndexIsCurElig, tu); } }
internal override void Run(HH hh, List <Person> tu) // note: Scale does not have a TAX_UNIT parameter { // therefore tu is DUMMY_INDIVIDUAL_TU, i.e. this is called for each person if (factorVar == 1 || !IsRunCondMet(hh)) { return; } foreach (int varIndex in infoStore.operandAdmin.GetMonetaryVarIndices()) { hh.SetTUValue(hh.GetTUValue(varIndex, tu) * factorVar, varIndex, tu); } }
private void RunLoopAndFix(HH hh, List <Person> tu) { // remark: gets an "invalid" loop-counter (0/end of loop) if a loop-store is used outside a loop, but that's a developer error/decision double curIteration = varIndexLoopCounter == NOTAP ? NOTAP : hh.GetPersonValue(varIndexLoopCounter, 0); foreach (StoreVar v in vars) { if (v.iteration == NOTAP || // always stored (possibly overwritten): yem_loop, yem_backup, i.e. in each iteration or outside any loop v.iteration == curIteration) // stored only if it is the appropriate iteration: yem_loop7 { hh.SetTUValue(hh.GetTUValue(v.origVar.index, tu), v.storeVar.index, tu); } } }
// note that Restore actually does not have a TAX_UNIT, thus this is the HHAdmin.DUMMY_INDIVIDUAL_TU (see FunInSpineBase.GetTUName) // that means, amongst others, that the function is called for each person in the household (i.e. tu always contains one person) internal override void Run(HH hh, List <Person> tu) { if (!IsRunCondMet(hh)) { return; } foreach (FunStore.StoreVar v in relatedStore.vars) { if (loopIteration == -1 || v.iteration == loopIteration) { hh.SetTUValue(hh.GetTUValue(v.storeVar.index, tu), v.origVar.index, tu); } } }
// person != null: value is requested for a specific person // person == null: monetary: value is requested for tu, non-monetary: value is taken from head internal override double GetValue(HH hh, List <Person> tu, Person person = null) { if (alternativeTU != null) { tu = hh.GetAlternativeTU(alternativeTU, tu, description); } double val; if (target == DefPar.PREFIX.NONE) { val = person == null && isTULevel?hh.GetTUValue(index, tu) : hh.GetPersonValue(index, person == null ? tu[0].indexInHH : person.indexInHH); } else { val = GetValueTarget(hh, tu, person); } return(ApplyLimits(val, hh, tu, person)); }
private double getComponentValue(HH hh, List <Person> tu, Person person, List <Entry> component) { double value = 0; foreach (Entry entry in component) { double eVal; if (entry.isIL) { eVal = getComponentValue(hh, tu, person, entry.ilEntries); } else { eVal = person == null?hh.GetTUValue(entry.varSpec.index, tu) : hh.GetPersonValue(entry.varSpec.index, person.indexInHH); } value += entry.addFactor * eVal; } return(value); }