b2/python/test/classes/function_tree_test.py
2025-01-14 01:15:53 +01:00

482 lines
23 KiB
Python

# This file is part of Bertini 2.
#
# python/test/function_tree_test.py 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/test/function_tree_test.py 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/test/function_tree_test.py. If not, see <http://www.gnu.org/licenses/>.
#
# Copyright(C) 2016-2018 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.
# individual authors of this file include:
#
# James Collins
# West Texas A&M University
# Spring 2016
#
# silviana amethyst
# UWEC
# Spring 2018
#
from pybertini import *
from pybertini.function_tree.symbol import *
from pybertini.function_tree.root import *
from pybertini.function_tree import *
import numpy as np;
import unittest
import pybertini.multiprec as mp
from pybertini.multiprec import Float as mpfr_float
from pybertini.multiprec import Complex as mpfr_complex
class SymbolTest(unittest.TestCase):
def setUp(self):
default_precision(30);
self.x_d = complex(-2.43,.21 );
self.y_d = complex(4.84, -1.94);
self.z_d = complex(-6.48, -.731);
self.p_d = complex(-.321, -.72);
self.tol_d = float(1e-15);
#
self.x_mp = mpfr_complex("-2.43",".21" );
self.y_mp = mpfr_complex("4.84", "-1.94");
self.z_mp = mpfr_complex("-6.48", "-.731");
self.p_mp = mpfr_complex("-.321", "-.72");
self.tol_mp = mpfr_float("1e-27");
def test_Float_construct(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Float("4.3", "-9e-3");
x = Float(y_mp);
x = Float(mpfr_float("9.3"), mpfr_float("-3"));
x = Float("9.2", "-43.2e2");
def test_Float_eval(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Float(x_mp); y = Float(y_mp); z = Float(z_mp);
#
self.assertLessEqual(np.abs(x.eval_d().real/(-2.43)-1), tol_d);
self.assertLessEqual(np.abs(x.eval_d().imag/(.21)-1), tol_d);
#
self.assertLessEqual(mp.abs(y.eval_mp().real/mpfr_float("4.84")-1), tol_mp);
self.assertLessEqual(mp.abs(y.eval_mp().imag/mpfr_float("-1.94")-1), tol_mp);
def test_Float_funcs(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Float(x_mp); y = Float(y_mp); z = Float(z_mp);
#
self.assertEqual(x.degree(), 0)
d = y.differentiate();
self.assertLessEqual(mp.abs(d.eval_mp().real-mpfr_float("0")), tol_mp)
self.assertLessEqual(mp.abs(d.eval_mp().imag-mpfr_float("0")), tol_mp)
self.assertTrue(y.is_homogeneous());
self.assertTrue(y.is_polynomial());
def test_Variable_construct(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Variable("x");
def test_Variable_eval(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Variable("x"); y = Variable("y");
x.set_current_value(x_d); x.set_current_value(x_mp)
#
self.assertLessEqual(np.abs(x.eval_d().real/(-2.43)-1), tol_d)
self.assertLessEqual(np.abs(x.eval_d().imag/(.21)-1), tol_d)
#
self.assertLessEqual(mp.abs(x.eval_mp().real/mpfr_float("-2.43")-1), tol_mp)
self.assertLessEqual(mp.abs(x.eval_mp().imag/mpfr_float(".21")-1), tol_mp)
def test_Variable_funcs(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Variable("x"); y = Variable("y")
#
self.assertEqual(x.degree(), 1)
self.assertEqual(x.degree(x), 1)
self.assertEqual(x.degree(y), 0)
d = y.differentiate()
self.assertTrue(y.is_homogeneous())
self.assertTrue(y.is_polynomial())
def test_Pi_construct(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = Pi()
y = make_pi()
#
self.assertLessEqual(np.abs(x.eval_d().real/(3.1415926535897932384626433832795028841971693994)-1), tol_d)
self.assertLessEqual(np.abs(x.eval_d().imag - (0)), tol_d)
#
self.assertLessEqual(mp.abs(x.eval_mp().real/mpfr_float("3.1415926535897932384626433832795028841971693994")-1), tol_mp)
self.assertLessEqual(mp.abs(x.eval_mp().imag - mpfr_float("0")), tol_mp)
#
self.assertLessEqual(np.abs(y.eval_d().real/(3.1415926535897932384626433832795028841971693994)-1), tol_d)
self.assertLessEqual(np.abs(y.eval_d().imag - (0)), tol_d)
#
self.assertLessEqual(mp.abs(y.eval_mp().real/mpfr_float("3.1415926535897932384626433832795028841971693994")-1), tol_mp)
self.assertLessEqual(mp.abs(y.eval_mp().imag - mpfr_float("0")), tol_mp)
def test_E_construct(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
x = E()
y = make_e()
#
self.assertLessEqual(np.abs(x.eval_d().real/(2.7182818284590452353602874713526624977572470937)-1), tol_d)
self.assertLessEqual(np.abs(x.eval_d().imag - (0)), tol_d)
#
self.assertLessEqual(mp.abs(x.eval_mp().real - mpfr_float("2.7182818284590452353602874713526624977572470937")), tol_mp)
self.assertLessEqual(mp.abs(x.eval_mp().imag - mpfr_float("0")), tol_mp)
#
self.assertLessEqual(np.abs(y.eval_d().real/(2.7182818284590452353602874713526624977572470937)-1), tol_d)
self.assertLessEqual(np.abs(y.eval_d().imag - (0)), tol_d)
#
self.assertLessEqual(mp.abs(y.eval_mp().real/mpfr_float("2.7182818284590452353602874713526624977572470937")-1), tol_mp)
self.assertLessEqual(mp.abs(y.eval_mp().imag - mpfr_float("0")), tol_mp)
def test_I_construct(self):
x_d = self.x_d; y_d = self.y_d; z_d = self.z_d; p_d = self.p_d; tol_d = self.tol_d;
x_mp = self.x_mp; y_mp = self.y_mp; z_mp = self.z_mp; p_mp = self.p_mp; tol_mp = self.tol_mp;
y = make_i()
#
self.assertLessEqual(np.abs(y.eval_d().real - (0)), tol_d)
self.assertLessEqual(np.abs(y.eval_d().imag/(1.0)-1), tol_d)
#
self.assertLessEqual(mp.abs(y.eval_mp().real - mpfr_float("0")), tol_mp)
self.assertLessEqual(mp.abs(y.eval_mp().imag/mpfr_float("1.0")-1), tol_mp)
class OperatorTest(unittest.TestCase):
def setUp(self):
default_precision(30);
self.x = Variable("x")
self.x.set_current_value(complex(-2.43,.21 ))
self.y = Variable("y")
self.y.set_current_value(complex(4.84, -1.94))
self.z = Variable("z")
self.z.set_current_value(complex(-6.48, -.731))
self.p = Variable("p")
self.p.set_current_value(complex(-.321, -.72))
self.a = Float(mpfr_complex("3.12", ".612"))
self.b = Float(mpfr_complex("-.823", "2.62"))
self.tol_d = float(9e-14);
#
self.x.set_current_value(mpfr_complex("-2.43",".21" ))
self.y.set_current_value(mpfr_complex("4.84", "-1.94"))
self.z.set_current_value(mpfr_complex("-6.48", "-.731"))
self.p.set_current_value(mpfr_complex("-.321", "-.72"))
self.a = Float(mpfr_complex("3.12", ".612"))
self.b = Float(mpfr_complex("-.823", "2.62"))
self.tol_mp = mpfr_float("1e-27");
def test_plus(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(x+y+a)
self.assertLessEqual(np.abs(f.eval_d().real/(5.53)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(-1.118)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real/mpfr_float("5.53")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag/mpfr_float("-1.118")-1), tol_mp)
#
f = Function(x+Float("3.87"))
self.assertLessEqual(np.abs(f.eval_d().real/(1.44)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(0.21)-1), tol_d)
#
f = Function(x+mpfr_complex("3.87", "-2.1"))
self.assertLessEqual(np.abs(f.eval_d().real/(1.44)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(-1.89)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real/mpfr_float("1.44")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag/mpfr_float("-1.89")-1), tol_mp)
#
f = Function(x+(-5))
self.assertLessEqual(np.abs(f.eval_d().real/(-7.43)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(0.21)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real/mpfr_float("-7.43")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag/mpfr_float("0.21")-1), tol_mp)
#
f = Function(x); f += y; f += a;
self.assertLessEqual(np.abs(f.eval_d().real/(5.53)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(-1.118)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real/mpfr_float("5.53")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag/mpfr_float("-1.118")-1), tol_mp)
#
f = Function(x); f += Float("3.87");
self.assertLessEqual(np.abs(f.eval_d().real/(1.44)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(0.21)-1), tol_d)
def test_sub(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(x-y-a)
self.assertLessEqual(np.abs(f.eval_d().real/(-10.39)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(1.538)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real/mpfr_float("-10.39")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag/mpfr_float("1.538")-1), tol_mp)
#
f = Function(y-Float("3.87"))
self.assertLessEqual(np.abs(f.eval_d().real/(0.97)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(-1.94)-1), tol_d)
#
f = Function(y-Float("3.87","0"))
self.assertLessEqual(np.abs(f.eval_d().real / (0.97)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-1.94)-1), tol_d)
#
#
f = Function(y-mpfr_complex("3.87", "-2.1"))
self.assertLessEqual(np.abs(f.eval_d().real / (0.97)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (0.16)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("0.97")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("0.16")-1), tol_mp)
#
f = Function(y-(-5))
self.assertLessEqual(np.abs(f.eval_d().real / (9.84)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-1.94)-1), tol_d)
#
f = Function(x); f -= y; f -= a;
self.assertLessEqual(np.abs(f.eval_d().real / (-10.39)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (1.538)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-10.39")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("1.538")-1), tol_mp)
#
f = Function(y); f -= Float("3.87");
self.assertLessEqual(np.abs(f.eval_d().real / (0.97)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-1.94)-1), tol_d)
def test_num_times_var(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(a*x*b*y)
#
self.assertLessEqual(np.abs(f.eval_d().real / (3.4011196056)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-110.9953448712)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("3.4011196056")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-110.9953448712")-1), tol_mp)
def test_var_times_var(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(x*y*z)
self.assertLessEqual(np.abs(f.eval_d().real / (77.7616926)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-28.8346602)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("77.7616926")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-28.8346602")-1), tol_mp)
def test_var_div_var(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(x/y)
self.assertLessEqual(np.abs(f.eval_d().real / (-.44755270475041560619657805305047592426404601827)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-.13600253041648890000441351713180233327939034617)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-.44755270475041560619657805305047592426404601827")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-.13600253041648890000441351713180233327939034617")-1), tol_mp)
def test_trans_funcs(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(sin(x))
self.assertLessEqual(np.abs(f.eval_d().real/(-.66749329633668695550441899166308616328986315948)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag/(-.16020928942503633132090203927960650380076680938)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-.66749329633668695550441899166308616328986315948")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-.16020928942503633132090203927960650380076680938")-1), tol_mp)
#
f = Function(cos(y))
self.assertLessEqual(np.abs(f.eval_d().real / (0.45194679593300564730917329070452033759984813611)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-3.3798161097977088705360399142708324234265626016)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("0.45194679593300564730917329070452033759984813611")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-3.3798161097977088705360399142708324234265626016")-1), tol_mp)
#
f = Function(tan(z))
self.assertLessEqual(np.abs(f.eval_d().real / (-.11998086808607765336591715593714295443402911227)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-.63859741450762243500349270264429166927927928889)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-.11998086808607765336591715593714295443402911227")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-.63859741450762243500349270264429166927927928889")-1), tol_mp)
#
f = Function(asin(x))
self.assertLessEqual(np.abs(f.eval_d().real / (-1.4763431474004472804452143435221887167393328861)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (1.5406263884278099750127157814537559611048741005)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-1.4763431474004472804452143435221887167393328861")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("1.5406263884278099750127157814537559611048741005")-1), tol_mp)
#
f = Function(acos(y))
self.assertLessEqual(np.abs(f.eval_d().real / (0.38769800860408664087229892623614567735197135529)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (2.3379037587834289977359318611458042347281923566)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("0.38769800860408664087229892623614567735197135529")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("2.3379037587834289977359318611458042347281923566")-1), tol_mp)
#
f = Function(atan(z))
self.assertLessEqual(np.abs(f.eval_d().real / (-1.4195347801361539102032503530226060969949192059)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-0.16801358511827150554928904776095870747673962940e-1)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-1.4195347801361539102032503530226060969949192059")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-0.16801358511827150554928904776095870747673962940e-1")-1), tol_mp)
#
f = Function(exp(y))
self.assertLessEqual(np.abs(f.eval_d().real / (-45.639359208255772966298371983389382308765171859)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-117.94721623715960520658000231550940351946595854)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-45.639359208255772966298371983389382308765171859")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-117.94721623715960520658000231550940351946595854")-1), tol_mp)
#
f = Function(log(z))
self.assertLessEqual(np.abs(f.eval_d().real / (1.8750432590213669716781046977781508038070552297)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-3.0292589170775161726973168096174940982043177322)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("1.8750432590213669716781046977781508038070552297")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-3.0292589170775161726973168096174940982043177322")-1), tol_mp)
def test_power(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(y**3);
self.assertLessEqual(np.abs(f.eval_d().real / (58.732432)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-129.035608)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("58.732432")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-129.035608")-1), tol_mp)
#
f = Function(pow(y,3));
self.assertLessEqual(np.abs(f.eval_d().real / (58.732432)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-129.035608)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("58.732432")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-129.035608")-1), tol_mp)
#
f = Function(x**p);
self.assertLessEqual(np.abs(f.eval_d().real / (-.35190932545709434788093164550270669097948909024)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-6.7687858345625791466707575744042177964518271087)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-.35190932545709434788093164550270669097948909024")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-6.7687858345625791466707575744042177964518271087")-1), tol_mp)
#
f = Function(pow(x,p));
self.assertLessEqual(np.abs(f.eval_d().real / (-.35190932545709434788093164550270669097948909024)-1), tol_d)
self.assertLessEqual(np.abs(f.eval_d().imag / (-6.7687858345625791466707575744042177964518271087)-1), tol_d)
#
self.assertLessEqual(mp.abs(f.eval_mp().real / mpfr_float("-.35190932545709434788093164550270669097948909024")-1), tol_mp)
self.assertLessEqual(mp.abs(f.eval_mp().imag / mpfr_float("-6.7687858345625791466707575744042177964518271087")-1), tol_mp)
def test_Operator_degree(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(x**3-9*y*y*z*pow(x,4));
w = VariableGroup(); w.append(x); w.append(y);
self.assertEqual(f.degree(),7)
self.assertEqual(f.degree(x),4)
self.assertEqual(f.degree(y),2)
self.assertEqual(f.degree(z),1)
self.assertEqual(f.degree(w),6)
w = VariableGroup(); w.append(y); w.append(z);
self.assertEqual(f.degree(w),3)
def test_Operator_ishom(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(y**2 - 9*y*z + 3*x*x - y*82*x - pow(z,2));
self.assertTrue(f.is_homogeneous())
f = Function(y**2 - 9*y*z + 3*x*x - y*82*x - pow(z,4));
self.assertFalse(f.is_homogeneous())
f = Function(y**2 - 9*y*z + 3*x*x - 5);
self.assertFalse(f.is_homogeneous())
def test_Operator_ispoly(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
f = Function(y**2 - 9*y*z + 3*x*x - y*82*x - pow(z,2));
self.assertTrue(f.is_polynomial());
#
f = Function(x**2*y - 9 + sin(z));
self.assertFalse(f.is_polynomial())
def test_Homogenize(self):
x = self.x; y = self.y; z = self.z; p = self.p; a = self.a; b = self.b;
tol_d = self.tol_d; tol_mp = self.tol_mp;
#
h = Variable("h");
f = Function(x**2 + y**2 + z**2 - 1);
#
vars = VariableGroup();
vars.append(y); vars.append(x); vars.append(z);
#
f.homogenize(vars,h);
self.assertEqual(f.degree(h),2)
self.assertTrue(f.is_homogeneous())
#
self.assertFalse(f.is_homogeneous(x))
self.assertFalse(f.is_homogeneous(y))
self.assertFalse(f.is_homogeneous(z))
self.assertFalse(f.is_homogeneous(h))
#
vars.append(h);
self.assertTrue(f.is_homogeneous(vars))
if __name__ == '__main__':
unittest.main();