If I got this straight, for skills there are three multiplier, and 2 linear stats, multipliers are within bounds: 0.5 to 1.5. The first linear describes the 'action', the number of points for the stat, it has the first multiplier. the 2nd linear, determines the training: beyond where action points are going to weight only 1/3, withthe 2nd a multiplier. The third multiplier acts on the result: the action value up to the training threshold, plus the thirds beyond.
This is what you get when you call get_skill(), however, the multiplier is also applied for each new skill point that is added, and again there is another training threshold, but here, beyond, the addition is multiplied by the maximum of 0.1 and 1 - (training beyond / 3000).
Edit: strike last sentence as __setattr__ is not called on apply_item_effects()