25 #ifndef __stir_recon_buildblock_GibbsRelativeDifferencePenalty_H__ 26 #define __stir_recon_buildblock_GibbsRelativeDifferencePenalty_H__ 61 template <
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;
149 template <
typename elemT>
151 GeneralisedPrior<DiscretisedDensity<3, elemT>>,
152 GibbsPenalty<elemT, RelativeDifferencePotential<elemT>>>
163 : base_type(only_2D, penalisation_factor)
165 this->potential.gamma = gamma_v;
166 this->potential.epsilon = epsilon_v;
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; }
176 #ifdef STIR_WITH_CUDA 191 template <
typename elemT>
192 class 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; }
void initialise_keymap(KeyParser &parser)
Method for setting up parsing additional parameters.
Definition: GibbsRelativeDifferencePenalty.h:120
A class to parse Interfile headers.
Definition: KeyParser.h:161
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:346
Implementation of the Relative Difference penalty potential.
Definition: GibbsRelativeDifferencePenalty.h:62
Multithreaded CPU Implementation of the Relative Difference penalty.
Definition: GibbsRelativeDifferencePenalty.h:150
A base class with CUDA-accelerated implementation of the GibbsPenalty class.
Definition: CudaGibbsPenalty.h:50
static bool is_convex()
method to indicate whether the the prior defined by this potential is convex
Definition: GibbsRelativeDifferencePenalty.h:117
void set_defaults()
Set default values for potential-specific parameters.
Definition: GibbsRelativeDifferencePenalty.h:127
Declaration of the stir::GibbsPenalty class.
A base class for 'generalised' priors, i.e. priors for which at least a 'gradient' is defined...
Definition: GeneralisedPrior.h:42
Parent class for all leaves in a RegisteredObject hierarchy that do parsing of parameter files...
Definition: RegisteredParsingObject.h:77
A base class for Gibbs type penalties in the GeneralisedPrior hierarchy.
Definition: GibbsPenalty.h:98
Declaration of the stir::CudaGibbsPenalty class.
some utilities for STIR and CUDA
Declaration of class stir::RegisteredParsingObject.