NAME
Quantum::Superpositions::Lazy::Superposition - a weighted superposition implementation
DESCRIPTION
This class implements a weighted superposition consisting of a set of Quantum::Superpositions::Lazy::State states. Each state contains a weight and a value, and the probability of each state occuring randomly is weight / superposition_weight_sum
. A superposition can be collapsed, so that it will pick and return one state's value at random. After that, further collapsing will keep returning that value until the state is reset.
Simple operations only touching superposition creation and collapsing are optimized - they do not produce the entire list of values that superposition may contain. For example, creating a superposition which is a mathematical operation (see Quantum::Superpositions::Lazy::Computation) would normally create a lot of possible outcomes - one of 100 values plus one of 10 values is one of 1000 values. Normally, picking a random value from such superposition would require 1000 addition operations and one random / select an element operation. In this implementation however, this only requires one addition and two random numbers being generated.
This only works this way for the easiest use case. Every time you want to do a logical operation, get some statistics out of the superposition or even export to string (the ket notation) a full set of states is generated. Be aware of the performance implications - producing a million values superposition is not hard yet very costly.
METHODS
new
# auto weights (all elements have the same probability)
my $superposition = Quantum::Superpositions::Lazy::Superposition
->new(states => [1, 2, 3]);
# custom weights (weight, value)
my $superposition = Quantum::Superpositions::Lazy::Superposition
->new(states => [[5, 1], [5, 2], [7, 3]]);
A constructor. The only named argument accepted is the states argument. It can contain either an array reference of Quantum::Superpositions::Lazy::State objects (no coercion is applied), an array reference of array references, each having exactly two elements (coerced into Quantum::Superpositions::Lazy::State objects, the first element becomes the weight and the second element becomes the value) or an array referenc of just about anything else (coerced into state objects with automatic weight).
In most cases it should be easier to use superpos helper function from Quantum::Superpositions::Lazy rather than the constructor explicitly.
collapse
my $random_value = $superposition->collapse;
Collapses a superposition into a single random scalar value. Any further calls to collapse will keep returning the same value until reset is called.
is_collapsed
Returns a boolean to tell whether the superposition is currently collapsed.
reset
Resets the collapsed state of the superposition and any nested superpositions. The next collapse call will return a newly randomized value.
Returns $self
states
my $complete_states = $superposition->states;
Compiles a complete set of possible states for the superposition and returns it. It will be an array reference consisting of Quantum::Superpositions::Lazy::State objects or their descendants.
The result of the operation is cached. The operation itself can be costly in some circumstances (especially when using it on Quantum::Superpositions::Lazy::Computation of two superpositions).
stats
my $mean = $superposition->stats->mean;
Constructs and returns an instance of Quantum::Superpositions::Lazy::Statistics, and caches it for later use.
weight_sum
Returns the sum of all states' weights. A possibility for each state occuring during collapsing can be calculated with a simple division: $state->weight / $superposition->weight_sum
.
to_ket_notation
# will return: 0.5|1> + 0.5|2>
my $ket = superpos(1, 2)->to_ket_notation;
Compiles and returns a string containing the superposition in form of ket notation.
stringify
An alias to collapse method. Also invoked with overloaded ""
.
transform
# will double every element, same as * 2
my $transformed1 = $superposition->transform(sub { shift() * 2 });
my $transformed2 = $superposition->transform(sub { $_ * 2 });
# more arguments can be specified, which will be passed to the subroutine
my $transformed = $superposition->transform(sub { $_[0] * $_[1] }, $another_superposition);
Enables creating a new superposition from an existing one using complex logic passed as a subroutine reference in the first argument. Can optionally accept more arguments (superpositions) that can take part in the calculation.
The first argument is also passed as a localized $_
. Works just like the regular computations but with a custom function. This can be thought of as a way to use a function against some superpositions, for example "max" in List::Util:
$pos->transform(\&max, $another_pos, $yet_another_pos);
Will produce a superposition with a maximum of each three values of the given superpositions.
compare
# will perform a custom comparison
my $boolean = $superposition->compare(sub { shift() =~ /regexp/ });
my $matches = fetch_matches { $superposition->compare(sub { /regexp/ }) };
Like "transform", but performs a logical comparison instead of a state mutation. Just like transform, it can accept more superpositions as its arguments.
OVERLOADING
The package uses overloading to have its objects used in perl expressions seamlessly. Most operators do the same stuff as they'd do with normal scalars, but perform them on the superposition states or return a new Quantum::Superpositions::Lazy::Computation object. The only operator that does something different is the ""
stringification, which collapses the superposition and returns the state.
Operators can be divided into two types:
logical operators, which by default return a standard boolean value
computational operators, which return an instance of Quantum::Superpositions::Lazy::Computation
Since the behavior of overloaded operators is hard to control, the module introduces blocks that change how the internal operations will behave when they are performed in these blocks. These are documented in "FUNCTIONS" in Quantum::Superpositions::Lazy.
The list of overloaded operators considered logical
! == != > >= < <= eq ne gt ge lt le
The list of overloaded operators considered computational
neg + - * ** << >> / % += -= *= **= <<= >>= /= %= . x .=
x= atan2 cos sin exp log sqrt int abs