Пример #1
0
static void read_args(traced_program *p, int c, char *v[])
{
    int b = find_barbar(c, v);
    if (b == -1 && c > 1) b = c - 1;
    else if (b < 1 || b > c - 1) usagerr();

    p->argc = c - b;
    p->argv = v + b;

    p->lim = global_resource_limits;

    int i = 1;
    while (i + 2 < b) {
        fill_one_limit(p, v[i], atoi(v[i+1]), atoi(v[i+2]));
        i += 3;
    }

    // TODO: treat ptrace-related arguments
    p->do_trace = false;
    p->do_trace = true;
    if (p->do_trace)
        register_traced_conf(p);

    p->report_exit_fail = false;
    if (NURSE_HACK_REPORT_EXIT_FAIL() > 0.5)
    {
        p->report_exit_fail = true;
        p->report_exit_status = 0;
    }
}
Пример #2
0
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) {

  // Input params are (in order) xIndices,yIndices,imgpatches,simMapParams (a structure), nChannels
  // IMPORTANT: DO NOT modify any thing in prhs please.

  COMindextype numRadiiIntervals,numThetaIntervals,numDescriptors;
  COMindextype interiorH,numSSDs,numAutoVarianceIndices;
  COMindextype *xIndices,*yIndices;
  COMindextype **binIndices;
  COMindextype* numBinIndices;
  COMindextype numBins;
  COMindextype nChannels;
  COMbasetype varNoise;
  int *coRelCircleOffsets;
  int nFields,nStructElements;
  COMindextype *autoVarianceIndices;
  mxArray *tmpArray,*cellArrayPtr; int numPatches,dimPatches;


  if (nrhs<5) usagerr("Atleast Five inputs are required.\n");
  if (nlhs!=1) usagerr("One output is required.\n");

  if (mxGetClassID(prhs[0])!=mxUINT32_CLASS) usagerr("xIndices must be of unsigned int.\n");
  if (mxGetClassID(prhs[1])!=mxUINT32_CLASS) usagerr("yIndices must be of unsigned int.\n");
  if (mxGetClassID(prhs[2])!=mxDOUBLE_CLASS) usagerr("imgpatches must be of type double.\n");
  if (mxGetClassID(prhs[3])!=mxSTRUCT_CLASS) usagerr("simMapParams must be a structure.\n");
  if (mxGetClassID(prhs[4])!=mxUINT32_CLASS) usagerr("nChannels must be a uint32.\n");
  
  xIndices=(COMindextype*)mxGetData(prhs[0]);
  yIndices=(COMindextype*)mxGetData(prhs[1]);
  numPatches=mxGetN(prhs[2])/3; // 3 channel image
  dimPatches=mxGetM(prhs[2]);
  //mexPrintf("numPatches=%d,dimPatches=%d\n",numPatches,dimPatches);return;

  //numXIndices=mxGetN(prhs[0]);numYIndices=mxGetN(prhs[1]);
  //numDescriptors=numXIndices*numYIndices;
  numDescriptors=mxGetN(prhs[0]);
  if(mxGetN(prhs[1])!=numDescriptors)
    usagerr("number of x-coordinates != number of y-coordinates; Exiting\n");

  nChannels=*(COMindextype*)mxGetData(prhs[4]);

  nFields=mxGetNumberOfFields(prhs[3]);
  nStructElements=mxGetNumberOfElements(prhs[3]);

  tmpArray=mxGetField(prhs[3],0,"interiorH");
  if(mxGetClassID(tmpArray)!=mxUINT32_CLASS) usagerr("interior Height, should be uint32\n");
  interiorH=(*(COMindextype*)mxGetData(tmpArray));

  tmpArray=mxGetField(prhs[3],0,"numRadiiIntervals");
  if(mxGetClassID(tmpArray)!=mxUINT32_CLASS) usagerr("numRadiiIntervals , should be uint32\n");
  numRadiiIntervals=(*(COMindextype*)mxGetData(tmpArray));

  tmpArray=mxGetField(prhs[3],0,"numThetaIntervals");
  if(mxGetClassID(tmpArray)!=mxUINT32_CLASS) usagerr("numThetaIntervals, should be uint32\n");
  numThetaIntervals=(*(COMindextype*)mxGetData(tmpArray));

  tmpArray=mxGetField(prhs[3],0,"coRelCircleOffsets");
  if(mxGetClassID(tmpArray)!=mxINT32_CLASS) usagerr("coRelCircleOffsets, should be int32\n");
  coRelCircleOffsets=(int*)mxGetData(tmpArray);
  numSSDs=mxGetN(tmpArray);

  tmpArray=mxGetField(prhs[3],0,"autoVarianceIndices");
  if(mxGetClassID(tmpArray)!=mxUINT32_CLASS) usagerr("autoVarianceIndices, should be uint32\n");
  autoVarianceIndices=(COMindextype*)mxGetData(tmpArray);
  numAutoVarianceIndices=mxGetM(tmpArray);

  tmpArray=mxGetField(prhs[3],0,"varNoise");
  if(mxGetClassID(tmpArray)!=mxDOUBLE_CLASS) usagerr("varNoise, should be double\n");
  varNoise=*mxGetPr(tmpArray);
 
  cellArrayPtr=mxGetField(prhs[3],0,"binIndices");
  if(mxGetClassID(cellArrayPtr)!=mxCELL_CLASS) usagerr("binIndices, should be cell class type\n");
  numBins=mxGetNumberOfElements(cellArrayPtr);

  binIndices=(COMindextype**)mxMalloc(sizeof(COMindextype*)*numBins);
  numBinIndices=(COMindextype*)mxMalloc(sizeof(COMindextype)*numBins);
  //mexPrintf("numBins=%d\n",numBins);
  for(int i=0;i<numBins;i++){
    tmpArray=mxGetCell(cellArrayPtr,i);
    if(mxGetClassID(tmpArray)!=mxUINT32_CLASS) usagerr("binIndices , should be uint32 type\n");
    binIndices[i]=(COMindextype*)mxGetData(tmpArray);
    numBinIndices[i]=mxGetM(tmpArray);
    //mexPrintf("numBinIndices[%d]=%d\n",i,numBinIndices[i]);
  }

  if(nChannels==3){
    COMmatrix imgPatches[3];
    imgPatches[0]=(COMmatrix)mxGetData(prhs[2]);
    imgPatches[1]=numPatches*dimPatches+imgPatches[0];
    imgPatches[2]=numPatches*dimPatches+imgPatches[1];

    COMmatrix curPatch[3];
    COMmatrix ssdS=(COMmatrix)mxMalloc(sizeof(COMbasetype)*numSSDs);
    COMindextype descSize=numThetaIntervals*numRadiiIntervals;
    plhs[0]=mxCreateDoubleMatrix(descSize,numDescriptors,mxREAL);
    COMmatrix outTraveller=(COMmatrix)mxGetData(plhs[0]);

    //mexPrintf("0=%f 1=%f 2=%f\n",(float)*imgPatches[0],(float)(*imgPatches[1]),(float)*imgPatches[2]);
    //mexPrintf("x= %d, y=%d \n",numXIndices,numYIndices); 

    for(int x=0;x<numDescriptors;x++,xIndices++,yIndices++){
      curPatch[0]=imgPatches[0]+((*xIndices)*interiorH+(*yIndices))*dimPatches;
      curPatch[1]=imgPatches[1]+((*xIndices)*interiorH+(*yIndices))*dimPatches;
      curPatch[2]=imgPatches[2]+((*xIndices)*interiorH+(*yIndices))*dimPatches;

      int* offsetTraveller=coRelCircleOffsets;
      COMmatrix ssdTraveller=ssdS;
      COMmatrix tmpPatch[3],tmpPatch2[3];
      for(int i=0;i<numSSDs;i++,offsetTraveller++,ssdTraveller++){
        *ssdTraveller=0;
        tmpPatch[0]=curPatch[0]+(*offsetTraveller)*dimPatches;
        tmpPatch[1]=curPatch[1]+(*offsetTraveller)*dimPatches;
        tmpPatch[2]=curPatch[2]+(*offsetTraveller)*dimPatches;
        tmpPatch2[0]=curPatch[0];
        tmpPatch2[1]=curPatch[1];
        tmpPatch2[2]=curPatch[2];
        for(int j=0;j<dimPatches;j++){
          COMbasetype diff;
          diff=*tmpPatch2[0]-*tmpPatch[0];tmpPatch[0]++;tmpPatch2[0]++;
          *ssdTraveller+=diff*diff;
          diff=*tmpPatch2[1]-*tmpPatch[1];tmpPatch[1]++;tmpPatch2[1]++;
          *ssdTraveller+=diff*diff;
          diff=*tmpPatch2[2]-*tmpPatch[2];tmpPatch[2]++;tmpPatch2[2]++;
          *ssdTraveller+=diff*diff;
        }

      }

      COMbasetype autoQ=0;
      for(int j=0;j<numAutoVarianceIndices;j++){
        COMbasetype tmp=ssdS[autoVarianceIndices[j]];
        autoQ=(tmp>autoQ)?tmp:autoQ;
      }

      COMbasetype divisor= (autoQ>varNoise)?autoQ:varNoise;
      ssdTraveller=ssdS;
      for(int k=0;k<numSSDs;k++,ssdTraveller++)
        *ssdTraveller=exp(-1*(*ssdTraveller)/divisor); 

      for(int l=0;l<numBins;l++,outTraveller++){
        COMbasetype max=0;
        COMindextype* curBinIndices=binIndices[l];
        for(int j=0;j<numBinIndices[l];j++){
          if(ssdS[curBinIndices[j]] > max) max=ssdS[curBinIndices[j]];
        }
        *outTraveller=max;
      }

    }
    mxFree(ssdS);mxFree(binIndices);mxFree(numBinIndices);
  }
  else if(nChannels==1){

    COMmatrix imgPatches;
    imgPatches=(COMmatrix)mxGetData(prhs[2]);

    COMmatrix curPatch;
    COMmatrix ssdS=(COMmatrix)mxMalloc(sizeof(COMbasetype)*numSSDs);
    COMindextype descSize=numThetaIntervals*numRadiiIntervals;
    plhs[0]=mxCreateDoubleMatrix(descSize,numDescriptors,mxREAL);
    COMmatrix outTraveller=(COMmatrix)mxGetData(plhs[0]);

    //mexPrintf("0=%f 1=%f 2=%f\n",(float)*imgPatches[0],(float)(*imgPatches[1]),(float)*imgPatches[2]);
    //mexPrintf("x= %d, y=%d \n",numXIndices,numYIndices); 

    for(int x=0;x<numDescriptors;x++,xIndices++,yIndices++){
      curPatch=imgPatches+((*xIndices)*interiorH+(*yIndices))*dimPatches;

      int* offsetTraveller=coRelCircleOffsets;
      COMmatrix ssdTraveller=ssdS;
      COMmatrix tmpPatch,tmpPatch2;
      for(int i=0;i<numSSDs;i++,offsetTraveller++,ssdTraveller++){
        *ssdTraveller=0;
        tmpPatch=curPatch+(*offsetTraveller)*dimPatches;
        tmpPatch2=curPatch;
        for(int j=0;j<dimPatches;j++){
          COMbasetype diff;
          diff=*tmpPatch2-*tmpPatch;tmpPatch++;tmpPatch2++;
          *ssdTraveller+=diff*diff;
        }

      }

      COMbasetype autoQ=0;
      for(int j=0;j<numAutoVarianceIndices;j++){
        COMbasetype tmp=ssdS[autoVarianceIndices[j]];
        autoQ=(tmp>autoQ)?tmp:autoQ;
      }

      COMbasetype divisor= (autoQ>varNoise)?autoQ:varNoise;
      ssdTraveller=ssdS;
      for(int k=0;k<numSSDs;k++,ssdTraveller++)
        *ssdTraveller=exp(-1*(*ssdTraveller)/divisor); 

      for(int l=0;l<numBins;l++,outTraveller++){
        COMbasetype max=0;
        COMindextype* curBinIndices=binIndices[l];
        for(int j=0;j<numBinIndices[l];j++){
          if(ssdS[curBinIndices[j]] > max) max=ssdS[curBinIndices[j]];
        }
        *outTraveller=max;
      }

    }
    mxFree(ssdS);mxFree(binIndices);mxFree(numBinIndices);
  }
  else{ mexPrintf("nChannels=%d\n");usagerr("nChannels can only be 1 or 3\n");}

  // Free: 
}