//This file is part of Bertini 2. // //bertini2/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. // //bertini2/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 bertini2/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 bertini2/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 "bertini2/system.hpp" #include "bertini2/nag_algorithms/zero_dim_solve.hpp" #include "bertini2/endgames.hpp" #include "bertini2/blackbox/config.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< algorithm::ZeroDim< TrackerType, EndgameType, System, StartType, SystemManagementPol> >(ts...); } template std::unique_ptr ZeroDimSpecifyShouldClone(std::true_type, ConstTs const& ...ts) { return ZeroDimSpecifyComplete::Cauchy, policy::CloneGiven>(ts...); } template std::unique_ptr ZeroDimSpecifyShouldClone(std::false_type, ConstTs const& ...ts) { return ZeroDimSpecifyComplete::Cauchy, policy::RefToGiven>(ts...); } template std::unique_ptr ZeroDimSpecifyEndgame(ZeroDimRT const& rt, ConstTs const& ...ts) { switch (rt.endgame) { case type::Endgame::PowerSeries: return ZeroDimSpecifyShouldClone::PSEG>(typename StorageSelector::ShouldClone(), ts...); case type::Endgame::Cauchy: return ZeroDimSpecifyShouldClone::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...); } } //ns blackbox } //ns bertini