晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/proc/self/root/proc/self/root/opt/cloudlinux/venv/lib64/python3.11/site-packages/guppy/etc/ |
| Current File : //proc/self/root/proc/self/root/opt/cloudlinux/venv/lib64/python3.11/site-packages/guppy/etc/Cat.py |
class Graph:
def __init__(self, objects, arrows):
self.objects = objects # Sequence of objects
self.arrows = arrows # Map[name] ->pair(object, object)
def source(self, x):
return self.arrows[x][0]
def target(self, x):
return self.arrows[x][1]
def get_dual(self):
objects = self.objects
arrows = dict([(arrow, (tgt, src))
for (arrow, (src, tgt)) in list(self.arrows.items())])
return self.__class__(objects, arrows)
class Cat:
# Category presented by a graph (with objects and generators) and relations.
def __init__(self, graph, relations):
# category is defined by the parameters:
# graph.objects: sequenceof(O)
# graph.arrows: dict mapping(A, pairof(O in objects))
# relations: sequence(pairof(sequence(A), sequence(A)))
self.graph = graph
self.relations = relations
def get_dual(self):
graph = self.graph.get_dual()
relations = dual_relations(self.relations)
return self.__class__(graph, relations)
class Functor:
def __init__(self, fo, fa, src=None, tgt=None):
self.fo = adapt_function(fo)
self.fa = adapt_function(fa)
self.src = src
self.tgt = tgt
class Function:
def __init__(self, map, src, tgt):
f = getattr(map, '__getitem__', None)
if callable(f):
pass
else:
f = map
if not callable(f):
raise TypeError(
'Function: map is neither callable or indexable')
self.f = f
self.src = src
self.tgt = tgt
def __getitem__(self, *args):
return self.f(*args)
def __call__(self, *args, **kwargs):
return self.f(*args, **kwargs)
def __str__(self):
return '%s(%s, %s, %s)' % (self.__class__, self.src, self.tgt, self.f)
def asdict(self):
return dict([(x, self[x]) for x in self.src])
def items(self):
return [(x, self[x]) for x in self.src]
def keys(self):
return list(self.src)
def values(self):
return [v for (k, v) in list(self.items())]
class Identity(Function):
def __init__(self, src):
Function.__init__(lambda x: x, src, src)
def check_graph(G):
# Check that G is a valid graph object
# with arrows that have all source and target in G.objects
Gob = G.objects
for a in G.arrows:
if not G.source(a) in Gob:
raise ValueError(
'Arrow %r has source %r not in graph objects' % (a, G.source(a)))
if not G.target(a) in Gob:
raise ValueError(
'Arrow %r has target %r not in graph objects' % (a, G.target(a)))
def check_rules(R, G):
# Check that the rules in R contain valid composing arrows in graph G
coms = []
for (left, right) in R:
coms.append(left)
coms.append(right)
for com in coms:
a0 = None
for a in com:
if a not in G.arrows:
raise ValueError(
'Arrow %r, used in a rule, is not a valid arrow' % (a,))
if a0 is not None:
if G.source(a) != G.target(a0):
raise ValueError('''\
Source of arrow %r (%r) does not match target of arrow %r (%r)''' % (
a, G.source(a), a0, G.target(a0)))
a0 = a
def check_cat(C):
check_graph(C.graph)
check_rules(C.relations, C.graph)
def oarcat(objects, arrows, relations):
return Cat(Graph(objects, arrows), relations)
def adapt_function(f):
if not isinstance(f, Function):
if isinstance(f, dict):
src = list(f.keys())
tgt = list(f.values())
else:
src = None
tgt = None
f = Function(f, src, tgt)
return f
def dual_relations(relations):
dual = []
for (a, b) in relations:
a = list(a)
b = list(b)
a.reverse()
b.reverse()
dual.append((tuple(a), tuple(b)))
return dual
|