Skip to content

Commit 754f68e

Browse files
testes curva_minmax em regressões
1 parent c55b982 commit 754f68e

16 files changed

+190
-62
lines changed

LabIFSC2/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
nominais)
1212
from ._medida import (Comparacao, Medida, alterar_monte_carlo_samples,
1313
comparar_medidas)
14-
from ._regressões import (regressao_exponencial, regressao_linear,
14+
from ._regressoes import (regressao_exponencial, regressao_linear,
1515
regressao_polinomial, regressao_potencia)
1616
from .constantes import constantes

LabIFSC2/_arrays.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import numpy as np
66

77
from ._medida import Medida
8-
from ._regressões import Regressao
8+
from ._regressoes import Regressao
99
from ._tipagem_forte import obrigar_tipos
1010

1111

@@ -58,6 +58,9 @@ def incertezas(arrayMedidas : np.ndarray,unidade:str) -> np.ndarray:
5858

5959
@obrigar_tipos
6060
def _curva_min_max(arrayMedidas : np.ndarray| Regressao,op:str,unidade_y:str,sigmas:float | int) -> np.ndarray:
61+
if sigmas<=0:
62+
raise ValueError('O número de sigmas deve ser positivo')
63+
6164
if isinstance(arrayMedidas,np.ndarray):
6265
if not (isinstance(arrayMedidas[0],Medida)):
6366
raise TypeError('Os valores do array não são Medidas')

LabIFSC2/_medida.py

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,55 @@ def __getattr__(self, func_name:str) -> Any:
220220
func=getattr(np,func_name)
221221
def funcao_recebe_medida() -> Any: return montecarlo(func, self)
222222
return funcao_recebe_medida
223+
224+
'''Essas funções de comparação são necessárias para que max,min ou
225+
np.max,np.min funcionem com medidas do jeito esperado (comparar o valor nominal)
226+
Repare que não há implementação == e !=, use a função comparar_medidas.
227+
'''
228+
def __eq__(self:'Medida',outro:Any)-> bool:
229+
raise TypeError('"Como a comparação entre Medidas pode gerar três resultados \
230+
diferentes: iguais, diferentes, ou inconclusivo, optamos por fazer uma função separada \
231+
chamada compara_medidas(x:Medida,y:Medida) -> [Iguais | Diferentes | Inconclusivo]"')
232+
233+
def __ne__(self:'Medida',outro:Any)-> bool:
234+
raise TypeError('"Como a comparação entre Medidas pode gerar três resultados \
235+
diferentes: iguais, diferentes, ou inconclusivo, optamos por fazer uma função separada \
236+
chamada compara_medidas(x:Medida,y:Medida) -> [Iguais | Diferentes | Inconclusivo]"')
237+
238+
def __le__(self:'Medida',outro:Any) -> bool:
239+
if not isinstance(outro,Medida):
240+
return NotImplemented
241+
else:
242+
return bool(self._nominal<=outro._nominal)
243+
244+
def __lt__(self:'Medida',outro:Any) -> bool:
245+
if not isinstance(outro,Medida):
246+
return NotImplemented
247+
else:
248+
return bool(self._nominal<outro._nominal)
249+
def __ge__(self:'Medida',outro:Any) -> bool:
250+
if not isinstance(outro,Medida):
251+
return NotImplemented
252+
else:
253+
return bool(self._nominal>=outro._nominal)
254+
255+
def __gt__(self:'Medida',outro:Any) -> bool:
256+
if not isinstance(outro,Medida):
257+
return NotImplemented
258+
else:
259+
return bool(self._nominal>outro._nominal)
260+
261+
223262
def _adicao_subtracao(self,outro: 'Medida',positivo:bool) -> 'Medida':
224263
if not (isinstance(outro,Medida) or isinstance(outro,Real)):
225264
return NotImplemented
226265
if isinstance(outro,Real):
227-
self._nominal+=outro
228-
self._histograma+=outro
229-
return self
266+
if positivo:
267+
nova_medida=Medida(self._nominal.magnitude+outro,str(self._nominal.units),self._incerteza.magnitude)
268+
else:
269+
nova_medida=Medida(self._nominal.magnitude-outro,str(self._nominal.units),self._incerteza.magnitude)
270+
nova_medida._histograma=self._histograma
271+
return nova_medida
230272

231273
if self._nominal.is_compatible_with(outro._nominal):
232274
if self is outro:
@@ -295,27 +337,8 @@ def __pow__(self:'Medida',outro:Any) -> 'Medida':
295337
def __rpow__(self:'Medida',outro:Any) -> 'Medida':
296338
if isinstance(outro,Real):
297339
return montecarlo(lambda x: np.pow(float(outro),x),self)
298-
elif isinstance(outro,Medida):
299-
return montecarlo(lambda x,y: x**y,self,outro)
300340
else:
301341
return NotImplemented
302-
def __eq__(self:'Medida',outro:Any)->bool:
303-
if self is outro:
304-
return True
305-
else:
306-
raise TypeError("Como a comparação entre Medidas pode gerar três resultados \
307-
diferentes: iguais, diferentes, ou inconclusivo, optamos por fazer uma função separada \
308-
chamada compara_medidas(x:Medida,y:Medida) -> [Iguais | Diferentes | Inconclusivo], por favor \
309-
não use !=,==,<=,<,>,>= diretamente com Medidas")
310-
def __ne__(self:'Medida',outro:Any)->bool:
311-
if self is outro:
312-
return False
313-
else:
314-
raise TypeError("Como a comparação entre Medidas pode gerar três resultados \
315-
diferentes: iguais, diferentes, ou inconclusivo, optamos por fazer uma função separada \
316-
chamada compara_medidas(x:Medida,y:Medida) -> [Iguais | Diferentes | Inconclusivo], por favor \
317-
não use !=,==,<=,<,>,>= diretamente com Medidas")
318-
319342

320343
__radd__=__add__
321344
__rsub__=__sub__
Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def _forcar_troca_de_unidade(array_medidas:np.ndarray,unidade:str)-> np.ndarray:
4040
class Regressao(ABC):
4141

4242
def __init__(self)->None:
43-
self._amostragem_pre_calculada: np.ndarray = np.array([])
43+
self._amostragem_pre_calculada: np.ndarray | None=None
4444
self._valores: Iterator = iter([])
4545

4646
def _retornar(self,y:np.ndarray,unidade_y:str)->np.ndarray:
@@ -66,26 +66,13 @@ def amostrar(self, x:np.ndarray,unidade_y:str) -> np.ndarray:...
6666
def __iter__(self)->Iterator[object]:
6767
return self._valores
6868

69-
def mudar_intervalo_de_confianca(self,sigmas:Real)->None:
70-
"""
71-
Altera o intervalo de confiança para o valor especificado.
72-
73-
Args:
74-
sigmas (Real): O novo valor do intervalo de confiança.
75-
76-
Returns:
77-
None
78-
"""
79-
if sigmas<0:
80-
raise ValueError('O intervalo de confiança precisa ser um valor positivo')
81-
82-
self._sigmas=float(sigmas)
8369

8470

8571

8672
class MPolinomio(Regressao):
8773
@obrigar_tipos
8874
def __init__(self,coeficientes:np.ndarray):
75+
super().__init__()
8976
if not (isinstance(coeficientes[0],Medida)):
9077
raise TypeError('Os valores do array não são Medidas')
9178

@@ -130,6 +117,7 @@ class MExponencial(Regressao):
130117
__slots__ = ['cte_multiplicativa', 'expoente', 'base','_valores']
131118
@obrigar_tipos
132119
def __init__(self,a:Medida,k:Medida,base:Real):
120+
super().__init__()
133121
self.cte_multiplicativa=a
134122
self.base=base
135123
self.expoente=k

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ disallow_any_generics = false
4444
exclude = 'tests/.*'
4545

4646
[tool.taskipy.tasks]
47-
testes={ cmd="isort . && mypy LabIFSC2/ && pytest -vv -x -s --cov LabIFSC2/ --no-cov-on-fail --cov-branch --cov-report=html "}
47+
testes={ cmd="isort . && mypy LabIFSC2/ && pytest -vv -x -s --cov LabIFSC2/ --cov-append --no-cov-on-fail --cov-branch --cov-report=html "}
4848
docs="mkdocs serve"
4949

5050
[build-system]

tests/test_arrayM.py

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import pytest
33

44
from LabIFSC2 import (Medida, arrayM, curva_max, curva_min, incertezas,
5-
linspaceM, nominais)
5+
linspaceM, nominais, regressao_linear)
66

77

88
def test_nominal():
@@ -14,31 +14,70 @@ def test_nominal():
1414
assert nominal[2]==-34
1515
assert nominal[3]==-5313.351
1616
with pytest.raises(TypeError):
17-
nominais(np.arange(10))
17+
nominais(np.arange(10),'')
18+
x=np.array([Medida(13431,'cm',351),Medida(0.006132,'cm',4),
19+
Medida(-34,'cm',3),Medida(-5313.351,'cm',3)])
20+
metros=nominais(x,'si')
21+
valores=[13431,0.006132,-34,-5313.351]
22+
for x in range(len(metros)):
23+
assert np.isclose(metros[x],valores[x]/100)
24+
25+
26+
1827

1928
def test_incerteza_array():
20-
x=np.array([Medida(-351,'',3.5),Medida(0.006132,'',4.003),
21-
Medida(-34,'',310),Medida(-5313.351,'',0)])
22-
incerteza=incertezas(x,'')
29+
x=np.array([Medida(-351,'cm',3.5),Medida(0.006132,'cm',4.003),
30+
Medida(-34,'cm',310),Medida(-5313.351,'cm',0)])
31+
incerteza=incertezas(x,'cm')
2332
assert incerteza[0]==3.5
2433
assert incerteza[1]==4.003
2534
assert incerteza[2]==310
2635
assert incerteza[3]==0
2736
with pytest.raises(TypeError):
2837
incertezas(np.arange(10),'')
29-
38+
si_incertezas=incertezas(x,'si')
39+
for x in range(len(si_incertezas)):
40+
assert np.isclose(si_incertezas[x],incerteza[x]/100)
3041

3142
def test_curvamin():
3243
t=np.array([Medida(5,'',0.1),Medida(9,'',2),Medida(11,'',0.5)])
3344
curva_min(t,'')
3445
assert np.array_equal(curva_min(t,''),np.array([4.8,5,10]))
3546
assert np.array_equal(curva_min(t,'',3),np.array([4.7,3,9.5]))
47+
with pytest.raises(TypeError):
48+
curva_min(np.arange(10),'')
49+
50+
3651
def test_curvamax():
3752
t=np.array([Medida(5,'',0.1),Medida(9,'',2),Medida(11,'',0.5)])
3853
assert np.array_equal(curva_max(t,''),np.array([5.2,13,12]))
3954
assert np.array_equal(curva_max(t,'',3),np.array([5.3,15,12.5]))
55+
with pytest.raises(TypeError):
56+
curva_max(np.arange(10),'')
57+
58+
def test_curva_max_regressao():
59+
x=np.array([Medida(1,'cm',0.1),Medida(2,'cm',0.1),Medida(3,'cm',0.1),Medida(4,'cm',0.1),Medida(5,'cm',0.1)])
60+
y=x
61+
linha=regressao_linear(x,y)
62+
with pytest.raises(ValueError):
63+
curva_max(linha,'')
64+
linha.amostrar(x,'cm')
65+
valores_nominais=nominais(linha._amostragem_pre_calculada,'m')
66+
valores_incertezas=incertezas(linha._amostragem_pre_calculada,'m')
67+
curva_maxima=curva_max(linha,'si')
68+
curva_minima=curva_min(linha,'si')
69+
assert np.array_equal(valores_nominais+2*valores_incertezas,curva_maxima)
70+
assert np.array_equal(valores_nominais-2*valores_incertezas,curva_minima)
71+
curva_maxima=curva_max(linha,'si',3)
72+
curva_minima=curva_min(linha,'si',3)
4073

41-
74+
assert np.array_equal(valores_nominais+3*valores_incertezas,curva_maxima)
75+
assert np.array_equal(valores_nominais-3*valores_incertezas,curva_minima)
76+
with pytest.raises(ValueError):
77+
curva_max(linha,'si',0)
78+
with pytest.raises(ValueError):
79+
curva_max(linha,'si',-1)
80+
4281
def test_linspace():
4382
a=1 ; b=20 ; N=20
4483
x=linspaceM(a,b,N,'',0.1)

tests/test_classe_medida.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ def test_inicializacao():
2020
def test_comparacoes():
2121
x=lab.Medida(5, '', 1)
2222
y=lab.Medida(6, '', 0.1)
23-
comparacoes=[lambda x,y: x==y,lambda x,y: x!=y,
24-
lambda x,y: x>y, lambda x,y: x>=y,
25-
lambda x,y: x<y, lambda x,y: x<=y]
23+
comparacoes=[lambda x,y: x==y,lambda x,y: x!=y]
2624
for comparacao in comparacoes:
2725
with pytest.raises(TypeError):
2826
comparacao(x,y)
29-
assert x==x
30-
assert not x!=x
31-
27+
comparacoes=[lambda x,y: x<y,lambda x,y: x<=y,lambda x,y: x>y,lambda x,y: x>=y]
28+
for comparacao in comparacoes:
29+
with pytest.raises(TypeError):
30+
comparacao(x,3)
31+
32+
3233
def test_igualdades():
3334
x=lab.Medida(1, '', 0.1)
3435
y=lab.Medida(0.9, '', 0.01)

tests/test_classe_medida_operacoes.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
def test_soma():
88

99
x, y = lab.Medida(0, '', 0.1), lab.Medida(5, '', 0.3)
10+
11+
assert (y+3).nominal('')==8
12+
assert (y-3).nominal('')==2
13+
assert (y-3.13).nominal('')==5-3.13
14+
1015
assert (x + y).nominal("") == 5
1116
assert (x + y).incerteza("") == np.sqrt(0.1**2 + 0.3**2)
1217

tests/test_classe_para_regressoes.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@
77
def test_initialization():
88
coeficientes = lab.linspaceM(1,3,3,'',0)
99
with pytest.raises(TypeError):
10-
lab._regressões.MPolinomio(np.array([1, 2, 3]))
11-
polinomio=lab._regressões.MPolinomio(coeficientes)
12-
assert np.array_equal(polinomio._coeficientes,coeficientes)
10+
lab._regressoes.MPolinomio(np.array([1, 2, 3]))
11+
polinomio=lab._regressoes.MPolinomio(coeficientes)
1312
assert polinomio.grau == 2
1413
assert polinomio.a.nominal("") == 1
1514
assert polinomio.b.nominal("") == 2
1615
assert polinomio.c.nominal("") == 3
1716

1817
def test_call():
1918
coeficientes = lab.linspaceM(1,3,3,'',0)
20-
polinomio=lab._regressões.MPolinomio(coeficientes)
19+
polinomio=lab._regressoes.MPolinomio(coeficientes)
2120
with pytest.raises(TypeError):
2221
polinomio(0)
2322
pontos=lab.linspaceM(0,2,3,'',0)
@@ -29,7 +28,7 @@ def test_call():
2928

3029
def test_unpacking():
3130
coeficientes = lab.linspaceM(1,3,3,'',0)
32-
polinomio = lab._regressões.MPolinomio(coeficientes)
31+
polinomio = lab._regressoes.MPolinomio(coeficientes)
3332
a, b, c = polinomio
3433
assert a.nominal("") == 1
3534
assert b.nominal("") == 2

tests/test_doc_dimensao.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from LabIFSC2 import *
2+
3+
4+
def test_doc_dimensao():
5+
velocidade=Medida(10,'m/s',0.1)
6+
print(velocidade.dimensao) #[length] / [time]
7+
8+
assert str(velocidade.dimensao) == '[length] / [time]'

0 commit comments

Comments
 (0)