Algebra(3,0, ()=>{
const cost = (plane, v)=>{var volume_v = plane.Normalized ^ v.Normalized; return (-1)*volume_v.Reverse << volume_v;}
var d = this.D(cost)
var dt = this.Dt(cost);
function line_search_meta(...args){
const alpha = 0.25, beta = 0.8;
const ls_th = 50;
const x = args[0];
const tail_args = args.slice(1);
const fx = cost.apply(null, args);
const delta_x = dt.apply(null,args);
const nabla_f = d.apply(null,args);
const alpha_nabla_f_delta_x = alpha * nabla_f * delta_x;
var t = 1;
for (var i = 0; i < ls_th; i++){
if (cost.apply(null, [].concat(x + t * delta_x, tail_args)) > fx + t * alpha_nabla_f_delta_x){
t = beta * t;
} else {
break;
}
}
return t;
}
function gradient_descent(...args){
var i_th = 50;
var th_break = 10e-5;
var p_cost = Number.MAX_SAFE_INTEGER;
var log_cost = [], log_x = [], log_rate_t = [];
for (var i = 0; i < i_th; i++) {
var t = line_search_meta.apply(null,args); log_rate_t.push(t);
args[0] = args[0] - t * dt.apply(null, args)[0]; log_x.push(args[0]);
var temp_cost = cost.apply(null, args); log_cost.push(temp_cost[0]);
if (Math.abs(p_cost - temp_cost) < th_break){break;} else {p_cost = temp_cost;}
}
return {'x':args[0].Normalized+'', log_cost, log_rate_t};
}
var guess = 1e12+1e23+0.5e13, v = 1e3;
return gradient_descent(guess, v);
})