function step_down_gradient(iter, Y, Y_step){
const momentum = momentums[iter > momentum_switch ? 1: 0],
Q = find_Q(Y);
let average_y = make_array(map_dims).map(d=>0),
cost_total = 0,
grad_id,
step_id,step_id_new;
for(let i=0; i<num_points; i++){
let {cost, grad} = cost_grad_calc(Y, i, P, Q, iter);
cost_total += cost;
for(let d=0; d<map_dims; d++){
grad_id = grad[d];
step_id = Y_step[i][d];
step_id_new = momentum*step_id - learning_rate*grad_id;
Y_step[i][d] = step_id_new
Y[i][d] += step_id_new;
average_y[d] += Y[i][d];
}
}
for(let i=0; i<num_points; i++){
for(let d=0; d<map_dims; d++){
Y[i][d] -= average_y[d]/num_points
}
}
return {Y_new: Y, Y_step, cost: cost_total}
}