Topor трассировщик: Начерчено Орлом, разведено Топором. Печатные платы из 80х

Каша с топора на бульоне из Орла. Применяем топологический трассировщик TopoR

Некоторое время назад я толкнул ряд статей по системе создания печатных плат Eagle и заикнулся, про трассировщик TopoR, как ловкий ход для обхода ограничений бесплатной версии Орла, так и в качестве могучего трассировщика. Квакнул и в тинку :)))) Ряд товарищей даже начал шерудить болото в поисках утонувшего топора и спрашивать ГЫДЕ?

Но то был эпик фейл. Т.к. за мощью топора скрылась его ахилесова пята — проблема с вывода результата в бумагу. Нет, разумеется там есть экспорт в гербер. Но вот засада — у всех бесплатных герберных смотрелок которые мне попадались на глаза при попытке разобрать эти лихие дорожки, щедро приправленные всякими микроаппертурами, срывало мозги напрочь и они выдавали кашу. Кормить вас такой кашей из топора мне как то было западло. Не крякать же какой нибудь промышленный CAM350 за 100500 денег. Дороговаты приправки получаются. Для халявных то основных ингридиентов. Поэтому я стал искать альтернативы, но что то как то не пёрло.

Пришлось потыкать палочкой саппорт Топора. Он на удивление резво отреагировал и подогнал пусть и не очень традиционное, бодро шагающее на костылях, но рабочее решение.

Отмазки
Данная статья не преследует цели сделать мега эффективную печатную плату. И процесс ее компоновки и наброса деталей делался на пофиг, лишь бы получить побыстрей готовый результат. Цель — показать процесс работы с трассировщиком TopoR а также о том как в него сунуть данные и выдрать готовый результат. При вдумчивом использовании и на куда более сложной плате результаты меня, честно говоря, впечатлили.

Инструмент

  • Eagle CAD для создания нетлиста и падов всяких. Очень удобная система, я ее уже полюбил всей душой. Хотя есть там к чему прикопаться. Можно и Диптрейс, но что то я как то с ним не сдружился, хотя он с топором дружит лучше.
  • DoPDF — для вывода результата из топора на печать.
    Это бесплатный виртуальный PDF принтер. Печатаешь в него и получаешь на выходе PDFку.
  • Inkscape — векторный редактор аля Corel, но халявный и кросплатформенный.
  • TopoR Lite — собственно виновник этого торжества теплых ламповых линий.


В гнезде орла
Начинаем все в Eagle тут распинываться не буду. Было уже три части по Eagle (Часть 1, Часть 2 и часть 3) Главное нам нетлист и собраные корпуса. Для примера покажу разводку демо платы под FT2232, первое что под руку попалось.

Есть у нас вот такая схема (чисто для примера, я ее даже не проверял и там есть ряд ошибок в проектировании. Например слишком длинные линии USB по плате пустил):

На плате у нас полная каша. Не заморачиваемся там даже. Оставим это топору. Просто возьмем все кучей и перетащим на плату, в рабочую область.

Теперь надо сконвертировать это в формат Specctra, понятный топору. Для этого запускаем скрипт конвертации. У кого его нет качайте у меня — TOPOR.ulp
При запуске скрипта он предложит сохранить файл с расширением dsn — разрешаем. И попросит открыть dru файл — посылаем нафиг. Откроется окно с условиями конвертации. Там можно ничего не менять — все равно в топоре все придется делать заново.

Жмем окей.

Теперь берем орудие маньяка…

А руке у него кровавый ТОПОООР!!!
Запускаем топор, создаем новый проект

А теперь надо импортировать созданый ранее dsn файл.

Жмем кнопку импорта, выбираем там тип Specctra, выбираем файл dsn и жмем далее-далее.

Должен увидеть вот подобную кашу:

Ее мы будем сейчас варить…

Да, советую поиграться с цветовыми схемами (их менюшка справа) и выбрать наиболее удобную. Я обычно выбираю Топор 4.2

Линейные размеры
Первым делом надо настроить условия и всякие ограничения. Как то размер дырок, контактных площадок, минимально допустимые зазоры между дорожками. В общем всякую геометрию. Жми кнопку с штангенциркулем (параметры дизайна. Хоткей F4).

Откроется такая менюха:

Первым делом лезем в стеки контактных площадок:

Те что SMD мы не трогаем. Нам же не нужны дырки в smd площадках? 😉 А вот остальные можно править как угодно. Тут я обычно задаю всем минимально разумное отверстие (около 0.3мм оно как раз неплохо на ЛУТ технологии протравливается и в него хорошо, без биений, центруется сверло при сверлении). Обязательно задаем ViaDefault — иначе у нас переходные без дырок будут. При нажатии ссылки «изменить» открываетс диалог настройки площадки. И вот там можно отжечь на свой вкус. Пунктов настройки дофига.

Для ценителей тонких извращений можно сделать пады хоть в форме рассово правильной свастики, хоть сатанинской звезды. Будет, тащемта, готичная в своем адовом угаре плата.

Потом идем в межслойные переходы и там выдаем нужные размеры отверстий. Что радует — оно тут же наглядно показывает в масштабе соотношение. Очень удобно.

Про группы цепей я ничего не расскажу, т.к. сам еще не изучил. Читайте документацию на топор. Там все по русски и неплохо разжевано. Скорей всего тут задаем типы сигналов. Мол это у нас земля, это питание, тут скоростные сигналы летают, а тут аналог. И на основании этих знаний топор оптимальней трассирует, учитывая всякие гадкие эффекты.

Следующим пунктом идем в Ограничения
Там все тривиально. Выставляем значения какие сможем вывезти со своей технологией. Мой утюг позволяет накатывать 0.2/0.2 без особых напрягов. Но я стараюсь не мельчить.

Важно! Минимальный размер должен быть равен ширине самой мелкой площадке. Иначе дорожка просто не сможет сжаться до такой ширины, чтобы на нее влезть. У меня это вывод FT2232 — 0.2мм То же касается и зазоров. Не сильно критично — если надо топор влезет, но будет ошибка DRC оно нам надо?

Также рекомендую залезть в раздел «Редактирование» и там, ползаив по разделам, выставив опции:

  • Ручное перемещение обьектов — с подталкиванием обьектов и переходов (прикольно!)
  • Форма проводников — дуги, создавать капельки и плавное сужение проводников. Плата будет выглядеть особо тепло аналогово.

Расстановка компонентов
Теперь можно приступить к формированию платы и расстановке компонетов. Давайте вначале растащим лимиты.

Видите у меня выделеная такая рамка? Вот это контур будующей платы.

Его можно всяко тягать за узелки и придавать форму. Не бойтесь что она ломаная и не замкнутая. Это не страшно — главное концы поближе друг к другу поставить, чтобы туда не вылезли резисторы, а то в ходе трассировки они как тараканы по плате ползают 🙂

Дальше начинаем тягать и расставлять ключевые компонеты — разьемы всякие, микросхемы громоздкие. В общем то, что относится к конструктиву платы. При этом в нижней панельке, при выделенной детальке будут ее параметры — слой, угол поворота, название и прочее

На этом этапе, для удобства, лучше отключить выделение отдельных пинов — будет удобней.

Также не помешает включить сетку. Она в правой панельке, на вкладке «настройки»

В топоре, при выборе компонента исчезают все линии связи, кроме тех с которыми связан этот компонент. И они автоматом перерисовываются по кратчайшему маршруту. Также обращайте внимание на такие белые или зеленоватые линии идущие от пятачков или дорожек — это нарушения DRC условий. Например слишком близкое расположение компонентов.

Теперь фиксируем все ключевые конструктивные компонеты — для этого выделяем его и жмем замочек (либо хоткей F). Мы же не хотим, чтобы у нас разьем уплыл в середину платы? Стаскиваем валом комплектуху в зону ограниченную границами платы. Дальше ими займется авторасстановщик.

Делаем наброс остальных компонентов. Жмем авторазмещение — иконка с подьемным краном и висящей на нем микросхеме (хоткей F5)

появится такая пунктирная рамочка — границы действия авторазмещения:

Осталось нажать стрелочку (F9) и запустить авторазмещение. Детальки начнут ползать как попало по плате. Вначале сбиваясь на периферию, а потом занимая все более и более удачные места. Процесс этот бесконечный. Поэтому ждем пока они не успокоятся и жмем стоп. Пофиг что встали криво. Это еще не конец процесса. Потом они еще поплзают от души 🙂

Автотрассировка. Выбираем иконку с паутиной и процесс пошел. Он также бесконечный. Топор предлагает несколько вариантов с наиболее удачными параметрами. Можно делать сортировку. Я, например, сделал сортировку по минимальному числу переходных отверстий.

Когда надоест жмем стоп и выбираем наиболее удачный по параметрам вариант. Тыкаем в него дважды и получаем разводку:

Трэш и угар! Особенно доставляют слепленные дорожки.
Но это ерунда. Главное для нас топология, а топор нам все сам вскоре подгонит под стандарты. Дальше несколько раз жмем синюю стрелку и выбираем там по очереди то «оптимизация путей проводников», то оптимизацию «путей и переходов» и прочие пункты можно потыкать. Экспериментируйте 🙂
В общем, весьма скоро всякие косяки вроде завязаных в узел дорожек исчезнут (а если не исчезнут, то можно их аккуратно в режиме FreeRoute подраспутать). И получится что то похожее на готовый результат.

Важно! Следите чтобы резисторы и прочие площадки не лезли друг на друга. Для топора они всего лишь две площадки и он не знает, что они не могут быть в шахматном порядке и иногда прогоняет т.к. из Eagle походу не импортируются их запретные площадки.

Если видите, что топор тупит — например перехлест двух параллельных дорожек. Просто переключитесь в режим редактирования топологии, а потом сразу обратно во FreeRouting — он сразу же исправится. В общем, путем таких шаманских манипуляций у меня за пять минут получилась следующая укуренная плата:

Получилось 15 переходных дырок. Причем, если поглядеть, подвигать детальки, то можно избавиться от большинства из них. Но это уже вручную, в режиме правки топологии, а потом переключение во фрироутинг и опа все дорожки снова как надо. Но за 15 минут работы, при накиданых от балды детальках весьма неплохой результат. Вручную я бы провозился наамного дольше. Но цель не получить супер оптимальную плату, а просто показать что есть Топор и как им рубят.

Печать
Результат есть, но его надо как то получить в форме для ЛУТа пригодной. Ну или резист, кому что милей. Вот тут начинаются главные бубны и пляски. Решение такое:

Задаем цветовую гамму и настройки печати. Нам надо поправить цвета во вкладке Слои, Обьекты и Настройки:

В общем добиваемся того, чтоб оно выглядело как на печать — никаких лишних линий, надписей, ненужный данный момент слой (например нижний) скрываем чтобы не мозолил глаз. Фон белым, все проводники, дырки и прочее черным.

Должно выглядеть примерно вот так:

Теперь сохраняем цветовую схему. Называем ее как нибудь. Например «Печать ЛУТ» и жмем кнопочку с дискеткой.

У меня называется «Вывод на дорф» Не спрашивайте что такое «дорф». 🙂

Дальше меню файл, печать…

Принтер мы выбираем наш DoPDF. Теперь не забываем жать кнопку настройки принтера «Свойства» и настраиваем качество вывода побольше:

Я ставлю DPI = 600 хотелось бы больше, но почему то у меня это вызывает переклин службы печати винды. А меньше — получается кака. Но 600 тоже вполне сьедобно. Даже MLF корпуса на раз получаются, а более крупные так вообще не проблема.

Жмем Окей, убеждаемся, что масштаб стоит как «Действительный размер» и можно жать «Печать». Кстати, там же галочка для отзеркаливания есть 🙂

Выбираем имя PDF файла в который будем печатать и не забываем поставить галочку повышенного качества картинок

Печатаем. Должен получиться PDF файл. Открываем его. В принципе, можно печатать и отсюда. Но видимо PDF смотрелки лажают на мелочах и может получиться как у меня (печатал из STDU Viewer — отличная прога. Легкая и быстрая. Чуть чуть тормозней чем Foxit Reader зато понимает DejaVu и имеет внутри много удобных фич). Небольшие зазубринки на картинке образовались. Для столь мелких контактов это черевато. Поэтому переходим к следующей части нашего марлезонского балета

InkScape
Отличный векторный редактор. Гораздо легче чем Corel, да еще и бесплатный. В общем увидел и сразу полюбил :)))
Запускаем его и открываем в нем наш PDF файл:

Главное вкорячить побольше качество импорта. Там же можно уже сматрицировать, да оттуда же и напечатать.

Качество печати картинки из InkScape почему то ощутимо выше получается.

Вверху печать из инкскейпа, внизу из STDU View

Да, еще рекомендую прежде чем будет печатать на рабочем шаблоне (или фотобумаге для ЛУТа) напечатайте на обычной офисной, наложите микросхему на рисунок пада и посмотрите не уплыли ли размеры при всех этих пертурбациях с конвертацией и печатью.

У меня не уплывали ни на соточку, а у вас может быть все по другому.

Также настоятельно рекомендую к прочтению родную документацию от топора. Благо на русском все ибо наше, родное. Ну и еще весьма бодро отвечающий форум Эремекса, куда можно массово набегать и есть мозг тамошним спецам 🙂

Вот вроде бы все. Удачно вам помахать Топором!

А в пост призываются демоны бойцы из Эремекса с их дельными комментариями и замечаниями.

З.Ы.
Меня особо не теряйте. Я тут несколько занят с делами семейными. Увы с электроникой не связанными, а посему статей, как побочного продукта промежуточных результатов работы, не будет. Так что какое то время писать буду реже чем обычно.

Впрочем, кроме меня авторов хватает — в сообществе чуть ли не каждый день появляется толковая статья, а число конкурсных (т.е. написанных с особой тщательностью и претензией на призы) перевалило за 60. В том числе подробнейшие расклады по подключению к контроллерам эзернета через микросхему ENC28J60, по OBDEV V-USB. Куча разнокалиберных статей по ПЛИС, вброс в контроллеры MSP430. И десятки других интересных тем.

Topor трассировщик

Идея использования топологического подхода к трассировке печатных плат пути проводников в процессе трассировки фиксируются лишь с точностью до топологической эквивалентности уже более двадцати лет будоражит умы разработчиков САПР. Хотя вопросов к такому подходу с точки зрения практики проектирования остается много, топологические методы в том или ином, обычно урезанном, виде начинают проникать в коммерческие системы проектирования ПП. Группой разработчиков из Санкт-Петербурга www. В изложенном в предлагаемой публикации докладе, представленном авторами системы на семинаре «Печатный монтаж», основной акцент был сделан на преимуществах использования топологического подхода для решения задачи снижения уровня перекрестных помех. ISSN Книги по электронике.


Поиск данных по Вашему запросу:

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.

По завершению появится ссылка для доступа к найденным материалам.

Содержание:

  • Помогите, пож-ста, с вопросом по автоматической трассировке ПП
  • Это интересно!
  • Primary Menu
  • Трассировка печатных плат — какие бесплатные программы лучше?
  • Архив файлов
  • Глава 7. ТРАССИРОВЩИК TopoR

ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: САПР TopoR 6.0. Преобразование проводников в полигоны

Помогите, пож-ста, с вопросом по автоматической трассировке ПП


Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. На написание статьи меня подтолкнула программа, на которую я наткнулся в поисках способов автоматизации разработки печатных плат а упоминаний, тем более статей про неё я на хабре не нашёл.

Но, обо всём по порядку. Итак, конструкция разработана, собрана на макетной плате, проверена в действии. Дальше — печатная плата. Если верить форумам, то многие в том числе и мои знакомые используют Sprint-Layout. Но ведь это ручная работа, тот же карандаш и бумажка, только в электронном виде. Зачем все эти ядра процессора и гигабайты памяти, если приходится всё равно работать ручками? Признаюсь, меня это всегда коробило. Сейчас я расскажу, как добился удовлетворительного для меня результата в автоматическом режиме.

Сразу скажу, что к данным продуктам имею отношение лишь как пользователь и ни в коем случае не рекламирую их. Тем более, что Proteus можно спионерить найти на просторах интернета конечно же в ознакомительных целях , а TopoR Lite бесплатен с некоторыми ограничениями. Почему именно эти программы? Изначально пользовался Proteus. Не помню, с чего началось, но меня вполне устроило: можно рисовать схемы, моделировать работу, разводить платы. Первые два получались хорошо, последнее не нравилось, искал идеал.

Я пытался рисовать схему в Eagle. Но то ли я рукожопый, то ли нужны особые привычка и сноровка, в общем, мне не понравилось. Сначала я долго не мог понять, как добавить элемент. Потом оказалось, что нужно подключать библиотеки с необходимыми элементами.

А откуда я знаю, как называется библиотека, если я и названия элемента-то не знаю например, разъёмы я ищу исключительно по картинкам. В Eagle по умолчанию не оказалось нужных мне Attiny и Atmega Ну и шины питания в Proteus подключены сразу и даже эти пины у микросхем скрыты, чего внимание отвлекать , а тут пришлось раскидывать их явно.

Итогом через полчаса тыканий оказалась одна микросхема, подключенная к питанию. Я пытался рисовать в DipTrace. В принципе, рисовать удобно. Однако нет или не нашёл симуляции работы, мне это нужно и для отладки схемы, и для отладки программ МК. Взгруснул и вернулся в ISIS. Он уныл. Те цепи, которые не может развести, он просто бросает. Если с двусторонней разводкой этого почти не происходит, при односторонней и минимальных габаритах платы получается ужас.

А поскольку текстолит у меня односторонний, да и делать двусторонние платы сложнее, я решил — хочу с одной стороны плюс перемычки. Авторазмещение в ARES тоже ужас, но альтернатив я не нашёл, а вручную делать ничего не хочется. Как говорится, на безрыбье и щуку раком. Итак, предлагаю рассмотреть средства автоматизации на стандартном примере из Proteus 8 — Thermo. Источник бесперебойного питания на источнике бесперебойной подачи информации Читайте на Хабре. Читают сейчас. Новое решение парадокса Ферми почему мы одиноки во Вселенной 19,1k Поделиться публикацией.

Похожие публикации. Заказы Ищем бэкендера на разработку интернет-магазина на cms magento 2 2 отклика 21 просмотр. Видео-креатив для рекламы Facebook формата ленты х 0 откликов 22 просмотра. Обложка баннер на лендинг 5 откликов 39 просмотров. Разработать модуль для Битрикс Бизнеса и Малого бизнес 3 отклика 38 просмотров.

На группу проектов требуется manual QA 1 отклик 20 просмотров. Все заказы Разместить заказ. Ingener74 24 ноября в 0. НЛО прилетело и опубликовало эту надпись здесь. Спасибо за статью! Как я сказал — рисунок дорожек специфичен, лично у меня вызывает улыбку. А если серьёзно — всё равно, как они выглядят. Готовую плату прячешь в корпус или недра чего-то большого и тёмного и как там разведена печатная плата — никому не видно и обычно не важно, лишь бы работало.

Когда появились гелевые ручки — очень удобно стало достать шарик из пастика и рисовать пастиком. Да… Наши дядьки и старики рисовали именно в таком стиле : Но я, все-таки, стараюсь рисовать ровно, симметрично, изображая некую упорядоченность. И получаю от этого кучу удовольствия, ведь, это как какого-то рода искусство :. Понимаю, что дело привычки, но мне Eagle больше нравится. Да, есть свои недостатки и нелогичные детали, но!

Автор сослался на то, что нужные компоненты нужно искать и подключать через библиотеку. А мне эта функция очень нравится. Во-первых, отключение лишних библиотек очень помогает разгрузить интерфейс. Во-вторых, бывают случаи когда в стандартных библиотеках просто нет нужного элемента.

А так скачал и работаешь. А уж автороутер у него иногда твори чудеса. Автороутер я и хотел попробовать, особенно когда прочитал, что туда подключается Specctra. Но, к сожалению, не хватило нервов и терпения нарисовать плату. Попробуйте 7-ю версию Eagle. Я там серьезно переделал автотрассировщик — теперь он создает несколько вариантов трассировки с разными параметрами, плюс один вариант топологической трассировки. Кстати, на этой недели выйдет версия 7.

В своей практике я часто использовал только половину пакета Eagle — редактор плат, без создания схемы в САПР. Плюс, под Eagle очень много создано библиотек элементов.

Автороутер, в зависимости от сложности платы, не всегда разводит ее до конца, но это общая проблема для всех САПР начального уровня. Без создания схемы не смоделировать работу для проверки программы МК, я часто этим пользуюсь. Библиотеки находил, да. Но по мне удобнее, когда они все подключены и ищешь среди тысяч элементов нужный по названию, корпусу, параметрам.

Alexeyslav 25 ноября в 0. Часто схема для моделирования и схема для сборки — это две разные схемы. Что делать если в протеусе не окажется нужного элемента? Ни плату развести ни симуляцию запустить…. А вот плату развести — не проблема футпринты и символы можно самостоятельно начертить, причём не выходя из того-же редактора плат.

Если умеешь модели писать. Например модель контроллера вроде XMEGA, за пару лет может и напишешь и может даже будет работать. Но ежели имеются такие способности, то вообще непонятна тяга к полностью автоматической трассировке. Lockdog 24 ноября в 0. Желаю побыстрее пережить момент, когда хочется разводить платы автоматически.

Я разводил много-много плат руками на листочках в клеточку и вроде как умею. Я это пережил и хочется, чтоб разводилось автоматически. Так не интересно Я раньше тоже ленился, но потом понял, что лучше человека компьютер плату не разведет.

Да и процесс этот интересный:. Сам же посидел пару деньков — и почти все развел : Потом только автотрассером остатки доразводил, некритичные к помехам и прочему. А ВЧ часть от 2МГц в моем случае и питание — только вручную. А вы попробуйте ради интереса топором эту же плату развести. У него довольно интересные результаты получаются.

В любом случае с него можно получить топологию, а дальше сомнительные участки переразводить руками. Увы, автомат очень многое не понимает если ему не указать. У вас на плате просто масса досадных ошибок, которые не сделал бы специалист. И схема эта будет работать скорее вопреки чем благодаря… Трассировщик не знает где силовые линии а где сигнальные, где надо толще провод сделать где всеми силами надо сделать шину как можно КОРОЧЕ и т.

Чтобы учесть все эти требования трассировщику надо много чего объяснять, и порой проще вручную развести чем доверять это дело целиком трассировщику.


Это интересно!

Всем, кто будет тестировать программу, предлагаю обраттить внимание не столько на результаты трассировки, а на качество обмена данными с пикадом и протелом. You need to be a member in order to leave a comment. Sign up for a new account in our community. Already have an account?

Глава 7. ТРАССИРОВЩИК TopoR. Режим постраничного просмотра. /. На первую страницу · На предыдущую главу · На следующую главу.

Primary Menu

Предназначена для проектирования многослойных печатных плат вычислительных и радиоэлектронных устройств. TopoR Topological Router — высокопроизводительный топологический трассировщик печатных плат, не имеющий аналогов. Эффективность программы TopoR достигается за счет сочетания следующих уникальных характеристик. Широкий набор инструментов обеспечивает разработку плат с повышенной надежностью и позволяет улучшить производственные и эксплуатационные показатели. Отсутствие преимущественных направлений трассировки в слоях существенно снижает протяженность параллельных трасс и уменьшается уровень перекрестных электромагнитных помех. Гладкие без изломов проводники позволяют более эффективно использовать свободное пространство печатной платы. Использование САПР TopoR обеспечивает значительное сокращение сроков проектирования печатных плат, повышение их технологичности, надежности и качества при одновременном снижении затрат на производство.

Трассировка печатных плат — какие бесплатные программы лучше?

TopoR Topo logical R outer — высокопроизводительный топологический трассировщик печатных плат, не имеющий аналогов. Эффективность программы TopoR достигается за счет сочетания следующих уникальных характеристик. Высокая скорость трассировки сокращает время проектирования электронных устройств в десятки раз. Широкий набор инструментов обеспечивает разработку плат с повышенной надежностью и позволяет улучшить производственные и эксплуатационные показатели. Отсутствие преимущественных направлений трассировки в слоях существенно снижает протяженность параллельных трасс и уменьшается уровень перекрестных электромагнитных помех.

За это сообщение сказали спасибо: JE. За это сообщение сказали спасибо: majorPAE.

Архив файлов

Есть интерфейс к Situs и Specctra — но их один на выбор, или оба при желании нужно предварительно установить дополнительно к PCAD, тогда автотрассировка заработает. Они, вообще говоря, берутся от других САПР, не «родные». Ну его и ставить гораздо проще. Ссылка на него и как ставить регулярно выкладывается. Покопайтесь на форуме.

Глава 7. ТРАССИРОВЩИК TopoR

Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. На написание статьи меня подтолкнула программа, на которую я наткнулся в поисках способов автоматизации разработки печатных плат а упоминаний, тем более статей про неё я на хабре не нашёл. Но, обо всём по порядку. Итак, конструкция разработана, собрана на макетной плате, проверена в действии. Дальше — печатная плата. Если верить форумам, то многие в том числе и мои знакомые используют Sprint-Layout.

Некоторое время назад я толкнул ряд статей по системе создания печатных плат Eagle и заикнулся, про трассировщик TopoR, как.

Нужны еще сервисы? Архив Каталог тем Добавить статью. Как покупать? TopoR — это высокопроизводительный, не имеющий аналогов топологический трассировщик печатных плат.

Недавно столкнулся с задачей качественной разводки HDMI. Частоты большие, требования высокие, в том числе по согласованию длин цепей внутри групп. Сначала делал все «вручную», по-старинке, в ПКАДе. А потом попалась на глаза программа бессеточной разводки печатных плат под названием TopoR.

Реализованные в программе TopoR 3.

Запросить склады. Перейти к новому. Re: TopoR-Топологический трассировщик печатных плат. Последний раз редактировалось KBH-I; Причина: P. Последний раз редактировалось vlad; Меню пользователя vlad Посмотреть профиль Отправить личное сообщение для vlad Найти ещё сообщения от vlad

Хабр Geektimes Тостер Мой круг Фрилансим. Andronas Andronas. Электроника Печатные платы Программное обеспечение и интернет-сервисы. Подскажите какой бесплатный софт лучше всего подойдет для трассировки печатных плат с возможностью экспорта для заказа плат например на Aliexpress.


Авторазмещение элементов и автотрассировка печатных плат / Хабр

Всем привет!

На написание статьи меня подтолкнула программа, на которую я наткнулся в поисках способов автоматизации разработки печатных плат (а упоминаний, тем более статей про неё я на хабре не нашёл). Но, обо всём по порядку.

Итак, конструкция разработана, собрана на макетной плате, проверена в действии. Дальше — печатная плата. Если верить форумам, то многие (в том числе и мои знакомые) используют Sprint-Layout. Но ведь это ручная работа, тот же карандаш и бумажка, только в электронном виде. Зачем все эти ядра процессора и гигабайты памяти, если приходится всё равно работать ручками? Признаюсь, меня это всегда коробило.

Сейчас я расскажу, как добился удовлетворительного для меня результата в автоматическом режиме.


Красивая картинка для привлечения внимания

А использовал я связку Proteus плюс TopoR Lite.

Сразу скажу, что к данным продуктам имею отношение лишь как пользователь и ни в коем случае не рекламирую их. Тем более, что Proteus можно спионерить найти на просторах интернета (конечно же в ознакомительных целях), а TopoR Lite бесплатен (с некоторыми ограничениями).

Почему именно эти программы?

Изначально пользовался Proteus. Не помню, с чего началось, но меня вполне устроило: можно рисовать схемы, моделировать работу, разводить платы. Первые два получались хорошо, последнее не нравилось, искал идеал.
Я пытался рисовать схему в Eagle. Но то ли я рукожопый, то ли нужны особые привычка и сноровка, в общем, мне не понравилось. Сначала я долго не мог понять, как добавить элемент. Потом оказалось, что нужно подключать библиотеки с необходимыми элементами. А откуда я знаю, как называется библиотека, если я и названия элемента-то не знаю (например, разъёмы я ищу исключительно по картинкам). В Eagle по умолчанию не оказалось нужных мне Attiny2313 и Atmega328. Пришлось гуглить/скачивать/копировать нужную библиотеку. Ну и шины питания в Proteus подключены сразу (и даже эти пины у микросхем скрыты, чего внимание отвлекать), а тут пришлось раскидывать их явно. Итогом через полчаса тыканий оказалась одна микросхема, подключенная к питанию.

Я пытался рисовать в DipTrace. В принципе, рисовать удобно. Однако нет (или не нашёл) симуляции работы, мне это нужно и для отладки схемы, и для отладки программ МК. Взгруснул и вернулся в ISIS.

Зачем внешний трассировщик TopoR, если в ARES есть встроенный? Он уныл. Те цепи, которые не может развести, он просто бросает. Если с двусторонней разводкой этого почти не происходит, при односторонней и минимальных габаритах платы получается ужас. А поскольку текстолит у меня односторонний, да и делать двусторонние платы сложнее, я решил — хочу с одной стороны плюс перемычки.

Авторазмещение в ARES тоже ужас, но альтернатив я не нашёл, а вручную делать ничего не хочется. Как говорится, на безрыбье и щуку раком.

Итак, предлагаю рассмотреть средства автоматизации на стандартном примере из Proteus 8 — Thermo.

Схема:

Переходим в ARES, удаляем всю ту красоту, что наделали хитрые создатели Proteus и нажимаем на Auto-placer. Тут открывается ещё один недостаток этого инструмента: он умеет помещать компоненты только на одну сторону платы (я полчаса потратил в поисках решения, пока в справке не прочёл, что это невозможно). Т.е. если вы используете и SMD корпуса, и обычные и хотите, чтобы они были с разных сторон платы — придётся ручками перемещать компоненты с одной стороны на другую, причём каждый по-отдельности.

Итогом авторазмещения становится такая картина:

Дабы посмотреть, как в ARES работает автороутер, идём в Design Rule Manager, выставляем дороги POWER и SIGNAL только с одной стороны (у меня Top Copper), ширину T25 (чтоб с ЛУТ проблем не было) и запускаем Auto-router.

Вот что получается:

То есть 43 дорожки он не развёл и придётся делать перемычки.

Что ж, давайте опробуем TopoR.

Опять же нажимаем Auto-router, там Export Design File и сохраняем. В TopoR Импорт -> Specctra и открываем файл. Теперь надо немного настроить. В Параметрах дизайна (F4) удаляем лишние 14 слоёв, в Ширине проводников ставим от 0,3 до 0,6 мм. Нажимаем кнопку Автотрассировка, в настройках галки Переназначить функционально эквивалентные контакты компонентов (на всякий случай: мне показалось, что данная опция не совсем работает или даже совсем не работает), Однослойная трассировка и жмём кнопку Запустить. Трассировщик автоматически сохраняет лучшие варианты, которые потом можно добавить в проект. Трассировка закончится только после нажатия кнопки Остановить. Обращу внимание, что перемычки расставляются автоматически, и даже размещаются контактные площадки под них. Я дождался, пока количество переходов не достигло 30 (т.е. 15 перемычек):

15 перемычек против 43 в ARES — гораздо лучше!

Потратив 5 минут и чуть переместив компоненты/раздвинув границы платы можно получить 10 переходов (5 перемычек), что уже допустимо:

А как по мне — 5 минут перемещать уже накиданное гораздо веселей, чем с нуля всё раскладывать по плате.
Белые кружочки — нарушения DRC (дорожки/компоненты расположились слишком близко). Не беда — вручную чуть передвинем эти самые компоненты и дорожки и нажмём F7 — они аккуратно перепроложатся, ошибки устранены (впрочем, я видел, как эта самая F7 глючит: после очередного нажатия ложит одну из дорог поверх нескольких других, а потом ругается об ошибке).

Специфичная для TopoR кривизна дорожек веет тёплой ламповостью и напоминает про времена, когда платы разводили карандашом на листочке в клеточку, а на текстолите рисовали нитрокраской/нитролаком и иголкой/шприцем/пастиком гелевой ручки. Лично меня это прёт.

Когда результат получится удовлетворительный, можно либо экспортировать плату, либо распечатать прямо из программы (есть даже галочка Зеркальное отображение, видимо специально для ЛУТ).

Пример реальной платы:

Полигоны в TopoR рисовать можно, причём сплошные/штрих/сетка, но я про них забыл. На этой плате нарисовал их маркером для дисков. Штрихованные пятачки — как раз перемычки.

Буду рад, если статья помогла кому автоматизировать нудные процессы. Буду благодарен, если расскажете про более удобные инструменты для авторазмещения и автотрассировки (особенно авторазмещения).

Трассировка с помощью синтаксического анализатора трассировки — Финансы и операции | Динамика 365

Обратная связь Редактировать

Твиттер LinkedIn Фейсбук Эл. адрес

  • Статья
  • 2 минуты на чтение

В этом учебном пособии приведены рекомендации по трассировке.

В этом руководстве вы узнаете, как собирать и загружать трассировки. Инструмент анализа трассировки во многом аналогичен версии Microsoft Dynamics AX 2012, но не имеет обратной совместимости и не может использоваться для анализа трасс AX 2012. Инструмент синтаксического анализа трассировки можно найти в папке PerfSDK в среде разработки.

Предварительные условия

Для работы с этим учебным пособием требуется доступ к среде в качестве администратора экземпляра. Администратор также может предоставлять права другим пользователям на трассировку. Таким образом, вы можете отслеживать сценарии, которые невозможно воспроизвести с правами администратора.

Захват трассировки

  1. Прежде чем приступить к трассировке, убедитесь, что ваш сценарий находится в «горячем» состоянии, то есть вы запустили сценарий, который хотите отследить, один раз, прежде чем приступить к трассировке. Нахождение в горячем состоянии предотвращает попадание в трассировку таких вещей, как загрузка метаданных и другие возможные предварительные задачи.

  2. На панели навигации выберите Справка , а затем выберите Трассировка .

  3. Назовите трассировку, которую вы собираетесь захватить, а затем выберите Начать трассировку .

  4. Выполнить действия, которые необходимо проанализировать, например, открыть Расчеты с поставщиками > Поставщики > Все поставщики .

  5. По завершении выберите Остановить трассировку . Затем вы можете выбрать один из следующих вариантов (для этого руководства выберите второй вариант):

    • Загрузить трассировку — сохранить захваченную трассировку на локальном компьютере. Вы можете проанализировать загруженную трассировку с помощью настольной версии Trace Parser.

    Примечание

    Если вы загрузите трассировку, она будет недоступна для последующей загрузки.

    • Загрузить трассировку — Сохраните трассировку в облаке для последующей загрузки, например, администратором, она будет автоматически удалена через 7 дней, а также может быть удалена вручную из формы захваченных трассировок.

Примечание

Если ваш сценарий занимает более 1-2 минут, лучше попытаться взять несколько меньших трассировок по 30 секунд каждая, так как трасса, вероятно, станет слишком большой, чтобы ее можно было легко проанализировать, и существует риск потери данных, если след становится слишком большим.

  1. Чтобы предоставить пользователю права на запись трассировки, перейдите к Администрирование системы > Пользователи > Пользователи .

  2. Выберите пользователя и назначьте пользователя трассировки системы роль.

    Удалите роль пользователя еще раз, когда пользователь завершит трассировку, чтобы избежать нежелательной трассировки.

Открыть захваченную трассировку

  1. На панели навигации выберите Справка , а затем выберите Трассировка .

  2. Выберите Захваченные трассировки.

    Примечание

    Кнопка захваченных трассировок видна только пользователям с правами администратора.

  3. Выберите имя трассы для загрузки, чтобы открыть и проанализировать ее с помощью настольной версии анализатора трассировки или

  4. Выберите имя пользователя, чтобы перейти к параметрам пользователя.

  5. Удалите трассировку, если хотите. Вы можете удалить трассировку, если вы ее загрузили.

Примечание

Трассировка будет удалена через 7 дней. Дополнительные сведения о версии анализатора трассировки для настольных ПК см. в разделе Диагностика проблем и анализ производительности с помощью анализатора трассировки.

Помогите нам понять

Мы хотим узнать больше о том, как люди используют пользовательский набор инструментов справки Microsoft. Пройдите опрос (на английском языке) и помогите нам понять: https://forms.office.com/r/A4cUJgjkD1.

Обратная связь

Отправить и просмотреть отзыв для

Этот продукт Эта страница

Просмотреть все отзывы о странице

Axe · Адаптивная экспериментальная платформа

 #!/usr/bin/env python3
# Авторское право (c) Meta Platforms, Inc.  и аффилированные лица.
#
# Этот исходный код находится под лицензией MIT, которую можно найти в
# LICENSE в корневом каталоге этого исходного дерева.
из даты и времени импортировать дату и время, timedelta
введите import Any, Dict, List, Optional, Tuple, Union
импортировать numpy как np
импортировать plotly.graph_objs как есть
из ax.core.experiment import Experiment
из ax.plot.base импортировать AxPlotConfig, AxPlotTypes
из ax.plot.color импортировать ЦВЕТА, DISCRETE_COLOR_SCALE, rgba
из ax.utils.common.timeutils импортировать timestamps_in_range
из ax.utils.common.typeutils импортировать not_none
FIVE_MINUTES = дельта времени (минуты = 5)
# введите псевдонимы
Следы = Список[Словарь[строка, Любая]]
 

[документы] def mean_trace_scatter( у: np.ndarray, trace_color: Tuple[int] = COLORS.STEELBLUE.value, legend_label: ул = "среднее", hover_labels: Необязательный [Список [str]] = Нет, ) -> go.Scatter: """Создает объект графика для трассировки среднего значения заданного ряда по бежит. Аргументы: y: массив (r x t) с результатами r прогонов и t испытаний. trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию синий. legend_label: метка для этой трассы. hover_labels: необязательный, текст для отображения при наведении; список, где i-е значение соответствует i-му значению в значении аргумента `y`. Возвращает: go.Scatter: объект графического графика """ вернуться идти.Scatter( имя = легенда_метка, legendgroup=legend_label, х=np.arange(1, y.shape[1] + 1), y=np.mean(y, ось=0), режим = "линии", строка = {"цвет": rgba (trace_color)}, цвет заливки = rgba (trace_color, 0,3), заполнить = "тонексти", текст = hover_labels, )

[документы] определение sem_range_scatter ( у: np.ndarray, trace_color: Tuple[int] = COLORS.STEELBLUE.value, legend_label: ул = "", ) -> Кортеж[go.Scatter, go.Scatter]: """Создает объект графика для трассировки среднего +/- 2 SEM для y по всем циклам. Аргументы: y: массив (r x t) с результатами r прогонов и t испытаний. trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию синий. legend_label: Метка для группы легенд. Возвращает: Tuple[go.Scatter]: построение графических объектов для нижних и верхних границ """ среднее значение = np.mean (y, ось = 0) sem = np.std (y, ось = 0) / np.sqrt (y.shape [0]) возвращаться ( идти.Scatter( х=np.arange(1, y.shape[1] + 1), y=среднее - 2 * sem, legendgroup=legend_label, режим = "линии", строка = {"ширина": 0}, showlegend=ложь, hoverinfo="нет", ), идти.Scatter( х=np.arange(1, y.shape[1] + 1), у = среднее + 2 * стандартная ошибка, legendgroup=legend_label, режим = "линии", строка = {"ширина": 0}, цвет заливки = rgba (trace_color, 0,3), заполнить = "тонексти", showlegend=ложь, hoverinfo="нет", ), )

[документы] def mean_markers_scatter ( у: np. ndarray, marker_color: Tuple[int] = COLORS.LIGHT_PURPLE.value, legend_label: ул = "", hover_labels: Необязательный [Список [str]] = Нет, ) -> go.Scatter: """Создает объект графика для трассировки среднего значения заданного ряда по работает, с ошибками. Аргументы: y: массив (r x t) с результатами r прогонов и t испытаний. trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию светло-фиолетовый. legend_label: метка для этой трассы. hover_labels: необязательный, текст для отображения при наведении; список, где i-е значение соответствует i-му значению в значении аргумента `y`. Возвращает: go.Scatter: объект графического графика """ среднее значение = np.mean (y, ось = 0) sem = np.std (y, ось = 0) / np.sqrt (y.shape [0]) вернуться идти.Scatter( имя = легенда_метка, х=np.arange(1, y.shape[1] + 1), у = среднее, error_y={ "тип": "данные", "массив": сэм, "видимый": Правда, }, режим="маркеры", маркер={"цвет": rgba(marker_color)}, текст = hover_labels, )

[документы] Deftimal_objective_scatter( оптимальный: float, num_iterations: int, оптимальный_цвет: Tuple[int] = COLORS. ORANGE.value ) -> go.Scatter: """Создает объект графика для линии, представляющей оптимальную цель. Аргументы: оптимум: значение оптимальной цели num_iterations: сколько испытаний было в оптимизации (используется для определить ширину участка) trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: go.Scatter: построение графических объектов для оптимальной целевой линии """ вернуться идти.Scatter( х=[1, число_итераций], у=[оптимальное] * 2, режим = "линии", line={"тире": "тире", "цвет": rgba(optimum_color)}, имя="Оптимальный", )

[документы] def model_transitions_scatter ( model_transitions: Список[целое], y_range: Список[плавающий], генератор_изменения_цвета: Tuple[int] = COLORS.TEAL.value, ) -> Список[go.Scatter]: """Создает объект графика для линий, представляющих изменения генератора. Аргументы: model_transitions: итерации, перед которыми генераторы измененный y_range: верхнее и нижнее значения y-диапазона графика генератор_изменения_цвета: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: go.Scatter: графические объекты для линий, представляющих генератор изменения """ if len(y_range) != 2: # прагма: нет покрытия поднять ValueError("y_range должен иметь два значения, нижнее и верхнее.") данные: Список[go.Scatter] = [] для изменения в model_transitions: data.append( идти.Scatter( х=[изменить] * 2, у = у_диапазон, режим = "линии", линия = {"тире": "тире", "цвет": rgba (generator_change_color)}, имя="изменение модели", ) ) вернуть данные

[документы] определение оптимизации_trace_single_method_plotly ( у: np.ndarray, оптимум: Необязательный [поплавок] = Нет, model_transitions: Необязательный [Список [int]] = Нет, заголовок: ул = "", Метка: ул = "", hover_labels: Необязательный [Список [str]] = Нет, trace_color: Tuple[int] = COLORS.STEELBLUE. value, оптимальный_цвет: Tuple[int] = ЦВЕТА.ОРАНЖЕВЫЙ.значение, генератор_изменения_цвета: Tuple[int] = COLORS.TEAL.value, Оптимизация_направление: Необязательно[str] = "сквозной", plot_trial_points: логическое значение = ложь, Trial_points_color: Tuple[int] = COLORS.LIGHT_PURPLE.value, ) -> идти.Рисунок: """Создает трассировку оптимизации со средним значением и 2 SEM Аргументы: y: (r x t) массив; результат для построения с r прогонами и t испытаниями оптимум: значение оптимальной цели model_transitions: итерации, перед которыми генераторы измененный title: название для этого сюжета. ylabel: метка для оси Y. hover_labels: необязательный, текст для отображения при наведении; список, где i-е значение соответствует i-му значению в значении аргумента `y`. trace_color: кортеж из 3 значений int, представляющих цвет RGB для построения графика. работает оптимально. По умолчанию синий. оптимальный_цвет: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. генератор_изменения_цвета: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию бирюзовый. optimize_direction: str, "свернуть" будет отображать текущий минимум, "maximize" будет отображать текущий максимум, "passthrough" (по умолчанию) будет отображать y в виде линий, None не отображает оптимальную работу) plot_trial_points: логическое значение, отображать ли цель для каждого испытания, как указывается в y (по умолчанию False для обратной совместимости) Trial_points_color: кортеж из 3 значений int, представляющих цвет RGB для нанесение пробных точек. По умолчанию светло-фиолетовый. Возвращает: go.Рисунок: график трассировки оптимизации с IQR """ если optimize_direction не в {"свернуть", "развернуть", "сквозной", None}: поднять ValueError( 'optimization_direction должен быть "минимизировать", "максимизировать", "сквозной" или ' "Никто" ) если (не plot_trial_points) и (optimization_direction — None): поднять ValueError( «Если для plot_trial_points задано значение False, для параметра option_direction не должно быть значения None». ) данные = [] если plot_trial_points: маркеры = mean_markers_scatter( у=у, marker_color=trial_points_color, hover_labels = hover_labels, legend_label="целевое значение", ) data.extend([маркеры]) если оптимизация_направление не равно None: legend_label = "лучшая цель на данный момент" если оптимизация_направление == "свернуть": y_running_optimum = np.minimum.accumulate (y, ось = 1) elif optimization_direction == "максимизировать": y_running_optimum = np.maximum.accumulate (y, ось = 1) еще: y_running_optimum = y legend_label = "целевое значение" трассировка = среднее_трассировка_разброс( y=y_running_optimum, trace_color=trace_color, hover_labels = hover_labels, legend_label=легенда_метка, ) нижний, верхний = sem_range_scatter(y=y_running_optimum, trace_color=trace_color) data. extend([нижний, трассировка, верхний]) если оптимум не None: data.append( оптимальный_целевой_разброс( оптимальный=оптимальный, число_итераций=y.shape[1], оптимальный_цвет=оптимальный_цвет ) ) если model_transitions не None: # прагма: нет покрытия если plot_trial_points: y_lower = np.percentile(y, 25, ось=0).min() y_upper = np.percentile (y, 75, ось = 0).max() еще: y_lower = np.percentile (y_running_optimum, 25, ось = 0).min() y_upper = np.percentile (y_running_optimum, 75, ось = 0).max() если оптимум не равен None и оптимальный < y_lower: y_lower = оптимальный если оптимум не None и оптимальный > y_upper: y_upper = оптимум данные.расширить( model_transitions_scatter( model_transitions=model_transitions, y_range=[y_нижний, y_верхний], генератор_изменения_цвета=генератор_изменения_цвета, ) ) макет = перейти. Макет( название = название, showlegend=Верно, yaxis={"название": ylabel}, xaxis={"title": "Итерация"}, ) вернуть go.Figure(layout=layout, data=data)

[документы] определение оптимизации_trace_single_method( у: np.ndarray, оптимум: Необязательный [поплавок] = Нет, model_transitions: Необязательный [Список [int]] = Нет, заголовок: ул = "", Метка: ул = "", hover_labels: Необязательный [Список [str]] = Нет, trace_color: Tuple[int] = COLORS.STEELBLUE.value, оптимальный_цвет: Tuple[int] = ЦВЕТА.ОРАНЖЕВЫЙ.значение, генератор_изменения_цвета: Tuple[int] = COLORS.TEAL.value, Оптимизация_направление: Необязательно[str] = "сквозной", plot_trial_points: логическое значение = ложь, Trial_points_color: Tuple[int] = COLORS.LIGHT_PURPLE.value, ) -> AxPlotConfig: """Создает трассировку оптимизации со средним значением и 2 SEM Аргументы: y: (r x t) массив; результат для построения с r прогонами и t испытаниями оптимум: значение оптимальной цели model_transitions: итерации, перед которыми генераторы измененный title: название для этого сюжета. ylabel: метка для оси Y. hover_labels: необязательный, текст для отображения при наведении; список, где i-е значение соответствует i-му значению в значении аргумента `y`. trace_color: кортеж из 3 значений int, представляющих цвет RGB для построения графика. работает оптимально. По умолчанию синий. оптимальный_цвет: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. генератор_изменения_цвета: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию бирюзовый. optimize_direction: str, "свернуть" будет отображать текущий минимум, "maximize" будет отображать текущий максимум, "passthrough" (по умолчанию) будет отображать y в виде линий, None не отображает оптимальную работу) plot_trial_points: логическое значение, отображать ли цель для каждого испытания, как указывается в y (по умолчанию False для обратной совместимости) Trial_points_color: кортеж из 3 значений int, представляющих цвет RGB для нанесение пробных точек. По умолчанию светло-фиолетовый. Возвращает: AxPlotConfig: график трассировки оптимизации с IQR """ вернуть AxPlotConfig( данные = optimization_trace_single_method_plotly ( у=у, оптимальный=оптимальный, model_transitions=model_transitions, название = название, метка = метка, hover_labels = hover_labels, trace_color=trace_color, оптимальный_цвет = оптимальный_цвет, генератор_изменения_цвета=генератор_изменения_цвета, Оптимизация_направление=оптимизация_направление, plot_trial_points=plot_trial_points, пробные_точки_цвет=пробные_точки_цвет, ), plot_type = AxPlotTypes.GENERIC, )

[документы] определение оптимизации_trace_all_methods ( y_dict: Dict[str, np.ndarray], оптимум: Необязательный [поплавок] = Нет, заголовок: ул = "", Метка: ул = "", hover_labels: Необязательный [Список [str]] = Нет, trace_colors: List[Tuple[int]] = DISCRETE_COLOR_SCALE, оптимальный_цвет: Tuple[int] = ЦВЕТА. ОРАНЖЕВЫЙ.значение, ) -> AxPlotConfig: """Сравнивает графики оптимизации с полосами 2-SEM для нескольких методы по одной и той же проблеме. Аргументы: y: сопоставление имен методов с массивами (r x t), где r — число запусков в тесте, t — количество испытаний. оптимум: значение оптимальной цели. title: название для этого сюжета. ylabel: метка для оси Y. hover_labels: необязательный, текст для отображения при наведении; список, где i-е значение соответствует i-му значению в значении аргумента `y`. trace_colors: кортежи из 3 значений int, представляющие Цвета RGB, используемые для различных методов, показаны на комбинированном графике. По умолчанию используется дискретная цветовая шкала Ax. оптимальный_цвет: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: AxPlotConfig: график сравнения трасс оптимизации с IQR """ данные: Список[go. Scatter] = [] для i, (метод, y) в enumerate(y_dict.items()): # Если трасс больше, чем цветов, начните повторно использовать цвета. цвет = trace_colors[i% len(trace_colors)] trace = mean_trace_scatter (y = y, trace_color = цвет, legend_label = метод) нижний, верхний = sem_range_scatter (y = y, trace_color = цвет, legend_label = метод) data.extend([нижний, трассировка, верхний]) если оптимум не None: num_iterations = max(y.shape[1] для y в y_dict.values()) data.append( оптимальный_целевой_разброс( оптимальный=оптимальный, num_iterations = num_iterations, оптимальный_цвет = оптимальный_цвет, ) ) макет = перейти.Макет( название = название, showlegend=Верно, yaxis={"название": ylabel}, xaxis={"title": "Итерация"}, ) вернуть AxPlotConfig( data = go. Figure (макет = макет, данные = данные), plot_type = AxPlotTypes. GENERIC )

[документы] определение оптимизация_время ( fit_times: Dict[str, List[float]], gen_times: Dict[str, List[float]], заголовок: ул = "", ) -> AxPlotConfig: """Время у стены для каждого метода отображается в виде гистограммы. Аргументы: fit_times: сопоставление имени метода со списком значений времени подгонки модели. gen_times: сопоставление имени метода со списком времени генерации. title: Название для этого сюжета. Возвращает: AxPlotConfig с графиком. """ # Вычислить средства и SE методы = список (fit_times.keys()) fit_res: Dict[str, Union[str, List[float]]] = {"name": "Fiting"} fit_res["mean"] = [np.mean(fit_times[m]) для m в методах] fit_res["2sems"] = [ 2 * np.std(fit_times[m]) / np.sqrt(len(fit_times[m])) для m в методах ] gen_res: Dict[str, Union[str, List[float]]] = {"name": "Generation"} gen_res["mean"] = [np.mean(gen_times[m]) для m в методах] gen_res["2sems"] = [ 2 * np. std(gen_times[m])/np.sqrt(len(gen_times[m])) для m в методах ] total_mean: Список[плавающая] = [] total_2sems: Список[плавающая] = [] для m в методах: итоги = np.array (fit_times [м]) + np.array (gen_times [м]) total_mean.append (np.mean (итоги)) total_2sems.append (2 * np.std (итоги) / np.sqrt (len (итоги))) total_res: Dict[str, Union[str, List[float]]] = { "имя": "Всего", «среднее»: total_mean, "2сем": всего_2сем, } # Построить сюжет данные: Список[go.Bar] = [] для i, res in enumerate([fit_res, gen_res, total_res]): data.append( идти.Бар( х = методы, у = разрешение ["среднее"], текст = разрешение ["имя"], текстовое положение = "авто", error_y={"тип": "данные", "массив": res["2sems"], "видимый": True}, маркер={ "цвет": rgba(DISCRETE_COLOR_SCALE[i]), "линия": {"цвет": "rgb(0,0,0)", "ширина": 1,0}, }, непрозрачность=0,6, имя = разрешение ["имя"], ) ) макет = перейти. Макет( название = название, showlegend=ложь, yaxis={"title": "Время"}, xaxis={"название": "Метод"}, ) вернуть AxPlotConfig( data = go. Figure (макет = макет, данные = данные), plot_type = AxPlotTypes.GENERIC )

[документы] def get_running_trials_per_minute( эксперимент: Эксперимент, show_until_latest_end_plus_timedelta: timedelta = ПЯТЬ_МИНУТ, ) -> AxPlotConfig: Trial_runtimes: List[Tuple[int, datetime, Optional[datetime]]] = [ ( пробный.индекс, not_none(пробная версия._time_run_started), Trial._time_completed, # Испытание на время было завершено, не удалось или было прекращено. ) для пробы в Experiment.trials.values() если trip._time_run_started не None ] Early_start = min(tr[1] для tr в Trial_runtimes) last_end = max(not_none(tr[2]) для tr в Trial_runtimes, если tr[2] не None) running_during = { тс: [ t[0] # Пробный индекс. для t в Trial_runtimes # Пробная версия выполняется в течение заданной временной метки, если: # 1) время начала его выполнения соответствует или предшествует метке времени, # 2) время его завершения еще не наступило или истекло после метки времени. if t[1] <= ts и (True, если t[2] равно None else not_none(t[2]) >= ts) ] для ts в timestamps_in_range( самое раннее_начало, last_end + show_until_latest_end_plus_timedelta, дельта времени (секунды = 60), ) } num_running_at_ts = {ts: len(испытания) для ts, испытания в running_during.items()} разброс = go.Scatter( х = список (num_running_at_ts.keys()), y=[num_running_at_ts[ts] для ts в num_running_at_ts], ) вернуть AxPlotConfig( данные = идти.Рисунок ( layout=go.Layout(title="Количество запущенных испытаний во время эксперимента"), данные=[разброс], ), plot_type = AxPlotTypes. GENERIC, )

Axe · Адаптивная экспериментальная платформа

 #!/usr/bin/env python3
# Copyright (c) Facebook, Inc. и ее филиалы. Все права защищены.
введите import Any, Dict, List, Optional, Tuple, Union
импортировать numpy как np
импортировать plotly.graph_objs как есть
из ax.plot.base импортировать AxPlotConfig, AxPlotTypes
из ax.plot.color импортировать ЦВЕТА, DISCRETE_COLOR_SCALE, rgba
# введите псевдонимы
Следы = Список[Словарь[строка, Любая]]
 

[документы] def mean_trace_scatter ( у: np.ndarray, trace_color: Tuple[int] = COLORS.STEELBLUE.value, legend_label: ул = "среднее", ) -> go.Scatter: """Создает объект графика для трассировки среднего значения заданного ряда по бежит. Аргументы: y: массив (r x t) с результатами r прогонов и t испытаний. trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию синий. legend_label: метка для этой трассы Возвращает: go.Scatter: объект графического графика """ return go. Scatter( # pyre-ignore[16]: `plotly.graph_objs` не имеет атрибута. `Scatter` имя = легенда_метка, legendgroup=legend_label, х=np.arange(1, y.shape[1] + 1), y=np.mean(y, ось=0), режим = "линии", строка = {"цвет": rgba (trace_color)}, цвет заливки = rgba (trace_color, 0,3), заполнить = "тонексти", )

[документы] определение sem_range_scatter ( у: np.ndarray, trace_color: Tuple[int] = COLORS.STEELBLUE.value, legend_label: ул = "", ) -> Кортеж[go.Scatter]: """Создает объект графика для трассировки среднего +/- 2 SEM для y по всем циклам. Аргументы: y: массив (r x t) с результатами r прогонов и t испытаний. trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию синий. legend_label: Метка для группы легенд. Возвращает: Tuple[go.Scatter]: построение графических объектов для нижних и верхних границ """ среднее значение = np. mean (y, ось = 0) sem = np.std (y, ось = 0) / np.sqrt (y.shape [0]) возвращаться ( go.Scatter( # pyre-ignore[16]: `plotly.graph_objs` не имеет атрибута. `Scatter` х=np.arange(1, y.shape[1] + 1), y=среднее - 2 * sem, legendgroup=legend_label, режим = "линии", строка = {"ширина": 0}, showlegend=ложь, hoverinfo="нет", ), go.Scatter( # pyre-ignore[16]: `plotly.graph_objs` не имеет атрибута. `Scatter` х=np.arange(1, y.shape[1] + 1), у = среднее + 2 * стандартная ошибка, legendgroup=legend_label, режим = "линии", строка = {"ширина": 0}, цвет заливки = rgba (trace_color, 0,3), заполнить = "тонексти", showlegend=ложь, hoverinfo="нет", ), )

[документы] Deftimal_objective_scatter( оптимальный: float, num_iterations: int, оптимальный_цвет: Tuple[int] = COLORS. ORANGE.value ) -> go.Scatter: """Создает объект графика для линии, представляющей оптимальную цель. Аргументы: оптимум: значение оптимальной цели num_iterations: сколько испытаний было в оптимизации (используется для определить ширину участка) trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: go.Scatter: построение графических объектов для оптимальной целевой линии """ return go.Scatter( # pyre-ignore[16]: `plotly.graph_objs` не имеет атрибута. `Scatter` х=[1, число_итераций], у=[оптимальное] * 2, режим = "линии", line={"тире": "тире", "цвет": rgba(optimum_color)}, имя="Оптимальный", )

[документы] определение генератора_изменений_рассеяния ( генератор_изменений: Список[целое], y_range: Список[плавающий], генератор_изменения_цвета: Tuple[int] = COLORS.TEAL.value, ) -> Список[go.Scatter]: """Создает объект графика для линий, представляющих изменения генератора. Аргументы: генератор_изменений: итерации, перед которыми генераторы измененный y_range: верхнее и нижнее значения y-диапазона графика генератор_изменения_цвета: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: go.Scatter: графические объекты для линий, представляющих генератор изменения """ if len(y_range) != 2: # прагма: нет покрытия поднять ValueError("y_range должен иметь два значения, нижнее и верхнее.") данные: Список[go.Scatter] = [] для изменения в generator_changes: data.append( go.Scatter( # pyre-ignore[16]: `plotly.graph_objs` не имеет атрибута. `Scatter` х=[изменить] * 2, у = у_диапазон, режим = "линии", линия = {"тире": "тире", "цвет": rgba (generator_change_color)}, name="Смена генератора", ) ) вернуть данные

[документы] определение оптимизации_trace_single_method( у: np. ndarray, оптимум: Необязательный [поплавок] = Нет, генератор_изменений: Необязательный [Список [int]] = Нет, заголовок: ул = "", Метка: ул = "", trace_color: Tuple[int] = COLORS.STEELBLUE.value, оптимальный_цвет: Tuple[int] = ЦВЕТА.ОРАНЖЕВЫЙ.значение, генератор_изменения_цвета: Tuple[int] = COLORS.TEAL.value, ) -> AxPlotConfig: """Создает трассировку оптимизации со средним значением и 2 SEM Аргументы: y: (r x t) массив; результат для построения с r прогонами и t испытаниями оптимум: значение оптимальной цели генератор_изменений: итерации, перед которыми генераторы измененный название: название этого сюжета ylabel: метка для оси Y trace_color: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. оптимальный_цвет: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. генератор_изменения_цвета: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: AxPlotConfig: график трассировки оптимизации с IQR """ trace = mean_trace_scatter(y=y, trace_color=trace_color) # pyre-fixme[23]: Не удалось распаковать одно значение, ожидалось 2. нижний, верхний = sem_range_scatter(y=y, trace_color=trace_color) layout = go.Layout( # pyre-ignore[16]: ...graph_objs` не имеет атрибута. `Layout` название = название, showlegend=Верно, yaxis={"название": ylabel}, xaxis={"title": "Итерация"}, ) данные = [нижний, трассировка, верхний] если оптимум не None: data.append( оптимальный_целевой_разброс( оптимальный=оптимальный, число_итераций=y.shape[1], оптимальный_цвет=оптимальный_цвет ) ) если генератор_изменений не равен None: # прагма: нет покрытия y_lower = np.min (np.percentile (y, 25, ось = 0)) y_upper = np.max (np.percentile (y, 75, ось = 0)) если оптимум не равен None и оптимальный < y_lower: y_lower = оптимальный если оптимум не None и оптимальный > y_upper: y_upper = оптимум данные. расширить( генератор_изменений_разброс ( генератор_изменений = генератор_изменений, y_range=[y_нижний, y_верхний], генератор_изменения_цвета=генератор_изменения_цвета, ) ) вернуть AxPlotConfig( # pyre-ignore[16]: ...graph_objs` не имеет атрибута. `Фигура` данные = go.Рисунок (макет = макет, данные = данные), plot_type = AxPlotTypes.GENERIC, )

[документы] определение оптимизации_trace_all_methods ( y_dict: Dict[str, np.ndarray], оптимум: Необязательный [поплавок] = Нет, заголовок: ул = "", Метка: ул = "", trace_colors: List[Tuple[int]] = DISCRETE_COLOR_SCALE, оптимальный_цвет: Tuple[int] = ЦВЕТА.ОРАНЖЕВЫЙ.значение, ) -> AxPlotConfig: """Сравнивает графики оптимизации с полосами 2-SEM для нескольких методы по одной и той же проблеме. Аргументы: y: сопоставление имен методов с массивами (r x t), где r — число запусков в тесте, t — количество испытаний. оптимум: значение оптимальной цели. title: Название для этого сюжета. ylabel: метка для оси Y trace_colors: кортежи из 3 значений int, представляющие Цвета RGB, используемые для различных методов, показаны на комбинированном графике. По умолчанию используется дискретная цветовая шкала Ax. оптимальный_цвет: кортеж из 3 значений int, представляющих цвет RGB. По умолчанию оранжевый. Возвращает: AxPlotConfig: график сравнения трасс оптимизации с IQR """ данные: Список[go.Scatter] = [] для i, (метод, y) в enumerate(y_dict.items()): # Если трасс больше, чем цветов, начните повторно использовать цвета. цвет = trace_colors[i% len(trace_colors)] trace = mean_trace_scatter (y = y, trace_color = цвет, legend_label = метод) # pyre-fixme[23]: Не удалось распаковать одно значение, ожидалось 2. нижний, верхний = sem_range_scatter (y = y, trace_color = цвет, legend_label = метод) data. extend([нижний, трассировка, верхний]) если оптимум не None: num_iterations = max(y.shape[1] для y в y_dict.values()) data.append( оптимальный_целевой_разброс( оптимальный=оптимальный, num_iterations = num_iterations, оптимальный_цвет = оптимальный_цвет, ) ) layout = go.Layout( # pyre-ignore[16]: ...graph_objs` не имеет атрибута. `Layout` название = название, showlegend=Верно, yaxis={"название": ylabel}, xaxis={"title": "Итерация"}, ) вернуть AxPlotConfig( # pyre-ignore[16]: ...graph_objs` не имеет атрибута. `Фигура` данные = go.Рисунок (макет = макет, данные = данные), plot_type = AxPlotTypes.GENERIC, )

[документы] определение оптимизация_время ( fit_times: Dict[str, List[float]], gen_times: Dict[str, List[float]], заголовок: ул = "", ) -> AxPlotConfig: """Время у стены для каждого метода отображается в виде гистограммы. Аргументы: fit_times: сопоставление имени метода со списком значений времени подгонки модели. gen_times: сопоставление имени метода со списком времени генерации. title: Название для этого сюжета. Возвращает: AxPlotConfig с графиком. """ # Вычислить средства и SE методы = список (fit_times.keys()) fit_res: Dict[str, Union[str, List[float]]] = {"name": "Fiting"} fit_res["mean"] = [np.mean(fit_times[m]) для m в методах] fit_res["2sems"] = [ 2 * np.std(fit_times[m]) / np.sqrt(len(fit_times[m])) для m в методах ] gen_res: Dict[str, Union[str, List[float]]] = {"name": "Generation"} gen_res["mean"] = [np.mean(gen_times[m]) для m в методах] gen_res["2sems"] = [ 2 * np.std(gen_times[m])/np.sqrt(len(gen_times[m])) для m в методах ] total_mean: Список[плавающая] = [] total_2sems: Список[плавающая] = [] для m в методах: итоги = np.array (fit_times [м]) + np.array (gen_times [м]) total_mean. append (np.mean (итоги)) total_2sems.append (2 * np.std (итоги) / np.sqrt (len (итоги))) total_res: Dict[str, Union[str, List[float]]] = { "имя": "Всего", «среднее»: total_mean, "2сем": всего_2сем, } # Построить сюжет данные: Список[go.Bar] = [] для i, res in enumerate([fit_res, gen_res, total_res]): data.append( go.Bar( # pyre-ignore[16]: ...graph_objs` не имеет атрибута `Bar` х = методы, у = разрешение ["среднее"], текст = разрешение ["имя"], текстовое положение = "авто", error_y={"тип": "данные", "массив": res["2sems"], "видимый": True}, маркер={ "цвет": rgba(DISCRETE_COLOR_SCALE[i]), "линия": {"цвет": "rgb(0,0,0)", "ширина": 1,0}, }, непрозрачность=0,6, имя = разрешение ["имя"], ) ) layout = go.Layout( # pyre-ignore[16]: .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *