Skip to content

Commit 74827aa

Browse files
committed
Merge branch 'develop'
2 parents bc11a17 + 0134788 commit 74827aa

File tree

135 files changed

+6480
-3508
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

135 files changed

+6480
-3508
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ rayon = "1.11.0"
7171
smallvec = { version = "1.13", features = ["serde"] }
7272
thiserror = "2.0.17"
7373
serde = { version = "1.0.228", features = ["derive", "rc"] }
74-
serde_json = { version = "1.0.148" }
74+
serde_json = { version = "1.0.149" }
7575
chrono = { version = "0.4.42", default-features = false, features = ["std"] }
7676
chrono-tz = "0.10"
7777
compact_str = { version = "0.9.0" }

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h1 align="center">Radiate</h1>
22
<p align="center">
3-
<img src="/docs/assets/radiate.png" height="100" width="60" alt="Radiate Logo" />
3+
<img src="/docs/assets/logo/radiate.png" height="100" width="60" alt="Radiate Logo" />
44
</p>
55

66
<div align="center">

crates/radiate-core/src/alter.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::{Chromosome, Gene, Genotype, Metric, Population, math::indexes, rando
22
use crate::{Rate, metric};
33
use radiate_utils::{ToSnakeCase, intern};
44
use std::iter::once;
5-
use std::rc::Rc;
5+
use std::sync::Arc;
66

77
#[macro_export]
88
macro_rules! alters {
@@ -82,8 +82,8 @@ impl From<Metric> for AlterResult {
8282
8383
#[derive(Clone)]
8484
pub enum Alterer<C: Chromosome> {
85-
Mutate(&'static str, Rate, Rc<dyn Mutate<C>>),
86-
Crossover(&'static str, Rate, Rc<dyn Crossover<C>>),
85+
Mutate(&'static str, Rate, Arc<dyn Mutate<C>>),
86+
Crossover(&'static str, Rate, Arc<dyn Crossover<C>>),
8787
}
8888

8989
impl<C: Chromosome> Alterer<C> {
@@ -105,31 +105,47 @@ impl<C: Chromosome> Alterer<C> {
105105
pub fn alter(&self, population: &mut Population<C>, generation: usize) -> Vec<Metric> {
106106
match &self {
107107
Alterer::Mutate(name, rate, m) => {
108-
let rate_value = rate.value(generation);
108+
let (rate_value, rate_metric) = Self::rate_metric(generation, rate, name);
109109

110110
let timer = std::time::Instant::now();
111111
let AlterResult(count, metrics) = m.mutate(population, generation, rate_value);
112112
let metric = metric!(name, (count, timer.elapsed()));
113113

114114
match metrics {
115-
Some(metrics) => metrics.into_iter().chain(once(metric)).collect(),
116-
None => vec![metric],
115+
Some(metrics) => metrics
116+
.into_iter()
117+
.chain(once(metric))
118+
.chain(once(rate_metric))
119+
.collect(),
120+
None => vec![metric, rate_metric],
117121
}
118122
}
119123
Alterer::Crossover(name, rate, c) => {
120-
let rate_value = rate.value(generation);
124+
let (rate_value, rate_metric) = Self::rate_metric(generation, rate, name);
121125

122126
let timer = std::time::Instant::now();
123127
let AlterResult(count, metrics) = c.crossover(population, generation, rate_value);
124128
let metric = metric!(name, (count, timer.elapsed()));
125129

126130
match metrics {
127-
Some(metrics) => metrics.into_iter().chain(once(metric)).collect(),
128-
None => vec![metric],
131+
Some(metrics) => metrics
132+
.into_iter()
133+
.chain(once(metric))
134+
.chain(once(rate_metric))
135+
.collect(),
136+
None => vec![metric, rate_metric],
129137
}
130138
}
131139
}
132140
}
141+
142+
#[inline]
143+
fn rate_metric(generation: usize, rate: &Rate, name: &str) -> (f32, Metric) {
144+
let rate_value = rate.value(generation);
145+
let metric = metric!(radiate_utils::intern!(format!("{}_rate", name)), rate_value);
146+
147+
(rate_value, metric)
148+
}
133149
}
134150

135151
/// Minimum population size required to perform crossover - this ensures that there
@@ -168,7 +184,7 @@ pub trait Crossover<C: Chromosome>: Send + Sync {
168184
where
169185
Self: Sized + 'static,
170186
{
171-
Alterer::Crossover(intern!(self.name()), self.rate(), Rc::new(self))
187+
Alterer::Crossover(intern!(self.name()), self.rate(), Arc::new(self))
172188
}
173189

174190
#[inline]
@@ -266,7 +282,7 @@ pub trait Mutate<C: Chromosome>: Send + Sync {
266282
where
267283
Self: Sized + 'static,
268284
{
269-
Alterer::Mutate(intern!(self.name()), self.rate(), Rc::new(self))
285+
Alterer::Mutate(intern!(self.name()), self.rate(), Arc::new(self))
270286
}
271287

272288
#[inline]

crates/radiate-core/src/objectives/optimize.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ use super::Scored;
22
#[cfg(feature = "serde")]
33
use serde::{Deserialize, Serialize};
44

5+
const MIN: &str = "min";
6+
const MAX: &str = "max";
7+
58
#[derive(Clone, Debug, PartialEq)]
69
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
710
pub enum Objective {
@@ -132,6 +135,27 @@ impl Default for Objective {
132135
}
133136
}
134137

138+
impl From<Vec<&str>> for Objective {
139+
fn from(values: Vec<&str>) -> Self {
140+
let opts: Vec<Optimize> = values.into_iter().map(|s| Optimize::from(s)).collect();
141+
142+
if opts.len() == 1 {
143+
Objective::Single(opts[0])
144+
} else {
145+
Objective::Multi(opts)
146+
}
147+
}
148+
}
149+
150+
impl Into<Vec<&str>> for Objective {
151+
fn into(self) -> Vec<&'static str> {
152+
match self {
153+
Objective::Single(opt) => vec![opt.into()],
154+
Objective::Multi(opts) => opts.into_iter().map(|opt| opt.into()).collect(),
155+
}
156+
}
157+
}
158+
135159
#[derive(Clone, Copy, Debug, PartialEq)]
136160
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
137161
pub enum Optimize {
@@ -170,6 +194,25 @@ impl Optimize {
170194
}
171195
}
172196

197+
impl From<&str> for Optimize {
198+
fn from(value: &str) -> Self {
199+
match value.to_lowercase().as_str() {
200+
MIN => Optimize::Minimize,
201+
MAX => Optimize::Maximize,
202+
_ => Optimize::Maximize,
203+
}
204+
}
205+
}
206+
207+
impl Into<&str> for Optimize {
208+
fn into(self) -> &'static str {
209+
match self {
210+
Optimize::Minimize => MIN,
211+
Optimize::Maximize => MAX,
212+
}
213+
}
214+
}
215+
173216
#[cfg(test)]
174217
mod tests {
175218
use super::*;

0 commit comments

Comments
 (0)