Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions src/main/java/simpaths/data/startingpop/DataParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -224,11 +224,6 @@ private static void parse(String inputFileLocation, String inputFileName, Connec
+ "ALTER TABLE " + personTable + " DROP COLUMN yFinDstrssFlag;"
+ "ALTER TABLE " + personTable + " ALTER COLUMN financial_distress_add RENAME TO yFinDstrssFlag;"

//Social care
+ "ALTER TABLE " + personTable + " ADD careProvidedFlag VARCHAR_IGNORECASE;"
+ "UPDATE " + personTable + " SET careProvidedFlag = 'None' WHERE careHrsProvidedWeek <= 0 OR careHrsProvidedWeek IS NULL;"
+ "UPDATE " + personTable + " SET careProvidedFlag = 'OnlyOther' WHERE careHrsProvidedWeek > 0;"

//SYSTEM : Year
+ "ALTER TABLE " + personTable + " ALTER COLUMN statInterviewYear RENAME TO system_year;"

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/simpaths/model/BenefitUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -4684,7 +4684,7 @@ private void updateSocialCareProvision() {

careProvidedFlag = 0;
for (Person person : getMembers()) {
if (!SocialCareProvision.None.equals(person.getSocialCareProvision()))
if (!Indicator.False.equals(person.getSocialCareProvision()))
careProvidedFlag = 1;
}
}
Expand Down
83 changes: 23 additions & 60 deletions src/main/java/simpaths/model/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ public class Person implements EventListener, IDoubleSource, IIntSource, Weight,
@NullInitialised @Transient private Boolean careFormalFlag;
@NullInitialised @Transient private Boolean careFromInformalFlag;
@Column(name="careHrsProvidedWeek") private Double careHrsProvidedWeek;
@Enumerated(EnumType.STRING) @Column(name="careProvidedFlag") private SocialCareProvision careProvidedFlag;
@Lag(field="careProvidedFlag") @Transient private SocialCareProvision careProvidedFlagL1;
@Transient private Indicator careProvidedFlag;
@Lag(field="careProvidedFlag") @Transient private Indicator careProvidedFlagL1;
@Lag(field="careNeedFlag") @Transient private Indicator careNeedFlagL1;
@Lag(field="careHrsFormalWeek") @Transient private Double careHrsFormalWeekL1;
@Lag(field="careHrsProvidedWeek") @Transient private Double careHrsProvidedWeekL1;
Expand Down Expand Up @@ -446,7 +446,7 @@ else if (demAge > Parameters.MAX_AGE_TO_STAY_IN_CONTINUOUS_EDUCATION)

careHrsProvidedWeek = Objects.requireNonNullElse(originalPerson.careHrsProvidedWeek, 0.0);
careProvidedFlag = Objects.requireNonNullElseGet(originalPerson.careProvidedFlag, () ->
(careHrsProvidedWeek > 0.01) ? SocialCareProvision.OnlyOther : SocialCareProvision.None);
(careHrsProvidedWeek > 0.01) ? Indicator.True : Indicator.False);

careNeedFlagL1 = Objects.requireNonNullElse(originalPerson.careNeedFlagL1, careNeedFlag);
careHrsFormalWeekL1 = Objects.requireNonNullElse(originalPerson.careHrsFormalWeekL1, careHrsFormalWeek);
Expand Down Expand Up @@ -559,7 +559,7 @@ public Person(Long id, long statSeed) {

// initialise random draws
this.statSeed = statSeed;
statInnovations = new Innovations(37, 1, 1, statSeed);
statInnovations = new Innovations(38, 1, 1, statSeed);

//Draw desired age and wage differential for parametric partnership formation for people above age to get married:
double[] sampleDifferentials = setMarriageTargets();
Expand Down Expand Up @@ -601,12 +601,12 @@ private void setAllSocialCareVariablesToFalse() {
careReceivedFlag = SocialCareReceipt.None;
careFormalFlag = false;
careFromInformalFlag = false;
careProvidedFlag = SocialCareProvision.None;
careProvidedFlag = Indicator.False;
careNeedFlagL1 = Indicator.False;
careHrsFormalWeekL1 = -9.0;
careHrsInformalWeekL1 = -9.0;
careHrsProvidedWeekL1 = -9.0;
careProvidedFlagL1 = SocialCareProvision.None;
careProvidedFlagL1 = Indicator.False;
}

public void setAdditionalFieldsInInitialPopulation() {
Expand Down Expand Up @@ -639,6 +639,11 @@ public void setAdditionalFieldsInInitialPopulation() {

if (!Parameters.checkFinite(careHrsInformalWeek))
careHrsInformalWeek = 0.0;
if (careHrsProvidedWeek < 0.01) {
careProvidedFlag = Indicator.False;
} else {
careProvidedFlag = Indicator.True;
}
if (demAge <Parameters.AGE_TO_BECOME_RESPONSIBLE) {
Person mother = benefitUnit.getFemale();
if (mother!=null)
Expand Down Expand Up @@ -1490,7 +1495,7 @@ protected void evaluateSocialCareReceipt() {
double score = Parameters.getRegInformalCareHoursS2d().getScore(this,Person.DoublesVariables.class);
double rmse = Parameters.getRMSEForRegression("S2d");
double gauss = Parameters.getStandardNormalDistribution().inverseCumulativeProbability(statInnovations.getDoubleDraw(12));
double informalHours = Math.min(Parameters.MAX_HOURS_WEEKLY_INFORMAL_CARE, Math.exp(score + rmse * gauss));
double informalHours = Math.min(Parameters.MAX_HOURS_WEEKLY_INFORMAL_CARE, Math.sinh(score + rmse * gauss));
careFromInformalFlag = true;
careHrsInformalWeek = informalHours;

Expand Down Expand Up @@ -1563,7 +1568,7 @@ protected void evaluateSocialCareReceipt() {
double score = Parameters.getRegFormalCareHoursS2e().getScore(this,Person.DoublesVariables.class);
double rmse = Parameters.getRMSEForRegression("S2e");
double gauss = Parameters.getStandardNormalDistribution().inverseCumulativeProbability(statInnovations.getDoubleDraw(13));
careHrsFormalWeek = Math.min(Parameters.MAX_HOURS_WEEKLY_FORMAL_CARE, Math.exp(score + rmse * gauss));
careHrsFormalWeek = Math.min(Parameters.MAX_HOURS_WEEKLY_FORMAL_CARE, Math.sinh(score + rmse * gauss));
careFormalX = careHrsFormalWeek * Parameters.getTimeSeriesValue(model.getYear(), TimeSeriesVariable.CarerWageRate);

// Retired process (kept for future reuse): S2k formal care hours.
Expand All @@ -1583,7 +1588,7 @@ protected void evaluateSocialCareProvision() {

public void evaluateSocialCareProvision(double probitAdjustment) {

careProvidedFlag = SocialCareProvision.None;
careProvidedFlag = Indicator.False;
careHrsProvidedWeek = 0.0;
if (demAge >= Parameters.MIN_AGE_TO_PROVIDE_CARE) {

Expand All @@ -1606,7 +1611,7 @@ public void evaluateSocialCareProvision(double probitAdjustment) {
double score = Parameters.getRegNoCarePartnerProvCareToOtherS3b().getScore(this, Person.DoublesVariables.class);
probProvideAny = Parameters.getRegNoCarePartnerProvCareToOtherS3b().getProbability(score + probitAdjustment);
}
boolean provideCare = (statInnovations.getDoubleDraw(13) < probProvideAny);
boolean provideCare = (statInnovations.getDoubleDraw(37) < probProvideAny);
if (!Parameters.flagSuppressSocialCareCosts && provideCare) {

double score;
Expand All @@ -1623,20 +1628,8 @@ public void evaluateSocialCareProvision(double probitAdjustment) {
rmse = Parameters.getRMSEForRegression("S3d");
}
double gauss = Parameters.getStandardNormalDistribution().inverseCumulativeProbability(statInnovations.getDoubleDraw(14));
careHrsProvidedWeek = Math.min(Parameters.MAX_HOURS_WEEKLY_INFORMAL_CARE, Math.exp(score + rmse * gauss));
if (careToPartner) {

if (careHrsProvidedWeek > careHoursToPartner) {

careProvidedFlag = SocialCareProvision.PartnerAndOther;
} else {

careProvidedFlag = SocialCareProvision.OnlyPartner;
}
} else {

careProvidedFlag = SocialCareProvision.OnlyOther;
}
careHrsProvidedWeek = Math.min(Parameters.MAX_HOURS_WEEKLY_INFORMAL_CARE, Math.sinh(score + rmse * gauss));
careProvidedFlag = Indicator.True;
}
}
}
Expand Down Expand Up @@ -3250,25 +3243,7 @@ public double getDoubleValue(Enum<?> variableID) {
return (partner != null && Indicator.True.equals(partner.getNeedSocialCare())) ? 1. : 0.;
}
case ProvideCare_L1 -> {
return (careProvidedFlagL1 != null && !SocialCareProvision.None.equals(careProvidedFlagL1)) ? 1. : 0.;
}
case CareToPartnerOnly -> {
return (SocialCareProvision.OnlyPartner.equals(careProvidedFlag)) ? 1. : 0.;
}
case CareToPartnerAndOther -> {
return (SocialCareProvision.PartnerAndOther.equals(careProvidedFlag)) ? 1. : 0.;
}
case CareToOtherOnly -> {
return (SocialCareProvision.OnlyOther.equals(careProvidedFlag)) ? 1. : 0.;
}
case CareToPartnerOnly_L1 -> {
return (SocialCareProvision.OnlyPartner.equals(careProvidedFlagL1)) ? 1. : 0.;
}
case CareToPartnerAndOther_L1 -> {
return (SocialCareProvision.PartnerAndOther.equals(careProvidedFlagL1)) ? 1. : 0.;
}
case CareToOtherOnly_L1 -> {
return (SocialCareProvision.OnlyOther.equals(careProvidedFlagL1)) ? 1. : 0.;
return (Indicator.True.equals(careProvidedFlagL1)) ? 1. : 0.;
}
case ReceiveCare_L1 -> {
return (getTotalHoursSocialCare_L1() > 0.01) ? 1. : 0.;
Expand Down Expand Up @@ -5146,15 +5121,6 @@ public Long getPartnerID() {
} else return null;
}

private void nullPartnerVariables() {

demPartnerNYear = 0;
if (SocialCareProvision.OnlyPartner.equals(careProvidedFlag))
careProvidedFlag = SocialCareProvision.None;
else if (SocialCareProvision.PartnerAndOther.equals(careProvidedFlag))
careProvidedFlag = SocialCareProvision.OnlyOther;
}

public Labour getLabourSupplyWeekly() {
if (labHrsWorkEnumWeek ==null)
throw new RuntimeException("request for labourSupplyWeekly before it has been initialised");
Expand Down Expand Up @@ -5324,7 +5290,7 @@ public void setCareHoursFromOtherWeekly_lag1(double val) {
public void setCareHoursFromFormalWeekly_lag1(double val) {
careHrsFormalWeekL1 = val;
}
public void setSocialCareProvision_lag1(SocialCareProvision careProvision) {
public void setSocialCareProvision_lag1(Indicator careProvision) {
careProvidedFlagL1 = careProvision;
}

Expand Down Expand Up @@ -5426,8 +5392,8 @@ public void setSocialCareReceipt(SocialCareReceipt who) {
careReceivedFlag = who;
}

public void setSocialCareProvision(SocialCareProvision who) {
careProvidedFlag = who;
public void setSocialCareProvision(Indicator provide) {
careProvidedFlag = provide;
}

public Indicator getDlltsd_lag1() {
Expand Down Expand Up @@ -5803,11 +5769,8 @@ public double getSocialCareProvisionState() {
return (double)getSocialCareProvision().getValue();
}

public SocialCareProvision getSocialCareProvision() {
if (careProvidedFlag ==null)
return SocialCareProvision.None;
else
return careProvidedFlag;
public Indicator getSocialCareProvision() {
return Objects.requireNonNullElse(careProvidedFlag, Indicator.False);
}

public double getRetired() {
Expand Down
19 changes: 0 additions & 19 deletions src/main/java/simpaths/model/SimPathsModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,6 @@ public enum Processes {
EndYear,
UnionMatching,
LabourMarketAndIncomeUpdate,
SocialCareMarketClearing,

//Alignment Processes
FertilityAlignment,
Expand Down Expand Up @@ -882,9 +881,6 @@ public void onEvent(Enum<?> type) {
}
if (commentsOn) log.info("Union matching complete.");
}
case SocialCareMarketClearing -> {
socialCareMarketClearing();
}
case FertilityAlignment -> {

if (alignFertility) {
Expand Down Expand Up @@ -1911,21 +1907,6 @@ private void evalMatches(Pair<Set<Person>, Set<Person>> unmatched, boolean align
}
}

private void socialCareMarketClearing() {

// adjust provision so that aggregate provision broadly matches aggregate receipt
double careProvisionAdjustment = Parameters.getTimeSeriesValue(getYear(),TimeSeriesVariable.CareProvisionAdjustment);
SocialCareAlignment socialCareAlignment = new SocialCareAlignment(persons, careProvisionAdjustment);
double[] startVal = new double[] {careProvisionAdjustment};
double[] lowerBound = new double[] {careProvisionAdjustment - 1.5};
double[] upperBound = new double[] {careProvisionAdjustment + 1.5};
RootSearch search = new RootSearch(lowerBound, upperBound, startVal, socialCareAlignment, 1.0E-2, 0.001);
search.evaluate();
if (search.isTargetAltered()) {
Parameters.putTimeSeriesValue(getYear(), search.getTarget()[0], TimeSeriesVariable.CareProvisionAdjustment);
}
}


/*
Private helper method used to set up alignment for different occupancy types
Expand Down
25 changes: 14 additions & 11 deletions src/main/java/simpaths/model/decisions/Expectations.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ public Expectations(Expectations invariantExpectations) {
personProxyThisPeriod.setDhe(currentStates.getHealthCode());
personProxyThisPeriod.setDeh_c4(currentStates.getEducationCode());
personProxyThisPeriod.setDcpstLocal(currentStates.getDcpst());
personProxyThisPeriod.setSocialCareProvision(currentStates.getSocialCareProvisionCode());
personProxyThisPeriod.setSocialCareProvision(currentStates.getSocialCareProvisionState());
personProxyThisPeriod.populateSocialCareReceipt(currentStates.getSocialCareReceiptStateCode());

// add person proxy for next period expectations
Expand All @@ -194,7 +194,7 @@ public Expectations(Expectations invariantExpectations) {
personProxyNextPeriod.setDhe(currentStates.getHealthCode());
personProxyNextPeriod.setDhe_lag1(currentStates.getHealthCode());
personProxyNextPeriod.populateSocialCareReceipt_lag1(currentStates.getSocialCareReceiptStateCode());
personProxyNextPeriod.setSocialCareProvision_lag1(currentStates.getSocialCareProvisionCode());
personProxyNextPeriod.setSocialCareProvision_lag1(currentStates.getSocialCareProvisionState());
personProxyNextPeriod.setDed(currentStates.getStudentIndicator());
personProxyNextPeriod.setDeh_c4(currentStates.getEducationCode());
personProxyNextPeriod.setDeh_c4_lag1(currentStates.getEducationCode());
Expand Down Expand Up @@ -499,15 +499,18 @@ private double evalSocialCareHoursProvidedWeekly() {
double socialCareHoursProvidedWeekly = 0.0;
if (Parameters.flagSocialCare && !Parameters.flagSuppressSocialCareCosts) {

SocialCareProvision status = currentStates.getSocialCareProvisionCode();
if (!SocialCareProvision.None.equals(status)) {
// With S3e retired, no separate regression is used for hours provided in expectations.
socialCareHoursProvidedWeekly = 0.0;

// Retired process (kept for future reuse): S3e provided care hours.
// double score = Parameters.getRegCareHoursProvS3e().getScore(personProxyThisPeriod,Person.DoublesVariables.class);
// double rmse = Parameters.getRMSEForRegression("S3e");
// socialCareHoursProvidedWeekly = Math.min(80.0, Math.exp(score + rmse*rmse/2.0));
Indicator status = currentStates.getSocialCareProvisionState();
if (!Indicator.False.equals(status)) {

double score, rmse;
if (cohabitation) {
score = Parameters.getRegCareHoursProvS3d().getScore(personProxyThisPeriod,Person.DoublesVariables.class);
rmse = Parameters.getRMSEForRegression("S3d");
} else {
score = Parameters.getRegCareHoursProvS3c().getScore(personProxyThisPeriod,Person.DoublesVariables.class);
rmse = Parameters.getRMSEForRegression("S3c");
}
socialCareHoursProvidedWeekly = Math.min(80.0, Math.exp(score + rmse*rmse/2.0));
}
}
return socialCareHoursProvidedWeekly;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ private LocalExpectations lexpectEval(Axis axis) {
if (Dcpst.Partnered.equals(personProxyNextPeriod.getDcpst()))
lexpectations.evaluateDiscrete(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis));
else
lexpectations.evaluateLabelledIndicator(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis), 3.0);
lexpectations.evaluateDiscrete(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis));
} else if (Axis.WagePotential.equals(axis)) {

lexpectations.evaluateGaussian(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis),
Expand Down Expand Up @@ -445,7 +445,7 @@ private boolean updatePersonNextPeriod(States states, Axis axis) {
val1 = states.getSocialCareReceiptCode();
} else if (Axis.SocialCareProvision.equals(axis)) {
val0 = personProxyNextPeriod.getSocialCareProvision();
val1 = states.getSocialCareProvisionCode();
val1 = states.getSocialCareProvisionState();
} else if (Axis.Cohabitation.equals(axis)) {
val0 = personProxyNextPeriod.getDcpst();
val1 = states.getDcpst();
Expand Down Expand Up @@ -478,7 +478,7 @@ private boolean updatePersonNextPeriod(States states, Axis axis) {
} else if (Axis.SocialCareReceipt.equals(axis)) {
personProxyNextPeriod.setSocialCareReceipt(states.getSocialCareReceiptCode());
} else if (Axis.SocialCareProvision.equals(axis)) {
personProxyNextPeriod.setSocialCareProvision(states.getSocialCareProvisionCode());
personProxyNextPeriod.setSocialCareProvision(states.getSocialCareProvisionState());
} else if (Axis.Cohabitation.equals(axis)) {
personProxyNextPeriod.setDcpstLocal(states.getDcpst());
} else if (Axis.Child.equals(axis)) {
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/simpaths/model/decisions/GridScale.java
Original file line number Diff line number Diff line change
Expand Up @@ -214,11 +214,11 @@ public GridScale() {
dimIndex++;
}

// social care provision
// social care provision (indicator variable)
if (Parameters.flagSocialCare) {
axes[aa][dimIndex][0] = 4; // none, partner only, partner and non-partner, non-partner only (see Enum SocialCareProvision)
axes[aa][dimIndex][0] = 2;
axes[aa][dimIndex][1] = 0;
axes[aa][dimIndex][2] = 3;
axes[aa][dimIndex][2] = 1;
axes[aa][dimIndex][3] = 0;
axes[aa][dimIndex][4] = 0;
dimIndex++;
Expand Down
20 changes: 9 additions & 11 deletions src/main/java/simpaths/model/decisions/States.java
Original file line number Diff line number Diff line change
Expand Up @@ -332,12 +332,6 @@ boolean checkOuterStateCombination() {
loopConsider = false;
}

// check care provision
if (!getCohabitation() &&
( SocialCareProvision.OnlyPartner.equals(getSocialCareProvisionCode()) ||
SocialCareProvision.PartnerAndOther.equals(getSocialCareProvisionCode()) ))
loopConsider = false;

// return result
return loopConsider;
}
Expand Down Expand Up @@ -651,7 +645,7 @@ public boolean getPrincipalEligibleForWork() {

/**
* METHOD TO RETURN SOCIAL CARE PROVISION
* @return integer (0 no care, 1 only to partner, 2 to partner and other, 3 only to other
* @return integer (0 no care, 1 care)
*/
int getSocialCareProvision() {
if (Parameters.flagSocialCare) {
Expand Down Expand Up @@ -914,12 +908,16 @@ SocialCareReceipt getSocialCareReceiptCode() {
/**
* METHOD TO IDENTIFY SOCIAL CARE PROVISION CODE IMPLIED BY STATE COMBINATION
*/
SocialCareProvision getSocialCareProvisionCode() {
SocialCareProvision code;
Indicator getSocialCareProvisionState() {
Indicator code;
if (Parameters.flagSocialCare)
code = SocialCareProvision.getCode(getVal(Axis.SocialCareProvision));
if (getSocialCareProvision()==0) {
code = Indicator.False;
} else {
code = Indicator.True;
}
else
code = SocialCareProvision.None;
code = Indicator.False;
return code;
}

Expand Down
Loading
Loading