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);
            }
        }
Esempio n. 3
0
        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);
        }