-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tessel_Graph.py
250 lines (188 loc) · 9.62 KB
/
Tessel_Graph.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# pip install openai
# pip install graphviz
print("starting")
import openai
import json
from graphviz import Digraph
import collections
# Set up OpenAI API key
openai.api_key = "none"
openai.api_base = "http://localhost:1234/v1"
#client = openai(base_url="http://localhost:1234/v1", api_key="not-needed")
def prompt_lm(prompt):
print("inside")
completion = response = openai.ChatCompletion.create(model="local_model",
messages=[
{"role": "system", "content": "Employ concepts as poles on an axis to find their perpendicular partners in a tessellating graph function for exploring concept spaces."},
{"role": "user", "content": prompt}
],
temperature=0.17,
)
print(completion)
return [choice.text.strip() for choice in completion.choices]
def generate_graph():
initial_subject = "Artificial Intelligence"
opposite_subject = prompt_lm(f"Suggest an idea that contrasts or opposes the concept of {initial_subject}")[0]
subject_queue = [initial_subject, opposite_subject]
graph = Digraph()
graph.node(initial_subject)
graph.node(opposite_subject)
graph.edge(initial_subject, opposite_subject)
while subject_queue:
current_subject_a, current_subject_b = subject_queue.pop(0), subject_queue.pop(0)
prompt = f"Suggest ideas that are perpendicular to the axis formed by '{current_subject_a}' and '{current_subject_b}'"
new_subjects = prompt_lm(prompt)
perpendicular_subjects = [s for s in new_subjects if s not in graph.body]
subject_queue.extend(perpendicular_subjects)
for new_subject in perpendicular_subjects:
graph.node(new_subject)
graph.edge(current_subject_a, new_subject)
graph.edge(current_subject_b, new_subject)
return graph
def generate_graph2_null(initial_subject, opposite_subject, max_depth=2):
graph = Digraph()
graph.node(initial_subject)
graph.node(opposite_subject)
graph.edge(initial_subject, opposite_subject)
subject_queue = [(initial_subject, opposite_subject, 0)]
while subject_queue:
current_subjects, depth = subject_queue.pop(0)[0:2], subject_queue.pop(0)[2]
if depth >= max_depth:
continue
prompt = f"Suggest ideas that are perpendicular to the axis formed by '{current_subjects[0]}' and '{current_subjects[1]}'"
new_subjects = prompt_lm(prompt)
perpendicular_subjects = [s for s in new_subjects if s not in graph.body]
for new_subject in perpendicular_subjects:
graph.node(new_subject)
for current_subject in current_subjects:
graph.edge(current_subject, new_subject)
for i in range(0, len(perpendicular_subjects), 2):
if i + 1 < len(perpendicular_subjects):
new_axis = (perpendicular_subjects[i], perpendicular_subjects[i + 1])
subject_queue.append((new_axis, depth + 1))
return graph
def generate_graph2(initial_subject, opposite_subject, max_depth=2):
graph = Digraph()
graph.node(initial_subject)
graph.node(opposite_subject)
graph.edge(initial_subject, opposite_subject)
subject_queue = [(initial_subject, opposite_subject, 0)]
while subject_queue:
try:
current_subjects, depth = subject_queue.pop(0)[0:2], subject_queue.pop(0)[2]
except IndexError:
break # Exit the loop if the queue is empty
if depth >= max_depth:
continue
prompt = f"Suggest ideas that are perpendicular to the axis formed by '{current_subjects[0]}' and '{current_subjects[1]}'"
print(prompt)
new_subjects = prompt_lm(prompt)
perpendicular_subjects = [s for s in new_subjects if s not in graph.body]
if not perpendicular_subjects:
continue # Skip this iteration if no new perpendicular subjects are generated
for new_subject in perpendicular_subjects:
graph.node(new_subject)
for current_subject in current_subjects:
graph.edge(current_subject, new_subject)
for i in range(0, len(perpendicular_subjects), 2):
if i + 1 < len(perpendicular_subjects):
new_axis = (perpendicular_subjects[i], perpendicular_subjects[i + 1])
subject_queue.append((new_axis, depth + 1))
return graph
def generate_graph3(initial_subject, opposite_subject, max_depth=2):
graph = Digraph()
graph.node(initial_subject)
graph.node(opposite_subject)
graph.edge(initial_subject, opposite_subject)
subject_queue = [(initial_subject, opposite_subject, 0)]
while subject_queue:
print(subject_queue)
current_subjects, depth = subject_queue.pop(0)
if depth >= max_depth:
continue
prompt = f"Suggest ideas that are perpendicular to the axis formed by '{current_subjects[0]}' and '{current_subjects[1]}'"
print(prompt) # This line should now be reached
new_subjects = prompt_lm(prompt)
perpendicular_subjects = [s for s in new_subjects if s not in graph.body]
if not perpendicular_subjects:
continue # Skip this iteration if no new perpendicular subjects are generated
for new_subject in perpendicular_subjects:
graph.node(new_subject)
for current_subject in current_subjects:
graph.edge(current_subject, new_subject)
for i in range(0, len(perpendicular_subjects), 2):
if i + 1 < len(perpendicular_subjects):
new_axis = (perpendicular_subjects[i], perpendicular_subjects[i + 1])
#subject_queue.append(new_axis + (depth + 1,))
subject_queue.append((new_axis, depth + 1))
return graph
def generate_graph4(initial_subject, opposite_subject, max_depth=2):
graph = Digraph()
graph.node(initial_subject)
graph.node(opposite_subject)
graph.edge(initial_subject, opposite_subject)
subject_queue = [(initial_subject, opposite_subject, 0)]
while subject_queue:
#current_subject, depth = subject_queue.pop(0)
depth, current_subject = subject_queue.pop(0)[0:2]
if int(depth) >= max_depth:
#if int(depth.split()[0]) >= max_depth: #didn't work
continue
prompt = f"Suggest ideas that are perpendicular to the axis formed by '{current_subjects[0]}' and '{current_subjects[1]}'"
print(prompt) # This line should now be reached
new_subjects = prompt_lm(prompt)
perpendicular_subjects = [s for s in new_subjects if s not in graph.body]
if not perpendicular_subjects:
continue # Skip this iteration if no new perpendicular subjects are generated
for new_subject in perpendicular_subjects:
graph.node(new_subject)
for current_subject in current_subjects:
graph.edge(current_subject, new_subject)
for i in range(0, len(perpendicular_subjects), 2):
if i + 1 < len(perpendicular_subjects):
new_axis = (perpendicular_subjects[i], perpendicular_subjects[i + 1])
subject_queue.append((new_axis, depth + 1))
return graph
from collections import namedtuple
from collections import deque # Import for queue functionality
SubjectEntry = namedtuple("SubjectEntry", ["subject", "depth"])
def generate_graph5(initial_subject, opposite_subject, max_depth=2):
graph = Digraph()
graph.node(initial_subject)
graph.node(opposite_subject)
graph.edge(initial_subject, opposite_subject)
subject_queue = deque([SubjectEntry(initial_subject, 0), SubjectEntry(opposite_subject, 0)])
while subject_queue:
subject_entry = subject_queue.popleft() # Use popleft() for queue behavior
if subject_entry.depth >= max_depth:
continue
#prompt = f"Suggest ideas that are perpendicular to the axis formed by '{subject_entry.subject[0:]}' and '{subject_entry.subject[1:]}'"
#subject1, subject2 = subject_entry.subject
#prompt = f"Suggest ideas that are perpendicular to the axis formed by '{subject1}' and '{subject2}'"
prompt = f"Suggest ideas that are perpendicular to the axis formed by '{subject_entry.subject}'"
print(prompt)
new_subjects = prompt_lm(prompt) # Replace with your function that returns suggestions
perpendicular_subjects = [s for s in new_subjects if s not in graph.body]
if not perpendicular_subjects:
continue
for new_subject in perpendicular_subjects:
graph.node(new_subject)
for current_subject in subject_entry.subject:
graph.edge(current_subject, new_subject)
for i in range(0, len(perpendicular_subjects), 2):
if i + 1 < len(perpendicular_subjects):
new_axis = (perpendicular_subjects[i], perpendicular_subjects[i + 1])
new_subject_entry = subject_entry._replace(subject=new_axis) # Create new entry
subject_queue.append(new_subject_entry)
return graph
# Generate the graph
graph = generate_graph5("emotional dependency", "radical social evolution", max_depth=4)
# Save graph as a text file
with open("concept_graph.txt", "w", encoding="utf-8") as f:
f.write(str(graph))
"""
# Save graph as a JSON object
graph_json = json.loads(graph.source)
with open("concept_graph.json", "w", encoding="utf-8") as f:
json.dump(graph_json, f, indent=2)
"""