/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ #include "mymalloc/mymalloc.h" #ifdef EARLY_TEMPLATE #define __EXECUTABLE__ #ifdef __GNUG__ #include "server/template_inst.hh" #endif #endif #include "raslib/rmdebug.hh" #include "raslib/minterval.hh" #include #include #include #include #include #include #include "tilemgr/transtile.hh" #include "octettype.hh" #include "tilemgr/tiler.hh" RMINITGLOBALS('C') int main(int argc, char *argv[]) { vector sourceDomains; vector targetDomains; vector retvalDomains; vector::iterator sourceDIt; vector::iterator targetDIt; vector::iterator retvalDIt; vector::iterator sourceIt; vector::iterator targetIt; vector::iterator retvalIt; r_Minterval targetDom("[0:50,0:50]"); r_Minterval targetInt1("[0:10,0:10]"); r_Minterval targetInt2("[15:25,10:20]"); r_Minterval targetInt3("[15:25,21:30]"); r_Minterval targetInt4("[15:25,31:40]"); r_Minterval targetInt5("[40:50,40:50]"); r_Minterval targetInt6("[35:41,25:35]"); r_Minterval targetInt7("[28:32,28:32]"); r_Minterval targetInt8("[40:40,0:10]"); r_Minterval targetInt9("[40:50,11:11]"); r_Minterval targetInt10("[35:35,0:10]"); r_Minterval targetInt11("[30:34,10:10]"); OctetType* o = new OctetType(); char* cont1 = 0; char* cont2 = 0; char* cont3 = 0; char* cont4 = 0; char* cont5 = 0; char* cont6 = 0; char* cont7 = 0; char* cont8 = 0; char* cont9 = 0; char* cont10 = 0; char* cont11 = 0; char* outc = 0; cont1 = (char*)mymalloc(500); cont2 = (char*)mymalloc(500); cont3 = (char*)mymalloc(500); cont4 = (char*)mymalloc(500); cont5 = (char*)mymalloc(500); cont6 = (char*)mymalloc(500); cont7 = (char*)mymalloc(500); cont8 = (char*)mymalloc(500); cont9 = (char*)mymalloc(500); cont10 = (char*)mymalloc(500); cont11 = (char*)mymalloc(500); outc = (char*)mymalloc(101*101); memset(cont1, 1, 500); memset(cont2, 2, 500); memset(cont3, 3, 500); memset(cont4, 4, 500); memset(cont5, 5, 500); memset(cont6, 6, 500); memset(cont7, 7, 500); memset(cont8, 8, 500); memset(cont9, 9, 500); memset(cont10, 10, 500); memset(cont11, 11, 500); memset(outc, 0, 3500); TransTile output(targetDom, o, outc); TransTile* ttile1 = new TransTile(targetInt1, (const BaseType*)o, cont1); TransTile* ttile2 = new TransTile(targetInt2, (const BaseType*)o, cont2); TransTile* ttile3 = new TransTile(targetInt3, (const BaseType*)o, cont3); TransTile* ttile4 = new TransTile(targetInt4, (const BaseType*)o, cont4); TransTile* ttile5 = new TransTile(targetInt5, (const BaseType*)o, cont5); TransTile* ttile6 = new TransTile(targetInt6, (const BaseType*)o, cont6); TransTile* ttile7 = new TransTile(targetInt7, (const BaseType*)o, cont7); TransTile* ttile8 = new TransTile(targetInt8, (const BaseType*)o, cont8); TransTile* ttile9 = new TransTile(targetInt9, (const BaseType*)o, cont9); TransTile* ttile10 = new TransTile(targetInt10, (const BaseType*)o, cont10); TransTile* ttile11 = new TransTile(targetInt11, (const BaseType*)o, cont11); r_Minterval sourceDom("[5:45,5:45]"); r_Minterval sourceInt1("[5:10,5:10]"); r_Minterval sourceInt2("[15:25,12:45]"); r_Minterval sourceInt3("[30:45,30:38]"); r_Minterval sourceInt4("[40:45,40:45]"); r_Minterval sourceInt5("[30:45,25:28]"); r_Minterval sourceInt6("[39:41,9:11]"); r_Minterval sourceInt7("[34:36,9:11]"); char* scont1 = 0; char* scont2 = 0; char* scont3 = 0; char* scont4 = 0; char* scont5 = 0; char* scont6 = 0; char* scont7 = 0; scont1 = (char*)mymalloc(500); scont2 = (char*)mymalloc(500); scont3 = (char*)mymalloc(500); scont4 = (char*)mymalloc(500); scont5 = (char*)mymalloc(500); scont6 = (char*)mymalloc(500); scont7 = (char*)mymalloc(500); memset(scont1, 21, 500); memset(scont2, 22, 500); memset(scont3, 23, 500); memset(scont4, 24, 500); memset(scont5, 25, 500); memset(scont6, 26, 500); memset(scont7, 27, 500); TransTile* stile1 = new TransTile(sourceInt1, (const BaseType*)o, scont1); TransTile* stile2 = new TransTile(sourceInt2, (const BaseType*)o, scont2); TransTile* stile3 = new TransTile(sourceInt3, (const BaseType*)o, scont3); TransTile* stile4 = new TransTile(sourceInt4, (const BaseType*)o, scont4); TransTile* stile5 = new TransTile(sourceInt5, (const BaseType*)o, scont5); TransTile* stile6 = new TransTile(sourceInt6, (const BaseType*)o, scont6); TransTile* stile7 = new TransTile(sourceInt7, (const BaseType*)o, scont7); vector sourceTiles; sourceTiles.push_back(stile1); sourceTiles.push_back(stile2); sourceTiles.push_back(stile3); sourceTiles.push_back(stile4); sourceTiles.push_back(stile5); sourceTiles.push_back(stile6); sourceTiles.push_back(stile7); vector targetTiles; targetTiles.push_back(ttile1); targetTiles.push_back(ttile2); targetTiles.push_back(ttile3); targetTiles.push_back(ttile4); targetTiles.push_back(ttile5); targetTiles.push_back(ttile6); targetTiles.push_back(ttile7); targetTiles.push_back(ttile8); targetTiles.push_back(ttile9); targetTiles.push_back(ttile10); targetTiles.push_back(ttile11); vector retval; unsigned long targetTileArea = 0; unsigned long sourceTileArea = 0; unsigned long targetTileDomain = 0; unsigned long updatedArea = 0; bool intersection = false; r_Minterval intersectUpdateDomain; bool computed = true; cout << "Target Tiles" << endl; for (targetIt = targetTiles.begin(); targetIt != targetTiles.end(); targetIt++) cout << (*targetIt)->getDomain() << endl; cout << endl << "Source Tiles" << endl; for (sourceIt = sourceTiles.begin(); sourceIt != sourceTiles.end(); sourceIt++) cout << (*sourceIt)->getDomain() << endl; cout << endl; cout << "Checking if only update, insert or update and insert" << endl; for (sourceIt = sourceTiles.begin(); sourceIt != sourceTiles.end(); sourceIt++) { intersection = false; sourceTileArea = sourceTileArea + (*sourceIt)->getDomain().cell_count(); cout << "SourceDomain " << (*sourceIt)->getDomain() << " source area is " << sourceTileArea << endl; for (targetIt = targetTiles.begin(); targetIt != targetTiles.end(); targetIt++) { if (computed) { targetTileArea = targetTileArea + (*targetIt)->getDomain().cell_count(); cout << "Target Tile " << (*targetIt)->getDomain() << " area " << targetTileArea << endl; } if( (*sourceIt)->getDomain().intersects_with( (*targetIt)->getDomain() ) ) { cout << "Intersection" << endl; intersection = true; intersectUpdateDomain = (*sourceIt)->getDomain().create_intersection( (*targetIt)->getDomain() ); cout << "Updated " << intersectUpdateDomain << " on source " << (*sourceIt)->getDomain() << " and target " << (*targetIt)->getDomain() << endl; updatedArea = updatedArea + intersectUpdateDomain.cell_count(); (*targetIt)->execUnaryOp(Ops::OP_IDENTITY, intersectUpdateDomain, *sourceIt, intersectUpdateDomain ); } } if (!intersection) { // Create a new persistent tile, copy the transient data, // and insert it into the target mdd object. cout << "No Intersection" << endl; TransTile* newPersTile = new TransTile((*sourceIt)->getDomain(), o, (*sourceIt)->getDataFormat()); newPersTile->execUnaryOp(Ops::OP_IDENTITY, (*sourceIt)->getDomain(), *sourceIt, (*sourceIt)->getDomain()); //targetObj->insertTile( newPersTile ); updatedArea = updatedArea + (*sourceIt)->getDomain().cell_count(); } computed = false; } cout << "Source Domain " << sourceDom << " has area " << sourceDom.cell_count() << endl; cout << "Source Tile Area " << sourceTileArea << endl; cout << "Target Tile Area " << targetTileArea << endl; cout << "Updated Area " << updatedArea << endl << endl; // insert the tile if (sourceTileArea <= updatedArea) { cout << "and all sources were used" << endl; } else { cout << "and there are still some cells to do" << endl << endl; for (retvalIt = sourceTiles.begin(); retvalIt != sourceTiles.end(); retvalIt++) { sourceDomains.push_back((*retvalIt)->getDomain()); } for (retvalIt = targetTiles.begin(); retvalIt != targetTiles.end(); retvalIt++) { targetDomains.push_back((*retvalIt)->getDomain()); } r_Tiler tiler(sourceDomains, targetDomains); tiler.split(); tiler.removeCoveredDomains(); tiler.removeDoubleDomains(); retvalDomains = tiler.getTiledDomains(); cout << "we have now" << endl; for (retvalDIt = retvalDomains.begin(); retvalDIt != retvalDomains.end(); retvalDIt++) cout << (*retvalDIt) << endl; tiler.mergeDomains(); retvalDomains = tiler.getTiledDomains(); cout << "we have now" << endl; for (retvalDIt = retvalDomains.begin(); retvalDIt != retvalDomains.end(); retvalDIt++) cout << (*retvalDIt) << endl; vector t = tiler.generateTransTiles(sourceTiles); for (retvalIt = targetTiles.begin(); retvalIt != targetTiles.end(); retvalIt++) output.execUnaryOp(Ops::OP_IDENTITY, (*retvalIt)->getDomain(), (*retvalIt), (*retvalIt)->getDomain()); for (retvalIt = t.begin(); retvalIt != t.end(); retvalIt++) output.execUnaryOp(Ops::OP_IDENTITY, (*retvalIt)->getDomain(), (*retvalIt), (*retvalIt)->getDomain()); RManDebug = 30; output.printStatus(cout); RManDebug = 1; } }