DLDialogBoxCustomizer Class Reference
| Inherits from | NSObject |
| Conforms to | NSCopying |
| Declared in | DLDialogBox.h |
Overview
A DLDialogBoxCustomizer is used to determine the look, functionalities, and the animations related to a DLDialogBox.
Every DLDialogBox must use a dialog customizer. If no customizers are given the dialog box will automatically use the default customizer provided through defaultCustomizer.
The reason a customizer class is used to store how a dialog box should look,
function and animate is because this way you can reuse a single
Tasks
Customizing look/UI
-
dialogSize
property -
dialogPosition
property -
dialogAnchorPoint
property -
backgroundSpriteFile
property -
backgroundSpriteFrameName
property -
backgroundColor
property -
pageFinishedIndicatorSpriteFrameName
property -
pageFinishedIndicatorSpriteFile
property -
pageFinishedIndicatorAnimation
property -
hidePageFinishedIndicatorOnLastPage
property -
dialogTextInsets
property -
portraitPosition
property -
portraitInsets
property -
portraitInsideDialog
property -
fntFile
property -
choiceDialogCustomizer
property
Customizing functionalities
-
tapToFinishCurrentPage
property -
handleTapInputs
property -
handleOnlyTapInputsInDialogBox
property -
swallowAllTouches
property -
closeWhenDialogFinished
property -
typingSpeed
property
Sound related
-
textPageStartedSoundFileName
property
Custom Animations
Properties
backgroundColor
If a sprite is not provided as the dialog’s background, this property will be used as the background color of the dialog box.
@property (nonatomic) ccColor4B backgroundColor
Discussion
You can create a ccColor4B
via ccc4(red, blue, green, alpha)
.
Note that all color values are from 0-255.
Defaults to a semi-transparent black color (ccc4(0,0,0,0.8*255)
).
Declared In
DLDialogBox.h
backgroundSpriteFile
The file name of a stretchable sprite image that will be used as the background image for the dialog box.
@property (nonatomic, copy) NSString *backgroundSpriteFile
Discussion
If the backgroundSpriteFrameName
is also provided, then this value will be ignored.
Please refer to the usage documentation on how the sprite image should be made.
Declared In
DLDialogBox.h
backgroundSpriteFrameName
The sprite frame name of a stretchable sprite image that will be used as the background image for the dialog box.
@property (nonatomic, copy) NSString *backgroundSpriteFrameName
Discussion
If a backgroundSpriteFile
is also provided, then only this value will be used.
Please refer to usage documentation on how the sprite image should be made.
Declared In
DLDialogBox.h
choiceDialogCustomizer
The DLChoiceDialogCustomizer
for the dialog box’s choice dialog.
@property (nonatomic, strong) DLChoiceDialogCustomizer *choiceDialogCustomizer
Discussion
Defaults to the default DLChoiceDialogCustomizer
Declared In
DLDialogBox.h
closeWhenDialogFinished
When enabled, this dialog box will automatically close when the dialog has finished all its tasks.
@property (nonatomic) BOOL closeWhenDialogFinished
Discussion
When there are no choices to be shown, this will allow the player to close this dialog box on tap after all text pages are displayed.
When there are choices to be displayed at the end, this dialog will close automatically after a choice is selected (animated if the choice dialog has a hideAnimation).
Defaults to YES
Declared In
DLDialogBox.h
dialogAnchorPoint
The anchor point of the dialog box.
@property (nonatomic) CGPoint dialogAnchorPoint
Discussion
The DLDialogBox will use this anchor point when configured with a customizer.
Defaults to (0, 0)
Declared In
DLDialogBox.h
dialogPosition
The position of the dialog box.
@property (nonatomic) CGPoint dialogPosition
Discussion
The DLDialogBox will use this position when configured with a customizer. However you can set the dialog box’s position manually to override this position.
Defaults to (0, 0)
Declared In
DLDialogBox.h
dialogSize
The size of dialog box (not including the portrait if its outside).
@property (nonatomic) CGSize dialogSize
Discussion
Default is (current device width, kDialogHeightNormal)
The default dialog size will make a dialog what stretches across the device and can roughly accommodates 3 rows of text in landscape mode.
Please note that DLDialogBox does not automatically scale the dialog’s height
according to the content so you must make sure to set the
We provided some height constants for you to use:
kDialogBoxHeightSmall
accommodates about 1-2 lines of textkDialogBoxHeightNormal
accommodates about 3-4 lines of text and is the default heightkDialogBoxHeightLarge
accommodates about 4-5 lines of text
Declared In
DLDialogBox.h
dialogTextInsets
In CSS terms, this is essentially the margin of the dialog text.
@property (nonatomic) UIEdgeInsets dialogTextInsets
Discussion
If the dialog box has an inner portrait on the left side of the dialog, then the insets correspond to the spacing between the dialog box and the inner portrait.
Please note that this value is also used as the default insets between the
Defaults to (10, 10, 10, 10)
Declared In
DLDialogBox.h
fntFile
The font file used by the dialog for displaying text.
@property (nonatomic, copy) NSString *fntFile
Discussion
This font file is also used by the choice dialog if the font file for choiceDialogCustomizer is not set.
Defaults to the demo fnt file (demo_fnt.fnt
) attached with the project
Declared In
DLDialogBox.h
handleOnlyTapInputsInDialogBox
When enabled, this dialog box will only process tap inputs that are inside the dialog box.
@property (nonatomic) BOOL handleOnlyTapInputsInDialogBox
Declared In
DLDialogBox.h
handleTapInputs
When enabled, the dialog box will process all tap inputs on the screen.
@property (nonatomic) BOOL handleTapInputs
Discussion
By default when the dialog’s typing animation has finished, tap inputs will result in the dialog displaying the following page.
Also depending on what other functionalities are enabled, tap inputs will also do other things.
Defaults to YES
See Also
Declared In
DLDialogBox.h
hideAnimation
A block that is run when closing the dialog.
@property (nonatomic, copy) DLAnimationBlock hideAnimation
Discussion
You should use this to make custom hide animations.
This animation block is automatically run if closeWhenDialogFinished is set to YES and the dialog has finished.
Or you can run this animation block manually by calling [DLDialogBox playHideAnimationOrRemoveFromParent] on the dialog box.
Note: You should call [DLDialogBox removeFromParentAndCleanupAfterDelay:] in your animation block to remove the dialog box after the duration of your hide animation. This is required because DLDialogBox will not remove itself after the hide animation has played.
Declared In
DLDialogBox.h
hidePageFinishedIndicatorOnLastPage
Hides the page finished indicator for the last page of the dialog box.
@property (nonatomic) BOOL hidePageFinishedIndicatorOnLastPage
Discussion
By default, JRPGs hide the indicator on the last page of the text so that the player knows that there are no more text to display next. However sometimes you may want to follow up one dialog box immediately with another one from another npc, thus it might look better to set this value to NO for these cases to show that they are more dialogs to follow.
Defaults to YES
Declared In
DLDialogBox.h
pageFinishedIndicatorAnimation
The animation to play for the page finished indicator when its displayed.
@property (nonatomic, copy) DLAnimationBlock pageFinishedIndicatorAnimation
Discussion
If not provided, the indicator will just appear instantly.
Defaults to a blinking animation
Declared In
DLDialogBox.h
pageFinishedIndicatorSpriteFile
Name of the sprite file for the page finished indicator.
@property (nonatomic, copy) NSString *pageFinishedIndicatorSpriteFile
Discussion
If pageFinishedIndicatorSpriteFrameName is provided, then this value will not be used.
Declared In
DLDialogBox.h
pageFinishedIndicatorSpriteFrameName
This is the sprite frame name for the sprite to be used by the dialog box after a page of text is displayed.
@property (nonatomic, copy) NSString *pageFinishedIndicatorSpriteFrameName
Discussion
By default DLDialogBox will position the page finished indicator at the bottom right corner of the dialog box.
By default defaultCustomizer
sets this to the name of the arrow
cursor sprite attached with the project.
Note: When this property is set, pageFinishedIndicatorSpriteFile will not be used.
See Also
Declared In
DLDialogBox.h
portraitInsets
This is essentially the margin of the portrait sprite.
@property (nonatomic) UIEdgeInsets portraitInsets
Discussion
By default the portrait sprite is placed at the bottom left corner of the dialog box if portraitInsideDialog is set to NO.
If portraitInsideDialog is YES, then the portrait is positioned in the top left corner of the dialog box.
Defaults to (0, 0, 0, 0)
Declared In
DLDialogBox.h
portraitInsideDialog
If set to YES, the dialog’s portrait will appear inside the dialog box.
@property (nonatomic) BOOL portraitInsideDialog
Discussion
By default the portrait will be placed outside of the dialog box so you can use a big beautiful portrait that is just super fabulous.
However if portraitInsideDialog
is set to YES, then the portrait will instead
be placed inside the dialog.
Defaults to NO
See Also
Declared In
DLDialogBox.h
portraitPosition
Position of the portrait in the dialog box.
@property (nonatomic) DialogPortraitPosition portraitPosition
Discussion
This value can be kDialogPortraitPositionLeft
or kDialogPortraitPositionRight
Defaults to kDialogPortraitPositionLeft
Declared In
DLDialogBox.h
showAnimation
A block that is run during the onEnter method to display the dialog.
@property (nonatomic, copy) DLAnimationBlock showAnimation
Discussion
You should use this to make custom show animations.
This animation block will be run automatically after the dialog box is added to a parent.
Declared In
DLDialogBox.h
swallowAllTouches
If enabled, the dialog box will swallow all touches inputs. This can essentially disable all touch inputs aside from this dialog box and its choice dialog.
@property (nonatomic) BOOL swallowAllTouches
Discussion
Enabling this is an easy way to disable all other user inputs when the dialog box is displayed.
However it is likely that you still want your player to tap on things like the
menu button etc, thus swallowAllTouches
is set to NO by default so that you
can disable user inputs manually.
Please note that once a DLDialogBox has been displayed, changing this value will not change the behaviour of the DLDialogBox since this property, unlike the other fuctionality related properties, is evaluated only when DLDialogBox is first displayed.
Note: If something has a higher touch priority than kDialogBoxTouchPriority
,
then that receiver will receive touch events even with swallowAllTouches
set to YES. However kDialogBoxTouchPriority
is currently set to a such
low value that this dialog box should have the highest touch priority.
Defaults to NO
Declared In
DLDialogBox.h
tapToFinishCurrentPage
If enabled, tap inputs during dialog typing animation will immediately finish the current page, bypassing anymore typing animations.
@property (nonatomic) BOOL tapToFinishCurrentPage
Discussion
If the page is already finished then tapping will go to the next page.
Defaults to YES
Declared In
DLDialogBox.h
Class Methods
customHideAnimationWithSlideDistance:fadeOut:duration:
Returns a common hide animation for the dialog so you don’t have to write them!
+ (DLAnimationBlock)customHideAnimationWithSlideDistance:(CGFloat)distance fadeOut:(BOOL)fadeOut duration:(ccTime)duration
Parameters
- distance
The distance the dialog should travel for the slide down.
- fadeOut
Fades the dialog out.
- duration
Duration of the whole animation sequence.
Discussion
Note: The default slide direction is down. However if you want the dialog content box to slide up instead of sliding down when hiding then just specify a negative distance. Furthermore, the move animation will not be performed if the distance is 0.
Declared In
DLDialogBox.h
customShowAnimationWithSlideDistance:fadeIn:duration:
Returns a common show animation for the dialog so you don’t have to write them!
+ (DLAnimationBlock)customShowAnimationWithSlideDistance:(CGFloat)distance fadeIn:(BOOL)fadeIn duration:(ccTime)duration
Parameters
- distance
The distance the dialog should travel for the slide up.
- fadeIn
Fades the dialog in.
- duration
Duration of the whole animation sequence.
Discussion
Note: The default slide direction is up. However if you want the dialog content box to slide down instead of sliding up when showing then just specify a negative distance. Furthermore, the move animation will not be performed if the distance is 0.
Declared In
DLDialogBox.h


semivariance module¶
Available classes and functions:
ArealSemivariance: Class calculates semivariance of areas for Poisson Kriging (area to area and area to point),
RegularizedSemivariogram: Class performs deconvolution of semivariogram of areal data,
calculate_covariance: Function calculates covariance of a given set of points,
calculate_semivariance: Function calculates semivariance of a given set of points,
calculate_weighted_semivariance: Function calculates weighted semivariance,
calculate_directional_semivariogram: Function calculates semivariogram within specified ellipse,
build_variogram_point_cloud: Function creates OrderedDict with lags and variances between points within specific lag,
show_variogram_cloud: function shows boxplots of lags and squared differences between ponts’ values within specific lag,
calc_semivariance_from_pt_cloud: based on Point Cloud semivariogram is calculated,
remove_outliers: removes outliers from point cloud variogram,
TheoreticalSemivariogram: Class calculates theoretical semivariogram.
ArealSemivariance
¶
Class initialization¶
pyinterpolate.semivariance.ArealSemivariance(
areal_data,
areal_step_size,
max_areal_range,
areal_points_data,
weighted_semivariance=False,
verbose=False)
Class calculates semivariance of areas for Poisson Kriging (area to area and area to point).
INITIALIZATION PARAMS:
areal_data: (numpy array / list)
[area_id, area_geometry, centroid x,centroid y, value]
areal_step_size: (float) step size for search radius,
max_areal_range: (float) max distance to perform distance and semivariance calculations,
areal_points_data: (numpy array / list)
[
area_id,
[point_position_x, point_position_y, value]
]
weighted_semivariance: (bool) if
False
then each distance is treated equally when calculating theoretical semivariance; ifTrue
then semivariances closer to the point of origin have more weight,verbose: (bool) if
True
then all messages are printed, otherwise nothing.
Class public methods:¶
regularize_semivariogram: Function calculates regularized point support semivariogram,
show_semivariograms: Function shows semivariograms calculated by the class: Empirical semivariogram, Theoretical model, Inblock Semivariance, Within-block semivariogram, Between blocks semivariogram, Regularized output.
ArealSemivariance.regularize_semivariogram()
¶
ArealSemivariance.regularize_semivariogram(
self,
within_block_semivariogram=None,
between_blocks_semivariogram=None,
empirical_semivariance=None,
theoretical_semivariance_model=None)
Function calculates regularized point support semivariogram in the form given in:
Goovaerts P., Kriging and Semivariogram Deconvolution in the Presence of Irregular Geographical Units, Mathematical Geology 40(1), 101-128, 2008
Function has the form:
where:
\(\gamma_{v(h)}\) - regularized semivariogram,
\(\gamma(v, v_h)\) - semivariogram value between any two blocks separated by the distance \(h\),
\(\gamma_{h}(v, v)\) - arithmetical average of within-block semivariogram.
INPUT:
within_block_semivariogram: (numpy array) mean semivariance between the blocks:
where:
\(\gamma(v\alpha, v\alpha)\) and \(\gamma(v\alpha+h, v\alpha+h)\) are the inblock semivariances of block \(\alpha\) and block \(\alpha+h\) separated by the distance \(h\) weighted by the inblock population.
between_blocks_semivariogram: (numpy array) semivariance between all blocks calculated from the theoretical model,
empirical_semivariance: (numpy array) empirical semivariance between area centroids,
default=None
, ifNone
is provided then empirical semivariance is computed by the_calculate_empirical_semivariance
method from area centroids,theoretical_semivariance_model: (TheoreticalSemivariogram) theoretical semivariance model from
TheoreticalSemivariance
class, default isNone
, ifNone
is provided then theoretical model is derived from area centroids and empirical semivariance.
OUTPUT:
semivariance: (
numpy array
) of lag, semivariance values and number of areas within lag where:
semivariance[0] = array of lags
;
semivariance[1] = array of lag's values
;
semivariance[2] = array of number of points in each lag
.
ArealSemivariance.show_semivariograms()
¶
ArealSemivariance.show_semivariograms(self)
Function shows semivariograms calculated by the class: Empirical semivariogram, Theoretical model, Inblock Semivariance, Within-block semivariogram, Between blocks semivariogram, Regularized output.
RegularizedSemivariogram
¶
Class initialization¶
pyinterpolate.semivariance.RegularizedSemivariogram(self)
Class performs deconvolution of semivariogram of areal data. Whole procedure is based on the iterative process described in:
Goovaerts P., Kriging and Semivariogram Deconvolution in the Presence of Irregular Geographical Units, Mathematical Geology 40(1), 101-128, 2008
Class works as follow:
initialize your object (no parameters),
then use
fit()
method to build initial point support model,then use
transform()
method to perform semivariogram regularization,save semivariogram model with
export_model()
method.
Class public methods:¶
fit - fits areal data and point support data into a model, initialize experimental semivariogram, theoretical semivariogram model, regularized point support model and deviation.
transform - performs semivariogram regularization, which is an iterative process,
export_regularized_model - Function exports final regularized model parameters into specified csv file.
show_baseline_semivariograms - Function shows experimental semivariogram, initial theoretical semivariogram and initial regularized semivariogram after fit() operation.
show_semivariograms - plots experimental semivariogram of area data, theoretical curve of area data, regularized model values and regularized model theoretical curve.
RegularizedSemivariogram.fit()
¶
RegularizedSemivariogram.fit(self,
areal_data,
areal_step_size,
max_areal_range,
point_support_data,
weighted_lags=True,
store_models=False)
Function fits area and point support data to the initial regularized models.
INPUT:
areal_data: (numpy array) areal data prepared with the function
prepare_areal_shapefile()
, where data is anumpy array
in the form:
[area_id, area_geometry, centroid x, centroid y, value]
areal_step_size: (float) step size between each lag, usually it is a half of distance between lags,
max_areal_range: (float) max distance to perform distance and semivariance calculations,
point_support_data: (numpy array) point support data prepared with the function
get_points_within_area()
, where data is anumpy array
in the form:
[
area_id,
[point_position_x, point_position_y, value]
]
weighted_lags: (bool) lags weighted by number of points; if
True
then during semivariogram fitting error of each model is weighted by number of points for each lag. In practice it means that more reliable data (lags) have larger weights and semivariogram is modeled to better fit to those lags,store_models: (bool) if
True
then experimental, regularized and theoretical models are stored in lists after each iteration. It is important for a debugging process.
OUTPUT:
None, class is updating its internal parameters. Usually after fitting you should perform regularization with transform()
method.
RegularizedSemivariogram.transform()
¶
RegularizedSemivariogram.transform(self,
max_iters=25,
min_deviation_ratio=0.01,
min_diff_decrease=0.01,
min_diff_decrease_reps=3)
Function transofrms fitted data and performs semivariogram regularization iterative procedure.
INPUT:
max_iters: (int) maximum number of iterations,
min_deviation_ratio: (float) minimum ratio between deviation and initial deviation (D(i) / D(0)) below each algorithm is stopped,
min_diff_decrease: (float) minimum absolute difference between new and optimal deviation divided by optimal deviation: ABS(D(i) - D(opt)) / D(opt). If it is recorded
n
times (controled by themin_diff_d_stat_reps
param) then algorithm is stopped,min_diff_decrease_reps: (int) number of iterations when algorithm is stopped if condition
min_diff_d_stat
is fulfilled.
OUTPUT:
None, class is updating its internal parameters. Usually after transforming you should export your theoretical model with export_regularized_model()
method.
RegularizedSemivariogram.export_regularized_model()
¶
RegularizedSemivariogram.export_regularized_model(self,
filename)
Function exports final regularized model parameters into specified csv file.
INPUT:
filename: (str) filename for model parameters (nugget, sill, range, model type).
OUTPUT:
Method saves regularized model into csv file.
RegularizedSemivariogram.show_baseline_semivariograms()
¶
RegularizedSemivariogram.show_baseline_semivariograms(self)
Function shows experimental semivariogram, initial theoretical semivariogram and initial regularized semivariogram after fit()
operation.
RegularizedSemivariogram.show_semivariograms()
¶
RegularizedSemivariogram.show_semivariograms(self)
Function shows experimental semivariogram, theoretical semivariogram and regularized semivariogram after semivariogram regularization with transform()
method.
calculate_covariance()
¶
pyinterpolate.semivariance.calculate_covariance(
data,
step_size,
max_range)
Function calculates covariance of a given set of points.
Equation for calculation is:
where:
\(N\) - number of observation pairs,
\(h\) - distance (lag),
\(z(x_{i})\) - value at location \(z_{i}\),
\((x_{i} + h)\) - location at a distance \(h\) from \(x_{i}\),
\(u\) - mean of observations at a given lag distance.
INPUT:
data: (numpy array) coordinates and their values,
step_size: (float) distance between lags within each points are included in the calculations,
max_range: (float) maximum range of analysis.
OUTPUT:
(
numpy array
) covariance - array of pair of lag and covariance values where:
covariance[0] = array of lags
;
covariance[1] = array of lag's values
;
covariance[2] = array of number of points in each lag
.
calculate_semivariance()
¶
pyinterpolate.semivariance.calculate_semivariance(
data,
step_size,
max_range)
Function calculates semivariance of a given set of points.
Equation for calculation is:
where:
\(N\) - number of observation pairs,
\(h\) - distance (lag),
\(z(x_{i})\) - value at location \(z_{i}\),
\((x_{i} + h)\) - location at a distance \(h\) from \(x_{i}\),
INPUT:
data: (numpy array) coordinates and their values,
step_size: (float) distance between lags within each points are included in the calculations,
max_range: (float) maximum range of analysis.
OUTPUT:
(
numpy array
) semivariance - array of pair of lag and semivariance values where:
semivariance[0] = array of lags
;
semivariance[1] = array of lag's values
;
semivariance[2] = array of number of points in each lag
.
calculate_weighted_semivariance()
¶
pyinterpolate.semivariance.calculate_weighted_semivariance(
data,
step_size,
max_range)
Function calculates weighted semivariance following Monestiez et al.:
Monestiez P, Dubroca L, Bonnin E, Durbec JP, Guinet C: Comparison of model based geostatistical methods in ecology: application to fin whale spatial distribution in northwestern Mediterranean Sea. In Geostatistics Banff 2004 Volume 2. Edited by: Leuangthong O, Deutsch CV. Dordrecht, The Netherlands, Kluwer Academic Publishers; 2005:777-786.
Monestiez P, Dubroca L, Bonnin E, Durbec JP, Guinet C: Geostatistical modelling of spatial distribution of Balenoptera physalus in the northwestern Mediterranean Sea from sparse count data and heterogeneous observation efforts. Ecological Modelling 2006 in press.
Equation for calculation is:
where:
where:
\(s(h)\) Semivariogram of the risk,
\(n(u_{a})\) - size of the population at risk in the unit a,
\(z(u_{a})\) - mortality rate at the unit a,
\(u_{a} + h\) - area at the distance (h) from the analyzed area,
\(m'\) - population weighted mean of rates.
INPUT:
data: (numpy array) coordinates and their values and weights:
[coordinate x, coordinate y, value, weight]
step_size: (float) distance between lags within each points are included in the calculations,
max_range: (float) maximum range of analysis.
OUTPUT:
(
numpy array
) semivariance - array of pair of lag and semivariance values where:
semivariance[0] = array of lags
;
semivariance[1] = array of lag's values
;
semivariance[2] = array of number of points in each lag
.
calculate_directional_semivariogram()
¶
pyinterpolate.semivariance.calculate_directional_semivariogram(
data,
step_size,
max_range,
direction=0,
tolerance=0.1)
Function calculates directional semivariogram of points. Semivariance is calculated as:
where:
\(N\) - number of observation pairs,
\(h\) - distance (lag),
\(z(x_{i})\) - value at location \(z_{i}\),
\((x_{i} + h)\) - location at a distance \(h\) from \(x_{i}\).
INPUT:
data: (*numpy array8) coordinates and their values,
step_size: (float) distance between lags within each points are included in the calculations,
max_range: (float) maximum range of analysis,
direction: (float) direction of semivariogram, values from 0 to 360 degrees:
– 0 or 180: is NS direction,
– 90 or 270 is EW direction,
– 30 or 210 is NE-SW direction,
– 120 or 300 is NW-SE direction,
tolerance: (float) value in range (0-1) normalized to [0 : 0.5] to select tolerance of semivariogram. If tolerance is 0 then points must be placed at a single line with beginning in the origin of coordinate system and angle given by y axis and direction parameter. If tolerance is greater than 0 then semivariance is estimated from elliptical area with major axis with the same direction as the line for 0 tolerance and minor axis of a size:
and major axis (pointed in NS direction):
and baseline point at a center of ellipse. Tolerance == 1 (normalized to 0.5) creates omnidirectional semivariogram.
OUTPUT:
(numpy array) semivariance - array of pair of lag and semivariance values where:
– semivariance[0] = array of lags;
– semivariance[1] = array of lag’s values;
– semivariance[2] = array of number of points in each lag.
build_variogram_point_cloud()
¶
pyinterpolate.semivariance.build_variogram_point_cloud(
data,
step_size,
max_range)
Function calculates variogram point cloud of a given set of points for a given set of distances. Variogram is calculated as a squared difference of each point against other point within range specified by step_size parameter.
INPUT:
data: (numpy array) coordinates and their values and weights:
[coordinate x, coordinate y, value, weight]
step_size: (float) distance between lags within each points are included in the calculations,
max_range: (float) maximum range of analysis.
OUTPUT:
(OrderedDict) variogram_cloud - dict with pairs {lag: list of squared differences}.
show_variogram_cloud()
¶
pyinterpolate.semivariance.show_variogram_cloud(
variogram_cloud,
figsize=None)
Function shows boxplots of variogram lags. It is especially useful when you want to check outliers in your dataset.
INPUT:
variogram_cloud: (OrderedDict) lags and halved squared differences between points,
figsize: (tuple), default is
None
.
calc_semivariance_from_pt_cloud()
¶
pyinterpolate.semivariance.calc_semivariance_from_pt_cloud(
pt_cloud_dict)
Function calculates experimental semivariogram from point cloud variogram.
INPUT:
pt_cloud_dict: (OrderedDict) {lag: [values]}.
OUTPUT:
(numpy array) [lag, semivariance, number of points].
remove_outliers()
¶
pyinterpolate.semivariance.remove_outliers(data_dict,
exclude_part='top',
weight=1.5)
Function removes outliers from the variogram point cloud for each lag and returns dict without extreme values from the top, bottom or both parts of the variogram point cloud for a given lag. Algorithm uses quartiles to remove outliers:
- \[BottomOutlier < Q1 - w*(Q3-Q1)\]
- \[Q3 + w*(Q3-Q1) < TopOutlier\]
where:
\(Q1\) - 1st quantile (25%)
\(Q3\) - 3rd quantile (75%)
\(w\) - weight associated with the algorithm, larger weight => less number of values treated as an outlier.
INPUT:
data_dict: (OrderedDict) with {lag: list of values},
exclude_part: (str) default =
'top'
, available'top'
,'both'
or'bottom'
- part of the variogram point cloud which is excluded from a given lag.weight: (float) default=1.5, affects number of values which are removed.
OUTPUT:
(OrderedDict) {lag: [variances between point pairs within a given lag]}
TheoreticalSemivariogram
¶
Class initialization¶
pyinterpolate.semivariance.TheoreticalSemivariogram(
self,
points_array=None,
empirical_semivariance=None,
verbose=False)
Class calculates theoretical semivariogram.
Available theoretical models:
- spherical_model(distance, nugget, sill, semivar_range)
- gaussian_model(distance, nugget, sill, semivar_range)
- exponential_model(distance, nugget, sill, semivar_range)
- linear_model(distance, nugget, sill, semivar_range)
INITIALIZATION PARAMS:
points_array: (numpy array) analysed points where the last column is representing values, typically x, y, value,
empirical_semivariance: (numpy array) semivariance where first row of array represents lags and the second row represents semivariance’s values for given lag.
Class public methods:¶
fit_semivariance: Method fits experimental points into chosen semivariance model type,
find_optimal_model: Method fits experimental points into all available models and choose one with the lowest error,
export_model: Function exports semivariance model to the csv file,
import_model: Function imports semivariance model and updates it’s parameters,
export_semivariance: Method exports theoretical semivariance and experimental semivariance to csv file,
show_experimental_semivariogram: Function shows experimental semivariogram of a given model,
show_semivariogram: Function shows experimental and theoretical semivariogram in one plot.
TheoreticalSemivariogram.fit_semivariance()
¶
TheoreticalSemivariogram.fit_semivariance(
self,
model_type,
number_of_ranges=16)
Method fits experimental points into chosen semivariance model type.
INPUT:
model_type: (str) ‘exponential’, ‘gaussian’, ‘linear’, ‘spherical’,
number_of_ranges: (int) deafult = 16. Used to create an array of equidistant ranges between minimal range of empirical semivariance and maximum range of empirical semivariance.
OUTPUT:
(model_type, model parameters)
TheoreticalSemivariogram.find_optimal_model()
¶
TheoreticalSemivariogram.find_optimal_model(
self,
weighted=False,
number_of_ranges=16)
Method fits experimental points into all available models and choose one with the lowest error.
INPUT:
weighted: (bool) default=
False
. IfTrue
then each lag is weighted by:
where:
\(N(h)\) - number of point pairs in a given range,
\(\gamma_{experimental}(h)\) - value of experimental semivariogram for \(h\). - number_of_ranges: (int) default=16. Used to create an array of equidistant ranges between minimal range of empirical semivariance and maximum range of empirical semivariance.
OUTPUT:
model_type
Function updates class parameters with model properties.
TheoreticalSemivariogram.export_model()
¶
TheoreticalSemivariogram.export_model(self, filename)
Function exports semivariance model to the csv file. Columns of csv file are: name, nugget, sill, range, model_error.
TheoreticalSemivariogram.import_model()
¶
TheoreticalSemivariogram.import_model(self, filename)
Function imports semivariance model and updates its parameters (model name, nugget, sill, range, model_error).
TheoreticalSemivariogram.export_semivariance()
¶
TheoreticalSemivariogram.export_semivariance(self, filename)
Function exports semivariance data into csv file. Exported data has three columns: lags
, experimental
, theoretical
where theoretical values are calculated from the fitted model and lags given by experimental semivariogram.
TheoreticalSemivariogram.show_experimental_semivariogram()
¶
TheoreticalSemivariogram.show_experimental_semivariogram(self)
Function shows experimental semivariogram of a given model.
TheoreticalSemivariogram.show_semivariogram()
¶
TheoreticalSemivariogram.show_semivariogram(self)
Function shows experimental and theoretical semivariogram in one plot.


Gawyn tried to keep his mind on the landscape as he rode at the head of the column. This sort of rolling terrain with its scattered bunches of trees was just flat enough to make you think you could see a long way, when in truth some of those occasional long ridges and low hills were not quite so low as they seemed. The wind was gusting up waves of dust today, and dust could hide a lot, too. Dumai’s Wells lay just off the road to his right, three stone wells in a small copse; the water barrels could stand topping, and it was at least four days to the next sure water, if the Alianelle Spring had not gone dry, but Galina had ordered no stopping. He tried to hold his attention where it should be, but he could not.
From time to time he twisted in his saddle, looking back at the long snake of wagons stretching along the road, with Aes Sedai and Warders riding alongside, and servants who were not in the wagons walking. Most of the Younglings were at the rear, where Galina had ordered them. He could not see the one wagon, in the center of the column with six Aes Sedai always riding beside it, that had no canvas cover. He would have killed al’Thor if he could, but this sickened him. Even Erian had refused to take part any longer after the second day, and the Light knew she had cause. Galina was adamant, though.
Putting his eyes firmly forward, he touched Egwene’s letter in his coat pocket, where it lay carefully wrapped in layers of silk. Just a few words to say she loved him, that she must go; no more. He read it five or six times a day. She never mentioned his promise. Well, he had not raised a hand against al’Thor. He had been stunned to learn the man was a prisoner and had been for days when he heard of it. Somehow he must make her understand that. He had promised her not to raise his hand against the man, and he would not if he died for it, but he would not raise a hand to help him either. Egwene had to understand that. Light, she had to.
 Egwene he could do nothing about yet except pray. He could about Min. Somehow he had to. She did not deserve to be carried to the Tower a prisoner; he would not believe it. If the Warders would only slacken the guard on her, he could . . .
Suddenly Gawyn became aware of a horse galloping back down the road toward the wagons through sheets of dust, seemingly with no rider. “Jisao,” he ordered, “tell the wagon drivers to halt. Hal, tell Rajar to ready the Younglings.” Without a word they wheeled their horses and galloped. Gawyn waited.
That was Benji Dalfor’s steel-dust gelding, and as it came closer, Gawyn could see Benji doubled over and clinging to the gelding’s mane. The horse almost went past before Gawyn could seize the reins.
Benji turned his head without straightening, peered at Gawyn with glazed eyes. There was blood around his mouth, and he had one arm tight against his middle as if trying to hold himself together. “Aiel,” he mumbled. “Thousands. All sides, I think.” Suddenly he smiled.
Gawyn spun his stallion around, galloping toward the wagons. There would be time for Benji later, if any of them were alive.
 She had been furious constantly since the day after al’Thor tried to escape. “Who do you think you are, ordering the wagons stopped?” she demanded.
“There are thousands of Aiel closing on us, Aes Sedai.” He managed to keep his tone polite. The wagons were stopped at least, and the Younglings forming up, but wagon drivers fingered their reins impatiently, servants peered about fanning themselves, Aes Sedai chatted with Warders.
Galina’s lips writhed contemptuously.  No doubt those are the Shaido. Sevanna said she would give us an escort. But if you doubt, take your Younglings and see for yourself. These wagons will keep moving toward Tar Valon. It is time you learned that I give the orders here, not—”
“And if they are not your tame Aiel?” This was not the first time in the last few days that she had suggested he lead a scout himself; he suspected if he did, he would find Aiel, and not tame. “Whoever they are, they’ve killed one of my men.” At least one; there were still six scouts out. “Maybe you should consider the possibility these are al’Thor’s Aiel, come to rescue him. It will be too late when they start spitting us.”
It was only then that he realized he was shouting, but Galina’s anger actually faded. She looked up the road to where Benji lay, then nodded slowly. “Perhaps it would not be unwise to be cautious this once.”
Rand labored for breath; the air inside the chest felt thick and hot. Luckily he could not smell it any longer. They sluiced him off with a bucket of water each night, but that was hardly a bath, and for a time after they closed the lid on him each morning and latched it, the stench added by yet another day exposed to the full blast of the sun assaulted his nose. Holding the Void was an effort. He was a mass of stripes; not an inch of him from shoulders to knees but burned even before sweat touched it, and those ten thousand flames flickered on the borders of emptiness, trying to consume it. The half-healed wound in his side throbbed in the distance, but the emptiness around him quivered with every throb. Alanna. He could feel Alanna. Close. No. He could not waste time thinking about her; even if she had followed, six Aes Sedai would not be able to free him. If they did not decide to join Galina. No trust. Never again trust for any Aes Sedai. Maybe he was imagining it anyway. Sometimes he did imagine things in here, cool breezes, walking. Sometimes he lost thought of anything else and hallucinated about walking free. Just walking. Hours lost in what was important. He labored for breath, and he felt his way across the ice-slick barrier that divided him from the Source. Again and again, fumbling to those six soft points. Soft. He could not stop. The fumbling was important.
Dark, Lews Therin moaned in the depths of his head. No more dark. No more. Over and over again. Not too badly, though. Rand just ignored him this time.
Suddenly he gasped; the chest was moving, grating loudly along the wagon bed. Was it night already? Welted flesh flinched involuntarily. There would be another beating before he was fed and doused with water and trussed like a goose to sleep however he could. But he would be out of the box. The darkness around him was incomplete, a deep dark gray. The tiny crack around the lid let in the smallest amount of light, though he could not see with his head jammed between his knees, and his eyes took as long each day to see anything but blackness as his nose did to grow deadened. Even so, it must be night.
He could not help groaning as the chest tilted; there was no room for him to slide, but he shifted, putting new strains on muscles sore beyond sore. His tiny prison thumped to the ground hard. The lid would open soon. How many days in the broiling sun? How many nights? He had lost count. Which one would it be this time? Faces spun through his head. He had marked down every woman when she took her turn at him. They were a jumble now; remembering which came where or when seemed beyond him. But he knew that Galina and Erian and Katerine had beaten him most often, the only ones to do so more than once. Those faces glowed in his mind with a feral light. How often did they want to hear him scream?
Abruptly it came to him that the chest should have been opened by now. They intended to leave him in here all night, and then there would be tomorrow’s sun, and—muscles too bruised and sore to move managed a frantic heave. “Let me out!” he shouted hoarsely. Fingers scrabbled painfully behind his back, futilely. “Let me out!” he screamed. He thought he heard a woman laugh.
For a time he wept, but then tears dried up in rage like a furnace. Help me, he snarled at Lews Therin.
Help me, the man groaned. The Light help me.
Muttering darkly, Rand returned to feeling blindly across that smooth plain to the six soft points. Sooner or later, they would let him out. Sooner or later, they would slacken their guard. And when they did . . . he did not even know it when he began a rasping laugh.
Crawling up the gentle slope on his belly, Perrin peered over the crest into a scene from the Dark One’s dreams. The wolves had given him some notion of what to expect, but notions paled beside reality. Perhaps a mile from where he lay beneath the midday sun, a huge milling mass of Shaido completely surrounded what seemed to be a ring of wagons and men centered on a small clump of trees not far from the road. A number of the wagons were bonfires, flames dancing. Balls of fire, small as a fist and large as boulders, hurtled into the Aiel, gouts of fire flared, turning a dozen at a time to torches; lightning fell from a cloudless sky, hurling earth and cadin’sor-clad figures into the air. But silver flashes of lightning struck at the wagons, too, and fire leaped from the Aiel. Much of that fire suddenly died or exploded short of any target, many of the lightning bolts stopped abruptly, but if the battle seemed slightly in favor of the Aes Sedai, the sheer number of Shaido had to prove overwhelming eventually.
“There must be two or three hundred women channeling down there, if not more.”  Sorilea, beyond the Green sister, certainly looked impressed. The Wise One smelled concerned; not afraid, but troubled. “I have never seen so many weaves at once,” the Aes Sedai went on. “I think there are at least thirty sisters in the camp. You have brought us to a boiling cauldron, young Aybara.”
“Forty thousand Shaido,” Rhuarc muttered grimly on Perrin’s other side. He even smelled grim. “Forty thousand at the least, and small satisfaction to know why they did not send more south.”
“The Lord Dragon is down there?” Dobraine asked, looking across Rhuarc. Perrin nodded. “And you mean to go in there and bring him out?” Perrin nodded again, and Dobraine sighed. He smelled resigned, not afraid. “We will go in, Lord Aybara, but I do not believe we will come out.” This time Rhuarc nodded.
Kiruna looked at the men. “You do realize there are not enough of us. Nine. Even if your Wise Ones can actually channel to any effect, we are not enough to match that.” Sorilea snorted loudly, but Kiruna kept her eyes where they were.
“Then turn around and ride south,” Perrin told her. “I’ll not let Elaida have Rand.”
“Good,” Kiruna replied, smiling. “Because I will not either.” He wished her smile did not make his skin crawl.
Perrin signaled to those at the bottom of the ridge, and Sorilea and the Green slid down until they could straighten, then hurried in opposite directions.
It was not much of a plan that they had. It boiled down to reaching Rand somehow, freeing him somehow, then hoping he was not injured too badly to make a gateway for as many as could to escape with him before either the Shaido or the camp’s Aes Sedai managed to kill them. Minor problems, no doubt, for a hero in a story or a gleeman’s tale, but Perrin wished there had been time for some sort of real planning, not just what he and Dobraine and Rhuarc had hammered out with the clan chief running as fast as he could between their horses. Time was one of many things they did not have, though. No telling if the Tower Aes Sedai would be able to hold off the Shaido for even another hour.
First to move were the Two Rivers men and the Winged Guards, divided into two companies, one surrounding Wise Ones afoot and the other mounted Aes Sedai and Warders. To left and right they crossed the ridge. Dannil had let them bring out the Red Eagle again, in addition to the Red Wolfhead. Rhuarc did not even glance toward where Amys walked not far from Kiruna’s dark gelding, but Perrin heard him murmur, “May we see the sun rise together, shade of my heart.”
At the end, the Mayeners and Two Rivers men were to cover the Wise Ones and Aes Sedai in retreat, or maybe it would be the other way around. In either case, Bera and Kiruna did not seem to like the plan; they very much wanted to be where Rand was.
“Are you sure you will not ride, Lord Aybara?” Dobraine asked from his saddle; to him, the notion of fighting on foot was anathema.
Perrin patted the axe hanging at his hip. “This is not much use from horseback.” It was, in truth, but he did not want to ride Stepper or Stayer into what lay ahead. Men could choose whether they threw themselves into the midst of steel and death; he chose for his horses, and today he chose no. “Maybe you’ll lend me a stirrup when the time comes.” Dobraine blinked—Cairhienin made little use of foot soldiers—but he seemed to understand, and nodded.
“It is time for the pipers to play the dance,” Rhuarc said, lifting his black veil, though today there would be no pipers playing, which some of the Aiel did not like. Many of the Maidens did not like the required strips of red cloth tied around their arms, to distinguish them from Shaido Maidens for the wetlanders; they seemed to think anyone should know at a glance.
Black-veiled Maidens and siswai’aman began trotting up the slope in a thick column, and Perrin walked with Dobraine to where Loial already stood at the head of the Cairhienin, gripping his axe in both hands and ears laid back. Aram was there, too, afoot and his sword bare; the former Tinker wore a dark smile of anticipation. Dobraine waved his arm for the advance, behind Rand’s twin banners, and saddles creaked as a small forest of five hundred lances climbed beside the Aiel.
Nothing had changed in the battle, which surprised Perrin until he realized only moments had passed since he last saw it. The time had seemed much longer. The great mass of Shaido still pressed inward; wagons still burned, perhaps more than before; lightning still struck from the sky, and fire leaped in balls and billows.
The Two Rivers Men were almost to their position, with the Mayeners and Aes Sedai and Wise Ones, moving almost unhurriedly across the rolling plain. Perrin would have held them farther back, to give them a better chance at escape when the time came for that, but Dannil kept insisting they had to close to at least three hundred paces for their bows to be effective, and Nurelle had been just as anxious not to hang back. Even the Aes Sedai, who Perrin was sure only had to be near enough to see clearly, had insisted. None of the Shaido had looked around yet. At least, none were pointing at the threat moving slowly toward their backs; none were wheeling about to face it. All seemed fixed on rushing at the circle of wagons, falling back before fire and lightning, then rushing in again. All it would take would be one looking behind, but the inferno ahead held them.
Eight hundred paces. Seven hundred. The Two Rivers men dismounted, taking bows in hand. Six hundred. Five. Four.
Dobraine drew his sword, raised it high. “The Lord Dragon, Taborwin and victory!” he shouted, and the shout came from five hundred throats as lances snapped down.
Perrin had just time to seize hold of Dobraine’s stirrup before the Cairhienin were thundering forward. Loial’s long legs matched the horses pace for pace. Loping along, letting the horse pull him in long leaping strides, Perrin sent his mind out. Come.
Ground covered with brown grass, seemingly empty, suddenly gave birth to a thousand wolves, lean brown plains wolves, and some of their darker, heavier forest cousins, running low to hurl themselves into the backs of the Shaido with snapping jaws just as the first long Two Rivers shafts rained out of the sky beyond them. A second flight already arched high. New lightnings fell with the arrows, new fires bloomed. Veiled Shaido turning to fight wolves had only moments to realize they were not the only threat before a solid spear of Aiel stabbed into them alongside a hammer of Cairhienin lancers.
Snatching his axe free, Perrin hacked down a Shaido in his way and leaped over the man as he fell. They had to reach Rand; everything rested on that. Beside him Loial’s great axe rose and fell and swung, carving a path. Aram seemed to dance with his sword, laughing as he cut down everyone in his way. There was no time to think of anyone else. Perrin worked his axe methodically; he was hewing wood, not flesh; he tried not to see the blood that spurted, even when crimson sprayed his face. He had to reach Rand. He was slashing a path through brambles.
All he focused on was the man in front of him—he thought of them as men even when height said it might be a Maiden; he was not sure he could swing that red-dripping half-moon blade if he let himself think it was a woman he swung at—he focused, but other things drifted across his vision as he cut his way forward. A silvery lightning strike hurled cadin’sor-clad figures into the air, some wearing the scarlet headband, some not. Another bolt threw Dobraine from his horse; the Cairhienin labored to his feet, laying about him with his sword. Fire enveloped a knot of Cairhienin and Aiel, men and horses turned to screaming torches, those who could still scream.
These things passed before his eyes, but he did not let himself see them. There were only the men before him, the brambles, to be cleared by his axe and Loial’s, and Aram’s sword. Then he saw something that pierced his concentration. A rearing horse, a toppling rider being pulled from his saddle as Aiel spears stabbed him. A rider in a red breastplate. And there was another of the Winged Guards, and a clump of them, thrusting their lances, with Nurelle’s plume waving above his helmet. A moment later he saw Kiruna, face serenely unconcerned, striding like a queen of battles along a path carved for her by three Warders and the fires that leaped from her own hands. And there was Bera, and farther over, Faeldrin and Masuri and . . . what under the Light were they all doing here? What were any of them doing? They were supposed to be back with the Wise Ones!
From somewhere ahead came a hollow boom, like a thunderclap cutting through the din of screams and shouts. A moment later, a slash of light appeared not twenty paces from him, slicing through several men and a horse like a huge razor as it widened into a gateway. A black-coated man with a sword jumped out of it, and went down with a Shaido spear through his middle, but a moment later eight or nine more sprang through as the gateway vanished, forming a circle around the fallen man with their swords. With more than swords. Some of the Shaido who rushed at them fell to a blade, but more simply burst into flame. Heads exploded like melons dropped onto stone from a height. Maybe a hundred paces beyond them, Perrin thought he saw another circle of men in black coats, surrounded by fire and death, but he had no time to wonder. Shaido were closing around him, too.
Setting himself back-to-back with Loial and Aram, he slashed and hacked desperately. There was no going forward now. It was all he could do to remain standing where he was. Blood pounded in his ears, and he could hear himself gasping for breath.  He did not think they were going to last much longer. Every part of him centered on staying alive for one heart-beat more. Almost every part. One corner of his mind held an image of Faile, and the sad thought that he would not be able to apologize for not coming back to her.
Doubled painfully inside the chest, panting, Rand fumbled at the shield between him and the Source. Moaning floated across the Void, grim fury and burning fear slid along the edge of it; he was no longer altogether certain which was his and which Lews Therin’s. Suddenly his breath froze. Six points, but one was hard now. Not soft; hard. And then a second. A third. Rasping laughter filled his ears; that was his, he realized after a moment. A fourth knot became hard. He waited, trying to stifle what sounded uncomfortably like deranged giggling. The last two points remained soft. Those muffled cackles died.
They will feel it, Lews Therin groaned desperately. They will feel it and call the others back.
Rand licked cracked lips with a tongue nearly as dry; all the moisture in him seemed to have gone into the sweat that slicked him and bit his welts. If he tried and failed, there would never be another chance. He could not wait. There might never be another chance anyway.
Cautiously, blindly, he felt at the four hard points. There was nothing there, any more than the shield itself was anything he could feel or see, but somehow he could feel around this nothingness, feel a shape to it. Like knots. There was always space between the cords in a knot, however tightly pulled, gaps finer than a hair, where only air could go. Slowly, ever so slowly, he fumbled into one of those gaps, squeezing through infinitesimal spaces between what seemed not to be there at all. Slowly. How long before the others returned? If they took it up again before he found a way through this tortuous labyrinth . . . slowly. And suddenly he could feel the Source, like brushing it with a fingernail; the bare edge of a fingernail. Saidin was still beyond him—the shield was still there—but he could feel hope welling in Lews Therin. Hope and trepidation. Two Aes Sedai were still holding their part of the barrier, still aware of what they held.
Rand could not have explained what he did next, though Lews Therin had explained how; explained between drifting off into his own mad fancies, between towering rages and wailing over his lost Ilyena, between gibbering that he deserved to die and shouting that he would not let them sever him. It was as if he flexed what he had extended through the knot, flexed it as hard as he could. The knot resisted. It trembled. And then it burst. There were only five. The barrier thinned. He could feel it grow less. An invisible wall only five bricks thick now instead of six. The two Aes Sedai would have felt it, too, though they might not understand exactly what had happened, or how. Please, Light, not now. Not yet.
Quickly, almost frantically, he attacked the remaining knots in turn. A second went; the shield thinned. It was quicker now, quicker with each, as if he were learning the path through, though it was different each time. The third knot gone. And a third soft point appeared; maybe the Aes Sedai did not know what he was doing, but they would not simply sit while the shield grew less and less. Truly frantic, Rand hurled himself at the fourth knot. He had to unravel it before a fourth sister came into the shield; four might be able to hold it whatever he did. Almost weeping, he struggled through the complex windings, slipping between nothingness. Frenziedly, he flexed, bursting the knot. The shield remained, but held by only three now. If he could only move fast enough.
When he reached for saidin, the invisible barrier was still there, but it no longer seemed stone or brick. It gave as he pressed, bending under his pressure, bending, bending. Suddenly it tore apart before him like rotted cloth. The Power filled him, and as it did, he seized at those three soft points, crushing them ruthlessly in fists of Spirit. Aside from that, he still could only channel where he could see, and all he could see, dimly, was the inside of the chest, what he could glimpse of it with his head forced between his knees. Before he even finished with the fists of Spirit, he channeled Air. The chest exploded away from him with a loud boom.
Free, Lews Therin breathed, and it was an echo of Rand’s thought. Free. Or maybe the other way around.
They will pay, Lews Therin growled. I am the Lord of the Morning.
Rand knew he had to move even more quickly now, move quickly and violently, but at first he struggled to move at all. Muscles beaten twice a day for he did not know how long, crammed into a chest every day, those muscles screamed as he gritted his teeth and slowly pushed up to hands and knees. It was a distant screaming, someone else’s body in pain, but he could not make that body move faster however strong saidin made him feel. Emptiness buffered emotion, but something close to panic tried to wriggle creepers into the Void.
He was in a large clump of scattered trees, with broad shafts of sunlight filtering through nearly leafless branches; he was shocked to realize it was still daylight, maybe even midday. He had to move; more Aes Sedai would be coming. Two lay on the ground near him, apparently unconscious, one with a nasty gash bleeding across her forehead. The third, an angular woman, was on her knees staring at nothing, clutching her head in both hands and screaming. She seemed untouched by all the splinters and pieces of the chest. He did not recognize any of them. An instant of regret that it was not Galina or Erian he had stilled—he was not sure he had intended to do that; Lews Therin had gone on at length about how he intended to sever every one of them who had imprisoned him; Rand hoped it had been his own idea, however hasty—an instant, and he saw another shape stretched out on the ground beneath bits of the chest. In rose-colored coat and breeches.
The angular woman did not look at him or stop shrieking even when he knocked her over against the low stone coping of a well as he crawled past. Desperately he wondered why no one came to her screams. Halfway to Min he became aware of lightning bolts lancing out of the sky and fireballs exploding overhead. He could smell wood burning, hear men shouting and screaming, the clash of metal, the cacophony of battle. He did not care if it was Tarmon Gai’don.
Big dark eyes stared up at him, “Rand,” she breathed. “You’re alive. I was afraid to look. There was an awful roar, and pieces of wood everywhere, and I recognized part of the chest, and . . . ” Tears began spilling down her cheeks. “I thought they had . . . I was afraid you were . . . ” Scrubbing at her face with bound hands, she drew a deep breath. Her ankles were bound too. “Will you untie me, sheepherder, and make one of your gateways away from here? Or don’t bother with untying. Just toss me over your shoulder and go.”
Deftly he wielded Fire, parting the cords that held her. “It isn’t that simple, Min.” He did not know this place at all; a gateway opened from here might go anywhere, if it opened at all. If he could open one at all. Pain and weariness shaved at the borders of the Void. He was not sure how much of the Power he could draw. Suddenly he realized he could feel saidin being channeled in every direction. Through the trees, beyond burning wagons, he could see Aiel fighting Warders and Gawyn’s green-coated soldiers, being driven back by Aes Sedai fire and lightning, yet coming on again. Somehow Taim had found him and brought Asha’man soldiers and Aiel. “I cannot go just yet. I think some friends have come for me. Don’t worry; I will protect you.”
A jagged silver blaze split a tree on the edge of the copse, close enough to make Rand’s hair stir. Min gave a start. “Friends,” she muttered, rubbing her wrists.
He motioned her to stay where she was—except for that one errant bolt, the thicket appeared untouched—but when he shoved himself to his feet, she was right there, holding him up on one side. Staggering to the sparse tree line, he was grateful for her support, but he made himself straighten and stop leaning on her. How could she believe he would protect her if he needed her not to fall on his face? A hand on the shattered trunk of the lightning-struck tree helped. Tendrils of smoke rose from it, but it had not caught fire.
The wagons made a great ring around the trees. Some of the servants seemed to be trying to keep the horses together—the teams were all still harnessed—but most huddled wherever they could in hope of avoiding the fury falling from above. In truth, except for that one bolt, it all seemed aimed at the wagons and men fighting. Maybe at the Aes Sedai too. Each sat her horse a little way back from the whirl of spears and swords and flame, but not too far, sometimes standing in her stirrups for a better view.
Rand spotted Erian quickly, slender and dark-haired on a pale gray mare. Lews Therin snarled, and Rand struck almost without thinking. He felt the other man’s disappointment as he did. Spirit to shield her, with the slight resistance that told of slicing through her connection of saidar, and even as that was tied, a club of Air to knock her unconscious from the saddle. If he decided to still her, he wanted her to know who was doing it and why. One of the Aes Sedai shouted for someone to tend Erian, but no one looked toward the trees. No one out there could feel saidin; they thought she had been felled by something from outside the wagons.
His eyes searched among the other mounted women, stopped on Katerine, wheeling her long-legged bay gelding back and forth, fire blazing wherever she looked among the Aiel. Spirit and Air, and she fell limply, one foot tangled in a stirrup.
Yes, Lews Therin laughed. And now Galina. Her I want especially.
Rand squeezed his eyes shut. What was he doing? It was Lews Therin who wanted those three so badly he could think of nothing else. Rand wanted to repay them for what they had done to him, but there was battle going on, men dying while he hunted for particular Aes Sedai. Maidens dying too, no doubt.
He took the next Aes Sedai, twenty paces to Katerine’s left, with Spirit and Air, then moved to another tree and put Sarene Nemdahl on the ground, unconscious and shielded. Slowly he staggered along the edge of the thicket, striking like a cutpurse time and again. Min stopped trying to hold him up, though her hands hovered, ready to catch him.
“They’re going to see us,” she muttered. “One of them is going to look around and see us.”
Galina, Lews Therin growled. Where is she?
Rand ignored him, and Min. Coiren fell, and two more whose names he did not know. He had to do what he could.
The Aes Sedai had no way of telling what was happening. Steadily along the ringwall of wagons, sisters toppled from their horses. Those still conscious spread themselves out more, trying to cover the whole perimeter, an air of anxiety suddenly in the way they handled their horses, the redoubled fury with which fire blazed into the Aiel and lightning struck from the sky. It had to be something from outside, but Aes Sedai fell, and they did not know how or why.
Their numbers dwindled, and the effects began to tell. Fewer lightning bolts fizzled abruptly in midair, and more struck among the Warders and soldiers.  Aiel began pressing through the gaps between wagons; wagons were heaved over. In moments there were black-veiled Aiel everywhere, and chaos. Rand stared in amazement.
Warders and green-coated soldiers fought in clumps against Aiel, and Aes Sedai surrounded themselves with rains of fire. But there were Aiel fighting Aiel as well; men with the scarlet siswai’aman headband and Maidens with red strips tied to their arms fighting Aiel without. And Cairhienin lancers in their bell-shaped helmets and Mayeners in red breastplates were suddenly among the wagons too, striking at Aiel as well as Warders. Had he finally gone mad? He was conscious of Min, pressed against his back and trembling. She was real. What he was seeing must be real.
A dozen or so Aielmen, each as tall as he or taller, started trotting toward him. They wore no red. He watched them curiously until, within a pace of him, one raised a reversed spear like a cudgel. Rand channeled, and fire seemed to shoot out of the dozen everywhere. Charred and twisted bodies tumbled at his feet.
Suddenly Gawyn was reining a bay stallion up not ten steps in front of him, sword in hand and twenty or more green-coated men riding at his heels. For a moment they stared at one another, and Rand prayed he would not have to harm Elayne’s brother.
“Min,” Gawyn grated, “I can take you out of here.”
She peeked past Rand’s shoulder to shake her head; she was holding on to him so tightly, he did not think he could have pried her loose had he wanted to. “I’m staying with him, Gawyn. Gawyn, Elayne loves him.”
With the Power in him, Rand could see the man’s knuckles go white on his sword hilt. “Jisao,” he said in a flat voice. “Rally the Younglings. We are cutting a way out of here.” If his voice had been flat before, now it went dead. “Al’Thor, one day I will see you die.” Digging his heels in, he galloped away, he and all the others shouting “Younglings!” at the top of their lungs, and more men in green coats cutting a way to join them with every stride.
 Rand saw Gawyn sway in the saddle in the instant before he beat the black-coated man to the ground with a mace of Air. He did not know the hard-faced young man who snarled at him, but the fellow wore both the sword and Dragon on his high collar, and saidin filled him.
In an instant, it seemed, Taim was there, blue-and-gold Dragons twined around the sleeves of his black coat, staring down at the fellow. His collar bore neither pin. “You would not strike at the Dragon Reborn, Gedwyn,” Taim said, at once soft and steely, and the hard-faced man scrambled to his feet, saluting with fist to heart.
Rand looked toward where Gawyn had been, but all he could see was a large group of men with a White Boar banner slashing their way deeper into the surrounding Aiel, with more green-coated men fighting to join them.
Taim turned to Rand, that almost-smile on his lips. “Under the circumstances, I trust you will not hold it against me, violating your command about confronting Aes Sedai. I had reason to visit you in Cairhien, and . . . ” He shrugged. “You look the worse for wear. You will allow me to—” The slight twist of his lips flattened as Rand stepped back from his outstretched hand, pulling Min with him. She hung on tighter than ever.
Lews Therin had begun ranting about killing as he always did when Taim appeared, rambling madly about the Forsaken and killing everybody, but Rand stopped listening, walled the man off to the buzzing of a fly. It was a trick he had learned inside the chest, when there was nothing to do but feel at the shield and listen to a voice in his head that was insane more often than not. Yet even without Lews Therin, he did not want to be Healed by the man. He thought if Taim ever touched him with the Power, however innocently, he would kill him.
“As you wish,” the hawk-nosed man said wryly. “I have the campsite secured, I believe.”
That seemed true enough. Bodies littered the ground, but in only a few places did men still fight inside the ring of wagons.  It was not one solid weave of saidin; Rand could see where individual weaves butted one against another to make it. He thought there might have been as many as two hundred black-coated men beneath the dome. A hail of lightning and fire struck that barrier and exploded harmlessly. The sky itself seemed to crackle and burn; the constant roar of it filled the air. Maidens with strips of red dangling from their arms and siswai’aman stood along the wall they could not see, mingled with Mayeners and Cairhienin, many of them afoot as well. On the other side, a solid mass of Shaido stared at the invisible barricade keeping them from their enemies, sometimes stabbing at it with spears or hurling themselves against it bodily. Spears stopped short, and bodies bounced back.
Inside the dome, the last fighting died even as Rand looked. Under the eyes of a scant handful of red-marked men and Maidens, disarmed Shaido were removing their garments with stolid faces; taken in battle, they would wear gai’shain white for a year and a day even if the Shaido somehow succeeded in overrunning the camp. Cairhienin and Mayeners provided guards for a large knot of angry Warders and Younglings mixed with fearful servants, almost as many guards as prisoners. Nearly a dozen Aes Sedai were being shielded by an equal number of Asha’man wearing sword and Dragon. The Aes Sedai looked sick and frightened. Rand recognized three, though Nesune was the only one he could name. He did not recognize any of their Asha’man jailers. A number of the women Rand had shielded and rendered unconscious were laid out with those prisoners, some of them beginning to stir, while black-coated soldiers and Dedicated with the silver sword on their collars were using saidin to drag others across the ground and lay them in that row. Some of them brought the two unconscious Aes Sedai and the angular woman out of the copse; she was still screaming. When they were added to the cluster, some of the Aes Sedai abruptly turned away and vomited.
There were other Aes Sedai present, surrounded by Warders and watched by black-coated men though not shielded, watching the Asha’man as uneasily as did the women under guard. They stared at Rand, too, and plainly would have come to him if not for the Asha’man. Rand glared back. Alanna was there; he had not been hallucinating. He did not recognize all of her companions, but enough. They were nine altogether. Nine. Sudden rage stormed outside the Void, and Lews Therin’s fly-buzz grew louder.
At that point it seemed no surprise at all to see Perrin stagger up, face and beard bloody, followed by a limping Loial with a huge axe, and a bright-eyed fellow who looked a Tinker in a red-striped coat, except for the sword he carried, blade crimson from end to end. Rand almost looked around to see whether Mat was also there somehow. He did see Dobraine, on foot with a sword in one hand and the staff of Rand’s crimson banner in the other. Nandera joined Perrin, letting her veil drop, and another Maiden Rand almost did not recognize at first. It was good to see Sulin in cadin’sor once more.
“Rand,” Perrin gasped, “thank the Light you’re still alive. We meant for you to make a gateway for us to escape, but it’s all fallen to pieces. Rhuarc and most of the Aiel are still out among the Shaido, most of the Mayeners and Cairhienin too, and I don’t know what has happened to the Two Rivers folk, or the Wise Ones. The Aes Sedai were supposed to stay with them, but . . . ” Putting the head of his axe on the ground, he leaned on the shaft panting; he looked as if he might fall without the support.
Along the barrier, mounted men were appearing, as well as Aielmen in red headbands and Maidens with strips of red dangling from their arms. The barrier held them out as well. Wherever they appeared, Shaido swarmed over them, swallowed them up.
“Let the dome go,” Rand ordered. Perrin sighed in relief, of all things. Had he thought Rand would let his own people be slaughtered? But Loial sighed too. Light, what did they think of him?  For some reason, Perrin gave her a very surprised look.
Taim might have been surprised, but he was certainly not relieved. “My Lord Dragon,” he said in a tight voice, “I would say there are still several hundred Shaido women out there, some not insignificant it seems. And that is not to mention some thousands of Shaido with spears. Unless you truly want to find out whether you are immortal, I suggest waiting a few hours until we know this place well enough to make gateways with some certainty where they will come out, then leaving. There are casualties in battle. I lost several soldiers today, nine men who will be harder to replace than any number of renegade Aiel. Whoever dies out there, dies for the Dragon Reborn.” If he had been paying any attention to Nandera or Sulin, he might have moderated his tone and chosen his words more carefully. Handtalk flashed between them; they looked ready to strike him down on the spot.
Perrin pushed himself upright, yellow eyes fixed on Rand, firm and anxious at the same time. “Rand, even if Dannil and the Wise Ones held back the way they were supposed to, they’ll not leave as long as they see this.” He gestured to the dome overhead, where fire and lightning made a continuous sheet of light. “If we sit here for hours, the Shaido will turn on them sooner or later, if they haven’t already. Light, Rand! Dannil and Ban and Wil and Tell . . . Amys is out there, and Sorilea, and . . . !  Perrin drew a deep breath. “At least let me out. If I can make it that far, I can let them know that you’re alive and they can retreat before they get killed.”
“Two of us can slip out,” Loial said quietly, hefting that huge axe. “Two will stand a better chance.” The Tinker only smiled, but almost eagerly.
“I will have a place opened in the barrier,” Taim began, but Rand broke in on him sharply.
“No!” Not for the Two Rivers folk. He could not appear to worry over them any more than over the Wise Ones. Truth to tell, he had to seem to worry less. Amys was out there? The Wise Ones never took part in battle; they walked untouched through battles and blood feuds. They had ripped apart custom if not law to come for him. He would as soon let Perrin go back into that maelstrom as abandon them. But it could not be for the Wise Ones or the Two Rivers folk. “Sevanna wants my head, Taim. Apparently she thought she could take it today.” The emotionless quality the Void gave to his voice was appropriate. It did seem to worry Min, though; she was stroking his back as though to calm him. “I mean to let her know her mistake. I told you to make weapons, Taim. Show me just how deadly they are. Disperse the Shaido. Break them.”
“As you command.” If Taim had been stiff before, he was stone now.
“Put my standard up where they can see it,” Rand commanded. At least that would tell everyone outside who held the camp. Maybe the Wise Ones and Two Rivers folk would pull back when they saw that.
Loial’s ears wriggled uneasily, and Perrin grabbed Rand’s arm as Taim walked away. “I saw what they do, Rand. It’s . . .
“What would you have me do?” Rand demanded. “What else can I do?”
Perrin’s hand fell away, and he sighed. “I do not know. I do not have to like it, though.”
“Grady, raise the Banner of Light!” Taim called, and the Power made his voice boom. On flows of Air, Jur Grady lifted the crimson banner out of a surprised Dobraine’s hand and raised it all the way through the hole in the top of the dome. Fire burst around it and lightning flashed as brilliant red lifted amid the smoke billowing up from the burning wagons. Rand recognized a number of the men in black coats, but he knew only a few names aside from Jur’s. Damer and Fedwin and Eben, Jahar and Torval; of those, only Torval wore the Dragon on his collar.
“Asha’man, form line of battle!” Taim boomed.
Black-coated men rushed to place themselves between the barrier and everyone else, all of them except Jur and those watching Aes Sedai. Except for Nesune, who peered intently at everything, the Tower lot had sunk listlessly to their knees, not even looking at the men who had them shielded, and even Nesune still looked on the point of sicking up. The Salidar group stared coldly at the Asha’man guarding them for the most part, though now and then they turned those icy eyes on Rand. Alanna stared only at Rand. His skin was tingled faintly, he realized; for him to feel it at that distance, all nine must be embracing saidar. He hoped they had enough sense not to channel; the stony men facing them held saidin to bursting, and they looked as tense as the Warders fingering their swords.
“Asha’man, raise the barricade two spans!” At Taim’s command, the edges of the dome rose all around. Surprised Shaido who had been pushing at what they could not see stumbled forward. They recovered instantly, a black-veiled mass surging forward, but they had time for only a stride before Taim’s next shout. “Asha’man, kill!”
The front rank of the Shaido exploded. There was no other way to put it. Cadin’sor-clad shapes burst apart in sprays of blood and flesh. Flows of saidin reached through that thick mist, darting from figure to figure in the blink of an eye, and the next row of Shaido died, then the next, and the next, as though they were running into an enormous meat grinder. Staring at the slaughter, Rand swallowed. Perrin bent over to empty his stomach, and Rand understood fully. Another rank died. Nandera put a hand over her eyes, and Sulin turned her back.
No one could stand up to that. Between one blast of death and the next, the Shaido in front were suddenly struggling the other way, forcing themselves back into the mass fighting to get forward. The milling tangle itself began to explode, and then all of them were falling back. No, running. The rain of fire and lightning against the dome faltered.
“Asha’man,” Taim’s voice rang out, “rolling ring of Earth and Fire!”
Beneath the feet of the Shaido nearest the wagons the ground suddenly erupted in fountains of flame and dirt, hurling men in every direction. While bodies still hung in the air, more gouts of flame roared from the ground, and more, in an expanding ring all the way around the wagons, pursuing the Shaido for fifty paces, a hundred, two hundred. There was nothing but panic and death out there now. Spears and bucklers were cast aside. The dome above stood clear except for the smoke rising from the burning wagons.
“Stop!” The roar of explosions swallowed Rand’s shout as well as it did men’s screams. He wove the flows Taim had used. “Stop it, Taim!” His voice crashed like thunder over everything.
One more ring of eruptions, and Taim called, “Asha’man, rest!”
For a moment a deafening silence seemed to fill the air, Rand’s ears rang. Then he could hear screams and moans. Wounded heaved among the piles of dead. And beyond them the Shaido ran, leaving behind scattered clusters of siswai’aman and Maidens with red armcloths, Cairhienin and Mayeners, some still on their horses. Almost hesitantly those began to move toward the wagons, some of the Aiel lowering their veils. With Power enhancing his eyes, he could make out Rhuarc, limping, one arm dangling, but on his feet. And well beyond him, a large group of women in dark bulky skirts and pale blouses, with an escort of men in Two Rivers coats carrying longbows. They were too far for him to make out faces, but from the way the Two Rivers men at least were staring at the fleeing Shaido, they were as stunned as anyone else.
A great sense of relief welled up inside Rand, though not enough to still the distant churning in his stomach. Min had her face pressed against his shirt; she was weeping. He smoothed her hair. “Asha’man”—he had never been more glad of the Void draining emotion from his voice—“you have done well. I congratulate you, Taim.” He turned away so he would not have to see the carnage anymore, hardly hearing the cheers of “Lord Dragon!” and “Asha’man!” that thundered from the black-coated men.
When he turned, he found Aes Sedai. Merana was all the way at the back, but Alanna stood almost face-to-face with him beside two Aes Sedai he did not recognize.
“You have done well,” the square-faced one of the pair said.  Obviously ignoring them. “I am Bera Harkin, and this is Kiruna Nachiman. We came to rescue you—with Alanna’s aid”—that was an obvious addition, at Alanna’s sudden frown—“though it seems you had small need of us. Still, intentions do count, and—”
“Your place is with them,” Rand said, pointing to the Aes Sedai shielded and under guard. Twenty-three, he saw, and Galina not among them. The buzzing of Lews Therin swelled, but he refused to listen. Now was no time for insane rages.
Kiruna drew herself up proudly. Whatever she was, she was certainly no farmer. “You forget who we are. They may have mistreated you, but we—”
“I forget nothing, Aes Sedai,” Rand said coldly. “I said six could come, but I count nine. I said you would be on an equal footing with the Tower emissaries, and for bringing nine, you will be. They are on their knees, Aes Sedai. Kneel!”
Coldly serene faces stared back at him. He felt Asha’man readying shields of Spirit. Defiance grew on Kiruna’s face, on Bera’s, on others. Two dozen black-coated men made a ring around Rand and the Aes Sedai.
Taim appeared as close to a smile as Rand had ever seen him. “Kneel and swear to the Lord Dragon,” he said softly, “or you will be knelt.”
As stories do, the tale spread, across Cairhien and north and south, by merchant train and peddler and simple traveler gossiping at an inn. As stories do, the tale changed with every telling. The Aiel had turned on the Dragon Reborn and killed him, at Dumai’s Wells or elsewhere. No, the Aes Sedai had saved Rand al’Thor. It was Aes Sedai who had killed him—no, gentled him—no, carried him to Tar Valon where he languished in a dungeon beneath the White Tower. Or else where the Amyrlin Seat herself knelt to him. Unusually for stories, it was something very close to truth that was most often believed.
On a day of fire and blood, a tattered banner waved above Dumai’s Wells, bearing the ancient symbol of Aes Sedai.
On a day of fire and blood and the One Power, as prophecy had suggested, the unstained tower, broken, bent knee to the forgotten sign.
The first nine Aes Sedai swore fealty to the Dragon Reborn, and the world was changed forever.


--- country: India date: 2013-09-01 projectUrl: https://www.linkedin.com/company/zoomdeck-technologies-pvt-ltd- title: Zoomdeck ---
Zoomdeck is an online photo annotation and social networking service. Saneef provided them information architecture, interface design and front end development. Later, he also designed and developed the website for Zoomdeck.
He designed Zoomdeck for iPhone, the mobile companion for Zoomdeck’s rich media photo annotation service for web.


00110101BEEP BOOP00011011
Enter Your Name
Enter Any Number
Robot it up!
Here is your number translated into robot code:


Skyline metrics
Like all applications, Skyline makes its own metrics.
A lot of cloud native things expose a LOT of internal metrics and generally
modern applications tend to make a lot of metrics, verbosely describing the
application. Although there is nothing wrong with this, it does result in
metric overkill a lot of the time for people running the applications. Often
there is little documentation on what all the metrics are and more importantly
information on what metrics are important. We end up with 1000s of metrics
being sent and scraped from applications and most of them we have very little
understanding of. What are the important metrics of application? Although
a developer of an application may be interested in a metric like
application.go_gc_duration_seconds.instance.123%2E232%2E12%2E13:1234.job.application.quantile.0%2E25
the user of the application probably is not going to be interested in that at
all.
Skyline has always attempted to not make too many metrics.
Skyline metrics are sent to Graphite and can be viewed in the Graphite Browser.
Metric definitions
Here each Skyline metric is described. Metrics are only sent if you run a Skyline app or specific feature, if you are not running flux do not expect to get flux metrics. This is list not complete it is a work in progress. There are some ADVANCED_FEATURE metrics that are not listed or described here. If a metric below does not have a description it is an informational or development metrics and its namespace probably says what it does.
A note on skyline.analyzer.$host.labelled_metrics.
metrics and
skyline.analyzer.$host.
metrics. Although labelled_metrics
are within
the skyline.analyzer.$host.
namespace, skyline.analyzer.$host.
metrics
and skyline.analyzer.$host.labelled_metrics.
metrics are distinct groups.
skyline.analyzer.$host.
metrics being related to the analysis of
traditional Graphite metrics and skyline.analyzer.$host.labelled_metrics.
metrics being related to the analysis of Prometheus/VictoriaMetrics style
labelled/tagged metrics.
skyline.$skyline_app.$host.logged_errors
: IMPORTANT every Skyline app records the number of errors that have been logged. Skyline handle error logging very specifically because when analysis is being on 1000s and 1000s of metrics in real time constantly, any issue can cause a thundering herd of errors. During the normal operations of Skyline some errors are always expected. This is especially true when there are some socket.timeouts while sending metrics to Graphite, ingesting metrics from remote clients where the client terminates the connection, etc, etc. Very brief network partitions are expected. There are occasional timeout on the server connecting to the Redis socket or local MariaDB, these things happen and get logged, they are not necessarily abnormal. Allskyline.logged_errors
namespaces are analysed and not skipped via their inclusion insettings.DO_NOT_SKIP_LIST
skyline.analyzer.$host.algorithm_breakdown.$algorithm.timing.{median_time,times_run,total_time}
: these are performance metrics for each of Analyzer’s algorithms. These are mostly for information and detecting performance changes if any algorithm is modified. Mostly for development but are data that can be used in the future to infer the overall state of the entire metric population in terms of how much flux is being experienced. By default not analysed and excluded viasettings.SKIP_LIST
as they are feedback metrics.skyline.analyzer.$host.anomaly_breakdown.$algorithm
: How many times each algorithm triggerred. Same category as the above metrics.skyline.analyzer.$host.exceptions.Boring
: the number of metrics with timeseries that have the same value forsettings.MAX_TOLERABLE_BOREDOM
(default 100) in a row.skyline.analyzer.$host.exceptions.Other
: unknown exceptionsskyline.analyzer.$host.exceptions.TooShort
: the number of metrics that have timeseries that are too short to be analysed (settings.MIN_TOLERABLE_LENGTH
)skyline.analyzer.$host.exceptions.EmptyTimeseries
: the number of metrics that have empty timeseries.skyline.analyzer.$host.exceptions.Stale
: IMPORTANT the number of metrics that have not sent new data insettings.STALE_PERIOD
. If this number spikes up it means that there is a problem with the data being fed to Skyline for a metric/s. These metrics are excluded from analysis by default viasettings.SKIP_LIST
, because Skyline analyzer/metrics_manager and thunder will report on stale metrics.skyline.analyzer.$host.labelled_metrics.exceptions.$exception
: IMPORTANT the same as the analyzer exceptions metrics above, but for the analyzer/labelled_metrics process.skyline.analyzer.$host.labelled_metrics.3sigma_analysed
: the number of labelled metrics that were analysed with 3sigma on 24 hours of data in a skyline/analyzer_labelled_metrics analysis run.skyline.analyzer.$host.labelled_metrics.3sigma_timings
:skyline.analyzer.$host.labelled_metrics.analysed
:skyline.analyzer.$host.labelled_metrics.anomalous
: IMPORTANT the number of 1st stage analysis anomalies were detected on all the Prometheus, influxdb, VictoriaMetrics, skyline/flux based labelled metrics. Although 1st stage analysis anomalies are not important, if there is a surge in the number of 1st stage anomalies it is indicative of a change in the overall flux of a number of metrics in the population. This is analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.analyzer.$host.labelled_metrics.checked
: IMPORTANT the number of labelled_metrics checked. This number is all metrics that were assigned to be checked, it includes skipped. It does not include analyzer metrics,skyline.analyzer.$host.labelled_metrics.*
are seperate and distinct fromskyline.analyzer.$host.
metrics. When this drops there is possibly an issue with the remote_write (et al) source/s and/or metric ingestion with skyline/flux/prometheus/write and/or horizon/prometheus writing the metric data. The number will increase and decrease when you add and remove machines/metrics. Analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.analyzer.$host.labelled_metrics.downsample_timings
:skyline.analyzer.$host.labelled_metrics.downsampled
:skyline.analyzer.$host.labelled_metrics.mad_analysed
:skyline.analyzer.$host.labelled_metrics.mad_anomalous
: the number of labelled metrics that triggered MAD (Median Absolute Deviation) with 3 hours of data and were pushed on to having 24 hours of data analysed with 3sigma in a skyline/analyzer_labelled_metrics analysis run.skyline.analyzer.$host.labelled_metrics.mad_timings
:skyline.analyzer.$host.labelled_metrics.mem_usage
:skyline.analyzer.$host.labelled_metrics.monotonicity_changed
:skyline.analyzer.$host.labelled_metrics.monotonicity_checked
:skyline.analyzer.$host.labelled_metrics.not_anomalous
:skyline.analyzer.$host.labelled_metrics.not_stationary
:skyline.analyzer.$host.labelled_metrics.run_time
: VERY IMPORTANT reports how many seconds skyline/analyzer_labelled_metrics took to analyse all the labelled_metrics. This should be under 60 seconds. If it is higher, skyline/analyzer_labelled_metrics is overloaded and not getting through the analysis quick enough. Consider increasingsettings.ANALYZER_PROCESSES
or using a cluster. Analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.analyzer.$host.labelled_metrics.redis_full_duration_timings
: the number of seconds it took to getsettings.FULL_DURATION
seconds of data for MAD triggered metrics from RedisTimeseries for 3sigma analysis in a skyline/analyzer_labelled_metrics analysis run.skyline.analyzer.$host.labelled_metrics.redis_timings
: the number of seconds it took to get 3 hours of data for ALL metrics from RedisTimeseriesskyline.analyzer.$host.labelled_metrics.skipped
: the number of metrics skipped due to TooShort, Boring, etc in a skyline/analyzer_labelled_metrics analysis run.skyline.analyzer.$host.labelled_metrics.stationary
:skyline.analyzer.$host.labelled_metrics.stationary_analysed
:skyline.analyzer.$host.labelled_metrics.stationary_not_expired
:skyline.analyzer.$host.labelled_metrics.stationary_timing
:skyline.analyzer.$host.low_priority_metrics.{dynamically_analyzed,total}
: this is an ADVANCE FEATURE set of metrics that just keep track of how many low priority metrics get analysed and how many there are total.skyline.analyzer.$host.metrics_sparsity.metrics_fully_populated
: the number of metrics in the population that are fully populated.skyline.analyzer.$host.metrics_sparsity.metrics_sparsity_decreasing
: the number of metrics that are moving towards a fully populated state.skyline.analyzer.$host.metrics_sparsity.metrics_sparsity_increasing
: the number of metrics that are moving away from a fully populated state.skyline.analyzer.$host.metrics_sparsity.avg_sparsity
: IMPORTANT this is number describes how well populated the metric timeseries population is. 100 is perfect, going below about 93% on high resolution metrics indicates a problem, either the metrics are missing data, some have gone offline or network partitions are being encountered.skyline.analyzer.$host.duration
: The duration (in hours) of thesettings.CANARY_METRIC
timeseries data.skyline.analyzer.$host.ionosphere_metrics
: the number of metrics in the population that have been trained.skyline.analyzer.$host.metrics_manager_run_time
: IMPORTANT the number of seconds it takes for analyzer/metrics_manager to run. analyzer/metrics_manager does a lot of work creating and managing internal data sets related to the metrics, settings, activation and removal of things which can change quite dramatically depending on the volumes of metrics.skyline.analyzer.$host.projected
: This is the projected number of seconds that Analyzer should take to run. It is the projected value ofskyline.analyzer.$host.run_time
and these 2 metrics should be very similar. If the run_time is much greater than than the projected there is something amiss.skyline.analyzer.$host.run_time
: VERY IMPORTANT reports how many seconds Analyzer took to analyse all the traditional Graphite based metrics. This should be under 60 seconds. If it is higher, analyzer is overloaded and not getting through the analysis quick enough. Consider increasingsettings.ANALYZER_PROCESSES
skyline.analyzer.$host.sent_to_ionosphere
: a count of how many anomalous metrics were sent to Ionosphere by Analyzer during an analysis run. These metrics are metrics that are not a mirage metrics, they do have previous training and they were anomalous in the 1st stage analysis and seeing as they are not Mirage metrics, it is Analyzer’s responsibility to check Ionosphere to see if they match any pattern of trained behaviour.skyline.analyzer.$host.sent_to_mirage
: a count of how many anomalous metrics were sent to Mirage by Analyzer analysis run for 2nd stage analysis.skyline.analyzer.$host.sent_to_panorama
: a count of how many anomalous metrics were sent to Panorama by Analyzer during an analysis run. These metrics are metrics that are not a mirage metrics (or they are waterfall alerted on), Ionosphere did not match any of the patterns in the trained behaviour (if previously trained) and Analyzer instructs Panorama to record an anomaly for the metric. This only applies to metrics that are not mirage enabled by having no SECOND_ORDER_RESOLUTION_HOURS declared in an alert tuple they match insettings.ALERTS
.skyline.analyzer.$host.total_analyzed
: IMPORTANT the number of metrics analysed. When this drops there is possibly a problem. The number will increase and decrease when you add and remove machines/metrics. Analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.analyzer.$host.total_anomalies
: IMPORTANT the number of anomalies that were detected on all the traditional Graphite based metrics. Analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.analyzer.$host.total_metrics
: the total number of traditional Graphite based metrics.skyline.boundary.$host.*
: these metrics are very similar to the analyzer namespace counterparts described above.skyline.flux.$host.listen.discarded.invalid_value
: the number of metrics flux discarded as they did not have a float value in a 60 second period.skyline.flux.$host.listen.dropped_non_numeric_metrics
: the number of metrics flux discarded as they did not have a float value in a 60 second period.skyline.flux.$host.listen.over_quota_metrics_count
: ADVANCED_FEATURE VERY IMPORTANTskyline.flux.$host.listen.discarded.invalid_timestamp
: the number of metrics flux discarded in a 60 second period because the timestamp was too old (e.g >settings.FLUX_MAX_AGE
).skyline.flux.$host.worker.discarded.already_received
: the number of metrics flux discarded in a 60 second period because data for the timestamp has already been received, deduplication.skyline.flux.$host.listen.added_to_queue
: the number of metrics that flux/listen add in a 60 second period.skyline.flux.$host.listen.discarded.invalid_key
: the number of metrics flux discarded in a 60 second period because submitted api key was not valid.skyline.flux.$host.worker.metrics_sent_to_graphite
: the number of traditional Graphite dotted namespaced metrics flux/worker submitted to in a 60 second period.skyline.flux.$host.aggregator.queue.size
:skyline.flux.$host.listen.discarded.invalid_parameters
: the number of metrics flux discarded in a 60 second period because an incorrect or missing parameter/s were submitted.skyline.flux.$host.listen.discarded.metric_name
:skyline.flux.$host.listen.added_to_aggregation_queue
:skyline.flux.$host.worker.httpMetricDataQueue.size
:skyline.horizon.$host.prometheus.flux_received
: IMPORTANT this is the number of metrics flux/prometheus/write has received in the last 60 seconds. Given potential for high cardinality this metric is important to indicate if lots of new metrics come onboard.skyline.horizon.$host.worker.queue_size_60s_avg
: IMPORTANT this is the average size of the queue in the last 60 seconds for traditional Graphite dotted namespaced metric ingestion. If this value gets to high you may need to add another Horizon worker.skyline.horizon.$host.worker.datapoints_sent_to_redis
: IMPORTANT the number of data points that Horizon is receiving from Graphite and pushing into Redis. If this number drops Skyline is not getting the expected amount of data from Graphite.skyline.horizon.$host.worker.datapoints_sent_to_redis_<id>
: IMPORTANT same as the above metric when Horizon runs multiple workers.skyline.horizon.$host.worker.queue_size
: this is average size of the queue in the last 10 seconds.skyline.horizon.$host.worker.metrics_received
: IMPORTANT this is the number of traditional Graphite dotted namespaced metrics that flux/worker has received in the last 60 seconds. Given potential for high cardinality this metric is important to indicate if lots of new metrics come onboard.skyline.ionosphere.$host.features_calculation_time
:skyline.ionosphere.$host.fps_checked
:skyline.ionosphere.$host.layers_checked
:skyline.ionosphere.$host.not_anomalous
: IMPORTANT the number of potentially anomalous metrics that matched a trained pattern of behaviour as not_anomalous in a 60 period. Important because it is an indicator of how effective the training and pattern matching is.skyline.ionosphere.$host.sent_to_panorama
: IMPORTANT the number of anomalous metrics that did not match a trained pattern of behaviour in a 60 second period.skyline.ionosphere.$host.total_anomalies
: The same as sent_to_panorama above.skyline.ionosphere.$host.training_metrics
:skyline.luminosity.$host.metrics_checked_for_correlation
:skyline.luminosity.$host.classify_metrics.classified
:skyline.luminosity.$host.correlations
:skyline.luminosity.$host.classify_metrics.proceessed
:skyline.luminosity.$host.avg_runtime
:skyline.mirage.$host.checks.done
:skyline.mirage.$host.checks.stale_discarded
: IMPORTANT the number of mirage checks that are discarded because they too old. If this is too high 2nd stage analysis is not be being completed in a timely, real time manner. Consider increasingsettings.MIRAGE_PROCESSES
. This is analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.mirage.$host.checks.pending
: IMPORTANT the number of checks pending to be done by Mirage second stage analysis. If this is too high analysis will not be being completed in a timely, real time manner. Consider increasingsettings.MIRAGE_PROCESSES
. This is analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.mirage.$host.labelled_metrics.checks.done
:skyline.mirage.$host.labelled_metrics.checks.pending
:skyline.mirage.$host.labelled_metrics.checks.stale_discarded
: This is analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.mirage.$host.labelled_metrics.run_time
:skyline.mirage.$host.labelled_metrics.sent_to_ionosphere
:skyline.mirage.$host.labelled_metrics.sent_to_panorama
:skyline.mirage.$host.run_time
:IMPORTANT If this is too high analysis will not be being completed in a timely, real time manner. Consider increasingsettings.MIRAGE_PROCESSES
. This is analysed and not skipped via inclusion insettings.DO_NOT_SKIP_LIST
skyline.mirage.$host.sent_to_ionosphere
:skyline.mirage.$host.sent_to_panorama
:skyline.mirage.$host.vortex.checks.done
:skyline.mirage.$host.vortex.run_time
:skyline.snab.$host.checks.analyzer.testing
skyline.snab.$host.checks.analyzer.anomalies
skyline.snab.$host.checks.analyzer.realtime
skyline.snab.$host.checks.mirage.testing
skyline.snab.$host.checks.mirage.realtime
skyline.snab.$host.checks.mirage.anomalies
skyline.snab.$host.checks.mirage.falied
skyline.snab.$host.checks.analyzer.falied
skyline.snab.$host.checks.processed
skyline.vista.$host.fetcher.metrics_fetched
:skyline.vista.$host.worker.metrics_sent_to_flux
:skyline.vista.$host.fetcher.time_to_fetch
:skyline.vista.$host.fetcher.metrics_to_fetch
:skyline.vista.$host.fetcher.sent_to_flux
:skyline.vista.$host.worker.vista.fetcher.metrics.json
: