Ядро умирает с bw2analyzer.traverse_tagged_database

У меня возникли некоторые проблемы с использованием bw2analyzer.traverse_tagged_databases Функция основана на рекомендациях этого ответа. Я хотел бы применить bw2analyzer.traverse_tagged_databases функция на тегах. Я гарантировал, что деятельность, которую я оцениваю (my_act далее) имеет тег, а затем некоторые обмены ввода имеют теги (но не все), а некоторые обмены ввода обменов ввода имеют теги (не все). Вот что я делаю (опуская некоторые строки определения):

import bw2analyzer as bw2analyzer
ipcc2013 = ('IPCC 2013', 'climate change', 'GWP 100a')
fu = {my_act:1}
lca_calc = bw.LCA(fu,ipcc2013)
lca_calc.lci()
lca_calc.lcia()
result, tree = bw2analyzer.traverse_tagged_databases(fu, ipcc2013, label='tag',default_tag='other')

Когда я это делаю, ядро ​​умирает (точное сообщение: Kernel died, restarting, Я использую Spyder v3.3.1, brightway2 v2.3, bw2analyzer v0.9.4), а затем он работает бесконечно. Я правильно использую функцию? Чего мне не хватает? Это работает для вас? Спасибо за помощь!

1 ответ

Решение

Я нашел решение, чтобы сделать bw2analyzer.traverse_tagged_databases Функция работает при использовании в большой базе данных, такой как ecoinvent. Я переписал tagged.recurse_tagged_database Функция путем реализации глубины расчета (т. е. максимальной глубины, к которой применяется рекурсивная функция) и чередования результатов при достижении глубины. Вот мой код (я удалил некоторую строку из исходной функции, так как использую только одну базу данных):

def recurse_tagged_database(activity, amount, method_dict, lca, label, default_tag, secondary_tags=[],product_system_depth=5):
    from bw2data import get_activity
    if isinstance(activity, tuple):
        activity = get_activity(activity)
    inputs = list(activity.technosphere())
    if(product_system_depth > 0):
        return {
            'activity': activity,
            'amount': amount,
            'tag': activity.get(label) or default_tag,
            'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
            'impact': 0,
            'biosphere': [{
                'amount': exc['amount'] * amount,
                'impact': exc['amount'] * amount * method_dict.get(exc['input'], 0),
                'tag': exc.get(label) or activity.get(label) or default_tag,
                'secondary_tags':[exc.get(t[0]) or activity.get(t[0]) or t[1] for t in secondary_tags]
            } for exc in activity.biosphere()],
            'technosphere': [recurse_tagged_database(exc.input, exc['amount'] * amount,
                                                     method_dict, lca, label,exc.get(label) or activity.get(label) or default_tag, secondary_tags,product_system_depth=product_system_depth-1)
                             for exc in inputs]
        }
    else:
        return {
            'activity': activity,
            'amount': amount,
            'tag': activity.get(label) or default_tag,
            'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
            'impact': redo_lca_score(lca,{activity:amount}),
            'biosphere': [],
            'technosphere': []
        }

Комментарии:

  • Я изменил default_tag входы при применении рекурсивной функции к exc.get(label) or activity.get(label) or default_tag, Действительно, в моем случае я хочу, чтобы воздействия бирж по умолчанию были связаны с тегом родительской активности, если тега нет.
  • В моем случае глубины 5 достаточно, чтобы получить то, что я хочу. Это уже занимает некоторое время.
Другие вопросы по тегам