45 namespace Gecode {
namespace CPProfiler {
48 static const int32_t PROFILER_PROTOCOL_VERSION = 3;
76 bool valid(
void)
const;
82 const T& value(
void)
const;
95 present =
true; value_ =
t;
105 assert(present);
return value_;
110 assert(present);
return value_;
134 bool _have_label{
false};
137 bool _have_nogood{
false};
140 bool _have_info{
false};
143 bool _have_version{
false};
158 int32_t
alt(
void)
const {
return _alt; }
161 int32_t
kids(
void)
const {
return _kids; }
183 _have_version =
true;
188 int32_t
version(
void)
const {
return _version; }
191 const std::string&
label()
const {
return _label; }
194 const std::string&
nogood(
void)
const {
return _nogood; }
198 const std::string&
info(
void)
const {
return _info; }
205 _have_nogood =
false;
207 _have_version =
false;
226 static void serializeType(std::vector<char>& data,
MsgType f) {
227 data.push_back(static_cast<char>(f));
230 static void serializeField(std::vector<char>& data, Field f) {
231 data.push_back(static_cast<char>(f));
234 static void serialize(std::vector<char>& data, int32_t
i) {
235 data.push_back(static_cast<char>((i & 0xFF000000) >> 24));
236 data.push_back(static_cast<char>((i & 0xFF0000) >> 16));
237 data.push_back(static_cast<char>((i & 0xFF00) >> 8));
238 data.push_back(static_cast<char>((i & 0xFF)));
241 static void serialize(std::vector<char>& data,
NodeStatus s) {
242 data.push_back(static_cast<char>(s));
245 static void serialize(std::vector<char>& data,
const std::string& s) {
246 serialize(data, static_cast<int32_t>(s.size()));
252 static MsgType deserializeMsgType(iter& it) {
253 auto m =
static_cast<MsgType>(*it);
258 static Field deserializeField(iter& it) {
259 auto f =
static_cast<Field
>(*it);
264 static int32_t deserializeInt(iter& it) {
265 auto b1 =
static_cast<uint32_t
>(
reinterpret_cast<uint8_t&
>(*it++));
266 auto b2 =
static_cast<uint32_t
>(
reinterpret_cast<uint8_t&
>(*it++));
267 auto b3 =
static_cast<uint32_t
>(
reinterpret_cast<uint8_t&
>(*it++));
268 auto b4 =
static_cast<uint32_t
>(
reinterpret_cast<uint8_t&
>(*it++));
270 return static_cast<int32_t
>(
b1 << 24 |
b2 << 16 | b3 << 8 | b4);
273 static NodeStatus deserializeStatus(iter& it) {
279 static std::string deserializeString(iter& it) {
281 int32_t
size = deserializeInt(it);
282 result.reserve(static_cast<size_t>(size));
283 for (int32_t i = 0; i <
size; i++) {
292 int32_t alt, int32_t kids,
NodeStatus status) {
327 std::vector<char> data;
328 size_t dataSize = 1 + (msg.
isNode() ? 4 * 8 + 1 : 0) +
332 data.reserve(dataSize);
334 serializeType(data, msg.
type());
338 serialize(data, n_uid.nid);
339 serialize(data, n_uid.rid);
340 serialize(data, n_uid.tid);
343 serialize(data, p_uid.nid);
344 serialize(data, p_uid.rid);
345 serialize(data, p_uid.tid);
347 serialize(data, msg.
alt());
348 serialize(data, msg.
kids());
349 serialize(data, msg.
status());
353 serializeField(data, VERSION);
354 serialize(data, msg.
version());
357 serializeField(data, LABEL);
358 serialize(data, msg.
label());
361 serializeField(data, NOGOOD);
362 serialize(data, msg.
nogood());
365 serializeField(data, INFO);
366 serialize(data, msg.
info());
372 char *end = data +
size;
373 msg.
set_type(deserializeMsgType(data));
375 int32_t nid = deserializeInt(data);
376 int32_t rid = deserializeInt(data);
377 int32_t tid = deserializeInt(data);
381 nid = deserializeInt(data);
382 rid = deserializeInt(data);
383 tid = deserializeInt(data);
387 msg.
set_alt(deserializeInt(data));
394 while (data != end) {
395 MessageMarshalling::Field f = deserializeField(data);
400 msg.
set_label(deserializeString(data));
break;
402 msg.
set_nogood(deserializeString(data));
break;
404 msg.
set_info(deserializeString(data));
break;
void set_kids(int32_t kids)
const std::string & label() const
Message for the CP Profiler.
std::vector< char > serialize(void) const
void unset(void)
Disregard value.
bool valid(const FloatVal &n)
Return whether float n is a valid number.
void set_status(NodeStatus status)
Node representing failure.
void set_version(int32_t v)
NodeStatus status(void) const
Node representing a solution.
void set_parentUID(const NodeUID &p)
Node skipped by backjumping.
MsgType
Types of messages for CP Profiler.
Gecode::FloatVal c(-8, 8)
int p
Number of positive literals for node type.
int n
Number of negative literals for node type.
Gecode::IntArgs i({1, 2, 3, 4})
void makeStart(const std::string &info)
void set(const T &t)
Set value to t.
bool isRestart(void) const
unsigned int size(I &i)
Size of all ranges of range iterator i.
Node representing a branch.
int32_t version(void) const
void set_nogood(const std::string &nogood)
T value_
A value, potentially not initialized.
bool valid(void) const
Check whether value is present.
Post propagator for f(x \diamond_{\mathit{op}} y) \sim_r z \f$ void rel(Home home
void set_type(MsgType type)
const std::string & nogood(void) const
void set_info(const std::string &info)
Message & makeNode(NodeUID node, NodeUID parent, int32_t alt, int32_t kids, NodeStatus status)
bool has_nogood(void) const
void makeRestart(const std::string &info)
bool has_label(void) const
const Message & get_msg(void)
void set_nodeUID(const NodeUID &n)
const std::string & info(void) const
bool has_info(void) const
NodeUID parentUID(void) const
void set_label(const std::string &label)
NodeUID nodeUID(void) const
Gecode toplevel namespace
NodeStatus
Types of nodes for CP Profiler.
void set_alt(int32_t alt)
const T & value(void) const
Access value.
Unique identifier for a node.
void deserialize(char *data, size_t size)
bool has_version(void) const