contents

huber_weight

Called by:   calc_weight each iteration that weighting_type is set to huber.

Includes:   iscloc.h

External:
Threshold for difference between residual and alpha, CUT_OFF [0.8275].
min_phases        set in read_config
init_max_resid   set in read_config
max_resid          set in read_config

Input arguments:
Pointer to solution structure.
Array of phase structures.

Structure members updated:
weight in  phase structure.
alpha in solution structure.
prev_alpha in solution structure first iteration only.

Return:   0/1 for success/failure.

Huber-t weighting designed to get a basic solution before using more complex but less stable uniform reduction weighting (implemented here in buland_weight) to get a final solution.  First the average weighted residual, alpha, is calculated then each phase is given a weight depending on the difference between its residual and alpha.  If the difference is greater than CUT_OFF, a constant defined as a macro in this file, then the weight is set to CUT_OFF divided by the difference.  Otherwise the weight is set to 1.

No weight is given to a phase if its residual is greater than  max_resid and before a weight is assigned it is multiplied by weight_factor for this phase, which will be 0 unless this type of phase is wanted at this particular delta.  Once all phases have been weighted the number with non-zero weights is counted and if the total is less than min_phases then the solution is aborted and restarted with the next option or seed.

The first time that this function is called it can not calculate alpha in the normal way because the phases do not have weights yet.  Instead provisional weights are calculated with alpha as the unweighted average of all residuals less than init_max_resid.  Then alpha is recalculated from these provisional weights and used in the calculation of the weights that will be used in the solution.  The initial, unweighted alpha is stored as prev_alpha in the  solution structure for comparison with alpha in the function decide_iter.

This weighting scheme was first programmed at the ISC by R. Buland in 1987.  Here is his comment from that code:

The cutoff, s, between least squares behavior and one-norm behavior has been determined empirically to optimize efficiency against the distribution of teleseismic travel-time residuals.  For this case, the efficiency is about .905 which is quite close to the optimal efficiency achievable with a non-decreasing influence function.  Except for the non-linearity inherent in the earthquake location problem, this weighting would always produce unique results.