compute_contributions = function(d, j, since_birth, yearend_savings_, kid_balances_) {
const start_year = d.birth_year;
const college_start = d.preschool_start + precollege_school_years;
const end_year = college_start + college_years - 1;
const total_college_cost = d3.sum(tuition_inflated.slice(college_start-min_start_year, end_year-min_start_year+1), d => d.tuition);
const yearly_contribution = total_college_cost / (end_year - start_year + 1);
var tmp = Array(max_end_year - min_start_year + 1);
var balanced = false;
var multiplier = 1;
var heat = .9;
var iteration = 0;
const max_iterations = 100
while (!balanced & (iteration < max_iterations)) {
for (var i=0; i < tmp.length; i++) {
const cal_year = i + min_start_year;
const year_diff = cal_year - current_year;
const total_inflation = Math.pow(1 + inflation_rate/100, year_diff);
const total_deflation = Math.pow(1 - inflation_rate/100, year_diff);
const inflation_adjusted_contribution = contributions_match_inflation ? yearly_contribution : total_deflation * yearly_contribution;
const started_college = cal_year >= college_start;
const finished_college = cal_year > end_year;
const in_college = (started_college) & (!finished_college);
const born = cal_year >= d.birth_year;
const age = born ? cal_year - d.birth_year : 0;
tmp[i] = {
name: Object.keys(kids)[j],
year: cal_year,
age_last_bday: age,
yearly_contribution: ((cal_year > current_year) | (since_birth & born)) & (!finished_college) ? inflation_adjusted_contribution * multiplier : 0,
withdrawal: in_college ? tuition_inflated[i].tuition : 0
}
if ((cal_year == current_year) & !since_birth) {
tmp[i].yearly_contribution = yearend_savings_ * kid_balances_[j];
}
tmp[i].monthly_contribution = tmp[i].yearly_contribution / 12;
tmp[i].net = tmp[i].yearly_contribution - tmp[i].withdrawal;
tmp[i].balance = (1 + (net_return / 100)) * (i > 0 ? tmp[i-1].balance + tmp[i].net : tmp[i].net);
tmp[i].yearly_contribution_inflated = tmp[i].yearly_contribution * total_inflation;
}
if (Math.abs(tmp[tmp.length-1].balance) > 20) {
if (tmp[tmp.length-1].balance > 0) {
multiplier = multiplier * (1 - heat);
} else {
multiplier = multiplier * (1 + heat);
}
heat = heat * .9;
} else {
balanced = true;
}
iteration++;
}
return tmp;
}