Enumerates all permutations
| 604 | |
| 605 | // Enumerates all permutations |
| 606 | std::vector<std::vector<double>> linspace(std::vector<double> start, std::vector<double> end, std::vector<unsigned int> points) |
| 607 | { |
| 608 | assert(start.size() == end.size() && end.size() == points.size()); |
| 609 | |
| 610 | size_t nDims = start.size(); |
| 611 | size_t numPoints = 1; |
| 612 | for(size_t i = 0; i < nDims; i++) { |
| 613 | numPoints *= points.at(i); |
| 614 | } |
| 615 | |
| 616 | #ifndef NDEBUG |
| 617 | if(numPoints > 10000) { |
| 618 | std::cout << "Warning: Enumerating " << numPoints << " points." << std::endl; |
| 619 | } |
| 620 | #endif // ifndef NDEBUG |
| 621 | |
| 622 | auto result = std::vector<std::vector<double>>(numPoints); |
| 623 | |
| 624 | auto dx = std::vector<double>(nDims); |
| 625 | auto it = std::vector<unsigned int>(nDims); |
| 626 | auto cur = std::vector<double>(nDims); |
| 627 | |
| 628 | for(unsigned int i = 0; i < nDims; i++) { |
| 629 | cur.at(i) = start.at(i); |
| 630 | it.at(i) = 0; |
| 631 | dx.at(i) = (end.at(i) - start.at(i)) / (points.at(i) - 1); |
| 632 | } |
| 633 | |
| 634 | size_t curDim = 0; |
| 635 | size_t i = 0; |
| 636 | // Add the start vector |
| 637 | result.at(i++) = std::vector<double>(start); |
| 638 | while(true) { |
| 639 | curDim = 0; |
| 640 | while(curDim < nDims && it.at(curDim)+1 >= points.at(curDim)) { |
| 641 | it.at(curDim) = 0; |
| 642 | cur.at(curDim) = start.at(curDim) + dx.at(curDim) * it.at(curDim); |
| 643 | curDim++; |
| 644 | } |
| 645 | // If we're unable to find a number that can be increased, |
| 646 | // it means were at the highest number |
| 647 | // (for 4 digits in decimal that is 9999) |
| 648 | if(curDim >= nDims) { |
| 649 | break; |
| 650 | } |
| 651 | |
| 652 | it.at(curDim)++; |
| 653 | cur.at(curDim) = start.at(curDim) + dx.at(curDim) * it.at(curDim); |
| 654 | |
| 655 | result.at(i++) = std::vector<double>(cur); |
| 656 | } |
| 657 | |
| 658 | assert(i == numPoints); |
| 659 | |
| 660 | return result; |
| 661 | } |
| 662 | |
| 663 | std::vector<std::vector<double>> linspace(int dim, double start, double end, unsigned int points) |
no outgoing calls
no test coverage detected