//This file is part of Bertini 2. // //node_serialization.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. // //node_serialization.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 node_serialization.cpp. If not, see . // // Copyright(C) 2015 - 2017 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 // node_serialization.cpp // // Created by Collins, James B. on 4/30/15. // Copyright (c) 2015 West Texas A&M University. All rights reserved. #include #include #include #include #include #include #include "bertini2/function_tree.hpp" #include "bertini2/system/system.hpp" #include "bertini2/io/parsing/system_parsers.hpp" #include "bertini2/system/precon.hpp" #include "externs.hpp" BOOST_AUTO_TEST_SUITE(node_serialization) template using Vec = bertini::Vec; template using Mat = bertini::Mat; using Variable = bertini::node::Variable; using Node = bertini::node::Node; using Float = bertini::node::Float; using dbl = bertini::dbl; using mpfr = bertini::mpfr_complex; using System = bertini::System; BOOST_AUTO_TEST_CASE(serialize_variable) { std::shared_ptr x = Variable::Make("x"); { std::ofstream fout("serialization_test_node"); boost::archive::text_oarchive oa(fout); // write class instance to archive oa << x; } std::shared_ptr x2; { std::ifstream fin("serialization_test_node"); boost::archive::text_iarchive ia(fin); // read class state from archive ia >> x2; } BOOST_CHECK(x->name()==x2->name()); } BOOST_AUTO_TEST_CASE(serialize_float) { std::shared_ptr two_point_oh_four = Float::Make("2.04"); { std::ofstream fout("serialization_test_node"); boost::archive::text_oarchive oa(fout); // write class instance to archive oa << two_point_oh_four; } std::shared_ptr two_point_oh_four2; { std::ifstream fin("serialization_test_node"); boost::archive::text_iarchive ia(fin); // read class state from archive ia >> two_point_oh_four2; } BOOST_CHECK(two_point_oh_four->Eval()==two_point_oh_four2->Eval()); } BOOST_AUTO_TEST_CASE(serialize_complicated_expression) { std::shared_ptr x = Variable::Make("x"); auto f = exp(sqrt(pow(pow(x*x+ (-x) -sin(x)+cos(x)+tan(x),x),3)))/x; { std::ofstream fout("serialization_test_node"); boost::archive::text_oarchive oa(fout); // write class instance to archive oa << x; oa << f; } std::shared_ptr f2; std::shared_ptr x2; { std::ifstream fin("serialization_test_node"); boost::archive::text_iarchive ia(fin); // read class state from archive ia >> x2; ia >> f2; } BOOST_CHECK(x->name()==x2->name()); x->set_current_value(dbl(1.2,0.9)); x2->set_current_value(dbl(1.2,0.9)); BOOST_CHECK(abs(f->Eval() - f2->Eval()) < threshold_clearance_d); } BOOST_AUTO_TEST_CASE(system_serialize_scopes) { Vec values(2); values(0) = dbl(2.0); values(1) = dbl(3.0); { // to create a scope bertini::System sys; auto x = Variable::Make("x"); auto y = Variable::Make("y"); bertini::VariableGroup vg{x,y}; sys.AddVariableGroup(vg); sys.AddFunction(x+y); sys.AddFunction(x-y); std::ofstream fout("serialization_test_node"); boost::archive::text_oarchive oa(fout); // write class instance to archive oa << sys; } { std::ifstream fin("serialization_test_node"); boost::archive::text_iarchive ia(fin); // read class state from archive bertini::System sys2; ia >> sys2; Vec v = sys2.Eval(values); BOOST_CHECK_EQUAL(v.size(),2); BOOST_CHECK_EQUAL(v(0).real(), 5); BOOST_CHECK_EQUAL(v(0).imag(), 0); BOOST_CHECK_EQUAL(v(1).real(), -1); BOOST_CHECK_EQUAL(v(1).imag(), 0); } } BOOST_AUTO_TEST_CASE(system_serialize_scopes_via_parsing) { Vec x(2); x(0) = dbl(2.0); x(1) = dbl(3.0); Vec y_before(2); { // to create a scope std::string str = "function f1, f2; variable_group x1, x2; f1 = x1^2 * x2^2; f2 = x1^2*x2; "; bertini::System sys; bertini::parsing::classic::parse(str.begin(), str.end(), sys); y_before = sys.Eval(x); std::ofstream fout("serialization_test_node"); boost::archive::text_oarchive oa(fout); // write class instance to archive oa << sys; } { std::ifstream fin("serialization_test_node"); boost::archive::text_iarchive ia(fin); // read class state from archive bertini::System sys2; ia >> sys2; Vec y_after = sys2.Eval(x); BOOST_CHECK_EQUAL(y_after.size(),2); BOOST_CHECK_EQUAL(y_before(0), y_after(0)); BOOST_CHECK_EQUAL(y_before(1), y_after(1)); } } BOOST_AUTO_TEST_CASE(system_serialize_scopes_using_subfunctions_via_parsing) { Vec values(2); values(0) = dbl(2.0); values(1) = dbl(3.0); { // to create a scope std::string str = "function f1, f2; variable_group x1, x2; y = x1*x2; f1 = y*y; f2 = x1*y; "; bertini::System sys; bertini::parsing::classic::parse(str.begin(), str.end(), sys); std::ofstream fout("serialization_test_node"); boost::archive::text_oarchive oa(fout); // write class instance to archive oa << sys; } { std::ifstream fin("serialization_test_node"); boost::archive::text_iarchive ia(fin); // read class state from archive bertini::System sys2; ia >> sys2; Vec v = sys2.Eval(values); BOOST_CHECK_EQUAL(v.size(),2); BOOST_CHECK_EQUAL(v(0), 36.0); BOOST_CHECK_EQUAL(v(1), 12.0); } } BOOST_AUTO_TEST_CASE(system_clone) { std::string str = "function f1, f2; variable_group x1, x2; y = x1*x2; f1 = y*y; f2 = x1*y; "; bertini::System sys1; bertini::parsing::classic::parse(str.begin(), str.end(), sys1); auto sys2 = Clone(sys1); Vec values(2); values(0) = dbl(2.0); values(1) = dbl(3.0); Vec v = sys2.Eval(values); BOOST_CHECK_EQUAL(v.size(),2); BOOST_CHECK_EQUAL(v(0), 36.0); BOOST_CHECK_EQUAL(v(1), 12.0); auto variables1 = sys1.Variables(); auto variables2 = sys2.Variables(); BOOST_CHECK_EQUAL(variables1.size(), variables2.size()); for (int ii=0; ii