Skip to content

Dltisys enhancement#2

Open
zerberros wants to merge 9 commits intoPybonacci:masterfrom
zerberros:dltisys-enhancement
Open

Dltisys enhancement#2
zerberros wants to merge 9 commits intoPybonacci:masterfrom
zerberros:dltisys-enhancement

Conversation

@zerberros
Copy link
Copy Markdown

No description provided.

…systems

this is the first of a series of commits for the enhancement of the discrete lti systems.
@zerberros zerberros closed this Jan 27, 2015
@zerberros zerberros reopened this Jan 27, 2015
Comment thread scipy/signal/dltisys.py Outdated
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sería dlti en este caso

@astrojuanlu
Copy link
Copy Markdown
Member

¡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:

  • Instanciar con num, den funciona, es decir: el objeto tiene las propiedades num y den que se le han especificado.
  • Lo mismo para zeros, poles, gain.
  • Lo mismo para A, B, C, D.
  • Probar que las conversiones entre parámetros funcionan.

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 😄

@zerberros
Copy link
Copy Markdown
Author

¡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
Copy link
Copy Markdown
Member

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
Copy link
Copy Markdown
Author

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
Copy link
Copy Markdown
Member

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
#2 (comment).

@zerberros
Copy link
Copy Markdown
Author

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
Copy link
Copy Markdown
Author

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
Copy link
Copy Markdown
Member

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
Copy link
Copy Markdown
Member

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

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

@zerberros
Copy link
Copy Markdown
Author

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

  • implementar el parche que me has comentado más arriba para hacer la clase iterable.
  • revertir los cambios que hice en los testses para que no me saltara el error :P
  • pasarme por las listas de desarrollo de scipy y comentarles las cosas que estoy haciendo, no vaya a ser que al final todo esto no valga para nada.
  • cerrar el pull-request, enviar cambios, y proponer otros como lo de las operaciones algebraicas con sistemas de transferencia.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants