The sleeping general

This is a reformulation of the sleeping beauty problem discussed in Motl’s blog, and hereby reshaped in the way of russian game theory books.

What we have is a country that can be attacked from two different border pass, the Headgate Pass and the Tailgate Pass. Due to the geography, the cost of moving the attacking army down to the Tailgate Pass and the poor booty usually looted from the Tailgate zone of the country causes that always that the enemy chooses this pass, it always try two attacks. Attacks are really guerrilla razzias, or “algaradas”, they never take the country, just run looting around.

The sleeping condition follows the original idea: an attack is always launched when everybody in the sieged country has forgotten where the previous attack come from. It is more an issue of a “sleeping prince” than a “sleeping beauty” here. Still, this lack of memory of the attack is at the same time the signal that a next one can come, and then the defending general must decide where to put the defensive army, if either in the Headgate or in the Tailgate pass.

The game theory problem usually would finish here and ask for the best attacking and defensive strategies. But we have spies at play, at least the defending general has. They know the peculiarity of the Tailgate attack, and moreover the attacked country has got the knowledge of the method used to decide which pass to raise an army at: basically, the attacker council of elders launches a fair coin; if heads they raise the army at the Headgate Pass, if tail they raise it at the Tailgate Pass.

So, which is the probability of the elders’ coin to land a tail? which is the probability of being attacked across the Headgate Pass? Where should the defenders put their army?

¿Son publicas las declaraciones de la renta?

Pues parece que no, pero la cosa es sutil. La leyenda es que Hacianda publicaba una lista de grandes contribuyentes, o al menos se la pasaba a la prensa, hasta que en el 88 secuestraron al primero de la lista, Emiliano Revilla, y que a raíz de ello se dejo de distribuir la lista. La historia no acaba de encajar porque la venta de sus fabricas y lo que por ello habia cobrado era de dominio publico; en todo caso indica que el ministerio tenia cierta potestad para decidir sobre qué informar. Y en efecto, inicialmente en 1963, la ley decia:

Artículo ciento trece

El Ministro de Hacienda podrá acordar cuando las circunstancias lo aconsejen la publicación de las bases y cuotas tributarias referidas a uno o más tributos concretos o a la totalidad de un grupo de contribuyentes sometidos a los mismos.

La norma encaja bien con el ministro de la epoca, Mariano Navarro, quien en el 59 publicó su propia “Lista Falciani” y luego en el 65 como Gobernador del Banco de España le metio una multa por evasion de divisas al banco de los Rato. Aunque al final tamben caeria él mismo con la aventura de Matesa. El caso es que ahi quedó la posibilidad de divulgar datos; y por si acaso, para ir a contribuyentes concretos, en 1985 -Ministro Miguel Boyer hasta el 6 de Julio- se añade al articulo un punto segundo:

2. La Administración Tributaria, en los términos que reglamentariamente se establezcan, dará publicidad a la identidad de las personas o Entidades que hayan sido sancionadas, en virtud de resolución firme; por infracciones tributarias graves de más de 5.000.000 de pesetas, que no hayan dado lugar a la iniciación de sumario por presunto delito contra la Hacienda Pública.

La expresada cuantía se entenderá referida a cada período impositivo y, si éste fuere inferior a doce meses, se referirá al año natural en el caso de tributos periódicos o de declaración periódica, y en cada concepto por el que un hecho imponible sea susceptible de liquidación en los demás tributos.

La información indicará, junto con el nombre y apellidos o la denominación o razón social del sujeto infractor, la cuantía de la sanción que se le hubiere impuesto y el tributo a que se refiere.

Las sentencias firmes por delitos contra la Hacienda Pública serán objeto de la misma publicidad que las infracciones tributarias graves.

Pero luego a la contra, en 1995 -siendo ministro Pedro Solbes- el primer punto desaparece y se reemplaza casi por su contrario:

Los datos, informes o antecedentes obtenidos por la Administración tributaria en el desempeño de sus funciones tienen carácter reservado y sólo podrán ser utilizados para la efectiva aplicación de los tributos o recursos cuya gestión tenga encomendada, sin que puedan ser cedidos o comunicados a terceros, salvo que la cesión tenga por objeto:

a) La investigación… [de fraudes, etc]

Esto es en consistencia con la de “Derechos y garantias de los contribuyentes” que se aprueba mas o menos en esa epoca tambien. Pero al menos ni Solchaga ni Solbes tocan el punto segundo más alla de las cuantias, consensuadas con el PP (vease pg 183 de este librito), y de unas cuantas limitaciones más, muy bien acogidas por otros grupos parlamentarios tambien, sin duda por el ingremento de “garantias” para los contribuyentes, muy necesarias en esos años 90. Para algunos, al menos. En todo caso, ambas leyes dejan de ser vigentes en el 2004, cuando entra en vigor la ley general tributaria 58/2003

¿que pasa entonces con el 113 en la nueva ley, en diciembre del 2003? Al parecer se transforma en el articulo 95, que mantiene toda la reserva y la refuerza con un tercer punto que por lo menos permite a Hacienda avisar a la policia en caso de otros delitos (supongo, por ejemplo, si te desgravas los gastos de sobornos o si declaras ingresos del narcotrafico) pero poco mas:

3. La Administración tributaria adoptará las medidas necesarias para garantizar la confidencialidad de la información tributaria y su uso adecuado.

Cuantas autoridades o funcionarios tengan conocimiento de estos datos, informes o antecedentes estarán obligados al más estricto y completo sigilo respecto de ellos, salvo en los casos citados. Con independencia de las responsabilidades penales o civiles que pudieran derivarse, la infracción de este particular deber de sigilo se considerará siempre falta disciplinaria muy grave.

Cuando se aprecie la posible existencia de un delito no perseguible únicamente a instancia de persona agraviada, la Administración tributaria deducirá el tanto de culpa o remitirá al Ministerio Fiscal relación circunstanciada de los hechos que se estimen constitutivos de delito. También podrá iniciarse directamente el oportuno procedimiento mediante querella a través del Servicio Jurídico competente.

De la publicidad de las multas, ni limite de cuantia ni nada… no se vuelve a decir nada, al menos en este articulo. Parece probable que se haya ido por el desagüe. Que no seria raro dado que los ministros de esta ley fueron mano a mano Rato y Montoro, sucedidos luego en el 2004… otra vez por Solbes: les toco a los socialistas de Zapatero hacer el reglamento, y algunos diarios se temieron que fuera en ese desarrollo donde volviera a entrar la mencion a los defraudadores, pero salio Fernandez de la Vega a tranquilizar a los mercados y anunciar que no se daria tal publicación. No se si en los ultimos años ha habido algun cambio de criterio reglamentario.

en conclusion, a lo que se me alcanza:

  • Hasta el 85, se pueden publicar listas “de todos o ninguno”, con algun criterio de selección.
  • Desde el 85 al 95, se pueden publicar ademas, individualmente, nombres y cuantias de los defraudadores.
  • Desde el 95 al 2004, solo los defraudadores, si interpretamos que la base imponible y cuota son “datos obtenidos” y por tanto reservados.
  • Desde el 2004, si no es que las multas estan en otro sitio que no he encontrado, no se puede hacer publico nada

Versiones de Spark y bugs de Scala

Estas semanas he estado aprendiendo Scala y montando alguna cosilla para funcionar en Spark, y ha tocado portarla al cluster. La primera nuisance ha sido que al haber decidido, pobres de nosotros, trabajar con MapR hemos tenido que esperar a que hubiera una version compatible con Hive y Yarn, que ha resultado finalmente ser Spark 1.2.1. En cuanto a la version de Scala, no me atrevo a pasar de la 2.10.4, que es la que utilizan en la distro.

Se supone que podemos funcionar bien compilando todo nosotros y pasando como variable la configuracion, o bien lanzando con spark-submit --master yarn. Lo primero todavia no he conseguido que funcione, asi que me he agarrado a lo segundo, y os cuento aqui los problemas de compatibilidad que he tenido entre la version desarrollada en mi maquina y la compilacion para el submit en el cluster.

1) No hay ninguna garantia de que --jars adjunte el resto de librerias, asi que mejor empaquetarlas en el jar de la aplicacion misma. Esto es un poco latoso porque el sbt no sabe hacerlo o no explica cómo, asi que no queda mas remedio que adosar el resto de las clases que necesitemos via jar -u o algun mecanismo similar. Supongo que se podra construir como receta en el propio sbt pero no he visto algo estandarizado.

2) Sorpresita, hay un bug en la closure de scala cuando el codigo esta directamente en el tipico “object extends App” en vez de en un metodo. Asi que hay que inventarse o bien un def main, o bien simplemente un metodo anonimo poniendo otros corchetes:

... extends App {{ ....  }} 

3) De alguna manera, una serializacion que funcionaba en mi ordenador no funciona en el cluster, a pesar de que en teoria estan compilando con la misma version de Scala. Puede que el assembly de spark esté en realidad compilado con otra version, o puede que haya dependencias de la version de java, pero me inclino a pensar que la historia esta en el scala. El asunto es que  orElse produce una funcion compuesta que no es serializable.  No me ha quedado mas remedio que sustituir un elegante

f = g orElse f

(donde f es var y g es val) por un mamotreto donde digo explicitamente que el resultado es serializable

val f0 = f
f = new PartialFunction[Int, Float]
        with Serializable {
  override def apply(i: Int): Float
    = { if (g.isDefinedAt(i)) g(i) else f0(i) }
  override def isDefinedAt(i: Int): Boolean
    = { g.isDefinedAt(i) || f0.isDefinedAt(i) }
}

Es posible que los desarrolladores de Scala hayan dudado sobre la serializacion del orElse debido a la ambigüedad de la recursividad. En el primer caso se asume que la “f” es la funcion antigua, siguiendo la tradicion de interpretar que la parte derecha de una asignacion se evalua antes de modificar la izquierda:  a = a +1 y todo eso que tanto lia a los novatos en programación. En cambio, al menos en el Scala que esta usando mi cluster, la “definicion explita” de un orElse asume que la “f” es la misma que se esta asignando, y entra en un bucle recursivo, asi que hay que fijar la version anterior de la funcion con un val f0.

Y de momento no tengo mas apaños. Una vez serializadas las cosas, los RDD del Spark parece que funcionan perfectamente y el codigo ya puede ejecutarse con todos los recursos que el yarn ponga a nuestra disposicion. Se queda la pelota en las manos del administrador de sistema. Que de momento tambien soy yo 🙁

Como analizar los resultados de Podemos

Desde la pagina http://autonomicas.podemos.info/resultados/ navegamos a la  comunidad que nos interesa, abrimos el desplegable de Resultados Completos y pulsamos el botón de ir a Resultados Verificables, que esta al final de ese desplegable.

En la pagina de vota.podemos.info a la que llegamos, descargamos el fichero indicado como “Recuento Votación“, que se llamará algo asi como 8021.tar (en el caso de Aragón).

Por supuesto necesitamos una aplicacion que sepa abrir ficheros .tar, que es algo asi como el winzip pero de unix (usease Mac o Linux; pero seguramente Windows tambien sabe abrirlo).

Dentro del fichero .tar, un primer dato interesante es el fichero results.json, que podemos abrir con cualquier editor de texto, y contiene bien arregladitos los resultados completos, indicando tambien la candidatura y el orden de los candidatos. Este fichero contiene pues ya cierta informacion que no tenemos a primera vista en el desplegable inicial: podemos ver más claramente quienes han “avanzado puestos” respecto a su posicion en la candidatura.

Pero lo mas interesante son… ¡las papeletas! ¿Donde las miramos? Estan en una serie de ficheros 0.tar.gz, 1.tar.gz, etc. Cada uno de esos corresponde a una tanda de votacion electronica, interrumpidas bien por la necesidad de corregir algun dato bien simplemente porque se haya caido durante algunos minutos el sistema de votacion. Tenemos pues que ir a cada uno de ellos. En el caso de Aragón hay dos, parece que porque se cambio el titulo “Secretario General” a “Secretaría General”, con acento.

Abrimos el 0.tar.gz y de ahi vamos a la carpeta 1-xxxxxxxxxxxxxxxxxxxxx, que es la de la votacion al consejo ciudadano. De ahi seleccionamos plaintext_json y lo guardamos en algun sitio, llamandolo por ejemplo papeletas_0

Hacemos lo mismo en 1.tar.gz y sacamos el plaintext, digamos papeletas_1

Contamos las lineas de los dos ficheros, que podemos abrir con cualquier editor de texto, y los juntamos en uno solo, papeletas.txt

wc -l papeletas_*
 113 papeletas_0
 5354 papeletas_1
 5467 total

Veamos ahora cuales han sido las 10 papeletas más frecuentes. Asi aprenderemos algo del formato con el que estan codificadas:

$ sort papeletas.txt | uniq -c | sort -nr |head
 2400 "10203040506070809101112131415161718192021222324252627282931"
 1003 "49505152535455565758596061626364656667686970717273747576777880"
 294 "89"
 91 "23"
 35 "313233343536373839404142434445464749"
 24 "1020304050607080910111213141516171819202122232425262728293050"
 21 "8349505152535455565758596061626364656667686970717273747576777880"
 20 "1020304050607080910111213141516171819202122232425262728293031323335"
 18 "50"
 16 "1020304050607080910111213141516171819202122232425262728293032"

Vemos que la string “89” corresponde a las abstenciones, 294 en total. Tambien vemos que las papeletas mas frecuentes son de votos “plancha” y podeis notar una peculiaridad: el ultimo numero de cada cadena esta incrementado en uno: “282931” en vez de “…282930”, o “…777880” en vez de “…777879”  Tambien por esta extraña aversion al “00”, no lo ponen a la izquierda de la lista, y asi la “01020304…” en realidad aparece como la “1020304…” que es un poco confuso tambien.  Y en consecuencia, como en questions_json el id de los candidatos empieza en cero,  tambien hay que sumarles uno a todos ellos para poder poner al id=0 en la lista. En fin, cosas de la codificación. Tambien es peculiar, y eso no lo entiendo del todo, que en general todos los id aparecen ordenados salvo los de las candidaturas independientes.

Entonces para entendernos…  ¿quienes son los candidatos de esas 91 papeletas que han votado solo “23” o de esas otras 18 que han votado “50”?  Pues seran los candidatos con  id=21 y con id=48… “Ibrahima Sall Fall” y “Pedro Arrojo Agudo” respectivamente.  No es sorprendente, pero es un dato interesante que solo obtenemos gracias a las papeletas.

Tambien podriamos mirar cual es la tendencia a mezclar dos listas, o quienes se caen de una lista cuando alguien decide hacer esa mezcla (sin sorpresas, suelen caer los ultimos). Y para los que gustan de analizar redes puede ser curioso las papeletas “incompletas”, donde solo se han votado a media docena de candidatos.

El jabon de Auri.

¿Recordais la pildora del doctor mateo?

Acabo de leer un librito de fantasia titulado “La música del silencio”, traducción de “The Slow Regard of Silent Things”, y la escena de acción central es un momento en el que la protagonista elabora jabon a partir de los componentes que tiene a mano en el sotano de la universidad.

Auri se encuentra con que no tiene manzanas para aromatizar el jabon y decide intentar con nuez moscada molida. Tras cierta elaboracion consigue exprimir un cierto liquido ambar, “repleto de secretos y espuma marina, colmando de picante misterio, lleno de almizcle, susurros y acido misrístico”. Y al examinar el hollejo residual se da cuenta de que “Estaba lleno de gritos. Días enteros de gritos rojos, oscuros en interminables” y decide almacenarlo en un lugar especial de sus sotanos, que en la traduccion española llaman “Recaudo” y en el original, con más carga de significado personal, “Boundary”.

Al volver de “Recaudo” se detiene en su vasija y se enjuaga la cara, las manos y los pies. Vuelve al trébede donde esta haciendo el jabon, se para, vuelve a las vasija y se lava la cara, las manos y los pies. Ve que un guijarro esta fuera de su sitio, se frota los ojos, para, se mira las manos, vuelve a su habitacion, se lava la cara, las manos y los pies. Y entra en panico, durante las siguientes dos paginas.

La conclusion de los lectores: Desorden Obsesivo-Compulsivo.

Pero discutiendo el tema en reddit ha salido otra posibilidad.

¿Que esta pasando? Pues como dice el chiste, “que seas paranoico no significa que no te sigan”. En este caso, “que seas OCD no significa que no sea urgente que te laves”. Auri ha estado separando los distintos precursores psicoactivos de la nuez moscada, dejando de alguna manera en el “ambar byne” la parte meramente narcotica y tranquilizante y en el hollejo la parte mas peligrosa, que decide almacenar precisamente en la vitrina de residuos peligrosos. Al volver de esa vitrina instintivamente se lava repetidas veces para eliminar los elementos contaminantes. Aun así, cae en el delirio durante unos momentos.