Skip to content

Commit

Permalink
report current status using std.Progress (#20)
Browse files Browse the repository at this point in the history
* report current status using `std.Progress`

* remove duplicate cycles_per_gen argument from markov mode

* print mode specific arguments
  • Loading branch information
Techatrix authored Sep 29, 2023
1 parent 604fbb6 commit d4dc28f
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 24 deletions.
9 changes: 9 additions & 0 deletions src/Fuzzer.zig
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ pub const Config = struct {

allocator: std.mem.Allocator,
connection: Connection,
progress_node: *std.Progress.Node,
mode: *Mode,
config: Config,
rand: std.rand.DefaultPrng,
Expand All @@ -51,6 +52,7 @@ principal_file_uri: []const u8,

pub fn create(
allocator: std.mem.Allocator,
progress: *std.Progress,
mode: *Mode,
config: Config,
) !*Fuzzer {
Expand Down Expand Up @@ -99,6 +101,7 @@ pub fn create(
fuzzer.* = .{
.allocator = allocator,
.connection = undefined, // set below
.progress_node = progress.start("fuzzer", 0),
.mode = mode,
.config = config,
.rand = std.rand.DefaultPrng.init(seed),
Expand Down Expand Up @@ -159,6 +162,8 @@ pub fn random(fuzzer: *Fuzzer) std.rand.Random {
}

pub fn initCycle(fuzzer: *Fuzzer) !void {
fuzzer.progress_node.activate();

var arena = std.heap.ArenaAllocator.init(fuzzer.allocator);
defer arena.deinit();

Expand All @@ -176,6 +181,8 @@ pub fn initCycle(fuzzer: *Fuzzer) !void {
}

pub fn closeCycle(fuzzer: *Fuzzer) !void {
fuzzer.progress_node.end();

var arena = std.heap.ArenaAllocator.init(fuzzer.allocator);
defer arena.deinit();

Expand All @@ -188,7 +195,9 @@ pub fn closeCycle(fuzzer: *Fuzzer) !void {
}

pub fn fuzz(fuzzer: *Fuzzer) !void {
fuzzer.progress_node.setCompletedItems(fuzzer.cycle);
fuzzer.cycle += 1;

if (fuzzer.cycle % fuzzer.config.cycles_per_gen == 0) {
while (true) {
fuzzer.allocator.free(fuzzer.principal_file_source);
Expand Down
23 changes: 12 additions & 11 deletions src/main.zig
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,6 @@ pub fn main() !void {
defer _ = general_purpose_allocator.deinit();
const gpa = general_purpose_allocator.allocator();

const stderr = std.io.getStdErr().writer();

var env_map: std.process.EnvMap = loadEnv(gpa) catch std.process.EnvMap.init(gpa);
defer env_map.deinit();

Expand All @@ -226,7 +224,11 @@ pub fn main() !void {
var config = try initConfig(gpa, env_map, &arg_it);
defer config.deinit(gpa);

try stderr.print(
var progress = std.Progress{
.terminal = null,
};

progress.log(
\\zig_version: {s}
\\zls_version: {s}
\\zls_path: {s}
Expand All @@ -235,24 +237,23 @@ pub fn main() !void {
\\
, .{ config.zig_version, config.zls_version, config.zls_path, @tagName(config.mode_name), config.cycles_per_gen });

var mode = try Mode.init(config.mode_name, gpa, &arg_it, env_map);
var mode = try Mode.init(config.mode_name, gpa, &progress, &arg_it, env_map);
defer mode.deinit(gpa);

while (true) {
var fuzzer = try Fuzzer.create(gpa, &mode, config);
var fuzzer = try Fuzzer.create(gpa, &progress, &mode, config);
errdefer {
fuzzer.wait();
fuzzer.destroy();
}
fuzzer.progress_node.setEstimatedTotalItems(100_000);
try fuzzer.initCycle();

while (true) {
if (fuzzer.cycle % 1000 == 0) {
std.log.info("heartbeat {d}", .{fuzzer.cycle});
}
progress.maybeRefresh();

if (fuzzer.cycle >= 100_000) {
std.log.info("Fuzzer running too long with no result... restarting", .{});
progress.log("Fuzzer running too long with no result... restarting\n", .{});

try fuzzer.closeCycle();
fuzzer.wait();
Expand All @@ -261,11 +262,11 @@ pub fn main() !void {
}

fuzzer.fuzz() catch {
std.log.info("Restarting fuzzer...", .{});
progress.log("Restarting fuzzer...\n", .{});

fuzzer.wait();
fuzzer.logPrincipal() catch {
std.log.err("failed to log principal", .{});
progress.log("failed to log principal\n", .{});
};
fuzzer.destroy();
break;
Expand Down
3 changes: 2 additions & 1 deletion src/mode.zig
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ pub const Mode = union(enum) {
pub fn init(
mode_name: ModeName,
allocator: std.mem.Allocator,
progress: *std.Progress,
arg_it: *std.process.ArgIterator,
envmap: std.process.EnvMap,
) !Mode {
switch (mode_name) {
inline else => |m| {
const Inner = std.meta.Child(std.meta.TagPayload(Mode, m));
return @unionInit(Mode, @tagName(m), try Inner.init(allocator, arg_it, envmap));
return @unionInit(Mode, @tagName(m), try Inner.init(allocator, progress, arg_it, envmap));
},
}
}
Expand Down
31 changes: 28 additions & 3 deletions src/modes/BestBehavior.zig
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ fn fatal(comptime format: []const u8, args: anytype) noreturn {

pub fn init(
allocator: std.mem.Allocator,
progress: *std.Progress,
arg_it: *std.process.ArgIterator,
envmap: std.process.EnvMap,
) !*BestBehavior {
Expand Down Expand Up @@ -50,10 +51,32 @@ pub fn init(
fatal("missing mode argument '--source_dir'", .{});
}

var itd = try std.fs.cwd().openIterableDir(source_dir.?, .{});
defer itd.close();
progress.log(
\\
\\source_dir: {s}
\\
\\
, .{source_dir.?});

var progress_node = progress.start("best behavior: loading files", 0);
defer progress_node.end();

var iterable_dir = try std.fs.cwd().openIterableDir(source_dir.?, .{});
defer iterable_dir.close();

{
var walker = try iterable_dir.walk(allocator);
defer walker.deinit();
var file_count: usize = 0;
while (try walker.next()) |entry| {
if (entry.kind != .file) continue;
if (!std.mem.eql(u8, std.fs.path.extension(entry.basename), ".zig")) continue;
file_count += 1;
}
progress_node.setEstimatedTotalItems(file_count);
}

var walker = try itd.walk(allocator);
var walker = try iterable_dir.walk(allocator);
defer walker.deinit();

const cwd = try std.process.getCwdAlloc(allocator);
Expand All @@ -62,11 +85,13 @@ pub fn init(
var file_buf = std.ArrayListUnmanaged(u8){};
defer file_buf.deinit(allocator);

progress_node.activate();
while (try walker.next()) |entry| {
if (entry.kind != .file) continue;
if (!std.mem.eql(u8, std.fs.path.extension(entry.basename), ".zig")) continue;

// std.log.info("found file {s}", .{entry.path});
progress_node.completeOne();

var file = try entry.dir.openFile(entry.basename, .{});
defer file.close();
Expand Down
37 changes: 28 additions & 9 deletions src/modes/MarkovMode.zig
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,19 @@ const MarkovModel = markov.Model(build_options.block_len, false);
model: MarkovModel,
random: std.rand.DefaultPrng,
maxlen: u32 = Defaults.maxlen,
cycles_per_gen: u32 = Defaults.cycles_per_gen,

const Defaults = struct {
pub const maxlen = 512;
pub const cycles_per_gen = 25;
};

const usage =
std.fmt.comptimePrint(
\\Usage Markov Mode:
\\ --training_dir - directory to be used for training. searched for .zig files recursively.
\\ --maxlen - maximum length of each file generated by the markov model. (default: {d})
\\ --cycles-per-gen - how many times to fuzz a random feature before regenerating a new file. (default: {d})
,
, .{
Defaults.maxlen,
Defaults.cycles_per_gen,
);
});

fn fatal(comptime format: []const u8, args: anytype) noreturn {
std.log.err(format, args);
Expand All @@ -34,6 +30,7 @@ fn fatal(comptime format: []const u8, args: anytype) noreturn {

pub fn init(
allocator: std.mem.Allocator,
progress: *std.Progress,
arg_it: *std.process.ArgIterator,
envmap: std.process.EnvMap,
) !*Markov {
Expand All @@ -59,9 +56,6 @@ pub fn init(
} else if (std.mem.eql(u8, arg, "--maxlen")) {
const next_arg = arg_it.next() orelse fatal("expected integer after --maxlen", .{});
mm.maxlen = std.fmt.parseUnsigned(u32, next_arg, 10) catch fatal("expected integer after --maxlen", .{});
} else if (std.mem.eql(u8, arg, "--cycles-per-gen")) {
const next_arg = arg_it.next() orelse fatal("expected integer after --cycles-per-gen", .{});
mm.cycles_per_gen = std.fmt.parseUnsigned(u32, next_arg, 10) catch fatal("invalid integer '{s}'", .{next_arg});
} else {
fatal("invalid markov arg '{s}'", .{arg});
}
Expand All @@ -72,20 +66,45 @@ pub fn init(
fatal("missing mode argument '--training-dir'", .{});
}

progress.log(
\\
\\training_dir: {s}
\\maxlen: {d}
\\
\\
, .{ training_dir.?, mm.maxlen });

var progress_node = progress.start("markov: feeding model", 0);
defer progress_node.end();

var iterable_dir = try std.fs.cwd().openIterableDir(training_dir.?, .{});
defer iterable_dir.close();

{
var walker = try iterable_dir.walk(allocator);
defer walker.deinit();
var file_count: usize = 0;
while (try walker.next()) |entry| {
if (entry.kind != .file) continue;
if (!std.mem.eql(u8, std.fs.path.extension(entry.basename), ".zig")) continue;
file_count += 1;
}
progress_node.setEstimatedTotalItems(file_count);
}

var walker = try iterable_dir.walk(allocator);
defer walker.deinit();

var file_buf = std.ArrayListUnmanaged(u8){};
defer file_buf.deinit(allocator);

progress_node.activate();
while (try walker.next()) |entry| {
if (entry.kind != .file) continue;
if (!std.mem.eql(u8, std.fs.path.extension(entry.basename), ".zig")) continue;

// std.log.info("found file: {s}", .{entry.path});
progress_node.completeOne();

var file = try entry.dir.openFile(entry.basename, .{});
defer file.close();
Expand Down

0 comments on commit d4dc28f

Please sign in to comment.