From 9fad15e2ca073df3a9aad2290c8ebfc0e4ee9a4d Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Thu, 13 Feb 2025 15:00:05 -0800 Subject: [PATCH] adding mergeopt Signed-off-by: Nikolaj Bjorner --- genaisrc/genaiscript.d.ts | Bin 127269 -> 127567 bytes genaisrc/mergeopt.genai.mts | 57 ++++++++++++++++++++++++++++++++++ genaisrc/myopt.genai.mts | 4 +-- genaisrc/treesitter.genai.mts | 9 +++--- 4 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 genaisrc/mergeopt.genai.mts diff --git a/genaisrc/genaiscript.d.ts b/genaisrc/genaiscript.d.ts index 94df8d9efe6fd0e158c4766ef464361ffb2e9e1d..d864a17958fdba2cdab4c51feef7ca2924a60089 100644 GIT binary patch delta 183 zcmZ4bi2eK%_J%EtY+94O*9jy!mXxIC7L*h#l;kTUXO!k;E952?WvAqq=P6|7DU_sE zlqeLZCYNO9gZYUH<%yLFB^ik&3Mu)i#R_@(K<%#xDKymX*=szOF;VhV^|TvAk; zTvA$;syCfcgHdYo`rX>oJts2qOy<5TIQhW^QI*`pije&5)VyMQD}}t$+@#bZYlYnW Zl++v`AE+5*M(t#^JzCp^wHSqt0|4}=L_Gii delta 21 dcmX^Agnj8F_J%EtY+93dKjhtRtIa5M8~|*!2;%?% diff --git a/genaisrc/mergeopt.genai.mts b/genaisrc/mergeopt.genai.mts new file mode 100644 index 000000000..92b95b205 --- /dev/null +++ b/genaisrc/mergeopt.genai.mts @@ -0,0 +1,57 @@ +script({ + title: "Merge optimizations function changes for a C++ file" +}) + +// given a source file +// list files in code_slice directory based on that name with extension opt +// replace functions in src by the corresponding ones in the opt files. +// Save into + + +import * as fs from 'fs'; + + +function get_functions(captures : QueryCapture[], code : string) { + return captures.map(({ name, node }) => ({ + code : node.text, + start : node.startIndex, + end : node.endIndex, + name : node.text.split('(')[0].trim() + })) +} + + +const inputFile = env.files[0]; + +const { captures: functions } = await parsers.code( + inputFile, + `(function_definition) @function` +); + + +let funs = get_functions(functions, inputFile.content); + +const modifiedFunctions = "slice_" + path.basename(inputFile.filename) + "*.opt"; + +let inputCode = inputFile.content; +console.log(modifiedFunctions); +const directory_path = path.join("code_slices", modifiedFunctions); +const files = await workspace.findFiles(directory_path); +for (const file of files) { + console.log(file.filename); + const code = file.content.match(/```cpp([\s\S]*?)```/); + if (!code) { + continue; + } + const modifiedFunction = code[1]; + const name = modifiedFunction.split('(')[0].trim(); + console.log(name); + const fun = funs.find(f => f.name === name); + if (fun) { + console.log("Updated function: " + name); + inputCode = inputCode.replace(fun.code, modifiedFunction); + } +} + +console.log(inputCode); +await workspace.writeText(inputFile.filename + ".opt.cpp", inputCode); \ No newline at end of file diff --git a/genaisrc/myopt.genai.mts b/genaisrc/myopt.genai.mts index c14f13d55..53b0ee184 100644 --- a/genaisrc/myopt.genai.mts +++ b/genaisrc/myopt.genai.mts @@ -28,7 +28,5 @@ async function invokeLLMUpdate(code) { const inputFile = env.files[0]; const file = await workspace.readText(inputFile); const answer = await invokeLLMUpdate(file.content); -// Extract the code from the answer by removing ```cpp and ```: -let code = answer.replace(/```cpp/g, "").replace(/```/g, ""); const outputFile = inputFile.filename + ".opt"; -await workspace.writeText(outputFile, code); +await workspace.writeText(outputFile, answer); diff --git a/genaisrc/treesitter.genai.mts b/genaisrc/treesitter.genai.mts index 878b49a8c..31e09706a 100644 --- a/genaisrc/treesitter.genai.mts +++ b/genaisrc/treesitter.genai.mts @@ -25,11 +25,10 @@ for (const fun of funs) { let name = fun.code.split('(')[0].trim(); name = name .replace(/::/g, '_') - .replace(/ /g, '_'); - let outputFile = path.basename(inputFile.filename) - .replace(/\.cpp$/, `.${name}.cpp`) - .replace(/\.h$/, `.${name}.h`); - outputFile = "slice_" + outputFile; + .replace(/ /g, '_') + .replace(/\*/g, ''); + console.log(name); + let outputFile = "slice_" + path.basename(inputFile.filename) + name + ".cpp"; outputFile = path.join("code_slices", outputFile); await workspace.writeText(outputFile, `//Extracted ${name} in ${inputFile.filename}\n${fun.code}\n\n`);