| 1 | |
|---|
| 2 | :- object(performance, |
|---|
| 3 | implements(monitoring)). % built-in protocol for event handler methods |
|---|
| 4 | |
|---|
| 5 | :- info([ |
|---|
| 6 | version is 1.4, |
|---|
| 7 | author is 'Paulo Moura', |
|---|
| 8 | date is 2008/10/20, |
|---|
| 9 | comment is 'Performance monitor for state space searches.']). |
|---|
| 10 | |
|---|
| 11 | :- uses(event_registry). |
|---|
| 12 | :- uses(before_event_registry). |
|---|
| 13 | :- uses(after_event_registry). |
|---|
| 14 | |
|---|
| 15 | :- uses(list, [length/2]). |
|---|
| 16 | :- uses(numberlist, [min/2, max/2, sum/2]). |
|---|
| 17 | :- uses(time, [cpu_time/1]). |
|---|
| 18 | |
|---|
| 19 | :- private(transitions_/3). |
|---|
| 20 | :- dynamic(transitions_/3). |
|---|
| 21 | :- mode(transitions_(?state, ?state, ?integer), zero_or_more). |
|---|
| 22 | |
|---|
| 23 | :- private(solution_length_/1). |
|---|
| 24 | :- dynamic(solution_length_/1). |
|---|
| 25 | :- mode(solution_length_(?integer), zero_or_one). |
|---|
| 26 | |
|---|
| 27 | :- private(time_/1). |
|---|
| 28 | :- dynamic(time_/1). |
|---|
| 29 | :- mode(time_(-number), zero_or_one). |
|---|
| 30 | |
|---|
| 31 | :- public(time/1). |
|---|
| 32 | :- mode(time(-number), zero_or_one). |
|---|
| 33 | |
|---|
| 34 | :- public(transitions/1). |
|---|
| 35 | :- mode(transitions(-number), zero_or_one). |
|---|
| 36 | |
|---|
| 37 | :- public(branching/3). |
|---|
| 38 | :- mode(branching(-integer, -float, -integer), zero_or_one). |
|---|
| 39 | |
|---|
| 40 | :- public(report/0). |
|---|
| 41 | :- mode(report, zero_or_one). |
|---|
| 42 | |
|---|
| 43 | :- public(init/0). |
|---|
| 44 | :- mode(init, one). |
|---|
| 45 | |
|---|
| 46 | :- public(stop/0). |
|---|
| 47 | :- mode(stop, one). |
|---|
| 48 | |
|---|
| 49 | report :- |
|---|
| 50 | solution_length_(Length), |
|---|
| 51 | transitions(Number), |
|---|
| 52 | Ratio is Length / Number, |
|---|
| 53 | branching(Minimum, Average, Maximum), |
|---|
| 54 | time(Time), |
|---|
| 55 | write('solution length: '), write(Length), nl, |
|---|
| 56 | write('state transitions (including previous solutions): '), write(Number), nl, |
|---|
| 57 | write('ratio solution length / state transitions: '), write(Ratio), nl, |
|---|
| 58 | write('minimum branching degree: '), write(Minimum), nl, |
|---|
| 59 | write('average branching degree: '), write(Average), nl, |
|---|
| 60 | write('maximum branching degree: '), write(Maximum), nl, |
|---|
| 61 | write('time: '), write(Time), nl. |
|---|
| 62 | |
|---|
| 63 | report :- % clean up for next solution |
|---|
| 64 | retractall(time_(_)), |
|---|
| 65 | retractall(solution_length_(_)), |
|---|
| 66 | cpu_time(Start), |
|---|
| 67 | asserta(time_(Start)), |
|---|
| 68 | fail. |
|---|
| 69 | |
|---|
| 70 | transitions(Number) :- |
|---|
| 71 | findall(N, transitions_(_, _, N), List), |
|---|
| 72 | sum(List, Number). |
|---|
| 73 | |
|---|
| 74 | time(Time) :- |
|---|
| 75 | cpu_time(End), |
|---|
| 76 | retract(time_(Start)), |
|---|
| 77 | Time is End - Start. |
|---|
| 78 | |
|---|
| 79 | branching(Minimum, Average, Maximum) :- |
|---|
| 80 | findall( |
|---|
| 81 | Length, |
|---|
| 82 | (transitions_(State1, _, _), |
|---|
| 83 | findall(State2, transitions_(State1, State2, _), States2), |
|---|
| 84 | length(States2, Length)), |
|---|
| 85 | Lengths), |
|---|
| 86 | min(Lengths, Minimum), |
|---|
| 87 | max(Lengths, Maximum), |
|---|
| 88 | sum(Lengths, Sum), |
|---|
| 89 | length(Lengths, Length), |
|---|
| 90 | Average is Sum / Length. |
|---|
| 91 | |
|---|
| 92 | init :- |
|---|
| 93 | self(Self), |
|---|
| 94 | event_registry::set_monitor(_, solve(_, _, _), _, Self), |
|---|
| 95 | after_event_registry::set_monitor(_, next_state(_, _), _, Self), |
|---|
| 96 | event_registry::set_monitor(_, solve(_, _, _, _), _, Self), |
|---|
| 97 | after_event_registry::set_monitor(_, next_state(_, _, _), _, Self), |
|---|
| 98 | retractall(transitions_(_, _, _)), |
|---|
| 99 | retractall(time_(_)), |
|---|
| 100 | retractall(solution_length_(_)), |
|---|
| 101 | set_logtalk_flag(events, on). % solve/3-4 messages are sent from "user" |
|---|
| 102 | |
|---|
| 103 | stop :- |
|---|
| 104 | set_logtalk_flag(events, off), |
|---|
| 105 | self(Self), |
|---|
| 106 | before_event_registry::del_monitors(_, _, _, Self), |
|---|
| 107 | after_event_registry::del_monitors(_, _, _, Self). |
|---|
| 108 | |
|---|
| 109 | before(_, solve(_, _, _), _) :- |
|---|
| 110 | !, |
|---|
| 111 | retractall(transitions_(_, _, _)), |
|---|
| 112 | cpu_time(Start), |
|---|
| 113 | retractall(time_(_)), |
|---|
| 114 | asserta(time_(Start)). |
|---|
| 115 | |
|---|
| 116 | before(_, solve(_, _, _, _), _) :- |
|---|
| 117 | !, |
|---|
| 118 | retractall(transitions_(_, _, _)), |
|---|
| 119 | cpu_time(Start), |
|---|
| 120 | retractall(time_(_)), |
|---|
| 121 | asserta(time_(Start)). |
|---|
| 122 | |
|---|
| 123 | after(_, next_state(S1, S2), _) :- |
|---|
| 124 | !, |
|---|
| 125 | ( retract(transitions_(S1, S2, N)) -> |
|---|
| 126 | N2 is N + 1 |
|---|
| 127 | ; N2 is 1 |
|---|
| 128 | ), |
|---|
| 129 | assertz(transitions_(S1, S2, N2)). |
|---|
| 130 | |
|---|
| 131 | after(_, next_state(S1, S2, _), _) :- |
|---|
| 132 | !, |
|---|
| 133 | ( retract(transitions_(S1, S2, N)) -> |
|---|
| 134 | N2 is N + 1 |
|---|
| 135 | ; N2 is 1 |
|---|
| 136 | ), |
|---|
| 137 | assertz(transitions_(S1, S2, N2)). |
|---|
| 138 | |
|---|
| 139 | after(_, solve(_, _, Solution), _) :- |
|---|
| 140 | !, |
|---|
| 141 | length(Solution, Length), |
|---|
| 142 | retractall(solution_length_(_)), |
|---|
| 143 | asserta(solution_length_(Length)). |
|---|
| 144 | |
|---|
| 145 | after(_, solve(_, _, Solution, _), _) :- |
|---|
| 146 | !, |
|---|
| 147 | length(Solution, Length), |
|---|
| 148 | retractall(solution_length_(_)), |
|---|
| 149 | asserta(solution_length_(Length)). |
|---|
| 150 | |
|---|
| 151 | :- end_object. |
|---|