function Reshape( config ) {
	
	this.config = config;
	
	if ( this.config !== undefined ) {
		
		this.name = this.config.name;
		
	} else {
		
		this.name = undefined;
		
	}
	
	/**
	 * Use State Pattern to handle reshape cases.
	 * Three States: Reshape1d, Reshape2d and Reshape3d
	 * Based on different states, create different `actualLayer`.
	 *
	 * @type { String }
	 */
	
	this.reshapeType = undefined;
	
	/**
	 * Reshape layer is a proxy, store reference of actual layer.
	 * Three types of actual layers: Reshape1d, Reshape2d, Reshape3d.
	 *
	 * @type { Layer }
	 */
	this.actualLayer = undefined;
	
	/**
	 * Attributes below are important layer metrics for a TensorSpace Layers,
	 * These metrics will be injected or updated by calling updateLayerMetric()
	 */
	
	this.neuralValue = undefined;
	this.inputShape = undefined;
	this.outputShape = undefined;
	
	this.autoOutputDetect = false;
	
	this.actualWidth = undefined;
	this.actualHeight = undefined;
	this.actualDepth = undefined;
	
	this.depth = undefined;
	
	this.layerDimension = undefined;
	this.openFmCenters = undefined;
	
	this.lastLayer = undefined;
	
	if ( config !== undefined &&
		( config.targetShape !== undefined || config.shape !== undefined ) ) {
		
		this.setReshapeType();
		this.createActualLayer();
		this.updateLayerMetric();
	
	}
	
}
Reshape layer is a proxy, store reference of actual layer.
Three types of actual layers: Reshape1d, Reshape2d, Reshape3d.

@type { Layer }