// 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