Skip to content

Commit a02917d

Browse files
committed
[dev] fix bug on event id-based trigger, improve fibonacci example
1 parent 5b51c97 commit a02917d

File tree

7 files changed

+104
-88
lines changed

7 files changed

+104
-88
lines changed

src/api/MoniLogger.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ namespace MoniLogger
9797
} else {
9898
const size_t result = base_events.size();
9999
base_events[event_name] = result;
100-
registered_moniloggers.emplace_back();
100+
registered_moniloggers.emplace_back(std::list<py::function>());
101101
for (auto monilogger : pending_moniloggers[event_name])
102102
{
103-
registered_moniloggers[result].push_back(std::move(monilogger));
103+
registered_moniloggers[result].push_back(monilogger);
104104
}
105105
pending_moniloggers.erase(event_name);
106106
return result;
@@ -120,6 +120,7 @@ namespace MoniLogger
120120
return result;
121121
}
122122

123+
// TODO: use std::shared_ptr(monilogger)?
123124
void register_monilogger(std::string event_name, py::function monilogger)
124125
{
125126
// Retrieve each base event triggering this event.
@@ -128,22 +129,21 @@ namespace MoniLogger
128129
{
129130
// If no base event exists yet, the event name has not been declared yet,
130131
// add the monilogger to the list of pending moniloggers for that event.
131-
pending_moniloggers[event_name].push_back(std::move(monilogger));
132+
pending_moniloggers[event_name].push_back(monilogger);
132133
} else {
133134
std::list<py::function> event_moniloggers = event_to_moniloggers[event_name];
134135
// Make sure a monilogger can only be registered once.
135136
if (std::find(event_moniloggers.begin(), event_moniloggers.end(), monilogger) == event_moniloggers.end())
136137
{
137138
// Add the monilogger to the list of registered moniloggers for this event name.
138-
event_to_moniloggers[event_name].push_back(std::move(monilogger));
139+
event_to_moniloggers[event_name].push_back(monilogger);
139140
for (auto id : ids)
140141
{
141142
// Add the monilogger to the list of registered moniloggers for each base event.
142143
// TODO: add to pending moniloggers if the base event does not exist yet.
143-
registered_moniloggers[id].push_back(std::move(monilogger));
144+
registered_moniloggers[id].push_back(monilogger);
144145
}
145146
}
146-
147147
}
148148
}
149149

@@ -198,7 +198,7 @@ namespace MoniLogger
198198
void initialize_monilogger(std::vector<std::string> python_path,
199199
std::vector<std::string> python_scripts,
200200
std::string interface_module,
201-
std::function<void (py::module_, py::object)> interface_module_initializer)
201+
std::function<void (py::module_)> interface_module_initializer)
202202
{
203203
guard = std::shared_ptr<py::scoped_interpreter>(new py::scoped_interpreter{});
204204

@@ -216,7 +216,7 @@ namespace MoniLogger
216216
// // Initializing the user-provided interface module exposing C++ variables to Python scripts.
217217
py::module_ interface_py_module = py::module_::import(interface_module.c_str());
218218
py::object ctx = (py::object) moniloggerInternalModule.attr("MoniLoggerExecutionContext");
219-
interface_module_initializer(interface_py_module, ctx);
219+
interface_module_initializer(interface_py_module);
220220

221221
// Loading the user-provided Python scripts containing monilogger definitions.
222222
for (size_t i = 0; i < python_scripts.size(); i++)

src/api/monilogger/include/MoniLogger.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ namespace MoniLogger
6868
void initialize_monilogger(std::vector<std::string> python_path,
6969
std::vector<std::string> python_scripts,
7070
std::string interface_module,
71-
std::function<void (py::module_, py::object)> interface_module_initializer);
71+
std::function<void (py::module_)> interface_module_initializer=[](py::module_ m) { });
7272
}
7373
#endif
Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
#include "fibonacci.h"
2-
#include "fibonacci_embedding.h"
32

4-
int fibonacci(int n)
3+
namespace Fibonacci
54
{
6-
auto events = MoniLogger::get_base_events();
5+
int fibonacci(int n)
6+
{
77

8-
std::shared_ptr<FibonacciExecutionContext> ctx(new FibonacciExecutionContext(n, "FibonacciExecutionContext"));
8+
std::shared_ptr<Embedding::FibonacciExecutionContext> ctx(new Embedding::FibonacciExecutionContext(n, "FibonacciExecutionContext"));
99

10-
MoniLogger::trigger(INITIALIZE, ctx);
10+
MoniLogger::trigger(Embedding::INITIALIZE_ID, ctx);
1111

12-
int u(0), v(0), i(0), t(0);
13-
14-
ctx->previous_number = &u;
15-
ctx->current_number = &v;
16-
ctx->iteration = &i;
12+
int u(0), v(0), i(0), t(0);
13+
14+
ctx->previous_number = &u;
15+
ctx->current_number = &v;
16+
ctx->iteration = &i;
1717

18-
MoniLogger::trigger(ITERATE, ctx);
18+
MoniLogger::trigger(Embedding::ITERATE_ID, ctx);
1919

20-
v = 1;
20+
v = 1;
2121

22-
for(i = 1; i <= n; i++)
23-
{
24-
t = u + v;
25-
u = v;
26-
v = t;
27-
MoniLogger::trigger(ITERATE, ctx);
28-
}
22+
for(i = 1; i <= n; i++)
23+
{
24+
t = u + v;
25+
u = v;
26+
v = t;
27+
MoniLogger::trigger(Embedding::ITERATE_ID, ctx);
28+
}
2929

30-
MoniLogger::trigger(FINALIZE, ctx);
31-
32-
return v;
30+
MoniLogger::trigger(Embedding::FINALIZE_ID, ctx);
31+
32+
return v;
33+
}
3334
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
#ifndef __FIBONACCI_H_
22
#define __FIBONACCI_H_
33

4-
int fibonacci(int n);
4+
#include "fibonacci_embedding.h"
5+
6+
namespace Fibonacci
7+
{
8+
extern size_t Embedding::INITIALIZE_ID;
9+
extern size_t Embedding::ITERATE_ID;
10+
extern size_t Embedding::FINALIZE_ID;
11+
12+
int fibonacci(int n);
13+
}
514

615
#endif
Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,48 @@
11
#include "fibonacci_embedding.h"
22

3-
PYBIND11_EMBEDDED_MODULE(fibonacci_interface, m) { }
3+
PYBIND11_EMBEDDED_MODULE(fibonacci_interface, m)
4+
{
5+
pybind11::class_<Fibonacci::Embedding::FibonacciExecutionContext, std::shared_ptr<Fibonacci::Embedding::FibonacciExecutionContext>, MoniLogger::MoniLoggerExecutionContext>(m, "FibonacciExecutionContext")
6+
// Defining the properties exposed by the FibonacciExecutionContext.
7+
.def_property_readonly("n", &Fibonacci::Embedding::FibonacciExecutionContext::get_n)
8+
.def_property_readonly("current_number", &Fibonacci::Embedding::FibonacciExecutionContext::get_current_number)
9+
.def_property_readonly("previous_number", &Fibonacci::Embedding::FibonacciExecutionContext::get_previous_number)
10+
.def_property_readonly("iteration", &Fibonacci::Embedding::FibonacciExecutionContext::get_iteration)
11+
// Defining legible __str__ and __repr__ functions for FibonacciExecutionContext.
12+
.def("__str__", [](Fibonacci::Embedding::FibonacciExecutionContext &self)
13+
{
14+
std::ostringstream oss;
15+
oss << "[" << self.name << "]\n"
16+
<< " previous number: " << self.previous_number << "\n"
17+
<< " current number: " << self.current_number << "\n"
18+
<< " iteration: " << self.iteration << "\n" ;
19+
return oss.str();
20+
})
21+
.def("__repr__", [](Fibonacci::Embedding::FibonacciExecutionContext &self)
22+
{
23+
std::ostringstream oss;
24+
oss << "[" << self.name << "]\n"
25+
<< " previous number: " << self.previous_number << "\n"
26+
<< " current number: " << self.current_number << "\n"
27+
<< " iteration: " << self.iteration << "\n" ;
28+
return oss.str();
29+
});
30+
}
431

5-
void initialize_embedding(std::vector<std::string> python_path, std::vector<std::string> python_scripts)
32+
namespace Fibonacci::Embedding
633
{
7-
// Name of the interface module (here, an embedded module declared above) exposing the execution context of the application.
8-
std::string interface_module = "fibonacci_interface";
934

10-
// Initialization function for the interface module.
11-
std::function<void (pybind11::module_, pybind11::object)> interface_module_initializer =
12-
[](pybind11::module_ interface_module, pybind11::object context_class) {
13-
pybind11::class_<FibonacciExecutionContext, std::shared_ptr<FibonacciExecutionContext>>(interface_module, "FibonacciExecutionContext", context_class)
14-
// Defining the properties exposed by the FibonacciExecutionContext.
15-
.def_property_readonly("n", &FibonacciExecutionContext::get_n)
16-
.def_property_readonly("current_number", &FibonacciExecutionContext::get_current_number)
17-
.def_property_readonly("previous_number", &FibonacciExecutionContext::get_previous_number)
18-
.def_property_readonly("iteration", &FibonacciExecutionContext::get_iteration)
19-
// Defining legible __str__ and __repr__ functions for FibonacciExecutionContext.
20-
.def("__str__", [](FibonacciExecutionContext &self)
21-
{
22-
std::ostringstream oss;
23-
oss << "[" << self.name << "]\n"
24-
<< " previous number: " << self.previous_number << "\n"
25-
<< " current number: " << self.current_number << "\n"
26-
<< " iteration: " << self.iteration << "\n" ;
27-
return oss.str();
28-
})
29-
.def("__repr__", [](FibonacciExecutionContext &self)
30-
{
31-
std::ostringstream oss;
32-
oss << "[" << self.name << "]\n"
33-
<< " previous number: " << self.previous_number << "\n"
34-
<< " current number: " << self.current_number << "\n"
35-
<< " iteration: " << self.iteration << "\n" ;
36-
return oss.str();
37-
});
38-
};
35+
size_t INITIALIZE_ID = MoniLogger::register_base_event(INITIALIZE);
36+
size_t ITERATE_ID = MoniLogger::register_base_event(ITERATE);
37+
size_t FINALIZE_ID = MoniLogger::register_base_event(FINALIZE);
3938

40-
// Define base execution events emitted by the application, to which moniloggers can register.
41-
MoniLogger::register_base_event(INITIALIZE);
42-
MoniLogger::register_base_event(ITERATE);
43-
MoniLogger::register_base_event(FINALIZE);
39+
void initialize(std::vector<std::string> python_path, std::vector<std::string> python_scripts)
40+
{
41+
// Name of the interface module (here, an embedded module declared above) exposing the execution context of the application.
42+
std::string interface_module = "fibonacci_interface";
4443

45-
// Bootstrapping monilogger, consisting of starting the Python interpreter, initializing
46-
// the monilogger module, and evaluating the provided scripts.
47-
MoniLogger::initialize_monilogger(python_path, python_scripts, interface_module, interface_module_initializer);
48-
}
44+
// Bootstrapping monilogger, consisting of starting the Python interpreter, initializing
45+
// the monilogger module, and evaluating the provided scripts.
46+
MoniLogger::initialize_monilogger(python_path, python_scripts, interface_module);
47+
}
48+
}

src/bindings/cpp/examples/fibonacci/src/fibonacci_embedding.h

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,27 @@
77
#define ITERATE "Iterate"
88
#define FINALIZE "Finalize"
99

10-
struct FibonacciExecutionContext : MoniLogger::MoniLoggerExecutionContext
10+
namespace Fibonacci::Embedding
1111
{
12-
const pybind11::object get_n() const { return pybind11::cast(n); }
13-
const pybind11::object get_previous_number() const { if (previous_number != nullptr) return pybind11::cast(*previous_number); else return pybind11::cast<pybind11::none>(Py_None); }
14-
const pybind11::object get_current_number() const { if (current_number != nullptr) return pybind11::cast(*current_number); else return pybind11::cast<pybind11::none>(Py_None); }
15-
const pybind11::object get_iteration() const { if (iteration != nullptr) return pybind11::cast(*iteration); else return pybind11::cast<pybind11::none>(Py_None); }
12+
extern size_t INITIALIZE_ID;
13+
extern size_t ITERATE_ID;
14+
extern size_t FINALIZE_ID;
1615

17-
int n;
18-
int *previous_number = nullptr;
19-
int *current_number = nullptr;
20-
int *iteration = nullptr;
21-
22-
FibonacciExecutionContext(int n, std::string name) : MoniLoggerExecutionContext(name), n(n) {}
23-
};
16+
struct FibonacciExecutionContext : MoniLogger::MoniLoggerExecutionContext
17+
{
18+
const pybind11::object get_n() const { return pybind11::cast(n); }
19+
const pybind11::object get_previous_number() const { if (previous_number != nullptr) return pybind11::cast(*previous_number); else return pybind11::cast<pybind11::none>(Py_None); }
20+
const pybind11::object get_current_number() const { if (current_number != nullptr) return pybind11::cast(*current_number); else return pybind11::cast<pybind11::none>(Py_None); }
21+
const pybind11::object get_iteration() const { if (iteration != nullptr) return pybind11::cast(*iteration); else return pybind11::cast<pybind11::none>(Py_None); }
2422

25-
void initialize_embedding(std::vector<std::string> python_path, std::vector<std::string> python_scripts);
23+
int n;
24+
int *previous_number = nullptr;
25+
int *current_number = nullptr;
26+
int *iteration = nullptr;
27+
28+
FibonacciExecutionContext(int n, std::string name) : MoniLoggerExecutionContext(name), n(n) {}
29+
};
2630

31+
void initialize(std::vector<std::string> python_path, std::vector<std::string> python_scripts);
32+
}
2733
#endif

src/bindings/cpp/examples/fibonacci/src/fibonacci_main.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ int main(int argc, char const *argv[])
2727
return 1;
2828
}
2929

30-
initialize_embedding(python_path, python_script);
30+
Fibonacci::Embedding::initialize(python_path, python_script);
3131

32-
fibonacci(n);
32+
Fibonacci::fibonacci(n);
3333

3434
return 0;
3535
}

0 commit comments

Comments
 (0)