pub struct Population<B: Backend, K> { /* private fields */ }Expand description
Population stored on a Burn backend device.
The concrete tensor type depends on the genome kind K. Most
consumers interact with Population<B, Real> via tensor,
but strategies parameterized on the kind can keep the K generic and
reach for the right tensor flavor through the inherent impls below.
Invariant: for every Population<B, K> produced by the public
constructors, exactly one of tensor_real / tensor_int is Some,
determined by K. Real populates tensor_real; Binary,
Integer, and Permutation populate tensor_int. The inherent
tensor(&self) accessors .expect() on the matching field because
the constructor contract pins the invariant — a mismatch would be a
bug in this module.
Implementations§
Source§impl<B: Backend, K> Population<B, K>
impl<B: Backend, K> Population<B, K>
Sourcepub fn pop_size(&self) -> usize
pub fn pop_size(&self) -> usize
Returns the number of individuals (rows) in the population.
This value equals tensor.dims()[0] for any population produced by
the public constructors.
Sourcepub fn genome_dim(&self) -> usize
pub fn genome_dim(&self) -> usize
Returns the genome dimensionality (number of genes, i.e. columns).
This value equals tensor.dims()[1] for any population produced by
the public constructors.
Source§impl<B: Backend> Population<B, Real>
impl<B: Backend> Population<B, Real>
Sourcepub fn new_real(tensor: Tensor<B, 2>) -> Self
pub fn new_real(tensor: Tensor<B, 2>) -> Self
Constructs a real-valued population from a Tensor<B, 2>.
Shape is read from tensor.dims() at construction time; subsequent
calls to pop_size and
genome_dim reflect those dimensions.
§Examples
use burn::backend::Flex;
use burn::tensor::{Tensor, TensorData};
use rlevo_evolution::genome::Real;
use rlevo_evolution::population::Population;
let device = Default::default();
let data = TensorData::new(vec![1.0f32, 2.0, 3.0, 4.0], [2, 2]);
let pop = Population::<Flex, Real>::new_real(
Tensor::from_data(data, &device),
);
assert_eq!(pop.pop_size(), 2);
assert_eq!(pop.genome_dim(), 2);§Panics
Panics if tensor is not rank 2.
Sourcepub fn tensor(&self) -> &Tensor<B, 2>
pub fn tensor(&self) -> &Tensor<B, 2>
Borrows the backing real-valued tensor.
The returned tensor has shape [pop_size, genome_dim]. Use this
to pass the population to fitness functions or operator kernels
without giving up ownership.
§Panics
Never panics in practice: a real-valued population always holds a real tensor by construction.
Sourcepub fn into_tensor(self) -> Tensor<B, 2>
pub fn into_tensor(self) -> Tensor<B, 2>
Source§impl<B: Backend> Population<B, Binary>
impl<B: Backend> Population<B, Binary>
Sourcepub fn new_binary(tensor: Tensor<B, 2, Int>) -> Self
pub fn new_binary(tensor: Tensor<B, 2, Int>) -> Self
Constructs a binary population from a Tensor<B, 2, Int>.
Each element is expected to be 0 or 1; the constructor does not
validate element values. Shape is read from tensor.dims().
§Examples
use burn::backend::Flex;
use burn::tensor::{Int, Tensor, TensorData};
use rlevo_evolution::genome::Binary;
use rlevo_evolution::population::Population;
let device = Default::default();
// 3 individuals, each with a 4-bit binary genome.
let data = TensorData::new(vec![0i64, 1, 0, 1,
1, 0, 1, 0,
0, 0, 1, 1], [3, 4]);
let pop = Population::<Flex, Binary>::new_binary(
Tensor::from_data(data, &device),
);
assert_eq!(pop.pop_size(), 3);
assert_eq!(pop.genome_dim(), 4);§Panics
Panics if tensor is not rank 2.
Sourcepub fn tensor(&self) -> &Tensor<B, 2, Int>
pub fn tensor(&self) -> &Tensor<B, 2, Int>
Borrows the backing integer tensor holding 0/1 values.
The returned tensor has shape [pop_size, genome_dim] and element
type Int. Callers performing crossover or mutation should work
directly with this tensor.
§Panics
Never panics in practice: a binary population always holds an integer tensor by construction.
Source§impl<B: Backend> Population<B, Integer>
impl<B: Backend> Population<B, Integer>
Sourcepub fn new_integer(tensor: Tensor<B, 2, Int>) -> Self
pub fn new_integer(tensor: Tensor<B, 2, Int>) -> Self
Constructs an integer population from a Tensor<B, 2, Int>.
Elements represent non-negative integer indices (e.g. node indices in
CGP, symbol indices in integer-coded GA). The constructor does not
validate element bounds. Shape is read from tensor.dims().
§Examples
use burn::backend::Flex;
use burn::tensor::{Int, Tensor, TensorData};
use rlevo_evolution::genome::Integer;
use rlevo_evolution::population::Population;
let device = Default::default();
// 2 individuals, each with a 5-gene integer-valued genome.
let data = TensorData::new(vec![0i64, 3, 1, 4, 2,
2, 0, 4, 1, 3], [2, 5]);
let pop = Population::<Flex, Integer>::new_integer(
Tensor::from_data(data, &device),
);
assert_eq!(pop.pop_size(), 2);
assert_eq!(pop.genome_dim(), 5);§Panics
Panics if tensor is not rank 2.
Sourcepub fn tensor(&self) -> &Tensor<B, 2, Int>
pub fn tensor(&self) -> &Tensor<B, 2, Int>
Borrows the backing integer tensor.
The returned tensor has shape [pop_size, genome_dim] and element
type Int. Element values are non-negative indices whose domain is
determined by the problem (e.g. 0..n_nodes for CGP).
§Panics
Never panics in practice: an integer population always holds an integer tensor by construction.
Trait Implementations§
Auto Trait Implementations§
impl<B, K> Freeze for Population<B, K>where
<B as BackendTypes>::IntTensorPrimitive: Freeze,
<B as BackendTypes>::FloatTensorPrimitive: Freeze,
<B as BackendTypes>::QuantizedTensorPrimitive: Freeze,
impl<B, K> RefUnwindSafe for Population<B, K>where
K: RefUnwindSafe,
<B as BackendTypes>::IntTensorPrimitive: RefUnwindSafe,
<B as BackendTypes>::FloatTensorPrimitive: RefUnwindSafe,
<B as BackendTypes>::QuantizedTensorPrimitive: RefUnwindSafe,
impl<B, K> Send for Population<B, K>where
K: Send,
impl<B, K> Sync for Population<B, K>where
K: Sync,
impl<B, K> Unpin for Population<B, K>where
K: Unpin,
<B as BackendTypes>::IntTensorPrimitive: Unpin,
<B as BackendTypes>::FloatTensorPrimitive: Unpin,
<B as BackendTypes>::QuantizedTensorPrimitive: Unpin,
impl<B, K> UnsafeUnpin for Population<B, K>where
<B as BackendTypes>::IntTensorPrimitive: UnsafeUnpin,
<B as BackendTypes>::FloatTensorPrimitive: UnsafeUnpin,
<B as BackendTypes>::QuantizedTensorPrimitive: UnsafeUnpin,
impl<B, K> UnwindSafe for Population<B, K>where
K: UnwindSafe,
<B as BackendTypes>::IntTensorPrimitive: UnwindSafe,
<B as BackendTypes>::FloatTensorPrimitive: UnwindSafe,
<B as BackendTypes>::QuantizedTensorPrimitive: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<C> CloneExpand for Cwhere
C: Clone,
impl<C> CloneExpand for Cwhere
C: Clone,
fn __expand_clone_method(&self, _scope: &mut Scope) -> C
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more