martes, 27 de marzo de 2012

Phyton V2.7

Se trata de comparar diferentes formas de hacer lo mismo.

1. Hacer un programa en lenguaje C, que lea un archivo de entrada y busque un string y si lo encuentra, lo guardara en una variable con valor 1.

/ * Programa que encuenta una secuencia de letras de en un archivo que abre *
">*=================================================*

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
int cont=0;

char renglon [50];
FILE *ifp;
if (argc != 2) {"\n%s%s%s\n\n", "Debes teclear: ", argv[0], " ArchivoEntrada");"r");while ((fgets (renglon , 50 , ifp)) != NULL){
if(strstr(renglon,"NORMAL COMPLETION") != NULL)
cont++;
}
printf (
"\n\n%d\n\n", cont);

return cont;
} 
Se compila el programa y no tiene errores, entonces se hace un archivo ejecutable para que lo repita n veces (10 en mi caso)
archivo EnPal.sh





#!/bin/bash
echo "Buscara una cadena de caracteres en 10 archivos."
for j in 20; do 
for i in 2; do
for k in 1 2 3 4 5; do
# echo "wee_"$j"_"$i"_"$k
./ex "wee_"$j"_"$i"_"$k".lst" >> "ResEncPal.txt"
done
done
#awk '{if ($1 == 1)} {print "El archivo wee_"$j"_"$i"_"$k".lst fue exitosos"}' "ResEncPal.txt"
done 
#awk '{if ($1 == 1)} {print "El archivo wee_"$j"_"$i"_"$k".lst fue exitosos"}' "ResEncPal.txt"
for j in 40; do 
for i in 4; do
for k in 1 2 3 4 5; do
# echo "wee_"$j"_"$i"_"$k
./ex "wee_"$j"_"$i"_"$k".lst" >> "ResEncPal.txt"
done
done
done 
echo "F I N" 

El archivo ResEsnPal.txt, solo contiene 0 y 1's, 1: si el archivo que lee contiene la palabra NORMAL y 0 en otro caso.

2. Con Python.

Primero concatenamos los 10 archivos con la instruccion cat (cat arch1 arch2 ... arch10 > prov) y despues ejecutamos las siguientes lineas: 

python
mport string
text = open('prov').read()
print string.count(text, 'NORMAL')
quit()



3.  Desde Unix 
 
 
grep -c 'NORMAL' prov



N -> es el numero de veces que el status fue terminacion completa


Referencias:

Referencia 1.

Gnuplot es una herramienta muy versatil para hacer graficas en 2 y 3 dimensiones.

A continuacion algunos ejemplos:


Genera 2 curvas y una mas con linea rellenas:set title
set key outside
plot [-10:10] [-5:3] 1.5+sin(x)/x with filledcurves, sin(x)/x with filledcurves, 1+sin(x)/x with lines


Genera 2 parabolas encontradas:
set key on
set title "Intersection of 2 parabolas"
plot x*x with filledcurves, 50-x*x with filledcurves, x*x with line lt 1
Genera el seno y coseno rellenos, con un grid:set title "Filled sinus ans cosinus curves"
set grid front
set title "Filled sinus ans cosinus curves"
plot 2+sin(x)**2 with filledcurve x1, cos(x)**2 with filledcurve x1
Genera una red de 1000 numeros aleatorios:unset key
set xrange [0:1]
set yrange [0:1]
set zrange [0:1]
set title "Lattice test for random numbers"
set xlabel "rand(n) ->"
set ylabel "rand(n + 1) ->"
set zlabel "rand(n + 2) ->"
set format x "3.2f"
set format y "3.2f"
set format z "3.2f"
set tics
set sample 1000
set style function impulses
set parametric
splot rand(0), rand(0), rand(0)
Grafica en 3 D una malla con diferentes colores... set title "Textcolor options" tc lt 1
set samples 20; set isotemplates 20
set autoscale
set key box
set pm3d at s
set color box horizon user origin .1, .12, size .8, .015
set view 58, 64, 0.83
set xrange [-10:10]
set yrange [-10:10]
set zrange [-10:10]
#Test lables
set label 1 "textcolor palette z" at 12, -10, -10 nopoint tc pal z
set label 3 "tc pal z" at 12, -6, -6 nopoint tc pal z
set label 4 "tc pal z" at 12, -3, -3 nopoint tc pal z
set label 10 "textcoor lt 1" at -10, -8, 24 front nopoint tc lt 1
set label 10 "textcoor lt 1" at -10, -8, 24 front nopoint tc lt 1
set label 5 "tc pal z" at 12, -0, 0  nopoint tc pal z
set label 6 "tc pal z" at 12, 3 , 3  nopoint tc pal z
set label 7 "tc pal z" at 12,  6,  6 nopoint tc pal z
set label 8 "tc pal z" at 12, 9 , 9  nopoint tc pal z
#
set label 'xlabel should be lt 4' tc lt 4
set cblabel 'color cblabel' textcolor lt 3
#
set label 10 "textcolor lt 1" at -10, -8, 24 front nopoint tc lt 1
set label 11 "textcolor lt 2" at -10, -8, 21 front nopoint tc lt 2
set label 12 "textcolor lt 3" at -10, -8, 18 front nopoint tc lt 3
set label 13 "textcolor default" at -10, -8, 15 front nopoint tc def
set label 14 "textcolor cb 5" at -10, -8, 12 front nopoint tc pal cb 5
set label 15 "tc cb 0" at -10, -8, 9 front nopoint tc pal cb 0
set label 16 "tc cb -5" at -10, -8, 6 front nopoint tc pal cb -5
set label 17 "textcolor frac .75" at -10, -8, 3 nopoint tc pal frac .75
set label 18 "tc frac .25" at -10, -8, 0 nopoint tc pal frac .25
#
set ylabel 'ylabel should still be black'
splot y

Para mandar el dibujo a un archivo:

a)set terminal png        # gnuplot recomends setting terminal
                            before output
set output "output.png"   # the output filename; to be set after
                            setting terminal
replot                    # es para dibujar sobre una grafica

Manda el archivo a una hoja de presentacion... salir de gnuplot antes de buscarlo y cambiar a directorio diana
set term post enhanced
set out 'gplt.eps'
set xlabel '{/symbol q_1})'
set ylabel 'sin^2({/symbol q_1})
plot sin(x)**2

Imprimime la funcion seno y coseno en la misma gráfica con dos tipos diferentes...
plot sin(x) with linespoints pointtype 5, cos(x) w boxes lt 4Imprime 4 graficas en un solo archivo, dividiendo en 4 partes iguales:set xrange [-pi:pi]
set size 1,1
set origin 0,0
set multiplot
set size 0.5,0.5
set origin 0,0.5
plot sin(x)
set size 0.5,0.5
set origin 0,0
plot 1/sin(x)
set size 0.5,0.5
set origin 0.5,0.5
plot cos(x)
set origin 0.5,0.5
set size 0.5,0.5
set origin 0.5,0
plot 1/cos(x)
unset multiplot

reset


Leer desde archivo.
Se tiene el siguiente archivo llamado, ibm.dat
10-jun-04   90.23 90.75 89.89 90.46
9-jun-04    89.90 90.55 89.81 90.09
8-jun-04    88.64 90.50 88.40 90.04
7-jun-04    88.75 88.99 88.01 88.64
4-jun-04    87.95 88.49 87.50 87.56

3-jun-04    87.85 88.10 87.35 87.35
2-jun-04    88.64 88.64 87.89 87.98
1-jun-04    88.00 88.48 87.30 88.12
#date       open  high  low   close
para graficar el precio de apertura (col. 2) usando el linespoints style para unir con un a linea que interpolara...set xdata time
set timefmt "%d-%b-%y"
set format x "%b %d"
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with linespoints
para imprimir todos los datos:set xdata time
set timefmt "%d-%b-%y"
set format x "%b %d"
set bars 5
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2:3:4:5 with financebars

Para graficar mis datos:
set xrange [0:20]                                                               set yrange[0:30]                                                               set tics scale .5
set xtics ("20.2.1" 1, "20.2.2" 2, "20.2.3" 3, "20.2.4" 4, "20.2.5" 5, "20.3.1" 6, "20.3.2" 7, "20.3.3" 8, "20.3.4" 9, "20.3.5" 10, "40.3.1" 11, "40.3.2" 12, "40.3.3" 13, "40.3.4" 14, "40.3.5" 15, "40.4.1" 16,"40.4.2" 17,"40.4.3" 18,"40.4.4" 19," 40.4.5" 20)
set terminal png (puede ser eps)
set output "grafica_diana.png"
plot 'datos_diana.dat' using 1:3:4:5 title 'Resultados de 20 instancias' with yerrorbars
replot 'datos_diana.dat' using 1:3 title 'valor de la funcion objetivo' w  points 1    
equivalen las ultimas dos lineas a:         
plot 'datos_diana.dat' using 1:3:4:5 title 'Resultados de 20 instancias' with yerrorbars, 'datos_diana.dat' using 1:3 title 'valor de la funcion objetivo' w  points 1
quit

Referencias:


martes, 13 de marzo de 2012

AWK y SED

Se muestra el uso de dos herramientas nuevas:
1. AWK
2. SED

En ambos casos se crearon programas del tipo BASH para realizar repeticiones de los programas con ambas herramientas.

El objetivo de ambos programas es obtener información de un archivo *.lst generado al resolver un programa de optimización en GAMS, cada uno con su sintaxis respectiva.

El primer archivo se llama ultimo.sh y usa AWK par leeer por columnas la informacion del archivo de entrada (*.lst) y cuando encuentra las coincidencias re-direcciona la infornación hacia diferentes archivos de salida (res_weee_NumNodos_Param_Repetición.txt) El segundo archivo se llama intento_sed.sh y usa

El archivo ultimo.sh que pide el numero de nodos para saber que instancias son las que se realizaran (20 o 40 nodos) cada uno con 10 variantes.

El archivo intento_sed.sh pide el número de nodos para crear el nombre del archivo de entrada (*.lst) y cuando encuentra las coincidencias re-direcciona la información hacia diferentes archivos de salida (obtenido_NumNodos_Param_Repetición)

Se adjuntan ambos programas:

El archivo ultimo.sh


#!/bin/bash
echo "numero de unidades basicas: "
read
v=$REPLY
echo $v
for i in  1 2 3 4 5; do
    if [ $v -eq "20" ]
        then
        for j in 2 3; do
awk 'BEGIN {print "R E S U L T A D O S \n"} $1 == "****" && $3 == "STATUS" {print $2,$3,":",$5,$6,$7} $2 == "OBJECTIVE" {print $2,$3,$4} $1 == "MIP" && $2 == "status" {print $0} $1 == "Best" {print $0, "\nLos GAP absolutos y relativos son:"} $2 ~ /gap:$/ {print $0} END {print "--------------fin----------------"}' $"weee_"$v"_"$j"_"$i"_cplex_opt.lst" > "res_weee_"$v"_"$j"_"$i"_cplex_opt.txt"
        done
    elif [ $v -eq "40" ];
        then
        for j in 3 4; do
awk 'BEGIN {print "R E S U L T A D O S \n"} $1 == "****" && $3 == "STATUS" {print $2,$3,":",$5,$6,$7} $2 == "OBJECTIVE" {print $2,$3,$4} $1 == "MIP" && $2 == "status" {print $0} $1 == "Best" {print $0, "\nLos GAP absolutos y relativos son:"} $2 ~ /gap:$/ {print $0} END {print "--------------fin----------------"}' $"weee_"$v"_"$j"_"$i"_cplex_opt.lst" > "res_weee_"$v"_"$j"_"$i"_cplex_opt.txt"
        done

    else
        echo "Solo hay instancias con 20 y 40 nodos"
        break
    fi
    echo "Finalizado con $v unidades basicas"
done

El formato del archivo de salida es el siguiente:
R E S U L T A D O S
SOLVER STATUS : NORMAL COMPLETION
MODEL STATUS : OPTIMAL
OBJECTIVE VALUE 2.0000
Best possible:           2.000000
Los GAP absolutos y relativos son:
Absolute gap:            0.000000
Relative gap:            0.000000
--------------fin----------------


El archivo intento_sed.sh

#!/bin/bash
echo "numero de unidades basicas: "
read
v=$REPLY
for i in  1 2 3 4 5; do
    if [ $v -eq "20" ];
        then
        for j in 2 3; do
            sed -n -e '/STATUS/p' -e '/gap/p' "weee_"$v"_"$j"_"$i"_cplex_opt.lst" > "obtenido_"$v"_"$j"_"$i
        done
    elif [ $v -eq "40" ];
        then
        for j in 3 4; do
            sed -n -e '/STATUS/p' -e '/gap/p' "weee_"$v"_"$j"_"$i"_cplex_opt.lst" > "obtenido_"$v"_"$j"_"$i
        done
    else
        echo "Solo hay instancias con 20 y 40 nodos"
        break
    fi
    echo "Finalizado con $v unidades basicas"
done

El formato del archivo de salida es el siguiente:
**** SOLVER STATUS     1 NORMAL COMPLETION
**** MODEL STATUS      1 OPTIMAL
>>  epgap  0.0001
Absolute gap:            0.000000
Relative gap:            0.000000