From d0725974318bcfce5bd6d88ac26f853c817ac2e9 Mon Sep 17 00:00:00 2001 From: Fabien Masson Date: Fri, 15 Aug 2025 16:20:07 +0200 Subject: [PATCH] add initialisation method from embedde file --- src/lib.zig | 51 ++++++++++++++++++++++++++++++++++++------------- src/markov.bin | Bin 0 -> 4301 bytes 2 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 src/markov.bin diff --git a/src/lib.zig b/src/lib.zig index 9f414ef..0c4e650 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -1,6 +1,8 @@ const std = @import("std"); const rand = std.crypto.random; +const markov_data = @embedFile("markov.bin"); + pub const DataPoint = struct { char: u8, prob: f32, @@ -15,23 +17,31 @@ pub const MarkovChain = struct { allocator: std.mem.Allocator, map: std.AutoHashMap(u8, []DataPoint), - pub fn init(path: []const u8, allocator: std.mem.Allocator) !MarkovChain { + pub fn fromFile(path: []const u8, allocator: std.mem.Allocator) !MarkovChain { + var markovBinFile = try std.fs.cwd().openFile(path, .{ .mode = .read_only }); + const reader = markovBinFile.reader(); + + return try fromReader(&reader, allocator); + } + + pub fn fromMemory(data: []const u8, allocator: std.mem.Allocator) !MarkovChain { + var stream = std.io.fixedBufferStream(data); + const reader = stream.reader(); + + return try fromReader(reader, allocator); + } + + fn fromReader(reader: anytype, allocator: std.mem.Allocator) !MarkovChain { var self = MarkovChain{ .allocator = allocator, .map = std.AutoHashMap(u8, []DataPoint).init(allocator), }; - var markovBinFile = try std.fs.cwd().openFile(path, .{ .mode = .read_only }); - - var reader = markovBinFile.reader(); - for (0..256) |prevChar| { const cnt = try reader.readInt(u8, .little); - //std.debug.print("previous : {c} - cnt : {d}\n", .{ @as(u8, @intCast(prevChar)), cnt }); var nextChars: []DataPoint = try self.allocator.alloc(DataPoint, cnt); for (0..cnt) |i| { const nextByte = try reader.readByte(); - //std.debug.print("next : {c}\n", .{nextByte}); const prob: f32 = @bitCast(try reader.readInt(u32, .little)); nextChars[i] = DataPoint{ .char = nextByte, @@ -41,8 +51,6 @@ pub const MarkovChain = struct { try self.map.put(@as(u8, @intCast(prevChar)), nextChars); } - //std.debug.print("choices for A : {any}\n", .{self.map.get(97).?}); - return self; } @@ -74,19 +82,36 @@ pub const MarkovChain = struct { } }; -test "basic test" { +test "basic test from file" { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); defer { _ = gpa.deinit(); } - var markov = try MarkovChain.init("markov.bin", allocator); + var markov = try MarkovChain.fromFile("markov.bin", allocator); defer markov.deinit(); - for (0..24) |_| { + for (0..6) |_| { const randName = try markov.generate(8, allocator); defer allocator.free(randName); - std.debug.print("generated : {s}\n", .{randName}); + std.debug.print("generated from file: {s}\n", .{randName}); + } +} + +test "basic test from embedded file" { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + defer { + _ = gpa.deinit(); + } + + var markov = try MarkovChain.fromMemory(markov_data, allocator); + defer markov.deinit(); + + for (0..6) |_| { + const randName = try markov.generate(8, allocator); + defer allocator.free(randName); + std.debug.print("generated from memory: {s}\n", .{randName}); } } diff --git a/src/markov.bin b/src/markov.bin new file mode 100644 index 0000000000000000000000000000000000000000..e33f0deaaa58bd4d537503e7df4d88f698d90307 GIT binary patch literal 4301 zcma*qd2m$4)&TGc5RiQfd!mDYAwpO}faLZ$Jt#^H1cCv=LkKYY+?hK|?rfO>A3@o7 z0?HQFum!MWPmBl;CkPY>Vvtop6bTO#gs@1l$m@getNQ-<>MQ4uUrl$P+uf({%)Q;Q z`kOVS=-lWpLhp^@rD*)&h98vz>qN9$=VYV0u+9iH-ySsxt>e<(MaQ27@1VgKC84im zc?z0pGW($Iz8s65@08YPdGK*Gy6hECKu+m(4g!&fyTQHl`_&LOHl7H`P9DkC-=4JRN}GewM&Hdwk2i~_f~jM*=qImPl??Xa=j-Jg6VMdps#A;lZxR!J?)g>4GC{&bxl zTrHZ_ip#&RsX+IoPJ7XoZ)=VI%@>|R=-j1hP|VjOU?~4}3q&4Nt^iY~+YP}UedQW+ zi3aA4zA}ONL{V~xZ&HwmvBf62xjuXG0B&x)rVe*E&{w0JyWt8d!!#eDV{5~7REKFU zfq(JZZ^Uom=wa~HZj%C$LHj#{u`;>?ge#+0vD|K(W->2fzdY-foqP_W> zF&3`B{bnYYPfu#e-8bqrwOE4t9p?}|&2VgV4auG~Z3U)!TFm?_^l3I@f=gw(; z!Mfzhk4$MMf5lu2&aY-(!nfqfIF{H-B|KbLYvU21bR?e$EqkNSErm)mH&bMumfcHBMm_)@g2 zyuSdI8KpVsADbhlP-T=MlD%I7-{Dspfh~J~8S@e@QOAOWRTQN#(bhbq>Rql^CwAtt zIV3t9QgsAvKW$r${yiI(qk22-6LhUOTMLz{?{7n}W!iCwjDKSvgl4Q<0@jvk>0p|% zvLyuWUjC99ilfD>2`6DGj_$~OL}LHl*^-0s5@DjPzO3_3ZmwE4lFK)awC3(O&pPxU zcOj}JKlH|sZO=Y%JsiIQB7JTZfRda0G5E$mw1QK#f_?nMN@mb1L8fiHIF*?QE8!(P zON-jGAmPv|e@KD0i@%Vv+=N5YJ+$u-qZ0`t~J3T5xwd+5}pu4GM zF!~7N^hO*_GY5A(BWSD5Ug|ioCg2M_S3;IYNiDOYKH;fx%_lb$h4$)AsycIdtZOioOh%_8R~O=h_<^T#qHj0jcZ=S`$YjGC=o*wY8oZ`oZ?h0#t6m<<9E6Vu6UOT0 zg_4O-2$g81?>uD~Y@N%q8lW*6`b9$w?Rtzm1iwgoo&$U)W+emkp)K+EshfqSW^tX-pPLbjkp?Amz`5koGzbi=$p>HA7vsUwz1I*h{Fs&o z9uWfG_XgH5N3nXF8JopzWWl8E^O&tzwKJ8_ieP5Fvw*Qg`h%|3JOsZ$Xw3a$@b<311pGw!@#_pCgd^$4 zZeT087zNtHO`kDUbj9p$c8XaZPM*zz1sA6>CGGwGEbwr0edZjmJdg}&@0Uo4;}xG2 zFN&!iB3BesV_he+$8yzor$1NX%kQ9f%!qSn>TzlqI=Ax_^tlsXL(jM;yTEw+(GHLa z!@=B5;LmWagTV2tvq69S^C{r&uu2b>@2=uqrbKg1IQKCpd@@5j>dN1;Wj8 z>Va0>!)u=Za(6yL3jF{ljuv?*auDH_rHoEouv`FVwy#ve^^pAs23hpf->po zS+Mr*SOU(o_lm@eFuwqdP3BJn@7vvd5IAh>0fsxzTY;nR8&8>SY|2e$UzHu9=kx&< z6miTmEXm0%qE*t`_%$i_lxvHWXX6u6JNQPeT)q1GZ>VD+3^rANp20^ETx>;&upH< zT!eGY*Bx1qFrL}mfLV#Wx~(fEi*mJ8a)=N~t6WWy0)$7@rN((r=Nh>Bd-7v+z53)R zD(BW7K~qA(rzp>VcOdGQj(Q!1%hy?e2oXV-shIikvYzGb=?5%A*hL)EiqWK8B3=}w7

tdanQd zj{ zWdXt_S|tbJA$&x0d0W?+Tt6&5U%ajlXYtUI!{4L3d|5iWhNWvzEnjvVl-YMTf?qsG z!6cro%u5)n3JaKpun|5YOjxT5Td;;NH^FlKnx))KJ7M?WMO)C{#4!Owv>o;}aa;qZ zXa!^anivQYVWPdhRY5j)-S3*tl~x7k(3{d@6{X*Vq8~y7CW^%dD$|2m`tvHdpyX;?r-hN9*qd%!I4MQ;NcL=8}x(2@PTR#U= z%AyHiBMiOP>A*oKgp&w#-T4|s2IRkB#$M|VF_q8`$e+Rz39D$3g2dn2!Pk{nu2@0m zg$yoE2^n0Wqk@a@5lvk<;tQ_QM#Y;GJb;Qmy9i}V-#O^JR4*NkXVRa7l?W4tOZAR} ziE!LF@+kxevxoyHp@|aj<9uB`HFbfJ`v_y|f?v=?*a(Gi5z&tA+qQ9K`?fc^N_dF? zQ70nqyiO7Ko2!JEPD8caD_6ABy*&BUQ}*rM%U%2SCUY+lxOew1I`7@}podV2=6Zd0 zCoWRy#8oj_G*doq!g(fr61oVHO8Q?pny%gKi8A3O0xwgh96gj?m@tYWt0h(~Lr2Fd z9;HyCb&Oro3%HAL6H1r#7QB&5qd7(!lL1_>(X2xexemRARn(zT+%z;1KEfgT0Vfe5 zG_`0UbS7GyX!;B2Uao=uzbC>n4A8eI(Q&@6t{5nvtAs4N;$k2T7hP$%7)`?)sm+rM zxy#h;BOWe(T7z=0g`c5Cd3QM42rpr{e_;-o2?wDN0iw3(Tce|S{WU-o4Wnxyd_@{+U-fk9&@PcL?_< zY<~~8{+V|c%0^r{00)Sj#cyqbjR_Z~!e(OK)))nL6GbDg0Bj+)7r)g7b`S@NO)oYz khHYD8s@Ohaujqx95}&`=G@pGz>=MPl_phY6{vV(J0Ei>CX8-^I literal 0 HcmV?d00001