//This file is part of Bertini 2.
//
//python/zero_dim_export.cpp 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.
//
//python/zero_dim_export.cpp 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 python/zero_dim_export.cpp. If not, see .
//
// Copyright(C) 2023 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.
// individual authors of this file include:
//
// silviana amethyst
// University of Wisconsin-Eau Claire
// 2023
//
//
// python/zero_dim_export.cpp: source file for exposing the zero dim algorithm to python.
#include "zero_dim_export.hpp"
namespace bertini{
namespace python{
template
template
void ZDVisitor::visit(PyClass& cl) const
{
cl
.def("solve", &AlgoT::Solve, "run the zero dim algorithm with currently stored settings")
.def("get_tracker", GetTrackerMutable(), return_internal_reference<>(), "get a mutable reference to the Tracker being used")
.def("get_endgame", GetEndgameMutable(), return_internal_reference<>(), "get a mutable reference to the Endgame being used")
.def("solutions", &AlgoT::FinalSolutions, return_internal_reference<>(), "get the solutions at the target time")
.def("solution_metadata", &AlgoT::FinalSolutionMetadata, return_internal_reference<>(), "get the metadata for the solutions at the target time")
.def("endgame_boundary_data", &AlgoT::EndgameBoundaryData, return_internal_reference<>(), "get the data for the state at the endgame boundary (when we switch from regular tracking to endgame tracking")
;
}
void ExportZeroDim(){
scope current_scope;
std::string new_submodule_name(extract(current_scope.attr("__name__")));
new_submodule_name.append(".nag_algorithms");
object new_submodule(borrowed(PyImport_AddModule(new_submodule_name.c_str())));
current_scope.attr("nag_algorithms") = new_submodule;
scope new_submodule_scope = new_submodule;
new_submodule_scope.attr("__doc__") = "Algorithms for computing things, like point solutions to square systems (zerodim algorithm).";
ExportZDConfigs();
ExportZDAlgorithms();
}
// a helper function used immediately below. There is no declaration in the header file...
template
void ExportZeroDimSpecific(std::string const& class_name){
using ZeroDimT = algorithm::ZeroDim;
class_ >(class_name.c_str(), init())
.def(ZDVisitor())
;
}
void ExportZDAlgorithms(){
{
using TrackerT = bertini::tracking::DoublePrecisionTracker;
ExportZeroDimSpecific::PSEG, bertini::System, bertini::start_system::TotalDegree>("ZeroDimPowerSeriesDoublePrecisionTotalDegree");
ExportZeroDimSpecific::Cauchy, bertini::System, bertini::start_system::TotalDegree>("ZeroDimCauchyDoublePrecisionTotalDegree");
}
{
using TrackerT = bertini::tracking::MultiplePrecisionTracker;
ExportZeroDimSpecific::PSEG, bertini::System, bertini::start_system::TotalDegree>("ZeroDimPowerSeriesFixedMultiplePrecisionTotalDegree");
ExportZeroDimSpecific::Cauchy, bertini::System, bertini::start_system::TotalDegree>("ZeroDimCauchyFixedMultiplePrecisionTotalDegree");
}
{
using TrackerT = bertini::tracking::AMPTracker;
ExportZeroDimSpecific::PSEG, bertini::System, bertini::start_system::TotalDegree>("ZeroDimPowerSeriesAdaptivePrecisionTotalDegree");
ExportZeroDimSpecific::Cauchy, bertini::System, bertini::start_system::TotalDegree>("ZeroDimCauchyAdaptivePrecisionTotalDegree");
}
}
void ExportZDConfigs()
{
using namespace bertini::algorithm;
class_("TolerancesConfig", init<>())
.def_readwrite("newton_before_endgame", &TolerancesConfig::newton_before_endgame)
.def_readwrite("newton_during_endgame", &TolerancesConfig::newton_during_endgame)
.def_readwrite("final_tolerance", &TolerancesConfig::final_tolerance)
.def_readwrite("path_truncation_threshold", &TolerancesConfig::path_truncation_threshold)
;
class_("MidPathConfig", init<>())
.def_readwrite("same_point_tolerance", &MidPathConfig::same_point_tolerance)
;
class_("AutoRetrackConfig", init<>())
.def_readwrite("midpath_decrease_tolerance_factor", &AutoRetrackConfig::midpath_decrease_tolerance_factor)
;
class_("SharpeningConfig", init<>())
.def_readwrite("sharpendigits", &SharpeningConfig::sharpendigits)
.def_readwrite("function_residual_tolerance", &SharpeningConfig::function_residual_tolerance)
.def_readwrite("ratio_tolerance", &SharpeningConfig::ratio_tolerance)
;
class_("RegenerationConfig", init<>())
.def_readwrite("remove_infinite_endpoints", &RegenerationConfig::remove_infinite_endpoints)
.def_readwrite("higher_dimension_check", &RegenerationConfig::higher_dimension_check)
.def_readwrite("start_level", &RegenerationConfig::start_level)
.def_readwrite("newton_before_endgame", &RegenerationConfig::newton_before_endgame)
.def_readwrite("newton_during_endgame", &RegenerationConfig::newton_during_endgame)
.def_readwrite("final_tolerance", &RegenerationConfig::final_tolerance)
;
class_("PostProcessingConfig", init<>())
.def_readwrite("real_threshold", &PostProcessingConfig::real_threshold)
.def_readwrite("endpoint_finite_threshold", &PostProcessingConfig::endpoint_finite_threshold)
.def_readwrite("same_point_tolerance", &PostProcessingConfig::same_point_tolerance)
;
class_>("ZeroDimConfigDoublePrec", init<>())
.def_readwrite("start_time", &ZeroDimConfig::start_time)
.def_readwrite("target_time", &ZeroDimConfig::target_time)
.def_readwrite("endgame_boundary", &ZeroDimConfig::endgame_boundary)
;
class_>("ZeroDimConfigMultiprec", init<>())
.def_readwrite("start_time", &ZeroDimConfig::start_time)
.def_readwrite("target_time", &ZeroDimConfig::target_time)
.def_readwrite("endgame_boundary", &ZeroDimConfig::endgame_boundary)
;
}
template
void ExposeSolutionMetaData(std::string const& class_name){
using namespace bertini::algorithm;
using MDT = SolutionMetaData;
class_(class_name.c_str(),init<>())
.def_readwrite("path_index",&MDT::path_index)
.def_readwrite("solution_index",&MDT::solution_index)
.def_readwrite("precision_changed",&MDT::precision_changed)
.def_readwrite("time_of_first_prec_increase",&MDT::time_of_first_prec_increase)
.def_readwrite("max_precision_used",&MDT::max_precision_used)
.def_readwrite("pre_endgame_success",&MDT::pre_endgame_success)
.def_readwrite("condition_number",&MDT::condition_number)
.def_readwrite("newton_residual",&MDT::newton_residual)
.def_readwrite("final_time_used",&MDT::final_time_used)
.def_readwrite("accuracy_estimate",&MDT::accuracy_estimate)
.def_readwrite("accuracy_estimate_user_coords",&MDT::accuracy_estimate_user_coords)
.def_readwrite("cycle_num",&MDT::cycle_num)
.def_readwrite("endgame_success",&MDT::endgame_success, "this is a SuccessCode. 0 means Success. Anything other than 0 means something happened.")
.def_readwrite("function_residual",&MDT::function_residual)
.def_readwrite("multiplicity",&MDT::multiplicity)
.def_readwrite("is_real",&MDT::is_real)
.def_readwrite("is_finite",&MDT::is_finite)
.def_readwrite("is_singular",&MDT::is_singular)
;
}
template
void ExposeEndgameBoundaryMetaData(std::string const& class_name){
using namespace bertini::algorithm;
using MDT = EGBoundaryMetaData;
class_(class_name.c_str(),init<>())
.def_readwrite("path_point",&MDT::path_point)
.def_readwrite("success_code",&MDT::success_code)
.def_readwrite("last_used_stepsize",&MDT::last_used_stepsize)
;
}
void ExposeZDMetaData(){
using namespace bertini::algorithm;
class_("AlgorithmMetaData",init<>())
.def_readwrite("number_path_failures",&AlgorithmMetaData::number_path_failures)
.def_readwrite("number_path_successes",&AlgorithmMetaData::number_path_successes)
.def_readwrite("number_paths_tracked",&AlgorithmMetaData::number_paths_tracked)
.def_readwrite("start_time",&AlgorithmMetaData::start_time)
.def_readwrite("elapsed_time",&AlgorithmMetaData::elapsed_time)
;
ExposeSolutionMetaData("SolutionMetaDataMultiPrec");
ExposeSolutionMetaData("SolutionMetaDataDoublePrec");
ExposeEndgameBoundaryMetaData("EndgameBoundaryMetaDataMultiPrec");
ExposeEndgameBoundaryMetaData("EndgameBoundaryMetaDataDoublePrec");
}
}} // namespaces