afu/binlist-to-proportions [ Functions ]

[ Top ] [ afu ] [ Functions ]

DATE

 May 23rd 2019, Heidhausen

DESCRIPTION

 From a list of an arbitrary number of 1s and 0s, create a list of
 corresponding proportions: Each occurrence of 1 starts a new item, with each
 subsequent occurence of 0 incrementing the proportion we'll collect.

 NB all 0s at the beginning of the list will be ignored until we see the
 first 1.

ARGUMENTS

 a simple list of 1s and 0s

RETURN VALUE

 a list of integers

EXAMPLE

(binlist-to-proportions '(1 0 0 1 0 1 0 1 0 0 0))
--> (3 2 2 4)

;;; the final 1 has no following 0s so its 'length' is 1
(binlist-to-proportions '(1 0 0 1 0 1 0 1 0 0 0 1))
--> (3 2 2 4 1)

;;; all leading zeros ignored
(binlist-to-proportions '(0 0 0 1 0 0 1 0 1 0 1 0 0 0 1))
--> (3 2 2 4 1)

SYNOPSIS

(defun binlist-to-proportions (binlist)

afu/inflate-proportionally [ Functions ]

[ Top ] [ afu ] [ Functions ]

DATE

 May 23rd 2019, Heidhausen

DESCRIPTION

 Take a list of proportions (generally integers but floating-point works too)
 and create a longer list, using the proportions scaled proportionally. In
 other words a list like '(1 2 3) will become '((1 2 3) (2 4 6) (3 6 9))
 i.e. internally always in proportion like the original but leading of course
 then to other proportions when used with permutations (see inline comments).

ARGUMENTS

 a simple list of proportions

OPTIONAL ARGUMENTS

 keyword arguments:
 - :invert. Whether to invert proportions (e.g. 3 becomes 1/3)  . Default =
   T.
 - :rescale. Whether to scale the results to be within new
   minima/maxima. This should be a two-element list (min. max.). Default =
   '(0 1).
 - :highest. The highest number to use from the original list when scaling.
   This limit is offered so that we don't end up with most of our numbers
   down at the very bottom end of our scale. Default = 4.
 - :lowest. Similar to :highest but the minimum scaler we'll use.
   Default = 1.
 - :reverse. Whether to alternate the original order with the reverse thereof
   when looping through the list and applying proportional scalers. Default =
   T.
 - :expt. An exponent to raise our results to before the rescaling process
   (if used). Of course this completely changes proportions but there are
   times when results are far too skewed to the bottom of the range so using
   an exponent such as 0.3 

RETURN VALUE

SYNOPSIS

(defun inflate-proportionally (l &key (invert t) (rescale '(0 1))
                                   (lowest 1) (highest 4)
                                   (reverse t) (expt nil))

afu/make-afu [ Functions ]

[ Top ] [ afu ] [ Functions ]

DATE

 May 23rd 2019, Heidhausen

DESCRIPTION

 Make an afu object. See https://michael-edwards.org/wp/?p=1227 for examples.

ARGUMENTS

 Any keyword arguments that make-instance would accept i.e. slots such as
 start-at, level, minimum...

RETURN VALUE

 An afu object

EXAMPLE

(make-afu :level 3 :minimum -3 :maximum 3 :exponent .3)

AFU: start-at: 0, level: 3, period: 113 
     minimum: -3, maximum: 3, num-unique: 32 
     unique: (-3.0 -2.908942 -2.8265874 -2.7273216 -2.6483202 -2.5553133
              -2.4432077 -2.3418174 -2.2489507 -2.2196069 -2.1223445 -1.8698215
              -1.7599787 -1.7449956 -1.6306628 -1.5945365 -1.4747927 -1.3338206
              -1.1639004 -1.0286679 -0.86946154 -0.824985 -0.6775627 -0.5040059
              -0.29480958 -0.12831879 0.3039422 0.7751665 0.98014116 1.5123172
              2.3448153 3.0)
     binlist: (1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0
               0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
               1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0
               1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1)
CIRCULAR-SCLIST: current 0
SCLIST: sclist-length: 408, bounds-alert: T, copy: T
LINKED-NAMED-OBJECT: previous: NIL, 
                     this: NIL, 
                     next: NIL
NAMED-OBJECT: id: NIL, tag: NIL, 
data: (-2.1223445 -1.4747927 -2.5553133 -1.4747927 -0.6775627 -2.4432077
       -2.1223445 -0.6775627 -1.8698215 -2.1223445 -1.4747927 -2.5553133
       -1.4747927 -0.6775627 -2.4432077 -2.1223445 -0.6775627 -1.8698215
       -2.1223445 -1.4747927 -2.5553133 -1.4747927 -0.6775627 -2.4432077
       -2.1223445 -0.6775627 -1.8698215 -2.1223445 -1.4747927 -2.5553133
       -1.4747927 -0.6775627 -2.4432077 -0.6775627 -1.1639004 -2.7273216
       -1.1639004 -1.8698215 -2.8265874 -1.8698215 -2.4432077 -2.2196069
...    

SYNOPSIS

(defun make-afu (&rest keyargs &key &allow-other-keys)

afu/scale [ Methods ]

[ Top ] [ afu ] [ Methods ]

DATE

 May 23rd 2019, Heidhausen

DESCRIPTION

 Scale the existing data list to be within new bounds. NB this does not check
 the existing data list for its maximum and minimum values, rather it uses
 the existing minimum and maximum slot values (which should be correct,
 unless something went wrong).

ARGUMENTS

 - the afu object
 - the new desired minimum (number). Default = NIL = use the current minimum
   slot.

OPTIONAL ARGUMENTS

 - the new desired maximum (number). Default = NIL = use the current maximum
   slot 

RETURN VALUE

 the new data list

SYNOPSIS

(defmethod scale ((a afu) new-min &optional new-max ignore1 ignore2)

circular-sclist/afu [ Classes ]

[ Top ] [ circular-sclist ] [ Classes ]

NAME

 afu

 File:             afu.lsp

 Class Hierarchy:  named-object -> linked-named-object -> sclist -> 
                   circular-sclist -> afu

 Version:          1.0.12

 Project:          slippery chicken (algorithmic composition)

 Purpose:          AFU = Alternativ fuer Unentschiedener (a little play on
                   the rather silly German political party).  This translates
                   to Alternative for the Undecided. Building on the
                   circular-sclist and activity-levels class, it's meant as a
                   deterministic alternative to randomness.

 Author:           Michael Edwards: m@michael-edwards.org

 Creation date:    May 18th 2019

 $$ Last modified:  12:57:13 Sat Nov 20 2021 CET