"""Build an isolated CPU backend with fixed-topology STDP connection caching.""" from pathlib import Path import shlex import shutil import subprocess root = Path('/home/int/run/cats-dogs/fast-cpu') root.mkdir(exist_ok=True) source_root = Path('/mnt/c/KNP/examples/knp/backends/cpu') shutil.copytree(source_root / 'cpu-library/include', root / 'include', dirs_exist_ok=True) base = root / 'include/knp/backends/cpu-library/impl/populations' stdp = base / 'training/stdp.h' s = stdp.read_text() start = s.rfind('template ', 0, s.index(' get_all_connected_synapses(')) assert start >= 0 end = s.index('\n}\n', start) + 3 s = s[:start] + s[end:] s = s.replace('#include ', '#include \n#include "perf_connection_cache.h"') s = s.replace(' std::vector> synapse_params =', 'const auto& synapse_params =') # The old local alias is now unused under -Werror. s = s.replace(' using SynapseParamType = knp::synapse_traits::synapse_parameters;\n', '') altai.write_text(s) original = source_root / 'cpu-single-threaded-backend/impl/backend.cpp' s = original.read_text() marker = 'void SingleThreadedCPUBackend::_init()\n{' assert marker in s s = s.replace(marker, marker + ''' knp::backends::cpu::populations::impl::training::stdp::clear_connection_cache< knp::synapse_traits::SynapticResourceSTDPDeltaSynapse>(); ''') (root / 'backend.cpp').write_text(s) build = Path('/home/int/knp-build/knp/backends/cpu/cpu-single-threaded-backend') folder = build / 'CMakeFiles/knp-cpu-single-threaded-backend.dir' flags = {} for line in (folder / 'flags.make').read_text().splitlines(): if ' = ' in line: key, value = line.split(' = ', 1) flags[key] = shlex.split(value) obj = root / 'backend.o' subprocess.run(['/usr/bin/c++', *flags['CXX_DEFINES'], '-I' + str(root / 'include'), *flags['CXX_INCLUDES'], *flags['CXX_FLAGS'], '-c', str(root / 'backend.cpp'), '-o', str(obj)], check=True) link = shlex.split((folder / 'link.txt').read_text()) rebuilt = [] for item in link: if item.startswith('-Wl,--dependency-file='): continue if item.endswith('/impl/backend.cpp.o'): item = str(obj) elif item.startswith('-Wl,-soname,'): item = '-Wl,-soname,libknp-cpu-fast-backend.so' rebuilt.append(item) rebuilt[rebuilt.index('-o') + 1] = str(root / 'libknp-cpu-fast-backend.so') subprocess.run(rebuilt, cwd=build, check=True) print(root / 'libknp-cpu-fast-backend.so', flush=True)