25#ifndef __stir_recon_buildblock_GibbsRelativeDifferencePenalty_H__
26#define __stir_recon_buildblock_GibbsRelativeDifferencePenalty_H__
61template <
typename elemT>
68 __host__ __device__
inline double value(
const elemT val_center,
const elemT val_neigh,
int z,
int y,
int x)
const
72 const elemT diff = val_center - val_neigh;
73 const elemT add = val_center + val_neigh;
74 const elemT NUM = 0.5 * (diff * diff);
75 const elemT DEN = 1.0 / (add + gamma * fabs(diff) + epsilon);
81 __host__ __device__
inline double derivative_10(
const elemT val_center,
const elemT val_neigh,
int z,
int y,
int x)
const
86 const elemT diff = val_center - val_neigh;
87 const elemT factor = val_center + val_neigh + gamma * fabs(diff) + epsilon;
88 const elemT NUM = 0.5 * diff * (factor + 2 * val_neigh + epsilon);
89 const elemT DEN = 1.0 / (factor * factor);
95 __host__ __device__
inline double derivative_20(
const elemT val_center,
const elemT val_neigh,
int z,
int y,
int x)
const
99 const elemT NUM = 2 * val_neigh + epsilon;
100 const elemT DEN = 1.0 / (val_center + val_neigh + gamma * fabs(val_center - val_neigh) + epsilon);
102 return NUM * NUM * DEN * DEN * DEN;
105 __host__ __device__
inline double derivative_11(
const elemT val_center,
const elemT val_neigh,
int z,
int y,
int x)
const
110 const elemT NUM = -(2 * val_center + epsilon) * (2 * val_neigh + epsilon);
111 const elemT DEN = 1.0 / (val_center + val_neigh + gamma * fabs(val_center - val_neigh) + epsilon);
113 return NUM * DEN * DEN * DEN;
122 parser.
add_key(
"gamma value", &this->gamma);
123 parser.
add_key(
"epsilon value", &this->epsilon);
130 this->epsilon = 1e-7;
149template <
typename elemT>
151 GeneralisedPrior<DiscretisedDensity<3, elemT>>,
152 GibbsPenalty<elemT, RelativeDifferencePotential<elemT>>>
161 GibbsRelativeDifferencePenalty() { this->
set_defaults(); }
162 GibbsRelativeDifferencePenalty(
const bool only_2D,
float penalisation_factor,
float gamma_v,
float epsilon_v)
163 : base_type(
only_2D, penalisation_factor)
169 static constexpr const char* registered_name =
"Gibbs Relative Difference";
170 float get_gamma()
const {
return this->
potential.gamma; }
171 float get_epsilon()
const {
return this->
potential.epsilon; }
172 void set_gamma(
float gamma_v) { this->
potential.gamma = gamma_v; }
173 void set_epsilon(
float epsilon_v) { this->
potential.epsilon = epsilon_v; }
191template <
typename elemT>
192class CudaGibbsRelativeDifferencePenalty
194 GeneralisedPrior<DiscretisedDensity<3, elemT>>,
195 CudaGibbsPenalty<elemT, RelativeDifferencePotential<elemT>>>
204 CudaGibbsRelativeDifferencePenalty() { this->set_defaults(); }
205 CudaGibbsRelativeDifferencePenalty(
const bool only_2D,
float penalisation_factor,
float gamma_v,
float epsilon_v)
206 : base_type(only_2D, penalisation_factor)
208 this->potential.gamma = gamma_v;
209 this->potential.epsilon = epsilon_v;
212 static constexpr const char* registered_name =
"Cuda Gibbs Relative Difference";
213 float get_gamma()
const {
return this->potential.gamma; }
214 float get_epsilon()
const {
return this->potential.epsilon; }
215 void set_gamma(
float gamma_v) { this->potential.gamma = gamma_v; }
216 void set_epsilon(
float epsilon_v) { this->potential.epsilon = epsilon_v; }
Declaration of the stir::CudaGibbsPenalty class.
Declaration of the stir::GibbsPenalty class.
Declaration of class stir::RegisteredParsingObject.
A base class with CUDA-accelerated implementation of the GibbsPenalty class.
Definition CudaGibbsPenalty.h:52
A base class for 'generalised' priors, i.e. priors for which at least a 'gradient' is defined.
Definition GeneralisedPrior.h:44
A base class for Gibbs type penalties in the GeneralisedPrior hierarchy.
Definition GibbsPenalty.h:99
potentialT potential
Gibbs Potential Function.
Definition GibbsPenalty.h:186
void set_defaults() override
sets value for penalisation factor
Definition GibbsPenalty.inl:158
bool only_2D
can be set during parsing to restrict the weights to the 2D case
Definition GibbsPenalty.h:173
A class to parse Interfile headers.
Definition KeyParser.h:162
void add_key(const std::string &keyword, float *variable_ptr)
add a keyword. When parsing, parse its value as a float and put it in *variable_ptr
Definition KeyParser.cxx:343
Parent class for all leaves in a RegisteredObject hierarchy that do parsing of parameter files.
Definition RegisteredParsingObject.h:78
Implementation of the Relative Difference penalty potential.
Definition GibbsRelativeDifferencePenalty.h:63
static bool is_convex()
method to indicate whether the the prior defined by this potential is convex
Definition GibbsRelativeDifferencePenalty.h:117
__host__ __device__ double value(const elemT val_center, const elemT val_neigh, int z, int y, int x) const
Method for computing the potential value.
Definition GibbsRelativeDifferencePenalty.h:68
__host__ __device__ double derivative_20(const elemT val_center, const elemT val_neigh, int z, int y, int x) const
Method for computing the second derivative with respect to val_center.
Definition GibbsRelativeDifferencePenalty.h:95
__host__ __device__ double derivative_11(const elemT val_center, const elemT val_neigh, int z, int y, int x) const
Method for computing the mixed second derivative.
Definition GibbsRelativeDifferencePenalty.h:105
void set_defaults()
Set default values for potential-specific parameters.
Definition GibbsRelativeDifferencePenalty.h:127
__host__ __device__ double derivative_10(const elemT val_center, const elemT val_neigh, int z, int y, int x) const
Method for computing the first derivative with respect to val_center.
Definition GibbsRelativeDifferencePenalty.h:81
void initialise_keymap(KeyParser &parser)
Method for setting up parsing additional parameters.
Definition GibbsRelativeDifferencePenalty.h:120
some utilities for STIR and CUDA