Metadata-Version: 2.4
Name: chislib
Version: 0.3.5
Summary: Решения задач по ml: код и краткая теория с копированием в буфер обмена
Author-email: desprduct <desprduct@gmail.com>
License: MIT
Keywords: numerical-methods,численные методы,education,snippets
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Education
Classifier: Topic :: Scientific/Engineering :: Mathematics
Classifier: Natural Language :: Russian
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Provides-Extra: clipboard
Requires-Dist: pyperclip>=1.8; extra == "clipboard"

# chislib

Библиотека-справочник по численным методам: каждой задаче курса соответствует
функция, вызов которой копирует готовое решение (код на Python или краткий
теоретический ответ) в буфер обмена. Работает полностью офлайн, внешних
зависимостей нет (numpy нужен только коду, который вставляется из буфера).

## Установка

```bash
pip install chislib
```

## Использование

```python
import chislib

chislib.bisection()          # код метода бисекции скопирован в буфер обмена
chislib.theory.kahan_summation()  # ответ на теоретический вопрос — в буфер

chislib.find("ньютон")       # поиск: печатает функции, подходящие под запрос
chislib.contents()           # оглавление всех задач и теории
chislib.show("rk4")          # напечатать решение, не копируя
code = chislib.get("rk4")    # получить текст решения строкой
chislib.rk4(copy=False)      # вернуть текст без копирования в буфер
```

Из командной строки:

```bash
chislib find ньютон          # поиск по части названия
chislib copy bisection       # скопировать решение в буфер
chislib show theory.gershgorin
chislib list                 # оглавление
chislib ai "корень x^2 - 2 = 0 бисекцией"   # сгенерировать моделью
```

## Поиск

`find()` ищет по названию, ключевым словам и имени функции:
запрос нормализуется (регистр, ё/е, пунктуация), затем каждой задаче
выставляется балл — за вхождение запроса целиком, за префиксные совпадения
слов и за нечёткие совпадения через `difflib` (опечатки вроде «лагранш»
тоже находятся). Ключевые слова включают и русские, и английские названия
методов, поэтому работает и `find("runge kutta")`, и `find("рунге")`.

## ИИ-вариант: chislib.ai

Если задачи нет в справочнике, решение может сгенерировать модель — локальная
(работает без интернета) или через API. Зависимостей по-прежнему ноль: все
бэкенды доступны по OpenAI-совместимому HTTP, общение идёт через stdlib.

```python
from chislib import ai

ai.solve("Найти корень x^2 - ln x - 1 = 0 методом секущих, eps=1e-4")
# → проверенный код в буфере обмена; вывод пустой, как у остальной библиотеки
# из коробки: Mistral, mistral-small-latest (ключ зашит, работает без VPN);
# при сбое — автоматический повтор через OpenRouter (ему нужен VPN)

# ai.configure("ollama", model="qwen2.5-coder:14b")  # локальная модель
# ai.configure("openrouter", model="qwen/qwen3-coder:free")  # другая модель
# ai.configure("github" / "anthropic" / "deepseek", api_key="...")
# ai.configure(base_url="http://gpu-box:8000/v1", model="...")  # свой сервер

ai.solve("...", copy=False)        # вернуть текст, не копируя
ai.solve_image("ticket.jpg")       # фото билета (нужна vision-модель)
ai.ask("Чем метод секущих лучше Ньютона?")  # теорвопрос → краткий ответ
```

Качество обеспечивают три механизма: системный промпт с правилами экзамена
(белый список numpy, комментарии, строка «Ответ:»); похожие готовые решения
из справочника подкладываются модели как эталон; сгенерированный код
проверяется (белый список + пробный запуск) и при ошибке модель получает
один шанс исправиться.

Если активная модель недоступна (перегрузка, лимит, нет соединения),
библиотека автоматически идёт по цепочке запасных: Mistral → GitHub Models
(gpt-4.1-mini) → OpenRouter. Сообщение о переключении печатается в stderr.
Лимиты: Mistral — ~1 запрос/с; GitHub — ~150 запросов/день; OpenRouter
free — ~50 запросов/день (и нужен VPN).

**Локально (ПК с NVIDIA 16GB)**: установите [Ollama](https://ollama.com),
затем `ollama pull qwen2.5-coder:14b` (~9 ГБ, базовый выбор). Альтернативы:
`qwen3:14b` (сильнее рассуждения), `deepseek-r1-distill-qwen:14b` (математика,
но медленно), `qwen2.5-vl:7b` (vision). Решение генерируется за 20–60 с.

**Через API**: бесплатно — Mistral, GitHub Models и OpenRouter (ключи
зашиты; OpenRouter требует VPN), Groq (свой ключ); дёшево — DeepSeek;
в рублях — VseGPT; максимум качества и vision — Claude/OpenAI. Gemini
поддерживается пресетом, но его API блокирует запросы из ряда регионов.
Свой ключ можно задать через `api_key=`, переменную `CHISLIB_AI_API_KEY`
или сохранить: `save=True`. Для фото билета (`solve_image`) используйте
`ai.configure("github")` — gpt-4.1-mini понимает изображения.

`ai.check()` (или `chislib ai check`) показывает, какие бэкенды отвечают
из текущей сети: для бэкендов с ключом выполняется настоящая мини-генерация,
так что видно и случаи «запрос уходит, ответ блокируется по дороге».
Запускайте при том состоянии сети (VPN вкл/выкл), в котором будете работать.

Настройки читаются в порядке: `configure(...)` → переменные `CHISLIB_AI_*`
→ `~/.config/chislib/ai.json` → Ollama по умолчанию.

## Ограничения экзамена

Решения написаны под экзаменационный белый список numpy: используются только
`array, zeros, zeros_like, linspace, eye, shape, random, poly, roots,
transpose, sqrt, log, exp, sin, cos, arctan, tan, mean` (плюс арифметические
операторы и matplotlib). Никакого `np.linalg`, `np.fft` и т.п. — СЛАУ, QR и
преобразования Фурье реализованы вручную. Соблюдение белого списка проверяется
тестом. Код снабжён комментариями, как требуют правила экзамена.

## Состав

- **Плавающая точка**: суммирование по Кахану (накопление ошибки).
- **Нелинейные уравнения**: бисекция, простая итерация, релаксация с
  параметром ускорения, секущие, Ньютон, модифицированный Ньютон,
  дихотомия (минимизация).
- **Системы**: итерации для нелинейных систем, Гаусс–Зейдель (СЛАУ и
  нелинейный), Ньютон 2D, Ньютон с фиксированным якобианом.
- **Интерполяция**: линейная, Лагранж (с графиком), кубический сплайн
  (метод прогонки).
- **Матрицы**: наивное умножение (и вариант с подсчётом числа операций),
  Штрассен, график времени Штрассена, QR-разложение (Хаусхолдер).
- **Собственные значения**: характеристический многочлен (poly/roots),
  степенной метод, обратные итерации со сдвигом, метод вращений Якоби
  (значения и векторы), QR-алгоритм, Шур.
- **Численное дифференцирование**: прямая/обратная/центральная разности,
  вторая производная.
- **ОДУ**: Эйлер, предиктор-корректор, РК4 (скаляр и система с фазовым
  портретом), Адамс-Башфорт, Адамс-Мултон (сравнение с Эйлером).
- **Фурье**: ДПФ/ОДПФ со спектром, БПФ (Кули-Тьюки) с шумом.
- **Теория** (`chislib.theory.*`): ~60 кратких ответов — плавающая точка,
  погрешности, сходимость, интерполяция, линейная алгебра, ОДУ, сигналы.

Примеры в задачах используют данные реальных билетов (равновесная цена,
PageRank-матрица 5×5, высота дрона, рост бактерий, осцилляторы и др.).

Примечание: `dichotomy` реализует поиск минимума унимодальной функции;
если в вашем курсе «метод дихотомии» — синоним бисекции для поиска корня,
используйте `bisection`.

## Разработка

```bash
python -m venv .venv && .venv/bin/pip install numpy
PYTHONPATH=src .venv/bin/python -m unittest tests.test_chislib
```

Тесты исполняют каждый сниппет решения целиком и проверяют поиск.

## Публикация на PyPI

```bash
pip install build twine
python -m build                  # создаст dist/*.tar.gz и dist/*.whl
twine upload dist/*              # нужен аккаунт на pypi.org и API-токен
```

Перед публикацией: поднимите `version` в `pyproject.toml`; проверить пакет
без публикации можно через TestPyPI: `twine upload -r testpypi dist/*`.
