From 4aebdcc99e6e88f85d45fed2ca590d3a8701a112 Mon Sep 17 00:00:00 2001 From: tsulej Date: Mon, 9 Jul 2018 22:06:26 +0200 Subject: [PATCH] new release v1.0.3 --- CHANGELOG.md | 7 ++ README.md | 2 +- docs/fastmath.complex.html | 2 +- docs/fastmath.core.html | 6 +- docs/fastmath.easings.html | 2 +- docs/fastmath.fields.html | 98 ++++++++---------- docs/fastmath.interpolation.html | 2 +- docs/fastmath.random.html | 52 +++++----- docs/fastmath.rbf.html | 2 +- docs/fastmath.stats.html | 12 +-- docs/fastmath.transform.html | 4 +- docs/fastmath.vector.html | 20 ++-- .../i/1f8ee3a5402be0b14ee9916aecd6074b.png | Bin 18467 -> 19119 bytes docs/index.html | 2 +- project.clj | 4 +- src/fastmath/fields.clj | 2 +- src/fastmath/java/PrimitiveMath.java | 2 +- 17 files changed, 108 insertions(+), 111 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97cd665e..a72efd7e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). +## [1.0.3] + +### Fixed + +* `norm` when domain is a point, returns range start when value is less or equal domain, range end otherwise +* small fix in one field + ## [1.0.2] ### Added diff --git a/README.md b/README.md index 96b4c9bf..6c8e8250 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Originally it was a part of generative art/glich [Clojure2d](https://github.com/ ## Installation ```clojure -[generateme/fastmath "1.0.1"] +[generateme/fastmath "1.0.3"] ``` ## Documentation diff --git a/docs/fastmath.complex.html b/docs/fastmath.complex.html index 12f299d6..02cd2249 100755 --- a/docs/fastmath.complex.html +++ b/docs/fastmath.complex.html @@ -1,6 +1,6 @@ -fastmath.complex documentation

fastmath.complex

Complex numbers functions.

+fastmath.complex documentation

fastmath.complex

Complex numbers functions.

Complex number is represented as Vec2 type (from clojure2d.math.vector namespace).

To create complex number use complex, vec2 or ->Vec2.

Simplified implementation based on Apache Commons Math. Functions don’t check NaNs or INF values.

diff --git a/docs/fastmath.core.html b/docs/fastmath.core.html index 12cbdfe9..0bbe9472 100755 --- a/docs/fastmath.core.html +++ b/docs/fastmath.core.html @@ -1,6 +1,6 @@ -fastmath.core documentation

fastmath.core

Collection of fast math functions and plethora of constants known from other math libraries.

+fastmath.core documentation

fastmath.core

Collection of fast math functions and plethora of constants known from other math libraries.

Primitive math operators

Based on Primitive Math by Zach Tellman several operators are introduced and replace clojure.core functions. All operators are macros and can’t be used as functions. List includes:

Known from Clojure: * + - / > < >= <= == rem quot mod bit-or bit-and bit-xor bit-not bit-shift-left bit-shift-right unsigned-bit-shift-right inc dec zero? neg? pos? min max even? odd?

@@ -195,13 +195,13 @@

Other functions

(sample sq 1 5 5) ;;=> (1.0 4.0 9.0 16.0 25.0)

sec

(sec v)

Secant

Examples

Plot of sec

sech

(sech v)

Hyperbolic secant

Examples

Plot of sech

seq->double-array

(seq->double-array vs)

Convert sequence to double-array.

If sequence is double-array do not convert.

Examples

Convert

(seq->double-array [1 2 3])
-;;=> [D@14a26264
+;;=> [D@7773054a
 (seq (seq->double-array [1 2 3]))
 ;;=> (1.0 2.0 3.0)
 (double-array->seq (seq->double-array [1 2 3]))
 ;;=> (1.0 2.0 3.0)

seq->double-double-array

(seq->double-double-array vss)

Convert sequence to double-array of double-arrays.

If sequence is double-array of double-arrays do not convert

Examples

Convert

(seq->double-double-array [[1 2] [3 4]])
-;;=> [[D@26a1abb8
+;;=> [[D@22f144b1
 (double-double-array->seq (seq->double-double-array [[1 2] [3 4]]))
 ;;=> ((1.0 2.0) (3.0 4.0))

sfrac

(sfrac v)

Fractional part, always returns values from -1.0 to 1.0 (exclusive). See frac for unsigned version.

Examples

Examples

(sfrac 0.555)
 ;;=> 0.555
diff --git a/docs/fastmath.easings.html b/docs/fastmath.easings.html
index fb617c95..cdca3054 100755
--- a/docs/fastmath.easings.html
+++ b/docs/fastmath.easings.html
@@ -1,6 +1,6 @@
 
-fastmath.easings documentation

fastmath.easings

Easing functions.

+fastmath.easings documentation

fastmath.easings

Easing functions.

List of all are in easings-list.

Code snippets

Save incanter graph

(defn save-graph
   [f params & opts]
   (let [fname (str "images/e/" (first opts) ".png")]
diff --git a/docs/fastmath.fields.html b/docs/fastmath.fields.html
index 1fc1144f..81b02189 100755
--- a/docs/fastmath.fields.html
+++ b/docs/fastmath.fields.html
@@ -1,6 +1,6 @@
 
-fastmath.fields documentation

fastmath.fields

Vector field functions.

+fastmath.fields documentation

fastmath.fields

Vector field functions.

Vector fields are functions R^2->R^2.

Names are taken from fractal flames world where such fields are call variations. Most implementations are taken from JWildfire software.

Creation

@@ -70,7 +70,7 @@

Combinations

  • :angles - vector field from angles
  • See random-configuration for example.

    Examples

    Create random combination

    (let [f (combine)] (f (v/vec2 -0.5 0.5)))
    -;;=> #vec2 [0.25226799258548965, 2.356194490192345]

    Create combination for given configuration

    (let [conf {:type :operation,
    +;;=> #vec2 [0.5290833818481148, -1.1001869390540726]

    Create combination for given configuration

    (let [conf {:type :operation,
                 :name :comp,
                 :var1 {:type :variation,
                        :name :blocky,
    @@ -99,22 +99,22 @@ 

    Combinations

    ;;=> 1.5302948024685854

    field

    multimethod

    Return vector field for given name and options: amount (scaling factor) and parametrization.

    Default scaling factor is 1.0, default parametrization is random.

    Resulting function operates on Vec2 type.

    Examples

    Get vector field by name

    (field :sinusoidal)
    -;;=> fastmath.fields$make_sinusoidal$fn__10993@5ee513d8
    +;;=> fastmath.fields$make_sinusoidal$fn__10993@c790b46
     ((field :sinusoidal) (v/vec2 m/HALF_PI m/HALF_PI))
     ;;=> #vec2 [1.0, 1.0]

    Get vector field by name and scale

    (field :sinusoidal 0.5)
    -;;=> fastmath.fields$make_sinusoidal$fn__10993@26c1a18b
    +;;=> fastmath.fields$make_sinusoidal$fn__10993@4e10067d
     ((field :sinusoidal 0.5) (v/vec2 m/HALF_PI m/HALF_PI))
     ;;=> #vec2 [0.5, 0.5]

    Apply parametrization

    (let [params (parametrization :cpow3)
           f (field :cpow3 1.0 params)]
       {:parametrization params, :value (f (v/vec2 -1.0 1.0))})
    -;;=> {:parametrization {:a 0.877730466661685,
    -;;=>                    :discrete-spread -0.6751139162748264,
    -;;=>                    :divisor 1.6282784739768301,
    -;;=>                    :offset2 -0.12427543265341123,
    -;;=>                    :r -1.83188652741072,
    -;;=>                    :spread 1.7702045622260916,
    -;;=>                    :spread2 0.7296746975817108},
    -;;=>  :value #vec2 [21.658436333042918, -1.7278951230767694]}

    fields-list

    Examples

    List of all vector field names.

    (sort fields-list)
    +;;=> {:parametrization {:a -1.027883317179492,
    +;;=>                    :discrete-spread 0.7910279968110224,
    +;;=>                    :divisor 0.28827117514856804,
    +;;=>                    :offset2 -1.855418094213078,
    +;;=>                    :r 1.3910205700392493,
    +;;=>                    :spread -0.6958560972015344,
    +;;=>                    :spread2 -1.6226069692931797},
    +;;=>  :value #vec2 [-83948.09092212954, -95296.9692904463]}

    fields-list

    Examples

    List of all vector field names.

    (sort fields-list)
     ;;=> (:arch
     ;;=>  :asteria
     ;;=>  :atan :auger
    @@ -277,65 +277,55 @@ 

    Combinations

    Optinally you can pass part of the parametrization. In this case function will add remaining keys with randomly generated values.

    If field doesn’t have parametrization, empty map will be returned.

    See field.

    Examples

    Get random parametrization for given field

    (parametrization :auger)
    -;;=> {:freq -2.7963897275940797,
    -;;=>  :scale -1.8254607490837687,
    -;;=>  :sym 0.9478132587969266,
    -;;=>  :weight 0.3262945909299366}

    Add lacking fields

    (parametrization :auger {:scale 1.0, :freq 1.0})
    +;;=> {:freq -3.0859586681349525,
    +;;=>  :scale -0.9587085563264008,
    +;;=>  :sym 1.834501264037586,
    +;;=>  :weight -0.005060306756689448}

    Add lacking fields

    (parametrization :auger {:scale 1.0, :freq 1.0})
     ;;=> {:freq 1.0,
     ;;=>  :scale 1.0,
    -;;=>  :sym -0.0970875665127795,
    -;;=>  :weight 0.09837550297131381}

    Returns empty map when field doesn’t have parametrization

    (parametrization :sinusoidal)
    +;;=>  :sym -0.0010320305160465004,
    +;;=>  :weight 0.3690021900469187}

    Returns empty map when field doesn’t have parametrization

    (parametrization :sinusoidal)
     ;;=> {}

    random-configuration

    (random-configuration)(random-configuration depth)(random-configuration depth f)

    Create random configuration for combine function. Optionally with depth (0 = only root is created).

    See combine for structure.

    Bind *skip-random-fields* to true to exclude fields which are random.

    Examples

    Generate random configuration

    (random-configuration)
    +;;=> {:amount 1.0, :config {}, :name :cylinder, :type :variation}

    One node configuration

    (random-configuration 0)
    +;;=> {:amount 1.0, :config {}, :name :foucaut, :type :variation}

    Configuration with depth 2

    (random-configuration 2)
     ;;=> {:amount 1.0,
    -;;=>  :config {:xamp 1.585288842930357,
    -;;=>           :xlength 0.8874362068373256,
    -;;=>           :yamp 0.4064734081806104,
    -;;=>           :ylength 1.0439800784233881},
    -;;=>  :name :curve,
    -;;=>  :type :variation}

    One node configuration

    (random-configuration 0)
    -;;=> {:amount 1.0, :config {}, :name :scry, :type :variation}

    Configuration with depth 2

    (random-configuration 2)
    -;;=> {:amount 0.5718363734154245,
    -;;=>  :name :add,
    +;;=>  :name :comp,
     ;;=>  :type :operation,
    -;;=>  :var1 {:amount -1.4534161565102903,
    -;;=>         :name :comp,
    +;;=>  :var1 {:amount 1.0,
    +;;=>         :name :add,
     ;;=>         :type :operation,
    -;;=>         :var1 {:amount 1.0,
    -;;=>                :config {:mode 2, :stretch -0.6146859450575325},
    -;;=>                :name :atan,
    +;;=>         :var1 {:amount -0.38896511052921534,
    +;;=>                :config {},
    +;;=>                :name :loonie,
     ;;=>                :type :variation},
    -;;=>         :var2 {:amount 1.0,
    -;;=>                :config {:area-x -1.6063717689830512,
    -;;=>                         :area-y 0.7733506321629653,
    -;;=>                         :center-x -0.2527242495654958,
    -;;=>                         :center-y -0.7566682275873315,
    -;;=>                         :delta-x 0.6402431582768227,
    -;;=>                         :delta-y 4.4322315820727844,
    -;;=>                         :gamma -0.3753560672495446,
    -;;=>                         :square
    -;;=>                         #},
    -;;=>                :name :gdoffs,
    +;;=>         :var2 {:amount -1.978326319628585,
    +;;=>                :config {},
    +;;=>                :name :noise,
     ;;=>                :type :variation}},
    -;;=>  :var2 {:amount -0.295335840546612,
    -;;=>         :config {:dist -3.6279688266716104, :power -1.0189539608781648},
    -;;=>         :name :julian,
    -;;=>         :type :variation}}

    randomize-configuration

    (randomize-configuration f)

    Randomize values for given configuration. Keeps structure untouched.

    Examples

    Usage

    (let [conf {:type :variation,
    +;;=>  :var2 {:amount 1.0,
    +;;=>         :config {:correctd -0.10570874404742536,
    +;;=>                  :correctn -1.49107210788639,
    +;;=>                  :denominator -16.870277795143114,
    +;;=>                  :numerator 3.1738725224288515,
    +;;=>                  :root -3.790084551225446},
    +;;=>         :name :powblock,
    +;;=>         :type :variation}}

    randomize-configuration

    (randomize-configuration f)

    Randomize values for given configuration. Keeps structure untouched.

    Examples

    Usage

    (let [conf {:type :variation,
                 :name :blocky,
                 :amount 1.0,
                 :config {:x -1.4, :y 0.9, :mp 2.6}}]
       [(randomize-configuration conf) (randomize-configuration conf)])
     ;;=> [{:amount 1.0,
    -;;=>   :config {:mp -1.9355369636115565,
    -;;=>            :x -0.7877026802140837,
    -;;=>            :y 1.3961935636733043},
    +;;=>   :config {:mp -5.319779837039107,
    +;;=>            :x 1.192112272968585,
    +;;=>            :y -0.5659895082838441},
     ;;=>   :name :blocky,
     ;;=>   :type :variation}
     ;;=>  {:amount 1.0,
    -;;=>   :config {:mp -5.268221345301132,
    -;;=>            :x -1.3191898076247768,
    -;;=>            :y 1.455043874367882},
    +;;=>   :config {:mp -3.1133839905285705,
    +;;=>            :x 0.781652073973997,
    +;;=>            :y 1.2051764264026015},
     ;;=>   :name :blocky,
     ;;=>   :type :variation}]

    scalar->vector-field

    (scalar->vector-field scalar f)(scalar->vector-field scalar f1 f2)

    Returns vector field build from scalar fields of the input vector and result of the vector field.

    Examples

    Usage

    (let [f (scalar->vector-field v/heading (field :sinusoidal))]
       (v/applyf (f (v/vec2 m/HALF_PI m/HALF_PI)) m/degrees))
    @@ -343,7 +333,7 @@ 

    Combinations

    (field :sinusoidal) (field :julia))] (v/applyf (f (v/vec2 m/HALF_PI m/HALF_PI)) m/degrees)) -;;=> #vec2 [45.0, 22.500000000000004]

    sum

    (sum f1 f2 amount)(sum f1 f2)

    Add two vector fields.

    Examples

    Usage

    (let [field-1 (field :sinusoidal)
    +;;=> #vec2 [45.0, -157.50000000000003]

    sum

    (sum f1 f2 amount)(sum f1 f2)

    Add two vector fields.

    Examples

    Usage

    (let [field-1 (field :sinusoidal)
           field-2 (field :swirl)
           field-sum (sum field-1 field-2)]
       (field-sum (v/vec2 0.5 0.3)))
    diff --git a/docs/fastmath.interpolation.html b/docs/fastmath.interpolation.html
    index e34fcc6d..c73a274a 100755
    --- a/docs/fastmath.interpolation.html
    +++ b/docs/fastmath.interpolation.html
    @@ -1,6 +1,6 @@
     
    -fastmath.interpolation documentation

    fastmath.interpolation

    1d, 2d interpolation functions.

    +fastmath.interpolation documentation

    fastmath.interpolation

    1d, 2d interpolation functions.

    See more:

    Count number of true values with probability 0.15

    (count (filter true? (repeatedly 100000 (fn* [] (brand 0.15)))))
    -;;=> 14725

    default-rng

    Default RNG - JDK

    Examples

    Usage

    (set-seed! default-rng 111)
    -;;=> org.apache.commons.math3.random.JDKRandomGenerator@5092d376
    +;;=> 14789

    default-rng

    Default RNG - JDK

    Examples

    Usage

    (set-seed! default-rng 111)
    +;;=> org.apache.commons.math3.random.JDKRandomGenerator@1d694d9a
     (irandom default-rng)
     ;;=> -1641157356
     (set-seed! default-rng 999)
    -;;=> org.apache.commons.math3.random.JDKRandomGenerator@5092d376
    +;;=> org.apache.commons.math3.random.JDKRandomGenerator@1d694d9a
     (irandom default-rng)
     ;;=> -421961713
     (set-seed! default-rng 111)
    -;;=> org.apache.commons.math3.random.JDKRandomGenerator@5092d376
    +;;=> org.apache.commons.math3.random.JDKRandomGenerator@1d694d9a
     (irandom default-rng)
     ;;=> -1641157356

    discrete-noise

    macro

    (discrete-noise X Y)(discrete-noise X)

    Discrete noise. Parameters:

      @@ -139,9 +139,9 @@

      Integer di
    • :uniform-int - :lower (default: 0) and :upper (default: Integer/MAX_VALUE)
    • :zipf - :number-of-elements (default: 100) and :exponent (default: 3.0)

    Examples

    Usage

    (distribution :beta)
    -;;=> org.apache.commons.math3.distribution.BetaDistribution@3bad9493
    +;;=> org.apache.commons.math3.distribution.BetaDistribution@315d19f1
     (distribution :beta {:alpha 1.0, :beta 1.0})
    -;;=> org.apache.commons.math3.distribution.BetaDistribution@20953adc

    PDFs of beta

    PDFs of binomial

    PDFs of cauchy

    PDFs of chi-squared

    PDFs of empirical

    PDFs of enumerated-int

    PDFs of enumerated-real

    PDFs of exponential

    PDFs of f

    PDFs of gamma

    PDFs of geometric

    PDFs of gumbel

    PDFs of hypergeometric

    PDFs of laplace

    PDFs of levy

    PDFs of log-normal

    PDFs of logistic

    PDFs of nakagami

    PDFs of normal

    PDFs of pareto

    PDFs of pascal

    PDFs of poisson

    PDFs of t

    PDFs of triangular

    PDFs of uniform-int

    PDFs of uniform-real

    PDFs of weibull

    PDFs of zipf

    DistributionProto

    protocol

    Get information from distributions.

    members

    cdf

    (cdf d v)(cdf d v1 v2)

    Cumulative probability.

    Examples

    Usage

    (cdf (distribution :gamma) 1)
    +;;=> org.apache.commons.math3.distribution.BetaDistribution@4a5b9e6b

    PDFs of beta

    PDFs of binomial

    PDFs of cauchy

    PDFs of chi-squared

    PDFs of empirical

    PDFs of enumerated-int

    PDFs of enumerated-real

    PDFs of exponential

    PDFs of f

    PDFs of gamma

    PDFs of geometric

    PDFs of gumbel

    PDFs of hypergeometric

    PDFs of laplace

    PDFs of levy

    PDFs of log-normal

    PDFs of logistic

    PDFs of nakagami

    PDFs of normal

    PDFs of pareto

    PDFs of pascal

    PDFs of poisson

    PDFs of t

    PDFs of triangular

    PDFs of uniform-int

    PDFs of uniform-real

    PDFs of weibull

    PDFs of zipf

    DistributionProto

    protocol

    Get information from distributions.

    members

    cdf

    (cdf d v)(cdf d v1 v2)

    Cumulative probability.

    Examples

    Usage

    (cdf (distribution :gamma) 1)
     ;;=> 0.09020401043104985
     (cdf (distribution :gamma) 1 4)
     ;;=> 0.5037901398591113

    icdf

    (icdf d p)

    Inversed cumulative probability

    Examples

    Usage

    (icdf (distribution :gamma) 0.5)
    @@ -191,22 +191,22 @@ 

    Integer di (lrand 10 20) ;;=> 18

    noise

    (noise x)(noise x y)(noise x y z)

    Create improved Perlin Noise.

    6 octaves, quintic interpolation.

    Examples

    Usage

    (noise 3.3)
    -;;=> 0.3132195555555555
    +;;=> 0.4835205079365082
     (noise 3.3 1.1)
    -;;=> 0.6016812851200001
    +;;=> 0.47710401682285736
     (noise 3.3 0.0 -0.1)
    -;;=> 0.4440432329549207

    2d noise

    noise-types

    List of possible noise types as a map of names and values.

    Examples

    List of names (keys)

    (keys noise-types)
    +;;=> 0.6260293888000001

    2d noise

    noise-types

    List of possible noise types as a map of names and values.

    Examples

    List of names (keys)

    (keys noise-types)
     ;;=> (:value :gradient :simplex)

    random-noise-cfg

    (random-noise-cfg)

    Create random noise configuration.

    Examples

    Random configuration

    (random-noise-cfg)
     ;;=> {:gain 0.4616632689024004,
     ;;=>  :interpolation :hermite,
     ;;=>  :lacunarity 2.012690835375836,
    -;;=>  :noise-type :simplex,
    +;;=>  :noise-type :gradient,
     ;;=>  :normalize? true,
     ;;=>  :octaves 5,
     ;;=>  :seed -1927726348}

    Create function

    (random-noise-fn)
    -;;=> fastmath.random$billow_noise$fn__8951@700a2863
    +;;=> fastmath.random$ridgedmulti_noise$fn__8955@4b2b9e36
     (random-noise-fn (random-noise-cfg))
    -;;=> fastmath.random$ridgedmulti_noise$fn__8955@4c12ee12

    One

    Two

    Three

    random-noise-fn

    (random-noise-fn cfg)(random-noise-fn)

    Create random noise function from all possible options.

    +;;=> fastmath.random$fbm_noise$fn__8947@3c066b66

    One

    Two

    Three

    random-noise-fn

    (random-noise-fn cfg)(random-noise-fn)

    Create random noise function from all possible options.

    Optionally provide own configuration cfg. In this case one of 4 different blending methods will be selected.

    randval

    macro

    (randval v1 v2)(randval prob v1 v2)

    Retrun value with given probability (default 0.5)

    Examples

    Usage

    (randval :val-one :val-two)
     ;;=> :val-two
     (randval 0.001 :low-probability :high-probability)
    @@ -217,9 +217,9 @@ 

    Integer di {:octaves 3, :lacunarity 2.1, :gain 0.7, :noise-type :simplex})] (n 0.5 1.1 -1.3)) ;;=> 0.5497357888943046

    2d noise

    rng

    multimethod

    Create RNG for given name (as keyword) and optional seed. Return object enhanced with RNGProto. See: rngs-list for names.

    Examples

    Creating

    (rng :mersenne)
    -;;=> org.apache.commons.math3.random.MersenneTwister@6b0b6001
    +;;=> org.apache.commons.math3.random.MersenneTwister@18f67db4
     (rng :isaac 1234)
    -;;=> org.apache.commons.math3.random.ISAACRandom@72ac14c6

    Using

    (irandom (rng :mersenne 999) 15 25)
    +;;=> org.apache.commons.math3.random.ISAACRandom@5b63eae

    Using

    (irandom (rng :mersenne 999) 15 25)
     ;;=> 17

    RNGProto

    protocol

    Defines set of random functions for different RNGs or distributions returning primitive values.

    members

    ->seq

    (->seq t)(->seq t n)

    Returns sequence of random samples limited to optional n values.

    Examples

    Sequence of random values from distribution

    (->seq (distribution :gamma) 5)
     ;;=> (1.3985071121468868
     ;;=>  1.9713574080234095
    @@ -231,24 +231,24 @@ 

    Integer di

    For RNGs: As default returns random double from [0,1) range. When mx is passed, range is set to [0, mx). When mn is passed, range is set to [mn, mx).

    See drand.

    For distributions, just returns random double (call without parameters).

    Examples

    double

    (rngproto-snippet drandom ...)
    -;;=> 0.36674562868038474

    Double random value from distribution

    (drandom (distribution :gamma))
    +;;=> 0.3485525632755664

    Double random value from distribution

    (drandom (distribution :gamma))
     ;;=> 1.7209575348841526

    frandom

    (frandom t)(frandom t mx)(frandom t mn mx)

    Random float.

    For RNGs: As default returns random float from [0,1) range. When mx is passed, range is set to [0, mx). When mn is passed, range is set to [mn, mx).

    See frand.

    For distributions, just returns random float (call without parameters).

    Examples

    float

    (rngproto-snippet frandom ...)
    -;;=> 0.25825706

    Float random value from distribution (sample cast to float)

    (frandom (distribution :gamma))
    +;;=> 0.31610963

    Float random value from distribution (sample cast to float)

    (frandom (distribution :gamma))
     ;;=> 3.6556783

    grandom

    (grandom t)(grandom t std)(grandom t mean std)

    Random double from gaussian distribution. As default returns random double from N(0,1). When std is passed, N(0,std) is used. When mean is passed, distribution is set to N(mean, std).

    See grand.

    Examples

    gaussian double

    (rngproto-snippet grandom ...)
    -;;=> -0.7363627630093181

    irandom

    (irandom t)(irandom t mx)(irandom t mn mx)

    Random integer.

    +;;=> 1.071352745701417

    irandom

    (irandom t)(irandom t mx)(irandom t mn mx)

    Random integer.

    For RNGs: As default returns random integer from full integer range. When mx is passed, range is set to [0, mx). When mn is passed, range is set to [mn, mx).

    See irand.

    For distributions, just returns random integer (call without parameters).

    Examples

    integer

    (rngproto-snippet irandom ...)
    -;;=> -694585408

    Integer random value from distribution (sample cast to int)

    (irandom (distribution :gamma))
    +;;=> -1779834783

    Integer random value from distribution (sample cast to int)

    (irandom (distribution :gamma))
     ;;=> 4

    lrandom

    (lrandom t)(lrandom t mx)(lrandom t mn mx)

    Random long.

    For RNGs: As default returns random long from full long range. When mx is passed, range is set to [0, mx). When mn is passed, range is set to [mn, mx).

    See lrand.

    For distributions, just returns random long (call without parameters).

    Examples

    long

    (rngproto-snippet lrandom ...)
    -;;=> 3521902208633332220

    Long random value from distribution (sample cast to long)

    (lrandom (distribution :gamma))
    +;;=> -2415189781520483255

    Long random value from distribution (sample cast to long)

    (lrandom (distribution :gamma))
     ;;=> 0

    set-seed!

    (set-seed! t v)

    Sets seed. Returns RNG or distribution itself.

    Examples

    Set seed for the RNG object

    (let [rng (rng :isaac)]
       (set-seed! rng 1234)
       (irandom rng 10 15))
    @@ -272,15 +272,15 @@ 

    Integer di ;;=> #vec2 [0.125, 0.8888888888888888])

    Usage (1d)

    (let [gen (sequence-generator :sobol 1)] (take 5 (gen)))
     ;;=> (0.0 0.5 0.75 0.25 0.375)

    Halton plot (1000 samples)

    Sobol plot (1000 samples)

    Sphere plot (1000 samples)

    Gaussian plot (1000 samples)

    Default plot (1000 samples)

    sequence-generators-list

    List of random sequence generator. See sequence-generator.

    Examples

    Generator names.

    (sort sequence-generators-list)
     ;;=> (:default :gaussian :halton :sobol :sphere)

    simplex

    (simplex x)(simplex x y)(simplex x y z)

    Create Simplex noise. 6 octaves.

    Examples

    Usage

    (simplex 3.3)
    -;;=> 0.6425389382895237
    +;;=> 0.5096442877980952
     (simplex 3.3 1.1)
    -;;=> 0.25222309080589755
    +;;=> 0.5751061746072044
     (simplex 3.3 0.0 -0.1)
    -;;=> 0.21866251355411798

    2d noise

    single-noise

    Examples

    Usage

    (let [n (single-noise {:interpolation :linear})] (n 0.5 1.1 -1.3))
    +;;=> 0.6730292363968908

    2d noise

    single-noise

    Examples

    Usage

    (let [n (single-noise {:interpolation :linear})] (n 0.5 1.1 -1.3))
     ;;=> 0.627

    2d noise

    vnoise

    (vnoise x)(vnoise x y)(vnoise x y z)

    Value Noise.

    6 octaves, Hermite interpolation (cubic, h01).

    Examples

    Usage

    (vnoise 3.3)
    -;;=> 0.4738883988541735
    +;;=> 0.27846446202769165
     (vnoise 3.3 1.1)
    -;;=> 0.7563771325220159
    +;;=> 0.6497716338792594
     (vnoise 3.3 0.0 -0.1)
    -;;=> 0.697517360154229

    2d noise

    \ No newline at end of file +;;=> 0.6150280086062385

    2d noise

    \ No newline at end of file diff --git a/docs/fastmath.rbf.html b/docs/fastmath.rbf.html index 84df2ab5..bffa0b58 100755 --- a/docs/fastmath.rbf.html +++ b/docs/fastmath.rbf.html @@ -1,6 +1,6 @@ -fastmath.rbf documentation

    fastmath.rbf

    Radial Basis Function

    +fastmath.rbf documentation

    fastmath.rbf

    Radial Basis Function

    Create with multifunction rbf.

    All of them accept scaling factor scale. Only polyharmonic is defined with integer exponent k. See rbfs-list for all names.

    rbf-obj returns SMILE library object for defined function.

    Categories

    Code snippets

    Save graph

    (defn save-graph
    diff --git a/docs/fastmath.stats.html b/docs/fastmath.stats.html
    index c79bd834..486e6094 100755
    --- a/docs/fastmath.stats.html
    +++ b/docs/fastmath.stats.html
    @@ -1,6 +1,6 @@
     
    -fastmath.stats documentation

    fastmath.stats

    Statistics functions.

    +fastmath.stats documentation

    fastmath.stats

    Statistics functions.

    • Descriptive statistics for sequence.
    • Correlation / covariance of two sequences.
    • @@ -68,13 +68,13 @@

      Other

    • :step - distance between bins
    • :bins - list of pairs of range lower value and number of hits

    Examples

    3 bins from uniform distribution.

    (histogram (repeatedly 1000 rand) 3)
    -;;=> {:bins ([1.8883426090510191E-4 348]
    -;;=>         [0.33337054071807026 316]
    -;;=>         [0.6665522471752354 336]),
    +;;=> {:bins ([9.993947203562614E-4 330]
    +;;=>         [0.33322076626006886 323]
    +;;=>         [0.6654421377997815 347]),
     ;;=>  :size 3,
    -;;=>  :step 0.33318170645716516}

    3 bins from uniform distribution for given range.

    (histogram (repeatedly 10000 rand) 3 [0.1 0.5])
    +;;=>  :step 0.3322213715397126}

    3 bins from uniform distribution for given range.

    (histogram (repeatedly 10000 rand) 3 [0.1 0.5])
     ;;=> {:bins
    -;;=>  ([0.1 1317] [0.23333333333333334 1328] [0.3666666666666667 1347]),
    +;;=>  ([0.1 1315] [0.23333333333333334 1370] [0.3666666666666667 1325]),
     ;;=>  :size 3,
     ;;=>  :step 0.13333333333333333}

    5 bins from normal distribution.

    (histogram (repeatedly 10000 r/grand) 5)
     ;;=> {:bins ([-3.8255442971705595 104]
    diff --git a/docs/fastmath.transform.html b/docs/fastmath.transform.html
    index 813276cb..838c7396 100755
    --- a/docs/fastmath.transform.html
    +++ b/docs/fastmath.transform.html
    @@ -1,6 +1,6 @@
     
    -fastmath.transform documentation

    fastmath.transform

    Transforms.

    +fastmath.transform documentation

    fastmath.transform

    Transforms.

    See transformer and TransformProto for details.

    Wavelet

    Based on JWave library.

    @@ -47,7 +47,7 @@

    Fourier

    • :standard :dft - 1d Discrete Fourier Transform - returns double-array where even elements are real part, odd elements are imaginary part.

    Examples

    Usage

    (transformer :packet :discrete-mayer)
    -;;=> jwave.transforms.WaveletPacketTransform@f2c6d70

    TransformProto

    protocol

    Transformer functions.

    members

    forward-1d

    (forward-1d t xs)

    Forward transform of sequence or array. Returns double array.

    Examples

    Usage

    (seq (forward-1d (transformer :packet :haar-orthogonal) [-1 8 7 6]))
    +;;=> jwave.transforms.WaveletPacketTransform@1b4f6b6d

    TransformProto

    protocol

    Transformer functions.

    members

    forward-1d

    (forward-1d t xs)

    Forward transform of sequence or array. Returns double array.

    Examples

    Usage

    (seq (forward-1d (transformer :packet :haar-orthogonal) [-1 8 7 6]))
     ;;=> (20.0 -6.0 -8.0 -10.0)
     (seq (forward-1d (transformer :fast :haar-orthogonal) [-1 8 7 6]))
     ;;=> (20.0 -6.0 -9.0 1.0)
    diff --git a/docs/fastmath.vector.html b/docs/fastmath.vector.html
    index 3bd7ceba..ff24e19e 100755
    --- a/docs/fastmath.vector.html
    +++ b/docs/fastmath.vector.html
    @@ -1,6 +1,6 @@
     
    -fastmath.vector documentation

    array->vec2

    (array->vec2 a)

    Doubles array to Vec2

    Examples

    Usage

    (array->vec2 (double-array [11 22 33 44 55]))
    +;;=> 36.58661276002927

    array->vec2

    (array->vec2 a)

    Doubles array to Vec2

    Examples

    Usage

    (array->vec2 (double-array [11 22 33 44 55]))
     ;;=> #vec2 [11.0, 22.0]

    array->vec3

    (array->vec3 a)

    Doubles array to Vec3

    Examples

    Usage

    (array->vec3 (double-array [11 22 33 44 55]))
     ;;=> #vec3 [11.0, 22.0, 33.0]

    array->vec4

    (array->vec4 a)

    Doubles array to Vec4

    Examples

    Usage

    (array->vec4 (double-array [11 22 33 44 55]))
     ;;=> #vec4 [11.0, 22.0, 33.0, 44.0]

    array-vec

    (array-vec xs)

    Make ArrayVec type based on provided sequence xs.

    Examples

    Usage

    (array-vec [1 2 3 4 5 6 7])
    @@ -80,13 +80,13 @@ 

    Types

    ;;=> #vec2 [1.0, 1.0]

    generate-vec2

    (generate-vec2 f1 f2)(generate-vec2 f)

    Generate Vec2 with fn(s)

    Examples

    Usage

    (generate-vec2 (constantly 2))
     ;;=> #vec2 [2.0, 2.0]
     (generate-vec2 rand (constantly 1))
    -;;=> #vec2 [1.6541731102326374E-4, 1.0]

    generate-vec3

    (generate-vec3 f1 f2 f3)(generate-vec3 f)

    Generate Vec3 with fn(s)

    Examples

    Usage

    (generate-vec3 rand)
    -;;=> #vec3 [0.005517939777284542, 0.6773827021184029, 0.3311837893009125]
    +;;=> #vec2 [0.0630710799613633, 1.0]

    generate-vec3

    (generate-vec3 f1 f2 f3)(generate-vec3 f)

    Generate Vec3 with fn(s)

    Examples

    Usage

    (generate-vec3 rand)
    +;;=> #vec3 [0.4691580762211698, 0.252494638791968, 0.4653813945662143]
     (generate-vec3 rand (constantly 1) (constantly 2))
    -;;=> #vec3 [0.18716476249565084, 1.0, 2.0]

    generate-vec4

    (generate-vec4 f1 f2 f3 f4)(generate-vec4 f)

    Generate Vec4 with fn(s)

    Examples

    Usage

    (generate-vec4 rand)
    -;;=> #vec4 [0.19168934647004054, 0.11239366841975318, 0.3612597778372615, 0.40333327639900074]
    +;;=> #vec3 [0.010902894119597217, 1.0, 2.0]

    generate-vec4

    (generate-vec4 f1 f2 f3 f4)(generate-vec4 f)

    Generate Vec4 with fn(s)

    Examples

    Usage

    (generate-vec4 rand)
    +;;=> #vec4 [0.7046959186663563, 0.06544269007247161, 0.7800565032840674, 0.34281544310127676]
     (generate-vec4 rand rand (constantly 1) (constantly 2))
    -;;=> #vec4 [0.5624339225522597, 0.41849786952066026, 1.0, 2.0]

    limit

    (limit v len)

    Limit length of the vector by given value

    Examples

    Usage

    (limit (vec3 1.0 1.0 1.0) 1.0)
    +;;=> #vec4 [0.4745994985798181, 0.159660905804342, 1.0, 2.0]

    limit

    (limit v len)

    Limit length of the vector by given value

    Examples

    Usage

    (limit (vec3 1.0 1.0 1.0) 1.0)
     ;;=> #vec3 [0.5773502691896258, 0.5773502691896258, 0.5773502691896258]
     (limit (vec3 1.0 1.0 1.0) 2.0)
     ;;=> #vec3 [1.0, 1.0, 1.0]

    normalize

    (normalize v)

    Normalize vector (set length = 1.0)

    Examples

    Usage

    (normalize (vec2 1.0 -1.0))
    @@ -96,7 +96,7 @@ 

    Types

    ;;=> 90.0 (m/degrees (relative-angle-between (vec (repeatedly 50 rand)) (vec (repeatedly 50 rand)))) -;;=> -5.70598012369491

    set-mag

    (set-mag v len)

    Set length of the vector

    Examples

    Usage

    (set-mag (vec2 0.22 0.22) (m/sqrt 2.0))
    +;;=> -0.09850367659286136

    set-mag

    (set-mag v len)

    Set length of the vector

    Examples

    Usage

    (set-mag (vec2 0.22 0.22) (m/sqrt 2.0))
     ;;=> #vec2 [1.0000000000000002, 1.0000000000000002]
     (set-mag (vec2 1.0 1.0) 0.0)
     ;;=> #vec2 [0.0, 0.0]

    TOLERANCE

    const

    ;;=> 1.0E-6

    Tolerance used in is-near-zero?. Values less than this value are treated as zero.

    vec2

    (vec2 x y)

    Make 2d vector

    Examples

    Usage

    (vec2 0.5 -0.5)
    @@ -191,12 +191,12 @@ 

    Types

    ;; Test: ok.

    maxdim

    (maxdim v)

    Index of maximum value.

    Examples

    Usage

    (let [v (vec (repeatedly 100 (fn [] (- (int (rand-int 200)) 100))))
           mdim (maxdim v)]
       [mdim (v mdim)])
    -;;=> [13 96]
    +;;=> [39 98]
     (maxdim (vec3 1 2 3))
     ;;=> 2

    mindim

    (mindim v)

    Index of minimum value.

    Examples

    Usage

    (let [v (vec (repeatedly 100 (fn [] (- (int (rand-int 200)) 100))))
           mdim (mindim v)]
       [mdim (v mdim)])
    -;;=> [12 -100]
    +;;=> [13 -99]
     (mindim (vec3 1 2 3))
     ;;=> 0

    mn

    (mn v1)

    Minimum value of vector elements

    Examples

    Usage

    (mn (vec4 -1 -2 3 4))
     ;;=> -2.0

    mult

    (mult v1 v)

    Multiply vector by number v.

    Examples

    Usage

    (mult (vec4 5 4 3 5) 4.0)
    diff --git a/docs/images/i/1f8ee3a5402be0b14ee9916aecd6074b.png b/docs/images/i/1f8ee3a5402be0b14ee9916aecd6074b.png
    index b5ffe5de787947afa2353781c2372d531c37b616..cb50fdea3ebed46ec03ed97dc08f4c80e8e57c2e 100755
    GIT binary patch
    literal 19119
    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
    
    literal 18467
    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
    
    diff --git a/docs/index.html b/docs/index.html
    index c1af1991..cc4acf5a 100755
    --- a/docs/index.html
    +++ b/docs/index.html
    @@ -1,3 +1,3 @@
     
    -Fastmath 1.0.2

    Fastmath 1.0.2

    Released under the Unlicence

    Fast and primitive math library.

    Installation

    To install, add the following dependency to your project or build file:

    [generateme/fastmath "1.0.2"]

    Namespaces

    fastmath.complex

    Complex numbers functions.

    Categories

    Other vars: abs add arg complex conjugate div mult neg reciprocal sq sqrt sqrt1z sub

    fastmath.rbf

    Radial Basis Function

    Categories

    \ No newline at end of file +Fastmath 1.0.3

    Fastmath 1.0.3

    Released under the Unlicence

    Fast and primitive math library.

    Installation

    To install, add the following dependency to your project or build file:

    [generateme/fastmath "1.0.3"]

    Namespaces

    fastmath.complex

    Complex numbers functions.

    Categories

    Other vars: abs add arg complex conjugate div mult neg reciprocal sq sqrt sqrt1z sub

    fastmath.rbf

    Radial Basis Function

    Categories

    \ No newline at end of file diff --git a/project.clj b/project.clj index fa2e8889..e96f0c70 100755 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject generateme/fastmath "1.0.2" +(defproject generateme/fastmath "1.0.3" :description "Fast and primitive math library" :url "https://github.com/generateme/fastmath" :license {:name "The Unlicence" @@ -22,7 +22,7 @@ [lein-codox "0.10.3"]] :source-paths ["example"] :dependencies [[codox-theme-rdash "0.1.2"] - [clojure2d "0.1.0-SNAPSHOT"] + [clojure2d "1.0.0-RC2"] [criterium "0.4.4"] [incanter/incanter-charts "1.9.2"] [incanter/incanter-core "1.9.2"] diff --git a/src/fastmath/fields.clj b/src/fastmath/fields.clj index 1b61a98f..222d577e 100644 --- a/src/fastmath/fields.clj +++ b/src/fastmath/fields.clj @@ -1479,7 +1479,7 @@ :center-x (drand -1 1) :center-y (drand -1 1) :gamma (drand -5 5) - :square brand}) + :square (brand)}) (def ^:const ^:private ^double agdod-- 0.1) (def ^:const ^:private ^double agdoa-- 2.0) diff --git a/src/fastmath/java/PrimitiveMath.java b/src/fastmath/java/PrimitiveMath.java index 78a7e744..cd90efea 100644 --- a/src/fastmath/java/PrimitiveMath.java +++ b/src/fastmath/java/PrimitiveMath.java @@ -114,7 +114,7 @@ public final class PrimitiveMath { public static boolean isOdd(long a) { return (a&1)==1; } public static double norm(double v, double start, double stop) { - return start == stop ? (v < start ? 0.0 : 1.0) : (v - start) / (stop - start); + return start == stop ? (v <= start ? 0.0 : 1.0) : (v - start) / (stop - start); } public static double norm(double v, double start1, double stop1, double start2, double stop2) { return start2 + (stop2 - start2) * norm(v, start1, stop1);