B. Apéndice B

Anuncio
B. Apéndice B
Programas creados para automatizar las simulaciones
Aquí se detalla el contenido de los scripts usados en el estudio de dimensionamiento y
multiplexión, así como programas adicionales utilizados para el calcula de estadísticos como
medias, varianzas o intervalos de confianza.
Programas del estudio de multiplexión
simulacion.sh
__________________________________________________________________________
#! /bin/bash
# fichero para crear las simulaciones
fuentes=$1;
codec=$2;
alfa=$3;
inicio=10;
incremento=10;
fin=70;
f_entorno=entorno_mux;
[ ! -d estadisticas_N$fuentes$codec ] || (rm -r estadisticas_N$fuentes$codec; echo
"Borré el antiguo directorio \"estadisticas_N$fuentes$codec\" .")
mkdir estadisticas_N$fuentes$codec;
capacidad=`./capacidad $fuentes $codec $alfa | awk '{if($1=="Cap")print $2}'`;
for bufer in 1 `seq $inicio $incremento $fin`
do
# Borrará un archivo sólo si existe, si no existe sólo ejecuta la primera comparación
f_plot=N"$fuentes"_alfa"$alfa"_bufer"$bufer"_codec"$codec".plot
[ ! -f "$f_entorno$bufer.ef" ] || (rm -f $f_entorno$bufer; echo "Borré el antiguo
archivo \"$f_entorno$bufer.ef\" .")
#[ ! -f "$f_plot" ] || (rm -f $f_plot; echo "Borré el antiguo archivo \"$f_plot\" .")
# Guarda el tamano del bufer en bits
bufer_bits=`./parametros $fuentes $codec $alfa | awk -v bufer=$bufer
'{if(bufer==$1)print $2}'`;
cp $f_entorno.ef $f_entorno$bufer.ef;
echo "Creé el nuevo archivo \"$f_entorno$bufer.ef\" .";
awk -v valor=$bufer_bits -v capacidad=$capacidad -v fichero=$f_entorno$bufer.ef -f
entorno.awk $f_entorno.ef;
for seed in `seq 101 121`
do
f_ov=ov_N"$fuentes"_alfa"$alfa"_bufer"$bufer"_seed"$seed"
op_runsim -mem_optimize true -net_name voz_modificado-"$fuentes"fuentes$codec noprompt -ef $f_entorno$bufer
-seed $seed -ov_file $f_ov;
sh estadisticas.sh $f_ov $bufer $f_plot $fuentes $codec;
done
done;
# Hago limpieza
rm *.ot
rm /home/juan/*.ov
59
__________________________________________________________________________
estadisticas.sh
__________________________________________________________________________
# Maneja los ficheros de estadisticas .ov pasandolos a formanto ASCII
# e invocando a los programas que calculan la probabilidad de perdidas
f_salida=/home/juan/salida;
# nombre del fichero txt donde guardaremos las
estadisticas.
f_ov=$1;
# nombre del fichero .ov generado por opnet
bufer=$2;
f_plot=$3;
fuentes=$4;
codec=$5;
dir_project=/home/juan/op_models/voz_modificado.project/;
# directorio donde se
guardan los .ov
op_cvov -output_file_path $f_ov.txt -vector_data -vector_data_format S\# vector_patterns ...overflows ...busy -m $f_ov ;
cp $dir_project$f_ov.ov /home/juan/;
# Borrará un archivo sólo si existe, si no existe sólo
ejecuta la primera
comparación
[ ! -f "$dir_project$f_ov.ov" ] || (rm -f $dir_project$f_ov.ov; echo "Borré el antiguo
archivo \"$dir_project$f_ov.ov\" .")
awk -v bufer=$bufer -f estadisticas.awk $f_ov.txt >>
estadisticas_N$fuentes$codec/$f_plot ;
rm $f_ov.txt;
__________________________________________________________________________
grafica.sh
__________________________________________________________________________
# Fichero: grafica.sh
# Fecha : 2/02/08
#Autor : Juan I. Jimenez
#-------------------------------------------------------------------------#
DESCRIPCION
#-------------------------------------------------------------------------# Calcula el la probabilidad media de perdidas para cada valor del bufer
# en funcion de todos los puntos obtenidos con las distintas simulaciones.
# Posteriormente pinta las graficas usando gnuplot.
#
#-------------------------------------------------------------------------#-------------------------------------------------------------------------#
INVOCACION
#-------------------------------------------------------------------------#
#
sh grafica.sh <fuentes> <codec>
#-------------------------------------------------------------------------# BUG IMPORTANTE: SI FALTA ALGÚN DIRECTORIO DE LOS QUE BUSCA, LOS SIGUIENTES
# NO LO TENDRÁ EN CUENTA
#-------------------------------------------------------------------------# Argumentos que se pasan al script por linea de comandos
# para recorrer los directorios que contienen los ficheros con los puntos
# Tambien creamos una variable con el nombre base de los directorios
#
#-------------------------------------------------------------------------dir=estadisticas_N;
alfa=0.65;
#--------------------------------------------------------------------------
60
# Este bucle va recorriendo todos los directorios
#-------------------------------------------------------------------------for fuentes in 10 20 30 40 50
do
for codec in G729A G729AB
do
dir_act=$dir$fuentes$codec
# Voy cambiando de directorio si este existe
if [ -d $dir_act ]
then cd $dir_act; echo "Directorio actual $dir_act"
else
echo "no existe el directorio \"$dir_act\"."
fi
# Borro archivos antiguos que pueden existir de una ejecucion anterior del script
media=N"$fuentes"_alfa"$alfa"_codec"$codec".media
[ ! -f $media ] || (rm $media; echo "Borré el antiguo archivo \"$media\" .")
# Voy recorriendo los archivos del directorio actual
for bufer in 1 10 20 30 40 50 60 70
do
# Creo el nombre del archivo
if test $fuentes -eq 50
then alfa=0.60
fi
fichero=N"$fuentes"_alfa"$alfa"_bufer"$bufer"_codec"$codec".plot
# Creamos un fichero con la probabilidad media de perdidas y dibujamos el
intervalo de confianza de 90 %
[ ! -f $fichero ] || ( awk -f ../mediavar.awk $fichero | awk '{printf($3" 0.1 -intervalo %e %e",$8,$11)}' | awk -f ../tstudent.awk | awk -v x=$bufer -f ../error.awk
>> $media )
done
# Vuelvo al directorio original
cd ..
done
done
__________________________________________________________________________
El fichero parametros.c es usado por simulación.sh para diferentes cálculos.
parametros.c
__________________________________________________________________________
/**********************************************************************/
/* fichero: parametros.c
*/
/* Descripcion: Calcula el tamano max. y min. del buffer en funcion */
/*
del codec usado,del numero de fuentes y de la alfa.*/
/**********************************************************************/
/*********************** Invocacion ***********************************/
/*
calcula <numero_de_fuentes> <codec> <alfa>
*/
/**********************************************************************/
#include
#include
#include
#include
<stdio.h>
<math.h>
<stdlib.h>
<string.h>
int bufer_max(int N,float T,float alfa,float D);
int bufer_min(int N,float alfa);
int reg_salida(int reg_codec,int N, float alfa);
61
int main(int argc, char *argv[]){
int Rb;
/* regimen del codec en estado activo */
float T;
/* tiempo de trama del codec */
int cabecera = 8+12+20+7; /* rtp+udp+ip+ppp en bytes*/
int paquete_size;
/*tamano del paquete final en bits*/
long aux;
int bufer;
/* valores de interes para el bufer */
long bufer_bits;
int N;
int sizeACT;
float alfa;
float D = 0.05; /* Retraso max. permido a un paquete en el buffer */
if (argc == 4){
N=atoi(argv[1]); /* numero de fuentes multiplexadas */
alfa = (double)atof(argv[3]);
/* que tipo de codec se esta usando */
if((strcmp(argv[2],"G729A")==0)||(strcmp(argv[2],"G729AB")==0)){
Rb=8000;
sizeACT=10;
T=0.01;
}
else if (strcmp(argv[2],"AMR475")==0){
Rb=4750;
T=0.02;
sizeACT=12; /* Puede calcularse como ceil(Rb*T/8) */
}
else if(strcmp(argv[2],"AMR122")==0){
Rb=12200;
T=0.02;
sizeACT=31;
}
else{
printf ("Codec desconocido\n");
exit(1);
}
/*Calculo el tamaño del paquete ACT */
paquete_size=(sizeACT+cabecera)*8;
aux=bufer_max(N,T,alfa,D);
bufer_bits =(long)aux*paquete_size;
printf("%d\t%ld\n",1,paquete_size);
for (bufer=10;bufer<80;bufer+=10){
printf("%d\t%ld\n",bufer,(long)bufer*paquete_size);
}
}
else
printf("Invocacion incorrecta: calcula <numero_de_fuentes> <codec> <alfa>");
return 0;
}
int bufer_max(int N,float T,float alfa,float D){
float m;
m=D*alfa*N/T;
m = floor(m);
return m;
}
int reg_salida(int reg_codec,int N, float alfa){
/* Para conseguir precision */
62
alfa = alfa*100;
alfa=roundf(alfa);
return alfa*N*reg_codec/100
;
}
int bufer_min(int N,float alfa){
float m= (alfa*N)-1;
return ceil(m);
}
__________________________________________________________________________
El programa entorno.awk se usa para crear el archivo de entorno de la simulación con los
parámetros adecuados.
entorno.awk
_____________________________________________________________________________
# cambia el fichero de entorno del opnet de donde lee los parametros
BEGIN{
printf "\"Office network.router.ppp_tx_05_0.channel [0].bit capacity\" :
\"%d\"\n",valor >> fichero;
printf "\"Office network.router <-> destino.data rate\" : \"%d\"\n",capacidad >>
fichero;
}
estadisticas.awk
sirve para filtrar los ficheros de estadísticas que obtenemos de OPNET.
estadisticas.awk
__________________________________________________________________________
BEGIN{
desbordamiento=0;
paquetes=0;
}
{
# Esta linea indica el comienzo de los datos estadisticos : 0 seg. 0 estad.
(para el tiempo 0 el estadistico siempre vale cero).
if (($1==0) && ($2==0)){
inicio =1;
}
}
{
if($1 ~ /Statistic/)
{
estadistica = $3;
if(estadistica ~ /overflows/)
desbordamiento=1;
if(estadistica ~ /busy/)
paquetes=1;
}
}
{
63
if ($1 ~ /Number/){
valor=$4;
if(desbordamiento==1){
# Al numero total de valores hay que quitarle los tomados en 0.0 seg. y fin_simulation
ya que valen siempre 0.
desbord_total = valor -2;
#
printf "desbordamientos=%d\n",desbord_total;
desbordamiento =0;
}
}
}
{
# Se ha llegado a los datos y estos son de el estadistico paquetes
if ((paquetes==1) && (inicio==1)){
# Si no se ha llegado al final de los datos
if($0 !~ /Vector end/)
suma +=$2;
}
}
# Para calcula el numero de paquetes real hay que restar los que no sean de voz, que
siempre son 2 del protocolo RIP.
END{
paquetes_no_voz=2;
# printf "paquetes=%d\n",suma-paquetes_no_voz;
printf "%d\t%e\n",bufer,desbord_total/(suma+desbord_total-paquetes_no_voz);
}
__________________________________________________________________________
Programas del estudio de dimensionamiento
simulacion.sh
__________________________________________________________________________
#! /bin/bash
#-------------------------------------------------------------------------------#
DESCRIPCION
#-------------------------------------------------------------------------------#
# Script para invocar las simulaciones de opnet con los parametros alfa,capacidad
del enlace de salida del router
# y tamano del bufer adecuados.
#
# Autor : Juan I. Jimenez Anguiano
# Fecha : 05/02/08
#
#-------------------------------------------------------------------------------#--------------------------------- INVOCACION ----------------------------------#
#
sh simulacion.sh <fuentes>
#
#--------------------------------------------------------------------------------# Los parametros que recibe el script a traves de la linea de comandos son el
numero de fuentes y el tipo de codec. #
# Tambien se definen algunas constantes que se usaran a lo largo del script.
#--------------------------------------------------------------------------------fuentes=$1;
codec=$2;
64
#--------------------------------------------------------------------------------# En primer lugar creamos un entorno de trabajo a partir del directorio
$HOME/dimensionamiento.
#
# Despues se crea el fichero de entorno que debe recibir el comando op_runsim como
parametro.Algunos valores de éste #
# iran variando en las distintas simulaciones. En concreto, la capacidad del
enlace de salida y el tamano del bufer. #
# Se creará un directorio para organizar los ficheros de cada simulacion. Si el
directorio ya existia de una
#
# ejecucion anterior de este programa,será borrado.
#
#------------------------------------------------------------------------------ #
if [ ! -d $HOME/dimensionamiento ]
then
mkdir $HOME/dimensionamiento
else
cd $HOME/dimensionamiento
fi
f_entorno=dim ;
[ ! -d estadisticas_N$fuentes ] || (rm -r estadisticas_N$fuentes; echo Borré el
antiguo directorio \"estadisticas_N$fuentes\" .)
mkdir $HOME/dimensionamiento/estadisticas_N$fuentes;
for codec in
do
G729A G729AB
#--------------------------------------------------------------------------------# Se crean varios bucles for anidados para llamar a op_runsim. Para cada alfa se
ejecutaran n(20) simulaciones con
#
# semillas distintas. Para variar las alfas en las simulaciones lo que hemos es
cambiar la capacidad del enlace
#
# de salida del router.El tamano del bufer dependera de alfa y del numero de
fuentes de la simulacion.
#
#--------------------------------------------------------------------------------for alfa in 0.55 0.57 0.59 0.61 0.63 0.65 0.67 0.69 0.71 0.73 0.75
do
#--------------------------------------------------------------------------------# El fichero "f_perdidas" guardará la probabilidad de perdidas de paquetes de las
20 simulaciones hechas para un mismo N y alfa. #
# Se borran ficheros antiguos de entorno que pueda haber de ejecuciones anteriores
del script.
#
# -------------------------------------------------------------------------------f_perdidas=N"$fuentes"_alfa"$alfa"_codec"$codec".pp
[ ! -f $f_entorno"N"$fuentes.ef ] || (rm -f $f_entorno"N"$fuentes.ef; echo
Borré el antiguo archivo \"$f_entorno"N"$fuentes.ef\" .)
#--------------------------------------------------------------------------------# Se llama al programa capacidad que calcula el tamano del bufer y la capacidad
del enlace de salida del router para un alfa,#
# un codec concreto y un numero de fuentes. Posteriormente se crea el nuevo
fichero de entorno que se modifica adecuadamente #
# con el programa entorno.awk.
#
#--------------------------------------------------------------------------------bufer=`./capacidad $fuentes $codec $alfa | awk '{if($1=="m")print $2}'`;
capacidad=`./capacidad $fuentes $codec $alfa | awk '{if($1=="Cap")print
$2}'`;
cp $f_entorno.ef $f_entorno"N"$fuentes.ef;
echo Creé el nuevo archivo \"$f_entorno"N"$fuentes.ef\" .;
awk -v bufer=$bufer -v capacidad=$capacidad -v
fichero=$f_entorno"N"$fuentes.ef -f entorno.awk $f_entorno"N"$fuentes.ef;
65
#--------------------------------------------------------------------------------# Bucle que ejecuta 20 simulaciones del mismo escenario, es decir,mismo alfa,mismo
codec y mismo numero de fuentes.Lo unico
#
# que cambia es la semilla que recibe op_runsim como parametro.
#
# El fichero de estadistica que se genera se guarda en el fichero "f_ov" que se
tratará para poder manejarlo.Esto se hace
#
# en el script estadisticas.sh.
#--------------------------------------------------------------------------------for seed in `seq 101 120`
do
f_ov=ov_N"$fuentes"_alfa"$alfa"_codec"$codec"_seed"$seed"
op_runsim -mem_optimize true -net_name voz_modificado"$fuentes"fuentes$codec -noprompt -ef $f_entorno"N"$fuentes -seed $seed -ov_file
$f_ov;
echo Ejecutando \"sh estadisticas.sh $f_ov $f_perdidas $fuentes $codec
\"... ;
sh estadisticas.sh $f_ov $f_perdidas $fuentes $codec;
echo Terminado sh estadisticas.sh $f_ov $f_perdidas $fuentes $codec;
done
done;
done
# Finalmente hago limpieza de algunos ficheros intermedios creados que son
innecesarios
#rm *.ot
#rm $HOME/*.ov
__________________________________________________________________________
estadisticas.sh
__________________________________________________________________________
#-------------------------------DESCRIPCION--------------------------------------#
# Script que maneja los ficheros de estadisticas .ov pasandolos a formanto ASCII.
# Invoca a los programas que calculan la probabilidad de perdidas.
#
#
Autor : Juan I. Jimenez Anguiano
#
Fecha : 05/02/08
#
#--------------------------------------------------------------------------------#-------------------------------------------------------------------------------#
# Estos son los argumentos que recibe el script por linea de comandos. Ademas se
define el #
# valor de algunas varibles que vamos a necesitar más adelante.
#
#--------------------------------------------------------------------------------#
f_ov=$1;
# nombre del fichero .ov generado por OPNET
f_perdidas=$2;
fuentes=$3;
codec=$4;
dir_project=$HOME/op_models/voz_modificado.project;
# directorio donde se
guardan los .ov
#----------------------------------------------------------------------------#
# op_cvov es una herramienta que proporciona OPNET que permite pasar las
estadisticas de #
# la simulacion, almacenadas en archivo .ov a un fichero .txt
#
66
#---------------------------------------------------------------------------#
echo Ejecutandose op_cvov -output_file_path $f_ov.txt -vector_data vector_data_format S\# -vector_patterns ...overflows ...busy -m $f_ov ... ;
op_cvov -output_file_path $f_ov.txt -vector_data -vector_data_format S\# vector_patterns ...overflows ...busy -m $f_ov ;
#----------------------------------------------------------------------------#
# Borrará el archivo .ov que se guarda en el directorio del proyecto sólo si
existe.
#
# Estos ficheros se borran porque ya son innecesarios, ademas ocupan mucho espacio
y
#
# pueden acumularse.
#
# El programa estadisticas.awk devuelve la probabilidad de perididas a partir del
#
# fichero de estadisticas que obtuvimos.
#
#-------------------------------------------------------------------------------#
[ ! -f $dir_project/$f_ov.ov ] || (rm -f $dir_project/$f_ov.ov; echo Borré el
antiguo archivo \"$dir_project/$f_ov.ov\" .)
awk -f estadisticas.awk $f_ov.txt >> estadisticas_N$fuentes/$f_perdidas ;
rm $f_ov.txt;
__________________________________________________________________________
grafica.sh
__________________________________________________________________________
#-------------------------------DESCRIPCION -------------------------------#
# Calcula el la probabilidad media de perdidas para cada valor del bufer
# en funcion de todos los puntos obtenidos con las distintas simulaciones.
# Posteriormente pinta las graficas usando gnuplot.
#
#
Autor : Juan I. Jimenez
#
Fecha : 05/02/08
#
#-------------------------------------------------------------------------#--------------------------INVOCACION
----------------------#
#
sh grafica.sh
#--------------------------------------------------------------------------#-------------------------------------------------------------------------# Argumentos que se pasan al script por linea de comandos
# para recorrer los directorios que contienen los ficheros con los puntos
# Tambien creamos una variable con el nombre base de los directorios
#------------------------------------------------------------------------#--------------------------------------------------------------------# Directorio desde donde debemos empezar
#-------------------------------------------------------------------cd $HOME/dimensionamiento
dir=estadisticas_N;
#--------------------------------------------------------------------# Este bucle va recorriendo todos los directorios
#----------------------------------------------------------------------
for fuentes in 10 20 30 40
67
do
dir_act=$dir$fuentes
# Voy cambiando de directorio si este existe
if [ -d $dir_act ]
then cd $dir_act; echo "Directorio actual: \"$dir_act\" ."
else
echo "no existe el directorio \"$dir_act\"."
fi
for codec in G729A G729AB
do
# Borro archivos antiguos que pueden existir de una ejecucion anterior del script
media=N"$fuentes"_codec"$codec".media
[ ! -f $media ] || (rm $media; echo "Borré el antiguo archivo \"$media\" .")
# Voy recorriendo los archivos del directorio actual
for alfa in 0.55 0.57 0.59 0.61 0.63 0.65 0.67 0.69 0.71 0.73 0.75
do
# Creamos el nombre del archivo
fichero=N"$fuentes"_alfa"$alfa"_codec"$codec".pp
# preparamos el fichero para que pueda ser procesado por mediavar.awk .
awk -v alfa=$alfa '{printf "%.2f\t%e\n",alfa,$1}' $fichero > out;
# Creamos un fichero con la probabilidad media de perdidas y dibujamos el
intervalo de confianza de 95 %
[ ! -f out ] || ( awk -f ../mediavar.awk out | awk '{printf($3" 0.05 -intervalo %e %e",$8,$11)}' | awk -f ../tstudent.awk | awk -v x=$alfa -f
../error.awk >> $media)
done
# Vuelvo al directorio original
done
cd $HOME/dimensionamiento
done
__________________________________________________________________________
capacidad
es un programa usado por simulacion.sh.
capacidad.c
__________________________________________________________________________
/**********************************************************************/
/* fichero: capacidad.c
*/
/* Descripcion: Calcula la capacidad del enlace de salida en funcion */
/*
del codec usado,del numero de fuentes y de la alfa.
*/
/*
Tambien calcula el tamano de buffer necesario para
*/
/*
que existe un retraso max. determinado en funcion de */
/*
el numero de fuentes y de alfa.
*/
/**********************************************************************/
/*********************** Invocacion ***********************************/
/*
calcula <numero_de_fuentes> <codec> <alfa>
*/
/**********************************************************************/
#include
#include
#include
#include
<stdio.h>
<math.h>
<stdlib.h>
<string.h>
int bufer_max(int N,float T,float alfa,float D);
int bufer_min(int N,float alfa);
68
int reg_salida(int paquete, float T,int N, float alfa);
int main(int argc, char *argv[]){
int Rb;
float T;
int cabecera = 8+12+20+7;
int paquete_size;
long aux;
long bufer_bits;
int N;
int sizeACT;
float alfa;
float D = 0.05;
buffer */
if (argc == 4){
/*
/*
/*
/*
/*
regimen del codec en estado activo */
tiempo de trama del codec */
rtp+udp+ip+ppp en bytes */
tamano del paquete final en bits */
variable auxiliar para guardar resultados */
/* numero de fuentes */
/* Retraso max. permido a un paquete en el
N=atoi(argv[1]); /* numero de fuentes multiplexadas */
alfa = (double)atof(argv[3]);
/* que tipo de codec se esta usando */
if(strcmp(argv[2],"G729A")==0 || strcmp(argv[2],"G729AB")==0){
Rb=8000;
sizeACT=10;
T=0.01;
}
else if (strcmp(argv[2],"AMR475")==0){
Rb=4750;
T=0.02;
sizeACT=12; /* Puede calcularse como ceil(Rb*T/8) */
}
else if(strcmp(argv[2],"AMR122")==0){
Rb=12200;
T=0.02;
sizeACT=31;
}
else{
printf ("Codec desconocido");
exit(1);
}
/*Calculo el tamaño del paquete ACT */
paquete_size=(sizeACT+cabecera)*8;
aux=bufer_max(N,T,alfa,D);
bufer_bits =(long)aux*paquete_size;
printf("m\t%ld\n",bufer_bits);
printf("Cap\t%d\n",reg_salida(paquete_size,T,N,alfa));
}
else
printf("Invocacion incorrecta: calcula <numero_de_fuentes> <codec> <alfa>");
return 0;
__________________________________________________________________________
estadisticas.awk
__________________________________________________________________________
#------------------------------
DESCRIPCION -----------------------------------#
69
# Lee los ficheros estadisticas generados en la simulacion y a partir de los
estadisticos:
# numero de desbordamientos y numero total de paquetes, calcula la probabilidad de
# perdidas de un paquete en el router.
#
# Autor : Juan I. Jimenez Anguiano
# Fecha : 05/02/08
#
#-------------------------------------------------------------------------------BEGIN{
desbordamiento=0;
paquetes=0;
}
{
#-------------------------------------------------------------------------------# Esta linea indica el comienzo de los datos estadisticos : 0 seg. 0 estadistico
# (para el tiempo 0 el estadistico siempre vale cero).
#------------------------------------------------------------------------------------if (($1==0) && ($2==0)){
inicio =1;
}
}
{
if($1 ~ /Statistic/)
{
estadistica = $3;
if(estadistica ~ /overflows/)
desbordamiento=1;
if(estadistica ~ /busy/)
paquetes=1;
}
}
{
if ($1 ~ /Number/){
valor=$4;
if(desbordamiento==1){
#---------------------------------------------------------------------------------# Al numero total de valores hay que quitarle los tomados en 0.0 seg. y fin_simulation
ya que valen siempre 0.
#-----------------------------------------------------------------------------------desbord_total = valor -2;
desbordamiento =0;
}
}
}
{
#--------------------------------------------------------------------------# Se ha llegado a los datos y estos son de el estadistico paquetes
#-------------------------------------------------------------------------if ((paquetes==1) && (inicio==1)){
# Si no se ha llegado al final de los datos
if($0 !~ /Vector end/)
suma +=$2;
}
}
#-------------------------------------------------------------------------------------
70
# Para calcula el numero de paquetes real hay que restar los que no sean de voz, que
siempre son 2 del protocolo RIP.
#------------------------------------------------------------------------------------END{
paquetes_no_voz=2;
printf "%s\t%e\n",codec,desbord_total/(suma-paquetes_no_voz+desbord_total);
}
__________________________________________________________________________
entorno.awk
__________________________________________________________________________
# cambia el fichero de entorno del opnet de donde lee los parametros
BEGIN{
printf "\"Office network.router.ppp_tx_05_0.channel [0].bit capacity\" :
\"%d\"\n",bufer >> fichero;
printf "\"Office network.router <-> destino.data rate\" :
\"%d\"\n",capacidad >>
fichero;
}
__________________________________________________________________________
Programas comunes a multiplexión y dimensionamiento
mediavar.awk
__________________________________________________________________________
BEGIN {
#
# Simple awk script to compute mean and variance
# of a value list
# Input file: lines with pairs <time, value>
#
TRANSIT=0
n = 0;
m = 0;
variance = 0;
maximum = 0;
minimum =0;
}
{
if ($1 >= TRANSIT){
x = $2;
oldnum = n;
n = n + 1.0;
tmp = x - m;
m = m + (tmp / n);
if ( 1 == n ){
maximum = x;
minimum = x;
variance = 0;
}
else{
if (x > maximum)
maximum = x;
else if (x < minimum)
minimum = x;
71
variance = (oldnum-1)/oldnum * variance + tmp*tmp / n;
}
}
}
END{
printf("n = %e", n);
if (n > 0) {
printf(" [%e ..", minimum);
printf("%e] ", maximum);
printf("m = %e", m);
}
if (n > 2){
printf(" var = %e", variance);
}
printf("\n");
}
__________________________________________________________________________
tstudent.awk
__________________________________________________________________________
function abs(val)
{
if (val > 0){
return val;
}
else {
return -val;
}
}
function gammln(xx)
{
##
double x,y,tmp,ser;
##
int j;
y=x=xx;
tmp=x+5.5;
tmp -= (x+0.5)*log(tmp);
ser=1.000000000190015;
for (j=0;j<=5;j++){
ser += cof[j]/++y;
}
return -tmp+log(2.5066282746310005*ser/x);
}
function alfa(a, b, x)
#
{
Returns the incomplete beta function Ix(a; b).
#
float bt;
if (x < 0.0 || x > 1.0) {
printf("Bad x in routine alfa");
}
if (x == 0.0 || x == 1.0) {
bt=0.0;
}
else {
# Factors in front of the continued fraction.
bt=exp(gammln(a+b)-gammln(a)-gammln(b)+a*log(x)+b*log(1.0-x));
}
if (x < (a+1.0)/(a+b+2.0)){
# Use continued fraction directly.
72
return bt*betacf(a,b,x)/a;
}
else {
# Use continued fraction after making the symmetry transformation.
return 1.0-bt*betacf(b,a,1.0-x)/b;
}
}
function betacf(a, b, x)
# Used by alfa: Evaluates continued fraction for incomplete beta function
# by modfied Lentz's method (x5.2).
{
# int m,m2;
# float aa,c,d,del,h,qab,qam,qap;
qab=a+b;
# These q's will be used in factors that occur
# in the coficients (6.4.6).
qap=a+1.0;
qam=a-1.0;
c=1.0;
#
First step of Lentz's method.
d=1.0-qab*x/qap;
if (abs(d) < FPMIN){
d=FPMIN;
}
d=1.0/d;
h=d;
for (m=1;m<=MAXIT;m++) {
m2=2*m;
aa=m*(b-m)*x/((qam+m2)*(a+m2));
d=1.0+aa*d;
# One step (the even one) of the recurrence.
if (abs(d) < FPMIN){
d=FPMIN;
}
c=1.0+aa/c;
if (abs(c) < FPMIN){
c=FPMIN;
}
d=1.0/d;
h *= d*c;
aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
d=1.0+aa*d;
# Next step of the recurrence (the odd one).
if (abs(d) < FPMIN){
d=FPMIN;
}
c=1.0+aa/c;
if (abs(c) < FPMIN) {
c=FPMIN;
}
d=1.0/d;
del=d*c;
h *= del;
if (abs(del-1.0) < EPS) {
break;
# Are we done?
}
}
if (m > MAXIT) {
73
printf("a or b too big, or MAXIT too small in betacf");
}
return h;
}
function invstudent (n, alf) {
# v: grados de libertad
v = n - 1;
a = v/2;
b = 0.5;
alfabuscada = alf;
t = 0;
do {
t = t + step;
x = v / ( v + t * t );
} while ( alfabuscada < alfa(a, b, x));
return t;
}
BEGIN{
MAXIT = 100;
EPS = 3.0e-7;
FPMIN = 1.0e-30;
cof[0]=76.18009172947146;
cof[1]=-86.50532032941677;
cof[2]= 24.01409824083091;
cof[3]=-1.231739572450155;
cof[4]= 0.1208650973866179e-2;
cof[5]=-0.5395239384953e-5;
step = 0.0001;
getline ;
if ($1=="--help"){
printf ("num alfa : Devuelve t(n-1,alfa/2)\n");
printf ("num alfa \"--intervalo\" media varianza: Devuelve el intervalo de
confianza\n");
}
else {
t = invstudent($1, $2);
if ($3=="--intervalo"){
m = $4;
s = $5;
width = sqrt(s/$1)*t;
printf ("%g < mu < %g anchura = %g\n", m - width, m + width, 2*width);
}
else {
printf("DISTR.T.INV(n-1=%f, alfa=%f) = %f\n" , $1 -1, $2, t);
}
}
}
__________________________________________________________________________
error.awk
__________________________________________________________________________
#autor : Juan Ignacio Jimenez Anguiano
# fichero para poder pintar las graficas con error.
{
74
v_menor=$1;
v_mayor=$5;
anchura=$8;
y=(v_menor + v_mayor)/2;
delta=(anchura)/2;
printf ("%d %f %f\n",x,y,delta) ;
}
__________________________________________________________________________
75
Descargar