Pybonacci / scipy

Scipy main repository
http://scipy.org/
Other
1 stars 0 forks source link

Dltisys enhancement #2

Open zerberros opened 9 years ago

astrojuanlu commented 9 years ago

¡Hola Jairo! Acabo de revisar un poco los cambios que has hecho. Básicamente el código es igual que el de la clase lti, ¿cierto?

He añadido algunos comentarios de cosas que faltaban por cambiar. Por otra parte, tendrás que añadir algunos tests que aseguren que esta clase funciona correctamente. Mira por ejemplo los de los sistemas continuos:

https://github.com/Pybonacci/scipy/blob/master/scipy/signal/tests/test_ltisys.py

No tienes que añadir tantos tests, pero hay que probar que más o menos se cubren todas las posibilidades de usar la clase dlti. Por ejemplo, cosas que se podrían probar:

Y además, si tienes algún libro de texto o apuntes de sistemas discretos con ejercicios puedes escribir tests sencillos que prueben que se pueden resolver con SciPy.

¿Has escrito tests unitarios alguna vez? Te recomiendo que leas estas entradas:

http://pybonacci.org/2013/06/19/desarrollo-dirigido-por-pruebas-en-python-ii-un-caso-practico-i/ http://pybonacci.org/2013/12/09/mi-primera-auditoria-de-codigo-revisando-scikit-aero/

Y si tienes dudas, aquí estamos :smile:

zerberros commented 9 years ago

¡Hola Jairo! Acabo de revisar un poco los cambios que has hecho. Básicamente el código es igual que el de la clase lti, ¿cierto?

Cierto :D

Una pregunta: ¿Como puedo establecer un marco de trabajo con las bibliotecas en desarrollo? Es decir, trabajar con las bibliotecas en desarrollo cuando vaya a desarrollarlas, y trabajar con las bibliotecas estables que tengo ahora instaladas cuando quiero trabajar en modo normal.

No se si me he explicado muy bien.

astrojuanlu commented 9 years ago

On 2015-02-04 00:55, Jairo wrote:

¡Hola Jairo! Acabo de revisar un poco los cambios que has hecho.
Básicamente el código es igual que el de la clase lti, ¿cierto?

Cierto :D

Una pregunta: ¿Como puedo establecer un marco de trabajo con las bibliotecas en desarrollo? Es decir, trabajar con las bibliotecas en desarrollo cuando vaya a desarrollarlas, y trabajar con las bibliotecas estables que tengo ahora instaladas cuando quiero trabajar en modo normal.

No se si me he explicado muy bien.

Perfectamente ;)

http://docs.scipy.org/doc/scipy-dev/reference/hacking.html#faq

En la FAQ hay un par de entradas al respecto.

Lo primero que te tengo que preguntar es: ¿Windows o Linux? ¿pip o conda? Dependiendo de tus herramientas y sistema operativo la respuesta puede variar, pero básicamente tienes que crear un entorno aparte e instalar SciPy "in-place" para que puedas probar simultáneamente los cambios que realices. Por ejemplo, con Linux y Anaconda puedes crear un entorno que se llame scipy-dev e instalar ahí tus cambios:

$ conda create -n scipy-dev python=3 numpy nose cython
$ source activate scipy-dev
(scipy-dev)$ cd scipy
(scipy-dev)$ python setup.py build_ext -i

Con el último comando recompilas las extensiones para que SciPy funcione.

zerberros commented 9 years ago

Uso Linux con pip como instalador. Supongo que las diferencias entre hacerlo con pip y conda son minimas, de todas formas voy a leer lo que pueda de documentación, para ver como funciona...

Muchas gracias por la info @Juanlu001.

Edito: Ok, es muy sencillo, más de lo que parece en un principio, jajajaa

astrojuanlu commented 9 years ago

Si utilizas pip, entonces echa un vistazo a virtualenv: es lo que necesitas. Si usas Python 3, el módulo venv de la biblioteca estándar hace lo mismo. On Feb 6, 2015 6:04 PM, "Jairo" notifications@github.com wrote:

Uso Linux con pip como instalador. Supongo que las diferencias entre hacerlo con pip y conda son minimas, de todas formas voy a leer lo que pueda de documentación, para ver como funciona...

Muchas gracias por la info @Juanlu001 https://github.com/Juanlu001.

Reply to this email directly or view it on GitHub https://github.com/Pybonacci/scipy/pull/2#issuecomment-73272579.

zerberros commented 9 years ago

Ok, ahora la funcion cont2discrete ya devuelve una clase dlti XD

Lo siguiente ->> adaptar los metodos dstep, dlsim, dimpulse, etc, a la nueva clase dlti

zerberros commented 9 years ago

Hola de nuevo: He empezado a usar los test y me he dado cuenta de una cosa, los test estan pensados para la manera antigua de recoger los datos de las funciones de transferencia discretas. Es decir:

a,b,c,d,dt = cont2discrete (sys,dt)

mientras que ahora se tendria que hacer de la siguiente manera:

sys = cont2discrete (sys,dt)
a,b,c,d,dt = sys.A, sys.B,sys.C,sys.D,sys.dt

ya que las clases devuelven un objeto, y nos daria un error de tipo:

TypeError: 'dlti' object is not iterable

Lo que me lleva a pensar, que estas modificaciones que estoy realizando, podrian eventualmente romper el trabajo de otras personas, es decir (creo que se dice asi), crear errores de regresión. También puede que sea incompatible con otras partes de la biblioteca signal, como la de los filtros discretos (filter_design.py), pero esto de momento no lo he comprobado.

Por otra parte, tengo otro tipo de error:

======================================================================
ERROR: test_bilinear (test_cont2discrete.TestC2D)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jairo/dev/scipy/scipy/signal/tests/test_cont2discrete.py", line 128, in test_bilinear
    sys = c2d((ac, bc, cc, dc), dt_requested, method='bilinear')
  File "/home/jairo/dev/scipy/scipy/signal/cont2discrete.py", line 84, in cont2discrete
    sys = lti(*sys)
  File "/home/jairo/dev/scipy/scipy/signal/ltisys.py", line 317, in __init__
    self._update(N)
  File "/home/jairo/dev/scipy/scipy/signal/ltisys.py", line 428, in _update
    self.C, self.D)
  File "/home/jairo/dev/scipy/scipy/signal/ltisys.py", line 259, in ss2zpk
    return tf2zpk(*ss2tf(A, B, C, D, input=input))
  File "/home/jairo/dev/scipy/scipy/signal/filter_design.py", line 489, in tf2zpk
    z = roots(b)
  File "/usr/local/lib/python3.4/dist-packages/numpy/lib/polynomial.py", line 203, in roots
    raise ValueError("Input must be a rank-1 array.")
ValueError: Input must be a rank-1 array.

que no estoy muy seguro a que se debe...

demomento asi está la cosa :P

Un saludo

astrojuanlu commented 9 years ago

Perdona por la respuesta tardía, Python absorbe más de lo que parece :)

Muy buena apreciación con respecto a la compatibilidad hacia atrás, especialmente tratándose de SciPy. Estas cosas se tienen muy en cuenta y en general no gustará que el código deje de funcionar. Una pista de cómo podría resolverse te la da este error:

TypeError: 'dlti' object is not iterable

Bien: ¡haz que sea iterable! Solo necesitas reimplementar los métodos __len__ y __getitem__:

In [1]: class Foo(object):
   ...:     a = 1
   ...:     b = 2
   ...:     c = 3
   ...:     def __len__(self):
   ...:         return 3
   ...:     def __getitem__(self, key):
   ...:         if key == 0:
   ...:             return self.a
   ...:         elif key == 1:
   ...:             return self.b
   ...:         elif key == 2:
   ...:             return self.c
   ...:         else:
   ...:             raise IndexError
   ...:        

In [2]: foo = Foo()

In [3]: a, b, c = foo

In [4]: a
Out[4]: 1

In [5]: b
Out[5]: 2

In [6]: c
Out[6]: 3

Más información: https://docs.python.org/3/reference/datamodel.html#emulating-container-types

astrojuanlu commented 9 years ago

Acabo de ver esta lista de tareas para scipy.signal:

https://github.com/scipy/scipy/wiki/scipy.signal-to-do-list

zerberros commented 9 years ago

Hmm... La verdad es que llevo ya unos dias pensando en retomar el tema. Cosas que deberia ir haciendo:

Muchas cosas y poco tiempo. A ver si poco a poco...