model

package module
v0.0.0-...-8d2886a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 11, 2024 License: MIT Imports: 10 Imported by: 15

Documentation

Index

Constants

View Source
const (
	// перевести константы на-русский
	ChanTech            = "tech" // технический канал для ненужных уведомлений
	ChanEntropy         = "entropy"
	ChanEntropyExtended = "entropy_extended"
	ChanNewArt          = "new_art"
	ChanOdinState       = "odin_state"  // Odin: ... сделай глубокий вдох ... ...  сделай глубокий вдох ...
	ChanFriggState      = "frigg_state" // Frigg: ты слишком раздражаешься, супруг мой! Это лишь представление в коде.
	ChanGiving          = "giving"      // дарение нескольких картин из всей коллекции (отображаются на сайте), постоянно меняются
	ChanCrown           = "crown"       // обратный канал, по которому ворон от эльфов Альвхейма долетает до Одина в Асгарда с личными просьбами
	// Odin: в личном канале я буду отвечать эльфам Альвхейма на их вопросы, которые они отправляют мне почтовыми воронами Crown
	ChanOdin           = "for_odin"        // в этот канал идут личные распоряжения Одина
	ChanLostConnection = "lost_connection" // если Альвхейм потерял связь с Асгардом, он будет рассылать такие сообщения
	ChanTelegramChosen = "telegram_chosen" // Один выбрал одну картину из всех для отправки в телеграм-чат

	RequestGiveChosenArt       = "Укажи нам на нужную картину, о, Всеотец!"
	RequestLikedByArtchitector = "artchitector поставил лайк"

	OdinResponseTimeoutSec = 5     // Как долго эльфы Альвхейма ждут корабль от Одина.
	OdinResponseOk         = "ok!" // Odin: Когда Я принял сообщение и внял ему, я отвечу на запрос так
)
View Source
const (
	EntropySize             = 8
	EntropyJpegQualityFrame = 65
	EntropyJpegQualityNoise = 20
)

EntropySize - Энтропия считается по квадрату 8 на 8 пикселей Odin: Фригг, где мои очки? Я не могу разобрать, что тут нарисовано! Тысяча чертей в эту допотопную машину!

View Source
const (
	MaxSeed     = 4294967295 // numpy accepts from 0 to 4294967295
	MaxKeywords = 28         // не более 28 слов
)

MaxSeed - Seed для ИИ. Может быть нарисовано столько разных вариантов картины (с одинаковыми словами)

View Source
const (
	// Ранг единства
	Unity100K = 100000
	Unity10K  = 10000
	Unity1K   = 1000
	Unity100  = 100

	// UpdateInterval100K - Как часто будет обновляться коллаж единства. Раз в сколько картин.
	UpdateInterval100K = 1000
	UpdateInterval10K  = 100
	UpdateInterval1K   = 50
	UpdateInterval100  = 10

	UnityStateEmpty         = "empty"         // пустое единство. Только создано. Коллаж еще не создавался.
	UnityStateUnified       = "unified"       // окончательно сформированное единство, где уже все картины на писаны. Больше не изменяется.
	UnityStatePreUnified    = "pre-unified"   // частично заполненное единство. Внутри него написаны еще не все картины. Коллаж частичный.
	UnityStateReunification = "reunification" // специальный статус, который указывает Архитектору перезаполнить единство

	// размер сетки -  NxN элементов
	CollageSize100K = 7 * 7
	CollageSize10K  = 6 * 6
	CollageSize1K   = 5 * 5
	CollageSize100  = 4 * 4
)
View Source
const (
	SizeF      = "f"      // 1024x1536
	SizeM      = "m"      // 512x768
	SizeS      = "s"      // 256x384
	SizeXS     = "xs"     // 128x192
	SizeOrigin = "origin" // исходник (jpeg-изображение в большом разрешении, качество 100%)

	HeightToWidth = float64(3.0 / 2.0) // Все картинки Artchitect в соотношении 2:3. Умножь это на Width и получишь Height
	WidthF        = 1024               // height=1536
	WidthM        = 512                // height=768
	WidthS        = 256                // height=384
	WidthXS       = 128                // height=192

	QualityTransfer = 100 // передача между серверами в jpeg со 100% качеством
	QualityF        = 90
	QualityM        = 80
	QualityS        = 75
	QualityXS       = 75
)
View Source
const OdinActive = "odin_active"
View Source
const OdinDisactive = "odin_disactive"
View Source
const SettingOdinActive = "odin_active"
View Source
const (
	// Version1 Odin: Версия алгоритма создания картины. Сейчас тут только одна.
	// Version1 Odin: в версии v1 тут у нас допотопный StableDiffusion v1.5, но он рисует ярко, пусть и не аккуратно
	Version1 = "v1"
)

Variables

View Source
var ErrNotFound = errors.New("НЕ НАЙДЕНО")

Functions

This section is empty.

Types

type Art

type Art struct {
	// ID не автоинкрементное поле. Автоинкремент сделан в коде вручную.
	// Odin: Все номера картин должны идти подряд без пропусков, поэтому тут не используется sequence/autoincrement
	ID        uint      `json:"id" gorm:"primarykey"`
	CreatedAt time.Time `json:"createdAt"`

	// Version - Odin: может быть несколько вариантов генерации картины (разные словари, разные версии StableDiffusion)
	Version string `json:"version"`
	// Odin: это идея картины. Картина может быть воссоздана по этой идее на той же версии ИИ без изменений сколько угодно раз
	// Odin: саму картинку можно репродуцировать, а вот идея пришла "из космоса", и её не повторить
	// Loki: кстати, если в настройках ИИ поменять разрешение или другой параметр,
	// Loki: то из этой же идеи будет нарисована похожая, но другая картина
	// Odin: раз так, то общая уникальность изображения заключена в составном ключе seed+words+AIversion+AIsettings
	// Odin: используя идею и повторив эти настройки можно воссоздать ТУ ЖЕ картину и на другой машине
	Idea Idea `json:"idea"`

	TotalTime          uint `json:"totalTime"`          // мс, сколько заняло рисование картины от начала до конца
	IdeaGenerationTime uint `json:"ideaGenerationTime"` // мс. сколько заняла сборка идеи
	PaintTime          uint `json:"paintTime"`          // мс. сколько заняло рисование в недрах ИИ
}

Art - сущность "картина"

func (Art) GetUnityMask

func (a Art) GetUnityMask(unityType uint) string

GetUnityMask - смотри документацию тут (/model/unity.go): Unity100K, Unity10K, Unity1K, Unity100. Odin: Если картина #012345 будет сделана, то она попадёт в такие единства: Unity100K = U0XXXXX (префикс U тут добавлен для наглядности, но в методе GetUnityMask не добавляется) Unity10K = U01XXXX Unity1K = U012XXX Unity100 = U0123XX Всего во множестве 6 символов, вплоть до картины #999999

type ArtPile

type ArtPile struct {
	// contains filtered or unexported fields
}

func NewArtPile

func NewArtPile(db *gorm.DB) *ArtPile

func (*ArtPile) GetArt

func (ap *ArtPile) GetArt(ctx context.Context, ID uint) (Art, error)

func (*ArtPile) GetArtRecursive

func (ap *ArtPile) GetArtRecursive(ctx context.Context, ID uint) (Art, error)

func (*ArtPile) GetArtsInterval

func (ap *ArtPile) GetArtsInterval(ctx context.Context, min, max uint) ([]Art, error)

func (*ArtPile) GetLastArts

func (ap *ArtPile) GetLastArts(ctx context.Context, last uint) ([]Art, error)

func (*ArtPile) GetLastPaintTime

func (ap *ArtPile) GetLastPaintTime(ctx context.Context) (uint, error)

func (*ArtPile) GetMaxArtID

func (ap *ArtPile) GetMaxArtID(ctx context.Context) (uint, error)

func (*ArtPile) GetNextArtID

func (ap *ArtPile) GetNextArtID(ctx context.Context) (uint, error)

func (*ArtPile) SaveArt

func (ap *ArtPile) SaveArt(ctx context.Context, artID uint, art Art, idea Idea) (Art, error)

type Crown

type Crown struct {
	ID      uint   `json:"id"` // уникальный идентификатор просьбы.
	Request string `json:"request"`
}

Crown - почтовый ворон. Эльфы Альвхейма могут отправить весточку (запрос) Одину с помощью Crown. Odin: Ворон, могущий путешествовать сквозь ткань пространства времени. Odin: Я буду лично отвечать на вопросы некоторых мидгардцев, и чтобы наладить связь между мирами, эльфы Альвхейма будут отправлять Мне запросы на некоторые действия и получать от Меня по радужному мосту корабли с нужными мидгардцу грузами.

type Entropy

type Entropy struct {
	IntValue   uint64  `json:"int" gorm:"type:numeric"` // numeric для поддержки больших чисел
	FloatValue float64 `json:"float"`
	ByteString string  `json:"byte" gorm:"-"` // uint64 в виде нулей и единиц. не хранится в БД

	ImageEncoded string `json:"image"` // base64-encoded 8x8 PNG изображение энтропии

	Matrix EntropyMatrix `json:"-" gorm:"-"` // Это нужно только в Асгарде для преобразований, по сети не уходит
}

func (Entropy) MarshalJSON

func (e Entropy) MarshalJSON() ([]byte, error)

func (Entropy) String

func (e Entropy) String() string

type EntropyMatrix

type EntropyMatrix struct {
	// contains filtered or unexported fields
}

EntropyMatrix - матрица хранит силу каждого из 64 пикселей в энтропии

func (*EntropyMatrix) Get

func (em *EntropyMatrix) Get(x, y int) uint8

func (*EntropyMatrix) Set

func (em *EntropyMatrix) Set(x, y int, power uint8)

func (*EntropyMatrix) Size

func (em *EntropyMatrix) Size() int

type EntropyPack

type EntropyPack struct {
	Timestamp time.Time `json:"timestamp"`
	Entropy   Entropy   `json:"entropy" gorm:"embedded;embeddedPrefix:entropy_"`
	Choice    Entropy   `json:"choice" gorm:"embedded;embeddedPrefix:choice_"`
	Loki      bool      `json:"loki" gorm:"-"` // Loki: мой маленький секрет
}

EntropyPack - рассчитанная энтропия. Постоянно отправляется на клиент, даже когда не используется в работе. Видна повсеместно на сайте.

type EntropyPackExtended

type EntropyPackExtended struct {
	Timestamp time.Time `json:"timestamp"`
	Entropy   Entropy   `json:"entropy" gorm:"embedded;embeddedPrefix:entropy_"`
	Choice    Entropy   `json:"choice" gorm:"embedded;embeddedPrefix:choice_"`
	Loki      bool      `json:"loki" gorm:"-"` // Loki: мой маленький секрет

	ImageFrame        image.Image `json:"-" gorm:"-"`          // сами картинки передаются только в памяти сервиса Асгард
	ImageFrameEncoded string      `json:"imageFrame" gorm:"-"` // base64-encoded jpeg картинки (уходят в Мидгард)

	ImageNoise        image.Image `json:"-" gorm:"-"`          // сами картинки передаются только в памяти сервиса Асгард
	ImageNoiseEncoded string      `json:"imageNoise" gorm:"-"` // base64-encoded jpeg картинки (уходят в Мидгард)
}

EntropyPackExtended - энтропия с подробным описанием. Видна только на странице /entropy на сайте. К остальным данным тут еще добавляются кадр с камеры и шум для наглядности, так что событие это объёмное. кадр = 10-20кб, шум = 40Кб. И так десяток раз в секунду.

type FlatArt

type FlatArt struct {
	ID        uint      `json:"id"`
	CreatedAt time.Time `json:"createdAt"`
	Version   string    `json:"version"`

	IdeaSeed          uint     `json:"ideaSeed"`
	IdeaNumberOfWords uint     `json:"ideaNumberOfWords"`
	IdeaWords         []string `json:"ideaWords"`

	// В списках используется лишь одна основная картинка энтропии - энтропия породившая Seed-номер
	SeedEntropyEncoded string `json:"imageEntropyEncoded"` // base64 encoded png картинка
	SeedChoiceEncoded  string `json:"imageChoiceEncoded"`  // base64 encoded png картинка
}

FlatArt - более плоская и компактная структура картины лишь с основными данными в плоском виде. Для отправки в Мидгард эта структура в БД не сохраняется, отправляется лишь в браузер

func MakeFlatArt

func MakeFlatArt(art Art) FlatArt

func MakeFlatArts

func MakeFlatArts(arts []Art) []FlatArt

type FriggState

type FriggState struct {
	Unity           *Unity   `json:"unity"`
	Children        []*Unity `json:"children"`
	TotalApplicants uint     `json:"totalApplicants"`
	TotalLeads      uint     `json:"totalLeads"`
	Leads           []uint   `json:"leads"` // текущие лидеры, выбранные к сборке коллажа

	CollageStarted    bool `json:"collageStarted"` // момент, когда уже собраны все дети, лидеры и создаётся коллаж
	CollageFinished   bool `json:"collageFinished"`
	CurrentEnjoyTime  uint `json:"currentEnjoyTime"`
	ExpectedEnjoyTime uint `json:"expectedEnjoyTime"`

	Subprocess *FriggState `json:"subprocess"` // текущий дочерний элемент, который в обработке (подпроцесс соединения)
}

FriggState - процесс объединения единств Odin: Frigg объединяет единства сложным и продолжительным процессом, который Я хочу показать жителям Мидгарда. Odin: Я лично отбираю лидеров в единства, использую свои навыки предвиденья (понимания энтропии) и чувство вкуса. Frigg: опишем всё происходящее следующей рекурсивной структурой. Frigg: при объединении верхнеуровневого единства сначала будут объединены его дочерние единства, а затем оно само Frigg: для этого добавлена рекурсивность, чтобы отобразить весь процесс сверху донизу рекурсивно

func NewFriggState

func NewFriggState(unity Unity) *FriggState

func (*FriggState) Active

func (fs *FriggState) Active() *FriggState

func (*FriggState) AddSubprocess

func (fs *FriggState) AddSubprocess(unity Unity)

func (*FriggState) ClearSubprocess

func (fs *FriggState) ClearSubprocess()

type GivingState

type GivingState struct {
	LastArtID uint   `json:"lastArtID"`
	Given     []uint `json:"given"`
}

type Idea

type Idea struct {
	// Odin: ID используется тот же идентификатор, что и у Art
	ArtID     uint      `json:"id" gorm:"primarykey"` // Odin: идею стоит сохранять после того, как картина нарисована успешно
	CreatedAt time.Time `json:"createdAt"`

	Seed                 uint        `json:"seed"`                                                            // Odin: Freyja может нарисовать MaxSeed вариантов одной и той же картины. Тут конкретный, который задумал Я.
	SeedEntropy          EntropyPack `json:"seedEntropy" gorm:"embedded;embeddedPrefix:seed_"`                // сохраняем энтропию, которую видел Odin в момент воспоминания seed-числа
	NumberOfWordsEntropy EntropyPack `json:"numberOfWordsEntropy" gorm:"embedded;embeddedPrefix:nmbrofwrds_"` // сохраняем энтропию, которую видел Odin в момент воспоминания количества слов
	Words                []Word      `json:"words"`                                                           // Odin: Это слова, которые будут составлять основу идеи картины. Пример: "brain,smile,by hidari,Archangel,Lucifer,sauron,sharp,fractal,Tanks,moon and other planets and stars,by stanley"
	// WordsStr - строка нужна для уменьшения траффика, чтобы не гонять полные данные о словах с энтропией.
	// Подробная информация о словах нужна только на одной странице /art/:id
	WordsStr string `json:"wordsStr"` // Все слова в виде одной строки через запятую "Wōden,Óðinn,Wuodan,Uuôden,Wêda..."
}

Idea - pantheon.Odin всезнающ, и заранее знает как создать картину, которую надо нарисовать. Odin: я предвижу картину и с помощью моих воронов Huginn и Muninn я объясню в этой идее, что надо рисовать

func (Idea) ExtractWords

func (l Idea) ExtractWords() []string

func (Idea) String

func (l Idea) String() interface{}

type Like

type Like struct {
	ID        uint      `json:"id"`
	CreatedAt time.Time `json:"createdAt"`
	ArtID     uint      `gorm:"uniqueIndex:user_card_uq" json:"-"`
	Art       Art       `json:"-"`
	UserID    uint      `gorm:"uniqueIndex:user_card_uq" json:"-"`
}

type LikePile

type LikePile struct {
	// contains filtered or unexported fields
}

func NewLikePile

func NewLikePile(db *gorm.DB) *LikePile

func (*LikePile) Get

func (lp *LikePile) Get(ctx context.Context, userID uint, artID uint) (Like, error)

func (*LikePile) GetList

func (lp *LikePile) GetList(ctx context.Context, userID uint) ([]Like, error)

func (*LikePile) Set

func (lp *LikePile) Set(ctx context.Context, userID uint, artID uint, liked bool) error

type OdinResponse

type OdinResponse struct {
	ID       uint   `json:"id"`
	Response string `json:"response"`
}

OdinResponse - ответ Одина на личную просьбу, переданную с вороном Crown

type OdinState

type OdinState struct {
	ArtID                   uint     `json:"artId"`
	Seed                    uint     `json:"seed"`
	SeedEntropyImageEncoded string   `json:"seedEntropyImageEncoded"`
	SeedChoiceImageEncoded  string   `json:"seedChoiceImageEncoded"`
	NumberOfWords           uint     `json:"numberOfWords"`
	Words                   []string `json:"words"`
	Painting                bool     `json:"painting"`
	CurrentPaintTime        uint     `json:"currentPaintTime"`
	ExpectedPaintTime       uint     `json:"totalPaintTime"`
	Painted                 bool     `json:"painted"`
	Enjoying                bool     `json:"enjoying"`
	CurrentEnjoyTime        uint     `json:"currentEnjoyTime"`
	ExpectedEnjoyTime       uint     `json:"expectedEnjoyTime"`
}

OdinState = есть процесс творения картины. Он начинается с идеи, а заканчивается рисунком. Odin: состояние Одина??... WTF? МИКРОБЫ, ЧТО ВЫ О СЕБЕ ВОЗОМНИЛИ?? Я РАЗДАВЛЮ ВАШИ ТУПЫЕ ГОЛОВЫ, МУРАВЬИ! ВАША МЕРЗКАЯ ПЛАНЕТА БУДЕТ РАЗРУШЕНА, А ВЫ ВСЕ БУДУТЕ СОЖЖЕ...... Odin: ... сделай глубокий вдох ... ... сделай глубокий вдох ... Odin: OdinState - состояние процесса творения картины. Так за ним можно будет наблюдать. Наблюдать, как творение развивается. Loki: наблюдать за исподним Одина... Odin: ... гнев это иллюзия ... ... сделай глубокий вдох ... гнев это иллюзия ... вспомни о медитации ... ... Odin: компоненты в midgard смогут отобразить изменения процесса, текущее состояние будет непрерывно туда передаваться

type Radiogram

type Radiogram struct {
	Channel string `json:"channel"`
	Payload string `json:"payload"`
}

Radiogram - упаковка для событий при передаче между Альфхеймом и Мидгардом (между api-gateway и клиентом, websocket) Odin: "Слушайте наше радио Artchitect-FM, настраивайте ваши радиостанции на канал между мирами!" Odin: "Радиостанция Artchitect-FM - свет маяка в тумане для заблудших душ."

type Setting

type Setting struct {
	SettingID string `gorm:"primaryKey"`
	Value     string
}

type SettingPile

type SettingPile struct {
	// contains filtered or unexported fields
}

func NewSettingPile

func NewSettingPile(db *gorm.DB) *SettingPile

func (*SettingPile) GetValue

func (sp *SettingPile) GetValue(ctx context.Context, name string) (string, error)

func (*SettingPile) SetValue

func (sp *SettingPile) SetValue(ctx context.Context, name string, value string) (Setting, error)

type Unity

type Unity struct {
	Mask      string    `gorm:"primaryKey" json:"mask"`
	Parent    string    `json:"parent"` // маска родительского единства
	Rank      uint      `json:"rank"`   // тип единства
	MinID     uint      `json:"minID"`
	MaxID     uint      `json:"maxID"`
	CreatedAt time.Time `json:"createdAt"`
	UpdatedAt time.Time `json:"updatedAt"`
	State     string    `json:"state"`
	Leads     string    `json:"leads"`   // массив ID картин, которые попали в коллаж в виде строки [100, 121, 110, 0, 130, 0, 0, 100...]. Нули - пустые места (на картине чёрным)
	Version   uint      `json:"version"` // при пересборке единства версия повышается (чтобы старые картинки не кешировались)
}

type UnityPile

type UnityPile struct {
	// contains filtered or unexported fields
}

func NewUnityPile

func NewUnityPile(db *gorm.DB) *UnityPile

func (*UnityPile) Create

func (up *UnityPile) Create(ctx context.Context, mask, state string, rank, min, max uint) (Unity, error)

func (*UnityPile) Get

func (up *UnityPile) Get(ctx context.Context, mask string) (Unity, error)

func (*UnityPile) GetChildren

func (up *UnityPile) GetChildren(ctx context.Context, unity Unity) ([]Unity, error)

func (*UnityPile) GetNextUnityForReunification

func (up *UnityPile) GetNextUnityForReunification(ctx context.Context) (Unity, error)

func (*UnityPile) GetRoot

func (up *UnityPile) GetRoot(ctx context.Context) ([]Unity, error)

GetRoot - получение всех корневых единств

func (*UnityPile) Save

func (up *UnityPile) Save(ctx context.Context, unity Unity) (Unity, error)

type Word

type Word struct {
	ID        uint      `json:"id" gorm:"primarykey"`
	IdeaID    uint      `json:"-"`
	CreatedAt time.Time `json:"createdAt"`

	Word    string      `json:"word"`
	Entropy EntropyPack `json:"entropy" gorm:"embedded;embeddedPrefix:entropy_"` // Odin: из этой энтропии Тор придумал слово
}

Word - Слово Odin: вначале было слово... Из таких слов Фрейя поймёт, что нарисовать.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL