private void CalculateInversionVectors(int i, T eta, T gamma) { var op = default(TOperations); var etaOverLambda = new SN.Vector <T>(op.Divide(eta, _lambda)); var gammaOverLambda = new SN.Vector <T>(op.Divide(gamma, _lambda)); var ev = new SN.Vector <T>(_e, 0); for (var j = 0; j < i; j += SN.Vector <T> .Count) { var gv = new SN.Vector <T>(_g, j); var gvNew = gv + gammaOverLambda * ev; var evNew = ev + etaOverLambda * gv; ev = new SN.Vector <T>(_e, j + SN.Vector <T> .Count); gvNew.CopyTo(_g, j); evNew.CopyTo(_e, j + 1); } _e[0] = etaOverLambda[0]; _g[i] = gammaOverLambda[0]; }
private void CalculateIntermediateResult(int i, TVector d, T[] s) { var iColumnCache = GetColumnCacheIndex(i); var theta = d[i]; var op = default(TOperations); for (var j = 0; j < i; j += SN.Vector <T> .Count) { var sv = new SN.Vector <T>(s, j); var cv = new SN.Vector <T>(_columnCache, iColumnCache + j); var sum = SN.Vector.Dot(sv, cv); theta = op.Subtract(theta, sum); } var thetaOverLambda = new SN.Vector <T>(op.Divide(theta, _lambda)); for (var j = 0; j < i; j += SN.Vector <T> .Count) { var ev = new SN.Vector <T>(_e, j); var sv = new SN.Vector <T>(s, j); var r = sv + ev * thetaOverLambda; r.CopyTo(s, j); } s[i] = thetaOverLambda[0]; }
private T CalculateEta(int i) { var op = default(TOperations); var eta = op.Negate(_rowCache[0 + i]); for (var j = 0; j < i; j += SN.Vector <T> .Count) { var ev = new SN.Vector <T>(_e, j); var rv = new SN.Vector <T>(_rowCache, j); var sum = SN.Vector.Dot(ev, rv); eta = op.Subtract(eta, sum); } return(eta); }
private T CalculateGamma(int i) { var iColumnCache = GetColumnCacheIndex(i); var op = default(TOperations); var gamma = op.Negate(_columnCache[iColumnCache - 1]); for (var j = 0; j < i; j += SN.Vector <T> .Count) { var gv = new SN.Vector <T>(_g, j); var cv = new SN.Vector <T>(_columnCache, iColumnCache + j); var sum = SN.Vector.Dot(gv, cv); gamma = op.Subtract(gamma, sum); } return(gamma); }