Based on this thread and a
district cost thread on Reddit, I think I have worked out the
COST_PROGRESSION_GAME_PROGRESS formula. It looks like it is essentially the same as the district cost formula, but with a variable scale and no below-average discount. The value is the fraction of techs or civics complete (whichever is more), expressed as a whole number percentage.
techProgress = # techs / 68
civicProgress = # civics / 51
progress = math.floor(100 * math.max(techProgress, civicProgress))
The maximum cost is based on the
PointProgressionParam1 value, which is a percentage of base cost:
maxCost = baseCost * param / 100
The total cost is then a linear interpolation from base to maximum cost (rounded down):
cost = lerp(baseCost, maxCost, progress / 100)