Skip to content

Commit

Permalink
update for preslice
Browse files Browse the repository at this point in the history
  • Loading branch information
aalkin committed Feb 13, 2025
1 parent 844c74f commit f919b12
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 84 deletions.
10 changes: 10 additions & 0 deletions Framework/Core/include/Framework/ASoA.h
Original file line number Diff line number Diff line change
Expand Up @@ -1416,6 +1416,7 @@ template <typename T, typename Policy, bool OPT = false>
struct PresliceBase : public Policy {
constexpr static bool optional = OPT;
using target_t = T;
using policy_t = Policy;
const std::string binding;

PresliceBase(expressions::BindingNode index_)
Expand Down Expand Up @@ -1453,6 +1454,15 @@ using Preslice = PresliceBase<T, PreslicePolicySorted, false>;
template <typename T>
using PresliceOptional = PresliceBase<T, PreslicePolicySorted, true>;

template <typename T>
concept is_preslice = requires(T t) {
std::same_as<decltype(t.binding), std::string>;
std::same_as<decltype(t.bindingKey), StringPair>;
&T::isMising;
&T::updateSliceInfo;
&T::getSliceFor;
};

} // namespace o2::framework

namespace o2::soa
Expand Down
147 changes: 72 additions & 75 deletions Framework/Core/include/Framework/AnalysisManagers.h
Original file line number Diff line number Diff line change
Expand Up @@ -509,98 +509,95 @@ static void setGroupedCombination(C& comb, TG& grouping, std::tuple<Ts...>& asso
}
}

} // namespace analysis_task_parsers
/// Preslice handling
template <typename T>
bool registerCache(T&, std::vector<StringPair>&, std::vector<StringPair>&)
{
return false;
}

template <typename ANY>
struct UpdateProcessSwitches {
static bool set(std::pair<std::string, bool>, ANY&)
{
return false;
}
};

template <typename R, typename T, typename... As>
struct UpdateProcessSwitches<ProcessConfigurable<R, T, As...>> {
static bool set(std::pair<std::string, bool> setting, ProcessConfigurable<R, T, As...>& what)
{
if (what.name == setting.first) {
what.value = setting.second;
template <is_preslice T>
requires std::same_as<typename T::policy_t, framework::PreslicePolicySorted>
bool registerCache(T& preslice, std::vector<StringPair>& bsks, std::vector<StringPair>&)
{
if constexpr (T::optional) {
if (preslice.binding == "[MISSING]") {
return true;
}
return false;
}
};

/// Manager template to handle slice caching
template <typename T>
struct PresliceManager {
static bool registerCache(T&, std::vector<StringPair>&, std::vector<StringPair>&)
{
return false;
auto locate = std::find_if(bsks.begin(), bsks.end(), [&](auto const& entry) { return (entry.first == preslice.bindingKey.first) && (entry.second == preslice.bindingKey.second); });
if (locate == bsks.end()) {
bsks.emplace_back(preslice.getBindingKey());
}
return true;
}

static bool updateSliceInfo(T&, ArrowTableSlicingCache&)
{
return false;
}
};

template <typename T, typename Policy, bool OPT>
struct PresliceManager<PresliceBase<T, Policy, OPT>> {
static bool registerCache(PresliceBase<T, Policy, OPT>& container, std::vector<StringPair>& bsks, std::vector<StringPair>&)
requires std::same_as<Policy, framework::PreslicePolicySorted>
{
if constexpr (OPT) {
if (container.binding == "[MISSING]") {
return true;
}
}
auto locate = std::find_if(bsks.begin(), bsks.end(), [&](auto const& entry) { return (entry.first == container.bindingKey.first) && (entry.second == container.bindingKey.second); });
if (locate == bsks.end()) {
bsks.emplace_back(container.getBindingKey());
template <is_preslice T>
requires std::same_as<typename T::policy_t, framework::PreslicePolicyGeneral>
bool registerCache(T& preslice, std::vector<StringPair>&, std::vector<StringPair>& bsksU)
{
if constexpr (T::optional) {
if (preslice.binding == "[MISSING]") {
return true;
}
return true;
}
auto locate = std::find_if(bsksU.begin(), bsksU.end(), [&](auto const& entry) { return (entry.first == preslice.bindingKey.first) && (entry.second == preslice.bindingKey.second); });
if (locate == bsksU.end()) {
bsksU.emplace_back(preslice.getBindingKey());
}
return true;
}

static bool registerCache(PresliceBase<T, Policy, OPT>& container, std::vector<StringPair>&, std::vector<StringPair>& bsksU)
requires std::same_as<Policy, framework::PreslicePolicyGeneral>
{
if constexpr (OPT) {
if (container.binding == "[MISSING]") {
return true;
}
}
auto locate = std::find_if(bsksU.begin(), bsksU.end(), [&](auto const& entry) { return (entry.first == container.bindingKey.first) && (entry.second == container.bindingKey.second); });
if (locate == bsksU.end()) {
bsksU.emplace_back(container.getBindingKey());
template <typename T>
bool updateSliceInfo(T&, ArrowTableSlicingCache&)
{
return false;
}

template <is_preslice T>
static bool updateSliceInfo(T& preslice, ArrowTableSlicingCache& cache)
requires std::same_as<typename T::policy_t, framework::PreslicePolicySorted>
{
if constexpr (T::optional) {
if (preslice.binding == "[MISSING]") {
return true;
}
return true;
}
preslice.updateSliceInfo(cache.getCacheFor(preslice.getBindingKey()));
return true;
}

static bool updateSliceInfo(PresliceBase<T, Policy, OPT>& container, ArrowTableSlicingCache& cache)
requires std::same_as<Policy, framework::PreslicePolicySorted>
{
if constexpr (OPT) {
if (container.binding == "[MISSING]") {
return true;
}
template <is_preslice T>
static bool updateSliceInfo(T& preslice, ArrowTableSlicingCache& cache)
requires std::same_as<typename T::policy_t, framework::PreslicePolicyGeneral>
{
if constexpr (T::optional) {
if (preslice.binding == "[MISSING]") {
return true;
}
container.updateSliceInfo(cache.getCacheFor(container.getBindingKey()));
return true;
}
preslice.updateSliceInfo(cache.getCacheUnsortedFor(preslice.getBindingKey()));
return true;
}

static bool updateSliceInfo(PresliceBase<T, Policy, OPT>& container, ArrowTableSlicingCache& cache)
requires std::same_as<Policy, framework::PreslicePolicyGeneral>
{
if constexpr (OPT) {
if (container.binding == "[MISSING]") {
return true;
}
}
container.updateSliceInfo(cache.getCacheUnsortedFor(container.getBindingKey()));
/// Process switches handling
template <typename T>
static bool setProcessSwitch(std::pair<std::string, bool>, T&)
{
return false;
}

template <is_process_configurable T>
static bool setProcessSwitch(std::pair<std::string, bool> setting, T& pc)
{
if (pc.name == setting.first) {
pc.value = setting.second;
return true;
}
};
return false;
}

} // namespace analysis_task_parsers
} // namespace o2::framework

#endif // ANALYSISMANAGERS_H
18 changes: 9 additions & 9 deletions Framework/Core/include/Framework/AnalysisTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,8 +444,8 @@ auto getTaskNameSetProcesses(std::string& outputName, TaskName first, SetDefault
auto task = std::make_shared<T>(std::forward<A>(args)...);
for (auto& setting : second.map) {
homogeneous_apply_refs(
[&](auto& x) {
return UpdateProcessSwitches<std::decay_t<decltype(x)>>::set(setting, x);
[&](auto& element) {
return analysis_task_parsers::setProcessSwitch(setting, element);
},
*task.get());
}
Expand All @@ -459,8 +459,8 @@ auto getTaskNameSetProcesses(std::string& outputName, SetDefaultProcesses first,
auto task = std::make_shared<T>(std::forward<A>(args)...);
for (auto& setting : first.map) {
homogeneous_apply_refs(
[&](auto& x) {
return UpdateProcessSwitches<std::decay_t<decltype(x)>>::set(setting, x);
[&](auto& element) {
return analysis_task_parsers::setProcessSwitch(setting, element);
},
*task.get());
}
Expand All @@ -474,8 +474,8 @@ auto getTaskNameSetProcesses(std::string& outputName, SetDefaultProcesses first,
auto task = std::make_shared<T>(std::forward<A>(args)...);
for (auto& setting : first.map) {
homogeneous_apply_refs(
[&](auto& x) {
return UpdateProcessSwitches<std::decay_t<decltype(x)>>::set(setting, x);
[&](auto& element) {
return analysis_task_parsers::setProcessSwitch(setting, element);
},
*task.get());
}
Expand Down Expand Up @@ -550,7 +550,7 @@ DataProcessorSpec adaptAnalysisTask(ConfigContext const& ctx, Args&&... args)
*task.get());

// add preslice declarations to slicing cache definition
homogeneous_apply_refs([&bindingsKeys, &bindingsKeysUnsorted](auto& x) { return PresliceManager<std::decay_t<decltype(x)>>::registerCache(x, bindingsKeys, bindingsKeysUnsorted); }, *task.get());
homogeneous_apply_refs([&bindingsKeys, &bindingsKeysUnsorted](auto& element) { return analysis_task_parsers::registerCache(element, bindingsKeys, bindingsKeysUnsorted); }, *task.get());

// request base tables for spawnable extended tables and indices to be built
// this checks for duplications
Expand Down Expand Up @@ -620,8 +620,8 @@ DataProcessorSpec adaptAnalysisTask(ConfigContext const& ctx, Args&&... args)
}
// reset pre-slice for the next dataframe
auto slices = pc.services().get<ArrowTableSlicingCache>();
homogeneous_apply_refs([&pc, &slices](auto& x) {
return PresliceManager<std::decay_t<decltype(x)>>::updateSliceInfo(x, slices);
homogeneous_apply_refs([&pc, &slices](auto& element) {
return analysis_task_parsers::updateSliceInfo(element, slices);
},
*(task.get()));
// initialize local caches
Expand Down

0 comments on commit f919b12

Please sign in to comment.