/* 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 */ #include "IntervalsParser.H" #include "ParserUtils.H" #include "Utils/Strings/StringUtils.H" #include "Utils/TextMsg.H" #include #include utils::parser::SliceParser::SliceParser (const std::string& instr, const bool isBTD) { namespace utils_str = utils::strings; m_isBTD = isBTD; // split string and trim whitespaces auto insplit = utils_str::split>(instr, m_separator, true); if(insplit.size() == 1){ // no colon in input string. The input is the period. WARPX_ALWAYS_ASSERT_WITH_MESSAGE(!m_isBTD, "must specify interval stop for BTD"); m_period = parseStringtoInt(insplit[0], "interval period");} else if(insplit.size() == 2) // 1 colon in input string. The input is start:stop { WARPX_ALWAYS_ASSERT_WITH_MESSAGE(!m_isBTD || !insplit[1].empty(), "must specify interval stop for BTD"); if (!insplit[0].empty()){ m_start = parseStringtoInt(insplit[0], "interval start");} if (!insplit[1].empty()){ m_stop = parseStringtoInt(insplit[1], "interval stop");} } else // 2 colons in input string. The input is start:stop:period { WARPX_ALWAYS_ASSERT_WITH_MESSAGE(!m_isBTD || !insplit[1].empty(), "must specify interval stop for BTD"); WARPX_ALWAYS_ASSERT_WITH_MESSAGE( insplit.size() == 3, instr + "' is not a valid syntax for a slice."); if (!insplit[0].empty()){ m_start = parseStringtoInt(insplit[0], "interval start");} if (!insplit[1].empty()){ m_stop = parseStringtoInt(insplit[1], "interval stop");} if (!insplit[2].empty()){ m_period = parseStringtoInt(insplit[2], "interval period");} } } bool utils::parser::SliceParser::contains (const int n) const { if (m_period <= 0) {return false;} return (n - m_start) % m_period == 0 && n >= m_start && n <= m_stop; } int utils::parser::SliceParser::nextContains (const int n) const { if (m_period <= 0) {return std::numeric_limits::max();} int next = m_start; if (n >= m_start) {next = ((n-m_start)/m_period + 1)*m_period+m_start;} if (next > m_stop) {next = std::numeric_limits::max();} return next; } int utils::parser::SliceParser::previousContains (const int n) const { if (m_period <= 0) {return false;} int previous = ((std::min(n-1,m_stop)-m_start)/m_period)*m_period+m_start; if ((n < m_start) || (previous < 0)) {previous = 0;} return previous; } int utils::parser::SliceParser::getPeriod () const {return m_period;} int utils::parser::SliceParser::getStart () const {return m_start;} int utils::parser::SliceParser::getStop () const {return m_stop;} int utils::parser::SliceParser::numContained () const { return (m_stop - m_start) / m_period + 1;} utils::parser::IntervalsParser::IntervalsParser ( const std::vector& instr_vec) { namespace utils_str = utils::strings; std::string inconcatenated; for (const auto& instr_element : instr_vec) inconcatenated +=instr_element; auto insplit = utils_str::split>(inconcatenated, m_separator); for(const auto& inslc : insplit) { SliceParser temp_slice(inslc); m_slices.push_back(temp_slice); if ((temp_slice.getPeriod() > 0) && (temp_slice.getStop() >= temp_slice.getStart())) m_activated = true; } } bool utils::parser::IntervalsParser::contains (const int n) const { return std::any_of(m_slices.begin(), m_slices.end(), [&](const auto& slice){return slice.contains(n);}); } int utils::parser::IntervalsParser::nextContains (const int n) const { int next = std::numeric_limits::max(); for(const auto& slice: m_slices){ next = std::min(slice.nextContains(n),next); } return next; } int utils::parser::IntervalsParser::previousContains (const int n) const { int previous = 0; for(const auto& slice: m_slices){ previous = std::max(slice.previousContains(n),previous); } return previous; } int utils::parser::IntervalsParser::previousContainsInclusive ( const int n) const { if (contains(n)){return n;} else {return previousContains(n);} } int utils::parser::IntervalsParser::localPeriod (const int n) const { return nextContains(n) - previousContainsInclusive(n); } bool utils::parser::IntervalsParser::isActivated () const {return m_activated;} utils::parser::BTDIntervalsParser::BTDIntervalsParser ( const std::vector& instr_vec) { std::string inconcatenated; for (const auto& instr_element : instr_vec) inconcatenated +=instr_element; auto const insplit = utils::strings::split>(inconcatenated, std::string(1,m_separator)); // parse the Intervals string into Slices and store each slice in m_slices, // in order of increasing Slice start value for(const auto& inslc : insplit) { bool isBTD = true; SliceParser temp_slice(inslc, isBTD); if (m_slices.size() > 0) { // find the last index i_slice where // the start value of m_slices[i_slice] is greater than temp_slices' start_value int i_slice = 0; while (temp_slice.getStart() > m_slices[i_slice].getStart() && i_slice < static_cast(m_slices.size())) { i_slice++; } m_slices.insert(m_slices.begin() + i_slice, temp_slice); } else { m_slices.push_back(temp_slice); } } // from the vector of slices, m_slices, // create a vector of integers, m_btd_iterations, containing // the iteration of every back-transformed snapshot that will be saved // the iteration values in m_btd_iterations are // 1. saved in increasing order // 2. unique, i.e. no duplicate iterations are saved for (const auto& temp_slice : m_slices) { const int start = temp_slice.getStart(); const int period = temp_slice.getPeriod(); int btd_iter_ind; // for Slice temp_slice in m_slices, // determine the index in m_btd_iterations where temp_slice's starting value goes // // Implementation note: // assuming the user mostly lists slices in ascending order, // start at the end of m_btd_iterations and search backward if (m_btd_iterations.size() == 0) { btd_iter_ind = 0; } else { btd_iter_ind = m_btd_iterations.size() - 1; while (start < m_btd_iterations[btd_iter_ind] and btd_iter_ind>0) { btd_iter_ind--; } } // insert each iteration contained in temp_slice into m_btd_iterations // adding them in increasing sorted order and not adding any iterations // already contained in m_btd_iterations for (int ii = start; ii <= temp_slice.getStop(); ii += period) { if (m_btd_iterations.size() > 0) { // find where iteration ii should go in m_btd_iterations while (ii > m_btd_iterations[btd_iter_ind] && btd_iter_ind < static_cast(m_btd_iterations.size())) { btd_iter_ind++; } if (ii != m_btd_iterations[btd_iter_ind]) { m_btd_iterations.insert(m_btd_iterations.begin() + btd_iter_ind, ii); } } else { m_btd_iterations.push_back(ii); } } if ((temp_slice.getPeriod() > 0) && (temp_slice.getStop() >= start)) m_activated = true; } } int utils::parser::BTDIntervalsParser::NumSnapshots () const { return m_btd_iterations.size(); } int utils::parser::BTDIntervalsParser::GetBTDIteration (int i_buffer) const { return m_btd_iterations[i_buffer]; } int utils::parser::BTDIntervalsParser::GetFinalIteration () const { return m_btd_iterations.back(); } bool utils::parser::BTDIntervalsParser::isActivated () const {return m_activated;} at/jsx-transform'>feat/jsx-transform Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2023-11-27Remove support for simple objects in endpoints (#9181)Gravatar Bjorn Lu 56-529/+206
* Deprecate simple object from endpoints * Update changeset * Add missing Response return Co-authored-by: Happydev <81974850+MoustaphaDev@users.noreply.github.com> * Update .changeset/clever-beds-notice.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> --------- Co-authored-by: Happydev <81974850+MoustaphaDev@users.noreply.github.com> Co-authored-by: Matthew Phillips <matthew@skypack.dev> Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
2023-11-28Remove shiki lang path property support (#9196)Gravatar Bjorn Lu 7-427/+22
2023-11-28Remove deprecated features from Astro 3.0 (#9168)Gravatar Bjorn Lu 47-398/+95
2023-11-28Remove deprecated markdown-remark APIs (#9182)Gravatar Bjorn Lu 4-59/+7
2023-11-27[ci] release (#9180)astro@3.6.1Gravatar Houston (Bot) 32-65/+63
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-11-24Remove vercel deprecated analytics option (#9184)Gravatar Bjorn Lu 3-30/+12
2023-11-24[ci] formatGravatar Guspan Tanadi 1-2/+1
2023-11-24style: highlight markdown Tip Note section CONTRIBUTING (#9123)Gravatar Guspan Tanadi 1-5/+7
2023-11-23fix scroll restoration issue on webKit browsers (#9186)Gravatar Martin Trapp 2-1/+7
* fix scroll restoration issue on webKit browsers * add changeset * Update .changeset/shaggy-socks-glow.md * Update .changeset/shaggy-socks-glow.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> --------- Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
2023-11-23fix(middleware): rename internal middleware id (#9173)Gravatar Arsh 2-1/+6
* rename internal middleware id * add changeset
2023-11-23fix: Changelog formatting for 3.6.0 View Transition events (#9176)Gravatar Martin Trapp 1-3/+3
Co-authored-by: Eva Decker <itsevadecker@gmail.com>
2023-11-22[ci] formatGravatar Eva Decker 1-3/+3
2023-11-22Fix View Transitions code block formatting (#9174)Gravatar Eva Decker 1-3/+3
2023-11-22Rename entryPoint to entrypoint (#9161)Gravatar Bjorn Lu 14-26/+38
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
2023-11-22Fix esbuild warning for local dev (#9160)Gravatar Bjorn Lu 1-1/+1
2023-11-22[ci] release (#9165)astro@3.6.0Gravatar Houston (Bot) 34-90/+83
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>