提交 ef572298 编写于 作者: M Marius Muja

Merge branch 'release_1.5'

.PHONY: tests test libs doc all clean examples
all:
@-mkdir -p build
cd build && cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} .. && make all doc
......@@ -24,6 +25,11 @@ examples:
@-mkdir -p build
cd build && cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DUSE_MPI=${USE_MPI} && make $@
install:
@-mkdir -p build
cd build && cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} .. && make all doc install
clean:
-cd build && make clean
-rm -rf build
......
......@@ -55,6 +55,6 @@ if (EXISTS ${PDFLATEX_COMPILER} AND EXISTS ${BIBTEX_COMPILER})
install (
FILES ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}.pdf
DESTINATION doc
DESTINATION share/doc/flann
)
endif()
......@@ -22,7 +22,9 @@ set_target_properties(flann_cpp PROPERTIES
)
add_library(flann_s STATIC ${C_SOURCES})
SET_TARGET_PROPERTIES( flann_s PROPERTIES COMPILE_FLAGS -fPIC)
add_library(flann_cpp_s STATIC ${CPP_SOURCES})
SET_TARGET_PROPERTIES( flann_cpp_s PROPERTIES COMPILE_FLAGS -fPIC)
if(WIN32)
install (
......
......@@ -236,6 +236,16 @@ public:
{
return bestIndex->getParameters();
}
const SearchParams* getSearchParameters() const
{
return &bestSearchParams;
}
float getSpeedup() const
{
return speedup;
}
/**
......@@ -275,23 +285,25 @@ private:
struct CostData {
float searchTimeCost;
float buildTimeCost;
float timeCost;
float memoryCost;
float totalCost;
IndexParams* params;
};
typedef pair<CostData, KDTreeIndexParams> KDTreeCostData;
typedef pair<CostData, KMeansIndexParams> KMeansCostData;
void evaluate_kmeans(CostData& cost, const KMeansIndexParams& kmeans_params)
void evaluate_kmeans(CostData& cost)
{
StartStopTimer t;
int checks;
const int nn = 1;
logger.info("KMeansTree using params: max_iterations=%d, branching=%d\n", kmeans_params.iterations, kmeans_params.branching);
KMeansIndex<Distance> kmeans(sampledDataset, kmeans_params, distance);
KMeansIndexParams* kmeans_params = (KMeansIndexParams*)cost.params;
logger.info("KMeansTree using params: max_iterations=%d, branching=%d\n", kmeans_params->iterations, kmeans_params->branching);
KMeansIndex<Distance> kmeans(sampledDataset, *kmeans_params, distance);
// measure index build time
t.start();
kmeans.buildIndex();
......@@ -299,25 +311,26 @@ private:
float buildTime = t.value;
// measure search time
float searchTime = test_index_precision(kmeans, sampledDataset, testDataset, gt_matches, index_params.target_precision, checks, distance, nn);;
float searchTime = test_index_precision(kmeans, sampledDataset, testDataset, gt_matches, index_params.target_precision, checks, distance, nn);
float datasetMemory = sampledDataset.rows*sampledDataset.cols*sizeof(float);
cost.memoryCost = (kmeans.usedMemory()+datasetMemory)/datasetMemory;
cost.searchTimeCost = searchTime;
cost.buildTimeCost = buildTime;
cost.timeCost = (buildTime*index_params.build_weight+searchTime);
logger.info("KMeansTree buildTime=%g, searchTime=%g, timeCost=%g, buildTimeFactor=%g\n",buildTime, searchTime, cost.timeCost, index_params.build_weight);
logger.info("KMeansTree buildTime=%g, searchTime=%g, buildTimeFactor=%g\n",buildTime, searchTime, index_params.build_weight);
}
void evaluate_kdtree(CostData& cost, const KDTreeIndexParams& kdtree_params)
void evaluate_kdtree(CostData& cost)
{
StartStopTimer t;
int checks;
const int nn = 1;
KDTreeIndexParams* kdtree_params = (KDTreeIndexParams*)cost.params;
logger.info("KDTree using params: trees=%d\n",kdtree_params.trees);
KDTreeIndex<Distance> kdtree(sampledDataset, kdtree_params, distance);
logger.info("KDTree using params: trees=%d\n",kdtree_params->trees);
KDTreeIndex<Distance> kdtree(sampledDataset, *kdtree_params, distance);
t.start();
kdtree.buildIndex();
......@@ -331,8 +344,7 @@ private:
cost.memoryCost = (kdtree.usedMemory()+datasetMemory)/datasetMemory;
cost.searchTimeCost = searchTime;
cost.buildTimeCost = buildTime;
cost.timeCost = (buildTime*index_params.build_weight+searchTime);
logger.info("KDTree buildTime=%g, searchTime=%g, timeCost=%g\n",buildTime, searchTime, cost.timeCost);
logger.info("KDTree buildTime=%g, searchTime=%g\n", buildTime, searchTime);
}
......@@ -384,7 +396,7 @@ private:
KMeansCostData optimizeKMeans()
void optimizeKMeans( vector<CostData>& costs )
{
logger.info("KMEANS, Step 1: Exploring parameter space\n");
......@@ -393,29 +405,20 @@ private:
int branchingFactors[] = { 16, 32, 64, 128, 256 };
int kmeansParamSpaceSize = ARRAY_LEN(maxIterations)*ARRAY_LEN(branchingFactors);
vector<KMeansCostData> kmeansCosts(kmeansParamSpaceSize);
// CostData* kmeansCosts = new CostData[kmeansParamSpaceSize];
costs.reserve(costs.size()+kmeansParamSpaceSize);
// evaluate kmeans for all parameter combinations
int cnt = 0;
for (size_t i=0; i<ARRAY_LEN(maxIterations); ++i) {
for (size_t j=0; j<ARRAY_LEN(branchingFactors); ++j) {
kmeansCosts[cnt].second.centers_init = CENTERS_RANDOM;
kmeansCosts[cnt].second.iterations = maxIterations[i];
kmeansCosts[cnt].second.branching = branchingFactors[j];
evaluate_kmeans(kmeansCosts[cnt].first, kmeansCosts[cnt].second);
int k = cnt;
// order by time cost
while (k>0 && kmeansCosts[k].first.timeCost < kmeansCosts[k-1].first.timeCost) {
swap(kmeansCosts[k],kmeansCosts[k-1]);
--k;
}
++cnt;
CostData cost;
KMeansIndexParams* params = new KMeansIndexParams();
params->centers_init = CENTERS_RANDOM;
params->iterations = maxIterations[i];
params->branching = branchingFactors[j];
cost.params = params;
evaluate_kmeans(cost);
costs.push_back(cost);
}
}
......@@ -439,32 +442,10 @@ private:
// kmeansCosts[i].params["max-iterations"] = kmeansNMPoints[i*2+1];
// kmeansCosts[i].timeCost = kmeansVals[i];
// }
float optTimeCost = kmeansCosts[0].first.timeCost;
// recompute total costs factoring in the memory costs
for (int i=0;i<kmeansParamSpaceSize;++i) {
kmeansCosts[i].first.totalCost = (kmeansCosts[i].first.timeCost/optTimeCost + index_params.memory_weight * kmeansCosts[i].first.memoryCost);
int k = i;
while (k>0 && kmeansCosts[k].first.totalCost < kmeansCosts[k-1].first.totalCost) {
swap(kmeansCosts[k],kmeansCosts[k-1]);
k--;
}
}
// display the costs obtained
for (int i=0;i<kmeansParamSpaceSize;++i) {
logger.info("KMeans, branching=%d, iterations=%d, time_cost=%g[%g] (build=%g, search=%g), memory_cost=%g, cost=%g\n",
kmeansCosts[i].second.branching, kmeansCosts[i].second.iterations,
kmeansCosts[i].first.timeCost,kmeansCosts[i].first.timeCost/optTimeCost,
kmeansCosts[i].first.buildTimeCost, kmeansCosts[i].first.searchTimeCost,
kmeansCosts[i].first.memoryCost,kmeansCosts[i].first.totalCost);
}
return kmeansCosts[0];
}
KDTreeCostData optimizeKDTree()
void optimizeKDTree(vector<CostData>& costs)
{
logger.info("KD-TREE, Step 1: Exploring parameter space\n");
......@@ -472,23 +453,15 @@ private:
// explore kd-tree parameters space using the parameters below
int testTrees[] = { 1, 4, 8, 16, 32 };
size_t kdtreeParamSpaceSize = ARRAY_LEN(testTrees);
vector<KDTreeCostData> kdtreeCosts(kdtreeParamSpaceSize);
// evaluate kdtree for all parameter combinations
int cnt = 0;
for (size_t i=0; i<ARRAY_LEN(testTrees); ++i) {
kdtreeCosts[cnt].second.trees = testTrees[i];
evaluate_kdtree(kdtreeCosts[cnt].first, kdtreeCosts[cnt].second);
CostData cost;
KDTreeIndexParams* params= new KDTreeIndexParams();
params->trees = testTrees[i];
cost.params = params;
int k = cnt;
// order by time cost
while (k>0 && kdtreeCosts[k].first.timeCost < kdtreeCosts[k-1].first.timeCost) {
swap(kdtreeCosts[k],kdtreeCosts[k-1]);
--k;
}
++cnt;
evaluate_kdtree(cost);
costs.push_back(cost);
}
// logger.info("KD-TREE, Step 2: simplex-downhill optimization\n");
......@@ -510,26 +483,6 @@ private:
// kdtreeCosts[i].timeCost = kdtreeVals[i];
// }
float optTimeCost = kdtreeCosts[0].first.timeCost;
// recompute costs for kd-tree factoring in memory cost
for (size_t i=0;i<kdtreeParamSpaceSize;++i) {
kdtreeCosts[i].first.totalCost = (kdtreeCosts[i].first.timeCost/optTimeCost + index_params.memory_weight * kdtreeCosts[i].first.memoryCost);
int k = i;
while (k>0 && kdtreeCosts[k].first.totalCost < kdtreeCosts[k-1].first.totalCost) {
swap(kdtreeCosts[k],kdtreeCosts[k-1]);
k--;
}
}
// display costs obtained
for (size_t i=0;i<kdtreeParamSpaceSize;++i) {
logger.info("kd-tree, trees=%d, time_cost=%g[%g] (build=%g, search=%g), memory_cost=%g, cost=%g\n",
kdtreeCosts[i].second.trees,kdtreeCosts[i].first.timeCost,kdtreeCosts[i].first.timeCost/optTimeCost,
kdtreeCosts[i].first.buildTimeCost, kdtreeCosts[i].first.searchTimeCost,
kdtreeCosts[i].first.memoryCost,kdtreeCosts[i].first.totalCost);
}
return kdtreeCosts[0];
}
/**
......@@ -539,10 +492,12 @@ private:
*/
IndexParams* estimateBuildParams()
{
vector<CostData> costs;
int sampleSize = int(index_params.sample_fraction*dataset.rows);
int testSampleSize = min(sampleSize/10, 1000);
logger.info("Entering autotuning, dataset size: %d, sampleSize: %d, testSampleSize: %d\n",dataset.rows, sampleSize, testSampleSize);
logger.info("Entering autotuning, dataset size: %d, sampleSize: %d, testSampleSize: %d, target precision: %g\n",dataset.rows, sampleSize, testSampleSize, index_params.target_precision);
// For a very small dataset, it makes no sense to build any fancy index, just
// use linear search
......@@ -563,24 +518,46 @@ private:
t.start();
compute_ground_truth<Distance>(sampledDataset, testDataset, gt_matches, 0, distance);
t.stop();
float bestCost = t.value;
IndexParams* bestParams = new LinearIndexParams();
CostData linear_cost;
linear_cost.searchTimeCost = t.value;
linear_cost.buildTimeCost = 0;
linear_cost.memoryCost = 0;
linear_cost.params = new LinearIndexParams();
costs.push_back(linear_cost);
// Start parameter autotune process
logger.info("Autotuning parameters...\n");
optimizeKMeans(costs);
optimizeKDTree(costs);
KMeansCostData kmeansCost = optimizeKMeans();
if (kmeansCost.first.totalCost<bestCost) {
bestParams = new KMeansIndexParams(kmeansCost.second);
bestCost = kmeansCost.first.totalCost;
float bestTimeCost = costs[0].searchTimeCost;
for (size_t i=0;i<costs.size();++i) {
float timeCost = costs[i].buildTimeCost*index_params.build_weight+costs[i].searchTimeCost;
if (timeCost<bestTimeCost) {
bestTimeCost = timeCost;
}
}
KDTreeCostData kdtreeCost = optimizeKDTree();
if (kdtreeCost.first.totalCost<bestCost) {
bestParams = new KDTreeIndexParams(kdtreeCost.second);
bestCost = kdtreeCost.first.totalCost;
float bestCost = costs[0].searchTimeCost/bestTimeCost;
IndexParams* bestParams = costs[0].params;
if (bestTimeCost>0) {
for (size_t i=0;i<costs.size();++i) {
float crtCost = (costs[i].buildTimeCost*index_params.build_weight+costs[i].searchTimeCost)/bestTimeCost+
index_params.memory_weight*costs[i].memoryCost;
if (crtCost<bestCost) {
bestCost = crtCost;
bestParams = costs[i].params;
}
}
}
// free all parameter structures, except the one returned
for (size_t i=0;i<costs.size();++i) {
if (costs[i].params != bestParams) {
free(costs[i].params);
}
}
gt_matches.free();
......
......@@ -94,6 +94,12 @@ flann_index_t __flann_build_index(typename Distance::ElementType* dataset, int r
const IndexParams* index_params = index->getIndexParameters();
index_params->toParameters(*flann_params);
if (index->getIndex()->getType()==AUTOTUNED) {
AutotunedIndex<T>* autotuned_index = (AutotunedIndex<T>*)index->getIndex();
flann_params->checks = autotuned_index->getSearchParameters()->checks;
*speedup = autotuned_index->getSpeedup();
}
return index;
}
catch (runtime_error& e) {
......@@ -408,6 +414,8 @@ int __flann_find_nearest_neighbors_index(flann_index_t index_ptr, typename Dista
index->knnSearch(Matrix<ElementType>(testset, tcount, index->veclen()),
m_indices,
m_dists, nn, SearchParams(flann_params->checks) );
return 0;
}
catch(runtime_error& e) {
logger.error("Caught exception: %s\n",e.what());
......
......@@ -126,7 +126,7 @@ NNIndex<Distance>* load_saved_index(const Matrix<typename Distance::ElementType>
return NULL;
}
IndexHeader header = load_header(fin);
if (header.data_type!=get_flann_datatype<ElementType>()) {
if (header.data_type!=Datatype<ElementType>::type()) {
throw FLANNException("Datatype of saved index is different than of the one to be created.");
}
if (size_t(header.rows)!=dataset.rows || size_t(header.cols)!=dataset.cols) {
......
......@@ -28,7 +28,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*************************************************************************/
#include "logger.h"
#include "flann/util/logger.h"
#include <cstdio>
#include <cstdarg>
......
......@@ -33,16 +33,6 @@
namespace flann
{
template<> flann_datatype_t get_flann_datatype<char>() { return FLANN_INT8; }
template<> flann_datatype_t get_flann_datatype<short>() { return FLANN_INT16; }
template<> flann_datatype_t get_flann_datatype<int>() { return FLANN_INT32; }
template<> flann_datatype_t get_flann_datatype<unsigned char>() { return FLANN_UINT8; }
template<> flann_datatype_t get_flann_datatype<unsigned short>() { return FLANN_UINT16; }
template<> flann_datatype_t get_flann_datatype<unsigned int>() { return FLANN_UINT32; }
template<> flann_datatype_t get_flann_datatype<float>() { return FLANN_FLOAT32; }
template<> flann_datatype_t get_flann_datatype<double>() { return FLANN_FLOAT64; }
const char FLANN_SIGNATURE[] = "FLANN_INDEX";
const char FLANN_VERSION[] = "1.5.0";
......
......@@ -38,15 +38,16 @@
namespace flann
{
template <typename T> flann_datatype_t get_flann_datatype() { throw FLANNException("Unknown FLANN data type"); }
template<> flann_datatype_t get_flann_datatype<char>();
template<> flann_datatype_t get_flann_datatype<short>();
template<> flann_datatype_t get_flann_datatype<int>();
template<> flann_datatype_t get_flann_datatype<unsigned char>();
template<> flann_datatype_t get_flann_datatype<unsigned short>();
template<> flann_datatype_t get_flann_datatype<unsigned int>();
template<> flann_datatype_t get_flann_datatype<float>();
template<> flann_datatype_t get_flann_datatype<double>();
template <typename T> struct Datatype {};
template<> struct Datatype<char> { static flann_datatype_t type() { return FLANN_INT8; } };
template<> struct Datatype<short> { static flann_datatype_t type() { return FLANN_INT16; } };
template<> struct Datatype<int> { static flann_datatype_t type() { return FLANN_INT32; } };
template<> struct Datatype<unsigned char> { static flann_datatype_t type() { return FLANN_UINT8; } };
template<> struct Datatype<unsigned short> { static flann_datatype_t type() { return FLANN_UINT16; } };
template<> struct Datatype<unsigned int> { static flann_datatype_t type() { return FLANN_UINT32; } };
template<> struct Datatype<float> { static flann_datatype_t type() { return FLANN_FLOAT32; } };
template<> struct Datatype<double> { static flann_datatype_t type() { return FLANN_FLOAT64; } };
extern const char FLANN_SIGNATURE[];
......@@ -79,7 +80,7 @@ void save_header(FILE* stream, const NNIndex<Distance>& index)
strcpy(header.signature, FLANN_SIGNATURE);
memset(header.version, 0 , sizeof(header.version));
strcpy(header.version, FLANN_VERSION);
header.data_type = get_flann_datatype<typename Distance::ElementType>();
header.data_type = Datatype<typename Distance::ElementType>::type();
header.index_type = index.getType();
header.rows = index.size();
header.cols = index.veclen();
......
......@@ -9,10 +9,10 @@ find_program(MEXEXT_CMD mexext)
if(MEX_CMD AND MEXEXT_CMD)
get_filename_component(MEX_REAL_CMD ${MEX_CMD} REALPATH)
get_filename_component(MEX_REAL_CMD ${MEX_CMD} ABSOLUTE)
get_filename_component(MEX_PATH ${MEX_REAL_CMD} PATH)
get_filename_component(MEXEXT_REAL_CMD ${MEXEXT_CMD} REALPATH)
get_filename_component(MEXEXT_REAL_CMD ${MEXEXT_CMD} ABSOLUTE)
get_filename_component(MEXEXT_PATH ${MEXEXT_REAL_CMD} PATH)
if (MEX_PATH STREQUAL MEXEXT_PATH)
......@@ -33,7 +33,7 @@ if(MEX_CMD AND MEXEXT_CMD)
ADD_CUSTOM_COMMAND(
OUTPUT ${MEX_FILE}
COMMAND ${MEX_REAL_CMD}
ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${MEX_NAME}.cpp -I${PROJECT_SOURCE_DIR}/src/cpp -L${LIBRARY_OUTPUT_PATH} -lflann_s
ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${MEX_NAME}.cpp -I${PROJECT_SOURCE_DIR}/src/cpp -L${LIBRARY_OUTPUT_PATH} -lflann_s
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${MEX_NAME}.cpp ${LIBRARY_OUTPUT_PATH}/${LIB_DEP}
COMMENT "Building MEX extension ${MEX_FILE}"
)
......@@ -44,7 +44,7 @@ if(MEX_CMD AND MEXEXT_CMD)
INSTALL (
FILES ${MEX_FILE} ${MATLAB_SOURCES}
DESTINATION matlab
DESTINATION share/flann/matlab
)
else()
message("The 'mex' and 'mexext' programs have been found in different locations. It's likely that one of them is not part of the MATLAB instalation. Make sure that the 'bin' directory from the MATLAB instalation is in PATH")
......
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/setup.py.tpl
${CMAKE_CURRENT_SOURCE_DIR}/setup.py
)
INSTALL (
FILES setup.py
DESTINATION python
DESTINATION share/flann/python
)
INSTALL (
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/pyflann
DESTINATION python
DESTINATION share/flann/python
PATTERN *.cpp EXCLUDE
PATTERN *.so EXCLUDE
PATTERN *.a EXCLUDE
PATTERN *.dat EXCLUDE
PATTERN *.txt EXCLUDE
PATTERN *.tpl EXCLUDE
PATTERN *~ EXCLUDE
PATTERN _tests EXCLUDE
)
......@@ -108,7 +108,7 @@ class FLANNParameters(CustomStructure):
'branching' : 32,
'iterations' : 5,
'centers_init' : 'random',
'target_precision' : -1,
'target_precision' : 0.9,
'build_weight' : 0.01,
'memory_weight' : 0.0,
'sample_fraction' : 0.1,
......@@ -127,25 +127,38 @@ allowed_types = [ float32, float64, uint8, int32]
FLANN_INDEX = c_void_p
def load_flann_library():
root_dir = os.path.abspath(os.path.dirname(__file__))
libname = 'libflann'
libname = 'libflann.so'
if sys.platform == 'win32':
libname = 'flann'
libname = 'flann.dll'
elif sys.platform == 'darwin':
libname = 'libflann.dylib'
flannlib = None
loaded = False
while (not loaded) and root_dir!="/":
while (not loaded) and root_dir!=None:
try:
# print "Trying ",os.path.join(root_dir,'lib')
flannlib = load_library(libname, os.path.join(root_dir,'lib'))
#print "Trying ",os.path.join(root_dir,'lib',libname)
flannlib = cdll[os.path.join(root_dir,'lib',libname)]
loaded = True
except Exception as e:
# print e
root_dir = os.path.dirname(root_dir)
if root_dir == '/':
root_dir = None
else:
root_dir = os.path.dirname(root_dir)
if not loaded:
try:
#print "Trying",libname
flannlib=cdll[libname]
loaded = True
except:
pass
return flannlib
......@@ -396,7 +409,7 @@ flannlib.test_with_checks.argtypes = [
def ensure_2d_array(array, flags, **kwargs):
array = require(array, requirements = flags, **kwargs)
if len(array.shape) == 1:
array.shape = (-1,array.size)
array = array.reshape(-1,array.size)
return array
......
......@@ -27,56 +27,67 @@
from __future__ import with_statement
from pyflann.exceptions import FLANNException
import h5py
import numpy
have_h5py = True
try:
import h5py
except Exception as e:
have_h5py = False
if not have_h5py:
def __missing_h5py(*args,**kwargs):
raise FLANNException("h5py library not found")
check = __missing_h5py
save = __missing_h5py
load = __missing_h5py
load_range = __missing_h5py
else:
def check(filename):
f = open(filename,"r")
header = f.read(4)
if header[1:4]=="HDF": return True
return False
def check(filename):
f = open(filename,"r")
header = f.read(4)
if header[1:4]=="HDF": return True
return False
def save(dataset, filename, **kwargs):
if not isinstance(dataset,numpy.ndarray):
raise FLANNException("Dataset must be in numpy format")
try:
if 'title' in kwargs:
title_name = kwargs['title']
else:
title_name = "Dataset saved by pyflann"
if 'dataset_name' in kwargs:
dataset_name = kwargs['dataset_name']
else:
dataset_name = 'dataset'
h5file = h5py.File(filename)
h5file.create_dataset(dataset_name, dataset)
h5file.close()
except Exception as e:
h5file.close()
raise FLANNException(e)
def save(dataset, filename, **kwargs):
if not isinstance(dataset,numpy.ndarray):
raise FLANNException("Dataset must be in numpy format")
try:
if 'title' in kwargs:
title_name = kwargs['title']
else:
title_name = "Dataset saved by pyflann"
if 'dataset_name' in kwargs:
dataset_name = kwargs['dataset_name']
else:
dataset_name = 'dataset'
h5file = h5py.File(filename)
h5file.create_dataset(dataset_name, dataset)
h5file.close()
except Exception as e:
h5file.close()
raise FLANNException(e)
def load(filename, rows = -1, cols = -1, dtype = numpy.float32, **kwargs):
try:
h5file = h5py.File(filename)
if 'dataset_name' in kwargs:
dataset_name = kwargs['dataset_name']
else:
dataset_name = 'dataset'
for node in h5file.keys():
if node == dataset_name:
data = h5file[node]
h5file.close()
return data
except Exception as e:
h5file.close()
raise FLANNException(e)
def load(filename, rows = -1, cols = -1, dtype = numpy.float32, **kwargs):
try:
def load_range(filename, array_name, range):
h5file = h5py.File(filename)
if 'dataset_name' in kwargs:
dataset_name = kwargs['dataset_name']
else:
dataset_name = 'dataset'
for node in h5file.keys():
if node == dataset_name:
data = h5file[node]
h5file.close()
return data
except Exception as e:
h5file.close()
raise FLANNException(e)
def load_range(filename, array_name, range):
h5file = h5py.File(filename)
dataset = h5file[array_name]
return dataset[range[0]:range[1]]
dataset = h5file[array_name]
return dataset[range[0]:range[1]]
#!/usr/bin/env python
from distutils.core import setup
import os.path
import sys
setup_path = os.path.dirname(os.path.abspath(sys.argv[0]))
lib_path = os.path.abspath(os.path.join(setup_path,'../../../lib'))
setup(name='flann',
version='1.2',
version='1.5.0',
description='Fast Library for Approximate Nearest Neighbors',
author='Marius Muja',
author_email='mariusm@cs.ubc.ca',
license='BSD',
url='http://www.cs.ubc.ca/~mariusm/flann/',
packages=['pyflann', 'pyflann.io', 'pyflann.bindings', 'pyflann.util'],
package_data={'pyflann.bindings' : ['libflann.so','flann.dll', 'libflann.dylib']},
packages=['pyflann', 'pyflann.io', 'pyflann.bindings', 'pyflann.util', 'pyflann.lib'],
package_dir={'pyflann.lib':lib_path},
package_data={'pyflann.lib': ['libflann.so','flann.dll', 'libflann.dylib']},
)
#!/usr/bin/env python
from distutils.core import setup
import os.path
import sys
setup_path = os.path.dirname(os.path.abspath(sys.argv[0]))
lib_path = os.path.abspath(os.path.join(setup_path,'../../../lib'))
setup(name='flann',
version='${FLANN_VERSION}',
description='Fast Library for Approximate Nearest Neighbors',
author='Marius Muja',
author_email='mariusm@cs.ubc.ca',
license='BSD',
url='http://www.cs.ubc.ca/~mariusm/flann/',
packages=['pyflann','pyflann.command', 'pyflann.io', 'pyflann.bindings', 'pyflann.util', 'pyflann.lib'],
scripts=['flann'],
package_dir={'pyflann.lib':lib_path},
package_data={'pyflann.lib': ['libflann.so','flann.dll', 'libflann.dylib']},
)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册