From 053a134541ecf914625b163835da6937b2fdaedc Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Date: Fri, 9 Dec 2022 20:58:06 -0300 Subject: [PATCH] Implements Tests for Interpolation --- .vscode/settings.json | 11 ++++++ Pipfile.lock | 4 +-- setup.py | 20 ++++++++--- tests/interpolation/test_interpolation.py | 28 ++++++--------- yoshi-otter1.3.3.tar.xz | Bin 27976 -> 0 bytes yoshi_otter/interpolation/__interpolation.py | 35 ++++++++----------- 6 files changed, 53 insertions(+), 45 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 yoshi-otter1.3.3.tar.xz diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e9e6a80 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "python.testing.unittestArgs": [ + "-v", + "-s", + "./tests", + "-p", + "test_*.py" + ], + "python.testing.pytestEnabled": false, + "python.testing.unittestEnabled": true +} \ No newline at end of file diff --git a/Pipfile.lock b/Pipfile.lock index 31fd703..d9d1730 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -108,10 +108,10 @@ }, "yoshi-seals": { "hashes": [ - "sha256:448de57bfee12999ecd56e456e8a13f312396030b9872a2b5c9eac729e07e097" + "sha256:85e1697b289a135191362a3885db01bc568e0ca341da0eddeac69dabc86e35d8" ], "index": "pypi", - "version": "==2.0.3645235495" + "version": "==2.0.3654593985" } }, "develop": { diff --git a/setup.py b/setup.py index 71bd148..7ad231c 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,25 @@ import setuptools +import os -with open("yoshi-otter1.3.3/README.md", "r") as fh: - long_description = fh.read() + +__name = "yoshi-otter" + +__version_sufix = os.environ.get('VERSION_SUFIX') +if not __version_sufix: + __version_sufix = "dev" + +__version = f"2.0.{__version_sufix}" + +with open("README.md", "r") as fh: + __long_description = fh.read() setuptools.setup( - name="yoshi-otter", # Replace with your own username - version="1.3.3", + name=__name, + version=__version, author="Vitor Hideyoshi", author_email="vitor.h.n.batista@gmail.com", description="Numeric Calculus python module in the topic of Algebra Functions", - long_description=long_description, + long_description=__long_description, long_description_content_type="text/markdown", url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", packages=setuptools.find_packages(), diff --git a/tests/interpolation/test_interpolation.py b/tests/interpolation/test_interpolation.py index bf542d9..7c1e57e 100644 --- a/tests/interpolation/test_interpolation.py +++ b/tests/interpolation/test_interpolation.py @@ -12,18 +12,11 @@ class TestInterpolation(unittest.TestCase): def f(x): return 2 * x - def g(x): - return x + x**2 - - X = np.linspace(0, 1000, num=1000) + X = np.linspace(0, 10, num=100) Y = [f(x) for x in X] self.data = pd.DataFrame(data={'X': X, 'Y': Y}) - Y = [g(x) for x in X] - - self.data_pol = pd.DataFrame(data={'X': X, 'Y': Y}) - def test_class_instantiation(self): interpolation = Interpolation(self.data) self.assertIsInstance(interpolation, Interpolation) @@ -34,33 +27,32 @@ class TestInterpolation(unittest.TestCase): self.assertEqual(func(1), 2) - @unittest.skip("Temporally not working") def test_polynomial_vandermonde(self): - interpolation = Interpolation(self.data_pol) + interpolation = Interpolation(self.data) func = interpolation.polynomial.vandermonde() - self.assertEqual(func(1), 2) + self.assertAlmostEqual(func(1), 2) @unittest.skip("Temporally not working") def test_polynomial_lagrange(self): - interpolation = Interpolation(self.data_pol) + interpolation = Interpolation(self.data) result = interpolation.polynomial.lagrange(1) - self.assertEqual(result, 2) + self.assertAlmostEqual(result, 2) - @unittest.skip("Temporally not working") + # @unittest.skip("Temporally not working") def test_polynomial_newton(self): - interpolation = Interpolation(self.data_pol) + interpolation = Interpolation(self.data) result = interpolation.polynomial.newton(1) - self.assertEqual(result, 2) + self.assertAlmostEqual(result, 2) @unittest.skip("Temporally not working") def test_polynomial_gregory(self): - interpolation = Interpolation(self.data_pol) + interpolation = Interpolation(self.data) result = interpolation.polynomial.gregory(1) - self.assertEqual(result, 2) + self.assertAlmostEqual(result, 2) if __name__ == '__main__': diff --git a/yoshi-otter1.3.3.tar.xz b/yoshi-otter1.3.3.tar.xz deleted file mode 100644 index efe85e1825d2449b701774b9e31ad15245f8e9de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27976 zcmV(*K;FOoH+ooF000E$*0e?f03iVu0001VFXf}*SO0AVT>w0r%FQABDvnSlj#72Q z3ecdRjLp-+JKGBXWr=MsgTP~TEq7YH3URWi;a4|=`TpKyt&X>yT9V;`+KafNn`f*& zzu}$A7K}*#?oHXIvToSgyz+FTBX~b-y+^cv6d=5LnaI^LaXPCh{K6XvO)kq z<8pi~3$Rwrtd>cW*hRz*IlW?H` zY&MOw&(Z79!xykR1hrIDyNk1UZrM(;rG~B%Yunn_8(Cq(1?Kwd$LlRK4X{AWn!Vu+ zBz0qITHImZqQxpM0TB0%l=%PH^>(15+k&a=u)3O8h0!}8iwr=ZN+BYZ9< zlHU4eflQb#fp0)&EnoxXp)ci?AT&TNX{Ru^T=D>i#aIW%mIGbzE3uax=*xN!S?G#O zW#MI5fgy|BUn}Z4>TNY&Gpj)r;?4TFP+Wo4<-FQN1GaKRsFWLaKZh z2-GawoA!FTf5V?sR`PRqA^jn%hR=Q0Bx50%^yL9qmk!P4xCWjAR@iELOrpEvPp_Gf ztm**BZt<_UJ6xU%*k2t-)BIc9!{`Q2u@6A1eQ1utzrC7Uym%+$&16swLDF=q6-CzXs5dKD_QLhm9bDDPSQsWS@g((&@L3{rL>as{%b?n2wIXn z@SLnnsX1gAlVj#llQ0<0V@_d9GA-zy8ElkF4l>6xMg4(-VdyUOw^slS$^J2}^__d& zUxmG*q74nS!{J(}8X9w&p9b%9%FCo^D1cP}{p4D>;bsG;n-Fv1vL-b@g$}qAj2;!c{U<0m{B<7z%TC$S98IkGPgtBYq$J3Bp9ADRc>99GlEs^< zg3z)@LAY619YOs}io#$xkq|HzWSb9FFD7&sWvow=_fK<}9Nc1Zkxs0$mq z9+~mPYSgYt!C?$Ff(&wYL)(N zk)V_afzq}tK!p~Sq1BxQ5^q%6B2;}EkbH4DjC-h&b|#&9Mx3=rqSS-Yd9cQR_O1T{ z+4|E!c@~N%cW4vs{V5!;c5W#wwv);yJ5+0XRZNNLTaK$nVTzY~thqj7>4|kEAkmrS z+bEXS$gH7H)Mu1mV0w&PA`#<{uc}$oCLVvcc`ab<)@v&&q4ATHJ+CQ}t`1uM$& zS49o;(XM=p?K5OLii(msyTs)Gb$mDwW(gmc#gAgrRQx0 z?=SA^)ZFFv79fS6XqdfEO)rZ(ngbyh?q~C{VmdB1@ir<^W0wU`ZJ~yYyB^PZ>3WO_ zVU*{hkBe5?_ICdw_+J*tamZ3%e)LU;7TDw--xt{_W)#ikDt*^*Pp=LiauK4D3xjd~ zE8#~2Jb2N*Fu@P3!+SchH!MjOKI7+lyr$G%ti<~vfybcMTKLknfLwNTgh~{_HQ?PI zQ`s3T>_N4=qvSwpC;o$0(FW1WDl3~Ir$}bevekYu?SHB+)cPIk|1750Lz1T`XHlHc zh)27eF3ve=(xV$3&FZdJV;qe}s~rS+!N{k}(}YsLG2Df(ubp%3z-_bktPe$bnOWyn z#!i6PBq2vxM~mI6zTfiVSJsdKQa!CH`YG8SE&N9%?{rZoJgjBGkN$smg<szG+mi=p4xD%TP zNKHDLgfa?ZQuu(aLXSak->MO>SSEFav>=fZyRL>ahzD&`EsOOl=3h9)4V?BcwcE>~ znU?zN#s=gpnt&S*@|Nefeqbg=kpole_`pay6I%;p0()osz#I@?YQ>&w)cG#bg~Af{=9H+1&%n; z_Sq?RWFdHZn$%%ydweiEg|Z6zPCf3Zj)^uA|MQw3rhWYYCxC3=Laj+h1`H%$1>(?e z6gKYjzy~}11Z*q3?(`bfoIGJ9W4N^#V!K8;Jw<~>8`OTXei2?5=(trx`B0v_i#l?4t1jU?7|82k{W2HU5qan|lphQ9qpX%u>!44o zWpSpXqXN*Udul}AIH*%_K?a{a*gmHIFX*>)TIeJrvIh7RFQN=30zf)N=(Tq2

?Q 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 PvBYQl0ssI200dcDUfyh_ diff --git a/yoshi_otter/interpolation/__interpolation.py b/yoshi_otter/interpolation/__interpolation.py index 53f5362..f8e4a6f 100644 --- a/yoshi_otter/interpolation/__interpolation.py +++ b/yoshi_otter/interpolation/__interpolation.py @@ -1,7 +1,5 @@ -from typing import Callable, Any - from yoshi_seals import process as sl - +from typing import Callable, Any import numpy as np @@ -13,7 +11,7 @@ class Interpolation: def __init__(self, data) -> None: self.data = data - self.polynomial = self.Polynomial(self.data) + self.polynomial = self.__Polynomial(self.data) def minimums(self) -> Callable[[Any], float]: @@ -60,7 +58,7 @@ class Interpolation: return lambda x: a * x + b, r2 - class Polynomial: + class __Polynomial: def __init__(self, data) -> None: self.data = data @@ -69,22 +67,20 @@ class Interpolation: matrix = np.zeros((self.data.shape[0], self.data.shape[0])) - for k in range(0, self.data.shape[0]): - matrix[:, k] = self.data.X[:] ** k + for k in range(self.data.shape[0]): + matrix[:, k] = self.data.X[:].copy() ** k array = np.array(self.data.Y.tolist()).reshape(self.data.shape[0], 1) - A = sl.gauss(matrix, array) - - def f(coefficient_matrix, x): + coefficient_matrix = sl.gauss(matrix, array)[:] + def __f(coefficients, x): y = 0 - - for i in range(0, A.shape[0]): - y += coefficient_matrix[1][i] * (x ** i) + for i in range(0, coefficients.shape[0]): + y += float(coefficients[i]) * (x ** i) return y - return lambda x: f(A, x) + return lambda x: __f(coefficient_matrix, x) def lagrange(self, x: float) -> float: @@ -155,24 +151,23 @@ class Interpolation: d[0] = self.data.Y - i = j = 0 - + i = 0 while i < self.data.shape[0]: + j = 0 while j < (self.data.shape[0] - (i + 1)): d[i + 1][j] = (d[i][j + 1] - d[i][j]) / ((i + 1) * h) j += 1 i += 1 - j = 0 y = d[0][0] + i = 0 - while (i + 1) < self.data.shape[0]: - mult = 1 k = 0 + while k <= i: mult = mult * (x - self.data.X[k]) k += 1 @@ -180,4 +175,4 @@ class Interpolation: y += d[i + 1][0] * mult i += 1 - return y + return -y