Skip to content

Commit

Permalink
nf: sse using surface et al 2 (freesurfer#683)
Browse files Browse the repository at this point in the history
* next step towards being able to compute the SSE on a faster structure

* Started adding support for choosing the particular vno or fno to calculate a term on, and start using the Surface to calculate some terms
  • Loading branch information
emtpgeek authored and ahoopes committed Jul 2, 2019
1 parent 35d88f3 commit 1b86a4a
Show file tree
Hide file tree
Showing 8 changed files with 492 additions and 524 deletions.
19 changes: 2 additions & 17 deletions include/mrisurf.h
Original file line number Diff line number Diff line change
Expand Up @@ -536,11 +536,8 @@ int MRISfindClosestWhiteVertex(MRI_SURFACE *mris, float x, float y,
int MRISfindClosestVertex(MRI_SURFACE *mris,
float x, float y, float z,
float *dmin, int which_vertices);
double MRIScomputeSSE(MRI_SURFACE *mris, INTEGRATION_PARMS *parms) ;
double MRIScomputeSSEExternal(MRI_SURFACE *mris, INTEGRATION_PARMS *parms,
double *ext_sse) ;
double MRIScomputeCorrelationError(MRI_SURFACE *mris,
MRI_SP *mrisp_template, int fno) ;

double MRIScomputeCorrelationError(MRI_SURFACE *mris, MRI_SP *mrisp_template, int fno) ;
int MRISallocExtraGradients(MRI_SURFACE *mris) ;
MRI_SURFACE *MRISread(const char *fname) ;
MRI_SURFACE *MRISreadOverAlloc(const char *fname, double nVFMultiplier) ;
Expand Down Expand Up @@ -873,18 +870,6 @@ double MRISmomentumTimeStep(MRI_SURFACE *mris,

int MRISapplyGradient(MRI_SURFACE *mris, double dt) ;

typedef struct MRIScomputeSSE_asThoughGradientApplied_ctx MRIScomputeSSE_asThoughGradientApplied_ctx;
void MRIScomputeSSE_asThoughGradientApplied_ctx_free(MRIScomputeSSE_asThoughGradientApplied_ctx** ctx);

double MRIScomputeSSE_asThoughGradientApplied(
MRIS* mris,
double delta_t,
INTEGRATION_PARMS* parms,
MRIScomputeSSE_asThoughGradientApplied_ctx ** ctx);
// ctx should be NULL on the first call,
// should be passed to MRIScomputeSSE_asThoughGradientApplied_ctx_free
// before any changes to the MRIS happen

int MRIScomputeNormals(MRI_SURFACE *mris) ;
int MRIScomputeSurfaceNormals(MRI_SURFACE *mris,
int which,
Expand Down
1 change: 0 additions & 1 deletion include/mrisurf_metricProperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,6 @@ int mriSurfaceRASToVoxel(double xr, double yr, double zr, double *xv, double *yv
#endif

float mrisSampleAshburnerTriangleEnergy (MRIS * const mris, int const vno, INTEGRATION_PARMS * const parms, float cx, float cy, float cz);
double mrisComputeThicknessSmoothnessEnergy (MRIS *mris, double l_tsmooth, INTEGRATION_PARMS *parms);
float mrisSampleMinimizationEnergy (MRIS *mris, int const vno, INTEGRATION_PARMS *parms, float cx, float cy, float cz);
float mrisSampleParallelEnergyAtVertex (MRIS *mris, int const vno, INTEGRATION_PARMS *parms);
float mrisSampleParallelEnergy (MRIS *mris, int const vno, INTEGRATION_PARMS *parms, float cx, float cy, float cz);
Expand Down
71 changes: 39 additions & 32 deletions include/mrisurf_sseTerms.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ void mrismp_ComputeFaceRelevantAngleAndArea(MRIS_MP* mris, INTEGRATION_PARMS *pa
int mrisAverageSignedGradients (MRIS* mris, int num_avgs);
int mrisComputePositioningGradients (MRIS* mris, INTEGRATION_PARMS *parms);

double MRIScomputeSSE (MRI_SURFACE *mris, INTEGRATION_PARMS *parms);
double MRIScomputeSSEExternal(MRI_SURFACE *mris, INTEGRATION_PARMS *parms, double *ext_sse);

// MEF support
//
Expand All @@ -68,79 +70,84 @@ int mrisComputeIntensityTerm_mef (MRI_SURFACE *mris,
INTEGRATION_PARMS *parms);

// energy measurements
// the selector parameter lets the caller compute the term on the specified vertex or face rather than summing all of them
// mostly it is NYI
//
#define LIST_OF_PER_VERTEX_SSETERMS_NYI \
ELT(AshburnerTriangleEnergy , (MRIS_PARAMETER_COMMA double l_ashburner_triangle, INTEGRATION_PARMS *parms ), (l_ashburner_triangle,parms)) SEP \
ELT(LaplacianEnergy , (MRIS_PARAMETER ), ()) SEP \
ELT(NonlinearSpringEnergy , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(RepulsiveEnergy , (MRIS_PARAMETER_COMMA double l_repulse, MHT *mht_v_current, MHT *mht_f_current ), (l_repulse, mht_v_current, mht_f_current)) SEP \
ELT(SurfaceRepulsionEnergy , (MRIS_PARAMETER_COMMA double l_repulse, MHT *mht ), (l_repulse, mht)) SEP \
ELT(TangentialSpringEnergy , (MRIS_PARAMETER ), ()) \
ELT(AshburnerTriangleEnergy , (MRIS_PARAMETER_COMMA double l_ashburner_triangle, INTEGRATION_PARMS *parms ,int selector DEFSEL), (l_ashburner_triangle,parms,selector)) SEP \
ELT(LaplacianEnergy , (MRIS_PARAMETER_COMMA int selector DEFSEL), (selector)) SEP \
ELT(NonlinearSpringEnergy , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(RepulsiveEnergy , (MRIS_PARAMETER_COMMA double l_repulse, MHT *mht_v_current, MHT *mht_f_current ,int selector DEFSEL), (l_repulse, mht_v_current, mht_f_current,selector)) SEP \
ELT(SurfaceRepulsionEnergy , (MRIS_PARAMETER_COMMA double l_repulse, MHT *mht ,int selector DEFSEL), (l_repulse, mht,selector)) SEP \
ELT(TangentialSpringEnergy , (MRIS_PARAMETER_COMMA int selector DEFSEL), (selector)) \
// end of macro

#define LIST_OF_PER_VERTEX_SSETERMS_Implemented \
ELT(RepulsiveRatioEnergy , (MRIS_PARAMETER_COMMA double l_repulse ), (l_repulse)) SEP \
ELT(SpringEnergy , (MRIS_PARAMETER ), ()) SEP \
ELT(ThicknessMinimizationEnergy , (MRIS_PARAMETER_COMMA double l_thick_min, INTEGRATION_PARMS *parms ), (l_thick_min,parms)) SEP \
ELT(ThicknessNormalEnergy , (MRIS_PARAMETER_COMMA double l_thick_normal, INTEGRATION_PARMS *parms ), (l_thick_normal,parms)) SEP \
ELT(ThicknessSpringEnergy , (MRIS_PARAMETER_COMMA double l_thick_spring, INTEGRATION_PARMS *parms ), (l_thick_spring,parms)) SEP \
ELT(ThicknessParallelEnergy , (MRIS_PARAMETER_COMMA double l_thick_parallel, INTEGRATION_PARMS *parms ), (l_thick_parallel,parms)) SEP \
ELT(ThicknessSmoothnessEnergy , (MRIS_PARAMETER_COMMA double l_tsmooth, INTEGRATION_PARMS *parms ), (l_tsmooth,parms)) SEP \
ELT(RepulsiveRatioEnergy , (MRIS_PARAMETER_COMMA double l_repulse ,int selector DEFSEL), (l_repulse,selector)) SEP \
ELT(SpringEnergy , (MRIS_PARAMETER_COMMA int selector DEFSEL), (selector)) SEP \
ELT(ThicknessMinimizationEnergy , (MRIS_PARAMETER_COMMA double l_thick_min, INTEGRATION_PARMS *parms ,int selector DEFSEL), (l_thick_min,parms,selector)) SEP \
ELT(ThicknessNormalEnergy , (MRIS_PARAMETER_COMMA double l_thick_normal, INTEGRATION_PARMS *parms ,int selector DEFSEL), (l_thick_normal,parms,selector)) SEP \
ELT(ThicknessSpringEnergy , (MRIS_PARAMETER_COMMA double l_thick_spring, INTEGRATION_PARMS *parms ,int selector DEFSEL), (l_thick_spring,parms,selector)) SEP \
ELT(ThicknessParallelEnergy , (MRIS_PARAMETER_COMMA double l_thick_parallel, INTEGRATION_PARMS *parms ,int selector DEFSEL), (l_thick_parallel,parms,selector)) SEP \
ELT(ThicknessSmoothnessEnergy , (MRIS_PARAMETER_COMMA double l_tsmooth, INTEGRATION_PARMS *parms ,int selector DEFSEL), (l_tsmooth,parms,selector)) SEP \
/**/ \
ELT(NonlinearDistanceSSE , (MRIS_PARAMETER ), ()) SEP \
ELT(QuadraticCurvatureSSE , (MRIS_PARAMETER_COMMA double l_curv ), (l_curv)) SEP \
ELT(HistoNegativeLikelihood , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(NegativeLogPosterior , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int *pnvox ), (parms,pnvox)) SEP \
ELT(NegativeLogPosterior2D , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int *pnvox ), (parms,pnvox)) SEP \
ELT(NonlinearDistanceSSE , (MRIS_PARAMETER_COMMA int selector DEFSEL), (selector)) SEP \
ELT(QuadraticCurvatureSSE , (MRIS_PARAMETER_COMMA double l_curv ,int selector DEFSEL), (l_curv,selector)) SEP \
ELT(HistoNegativeLikelihood , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(NegativeLogPosterior , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int *pnvox ,int selector DEFSEL), (parms,pnvox,selector)) SEP \
ELT(NegativeLogPosterior2D , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int *pnvox ,int selector DEFSEL), (parms,pnvox,selector)) SEP \
/**/ \
ELT(CorrelationError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int use_stds ), (parms,use_stds)) SEP \
ELT(DistanceError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(DuraError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(IntensityError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(TargetLocationError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(IntensityGradientError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ), (parms)) SEP \
ELT(VectorCorrelationError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int use_stds ), (parms,use_stds)) SEP \
ELT(ExpandwrapError , (MRIS_PARAMETER_COMMA MRI *mri_brain, double l_expandwrap, double target_radius), (mri_brain,l_expandwrap,target_radius)) SEP \
ELT(ShrinkwrapError , (MRIS_PARAMETER_COMMA MRI *mri_brain, double l_shrinkwrap ), (mri_brain,l_shrinkwrap)) SEP \
ELT(SphereError , (MRIS_PARAMETER_COMMA double l_sphere, double r0 ), (l_sphere,r0)) SEP \
ELT(RmsDistanceError , (MRIS_PARAMETER ), ()) SEP \
ELT(CorrelationError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int use_stds ,int selector DEFSEL), (parms,use_stds,selector)) SEP \
ELT(DistanceError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(DuraError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(IntensityError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(TargetLocationError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(IntensityGradientError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms ,int selector DEFSEL), (parms,selector)) SEP \
ELT(VectorCorrelationError , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, int use_stds ,int selector DEFSEL), (parms,use_stds,selector)) SEP \
ELT(ExpandwrapError , (MRIS_PARAMETER_COMMA MRI *mri_brain, double l_expandwrap, double target_radius,int selector DEFSEL), (mri_brain,l_expandwrap,target_radius,selector)) SEP \
ELT(ShrinkwrapError , (MRIS_PARAMETER_COMMA MRI *mri_brain, double l_shrinkwrap ,int selector DEFSEL), (mri_brain,l_shrinkwrap,selector)) SEP \
ELT(SphereError , (MRIS_PARAMETER_COMMA double l_sphere, double r0 ,int selector DEFSEL), (l_sphere,r0,selector)) SEP \
ELT(RmsDistanceError , (MRIS_PARAMETER_COMMA int selector DEFSEL), (selector)) SEP \
ELT(Error , (MRIS_PARAMETER_COMMA INTEGRATION_PARMS *parms, \
float *parea_rms, \
float *pangle_rms,\
float *pcurv_rms, \
float *pdist_rms, \
float *pcorr_rms ), (parms,parea_rms,pangle_rms,pcurv_rms,pdist_rms,pcorr_rms)) \
float *pcorr_rms ,int selector DEFSEL), (parms,parea_rms,pangle_rms,pcurv_rms,pdist_rms,pcorr_rms,selector)) \
// end of macro

#define LIST_OF_PER_VERTEX_SSETERMS LIST_OF_PER_VERTEX_SSETERMS_NYI SEP LIST_OF_PER_VERTEX_SSETERMS_Implemented

#define LIST_OF_PER_FACE_SSETERMS \
ELT(NonlinearAreaSSE , (MRIS_PARAMETER ), ()) \
ELT(NonlinearAreaSSE , (MRIS_PARAMETER_COMMA int selector DEFSEL), (selector)) \
// end of macro


#define LIST_OF_SSETERMS LIST_OF_PER_VERTEX_SSETERMS SEP LIST_OF_PER_FACE_SSETERMS


#define MRIS_PARAMETER MRIS* mris
#define MRIS_PARAMETER_COMMA MRIS_PARAMETER,
#define DEFSEL =-1
#define SEP
#define ELT(NAME, SIGNATURE, CALL) double mrisCompute##NAME SIGNATURE;
LIST_OF_SSETERMS
#undef ELT
#undef SEP
#undef DEFSEL
#undef MRIS_PARAMETER_COMMA
#undef MRIS_PARAMETER

#define MRIS_PARAMETER MRIS* mris
#define MRIS_PARAMETER_COMMA MRIS_PARAMETER,
#define DEFSEL =-1
#define SEP
#define MRIS MRIS_MP
#define ELT(NAME, SIGNATURE, CALL) double mrismp_Compute##NAME SIGNATURE;
LIST_OF_PER_VERTEX_SSETERMS_Implemented SEP LIST_OF_PER_FACE_SSETERMS
#undef ELT
#undef MRIS
#undef SEP
#undef DEFSEL
#undef MRIS_PARAMETER_COMMA
#undef MRIS_PARAMETER

Expand Down
16 changes: 16 additions & 0 deletions utils/mrisurf_deform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,22 @@ int MRISapplyGradient(MRIS* mris, double dt)
}


struct MRIScomputeSSE_asThoughGradientApplied_ctx::Impl {
// NYI
};


MRIScomputeSSE_asThoughGradientApplied_ctx::MRIScomputeSSE_asThoughGradientApplied_ctx()
: _impl(new Impl)
{
}

MRIScomputeSSE_asThoughGradientApplied_ctx::~MRIScomputeSSE_asThoughGradientApplied_ctx()
{
delete _impl;
}


/*-----------------------------------------------------
Parameters:
Expand Down
16 changes: 16 additions & 0 deletions utils/mrisurf_deform.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,19 @@ int mrisLogStatus(MRI_SURFACE *mris, INTEGRATION_PARMS *parms, FILE *fp, float d

bool MRISMP_computeSSE_canDo( INTEGRATION_PARMS *parms);
double MRISMP_computeSSE (MRIS_MP* mris, INTEGRATION_PARMS *parms);


struct MRIScomputeSSE_asThoughGradientApplied_ctx {
MRIScomputeSSE_asThoughGradientApplied_ctx();
~MRIScomputeSSE_asThoughGradientApplied_ctx();
private:
struct Impl;
Impl* _impl;
};

double MRIScomputeSSE_asThoughGradientApplied(
MRIS* mris,
double delta_t,
INTEGRATION_PARMS* parms,
MRIScomputeSSE_asThoughGradientApplied_ctx& ctx);

Loading

0 comments on commit 1b86a4a

Please sign in to comment.