//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