Skip to content

Commit

Permalink
add pybind support
Browse files Browse the repository at this point in the history
  • Loading branch information
clysto committed Jun 21, 2023
1 parent 09adf57 commit be73dd8
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 7 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*.o
.DS_Store
.vscode
*.so
viterbi_main
viterbi_test
22 changes: 15 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@

CXX = g++

BINS = viterbi_main viterbi_test
SRCS = viterbi.cpp viterbi_main.cpp viterbi_test.cpp
BINS = viterbi_main viterbi_test $(PYLIB)
SRCS = viterbi.cpp viterbi_main.cpp viterbi_test.cpp
PYLIB = viterbicodec$(shell python3-config --extension-suffix)
CPPFLAGS = $(shell pybind11-config --includes) -std=c++11

all: $(BINS)

Expand All @@ -16,20 +18,26 @@ clean:
test: viterbi_test
./viterbi_test

$(PYLIB): viterbi.cpp viterbi_python.cpp
$(CXX) $(CPPFLAGS) -undefined dynamic_lookup -shared -fPIC $^ -o $@

viterbi.o: viterbi.cpp viterbi.h
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
$(CXX) $(CPPFLAGS) -c $<

viterbi_main.o: viterbi_main.cpp viterbi.h
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
$(CXX) $(CPPFLAGS) -c $<

viterbi_main: viterbi_main.o viterbi.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
$(CXX) $(CPPFLAGS) $^ -o $@

viterbi_test.o: viterbi_test.cpp viterbi.h
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
$(CXX) $(CPPFLAGS) -c $<

viterbi_test: viterbi_test.o viterbi.o
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
$(CXX) $(CPPFLAGS) $^ -o $@

%.o: %.cpp
$(CXX) $(CPPFLAGS) -c $<

.PHONY: all clean test

40 changes: 40 additions & 0 deletions viterbi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from viterbicodec import ViterbiCodec, reverse_bits

all = ["Viterbi"]


def list2str(bits):
return "".join(map(lambda x: "1" if x > 0 else "0", bits))


def str2list(bits):
return list(map(lambda x: 1 if x == "1" else 0, bits))


class Viterbi(ViterbiCodec):
def __init__(self, constraint, polynomials):
for i in range(len(polynomials)):
polynomials[i] = reverse_bits(constraint, polynomials[i])
self.constraint = constraint
self.polynomials = polynomials
ViterbiCodec.__init__(self, constraint, polynomials)

def encode(self, bits):
bits = list2str(bits)
output = ViterbiCodec.encode(self, bits)[: -2 * (self.constraint - 1)]
return str2list(output)

def decode(self, bits):
bits = list2str(bits)
bits += "0" * (2 * (self.constraint - 1))
output = ViterbiCodec.decode(self, bits)
return str2list(output)


if __name__ == "__main__":
bits = [1] * 100
codec = Viterbi(7, [0o133, 0o171])
a = codec.encode(bits)
print(a)
b = codec.decode(a)
print(b)
13 changes: 13 additions & 0 deletions viterbi_python.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

#include "viterbi.h"

PYBIND11_MODULE(viterbicodec, m) {
pybind11::class_<ViterbiCodec>(m, "ViterbiCodec")
.def(pybind11::init<int, const std::vector<int>&>())
.def("encode", &ViterbiCodec::Encode)
.def("decode", &ViterbiCodec::Decode);

m.def("reverse_bits", &ReverseBits);
}

0 comments on commit be73dd8

Please sign in to comment.