mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
720e5cd651
* start refactoring -not yet functional * first phase of refactor done - not sure weighted prompts working * Second phase of refactoring. Everything mostly working. * The refactoring has moved all the hard-core inference work into ldm.dream.generator.*, where there are submodules for txt2img and img2img. inpaint will go in there as well. * Some additional refactoring will be done soon, but relatively minor work. * fix -save_orig flag to actually work * add @neonsecret attention.py memory optimization * remove unneeded imports * move token logging into conditioning.py * add placeholder version of inpaint; porting in progress * fix crash in img2img * inpainting working; not tested on variations * fix crashes in img2img * ported attention.py memory optimization #117 from basujindal branch * added @torch_no_grad() decorators to img2img, txt2img, inpaint closures * Final commit prior to PR against development * fixup crash when generating intermediate images in web UI * rename ldm.simplet2i to ldm.generate * add backward-compatibility simplet2i shell with deprecation warning * add back in mps exception, addresses @vargol comment in #354 * replaced Conditioning class with exported functions * fix wrong type of with_variations attribute during intialization * changed "image_iterator()" to "get_make_image()" * raise NotImplementedError for calling get_make_image() in parent class * Update ldm/generate.py better error message Co-authored-by: Kevin Gibbons <bakkot@gmail.com> * minor stylistic fixes and assertion checks from code review * moved get_noise() method into img2img class * break get_noise() into two methods, one for txt2img and the other for img2img * inpainting works on non-square images now * make get_noise() an abstract method in base class * much improved inpainting Co-authored-by: Kevin Gibbons <bakkot@gmail.com>
128 lines
3.9 KiB
Python
128 lines
3.9 KiB
Python
"""
|
|
Readline helper functions for dream.py (linux and mac only).
|
|
"""
|
|
import os
|
|
import re
|
|
import atexit
|
|
|
|
# ---------------readline utilities---------------------
|
|
try:
|
|
import readline
|
|
|
|
readline_available = True
|
|
except:
|
|
readline_available = False
|
|
|
|
|
|
class Completer:
|
|
def __init__(self, options):
|
|
self.options = sorted(options)
|
|
return
|
|
|
|
def complete(self, text, state):
|
|
buffer = readline.get_line_buffer()
|
|
|
|
if text.startswith(('-I', '--init_img','-M','--init_mask')):
|
|
return self._path_completions(text, state, ('.png','.jpg','.jpeg'))
|
|
|
|
if buffer.strip().endswith('cd') or text.startswith(('.', '/')):
|
|
return self._path_completions(text, state, ())
|
|
|
|
response = None
|
|
if state == 0:
|
|
# This is the first time for this text, so build a match list.
|
|
if text:
|
|
self.matches = [
|
|
s for s in self.options if s and s.startswith(text)
|
|
]
|
|
else:
|
|
self.matches = self.options[:]
|
|
|
|
# Return the state'th item from the match list,
|
|
# if we have that many.
|
|
try:
|
|
response = self.matches[state]
|
|
except IndexError:
|
|
response = None
|
|
return response
|
|
|
|
def _path_completions(self, text, state, extensions):
|
|
# get the path so far
|
|
# TODO: replace this mess with a regular expression match
|
|
if text.startswith('-I'):
|
|
path = text.replace('-I', '', 1).lstrip()
|
|
elif text.startswith('--init_img='):
|
|
path = text.replace('--init_img=', '', 1).lstrip()
|
|
elif text.startswith('--init_mask='):
|
|
path = text.replace('--init_mask=', '', 1).lstrip()
|
|
elif text.startswith('-M'):
|
|
path = text.replace('-M', '', 1).lstrip()
|
|
else:
|
|
path = text
|
|
|
|
matches = list()
|
|
|
|
path = os.path.expanduser(path)
|
|
if len(path) == 0:
|
|
matches.append(text + './')
|
|
else:
|
|
dir = os.path.dirname(path)
|
|
dir_list = os.listdir(dir)
|
|
for n in dir_list:
|
|
if n.startswith('.') and len(n) > 1:
|
|
continue
|
|
full_path = os.path.join(dir, n)
|
|
if full_path.startswith(path):
|
|
if os.path.isdir(full_path):
|
|
matches.append(
|
|
os.path.join(os.path.dirname(text), n) + '/'
|
|
)
|
|
elif n.endswith(extensions):
|
|
matches.append(os.path.join(os.path.dirname(text), n))
|
|
|
|
try:
|
|
response = matches[state]
|
|
except IndexError:
|
|
response = None
|
|
return response
|
|
|
|
|
|
if readline_available:
|
|
readline.set_completer(
|
|
Completer(
|
|
[
|
|
'--steps','-s',
|
|
'--seed','-S',
|
|
'--iterations','-n',
|
|
'--width','-W','--height','-H',
|
|
'--cfg_scale','-C',
|
|
'--grid','-g',
|
|
'--individual','-i',
|
|
'--init_img','-I',
|
|
'--init_mask','-M',
|
|
'--strength','-f',
|
|
'--variants','-v',
|
|
'--outdir','-o',
|
|
'--sampler','-A','-m',
|
|
'--embedding_path',
|
|
'--device',
|
|
'--grid','-g',
|
|
'--gfpgan_strength','-G',
|
|
'--upscale','-U',
|
|
'-save_orig','--save_original',
|
|
'--skip_normalize','-x',
|
|
'--log_tokenization','t',
|
|
]
|
|
).complete
|
|
)
|
|
readline.set_completer_delims(' ')
|
|
readline.parse_and_bind('tab: complete')
|
|
|
|
histfile = os.path.join(os.path.expanduser('~'), '.dream_history')
|
|
try:
|
|
readline.read_history_file(histfile)
|
|
readline.set_history_length(1000)
|
|
except FileNotFoundError:
|
|
pass
|
|
atexit.register(readline.write_history_file, histfile)
|