5 Commits

Author SHA1 Message Date
8d93fc528e print input 2026-03-27 10:30:51 -07:00
f406f126ee adam optimizer 2026-03-27 10:24:52 -07:00
ec73f62f89 drastically reduce hidden layers 2026-03-27 10:23:25 -07:00
25bee24e4c graphics bodge 2 2026-03-27 10:07:01 -07:00
93c01910cb include world offset 2026-03-27 09:54:15 -07:00
3 changed files with 19 additions and 15 deletions

8
Cargo.lock generated
View File

@@ -5478,9 +5478,9 @@ dependencies = [
[[package]]
name = "strafesnet_graphics"
version = "0.0.11-depth"
version = "0.0.11-depth2"
source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
checksum = "16266ca7e57ce802b7abd24c6cd8f9b8d95752f7eaead27e42b431b9768d6135"
checksum = "829804ab9c167365e576de8ebd8a245ad979cb24558b086e693e840697d7956c"
dependencies = [
"bytemuck",
"ddsfile",
@@ -5515,9 +5515,9 @@ dependencies = [
[[package]]
name = "strafesnet_roblox_bot_player"
version = "0.6.2-depth"
version = "0.6.2-depth2"
source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
checksum = "12d1aa21c174f23f7f7ede583292a8c82e4b3c483fb0d950e58f84d52807f6ed"
checksum = "f39e7dfc0cb23e482089dc7eac235ad4b274ccfdb8df7617889a90e64a1e247a"
dependencies = [
"glam",
"strafesnet_common",

View File

@@ -8,9 +8,9 @@ burn = { version = "0.20.1", features = ["cuda", "autodiff"] }
wgpu = "29.0.0"
strafesnet_common = { version = "0.9.0", registry = "strafesnet" }
strafesnet_graphics = { version = "=0.0.11-depth", registry = "strafesnet" }
strafesnet_graphics = { version = "=0.0.11-depth2", registry = "strafesnet" }
strafesnet_physics = { version = "=0.0.2-surf", registry = "strafesnet" }
strafesnet_roblox_bot_file = { version = "0.9.4", registry = "strafesnet" }
strafesnet_roblox_bot_player = { version = "=0.6.2-depth", registry = "strafesnet" }
strafesnet_roblox_bot_player = { version = "=0.6.2-depth2", registry = "strafesnet" }
strafesnet_snf = { version = "0.4.0", registry = "strafesnet" }
pollster = "0.4.0"

View File

@@ -1,7 +1,7 @@
use burn::backend::Autodiff;
use burn::nn::loss::{MseLoss, Reduction};
use burn::nn::{Linear, LinearConfig, Relu};
use burn::optim::{GradientsParams, Optimizer, SgdConfig};
use burn::optim::{GradientsParams, Optimizer, AdamConfig};
use burn::prelude::*;
type InferenceBackend = burn::backend::Cuda<f32>;
@@ -14,13 +14,8 @@ use strafesnet_roblox_bot_file::v0;
const SIZE_X: usize = 64;
const SIZE_Y: usize = 36;
const INPUT: usize = SIZE_X * SIZE_Y;
const HIDDEN: [usize; 7] = [
INPUT >> 1,
INPUT >> 2,
const HIDDEN: [usize; 2] = [
INPUT >> 3,
INPUT >> 4,
INPUT >> 5,
INPUT >> 6,
INPUT >> 7,
];
// MoveForward
@@ -89,6 +84,9 @@ fn training() {
.unwrap();
let timelines =
strafesnet_roblox_bot_file::v0::read_all_to_block(std::io::Cursor::new(bot_file)).unwrap();
let bot = strafesnet_roblox_bot_player::bot::CompleteBot::new(timelines).unwrap();
let world_offset = bot.world_offset();
let timelines = bot.timelines();
// setup graphics
let desc = wgpu::InstanceDescriptor::new_without_display_handle_from_env();
@@ -235,6 +233,9 @@ fn training() {
fn a(a: v0::Vector3) -> [f32; 2] {
[a.y, a.x]
}
fn sub<T: core::ops::Sub>(lhs: T, rhs: T) -> T::Output {
lhs - rhs
}
let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
label: Some("wgpu encoder"),
@@ -244,7 +245,7 @@ fn training() {
graphics.encode_commands(
&mut encoder,
&graphics_texture_view,
p(output_event.event.position).into(),
sub(p(output_event.event.position).into(), world_offset),
a(output_event.event.angles).into(),
);
@@ -288,6 +289,7 @@ fn training() {
}
output_staging_buffer.unmap();
let inputs_start = inputs.len();
// discombolulate stride
for y in 0..size.y {
inputs.extend(
@@ -297,6 +299,8 @@ fn training() {
.map(|b| f32::from_le_bytes(b.try_into().unwrap())),
)
}
let inputs_end = inputs.len();
println!("inputs = {:?}", &inputs[inputs_start..inputs_end]);
texture_data.clear();
}
@@ -306,7 +310,7 @@ fn training() {
let mut model: Net<TrainingBackend> = Net::init(&device);
println!("Training model ({} parameters)", model.num_params());
let mut optim = SgdConfig::new().init();
let mut optim = AdamConfig::new().init();
let inputs = Tensor::from_data(
TensorData::new(