PyObject *getTanimotoSimMat(python::object bitVectList) { // we will assume here that we have a either a list of ExplicitBitVectors or // SparseBitVects int nrows = python::extract<int>(bitVectList.attr("__len__")()); CHECK_INVARIANT(nrows > 1, ""); // First check what type of vector we have python::object v1 = bitVectList[0]; python::extract<ExplicitBitVect> ebvWorks(v1); python::extract<SparseBitVect> sbvWorks(v1); if(!ebvWorks.check() && !sbvWorks.check()) { throw_value_error("GetTanimotoDistMat can only take a sequence of ExplicitBitVects or SparseBitvects"); } npy_intp dMatLen = nrows*(nrows-1)/2; PyArrayObject *simRes = (PyArrayObject *)PyArray_SimpleNew(1, &dMatLen, NPY_DOUBLE); double *sMat = (double *)simRes->data; if (ebvWorks.check()) { PySequenceHolder<ExplicitBitVect> dData(bitVectList); MetricMatrixCalc<PySequenceHolder<ExplicitBitVect>, ExplicitBitVect> mmCalc; mmCalc.setMetricFunc(&TanimotoSimilarityMetric<ExplicitBitVect, ExplicitBitVect>); mmCalc.calcMetricMatrix(dData, nrows, 0, sMat); } else if (sbvWorks.check()) { PySequenceHolder<SparseBitVect> dData(bitVectList); MetricMatrixCalc<PySequenceHolder<SparseBitVect>, SparseBitVect> mmCalc; mmCalc.setMetricFunc(&TanimotoSimilarityMetric<SparseBitVect, SparseBitVect>); mmCalc.calcMetricMatrix(dData, nrows, 0, sMat); } return PyArray_Return(simRes); }
void CollectVotes(BitCorrMatGenerator *cmGen, python::object bitVect) { python::extract<ExplicitBitVect> ebvWorks(bitVect); python::extract<SparseBitVect> sbvWorks(bitVect); if (ebvWorks.check()) { ExplicitBitVect ev = python::extract<ExplicitBitVect>(bitVect); cmGen->collectVotes(ev); } else if (sbvWorks.check()) { SparseBitVect sv = python::extract<SparseBitVect>(bitVect); cmGen->collectVotes(sv); } else { throw_value_error( "CollectVote can only take ExplicitBitVects or SparseBitVects"); } }
void AccumulateVotes(InfoBitRanker *ranker, python::object bitVect, int label) { python::extract<ExplicitBitVect> ebvWorks(bitVect); python::extract<SparseBitVect> sbvWorks(bitVect); if (ebvWorks.check()) { ExplicitBitVect ev = python::extract<ExplicitBitVect>(bitVect); ranker->accumulateVotes(ev, label); } else if (sbvWorks.check()) { SparseBitVect sv = python::extract<SparseBitVect>(bitVect); ranker->accumulateVotes(sv, label); } else { throw_value_error( "Accumulate Vote can only take a explicitBitVects or SparseBitvects"); } }