mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-10-31 03:23:45 +08:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 240044c907 | |||
| 1b256f6204 | |||
| 4597350df7 | |||
| b8a5448148 | |||
| d6ec84c068 | |||
| 6b0b74def1 | |||
| 7cad216a01 | |||
| f45a8f8334 | |||
| a17853e52b | |||
| c80021ac48 | |||
| 2ce950ac25 | |||
| e682957101 | |||
| c13f159a77 | |||
| 8970a7aa5b | |||
| f84d27c4ee |
@@ -1,15 +0,0 @@
|
||||
---
|
||||
name: Bug fix
|
||||
about: For openpilot bug fixes
|
||||
title: ''
|
||||
labels: 'bugfix'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**Description**
|
||||
|
||||
<!-- A description of the bug and the fix. Also link the issue if it exists. -->
|
||||
|
||||
**Verification**
|
||||
|
||||
<!-- Explain how you tested this bug fix. -->
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
name: Car Bug fix
|
||||
about: For vehicle/brand specific bug fixes
|
||||
title: ''
|
||||
labels: 'car bug fix'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**Description**
|
||||
|
||||
<!-- A description of the bug and the fix. Also link the issue if it exists. -->
|
||||
|
||||
**Verification**
|
||||
|
||||
<!-- Explain how you tested this bug fix. -->
|
||||
|
||||
**Route**
|
||||
|
||||
Route: [a route with the bug fix]
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
name: Car port
|
||||
about: For new car ports
|
||||
title: ''
|
||||
labels: 'car port'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**Checklist**
|
||||
|
||||
- [ ] added entry to CAR in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs
|
||||
- [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py)
|
||||
- [ ] route with openpilot:
|
||||
- [ ] route with stock system:
|
||||
- [ ] car harness used (if comma doesn't sell it, put N/A):
|
||||
@@ -1,13 +0,0 @@
|
||||
---
|
||||
name: Fingerprint
|
||||
about: For adding fingerprints to existing cars
|
||||
title: ''
|
||||
labels: 'fingerprint'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**Car**
|
||||
Which car (make, model, year) this fingerprint is for
|
||||
|
||||
**Route**
|
||||
A route with the fingerprint
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
name: Refactor
|
||||
about: For code refactors
|
||||
title: ''
|
||||
labels: 'refactor'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**Description**
|
||||
|
||||
<!-- A description of the refactor, including the goals it accomplishes. -->
|
||||
|
||||
**Verification**
|
||||
|
||||
<!-- Explain how you tested the refactor for regressions. -->
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
name: Tuning
|
||||
about: For openpilot tuning changes
|
||||
title: ''
|
||||
labels: 'tuning'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**Description**
|
||||
|
||||
<!-- A description of what is wrong with the current tuning and how the PR addresses this. -->
|
||||
|
||||
**Verification**
|
||||
|
||||
<!-- To verify tuning, capture the following scenarios (broadly, not exactly), with current tune and this tune.
|
||||
Use the PlotJuggler tuning layout to compare planned versus actual behavior.
|
||||
|
||||
Run ./juggle.py <route> --layout layouts/tuning.xml , screenshot the full tab of interest, and paste into this PR.
|
||||
|
||||
Longitudinal:
|
||||
* Maintaining speed at 25, 40, 65mph
|
||||
* Driving up and down hills
|
||||
* Accelerating from a stop
|
||||
* Decelerating to a stop
|
||||
* Following large changes in set speed
|
||||
* Coming to a stop behind a lead car
|
||||
|
||||
Lateral:
|
||||
* Straight driving at ~25, ~45 and ~65mph
|
||||
* Turns driving at ~25, ~45 and ~65mph
|
||||
-->
|
||||
@@ -1,30 +0,0 @@
|
||||
import pathlib
|
||||
|
||||
GITHUB_FOLDER = pathlib.Path(__file__).parent
|
||||
|
||||
PULL_REQUEST_TEMPLATES = (GITHUB_FOLDER / "PULL_REQUEST_TEMPLATE")
|
||||
|
||||
order = ["fingerprint", "car_bugfix", "bugfix", "car_port", "refactor"]
|
||||
|
||||
def create_pull_request_template():
|
||||
with open(GITHUB_FOLDER / "pull_request_template.md", "w") as f:
|
||||
f.write("<!-- Please copy and paste the relevant template -->\n\n")
|
||||
|
||||
for t in order:
|
||||
template = PULL_REQUEST_TEMPLATES / f"{t}.md"
|
||||
text = template.read_text()
|
||||
|
||||
# Remove metadata for GitHub
|
||||
start = text.find("---")
|
||||
end = text.find("---", start+1)
|
||||
text = text[end + 4:]
|
||||
|
||||
# Remove comments
|
||||
text = text.replace("<!-- ", "").replace("-->", "")
|
||||
|
||||
f.write(f"<!--- ***** Template: {template.stem.replace('_', ' ').title()} *****\n")
|
||||
f.write(text)
|
||||
f.write("\n\n")
|
||||
f.write("-->\n\n")
|
||||
|
||||
create_pull_request_template()
|
||||
@@ -49,10 +49,6 @@ AddOption('--ccflags',
|
||||
default='',
|
||||
help='pass arbitrary flags over the command line')
|
||||
|
||||
AddOption('--snpe',
|
||||
action='store_true',
|
||||
help='use SNPE on PC')
|
||||
|
||||
AddOption('--external-sconscript',
|
||||
action='store',
|
||||
metavar='FILE',
|
||||
|
||||
@@ -73,6 +73,7 @@ struct ModelManagerSP @0xaedffd8f31e7b55d {
|
||||
status @4 :DownloadStatus;
|
||||
generation @5 :UInt32;
|
||||
environment @6 :Text;
|
||||
is20hz @7 :Bool;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
using Cxx = import "./include/c++.capnp";
|
||||
$Cxx.namespace("cereal");
|
||||
|
||||
@0xa086df597ef5d7a0;
|
||||
|
||||
# Geometry
|
||||
struct Point {
|
||||
x @0: Float64;
|
||||
y @1: Float64;
|
||||
z @2: Float64;
|
||||
}
|
||||
|
||||
struct PolyLine {
|
||||
points @0: List(Point);
|
||||
}
|
||||
|
||||
# Map features
|
||||
struct Lane {
|
||||
id @0 :Text;
|
||||
|
||||
leftBoundary @1 :LaneBoundary;
|
||||
rightBoundary @2 :LaneBoundary;
|
||||
|
||||
leftAdjacentId @3 :Text;
|
||||
rightAdjacentId @4 :Text;
|
||||
|
||||
inboundIds @5 :List(Text);
|
||||
outboundIds @6 :List(Text);
|
||||
|
||||
struct LaneBoundary {
|
||||
polyLine @0 :PolyLine;
|
||||
startHeading @1 :Float32; # WRT north
|
||||
}
|
||||
}
|
||||
|
||||
# Map tiles
|
||||
struct TileSummary {
|
||||
version @0 :Text;
|
||||
updatedAt @1 :UInt64; # Millis since epoch
|
||||
|
||||
level @2 :UInt8;
|
||||
x @3 :UInt16;
|
||||
y @4 :UInt16;
|
||||
}
|
||||
|
||||
struct MapTile {
|
||||
summary @0 :TileSummary;
|
||||
lanes @1 :List(Lane);
|
||||
}
|
||||
+1
-2
@@ -133,7 +133,6 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"GsmRoaming", PERSISTENT | BACKUP},
|
||||
{"HardwareSerial", PERSISTENT},
|
||||
{"HasAcceptedTerms", PERSISTENT},
|
||||
{"IMEI", PERSISTENT},
|
||||
{"InstallDate", PERSISTENT},
|
||||
{"IsDriverViewEnabled", CLEAR_ON_MANAGER_START},
|
||||
{"IsEngaged", PERSISTENT},
|
||||
@@ -212,7 +211,7 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
|
||||
// Model Manager params
|
||||
{"ModelManager_ActiveBundle", PERSISTENT},
|
||||
{"ModelManager_DownloadIndex", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"ModelManager_DownloadIndex", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
|
||||
{"ModelManager_LastSyncTime", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"ModelManager_ModelsCache", PERSISTENT | BACKUP},
|
||||
|
||||
|
||||
@@ -255,6 +255,29 @@ bool ends_with(const std::string& s, const std::string& suffix) {
|
||||
strcmp(s.c_str() + (s.size() - suffix.size()), suffix.c_str()) == 0;
|
||||
}
|
||||
|
||||
std::string strip(const std::string &str) {
|
||||
auto should_trim = [](unsigned char ch) {
|
||||
// trim whitespace or a null character
|
||||
return std::isspace(ch) || ch == '\0';
|
||||
};
|
||||
|
||||
size_t start = 0;
|
||||
while (start < str.size() && should_trim(static_cast<unsigned char>(str[start]))) {
|
||||
start++;
|
||||
}
|
||||
|
||||
if (start == str.size()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
size_t end = str.size() - 1;
|
||||
while (end > 0 && should_trim(static_cast<unsigned char>(str[end]))) {
|
||||
end--;
|
||||
}
|
||||
|
||||
return str.substr(start, end - start + 1);
|
||||
}
|
||||
|
||||
std::string check_output(const std::string& command) {
|
||||
char buffer[128];
|
||||
std::string result;
|
||||
|
||||
@@ -74,6 +74,7 @@ float getenv(const char* key, float default_val);
|
||||
std::string hexdump(const uint8_t* in, const size_t size);
|
||||
bool starts_with(const std::string &s1, const std::string &s2);
|
||||
bool ends_with(const std::string &s, const std::string &suffix);
|
||||
std::string strip(const std::string &str);
|
||||
|
||||
// ***** random helpers *****
|
||||
int random_int(int min, int max);
|
||||
|
||||
+5
-4
@@ -4,7 +4,7 @@
|
||||
|
||||
A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified.
|
||||
|
||||
# 289 Supported Cars
|
||||
# 290 Supported Cars
|
||||
|
||||
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|<a href="##"><img width=2000></a>Hardware Needed<br> |Video|
|
||||
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
@@ -56,6 +56,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Genesis|GV60 (Performance Trim) 2022-23[<sup>5</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=GV60 (Performance Trim) 2022-23">Buy Here</a></sub></details>||
|
||||
|Genesis|GV70 (2.5T Trim, without HDA II) 2022-23[<sup>5</sup>](#footnotes)|All|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=GV70 (2.5T Trim, without HDA II) 2022-23">Buy Here</a></sub></details>||
|
||||
|Genesis|GV70 (3.5T Trim, without HDA II) 2022-23[<sup>5</sup>](#footnotes)|All|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai M connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=GV70 (3.5T Trim, without HDA II) 2022-23">Buy Here</a></sub></details>||
|
||||
|Genesis|GV70 Electrified (Australia Only) 2022[<sup>5</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=GV70 Electrified (Australia Only) 2022">Buy Here</a></sub></details>||
|
||||
|Genesis|GV70 Electrified (with HDA II) 2023[<sup>5</sup>](#footnotes)|Highway Driving Assist II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=GV70 Electrified (with HDA II) 2023">Buy Here</a></sub></details>||
|
||||
|Genesis|GV80 2023[<sup>5</sup>](#footnotes)|All|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai M connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Genesis&model=GV80 2023">Buy Here</a></sub></details>||
|
||||
|GMC|Sierra 1500 2020-21|Driver Alert Package II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|6 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 GM connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=GMC&model=Sierra 1500 2020-21">Buy Here</a></sub></details>|<a href="https://youtu.be/5HbNoBLzRwE" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|
||||
@@ -79,7 +80,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Honda|Odyssey 2018-20|Honda Sensing|openpilot|26 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Odyssey 2018-20">Buy Here</a></sub></details>||
|
||||
|Honda|Passport 2019-23|All|openpilot|26 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Passport 2019-23">Buy Here</a></sub></details>||
|
||||
|Honda|Pilot 2016-22|Honda Sensing|openpilot|26 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Pilot 2016-22">Buy Here</a></sub></details>||
|
||||
|Honda|Ridgeline 2017-24|Honda Sensing|openpilot|26 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Ridgeline 2017-24">Buy Here</a></sub></details>||
|
||||
|Honda|Ridgeline 2017-25|Honda Sensing|openpilot|26 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Ridgeline 2017-25">Buy Here</a></sub></details>||
|
||||
|Hyundai|Azera 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Azera 2022">Buy Here</a></sub></details>||
|
||||
|Hyundai|Azera Hybrid 2019|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai C connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Azera Hybrid 2019">Buy Here</a></sub></details>||
|
||||
|Hyundai|Azera Hybrid 2020|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Azera Hybrid 2020">Buy Here</a></sub></details>||
|
||||
@@ -91,7 +92,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Hyundai|Elantra Hybrid 2021-23|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Elantra Hybrid 2021-23">Buy Here</a></sub></details>|<a href="https://youtu.be/_EdYQtV52-c" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|
||||
|Hyundai|Genesis 2015-16|Smart Cruise Control (SCC)|Stock|19 mph|37 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai J connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Genesis 2015-16">Buy Here</a></sub></details>||
|
||||
|Hyundai|i30 2017-19|Smart Cruise Control (SCC)|Stock|0 mph|32 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=i30 2017-19">Buy Here</a></sub></details>||
|
||||
|Hyundai|Ioniq 5 (Non-US only) 2022-24[<sup>5</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Ioniq 5 (Non-US only) 2022-24">Buy Here</a></sub></details>||
|
||||
|Hyundai|Ioniq 5 (Southeast Asia and Europe only) 2022-24[<sup>5</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Ioniq 5 (Southeast Asia and Europe only) 2022-24">Buy Here</a></sub></details>||
|
||||
|Hyundai|Ioniq 5 (with HDA II) 2022-24[<sup>5</sup>](#footnotes)|Highway Driving Assist II|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai Q connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Ioniq 5 (with HDA II) 2022-24">Buy Here</a></sub></details>||
|
||||
|Hyundai|Ioniq 5 (without HDA II) 2022-24[<sup>5</sup>](#footnotes)|Highway Driving Assist|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Ioniq 5 (without HDA II) 2022-24">Buy Here</a></sub></details>||
|
||||
|Hyundai|Ioniq 6 (with HDA II) 2023-24[<sup>5</sup>](#footnotes)|Highway Driving Assist II|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai P connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Ioniq 6 (with HDA II) 2023-24">Buy Here</a></sub></details>||
|
||||
@@ -294,7 +295,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Volkswagen|Teramont 2018-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Teramont 2018-22">Buy Here</a></sub></details>||
|
||||
|Volkswagen|Teramont Cross Sport 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Teramont Cross Sport 2021-22">Buy Here</a></sub></details>||
|
||||
|Volkswagen|Teramont X 2021-22|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Teramont X 2021-22">Buy Here</a></sub></details>||
|
||||
|Volkswagen|Tiguan 2018-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Tiguan 2018-24">Buy Here</a></sub></details>||
|
||||
|Volkswagen|Tiguan 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Tiguan 2018-23">Buy Here</a></sub></details>||
|
||||
|Volkswagen|Tiguan eHybrid 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Tiguan eHybrid 2021-23">Buy Here</a></sub></details>||
|
||||
|Volkswagen|Touran 2016-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,12</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 USB-C coupler<br>- 1 VW J533 connector<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Touran 2016-23">Buy Here</a></sub></details>||
|
||||
|
||||
|
||||
+1
-1
Submodule opendbc_repo updated: 6525e8b600...6ddebc9a03
+1
-1
Submodule panda updated: 0d4b79a3c7...781af8b4f1
+1
-5
@@ -103,7 +103,6 @@ dev = [
|
||||
"lru-dict",
|
||||
"matplotlib",
|
||||
"parameterized >=0.8, <0.9",
|
||||
#"pprofile",
|
||||
"pyautogui",
|
||||
"pyopencl; platform_machine != 'aarch64'", # broken on arm64
|
||||
"pytools < 2024.1.11; platform_machine != 'aarch64'", # pyopencl use a broken version
|
||||
@@ -112,13 +111,10 @@ dev = [
|
||||
"tabulate",
|
||||
"types-requests",
|
||||
"types-tabulate",
|
||||
|
||||
# this is only pinned since 5.15.11 is broken
|
||||
"pyqt5 ==5.15.2; platform_machine == 'x86_64'", # no aarch64 wheels for macOS/linux
|
||||
]
|
||||
|
||||
tools = [
|
||||
"metadrive-simulator @ https://github.com/commaai/metadrive/releases/download/MetaDrive-minimal/metadrive_simulator-0.4.2.3-py3-none-any.whl ; (platform_machine != 'aarch64')",
|
||||
"metadrive-simulator @ https://github.com/commaai/metadrive/releases/download/MetaDrive-minimal-0.4.2.4/metadrive_simulator-0.4.2.4-py3-none-any.whl ; (platform_machine != 'aarch64')",
|
||||
"rerun-sdk >= 0.18",
|
||||
]
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -ex
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
cd $DIR
|
||||
|
||||
# git clone --mirror
|
||||
SRC=/tmp/openpilot.git/
|
||||
OUT=/tmp/smallpilot/
|
||||
|
||||
echo "starting size $(du -hs .git/)"
|
||||
|
||||
rm -rf $OUT
|
||||
|
||||
cd $SRC
|
||||
git remote update
|
||||
|
||||
# copy contents
|
||||
#rsync -a --exclude='.git/' $DIR $OUT
|
||||
|
||||
cp -r $SRC $OUT
|
||||
|
||||
cd $OUT
|
||||
|
||||
# remove all tags
|
||||
git tag -l | xargs git tag -d
|
||||
|
||||
# remove non-master branches
|
||||
BRANCHES="release2 release3 devel master-ci nightly"
|
||||
for branch in $BRANCHES; do
|
||||
git branch -D $branch
|
||||
git branch -D ${branch}-staging || true
|
||||
done
|
||||
|
||||
#git gc
|
||||
git reflog expire --expire=now --all
|
||||
git gc --prune=now
|
||||
git gc --aggressive --prune=now
|
||||
echo "new one is $(du -hs .)"
|
||||
@@ -1,54 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import ast
|
||||
import stat
|
||||
import subprocess
|
||||
|
||||
fouts = {x.decode('utf-8') for x in subprocess.check_output(['git', 'ls-files']).strip().split()}
|
||||
|
||||
pyf = []
|
||||
for d in ["cereal", "common", "scripts", "selfdrive", "tools"]:
|
||||
for root, _, files in os.walk(d):
|
||||
for f in files:
|
||||
if f.endswith(".py"):
|
||||
pyf.append(os.path.join(root, f))
|
||||
|
||||
imps: set[str] = set()
|
||||
|
||||
class Analyzer(ast.NodeVisitor):
|
||||
def visit_Import(self, node):
|
||||
for alias in node.names:
|
||||
imps.add(alias.name)
|
||||
self.generic_visit(node)
|
||||
|
||||
def visit_ImportFrom(self, node):
|
||||
imps.add(node.module)
|
||||
self.generic_visit(node)
|
||||
|
||||
tlns = 0
|
||||
carlns = 0
|
||||
scriptlns = 0
|
||||
testlns = 0
|
||||
for f in sorted(pyf):
|
||||
if f not in fouts:
|
||||
continue
|
||||
xbit = bool(os.stat(f)[stat.ST_MODE] & stat.S_IXUSR)
|
||||
src = open(f).read()
|
||||
lns = len(src.split("\n"))
|
||||
tree = ast.parse(src)
|
||||
Analyzer().visit(tree)
|
||||
print(f"{lns:5d} {f} {xbit}")
|
||||
if 'test' in f:
|
||||
testlns += lns
|
||||
elif f.startswith(('tools/', 'scripts/', 'selfdrive/debug')):
|
||||
scriptlns += lns
|
||||
elif f.startswith('selfdrive/car'):
|
||||
carlns += lns
|
||||
else:
|
||||
tlns += lns
|
||||
|
||||
print(f"{tlns} lines of openpilot python")
|
||||
print(f"{carlns} lines of car ports")
|
||||
print(f"{scriptlns} lines of tools/scripts/debug")
|
||||
print(f"{testlns} lines of tests")
|
||||
#print(sorted(list(imps)))
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from collections import Counter
|
||||
from pprint import pprint
|
||||
|
||||
from opendbc.car.docs import get_all_car_docs
|
||||
|
||||
if __name__ == "__main__":
|
||||
cars = get_all_car_docs()
|
||||
make_count = Counter(l.make for l in cars)
|
||||
print("\n", "*" * 20, len(cars), "total", "*" * 20, "\n")
|
||||
pprint(make_count)
|
||||
@@ -1,391 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
SRC=/tmp/openpilot/
|
||||
SRC_CLONE=/tmp/openpilot-clone/
|
||||
OUT=/tmp/openpilot-tiny/
|
||||
|
||||
REWRITE_IGNORE_BRANCHES=(
|
||||
dashcam3
|
||||
devel
|
||||
master-ci
|
||||
nightly
|
||||
release2
|
||||
release3
|
||||
release3-staging
|
||||
)
|
||||
|
||||
VALIDATE_IGNORE_FILES=(
|
||||
".github/ISSUE_TEMPLATE/bug_report.md"
|
||||
".github/pull_request_template.md"
|
||||
)
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
cd $DIR
|
||||
|
||||
LOGS_DIR=$DIR/git-rewrite-$(date +"%Y-%m-%dT%H:%M:%S%z")
|
||||
mkdir -p $LOGS_DIR
|
||||
|
||||
GIT_REWRITE_LOG=$LOGS_DIR/git-rewrite-log.txt
|
||||
BRANCH_DIFF_LOG=$LOGS_DIR/branch-diff-log.txt
|
||||
COMMIT_DIFF_LOG=$LOGS_DIR/commit-diff-log.txt
|
||||
|
||||
START_TIME=$(date +%s)
|
||||
exec > >(while IFS= read -r line; do
|
||||
CURRENT_TIME=$(date +%s)
|
||||
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
|
||||
echo "[${ELAPSED_TIME}s] $line"
|
||||
done | tee -a "$GIT_REWRITE_LOG") 2>&1
|
||||
|
||||
# INSTALL git-filter-repo
|
||||
if [ ! -f /tmp/git-filter-repo ]; then
|
||||
echo "Installing git-filter-repo..."
|
||||
curl -sSo /tmp/git-filter-repo https://raw.githubusercontent.com/newren/git-filter-repo/main/git-filter-repo
|
||||
chmod +x /tmp/git-filter-repo
|
||||
fi
|
||||
|
||||
# MIRROR openpilot
|
||||
if [ ! -d $SRC ]; then
|
||||
echo "Mirroring openpilot..."
|
||||
git clone --mirror https://github.com/commaai/openpilot.git $SRC # 4.18 GiB (488034 objects)
|
||||
|
||||
cd $SRC
|
||||
|
||||
echo "Starting size $(du -sh .)"
|
||||
|
||||
git remote update
|
||||
|
||||
# the git-filter-repo analysis is bliss - can be found in the repo root/filter-repo/analysis
|
||||
echo "Analyzing with git-filter-repo..."
|
||||
/tmp/git-filter-repo --force --analyze
|
||||
|
||||
echo "Pushing to openpilot-archive..."
|
||||
# push to archive repo - in smaller parts because the 2 GB push limit - https://docs.github.com/en/get-started/using-git/troubleshooting-the-2-gb-push-limit
|
||||
ARCHIVE_REPO=git@github.com:commaai/openpilot-archive.git
|
||||
git push --prune $ARCHIVE_REPO +refs/heads/master:refs/heads/master # push master first so it's the default branch (when openpilot-archive is an empty repo)
|
||||
git push --prune $ARCHIVE_REPO +refs/heads/*:refs/heads/* # 956.39 MiB (110725 objects)
|
||||
git push --prune $ARCHIVE_REPO +refs/tags/*:refs/tags/* # 1.75 GiB (21694 objects)
|
||||
# git push --mirror $ARCHIVE_REPO || true # fails to push refs/pull/* (deny updating a hidden ref) for pull requests
|
||||
# we fail and continue - more reading: https://stackoverflow.com/a/34266401/639708 and https://blog.plataformatec.com.br/2013/05/how-to-properly-mirror-a-git-repository/
|
||||
fi
|
||||
|
||||
# REWRITE master and tags
|
||||
if [ ! -d $SRC_CLONE ]; then
|
||||
echo "Cloning $SRC..."
|
||||
GIT_LFS_SKIP_SMUDGE=1 git clone $SRC $SRC_CLONE
|
||||
|
||||
cd $SRC_CLONE
|
||||
|
||||
echo "Checking out old history..."
|
||||
|
||||
git checkout tags/v0.7.1 > /dev/null 2>&1
|
||||
# checkout as main, since we need master ref later
|
||||
git checkout -b main
|
||||
|
||||
echo "Creating setup commits..."
|
||||
|
||||
# rm these so we don't get conflicts later
|
||||
git rm -r cereal opendbc panda selfdrive/ui/ui > /dev/null
|
||||
git commit -m "removed conflicting files" > /dev/null
|
||||
|
||||
# skip-smudge to get rid of some lfs errors that it can't find the reference of some lfs files
|
||||
# we don't care about fetching/pushing lfs right now
|
||||
git lfs install --skip-smudge --local
|
||||
|
||||
# squash initial setup commits
|
||||
git cherry-pick -n -X theirs 6c33a5c..59b3d06 > /dev/null
|
||||
git commit -m "switching to master" > /dev/null
|
||||
|
||||
# squash the two commits
|
||||
git reset --soft HEAD~2
|
||||
git commit -m "switching to master" -m "$(git log --reverse --format=%B 6c33a5c..59b3d06)" -m "removed conflicting files" > /dev/null
|
||||
|
||||
# get commits we want to cherry-pick
|
||||
# will start with the next commit after #59b3d06 tools is local now
|
||||
COMMITS=$(git rev-list --reverse 59b3d06..master)
|
||||
|
||||
# we need this for logging
|
||||
TOTAL_COMMITS=$(echo $COMMITS | wc -w | xargs)
|
||||
CURRENT_COMMIT_NUMBER=0
|
||||
|
||||
# empty this file
|
||||
> commit-map.txt
|
||||
|
||||
echo "Rewriting master commits..."
|
||||
|
||||
for COMMIT in $COMMITS; do
|
||||
CURRENT_COMMIT_NUMBER=$((CURRENT_COMMIT_NUMBER + 1))
|
||||
# echo -ne "[$CURRENT_COMMIT_NUMBER/$TOTAL_COMMITS] Cherry-picking commit: $COMMIT"\\r
|
||||
echo "[$CURRENT_COMMIT_NUMBER/$TOTAL_COMMITS] Cherry-picking commit: $COMMIT"
|
||||
|
||||
# set environment variables to preserve author/committer and dates
|
||||
export GIT_AUTHOR_NAME=$(git show -s --format='%an' $COMMIT)
|
||||
export GIT_AUTHOR_EMAIL=$(git show -s --format='%ae' $COMMIT)
|
||||
export GIT_COMMITTER_NAME=$(git show -s --format='%cn' $COMMIT)
|
||||
export GIT_COMMITTER_EMAIL=$(git show -s --format='%ce' $COMMIT)
|
||||
export GIT_AUTHOR_DATE=$(git show -s --format='%ad' $COMMIT)
|
||||
export GIT_COMMITTER_DATE=$(git show -s --format='%cd' $COMMIT)
|
||||
|
||||
# cherry-pick the commit
|
||||
if ! GIT_OUTPUT=$(git cherry-pick -m 1 -X theirs $COMMIT 2>&1); then
|
||||
# check if the failure is because of an empty commit
|
||||
if [[ "$GIT_OUTPUT" == *"The previous cherry-pick is now empty"* ]]; then
|
||||
echo "Empty commit detected. Skipping commit $COMMIT"
|
||||
git cherry-pick --skip
|
||||
# log it was empty to the mapping file
|
||||
echo "$COMMIT EMPTY" >> commit-map.txt
|
||||
else
|
||||
# handle other errors or conflicts
|
||||
echo "Cherry-pick failed. Handling error..."
|
||||
echo "$GIT_OUTPUT"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
# capture the new commit hash
|
||||
NEW_COMMIT=$(git rev-parse HEAD)
|
||||
|
||||
# save the old and new commit hashes to the mapping file
|
||||
echo "$COMMIT $NEW_COMMIT" >> commit-map.txt
|
||||
|
||||
# append the old commit ID to the commit message
|
||||
git commit --amend -m "$(git log -1 --pretty=%B)" -m "Former-commit-id: $COMMIT" > /dev/null
|
||||
fi
|
||||
|
||||
# prune every 3000 commits to avoid gc errors
|
||||
if [ $((CURRENT_COMMIT_NUMBER % 3000)) -eq 0 ]; then
|
||||
echo "Pruning repo..."
|
||||
git gc
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Rewriting tags..."
|
||||
|
||||
# remove all old tags
|
||||
git tag -l | xargs git tag -d
|
||||
|
||||
# read each line from the tag-commit-map.txt
|
||||
while IFS=' ' read -r TAG OLD_COMMIT; do
|
||||
# search for the new commit in commit-map.txt corresponding to the old commit
|
||||
NEW_COMMIT=$(grep "^$OLD_COMMIT " "commit-map.txt" | awk '{print $2}')
|
||||
|
||||
# check if this is a rebased commit
|
||||
if [ -z "$NEW_COMMIT" ]; then
|
||||
# if not, then just use old commit hash
|
||||
NEW_COMMIT=$OLD_COMMIT
|
||||
fi
|
||||
|
||||
echo "Rewriting tag $TAG from commit $NEW_COMMIT"
|
||||
git tag -f "$TAG" "$NEW_COMMIT"
|
||||
done < "$DIR/tag-commit-map.txt"
|
||||
|
||||
# uninstall lfs since we don't want to touch (push to) lfs right now
|
||||
# git push will also push lfs, if we don't uninstall (--local so just for this repo)
|
||||
git lfs uninstall --local
|
||||
|
||||
# force push new master
|
||||
git push --force origin main:master
|
||||
|
||||
# force push new tags
|
||||
git push --force --tags
|
||||
fi
|
||||
|
||||
# REWRITE branches based on master
|
||||
if [ ! -f "$SRC_CLONE/rewrite-branches-done" ]; then
|
||||
cd $SRC_CLONE
|
||||
> rewrite-branches-done
|
||||
|
||||
# empty file
|
||||
> $BRANCH_DIFF_LOG
|
||||
|
||||
echo "Rewriting branches based on master..."
|
||||
|
||||
# will store raw diffs here, if exist
|
||||
mkdir -p differences
|
||||
|
||||
# get a list of all branches except master and REWRITE_IGNORE_BRANCHES
|
||||
BRANCHES=$(git branch -r | grep -v ' -> ' | sed 's/.*origin\///' | grep -v '^master$' | grep -v -f <(echo "${REWRITE_IGNORE_BRANCHES[*]}" | tr ' ' '\n'))
|
||||
|
||||
for BRANCH in $BRANCHES; do
|
||||
# check if the branch is based on master history
|
||||
MERGE_BASE=$(git merge-base master origin/$BRANCH) || true
|
||||
if [ -n "$MERGE_BASE" ]; then
|
||||
echo "Rewriting branch: $BRANCH"
|
||||
|
||||
# create a new branch based on the new master
|
||||
NEW_MERGE_BASE=$(grep "^$MERGE_BASE " "commit-map.txt" | awk '{print $2}')
|
||||
if [ -z "$NEW_MERGE_BASE" ]; then
|
||||
echo "Error: could not find new merge base for branch $BRANCH" >> $BRANCH_DIFF_LOG
|
||||
continue
|
||||
fi
|
||||
git checkout -b ${BRANCH}_new $NEW_MERGE_BASE
|
||||
|
||||
# get the range of commits unique to this branch
|
||||
COMMITS=$(git rev-list --reverse $MERGE_BASE..origin/${BRANCH})
|
||||
|
||||
HAS_ERROR=0
|
||||
|
||||
# simple delimiter
|
||||
echo "BRANCH ${BRANCH}" >> commit-map.txt
|
||||
|
||||
for COMMIT in $COMMITS; do
|
||||
# set environment variables to preserve author/committer and dates
|
||||
export GIT_AUTHOR_NAME=$(git show -s --format='%an' $COMMIT)
|
||||
export GIT_AUTHOR_EMAIL=$(git show -s --format='%ae' $COMMIT)
|
||||
export GIT_COMMITTER_NAME=$(git show -s --format='%cn' $COMMIT)
|
||||
export GIT_COMMITTER_EMAIL=$(git show -s --format='%ce' $COMMIT)
|
||||
export GIT_AUTHOR_DATE=$(git show -s --format='%ad' $COMMIT)
|
||||
export GIT_COMMITTER_DATE=$(git show -s --format='%cd' $COMMIT)
|
||||
|
||||
# cherry-pick the commit
|
||||
if ! GIT_OUTPUT=$(git cherry-pick -m 1 -X theirs $COMMIT 2>&1); then
|
||||
# check if the failure is because of an empty commit
|
||||
if [[ "$GIT_OUTPUT" == *"The previous cherry-pick is now empty"* ]]; then
|
||||
echo "Empty commit detected. Skipping commit $COMMIT"
|
||||
git cherry-pick --skip
|
||||
# log it was empty to the mapping file
|
||||
echo "$COMMIT EMPTY" >> commit-map.txt
|
||||
else
|
||||
# handle other errors or conflicts
|
||||
echo "Cherry-pick of ${BRANCH} branch failed. Removing branch upstream..." >> $BRANCH_DIFF_LOG
|
||||
echo "$GIT_OUTPUT" > "$LOGS_DIR/branch-${BRANCH}"
|
||||
git cherry-pick --abort
|
||||
git push --delete origin ${BRANCH}
|
||||
HAS_ERROR=1
|
||||
break
|
||||
fi
|
||||
else
|
||||
# capture the new commit hash
|
||||
NEW_COMMIT=$(git rev-parse HEAD)
|
||||
|
||||
# save the old and new commit hashes to the mapping file
|
||||
echo "$COMMIT $NEW_COMMIT" >> commit-map.txt
|
||||
|
||||
# append the old commit ID to the commit message
|
||||
git commit --amend -m "$(git log -1 --pretty=%B)" -m "Former-commit-id: $COMMIT" > /dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
# force push the new branch
|
||||
if [ $HAS_ERROR -eq 0 ]; then
|
||||
# git lfs goes haywire here, so we need to install and uninstall
|
||||
# git lfs install --skip-smudge --local
|
||||
git lfs uninstall --local > /dev/null
|
||||
git push -f origin ${BRANCH}_new:${BRANCH}
|
||||
fi
|
||||
|
||||
# clean up local branch
|
||||
git checkout master > /dev/null
|
||||
git branch -D ${BRANCH}_new > /dev/null
|
||||
else
|
||||
echo "Deleting branch $BRANCH as it's not based on master history" >> $BRANCH_DIFF_LOG
|
||||
git push --delete origin ${BRANCH}
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# VALIDATE cherry-pick
|
||||
if [ ! -f "$SRC_CLONE/validation-done" ]; then
|
||||
cd $SRC_CLONE
|
||||
> validation-done
|
||||
|
||||
TOTAL_COMMITS=$(grep -cve '^\s*$' commit-map.txt)
|
||||
CURRENT_COMMIT_NUMBER=0
|
||||
COUNT_SAME=0
|
||||
COUNT_DIFF=0
|
||||
|
||||
# empty file
|
||||
> $COMMIT_DIFF_LOG
|
||||
|
||||
echo "Validating commits..."
|
||||
|
||||
# will store raw diffs here, if exist
|
||||
mkdir -p differences
|
||||
|
||||
# read each line from commit-map.txt
|
||||
while IFS=' ' read -r OLD_COMMIT NEW_COMMIT; do
|
||||
if [ "$NEW_COMMIT" == "EMPTY" ]; then
|
||||
continue
|
||||
fi
|
||||
if [ "$OLD_COMMIT" == "BRANCH" ]; then
|
||||
echo "Branch ${NEW_COMMIT} below:" >> $COMMIT_DIFF_LOG
|
||||
continue
|
||||
fi
|
||||
CURRENT_COMMIT_NUMBER=$((CURRENT_COMMIT_NUMBER + 1))
|
||||
# retrieve short hashes and dates for the old and new commits
|
||||
OLD_COMMIT_SHORT=$(git rev-parse --short $OLD_COMMIT)
|
||||
NEW_COMMIT_SHORT=$(git rev-parse --short $NEW_COMMIT)
|
||||
OLD_DATE=$(git show -s --format='%cd' $OLD_COMMIT)
|
||||
NEW_DATE=$(git show -s --format='%cd' $NEW_COMMIT)
|
||||
|
||||
# echo -ne "[$CURRENT_COMMIT_NUMBER/$TOTAL_COMMITS] Comparing old commit $OLD_COMMIT_SHORT ($OLD_DATE) with new commit $NEW_COMMIT_SHORT ($NEW_DATE)"\\r
|
||||
echo "[$CURRENT_COMMIT_NUMBER/$TOTAL_COMMITS] Comparing old commit $OLD_COMMIT_SHORT ($OLD_DATE) with new commit $NEW_COMMIT_SHORT ($NEW_DATE)"
|
||||
|
||||
# generate lists of files and their hashes for the old and new commits, excluding ignored files
|
||||
OLD_FILES=$(git ls-tree -r $OLD_COMMIT | grep -vE "$(IFS='|'; echo "${VALIDATE_IGNORE_FILES[*]}")")
|
||||
NEW_FILES=$(git ls-tree -r $NEW_COMMIT | grep -vE "$(IFS='|'; echo "${VALIDATE_IGNORE_FILES[*]}")")
|
||||
|
||||
# Compare the diffs
|
||||
if diff <(echo "$OLD_FILES") <(echo "$NEW_FILES") > /dev/null; then
|
||||
# echo "Old commit $OLD_COMMIT_SHORT and new commit $NEW_COMMIT_SHORT are equivalent."
|
||||
COUNT_SAME=$((COUNT_SAME + 1))
|
||||
else
|
||||
echo "[$CURRENT_COMMIT_NUMBER/$TOTAL_COMMITS] Difference found between old commit $OLD_COMMIT_SHORT and new commit $NEW_COMMIT_SHORT" >> $COMMIT_DIFF_LOG
|
||||
COUNT_DIFF=$((COUNT_DIFF + 1))
|
||||
set +e
|
||||
diff -u <(echo "$OLD_FILES") <(echo "$NEW_FILES") > "$LOGS_DIR/commit-$CURRENT_COMMIT_NUMBER-$OLD_COMMIT_SHORT-$NEW_COMMIT_SHORT"
|
||||
set -e
|
||||
fi
|
||||
done < "commit-map.txt"
|
||||
|
||||
echo "Summary:" >> $COMMIT_DIFF_LOG
|
||||
echo "Equivalent commits: $COUNT_SAME" >> $COMMIT_DIFF_LOG
|
||||
echo "Different commits: $COUNT_DIFF" >> $COMMIT_DIFF_LOG
|
||||
fi
|
||||
|
||||
if [ ! -d $OUT ]; then
|
||||
cp -r $SRC $OUT
|
||||
|
||||
cd $OUT
|
||||
|
||||
# remove all non-master branches
|
||||
# git branch | grep -v "^ master$" | grep -v "\*" | xargs git branch -D
|
||||
|
||||
# echo "cleaning up refs"
|
||||
# delete pull request refs since we can't alter them anyway (https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally#error-failed-to-push-some-refs)
|
||||
# git for-each-ref --format='%(refname)' | grep '^refs/pull/' | xargs -I {} git update-ref -d {}
|
||||
|
||||
echo "importing new lfs files"
|
||||
# import "almost" everything to lfs
|
||||
BRANCHES=$(git for-each-ref --format='%(refname)' refs/heads/ | sed 's%refs/heads/%%g' | grep -v -f <(echo "${REWRITE_IGNORE_BRANCHES[*]}" | tr ' ' '\n') | tr '\n' ' ')
|
||||
git lfs migrate import --include="*.dlc,*.onnx,*.svg,*.png,*.gif,*.ttf,*.wav,selfdrive/car/tests/test_models_segs.txt,system/hardware/tici/updater,selfdrive/ui/qt/spinner_larch64,selfdrive/ui/qt/text_larch64,third_party/**/*.a,third_party/**/*.so,third_party/**/*.so.*,third_party/**/*.dylib,third_party/acados/*/t_renderer,third_party/qt5/larch64/bin/lrelease,third_party/qt5/larch64/bin/lupdate,third_party/catch2/include/catch2/catch.hpp,*.apk,*.apkpatch,*.jar,*.pdf,*.jpg,*.mp3,*.thneed,*.tar.gz,*.npy,*.csv,*.a,*.so*,*.dylib,*.o,*.b64,selfdrive/hardware/tici/updater,selfdrive/boardd/tests/test_boardd,selfdrive/ui/qt/spinner_aarch64,installer/updater/updater,selfdrive/debug/profiling/simpleperf/**/*,selfdrive/hardware/eon/updater,selfdrive/ui/qt/text_aarch64,selfdrive/debug/profiling/pyflame/**/*,installer/installers/installer_openpilot,installer/installers/installer_dashcam,selfdrive/ui/text/text,selfdrive/ui/android/text/text,selfdrive/ui/spinner/spinner,selfdrive/visiond/visiond,selfdrive/loggerd/loggerd,selfdrive/sensord/sensord,selfdrive/sensord/gpsd,selfdrive/ui/android/spinner/spinner,selfdrive/ui/qt/spinner,selfdrive/ui/qt/text,_stringdefs.py,dfu-util-aarch64-linux,dfu-util-aarch64,dfu-util-x86_64-linux,dfu-util-x86_64,stb_image.h,clpeak3,clwaste,apk/**/*,external/**/*,phonelibs/**/*,third_party/boringssl/**/*,flask/**/*,panda/**/*,board/**/*,messaging/**/*,opendbc/**/*,tools/cabana/chartswidget.cc,third_party/nanovg/**/*,selfdrive/controls/lib/lateral_mpc/lib_mpc_export/**/*,selfdrive/ui/paint.cc,werkzeug/**/*,pyextra/**/*,third_party/android_hardware_libhardware/**/*,selfdrive/controls/lib/lead_mpc_lib/lib_mpc_export/**/*,selfdrive/locationd/laikad.py,selfdrive/locationd/test/test_laikad.py,tools/gpstest/test_laikad.py,selfdrive/locationd/laikad_helpers.py,tools/nui/**/*,jsonrpc/**/*,selfdrive/controls/lib/longitudinal_mpc/lib_mpc_export/**/*,selfdrive/controls/lib/lateral_mpc/mpc_export/**/*,selfdrive/camerad/cameras/camera_qcom.cc,selfdrive/manager.py,selfdrive/modeld/models/driving.cc,third_party/curl/**/*,selfdrive/modeld/thneed/debug/**/*,selfdrive/modeld/thneed/include/**/*,third_party/openmax/**/*,selfdrive/controls/lib/longitudinal_mpc/mpc_export/**/*,selfdrive/controls/lib/longitudinal_mpc_model/lib_mpc_export/**/*,Pipfile,Pipfile.lock,gunicorn/**/*,*.qm,jinja2/**/*,click/**/*,dbcs/**/*,websocket/**/*" $BRANCHES
|
||||
|
||||
echo "reflog and gc"
|
||||
# this is needed after lfs import
|
||||
git reflog expire --expire=now --all
|
||||
git gc --prune=now --aggressive
|
||||
|
||||
# check the git-filter-repo analysis again - can be found in the repo root/filter-repo/analysis
|
||||
echo "Analyzing with git-filter-repo..."
|
||||
/tmp/git-filter-repo --force --analyze
|
||||
|
||||
echo "New size is $(du -sh .)"
|
||||
fi
|
||||
|
||||
cd $OUT
|
||||
|
||||
# fetch all lfs files from https://github.com/commaai/openpilot.git
|
||||
# some lfs files are missing on gitlab, but they can be found on github
|
||||
git config lfs.url https://github.com/commaai/openpilot.git/info/lfs
|
||||
git config lfs.pushurl ssh://git@github.com/commaai/openpilot.git
|
||||
git lfs fetch --all || true
|
||||
|
||||
# also fetch all lfs files from https://gitlab.com/commaai/openpilot-lfs.git
|
||||
git config lfs.url https://gitlab.com/commaai/openpilot-lfs.git/info/lfs
|
||||
git config lfs.pushurl ssh://git@gitlab.com/commaai/openpilot-lfs.git
|
||||
git lfs fetch --all || true
|
||||
|
||||
# final push - will also push lfs
|
||||
# TODO: switch to git@github.com:commaai/openpilot.git when ready
|
||||
# git push --mirror git@github.com:commaai/openpilot-tiny.git
|
||||
# using this instead to ignore refs/pull/* - since this is also what --mirror does - https://blog.plataformatec.com.br/2013/05/how-to-properly-mirror-a-git-repository/
|
||||
git push --prune git@github.com:commaai/openpilot-tiny.git +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*
|
||||
@@ -1,59 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
|
||||
cd $DIR
|
||||
|
||||
git clone --bare https://github.com/commaai/openpilot
|
||||
cp -r openpilot.git openpilot_backup
|
||||
cd openpilot.git
|
||||
|
||||
# backup old repo
|
||||
git push git@github.com:commaai/openpilot-archive.git +refs/heads/master:refs/heads/master
|
||||
git push git@github.com:commaai/openpilot-archive.git +refs/heads/*:refs/heads/*
|
||||
git push git@github.com:commaai/openpilot-archive.git +refs/tags/*:refs/tags/*
|
||||
git push --mirror git@github.com:commaai/openpilot-archive.git
|
||||
|
||||
# ignore all release branches
|
||||
git for-each-ref --format='delete %(refname)' | grep 'dashcam3\|devel\|master-ci\|nightly\|release2\|release3\|release3-staging' | git update-ref --stdin
|
||||
|
||||
# re-tag old releases on master
|
||||
declare -A TAGS=( ["f8cb04e4a8b032b72a909f68b808a50936184bee"]="v0.9.7" ["0b4d08fab8e35a264bc7383e878538f8083c33e5"]="v0.9.6" ["3b1e9017c560499786d8a0e46aaaeea65037acac"]="v0.9.5" ["fa310d9e2542cf497d92f007baec8fd751ffa99c"]="v0.9.4" ["8704c1ff952b5c85a44f50143bbd1a4f7b4887e2"]="v0.9.3" ["c7d3b28b93faa6c955fb24bc64031512ee985ee9"]="v0.9.2" ["89f68bf0cbf53a81b0553d3816fdbe522f941fa1"]="v0.9.1" ["58b84fb401a804967aa0dd5ee66fafa90194fd30"]="v0.9.0" ["f41dc62a12cc0f3cb8c5453c0caa0ba21e1bd01e"]="v0.8.16" ["5a7c2f90361e72e9c35e88abd2e11acdc4aba354"]="v0.8.15" ["71901c94dbbaa2f9f156a80c14cc7ea65219fc7c"]="v0.8.14" ["95da47079510afc91665263619e5939126da637c"]="v0.8.13" ["472177e2a8a1d002e56f9096326fd2dff62e54f9"]="v0.8.12" ["08078acbd0b4f7da469c7dff6159000e358974a9"]="v0.8.11" ["687925c775c375495f9827946138a724bde00b9d"]="v0.8.10" ["204e5a090735a059d69c29145a4cee49450da07e"]="v0.8.9" ["4be956f8861ecbb521ef9503a3c87b07c9d36721"]="v0.8.8" ["589f82c76627d634761a31a34b2488403556eb0b"]="v0.8.7" ["507cfc8910f74ddb8810039d68b880b426ff9ff9"]="v0.8.6" ["d47b00b45a866bef088f51d1ff31de5885ab04e9"]="v0.8.5" ["553e7d1cce314e7eb0587186b1764c3ff43bed62"]="v0.8.4" ["9896438d1511602a1ff87f7c4eb3c7172b30104a"]="v0.8.3" ["280192ed1443f112463417c2d815ea8ee2762fbd"]="v0.8.2" ["8039361567e4659eae2a084e6f39f34acadf4cac"]="v0.8.1" ["d56e04c0d960c8d3d4ab88b578dc508a2b4e07dc"]="v0.8" ["3d456e5d0fbf0c9887d0499dee812f2b029edf6d"]="v0.7.10" ["81763a18b5d0e379b749e090ecce36a91fca7c43"]="v0.7.9" ["9bc0b350fd273bbb2deb3dcaef0312944e4f6cfd"]="v0.7.8" ["ede5b632b58c55e4ff003f948efae07fe03c2280"]="v0.7.7" ["775acd11ba2e0a8c2f5a5655338718d796491b36"]="v0.7.6.1" ["302417b4cf0dcf00d45e4995b5410e543ad121d1"]="v0.7.5" ["12ff088b42221dd17d9d97decb1fc61a7cb0a861"]="v0.7.4" ["9563f7730252451fdcba9bc3d9fe36dab9c86a26"]="v0.7.3" ["8321cf283abbc2ca3fda7e0c7a069a77a492fe0c"]="v0.7.2" ["1e1de64a1e59476b7b3d3558b92149246d5c3292"]="v0.7.1" ["a2ae18d1dbd1e59c38ce22fa25ddffbd1d3084e3"]="v0.7" ["d4eb5a6eafdd4803d09e6f3963918216cca5a81f"]="v0.6.6" ["70d17cd69b80e7627dcad8fd5b6438f2309ac307"]="v0.6.5" ["58f376002e0c654fbc2de127765fa297cf694a33"]="v0.6.4" ["d5f9caa82d80cdcc7f1b7748f2cf3ccbf94f82a3"]="v0.6.3" ["095ef5f9f60fca1b269aabcc3cfd322b17b9e674"]="v0.6.2" ["cf5c4aeacb1703d0ffd35bdb5297d3494fee9a22"]="v0.6.1" ["60a20537c5f3fcc7f11946d81aebc8f90c08c117"]="v0.6" ["dd34ccfe288ebda8e2568cf550994ae890379f45"]="v0.5.13" ["3f9059fea886f1fa3b0c19a62a981d891dcc84eb"]="v0.5.12" ["2f92d577f995ff6ae1945ef6b89df3cb69b92999"]="v0.5.11" ["5a9d89ed42ddcd209d001a10d7eb828ef0e6d9de"]="v0.5.10" ["0207a970400ee28d3e366f2e8f5c551281accf02"]="v0.5.9" ["b967da5fc1f7a07e3561db072dd714d325e857b0"]="v0.5.8" ["210db686bb89f8696aa040e6e16de65424b808c9"]="v0.5.7" ["860a48765d1016ba226fb2c64aea35a45fe40e4a"]="v0.5.6" ["8f3539a27b28851153454eb737da9624cccaed2d"]="v0.5.5" ["a422246dc30bce11e970514f13f7c110f4470cc3"]="v0.5.4" ["285c52eb693265a0a530543e9ca0aeb593a2a55e"]="v0.5.3" ["0129a8a4ff8da5314e8e4d4d3336e89667ff6d54"]="v0.5.2" ["6f3d10a4c475c4c4509f0b370805419acd13912d"]="v0.5.1" ["de33bc46452b1046387ee2b3a03191b2c71135fb"]="v0.5" ["ae5cb7a0dab8b1bed9d52292f9b4e8e66a0f8ec9"]="v0.4.7" ["c6df34f55ba8c5a911b60d3f9eb20e3fa45f68c1"]="v0.4.6" ["37285038d3f91fa1b49159c4a35a8383168e644f"]="v0.4.5" ["9a9ff839a9b70cb2601d7696af743f5652395389"]="v0.4.4" ["28c0797d30175043bbfa31307b63aab4197cf996"]="v0.4.2" ["4474b9b3718653aeb0aee26422caefb90460cc0e"]="v0.4.1" ["da52d065a4c4f52d6017a537f3a80326f5af8bdc"]="v0.4.0.2" ["9d3963559ae7b15193057937ff3e72481899f40d"]="v0.3.5" ["1b8c44b5067525a5d266b6e99799d8097da76a29"]="v0.3.4" ["5cf91d0496688fed4f2a6c7021349b1fc0e057a2"]="v0.3.3" ["7fe46f1e1df5dec08a940451ba0feefd5c039165"]="v0.3.2" ["41e3a0f699f5c39cb61a15c0eb7a4aa816d47c24"]="v0.3.1" ["c5d8aec28b5230d34ae4b677c2091cc3dec7e3e8"]="v0.3.0" ["693bcb0f83478f2651db6bac9be5ca5ad60d03f3"]="v0.2.9" ["95a349abcc050712c50d4d85a1c8a804eee7f6c2"]="v0.2.8" ["c6ba5dc5391d3ca6cda479bf1923b88ce45509a0"]="v0.2.7" ["6c3afeec0fb439070b2912978b8dbb659033b1d9"]="v0.2.6" ["29c58b45882ac79595356caf98580c1d2a626011"]="v0.2.5" ["ecc565aa3fdc4c7e719aadc000e1fdc4d80d4fe0"]="v0.2.4" ["adaa4ed350acda4067fc0b455ad15b54cdf4c768"]="v0.2.3" ["a64b9aa9b8cb5863c917b6926516291a63c02fe5"]="v0.2.2" ["17d9becd3c673091b22f09aa02559a9ed9230f50"]="v0.2.1" ["449b482cc3236ccf31829830b4f6a44b2dcc06c2"]="v0.2" ["e94a30bec07e719c5a7b037ca1f4db8312702cce"]="v0.1" )
|
||||
for tag in "${!TAGS[@]}"; do git tag -f "${TAGS[$tag]}" "$tag" ; done
|
||||
|
||||
# get master root commit
|
||||
ROOT_COMMIT=$(git rev-list --max-parents=0 HEAD | tail -n 1)
|
||||
|
||||
# link master and devel
|
||||
git replace --graft $ROOT_COMMIT v0.7.1
|
||||
git-filter-repo --prune-empty never --force --commit-callback 'h=commit.original_id.decode("utf-8");m=commit.message.decode("utf-8");commit.message=str.encode(m + "\n" + "old-commit-hash: " + h)'
|
||||
|
||||
# delete replace refs
|
||||
git for-each-ref --format='delete %(refname)' refs/replace | git update-ref --stdin
|
||||
|
||||
# machine validation
|
||||
tail -n +2 "filter-repo/commit-map" | tr ' ' '\n' | xargs -P $(nproc) -n 2 bash -c 'H1=$(cd ../openpilot_backup && git ls-tree -r $0 | sha1sum) && H2=$(git ls-tree -r $1 | sha1sum) && echo "$H1 $H2" >> /tmp/GIT_HASHES && diff <(echo $H1) <(echo $H2) || exit 255'
|
||||
# human validation
|
||||
less /tmp/GIT_HASH
|
||||
|
||||
# cleanup
|
||||
git reflog expire --expire=now --all
|
||||
git gc --prune=now --aggressive
|
||||
|
||||
# get all lfs files
|
||||
set +e
|
||||
git config lfs.url https://github.com/commaai/openpilot.git/info/lfs
|
||||
git lfs fetch --all
|
||||
git config lfs.url https://gitlab.com/commaai/openpilot-lfs.git/info/lfs
|
||||
git lfs fetch --all
|
||||
set -e
|
||||
|
||||
# add new files to lfs
|
||||
git lfs migrate import --everything --include="*.ico,*.dlc,*.onnx,*.svg,*.png,*.gif,*.ttf,*.wav,system/hardware/tici/updater,selfdrive/ui/qt/spinner_larch64,selfdrive/ui/qt/text_larch64,third_party/**/*.a,third_party/**/*.so,third_party/**/*.so.*,third_party/**/*.dylib,third_party/acados/*/t_renderer,third_party/qt5/larch64/bin/lrelease,third_party/qt5/larch64/bin/lupdate,third_party/catch2/include/catch2/catch.hpp,*.apk,*.apkpatch,*.jar,*.pdf,*.jpg,*.mp3,*.thneed,*.tar.gz,*.npy,*.csv,*.a,*.so*,*.dylib,*.o,*.b64,selfdrive/hardware/tici/updater,selfdrive/boardd/tests/test_boardd,selfdrive/ui/qt/spinner_aarch64,installer/updater/updater,selfdrive/debug/profiling/simpleperf/**/*,selfdrive/hardware/eon/updater,selfdrive/ui/qt/text_aarch64,selfdrive/debug/profiling/pyflame/**/*,installer/installers/installer_openpilot,installer/installers/installer_dashcam,selfdrive/ui/text/text,selfdrive/ui/android/text/text,selfdrive/ui/spinner/spinner,selfdrive/visiond/visiond,selfdrive/loggerd/loggerd,selfdrive/sensord/sensord,selfdrive/sensord/gpsd,selfdrive/ui/android/spinner/spinner,selfdrive/ui/qt/spinner,selfdrive/ui/qt/text,_stringdefs.py,dfu-util-aarch64-linux,dfu-util-aarch64,dfu-util-x86_64-linux,dfu-util-x86_64,stb_image.h,clpeak3,clwaste,apk/**/*,external/**/*,phonelibs/**/*,third_party/boringssl/**/*,pyextra/**/*,panda/board/**/inc/*.h,panda/board/obj/*.elf,board/inc/*.h,third_party/nanovg/**/*,selfdrive/controls/lib/lateral_mpc/lib_mpc_export/**/*,pyextra/**/*,third_party/android_hardware_libhardware/**/*,selfdrive/controls/lib/lead_mpc_lib/lib_mpc_export/**/*,*.pro,selfdrive/controls/lib/longitudinal_mpc/lib_mpc_export/**/*,selfdrive/controls/lib/lateral_mpc/mpc_export/**/*,third_party/curl/**/*,selfdrive/modeld/thneed/debug/**/*,selfdrive/modeld/thneed/include/**/*,third_party/openmax/**/*,selfdrive/controls/lib/longitudinal_mpc/mpc_export/**/*,selfdrive/controls/lib/longitudinal_mpc_model/lib_mpc_export/**/*,Pipfile,Pipfile.lock,poetry.lock,*.qm"
|
||||
|
||||
# set new lfs endpoint
|
||||
git config lfs.url https://gitlab.com/commaai/openpilot-lfs.git/info/lfs
|
||||
git config lfs.pushurl ssh://git@gitlab.com/commaai/openpilot-lfs.git
|
||||
|
||||
# push all branch+tag (scary stuff...)
|
||||
git push -f --set-upstream git@github.com:commaai/openpilot.git +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*
|
||||
@@ -1,82 +0,0 @@
|
||||
v0.1 e94a30bec07e719c5a7b037ca1f4db8312702cce
|
||||
v0.2 449b482cc3236ccf31829830b4f6a44b2dcc06c2
|
||||
v0.2.1 17d9becd3c673091b22f09aa02559a9ed9230f50
|
||||
v0.2.2 a64b9aa9b8cb5863c917b6926516291a63c02fe5
|
||||
v0.2.3 adaa4ed350acda4067fc0b455ad15b54cdf4c768
|
||||
v0.2.4 ecc565aa3fdc4c7e719aadc000e1fdc4d80d4fe0
|
||||
v0.2.5 29c58b45882ac79595356caf98580c1d2a626011
|
||||
v0.2.6 6c3afeec0fb439070b2912978b8dbb659033b1d9
|
||||
v0.2.7 c6ba5dc5391d3ca6cda479bf1923b88ce45509a0
|
||||
v0.2.8 95a349abcc050712c50d4d85a1c8a804eee7f6c2
|
||||
v0.2.9 693bcb0f83478f2651db6bac9be5ca5ad60d03f3
|
||||
v0.3.0 c5d8aec28b5230d34ae4b677c2091cc3dec7e3e8
|
||||
v0.3.1 41e3a0f699f5c39cb61a15c0eb7a4aa816d47c24
|
||||
v0.3.2 7fe46f1e1df5dec08a940451ba0feefd5c039165
|
||||
v0.3.3 5cf91d0496688fed4f2a6c7021349b1fc0e057a2
|
||||
v0.3.4 1b8c44b5067525a5d266b6e99799d8097da76a29
|
||||
v0.3.5 b111277f464cf66fa34b67819a83ea683e0f64df
|
||||
v0.4.0.2 da52d065a4c4f52d6017a537f3a80326f5af8bdc
|
||||
v0.4.1 4474b9b3718653aeb0aee26422caefb90460cc0e
|
||||
v0.4.2 28c0797d30175043bbfa31307b63aab4197cf996
|
||||
v0.4.4 9a9ff839a9b70cb2601d7696af743f5652395389
|
||||
v0.4.5 37285038d3f91fa1b49159c4a35a8383168e644f
|
||||
v0.4.6 c6df34f55ba8c5a911b60d3f9eb20e3fa45f68c1
|
||||
v0.4.7 ae5cb7a0dab8b1bed9d52292f9b4e8e66a0f8ec9
|
||||
v0.5 de33bc46452b1046387ee2b3a03191b2c71135fb
|
||||
v0.5.1 8f22f52235c48eada586795ac57edb22688e4d08
|
||||
v0.5.2 0129a8a4ff8da5314e8e4d4d3336e89667ff6d54
|
||||
v0.5.3 285c52eb693265a0a530543e9ca0aeb593a2a55e
|
||||
v0.5.4 a422246dc30bce11e970514f13f7c110f4470cc3
|
||||
v0.5.5 8f3539a27b28851153454eb737da9624cccaed2d
|
||||
v0.5.6 860a48765d1016ba226fb2c64aea35a45fe40e4a
|
||||
v0.5.7 9ce3045f139ee29bf0eea5ec59dfe7df9c3d2c51
|
||||
v0.5.8 2cee2e05ba0f3824fdbb8b957958800fa99071a1
|
||||
v0.5.9 ad145da3bcded0fe75306df02061d07a633963c3
|
||||
v0.5.10 ff4c1557d8358f158f4358788ff18ef93d2470ef
|
||||
v0.5.11 d1866845df423c6855e2b365ff230cf7d89a420b
|
||||
v0.5.12 f6e8ef27546e9a406724841e75f8df71cc4c2c97
|
||||
v0.5.13 dd34ccfe288ebda8e2568cf550994ae890379f45
|
||||
v0.6 60a20537c5f3fcc7f11946d81aebc8f90c08c117
|
||||
v0.6.1 cf5c4aeacb1703d0ffd35bdb5297d3494fee9a22
|
||||
v0.6.2 095ef5f9f60fca1b269aabcc3cfd322b17b9e674
|
||||
v0.6.3 d5f9caa82d80cdcc7f1b7748f2cf3ccbf94f82a3
|
||||
v0.6.4 58f376002e0c654fbc2de127765fa297cf694a33
|
||||
v0.6.5 70d17cd69b80e7627dcad8fd5b6438f2309ac307
|
||||
v0.6.6 d4eb5a6eafdd4803d09e6f3963918216cca5a81f
|
||||
v0.7 a2ae18d1dbd1e59c38ce22fa25ddffbd1d3084e3
|
||||
v0.7.1 1e1de64a1e59476b7b3d3558b92149246d5c3292
|
||||
v0.7.2 59bd58c940673b4c4a6a86f299022614bcf42b22
|
||||
v0.7.3 d7acd8b68f8131e0e714400cf124a3e228638643
|
||||
v0.7.4 e93649882c5e914eec4a8b8b593dc0587e497033
|
||||
v0.7.5 8abc0afe464626a461d2c7e192c912eeebeccc65
|
||||
v0.7.6 69aacd9d179fe6dd3110253a099c38b34cff7899
|
||||
v0.7.7 f1caed7299cdba5e45635d8377da6cc1e5fd7072
|
||||
v0.7.8 2189fe8741b635d8394d55dee28959425cfd5ad0
|
||||
v0.7.9 86dc54b836a973f132ed26db9f5a60b29f9b25b2
|
||||
v0.7.10 47a42ff432db8a2494e922ca5e767e58020f0446
|
||||
v0.7.11 f46ed718ba8d6bb4d42cd7b0f0150c406017c373
|
||||
v0.8 d56e04c0d960c8d3d4ab88b578dc508a2b4e07dc
|
||||
v0.8.1 cd6f26664cb8d32a13847d6648567c47c580e248
|
||||
v0.8.2 7cc0999aebfe63b6bb6dd83c1dff62c3915c4820
|
||||
v0.8.3 986500fe2f10870018f1fba1e5465476b8915977
|
||||
v0.8.4 f0d0b82b8d6f5f450952113e234d0a5a49e80c48
|
||||
v0.8.5 f5d9ddc6c2a2802a61e5ce590c6b6688bf736a69
|
||||
v0.8.6 75904ed7452c6cbfb2a70cd379a899d8a75b97c2
|
||||
v0.8.7 4f9e568019492126e236da85b5ca0a059f292900
|
||||
v0.8.8 a949a49d5efaaf2d881143d23e9fb5ff9e28e88c
|
||||
v0.8.9 a034926264cd1025c69d6ceb3fe444965f960b75
|
||||
v0.8.10 59accdd814398b884167c0f41dbf46dcccf0c29c
|
||||
v0.8.11 d630ec9092f039cb5e51c5dd6d92fc47b91407e4
|
||||
v0.8.12 57871c99031cf597ffa0d819057ac1401e129f32
|
||||
v0.8.13 e43e6e876513450d235124fcb711f1724ed9814c
|
||||
v0.8.14 71901c94dbbaa2f9f156a80c14cc7ea65219fc7c
|
||||
v0.8.15 5a7c2f90361e72e9c35e88abd2e11acdc4aba354
|
||||
v0.8.16 f41dc62a12cc0f3cb8c5453c0caa0ba21e1bd01e
|
||||
v0.9.0 58b84fb401a804967aa0dd5ee66fafa90194fd30
|
||||
v0.9.1 89f68bf0cbf53a81b0553d3816fdbe522f941fa1
|
||||
v0.9.2 c7d3b28b93faa6c955fb24bc64031512ee985ee9
|
||||
v0.9.3 8704c1ff952b5c85a44f50143bbd1a4f7b4887e2
|
||||
v0.9.4 fa310d9e2542cf497d92f007baec8fd751ffa99c
|
||||
v0.9.5 3b1e9017c560499786d8a0e46aaaeea65037acac
|
||||
v0.9.6 0b4d08fab8e35a264bc7383e878538f8083c33e5
|
||||
v0.9.7 f8cb04e4a8b032b72a909f68b808a50936184bee
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from PyQt5.QtWidgets import QApplication, QLabel
|
||||
from openpilot.selfdrive.ui.qt.python_helpers import set_main_window
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication([])
|
||||
label = QLabel('Hello World!')
|
||||
|
||||
# Set full screen and rotate
|
||||
set_main_window(label)
|
||||
|
||||
app.exec_()
|
||||
Binary file not shown.
@@ -30,7 +30,7 @@ if __name__ == '__main__':
|
||||
elif event.type == 3 and event.code == 57 and event.value == -1:
|
||||
fingers[current_slot] = [-1, -1]
|
||||
elif event.type == 3 and event.code == 53:
|
||||
fingers[current_slot][1] = h - (h - event.value)
|
||||
fingers[current_slot][1] = event.value
|
||||
if fingers[current_slot][0] != -1:
|
||||
touch_points.append(fingers[current_slot].copy())
|
||||
elif event.type == 3 and event.code == 54:
|
||||
|
||||
@@ -26,10 +26,6 @@ for pathdef, fn in {'TRANSFORM': 'transforms/transform.cl', 'LOADYUV': 'transfor
|
||||
xenv['CXXFLAGS'].append(f'-D{pathdef}_PATH=\\"{File(fn).abspath}\\"')
|
||||
|
||||
# Compile cython
|
||||
snpe_rpath_qcom = "/data/pythonpath/third_party/snpe/larch64"
|
||||
snpe_rpath_pc = f"{Dir('#').abspath}/third_party/snpe/x86_64-linux-clang"
|
||||
snpe_rpath = lenvCython['RPATH'] + [snpe_rpath_qcom if arch == "larch64" else snpe_rpath_pc]
|
||||
|
||||
cython_libs = envCython["LIBS"] + libs
|
||||
commonmodel_lib = lenv.Library('commonmodel', common_src)
|
||||
lenvCython.Program('models/commonmodel_pyx.so', 'models/commonmodel_pyx.pyx', LIBS=[commonmodel_lib, *cython_libs], FRAMEWORKS=frameworks)
|
||||
|
||||
@@ -16,7 +16,6 @@ class ModelConstants:
|
||||
MODEL_FREQ = 20
|
||||
FEATURE_LEN = 512
|
||||
FULL_HISTORY_BUFFER_LEN = 99
|
||||
HISTORY_BUFFER_LEN = 24
|
||||
DESIRE_LEN = 8
|
||||
TRAFFIC_CONVENTION_LEN = 2
|
||||
LAT_PLANNER_STATE_LEN = 4
|
||||
@@ -73,14 +72,13 @@ class Plan:
|
||||
class Meta:
|
||||
ENGAGED = slice(0, 1)
|
||||
# next 2, 4, 6, 8, 10 seconds
|
||||
GAS_DISENGAGE = slice(1, 31, 6)
|
||||
BRAKE_DISENGAGE = slice(2, 31, 6)
|
||||
STEER_OVERRIDE = slice(3, 31, 6)
|
||||
HARD_BRAKE_3 = slice(4, 31, 6)
|
||||
HARD_BRAKE_4 = slice(5, 31, 6)
|
||||
HARD_BRAKE_5 = slice(6, 31, 6)
|
||||
GAS_DISENGAGE = slice(1, 36, 7)
|
||||
BRAKE_DISENGAGE = slice(2, 36, 7)
|
||||
STEER_OVERRIDE = slice(3, 36, 7)
|
||||
HARD_BRAKE_3 = slice(4, 36, 7)
|
||||
HARD_BRAKE_4 = slice(5, 36, 7)
|
||||
HARD_BRAKE_5 = slice(6, 36, 7)
|
||||
GAS_PRESS = slice(7, 36, 7)
|
||||
# next 0, 2, 4, 6, 8, 10 seconds
|
||||
GAS_PRESS = slice(31, 55, 4)
|
||||
BRAKE_PRESS = slice(32, 55, 4)
|
||||
LEFT_BLINKER = slice(33, 55, 4)
|
||||
RIGHT_BLINKER = slice(34, 55, 4)
|
||||
LEFT_BLINKER = slice(36, 48, 2)
|
||||
RIGHT_BLINKER = slice(37, 48, 2)
|
||||
|
||||
@@ -3,21 +3,11 @@ import capnp
|
||||
import numpy as np
|
||||
from cereal import log
|
||||
from openpilot.selfdrive.modeld.constants import ModelConstants, Plan, Meta
|
||||
from openpilot.selfdrive.controls.lib.drive_helpers import MIN_SPEED
|
||||
|
||||
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
|
||||
|
||||
ConfidenceClass = log.ModelDataV2.ConfidenceClass
|
||||
|
||||
def curv_from_psis(psi_target, psi_rate, vego, delay):
|
||||
vego = np.clip(vego, MIN_SPEED, np.inf)
|
||||
curv_from_psi = psi_target / (vego * delay) # epsilon to prevent divide-by-zero
|
||||
return 2*curv_from_psi - psi_rate / vego
|
||||
|
||||
def get_curvature_from_plan(plan, vego, delay):
|
||||
psi_target = np.interp(delay, ModelConstants.T_IDXS, plan[:, Plan.T_FROM_CURRENT_EULER][:, 2])
|
||||
psi_rate = plan[:, Plan.ORIENTATION_RATE][0, 2]
|
||||
return curv_from_psis(psi_target, psi_rate, vego, delay)
|
||||
|
||||
class PublishState:
|
||||
def __init__(self):
|
||||
@@ -75,8 +65,6 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D
|
||||
extended_msg.valid = valid
|
||||
base_msg.valid = valid
|
||||
|
||||
desired_curv = float(get_curvature_from_plan(net_output_data['plan'][0], v_ego, delay))
|
||||
|
||||
driving_model_data = base_msg.drivingModelData
|
||||
|
||||
driving_model_data.frameId = vipc_frame_id
|
||||
@@ -85,7 +73,7 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D
|
||||
driving_model_data.modelExecutionTime = model_execution_time
|
||||
|
||||
action = driving_model_data.action
|
||||
action.desiredCurvature = desired_curv
|
||||
action.desiredCurvature = float(net_output_data['desired_curvature'][0,0])
|
||||
|
||||
modelV2 = extended_msg.modelV2
|
||||
modelV2.frameId = vipc_frame_id
|
||||
@@ -120,7 +108,7 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D
|
||||
|
||||
# lateral planning
|
||||
action = modelV2.action
|
||||
action.desiredCurvature = desired_curv
|
||||
action.desiredCurvature = float(net_output_data['desired_curvature'][0,0])
|
||||
|
||||
# times at X_IDXS according to model plan
|
||||
PLAN_T_IDXS = [np.nan] * ModelConstants.IDX_N
|
||||
@@ -181,8 +169,8 @@ def fill_model_msg(base_msg: capnp._DynamicStructBuilder, extended_msg: capnp._D
|
||||
disengage_predictions.brake3MetersPerSecondSquaredProbs = net_output_data['meta'][0,Meta.HARD_BRAKE_3].tolist()
|
||||
disengage_predictions.brake4MetersPerSecondSquaredProbs = net_output_data['meta'][0,Meta.HARD_BRAKE_4].tolist()
|
||||
disengage_predictions.brake5MetersPerSecondSquaredProbs = net_output_data['meta'][0,Meta.HARD_BRAKE_5].tolist()
|
||||
disengage_predictions.gasPressProbs = net_output_data['meta'][0,Meta.GAS_PRESS].tolist()
|
||||
disengage_predictions.brakePressProbs = net_output_data['meta'][0,Meta.BRAKE_PRESS].tolist()
|
||||
#disengage_predictions.gasPressProbs = net_output_data['meta'][0,Meta.GAS_PRESS].tolist()
|
||||
#disengage_predictions.brakePressProbs = net_output_data['meta'][0,Meta.BRAKE_PRESS].tolist()
|
||||
|
||||
publish_state.prev_brake_5ms2_probs[:-1] = publish_state.prev_brake_5ms2_probs[1:]
|
||||
publish_state.prev_brake_5ms2_probs[-1] = net_output_data['meta'][0,Meta.HARD_BRAKE_5][0]
|
||||
|
||||
+62
-61
@@ -1,21 +1,15 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
from openpilot.system.hardware import TICI
|
||||
|
||||
from openpilot.selfdrive.modeld.runners.model_runner import ONNXRunner, TinygradRunner
|
||||
from openpilot.sunnypilot.models.helpers import is_active_model_20hz
|
||||
|
||||
#
|
||||
if TICI:
|
||||
from tinygrad.tensor import Tensor
|
||||
from tinygrad.dtype import dtypes
|
||||
from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address
|
||||
os.environ['QCOM'] = '1'
|
||||
else:
|
||||
from openpilot.selfdrive.modeld.runners.ort_helpers import make_onnx_cpu_runner
|
||||
import os
|
||||
import time
|
||||
import pickle
|
||||
import numpy as np
|
||||
import cereal.messaging as messaging
|
||||
from cereal import car, log
|
||||
from pathlib import Path
|
||||
from setproctitle import setproctitle
|
||||
from cereal.messaging import PubMaster, SubMaster
|
||||
from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf
|
||||
@@ -27,19 +21,16 @@ from openpilot.common.realtime import config_realtime_process
|
||||
from openpilot.common.transformations.camera import DEVICE_CAMERAS
|
||||
from openpilot.common.transformations.model import get_warp_matrix
|
||||
from openpilot.system import sentry
|
||||
from openpilot.system.hardware import PC
|
||||
from openpilot.selfdrive.controls.lib.desire_helper import DesireHelper
|
||||
from openpilot.selfdrive.modeld.parse_model_outputs import Parser
|
||||
from openpilot.selfdrive.modeld.fill_model_msg import fill_model_msg, fill_pose_msg, PublishState
|
||||
from openpilot.selfdrive.modeld.constants import ModelConstants
|
||||
from openpilot.selfdrive.modeld.models.commonmodel_pyx import DrivingModelFrame, CLContext
|
||||
|
||||
|
||||
PROCESS_NAME = "selfdrive.modeld.modeld"
|
||||
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
|
||||
|
||||
MODEL_PATH = Path(__file__).parent / 'models/supercombo.onnx'
|
||||
MODEL_PKL_PATH = Path(__file__).parent / 'models/supercombo_tinygrad.pkl'
|
||||
METADATA_PATH = Path(__file__).parent / 'models/supercombo_metadata.pkl'
|
||||
USE_ONNX = bool(os.getenv('USE_ONNX', PC))
|
||||
IS_20HZ_MODEL_DEFAULT = False
|
||||
|
||||
class FrameMeta:
|
||||
frame_id: int = 0
|
||||
@@ -57,79 +48,86 @@ class ModelState:
|
||||
prev_desire: np.ndarray # for tracking the rising edge of the pulse
|
||||
|
||||
def __init__(self, context: CLContext):
|
||||
self.frames = {'input_imgs': DrivingModelFrame(context), 'big_input_imgs': DrivingModelFrame(context)}
|
||||
self.is_20hz = IS_20HZ_MODEL_DEFAULT
|
||||
if (active_20hz := is_active_model_20hz(None)) is not None:
|
||||
self.is_20hz = active_20hz
|
||||
|
||||
self.frames = {'input_imgs': DrivingModelFrame(context, self.is_20hz), 'big_input_imgs': DrivingModelFrame(context, self.is_20hz)}
|
||||
self.prev_desire = np.zeros(ModelConstants.DESIRE_LEN, dtype=np.float32)
|
||||
self.full_features_20Hz = np.zeros((ModelConstants.FULL_HISTORY_BUFFER_LEN, ModelConstants.FEATURE_LEN), dtype=np.float32)
|
||||
self.desire_20Hz = np.zeros((ModelConstants.FULL_HISTORY_BUFFER_LEN + 1, ModelConstants.DESIRE_LEN), dtype=np.float32)
|
||||
# Initialize model runner
|
||||
self.model_runner = ONNXRunner(self.frames) if (not TICI) and USE_ONNX else TinygradRunner(self.frames)
|
||||
|
||||
# img buffers are managed in openCL transform code
|
||||
self.numpy_inputs = {
|
||||
'desire': np.zeros((1, (ModelConstants.HISTORY_BUFFER_LEN+1), ModelConstants.DESIRE_LEN), dtype=np.float32),
|
||||
'traffic_convention': np.zeros((1, ModelConstants.TRAFFIC_CONVENTION_LEN), dtype=np.float32),
|
||||
'features_buffer': np.zeros((1, ModelConstants.HISTORY_BUFFER_LEN, ModelConstants.FEATURE_LEN), dtype=np.float32),
|
||||
}
|
||||
self.numpy_inputs = {}
|
||||
|
||||
with open(METADATA_PATH, 'rb') as f:
|
||||
model_metadata = pickle.load(f)
|
||||
self.input_shapes = model_metadata['input_shapes']
|
||||
for key, shape in self.model_runner.input_shapes.items():
|
||||
if key not in self.frames: # Managed by opencl
|
||||
self.numpy_inputs[key] = np.zeros(shape, dtype=np.float32)
|
||||
|
||||
self.output_slices = model_metadata['output_slices']
|
||||
net_output_size = model_metadata['output_shapes']['outputs'][1]
|
||||
self.output = np.zeros(net_output_size, dtype=np.float32)
|
||||
self.parser = Parser()
|
||||
|
||||
if TICI:
|
||||
self.tensor_inputs = {k: Tensor(v, device='NPY').realize() for k,v in self.numpy_inputs.items()}
|
||||
with open(MODEL_PKL_PATH, "rb") as f:
|
||||
self.model_run = pickle.load(f)
|
||||
else:
|
||||
self.onnx_cpu_runner = make_onnx_cpu_runner(MODEL_PATH)
|
||||
net_output_size = self.model_runner.model_metadata['output_shapes']['outputs'][1]
|
||||
self.output = np.zeros(net_output_size, dtype=np.float32)
|
||||
|
||||
def slice_outputs(self, model_outputs: np.ndarray) -> dict[str, np.ndarray]:
|
||||
parsed_model_outputs = {k: model_outputs[np.newaxis, v] for k,v in self.output_slices.items()}
|
||||
if SEND_RAW_PRED:
|
||||
parsed_model_outputs['raw_pred'] = model_outputs.copy()
|
||||
return parsed_model_outputs
|
||||
num_elements = self.numpy_inputs['features_buffer'].shape[1]
|
||||
step_size = int(-100 / num_elements)
|
||||
self.full_features_20Hz_idxs = np.arange(step_size, step_size * (num_elements + 1), step_size)[::-1]
|
||||
self.desire_reshape_dims = (self.numpy_inputs['desire'].shape[0], self.numpy_inputs['desire'].shape[1], -1, self.numpy_inputs['desire'].shape[2])
|
||||
|
||||
def run(self, buf: VisionBuf, wbuf: VisionBuf, transform: np.ndarray, transform_wide: np.ndarray,
|
||||
inputs: dict[str, np.ndarray], prepare_only: bool) -> dict[str, np.ndarray] | None:
|
||||
inputs: dict[str, np.ndarray], prepare_only: bool) -> dict[str, np.ndarray] | None:
|
||||
# Model decides when action is completed, so desire input is just a pulse triggered on rising edge
|
||||
inputs['desire'][0] = 0
|
||||
new_desire = np.where(inputs['desire'] - self.prev_desire > .99, inputs['desire'], 0)
|
||||
self.prev_desire[:] = inputs['desire']
|
||||
|
||||
self.desire_20Hz[:-1] = self.desire_20Hz[1:]
|
||||
self.desire_20Hz[-1] = new_desire
|
||||
self.numpy_inputs['desire'][:] = self.desire_20Hz.reshape((1,25,4,-1)).max(axis=2)
|
||||
if self.is_20hz:
|
||||
self.desire_20Hz[:-1] = self.desire_20Hz[1:]
|
||||
self.desire_20Hz[-1] = new_desire
|
||||
self.numpy_inputs['desire'][:] = self.desire_20Hz.reshape(self.desire_reshape_dims).max(axis=2)
|
||||
else:
|
||||
self.numpy_inputs['desire'][0,:-1] = self.numpy_inputs['desire'][0,1:]
|
||||
self.numpy_inputs['desire'][0,-1] = new_desire
|
||||
|
||||
for key in self.numpy_inputs:
|
||||
if key in inputs and key not in ['desire']:
|
||||
self.numpy_inputs[key][:] = inputs[key]
|
||||
|
||||
self.numpy_inputs['traffic_convention'][:] = inputs['traffic_convention']
|
||||
imgs_cl = {'input_imgs': self.frames['input_imgs'].prepare(buf, transform.flatten()),
|
||||
'big_input_imgs': self.frames['big_input_imgs'].prepare(wbuf, transform_wide.flatten())}
|
||||
|
||||
if TICI:
|
||||
# The imgs tensors are backed by opencl memory, only need init once
|
||||
for key in imgs_cl:
|
||||
if key not in self.tensor_inputs:
|
||||
self.tensor_inputs[key] = qcom_tensor_from_opencl_address(imgs_cl[key].mem_address, self.input_shapes[key], dtype=dtypes.uint8)
|
||||
else:
|
||||
for key in imgs_cl:
|
||||
self.numpy_inputs[key] = self.frames[key].buffer_from_cl(imgs_cl[key]).reshape(self.input_shapes[key])
|
||||
# Prepare inputs using the model runner
|
||||
self.model_runner.prepare_inputs(imgs_cl, self.numpy_inputs)
|
||||
|
||||
if prepare_only:
|
||||
return None
|
||||
|
||||
if TICI:
|
||||
self.output = self.model_run(**self.tensor_inputs).numpy().flatten()
|
||||
# Run model inference
|
||||
self.output = self.model_runner.run_model()
|
||||
outputs = self.parser.parse_outputs(self.model_runner.slice_outputs(self.output))
|
||||
|
||||
if self.is_20hz:
|
||||
self.full_features_20Hz[:-1] = self.full_features_20Hz[1:]
|
||||
self.full_features_20Hz[-1] = outputs['hidden_state'][0, :]
|
||||
self.numpy_inputs['features_buffer'][:] = self.full_features_20Hz[self.full_features_20Hz_idxs]
|
||||
else:
|
||||
self.output = self.onnx_cpu_runner.run(None, self.numpy_inputs)[0].flatten()
|
||||
self.numpy_inputs['features_buffer'][0,:-1] = self.numpy_inputs['features_buffer'][0,1:]
|
||||
self.numpy_inputs['features_buffer'][0,-1] = outputs['hidden_state'][0, :]
|
||||
|
||||
outputs = self.parser.parse_outputs(self.slice_outputs(self.output))
|
||||
if "desired_curvature" in outputs:
|
||||
input_name_prev = None
|
||||
|
||||
self.full_features_20Hz[:-1] = self.full_features_20Hz[1:]
|
||||
self.full_features_20Hz[-1] = outputs['hidden_state'][0, :]
|
||||
if "prev_desired_curvs" in self.numpy_inputs.keys():
|
||||
input_name_prev = 'prev_desired_curvs'
|
||||
elif "prev_desired_curv" in self.numpy_inputs.keys():
|
||||
input_name_prev = 'prev_desired_curv'
|
||||
|
||||
idxs = np.arange(-4,-100,-4)[::-1]
|
||||
self.numpy_inputs['features_buffer'][:] = self.full_features_20Hz[idxs]
|
||||
if input_name_prev is not None:
|
||||
len = outputs['desired_curvature'][0].size
|
||||
self.numpy_inputs['prev_desired_curv'][0,:-len] = self.numpy_inputs['prev_desired_curv'][0,len:]
|
||||
self.numpy_inputs['prev_desired_curv'][0,-len,:] = outputs['desired_curvature'][0, :]
|
||||
return outputs
|
||||
|
||||
|
||||
@@ -270,7 +268,10 @@ def main(demo=False):
|
||||
inputs:dict[str, np.ndarray] = {
|
||||
'desire': vec_desire,
|
||||
'traffic_convention': traffic_convention,
|
||||
}
|
||||
}
|
||||
|
||||
if "lateral_control_params" in model.numpy_inputs.keys():
|
||||
inputs['lateral_control_params'] = np.array([v_ego, steer_delay], dtype=np.float32)
|
||||
|
||||
mt1 = time.perf_counter()
|
||||
model_output = model.run(buf_main, buf_extra, model_transform_main, model_transform_extra, inputs, prepare_only)
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
#include "common/clutil.h"
|
||||
|
||||
DrivingModelFrame::DrivingModelFrame(cl_device_id device_id, cl_context context) : ModelFrame(device_id, context) {
|
||||
DrivingModelFrame::DrivingModelFrame(cl_device_id device_id, cl_context context, bool is_20hz) : ModelFrame(device_id, context), is_20hz(is_20hz) {
|
||||
input_frames = std::make_unique<uint8_t[]>(buf_size);
|
||||
input_frames_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, buf_size, NULL, &err));
|
||||
img_buffer_20hz_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, 5*frame_size_bytes, NULL, &err));
|
||||
region.origin = 4 * frame_size_bytes;
|
||||
img_buffer_20hz_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, buf_len*frame_size_bytes, NULL, &err));
|
||||
region.origin = (buf_len - 1) * frame_size_bytes;
|
||||
region.size = frame_size_bytes;
|
||||
last_img_cl = CL_CHECK_ERR(clCreateSubBuffer(img_buffer_20hz_cl, CL_MEM_READ_WRITE, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err));
|
||||
|
||||
@@ -20,7 +20,7 @@ DrivingModelFrame::DrivingModelFrame(cl_device_id device_id, cl_context context)
|
||||
cl_mem* DrivingModelFrame::prepare(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3& projection) {
|
||||
run_transform(yuv_cl, MODEL_WIDTH, MODEL_HEIGHT, frame_width, frame_height, frame_stride, frame_uv_offset, projection);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
for (int i = 0; i < (buf_len - 1); i++) {
|
||||
CL_CHECK(clEnqueueCopyBuffer(q, img_buffer_20hz_cl, img_buffer_20hz_cl, (i+1)*frame_size_bytes, i*frame_size_bytes, frame_size_bytes, 0, nullptr, nullptr));
|
||||
}
|
||||
loadyuv_queue(&loadyuv, q, y_cl, u_cl, v_cl, last_img_cl);
|
||||
|
||||
@@ -64,7 +64,7 @@ protected:
|
||||
|
||||
class DrivingModelFrame : public ModelFrame {
|
||||
public:
|
||||
DrivingModelFrame(cl_device_id device_id, cl_context context);
|
||||
DrivingModelFrame(cl_device_id device_id, cl_context context, bool is_20hz = false);
|
||||
~DrivingModelFrame();
|
||||
cl_mem* prepare(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3& projection);
|
||||
|
||||
@@ -74,6 +74,9 @@ public:
|
||||
const int buf_size = MODEL_FRAME_SIZE * 2;
|
||||
const size_t frame_size_bytes = MODEL_FRAME_SIZE * sizeof(uint8_t);
|
||||
|
||||
const bool is_20hz;
|
||||
const int buf_len = is_20hz ? 5 : 2;
|
||||
|
||||
private:
|
||||
LoadYUVState loadyuv;
|
||||
cl_mem img_buffer_20hz_cl, last_img_cl, input_frames_cl;
|
||||
|
||||
@@ -19,7 +19,7 @@ cdef extern from "selfdrive/modeld/models/commonmodel.h":
|
||||
|
||||
cppclass DrivingModelFrame:
|
||||
int buf_size
|
||||
DrivingModelFrame(cl_device_id, cl_context)
|
||||
DrivingModelFrame(cl_device_id, cl_context, bint)
|
||||
|
||||
cppclass MonitoringModelFrame:
|
||||
int buf_size
|
||||
|
||||
@@ -55,8 +55,8 @@ cdef class ModelFrame:
|
||||
cdef class DrivingModelFrame(ModelFrame):
|
||||
cdef cppDrivingModelFrame * _frame
|
||||
|
||||
def __cinit__(self, CLContext context):
|
||||
self._frame = new cppDrivingModelFrame(context.device_id, context.context)
|
||||
def __cinit__(self, CLContext context, bint is_20hz=False):
|
||||
self._frame = new cppDrivingModelFrame(context.device_id, context.context, is_20hz)
|
||||
self.frame = <cppModelFrame*>(self._frame)
|
||||
self.buf_size = self._frame.buf_size
|
||||
|
||||
|
||||
Binary file not shown.
@@ -85,6 +85,7 @@ class Parser:
|
||||
outs[name + '_stds'] = pred_std_final.reshape(final_shape)
|
||||
|
||||
def parse_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
|
||||
""" Parse the model outputs into a dictionary of numpy arrays. The input_keys are used to determine how the output should be parsed. """
|
||||
self.parse_mdn('plan', outs, in_N=ModelConstants.PLAN_MHP_N, out_N=ModelConstants.PLAN_MHP_SELECTION,
|
||||
out_shape=(ModelConstants.IDX_N,ModelConstants.PLAN_WIDTH))
|
||||
self.parse_mdn('lane_lines', outs, in_N=0, out_N=0, out_shape=(ModelConstants.NUM_LANE_LINES,ModelConstants.IDX_N,ModelConstants.LANE_LINES_WIDTH))
|
||||
@@ -96,6 +97,8 @@ class Parser:
|
||||
out_shape=(ModelConstants.LEAD_TRAJ_LEN,ModelConstants.LEAD_WIDTH))
|
||||
if 'lat_planner_solution' in outs:
|
||||
self.parse_mdn('lat_planner_solution', outs, in_N=0, out_N=0, out_shape=(ModelConstants.IDX_N,ModelConstants.LAT_PLANNER_SOLUTION_WIDTH))
|
||||
if 'desired_curvature' in outs:
|
||||
self.parse_mdn('desired_curvature', outs, in_N=0, out_N=0, out_shape=(ModelConstants.DESIRED_CURV_WIDTH,))
|
||||
for k in ['lead_prob', 'lane_lines_prob', 'meta']:
|
||||
self.parse_binary_crossentropy(k, outs)
|
||||
self.parse_categorical_crossentropy('desire_state', outs, out_shape=(ModelConstants.DESIRE_PRED_WIDTH,))
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
import os
|
||||
from openpilot.system.hardware import TICI
|
||||
|
||||
from openpilot.sunnypilot.modeld.run_helpers import get_custom_model_paths
|
||||
#
|
||||
from tinygrad.tensor import Tensor, dtypes
|
||||
from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address
|
||||
from openpilot.selfdrive.modeld.runners.ort_helpers import make_onnx_cpu_runner, ORT_TYPES_TO_NP_TYPES
|
||||
import pickle
|
||||
import numpy as np
|
||||
from pathlib import Path
|
||||
from abc import ABC, abstractmethod
|
||||
from openpilot.selfdrive.modeld.models.commonmodel_pyx import DrivingModelFrame, CLMem
|
||||
from openpilot.system.hardware import PC
|
||||
|
||||
if TICI:
|
||||
os.environ['QCOM'] = '1'
|
||||
|
||||
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
|
||||
MODEL_PATH = Path(__file__).parent / '../models/supercombo.onnx'
|
||||
MODEL_PKL_PATH = Path(__file__).parent / '../models/supercombo_tinygrad.pkl'
|
||||
METADATA_PATH = Path(__file__).parent / '../models/supercombo_metadata.pkl'
|
||||
USE_ONNX = os.getenv('USE_ONNX', PC)
|
||||
|
||||
|
||||
class ModelRunner(ABC):
|
||||
"""Abstract base class for model runners that defines the interface for running ML models."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize the model runner with paths to model and metadata files."""
|
||||
self.model_paths = ({"model": MODEL_PATH, "metadata": METADATA_PATH} if USE_ONNX else
|
||||
get_custom_model_paths() or {"model": MODEL_PKL_PATH, "metadata": METADATA_PATH})
|
||||
|
||||
with open(self.model_paths["metadata"], 'rb') as f:
|
||||
self.model_metadata = pickle.load(f)
|
||||
|
||||
self.input_shapes = self.model_metadata['input_shapes']
|
||||
self.output_slices = self.model_metadata['output_slices']
|
||||
self.inputs: dict = {}
|
||||
|
||||
@abstractmethod
|
||||
def prepare_inputs(self, imgs_cl: dict[str, CLMem], numpy_inputs: dict[str, np.ndarray]) -> dict:
|
||||
"""Prepare inputs for model inference."""
|
||||
|
||||
@abstractmethod
|
||||
def run_model(self):
|
||||
"""Run model inference with prepared inputs."""
|
||||
|
||||
def slice_outputs(self, model_outputs: np.ndarray) -> dict:
|
||||
"""Slice model outputs according to metadata configuration."""
|
||||
parsed_outputs = {k: model_outputs[np.newaxis, v] for k, v in self.output_slices.items()}
|
||||
if SEND_RAW_PRED:
|
||||
parsed_outputs['raw_pred'] = model_outputs.copy()
|
||||
return parsed_outputs
|
||||
|
||||
|
||||
class TinygradRunner(ModelRunner):
|
||||
"""Tinygrad implementation of model runner for TICI hardware."""
|
||||
|
||||
def __init__(self, frames: dict[str, DrivingModelFrame] | None = None):
|
||||
super().__init__()
|
||||
if not str(self.model_paths["model"]).endswith("_tinygrad.pkl"):
|
||||
raise ValueError(f"Tinygrad model must be a _tinygrad.pkl file, we got {self.model_paths['model']}")
|
||||
|
||||
# Load Tinygrad model
|
||||
with open(self.model_paths["model"], "rb") as f:
|
||||
self.model_run = pickle.load(f)
|
||||
|
||||
self.input_to_dtype = {}
|
||||
self.input_to_device = {}
|
||||
|
||||
for idx, name in enumerate(self.model_run.captured.expected_names):
|
||||
self.input_to_dtype[name] = self.model_run.captured.expected_st_vars_dtype_device[idx][2] # 2 is the dtype
|
||||
self.input_to_device[name] = self.model_run.captured.expected_st_vars_dtype_device[idx][3] # 3 is the device
|
||||
|
||||
assert TICI or frames is not None, "TinygradRunner requires frames for non-TICI hardware"
|
||||
self.frames = frames
|
||||
self.is_memory_model = None # Use None to indicate that it hasn't been determined yet
|
||||
|
||||
def prepare_inputs(self, imgs_cl: dict[str, CLMem], numpy_inputs: dict[str, np.ndarray]) -> dict:
|
||||
# Initialize image tensors if not already done
|
||||
for key in imgs_cl:
|
||||
if TICI and key not in self.inputs:
|
||||
self.inputs[key] = qcom_tensor_from_opencl_address(imgs_cl[key].mem_address, self.input_shapes[key], dtype=dtypes.uint8)
|
||||
elif not TICI:
|
||||
shape = self.frames[key].buffer_from_cl(imgs_cl[key]).reshape(self.input_shapes[key])
|
||||
self.inputs[key] = Tensor(shape, device=self.input_to_device[key], dtype=self.input_to_dtype[key]).realize()
|
||||
|
||||
# Update numpy inputs
|
||||
for key, value in numpy_inputs.items():
|
||||
if key not in imgs_cl:
|
||||
self.inputs[key] = Tensor(value, device=self.input_to_device[key], dtype=self.input_to_dtype[key]).realize()
|
||||
|
||||
return self.inputs
|
||||
|
||||
def run_model(self):
|
||||
return self.model_run(**self.inputs).numpy().flatten()
|
||||
|
||||
|
||||
class ONNXRunner(ModelRunner):
|
||||
"""ONNX implementation of model runner for non-TICI hardware."""
|
||||
|
||||
def __init__(self, frames: dict[str, DrivingModelFrame]):
|
||||
super().__init__()
|
||||
self.runner = make_onnx_cpu_runner(self.model_paths["model"])
|
||||
self.frames = frames
|
||||
|
||||
self.input_to_nptype = {
|
||||
model_input.name: ORT_TYPES_TO_NP_TYPES[model_input.type]
|
||||
for model_input in self.runner.get_inputs()
|
||||
}
|
||||
|
||||
def prepare_inputs(self, imgs_cl: dict[str, CLMem], numpy_inputs: dict[str, np.ndarray]) -> dict:
|
||||
self.inputs = numpy_inputs.copy()
|
||||
for key in imgs_cl:
|
||||
self.inputs[key] = self.frames[key].buffer_from_cl(imgs_cl[key]).reshape(self.input_shapes[key]).astype(dtype=np.float32)
|
||||
return self.inputs
|
||||
|
||||
def run_model(self):
|
||||
return self.runner.run(None, self.inputs)[0].flatten()
|
||||
@@ -1 +0,0 @@
|
||||
benchmark
|
||||
@@ -1,192 +0,0 @@
|
||||
#include <SNPE/SNPE.hpp>
|
||||
#include <SNPE/SNPEBuilder.hpp>
|
||||
#include <SNPE/SNPEFactory.hpp>
|
||||
#include <DlContainer/IDlContainer.hpp>
|
||||
#include <DlSystem/DlError.hpp>
|
||||
#include <DlSystem/ITensor.hpp>
|
||||
#include <DlSystem/ITensorFactory.hpp>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int64_t timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p) {
|
||||
return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) - ((timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
|
||||
}
|
||||
|
||||
void PrintErrorStringAndExit() {
|
||||
cout << "ERROR!" << endl;
|
||||
const char* const errStr = zdl::DlSystem::getLastErrorString();
|
||||
std::cerr << errStr << std::endl;
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
zdl::DlSystem::Runtime_t checkRuntime() {
|
||||
static zdl::DlSystem::Version_t Version = zdl::SNPE::SNPEFactory::getLibraryVersion();
|
||||
static zdl::DlSystem::Runtime_t Runtime;
|
||||
std::cout << "SNPE Version: " << Version.asString().c_str() << std::endl; //Print Version number
|
||||
if (zdl::SNPE::SNPEFactory::isRuntimeAvailable(zdl::DlSystem::Runtime_t::DSP)) {
|
||||
std::cout << "Using DSP runtime" << std::endl;
|
||||
Runtime = zdl::DlSystem::Runtime_t::DSP;
|
||||
} else if (zdl::SNPE::SNPEFactory::isRuntimeAvailable(zdl::DlSystem::Runtime_t::GPU)) {
|
||||
std::cout << "Using GPU runtime" << std::endl;
|
||||
Runtime = zdl::DlSystem::Runtime_t::GPU;
|
||||
} else {
|
||||
std::cout << "Using cpu runtime" << std::endl;
|
||||
Runtime = zdl::DlSystem::Runtime_t::CPU;
|
||||
}
|
||||
return Runtime;
|
||||
}
|
||||
|
||||
void test(char *filename) {
|
||||
static zdl::DlSystem::Runtime_t runtime = checkRuntime();
|
||||
std::unique_ptr<zdl::DlContainer::IDlContainer> container;
|
||||
container = zdl::DlContainer::IDlContainer::open(filename);
|
||||
|
||||
if (!container) { PrintErrorStringAndExit(); }
|
||||
cout << "start build" << endl;
|
||||
std::unique_ptr<zdl::SNPE::SNPE> snpe;
|
||||
{
|
||||
snpe = NULL;
|
||||
zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
|
||||
snpe = snpeBuilder.setOutputLayers({})
|
||||
.setRuntimeProcessor(runtime)
|
||||
.setUseUserSuppliedBuffers(false)
|
||||
//.setDebugMode(true)
|
||||
.build();
|
||||
if (!snpe) {
|
||||
cout << "ERROR!" << endl;
|
||||
const char* const errStr = zdl::DlSystem::getLastErrorString();
|
||||
std::cerr << errStr << std::endl;
|
||||
}
|
||||
cout << "ran snpeBuilder" << endl;
|
||||
}
|
||||
|
||||
const auto &strList_opt = snpe->getInputTensorNames();
|
||||
if (!strList_opt) throw std::runtime_error("Error obtaining input tensor names");
|
||||
|
||||
cout << "get input tensor names done" << endl;
|
||||
const auto &strList = *strList_opt;
|
||||
static zdl::DlSystem::TensorMap inputTensorMap;
|
||||
static zdl::DlSystem::TensorMap outputTensorMap;
|
||||
vector<std::unique_ptr<zdl::DlSystem::ITensor> > inputs;
|
||||
for (int i = 0; i < strList.size(); i++) {
|
||||
cout << "input name: " << strList.at(i) << endl;
|
||||
|
||||
const auto &inputDims_opt = snpe->getInputDimensions(strList.at(i));
|
||||
const auto &inputShape = *inputDims_opt;
|
||||
inputs.push_back(zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputShape));
|
||||
inputTensorMap.add(strList.at(i), inputs[i].get());
|
||||
}
|
||||
|
||||
struct timespec start, end;
|
||||
cout << "**** starting benchmark ****" << endl;
|
||||
for (int i = 0; i < 50; i++) {
|
||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||
int err = snpe->execute(inputTensorMap, outputTensorMap);
|
||||
assert(err == true);
|
||||
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||
uint64_t timeElapsed = timespecDiff(&end, &start);
|
||||
printf("time: %f ms\n", timeElapsed*1.0/1e6);
|
||||
}
|
||||
}
|
||||
|
||||
void get_testframe(int index, std::unique_ptr<zdl::DlSystem::ITensor> &input) {
|
||||
FILE * pFile;
|
||||
string filepath="/data/ipt/quantize_samples/sample_input_"+std::to_string(index);
|
||||
pFile = fopen(filepath.c_str(), "rb");
|
||||
int length = 1*6*160*320*4;
|
||||
float * frame_buffer = new float[length/4]; // 32/8
|
||||
fread(frame_buffer, length, 1, pFile);
|
||||
// std::cout << *(frame_buffer+length/4-1) << std::endl;
|
||||
std::copy(frame_buffer, frame_buffer+(length/4), input->begin());
|
||||
fclose(pFile);
|
||||
}
|
||||
|
||||
void SaveITensor(const std::string& path, const zdl::DlSystem::ITensor* tensor)
|
||||
{
|
||||
std::ofstream os(path, std::ofstream::binary);
|
||||
if (!os)
|
||||
{
|
||||
std::cerr << "Failed to open output file for writing: " << path << "\n";
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
for ( auto it = tensor->cbegin(); it != tensor->cend(); ++it )
|
||||
{
|
||||
float f = *it;
|
||||
if (!os.write(reinterpret_cast<char*>(&f), sizeof(float)))
|
||||
{
|
||||
std::cerr << "Failed to write data to: " << path << "\n";
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void testrun(char* modelfile) {
|
||||
static zdl::DlSystem::Runtime_t runtime = checkRuntime();
|
||||
std::unique_ptr<zdl::DlContainer::IDlContainer> container;
|
||||
container = zdl::DlContainer::IDlContainer::open(modelfile);
|
||||
|
||||
if (!container) { PrintErrorStringAndExit(); }
|
||||
cout << "start build" << endl;
|
||||
std::unique_ptr<zdl::SNPE::SNPE> snpe;
|
||||
{
|
||||
snpe = NULL;
|
||||
zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
|
||||
snpe = snpeBuilder.setOutputLayers({})
|
||||
.setRuntimeProcessor(runtime)
|
||||
.setUseUserSuppliedBuffers(false)
|
||||
//.setDebugMode(true)
|
||||
.build();
|
||||
if (!snpe) {
|
||||
cout << "ERROR!" << endl;
|
||||
const char* const errStr = zdl::DlSystem::getLastErrorString();
|
||||
std::cerr << errStr << std::endl;
|
||||
}
|
||||
cout << "ran snpeBuilder" << endl;
|
||||
}
|
||||
|
||||
const auto &strList_opt = snpe->getInputTensorNames();
|
||||
if (!strList_opt) throw std::runtime_error("Error obtaining input tensor names");
|
||||
cout << "get input tensor names done" << endl;
|
||||
|
||||
const auto &strList = *strList_opt;
|
||||
static zdl::DlSystem::TensorMap inputTensorMap;
|
||||
static zdl::DlSystem::TensorMap outputTensorMap;
|
||||
|
||||
assert(strList.size() == 1);
|
||||
const auto &inputDims_opt = snpe->getInputDimensions(strList.at(0));
|
||||
const auto &inputShape = *inputDims_opt;
|
||||
std::cout << "winkwink" << std::endl;
|
||||
|
||||
for (int i=0; i<10000; i++) {
|
||||
std::unique_ptr<zdl::DlSystem::ITensor> input;
|
||||
input = zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputShape);
|
||||
get_testframe(i, input);
|
||||
snpe->execute(input.get(), outputTensorMap);
|
||||
zdl::DlSystem::StringList tensorNames = outputTensorMap.getTensorNames();
|
||||
std::for_each(tensorNames.begin(), tensorNames.end(), [&](const char* name) {
|
||||
std::ostringstream path;
|
||||
path << "/data/opt/Result_" << std::to_string(i) << ".raw";
|
||||
auto tensorPtr = outputTensorMap.getTensor(name);
|
||||
SaveITensor(path.str(), tensorPtr);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc < 2) {
|
||||
printf("usage: %s <filename>\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (argc == 2) {
|
||||
while (true) test(argv[1]);
|
||||
} else if (argc == 3) {
|
||||
testrun(argv[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
clang++ -I /data/openpilot/third_party/snpe/include/ -L/data/pythonpath/third_party/snpe/aarch64 -lSNPE benchmark.cc -o benchmark
|
||||
export LD_LIBRARY_PATH="/data/pythonpath/third_party/snpe/aarch64/:$HOME/openpilot/third_party/snpe/x86_64/:$LD_LIBRARY_PATH"
|
||||
exec ./benchmark $1
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import signal
|
||||
import subprocess
|
||||
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
signal.signal(signal.SIGTERM, signal.SIG_DFL)
|
||||
|
||||
from PyQt5.QtCore import QTimer
|
||||
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
|
||||
from openpilot.selfdrive.ui.qt.python_helpers import set_main_window
|
||||
|
||||
class Window(QWidget):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.setLayout(layout)
|
||||
|
||||
self.l = QLabel("jenkins runner")
|
||||
layout.addWidget(self.l)
|
||||
layout.addStretch(1)
|
||||
layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
cmds = [
|
||||
"cat /etc/hostname",
|
||||
"echo AGNOS v$(cat /VERSION)",
|
||||
"uptime -p",
|
||||
]
|
||||
self.labels = {}
|
||||
for c in cmds:
|
||||
self.labels[c] = QLabel(c)
|
||||
layout.addWidget(self.labels[c])
|
||||
|
||||
self.setStyleSheet("""
|
||||
* {
|
||||
color: white;
|
||||
font-size: 55px;
|
||||
background-color: black;
|
||||
font-family: "JetBrains Mono";
|
||||
}
|
||||
""")
|
||||
|
||||
self.timer = QTimer()
|
||||
self.timer.timeout.connect(self.update)
|
||||
self.timer.start(10 * 1000)
|
||||
self.update()
|
||||
|
||||
def update(self):
|
||||
for cmd, label in self.labels.items():
|
||||
out = subprocess.run(cmd, capture_output=True,
|
||||
shell=True, check=False, encoding='utf8').stdout
|
||||
label.setText(out.strip())
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication([])
|
||||
w = Window()
|
||||
set_main_window(w)
|
||||
app.exec_()
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "Usage: $0 <base|docs|sim|prebuilt|cl> <arch1> <arch2> ..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SCRIPT_DIR=$(dirname "$0")
|
||||
ARCHS=("${@:2}")
|
||||
|
||||
source $SCRIPT_DIR/docker_common.sh $1
|
||||
|
||||
MANIFEST_AMENDS=""
|
||||
for ARCH in ${ARCHS[@]}; do
|
||||
MANIFEST_AMENDS="$MANIFEST_AMENDS --amend $REMOTE_TAG-$ARCH:$COMMIT_SHA"
|
||||
done
|
||||
|
||||
docker manifest create $REMOTE_TAG $MANIFEST_AMENDS
|
||||
docker manifest create $REMOTE_SHA_TAG $MANIFEST_AMENDS
|
||||
|
||||
if [[ -n "$PUSH_IMAGE" ]]; then
|
||||
docker manifest push $REMOTE_TAG
|
||||
docker manifest push $REMOTE_SHA_TAG
|
||||
fi
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# Loop something forever until it fails, for verifying new tests
|
||||
|
||||
while true; do
|
||||
$@
|
||||
done
|
||||
@@ -1 +0,0 @@
|
||||
707434c540e685bbe2886b3ff7c82fd61939d362
|
||||
@@ -57,7 +57,7 @@ def generate_report(proposed, master, tmp, commit):
|
||||
(lambda x: x.action.desiredCurvature, "desiredCurvature"),
|
||||
(lambda x: x.leadsV3[0].x[0], "leadsV3.x"),
|
||||
(lambda x: x.laneLines[1].y[0], "laneLines.y"),
|
||||
(lambda x: x.meta.disengagePredictions.gasPressProbs[1], "gasPressProbs")
|
||||
#(lambda x: x.meta.disengagePredictions.gasPressProbs[1], "gasPressProbs")
|
||||
], "modelV2")
|
||||
DriverStateV2_Plots = zl([
|
||||
(lambda x: x.wheelOnRightProb, "wheelOnRightProb"),
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
import os
|
||||
import numpy as np
|
||||
import hashlib
|
||||
|
||||
import pyopencl as cl # install with `PYOPENCL_CL_PRETEND_VERSION=2.0 pip install pyopencl`
|
||||
|
||||
from openpilot.system.hardware import PC, TICI
|
||||
from openpilot.common.basedir import BASEDIR
|
||||
from openpilot.common.transformations.camera import DEVICE_CAMERAS
|
||||
from openpilot.system.camerad.snapshot.snapshot import yuv_to_rgb
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
|
||||
# TODO: check all sensors
|
||||
TEST_ROUTE = "8345e3b82948d454|2022-05-04--13-45-33/0"
|
||||
|
||||
cam = DEVICE_CAMERAS[("tici", "ar0231")]
|
||||
FRAME_WIDTH, FRAME_HEIGHT = (cam.dcam.width, cam.dcam.height)
|
||||
FRAME_STRIDE = FRAME_WIDTH * 12 // 8 + 4
|
||||
|
||||
UV_WIDTH = FRAME_WIDTH // 2
|
||||
UV_HEIGHT = FRAME_HEIGHT // 2
|
||||
UV_SIZE = UV_WIDTH * UV_HEIGHT
|
||||
|
||||
|
||||
def init_kernels(frame_offset=0):
|
||||
ctx = cl.create_some_context(interactive=False)
|
||||
|
||||
with open(os.path.join(BASEDIR, 'system/camerad/cameras/process_raw.cl')) as f:
|
||||
build_args = f' -cl-fast-relaxed-math -cl-denorms-are-zero -cl-single-precision-constant -I{BASEDIR}/system/camerad/sensors ' + \
|
||||
f' -DFRAME_WIDTH={FRAME_WIDTH} -DFRAME_HEIGHT={FRAME_WIDTH} -DFRAME_STRIDE={FRAME_STRIDE} -DFRAME_OFFSET={frame_offset} ' + \
|
||||
f' -DRGB_WIDTH={FRAME_WIDTH} -DRGB_HEIGHT={FRAME_HEIGHT} -DYUV_STRIDE={FRAME_WIDTH} -DUV_OFFSET={FRAME_WIDTH*FRAME_HEIGHT}' + \
|
||||
' -DSENSOR_ID=1 -DVIGNETTING=0 '
|
||||
if PC:
|
||||
build_args += ' -DHALF_AS_FLOAT=1 -cl-std=CL2.0'
|
||||
imgproc_prg = cl.Program(ctx, f.read()).build(options=build_args)
|
||||
|
||||
return ctx, imgproc_prg
|
||||
|
||||
def proc_frame(ctx, imgproc_prg, data, rgb=False):
|
||||
q = cl.CommandQueue(ctx)
|
||||
|
||||
yuv_buff = np.empty(FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2, dtype=np.uint8)
|
||||
|
||||
cam_g = cl.Buffer(ctx, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=data)
|
||||
yuv_g = cl.Buffer(ctx, cl.mem_flags.WRITE_ONLY, FRAME_WIDTH * FRAME_HEIGHT + UV_SIZE * 2)
|
||||
|
||||
krn = imgproc_prg.process_raw
|
||||
krn.set_scalar_arg_dtypes([None, None, np.int32])
|
||||
local_worksize = (20, 20) if TICI else (4, 4)
|
||||
|
||||
ev1 = krn(q, (FRAME_WIDTH//2, FRAME_HEIGHT//2), local_worksize, cam_g, yuv_g, 1)
|
||||
cl.enqueue_copy(q, yuv_buff, yuv_g, wait_for=[ev1]).wait()
|
||||
cl.enqueue_barrier(q)
|
||||
|
||||
y = yuv_buff[:FRAME_WIDTH*FRAME_HEIGHT].reshape((FRAME_HEIGHT, FRAME_WIDTH))
|
||||
u = yuv_buff[FRAME_WIDTH*FRAME_HEIGHT::2].reshape((UV_HEIGHT, UV_WIDTH))
|
||||
v = yuv_buff[FRAME_WIDTH*FRAME_HEIGHT+1::2].reshape((UV_HEIGHT, UV_WIDTH))
|
||||
|
||||
if rgb:
|
||||
return yuv_to_rgb(y, u, v)
|
||||
else:
|
||||
return y, u, v
|
||||
|
||||
|
||||
def imgproc_replay(lr):
|
||||
ctx, imgproc_prg = init_kernels()
|
||||
|
||||
frames = []
|
||||
for m in lr:
|
||||
if m.which() == 'roadCameraState':
|
||||
cs = m.roadCameraState
|
||||
if cs.image:
|
||||
data = np.frombuffer(cs.image, dtype=np.uint8)
|
||||
img = proc_frame(ctx, imgproc_prg, data)
|
||||
|
||||
frames.append(img)
|
||||
|
||||
return frames
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# load logs
|
||||
lr = list(LogReader(TEST_ROUTE))
|
||||
# run replay
|
||||
out_frames = imgproc_replay(lr)
|
||||
|
||||
all_pix = np.concatenate([np.concatenate([d.flatten() for d in f]) for f in out_frames])
|
||||
pix_hash = hashlib.sha1(all_pix).hexdigest()
|
||||
|
||||
with open('imgproc_replay_ref_hash') as f:
|
||||
ref_hash = f.read()
|
||||
|
||||
if pix_hash != ref_hash:
|
||||
print("result changed! please check kernel")
|
||||
print(f"ref: {ref_hash}")
|
||||
print(f"new: {pix_hash}")
|
||||
else:
|
||||
print("test passed")
|
||||
@@ -1,2 +0,0 @@
|
||||
cachegrind.out.*
|
||||
*.prof
|
||||
@@ -1,91 +0,0 @@
|
||||
from collections import defaultdict
|
||||
from cereal.services import SERVICE_LIST
|
||||
import cereal.messaging as messaging
|
||||
import capnp
|
||||
|
||||
|
||||
class ReplayDone(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class SubSocket:
|
||||
def __init__(self, msgs, trigger):
|
||||
self.i = 0
|
||||
self.trigger = trigger
|
||||
self.msgs = [m.as_builder().to_bytes() for m in msgs if m.which() == trigger]
|
||||
self.max_i = len(self.msgs) - 1
|
||||
|
||||
def receive(self, non_blocking=False):
|
||||
if non_blocking:
|
||||
return None
|
||||
|
||||
if self.i == self.max_i:
|
||||
raise ReplayDone
|
||||
|
||||
while True:
|
||||
msg = self.msgs[self.i]
|
||||
self.i += 1
|
||||
return msg
|
||||
|
||||
|
||||
class PubSocket:
|
||||
def send(self, data):
|
||||
pass
|
||||
|
||||
|
||||
class SubMaster(messaging.SubMaster):
|
||||
def __init__(self, msgs, trigger, services, check_averag_freq=False):
|
||||
self.frame = 0
|
||||
self.data = {}
|
||||
self.ignore_alive = []
|
||||
|
||||
self.alive = {s: True for s in services}
|
||||
self.updated = {s: False for s in services}
|
||||
self.rcv_time = {s: 0. for s in services}
|
||||
self.rcv_frame = {s: 0 for s in services}
|
||||
self.valid = {s: True for s in services}
|
||||
self.freq_ok = {s: True for s in services}
|
||||
self.freq_tracker = {s: messaging.FrequencyTracker(SERVICE_LIST[s].frequency, SERVICE_LIST[s].frequency, False) for s in services}
|
||||
self.logMonoTime = {}
|
||||
self.sock = {}
|
||||
self.freq = {}
|
||||
self.check_average_freq = check_averag_freq
|
||||
self.non_polled_services = []
|
||||
self.ignore_average_freq = []
|
||||
|
||||
# TODO: specify multiple triggers for service like plannerd that poll on more than one service
|
||||
cur_msgs = []
|
||||
self.msgs = []
|
||||
msgs = [m for m in msgs if m.which() in services]
|
||||
|
||||
for msg in msgs:
|
||||
cur_msgs.append(msg)
|
||||
if msg.which() == trigger:
|
||||
self.msgs.append(cur_msgs)
|
||||
cur_msgs = []
|
||||
|
||||
self.msgs = list(reversed(self.msgs))
|
||||
|
||||
for s in services:
|
||||
self.freq[s] = SERVICE_LIST[s].frequency
|
||||
try:
|
||||
data = messaging.new_message(s)
|
||||
except capnp.lib.capnp.KjException:
|
||||
# lists
|
||||
data = messaging.new_message(s, 0)
|
||||
|
||||
self.data[s] = getattr(data, s)
|
||||
self.logMonoTime[s] = 0
|
||||
self.sock[s] = SubSocket(msgs, s)
|
||||
|
||||
def update(self, timeout=None):
|
||||
if not len(self.msgs):
|
||||
raise ReplayDone
|
||||
|
||||
cur_msgs = self.msgs.pop()
|
||||
self.update_msgs(cur_msgs[0].logMonoTime, self.msgs.pop())
|
||||
|
||||
|
||||
class PubMaster(messaging.PubMaster):
|
||||
def __init__(self):
|
||||
self.sock = defaultdict(PubSocket)
|
||||
@@ -1,97 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import sys
|
||||
import cProfile
|
||||
import pprofile
|
||||
import pyprof2calltree
|
||||
|
||||
from opendbc.car.toyota.values import CAR as TOYOTA
|
||||
from opendbc.car.honda.values import CAR as HONDA
|
||||
from opendbc.car.volkswagen.values import CAR as VW
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.tools.lib.logreader import LogReader
|
||||
from openpilot.selfdrive.test.profiling.lib import SubMaster, PubMaster, SubSocket, ReplayDone
|
||||
from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS
|
||||
|
||||
BASE_URL = "https://commadataci.blob.core.windows.net/openpilotci/"
|
||||
|
||||
CARS = {
|
||||
'toyota': ("0982d79ebb0de295|2021-01-03--20-03-36/6", TOYOTA.TOYOTA_RAV4),
|
||||
'honda': ("0982d79ebb0de295|2021-01-08--10-13-10/6", HONDA.HONDA_CIVIC),
|
||||
"vw": ("ef895f46af5fd73f|2021-05-22--14-06-35/6", VW.AUDI_A3_MK3),
|
||||
}
|
||||
|
||||
|
||||
def get_inputs(msgs, process, fingerprint):
|
||||
for config in CONFIGS:
|
||||
if config.proc_name == process:
|
||||
sub_socks = list(config.pubs)
|
||||
trigger = sub_socks[0]
|
||||
break
|
||||
|
||||
# some procs block on CarParams
|
||||
for msg in msgs:
|
||||
if msg.which() == 'carParams':
|
||||
m = msg.as_builder()
|
||||
m.carParams.carFingerprint = fingerprint
|
||||
Params().put("CarParams", m.carParams.copy().to_bytes())
|
||||
break
|
||||
|
||||
sm = SubMaster(msgs, trigger, sub_socks)
|
||||
pm = PubMaster()
|
||||
if 'can' in sub_socks:
|
||||
can_sock = SubSocket(msgs, 'can')
|
||||
else:
|
||||
can_sock = None
|
||||
return sm, pm, can_sock
|
||||
|
||||
|
||||
def profile(proc, func, car='toyota'):
|
||||
segment, fingerprint = CARS[car]
|
||||
segment = segment.replace('|', '/')
|
||||
rlog_url = f"{BASE_URL}{segment}/rlog.bz2"
|
||||
msgs = list(LogReader(rlog_url)) * int(os.getenv("LOOP", "1"))
|
||||
|
||||
os.environ['FINGERPRINT'] = fingerprint
|
||||
os.environ['SKIP_FW_QUERY'] = "1"
|
||||
os.environ['REPLAY'] = "1"
|
||||
|
||||
def run(sm, pm, can_sock):
|
||||
try:
|
||||
if can_sock is not None:
|
||||
func(sm, pm, can_sock)
|
||||
else:
|
||||
func(sm, pm)
|
||||
except ReplayDone:
|
||||
pass
|
||||
|
||||
# Statistical
|
||||
sm, pm, can_sock = get_inputs(msgs, proc, fingerprint)
|
||||
with pprofile.StatisticalProfile()(period=0.00001) as pr:
|
||||
run(sm, pm, can_sock)
|
||||
pr.dump_stats(f'cachegrind.out.{proc}_statistical')
|
||||
|
||||
# Deterministic
|
||||
sm, pm, can_sock = get_inputs(msgs, proc, fingerprint)
|
||||
with cProfile.Profile() as pr:
|
||||
run(sm, pm, can_sock)
|
||||
pyprof2calltree.convert(pr.getstats(), f'cachegrind.out.{proc}_deterministic')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from openpilot.selfdrive.controls.controlsd import main as controlsd_thread
|
||||
from openpilot.selfdrive.locationd.paramsd import main as paramsd_thread
|
||||
from openpilot.selfdrive.controls.plannerd import main as plannerd_thread
|
||||
|
||||
procs = {
|
||||
'controlsd': controlsd_thread,
|
||||
'paramsd': paramsd_thread,
|
||||
'plannerd': plannerd_thread,
|
||||
}
|
||||
|
||||
proc = sys.argv[1]
|
||||
if proc not in procs:
|
||||
print(f"{proc} not available")
|
||||
sys.exit(0)
|
||||
else:
|
||||
profile(proc, procs[proc])
|
||||
@@ -83,8 +83,6 @@ void SoftwarePanelSP::handleBundleDownloadProgress() {
|
||||
if (bundle.getStatus() == cereal::ModelManagerSP::DownloadStatus::DOWNLOADING) {
|
||||
currentModelLblBtn->showDescription();
|
||||
}
|
||||
|
||||
currentModelLblBtn->setEnabled(!is_onroad && !isDownloading());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,7 +126,6 @@ void SoftwarePanelSP::handleCurrentModelLblBtnClicked() {
|
||||
bundleNames.append(index_to_bundle[index]);
|
||||
}
|
||||
|
||||
currentModelLblBtn->setEnabled(!is_onroad);
|
||||
currentModelLblBtn->setValue(GetActiveModelName());
|
||||
|
||||
const QString selectedBundleName = MultiOptionDialog::getSelection(
|
||||
@@ -161,6 +158,7 @@ void SoftwarePanelSP::updateLabels() {
|
||||
}
|
||||
|
||||
handleBundleDownloadProgress();
|
||||
currentModelLblBtn->setEnabled(!is_onroad && !isDownloading());
|
||||
currentModelLblBtn->setValue(GetActiveModelName());
|
||||
SoftwarePanel::updateLabels();
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ private:
|
||||
const SubMaster &sm = *(uiStateSP()->sm);
|
||||
const auto model_manager = sm["modelManagerSP"].getModelManagerSP();
|
||||
|
||||
if (!model_manager.hasSelectedBundle()) {
|
||||
if (!model_manager.hasSelectedBundle() || !sm.updated("modelManagerSP")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
|
||||
#
|
||||
# This file is part of sunnypilot and is licensed under the MIT License.
|
||||
# See the LICENSE.md file in the root directory for more details.
|
||||
|
||||
import pickle
|
||||
import numpy as np
|
||||
from pathlib import Path
|
||||
from cereal import custom
|
||||
from openpilot.sunnypilot.models.helpers import get_active_bundle
|
||||
from openpilot.system.hardware.hw import Paths
|
||||
|
||||
CUSTOM_MODEL_PATH = Paths.model_root()
|
||||
METADATA_PATH = Path(__file__).parent / '../models/supercombo_metadata.pkl'
|
||||
|
||||
ModelManager = custom.ModelManagerSP
|
||||
|
||||
|
||||
def get_custom_model_paths():
|
||||
bundle = get_active_bundle(None)
|
||||
if bundle:
|
||||
drive_model = next((model for model in bundle.models if model.type == ModelManager.Type.drive), None)
|
||||
metadata_model = next(model for model in bundle.models if model.type == ModelManager.Type.metadata)
|
||||
if drive_model and metadata_model:
|
||||
return {"model": f"{CUSTOM_MODEL_PATH}/{drive_model.fileName}", "metadata": f"{CUSTOM_MODEL_PATH}/{metadata_model.fileName}"}
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def load_custom_metadata():
|
||||
if not (bundle := get_active_bundle(None)):
|
||||
return None
|
||||
|
||||
metadata_model = next(model for model in bundle.models if model.type == ModelManager.Type.metadata)
|
||||
metadata_path = f"{CUSTOM_MODEL_PATH}/{metadata_model.fileName}"
|
||||
with open(metadata_path, 'rb') as f:
|
||||
return pickle.load(f)
|
||||
|
||||
|
||||
def prepare_inputs(model_metadata) -> dict[str, np.ndarray]:
|
||||
# img buffers are managed in openCL transform code so we don't pass them as inputs
|
||||
inputs: dict[str, np.ndarray] = {
|
||||
key: np.zeros(shape, dtype=np.float32).flatten() # Inputs were defined flattened back then
|
||||
for key, shape in model_metadata['input_shapes'].items()
|
||||
if key not in ['input_imgs', 'big_input_imgs']
|
||||
}
|
||||
|
||||
return inputs
|
||||
@@ -71,6 +71,7 @@ class ModelParser:
|
||||
model_bundle.status = 0
|
||||
model_bundle.generation = int(value["generation"])
|
||||
model_bundle.environment = value["environment"]
|
||||
model_bundle.is20hz = value.get("is_20hz", False)
|
||||
|
||||
return model_bundle
|
||||
|
||||
|
||||
@@ -21,8 +21,25 @@ async def verify_file(file_path: str, expected_hash: str) -> bool:
|
||||
|
||||
return sha256_hash.hexdigest().lower() == expected_hash.lower()
|
||||
|
||||
def get_active_bundle(params: Params) -> custom.ModelManagerSP.ModelBundle:
|
||||
"""Gets the active model bundle from cache"""
|
||||
|
||||
def get_active_bundle(params: Params | None) -> custom.ModelManagerSP.ModelBundle:
|
||||
"""
|
||||
Retrieves and deserializes the active model bundle from the provided parameters.
|
||||
|
||||
This function attempts to extract and deserialize a model bundle from the given
|
||||
`params`. If the parameter `ModelManager_ActiveBundle` is present, it is
|
||||
deserialized into a `ModelBundle` object. If not, the function returns `None`.
|
||||
|
||||
Note: We intentionally don't set a default value for `params` to encourage
|
||||
the caller to provide it explicitly. If not provided, the function will
|
||||
instantiate a new `Params` object internally.
|
||||
|
||||
:param params: Optional. Can provide None and will instantiate it itself.
|
||||
:type params: Params | None
|
||||
:return: A deserialized `ModelBundle` instance if the active bundle
|
||||
is found in the provided parameters, otherwise `None`.
|
||||
:rtype: custom.ModelManagerSP.ModelBundle | None
|
||||
"""
|
||||
if params is None:
|
||||
params = Params()
|
||||
|
||||
@@ -30,3 +47,26 @@ def get_active_bundle(params: Params) -> custom.ModelManagerSP.ModelBundle:
|
||||
return messaging.log_from_bytes(active_bundle, custom.ModelManagerSP.ModelBundle)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def is_active_model_20hz(params: Params | None) -> [bool | None]:
|
||||
"""
|
||||
Determine if the active model is operating at 20Hz.
|
||||
|
||||
This function evaluates the provided parameters to determine the active
|
||||
bundle and checks its frequency status. If there is no active bundle,
|
||||
the function will return None. If a bundle is active, the function will
|
||||
return a boolean value indicating whether the model is operating at
|
||||
20Hz.
|
||||
|
||||
:param params: System or configuration parameters used to fetch the
|
||||
active bundle. The parameter can be None.
|
||||
:type params: Params | None
|
||||
:return: A boolean indicating if the active model is operating at 20Hz,
|
||||
or None if no active bundle is found.
|
||||
:rtype: bool | None
|
||||
"""
|
||||
if active_bundle := get_active_bundle(params):
|
||||
return active_bundle.is20hz
|
||||
|
||||
return None
|
||||
|
||||
@@ -14,7 +14,7 @@ from openpilot.system.hardware.hw import Paths
|
||||
API_HOST = os.getenv('SUNNYLINK_API_HOST', 'https://stg.api.sunnypilot.ai')
|
||||
UNREGISTERED_SUNNYLINK_DONGLE_ID = "UnregisteredDevice"
|
||||
MAX_RETRIES = 6
|
||||
CRASH_LOG_DIR = '/data/community/crashes'
|
||||
CRASH_LOG_DIR = Paths.crash_log_root()
|
||||
|
||||
|
||||
class SunnylinkApi(BaseApi):
|
||||
|
||||
@@ -33,20 +33,17 @@ def register(show_spinner=False) -> str | None:
|
||||
"""
|
||||
params = Params()
|
||||
|
||||
IMEI = params.get("IMEI", encoding='utf8')
|
||||
HardwareSerial = params.get("HardwareSerial", encoding='utf8')
|
||||
dongle_id: str | None = params.get("DongleId", encoding='utf8')
|
||||
if dongle_id is None and Path(Paths.persist_root()+"/comma/dongle_id").is_file():
|
||||
# not all devices will have this; added early in comma 3X production (2/28/24)
|
||||
with open(Paths.persist_root()+"/comma/dongle_id") as f:
|
||||
dongle_id = f.read().strip()
|
||||
|
||||
needs_registration = None in (IMEI, HardwareSerial, dongle_id)
|
||||
pubkey = Path(Paths.persist_root()+"/comma/id_rsa.pub")
|
||||
if not pubkey.is_file():
|
||||
dongle_id = UNREGISTERED_DONGLE_ID
|
||||
cloudlog.warning(f"missing public key: {pubkey}")
|
||||
elif needs_registration:
|
||||
elif dongle_id is None:
|
||||
if show_spinner:
|
||||
spinner = Spinner()
|
||||
spinner.update("registering device")
|
||||
@@ -71,9 +68,6 @@ def register(show_spinner=False) -> str | None:
|
||||
if time.monotonic() - start_time > 60 and show_spinner:
|
||||
spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})")
|
||||
|
||||
params.put("IMEI", imei1)
|
||||
params.put("HardwareSerial", serial)
|
||||
|
||||
backoff = 0
|
||||
start_time = time.monotonic()
|
||||
while True:
|
||||
|
||||
@@ -32,8 +32,6 @@ class TestRegistration:
|
||||
def test_valid_cache(self, mocker):
|
||||
# if all params are written, return the cached dongle id.
|
||||
# should work with a dongle ID on either /persist/ or normal params
|
||||
self.params.put("IMEI", "imei")
|
||||
self.params.put("HardwareSerial", "serial")
|
||||
self._generate_keys()
|
||||
|
||||
dongle = "DONGLE_ID_123"
|
||||
|
||||
@@ -70,3 +70,10 @@ class Paths:
|
||||
return str(Path(Paths.comma_home()) / "media" / "0" / "models")
|
||||
else:
|
||||
return "/data/media/0/models"
|
||||
|
||||
@staticmethod
|
||||
def crash_log_root() -> str:
|
||||
if PC:
|
||||
return str(Path(Paths.comma_home()) / "community" / "crashes")
|
||||
else:
|
||||
return "/data/community/crashes"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
@@ -22,7 +23,7 @@ public:
|
||||
|
||||
static std::string get_name() {
|
||||
std::string model = util::read_file("/sys/firmware/devicetree/base/model");
|
||||
return model.substr(std::string("comma ").size());
|
||||
return util::strip(model.substr(std::string("comma ").size()));
|
||||
}
|
||||
|
||||
static cereal::InitData::DeviceType get_device_type() {
|
||||
@@ -32,7 +33,8 @@ public:
|
||||
{"mici", cereal::InitData::DeviceType::MICI}
|
||||
};
|
||||
auto it = device_map.find(get_name());
|
||||
return it != device_map.end() ? it->second : cereal::InitData::DeviceType::UNKNOWN;
|
||||
assert(it != device_map.end());
|
||||
return it->second;
|
||||
}
|
||||
|
||||
static int get_voltage() { return std::atoi(util::read_file("/sys/class/hwmon/hwmon1/in1_input").c_str()); }
|
||||
@@ -82,17 +84,17 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
percent = std::clamp(percent, 0, 100);
|
||||
int value = util::map_val(std::clamp(percent, 0, 100), 0, 100, 0, 255);
|
||||
|
||||
std::ofstream torch_brightness("/sys/class/leds/led:torch_2/brightness");
|
||||
if (torch_brightness.is_open()) {
|
||||
torch_brightness << percent << "\n";
|
||||
torch_brightness << value << "\n";
|
||||
torch_brightness.close();
|
||||
}
|
||||
|
||||
std::ofstream switch_brightness("/sys/class/leds/led:switch_2/brightness");
|
||||
if (switch_brightness.is_open()) {
|
||||
switch_brightness << percent << "\n";
|
||||
switch_brightness << value << "\n";
|
||||
switch_brightness.close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,8 @@ def manager_init() -> None:
|
||||
except PermissionError:
|
||||
print(f"WARNING: failed to make {Paths.shm_path()}")
|
||||
|
||||
# set version params
|
||||
# set params
|
||||
serial = HARDWARE.get_serial()
|
||||
params.put("Version", build_metadata.openpilot.version)
|
||||
params.put("TermsVersion", terms_version)
|
||||
params.put("TrainingVersion", training_version)
|
||||
@@ -77,13 +78,13 @@ def manager_init() -> None:
|
||||
params.put("GitRemote", build_metadata.openpilot.git_origin)
|
||||
params.put_bool("IsTestedBranch", build_metadata.tested_channel)
|
||||
params.put_bool("IsReleaseBranch", build_metadata.release_channel)
|
||||
params.put("HardwareSerial", serial)
|
||||
|
||||
# set dongle id
|
||||
reg_res = register(show_spinner=True)
|
||||
if reg_res:
|
||||
dongle_id = reg_res
|
||||
else:
|
||||
serial = params.get("HardwareSerial")
|
||||
raise Exception(f"Registration failed for device {serial}")
|
||||
os.environ['DONGLE_ID'] = dongle_id # Needed for swaglog
|
||||
os.environ['GIT_ORIGIN'] = build_metadata.openpilot.git_normalized_origin # Needed for swaglog
|
||||
|
||||
@@ -79,7 +79,8 @@ def and_(*fns):
|
||||
procs = [
|
||||
DaemonProcess("manage_athenad", "system.athena.manage_athenad", "AthenadPid"),
|
||||
|
||||
NativeProcess("camerad", "system/camerad", ["./camerad"], driverview),
|
||||
NativeProcess("camerad", "system/camerad", ["./camerad"], driverview, enabled=not WEBCAM),
|
||||
PythonProcess("webcamerad", "tools.webcam.camerad", driverview, enabled=WEBCAM),
|
||||
NativeProcess("logcatd", "system/logcatd", ["./logcatd"], only_onroad),
|
||||
NativeProcess("proclogd", "system/proclogd", ["./proclogd"], only_onroad),
|
||||
PythonProcess("logmessaged", "system.logmessaged", always_run),
|
||||
@@ -87,7 +88,7 @@ procs = [
|
||||
PythonProcess("timed", "system.timed", always_run, enabled=not PC),
|
||||
|
||||
# TODO Make python process once TG allows opening QCOM from child proc
|
||||
NativeProcess("dmonitoringmodeld", "selfdrive/modeld", ["./dmonitoringmodeld"], driverview, enabled=(not PC or WEBCAM)),
|
||||
NativeProcess("dmonitoringmodeld", "selfdrive/modeld", ["./dmonitoringmodeld"], driverview, enabled=(WEBCAM or not PC)),
|
||||
NativeProcess("encoderd", "system/loggerd", ["./encoderd"], only_onroad),
|
||||
NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar),
|
||||
NativeProcess("loggerd", "system/loggerd", ["./loggerd"], logging),
|
||||
@@ -105,7 +106,7 @@ procs = [
|
||||
PythonProcess("selfdrived", "selfdrive.selfdrived.selfdrived", only_onroad),
|
||||
PythonProcess("card", "selfdrive.car.card", only_onroad),
|
||||
PythonProcess("deleter", "system.loggerd.deleter", always_run),
|
||||
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", driverview, enabled=(not PC or WEBCAM)),
|
||||
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", driverview, enabled=(WEBCAM or not PC)),
|
||||
PythonProcess("qcomgpsd", "system.qcomgpsd.qcomgpsd", qcomgps, enabled=TICI),
|
||||
PythonProcess("pandad", "selfdrive.pandad.pandad", always_run),
|
||||
PythonProcess("paramsd", "selfdrive.locationd.paramsd", only_onroad),
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ from openpilot.common.gps import get_gps_location_service
|
||||
|
||||
def set_time(new_time):
|
||||
diff = datetime.datetime.now() - new_time
|
||||
if diff < datetime.timedelta(seconds=10):
|
||||
if abs(diff) < datetime.timedelta(seconds=10):
|
||||
cloudlog.debug(f"Time diff too small: {diff}")
|
||||
return
|
||||
|
||||
|
||||
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
-84
@@ -1,84 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015, 2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
#ifndef __IDIAGLOG_HPP_
|
||||
#define __IDIAGLOG_HPP_
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "DiagLog/Options.hpp"
|
||||
#include "DlSystem/String.hpp"
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DiagLog
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Interface for controlling logging for zdl components.
|
||||
|
||||
class ZDL_EXPORT IDiagLog
|
||||
{
|
||||
public:
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Sets the options after initialization occurs.
|
||||
///
|
||||
/// @param[in] loggingOptions The options to set up diagnostic logging.
|
||||
///
|
||||
/// @return False if the options could not be set. Ensure logging is not started.
|
||||
virtual bool setOptions(const Options& loggingOptions) = 0;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Gets the curent options for the diag logger.
|
||||
///
|
||||
/// @return Diag log options object.
|
||||
virtual Options getOptions() = 0;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Allows for setting the log mask once diag logging has started
|
||||
///
|
||||
/// @return True if the level was set successfully, false if a failure occurred.
|
||||
virtual bool setDiagLogMask(const std::string& mask) = 0;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Allows for setting the log mask once diag logging has started
|
||||
///
|
||||
/// @return True if the level was set successfully, false if a failure occurred.
|
||||
virtual bool setDiagLogMask(const zdl::DlSystem::String& mask) = 0;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Enables logging for zdl components.
|
||||
///
|
||||
/// Logging should be started prior to the instantiation of zdl components
|
||||
/// to ensure all events are captured.
|
||||
///
|
||||
/// @return False if diagnostic logging could not be started.
|
||||
virtual bool start(void) = 0;
|
||||
|
||||
/// @brief Disables logging for zdl components.
|
||||
virtual bool stop(void) = 0;
|
||||
|
||||
virtual ~IDiagLog() {};
|
||||
};
|
||||
|
||||
} // DiagLog namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif
|
||||
-79
@@ -1,79 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015, 2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
#ifndef __DIAGLOG_OPTIONS_HPP_
|
||||
#define __DIAGLOG_OPTIONS_HPP_
|
||||
|
||||
#include <string>
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DiagLog
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Options for setting up diagnostic logging for zdl components.
|
||||
class ZDL_EXPORT Options
|
||||
{
|
||||
public:
|
||||
Options() :
|
||||
DiagLogMask(""),
|
||||
LogFileDirectory("diaglogs"),
|
||||
LogFileName("DiagLog"),
|
||||
LogFileRotateCount(20),
|
||||
LogFileReplace(true)
|
||||
{
|
||||
// Solves the empty string problem with multiple std libs
|
||||
DiagLogMask.reserve(1);
|
||||
}
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// Enables diag logging only on the specified area mask (DNN_RUNTIME=ON | OFF)
|
||||
std::string DiagLogMask;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// The path to the directory where log files will be written.
|
||||
/// The path may be relative or absolute. Relative paths are interpreted
|
||||
/// from the current working directory.
|
||||
/// Default value is "diaglogs"
|
||||
std::string LogFileDirectory;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
//// The name used for log files. If this value is empty then BaseName will be
|
||||
/// used as the default file name.
|
||||
/// Default value is "DiagLog"
|
||||
std::string LogFileName;
|
||||
|
||||
/// @brief .
|
||||
///
|
||||
/// The maximum number of log files to create. If set to 0 no log rotation
|
||||
/// will be used and the log file name specified will be used each time, overwriting
|
||||
/// any existing log file that may exist.
|
||||
/// Default value is 20
|
||||
uint32_t LogFileRotateCount;
|
||||
|
||||
/// @brief
|
||||
///
|
||||
/// If the log file already exists, control whether it will be replaced
|
||||
/// (existing contents truncated), or appended.
|
||||
/// Default value is true
|
||||
bool LogFileReplace;
|
||||
};
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
} // DiagLog namespace
|
||||
} // zdl namespace
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,191 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015-2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef ZEROTH_IDNC_CONTAINER_HPP
|
||||
#define ZEROTH_IDNC_CONTAINER_HPP
|
||||
|
||||
#include <memory>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
#include "DlSystem/String.hpp"
|
||||
|
||||
namespace zdl {
|
||||
namespace DlContainer {
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
class IDlContainer;
|
||||
class dlc_error;
|
||||
|
||||
/**
|
||||
* The structure of a record in a DL container.
|
||||
*/
|
||||
struct ZDL_EXPORT DlcRecord
|
||||
{
|
||||
/// Name of the record.
|
||||
std::string name;
|
||||
/// Byte blob holding the data for the record.
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
DlcRecord();
|
||||
DlcRecord( DlcRecord&& other )
|
||||
: name(std::move(other.name))
|
||||
, data(std::move(other.data))
|
||||
{}
|
||||
DlcRecord(const std::string& new_name)
|
||||
: name(new_name)
|
||||
, data()
|
||||
{
|
||||
if(name.empty())
|
||||
{
|
||||
name.reserve(1);
|
||||
}
|
||||
}
|
||||
DlcRecord(const DlcRecord&) = delete;
|
||||
};
|
||||
|
||||
// The maximum length of any record name.
|
||||
extern const uint32_t RECORD_NAME_MAX_SIZE;
|
||||
// The maximum size of the record payload (bytes).
|
||||
extern const uint32_t RECORD_DATA_MAX_SIZE;
|
||||
// The maximum number of records in an archive at one time.
|
||||
extern const uint32_t ARCHIVE_MAX_RECORDS;
|
||||
|
||||
/**
|
||||
* Represents a container for a neural network model which can
|
||||
* be used to load the model into the SNPE runtime.
|
||||
*/
|
||||
class ZDL_EXPORT IDlContainer
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Initializes a container from a container archive file.
|
||||
*
|
||||
* @param[in] filename Container archive file path.
|
||||
*
|
||||
* @return A pointer to the initialized container
|
||||
*/
|
||||
static std::unique_ptr<IDlContainer>
|
||||
open(const std::string &filename) noexcept;
|
||||
|
||||
/**
|
||||
* Initializes a container from a container archive file.
|
||||
*
|
||||
* @param[in] filename Container archive file path.
|
||||
*
|
||||
* @return A pointer to the initialized container
|
||||
*/
|
||||
static std::unique_ptr<IDlContainer>
|
||||
open(const zdl::DlSystem::String &filename) noexcept;
|
||||
|
||||
/**
|
||||
* Initializes a container from a byte buffer.
|
||||
*
|
||||
* @param[in] buffer Byte buffer holding the contents of an archive
|
||||
* file.
|
||||
*
|
||||
* @return A pointer to the initialized container
|
||||
*/
|
||||
static std::unique_ptr<IDlContainer>
|
||||
open(const std::vector<uint8_t> &buffer) noexcept;
|
||||
|
||||
/**
|
||||
* Initializes a container from a byte buffer.
|
||||
*
|
||||
* @param[in] buffer Byte buffer holding the contents of an archive
|
||||
* file.
|
||||
*
|
||||
* @param[in] size Size of the byte buffer.
|
||||
*
|
||||
* @return A pointer to the initialized container
|
||||
*/
|
||||
static std::unique_ptr<IDlContainer>
|
||||
open(const uint8_t* buffer, const size_t size) noexcept;
|
||||
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
/**
|
||||
* Get the record catalog for a container.
|
||||
*
|
||||
* @param[out] catalog Buffer that will hold the record names on
|
||||
* return.
|
||||
*/
|
||||
virtual void getCatalog(std::set<std::string> &catalog) const = 0;
|
||||
|
||||
/**
|
||||
* Get the record catalog for a container.
|
||||
*
|
||||
* @param[out] catalog Buffer that will hold the record names on
|
||||
* return.
|
||||
*/
|
||||
virtual void getCatalog(std::set<zdl::DlSystem::String> &catalog) const = 0;
|
||||
|
||||
/**
|
||||
* Get a record from a container by name.
|
||||
*
|
||||
* @param[in] name Name of the record to fetch.
|
||||
* @param[out] record The passed in record will be populated with the
|
||||
* record data on return. Note that the caller
|
||||
* will own the data in the record and is
|
||||
* responsible for freeing it if needed.
|
||||
*/
|
||||
virtual void getRecord(const std::string &name, DlcRecord &record) const = 0;
|
||||
|
||||
/**
|
||||
* Get a record from a container by name.
|
||||
*
|
||||
* @param[in] name Name of the record to fetch.
|
||||
* @param[out] record The passed in record will be populated with the
|
||||
* record data on return. Note that the caller
|
||||
* will own the data in the record and is
|
||||
* responsible for freeing it if needed.
|
||||
*/
|
||||
virtual void getRecord(const zdl::DlSystem::String &name, DlcRecord &record) const = 0;
|
||||
|
||||
/**
|
||||
* Save the container to an archive on disk. This function will save the
|
||||
* container if the filename is different from the file that it was opened
|
||||
* from, or if at least one record was modified since the container was
|
||||
* opened.
|
||||
*
|
||||
* It will truncate any existing file at the target path.
|
||||
*
|
||||
* @param filename Container archive file path.
|
||||
*
|
||||
* @return indication of success/failure
|
||||
*/
|
||||
virtual bool save(const std::string &filename) = 0;
|
||||
|
||||
/**
|
||||
* Save the container to an archive on disk. This function will save the
|
||||
* container if the filename is different from the file that it was opened
|
||||
* from, or if at least one record was modified since the container was
|
||||
* opened.
|
||||
*
|
||||
* It will truncate any existing file at the target path.
|
||||
*
|
||||
* @param filename Container archive file path.
|
||||
*
|
||||
* @return indication of success/failure
|
||||
*/
|
||||
virtual bool save (const zdl::DlSystem::String &filename) = 0;
|
||||
|
||||
virtual ~IDlContainer() {}
|
||||
};
|
||||
|
||||
} // ns DlContainer
|
||||
} // ns zdl
|
||||
|
||||
|
||||
#endif
|
||||
-234
@@ -1,234 +0,0 @@
|
||||
//==============================================================================
|
||||
//
|
||||
// Copyright (c) 2014-2021 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
#ifndef _DL_ENUMS_HPP_
|
||||
#define _DL_ENUMS_HPP_
|
||||
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* Enumeration of supported target runtimes.
|
||||
*/
|
||||
enum class Runtime_t
|
||||
{
|
||||
/// Run the processing on Snapdragon CPU.
|
||||
/// Data: float 32bit
|
||||
/// Math: float 32bit
|
||||
CPU_FLOAT32 = 0,
|
||||
|
||||
/// Run the processing on the Adreno GPU.
|
||||
/// Data: float 16bit
|
||||
/// Math: float 32bit
|
||||
GPU_FLOAT32_16_HYBRID = 1,
|
||||
|
||||
/// Run the processing on the Hexagon DSP.
|
||||
/// Data: 8bit fixed point Tensorflow style format
|
||||
/// Math: 8bit fixed point Tensorflow style format
|
||||
DSP_FIXED8_TF = 2,
|
||||
|
||||
/// Run the processing on the Adreno GPU.
|
||||
/// Data: float 16bit
|
||||
/// Math: float 16bit
|
||||
GPU_FLOAT16 = 3,
|
||||
|
||||
/// Run the processing on Snapdragon AIX+HVX.
|
||||
/// Data: 8bit fixed point Tensorflow style format
|
||||
/// Math: 8bit fixed point Tensorflow style format
|
||||
AIP_FIXED8_TF = 5,
|
||||
AIP_FIXED_TF = AIP_FIXED8_TF,
|
||||
|
||||
/// Default legacy enum to retain backward compatibility.
|
||||
/// CPU = CPU_FLOAT32
|
||||
CPU = CPU_FLOAT32,
|
||||
|
||||
/// Default legacy enum to retain backward compatibility.
|
||||
/// GPU = GPU_FLOAT32_16_HYBRID
|
||||
GPU = GPU_FLOAT32_16_HYBRID,
|
||||
|
||||
/// Default legacy enum to retain backward compatibility.
|
||||
/// DSP = DSP_FIXED8_TF
|
||||
DSP = DSP_FIXED8_TF,
|
||||
|
||||
/// Special value indicating the property is unset.
|
||||
UNSET = -1
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration of runtime available check options.
|
||||
*/
|
||||
enum class RuntimeCheckOption_t
|
||||
{
|
||||
/// Perform standard runtime available check
|
||||
DEFAULT = 0,
|
||||
/// Perform standard runtime available check
|
||||
NORMAL_CHECK = 0,
|
||||
/// Perform basic runtime available check, may be runtime specific
|
||||
BASIC_CHECK = 1,
|
||||
/// Perform unsignedPD runtime available check
|
||||
UNSIGNEDPD_CHECK = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration of various performance profiles that can be requested.
|
||||
*/
|
||||
enum class PerformanceProfile_t
|
||||
{
|
||||
/// Run in a standard mode.
|
||||
/// This mode will be deprecated in the future and replaced with BALANCED.
|
||||
DEFAULT = 0,
|
||||
/// Run in a balanced mode.
|
||||
BALANCED = 0,
|
||||
|
||||
/// Run in high performance mode
|
||||
HIGH_PERFORMANCE = 1,
|
||||
|
||||
/// Run in a power sensitive mode, at the expense of performance.
|
||||
POWER_SAVER = 2,
|
||||
|
||||
/// Use system settings. SNPE makes no calls to any performance related APIs.
|
||||
SYSTEM_SETTINGS = 3,
|
||||
|
||||
/// Run in sustained high performance mode
|
||||
SUSTAINED_HIGH_PERFORMANCE = 4,
|
||||
|
||||
/// Run in burst mode
|
||||
BURST = 5,
|
||||
|
||||
/// Run in lower clock than POWER_SAVER, at the expense of performance.
|
||||
LOW_POWER_SAVER = 6,
|
||||
|
||||
/// Run in higher clock and provides better performance than POWER_SAVER.
|
||||
HIGH_POWER_SAVER = 7,
|
||||
|
||||
/// Run in lower balanced mode
|
||||
LOW_BALANCED = 8,
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration of various profilngLevels that can be requested.
|
||||
*/
|
||||
enum class ProfilingLevel_t
|
||||
{
|
||||
/// No profiling.
|
||||
/// Collects no runtime stats in the DiagLog
|
||||
OFF = 0,
|
||||
|
||||
/// Basic profiling
|
||||
/// Collects some runtime stats in the DiagLog
|
||||
BASIC = 1,
|
||||
|
||||
/// Detailed profiling
|
||||
/// Collects more runtime stats in the DiagLog, including per-layer statistics
|
||||
/// Performance may be impacted
|
||||
DETAILED = 2,
|
||||
|
||||
/// Moderate profiling
|
||||
/// Collects more runtime stats in the DiagLog, no per-layer statistics
|
||||
MODERATE = 3
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration of various execution priority hints.
|
||||
*/
|
||||
enum class ExecutionPriorityHint_t
|
||||
{
|
||||
/// Normal priority
|
||||
NORMAL = 0,
|
||||
|
||||
/// Higher than normal priority
|
||||
HIGH = 1,
|
||||
|
||||
/// Lower priority
|
||||
LOW = 2
|
||||
|
||||
};
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++*/
|
||||
|
||||
/**
|
||||
* Enumeration that lists the supported image encoding formats.
|
||||
*/
|
||||
enum class ImageEncoding_t
|
||||
{
|
||||
/// For unknown image type. Also used as a default value for ImageEncoding_t.
|
||||
UNKNOWN = 0,
|
||||
|
||||
/// The RGB format consists of 3 bytes per pixel: one byte for
|
||||
/// Red, one for Green, and one for Blue. The byte ordering is
|
||||
/// endian independent and is always in RGB byte order.
|
||||
RGB = 1,
|
||||
|
||||
/// The ARGB32 format consists of 4 bytes per pixel: one byte for
|
||||
/// Red, one for Green, one for Blue, and one for the alpha channel.
|
||||
/// The alpha channel is ignored. The byte ordering depends on the
|
||||
/// underlying CPU. For little endian CPUs, the byte order is BGRA.
|
||||
/// For big endian CPUs, the byte order is ARGB.
|
||||
ARGB32 = 2,
|
||||
|
||||
/// The RGBA format consists of 4 bytes per pixel: one byte for
|
||||
/// Red, one for Green, one for Blue, and one for the alpha channel.
|
||||
/// The alpha channel is ignored. The byte ordering is endian independent
|
||||
/// and is always in RGBA byte order.
|
||||
RGBA = 3,
|
||||
|
||||
/// The GRAYSCALE format is for 8-bit grayscale.
|
||||
GRAYSCALE = 4,
|
||||
|
||||
/// NV21 is the Android version of YUV. The Chrominance is down
|
||||
/// sampled and has a subsampling ratio of 4:2:0. Note that this
|
||||
/// image format has 3 channels, but the U and V channels
|
||||
/// are subsampled. For every four Y pixels there is one U and one V pixel. @newpage
|
||||
NV21 = 5,
|
||||
|
||||
/// The BGR format consists of 3 bytes per pixel: one byte for
|
||||
/// Red, one for Green and one for Blue. The byte ordering is
|
||||
/// endian independent and is always BGR byte order.
|
||||
BGR = 6
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration that lists the supported LogLevels that can be set by users.
|
||||
*/
|
||||
enum class LogLevel_t
|
||||
{
|
||||
/// Enumeration variable to be used by user to set logging level to FATAL.
|
||||
LOG_FATAL = 0,
|
||||
|
||||
/// Enumeration variable to be used by user to set logging level to ERROR.
|
||||
LOG_ERROR = 1,
|
||||
|
||||
/// Enumeration variable to be used by user to set logging level to WARN.
|
||||
LOG_WARN = 2,
|
||||
|
||||
/// Enumeration variable to be used by user to set logging level to INFO.
|
||||
LOG_INFO = 3,
|
||||
|
||||
/// Enumeration variable to be used by user to set logging level to VERBOSE.
|
||||
LOG_VERBOSE = 4
|
||||
};
|
||||
|
||||
typedef enum : int
|
||||
{
|
||||
UNSPECIFIED = 0,
|
||||
FLOATING_POINT_32 = 1,
|
||||
FLOATING_POINT_16 = 2,
|
||||
FIXED_POINT_8 = 3,
|
||||
FIXED_POINT_16 = 4
|
||||
} IOBufferDataType_t;
|
||||
|
||||
}} // namespaces end
|
||||
|
||||
|
||||
#endif
|
||||
-259
@@ -1,259 +0,0 @@
|
||||
//==============================================================================
|
||||
//
|
||||
// Copyright (c) 2016-2021 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
#ifndef _DL_ERROR_HPP_
|
||||
#define _DL_ERROR_HPP_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <limits> // numeric_limits
|
||||
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
|
||||
// clang and arm gcc different in how ZDL_EXPORT is used with enum class
|
||||
#if !defined (__clang__)
|
||||
enum class ErrorCode : uint32_t ZDL_EXPORT {
|
||||
#else
|
||||
enum class ZDL_EXPORT ErrorCode : uint32_t {
|
||||
#endif // ARM64V8A
|
||||
NONE = 0,
|
||||
|
||||
// System config errors
|
||||
SNPE_CONFIG_MISSING_PARAM = 100,
|
||||
SNPE_CONFIG_INVALID_PARAM = 101,
|
||||
SNPE_CONFIG_MISSING_FILE = 102,
|
||||
SNPE_CONFIG_NNCONFIG_NOT_SET = 103,
|
||||
SNPE_CONFIG_NNCONFIG_INVALID = 104,
|
||||
SNPE_CONFIG_WRONG_INPUT_NAME = 105,
|
||||
SNPE_CONFIG_INCORRECT_INPUT_DIMENSIONS = 106,
|
||||
SNPE_CONFIG_DIMENSIONS_MODIFICATION_NOT_SUPPORTED = 107,
|
||||
SNPE_CONFIG_BOTH_OUTPUT_LAYER_TENSOR_NAMES_SET = 108,
|
||||
|
||||
SNPE_CONFIG_NNCONFIG_ONLY_TENSOR_SUPPORTED = 120,
|
||||
SNPE_CONFIG_NNCONFIG_ONLY_USER_BUFFER_SUPPORTED = 121,
|
||||
|
||||
// DlSystem errors
|
||||
SNPE_DLSYSTEM_MISSING_BUFFER = 200,
|
||||
SNPE_DLSYSTEM_TENSOR_CAST_FAILED = 201,
|
||||
SNPE_DLSYSTEM_FIXED_POINT_PARAM_INVALID = 202,
|
||||
SNPE_DLSYSTEM_SIZE_MISMATCH = 203,
|
||||
SNPE_DLSYSTEM_NAME_NOT_FOUND = 204,
|
||||
SNPE_DLSYSTEM_VALUE_MISMATCH = 205,
|
||||
SNPE_DLSYSTEM_INSERT_FAILED = 206,
|
||||
SNPE_DLSYSTEM_TENSOR_FILE_READ_FAILED = 207,
|
||||
SNPE_DLSYSTEM_DIAGLOG_FAILURE = 208,
|
||||
SNPE_DLSYSTEM_LAYER_NOT_SET = 209,
|
||||
SNPE_DLSYSTEM_WRONG_NUMBER_INPUT_BUFFERS = 210,
|
||||
SNPE_DLSYSTEM_RUNTIME_TENSOR_SHAPE_MISMATCH = 211,
|
||||
SNPE_DLSYSTEM_TENSOR_MISSING = 212,
|
||||
SNPE_DLSYSTEM_TENSOR_ITERATION_UNSUPPORTED = 213,
|
||||
SNPE_DLSYSTEM_BUFFER_MANAGER_MISSING = 214,
|
||||
SNPE_DLSYSTEM_RUNTIME_BUFFER_SOURCE_UNSUPPORTED = 215,
|
||||
SNPE_DLSYSTEM_BUFFER_CAST_FAILED = 216,
|
||||
SNPE_DLSYSTEM_WRONG_TRANSITION_TYPE = 217,
|
||||
SNPE_DLSYSTEM_LAYER_ALREADY_REGISTERED = 218,
|
||||
SNPE_DLSYSTEM_TENSOR_DIM_INVALID = 219,
|
||||
|
||||
SNPE_DLSYSTEM_BUFFERENCODING_UNKNOWN = 240,
|
||||
SNPE_DLSYSTEM_BUFFER_INVALID_PARAM = 241,
|
||||
|
||||
// DlContainer errors
|
||||
SNPE_DLCONTAINER_MODEL_PARSING_FAILED = 300,
|
||||
SNPE_DLCONTAINER_UNKNOWN_LAYER_CODE = 301,
|
||||
SNPE_DLCONTAINER_MISSING_LAYER_PARAM = 302,
|
||||
SNPE_DLCONTAINER_LAYER_PARAM_NOT_SUPPORTED = 303,
|
||||
SNPE_DLCONTAINER_LAYER_PARAM_INVALID = 304,
|
||||
SNPE_DLCONTAINER_TENSOR_DATA_MISSING = 305,
|
||||
SNPE_DLCONTAINER_MODEL_LOAD_FAILED = 306,
|
||||
SNPE_DLCONTAINER_MISSING_RECORDS = 307,
|
||||
SNPE_DLCONTAINER_INVALID_RECORD = 308,
|
||||
SNPE_DLCONTAINER_WRITE_FAILURE = 309,
|
||||
SNPE_DLCONTAINER_READ_FAILURE = 310,
|
||||
SNPE_DLCONTAINER_BAD_CONTAINER = 311,
|
||||
SNPE_DLCONTAINER_BAD_DNN_FORMAT_VERSION = 312,
|
||||
SNPE_DLCONTAINER_UNKNOWN_AXIS_ANNOTATION = 313,
|
||||
SNPE_DLCONTAINER_UNKNOWN_SHUFFLE_TYPE = 314,
|
||||
SNPE_DLCONTAINER_TEMP_FILE_FAILURE = 315,
|
||||
|
||||
// Network errors
|
||||
SNPE_NETWORK_EMPTY_NETWORK = 400,
|
||||
SNPE_NETWORK_CREATION_FAILED = 401,
|
||||
SNPE_NETWORK_PARTITION_FAILED = 402,
|
||||
SNPE_NETWORK_NO_OUTPUT_DEFINED = 403,
|
||||
SNPE_NETWORK_MISMATCH_BETWEEN_NAMES_AND_DIMS = 404,
|
||||
SNPE_NETWORK_MISSING_INPUT_NAMES = 405,
|
||||
SNPE_NETWORK_MISSING_OUTPUT_NAMES = 406,
|
||||
SNPE_NETWORK_EXECUTION_FAILED = 407,
|
||||
|
||||
// Host runtime errors
|
||||
SNPE_HOST_RUNTIME_TARGET_UNAVAILABLE = 500,
|
||||
|
||||
// CPU runtime errors
|
||||
SNPE_CPU_LAYER_NOT_SUPPORTED = 600,
|
||||
SNPE_CPU_LAYER_PARAM_NOT_SUPPORTED = 601,
|
||||
SNPE_CPU_LAYER_PARAM_INVALID = 602,
|
||||
SNPE_CPU_LAYER_PARAM_COMBINATION_INVALID = 603,
|
||||
SNPE_CPU_BUFFER_NOT_FOUND = 604,
|
||||
SNPE_CPU_NETWORK_NOT_SUPPORTED = 605,
|
||||
SNPE_CPU_UDO_OPERATION_FAILED = 606,
|
||||
|
||||
// CPU fixed-point runtime errors
|
||||
SNPE_CPU_FXP_LAYER_NOT_SUPPORTED = 700,
|
||||
SNPE_CPU_FXP_LAYER_PARAM_NOT_SUPPORTED = 701,
|
||||
SNPE_CPU_FXP_LAYER_PARAM_INVALID = 702,
|
||||
|
||||
// GPU runtime errors
|
||||
SNPE_GPU_LAYER_NOT_SUPPORTED = 800,
|
||||
SNPE_GPU_LAYER_PARAM_NOT_SUPPORTED = 801,
|
||||
SNPE_GPU_LAYER_PARAM_INVALID = 802,
|
||||
SNPE_GPU_LAYER_PARAM_COMBINATION_INVALID = 803,
|
||||
SNPE_GPU_KERNEL_COMPILATION_FAILED = 804,
|
||||
SNPE_GPU_CONTEXT_NOT_SET = 805,
|
||||
SNPE_GPU_KERNEL_NOT_SET = 806,
|
||||
SNPE_GPU_KERNEL_PARAM_INVALID = 807,
|
||||
SNPE_GPU_OPENCL_CHECK_FAILED = 808,
|
||||
SNPE_GPU_OPENCL_FUNCTION_ERROR = 809,
|
||||
SNPE_GPU_BUFFER_NOT_FOUND = 810,
|
||||
SNPE_GPU_TENSOR_DIM_INVALID = 811,
|
||||
SNPE_GPU_MEMORY_FLAGS_INVALID = 812,
|
||||
SNPE_GPU_UNEXPECTED_NUMBER_OF_IO = 813,
|
||||
SNPE_GPU_LAYER_PROXY_ERROR = 814,
|
||||
SNPE_GPU_BUFFER_IN_USE = 815,
|
||||
SNPE_GPU_BUFFER_MODIFICATION_ERROR = 816,
|
||||
SNPE_GPU_DATA_ARRANGEMENT_INVALID = 817,
|
||||
SNPE_GPU_UDO_OPERATION_FAILED = 818,
|
||||
// DSP runtime errors
|
||||
SNPE_DSP_LAYER_NOT_SUPPORTED = 900,
|
||||
SNPE_DSP_LAYER_PARAM_NOT_SUPPORTED = 901,
|
||||
SNPE_DSP_LAYER_PARAM_INVALID = 902,
|
||||
SNPE_DSP_LAYER_PARAM_COMBINATION_INVALID = 903,
|
||||
SNPE_DSP_STUB_NOT_PRESENT = 904,
|
||||
SNPE_DSP_LAYER_NAME_TRUNCATED = 905,
|
||||
SNPE_DSP_LAYER_INPUT_BUFFER_NAME_TRUNCATED = 906,
|
||||
SNPE_DSP_LAYER_OUTPUT_BUFFER_NAME_TRUNCATED = 907,
|
||||
SNPE_DSP_RUNTIME_COMMUNICATION_ERROR = 908,
|
||||
SNPE_DSP_RUNTIME_INVALID_PARAM_ERROR = 909,
|
||||
SNPE_DSP_RUNTIME_SYSTEM_ERROR = 910,
|
||||
SNPE_DSP_RUNTIME_CRASHED_ERROR = 911,
|
||||
SNPE_DSP_BUFFER_SIZE_ERROR = 912,
|
||||
SNPE_DSP_UDO_EXECUTE_ERROR = 913,
|
||||
SNPE_DSP_UDO_LIB_NOT_REGISTERED_ERROR = 914,
|
||||
SNPE_DSP_UDO_INVALID_QUANTIZATION_TYPE_ERROR = 915,
|
||||
SNPE_DSP_RUNTIME_INVALID_RPC_DRIVER = 916,
|
||||
SNPE_DSP_RUNTIME_RPC_PERMISSION_ERROR = 917,
|
||||
SNPE_DSP_RUNTIME_DSP_FILE_OPEN_ERROR = 918,
|
||||
|
||||
// Model validataion errors
|
||||
SNPE_MODEL_VALIDATION_LAYER_NOT_SUPPORTED = 1000,
|
||||
SNPE_MODEL_VALIDATION_LAYER_PARAM_NOT_SUPPORTED = 1001,
|
||||
SNPE_MODEL_VALIDATION_LAYER_PARAM_INVALID = 1002,
|
||||
SNPE_MODEL_VALIDATION_LAYER_PARAM_MISSING = 1003,
|
||||
SNPE_MODEL_VALIDATION_LAYER_PARAM_COMBINATION_INVALID = 1004,
|
||||
SNPE_MODEL_VALIDATION_LAYER_ORDERING_INVALID = 1005,
|
||||
SNPE_MODEL_VALIDATION_INVALID_CONSTRAINT = 1006,
|
||||
SNPE_MODEL_VALIDATION_MISSING_BUFFER = 1007,
|
||||
SNPE_MODEL_VALIDATION_BUFFER_REUSE_NOT_SUPPORTED = 1008,
|
||||
SNPE_MODEL_VALIDATION_LAYER_COULD_NOT_BE_ASSIGNED = 1009,
|
||||
SNPE_MODEL_VALIDATION_UDO_LAYER_FAILED = 1010,
|
||||
|
||||
// UDL errors
|
||||
SNPE_UDL_LAYER_EMPTY_UDL_NETWORK = 1100,
|
||||
SNPE_UDL_LAYER_PARAM_INVALID = 1101,
|
||||
SNPE_UDL_LAYER_INSTANCE_MISSING = 1102,
|
||||
SNPE_UDL_LAYER_SETUP_FAILED = 1103,
|
||||
SNPE_UDL_EXECUTE_FAILED = 1104,
|
||||
SNPE_UDL_BUNDLE_INVALID = 1105,
|
||||
SNPE_UDO_REGISTRATION_FAILED = 1106,
|
||||
SNPE_UDO_GET_PACKAGE_FAILED = 1107,
|
||||
SNPE_UDO_GET_IMPLEMENTATION_FAILED = 1108,
|
||||
|
||||
// Dependent library errors
|
||||
SNPE_STD_LIBRARY_ERROR = 1200,
|
||||
|
||||
// Unknown exception (catch (...)), Has no component attached to this
|
||||
SNPE_UNKNOWN_EXCEPTION = 1210,
|
||||
|
||||
// Storage Errors
|
||||
SNPE_STORAGE_INVALID_KERNEL_REPO = 1300,
|
||||
|
||||
// AIP runtime errors
|
||||
SNPE_AIP_LAYER_NOT_SUPPORTED = 1400,
|
||||
SNPE_AIP_LAYER_PARAM_NOT_SUPPORTED = 1401,
|
||||
SNPE_AIP_LAYER_PARAM_INVALID = 1402,
|
||||
SNPE_AIP_LAYER_PARAM_COMBINATION_INVALID = 1403,
|
||||
SNPE_AIP_STUB_NOT_PRESENT = 1404,
|
||||
SNPE_AIP_LAYER_NAME_TRUNCATED = 1405,
|
||||
SNPE_AIP_LAYER_INPUT_BUFFER_NAME_TRUNCATED = 1406,
|
||||
SNPE_AIP_LAYER_OUTPUT_BUFFER_NAME_TRUNCATED = 1407,
|
||||
SNPE_AIP_RUNTIME_COMMUNICATION_ERROR = 1408,
|
||||
SNPE_AIP_RUNTIME_INVALID_PARAM_ERROR = 1409,
|
||||
SNPE_AIP_RUNTIME_SYSTEM_ERROR = 1410,
|
||||
SNPE_AIP_RUNTIME_TENSOR_MISSING = 1411,
|
||||
SNPE_AIP_RUNTIME_TENSOR_SHAPE_MISMATCH = 1412,
|
||||
SNPE_AIP_RUNTIME_BAD_AIX_RECORD = 1413,
|
||||
|
||||
// DlCaching errors
|
||||
SNPE_DLCACHING_INVALID_METADATA = 1500,
|
||||
SNPE_DLCACHING_INVALID_INITBLOB = 1501,
|
||||
|
||||
// Infrastructure Errors
|
||||
SNPE_INFRA_CLUSTERMGR_INSTANCE_INVALID = 1600,
|
||||
SNPE_INFRA_CLUSTERMGR_EXECUTE_SYNC_FAILED = 1601,
|
||||
|
||||
// Memory Errors
|
||||
SNPE_MEMORY_CORRUPTION_ERROR = 1700
|
||||
|
||||
};
|
||||
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* Returns the error code of the last error encountered.
|
||||
*
|
||||
* @return The error code.
|
||||
*
|
||||
* @note The returned error code is significant only when the return
|
||||
* value of the call indicated an error.
|
||||
*/
|
||||
ZDL_EXPORT ErrorCode getLastErrorCode();
|
||||
|
||||
/**
|
||||
* Returns the error string of the last error encountered.
|
||||
*
|
||||
* @return The error string.
|
||||
*
|
||||
* @note The returned error string is significant only when the return
|
||||
* value of the call indicated an error.
|
||||
*/
|
||||
ZDL_EXPORT const char* getLastErrorString();
|
||||
|
||||
/**
|
||||
* Returns the info string of the last error encountered.
|
||||
*/
|
||||
ZDL_EXPORT const char* getLastInfoString();
|
||||
|
||||
/**
|
||||
* Returns the uint32_t representation of the error code enum.
|
||||
*
|
||||
* @param[in] code The error code to be converted.
|
||||
*
|
||||
* @return uint32_t representation of the error code.
|
||||
*/
|
||||
ZDL_EXPORT uint32_t enumToUInt32(zdl::DlSystem::ErrorCode code);
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
} // DlSystem
|
||||
} // zdl
|
||||
|
||||
#endif // _DL_ERROR_HPP_
|
||||
|
||||
-225
@@ -1,225 +0,0 @@
|
||||
//==============================================================================
|
||||
//
|
||||
// Copyright (c) 2016, 2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
#ifndef _DL_SYSTEM_OPTIONAL_HPP_
|
||||
#define _DL_SYSTEM_OPTIONAL_HPP_
|
||||
|
||||
#include <cstdio>
|
||||
#include <utility>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
|
||||
template <typename T>
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Class to manage a value that may or may not exist. The boolean value
|
||||
* of the Optional class is true if the object contains a value and false
|
||||
* if it does not contain a value.
|
||||
*
|
||||
* The class must be evaluated and confirmed as true (containing a value)
|
||||
* before being dereferenced.
|
||||
*/
|
||||
class ZDL_EXPORT Optional final {
|
||||
public:
|
||||
enum class LIFECYCLE {
|
||||
NONE = 0,
|
||||
REFERENCE_OWNED = 1,
|
||||
POINTER_OWNED = 2,
|
||||
POINTER_NOT_OWNED = 3
|
||||
};
|
||||
|
||||
struct ReferenceCount {
|
||||
size_t count = 0;
|
||||
|
||||
void increment() { count++; }
|
||||
|
||||
size_t decrement() {
|
||||
if (count > 0) {
|
||||
count--;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
};
|
||||
|
||||
using U = typename std::remove_pointer<T>::type;
|
||||
|
||||
/**
|
||||
* The default constructor is set to not have any value, and is
|
||||
* therefore evaluated as false.
|
||||
*/
|
||||
// Do not explicit it so we can return {}
|
||||
Optional() {
|
||||
m_Type = LIFECYCLE::NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an Optional class using an object.
|
||||
* @param[in] Reference to an object v
|
||||
* @param[out] Optional instance of object v
|
||||
*/
|
||||
template <typename Q = T>
|
||||
Optional (const T& v, typename std::enable_if<!std::is_pointer<Q>::value>::type* = 0)
|
||||
: m_Type(LIFECYCLE::REFERENCE_OWNED) {
|
||||
try {
|
||||
m_StoragePtr = new T(v);
|
||||
} catch (...) {
|
||||
m_StoragePtr = nullptr;
|
||||
m_Type = LIFECYCLE::NONE;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Q = T>
|
||||
Optional(U* v, LIFECYCLE type, typename std::enable_if<std::is_pointer<Q>::value>::type* = 0)
|
||||
: m_Type(type) {
|
||||
switch (m_Type) {
|
||||
case LIFECYCLE::POINTER_OWNED:
|
||||
m_StoragePtr = v;
|
||||
m_Count = new ReferenceCount();
|
||||
m_Count->increment();
|
||||
break;
|
||||
case LIFECYCLE::POINTER_NOT_OWNED:
|
||||
m_StoragePtr = v;
|
||||
break;
|
||||
case LIFECYCLE::REFERENCE_OWNED:
|
||||
throw std::bad_exception();
|
||||
case LIFECYCLE::NONE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Optional(const Optional &other) : m_Type(other.m_Type), m_Count(other.m_Count) {
|
||||
if (isReference()) {
|
||||
m_StoragePtr = new U(*other.m_StoragePtr);
|
||||
} else if (isPointer()) {
|
||||
m_StoragePtr = other.m_StoragePtr;
|
||||
if (isOwned()) {
|
||||
m_Count->increment();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Optional& operator=(const Optional& other) noexcept {
|
||||
Optional tmp(other);
|
||||
swap(std::move(tmp));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Optional(Optional&& other) noexcept {
|
||||
swap(std::move(other));
|
||||
}
|
||||
|
||||
Optional& operator=(Optional&& other) noexcept {
|
||||
swap(std::move(other));
|
||||
return *this;
|
||||
}
|
||||
|
||||
~Optional() {
|
||||
if (isOwned()) {
|
||||
if (isReference() || (isPointer() && m_Count->decrement() == 0)) {
|
||||
delete m_StoragePtr;
|
||||
delete m_Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Boolean value of Optional class is only true when there exists a value.
|
||||
*/
|
||||
operator bool() const noexcept { return isValid(); }
|
||||
|
||||
bool operator!() const noexcept { return !isValid(); }
|
||||
|
||||
/**
|
||||
* Get reference of Optional object
|
||||
* @warning User must validate Optional has value before.
|
||||
*/
|
||||
const T& operator*() { return this->GetReference(); }
|
||||
|
||||
/**
|
||||
* Get reference of Optional object
|
||||
* @warning User must validate Optional has value before.
|
||||
*/
|
||||
const T& operator*() const { return this->GetReference(); }
|
||||
|
||||
operator T&() { return this->GetReference(); }
|
||||
|
||||
T operator->() {
|
||||
T self = this->GetReference();
|
||||
return self;
|
||||
}
|
||||
private:
|
||||
void swap(Optional&& other) {
|
||||
m_Type = other.m_Type;
|
||||
m_StoragePtr = other.m_StoragePtr;
|
||||
m_Count = other.m_Count;
|
||||
|
||||
other.m_Type = LIFECYCLE::NONE;
|
||||
other.m_StoragePtr = nullptr;
|
||||
other.m_Count = nullptr;
|
||||
}
|
||||
|
||||
template <typename Q = T>
|
||||
typename std::enable_if<std::is_same<U, Q>::value, const Q&>::type GetReference() const noexcept {
|
||||
if (!isReference()) std::terminate();
|
||||
return *static_cast<const Q*>(m_StoragePtr);
|
||||
}
|
||||
|
||||
template <typename Q = T>
|
||||
typename std::enable_if<std::is_same<U*, Q>::value, const Q&>::type GetReference() const noexcept {
|
||||
if (!isPointer()) std::terminate();
|
||||
return static_cast<const Q&>(m_StoragePtr);
|
||||
}
|
||||
|
||||
template <typename Q = T>
|
||||
typename std::enable_if<std::is_same<U, Q>::value, Q&>::type GetReference() noexcept {
|
||||
if (!isReference()) std::terminate();
|
||||
return *m_StoragePtr;
|
||||
}
|
||||
|
||||
template <typename Q = T>
|
||||
typename std::enable_if<std::is_same<U*, Q>::value, Q&>::type GetReference() noexcept {
|
||||
if (!isPointer()) std::terminate();
|
||||
return m_StoragePtr;
|
||||
}
|
||||
|
||||
bool isPointer() const {
|
||||
return m_Type == LIFECYCLE::POINTER_OWNED || m_Type == LIFECYCLE::POINTER_NOT_OWNED;
|
||||
}
|
||||
|
||||
bool isOwned() const {
|
||||
return m_Type == LIFECYCLE::REFERENCE_OWNED || m_Type == LIFECYCLE::POINTER_OWNED;
|
||||
}
|
||||
|
||||
bool isReference() const {
|
||||
return m_Type == LIFECYCLE::REFERENCE_OWNED;
|
||||
}
|
||||
|
||||
bool isValid() const {
|
||||
return m_Type != LIFECYCLE::NONE;
|
||||
}
|
||||
|
||||
U* m_StoragePtr = nullptr;
|
||||
LIFECYCLE m_Type;
|
||||
ReferenceCount *m_Count = nullptr;
|
||||
};
|
||||
|
||||
} // ns DlSystem
|
||||
} // ns zdl
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // _DL_SYSTEM_OPTIONAL_HPP_
|
||||
-78
@@ -1,78 +0,0 @@
|
||||
//==============================================================================
|
||||
//
|
||||
// Copyright (c) 2014-2015 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
|
||||
#ifndef _DL_VERSION_HPP_
|
||||
#define _DL_VERSION_HPP_
|
||||
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
#include "DlSystem/String.hpp"
|
||||
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem
|
||||
{
|
||||
class Version_t;
|
||||
}}
|
||||
|
||||
|
||||
namespace zdl { namespace DlSystem
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* A class that contains the different portions of a version number.
|
||||
*/
|
||||
class ZDL_EXPORT Version_t
|
||||
{
|
||||
public:
|
||||
/// Holds the major version number. Changes in this value indicate
|
||||
/// major changes that break backward compatibility.
|
||||
int32_t Major;
|
||||
|
||||
/// Holds the minor version number. Changes in this value indicate
|
||||
/// minor changes made to library that are backwards compatible
|
||||
/// (such as additions to the interface).
|
||||
int32_t Minor;
|
||||
|
||||
/// Holds the teeny version number. Changes in this value indicate
|
||||
/// changes such as bug fixes and patches made to the library that
|
||||
/// do not affect the interface.
|
||||
int32_t Teeny;
|
||||
|
||||
/// This string holds information about the build version.
|
||||
///
|
||||
std::string Build;
|
||||
|
||||
static zdl::DlSystem::Version_t fromString(const std::string &stringValue);
|
||||
|
||||
static zdl::DlSystem::Version_t fromString(const zdl::DlSystem::String &stringValue);
|
||||
|
||||
/**
|
||||
* @brief Returns a string in the form Major.Minor.Teeny.Build
|
||||
*
|
||||
* @return A formatted string holding the version information.
|
||||
*/
|
||||
const std::string toString() const;
|
||||
|
||||
/**
|
||||
* @brief Returns a string in the form Major.Minor.Teeny.Build
|
||||
*
|
||||
* @return A formatted string holding the version information.
|
||||
*/
|
||||
const zdl::DlSystem::String asString() const;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis */
|
||||
|
||||
#endif
|
||||
@@ -1,86 +0,0 @@
|
||||
//==============================================================================
|
||||
//
|
||||
// Copyright (c) 2017-2019 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
#ifndef _IBUFFER_ATTRIBUTES_HPP
|
||||
#define _IBUFFER_ATTRIBUTES_HPP
|
||||
#include "IUserBuffer.hpp"
|
||||
#include "TensorShape.hpp"
|
||||
#include "ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
class UserBufferEncoding;
|
||||
}
|
||||
}
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
|
||||
/**
|
||||
* @brief IBufferAttributes returns a buffer's dimension and alignment
|
||||
* requirements, along with info on its encoding type
|
||||
*/
|
||||
class ZDL_EXPORT IBufferAttributes {
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief Gets the buffer's element size, in bytes
|
||||
*
|
||||
* This can be used to compute the memory size required
|
||||
* to back this buffer.
|
||||
*
|
||||
* @return Element size, in bytes
|
||||
*/
|
||||
virtual size_t getElementSize() const noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the element's encoding type
|
||||
*
|
||||
* @return encoding type
|
||||
*/
|
||||
virtual zdl::DlSystem::UserBufferEncoding::ElementType_t getEncodingType() const noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the number of elements in each dimension
|
||||
*
|
||||
* @return Dimension size, in terms of number of elements
|
||||
*/
|
||||
virtual const TensorShape getDims() const noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the alignment requirement of each dimension
|
||||
*
|
||||
* Alignment per each dimension is expressed as an multiple, for
|
||||
* example, if one particular dimension can accept multiples of 8,
|
||||
* the alignment will be 8.
|
||||
*
|
||||
* @return Alignment in each dimension, in terms of multiple of
|
||||
* number of elements
|
||||
*/
|
||||
virtual const TensorShape getAlignments() const noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the buffer encoding returned from the network responsible
|
||||
* for generating this buffer. Depending on the encoding type, this will
|
||||
* be an instance of an encoding type specific derived class.
|
||||
*
|
||||
* @return Derived user buffer encoding object.
|
||||
*/
|
||||
virtual zdl::DlSystem::UserBufferEncoding* getEncoding() const noexcept = 0;
|
||||
|
||||
virtual ~IBufferAttributes() {}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,127 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2021-2022 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
|
||||
#ifndef DL_SYSTEM_IOBUFFER_DATATYPE_MAP_HPP
|
||||
#define DL_SYSTEM_IOBUFFER_DATATYPE_MAP_HPP
|
||||
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include "DlSystem/DlEnums.hpp"
|
||||
|
||||
namespace DlSystem
|
||||
{
|
||||
// Forward declaration of IOBufferDataTypeMapImpl implementation.
|
||||
class IOBufferDataTypeMapImpl;
|
||||
}
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* The IoBufferDataTypeMap class definition
|
||||
*/
|
||||
class ZDL_EXPORT IOBufferDataTypeMap final
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new Buffer Data type map
|
||||
*
|
||||
*/
|
||||
IOBufferDataTypeMap();
|
||||
|
||||
/**
|
||||
* @brief Adds a name and the corresponding buffer data type
|
||||
* to the map
|
||||
*
|
||||
* @param[name] name The name of the buffer
|
||||
* @param[bufferDataType] buffer Data Type of the buffer
|
||||
*
|
||||
* @note If a buffer with the same name already exists, no new
|
||||
* buffer is added.
|
||||
*/
|
||||
void add(const char* name, zdl::DlSystem::IOBufferDataType_t bufferDataType);
|
||||
|
||||
/**
|
||||
* @brief Removes a buffer name from the map
|
||||
*
|
||||
* @param[name] name The name of the buffer
|
||||
*
|
||||
*/
|
||||
void remove(const char* name);
|
||||
|
||||
/**
|
||||
* @brief Returns the type of the named buffer
|
||||
*
|
||||
* @param[name] name The name of the buffer
|
||||
*
|
||||
* @return The type of the buffer, or UNSPECIFIED if the buffer does not exist
|
||||
*
|
||||
*/
|
||||
zdl::DlSystem::IOBufferDataType_t getBufferDataType(const char* name);
|
||||
|
||||
/**
|
||||
* @brief Returns the type of the first buffer
|
||||
*
|
||||
* @return The type of the first buffer, or UNSPECIFIED if the map is empty.
|
||||
*
|
||||
*/
|
||||
zdl::DlSystem::IOBufferDataType_t getBufferDataType();
|
||||
|
||||
/**
|
||||
* @brief Returns the size of the buffer type map.
|
||||
*
|
||||
* @return The size of the map
|
||||
*
|
||||
*/
|
||||
size_t size();
|
||||
|
||||
/**
|
||||
* @brief Checks the existence of the named buffer in the map
|
||||
*
|
||||
* @return True if the named buffer exists, false otherwise.
|
||||
*
|
||||
*/
|
||||
bool find(const char* name);
|
||||
|
||||
/**
|
||||
* @brief Resets the map
|
||||
*
|
||||
*/
|
||||
void clear();
|
||||
|
||||
/**
|
||||
* @brief Checks whether the map is empty
|
||||
*
|
||||
* @return True if the map is empty, false otherwise.
|
||||
*
|
||||
*/
|
||||
bool empty();
|
||||
|
||||
/**
|
||||
* @brief Destroys the map
|
||||
*
|
||||
*/
|
||||
~IOBufferDataTypeMap();
|
||||
|
||||
private:
|
||||
std::shared_ptr<::DlSystem::IOBufferDataTypeMapImpl> m_IOBufferDataTypeMapImpl;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
-146
@@ -1,146 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015-2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _ITENSOR_HPP_
|
||||
#define _ITENSOR_HPP_
|
||||
|
||||
#include "ITensorItr.hpp"
|
||||
#include "ITensorItrImpl.hpp"
|
||||
#include "TensorShape.hpp"
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <cmath>
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem
|
||||
{
|
||||
class ITensor;
|
||||
}}
|
||||
|
||||
namespace zdl { namespace DlSystem
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* Represents a tensor which holds n-dimensional data. It is important to
|
||||
* understand how the tensor data is represented in memory
|
||||
* relative to the tensor dimensions. Tensors store data in
|
||||
* memory in row-major order (i.e. the last tensor dimension is
|
||||
* the fastest varying one). For example, if you have a two
|
||||
* dimensional tensor with 3 rows and 2 columns (i.e. the tensor
|
||||
* dimensions are 3,2 as returned in tensor dimension vectors)
|
||||
* with the following data in terms rows and columns:
|
||||
*
|
||||
* | 1 2 | <br/>
|
||||
* | 3 4 | <br/>
|
||||
* | 5 6 | <br/>
|
||||
*
|
||||
* This data would be stored in memory as 1,2,3,4,5,6.
|
||||
*/
|
||||
class ZDL_EXPORT ITensor
|
||||
{
|
||||
public:
|
||||
|
||||
typedef zdl::DlSystem::ITensorItr<false> iterator;
|
||||
typedef zdl::DlSystem::ITensorItr<true> const_iterator;
|
||||
|
||||
virtual ~ITensor() {}
|
||||
|
||||
/**
|
||||
* Returns a tensor iterator pointing to the beginning
|
||||
* of the data in the tensor.
|
||||
*
|
||||
* @return A tensor iterator that points to the first data
|
||||
* element in the tensor.
|
||||
*/
|
||||
virtual iterator begin() = 0;
|
||||
|
||||
/**
|
||||
* Returns the const version of a tensor iterator
|
||||
* pointing to the beginning of the data in the tensor.
|
||||
*
|
||||
* @return A tensor const iterator that points to the first data
|
||||
* element in the tensor.
|
||||
*/
|
||||
virtual const_iterator cbegin() const = 0;
|
||||
|
||||
/**
|
||||
* Returns a tensor iterator pointing to the end of the
|
||||
* data in the tensor. This tensor should not be
|
||||
* dereferenced.
|
||||
*
|
||||
* @return A tensor iterator that points to the end of the data
|
||||
* (one past the last element) in the tensor.
|
||||
*/
|
||||
virtual iterator end() = 0;
|
||||
|
||||
/**
|
||||
* Returns the const version of a tensor iterator
|
||||
* pointing to the end of the data in the tensor. This
|
||||
* tensor should not be dereferenced.
|
||||
*
|
||||
* @return A tensor const iterator that points to the end of the
|
||||
* data (one past the last element) in the tensor.
|
||||
*/
|
||||
virtual const_iterator cend() const = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets the shape of this tensor.
|
||||
*
|
||||
* The last element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying dimension, etc.
|
||||
*
|
||||
* @return A shape class holding the tensor dimensions.
|
||||
*/
|
||||
virtual TensorShape getShape() const = 0;
|
||||
|
||||
/**
|
||||
* Returns the element size of the data in the tensor
|
||||
* (discounting strides). This is how big a buffer would
|
||||
* need to be to hold the tensor data contiguously in
|
||||
* memory.
|
||||
*
|
||||
* @return The size of the tensor (in elements).
|
||||
*/
|
||||
virtual size_t getSize() const = 0;
|
||||
|
||||
/**
|
||||
* @brief Serializes the tensor to an output stream.
|
||||
*
|
||||
* @param[in] output The output stream to which to write the tensor
|
||||
*
|
||||
* @throw std::runtime_error If the stream is ever in a bad
|
||||
* state before the tensor is fully serialized.
|
||||
*/
|
||||
virtual void serialize(std::ostream &output) const = 0;
|
||||
|
||||
friend iterator;
|
||||
friend const_iterator;
|
||||
|
||||
virtual bool isQuantized() {return false;}
|
||||
virtual float GetDelta() {return NAN;};
|
||||
virtual float GetOffset() {return NAN;};
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Returns the tensor iterator implementation.
|
||||
*
|
||||
* @return A pointer to the tensor iterator implementation.
|
||||
*/
|
||||
virtual std::unique_ptr<::DlSystem::ITensorItrImpl> getItrImpl() const = 0;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif
|
||||
@@ -1,92 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015-2016 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _ITENSOR_FACTORY_HPP
|
||||
#define _ITENSOR_FACTORY_HPP
|
||||
|
||||
#include "ITensor.hpp"
|
||||
#include "TensorShape.hpp"
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include <istream>
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem
|
||||
{
|
||||
class ITensor;
|
||||
class TensorShape;
|
||||
}
|
||||
}
|
||||
|
||||
namespace zdl { namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* Factory interface class to create ITensor objects.
|
||||
*/
|
||||
class ZDL_EXPORT ITensorFactory
|
||||
{
|
||||
public:
|
||||
virtual ~ITensorFactory() = default;
|
||||
|
||||
/**
|
||||
* Creates a new ITensor with uninitialized data.
|
||||
*
|
||||
* The strides for the tensor will match the tensor dimensions
|
||||
* (i.e., the tensor data is contiguous in memory).
|
||||
*
|
||||
* @param[in] shape The dimensions for the tensor in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
* @return A pointer to the created tensor or nullptr if creating failed.
|
||||
*/
|
||||
virtual std::unique_ptr<ITensor>
|
||||
createTensor(const TensorShape &shape) noexcept = 0;
|
||||
|
||||
/**
|
||||
* Creates a new ITensor by loading it from a file.
|
||||
*
|
||||
* @param[in] input The input stream from which to read the tensor
|
||||
* data.
|
||||
*
|
||||
* @return A pointer to the created tensor or nullptr if creating failed.
|
||||
*
|
||||
*/
|
||||
virtual std::unique_ptr<ITensor> createTensor(std::istream &input) noexcept = 0;
|
||||
|
||||
/**
|
||||
* Create a new ITensor with specific data.
|
||||
* (i.e. the tensor data is contiguous in memory). This tensor is
|
||||
* primarily used to create a tensor where tensor size can't be
|
||||
* computed directly from dimension. One such example is
|
||||
* NV21-formatted image, or any YUV formatted image
|
||||
*
|
||||
* @param[in] shape The dimensions for the tensor in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
* @param[in] data The actual data with which the Tensor object is filled.
|
||||
*
|
||||
* @param[in] dataSize The size of data
|
||||
*
|
||||
* @return A pointer to the created tensor
|
||||
*/
|
||||
virtual std::unique_ptr<ITensor>
|
||||
createTensor(const TensorShape &shape, const unsigned char *data, size_t dataSize) noexcept = 0;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif
|
||||
-182
@@ -1,182 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _ITENSOR_ITR_HPP_
|
||||
#define _ITENSOR_ITR_HPP_
|
||||
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include "ITensorItrImpl.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <iterator>
|
||||
#include <iostream>
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem
|
||||
{
|
||||
template<bool IS_CONST> class ITensorItr;
|
||||
class ITensor;
|
||||
void ZDL_EXPORT fill(ITensorItr<false> first, ITensorItr<false> end, float val);
|
||||
template<class InItr, class OutItr> OutItr ZDL_EXPORT copy(InItr first, InItr last, OutItr result)
|
||||
{
|
||||
return std::copy(first, last, result);
|
||||
}
|
||||
}}
|
||||
namespace DlSystem
|
||||
{
|
||||
class ITensorItrImpl;
|
||||
}
|
||||
|
||||
namespace zdl { namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* A bidirectional iterator (with limited random access
|
||||
* capabilities) for the zdl::DlSystem::ITensor class.
|
||||
*
|
||||
* This is a standard bidrectional iterator and is compatible
|
||||
* with standard algorithm functions that operate on bidirectional
|
||||
* access iterators (e.g., std::copy, std::fill, etc.). It uses a
|
||||
* template parameter to create const and non-const iterators
|
||||
* from the same code. Iterators are easiest to declare via the
|
||||
* typedefs iterator and const_iterator in the ITensor class
|
||||
* (e.g., zdl::DlSystem::ITensor::iterator).
|
||||
*
|
||||
* Note that if the tensor the iterator is traversing was
|
||||
* created with nondefault (i.e., nontrivial) strides, the
|
||||
* iterator will obey the strides when traversing the tensor
|
||||
* data.
|
||||
*
|
||||
* Also note that nontrivial strides dramatically affect the
|
||||
* performance of the iterator (on the order of 20x slower).
|
||||
*/
|
||||
template<bool IS_CONST=true>
|
||||
class ZDL_EXPORT ITensorItr : public std::iterator<std::bidirectional_iterator_tag, float>
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename std::conditional<IS_CONST, const float&, float&>::type VALUE_REF;
|
||||
|
||||
ITensorItr() = delete;
|
||||
virtual ~ITensorItr() {}
|
||||
|
||||
ITensorItr(std::unique_ptr<::DlSystem::ITensorItrImpl> impl,
|
||||
bool isTrivial = false,
|
||||
float* data = nullptr)
|
||||
: m_Impl(impl->clone())
|
||||
, m_IsTrivial(isTrivial)
|
||||
, m_Data(data)
|
||||
, m_DataStart(data) {}
|
||||
|
||||
ITensorItr(const ITensorItr<IS_CONST>& itr)
|
||||
: m_Impl(itr.m_Impl->clone()),
|
||||
m_IsTrivial(itr.m_IsTrivial),
|
||||
m_Data(itr.m_Data),
|
||||
m_DataStart(itr.m_DataStart) {}
|
||||
|
||||
zdl::DlSystem::ITensorItr<IS_CONST>& operator=(const ITensorItr<IS_CONST>& other)
|
||||
{
|
||||
if (this == &other) return *this;
|
||||
m_Impl = std::move(other.m_Impl->clone());
|
||||
m_IsTrivial = other.m_IsTrivial;
|
||||
m_Data = other.m_Data;
|
||||
m_DataStart = other.m_DataStart;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline zdl::DlSystem::ITensorItr<IS_CONST>& operator++()
|
||||
{
|
||||
if (m_IsTrivial) m_Data++; else m_Impl->increment();
|
||||
return *this;
|
||||
}
|
||||
inline zdl::DlSystem::ITensorItr<IS_CONST> operator++(int)
|
||||
{
|
||||
ITensorItr tmp(*this);
|
||||
operator++();
|
||||
return tmp;
|
||||
}
|
||||
inline zdl::DlSystem::ITensorItr<IS_CONST>& operator--()
|
||||
{
|
||||
if (m_IsTrivial) m_Data--; else m_Impl->decrement();
|
||||
return *this;
|
||||
}
|
||||
inline zdl::DlSystem::ITensorItr<IS_CONST> operator--(int)
|
||||
{
|
||||
ITensorItr tmp(*this);
|
||||
operator--();
|
||||
return tmp;
|
||||
}
|
||||
inline zdl::DlSystem::ITensorItr<IS_CONST>& operator+=(int rhs)
|
||||
{
|
||||
if (m_IsTrivial) m_Data += rhs; else m_Impl->increment(rhs);
|
||||
return *this;
|
||||
}
|
||||
inline friend zdl::DlSystem::ITensorItr<IS_CONST> operator+(zdl::DlSystem::ITensorItr<IS_CONST> lhs, int rhs)
|
||||
{ lhs += rhs; return lhs; }
|
||||
inline zdl::DlSystem::ITensorItr<IS_CONST>& operator-=(int rhs)
|
||||
{
|
||||
if (m_IsTrivial) m_Data -= rhs; else m_Impl->decrement(rhs);
|
||||
return *this;
|
||||
}
|
||||
inline friend zdl::DlSystem::ITensorItr<IS_CONST> operator-(zdl::DlSystem::ITensorItr<IS_CONST> lhs, int rhs)
|
||||
{ lhs -= rhs; return lhs; }
|
||||
|
||||
inline size_t operator-(const zdl::DlSystem::ITensorItr<IS_CONST>& rhs)
|
||||
{
|
||||
if (m_IsTrivial) return (m_Data - m_DataStart) - (rhs.m_Data - rhs.m_DataStart);
|
||||
return m_Impl->getPosition() - rhs.m_Impl->getPosition();
|
||||
}
|
||||
|
||||
inline friend bool operator<(const ITensorItr<IS_CONST>& lhs, const ITensorItr<IS_CONST>& rhs)
|
||||
{
|
||||
if (lhs.m_IsTrivial) return lhs.m_Data < rhs.m_Data;
|
||||
return lhs.m_Impl->dataPointer() < rhs.m_Impl->dataPointer();
|
||||
}
|
||||
inline friend bool operator>(const ITensorItr<IS_CONST>& lhs, const ITensorItr<IS_CONST>& rhs)
|
||||
{ return rhs < lhs; }
|
||||
inline friend bool operator<=(const ITensorItr<IS_CONST>& lhs, const ITensorItr<IS_CONST>& rhs)
|
||||
{ return !(lhs > rhs); }
|
||||
inline friend bool operator>=(const ITensorItr<IS_CONST>& lhs, const ITensorItr<IS_CONST>& rhs)
|
||||
{ return !(lhs < rhs); }
|
||||
|
||||
inline bool operator==(const ITensorItr<IS_CONST>& rhs) const
|
||||
{
|
||||
if (m_IsTrivial) return m_Data == rhs.m_Data;
|
||||
return m_Impl->dataPointer() == rhs.m_Impl->dataPointer();
|
||||
}
|
||||
inline bool operator!=(const ITensorItr<IS_CONST>& rhs) const
|
||||
{ return !operator==(rhs); }
|
||||
|
||||
inline VALUE_REF operator[](size_t idx)
|
||||
{
|
||||
if (m_IsTrivial) return *(m_DataStart + idx);
|
||||
return m_Impl->getReferenceAt(idx);
|
||||
}
|
||||
inline VALUE_REF operator*()
|
||||
{ if (m_IsTrivial) return *m_Data; else return m_Impl->getReference(); }
|
||||
inline VALUE_REF operator->()
|
||||
{ return *(*this); }
|
||||
inline float* dataPointer() const
|
||||
{ if (m_IsTrivial) return m_Data; else return m_Impl->dataPointer(); }
|
||||
|
||||
|
||||
protected:
|
||||
std::unique_ptr<::DlSystem::ITensorItrImpl> m_Impl;
|
||||
bool m_IsTrivial = false;
|
||||
float* m_Data = nullptr;
|
||||
float* m_DataStart = nullptr;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif
|
||||
@@ -1,42 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2015-2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _ITENSOR_ITR_IMPL_HPP_
|
||||
#define _ITENSOR_ITR_IMPL_HPP_
|
||||
|
||||
#include "ZdlExportDefine.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <iterator>
|
||||
|
||||
namespace DlSystem
|
||||
{
|
||||
class ITensorItrImpl;
|
||||
}
|
||||
|
||||
class ZDL_EXPORT DlSystem::ITensorItrImpl
|
||||
{
|
||||
public:
|
||||
ITensorItrImpl() {}
|
||||
virtual ~ITensorItrImpl() {}
|
||||
|
||||
virtual float getValue() const = 0;
|
||||
virtual float& getReference() = 0;
|
||||
virtual float& getReferenceAt(size_t idx) = 0;
|
||||
virtual float* dataPointer() const = 0;
|
||||
virtual void increment(int incVal = 1) = 0;
|
||||
virtual void decrement(int decVal = 1) = 0;
|
||||
virtual size_t getPosition() = 0;
|
||||
virtual std::unique_ptr<DlSystem::ITensorItrImpl> clone() = 0;
|
||||
|
||||
private:
|
||||
ITensorItrImpl& operator=(const ITensorItrImpl& other) = delete;
|
||||
ITensorItrImpl(const ITensorItrImpl& other) = delete;
|
||||
};
|
||||
|
||||
#endif
|
||||
-105
@@ -1,105 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2016-2021 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _DL_SYSTEM_IUDL_HPP_
|
||||
#define _DL_SYSTEM_IUDL_HPP_
|
||||
|
||||
#include "ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
|
||||
/**
|
||||
* NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
|
||||
*
|
||||
* @brief .
|
||||
*
|
||||
* Base class user concrete UDL implementation.
|
||||
*
|
||||
* All functions are marked as:
|
||||
*
|
||||
* - virtual
|
||||
* - noexcept
|
||||
*
|
||||
* User should make sure no exceptions are propagated outside of
|
||||
* their module. Errors can be communicated via return values.
|
||||
*/
|
||||
class ZDL_EXPORT IUDL {
|
||||
public:
|
||||
/**
|
||||
* NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
|
||||
*
|
||||
* @brief .
|
||||
*
|
||||
* Destructor
|
||||
*/
|
||||
virtual ~IUDL() = default;
|
||||
|
||||
/**
|
||||
* NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
|
||||
*
|
||||
* @brief Sets up the user's environment.
|
||||
* This is called by the SNPE framework to allow the user the
|
||||
* opportunity to setup anything which is needed for running
|
||||
* user defined layers.
|
||||
*
|
||||
* @param cookie User provided opaque data returned by the SNPE
|
||||
* runtime
|
||||
*
|
||||
* @param insz How many elements in input size array
|
||||
* @param indim Pointer to a buffer that holds input dimension
|
||||
* array
|
||||
* @param indimsz Input dimension size array of the buffer
|
||||
* 'indim'. Corresponds to indim
|
||||
*
|
||||
* @param outsz How many elements in output size array
|
||||
* @param outdim Pointer to a buffer that holds output
|
||||
* dimension array
|
||||
* @param outdimsz Output dimension size of the buffer 'oudim'.
|
||||
* Corresponds to indim
|
||||
*
|
||||
* @return true on success, false otherwise
|
||||
*/
|
||||
virtual bool setup(void *cookie,
|
||||
size_t insz, const size_t **indim, const size_t *indimsz,
|
||||
size_t outsz, const size_t **outdim, const size_t *outdimsz) = 0;
|
||||
|
||||
/**
|
||||
* NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
|
||||
*
|
||||
* @brief Close the instance. Invoked by the SNPE
|
||||
* framework to allow the user the opportunity to release any resources
|
||||
* allocated during setup.
|
||||
*
|
||||
* @param cookie - User provided opaque data returned by the SNPE runtime
|
||||
*/
|
||||
virtual void close(void *cookie) noexcept = 0;
|
||||
|
||||
/**
|
||||
* NOTE: DEPRECATED, MAY BE REMOVED IN THE FUTURE.
|
||||
*
|
||||
* @brief Execute the user defined layer
|
||||
*
|
||||
* @param cookie User provided opaque data returned by the SNPE
|
||||
* runtime
|
||||
*
|
||||
* @param input Const pointer to a float buffer that contains
|
||||
* the input
|
||||
*
|
||||
* @param output Float pointer to a buffer that would hold
|
||||
* the user defined layer's output. This buffer
|
||||
* is allocated and owned by SNPE runtime.
|
||||
*/
|
||||
virtual bool execute(void *cookie, const float **input, float **output) = 0;
|
||||
};
|
||||
|
||||
} // ns DlSystem
|
||||
|
||||
} // ns zdl
|
||||
|
||||
#endif // _DL_SYSTEM_IUDL_HPP_
|
||||
-358
@@ -1,358 +0,0 @@
|
||||
//==============================================================================
|
||||
//
|
||||
// Copyright (c) 2017-2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
#ifndef _IUSER_BUFFER_HPP
|
||||
#define _IUSER_BUFFER_HPP
|
||||
|
||||
#include "TensorShape.hpp"
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include <math.h>
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A base class buffer encoding type
|
||||
*/
|
||||
class ZDL_EXPORT UserBufferEncoding {
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* An enum class of all supported element types in a IUserBuffer
|
||||
*/
|
||||
enum class ElementType_t
|
||||
{
|
||||
/// Unknown element type.
|
||||
UNKNOWN = 0,
|
||||
|
||||
/// Each element is presented by float.
|
||||
FLOAT = 1,
|
||||
|
||||
/// Each element is presented by an unsigned int.
|
||||
UNSIGNED8BIT = 2,
|
||||
|
||||
/// Each element is presented by an 8-bit quantized value.
|
||||
TF8 = 10,
|
||||
|
||||
/// Each element is presented by an 16-bit quantized value.
|
||||
TF16 = 11
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Retrieves the size of the element, in bytes.
|
||||
*
|
||||
* @return Size of the element, in bytes.
|
||||
*/
|
||||
virtual size_t getElementSize() const noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Retrieves the element type
|
||||
*
|
||||
* @return Element type
|
||||
*/
|
||||
ElementType_t getElementType() const noexcept {return m_ElementType;};
|
||||
|
||||
virtual ~UserBufferEncoding() {}
|
||||
|
||||
protected:
|
||||
UserBufferEncoding(ElementType_t elementType) : m_ElementType(elementType) {};
|
||||
private:
|
||||
const ElementType_t m_ElementType;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A base class buffer source type
|
||||
*
|
||||
* @note User buffer from CPU support all kinds of runtimes;
|
||||
* User buffer from GLBUFFER support only GPU runtime.
|
||||
*/
|
||||
class ZDL_EXPORT UserBufferSource {
|
||||
public:
|
||||
enum class SourceType_t
|
||||
{
|
||||
/// Unknown buffer source type.
|
||||
UNKNOWN = 0,
|
||||
|
||||
/// The network inputs are from CPU buffer.
|
||||
CPU = 1,
|
||||
|
||||
/// The network inputs are from OpenGL buffer.
|
||||
GLBUFFER = 2
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Retrieves the source type
|
||||
*
|
||||
* @return Source type
|
||||
*/
|
||||
SourceType_t getSourceType() const noexcept {return m_SourceType;};
|
||||
|
||||
protected:
|
||||
UserBufferSource(SourceType_t sourceType): m_SourceType(sourceType) {};
|
||||
private:
|
||||
const SourceType_t m_SourceType;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* An source type where input data is delivered from OpenGL buffer
|
||||
*/
|
||||
class ZDL_EXPORT UserBufferSourceGLBuffer : public UserBufferSource{
|
||||
public:
|
||||
UserBufferSourceGLBuffer() : UserBufferSource(SourceType_t::GLBUFFER) {};
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* An encoding type where each element is represented by an unsigned int
|
||||
*/
|
||||
class ZDL_EXPORT UserBufferEncodingUnsigned8Bit : public UserBufferEncoding {
|
||||
public:
|
||||
UserBufferEncodingUnsigned8Bit() : UserBufferEncoding(ElementType_t::UNSIGNED8BIT) {};
|
||||
size_t getElementSize() const noexcept override;
|
||||
|
||||
protected:
|
||||
UserBufferEncodingUnsigned8Bit(ElementType_t elementType) : UserBufferEncoding(elementType) {};
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* An encoding type where each element is represented by a float
|
||||
*/
|
||||
class ZDL_EXPORT UserBufferEncodingFloat : public UserBufferEncoding {
|
||||
public:
|
||||
UserBufferEncodingFloat() : UserBufferEncoding(ElementType_t::FLOAT) {};
|
||||
size_t getElementSize() const noexcept override;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* An encoding type where each element is represented by tf8, which is an
|
||||
* 8-bit quantizd value, which has an exact representation of 0.0
|
||||
*/
|
||||
class ZDL_EXPORT UserBufferEncodingTfN : public UserBufferEncoding {
|
||||
public:
|
||||
UserBufferEncodingTfN() = delete;
|
||||
UserBufferEncodingTfN(uint64_t stepFor0, float stepSize, uint8_t bWidth=8):
|
||||
UserBufferEncoding(getTypeFromWidth(bWidth)),
|
||||
bitWidth(bWidth),
|
||||
m_StepExactly0(stepFor0),
|
||||
m_QuantizedStepSize(stepSize){};
|
||||
|
||||
UserBufferEncodingTfN(const zdl::DlSystem::UserBufferEncoding &ubEncoding) : UserBufferEncoding(ubEncoding.getElementType()){
|
||||
const zdl::DlSystem::UserBufferEncodingTfN* ubEncodingTfN
|
||||
= dynamic_cast <const zdl::DlSystem::UserBufferEncodingTfN*> (&ubEncoding);
|
||||
if (ubEncodingTfN) {
|
||||
m_StepExactly0 = ubEncodingTfN->getStepExactly0();
|
||||
m_QuantizedStepSize = ubEncodingTfN->getQuantizedStepSize();
|
||||
bitWidth = ubEncodingTfN->bitWidth;
|
||||
}
|
||||
}
|
||||
|
||||
size_t getElementSize() const noexcept override;
|
||||
/**
|
||||
* @brief Sets the step value that represents 0
|
||||
*
|
||||
* @param[in] stepExactly0 The step value that represents 0
|
||||
*
|
||||
*/
|
||||
void setStepExactly0(uint64_t stepExactly0) {
|
||||
m_StepExactly0 = stepExactly0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the float value that each step represents
|
||||
*
|
||||
* @param[in] quantizedStepSize The float value of each step size
|
||||
*
|
||||
*/
|
||||
void setQuantizedStepSize(const float quantizedStepSize) {
|
||||
m_QuantizedStepSize = quantizedStepSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the step that represents 0.0
|
||||
*
|
||||
* @return Step value
|
||||
*/
|
||||
uint64_t getStepExactly0() const {
|
||||
return m_StepExactly0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the minimum floating point value that
|
||||
* can be represented with this encoding.
|
||||
*
|
||||
* @return Minimum representable floating point value
|
||||
*/
|
||||
float getMin() const {
|
||||
return static_cast<float>(m_QuantizedStepSize * (0 - (double)m_StepExactly0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the maximum floating point value that
|
||||
* can be represented with this encoding.
|
||||
*
|
||||
* @return Maximum representable floating point value
|
||||
*/
|
||||
float getMax() const{
|
||||
return static_cast<float>(m_QuantizedStepSize * (pow(2,bitWidth)-1 - (double)m_StepExactly0));
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Retrieves the step size
|
||||
*
|
||||
* @return Step size
|
||||
*/
|
||||
float getQuantizedStepSize() const {
|
||||
return m_QuantizedStepSize;
|
||||
}
|
||||
|
||||
ElementType_t getTypeFromWidth(uint8_t width);
|
||||
|
||||
uint8_t bitWidth;
|
||||
protected:
|
||||
uint64_t m_StepExactly0;
|
||||
float m_QuantizedStepSize;
|
||||
};
|
||||
|
||||
|
||||
class ZDL_EXPORT UserBufferEncodingTf8 : public UserBufferEncodingTfN {
|
||||
public:
|
||||
UserBufferEncodingTf8() = delete;
|
||||
UserBufferEncodingTf8(unsigned char stepFor0, float stepSize) :
|
||||
UserBufferEncodingTfN(stepFor0, stepSize) {};
|
||||
|
||||
UserBufferEncodingTf8(const zdl::DlSystem::UserBufferEncoding &ubEncoding) : UserBufferEncodingTfN(ubEncoding){}
|
||||
|
||||
/**
|
||||
* @brief Sets the step value that represents 0
|
||||
*
|
||||
* @param[in] stepExactly0 The step value that represents 0
|
||||
*
|
||||
*/
|
||||
|
||||
void setStepExactly0(const unsigned char stepExactly0) {
|
||||
UserBufferEncodingTfN::m_StepExactly0 = stepExactly0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the step that represents 0.0
|
||||
*
|
||||
* @return Step value
|
||||
*/
|
||||
|
||||
unsigned char getStepExactly0() const {
|
||||
return UserBufferEncodingTfN::m_StepExactly0;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief UserBuffer contains a pointer and info on how to walk it and interpret its content.
|
||||
*/
|
||||
class ZDL_EXPORT IUserBuffer {
|
||||
public:
|
||||
virtual ~IUserBuffer() = default;
|
||||
|
||||
/**
|
||||
* @brief Retrieves the total number of bytes between elements in each dimension if
|
||||
* the buffer were to be interpreted as a multi-dimensional array.
|
||||
*
|
||||
* @return Number of bytes between elements in each dimension.
|
||||
* e.g. A tightly packed tensor of floats with dimensions [4, 3, 2] would
|
||||
* return strides of [24, 8, 4].
|
||||
*/
|
||||
virtual const TensorShape& getStrides() const = 0;
|
||||
|
||||
/**
|
||||
* @brief Retrieves the size of the buffer, in bytes.
|
||||
*
|
||||
* @return Size of the underlying buffer, in bytes.
|
||||
*/
|
||||
virtual size_t getSize() const = 0;
|
||||
|
||||
/**
|
||||
* @brief Retrieves the size of the inference data in the buffer, in bytes.
|
||||
*
|
||||
* The inference results from a dynamic-sized model may not be exactly the same size
|
||||
* as the UserBuffer provided to SNPE. This function can be used to get the amount
|
||||
* of output inference data, which may be less or greater than the size of the UserBuffer.
|
||||
*
|
||||
* If the inference results fit in the UserBuffer, getOutputSize() would be less than
|
||||
* or equal to getSize(). But if the inference results were more than the capacity of
|
||||
* the provided UserBuffer, the results would be truncated to fit the UserBuffer. But,
|
||||
* getOutputSize() would be greater than getSize(), which indicates a bigger buffer
|
||||
* needs to be provided to SNPE to hold all of the inference results.
|
||||
*
|
||||
* @return Size required for the buffer to hold all inference results, which can be less
|
||||
* or more than the size of the buffer, in bytes.
|
||||
*/
|
||||
virtual size_t getOutputSize() const = 0;
|
||||
|
||||
/**
|
||||
* @brief Changes the underlying memory that backs the UserBuffer.
|
||||
*
|
||||
* This can be used to avoid creating multiple UserBuffer objects
|
||||
* when the only thing that differs is the memory location.
|
||||
*
|
||||
* @param[in] buffer Pointer to the memory location
|
||||
*
|
||||
* @return Whether the set succeeds.
|
||||
*/
|
||||
virtual bool setBufferAddress(void *buffer) noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets a const reference to the data encoding object of
|
||||
* the underlying buffer
|
||||
*
|
||||
* This is necessary when the UserBuffer is filled by SNPE with
|
||||
* data types such as TF8, where the caller needs to know the quantization
|
||||
* parameters in order to interpret the data properly
|
||||
*
|
||||
* @return A read-only encoding object
|
||||
*/
|
||||
virtual const UserBufferEncoding& getEncoding() const noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Gets a reference to the data encoding object of
|
||||
* the underlying buffer
|
||||
*
|
||||
* This is necessary when the UserBuffer is re-used, and the encoding
|
||||
* parameters can change. For example, each input can be quantized with
|
||||
* different step sizes.
|
||||
*
|
||||
* @return Data encoding meta-data
|
||||
*/
|
||||
virtual UserBufferEncoding& getEncoding() noexcept = 0;
|
||||
|
||||
};
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,81 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2017 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _IUSERBUFFER_FACTORY_HPP
|
||||
#define _IUSERBUFFER_FACTORY_HPP
|
||||
|
||||
#include "IUserBuffer.hpp"
|
||||
#include "TensorShape.hpp"
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include "DlEnums.hpp"
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
class IUserBuffer;
|
||||
|
||||
class TensorShape;
|
||||
}
|
||||
}
|
||||
|
||||
namespace zdl {
|
||||
namespace DlSystem {
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* Factory interface class to create IUserBuffer objects.
|
||||
*/
|
||||
class ZDL_EXPORT IUserBufferFactory {
|
||||
public:
|
||||
virtual ~IUserBufferFactory() = default;
|
||||
|
||||
/**
|
||||
* @brief Creates a UserBuffer
|
||||
*
|
||||
* @param[in] buffer Pointer to the buffer that the caller supplies
|
||||
*
|
||||
* @param[in] bufSize Buffer size, in bytes
|
||||
*
|
||||
* @param[in] strides Total number of bytes between elements in each dimension.
|
||||
* E.g. A tightly packed tensor of floats with dimensions [4, 3, 2] would have strides of [24, 8, 4].
|
||||
*
|
||||
* @param[in] userBufferEncoding Reference to an UserBufferEncoding object
|
||||
*
|
||||
* @note Caller has to ensure that memory pointed to by buffer stays accessible
|
||||
* for the lifetime of the object created
|
||||
*/
|
||||
virtual std::unique_ptr<IUserBuffer>
|
||||
createUserBuffer(void *buffer, size_t bufSize, const zdl::DlSystem::TensorShape &strides, zdl::DlSystem::UserBufferEncoding* userBufferEncoding) noexcept = 0;
|
||||
|
||||
/**
|
||||
* @brief Creates a UserBuffer
|
||||
*
|
||||
* @param[in] buffer Pointer to the buffer that the caller supplies
|
||||
*
|
||||
* @param[in] bufSize Buffer size, in bytes
|
||||
*
|
||||
* @param[in] strides Total number of bytes between elements in each dimension.
|
||||
* E.g. A tightly packed tensor of floats with dimensions [4, 3, 2] would have strides of [24, 8, 4].
|
||||
*
|
||||
* @param[in] userBufferEncoding Reference to an UserBufferEncoding object
|
||||
*
|
||||
* @param[in] userBufferSource Reference to an UserBufferSource object
|
||||
*
|
||||
* @note Caller has to ensure that memory pointed to by buffer stays accessible
|
||||
* for the lifetime of the object created
|
||||
*/
|
||||
virtual std::unique_ptr<IUserBuffer>
|
||||
createUserBuffer(void *buffer, size_t bufSize, const zdl::DlSystem::TensorShape &strides, zdl::DlSystem::UserBufferEncoding* userBufferEncoding, zdl::DlSystem::UserBufferSource* userBufferSource) noexcept = 0;
|
||||
};
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,230 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2017-2018,2021 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef _DL_SYSTEM_PLATFORM_CONFIG_HPP_
|
||||
#define _DL_SYSTEM_PLATFORM_CONFIG_HPP_
|
||||
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace zdl{
|
||||
namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A structure OpenGL configuration
|
||||
*
|
||||
* @note When certain OpenGL context and display are provided to UserGLConfig for using
|
||||
* GPU buffer as input directly, the user MUST ensure the particular OpenGL
|
||||
* context and display remain vaild throughout the execution of neural network models.
|
||||
*/
|
||||
struct ZDL_EXPORT UserGLConfig
|
||||
{
|
||||
/// Holds user EGL context.
|
||||
///
|
||||
void* userGLContext = nullptr;
|
||||
|
||||
/// Holds user EGL display.
|
||||
void* userGLDisplay = nullptr;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A structure Gpu configuration
|
||||
*/
|
||||
struct ZDL_EXPORT UserGpuConfig{
|
||||
/// Holds user OpenGL configuration.
|
||||
///
|
||||
UserGLConfig userGLConfig;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A class user platform configuration
|
||||
*/
|
||||
class ZDL_EXPORT PlatformConfig
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* An enum class of all supported platform types
|
||||
*/
|
||||
enum class PlatformType_t
|
||||
{
|
||||
/// Unknown platform type.
|
||||
UNKNOWN = 0,
|
||||
|
||||
/// Snapdragon CPU.
|
||||
CPU = 1,
|
||||
|
||||
/// Adreno GPU.
|
||||
GPU = 2,
|
||||
|
||||
/// Hexagon DSP.
|
||||
DSP = 3
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A union class user platform configuration information
|
||||
*/
|
||||
union PlatformConfigInfo
|
||||
{
|
||||
/// Holds user GPU Configuration.
|
||||
///
|
||||
UserGpuConfig userGpuConfig;
|
||||
|
||||
PlatformConfigInfo(){};
|
||||
};
|
||||
|
||||
PlatformConfig() : m_PlatformType(PlatformType_t::UNKNOWN),
|
||||
m_PlatformOptions("") {};
|
||||
|
||||
/**
|
||||
* @brief Retrieves the platform type
|
||||
*
|
||||
* @return Platform type
|
||||
*/
|
||||
PlatformType_t getPlatformType() const {return m_PlatformType;};
|
||||
|
||||
/**
|
||||
* @brief Indicates whther the plaform configuration is valid.
|
||||
*
|
||||
* @return True if the platform configuration is valid; false otherwise.
|
||||
*/
|
||||
bool isValid() const {return (PlatformType_t::UNKNOWN != m_PlatformType);};
|
||||
|
||||
/**
|
||||
* @brief Retrieves the Gpu configuration
|
||||
*
|
||||
* @param[out] userGpuConfig The passed in userGpuConfig populated with the Gpu configuration on return.
|
||||
*
|
||||
* @return True if Gpu configuration was retrieved; false otherwise.
|
||||
*/
|
||||
bool getUserGpuConfig(UserGpuConfig& userGpuConfig) const
|
||||
{
|
||||
if(m_PlatformType == PlatformType_t::GPU)
|
||||
{
|
||||
userGpuConfig = m_PlatformConfigInfo.userGpuConfig;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the Gpu configuration
|
||||
*
|
||||
* @param[in] userGpuConfig Gpu Configuration
|
||||
*
|
||||
* @return True if Gpu configuration was successfully set; false otherwise.
|
||||
*/
|
||||
bool setUserGpuConfig(UserGpuConfig& userGpuConfig)
|
||||
{
|
||||
if((userGpuConfig.userGLConfig.userGLContext != nullptr) && (userGpuConfig.userGLConfig.userGLDisplay != nullptr))
|
||||
{
|
||||
switch (m_PlatformType)
|
||||
{
|
||||
case PlatformType_t::GPU:
|
||||
m_PlatformConfigInfo.userGpuConfig = userGpuConfig;
|
||||
return true;
|
||||
case PlatformType_t::UNKNOWN:
|
||||
m_PlatformType = PlatformType_t::GPU;
|
||||
m_PlatformConfigInfo.userGpuConfig = userGpuConfig;
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the platform options
|
||||
*
|
||||
* @param[in] options Options as a string in the form of "keyword:options"
|
||||
*
|
||||
* @return True if options are pass validation; otherwise false. If false, the options are not updated.
|
||||
*/
|
||||
bool setPlatformOptions(std::string options) {
|
||||
std::string oldOptions = m_PlatformOptions;
|
||||
m_PlatformOptions = options;
|
||||
if (isOptionsValid()) {
|
||||
return true;
|
||||
} else {
|
||||
m_PlatformOptions = oldOptions;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Indicates whther the plaform configuration is valid.
|
||||
*
|
||||
* @return True if the platform configuration is valid; false otherwise.
|
||||
*/
|
||||
bool isOptionsValid() const;
|
||||
|
||||
/**
|
||||
* @brief Gets the platform options
|
||||
*
|
||||
* @return Options as a string
|
||||
*/
|
||||
std::string getPlatformOptions() const { return m_PlatformOptions; }
|
||||
|
||||
/**
|
||||
* @brief Sets the platform options
|
||||
*
|
||||
* @param[in] optionName Name of platform options"
|
||||
* @param[in] value Value of specified optionName
|
||||
*
|
||||
* @return If true, add "optionName:value" to platform options if optionName don't exist, otherwise update the
|
||||
* value of specified optionName.
|
||||
* If false, the platform options will not be changed.
|
||||
*/
|
||||
bool setPlatformOptionValue(const std::string& optionName, const std::string& value);
|
||||
|
||||
/**
|
||||
* @brief Removes the platform options
|
||||
*
|
||||
* @param[in] optionName Name of platform options"
|
||||
* @param[in] value Value of specified optionName
|
||||
*
|
||||
* @return If true, removed "optionName:value" to platform options if optionName don't exist, do nothing.
|
||||
* If false, the platform options will not be changed.
|
||||
*/
|
||||
bool removePlatformOptionValue(const std::string& optionName, const std::string& value);
|
||||
|
||||
static void SetIsUserGLBuffer(bool isUserGLBuffer);
|
||||
static bool GetIsUserGLBuffer();
|
||||
|
||||
private:
|
||||
PlatformType_t m_PlatformType;
|
||||
PlatformConfigInfo m_PlatformConfigInfo;
|
||||
std::string m_PlatformOptions;
|
||||
static bool m_IsUserGLBuffer;
|
||||
};
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
}} //namespace end
|
||||
|
||||
#endif
|
||||
-154
@@ -1,154 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2019 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include "DlSystem/DlEnums.hpp"
|
||||
#include "DlSystem/StringList.hpp"
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
|
||||
#ifndef DL_SYSTEM_RUNTIME_LIST_HPP
|
||||
#define DL_SYSTEM_RUNTIME_LIST_HPP
|
||||
|
||||
namespace DlSystem
|
||||
{
|
||||
// Forward declaration of Runtime List implementation.
|
||||
class RuntimeListImpl;
|
||||
}
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A class representing list of runtimes
|
||||
*/
|
||||
class ZDL_EXPORT RuntimeList final
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new runtime list
|
||||
*
|
||||
*/
|
||||
RuntimeList();
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* copy constructor.
|
||||
* @param[in] other object to copy.
|
||||
*/
|
||||
RuntimeList(const RuntimeList& other);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* constructor with single Runtime_t object
|
||||
* @param[in] Runtime_t object
|
||||
*/
|
||||
RuntimeList(const zdl::DlSystem::Runtime_t& runtime);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* assignment operator.
|
||||
*/
|
||||
RuntimeList& operator=(const RuntimeList& other);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* subscript operator.
|
||||
*/
|
||||
Runtime_t& operator[](size_t index);
|
||||
|
||||
/**
|
||||
* @brief Adds runtime to the end of the runtime list
|
||||
* order of precedence is former followed by latter entry
|
||||
*
|
||||
* @param[in] runtime to add
|
||||
*
|
||||
* Ruturns false If the runtime already exists
|
||||
*/
|
||||
bool add(const zdl::DlSystem::Runtime_t& runtime);
|
||||
|
||||
/**
|
||||
* @brief Removes the runtime from the list
|
||||
*
|
||||
* @param[in] runtime to be removed
|
||||
*
|
||||
* @note If the runtime is not found, nothing is done.
|
||||
*/
|
||||
void remove(const zdl::DlSystem::Runtime_t runtime) noexcept;
|
||||
|
||||
/**
|
||||
* @brief Returns the number of runtimes in the list
|
||||
*/
|
||||
size_t size() const noexcept;
|
||||
|
||||
/**
|
||||
* @brief Returns true if the list is empty
|
||||
*/
|
||||
bool empty() const noexcept;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Removes all runtime from the list
|
||||
*/
|
||||
void clear() noexcept;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Returns a StringList of names from the runtime list in
|
||||
* order of precedence
|
||||
*/
|
||||
zdl::DlSystem::StringList getRuntimeListNames() const;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* @param[in] runtime string
|
||||
* Returns a Runtime enum corresponding to the in param string
|
||||
*
|
||||
*/
|
||||
static zdl::DlSystem::Runtime_t stringToRuntime(const char* runtimeStr);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* @param[in] runtime
|
||||
* Returns a string corresponding to the in param runtime enum
|
||||
*
|
||||
*/
|
||||
static const char* runtimeToString(const zdl::DlSystem::Runtime_t runtime);
|
||||
|
||||
~RuntimeList();
|
||||
|
||||
private:
|
||||
void deepCopy(const RuntimeList &other);
|
||||
std::unique_ptr<::DlSystem::RuntimeListImpl> m_RuntimeListImpl;
|
||||
};
|
||||
|
||||
} // DlSystem namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // DL_SYSTEM_RUNTIME_LIST_HPP
|
||||
|
||||
-104
@@ -1,104 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2017, 2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#ifndef PLATFORM_STANDARD_STRING_HPP
|
||||
#define PLATFORM_STANDARD_STRING_HPP
|
||||
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <ostream>
|
||||
#include "DlSystem/ZdlExportDefine.hpp"
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Class for wrapping char * as a really stripped down std::string replacement.
|
||||
*/
|
||||
class ZDL_EXPORT String final
|
||||
{
|
||||
public:
|
||||
String() = delete;
|
||||
|
||||
/**
|
||||
* Construct a string from std::string reference.
|
||||
* @param str Reference to a std::string
|
||||
*/
|
||||
explicit String(const std::string& str);
|
||||
|
||||
/**
|
||||
* Construct a string from char* reference.
|
||||
* @param a char*
|
||||
*/
|
||||
explicit String(const char* str);
|
||||
|
||||
/**
|
||||
* move constructor.
|
||||
*/
|
||||
String(String&& other) noexcept;
|
||||
|
||||
/**
|
||||
* copy constructor.
|
||||
*/
|
||||
String(const String& other) = delete;
|
||||
|
||||
/**
|
||||
* assignment operator.
|
||||
*/
|
||||
String& operator=(const String&) = delete;
|
||||
|
||||
/**
|
||||
* move assignment operator.
|
||||
*/
|
||||
String& operator=(String&&) = delete;
|
||||
|
||||
/**
|
||||
* class comparators
|
||||
*/
|
||||
bool operator<(const String& rhs) const noexcept;
|
||||
bool operator>(const String& rhs) const noexcept;
|
||||
bool operator<=(const String& rhs) const noexcept;
|
||||
bool operator>=(const String& rhs) const noexcept;
|
||||
bool operator==(const String& rhs) const noexcept;
|
||||
bool operator!=(const String& rhs) const noexcept;
|
||||
|
||||
/**
|
||||
* class comparators against std::string
|
||||
*/
|
||||
bool operator<(const std::string& rhs) const noexcept;
|
||||
bool operator>(const std::string& rhs) const noexcept;
|
||||
bool operator<=(const std::string& rhs) const noexcept;
|
||||
bool operator>=(const std::string& rhs) const noexcept;
|
||||
bool operator==(const std::string& rhs) const noexcept;
|
||||
bool operator!=(const std::string& rhs) const noexcept;
|
||||
|
||||
const char* c_str() const noexcept;
|
||||
|
||||
~String();
|
||||
private:
|
||||
|
||||
char* m_string;
|
||||
};
|
||||
|
||||
/**
|
||||
* overloaded << operator
|
||||
*/
|
||||
ZDL_EXPORT std::ostream& operator<<(std::ostream& os, const String& str) noexcept;
|
||||
|
||||
} // DlSystem namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // PLATFORM_STANDARD_STRING_HPP
|
||||
-107
@@ -1,107 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2016 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
#include <cstdio>
|
||||
#include "ZdlExportDefine.hpp"
|
||||
|
||||
#ifndef DL_SYSTEM_STRINGLIST_HPP
|
||||
#define DL_SYSTEM_STRINGLIST_HPP
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Class for holding an order list of null-terminated ASCII strings.
|
||||
*/
|
||||
class ZDL_EXPORT StringList final
|
||||
{
|
||||
public:
|
||||
StringList() {}
|
||||
|
||||
/**
|
||||
* Construct a string list with some pre-allocated memory.
|
||||
* @warning Contents of the list will be uninitialized
|
||||
* @param[in] length Number of elements for which to pre-allocate space.
|
||||
*/
|
||||
explicit StringList(size_t length);
|
||||
|
||||
/**
|
||||
* Append a string to the list.
|
||||
* @param[in] str Null-terminated ASCII string to append to the list.
|
||||
*/
|
||||
void append(const char* str);
|
||||
|
||||
/**
|
||||
* Returns the string at the indicated position,
|
||||
* or an empty string if the positions is greater than the size
|
||||
* of the list.
|
||||
* @param[in] idx Position in the list of the desired string
|
||||
*/
|
||||
const char* at(size_t idx) const noexcept;
|
||||
|
||||
/**
|
||||
* Pointer to the first string in the list.
|
||||
* Can be used to iterate through the list.
|
||||
*/
|
||||
const char** begin() const noexcept;
|
||||
|
||||
/**
|
||||
* Pointer to one after the last string in the list.
|
||||
* Can be used to iterate through the list.
|
||||
*/
|
||||
const char** end() const noexcept;
|
||||
|
||||
/**
|
||||
* Return the number of valid string pointers held by this list.
|
||||
*/
|
||||
size_t size() const noexcept;
|
||||
|
||||
|
||||
/**
|
||||
* assignment operator.
|
||||
*/
|
||||
StringList& operator=(const StringList&) noexcept;
|
||||
|
||||
/**
|
||||
* copy constructor.
|
||||
* @param[in] other object to copy.
|
||||
*/
|
||||
StringList(const StringList& other);
|
||||
|
||||
/**
|
||||
* move constructor.
|
||||
* @param[in] other object to move.
|
||||
*/
|
||||
StringList(StringList&& other) noexcept;
|
||||
|
||||
~StringList();
|
||||
private:
|
||||
void copy(const StringList& other);
|
||||
|
||||
void resize(size_t length);
|
||||
|
||||
void clear();
|
||||
|
||||
static const char* s_Empty;
|
||||
const char** m_Strings = nullptr;
|
||||
const char** m_End = nullptr;
|
||||
size_t m_Size = 0;
|
||||
};
|
||||
|
||||
} // DlSystem namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // DL_SYSTEM_STRINGLIST_HPP
|
||||
|
||||
-120
@@ -1,120 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2016 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
#include <memory>
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include "ITensor.hpp"
|
||||
#include "StringList.hpp"
|
||||
|
||||
#ifndef DL_SYSTEM_TENSOR_MAP_HPP
|
||||
#define DL_SYSTEM_TENSOR_MAP_HPP
|
||||
|
||||
namespace DlSystem
|
||||
{
|
||||
// Forward declaration of tensor map implementation.
|
||||
class TensorMapImpl;
|
||||
}
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A class representing the map of tensor.
|
||||
*/
|
||||
class ZDL_EXPORT TensorMap final
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new empty tensor map
|
||||
*/
|
||||
TensorMap();
|
||||
|
||||
/**
|
||||
* copy constructor.
|
||||
* @param[in] other object to copy.
|
||||
*/
|
||||
TensorMap(const TensorMap& other);
|
||||
|
||||
/**
|
||||
* assignment operator.
|
||||
*/
|
||||
TensorMap& operator=(const TensorMap& other);
|
||||
|
||||
/**
|
||||
* @brief Adds a name and the corresponding tensor pointer
|
||||
* to the map
|
||||
*
|
||||
* @param[in] name The name of the tensor
|
||||
* @param[out] tensor The pointer to the tensor
|
||||
*
|
||||
* @note If a tensor with the same name already exists, the
|
||||
* tensor is replaced with the existing tensor.
|
||||
*/
|
||||
void add(const char *name, zdl::DlSystem::ITensor *tensor);
|
||||
|
||||
/**
|
||||
* @brief Removes a mapping of tensor and its name by its name
|
||||
*
|
||||
* @param[in] name The name of tensor to be removed
|
||||
*
|
||||
* @note If no tensor with the specified name is found, nothing
|
||||
* is done.
|
||||
*/
|
||||
void remove(const char *name) noexcept;
|
||||
|
||||
/**
|
||||
* @brief Returns the number of tensors in the map
|
||||
*/
|
||||
size_t size() const noexcept;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Removes all tensors from the map
|
||||
*/
|
||||
void clear() noexcept;
|
||||
|
||||
/**
|
||||
* @brief Returns the tensor given its name.
|
||||
*
|
||||
* @param[in] name The name of the tensor to get.
|
||||
*
|
||||
* @return nullptr if no tensor with the specified name is
|
||||
* found; otherwise, a valid pointer to the tensor.
|
||||
*/
|
||||
zdl::DlSystem::ITensor* getTensor(const char *name) const noexcept;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Returns the names of all tensors
|
||||
*/
|
||||
zdl::DlSystem::StringList getTensorNames() const;
|
||||
|
||||
~TensorMap();
|
||||
private:
|
||||
void swap(const TensorMap &other);
|
||||
std::unique_ptr<::DlSystem::TensorMapImpl> m_TensorMapImpl;
|
||||
};
|
||||
|
||||
} // DlSystem namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // DL_SYSTEM_TENSOR_MAP_HPP
|
||||
|
||||
-203
@@ -1,203 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2016 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
#include <initializer_list>
|
||||
#include <cstdio>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "ZdlExportDefine.hpp"
|
||||
|
||||
#ifndef DL_SYSTEM_TENSOR_SHAPE_HPP
|
||||
#define DL_SYSTEM_TENSOR_SHAPE_HPP
|
||||
|
||||
namespace DlSystem
|
||||
{
|
||||
// Forward declaration of tensor shape implementation.
|
||||
class TensorShapeImpl;
|
||||
}
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Convenient typedef to represent dimension
|
||||
*/
|
||||
using Dimension = size_t;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A class representing the shape of tensor. It is used at the
|
||||
* time of creation of tensor.
|
||||
*/
|
||||
class ZDL_EXPORT TensorShape final
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new shape with a list of dims specified in
|
||||
* initializer list fashion.
|
||||
*
|
||||
* @param[in] dims The dimensions are specified in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
*/
|
||||
TensorShape(std::initializer_list<Dimension> dims);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new shape with a list of dims specified in array
|
||||
*
|
||||
* @param[in] dims The dimensions are specified in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
* @param[in] size Size of the array.
|
||||
*
|
||||
*/
|
||||
TensorShape(const Dimension *dims, size_t size);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new shape with a vector of dims specified in
|
||||
* vector fashion.
|
||||
*
|
||||
* @param[in] dims The dimensions are specified in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
*/
|
||||
TensorShape(std::vector<Dimension> dims);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* copy constructor.
|
||||
* @param[in] other object to copy.
|
||||
*/
|
||||
TensorShape(const TensorShape& other);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* assignment operator.
|
||||
*/
|
||||
TensorShape& operator=(const TensorShape& other);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new shape with no dims. It can be extended later
|
||||
* by invoking concatenate.
|
||||
*/
|
||||
TensorShape();
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Concatenates additional dimensions specified in
|
||||
* initializer list fashion to the existing dimensions.
|
||||
*
|
||||
* @param[in] dims The dimensions are specified in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
*/
|
||||
void concatenate(std::initializer_list<Dimension> dims);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Concatenates additional dimensions specified in
|
||||
* the array to the existing dimensions.
|
||||
*
|
||||
* @param[in] dims The dimensions are specified in which the last
|
||||
* element of the vector represents the fastest varying
|
||||
* dimension and the zeroth element represents the slowest
|
||||
* varying, etc.
|
||||
*
|
||||
* @param[in] size Size of the array.
|
||||
*
|
||||
*/
|
||||
void concatenate(const Dimension *dims, size_t size);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Concatenates an additional dimension to the existing
|
||||
* dimensions.
|
||||
*
|
||||
* @param[in] dim The dimensions are specified in which the last element
|
||||
* of the vector represents the fastest varying dimension and the
|
||||
* zeroth element represents the slowest varying, etc.
|
||||
*
|
||||
*/
|
||||
void concatenate(const Dimension &dim);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Retrieves a single dimension, based on its index.
|
||||
*
|
||||
* @return The value of dimension
|
||||
*
|
||||
* @throws std::out_of_range if the index is >= the number of
|
||||
* dimensions (or rank).
|
||||
*/
|
||||
Dimension& operator[](size_t index);
|
||||
Dimension& operator[](size_t index) const;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Retrieves the rank i.e. number of dimensions.
|
||||
*
|
||||
* @return The rank
|
||||
*/
|
||||
size_t rank() const;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Retrieves a pointer to the first dimension of shape
|
||||
*
|
||||
* @return nullptr if no dimension exists; otherwise, points to
|
||||
* the first dimension.
|
||||
*
|
||||
*/
|
||||
const Dimension* getDimensions() const;
|
||||
|
||||
~TensorShape();
|
||||
|
||||
private:
|
||||
void swap(const TensorShape &other);
|
||||
std::unique_ptr<::DlSystem::TensorShapeImpl> m_TensorShapeImpl;
|
||||
};
|
||||
|
||||
} // DlSystem namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // DL_SYSTEM_TENSOR_SHAPE_HPP
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// Copyright (c) 2017-2020 Qualcomm Technologies, Inc.
|
||||
// All Rights Reserved.
|
||||
// Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
//
|
||||
//=============================================================================
|
||||
#include <initializer_list>
|
||||
#include <cstdio>
|
||||
#include <memory>
|
||||
#include "ZdlExportDefine.hpp"
|
||||
#include "DlSystem/TensorShape.hpp"
|
||||
#include "DlSystem/StringList.hpp"
|
||||
|
||||
#ifndef DL_SYSTEM_TENSOR_SHAPE_MAP_HPP
|
||||
#define DL_SYSTEM_TENSOR_SHAPE_MAP_HPP
|
||||
|
||||
namespace DlSystem
|
||||
{
|
||||
// Forward declaration of tensor shape map implementation.
|
||||
class TensorShapeMapImpl;
|
||||
}
|
||||
|
||||
namespace zdl
|
||||
{
|
||||
namespace DlSystem
|
||||
{
|
||||
|
||||
/** @addtogroup c_plus_plus_apis C++
|
||||
@{ */
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* A class representing the map of names and tensorshapes.
|
||||
*/
|
||||
class ZDL_EXPORT TensorShapeMap final
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Creates a new tensor shape map
|
||||
*
|
||||
*/
|
||||
TensorShapeMap();
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* copy constructor.
|
||||
* @param[in] other object to copy.
|
||||
*/
|
||||
TensorShapeMap(const TensorShapeMap& other);
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* assignment operator.
|
||||
*/
|
||||
TensorShapeMap& operator=(const TensorShapeMap& other);
|
||||
|
||||
/**
|
||||
* @brief Adds a name and the corresponding tensor pointer
|
||||
* to the map
|
||||
*
|
||||
* @param[in] name The name of the tensor
|
||||
* @param[out] tensor The pointer to the tensor
|
||||
*
|
||||
* @note If a tensor with the same name already exists, no new
|
||||
* tensor is added.
|
||||
*/
|
||||
void add(const char *name, const zdl::DlSystem::TensorShape& tensorShape);
|
||||
|
||||
/**
|
||||
* @brief Removes a mapping of tensor and its name by its name
|
||||
*
|
||||
* @param[in] name The name of tensor to be removed
|
||||
*
|
||||
* @note If no tensor with the specified name is found, nothing
|
||||
* is done.
|
||||
*/
|
||||
void remove(const char *name) noexcept;
|
||||
|
||||
/**
|
||||
* @brief Returns the number of tensors in the map
|
||||
*/
|
||||
size_t size() const noexcept;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Removes all tensors from the map
|
||||
*/
|
||||
void clear() noexcept;
|
||||
|
||||
/**
|
||||
* @brief Returns the tensor given its name.
|
||||
*
|
||||
* @param[in] name The name of the tensor to get.
|
||||
*
|
||||
* @return nullptr if no tensor with the specified name is
|
||||
* found; otherwise, a valid pointer to the tensor.
|
||||
*/
|
||||
zdl::DlSystem::TensorShape getTensorShape(const char *name) const noexcept;
|
||||
|
||||
/**
|
||||
* @brief .
|
||||
*
|
||||
* Returns the names of all tensor shapes
|
||||
*/
|
||||
zdl::DlSystem::StringList getTensorShapeNames() const;
|
||||
|
||||
~TensorShapeMap();
|
||||
private:
|
||||
void swap(const TensorShapeMap &other);
|
||||
std::unique_ptr<::DlSystem::TensorShapeMapImpl> m_TensorShapeMapImpl;
|
||||
};
|
||||
|
||||
} // DlSystem namespace
|
||||
} // zdl namespace
|
||||
|
||||
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
|
||||
|
||||
#endif // DL_SYSTEM_TENSOR_SHAPE_MAP_HPP
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user