00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
00041
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
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
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
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
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
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
00131 #else
00132 #error UNSUPORTED VALUE TYPE
00133 #endif
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 #ifndef EG_DIJKSTRA_EPSILON
00145 #define EG_DIJKSTRA_EPSILON EGdijkstraToCost(0.0000)
00146 #endif
00147
00148
00149
00150
00151
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
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
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