499 set<string> outputHandles(state.outputHandles.begin(), state.outputHandles.end());
500 vector<TensorPtr> chain{arg};
502 for (
auto& i: state.handleStates)
504 if (i.order!=ravel::HandleSort::none || i.displayFilterCaliper)
507 auto permuteAxis=make_shared<PermuteAxis>();
508 permuteAxis->setArgument(chain.back(), {i.description,0});
509 auto& xv=chain.back()->hypercube().xvectors[permuteAxis->axis()];
511 for (
size_t i=0; i<xv.size(); ++i)
515 case ravel::HandleSort::none:
break;
516 case ravel::HandleSort::forward:
517 case ravel::HandleSort::numForward:
518 case ravel::HandleSort::timeForward:
519 sort(perm.begin(), perm.end(),
520 [&](
size_t i,
size_t j) {
return diff(xv[i],xv[j])<0;});
522 case ravel::HandleSort::reverse:
523 case ravel::HandleSort::numReverse:
524 case ravel::HandleSort::timeReverse:
525 sort(perm.begin(), perm.end(),
526 [&](
size_t i,
size_t j) {
return diff(xv[i],xv[j])>0;});
528 case ravel::HandleSort::custom:
530 map<string, size_t> offsets;
531 for (
size_t i=0; i<xv.size(); ++i)
532 offsets[
str(xv[i], xv.dimension.units)]=i;
534 for (
auto& j: i.customOrder)
535 if (offsets.count(j))
536 perm.push_back(offsets[j]);
543 if (i.displayFilterCaliper)
546 if (!i.minLabel.empty())
547 for (
auto j=perm.begin(); j!=perm.end(); ++j)
548 if (
str(xv[*j],xv.dimension.units) == i.minLabel)
550 perm.erase(perm.begin(), j);
553 if (!i.maxLabel.empty())
554 for (
auto j=perm.begin(); j!=perm.end(); ++j)
555 if (
str(xv[*j],xv.dimension.units) == i.maxLabel)
557 perm.erase(j+1, perm.end());
561 permuteAxis->setPermutation(move(perm));
562 chain.push_back(permuteAxis);
564 if (!outputHandles.count(i.description))
566 auto arg=chain.back();
570 chain.back()->setArgument(arg, {i.description,0});
574 chain.emplace_back(
new Slice);
575 auto& xv=arg->hypercube().xvectors;
576 auto axisIt=find_if(xv.begin(), xv.end(),
577 [&](
const XVector& j){
return j.name==i.description;});
578 if (axisIt==xv.end())
throw runtime_error(
"axis "+i.description+
" not found");
579 auto sliceIt=find_if(axisIt->begin(), axisIt->end(),
580 [&](
const boost::any& j){
return str(j,axisIt->dimension.units)==i.sliceLabel;});
583 if (sliceIt!=axisIt->end())
584 sliceIdx=sliceIt-axisIt->begin();
585 chain.back()->setArgument(arg, {i.description, double(sliceIdx)});
590 if (chain.back()->rank()>1)
592 auto finalPivot=make_shared<Pivot>();
593 finalPivot->setArgument(chain.back());
594 finalPivot->setOrientation(state.outputHandles);
595 chain.push_back(finalPivot);
std::string str(T x)
utility function to create a string representation of a numeric type
TensorPtr createReductionOp(ravel::Op::ReductionOp op)
factory method for creating reduction operations