docs: Add skeleton for documentation
This commit is contained in:
parent
7438043f26
commit
dbc6f35ca2
6 changed files with 329 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -12,3 +12,4 @@ plot.py
|
||||||
__pycache__
|
__pycache__
|
||||||
*.egg-info
|
*.egg-info
|
||||||
build
|
build
|
||||||
|
*.pdf
|
11
doc/.vscode/settings.json
vendored
Normal file
11
doc/.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"spellright.language": [
|
||||||
|
"de",
|
||||||
|
"en"
|
||||||
|
],
|
||||||
|
"spellright.documentTypes": [
|
||||||
|
"markdown",
|
||||||
|
"latex",
|
||||||
|
"plaintext"
|
||||||
|
]
|
||||||
|
}
|
48
doc/Makefile
Normal file
48
doc/Makefile
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
MD = $(wildcard src/*.md)
|
||||||
|
DOTS = $(wildcard src/*.dot)
|
||||||
|
ASYS = $(wildcard src/*.asy)
|
||||||
|
PYS = $(wildcard src/img_*.py)
|
||||||
|
PDFS = $(MD:src/%.md=out/%.pdf)
|
||||||
|
|
||||||
|
IMG_PDFS = $(ASYS:src/%.asy=img/%.pdf) $(PYS:src/img_%.py=img/%.pdf) $(DOTS:src/%.dot=img/%.pdf)
|
||||||
|
|
||||||
|
IMGS = $(IMG_PDFS)
|
||||||
|
|
||||||
|
TEMPLATE = eisvogel
|
||||||
|
PDF_ENGINE = xelatex
|
||||||
|
PANDOC = pandoc
|
||||||
|
PANDOC_OPTIONS = -F panflute -F pandoc-citeproc --pdf-engine=$(PDF_ENGINE) --template $(TEMPLATE) -N --standalone --listings
|
||||||
|
|
||||||
|
GRAPHVIZ = dot
|
||||||
|
GRAPHVIZ_OPTIONS = -Tpdf
|
||||||
|
|
||||||
|
ASY = asy
|
||||||
|
ASY_OPTIONS = -noV -f pdf
|
||||||
|
|
||||||
|
PYTHON = python
|
||||||
|
PYTHON_OPTIONS =
|
||||||
|
|
||||||
|
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||||
|
current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path))))
|
||||||
|
|
||||||
|
.PHONY: clean all default
|
||||||
|
all: $(PDFS)
|
||||||
|
default: all
|
||||||
|
|
||||||
|
out/%.pdf: src/%.md $(IMGS) Makefile
|
||||||
|
$(PANDOC) $(PANDOC_OPTIONS) -o $@ $<
|
||||||
|
|
||||||
|
img/%.pdf: src/%.dot
|
||||||
|
$(GRAPHVIZ) $(GRAPHVIZ_OPTIONS) -o $@ $<
|
||||||
|
|
||||||
|
img/%.pdf: src/img_%.py
|
||||||
|
$(PYTHON) $(PYTHON_OPTIONS) $< $@
|
||||||
|
|
||||||
|
img/%.pdf: src/%.asy
|
||||||
|
$(ASY) $(ASY_OPTIONS) -o $@ $<
|
||||||
|
|
||||||
|
watch:
|
||||||
|
watchexec -w src -w data -w filters -w Makefile make all
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm $(PDFS) $(IMGS)
|
147
doc/filters/multifilter.py
Normal file
147
doc/filters/multifilter.py
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
from panflute import *
|
||||||
|
import tempfile
|
||||||
|
import sys
|
||||||
|
from jinja2 import Template, Environment, PackageLoader, select_autoescape
|
||||||
|
import contextlib
|
||||||
|
import io
|
||||||
|
import hashlib
|
||||||
|
from dateutil.parser import parse as dateparse
|
||||||
|
from functools import partial
|
||||||
|
import subprocess as SP
|
||||||
|
import panflute as pf
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
import datetime
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def remove_pound(elem, doc):
|
||||||
|
if type(elem) == Str:
|
||||||
|
return Str(elem.text.lstrip("#"))
|
||||||
|
|
||||||
|
|
||||||
|
def fix_color(elem, doc):
|
||||||
|
if type(elem) == MetaMap:
|
||||||
|
for k in elem.content:
|
||||||
|
if k.endswith("-color"):
|
||||||
|
elem[k] = elem[k].walk(remove_pound)
|
||||||
|
|
||||||
|
|
||||||
|
def update_date(elem, doc):
|
||||||
|
if type(elem) == MetaMap:
|
||||||
|
datefmt = doc.get_metadata('datefmt', "%Y-%m-%d")
|
||||||
|
today = datetime.date.today().strftime(datefmt)
|
||||||
|
date = dateparse(doc.get_metadata('date', today)).date()
|
||||||
|
elem['date'] = MetaInlines(Str(date.strftime(datefmt)))
|
||||||
|
return elem
|
||||||
|
|
||||||
|
|
||||||
|
def csv_table(elem, doc):
|
||||||
|
if type(elem) == Para and len(elem.content) == 1 and type(elem.content[0]) == Image:
|
||||||
|
elem = elem.content[0]
|
||||||
|
ext = os.path.splitext(elem.url)[1][1:]
|
||||||
|
if ext == "csv":
|
||||||
|
caption = elem.content
|
||||||
|
has_header = elem.attributes.get(
|
||||||
|
'has-header', "false").lower() == "true"
|
||||||
|
with open(elem.url) as f:
|
||||||
|
reader = csv.reader(f)
|
||||||
|
body = []
|
||||||
|
for row in reader:
|
||||||
|
cells = [TableCell(Plain(Str(x))) for x in row]
|
||||||
|
body.append(TableRow(*cells))
|
||||||
|
header = body.pop(0) if has_header else None
|
||||||
|
ret = Table(*body, header=header, caption=caption)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def code_refs(elem, doc):
|
||||||
|
if type(elem) == Cite:
|
||||||
|
label = elem.content[0]
|
||||||
|
if type(label) == Str:
|
||||||
|
label = label.text
|
||||||
|
filename = re.findall(r"^\[@lst:(.*)\]$", label) or [None]
|
||||||
|
if filename[0] in doc.inc_files:
|
||||||
|
return [RawInline("\\hyperref[{}]{{{}}}".format(filename[0], filename[0]), format="tex")]
|
||||||
|
|
||||||
|
|
||||||
|
def include_code(elem, doc):
|
||||||
|
if type(elem) == CodeBlock:
|
||||||
|
if "include" in elem.attributes:
|
||||||
|
filepath = elem.attributes.pop("include")
|
||||||
|
filename = os.path.split(filepath)[-1]
|
||||||
|
try:
|
||||||
|
elem.text += elem.text + \
|
||||||
|
open(filepath, encoding="utf-8").read()
|
||||||
|
elem.attributes['caption'] = filename
|
||||||
|
doc.inc_files.append(filename)
|
||||||
|
except Exception as e:
|
||||||
|
elem.text += "Error: {}".format(e)
|
||||||
|
return [RawBlock("\\label{{{}}}".format(filename), format="tex"), elem]
|
||||||
|
|
||||||
|
|
||||||
|
def py_eval(options, data, element, doc):
|
||||||
|
out_buffer = io.StringIO()
|
||||||
|
with contextlib.redirect_stdout(out_buffer):
|
||||||
|
exec(data, doc.pyenv)
|
||||||
|
out_buffer.seek(0)
|
||||||
|
return convert_text(out_buffer.read())
|
||||||
|
|
||||||
|
|
||||||
|
def jinja_py_filt(doc, file):
|
||||||
|
env = {}
|
||||||
|
code = open(file, encoding="utf-8").read()
|
||||||
|
exec(code, env)
|
||||||
|
return env['main'](doc)
|
||||||
|
|
||||||
|
|
||||||
|
def prepare(doc):
|
||||||
|
doc.inc_files = []
|
||||||
|
doc.env = Environment()
|
||||||
|
doc.pyenv = {}
|
||||||
|
filters = {'py': partial(jinja_py_filt, doc)}
|
||||||
|
doc.env.filters.update(filters)
|
||||||
|
|
||||||
|
|
||||||
|
def process_templates(elem, doc):
|
||||||
|
if type(elem) == CodeBlock:
|
||||||
|
if elem.classes == ["@"]:
|
||||||
|
args = {'meta': doc.get_metadata()}
|
||||||
|
return convert_text(doc.env.from_string(elem.text).render(args))
|
||||||
|
|
||||||
|
|
||||||
|
def yaml_filt(elem, doc):
|
||||||
|
tags = {
|
||||||
|
'eval': py_eval,
|
||||||
|
}
|
||||||
|
return yaml_filter(elem, doc, tags=tags, strict_yaml=True)
|
||||||
|
|
||||||
|
|
||||||
|
def checkboxes(elem, doc):
|
||||||
|
if type(elem) in [Para, Plain]:
|
||||||
|
val = re.findall(r"^\[([xX]|\ )\] (.*)$", stringify(elem))
|
||||||
|
if val:
|
||||||
|
val = val[0][0].lower() == "x"
|
||||||
|
else:
|
||||||
|
return elem
|
||||||
|
marker = {
|
||||||
|
True: RawInline("$\\boxtimes$", format="latex"),
|
||||||
|
False: RawInline("$\\square$", format="latex"),
|
||||||
|
}[val]
|
||||||
|
cont = []
|
||||||
|
if val:
|
||||||
|
cont += elem.content[2:]
|
||||||
|
else:
|
||||||
|
cont += elem.content[4:]
|
||||||
|
return Plain(marker, Space, *cont)
|
||||||
|
return elem
|
||||||
|
|
||||||
|
|
||||||
|
def main(doc=None):
|
||||||
|
f = [process_templates, update_date, csv_table, include_code,
|
||||||
|
fix_color, code_refs, yaml_filt, checkboxes]
|
||||||
|
return run_filters(f, prepare=prepare, doc=doc)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
58
doc/src/ed-lrr.md
Normal file
58
doc/src/ed-lrr.md
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
---
|
||||||
|
# Metadata
|
||||||
|
title: ED_LRR
|
||||||
|
author:
|
||||||
|
- Daniel Seiller <earthnuker@gmail.com>
|
||||||
|
subtitle: 'Elite Dangerous: Long-Range Router'
|
||||||
|
|
||||||
|
# Formating
|
||||||
|
toc: true
|
||||||
|
lang: en
|
||||||
|
colorlinks: true
|
||||||
|
papersize: a4
|
||||||
|
numbersections: true
|
||||||
|
|
||||||
|
#Panflute options
|
||||||
|
panflute-filters: [multifilter]
|
||||||
|
panflute-path: 'filters'
|
||||||
|
|
||||||
|
#Template options
|
||||||
|
titlepage: true
|
||||||
|
toc-own-page: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# How it works
|
||||||
|
|
||||||
|
## `stars.csv` format
|
||||||
|
|
||||||
|
### Columns
|
||||||
|
|
||||||
|
| Name | Content |
|
||||||
|
| --------- | ------------------------------------------------------------------- |
|
||||||
|
| id | unique ID-Number (not to be confused with EDSM id or id64) |
|
||||||
|
| star_type | Type of Star |
|
||||||
|
| system | Name of System |
|
||||||
|
| body | Name of Star |
|
||||||
|
| mult | Jump Range Multiplier (1.5 for White Dwarfs, 4.0 for Neutron Stars) |
|
||||||
|
| distance | Distance from arrival in Ls |
|
||||||
|
| x,y,z | Position in Galactic Coordinates with Sol at (0,0,0) |
|
||||||
|
|
||||||
|
## Routing Algorithms
|
||||||
|
|
||||||
|
### Breadth-First Search (BFS)
|
||||||
|
|
||||||
|
### A*-Search
|
||||||
|
|
||||||
|
### Greedy Search
|
||||||
|
|
||||||
|
## Optimizations
|
||||||
|
|
||||||
|
## Routing Graphs
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
|
||||||
|
## Preprocessing Data
|
||||||
|
|
||||||
|
## Plotting a Route
|
||||||
|
|
||||||
|
# [Changelog](https://gitlab.com/Earthnuker/ed_lrr/blob/pyqt_gui/CHANGELOG.md)
|
64
doc/src/img_out.py
Normal file
64
doc/src/img_out.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import sys
|
||||||
|
import pylab as PL
|
||||||
|
import numpy as np
|
||||||
|
from scipy.spatial.ckdtree import cKDTree
|
||||||
|
import heapq
|
||||||
|
|
||||||
|
exit()
|
||||||
|
|
||||||
|
|
||||||
|
def vec(a, b):
|
||||||
|
return b - a
|
||||||
|
|
||||||
|
|
||||||
|
def bfs(points):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def in_ellipse(p, f1, f2, r, offset=0):
|
||||||
|
df = ((f1 - f2) ** 2).sum(0) ** 0.5
|
||||||
|
d_f1 = ((p - f1) ** 2).sum(1) ** 0.5
|
||||||
|
d_f2 = ((p - f2) ** 2).sum(1) ** 0.5
|
||||||
|
return (d_f1 + d_f2) < (df * (1 + r))
|
||||||
|
|
||||||
|
|
||||||
|
num_points = 100000
|
||||||
|
|
||||||
|
p_orig = np.random.normal(0, 10, size=(num_points, 2))
|
||||||
|
tree = cKDTree(p_orig)
|
||||||
|
f1 = np.array([0, -30])
|
||||||
|
f2 = -f1 # np.random.normal(0, 20, (3,))
|
||||||
|
# r = 2 ** ((n / cnt) - cnt)
|
||||||
|
|
||||||
|
mask = in_ellipse(p_orig, f1, f2, 0.1)
|
||||||
|
|
||||||
|
p = p_orig[mask]
|
||||||
|
p_orig = p_orig[~mask]
|
||||||
|
|
||||||
|
colors = np.random.random(p.shape[0])
|
||||||
|
fig = PL.gcf()
|
||||||
|
PL.scatter(
|
||||||
|
p_orig[:, 0],
|
||||||
|
p_orig[:, 1],
|
||||||
|
marker=".",
|
||||||
|
s=0.2,
|
||||||
|
edgecolor="None",
|
||||||
|
c=[(0.0, 0.0, 0.0)],
|
||||||
|
alpha=0.75,
|
||||||
|
rasterized=True,
|
||||||
|
)
|
||||||
|
PL.scatter(
|
||||||
|
p[:, 0], p[:, 1], marker="s", s=0.2, edgecolor="None", c=colors, rasterized=True
|
||||||
|
)
|
||||||
|
PL.plot(f1[0], f1[1], "r.", label="Source")
|
||||||
|
PL.plot(f2[0], f2[1], "g.", label="Destination")
|
||||||
|
|
||||||
|
max_v = max(p_orig[:, 0].max(), p_orig[:, 1].max(), f1[0], f1[1], f2[0], f2[1]) + 2
|
||||||
|
min_v = min(p_orig[:, 0].min(), p_orig[:, 1].min(), f1[0], f1[1], f2[0], f2[1]) - 2
|
||||||
|
|
||||||
|
|
||||||
|
PL.xlim(min_v, max_v)
|
||||||
|
PL.ylim(min_v, max_v)
|
||||||
|
|
||||||
|
PL.legend()
|
||||||
|
PL.savefig(sys.argv[1], dpi=1200)
|
Loading…
Reference in a new issue