diff options
Diffstat (limited to 'Source/Utils/Parser/IntervalsParser.H')
-rw-r--r-- | Source/Utils/Parser/IntervalsParser.H | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/Source/Utils/Parser/IntervalsParser.H b/Source/Utils/Parser/IntervalsParser.H new file mode 100644 index 000000000..e9fffce9e --- /dev/null +++ b/Source/Utils/Parser/IntervalsParser.H @@ -0,0 +1,220 @@ +/* Copyright 2022 Andrew Myers, Burlen Loring, Luca Fedeli + * Maxence Thevenet, Remi Lehe, Revathi Jambunathan + * + * This file is part of WarpX. + * + * License: BSD-3-Clause-LBNL + */ + +#ifndef WARPX_UTILS_PARSER_INTERVALSPARSER_H_ +#define WARPX_UTILS_PARSER_INTERVALSPARSER_H_ + +#include <limits> +#include <string> +#include <vector> + +namespace utils::parser +{ + + /** + * \brief This class is a parser for slices of the form i:j:k where i, j and k are integers + * representing respectively the starting point, the stopping point and the period. + */ + class SliceParser + { + public: + /** + * \brief Constructor of the SliceParser class. + * + * @param[in] instr an input string of the form "i:j:k", "i:j" or "k" where i, j and k are + * integers representing respectively the starting point, the stopping point and the period. + * Any of these integers may be omitted in which case it will be equal to their default value + * (0 for the starting point, std::numeric_limits<int>::max() for the stopping point and 1 for + * the period). For example SliceParser(":1000:") is equivalent to SliceParser("0:1000:1"). + */ + SliceParser (const std::string& instr, bool isBTD=false); + + /** + * \brief A method that returns true if the input integer is contained in the slice. (e.g. if + * the list is initialized with "300:500:100", this method returns true if and only if n is + * 300, 400 or 500). If the period is negative or 0, the function always returns false. + * + * @param[in] n the input integer + */ + bool contains (const int n) const; + + /** + * \brief A method that returns the smallest integer strictly greater than n such that + * contains(n) is true. Returns std::numeric_limits<int>::max() if there is no such integer. + * + * @param[in] n the input integer + */ + int nextContains (const int n) const; + + /** + * \brief A method that returns the greatest integer strictly smaller than n such that + * contains(n) is true. Returns 0 if there is no such integer. + * + * @param[in] n the input integer + */ + int previousContains (const int n) const; + + /** + * \brief A method that returns the slice period. + * + */ + int getPeriod () const; + + /** + * \brief A method that returns the slice start. + * + */ + int getStart () const; + + /** + * \brief A method that returns the slice stop. + * + */ + int getStop () const; + + /** + * @brief A method that returns the number of integers contained by the slice. + * + */ + int numContained() const; + + private: + bool m_isBTD = false; + int m_start = 0; + int m_stop = std::numeric_limits<int>::max(); + int m_period = 1; + std::string m_separator = ":"; + + }; + + + /** + * \brief This class is a parser for multiple slices of the form x,y,z,... where x, y and z are + * slices of the form i:j:k, as defined in the SliceParser class. This class contains a vector of + * SliceParsers. + */ + class IntervalsParser + { + public: + /** + * \brief Default constructor of the IntervalsParser class. + */ + IntervalsParser () = default; + + /** + * \brief Constructor of the IntervalsParser class. + * + * @param[in] instr_vec an input vector string, which when concatenated is of the form + * "x,y,z,...". This will call the constructor of SliceParser using x, y and z as input + * arguments. + */ + IntervalsParser (const std::vector<std::string>& instr_vec); + + /** + * \brief A method that returns true if the input integer is contained in any of the slices + * contained by the IntervalsParser. + * + * @param[in] n the input integer + */ + bool contains (const int n) const; + + /** + * \brief A method that returns the smallest integer strictly greater than n such that + * contains(n) is true. Returns std::numeric_limits<int>::max() if there is no such integer. + * + * @param[in] n the input integer + */ + int nextContains (const int n) const; + + /** + * \brief A method that returns the greatest integer strictly smaller than n such that + * contains(n) is true. Returns 0 if there is no such integer. + * + * @param[in] n the input integer + */ + int previousContains (const int n) const; + + /** + * \brief A method that returns the greatest integer smaller than or equal to n such that + * contains(n) is true. Returns 0 if there is no such integer. + * + * @param[in] n the input integer + */ + int previousContainsInclusive (const int n) const; + + /** + * \brief A method the local period (in timesteps) of the IntervalsParser at timestep n. + * The period is defined by nextContains(n) - previousContainsInclusive(n) + * + * @param[in] n the input integer + */ + int localPeriod (const int n) const; + + /** + * \brief A method that returns true if any of the slices contained by the IntervalsParser + * has a strictly positive period. + */ + bool isActivated () const; + + private: + std::vector<SliceParser> m_slices; + std::string m_separator = ","; + bool m_activated = false; + }; + + /** + * \brief This class is a parser for multiple slices of the form x,y,z,... where x, y and z are + * slices of the form i:j:k, as defined in the SliceParser class. This class contains a vector of + * SliceParsers. The supported function set differs from the IntervalsParser + */ + class BTDIntervalsParser + { + public: + /** + * \brief Default constructor of the BTDIntervalsParser class. + */ + BTDIntervalsParser () = default; + + /** + * \brief Constructor of the BTDIntervalsParser class. + * + * @param[in] instr_vec an input vector string, which when concatenated is of the form + * "x,y,z,...". This will call the constructor of SliceParser using x, y and z as input + * arguments. + */ + BTDIntervalsParser (const std::vector<std::string>& instr_vec); + + /** + * @brief Return the total number of unique labframe snapshots + */ + int NumSnapshots (); + + /** + * @brief Return the iteration number stored at index i_buffer + * + * @param i_buffer buffer or iteration index, between 0 and NumSnapshots + */ + int GetBTDIteration(int i_buffer); + + /** + * \brief A method that returns true if any of the slices contained by the IntervalsParser + * has a strictly positive period. + */ + bool isActivated () const; + + private: + std::vector<int> m_btd_iterations; + std::vector<SliceParser> m_slices; + std::vector<int> m_slice_starting_i_buffer; + int m_n_snapshots; + static constexpr char m_separator = ','; + bool m_activated = false; + }; +} + +#endif // WARPX_UTILS_PARSER_INTERVALSPARSER_H_ |