Polyhedral Homotopy Continuation Method for solving sparse polynomial system, optimized by only tracing real zeros
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.9 KiB

// 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
// <http://www.gnu.org/licenses/>.
//
// Copyright(C) 2017-2021 by Bertini2 Development Team
//
// See <http://www.gnu.org/licenses/> 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 <typename StartType, typename TrackerType, typename EndgameType,
template <typename, typename> class SystemManagementPol,
typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> ZeroDimSpecifyComplete(
ConstTs const&... ts) {
return std::make_unique<algorithm::ZeroDim<TrackerType, EndgameType, System,
StartType, SystemManagementPol> >(
ts...);
}
template <typename StartType, typename TrackerType, typename EndgameType,
typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> ZeroDimSpecifyShouldClone(
std::true_type, ConstTs const&... ts) {
return ZeroDimSpecifyComplete<
StartType, TrackerType,
typename endgame::EndgameSelector<TrackerType>::Cauchy,
policy::CloneGiven>(ts...);
}
template <typename StartType, typename TrackerType, typename EndgameType,
typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> ZeroDimSpecifyShouldClone(
std::false_type, ConstTs const&... ts) {
return ZeroDimSpecifyComplete<
StartType, TrackerType,
typename endgame::EndgameSelector<TrackerType>::Cauchy,
policy::RefToGiven>(ts...);
}
template <typename StartType, typename TrackerType, typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> ZeroDimSpecifyEndgame(
ZeroDimRT const& rt, ConstTs const&... ts) {
switch (rt.endgame) {
case type::Endgame::PowerSeries:
return ZeroDimSpecifyShouldClone<
StartType, TrackerType,
typename endgame::EndgameSelector<TrackerType>::PSEG>(
typename StorageSelector<StartType>::ShouldClone(), ts...);
case type::Endgame::Cauchy:
return ZeroDimSpecifyShouldClone<
StartType, TrackerType,
typename endgame::EndgameSelector<TrackerType>::Cauchy>(
typename StorageSelector<StartType>::ShouldClone(), ts...);
}
}
template <typename StartType, typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> ZeroDimSpecifyTracker(
ZeroDimRT const& rt, ConstTs const&... ts) {
switch (rt.tracker) {
case type::Tracker::FixedDouble:
return ZeroDimSpecifyEndgame<StartType, tracking::DoublePrecisionTracker>(
rt, ts...);
case type::Tracker::FixedMultiple:
return ZeroDimSpecifyEndgame<StartType,
tracking::MultiplePrecisionTracker>(rt,
ts...);
case type::Tracker::Adaptive:
return ZeroDimSpecifyEndgame<StartType, tracking::AMPTracker>(rt, ts...);
}
}
template <typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> ZeroDimSpecifyStart(
ZeroDimRT const& rt, ConstTs const&... ts) {
switch (rt.start) {
case type::Start::TotalDegree:
return ZeroDimSpecifyTracker<start_system::TotalDegree>(rt, ts...);
case type::Start::MHom:
return ZeroDimSpecifyTracker<start_system::MHomogeneous>(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 <typename... ConstTs>
std::unique_ptr<algorithm::AnyZeroDim> MakeZeroDim(ZeroDimRT const& rt,
ConstTs const&... ts) {
return ZeroDimSpecifyStart(rt, ts...);
}
} // namespace blackbox
} // namespace bertini