internal override void Run(HH hh, List <Person> tu) { if (!IsRunCondMet(hh)) { return; } if (IsEligCondMet(hh, tu)) { Dictionary <byte, bool> persElig = eligCond.GetTUValues(hh, tu); foreach (var elig in persElig) { hh.SetPersonValue(value: elig.Value ? 1 : 0, varIndex: indexOutVar, personIndex: elig.Key); } if (coParResultVar != null) { foreach (var elig in persElig) { hh.SetPersonValue(value: elig.Value ? 1 : 0, varIndex: coParResultVar.index, personIndex: elig.Key); } } } else { hh.SetTUValue(value: 0, varIndex: indexOutVar, tu: tu, addTo: false); if (coParResultVar != null) { hh.SetTUValue(value: 0, varIndex: coParResultVar.index, tu: tu); } } }
private static bool IsCondMetByTU(HH hh, List <Person> tu, string who, ParCond parCond = null, int iEligVar = -1) { int i = 0; if (who == DefPar.Value.WHO_NOBODY) { return(true); } if (parCond != null) { foreach (var pe in parCond.GetTUValues(hh, tu)) { bool elig = pe.Value; Person p = tu[i++]; bool?ew = EvalWho(elig, p); if (ew != null) { return(ew == true ? true : false); } } } else { foreach (Person p in tu) { bool elig = hh.GetPersonValue(iEligVar, p.indexInHH) != 0; bool?ew = EvalWho(elig, p); if (ew != null) { return(ew == true ? true : false); } } } return(who == DefPar.Value.WHO_ALL || who == DefPar.Value.WHO_ALL_ADULTS); bool?EvalWho(bool elig, Person p) { if (who == DefPar.Value.WHO_ONE && elig) { return(true); } if (who == DefPar.Value.WHO_ALL && !elig) { return(false); } if (who == DefPar.Value.WHO_ONE_ADULT && !p.isDepChild && elig) { return(true); } if ((who == DefPar.Value.WHO_ALL_ADULTS) && !p.isDepChild && !elig) { return(false); } if (who == DefPar.Value.WHO_NOBODY) { return(true); } return(null); } }
protected override double DoFunWork(HH hh, List <Person> tu) { double amountToShare = parShare.GetValue(hh, tu); List <byte> shareBetween = new List <byte>(); if (parShareBetween != null) { shareBetween = (from p in parShareBetween.GetTUValues(hh, tu) where p.Value select p.Key).ToList(); if (shareBetween.Count == 0 && !shareAllIfNoElig) { base.SetOutVars(0, hh, tu); return(0); } } if (shareBetween.Count == 0) { shareBetween = (from p in tu select p.indexInHH).ToList(); } Dictionary <byte, double> pShares = new Dictionary <byte, double>(); double sumShares = 0; if (parShareProp != null) { foreach (var pers in tu) { double share = 0; if (shareBetween.Contains(pers.indexInHH)) { share = parShareProp.GetValue(hh, tu, pers); if (ignoreNegProp && share < 0) { share = 0; } sumShares += share; } pShares.Add(pers.indexInHH, share); } if (sumShares == 0) { if (!shareEquIfZero && amountToShare != 0) { infoStore.communicator.ReportError(new Communicator.ErrorInfo() { // only report if there is anything to share isWarning = true, runTimeErrorId = description.funID, message = $"{description.Get()}: HH {infoStore.GetIDHH(hh)}: {parShareProp.xmlValue} is 0 for all eligible persons - equal sharing is applied" }); } pShares.Clear(); } } if (sumShares == 0) { sumShares = shareBetween.Count; foreach (var pers in tu) { pShares.Add(pers.indexInHH, shareBetween.Contains(pers.indexInHH) ? 1 : 0); } } double oneShare = amountToShare / sumShares; foreach (var ps in pShares) { double v = oneShare * ps.Value; hh.SetPersonValue(value: v, varIndex: coParOutVar.Item1.index, personIndex: ps.Key, addTo: coParOutVar.Item2); if (coParResultVar != null) { hh.SetPersonValue(value: v, varIndex: coParResultVar.index, personIndex: ps.Key); } } return(0); }