Ядро умирает с bw2analyzer.traverse_tagged_database - PullRequest
0 голосов
/ 06 декабря 2018

У меня возникли проблемы с использованием функции 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 Ответ

0 голосов
/ 17 декабря 2018

Я нашел решение, чтобы функция 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 достаточно, чтобы получить то, что я хочу.Это уже занимает некоторое время.
...