inline id_t succ<id_t>(id_t id) { if (id.x == std::numeric_limits<int64_t>::max()) { if (id.y == std::numeric_limits<int64_t>::max()) throw std::out_of_range("das::id_t overflowed."); return id_t(zero<int64_t>(), succ(id.y)); } return id_t(succ(id.x), id.y); }
void operator()(R &r, boost::uint8_t value) { switch(this->state) { case state_t::none: switch(value) { case dle: this->state = state_t::dle; break; default: r(data_t(value)); break; } break; case state_t::dle: this->state = state_t::none; switch(value) { case dle: r(data_t(dle)); break; case etx: r(end_t()); break; default: r(id_t(value)); break; } break; } }
file_t::file_t(char const *name, string_t const &header) : ref_cnt(0), fd(-1), used(false), id() { if(config::check) return; fd = ::open(name, O_WRONLY | O_APPEND | O_CREAT, 0644); if(fd < 0) throw exception_sys_t(log::error, errno, "open (%s): %m", name); fd_guard_t guard(fd); id = id_t(fd, used); if(!id) throw exception_sys_t(log::error, errno, "fstat (%s): %m", name); if(::flock(fd, LOCK_SH | LOCK_NB) < 0) throw exception_sys_t(log::error, errno, "flock (%s): %m", name); if(header) { if(::write(fd, header.ptr(), header.size()) < 0) throw exception_sys_t(log::error, errno, "write (%s): %m", name); } guard.relax(); }
/** * Performs inference by calibrating the junction tree. */ void calibrate() { mpp_traversal(jt_, id_t(), [&](const edge_type& e) { F product = jt_[e.source()]; for (edge_type in : jt_.in_edges(e.source())) { if (in.source() != e.target()) { product *= jt_[in](in); } } jt_[e](e) = product.marginal(jt_.separator(e)); }); calibrated_ = true; }
// default_edge_prop - declare default properties for any future new edges void default_edge_prop(id_t const& key, id_t const& value) { edges_t& edges_ = subgraph_depth == 0 ? edges : subgraph.edges(); props_t& edge_props_ = subgraph_depth == 0 ? default_edge_props : subgraph_edge_props[subgraph.name()]; // add this to the list of default edge properties. edge_props_[key] = value; // for each edge, set its property to be empty string // set the dynamic property map value for(edges_t::iterator i = edges_.begin(); i != edges_.end(); ++i) if(edge_map[*i].find(key) == edge_map[*i].end()) set_edge_property(*i,key,id_t()); }
void handler_t::check() { file_t *tmp = NULL; bool skip_file_check = false; { spinlock_guard_t guard(spinlock); if(old) { if(old->ref_cnt) skip_file_check = true; else { tmp = old; old = NULL; } } } if(tmp) { delete tmp; tmp = NULL; } if(skip_file_check) return; struct stat st; if(::stat(filename_z.ptr(), &st) == 0) { if(id_t(st) == current->id) // Don't need lock return; } else { if(errno != ENOENT) log_error("stat: (%s) %m", filename_z.ptr()); } tmp = new file_t(filename_z.ptr(), header); { spinlock_guard_t guard(spinlock); if(!old) { old = current; current = tmp; tmp = NULL; } if(!old->ref_cnt) { tmp = old; old = NULL; } } if(tmp) { delete tmp; tmp = NULL; } }
// default_node_prop - declare default properties for any future new nodes void default_node_prop(id_t const& key, id_t const& value) { nodes_t& nodes_ = subgraph_depth == 0 ? nodes : subgraph.nodes(); props_t& node_props_ = subgraph_depth == 0 ? default_node_props : subgraph_node_props[subgraph.name()]; // add this to the selected list of default node properties. node_props_[key] = value; // for each node, set its property to default-constructed value // if it hasn't been set already. // set the dynamic property map value for(nodes_t::iterator i = nodes_.begin(); i != nodes_.end(); ++i) if(node_map[*i].find(key) == node_map[*i].end()) { set_node_property(*i,key,id_t()); } }
static id_t generate() { return id_t(unique_id_t().string()); }
static constexpr id_t invalid() { return id_t(); }