diff --git a/LBFG/LBFGSpp/LineSearchNocedalWright.h b/LBFG/LBFGSpp/LineSearchNocedalWright.h index 3248ff7bc5ab7002abb6f953214272529a86b1a1..b41b99cff5a33fea67fa3154ea806772203c434b 100644 --- a/LBFG/LBFGSpp/LineSearchNocedalWright.h +++ b/LBFG/LBFGSpp/LineSearchNocedalWright.h @@ -84,7 +84,7 @@ public: test_curv = -param.wolfe * dg_init; // Curvature // Ends of the line search range (step_lo > step_hi is allowed) - Scalar step_hi, fx_hi, dg_hi; + Scalar step_hi, fx_hi;//, dg_hi; Scalar step_lo = Scalar(0), fx_lo = fx_init, dg_lo = dg_init; // STEP 1: Bracketing Phase @@ -110,7 +110,7 @@ public: { step_hi = step; fx_hi = fx; - dg_hi = dg; + //dg_hi = dg; break; } // If reaching here, then the sufficient decrease condition is satisfied @@ -121,7 +121,7 @@ public: step_hi = step_lo; fx_hi = fx_lo; - dg_hi = dg_lo; + //dg_hi = dg_lo; step_lo = step; fx_lo = fx; dg_lo = dg; @@ -188,7 +188,7 @@ public: step_hi = step; fx_hi = fx; - dg_hi = dg; + //dg_hi = dg; } else { @@ -200,7 +200,7 @@ public: { step_hi = step_lo; fx_hi = fx_lo; - dg_hi = dg_lo; + //dg_hi = dg_lo; } if (step == step_lo) diff --git a/drt.cpp b/drt.cpp index 023b91e19091a2a4679aab6725bcd5247a759338..b69fb4731df7d8806fa8cc5e7ecbf383b3b71b60 100644 --- a/drt.cpp +++ b/drt.cpp @@ -3,14 +3,11 @@ #include <Eigen/Core> #include <eisgenerator/eistype.h> - #include "tensoroptions.h" #include "eigentorchconversions.h" #include "eistotorch.h" #include "LBFG/LBFGS.h" - - static torch::Tensor guesStartingPoint(torch::Tensor& omega, torch::Tensor& impedanceSpectra) { std::vector<int64_t> size = omega.sizes().vec(); @@ -94,14 +91,6 @@ public: int64_t size = x.numel(); torch::Tensor xLeft = x.narrow(0, 0, x.numel()-1); - std::cout<<"x:\n"<<x<<'\n'; - std::cout<<"xLeft:\n"<<xLeft<<'\n'; - std::cout<<"real:\n"<<torch::real(impedanceSpectra)<<'\n'; - std::cout<<"imag:\n"<<torch::imag(impedanceSpectra)<<'\n'; - std::cout<<"aMatrixReal:\n"<<aMatrixReal<<'\n'; - std::cout<<"aMatrixImag:\n"<<aMatrixImag<<'\n'; - - torch::Tensor MSE_re = torch::sum(torch::pow(xAccessor[size-1] + torch::matmul(aMatrixReal, xLeft) - torch::real(impedanceSpectra), 2)); torch::Tensor MSE_im = torch::sum(torch::pow(torch::matmul(aMatrixImag, xLeft) - torch::imag(impedanceSpectra), 2)); torch::Tensor reg_term = el/2*torch::sum(torch::pow(xLeft, 2)); @@ -138,30 +127,31 @@ public: } }; -torch::Tensor calcDrt(torch::Tensor& impedanceSpectra, torch::Tensor& omegaTensor, FitMetics& fm) +torch::Tensor calcDrt(torch::Tensor& impedanceSpectra, torch::Tensor& omegaTensor, FitMetics& fm, const FitParameters& fp) { torch::Tensor aMatrixImag = aImag(omegaTensor); torch::Tensor aMatrixReal = aReal(omegaTensor); LBFGSpp::LBFGSParam<fvalue> fitParam; - fitParam.epsilon = 1e-2; - fitParam.max_iterations = 100; - fitParam.max_linesearch = 1000; + fitParam.epsilon = fp.epsilon; + fitParam.max_iterations = fp.maxIter; + fitParam.max_linesearch = fp.maxIter*10; LBFGSpp::LBFGSSolver<fvalue> solver(fitParam); - RtFunct funct(impedanceSpectra, aMatrixImag, aMatrixReal, 0.01, 0.001); + RtFunct funct(impedanceSpectra, aMatrixImag, aMatrixReal, 0.01, fp.step); torch::Tensor startTensor = guesStartingPoint(omegaTensor, impedanceSpectra); Eigen::VectorX<fvalue> x = libtorch2eigenVector<fvalue>(startTensor); fm.iterations = solver.minimize(funct, x, fm.fx); - return eigenVector2libtorch<fvalue>(x); + torch::Tensor xT = eigenVector2libtorch<fvalue>(x); + return xT; } -torch::Tensor calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm) +torch::Tensor calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm, const FitParameters& fp) { torch::Tensor impedanceSpectra = eisToComplexTensor(data, nullptr); torch::Tensor omegaTensor = fvalueVectorToTensor(const_cast<std::vector<fvalue>&>(omegaVector)).clone(); - return calcDrt(impedanceSpectra, omegaTensor, fm); + return calcDrt(impedanceSpectra, omegaTensor, fm, fp); } diff --git a/drt/drt.h b/drt/drt.h index 192ee3e2cf750772b93406296b6ffee505f99d35..e3b9c6a22648eb8c0a7b961ad287d46e7b36467d 100644 --- a/drt/drt.h +++ b/drt/drt.h @@ -6,8 +6,17 @@ struct FitMetics { int iterations; fvalue fx; + bool compleated; }; -torch::Tensor calcDrt(torch::Tensor& impedanceSpectra, torch::Tensor& omegaTensor, FitMetics& fm); +struct FitParameters +{ + int maxIter; + double epsilon; + double step; + FitParameters(int maxIterI, double epsilonI = 1e-2, double stepI = 0.001): maxIter(maxIterI), epsilon(epsilonI), step(stepI){} +}; + +torch::Tensor calcDrt(torch::Tensor& impedanceSpectra, torch::Tensor& omegaTensor, FitMetics& fm, const FitParameters& fp); -torch::Tensor calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm); +torch::Tensor calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm, const FitParameters& fp); diff --git a/eigentorchconversions.h b/eigentorchconversions.h index efd7a488b17305fe88cb2048616d8563cd9a255b..2a3355c01825c630f3e3722730ce4321935e7fa7 100644 --- a/eigentorchconversions.h +++ b/eigentorchconversions.h @@ -51,7 +51,7 @@ torch::Tensor eigen2libtorch(MatrixXrm<V> &E, bool copydata = true) template <typename V> torch::Tensor eigenVector2libtorch(Eigen::Vector<V, Eigen::Dynamic> &E, bool copydata = true) { - std::vector<int64_t> dims = {E.cols()}; + std::vector<int64_t> dims = {E.rows()}; auto T = torch::from_blob(E.data(), dims, tensorOptCpu<V>(false)); if (copydata) return T.clone(); diff --git a/main.cpp b/main.cpp index a17f0d3d7bd304cf509d3271a87c9da0d9a7e35a..d859e4a0c62a4f65e6f756e4cbe799aac3afa0a4 100644 --- a/main.cpp +++ b/main.cpp @@ -25,7 +25,10 @@ int main(int argc, char** argv) { std::cout<<std::scientific; - eis::Range omega(1, 1e6, 4, true); + for(size_t i = 0; i < 10; ++i) + { + + eis::Range omega(1, 1e6, 50, true); std::vector<fvalue> omegaVector = omega.getRangeVector(); eis::Model model("r{10}-r{50}p{0.02, 0.8}"); @@ -33,11 +36,12 @@ int main(int argc, char** argv) printImpedance(data); FitMetics fm; - torch::Tensor x = calcDrt(data, omegaVector, fm); + torch::Tensor x = calcDrt(data, omegaVector, fm, FitParameters(1000)); std::cout<<"Iterations: "<<fm.iterations<<'\n'; std::cout<<"fx "<<fm.fx<<'\n'; std::cout<<"xVect\n"<<x<<'\n'; + } return 0; }