/* This file is a c++ wrapper function for computing the transportation cost * between two vectors given a cost matrix. * * It was written by Antoine Rolet (2014) and mainly consists of a wrapper * of the code written by Nicolas Bonneel available on this page * http://people.seas.harvard.edu/~nbonneel/FastTransport/ * * It was then modified to make it more amenable to python inline calling * * Please give relevant credit to the original author (Nicolas Bonneel) if * you use this code for a publication. * */ #include "network_simplex_simple.h" #include "network_simplex_simple_omp.h" #include "EMD.h" #include int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, double* alpha, double* beta, double *cost, int maxIter) { // beware M and C are stored in row major C style!!! using namespace lemon; int n, m, cur; typedef FullBipartiteDigraph Digraph; DIGRAPH_TYPEDEFS(Digraph); // Get the number of non zero coordinates for r and c n=0; for (int i=0; i0) { n++; }else if(val<0){ return INFEASIBLE; } } m=0; for (int i=0; i0) { m++; }else if(val<0){ return INFEASIBLE; } } // Define the graph std::vector indI(n), indJ(m); std::vector weights1(n), weights2(m); Digraph di(n, m); NetworkSimplexSimple net(di, true, n+m, ((int64_t)n)*((int64_t)m), maxIter); // Set supply and demand, don't account for 0 values (faster) cur=0; for (int i=0; i0) { weights1[ cur ] = val; indI[cur++]=i; } } // Demand is actually negative supply... cur=0; for (int i=0; i0) { weights2[ cur ] = -val; indJ[cur++]=i; } } net.supplyMap(&weights1[0], n, &weights2[0], m); // Set the cost of each edge int64_t idarc = 0; for (int i=0; i0) { n++; }else if(val<0){ return INFEASIBLE; } } m=0; for (int i=0; i0) { m++; }else if(val<0){ return INFEASIBLE; } } // Define the graph std::vector indI(n), indJ(m); std::vector weights1(n), weights2(m); Digraph di(n, m); NetworkSimplexSimple net(di, true, n+m, ((int64_t)n)*((int64_t)m), maxIter, numThreads); // Set supply and demand, don't account for 0 values (faster) cur=0; for (int i=0; i0) { weights1[ cur ] = val; indI[cur++]=i; } } // Demand is actually negative supply... cur=0; for (int i=0; i0) { weights2[ cur ] = -val; indJ[cur++]=i; } } net.supplyMap(&weights1[0], n, &weights2[0], m); // Set the cost of each edge int64_t idarc = 0; for (int i=0; i