function Kumaraswamy() {
	var a;
	var b;
	if ( !(this instanceof Kumaraswamy) ) {
		if ( arguments.length === 0 ) {
			return new Kumaraswamy();
		}
		return new Kumaraswamy( arguments[ 0 ], arguments[ 1 ] );
	}
	if ( arguments.length ) {
		a = arguments[ 0 ];
		b = arguments[ 1 ];
		if ( !isPositive( a ) ) {
			throw new TypeError( format( 'invalid argument. First shape parameter must be a positive number. Value: `%s`.', a ) );
		}
		if ( !isPositive( b ) ) {
			throw new TypeError( format( 'invalid argument. Second shape parameter must be a positive number. Value: `%s`.', b ) );
		}
	} else {
		a = 1.0;
		b = 1.0;
	}
	defineProperty( this, 'a', {
		'configurable': false,
		'enumerable': true,
		'get': function get() {
			return a;
		},
		'set': function set( value ) {
			if ( !isPositive( value ) ) {
				throw new TypeError( format( 'invalid assignment. Must be a positive number. Value: `%s`.', value ) );
			}
			a = value;
		}
	});
	defineProperty( this, 'b', {
		'configurable': false,
		'enumerable': true,
		'get': function get() {
			return b;
		},
		'set': function set( value ) {
			if ( !isPositive( value ) ) {
				throw new TypeError( format( 'invalid assignment. Must be a positive number. Value: `%s`.', value ) );
			}
			b = value;
		}
	});
	return this;
}
Kumaraswamy's double bounded distribution constructor.

@constructor
@param {PositiveNumber} [a=1.0] - first shape parameter
@param {PositiveNumber} [b=1.0] - second shape parameter
@throws {TypeError} `a` must be a positive number
@throws {TypeError} `b` must be a positive number
@returns {Kumaraswamy} distribution instance

@example
var kumaraswamy = new Kumaraswamy( 1.0, 1.0 );

var y = kumaraswamy.cdf( 0.8 );
// returns 0.8

var v = kumaraswamy.mode;
// returns NaN