eg_dijkstra.h

Go to the documentation of this file.
00001 /* EGlib "Efficient General Library" provides some basic structures and
00002  * algorithms commons in many optimization algorithms.
00003  *
00004  * Copyright (C) 2005 Daniel Espinoza and Marcos Goycoolea.
00005  * 
00006  * This library is free software; you can redistribute it and/or modify it
00007  * under the terms of the GNU Lesser General Public License as published by the
00008  * Free Software Foundation; either version 2.1 of the License, or (at your
00009  * option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful, but 
00012  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
00013  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public 
00014  * License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public License
00017  * along with this library; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
00019  * */
00020 #ifndef _EGDIJKSTRA
00021 #define _EGDIJKSTRA
00022 
00023 #include<stdio.h>
00024 #include<limits.h>
00025 
00026 #include "eg_mempool.h"
00027 #include "eg_macros.h"
00028 #include "eg_heap.h"
00029 #include "eg_list.h"
00030 #include "eg_dgraph.h"
00031 
00032 #define EG_DIJ_DIST       0
00033 #define EG_DIJ_NDIST      1
00034 #define EG_DIJ_FATHER     2
00035 #define EG_DIJ_MARKER     3
00036 #define EG_DIJ_HCONNECTOR 4
00037 #define EG_DIJ_ELENGTH    5
00038 
00039 /* ========================================================================= */
00040 /* Here we define what kind of cost type to use, there are several choices, as
00041  * default we use double */
00042 #ifndef EG_DIJKSTRA_COST_TYPE
00043 #define EG_DIJKSTRA_COST_TYPE FP25_TYPE
00044 #endif
00045 
00046 #if EG_DIJKSTRA_COST_TYPE != EG_HEAP_COST_TYPE
00047 #warning Dijkstra cost type is different than heap cost type.
00048 #endif
00049 
00050 /* ========================================================================= */
00051 /* case the cost is any of the internal types */
00052 #if EG_DIJKSTRA_COST_TYPE == DBL_TYPE
00053 typedef double EGdijkstraCost_t;
00054 #endif
00055 #if EG_DIJKSTRA_COST_TYPE == FLT_TYPE
00056 typedef float EGdijkstraCost_t;
00057 #endif
00058 #if EG_DIJKSTRA_COST_TYPE == INT_TYPE
00059 typedef int EGdijkstraCost_t;
00060 #endif
00061 #if ( (EG_DIJKSTRA_COST_TYPE == DBL_TYPE) || (EG_DIJKSTRA_COST_TYPE == FLT_TYPE)\
00062   || (EG_DIJKSTRA_COST_TYPE == INT_TYPE) )
00063 #define EGdijkstraCostAdd(a,b) ((a)+(b))
00064 #define EGdijkstraCostSub(a,b) ((a)-(b))
00065 #define EGdijkstraCostIsLess(a,b) ((a)<(b))
00066 #define EGdijkstraCostDiv(a,b) ((a)/(b))
00067 #define EGdijkstraCostMul(a,b) ((a)*(b))
00068 #define EGdijkstraCostToLf(a) ((double)a)
00069 #define EGdijkstraCostMinus(a) (-1*a)
00070 #define EGdijkstraToCost(a) ((EGdijkstraCost_t)(a))
00071 #define EG_DIJKSTRA_COST_MAX INT_MAX
00072 
00073 /* ========================================================================= */
00074 /* case the cost is Fixed points with 10 bits for fractional values */
00075 #elif EG_DIJKSTRA_COST_TYPE == FP10_TYPE
00076 typedef EGfp10_t EGdijkstraCost_t;
00077 #define EGdijkstraCostAdd(a,b) EGfpAdd10(a,b)
00078 #define EGdijkstraCostSub(a,b) EGfpSub10(a,b)
00079 #define EGdijkstraCostIsLess(a,b) ((a)<(b))
00080 #define EGdijkstraCostDiv(a,b) EGfpDiv10(a,b)
00081 #define EGdijkstraCostMul(a,b) EGfpMul10(a,b)
00082 #define EGdijkstraCostToLf(a) fptolf10(a)
00083 #define EGdijkstraToCost(a) lftofp10(a)
00084 #define EGdijkstraCostMinus(a) EGfpMinus10(a)
00085 #define EG_DIJKSTRA_COST_MAX EGdijstraToCost(EGFP_MAX10)
00086 
00087 /* ========================================================================= */
00088 /* case the cost is Fixed points with 20 bits for fractional values */
00089 #elif EG_DIJKSTRA_COST_TYPE == FP20_TYPE
00090 typedef EGfp20_t EGdijkstraCost_t;
00091 #define EGdijkstraCostAdd(a,b) EGfpAdd20(a,b)
00092 #define EGdijkstraCostSub(a,b) EGfpSub20(a,b)
00093 #define EGdijkstraCostIsLess(a,b) ((a)<(b))
00094 #define EGdijkstraCostDiv(a,b) EGfpDiv20(a,b)
00095 #define EGdijkstraCostMul(a,b) EGfpMul20(a,b)
00096 #define EGdijkstraCostToLf(a) fptolf20(a)
00097 #define EGdijkstraToCost(a) lftofp20(a)
00098 #define EGdijkstraCostMinus(a) EGfpMinus20(a)
00099 #define EG_DIJKSTRA_COST_MAX EGdijkstraToCost(EGFP_MAX20)
00100 
00101 /* ========================================================================= */
00102 /* case the cost is Fixed points with 28 bits for fractional values */
00103 #elif EG_DIJKSTRA_COST_TYPE == FP28_TYPE
00104 typedef EGfp28_t EGdijkstraCost_t;
00105 #define EGdijkstraCostAdd(a,b) EGfpAdd28(a,b)
00106 #define EGdijkstraCostSub(a,b) EGfpSub28(a,b)
00107 #define EGdijkstraCostIsLess(a,b) ((a)<(b))
00108 #define EGdijkstraCostDiv(a,b) EGfpDiv28(a,b)
00109 #define EGdijkstraCostMul(a,b) EGfpMul28(a,b)
00110 #define EGdijkstraCostToLf(a) fptolf28(a)
00111 #define EGdijkstraToCost(a) lftofp28(a)
00112 #define EGdijkstraCostMinus(a) EGfpMinus28(a)
00113 #define EG_DIJKSTRA_COST_MAX EGdijkstraToCost(EGFP_MAX28)
00114 
00115 /* ========================================================================= */
00116 /* case the cost is Fixed points with 28 bits for fractional values */
00117 #elif EG_DIJKSTRA_COST_TYPE == FP25_TYPE
00118 typedef EGfp25_t EGdijkstraCost_t;
00119 #define EGdijkstraCostAdd(a,b) EGfpAdd25(a,b)
00120 #define EGdijkstraCostSub(a,b) EGfpSub25(a,b)
00121 #define EGdijkstraCostIsLess(a,b) ((a)<(b))
00122 #define EGdijkstraCostDiv(a,b) EGfpDiv25(a,b)
00123 #define EGdijkstraCostMul(a,b) EGfpMul25(a,b)
00124 #define EGdijkstraCostToLf(a) fptolf25(a)
00125 #define EGdijkstraToCost(a) lftofp25(a)
00126 #define EGdijkstraCostMinus(a) EGfpMinus25(a)
00127 #define EG_DIJKSTRA_COST_MAX EGdijkstraToCost(EGFP_MAX25)
00128 
00129 /* ========================================================================= */
00130 /* if we reach this line this means that the type is unsupported */
00131 #else
00132 #error UNSUPORTED VALUE TYPE
00133 #endif
00134 
00135 
00136 /* ========================================================================= */
00137 /* constant values definitions */
00138 
00139 /* EG_DIJKSTRA_EPSILON:
00140  
00141  This constant indicates how much a potential has to change by means of an 
00142  incoming arc for its potential to be updated                                */
00143 
00144 #ifndef EG_DIJKSTRA_EPSILON
00145 #define EG_DIJKSTRA_EPSILON EGdijkstraToCost(0.0000)
00146 #endif
00147 
00148 /* EG_DIJKSTRA_OPTERROR:
00149 
00150   This constant indicates how far we must be from the optimal solution 
00151   value before stopping the algorithm.                                       */
00152 
00153 #ifndef EG_DIJKSTRA_OPTERROR
00154 #define EG_DIJKSTRA_OPTERROR EGdijkstraToCost(0.0)
00155 #endif
00156 
00157 #ifndef EG_DIJKSTRA_NEGATIVE_CHECK
00158 #define EG_DIJKSTRA_NEGATIVE_CHECK 0
00159 #endif
00160 
00161 
00162 /* ========================================================================= */
00163 /* access macro declarations */
00164 #define EGdijkstraSetFather(n,os,f) EGosSetData(((EGdGraphNode_t*)(n))->data,os[EG_DIJ_FATHER],EGdGraphEdge_t*,f)
00165 #define EGdijkstraSetDist(n,os,d) EGosSetData(((EGdGraphNode_t*)(n))->data,os[EG_DIJ_DIST],EGdijkstraCost_t,d)
00166 #define EGdijkstraSetNdist(n,os,d) EGosSetData(((EGdGraphNode_t*)(n))->data,os[EG_DIJ_NDIST],unsigned int,d)
00167 #define EGdijkstraSetMarker(n,os,m) EGosSetData(((EGdGraphNode_t*)(n))->data,os[EG_DIJ_MARKER],unsigned int,m)
00168 #define EGdijkstraSetEdgeLength(e,os,l) (EGosSetData(((EGdGraphEdge_t*)(e))->data, os[EG_DIJ_ELENGTH], EGdijkstraCost_t, l))
00169 #define EGdijkstraSetHeapConnector(n,os,h) EGosSetData(((EGdGraphNode_t*)(n))->data,os[EG_DIJ_HCONNECTOR],EGheapConnector_t*,h)
00170 
00171 #define EGdijkstraGetDist(v,os) (EGosGetData(((EGdGraphNode_t*)(v))->data,os[EG_DIJ_DIST],EGdijkstraCost_t))
00172 #define EGdijkstraGetNdist(v,os) (EGosGetData(((EGdGraphNode_t*)(v))->data,os[EG_DIJ_NDIST],unsigned int))
00173 #define EGdijkstraGetFather(v,os) (EGosGetData(((EGdGraphNode_t*)(v))->data,os[EG_DIJ_FATHER],EGdGraphEdge_t*))
00174 #define EGdijkstraGetMarker(v,os) (EGosGetData(((EGdGraphNode_t*)(v))->data,os[EG_DIJ_MARKER],unsigned int))
00175 #define EGdijkstraGetEdgeLength(e,os) (EGosGetData(((EGdGraphEdge_t*)(e))->data, os[EG_DIJ_ELENGTH], EGdijkstraCost_t))
00176 #define EGdijkstraGetHeapConnector(e,os) (EGosGetData(((EGdGraphNode_t*)(e))->data, os[EG_DIJ_HCONNECTOR], EGheapConnector_t*))
00177 
00178 /* ========================================================================= */
00179 /* main function */
00180 int EGpartialDijkstra (EGdGraphNode_t * s,
00181                        EGdGraphNode_t * t,
00182                        EGdijkstraCost_t ubound,
00183                        size_t * os,
00184                        EGheap_t * my_heap,
00185                        EGdGraph_t * G);
00186 
00187 int EGdijkstraCheckOptimality (EGdGraphNode_t * s,
00188                                EGdGraphNode_t * t,
00189                                EGdijkstraCost_t ubound,
00190                                size_t * os,
00191                                EGdGraph_t * G);
00192 
00193 int EGdijkstraExtractSolution (EGdGraphEdge_t ** path,
00194                                unsigned int *npath,
00195                                EGdGraphNode_t * s,
00196                                EGdGraphNode_t * t,
00197                                size_t * os);
00198 
00199 #endif

Generated on Mon Jan 30 08:48:52 2006 for EGlib by  doxygen 1.4.5