// This file is part of Bertini 2.
//
// blackbox/switches_zerodim.hpp is free software: you can redistribute it
// and/or modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// blackbox/switches_zerodim.hpp is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with blackbox/switches_zerodim.hpp. If not, see
// .
//
// Copyright(C) 2017-2021 by Bertini2 Development Team
//
// See for a copy of the license,
// as well as COPYING. Bertini2 is provided with permitted
// additional terms in the b2/licenses/ directory.
//
// silviana amethyst, university of wisconsin-eau claire
/**
\file blackbox/switches_zerodim.hpp
\brief A sequence of switches for getting a particular instantiation of a
ZeroDim algorithm, based on runtime options.
*/
#pragma once
#include "blackbox/config.hpp"
#include "endgames.hpp"
#include "nag_algorithms/zero_dim_solve.hpp"
#include "system.hpp"
namespace bertini {
namespace blackbox {
struct ZeroDimRT {
type::Start start = type::Start::TotalDegree;
type::Tracker tracker = type::Tracker::Adaptive;
type::Endgame endgame = type::Endgame::Cauchy;
};
template class SystemManagementPol,
typename... ConstTs>
std::unique_ptr ZeroDimSpecifyComplete(
ConstTs const&... ts) {
return std::make_unique >(
ts...);
}
template
std::unique_ptr ZeroDimSpecifyShouldClone(
std::true_type, ConstTs const&... ts) {
return ZeroDimSpecifyComplete<
StartType, TrackerType,
typename endgame::EndgameSelector::Cauchy,
policy::CloneGiven>(ts...);
}
template
std::unique_ptr ZeroDimSpecifyShouldClone(
std::false_type, ConstTs const&... ts) {
return ZeroDimSpecifyComplete<
StartType, TrackerType,
typename endgame::EndgameSelector::Cauchy,
policy::RefToGiven>(ts...);
}
template
std::unique_ptr ZeroDimSpecifyEndgame(
ZeroDimRT const& rt, ConstTs const&... ts) {
switch (rt.endgame) {
case type::Endgame::PowerSeries:
return ZeroDimSpecifyShouldClone<
StartType, TrackerType,
typename endgame::EndgameSelector::PSEG>(
typename StorageSelector::ShouldClone(), ts...);
case type::Endgame::Cauchy:
return ZeroDimSpecifyShouldClone<
StartType, TrackerType,
typename endgame::EndgameSelector::Cauchy>(
typename StorageSelector::ShouldClone(), ts...);
}
}
template
std::unique_ptr ZeroDimSpecifyTracker(
ZeroDimRT const& rt, ConstTs const&... ts) {
switch (rt.tracker) {
case type::Tracker::FixedDouble:
return ZeroDimSpecifyEndgame(
rt, ts...);
case type::Tracker::FixedMultiple:
return ZeroDimSpecifyEndgame(rt,
ts...);
case type::Tracker::Adaptive:
return ZeroDimSpecifyEndgame(rt, ts...);
}
}
template
std::unique_ptr ZeroDimSpecifyStart(
ZeroDimRT const& rt, ConstTs const&... ts) {
switch (rt.start) {
case type::Start::TotalDegree:
return ZeroDimSpecifyTracker(rt, ts...);
case type::Start::MHom:
return ZeroDimSpecifyTracker(rt, ts...);
case type::Start::User:
throw std::runtime_error(
"trying to use generic zero dim with user homotopy. use the "
"specific UserBlaBla instead");
}
}
template
std::unique_ptr MakeZeroDim(ZeroDimRT const& rt,
ConstTs const&... ts) {
return ZeroDimSpecifyStart(rt, ts...);
}
} // namespace blackbox
} // namespace bertini