Rename bondFacet to bond_edge_type and clean up slipnet.json

The slipnet node previously called "bondFacet" was misleading since
"facet" is used throughout the codebase as a property name on Bond,
Group, and Rule objects. Renamed to "bond_edge_type" to better reflect
its role as a descriptor type category. Also removed precomputed
minPathToLetter data from slipnet.json.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Alex Linhares
2026-02-21 23:19:55 +00:00
parent 72d0bf3d3e
commit 866881be69
8 changed files with 121 additions and 603 deletions

View File

@ -3,7 +3,7 @@ from .workspaceStructure import WorkspaceStructure
class Bond(WorkspaceStructure): class Bond(WorkspaceStructure):
# pylint: disable=too-many-arguments # pylint: disable=too-many-arguments
def __init__(self, ctx, source, destination, bondCategory, bondFacet, def __init__(self, ctx, source, destination, bondCategory, bond_edge_type,
sourceDescriptor, destinationDescriptor): sourceDescriptor, destinationDescriptor):
WorkspaceStructure.__init__(self, ctx) WorkspaceStructure.__init__(self, ctx)
slipnet = self.ctx.slipnet slipnet = self.ctx.slipnet
@ -17,7 +17,7 @@ class Bond(WorkspaceStructure):
self.leftObject = self.destination self.leftObject = self.destination
self.rightObject = self.source self.rightObject = self.source
self.directionCategory = slipnet.left self.directionCategory = slipnet.left
self.facet = bondFacet self.facet = bond_edge_type
self.sourceDescriptor = sourceDescriptor self.sourceDescriptor = sourceDescriptor
self.destinationDescriptor = destinationDescriptor self.destinationDescriptor = destinationDescriptor
self.category = bondCategory self.category = bondCategory

View File

@ -136,12 +136,12 @@ def __getScoutSource(ctx, slipnode, relevanceMethod, typeName):
return source return source
def __getDescriptors(bondFacet, source, destination): def __getDescriptors(bond_edge_type, source, destination):
""" """
Extract descriptors from source and destination objects for a given bond facet. Extract descriptors from source and destination objects for a given bond facet.
Args: Args:
bondFacet: The descriptor type/facet for the bond (e.g., letterCategory) bond_edge_type: The descriptor type/facet for the bond (e.g., letterCategory)
source: The source workspace object source: The source workspace object
destination: The destination workspace object destination: The destination workspace object
@ -151,8 +151,8 @@ def __getDescriptors(bondFacet, source, destination):
Raises: Raises:
AssertionError: If either object lacks the required descriptor type AssertionError: If either object lacks the required descriptor type
""" """
sourceDescriptor = source.getDescriptor(bondFacet) sourceDescriptor = source.getDescriptor(bond_edge_type)
destinationDescriptor = destination.getDescriptor(bondFacet) destinationDescriptor = destination.getDescriptor(bond_edge_type)
assert sourceDescriptor and destinationDescriptor assert sourceDescriptor and destinationDescriptor
return sourceDescriptor, destinationDescriptor return sourceDescriptor, destinationDescriptor
@ -619,9 +619,9 @@ def __chooseBondFacet(ctx, source, destination):
] ]
sourceFacets = [d.descriptionType for d in source.descriptions if d.descriptionType in b] sourceFacets = [d.descriptionType for d in source.descriptions if d.descriptionType in b]
bondFacets = [d.descriptionType for d in destination.descriptions if d.descriptionType in sourceFacets] bond_edge_types = [d.descriptionType for d in destination.descriptions if d.descriptionType in sourceFacets]
supports = [__supportForDescriptionType(ctx, f, source.string) for f in bondFacets] supports = [__supportForDescriptionType(ctx, f, source.string) for f in bond_edge_types]
return random.weighted_choice(bondFacets, supports) return random.weighted_choice(bond_edge_types, supports)
@codelet('bottom-up-bond-scout') @codelet('bottom-up-bond-scout')
@ -661,11 +661,11 @@ def bottom_up_bond_scout(ctx, codelet):
destination = chooseNeighbor(ctx, source) destination = chooseNeighbor(ctx, source)
assert destination assert destination
logging.info('destination: %s', destination) logging.info('destination: %s', destination)
bondFacet = __chooseBondFacet(ctx, source, destination) bond_edge_type = __chooseBondFacet(ctx, source, destination)
assert bondFacet assert bond_edge_type
logging.info('chosen bond facet: %s', bondFacet.get_name()) logging.info('chosen bond facet: %s', bond_edge_type.get_name())
logging.info('Source: %s, destination: %s', source, destination) logging.info('Source: %s, destination: %s', source, destination)
bond_descriptors = __getDescriptors(bondFacet, source, destination) bond_descriptors = __getDescriptors(bond_edge_type, source, destination)
sourceDescriptor, destinationDescriptor = bond_descriptors sourceDescriptor, destinationDescriptor = bond_descriptors
logging.info("source descriptor: %s", sourceDescriptor.name.upper()) logging.info("source descriptor: %s", sourceDescriptor.name.upper())
logging.info("destination descriptor: %s", logging.info("destination descriptor: %s",
@ -675,7 +675,7 @@ def bottom_up_bond_scout(ctx, codelet):
if category == slipnet.identity: if category == slipnet.identity:
category = slipnet.sameness category = slipnet.sameness
logging.info('proposing %s bond ', category.name) logging.info('proposing %s bond ', category.name)
coderack.proposeBond(source, destination, category, bondFacet, coderack.proposeBond(source, destination, category, bond_edge_type,
sourceDescriptor, destinationDescriptor) sourceDescriptor, destinationDescriptor)
@ -913,10 +913,10 @@ def top_down_bond_scout__category(ctx, codelet):
destination = chooseNeighbor(ctx, source) destination = chooseNeighbor(ctx, source)
logging.info('source: %s, destination: %s', source, destination) logging.info('source: %s, destination: %s', source, destination)
assert destination assert destination
bondFacet = __chooseBondFacet(ctx, source, destination) bond_edge_type = __chooseBondFacet(ctx, source, destination)
assert bondFacet assert bond_edge_type
sourceDescriptor, destinationDescriptor = __getDescriptors( sourceDescriptor, destinationDescriptor = __getDescriptors(
bondFacet, source, destination) bond_edge_type, source, destination)
forwardBond = sourceDescriptor.getBondCategory(destinationDescriptor) forwardBond = sourceDescriptor.getBondCategory(destinationDescriptor)
if forwardBond == slipnet.identity: if forwardBond == slipnet.identity:
forwardBond = slipnet.sameness forwardBond = slipnet.sameness
@ -926,11 +926,11 @@ def top_down_bond_scout__category(ctx, codelet):
assert category == forwardBond or category == backwardBond assert category == forwardBond or category == backwardBond
if category == forwardBond: if category == forwardBond:
coderack.proposeBond(source, destination, category, coderack.proposeBond(source, destination, category,
bondFacet, sourceDescriptor, bond_edge_type, sourceDescriptor,
destinationDescriptor) destinationDescriptor)
else: else:
coderack.proposeBond(destination, source, category, coderack.proposeBond(destination, source, category,
bondFacet, destinationDescriptor, bond_edge_type, destinationDescriptor,
sourceDescriptor) sourceDescriptor)
@ -972,15 +972,15 @@ def top_down_bond_scout__direction(ctx, codelet):
destination = chooseDirectedNeighbor(ctx, source, direction) destination = chooseDirectedNeighbor(ctx, source, direction)
assert destination assert destination
logging.info('to object: %s', destination) logging.info('to object: %s', destination)
bondFacet = __chooseBondFacet(ctx, source, destination) bond_edge_type = __chooseBondFacet(ctx, source, destination)
assert bondFacet assert bond_edge_type
sourceDescriptor, destinationDescriptor = __getDescriptors( sourceDescriptor, destinationDescriptor = __getDescriptors(
bondFacet, source, destination) bond_edge_type, source, destination)
category = sourceDescriptor.getBondCategory(destinationDescriptor) category = sourceDescriptor.getBondCategory(destinationDescriptor)
assert category assert category
if category == slipnet.identity: if category == slipnet.identity:
category = slipnet.sameness category = slipnet.sameness
coderack.proposeBond(source, destination, category, bondFacet, coderack.proposeBond(source, destination, category, bond_edge_type,
sourceDescriptor, destinationDescriptor) sourceDescriptor, destinationDescriptor)
@ -1171,7 +1171,7 @@ def top_down_group_scout__category(ctx, codelet):
return return
direction = firstBond.directionCategory direction = firstBond.directionCategory
search = True search = True
bondFacet = None bond_edge_type = None
# find leftmost object in group with these bonds # find leftmost object in group with these bonds
while search: while search:
search = False search = False
@ -1182,8 +1182,8 @@ def top_down_group_scout__category(ctx, codelet):
if source.leftBond.directionCategory != direction: if source.leftBond.directionCategory != direction:
if source.leftBond.directionCategory: if source.leftBond.directionCategory:
continue continue
if not bondFacet or bondFacet == source.leftBond.facet: if not bond_edge_type or bond_edge_type == source.leftBond.facet:
bondFacet = source.leftBond.facet bond_edge_type = source.leftBond.facet
direction = source.leftBond.directionCategory direction = source.leftBond.directionCategory
source = source.leftBond.leftObject source = source.leftBond.leftObject
search = True search = True
@ -1199,8 +1199,8 @@ def top_down_group_scout__category(ctx, codelet):
if destination.rightBond.directionCategory != direction: if destination.rightBond.directionCategory != direction:
if destination.rightBond.directionCategory: if destination.rightBond.directionCategory:
continue continue
if not bondFacet or bondFacet == destination.rightBond.facet: if not bond_edge_type or bond_edge_type == destination.rightBond.facet:
bondFacet = destination.rightBond.facet bond_edge_type = destination.rightBond.facet
direction = source.rightBond.directionCategory direction = source.rightBond.directionCategory
destination = destination.rightBond.rightObject destination = destination.rightBond.rightObject
search = True search = True
@ -1212,7 +1212,7 @@ def top_down_group_scout__category(ctx, codelet):
objects += [source.rightBond.rightObject] objects += [source.rightBond.rightObject]
source = source.rightBond.rightObject source = source.rightBond.rightObject
coderack.proposeGroup(objects, bonds, groupCategory, coderack.proposeGroup(objects, bonds, groupCategory,
direction, bondFacet) direction, bond_edge_type)
@codelet('top-down-group-scout--direction') @codelet('top-down-group-scout--direction')
@ -1291,7 +1291,7 @@ def top_down_group_scout__direction(ctx, codelet):
assert category assert category
groupCategory = category.getRelatedNode(slipnet.groupCategory) groupCategory = category.getRelatedNode(slipnet.groupCategory)
logging.info('trying from %s to %s', source, category.name) logging.info('trying from %s to %s', source, category.name)
bondFacet = None bond_edge_type = None
# find leftmost object in group with these bonds # find leftmost object in group with these bonds
search = True search = True
while search: while search:
@ -1303,8 +1303,8 @@ def top_down_group_scout__direction(ctx, codelet):
if source.leftBond.directionCategory != direction: if source.leftBond.directionCategory != direction:
if source.leftBond.directionCategory: if source.leftBond.directionCategory:
continue continue
if not bondFacet or bondFacet == source.leftBond.facet: if not bond_edge_type or bond_edge_type == source.leftBond.facet:
bondFacet = source.leftBond.facet bond_edge_type = source.leftBond.facet
direction = source.leftBond.directionCategory direction = source.leftBond.directionCategory
source = source.leftBond.leftObject source = source.leftBond.leftObject
search = True search = True
@ -1319,8 +1319,8 @@ def top_down_group_scout__direction(ctx, codelet):
if destination.rightBond.directionCategory != direction: if destination.rightBond.directionCategory != direction:
if destination.rightBond.directionCategory: if destination.rightBond.directionCategory:
continue continue
if not bondFacet or bondFacet == destination.rightBond.facet: if not bond_edge_type or bond_edge_type == destination.rightBond.facet:
bondFacet = destination.rightBond.facet bond_edge_type = destination.rightBond.facet
direction = source.rightBond.directionCategory direction = source.rightBond.directionCategory
destination = destination.rightBond.rightObject destination = destination.rightBond.rightObject
search = True search = True
@ -1333,7 +1333,7 @@ def top_down_group_scout__direction(ctx, codelet):
objects += [source.rightBond.rightObject] objects += [source.rightBond.rightObject]
source = source.rightBond.rightObject source = source.rightBond.rightObject
coderack.proposeGroup(objects, bonds, groupCategory, coderack.proposeGroup(objects, bonds, groupCategory,
direction, bondFacet) direction, bond_edge_type)
# noinspection PyStringFormat # noinspection PyStringFormat
@ -1402,8 +1402,8 @@ def group_scout__whole_string(ctx, codelet):
category = chosenBond.category category = chosenBond.category
groupCategory = category.getRelatedNode(slipnet.groupCategory) groupCategory = category.getRelatedNode(slipnet.groupCategory)
directionCategory = chosenBond.directionCategory directionCategory = chosenBond.directionCategory
bondFacet = chosenBond.facet bond_edge_type = chosenBond.facet
coderack.proposeGroup(objects, bonds, groupCategory, directionCategory, bondFacet) coderack.proposeGroup(objects, bonds, groupCategory, directionCategory, bond_edge_type)
@codelet('group-strength-tester') @codelet('group-strength-tester')
@ -1742,7 +1742,7 @@ def bottom_up_correspondence_scout(ctx, codelet):
# string description needs to be flipped # string description needs to be flipped
opposites = [m for m in distinguishingMappings opposites = [m for m in distinguishingMappings
if m.initialDescriptionType == slipnet.stringPositionCategory if m.initialDescriptionType == slipnet.stringPositionCategory
and m.initialDescriptionType != slipnet.bondFacet] and m.initialDescriptionType != slipnet.bond_edge_type]
initialDescriptionTypes = [m.initialDescriptionType for m in opposites] initialDescriptionTypes = [m.initialDescriptionType for m in opposites]
flipTargetObject = False flipTargetObject = False
if (objectFromInitial.spansString() and if (objectFromInitial.spansString() and
@ -1835,7 +1835,7 @@ def important_object_correspondence_scout(ctx, codelet):
# string description needs to be flipped # string description needs to be flipped
opposites = [m for m in distinguishingMappings opposites = [m for m in distinguishingMappings
if m.initialDescriptionType == slipnet.stringPositionCategory if m.initialDescriptionType == slipnet.stringPositionCategory
and m.initialDescriptionType != slipnet.bondFacet] and m.initialDescriptionType != slipnet.bond_edge_type]
initialDescriptionTypes = [m.initialDescriptionType for m in opposites] initialDescriptionTypes = [m.initialDescriptionType for m in opposites]
flipTargetObject = False flipTargetObject = False
if (objectFromInitial.spansString() if (objectFromInitial.spansString()

View File

@ -230,23 +230,23 @@ class Coderack(object):
slipnet.letterCategory) slipnet.letterCategory)
def proposeGroup(self, objects, bondList, groupCategory, directionCategory, def proposeGroup(self, objects, bondList, groupCategory, directionCategory,
bondFacet): bond_edge_type):
slipnet = self.ctx.slipnet slipnet = self.ctx.slipnet
bondCategory = groupCategory.getRelatedNode(slipnet.bondCategory) bondCategory = groupCategory.getRelatedNode(slipnet.bondCategory)
bondCategory.buffer = 100.0 bondCategory.buffer = 100.0
if directionCategory: if directionCategory:
directionCategory.buffer = 100.0 directionCategory.buffer = 100.0
group = Group(objects[0].string, groupCategory, directionCategory, group = Group(objects[0].string, groupCategory, directionCategory,
bondFacet, objects, bondList) bond_edge_type, objects, bondList)
urgency = bondCategory.bondDegreeOfAssociation() urgency = bondCategory.bondDegreeOfAssociation()
self.newCodelet('group-strength-tester', urgency, [group]) self.newCodelet('group-strength-tester', urgency, [group])
def proposeBond(self, source, destination, bondCategory, bondFacet, def proposeBond(self, source, destination, bondCategory, bond_edge_type,
sourceDescriptor, destinationDescriptor): sourceDescriptor, destinationDescriptor):
bondFacet.buffer = 100.0 bond_edge_type.buffer = 100.0
sourceDescriptor.buffer = 100.0 sourceDescriptor.buffer = 100.0
destinationDescriptor.buffer = 100.0 destinationDescriptor.buffer = 100.0
bond = Bond(self.ctx, source, destination, bondCategory, bondFacet, bond = Bond(self.ctx, source, destination, bondCategory, bond_edge_type,
sourceDescriptor, destinationDescriptor) sourceDescriptor, destinationDescriptor)
urgency = bondCategory.bondDegreeOfAssociation() urgency = bondCategory.bondDegreeOfAssociation()
self.newCodelet('bond-strength-tester', urgency, [bond]) self.newCodelet('bond-strength-tester', urgency, [bond])

View File

@ -32,7 +32,7 @@ class Group(WorkspaceObject):
if self.bondList and len(self.bondList): if self.bondList and len(self.bondList):
firstFacet = self.bondList[0].facet firstFacet = self.bondList[0].facet
self.addBondDescription( self.addBondDescription(
Description(self, slipnet.bondFacet, firstFacet)) Description(self, slipnet.bond_edge_type, firstFacet))
self.addBondDescription( self.addBondDescription(
Description(self, slipnet.bondCategory, self.bondCategory)) Description(self, slipnet.bondCategory, self.bondCategory))

View File

@ -106,7 +106,7 @@ class Slipnet(object):
self.groupCategory = self.__addNode('groupCategory', 80.0) self.groupCategory = self.__addNode('groupCategory', 80.0)
self.length = self.__addNode('length', 60.0) self.length = self.__addNode('length', 60.0)
self.objectCategory = self.__addNode('objectCategory', 90.0) self.objectCategory = self.__addNode('objectCategory', 90.0)
self.bondFacet = self.__addNode('bondFacet', 90.0) self.bond_edge_type = self.__addNode('bond_edge_type', 90.0)
# some factors are considered "very relevant" a priori # some factors are considered "very relevant" a priori
self.initiallyClampedSlipnodes = [ self.initiallyClampedSlipnodes = [
@ -164,9 +164,9 @@ class Slipnet(object):
(self.groupCategory, self.predecessorGroup), (self.groupCategory, self.predecessorGroup),
(self.groupCategory, self.successorGroup), (self.groupCategory, self.successorGroup),
(self.groupCategory, self.samenessGroup), (self.groupCategory, self.samenessGroup),
# bond facets # bond edge types
(self.bondFacet, self.letterCategory), (self.bond_edge_type, self.letterCategory),
(self.bondFacet, self.length), (self.bond_edge_type, self.length),
] ]
for a, b in links: for a, b in links:
self.__addInstanceLink(a, b) self.__addInstanceLink(a, b)

View File

@ -160,7 +160,7 @@ class SlipnetExporter:
self.groupCategory = self._addNode('groupCategory', 80.0) self.groupCategory = self._addNode('groupCategory', 80.0)
self.length = self._addNode('length', 60.0) self.length = self._addNode('length', 60.0)
self.objectCategory = self._addNode('objectCategory', 90.0) self.objectCategory = self._addNode('objectCategory', 90.0)
self.bondFacet = self._addNode('bondFacet', 90.0) self.bond_edge_type = self._addNode('bond_edge_type', 90.0)
self.initiallyClampedSlipnodes = [ self.initiallyClampedSlipnodes = [
self.letterCategory, self.letterCategory,
@ -222,9 +222,9 @@ class SlipnetExporter:
(self.groupCategory, self.predecessorGroup), (self.groupCategory, self.predecessorGroup),
(self.groupCategory, self.successorGroup), (self.groupCategory, self.successorGroup),
(self.groupCategory, self.samenessGroup), (self.groupCategory, self.samenessGroup),
# bond facets # bond edge types
(self.bondFacet, self.letterCategory), (self.bond_edge_type, self.letterCategory),
(self.bondFacet, self.length), (self.bond_edge_type, self.length),
] ]
for a, b in links: for a, b in links:
self._addInstanceLink(a, b) self._addInstanceLink(a, b)

View File

@ -11,528 +11,229 @@
"name": "a", "name": "a",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"a"
],
"nearestLetter": "a"
}
}, },
{ {
"name": "b", "name": "b",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"b"
],
"nearestLetter": "b"
}
}, },
{ {
"name": "c", "name": "c",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"c"
],
"nearestLetter": "c"
}
}, },
{ {
"name": "d", "name": "d",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"d"
],
"nearestLetter": "d"
}
}, },
{ {
"name": "e", "name": "e",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"e"
],
"nearestLetter": "e"
}
}, },
{ {
"name": "f", "name": "f",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"f"
],
"nearestLetter": "f"
}
}, },
{ {
"name": "g", "name": "g",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"g"
],
"nearestLetter": "g"
}
}, },
{ {
"name": "h", "name": "h",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"h"
],
"nearestLetter": "h"
}
}, },
{ {
"name": "i", "name": "i",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"i"
],
"nearestLetter": "i"
}
}, },
{ {
"name": "j", "name": "j",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "k", "name": "k",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"k"
],
"nearestLetter": "k"
}
}, },
{ {
"name": "l", "name": "l",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"l"
],
"nearestLetter": "l"
}
}, },
{ {
"name": "m", "name": "m",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"m"
],
"nearestLetter": "m"
}
}, },
{ {
"name": "n", "name": "n",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"n"
],
"nearestLetter": "n"
}
}, },
{ {
"name": "o", "name": "o",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"o"
],
"nearestLetter": "o"
}
}, },
{ {
"name": "p", "name": "p",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"p"
],
"nearestLetter": "p"
}
}, },
{ {
"name": "q", "name": "q",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"q"
],
"nearestLetter": "q"
}
}, },
{ {
"name": "r", "name": "r",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"r"
],
"nearestLetter": "r"
}
}, },
{ {
"name": "s", "name": "s",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"s"
],
"nearestLetter": "s"
}
}, },
{ {
"name": "t", "name": "t",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"t"
],
"nearestLetter": "t"
}
}, },
{ {
"name": "u", "name": "u",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"u"
],
"nearestLetter": "u"
}
}, },
{ {
"name": "v", "name": "v",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"v"
],
"nearestLetter": "v"
}
}, },
{ {
"name": "w", "name": "w",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"w"
],
"nearestLetter": "w"
}
}, },
{ {
"name": "x", "name": "x",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"x"
],
"nearestLetter": "x"
}
}, },
{ {
"name": "y", "name": "y",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"y"
],
"nearestLetter": "y"
}
}, },
{ {
"name": "z", "name": "z",
"conceptualDepth": 10.0, "conceptualDepth": 10.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 0,
"path": [
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "1", "name": "1",
"conceptualDepth": 30.0, "conceptualDepth": 30.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 3,
"path": [
"1",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "2", "name": "2",
"conceptualDepth": 30.0, "conceptualDepth": 30.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 3,
"path": [
"2",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "3", "name": "3",
"conceptualDepth": 30.0, "conceptualDepth": 30.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 3,
"path": [
"3",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "4", "name": "4",
"conceptualDepth": 30.0, "conceptualDepth": 30.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 3,
"path": [
"4",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "5", "name": "5",
"conceptualDepth": 30.0, "conceptualDepth": 30.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 3,
"path": [
"5",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "leftmost", "name": "leftmost",
"conceptualDepth": 40.0, "conceptualDepth": 40.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 2,
"path": [
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "rightmost", "name": "rightmost",
"conceptualDepth": 40.0, "conceptualDepth": 40.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 2,
"path": [
"rightmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "middle", "name": "middle",
"conceptualDepth": 40.0, "conceptualDepth": 40.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 4,
"path": [
"middle",
"stringPositionCategory",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "single", "name": "single",
"conceptualDepth": 40.0, "conceptualDepth": 40.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 4,
"path": [
"single",
"stringPositionCategory",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "whole", "name": "whole",
"conceptualDepth": 40.0, "conceptualDepth": 40.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 4,
"path": [
"whole",
"stringPositionCategory",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "first", "name": "first",
"conceptualDepth": 60.0, "conceptualDepth": 60.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 1,
"path": [
"first",
"a"
],
"nearestLetter": "a"
}
}, },
{ {
"name": "last", "name": "last",
"conceptualDepth": 60.0, "conceptualDepth": 60.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 1,
"path": [
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "left", "name": "left",
@ -542,17 +243,7 @@
"codelets": [ "codelets": [
"top-down-bond-scout--direction", "top-down-bond-scout--direction",
"top-down-group-scout--direction" "top-down-group-scout--direction"
], ]
"minPathToLetter": {
"hops": 3,
"path": [
"left",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "right", "name": "right",
@ -562,17 +253,7 @@
"codelets": [ "codelets": [
"top-down-bond-scout--direction", "top-down-bond-scout--direction",
"top-down-group-scout--direction" "top-down-group-scout--direction"
], ]
"minPathToLetter": {
"hops": 3,
"path": [
"right",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "predecessor", "name": "predecessor",
@ -581,18 +262,7 @@
"shrunkLinkLength": 24.0, "shrunkLinkLength": 24.0,
"codelets": [ "codelets": [
"top-down-bond-scout--category" "top-down-bond-scout--category"
], ]
"minPathToLetter": {
"hops": 4,
"path": [
"predecessor",
"predecessorGroup",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "successor", "name": "successor",
@ -601,18 +271,7 @@
"shrunkLinkLength": 24.0, "shrunkLinkLength": 24.0,
"codelets": [ "codelets": [
"top-down-bond-scout--category" "top-down-bond-scout--category"
], ]
"minPathToLetter": {
"hops": 4,
"path": [
"successor",
"successorGroup",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "sameness", "name": "sameness",
@ -621,17 +280,7 @@
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0,
"codelets": [ "codelets": [
"top-down-bond-scout--category" "top-down-bond-scout--category"
], ]
"minPathToLetter": {
"hops": 3,
"path": [
"sameness",
"samenessGroup",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "predecessorGroup", "name": "predecessorGroup",
@ -640,17 +289,7 @@
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0,
"codelets": [ "codelets": [
"top-down-group-scout--category" "top-down-group-scout--category"
], ]
"minPathToLetter": {
"hops": 3,
"path": [
"predecessorGroup",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "successorGroup", "name": "successorGroup",
@ -659,17 +298,7 @@
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0,
"codelets": [ "codelets": [
"top-down-group-scout--category" "top-down-group-scout--category"
], ]
"minPathToLetter": {
"hops": 3,
"path": [
"successorGroup",
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "samenessGroup", "name": "samenessGroup",
@ -678,74 +307,37 @@
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0,
"codelets": [ "codelets": [
"top-down-group-scout--category" "top-down-group-scout--category"
], ]
"minPathToLetter": {
"hops": 2,
"path": [
"samenessGroup",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "identity", "name": "identity",
"conceptualDepth": 90.0, "conceptualDepth": 90.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 8,
"path": null,
"nearestLetter": null
}
}, },
{ {
"name": "opposite", "name": "opposite",
"conceptualDepth": 90.0, "conceptualDepth": 90.0,
"intrinsicLinkLength": 80.0, "intrinsicLinkLength": 80.0,
"shrunkLinkLength": 32.0, "shrunkLinkLength": 32.0
"minPathToLetter": {
"hops": 8,
"path": null,
"nearestLetter": null
}
}, },
{ {
"name": "letter", "name": "letter",
"conceptualDepth": 20.0, "conceptualDepth": 20.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 8,
"path": null,
"nearestLetter": null
}
}, },
{ {
"name": "group", "name": "group",
"conceptualDepth": 80.0, "conceptualDepth": 80.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 8,
"path": null,
"nearestLetter": null
}
}, },
{ {
"name": "letterCategory", "name": "letterCategory",
"conceptualDepth": 30.0, "conceptualDepth": 30.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 1,
"path": [
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "stringPositionCategory", "name": "stringPositionCategory",
@ -754,17 +346,7 @@
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0,
"codelets": [ "codelets": [
"top-down-description-scout" "top-down-description-scout"
], ]
"minPathToLetter": {
"hops": 3,
"path": [
"stringPositionCategory",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "alphabeticPositionCategory", "name": "alphabeticPositionCategory",
@ -773,107 +355,43 @@
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0,
"codelets": [ "codelets": [
"top-down-description-scout" "top-down-description-scout"
], ]
"minPathToLetter": {
"hops": 2,
"path": [
"alphabeticPositionCategory",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "directionCategory", "name": "directionCategory",
"conceptualDepth": 70.0, "conceptualDepth": 70.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 4,
"path": [
"directionCategory",
"left",
"leftmost",
"last",
"z"
],
"nearestLetter": "z"
}
}, },
{ {
"name": "bondCategory", "name": "bondCategory",
"conceptualDepth": 80.0, "conceptualDepth": 80.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 4,
"path": [
"bondCategory",
"sameness",
"samenessGroup",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "groupCategory", "name": "groupCategory",
"conceptualDepth": 80.0, "conceptualDepth": 80.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 3,
"path": [
"groupCategory",
"samenessGroup",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "length", "name": "length",
"conceptualDepth": 60.0, "conceptualDepth": 60.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 2,
"path": [
"length",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
}, },
{ {
"name": "objectCategory", "name": "objectCategory",
"conceptualDepth": 90.0, "conceptualDepth": 90.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 8,
"path": null,
"nearestLetter": null
}
}, },
{ {
"name": "bondFacet", "name": "bond_edge_type",
"conceptualDepth": 90.0, "conceptualDepth": 90.0,
"intrinsicLinkLength": 0, "intrinsicLinkLength": 0,
"shrunkLinkLength": 0.0, "shrunkLinkLength": 0.0
"minPathToLetter": {
"hops": 2,
"path": [
"bondFacet",
"letterCategory",
"j"
],
"nearestLetter": "j"
}
} }
], ],
"links": [ "links": [
@ -1967,24 +1485,24 @@
}, },
{ {
"source": "letterCategory", "source": "letterCategory",
"destination": "bondFacet", "destination": "bond_edge_type",
"fixedLength": 60.0, "fixedLength": 60.0,
"type": "category" "type": "category"
}, },
{ {
"source": "bondFacet", "source": "bond_edge_type",
"destination": "letterCategory", "destination": "letterCategory",
"fixedLength": 100.0, "fixedLength": 100.0,
"type": "instance" "type": "instance"
}, },
{ {
"source": "length", "source": "length",
"destination": "bondFacet", "destination": "bond_edge_type",
"fixedLength": 30.0, "fixedLength": 30.0,
"type": "category" "type": "category"
}, },
{ {
"source": "bondFacet", "source": "bond_edge_type",
"destination": "length", "destination": "length",
"fixedLength": 100.0, "fixedLength": 100.0,
"type": "instance" "type": "instance"

View File

@ -120,7 +120,7 @@ Figure~\ref{fig:comparison} shows scatter plots for all metrics. The eccentricit
The hop distance analysis ($r = 0.281$, $p = 0.113$) found no significant relationship between conceptual depth and distance to letter nodes. This weak positive trend fails significance, with $R^2 = 0.079$ explaining less than 8\% of variance. The hop distance analysis ($r = 0.281$, $p = 0.113$) found no significant relationship between conceptual depth and distance to letter nodes. This weak positive trend fails significance, with $R^2 = 0.079$ explaining less than 8\% of variance.
Counterexamples abound: \texttt{bondFacet} (depth=90) is only 2 hops from letters, while \texttt{middle} (depth=40) requires 4 hops. Counterexamples abound: \texttt{bond\_edge\_type} (depth=90) is only 2 hops from letters, while \texttt{middle} (depth=40) requires 4 hops.
\subsection{Eccentricity: The Significant Finding} \subsection{Eccentricity: The Significant Finding}
@ -143,7 +143,7 @@ Node & Depth & Eccentricity \\
\midrule \midrule
letterCategory & 30 & 4 \\ letterCategory & 30 & 4 \\
length & 60 & 5 \\ length & 60 & 5 \\
bondFacet & 90 & 5 \\ bond\_edge\_type & 90 & 5 \\
\midrule \midrule
middle & 40 & 7 \\ middle & 40 & 7 \\
identity & 90 & 3 (isolated) \\ identity & 90 & 3 (isolated) \\
@ -170,7 +170,7 @@ Standard centrality measures show weak negative correlations but none reach sign
The eccentricity finding reveals that conceptual depth partially reflects \emph{global} network position. Nodes with high depth tend to have lower eccentricity, meaning they are never ``too far'' from any other node. This differs from local centrality (degree, clustering), which shows no relationship. The eccentricity finding reveals that conceptual depth partially reflects \emph{global} network position. Nodes with high depth tend to have lower eccentricity, meaning they are never ``too far'' from any other node. This differs from local centrality (degree, clustering), which shows no relationship.
Intuitively, abstract concepts like \texttt{bondFacet} or \texttt{samenessGroup} may have been positioned to be accessible from many parts of the conceptual space, even if they don't have many direct connections. Intuitively, abstract concepts like \texttt{bond\_edge\_type} or \texttt{samenessGroup} may have been positioned to be accessible from many parts of the conceptual space, even if they don't have many direct connections.
\subsection{Local vs Global Structure} \subsection{Local vs Global Structure}
@ -255,7 +255,7 @@ Node & Depth & Deg & Btw & Ecc \\
\midrule \midrule
letterCategory & 30 & 0.50 & 0.68 & 4 \\ letterCategory & 30 & 0.50 & 0.68 & 4 \\
length & 60 & 0.17 & 0.25 & 5 \\ length & 60 & 0.17 & 0.25 & 5 \\
bondFacet & 90 & 0.03 & 0.00 & 5 \\ bond\_edge\_type & 90 & 0.03 & 0.00 & 5 \\
middle & 40 & 0.02 & 0.00 & 7 \\ middle & 40 & 0.02 & 0.00 & 7 \\
identity & 90 & 0.00 & 0.00 & 3 \\ identity & 90 & 0.00 & 0.00 & 3 \\
opposite & 90 & 0.00 & 0.00 & 3 \\ opposite & 90 & 0.00 & 0.00 & 3 \\