[GRASS-SVN] r44428 - in grass/trunk: . raster/r.li raster/r.li/r.li.daemon raster/r.li/r.li.pielou raster/r.li/r.li.renyi

svn_grass at osgeo.org svn_grass at osgeo.org
Fri Nov 26 08:29:14 EST 2010


Author: neteler
Date: 2010-11-26 05:29:14 -0800 (Fri, 26 Nov 2010)
New Revision: 44428

Added:
   grass/trunk/raster/r.li/r.li.pielou/
   grass/trunk/raster/r.li/r.li.pielou/Makefile
   grass/trunk/raster/r.li/r.li.pielou/pielou.c
   grass/trunk/raster/r.li/r.li.pielou/r.li.pielou.html
   grass/trunk/raster/r.li/r.li.renyi/
   grass/trunk/raster/r.li/r.li.renyi/Makefile
   grass/trunk/raster/r.li/r.li.renyi/r.li.renyi.html
   grass/trunk/raster/r.li/r.li.renyi/renyi.c
Modified:
   grass/trunk/contributors_extra.csv
   grass/trunk/raster/r.li/Makefile
   grass/trunk/raster/r.li/r.li.daemon/index.h
   grass/trunk/raster/r.li/r.li.html
Log:
Luca Delucchi + Duccio Rocchini: two new indices

Modified: grass/trunk/contributors_extra.csv
===================================================================
--- grass/trunk/contributors_extra.csv	2010-11-26 00:21:30 UTC (rev 44427)
+++ grass/trunk/contributors_extra.csv	2010-11-26 13:29:14 UTC (rev 44428)
@@ -10,6 +10,7 @@
 Carl Anderson,<candrsn mindspring.com>,-
 Charles Ehlschlaeger,<cre111 wiu.edu>,-
 Christoph Simon,<ciccio kiosknet.com.br>,-
+Duccio Rocchini,<ducciorocchini gmail.com>,-
 Dylan Beaudette,<dylan.beaudette gmail.com>,yes
 Eric Mitchell,<emitchell altaira.com>,-
 Francesco Pirotti,<francesco.pirotti unipd.it>,-
@@ -20,6 +21,7 @@
 Lars Ahlzen,<lars ahlzen.com>,-
 Lorenzo Moretti,<lorenzo moretti bologna.enea.it>,-
 Lubos Mitas,<lmitas ncsa uiuc.edu>,-
+Luca Delucchi,<lucadeluge gmail.com>,-
 Malcolm Blue,<mblue nb sympatico.ca>,-
 Maria Brovelli,<maria.brovelli polimi.it>,-
 Michael Perdue,<michael_perdue yahoo.ca>,-

Modified: grass/trunk/raster/r.li/Makefile
===================================================================
--- grass/trunk/raster/r.li/Makefile	2010-11-26 00:21:30 UTC (rev 44427)
+++ grass/trunk/raster/r.li/Makefile	2010-11-26 13:29:14 UTC (rev 44428)
@@ -13,6 +13,8 @@
 	r.li.padsd \
 	r.li.patchdensity \
 	r.li.patchnum \
+	r.li.pielou \
+	r.li.renyi \
 	r.li.richness \
 	r.li.shannon \
 	r.li.shape \

Modified: grass/trunk/raster/r.li/r.li.daemon/index.h
===================================================================
--- grass/trunk/raster/r.li/r.li.daemon/index.h	2010-11-26 00:21:30 UTC (rev 44427)
+++ grass/trunk/raster/r.li/r.li.daemon/index.h	2010-11-26 13:29:14 UTC (rev 44428)
@@ -5,6 +5,7 @@
  *  
  * \author Claudio Porta, Lucio Davide Spano, Serena Pallecchi students of Computer Science University of Pisa (Italy)
  *                      Commission from Faunalia Pontedera (PI) www.faunalia.it
+  *        Luca Delucchi and Duccio Rocchini, Fondazione Edmund Mach, Italy: r.li.pielou, r.li.renyi
  *
  *
  * This program is free software under the GPL (>=v2)
@@ -12,7 +13,6 @@
  * 
  * \version 1.1
  *
- * BUGS: please send bugs reports to spano at cli.di.unipi.it porta at cli.di.unipi.it pallecch at cli.di.unipi.it
  */
 
 
@@ -31,6 +31,10 @@
 int patch_number(int fd, char **par, area_des ad, double *result);
 int shape_index(int fd, char **par, area_des ad, double *result);
 int shannon(int fd, char **par, area_des ad, double *result);
+
+int pielou(int fd, char **par, area_des ad, double *result);
+int renyi(int fd, char **par, area_des ad, double *result);
+
 int simpson(int fd, char **par, area_des ad, double *result);
 int meanPatchSize(int fd, char **par, area_des ad, double *result);
 int meanPixelAttribute(int fd, char **par, area_des ad, double *result);

Modified: grass/trunk/raster/r.li/r.li.html
===================================================================
--- grass/trunk/raster/r.li/r.li.html	2010-11-26 00:21:30 UTC (rev 44427)
+++ grass/trunk/raster/r.li/r.li.html	2010-11-26 13:29:14 UTC (rev 44428)
@@ -154,10 +154,12 @@
 
 <b>Diversity indices</b>:
 <ul>
-  <li> <a href="r.li.dominance.html">r.li.dominance</a>: Calculates dominance's diversity index on a raster map</li>
-  <li> <a href="r.li.richness.html">r.li.richness</a>: Calculates dominance's diversity index on a raster map</li>
-  <li> <a href="r.li.shannon.html">r.li.shannon</a>: Calculates Shannon's diversity index on a raster map</li>
-  <li> <a href="r.li.simpson.html">r.li.simpson</a>: Calculates Simpson's diversity index on a raster map</li>
+  <li> <a href="r.li.dominance.html">r.li.dominance</a>: Calculates dominance diversity index on a raster map</li>
+  <li> <a href="r.li.pielou.html">r.li.pielou</a>: Calculates Pielou eveness index on a raster map</li>
+  <li> <a href="r.li.renyi.html">r.li.renyi</a>: Calculates Renyi entropy on a raster map</li>
+  <li> <a href="r.li.richness.html">r.li.richness</a>: Calculates richness diversity index on a raster map</li>
+  <li> <a href="r.li.shannon.html">r.li.shannon</a>: Calculates Shannon diversity index on a raster map</li>
+  <li> <a href="r.li.simpson.html">r.li.simpson</a>: Calculates Simpson diversity index on a raster map</li>
 </ul>
 
 <h2>ADDING NEW INDICES</h2>

Added: grass/trunk/raster/r.li/r.li.pielou/Makefile
===================================================================
--- grass/trunk/raster/r.li/r.li.pielou/Makefile	                        (rev 0)
+++ grass/trunk/raster/r.li/r.li.pielou/Makefile	2010-11-26 13:29:14 UTC (rev 44428)
@@ -0,0 +1,13 @@
+MODULE_TOPDIR = ../../..
+
+PGM = r.li.pielou
+
+EXTRA_CLEAN_DIRS=doxygenhtml
+
+LIBES = $(RLILIB) $(RASTERLIB) $(GISLIB)
+
+DEPENDENCIES = $(RLIDEP) $(RASTERDEP) $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd


Property changes on: grass/trunk/raster/r.li/r.li.pielou/Makefile
___________________________________________________________________
Added: svn:mime-type
   + text/x-makefile
Added: svn:eol-style
   + native

Added: grass/trunk/raster/r.li/r.li.pielou/pielou.c
===================================================================
--- grass/trunk/raster/r.li/r.li.pielou/pielou.c	                        (rev 0)
+++ grass/trunk/raster/r.li/r.li.pielou/pielou.c	2010-11-26 13:29:14 UTC (rev 44428)
@@ -0,0 +1,809 @@
+
+/****************************************************************************
+ *
+ * MODULE:	r.li.pielou
+ *
+ * PURPOSE:	brief calculates pielou's diversity index
+ *
+ * AUTHOR(S):	Luca Delucchi, Fondazione Edmund Mach         
+ *		Serena Pallecchi student of Computer Science University of Pisa (Italy)
+ *            	
+ * COPYRIGHT:
+ *		This program is free software under the GPL (>=v2)
+ *		Read the COPYING file that comes with GRASS for details.
+ *       
+ ***************************************************************************/
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "../r.li.daemon/defs.h"
+#include "../r.li.daemon/avlDefs.h"
+#include "../r.li.daemon/avl.h"
+#include "../r.li.daemon/daemon.h"
+
+int calculate(int fd, area_des ad, double *result);
+
+int calculateD(int fd, area_des ad, double *result);
+
+int calculateF(int fd, area_des ad, double *result);
+
+/*This function is used to sort the values in the moving window */
+static int cmp(const void *pa, const void *pb)
+{
+    int *p1 = (int *)pa;
+    int *p2 = (int *)pb;
+
+    if (*p1 < *p2)
+	return -1;
+    if (*p1 > *p2)
+	return 1;
+    return 0;
+}
+
+int main(int argc, char *argv[])
+{
+    struct Option *raster, *conf, *output;
+
+    struct GModule *module;
+
+    G_gisinit(argv[0]);
+    module = G_define_module();
+    module->description =
+	_("Calculates Pielou's diversity index on a raster map");
+    G_add_keyword(_("raster"));
+    G_add_keyword(_("landscape structure analysis"));
+    G_add_keyword(_("diversity index"));
+
+    /* define options */
+
+    raster = G_define_standard_option(G_OPT_R_INPUT);
+
+    conf = G_define_option();
+    conf->key = "conf";
+    conf->description = _("Configuration file");
+    conf->gisprompt = "old_file,file,input";
+    conf->type = TYPE_STRING;
+    conf->required = YES;
+
+    output = G_define_standard_option(G_OPT_R_OUTPUT);
+
+    if (G_parser(argc, argv))
+	exit(EXIT_FAILURE);
+
+    return calculateIndex(conf->answer, pielou, NULL, raster->answer,
+			  output->answer);
+
+}
+
+int pielou(int fd, char **par, area_des ad, double *result)
+{
+
+    int ris = RLI_OK;
+    double indice = 0;
+    struct Cell_head hd;
+
+    Rast_get_cellhd(ad->raster, "", &hd);
+
+    switch (ad->data_type) {
+    case CELL_TYPE:
+	{
+	    calculate(fd, ad, &indice);
+	    break;
+	}
+    case DCELL_TYPE:
+	{
+	    calculateD(fd, ad, &indice);
+	    break;
+	}
+    case FCELL_TYPE:
+	{
+	    calculateF(fd, ad, &indice);
+	    break;
+	}
+    default:
+	{
+	    G_fatal_error("data type unknown");
+	    return RLI_ERRORE;
+	}
+    }
+
+    if (ris != RLI_OK) {
+	return RLI_ERRORE;
+    }
+
+    *result = indice;
+
+    return RLI_OK;
+
+}
+
+
+int calculate(int fd, area_des ad, double *result)
+{
+
+    CELL *buf;
+    CELL corrCell;
+    CELL precCell;
+
+    int i, j;
+    int mask_fd = -1, *mask_buf;
+    int ris = 0;
+    int masked = FALSE;
+    int a = 0;			/* a=0 if all cells are null */
+
+    long m = 0;
+    long tot = 0;
+    long zero = 0;
+    long totCorr = 0;
+
+    double indice = 0;
+    double somma = 0;
+    double percentuale = 0;
+    double area = 0;
+    double t;
+    double logaritmo;
+
+    /* add to compute the number of class */
+    long *array_copy;
+    int totNumClass = 1;
+    double logTotNumClass;
+
+    generic_cell cc;
+
+    generic_cell cc_passage;	/*add to compute the number of class */
+
+    avl_tree albero = NULL;
+
+    AVL_table *array;
+
+    cc.t = CELL_TYPE;
+
+    /* open mask if needed */
+    if (ad->mask == 1) {
+	if ((mask_fd = open(ad->mask_name, O_RDONLY, 0755)) < 0)
+	    return RLI_ERRORE;
+	mask_buf = G_malloc(ad->cl * sizeof(int));
+	if (mask_buf == NULL) {
+	    G_fatal_error("malloc mask_buf failed");
+	    return RLI_ERRORE;
+	}
+	masked = TRUE;
+    }
+
+
+    Rast_set_c_null_value(&precCell, 1);
+
+
+    /*for each row */
+    for (j = 0; j < ad->rl; j++) {
+	buf = RLI_get_cell_raster_row(fd, j + ad->y, ad);
+
+
+	if (masked) {
+	    if (read(mask_fd, mask_buf, (ad->cl * sizeof(int))) < 0) {
+		G_fatal_error("mask read failed");
+		return RLI_ERRORE;
+	    }
+	}
+
+
+	for (i = 0; i < ad->cl; i++) {	/* for each cell in the row */
+	    area++;
+	    corrCell = buf[i + ad->x];
+
+	    if (masked && mask_buf[i + ad->x] == 0) {
+		Rast_set_c_null_value(&corrCell, 1);
+		area--;
+	    }
+
+	    if (!(Rast_is_null_value(&corrCell, cc.t))) {
+		a = 1;
+		if (Rast_is_null_value(&precCell, cc.t)) {
+		    precCell = corrCell;
+		}
+
+		if (corrCell != precCell) {
+		    if (albero == NULL) {
+			cc.val.c = precCell;
+			albero = avl_make(cc, totCorr);
+
+			if (albero == NULL) {
+			    G_fatal_error("avl_make error");
+			    return RLI_ERRORE;
+			}
+			else
+			    m++;
+		    }
+		    else {
+			cc.val.c = precCell;
+			ris = avl_add(&albero, cc, totCorr);
+			switch (ris) {
+			case AVL_ERR:
+			    {
+				G_fatal_error("avl_add error");
+				return RLI_ERRORE;
+			    }
+			case AVL_ADD:
+			    {
+				m++;
+				break;
+			    }
+			case AVL_PRES:
+			    {
+				break;
+			    }
+			default:
+			    {
+				G_fatal_error("avl_add unknown error");
+				return RLI_ERRORE;
+			    }
+			}
+		    }
+		    totCorr = 1;
+		}
+		else {
+		    totCorr++;
+		}
+		precCell = corrCell;
+	    }
+
+	}			/* end for */
+    }				/* end for */
+
+
+    /*last closing */
+    if (a != 0) {
+	if (albero == NULL) {
+	    cc.val.c = precCell;
+	    albero = avl_make(cc, totCorr);
+
+	    if (albero == NULL) {
+		G_fatal_error("avl_make error");
+		return RLI_ERRORE;
+	    }
+	    m++;
+	}
+	else {
+	    cc.val.c = precCell;
+	    ris = avl_add(&albero, cc, totCorr);
+	    switch (ris) {
+	    case AVL_ERR:
+		{
+		    G_fatal_error("avl_add error");
+		    return RLI_ERRORE;
+		}
+	    case AVL_ADD:
+		{
+		    m++;
+		    break;
+		}
+	    case AVL_PRES:
+		{
+		    break;
+		}
+	    default:
+		{
+		    G_fatal_error("avl_add unknown error");
+		    return RLI_ERRORE;
+		}
+	    }
+	}
+    }
+
+    array = G_malloc(m * sizeof(AVL_tableRow));
+    if (array == NULL) {
+	G_fatal_error("malloc array failed");
+	return RLI_ERRORE;
+    }
+    tot = avl_to_array(albero, zero, array);
+
+    if (tot != m) {
+	G_warning("avl_to_array unaspected value. the result could be wrong");
+	return RLI_ERRORE;
+    }
+
+    array_copy = G_malloc(m * sizeof(AVL_tableRow));
+    for (i = 0; i < m; i++) {
+	cc_passage = array[i]->k;
+	array_copy[i] = cc_passage.val.c;
+    }
+
+    qsort(array_copy, m, sizeof(int), cmp);
+
+    for (i = 1; i < m; i++) {
+	if (array_copy[i - 1] != array_copy[i]) {
+	    totNumClass++;
+	}
+    }
+
+    /* calculate summary */
+    for (i = 0; i < m; i++) {
+	t = (double)array[i]->tot;
+	percentuale = (double)(t / area);
+	logaritmo = (double)log(percentuale);
+	somma = somma + (percentuale * logaritmo);
+    }
+
+    logTotNumClass = (double)log(totNumClass);
+    /*if a is 0, that is all cell are null, i put index=-1 */
+    if (a != 0) {
+	indice = ((-1) * somma) / logTotNumClass;
+    }
+    else {
+	indice = (double)(-1);
+    }
+
+    if (isnan(indice) || isinf(indice)) {
+	indice = -1;
+    }
+    G_debug(1, "somma: %g, number of logTotNumClass: %g, valore finale: %g",
+	    somma, logTotNumClass, indice);
+
+    *result = indice;
+
+    G_free(array);
+    if (masked) {
+	G_free(mask_buf);
+    }
+
+    return RLI_OK;
+}
+
+
+
+int calculateD(int fd, area_des ad, double *result)
+{
+
+    DCELL *buf;
+    DCELL corrCell;
+    DCELL precCell;
+
+    int i, j;
+    int mask_fd = -1, *mask_buf;
+    int ris = 0;
+    int masked = FALSE;
+    int a = 0;			/* a=0 if all cells are null */
+
+    long m = 0;
+    long tot = 0;
+    long zero = 0;
+    long totCorr = 0;
+
+    double indice = 0;
+    double somma = 0;
+    double percentuale = 0;
+    double area = 0;
+    double t;
+    double logaritmo;
+
+    /*add to compute the number of class */
+    long *array_copy;
+    int totNumClass = 1;
+    double logTotNumClass;
+
+    avl_tree albero = NULL;
+
+    AVL_table *array;
+
+    generic_cell cc;
+    generic_cell cc_passage;	/*add to compute the number of class */
+    cc.t = DCELL_TYPE;
+
+    /* open mask if needed */
+    if (ad->mask == 1) {
+	if ((mask_fd = open(ad->mask_name, O_RDONLY, 0755)) < 0)
+	    return RLI_ERRORE;
+	mask_buf = G_malloc(ad->cl * sizeof(int));
+	if (mask_buf == NULL) {
+	    G_fatal_error("malloc mask_buf failed");
+	    return RLI_ERRORE;
+	}
+	masked = TRUE;
+    }
+
+
+    Rast_set_d_null_value(&precCell, 1);
+
+    /*for each row */
+    for (j = 0; j < ad->rl; j++) {
+	buf = RLI_get_dcell_raster_row(fd, j + ad->y, ad);
+
+
+	if (masked) {
+	    if (read(mask_fd, mask_buf, (ad->cl * sizeof(int))) < 0) {
+		G_fatal_error("mask read failed");
+		return RLI_ERRORE;
+	    }
+	}
+
+
+	for (i = 0; i < ad->cl; i++) {	/* for each dcell in the row */
+	    area++;
+	    corrCell = buf[i + ad->x];
+
+	    if (masked && mask_buf[i + ad->x] == 0) {
+		Rast_set_d_null_value(&corrCell, 1);
+		area--;
+	    }
+
+	    if (!(Rast_is_null_value(&corrCell, DCELL_TYPE))) {
+		a = 1;
+		if (Rast_is_null_value(&precCell, DCELL_TYPE)) {
+		    precCell = corrCell;
+		}
+		if (corrCell != precCell) {
+		    if (albero == NULL) {
+			cc.val.dc = precCell;
+			albero = avl_make(cc, totCorr);
+			if (albero == NULL) {
+			    G_fatal_error("avl_make error");
+			    return RLI_ERRORE;
+			}
+			m++;
+		    }
+		    else {
+			cc.val.dc = precCell;
+			ris = avl_add(&albero, cc, totCorr);
+			switch (ris) {
+			case AVL_ERR:
+			    {
+				G_fatal_error("avl_add error");
+				return RLI_ERRORE;
+			    }
+			case AVL_ADD:
+			    {
+				m++;
+				break;
+			    }
+			case AVL_PRES:
+			    {
+				break;
+			    }
+			default:
+			    {
+				G_fatal_error("avl_add unknown error");
+				return RLI_ERRORE;
+			    }
+			}
+		    }
+		    totCorr = 1;
+		}
+		else {
+		    totCorr++;
+		}
+		precCell = corrCell;
+	    }
+
+	}			/*close for */
+    }				/*close for */
+
+    if (masked) {
+	G_free(mask_buf);
+    }
+
+    /*last closing */
+    if (a != 0) {
+	if (albero == NULL) {
+	    cc.val.dc = precCell;
+	    albero = avl_make(cc, totCorr);
+	    if (albero == NULL) {
+		G_fatal_error("avl_make error");
+		return RLI_ERRORE;
+	    }
+	    m++;
+	}
+	else {
+	    cc.val.fc = precCell;
+	    ris = avl_add(&albero, cc, totCorr);
+	    switch (ris) {
+	    case AVL_ERR:
+		{
+		    G_fatal_error("avl_add error");
+		    return RLI_ERRORE;
+		}
+	    case AVL_ADD:
+		{
+		    m++;
+		    break;
+		}
+	    case AVL_PRES:
+		{
+		    break;
+		}
+	    default:
+		{
+		    G_fatal_error("avl_add unknown error");
+		    return RLI_ERRORE;
+		}
+	    }
+	}
+
+
+	array = G_malloc(m * sizeof(AVL_tableRow));
+	if (array == NULL) {
+	    G_fatal_error("malloc array failed");
+	    return RLI_ERRORE;
+	}
+	tot = avl_to_array(albero, zero, array);
+
+	if (tot != m) {
+	    G_warning
+		("avl_to_array unaspected value. the result could be wrong");
+	    return RLI_ERRORE;
+	}
+
+	array_copy = G_malloc(m * sizeof(AVL_tableRow));
+
+	for (i = 0; i < m; i++) {
+	    cc_passage = array[i]->k;
+	    array_copy[i] = cc_passage.val.c;
+	}
+
+	qsort(array_copy, m, sizeof(int), cmp);
+
+	for (i = 1; i < m; i++) {
+	    if (array_copy[i - 1] != array_copy[i]) {
+		totNumClass++;
+	    }
+	}
+
+
+	/* calculate summary */
+	for (i = 0; i < m; i++) {
+	    t = (double)array[i]->tot;
+	    percentuale = (double)(t / area);
+	    logaritmo = (double)log(percentuale);
+	    somma = somma + (percentuale * logaritmo);
+	}
+
+	G_free(array);
+
+	logTotNumClass = (double)log(totNumClass);
+
+	indice = (-1) * somma / logTotNumClass;
+    }
+    else {
+	/*if a is 0, that is all cell are null, i put index=-1 */
+	indice = ((double)(-1));
+    }
+
+    if (isnan(indice) || isinf(indice)) {
+	indice = -1;
+    }
+    G_debug(1, "somma: %g, number of logTotNumClass: %g, valore finale: %g",
+	    somma, logTotNumClass, indice);
+
+    *result = indice;
+
+    return RLI_OK;
+}
+
+
+int calculateF(int fd, area_des ad, double *result)
+{
+
+    FCELL *buf;
+    FCELL corrCell;
+    FCELL precCell;
+
+    int i, j;
+    int mask_fd = -1, *mask_buf;
+    int ris = 0;
+    int masked = FALSE;
+    int a = 0;			/* a=0 if all cells are null */
+
+    long m = 0;
+    long tot = 0;
+    long zero = 0;
+    long totCorr = 0;
+
+    double indice = 0;
+    double somma = 0;
+    double percentuale = 0;
+    double area = 0;
+    double t;
+    double logaritmo;
+    long *array_copy;
+    int totNumClass = 1;
+    double logTotNumClass;
+
+    avl_tree albero = NULL;
+
+    AVL_table *array;
+
+    generic_cell cc;
+    generic_cell cc_passage;
+    cc.t = FCELL_TYPE;
+
+    /* open mask if needed */
+    if (ad->mask == 1) {
+	if ((mask_fd = open(ad->mask_name, O_RDONLY, 0755)) < 0)
+	    return RLI_ERRORE;
+	mask_buf = G_malloc(ad->cl * sizeof(int));
+	if (mask_buf == NULL) {
+	    G_fatal_error("malloc mask_buf failed");
+	    return RLI_ERRORE;
+	}
+	masked = TRUE;
+    }
+
+
+    Rast_set_f_null_value(&precCell, 1);
+
+
+    /*for each row */
+    for (j = 0; j < ad->rl; j++) {
+	buf = RLI_get_fcell_raster_row(fd, j + ad->y, ad);
+
+
+	if (masked) {
+	    if (read(mask_fd, mask_buf, (ad->cl * sizeof(int))) < 0) {
+		G_fatal_error("mask read failed");
+		return RLI_ERRORE;
+	    }
+	}
+
+	for (i = 0; i < ad->cl; i++) {	/* for each fcell in the row */
+	    area++;
+	    corrCell = buf[i + ad->x];
+	    if (masked && mask_buf[i + ad->x] == 0) {
+		Rast_set_f_null_value(&corrCell, 1);
+		area--;
+	    }
+
+	    if (!(Rast_is_null_value(&corrCell, FCELL_TYPE))) {
+		a = 1;
+		if (Rast_is_null_value(&precCell, FCELL_TYPE)) {
+		    precCell = corrCell;
+		}
+		if (corrCell != precCell) {
+		    if (albero == NULL) {
+			cc.val.fc = precCell;
+			albero = avl_make(cc, totCorr);
+			if (albero == NULL) {
+			    G_fatal_error("avl_make error");
+			    return RLI_ERRORE;
+			}
+			m++;
+		    }
+		    else {
+			cc.val.fc = precCell;
+			ris = avl_add(&albero, cc, totCorr);
+			switch (ris) {
+			case AVL_ERR:
+			    {
+				G_fatal_error("avl_add error");
+				return RLI_ERRORE;
+			    }
+			case AVL_ADD:
+			    {
+				m++;
+				break;
+			    }
+			case AVL_PRES:
+			    {
+				break;
+			    }
+			default:
+			    {
+				G_fatal_error("avl_add unknown error");
+				return RLI_ERRORE;
+			    }
+			}
+		    }
+		    totCorr = 1;
+		}
+		else {
+		    totCorr++;
+		}
+
+		precCell = corrCell;
+	    }
+
+	}
+    }
+
+
+    /*last closing */
+    if (a != 0) {
+	if (albero == NULL) {
+	    cc.val.fc = precCell;
+	    albero = avl_make(cc, totCorr);
+	    if (albero == NULL) {
+		G_fatal_error("avl_make error");
+		return RLI_ERRORE;
+	    }
+	    m++;
+	}
+	else {
+	    cc.val.fc = precCell;
+	    ris = avl_add(&albero, cc, totCorr);
+	    switch (ris) {
+	    case AVL_ERR:
+		{
+		    G_fatal_error("avl_add error");
+		    return RLI_ERRORE;
+		}
+	    case AVL_ADD:
+		{
+		    m++;
+		    break;
+		}
+	    case AVL_PRES:
+		{
+		    break;
+		}
+	    default:
+		{
+		    G_fatal_error("avl_add unknown error");
+		    return RLI_ERRORE;
+		}
+	    }
+	}
+    }
+
+    array = G_malloc(m * sizeof(AVL_tableRow));
+    if (array == NULL) {
+	G_fatal_error("malloc array failed");
+	return RLI_ERRORE;
+    }
+    tot = avl_to_array(albero, zero, array);
+
+    if (tot != m) {
+	G_warning("avl_to_array unaspected value. the result could be wrong");
+	return RLI_ERRORE;
+    }
+
+    array_copy = G_malloc(m * sizeof(AVL_tableRow));
+
+    for (i = 0; i < m; i++) {
+	cc_passage = array[i]->k;
+	array_copy[i] = cc_passage.val.c;
+    }
+
+    qsort(array_copy, m, sizeof(int), cmp);
+
+    for (i = 1; i < m; i++) {
+	if (array_copy[i - 1] != array_copy[i]) {
+	    totNumClass++;
+	}
+    }
+
+    /* calculate summary */
+    for (i = 0; i < m; i++) {
+	t = (double)array[i]->tot;
+	percentuale = (double)(t / area);
+	logaritmo = (double)log(percentuale);
+	somma = somma + (percentuale * logaritmo);
+    }
+
+    logTotNumClass = (double)log(totNumClass);
+
+
+    /*if a is 0, that is all cell are null, i put index=-1 */
+    if (a != 0) {
+	indice = ((-1) * somma) / logTotNumClass;
+    }
+    else {
+	indice = (double)(-1);
+    }
+
+    if (isnan(indice) || isinf(indice)) {
+	indice = -1;
+    }
+    G_debug(1, "somma: %g, number of logTotNumClass: %g, valore finale: %g",
+	    somma, logTotNumClass, indice);
+
+    *result = indice;
+
+    G_free(array);
+    if (masked) {
+	G_free(mask_buf);
+    }
+    return RLI_OK;
+}


Property changes on: grass/trunk/raster/r.li/r.li.pielou/pielou.c
___________________________________________________________________
Added: svn:mime-type
   + text/x-csrc
Added: svn:eol-style
   + native

Added: grass/trunk/raster/r.li/r.li.pielou/r.li.pielou.html
===================================================================
--- grass/trunk/raster/r.li/r.li.pielou/r.li.pielou.html	                        (rev 0)
+++ grass/trunk/raster/r.li/r.li.pielou/r.li.pielou.html	2010-11-26 13:29:14 UTC (rev 44428)
@@ -0,0 +1,51 @@
+<h2>DESCRIPTION</h2>
+
+<em>r.li.pielou</em>  calculates the "pielou's diversity index" as: <br>
+<img src="r_li_pielou.png"><br>
+with:
+<ul>
+  <li><b>J</b>: Pielou eveness index</li>
+  <li><b>H'</b>: Shannon index</li>
+  <li><b>S</b>: number of classes</li>
+</ul>
+
+<h2>NOTES</h2>
+Do not use absolute path names for output files. They are raster if
+moving window disposition was selected, otherwise they are in
+<tt>~/.r.li/output/</tt> folder.
+<br>
+If the input raster contains NULL value cells, <em>r.li.pielou</em>
+returns -1 for these cells. <br>
+If you want to keep NULL values instead, run subsequently on the resulting map:
+<br>
+<div class="code"><pre>
+r.null setnull=-1 map=my_map
+</pre></div>
+
+<h2>EXAMPLES</h2>
+To calculate Pielou's diversity index on the map "my_map", using the
+previously created "my_conf" configuration file (<em>r.li.setup</em>)
+and saving results in "my_out" raster map, run:<br>
+<div class="code"><pre>
+r.li.pielou map=my_map conf=my_conf output=my_out
+</pre></div>
+
+
+<h2>REFERENCES</h2>
+McGarigal, K., and B. J. Marks. 1995. FRAGSTATS: spatial pattern
+analysis program for quantifying landscape structure. USDA For. Serv.
+Gen. Tech. Rep. PNW-351. (<a href="http://treesearch.fs.fed.us/pubs/3064">PDF</a>)
+
+
+<h2>SEE ALSO</h2>
+<em>
+<a href="r.li.html">r.li</a>,
+<a href="r.li.setup.html">r.li.setup</a>
+</em>
+
+<h2>AUTHORS</h2>
+Luca Delucchi and Duccio Rocchini, Fondazione E. Mach (Italy), based on the <em>r.li.shannon</em> code
+developed by Serena Pallecchi student of Computer Science University of Pisa (Italy).<br>
+
+<p><i>Last changed: $Date$</i>
+


Property changes on: grass/trunk/raster/r.li/r.li.pielou/r.li.pielou.html
___________________________________________________________________
Added: svn:mime-type
   + text/html
Added: svn:keywords
   + Author Date Id
Added: svn:eol-style
   + native

Added: grass/trunk/raster/r.li/r.li.renyi/Makefile
===================================================================
--- grass/trunk/raster/r.li/r.li.renyi/Makefile	                        (rev 0)
+++ grass/trunk/raster/r.li/r.li.renyi/Makefile	2010-11-26 13:29:14 UTC (rev 44428)
@@ -0,0 +1,13 @@
+MODULE_TOPDIR = ../../..
+
+PGM = r.li.renyi
+
+EXTRA_CLEAN_DIRS=doxygenhtml
+
+LIBES = $(RLILIB) $(RASTERLIB) $(GISLIB)
+
+DEPENDENCIES = $(RLIDEP) $(RASTERDEP) $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd


Property changes on: grass/trunk/raster/r.li/r.li.renyi/Makefile
___________________________________________________________________
Added: svn:mime-type
   + text/x-makefile
Added: svn:eol-style
   + native

Added: grass/trunk/raster/r.li/r.li.renyi/r.li.renyi.html
===================================================================
--- grass/trunk/raster/r.li/r.li.renyi/r.li.renyi.html	                        (rev 0)
+++ grass/trunk/raster/r.li/r.li.renyi/r.li.renyi.html	2010-11-26 13:29:14 UTC (rev 44428)
@@ -0,0 +1,63 @@
+<h2>DESCRIPTION</h2>
+<em>r.li.renyi</em> 
+calculates the "renyi's diversity index" as:<br>
+<img src="r_li_renyi.png"> <br>
+with: <br>
+<ul>
+  <li><b>H</b>: Renyi entropy</li>
+  <li><b>alpha</b>: order of the generalized entropy</li>
+  <li><b>i</b>: ith class</li>
+  <li><b>S</b>: number of classes</li>
+  <li><b>p<small>i</small></b>: proportion of the landscape occupied by class i</li>
+</ul>
+
+<h2>NOTES</h2>
+Do not use absolute path names for output files. They are raster if
+moving window disposition was selected, otherwise they are in
+<tt>~/.r.li/output/</tt> folder.
+<br>
+If the input raster contains NULL value cells, <em>r.li.renyi</em>
+returns -1 for these cells. <br>
+If you want to keep NULL values instead, run subsequently on the resulting map:
+<br>
+<div class="code"><pre>
+r.null setnull=-1 map=my_map
+</pre></div>
+
+<h2>EXAMPLES</h2>
+To calculate Renyi's diversity index on map "my_map", using the
+previously created "my_conf" configuration file (<em>r.li.setup</em>)
+and saving results in "my_out" raster map, run:<br>
+<div class="code"><pre>
+r.li.renyi map=my_map conf=my_conf output=my_out alpha=0.6
+</pre></div>
+
+<h2>NOTES</h2>
+Do not use absolute path names for output files. They are raster if
+moving window disposition was selected, otherwise they are in
+~/.r.li/output folder. <br>
+
+If input raster is full of null values <em>r.li.renyi</em> returns -1.<br>
+If you want to have null values instead run <br>
+<div class="code"><pre>
+r.null setnull=-1 map=my_map
+</pre></div>
+after index calculation.
+
+<h2>REFERENCES</h2>
+McGarigal, K., and B. J. Marks. 1995. FRAGSTATS: spatial pattern
+analysis program for quantifying landscape structure. USDA For. Serv.
+Gen. Tech. Rep. PNW-351. (<a href="http://treesearch.fs.fed.us/pubs/3064">PDF</a>)
+
+<h2>SEE ALSO</h2>
+<em>
+<a href="r.li.html">r.li</a>,
+<a href="r.li.setup.html">r.li.setup</a>
+</em>
+
+<h2>AUTHORS</h2>
+Luca Delucchi and Duccio Rocchini, Fondazione E. Mach (Italy), based on the <em>r.li.shannon</em> code
+developed by Serena Pallecchi student of Computer Science University of Pisa (Italy).<br>
+
+<p><i>Last changed: $Date$</i>
+


Property changes on: grass/trunk/raster/r.li/r.li.renyi/r.li.renyi.html
___________________________________________________________________
Added: svn:mime-type
   + text/html
Added: svn:keywords
   + Author Date Id
Added: svn:eol-style
   + native

Added: grass/trunk/raster/r.li/r.li.renyi/renyi.c
===================================================================
--- grass/trunk/raster/r.li/r.li.renyi/renyi.c	                        (rev 0)
+++ grass/trunk/raster/r.li/r.li.renyi/renyi.c	2010-11-26 13:29:14 UTC (rev 44428)
@@ -0,0 +1,726 @@
+
+/****************************************************************************
+ *
+ * MODULE:	r.li.renyi
+ *
+ * PURPOSE:	brief calculates renyi's diversity index
+ *
+ * AUTHOR(S):	Luca Delucchi, Fondazione Edmund Mach         
+ *		Serena Pallecchi student of Computer Science University of Pisa (Italy)
+ *            	
+ * COPYRIGHT:
+ *		This program is free software under the GPL (>=v2)
+ *		Read the COPYING file that comes with GRASS for details.
+ *
+ ***************************************************************************/
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "../r.li.daemon/defs.h"
+#include "../r.li.daemon/avlDefs.h"
+#include "../r.li.daemon/avl.h"
+#include "../r.li.daemon/daemon.h"
+
+double calculate(area_des ad, int fd, char **par, double *result);
+
+double calculateD(area_des ad, int fd, char **par, double *result);
+
+double calculateF(area_des ad, int fd, char **par, double *result);
+
+int main(int argc, char *argv[])
+{
+    struct Option *raster, *conf, *output, *alpha;
+    struct GModule *module;
+    char **par = NULL;
+
+    G_gisinit(argv[0]);
+    module = G_define_module();
+    module->description =
+	_("Calculates Renyi's diversity index on a raster map");
+    G_add_keyword(_("raster"));
+    G_add_keyword(_("landscape structure analysis"));
+    G_add_keyword(_("diversity index"));
+
+    /* define options */
+
+    raster = G_define_standard_option(G_OPT_R_INPUT);
+
+    conf = G_define_option();
+    conf->key = "conf";
+    conf->description = _("Configuration file");
+    conf->gisprompt = "old_file,file,input";
+    conf->type = TYPE_STRING;
+    conf->required = YES;
+
+    alpha = G_define_option();
+    alpha->key = "alpha";
+    alpha->description =
+	_("Alpha value is the order of the generalized entropy");
+    alpha->type = TYPE_STRING;
+    alpha->required = YES;
+
+    output = G_define_standard_option(G_OPT_R_OUTPUT);
+
+    if (G_parser(argc, argv))
+	exit(EXIT_FAILURE);
+
+    if (atoi(alpha->answer) == 1) {
+	G_fatal_error
+	    ("If alpha = 1 Renyi index is not defined. (Ricotta et al., 2003, Environ. Model. Softw.)");
+	exit(RLI_ERRORE);
+    }
+    else if (atof(alpha->answer) < 0.) {
+	G_fatal_error
+	    ("Alpha must be > 0 otherwise Renyi index is not defined. (Ricotta et al., 2003, Environ. Model. Softw.)");
+	exit(RLI_ERRORE);
+    }
+    else {
+	par = &alpha->answer;
+    }
+    return calculateIndex(conf->answer, renyi, par, raster->answer,
+			  output->answer);
+
+}
+
+int renyi(int fd, char **par, area_des ad, double *result)
+{
+
+    int ris = RLI_OK;
+    double indice = 0;
+    struct Cell_head hd;
+
+    Rast_get_cellhd(ad->raster, "", &hd);
+
+    switch (ad->data_type) {
+    case CELL_TYPE:
+	{
+	    ris = calculate(ad, fd, par, &indice);
+	    break;
+	}
+    case DCELL_TYPE:
+	{
+	    ris = calculateD(ad, fd, par, &indice);
+	    break;
+	}
+    case FCELL_TYPE:
+	{
+	    ris = calculateF(ad, fd, par, &indice);
+	    break;
+	}
+    default:
+	{
+	    G_fatal_error("data type unknown");
+	    return RLI_ERRORE;
+	}
+
+    }
+
+    if (ris != RLI_OK)
+	return RLI_ERRORE;
+
+    *result = indice;
+
+    return RLI_OK;
+
+}
+
+
+
+double calculate(area_des ad, int fd, char **par, double *result)
+{
+
+    CELL *buf;
+    CELL corrCell;
+    CELL precCell;
+
+    int i, j;
+    int mask_fd = -1, *mask_buf;
+    int ris = 0;
+    int masked = FALSE;
+    int a = 0;			/* a=0 if all cells are null */
+
+    long m = 0;
+    long tot = 0;
+    long zero = 0;
+    long totCorr = 0;
+
+    double indice = 0;
+    double somma = 0;
+    double p = 0;
+    double area = 0;
+    double t;
+
+    avl_tree albero = NULL;
+
+    AVL_table *array;
+    generic_cell uc;
+    uc.t = CELL_TYPE;
+
+    /* open mask if needed */
+    if (ad->mask == 1) {
+	if ((mask_fd = open(ad->mask_name, O_RDONLY, 0755)) < 0)
+	    return RLI_ERRORE;
+	mask_buf = G_malloc(ad->cl * sizeof(int));
+	if (mask_buf == NULL) {
+	    G_fatal_error("malloc mask_buf failed");
+	    return RLI_ERRORE;
+	}
+	masked = TRUE;
+    }
+
+
+    Rast_set_c_null_value(&precCell, 1);
+
+
+    for (j = 0; j < ad->rl; j++) {	/* for each row */
+	if (masked) {
+	    if (read(mask_fd, mask_buf, (ad->cl * sizeof(int))) < 0) {
+		G_fatal_error("mask read failed");
+		return RLI_ERRORE;
+	    }
+	}
+
+	buf = RLI_get_cell_raster_row(fd, j + ad->y, ad);
+	for (i = 0; i < ad->cl; i++) {	/* for each cell in the row */
+	    area++;
+	    corrCell = buf[i + ad->x];
+
+	    if ((masked) && (mask_buf[i + ad->x] == 0)) {
+		Rast_set_c_null_value(&corrCell, 1);
+		area--;
+	    }
+
+	    if (!(Rast_is_null_value(&corrCell, uc.t))) {
+		a = 1;
+		if (Rast_is_null_value(&precCell, uc.t)) {
+		    precCell = corrCell;
+		}
+
+		if (corrCell != precCell) {
+		    if (albero == NULL) {
+			uc.val.c = precCell;
+			albero = avl_make(uc, totCorr);
+			if (albero == NULL) {
+			    G_fatal_error("avl_make error");
+			    return RLI_ERRORE;
+			}
+			else
+			    m++;
+		    }
+		    else {
+			uc.val.c = precCell;
+			ris = avl_add(&albero, uc, totCorr);
+			switch (ris) {
+			case AVL_ERR:
+			    {
+				G_fatal_error("avl_add error");
+				return RLI_ERRORE;
+			    }
+			case AVL_ADD:
+			    {
+				m++;
+				break;
+			    }
+			case AVL_PRES:
+			    {
+				break;
+			    }
+			default:
+			    {
+				G_fatal_error("avl_make unknown error");
+				return RLI_ERRORE;
+			    }
+			}
+		    }
+		    totCorr = 1;
+		}		/* endif not equal cells */
+		else {		/*equal cells */
+
+		    totCorr++;
+		}
+		precCell = corrCell;
+	    }
+
+	}
+    }
+
+    /*last closing */
+    if (a != 0) {
+	if (albero == NULL) {
+	    uc.val.c = precCell;
+	    albero = avl_make(uc, totCorr);
+	    if (albero == NULL) {
+		G_fatal_error("avl_make error");
+		return RLI_ERRORE;
+	    }
+	    m++;
+	}
+	else {
+	    uc.val.c = precCell;
+	    ris = avl_add(&albero, uc, totCorr);
+	    switch (ris) {
+	    case AVL_ERR:
+		{
+		    G_fatal_error("avl_add error");
+		    return RLI_ERRORE;
+		}
+	    case AVL_ADD:
+		{
+		    m++;
+		    break;
+		}
+	    case AVL_PRES:
+		{
+		    break;
+		}
+	    default:
+		{
+		    G_fatal_error("avl_add unknown error");
+		    return RLI_ERRORE;
+		}
+	    }
+	}
+    }
+    array = G_malloc(m * sizeof(AVL_tableRow));
+    if (array == NULL) {
+	G_fatal_error("malloc array failed");
+	return RLI_ERRORE;
+    }
+    tot = avl_to_array(albero, zero, array);
+    if (tot != m) {
+	G_warning("avl_to_array unaspected value. the result could be wrong");
+	return RLI_ERRORE;
+    }
+
+    char *sval;
+
+    sval = par[0];
+    double alpha_double;
+
+    alpha_double = (double)atof(sval);
+    /* claculate index summary */
+    for (i = 0; i < m; i++) {
+	t = (double)(array[i]->tot);
+	p = t / area;
+	G_debug(1,"Valore p: %g, valore pow: %g",p,pow(p,alpha_double));
+	somma = somma + pow(p, alpha_double);
+    }
+
+    indice = (1 / (1 - alpha_double)) * log(somma);
+    if (isnan(indice) || isinf(indice)) {
+	indice = -1;
+    }
+    G_debug(1, "Valore somma: %g Valore indice: %g", somma, indice);
+
+    *result = indice;
+
+
+    G_free(array);
+    if (masked)
+	G_free(mask_buf);
+
+    return RLI_OK;
+}
+
+
+double calculateD(area_des ad, int fd, char **par, double *result)
+{
+    DCELL *buf;
+    DCELL corrCell;
+    DCELL precCell;
+
+    int i, j;
+    int mask_fd = -1, *mask_buf;
+    int ris = 0;
+    int masked = FALSE;
+    int a = 0;			/* a=0 if all cells are null */
+    long m = 0;
+    long tot = 0;
+    long zero = 0;
+    long totCorr = 0;
+    double indice = 0;
+    double somma = 0;
+    double p = 0;
+    double area = 0;
+    double t;
+
+    avl_tree albero = NULL;
+    AVL_table *array;
+    generic_cell uc;
+    uc.t = DCELL_TYPE;
+
+    /* open mask if needed */
+    if (ad->mask == 1) {
+	if ((mask_fd = open(ad->mask_name, O_RDONLY, 0755)) < 0)
+	    return RLI_ERRORE;
+	mask_buf = G_malloc(ad->cl * sizeof(int));
+	if (mask_buf == NULL) {
+	    G_fatal_error("malloc mask_buffailed");
+	    return RLI_ERRORE;
+	}
+	masked = TRUE;
+    }
+
+    Rast_set_d_null_value(&precCell, 1);
+
+    for (j = 0; j < ad->rl; j++) {	/* for each row */
+	if (masked) {
+	    if (read(mask_fd, mask_buf, (ad->cl * sizeof(int))) < 0) {
+		G_fatal_error("mask read failed");
+		return RLI_ERRORE;
+	    }
+	}
+
+	buf = RLI_get_dcell_raster_row(fd, j + ad->y, ad);
+
+	for (i = 0; i < ad->cl; i++) {	/* for each dcell in the row */
+	    area++;
+	    corrCell = buf[i + ad->x];
+
+	    if (masked && mask_buf[i + ad->x] == 0) {
+		Rast_set_d_null_value(&corrCell, 1);
+		area--;
+	    }
+
+	    if (!(Rast_is_null_value(&corrCell, uc.t))) {
+		a = 1;
+
+		if (Rast_is_null_value(&precCell, uc.t)) {
+		    precCell = corrCell;
+		}
+		if (corrCell != precCell) {
+		    if (albero == NULL) {
+			uc.val.dc = precCell;
+			albero = avl_make(uc, totCorr);
+			if (albero == NULL) {
+			    G_fatal_error("avl_make error");
+			    return RLI_ERRORE;
+			}
+			m++;
+		    }
+		    else {
+			uc.val.dc = precCell;
+			ris = avl_add(&albero, uc, totCorr);
+			switch (ris) {
+			case AVL_ERR:
+			    {
+				G_fatal_error("avl_add error");
+				return RLI_ERRORE;
+			    }
+			case AVL_ADD:
+			    {
+				m++;
+				break;
+			    }
+			case AVL_PRES:
+			    {
+				break;
+			    }
+			default:
+			    {
+				G_fatal_error("avl_make unknown error");
+				return RLI_ERRORE;
+			    }
+			}
+		    }
+		    totCorr = 1;
+		}		/* endif not equal dcells */
+		else {		/*equal dcells */
+
+		    totCorr++;
+		}
+		precCell = corrCell;
+	    }
+
+
+	}
+    }
+
+    /*last closing */
+    if (a != 0) {
+	if (albero == NULL) {
+	    uc.val.dc = precCell;
+	    albero = avl_make(uc, totCorr);
+	    if (albero == NULL) {
+		G_fatal_error("avl_make error");
+		return RLI_ERRORE;
+	    }
+	    m++;
+	}
+	else {
+	    uc.val.dc = precCell;
+	    ris = avl_add(&albero, uc, totCorr);
+	    switch (ris) {
+	    case AVL_ERR:
+		{
+		    G_fatal_error("avl_add error");
+		    return RLI_ERRORE;
+		}
+	    case AVL_ADD:
+		{
+		    m++;
+		    break;
+		}
+	    case AVL_PRES:
+		{
+		    break;
+		}
+	    default:
+		{
+		    G_fatal_error("avl_add unknown error");
+		    return RLI_ERRORE;
+		}
+	    }
+	}
+    }
+
+    array = G_malloc(m * sizeof(AVL_tableRow));
+    if (array == NULL) {
+	G_fatal_error("malloc array failed");
+	return RLI_ERRORE;
+    }
+    tot = avl_to_array(albero, zero, array);
+
+    if (tot != m) {
+	G_warning("avl_to_array unaspected value. the result could be wrong");
+	return RLI_ERRORE;
+    }
+
+    char *sval;
+
+    sval = par[0];
+    double alpha_double;
+
+    alpha_double = (double)atof(sval);
+    /* claculate index summary */
+    for (i = 0; i < m; i++) {
+	t = (double)(array[i]->tot);
+	p = t / area;
+	G_debug(1,"Valore p: %g, valore pow: %g",p,pow(p,alpha_double));
+	somma = somma + pow(p, alpha_double);
+    }
+
+    indice = (1 / (1 - alpha_double)) * log(somma);
+
+    if (isnan(indice) || isinf(indice)) {
+	indice = -1;
+    }
+
+    G_debug(1, "Valore somma: %g Valore indice: %g", somma, indice);
+
+    *result = indice;
+
+    G_free(array);
+    if (masked)
+	G_free(mask_buf);
+
+    return RLI_OK;
+}
+
+
+
+double calculateF(area_des ad, int fd, char **par, double *result)
+{
+    FCELL *buf;
+    FCELL corrCell;
+    FCELL precCell;
+
+    int i, j;
+    int mask_fd = -1, *mask_buf;
+    int ris = 0;
+    int masked = FALSE;
+    int a = 0;			/* a=0 if all cells are null */
+
+    long m = 0;
+    long tot = 0;
+    long zero = 0;
+    long totCorr = 0;
+
+    double indice = 0;
+    double somma = 0;
+    double p = 0;
+    double area = 0;
+    double t;
+
+    avl_tree albero = NULL;
+
+    AVL_table *array;
+    generic_cell uc;
+    uc.t = FCELL_TYPE;
+
+    /* open mask if needed */
+    if (ad->mask == 1) {
+	if ((mask_fd = open(ad->mask_name, O_RDONLY, 0755)) < 0)
+	    return RLI_ERRORE;
+	mask_buf = G_malloc(ad->cl * sizeof(int));
+	if (mask_buf == NULL) {
+	    G_fatal_error("malloc mask_buf failed");
+	    return RLI_ERRORE;
+	}
+	masked = TRUE;
+    }
+
+    Rast_set_f_null_value(&precCell, 1);
+
+
+    for (j = 0; j < ad->rl; j++) {	/* for each row */
+	if (masked) {
+	    if (read(mask_fd, mask_buf, (ad->cl * sizeof(int))) < 0) {
+		G_fatal_error("mask read failed");
+		return RLI_ERRORE;
+	    }
+	}
+
+	buf = RLI_get_fcell_raster_row(fd, j + ad->y, ad);
+
+
+	for (i = 0; i < ad->cl; i++) {	/* for each fcell in the row */
+
+	    area++;
+	    corrCell = buf[i + ad->x];
+
+	    if (masked && mask_buf[i + ad->x] == 0) {
+		Rast_set_f_null_value(&corrCell, 1);
+		area--;
+	    }
+
+	    if (!(Rast_is_null_value(&corrCell, uc.t))) {
+		a = 1;
+		if (Rast_is_null_value(&precCell, uc.t)) {
+		    precCell = corrCell;
+		}
+		if (corrCell != precCell) {
+		    if (albero == NULL) {
+			uc.val.fc = precCell;
+			albero = avl_make(uc, totCorr);
+			if (albero == NULL) {
+			    G_fatal_error("avl_make error");
+			    return RLI_ERRORE;
+			}
+			m++;
+		    }
+		    else {
+			uc.val.fc = precCell;
+			ris = avl_add(&albero, uc, totCorr);
+			switch (ris) {
+			case AVL_ERR:
+			    {
+				G_fatal_error("avl_add error");
+				return RLI_ERRORE;
+			    }
+			case AVL_ADD:
+			    {
+				m++;
+				break;
+			    }
+			case AVL_PRES:
+			    {
+				break;
+			    }
+			default:
+			    {
+				G_fatal_error("avl_make unknown error");
+				return RLI_ERRORE;
+			    }
+			}
+		    }
+		    totCorr = 1;
+		}		/* endif not equal fcells */
+		else {		/*equal fcells */
+
+		    totCorr++;
+		}
+		precCell = corrCell;
+	    }
+
+
+	}
+    }
+
+    /*last closing */
+    if (a != 0) {
+	if (albero == NULL) {
+	    uc.val.fc = precCell;
+	    albero = avl_make(uc, totCorr);
+	    if (albero == NULL) {
+		G_fatal_error("avl_make error");
+		return RLI_ERRORE;
+	    }
+	    m++;
+	}
+	else {
+	    uc.val.fc = precCell;
+	    ris = avl_add(&albero, uc, totCorr);
+	    switch (ris) {
+	    case AVL_ERR:
+		{
+		    G_fatal_error("avl_add error");
+		    return RLI_ERRORE;
+		}
+	    case AVL_ADD:
+		{
+		    m++;
+		    break;
+		}
+	    case AVL_PRES:
+		{
+		    break;
+		}
+	    default:
+		{
+		    G_fatal_error("avl_add unknown error");
+		    return RLI_ERRORE;
+		}
+	    }
+	}
+    }
+
+    array = G_malloc(m * sizeof(AVL_tableRow));
+    if (array == NULL) {
+	G_fatal_error("malloc array failed");
+	return RLI_ERRORE;
+    }
+    tot = avl_to_array(albero, zero, array);
+
+    if (tot != m) {
+	G_warning("avl_to_array unaspected value. the result could be wrong");
+	return RLI_ERRORE;
+    }
+
+    char *sval;
+
+    sval = par[0];
+    double alpha_double;
+
+    alpha_double = (double)atof(sval);
+    /* calculate index summary */
+    for (i = 0; i < m; i++) {
+	t = (double)(array[i]->tot);
+	p = t / area;
+	G_debug(1,"Valore p: %g, valore pow: %g",p,pow(p,alpha_double));        
+	somma = somma + pow(p, alpha_double);
+    }
+
+    indice = (1 / (1 - alpha_double)) * log(somma);
+
+    if (isnan(indice) || isinf(indice)) {
+	indice = -1;
+    }
+
+    G_debug(1, "Valore somma: %g Valore indice: %g", somma, indice);
+
+    *result = indice;
+
+
+    G_free(array);
+    if (masked)
+	G_free(mask_buf);
+
+    return RLI_OK;
+
+}


Property changes on: grass/trunk/raster/r.li/r.li.renyi/renyi.c
___________________________________________________________________
Added: svn:mime-type
   + text/x-csrc
Added: svn:eol-style
   + native



More information about the grass-commit mailing list