1
0
Fork 0

After testing 2.2 a bit

This commit is contained in:
Richard Parker 2015-12-15 15:05:22 +00:00
parent bad2ed09e7
commit c96599b7ce
2 changed files with 63 additions and 30 deletions

View File

@ -71,6 +71,7 @@ int hs4[4]={33972992,9770664,11661062,28398735};
int hs5[4]={79685116,67516870,19274248,35037618};
static GeoIndex * gi;
static GeoCursor * gcr;
static GeoCoordinate gcp;
static GeoCoordinate gcp1, gcp2, gcp3, gcp4;
static GeoCoordinates * list1;
@ -293,6 +294,32 @@ BOOST_AUTO_TEST_CASE (tst_geo1) {
/* first some easily recognizable GeoStrings */
/* mainly for debugging rather than regression */
BOOST_AUTO_TEST_CASE (tst_geo15) {
gi=GeoIndex_new();
GeoIndex_hint(gi,10); /* set it to "robust" mode */
for(i=0;i<50;i++)
{
gcp.latitude = 90.0;
gcp.longitude = 180.0;
gcp.data = ix + i;
r = GeoIndex_insert(gi,&gcp);
icheck(10,0,r);
}
gcp.latitude = 0.0;
gcp.longitude= 25.5;
gcr = GeoIndex_NewCursor(gi,&gcp);
list1 = GeoIndex_ReadCursor(gcr,1);
icheck(11,1,list1->length);
gcp.latitude = 89.9;
gcp.longitude = -180.0;
gcp.data = ix + 64;
GeoIndex_insert(gi,&gcp);
list1 = GeoIndex_NearestCountPoints(gi,&gcp,1);
gccheck(13,list1, 1,"AAAAAAAAAAAAAAAABAAAAAAAA");
gicheck(14,gi);
/*GeoIndex_INDEXDUMP(gi,stdout);*/
MyFree(gi);
}
BOOST_AUTO_TEST_CASE (tst_geo10) {
gi=GeoIndex_new();
GeoIndex_hint(gi,10); /* set it to "robust" mode */

View File

@ -2193,6 +2193,7 @@ GeoFix makedist(GeoPot * pot, GeoDetailedPoint * gd)
d1=gd->fixdist[i]-pot->maxdist[i];
else d1=0;
if(d1>dist) dist=d1;
printf("makedist %d %u %u %u\n",i,dist,gd->fixdist[i],pot->maxdist[i]);
}
return dist;
}
@ -2208,6 +2209,12 @@ GeoCursor * GeoIndex_NewCursor(GeoIndex * gi, GeoCoordinate * c)
if (gcr == NULL) {
return (GeoCursor *) gcr;
}
gcr->Ix=gix;
std::vector<hpot>* p = new (&gcr->potheap) std::vector<hpot>();
std::vector<hslot>* q = new (&gcr->slotheap) std::vector<hslot>();
(void) p; // avoid compiler warnings - I just want to call
(void) q; // the constructors and have no use for p,q.
GeoMkDetail(gix,&(gcr->gd),c);
hp.pot=1;
hp.dist = makedist(gix->pots+1,&(gcr->gd));
@ -2224,31 +2231,37 @@ GeoCoordinates * GeoIndex_ReadCursor(GeoCursor * gc, int count)
GeoCoordinate * ct;
GeoResults * gr;
GeoCoordinates * gcts;
double snmd;
GeoCr * gcr;
gcr=(GeoCr *) gc;
GeoPot * pot;
GeoPot pot;
int slox;
double tsnmd;
hslot hs;
hpot hp;
gcr=(GeoCr *) gc;
gr=GeoResultsCons(count);
if(gr==NULL) return NULL;
while(gr->pointsct<count)
{
printf("pots %10.8f points %10.8f\n",gcr->potsnmd,gcr->slotsnmd);
if(gcr->potsnmd < gcr->slotsnmd*1.000001)
{
// smash top pot - if there is one
if(gcr->potheap.size()==0) break; // that's all there is
pot=(gcr->Ix)->pots+(gcr->potheap.front().pot);
printf("potheapsiz1 is %ld\n",gcr->potheap.size()); // that's all there is
pot=*((gcr->Ix)->pots+(gcr->potheap.front().pot));
// anyway remove top from heap
printf("potheapsiz2 is %ld\n",gcr->potheap.size()); // that's all there is
std::pop_heap(gcr->potheap.begin(),
gcr->potheap.end(),hpotcompare);
if(pot->LorLeaf==0)
gcr->potheap.pop_back();
printf("potheapsiz3 is %ld\n",gcr->potheap.size()); // that's all there is
if(pot.LorLeaf==0)
{
printf("Leaf pot\n");
// leaf pot - put all the points into the points heap
for(i=0;i<pot->RorPoints;i++)
for(i=0;i<pot.RorPoints;i++)
{
j=pot->points[i];
j=pot.points[i];
ct=((gcr->Ix)->gc+j);
hs.slot=j;
hs.snmd=GeoSNMD(&(gcr->gd),ct);
@ -2259,18 +2272,19 @@ GeoCoordinates * GeoIndex_ReadCursor(GeoCursor * gc, int count)
if(gcr->slotheap.size()!=0)
{
slox=gcr->slotheap.front().slot;
snmd=GeoSNMD(&gcr->gd,(gcr->Ix)->gc+slox);
gcr->slotsnmd=GeoSNMD(&gcr->gd,(gcr->Ix)->gc+slox);
}
}
else
{
hp.pot=pot->LorLeaf;
hp.dist = makedist((gcr->Ix)->pots+pot->LorLeaf,&(gcr->gd));
printf("Non-leaf pot\n");
hp.pot=pot.LorLeaf;
hp.dist = makedist((gcr->Ix)->pots+pot.LorLeaf,&(gcr->gd));
gcr->potheap.push_back(hp);
std::push_heap(gcr->potheap.begin(),
gcr->potheap.end(),hpotcompare);
hp.pot=pot->RorPoints;
hp.dist = makedist((gcr->Ix)->pots+pot->RorPoints,&(gcr->gd));
hp.pot=pot.RorPoints;
hp.dist = makedist((gcr->Ix)->pots+pot.RorPoints,&(gcr->gd));
gcr->potheap.push_back(hp);
std::push_heap(gcr->potheap.begin(),
gcr->potheap.end(),hpotcompare);
@ -2278,15 +2292,15 @@ GeoCoordinates * GeoIndex_ReadCursor(GeoCursor * gc, int count)
gcr->potsnmd=10.0;
if(gcr->potheap.size()!=0)
{
pot=(gcr->Ix)->pots+(gcr->potheap.front().pot);
gcr->potsnmd=GeoFixtoSNMD(makedist(pot,&(gcr->gd)));
pot=*((gcr->Ix)->pots+(gcr->potheap.front().pot));
gcr->potsnmd=GeoFixtoSNMD(makedist(&pot,&(gcr->gd)));
}
}
else
{
if(gcr->slotheap.size()==0) break; // that's all there is
slox=gcr->slotheap.front().slot;
snmd=GeoSNMD(&gcr->gd,(gcr->Ix)->gc+slox);
tsnmd=GeoSNMD(&gcr->gd,(gcr->Ix)->gc+slox);
r = GeoResultsGrow(gr);
if(r==-1)
{
@ -2296,27 +2310,19 @@ GeoCoordinates * GeoIndex_ReadCursor(GeoCursor * gc, int count)
return NULL;
}
gr->slot[gr->pointsct]=slox;
gr->snmd[gr->pointsct]=snmd;
gr->snmd[gr->pointsct]=tsnmd;
gr->pointsct++;
gcr->slotsnmd=5.0;
if(gcr->slotheap.size()!=0)
{
slox=gcr->slotheap.front().slot;
gcr->slotsnmd=GeoSNMD(&gcr->gd,(gcr->Ix)->gc+slox);
}
}
}
gcts=GeoAnswers(gcr->Ix,gr);
return gcts;
}
#ifdef NEVER
for(i=0;i<gp->RorPoints;i++)
{
slot=gp->points[i];
if(snmd > (maxsnmd * 1.00000000000001)) continue;
typedef struct {
GeoIx * Ix; /* GeoIndex */
GeoDetailedPoint gd;
double potsnmd;
double pointsnmd;
std::vector<hpot> potheap;
std::vector<hslot> pointheap;
} GeoCr;
#endif
void GeoIndex_CursorFree(GeoCursor * gc)
{