31#ifndef BERTINI_SYSTEM_HPP
32#define BERTINI_SYSTEM_HPP
38#include <boost/archive/text_oarchive.hpp>
39#include <boost/archive/text_iarchive.hpp>
40#include <boost/serialization/export.hpp>
41#include <boost/serialization/shared_ptr.hpp>
42#include <boost/serialization/vector.hpp>
43#include <boost/serialization/deque.hpp>
44#include <boost/type_index.hpp>
56#include <boost/archive/binary_oarchive.hpp>
57#include <boost/archive/binary_iarchive.hpp>
58#include <boost/iostreams/stream_buffer.hpp>
59#include <boost/iostreams/stream.hpp>
60#include <boost/iostreams/device/back_inserter.hpp>
72 enum class DerivMethod
84 DerivMethod DefaultDerivMethod();
103 using Fn = std::shared_ptr<node::Function>;
104 using Var = std::shared_ptr<node::Variable>;
105 using Nd = std::shared_ptr<node::Node>;
106 using Jac = std::shared_ptr<node::Jacobian>;
111 System() : is_differentiated_(false), have_path_variable_(false), have_ordering_(false), precision_(DefaultPrecision()), is_patched_(false)
118 System(std::string
const& input);
176 switch (eval_method_){
177 case EvalMethod::FunctionTree:
178 for (
const auto& iter : functions_)
181 case EvalMethod::SLP:
193 switch (eval_method_)
195 case EvalMethod::FunctionTree:{
197 switch (deriv_method_){
198 case DerivMethod::JacobianNode:
200 for (
const auto& iter : jacobian_)
204 case DerivMethod::Derivatives:
206 for (
const auto& iter : space_derivatives_)
214 case EvalMethod::SLP:
223 void ResetTimeDerivatives()
const
225 switch (eval_method_)
227 case EvalMethod::FunctionTree:{
229 switch (deriv_method_){
230 case DerivMethod::JacobianNode:
232 for (
const auto& iter : jacobian_)
236 case DerivMethod::Derivatives:
238 for (
const auto& iter : time_derivatives_)
246 case EvalMethod::SLP:
262 ResetTimeDerivatives();
277 std::stringstream ss;
278 ss <<
"trying to evaluate system in-place, but number length of vector into which to write the values (" << function_values.size() <<
") doesn't match number of system user-defined functions plus patches ( " <<
NumNaturalFunctions() <<
"+" <<
NumPatches() <<
") = " <<
NumTotalFunctions() <<
"). Use System.NumTotalFunctions() to make the container for in-place evaluation";
279 throw std::runtime_error(ss.str());
282 switch (eval_method_){
283 case EvalMethod::FunctionTree:
286 for (
auto iter=functions_.begin(); iter!=functions_.end(); iter++, counter++) {
287 (*iter)->EvalInPlace<T>(function_values(counter));
291 case EvalMethod::SLP:
293 slp_.GetFuncValsInPlace<T>(function_values);
299 patch_.EvalInPlace(function_values,
300 std::get<Vec<T> >(current_variable_values_));
322 return function_values;
338 template<
typename T,
typename Derived>
339 void EvalInPlace(Vec<T>& function_values,
const Eigen::MatrixBase<Derived>& variable_values)
const
341 static_assert(std::is_same<typename Derived::Scalar,T>::value,
"scalar types must match");
345 std::stringstream ss;
346 ss <<
"trying to evaluate system, but number of input variables (" << variable_values.size() <<
") doesn't match number of system variables (" <<
NumVariables() <<
").";
347 throw std::runtime_error(ss.str());
349 if (have_path_variable_)
350 throw std::runtime_error(
"not using a time value for evaluation of system, but path variable IS defined.");
370 template<
typename Derived>
371 typename Derived::PlainObject
Eval(
const Eigen::MatrixBase<Derived>& variable_values)
const
373 typedef typename Derived::Scalar T;
377 return function_values;
382 Vec<T>
Eval(
const Vec<T> & variable_values)
const
386 return function_values;
404 template<
typename Derived,
typename T>
405 void EvalInPlace(Vec<T> & function_values,
const Eigen::MatrixBase<Derived>& variable_values,
const T & path_variable_value)
const
407 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
410 throw std::runtime_error(
"trying to evaluate system, but number of variables doesn't match.");
411 if (!have_path_variable_)
412 throw std::runtime_error(
"trying to use a time value for evaluation of system, but no path variable defined.");
441 template<
typename Derived,
typename T>
442 Vec<T>
Eval(
const Eigen::MatrixBase<Derived>& variable_values,
const T & path_variable_value)
const
445 EvalInPlace(function_values, variable_values, path_variable_value);
446 return function_values;
451 Vec<T>
Eval(
const Vec<T> & variable_values,
const T & path_variable_value)
const
454 EvalInPlace(function_values, variable_values, path_variable_value);
455 return function_values;
469 template <
typename T>
476 throw std::runtime_error(
"trying to evaluate jacobian of system in place, but input J doesn't have right number of columns or rows");
481 if (!is_differentiated_)
484 switch (eval_method_)
486 case EvalMethod::FunctionTree:
488 switch (deriv_method_){
489 case DerivMethod::JacobianNode:{
492 jacobian_[ii]->EvalJInPlace<T>(J(ii,jj),vars[jj]);
495 case DerivMethod::Derivatives:
506 case EvalMethod::SLP:
508 this->slp_.GetJacobianInPlace<T>(J);
514 patch_.JacobianInPlace(J,std::get<Vec<T> >(current_variable_values_));
556 throw std::runtime_error(
"trying to evaluate jacobian, but number of variables doesn't match.");
559 throw std::runtime_error(
"not using a time value for computation of jacobian, but a path variable is defined.");
561 SetAndReset(variable_values);
580 Mat<T>
Jacobian(
const Vec<T> & variable_values)
const
583 throw std::runtime_error(
"trying to evaluate jacobian, but number of variables doesn't match.");
586 throw std::runtime_error(
"not using a time value for computation of jacobian, but a path variable is defined.");
607 template<
typename Derived,
typename T>
608 void JacobianInPlace(Mat<T> & J,
const Eigen::MatrixBase<Derived> & variable_values,
const T & path_variable_value)
const
610 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
613 throw std::runtime_error(
"trying to evaluate jacobian, but number of variables doesn't match.");
616 throw std::runtime_error(
"trying to use a time value for computation of jacobian, but no path variable defined.");
639 template<
typename Derived,
typename T>
640 Mat<T>
Jacobian(
const Eigen::MatrixBase<Derived> & variable_values,
const T & path_variable_value)
const
642 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
645 throw std::runtime_error(
"trying to evaluate jacobian, but number of variables doesn't match.");
648 throw std::runtime_error(
"trying to use a time value for computation of jacobian, but no path variable defined.");
657 Mat<T>
Jacobian(
const Vec<T> & variable_values,
const T & path_variable_value)
const
660 throw std::runtime_error(
"trying to evaluate jacobian, but number of variables doesn't match.");
663 throw std::runtime_error(
"using a time value for computation of jacobian, but no path variable is defined.");
679 template<
typename Derived,
typename T>
681 const Eigen::MatrixBase<Derived> & variable_values,
682 const T & path_variable_value)
const
684 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
688 ResetTimeDerivatives();
705 template<
typename Derived,
typename T>
706 Vec<T>
TimeDerivative(
const Eigen::MatrixBase<Derived> & variable_values,
const T & path_variable_value)
const
708 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
722 template<
typename Derived,
typename T>
724 const Eigen::MatrixBase<Derived> & variable_values)
const
726 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
729 ResetTimeDerivatives();
746 template<
typename Derived,
typename T>
749 static_assert(std::is_same<typename Derived::Scalar, T>::value,
"scalar types must be the same");
763 std::stringstream ss;
764 ss <<
"trying to evaluate system in place, but number of input functions (" << ds_dt.size() <<
") doesn't match number of system functions (" <<
NumNaturalFunctions() <<
").";
765 throw std::runtime_error(ss.str());
769 throw std::runtime_error(
"computing time derivative of system with no path variable defined");
772 if (!is_differentiated_)
775 switch (eval_method_)
777 case EvalMethod::FunctionTree:{
778 switch (deriv_method_){
779 case DerivMethod::JacobianNode:
782 jacobian_[ii]->EvalJInPlace<T>(ds_dt(ii), path_variable_);
785 case DerivMethod::Derivatives:
795 case EvalMethod::SLP:
797 this->slp_.GetTimeDerivInPlace(ds_dt);
826 throw std::runtime_error(
"computing time derivative of system with no path variable defined");
874 return patch_.NumVariableGroups();
967 throw std::runtime_error(
"variable vector of different length from system-owned variables in SetVariables");
971 #ifndef BERTINI_DISABLE_PRECISION_CHECKS
973 throw std::runtime_error(
"precision of input point in SetVariables (" + std::to_string(
Precision(new_values)) +
") must match the precision of the system (" + std::to_string(this->
precision()) +
").");
976 throw std::runtime_error(
"internally, precision of variables (" + std::to_string(vars[0]->
node::NamedSymbol::precision()) +
") in SetVariables must match the precision of the system (" + std::to_string(this->
precision()) +
").");
979 if (!is_differentiated_)
983 switch (eval_method_){
984 case EvalMethod::FunctionTree:{
987 for (
auto iter=vars.begin(); iter!=vars.end(); iter++, counter++) {
988 (*iter)->set_current_value(new_values(counter));
991 std::get<Vec<T> >(current_variable_values_) = new_values;
994 case EvalMethod::SLP:{
995 std::get<Vec<T> >(current_variable_values_) = new_values;
996 slp_.SetVariableValues(new_values);
1014 template<
typename T>
1017 if (!have_path_variable_)
1018 throw std::runtime_error(
"trying to set the value of the path variable, but one is not defined for this system");
1020 if (!is_differentiated_)
1023 switch (eval_method_){
1024 case EvalMethod::FunctionTree:{
1025 path_variable_->set_current_value(new_value);
1028 case EvalMethod::SLP:{
1029 path_variable_->set_current_value(new_value);
1030 slp_.SetPathVariable(new_value);
1036 template<
typename T>
1037 void SetAndReset(Vec<T>
const& new_space, T
const& new_time)
const
1045 template<
typename T>
1046 void SetAndReset(Vec<T>
const& new_space)
const
1058 template<
typename T>
1061 if (new_values.size()!= implicit_parameters_.size())
1062 throw std::runtime_error(
"trying to set implicit parameter values, but there is a size mismatch");
1065 for (
auto iter=implicit_parameters_.begin(); iter!=implicit_parameters_.end(); iter++, counter++)
1066 (*iter)->set_current_value(new_values(counter));
1184 void AddFunction(Nd
const& F, std::string
const& name =
"unnamed_function");
1233 auto& GetPathVariable()
const{
1235 return this->path_variable_;
1237 throw std::runtime_error(
"trying to get path variable for a system which doesn't have a path variable defined");
1268 return variable_groups_[index];
1275 return VariableGroupSizesFIFO();
1285 template<
typename T>
1290 std::stringstream message;
1291 message <<
"dehomogenizing point with incorrect number of coordinates. input has ";
1292 message << x.size();
1293 message <<
" but system expects ";
1295 throw std::runtime_error(message.str());
1298 if (!have_ordering_)
1299 ConstructOrdering();
1301 return DehomogenizePointFIFO(x);
1314 return functions_[index];
1333 return variable_groups_;
1341 return hom_variable_groups_;
1345 const Var& PathVariable()
const
1347 return path_variable_;
1362 std::vector< Nd > GetSpaceDerivatives()
const;
1369 std::vector< Nd > GetTimeDerivatives()
const;
1385 template <
typename NumT>
1386 typename Eigen::NumTraits<NumT>::Real CoefficientBound(
unsigned num_evaluations = 1)
const;
1395 int DegreeBound()
const;
1402 std::vector<int> Degrees()
const;
1410 std::vector<int> Degrees(VariableGroup
const& vars)
const;
1415 void ReorderFunctionsByDegreeDecreasing();
1421 void ReorderFunctionsByDegreeIncreasing();
1452 void CopyPatches(
System const& other);
1455 Patch GetPatch()
const
1463 bool IsPatched()
const
1469 template <
typename T>
1470 Vec<T> RescalePointToFitPatch(Vec<T>
const& x)
const
1472 return patch_.RescalePoint(x);
1476 template<
typename T>
1477 void RescalePointToFitPatchInPlace(Vec<T> & x)
const
1479 patch_.RescalePointToFitInPlace(x);
1484 friend std::ostream& operator <<(std::ostream& out,
const System & s);
1490 void ClearVariables();
1502 void CopyVariableStructure(
System const& other);
1509 void DontAssumeUniformPrecision()
1511 AssumeUniformPrecision(
false);
1514 void PleaseAssumeUniformPrecision()
1516 AssumeUniformPrecision(
true);
1519 void AssumeUniformPrecision(
bool val)
1521 assume_uniform_precision_ =
false;
1527 auto IsAssumingUniformPrecision()
const
1529 return assume_uniform_precision_;
1533 void PleaseAutoSimplify()
1535 SetAutoSimplify(
true);
1539 void DontAutoSimplify()
1541 SetAutoSimplify(
false);
1544 void SetAutoSimplify(
bool val)
1546 auto_simplify_ = val;
1553 auto IsAutoSimplifying()
const
1555 return auto_simplify_;
1563 void SimplifyFunctions();
1570 void SimplifyDerivatives()
const;
1583 void SetEvalMethod(EvalMethod method)
1585 eval_method_ = method;
1591 EvalMethod GetEvalMethod()
const
1593 return eval_method_;
1602 void SetDerivMethod(DerivMethod method)
1604 deriv_method_ = method;
1610 DerivMethod GetDerivMethod()
const
1612 return deriv_method_;
1639 System& operator*=(Nd
const& N);
1659 std::vector<unsigned> VariableGroupSizesFIFO()
const;
1665 void AutoPatchFIFO();
1676 template<
typename T>
1677 Vec<T> DehomogenizePointFIFO(Vec<T>
const& x)
const
1679 #ifndef BERTINI_DISABLE_ASSERTS
1680 assert(homogenizing_variables_.size()==0 || homogenizing_variables_.size()==
NumVariableGroups() &&
"must have either 0 homogenizing variables, or the number of homogenizing variables must match the number of affine variable groups.");
1683 bool is_homogenized = homogenizing_variables_.size()!=0;
1686 unsigned affine_group_counter = 0;
1687 unsigned hom_group_counter = 0;
1688 unsigned ungrouped_variable_counter = 0;
1690 unsigned hom_index = 0;
1691 unsigned dehom_index = 0;
1693 for (
auto& iter : time_order_of_variable_groups_)
1696 case VariableGroupType::Affine:
1700 auto h = x(hom_index++);
1701 for (
unsigned ii = 0; ii < variable_groups_[affine_group_counter].size(); ++ii)
1702 x_dehomogenized(dehom_index++) = x(hom_index++) / h;
1703 affine_group_counter++;
1707 for (
unsigned ii = 0; ii < variable_groups_[affine_group_counter].size(); ++ii)
1708 x_dehomogenized(dehom_index++) = x(hom_index++);
1712 case VariableGroupType::Homogeneous:
1714 for (
unsigned ii = 0; ii < hom_variable_groups_[hom_group_counter].size(); ++ii)
1715 x_dehomogenized(dehom_index++) = x(hom_index++);
1718 case VariableGroupType::Ungrouped:
1720 x_dehomogenized(dehom_index++) = x(hom_index++);
1721 ungrouped_variable_counter++;
1726 throw std::runtime_error(
"unacceptable VariableGroupType in FIFOVariableOrdering");
1731 return x_dehomogenized;
1734 void DifferentiateUsingDerivatives()
const;
1735 void DifferentiateUsingJacobianNode()
const;
1740 void ConstructOrdering()
const;
1743 VariableGroup ungrouped_variables_;
1744 std::vector< VariableGroup > variable_groups_;
1745 std::vector< VariableGroup > hom_variable_groups_;
1747 VariableGroup homogenizing_variables_;
1750 bool have_path_variable_ =
false;
1753 VariableGroup implicit_parameters_;
1754 std::vector< Fn > explicit_parameters_;
1756 std::vector< Fn > constant_subfunctions_;
1757 std::vector< Fn > subfunctions_;
1758 std::vector< Fn > functions_;
1761 bool is_patched_ =
false;
1763 mutable std::vector< Jac > jacobian_;
1765 mutable std::vector< Nd > space_derivatives_;
1767 mutable std::vector< Nd > time_derivatives_;
1769 mutable bool is_differentiated_ =
false;
1771 mutable StraightLineProgram slp_;
1773 std::vector< VariableGroupType > time_order_of_variable_groups_;
1775 mutable std::tuple< Vec<dbl>, Vec<mpfr_complex> > current_variable_values_;
1777 mutable VariableGroup variable_ordering_;
1778 mutable bool have_ordering_ =
false;
1780 mutable unsigned precision_;
1782 bool assume_uniform_precision_ =
false;
1785 DerivMethod deriv_method_ = DefaultDerivMethod();
1794 friend class boost::serialization::access;
1797 template<
class Archive>
1798 void serialize(Archive & ar,
const unsigned int version){
1799 ar & ungrouped_variables_;
1800 ar & variable_groups_;
1801 ar & hom_variable_groups_;
1803 ar & homogenizing_variables_;
1805 ar & have_path_variable_;
1806 ar & path_variable_;
1808 ar & implicit_parameters_;
1809 ar & explicit_parameters_;
1811 ar & constant_subfunctions_;
1820 ar & assume_uniform_precision_;
1825 ar & auto_simplify_;
1835 ar & is_differentiated_;
1837 ar & space_derivatives_;
1838 ar & time_derivatives_;
1844 ar & time_order_of_variable_groups_;
1850 ar & have_ordering_;
1851 ar & variable_ordering_;
1866 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
The fundamental polynomial system class for Bertini2.
Definition system/system.hpp:99
friend void swap(System &a, System &b)
void AddSubfunction(Fn const &F)
auto HomVariableGroups() const
Definition system/system.hpp:1339
void SetPathVariable(T const &new_value) const
Definition system/system.hpp:1015
void AddUngroupedVariable(Var const &v)
void SetImplicitParameters(Vec< T > new_values) const
Definition system/system.hpp:1059
void TimeDerivativeInPlace(Vec< T > &ds_dt, const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Compute the time-derivative of a system.
Definition system/system.hpp:680
void EvalInPlace(Vec< T > &function_values) const
Evaluate the system using the previously set variable (and time) values, in place.
Definition system/system.hpp:272
void AddImplicitParameters(VariableGroup const &v)
Vec< T > DehomogenizePoint(Vec< T > const &x) const
Dehomogenize a point, using the variable grouping / structure of the system.
Definition system/system.hpp:1286
void JacobianInPlace(Mat< T > &J, const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Definition system/system.hpp:608
auto Function(unsigned index) const
Get a function by its index.
Definition system/system.hpp:1312
System & operator=(const System &other)
The assignment operator.
std::vector< unsigned > VariableGroupSizes() const
Get the sizes of the variable groups, according to the current ordering.
Definition system/system.hpp:1273
void AddFunction(Nd const &F, std::string const &name="unnamed_function")
void AddParameter(Fn const &F)
void AddSubfunctions(std::vector< Fn > const &F)
size_t NumConstants() const
size_t NumImplicitParameters() const
size_t NumNaturalFunctions() const
VariableGroup VariableOrdering() const
void JacobianInPlace(Mat< T > &J, const Vec< T > &variable_values) const
Definition system/system.hpp:552
Mat< T > Jacobian() const
Definition system/system.hpp:531
System()
The default constructor for a system.
Definition system/system.hpp:111
void AddConstant(Fn const &C)
Vec< T > TimeDerivative() const
Compute the time-derivative of a system.
Definition system/system.hpp:823
void AddUngroupedVariables(VariableGroup const &v)
size_t NumVariableGroups() const
bool IsPolynomial() const
Vec< T > Eval(const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Definition system/system.hpp:442
void precision(unsigned new_precision) const
size_t NumTotalVariableGroups() const
size_t NumNaturalVariables() const
System(System const &other)
The copy operator.
void JacobianInPlace(Mat< T > &J) const
Evaluate the Jacobian matrix of the system, using the previous space and time values,...
Definition system/system.hpp:470
VariableGroup const & AffineVariableGroup(size_t index) const
Get an affine variable group the class has defined.
Definition system/system.hpp:1266
void ResetFunctions() const
Force re-evaluation of the system next eval of functions. If something has changed in the system,...
Definition system/system.hpp:173
bool HavePathVariable() const
Mat< T > Jacobian(const Vec< T > &variable_values) const
Definition system/system.hpp:580
unsigned precision() const
Get the current precision of a system.
Definition system/system.hpp:158
Vec< T > TimeDerivative(const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Compute the time-derivative of a system.
Definition system/system.hpp:706
size_t NumPatches() const
Definition system/system.hpp:872
Vec< T > TimeDerivative(const Eigen::MatrixBase< Derived > &variable_values) const
Compute the time-derivative of a system.
Definition system/system.hpp:747
const VariableGroup & Variables() const
size_t NumVariables() const
void SetVariables(const Vec< T > &new_values) const
Definition system/system.hpp:964
void EvalInPlace(Vec< T > &function_values, const Eigen::MatrixBase< Derived > &variable_values) const
Evaluate the system, provided the system has no path variable defined, in place.
Definition system/system.hpp:339
auto VariableGroups() const
Definition system/system.hpp:1331
void AddHomVariableGroup(VariableGroup const &v)
size_t NumUngroupedVariables() const
void ResetJacobian() const
Force re-evaluation of the system next eval of Jacobians. If something has changed in the system,...
Definition system/system.hpp:191
size_t NumHomVariableGroups() const
void EvalInPlace(Vec< T > &function_values, const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Definition system/system.hpp:405
void Reset() const
A complete reset of the system, so that all of functions, space derivatives, and time derivatives wil...
Definition system/system.hpp:258
Vec< T > Eval() const
Evaluate the system using the previously set variable (and time) values, creating vector of function ...
Definition system/system.hpp:317
size_t NumParameters() const
size_t NumTotalFunctions() const
bool IsHomogeneous() const
auto GetNaturalFunctions() const
Get the functions.
Definition system/system.hpp:1321
Mat< T > Jacobian(const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Definition system/system.hpp:640
void AddPathVariable(Var const &v)
void AddFunctions(std::vector< Fn > const &F)
void AddVariableGroup(VariableGroup const &v)
void AddImplicitParameter(Var const &v)
System(System &&other)
The move copy operator.
Definition system/system.hpp:128
size_t NumHomVariables() const
Derived::PlainObject Eval(const Eigen::MatrixBase< Derived > &variable_values) const
Evaluate the system, provided the system has no path variable defined.
Definition system/system.hpp:371
System & operator=(System &&other)=default
The move assignment operator.
void AddConstants(std::vector< Fn > const &C)
void Differentiate() const
Compute and internally store the symbolic Jacobian of the system.
void AddParameters(std::vector< Fn > const &F)
void AddFunction(Fn const &F)
virtual void precision(unsigned int prec) const =0
std::complex< double > operator*(unsigned i, std::complex< double > z)
Overload * for unsigned * complex<double>
Definition double_extensions.hpp:49
Bertini extensions of the Eigen linear algebra library.
unsigned Precision(Eigen::MatrixBase< Derived > const &v)
Get the precision of an Eigen object. If the object is empty, it's the precision of a default-constru...
Definition eigen_extensions.hpp:292
Collects the various header files which define the Bertini2 function tree node types.
The main multiprecision complex number type. This is essentially boost::multiprecision' complex.
Extensions to the Boost.Multiprecision library.
Provides the bertini::Patch class.
Provides the bertini::StraightLineProgram class.
System Concatenate(System sys1, System const &sys2)
Concatenate two compatible systems.
System Clone(System const &sys)
Do a deep clone of the system. This includes the entire structure, variables, etc....
EvalMethod DefaultEvalMethod()
Gets the default evaluation method for Jacobians. One might be faster...
bool DefaultAutoSimplify()
Get the default value for whether a system should autosimplify.