diff --git a/BothLoops.cpp b/BothLoops.cpp new file mode 100644 index 0000000..5ff7100 --- /dev/null +++ b/BothLoops.cpp @@ -0,0 +1,93 @@ +#include +#include // power +#include + +// [[Rcpp::export]] +Rcpp::NumericVector BothLoops(Rcpp::NumericVector& vProductivity, Rcpp::NumericVector& vGridCapital, + Rcpp::NumericMatrix& mOutput, Rcpp::NumericMatrix& mTransition, + Rcpp::NumericVector& bbeta_, Rcpp::IntegerVector& nGridCapital_, + Rcpp::IntegerVector& nGridProductivity_){ + + const int nGridCapital = nGridCapital_[0]; + const int nGridProductivity = nGridProductivity_[0]; + const double bbeta = bbeta_[0]; + + double valueProvisional, valueHighSoFar, consumption, capitalChoice; + + int nProductivity, nProductivityNextPeriod, nCapital, nCapitalNextPeriod, gridCapitalNextPeriod; + + double maxDifference = 10.0, diff, diffHighSoFar; + double tolerance = 0.0000001; + int iteration = 0; + + Rcpp::NumericMatrix mValueFunctionNew(nGridCapital,nGridProductivity); + Rcpp::NumericMatrix mValueFunction(nGridCapital,nGridProductivity); + Rcpp::NumericMatrix mPolicyFunction(nGridCapital,nGridProductivity); + Rcpp::NumericMatrix expectedValueFunction(nGridCapital,nGridProductivity); + + while(maxDifference > tolerance) { + + for (nProductivity = 0;nProductivityvalueHighSoFar){ + valueHighSoFar = valueProvisional; + capitalChoice = vGridCapital[nCapitalNextPeriod]; + gridCapitalNextPeriod = nCapitalNextPeriod; + } + else{ + break; // We break when we have achieved the max + } + mValueFunctionNew(nCapital,nProductivity) = valueHighSoFar; + mPolicyFunction(nCapital,nProductivity) = capitalChoice; + } + } + } + + diffHighSoFar = -100000.0; + for (nProductivity = 0;nProductivitydiffHighSoFar){ + diffHighSoFar = diff; + } + mValueFunction(nCapital,nProductivity) = mValueFunctionNew(nCapital,nProductivity); + } + } + + maxDifference = diffHighSoFar; + + iteration = iteration+1; + if (iteration % 10 ==0 || iteration ==1){ + Rcpp::Rcout <<"Iteration = "<