# A decorator that compiles C/C++ functions with Clang in Python
#### Like Numba, but Jerry-built and pre-alpha :)
## pip install cooodecooo
#### Tested against Windows 10 / Python 3.10 / Anaconda
### Here are 2 examples:
#### Find RGB colors
```python
import cv2
import numpy as np
from cooodecooo import ccoo
# The name of the variable needs to be `clangpath`, if you change it, it won't work
clangpath = r"C:\Program Files\LLVM\bin\clang.exe"
# The names of the 2 functions (Python / C) need to be equal (colorsearch2 - colorsearch2)
@ccoo
def colorsearch2(**kwargs): # put here always **kwargs
# The variable that contains the C source code must be named - c_source_code -
c_source_code = r"""
__declspec(dllexport) void colorsearch2(unsigned char *pic, unsigned char *colors, int width, int totallengthpic, int totallengthcolor, int *outputx, int *outputy, int *lastresult) {
int counter = 0;
for (int i = 0; i <= totallengthcolor; i += 3) {
int r = i;
int g = i + 1;
int b = i + 2;
for (int j = 0; j <= totallengthpic; j += 3) {
if ((colors[r] == pic[j]) && (colors[g] == pic[j + 1]) && (colors[b] == pic[j + 2])) {
int dividend = j / 3;
int quotient = dividend / width;
int remainder = dividend % width;
int upcounter = counter;
outputx[upcounter] = quotient;
outputy[upcounter] = remainder;
lastresult[0] = upcounter;
counter++;
}
}
}
}
"""
# Where do you want to save the shared library? The name of the variable cannot be changed! It needs to be - c_save_path -
c_save_path = "cloop.so"
# That's it, no return value! Scroll down for more details.
def get_pixelcolor(pic, colors):
totallenghtpic = (pic.shape[0] * pic.shape[1] * pic.shape[2]) - 1
totallengthcolor = (colors.shape[0] * colors.shape[1]) - 1
outputx = np.zeros(totallenghtpic, dtype=np.int32)
outputy = np.zeros(totallenghtpic, dtype=np.int32)
lastresult = np.zeros(1, dtype=np.int32)
# Use the same signature as in the C function # unsigned char *pic, unsigned char *colors, int width, int totallengthpic, int totallengthcolor, int *outputx, int *outputy, int *lastresult
# Pointers only work when numpy arrays are passed to the function
varstopass = {
"pic": pic,
"colors": colors,
"width": pic.shape[1],
"totallengthpic": totallenghtpic,
"totallengthcolor": totallengthcolor,
"outputx": outputx,
"outputy": outputy,
"lastresult": lastresult,
}
# The compiled function doesn't return anything, it writes the results in given numpy arrays by using pointers
# In this example: outputx/outputy/lastresult
_ = colorsearch2(**varstopass)
return np.dstack([outputx[: lastresult[0] + 1], outputy[: lastresult[0] + 1]])[0]
picx = r"C:\Users\hansc\Downloads\pexels-alex-andrews-2295744.jpg"
pic = cv2.imread(picx)
colors = np.array(
[
(66, 71, 69),
(62, 67, 65),
(144, 155, 153),
(52, 57, 55),
(127, 138, 136),
(53, 58, 56),
(51, 56, 54),
(32, 27, 18),
(24, 17, 8),
],
dtype=np.uint8,
)
resu = get_pixelcolor(pic, colors)
```
### Levenshtein Distance
```python
import numpy as np
from cooodecooo import ccoo
clangpath = r"C:\Program Files\LLVM\bin\clang.exe"
@ccoo
def levenshtein_distance(**kwargs):
c_source_code = r"""
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int minim(int a, int b, int c)
{
int m = a;
if (b < m)
m = b;
if (c < m)
m = c;
return m;
}
__declspec(dllexport) void levenshtein_distance(char *s1, char *s2, int len1, int len2, int *resultsx)
{
//printf("%d %d\n", len1, len2);
int *d = (int *)malloc((len1 + 1) * (len2 + 1) * sizeof(int));
int i, j;
for (i = 0; i <= len1; i++)
d[i * (len2 + 1) + 0] = i;
for (j = 0; j <= len2; j++)
d[0 * (len2 + 1) + j] = j;
for (i = 1; i <= len1; i++)
{
for (j = 1; j <= len2; j++)
{
//printf("%c %c\n", s1[i - 1], s2[j - 1]);
//fflush(stdout);
int cost = (s1[i - 1] == s2[j - 1]) ? 0 : 1;
d[i * (len2 + 1) + j] = minim((d[(i - 1) * (len2 + 1) + j] + 1),
(d[i * (len2 + 1) + (j - 1)] + 1),
(d[(i - 1) * (len2 + 1) + (j - 1)] + cost));
}
}
resultsx[0] = d[len1 * (len2 + 1) + len2];
printf("%d\n", resultsx[0]);
free(d);
}
"""
c_save_path = "levete.so"
s01 = ("kitten").encode()
s02 = ("sitting").encode()
s1 = np.array(list(s01), dtype=np.uint8)
s2 = np.array(list(s02), dtype=np.uint8)
len1 = len(s1)
len2 = len(s2)
resultsx = np.array([0], dtype=np.int32)
_ = levenshtein_distance(s1=s1, s2=s2, len1=len1, len2=len2, resultsx=resultsx)
print(resultsx)
```
Raw data
{
"_id": null,
"home_page": "https://github.com/hansalemaos/cooodecooo",
"name": "cooodecooo",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "c++,c,compile,decorator",
"author": "Johannes Fischer",
"author_email": "aulasparticularesdealemaosp@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c9/55/09555cf62d49c9f71fe4b2a0be0fdac9d3be5bf031e4e2f4271f2d945c76/cooodecooo-0.10.tar.gz",
"platform": null,
"description": "# A decorator that compiles C/C++ functions with Clang in Python\r\n\r\n#### Like Numba, but Jerry-built and pre-alpha :) \r\n\r\n## pip install cooodecooo\r\n\r\n#### Tested against Windows 10 / Python 3.10 / Anaconda\r\n\r\n\r\n### Here are 2 examples:\r\n\r\n\r\n#### Find RGB colors \r\n\r\n\r\n```python\r\nimport cv2\r\nimport numpy as np\r\nfrom cooodecooo import ccoo\r\n\r\n# The name of the variable needs to be `clangpath`, if you change it, it won't work\r\nclangpath = r\"C:\\Program Files\\LLVM\\bin\\clang.exe\"\r\n\r\n# The names of the 2 functions (Python / C) need to be equal (colorsearch2 - colorsearch2)\r\n@ccoo\r\ndef colorsearch2(**kwargs): # put here always **kwargs\r\n # The variable that contains the C source code must be named - c_source_code -\r\n c_source_code = r\"\"\"\r\n __declspec(dllexport) void colorsearch2(unsigned char *pic, unsigned char *colors, int width, int totallengthpic, int totallengthcolor, int *outputx, int *outputy, int *lastresult) {\r\n int counter = 0;\r\n for (int i = 0; i <= totallengthcolor; i += 3) {\r\n int r = i;\r\n int g = i + 1;\r\n int b = i + 2;\r\n for (int j = 0; j <= totallengthpic; j += 3) {\r\n if ((colors[r] == pic[j]) && (colors[g] == pic[j + 1]) && (colors[b] == pic[j + 2])) {\r\n int dividend = j / 3;\r\n int quotient = dividend / width;\r\n int remainder = dividend % width;\r\n int upcounter = counter;\r\n outputx[upcounter] = quotient;\r\n outputy[upcounter] = remainder;\r\n lastresult[0] = upcounter;\r\n counter++;\r\n }\r\n }\r\n }\r\n }\r\n \"\"\"\r\n # Where do you want to save the shared library? The name of the variable cannot be changed! It needs to be - c_save_path -\r\n c_save_path = \"cloop.so\"\r\n\t# That's it, no return value! Scroll down for more details.\r\n\r\ndef get_pixelcolor(pic, colors):\r\n totallenghtpic = (pic.shape[0] * pic.shape[1] * pic.shape[2]) - 1\r\n totallengthcolor = (colors.shape[0] * colors.shape[1]) - 1\r\n outputx = np.zeros(totallenghtpic, dtype=np.int32)\r\n outputy = np.zeros(totallenghtpic, dtype=np.int32)\r\n lastresult = np.zeros(1, dtype=np.int32)\r\n\r\n # Use the same signature as in the C function # unsigned char *pic, unsigned char *colors, int width, int totallengthpic, int totallengthcolor, int *outputx, int *outputy, int *lastresult\r\n # Pointers only work when numpy arrays are passed to the function\r\n varstopass = {\r\n \"pic\": pic,\r\n \"colors\": colors,\r\n \"width\": pic.shape[1],\r\n \"totallengthpic\": totallenghtpic,\r\n \"totallengthcolor\": totallengthcolor,\r\n \"outputx\": outputx,\r\n \"outputy\": outputy,\r\n \"lastresult\": lastresult,\r\n }\r\n\r\n # The compiled function doesn't return anything, it writes the results in given numpy arrays by using pointers\r\n # In this example: outputx/outputy/lastresult\r\n _ = colorsearch2(**varstopass)\r\n return np.dstack([outputx[: lastresult[0] + 1], outputy[: lastresult[0] + 1]])[0]\r\n\r\n\r\npicx = r\"C:\\Users\\hansc\\Downloads\\pexels-alex-andrews-2295744.jpg\"\r\npic = cv2.imread(picx)\r\ncolors = np.array(\r\n [\r\n (66, 71, 69),\r\n (62, 67, 65),\r\n (144, 155, 153),\r\n (52, 57, 55),\r\n (127, 138, 136),\r\n (53, 58, 56),\r\n (51, 56, 54),\r\n (32, 27, 18),\r\n (24, 17, 8),\r\n ],\r\n dtype=np.uint8,\r\n)\r\nresu = get_pixelcolor(pic, colors)\r\n\r\n\r\n\r\n```\r\n\r\n\r\n\r\n\r\n### Levenshtein Distance\r\n\r\n\r\n```python\r\nimport numpy as np\r\nfrom cooodecooo import ccoo\r\n\r\nclangpath = r\"C:\\Program Files\\LLVM\\bin\\clang.exe\"\r\n\r\n\r\n@ccoo\r\ndef levenshtein_distance(**kwargs):\r\n c_source_code = r\"\"\"\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n\r\nint minim(int a, int b, int c)\r\n{\r\n int m = a;\r\n if (b < m)\r\n m = b;\r\n if (c < m)\r\n m = c;\r\n return m;\r\n}\r\n\r\n__declspec(dllexport) void levenshtein_distance(char *s1, char *s2, int len1, int len2, int *resultsx)\r\n{\r\n //printf(\"%d %d\\n\", len1, len2);\r\n int *d = (int *)malloc((len1 + 1) * (len2 + 1) * sizeof(int));\r\n int i, j;\r\n\r\n for (i = 0; i <= len1; i++)\r\n d[i * (len2 + 1) + 0] = i;\r\n\r\n for (j = 0; j <= len2; j++)\r\n d[0 * (len2 + 1) + j] = j;\r\n\r\n for (i = 1; i <= len1; i++)\r\n {\r\n for (j = 1; j <= len2; j++)\r\n {\r\n //printf(\"%c %c\\n\", s1[i - 1], s2[j - 1]);\r\n //fflush(stdout);\r\n int cost = (s1[i - 1] == s2[j - 1]) ? 0 : 1;\r\n d[i * (len2 + 1) + j] = minim((d[(i - 1) * (len2 + 1) + j] + 1),\r\n (d[i * (len2 + 1) + (j - 1)] + 1),\r\n (d[(i - 1) * (len2 + 1) + (j - 1)] + cost));\r\n }\r\n }\r\n\r\n resultsx[0] = d[len1 * (len2 + 1) + len2];\r\n printf(\"%d\\n\", resultsx[0]);\r\n free(d);\r\n}\r\n \"\"\"\r\n c_save_path = \"levete.so\"\r\n\r\n\r\ns01 = (\"kitten\").encode()\r\ns02 = (\"sitting\").encode()\r\ns1 = np.array(list(s01), dtype=np.uint8)\r\ns2 = np.array(list(s02), dtype=np.uint8)\r\nlen1 = len(s1)\r\nlen2 = len(s2)\r\nresultsx = np.array([0], dtype=np.int32)\r\n_ = levenshtein_distance(s1=s1, s2=s2, len1=len1, len2=len2, resultsx=resultsx)\r\nprint(resultsx)\r\n```\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A decorator that compiles C/C++ functions with Clang in Python",
"version": "0.10",
"split_keywords": [
"c++",
"c",
"compile",
"decorator"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ed13d56f63773154cec371b02975356fe2d0a2c45f5732c50c30c36a95233d53",
"md5": "cf9b8b0c2f8edefab81777e1fd4aa4cb",
"sha256": "d8d786990680242160939b50f75c146e8cc999857cae260d71974f9737b4f025"
},
"downloads": -1,
"filename": "cooodecooo-0.10-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cf9b8b0c2f8edefab81777e1fd4aa4cb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 26299,
"upload_time": "2023-04-16T00:33:13",
"upload_time_iso_8601": "2023-04-16T00:33:13.340130Z",
"url": "https://files.pythonhosted.org/packages/ed/13/d56f63773154cec371b02975356fe2d0a2c45f5732c50c30c36a95233d53/cooodecooo-0.10-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c95509555cf62d49c9f71fe4b2a0be0fdac9d3be5bf031e4e2f4271f2d945c76",
"md5": "1c62d687df26d215fb8dbde549dbe0d9",
"sha256": "402fba6adcaba1750609e5eca2611848b8ae303f58676e141b639c8582cbe76a"
},
"downloads": -1,
"filename": "cooodecooo-0.10.tar.gz",
"has_sig": false,
"md5_digest": "1c62d687df26d215fb8dbde549dbe0d9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25537,
"upload_time": "2023-04-16T00:33:15",
"upload_time_iso_8601": "2023-04-16T00:33:15.486104Z",
"url": "https://files.pythonhosted.org/packages/c9/55/09555cf62d49c9f71fe4b2a0be0fdac9d3be5bf031e4e2f4271f2d945c76/cooodecooo-0.10.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-04-16 00:33:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "hansalemaos",
"github_project": "cooodecooo",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "cooodecooo"
}