More details

Occasionally it may happen that the system is not behaving as expected. As in generic computer programming, PeP also offers methods to analyze the execution.

In this example, the same input file as that used in An initial example will be used (input_files/input_example_3.pep)

One debugging tool is the step by step execution, that can be achieved using the --step` command line parameter.

The second debugging tool implies the -v command line parameter that increases the verbosity level.:

./pep.py input_files/input_example_3.pep -n 1 -v

With this parameter, the output of the simulator becomes:

INFO     reading input file
DEBUG    process_tokens (parent_type = <class 'NoneType'>, index = 0)
DEBUG    token = 'num_ps'
DEBUG    processing as GENERAL
DEBUG    token = '='
DEBUG    processing as GENERAL
INFO     building NumericalPsystem
DEBUG    process_tokens (parent_type = <class '__main__.NumericalPsystem'>, index = 2)
DEBUG    token = '{'
DEBUG    processing as NumericalPsystem
DEBUG    token = 'H'
DEBUG    processing as NumericalPsystem
DEBUG    token = '='
DEBUG    processing as NumericalPsystem
INFO     building membrane list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 5)
DEBUG    token = '{'
DEBUG    processing as List
DEBUG    token = 'm1'
DEBUG    processing as List
DEBUG    token = ','
DEBUG    processing as List
DEBUG    token = 'm2'
DEBUG    processing as List
DEBUG    token = ','
DEBUG    processing as List
DEBUG    token = 'm3'
DEBUG    processing as List
DEBUG    token = '}'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = ['m1', 'm2', 'm3']
DEBUG    token = 'structure'
DEBUG    processing as NumericalPsystem
DEBUG    token = '='
DEBUG    processing as NumericalPsystem
INFO     building membrane structure
DEBUG    process_tokens (parent_type = <class '__main__.MembraneStructure'>, index = 15)
DEBUG    token = '['
DEBUG    processing as MembraneStructure
DEBUG    token = 'm1'
DEBUG    processing as MembraneStructure
DEBUG    token = '['
DEBUG    processing as MembraneStructure
DEBUG    token = 'm2'
DEBUG    processing as MembraneStructure
DEBUG    token = ']'
DEBUG    processing as MembraneStructure
DEBUG    token = 'm2'
DEBUG    processing as MembraneStructure
DEBUG    token = '['
DEBUG    processing as MembraneStructure
DEBUG    token = 'm3'
DEBUG    processing as MembraneStructure
DEBUG    token = ']'
DEBUG    processing as MembraneStructure
DEBUG    token = 'm3'
DEBUG    processing as MembraneStructure
DEBUG    token = ']'
DEBUG    processing as MembraneStructure
DEBUG    token = 'm1'
DEBUG    processing as MembraneStructure
DEBUG    token = ';'
DEBUG    processing as MembraneStructure
DEBUG    finished the MembraneStructure with result = [Token(type='L_BRACKET', value='[', line=5, column=16), Token(type='ID', value='m1', line=5, column=17), Token(type='L_BRACKET', value='[', line=5, column=20), Token(type='ID', value='m2', line=5, column=21), Token(type='R_BRACKET', value=']', line=5, column=24), Token(type='ID', value='m2', line=5, column=25), Token(type='L_BRACKET', value='[', line=5, column=28), Token(type='ID', value='m3', line=5, column=29), Token(type='R_BRACKET', value=']', line=5, column=32), Token(type='ID', value='m3', line=5, column=33), Token(type='R_BRACKET', value=']', line=5, column=36), Token(type='ID', value='m1', line=5, column=37)]
DEBUG    token = 'm1'
DEBUG    processing as NumericalPsystem
DEBUG    token = '='
DEBUG    processing as NumericalPsystem
INFO     building Membrane
DEBUG    process_tokens (parent_type = <class '__main__.Membrane'>, index = 30)
DEBUG    token = '{'
DEBUG    processing as Membrane
DEBUG    token = 'var'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building variable list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 33)
DEBUG    token = '{'
DEBUG    processing as List
DEBUG    token = 'x_1_1'
DEBUG    processing as List
DEBUG    token = '}'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = ['x_1_1']
DEBUG    token = 'var0'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building var0 list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 39)
DEBUG    token = '('
DEBUG    processing as List
DEBUG    token = '0'
DEBUG    processing as List
DEBUG    token = ')'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = [0]
DEBUG    token = '}'
DEBUG    processing as Membrane
DEBUG    token = ';'
DEBUG    processing as Membrane
DEBUG    finished this block with result = <__main__.Membrane object at 0x7f1bcecfdac8>
DEBUG    token = 'm2'
DEBUG    processing as NumericalPsystem
DEBUG    token = '='
DEBUG    processing as NumericalPsystem
INFO     building Membrane
DEBUG    process_tokens (parent_type = <class '__main__.Membrane'>, index = 47)
DEBUG    token = '{'
DEBUG    processing as Membrane
DEBUG    token = 'var'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building variable list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 50)
DEBUG    token = '{'
DEBUG    processing as List
DEBUG    token = 'x_1_2'
DEBUG    processing as List
DEBUG    token = '}'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = ['x_1_2']
DEBUG    token = 'pr'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building Program
DEBUG    process_tokens (parent_type = <class '__main__.Program'>, index = 56)
DEBUG    token = '{'
DEBUG    processing as Program
INFO     building production function
DEBUG    process_tokens (parent_type = <class '__main__.ProductionFunction'>, index = 57)
DEBUG    token = '2'
DEBUG    processing as ProductionFunction
DEBUG    processing integer number
DEBUG    token = '*'
DEBUG    processing as ProductionFunction
DEBUG    processing operator *
DEBUG    token = 'x_1_2'
DEBUG    processing as ProductionFunction
DEBUG    processing variable
DEBUG    token = '+'
DEBUG    processing as ProductionFunction
DEBUG    processing operator +
DEBUG    token = '1'
DEBUG    processing as ProductionFunction
DEBUG    processing integer number
DEBUG    token = '->'
DEBUG    processing as ProductionFunction
DEBUG    production function end; emptying stack
DEBUG    finished the production function with result = [2, 'x_1_2', <OperatorType.multiply: 10>, 1, <OperatorType.add: 8>]
DEBUG    token = '->'
DEBUG    processing as Program
INFO     building distribution rule
DEBUG    process_tokens (parent_type = <class '__main__.DistributionFunction'>, index = 63)
DEBUG    token = '1'
DEBUG    processing as DistributionFunction
DEBUG    token = '|'
DEBUG    processing as DistributionFunction
DEBUG    skipped '|'
DEBUG    token = 'x_1_1'
DEBUG    processing as DistributionFunction
DEBUG    token = '}'
DEBUG    processing as DistributionFunction
DEBUG    finished this DistributionFunction with result = [<__main__.DistributionRule object at 0x7f1bcecfdcc0>]
DEBUG    token = ';'
DEBUG    processing as Program
DEBUG    finished this block with result = <__main__.Program object at 0x7f1bcecfdbe0>
DEBUG    token = 'var0'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building var0 list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 70)
DEBUG    token = '('
DEBUG    processing as List
DEBUG    token = '0'
DEBUG    processing as List
DEBUG    token = ')'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = [0]
DEBUG    token = '}'
DEBUG    processing as Membrane
DEBUG    token = ';'
DEBUG    processing as Membrane
DEBUG    finished this block with result = <__main__.Membrane object at 0x7f1bcecfdb70>
DEBUG    token = 'm3'
DEBUG    processing as NumericalPsystem
DEBUG    token = '='
DEBUG    processing as NumericalPsystem
INFO     building Membrane
DEBUG    process_tokens (parent_type = <class '__main__.Membrane'>, index = 78)
DEBUG    token = '{'
DEBUG    processing as Membrane
DEBUG    token = 'var'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building variable list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 81)
DEBUG    token = '{'
DEBUG    processing as List
DEBUG    token = 'x_1_3'
DEBUG    processing as List
DEBUG    token = '}'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = ['x_1_3']
DEBUG    token = 'pr'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building Program
DEBUG    process_tokens (parent_type = <class '__main__.Program'>, index = 87)
DEBUG    token = '{'
DEBUG    processing as Program
INFO     building production function
DEBUG    process_tokens (parent_type = <class '__main__.ProductionFunction'>, index = 88)
DEBUG    token = '2'
DEBUG    processing as ProductionFunction
DEBUG    processing integer number
DEBUG    token = '*'
DEBUG    processing as ProductionFunction
DEBUG    processing operator *
DEBUG    token = '('
DEBUG    processing as ProductionFunction
DEBUG    processing operator (
DEBUG    token = 'x_1_3'
DEBUG    processing as ProductionFunction
DEBUG    processing variable
DEBUG    token = '+'
DEBUG    processing as ProductionFunction
DEBUG    processing operator +
DEBUG    token = '1'
DEBUG    processing as ProductionFunction
DEBUG    processing integer number
DEBUG    token = ')'
DEBUG    processing as ProductionFunction
DEBUG    processing operator )
DEBUG    token = '->'
DEBUG    processing as ProductionFunction
DEBUG    production function end; emptying stack
DEBUG    finished the production function with result = [2, 'x_1_3', 1, <OperatorType.add: 8>, <OperatorType.multiply: 10>]
DEBUG    token = '->'
DEBUG    processing as Program
INFO     building distribution rule
DEBUG    process_tokens (parent_type = <class '__main__.DistributionFunction'>, index = 96)
DEBUG    token = '1'
DEBUG    processing as DistributionFunction
DEBUG    token = '|'
DEBUG    processing as DistributionFunction
DEBUG    skipped '|'
DEBUG    token = 'x_1_3'
DEBUG    processing as DistributionFunction
DEBUG    token = '+'
DEBUG    processing as DistributionFunction
DEBUG    skipped '+'
DEBUG    token = '1'
DEBUG    processing as DistributionFunction
DEBUG    token = '|'
DEBUG    processing as DistributionFunction
DEBUG    skipped '|'
DEBUG    token = 'x_1_2'
DEBUG    processing as DistributionFunction
DEBUG    token = '}'
DEBUG    processing as DistributionFunction
DEBUG    finished this DistributionFunction with result = [<__main__.DistributionRule object at 0x7f1bcecfdda0>, <__main__.DistributionRule object at 0x7f1bcecfddd8>]
DEBUG    token = ';'
DEBUG    processing as Program
DEBUG    finished this block with result = <__main__.Program object at 0x7f1bcecfdd30>
DEBUG    token = 'var0'
DEBUG    processing as Membrane
DEBUG    token = '='
DEBUG    processing as Membrane
INFO     building var0 list
DEBUG    process_tokens (parent_type = <class 'list'>, index = 107)
DEBUG    token = '('
DEBUG    processing as List
DEBUG    token = '0'
DEBUG    processing as List
DEBUG    token = ')'
DEBUG    processing as List
DEBUG    token = ';'
DEBUG    processing as List
DEBUG    finished this block with result = [0]
DEBUG    token = '}'
DEBUG    processing as Membrane
DEBUG    token = ';'
DEBUG    processing as Membrane
DEBUG    finished this block with result = <__main__.Membrane object at 0x7f1bcecfdcf8>
DEBUG    token = '}'
DEBUG    processing as NumericalPsystem
DEBUG    constructing a global list of variables used in the entire P system
DEBUG    constructing a global list of enzymes used in the entire P system
DEBUG    cross-referencing string identifiers of VARIABLES to the corresponding Pobject instance
DEBUG    processing membrane m1
DEBUG    processing membrane m2
DEBUG    replacing 'x_1_1' in distribution function
DEBUG    processing membrane m3
DEBUG    processing membrane m1
DEBUG    processing membrane m2
DEBUG    replacing 'x_1_2' in production function
DEBUG    processing membrane m3
DEBUG    replacing 'x_1_2' in distribution function
DEBUG    processing membrane m1
DEBUG    processing membrane m2
DEBUG    processing membrane m3
DEBUG    replacing 'x_1_3' in production function
DEBUG    replacing 'x_1_3' in distribution function
DEBUG    cross-referencing string identifiers of ENZYMES to the corresponding Pobject instance
DEBUG    Constructing the internal membrane structure of the P system
num_ps = {
    m1:
        var = { x_1_1: 0.00, }
        E = {}
    m2:
        var = { x_1_2: 0.00, }
        E = {}
        pr_0 = { 2 * x_1_2 + 1  ->  1|x_1_1 }
    m3:
        var = { x_1_3: 0.00, }
        E = {}
        pr_0 = { 2 * ( x_1_3 + 1 )  ->  1|x_1_3 + 1|x_1_2 }
}

INFO     Starting simulation step 1
DEBUG    Production for membrane m2
DEBUG    postfixStack = [2]
DEBUG    postfixStack = [2, 0]
DEBUG    postfixStack = [0]
DEBUG    postfixStack = [0, 1]
DEBUG    postfixStack = [1]
DEBUG    Production for membrane m3
DEBUG    postfixStack = [2]
DEBUG    postfixStack = [2, 0]
DEBUG    postfixStack = [2, 0, 1]
DEBUG    postfixStack = [2, 1]
DEBUG    postfixStack = [2]
DEBUG    Resetting all variables that are part of production functions to 0
DEBUG    Resetting all enzymes that are part of production functions to 0
DEBUG    Distribution for membrane m2 of unitary value 1.00
DEBUG    Distribution for membrane m3 of unitary value 1.00
INFO     Simulation step finished succesfully
num_ps = {
  m1:
    var = { x_1_1: 1.00, }
    E = {}
  m2:
    var = { x_1_2: 1.00, }
    E = {}
  m3:
    var = { x_1_3: 1.00, }
    E = {}
}

INFO     Starting simulation step 2
DEBUG    Production for membrane m2
DEBUG    postfixStack = [2]
DEBUG    postfixStack = [2, 1.0]
DEBUG    postfixStack = [2.0]
DEBUG    postfixStack = [2.0, 1]
DEBUG    postfixStack = [3.0]
DEBUG    Production for membrane m3
DEBUG    postfixStack = [2]
DEBUG    postfixStack = [2, 1.0]
DEBUG    postfixStack = [2, 1.0, 1]
DEBUG    postfixStack = [2, 2.0]
DEBUG    postfixStack = [4.0]
DEBUG    Resetting all variables that are part of production functions to 0
DEBUG    Resetting all enzymes that are part of production functions to 0
DEBUG    Distribution for membrane m2 of unitary value 3.00
DEBUG    Distribution for membrane m3 of unitary value 2.00
INFO     Simulation step finished succesfully
num_ps = {
  m1:
    var = { x_1_1: 4.00, }
    E = {}
  m2:
    var = { x_1_2: 2.00, }
    E = {}
  m3:
    var = { x_1_3: 2.00, }
    E = {}
}

The output now includes DEBUG messages that offer usefull information regarding:

  • Input file parsing.
    Any input file error will be easy to spot by tracing back the previous messages that show the context of the parsing
  • Production function expresion.
    The expression is evaluated as a postfix notation (Reverse Polish, RPN) and by watching the postfixStack messages, it is easy to evaluate the correctness of the calculations. DEBUG    postfixStack = [2, 0]
  • Distribution function expression
    There are messages that show the unitary value that will be distributed from each membrane:DEBUG    Distribution for membrane m2 of unitary value 1.00
  • [Enzymatic] Numerical P Systems also show a special DEBUG message, DEBUG    Program 0 activated by enzyme e_1_1,that helps in observing which program was activated by an enzyme at each simulation step.