9f9f87c064
LinearScheduler and CosineScheduler now guarantee step() returns max_lr on the first call and min_lr on the total_steps-th call, using the standard endpoint parameterisation t = (step-1)/(total_steps-1). This resolves the inconsistent first-step semantics reported in review.