Index: kernel/src/internal/graph_base.cpp =================================================================== --- kernel/src/internal/graph_base.cpp (revision 514) +++ kernel/src/internal/graph_base.cpp (working copy) @@ -20,11 +20,11 @@ while (i >= d.edge_keys_.size()) { std::ostringstream oss; oss << d.prefix_ << " edge " << i; - d.edge_keys_.push_back(IntKey(oss.str().c_str())); + d.edge_keys_.push_back(ParticleKey(oss.str().c_str())); } } -static IntKey graph_get_edge_key(unsigned int i, const GraphData &d) +static ParticleKey graph_get_edge_key(unsigned int i, const GraphData &d) { if (i >= d.edge_keys_.size()) graph_add_edge_key(i, d); return d.edge_keys_[i]; @@ -35,16 +35,16 @@ Model *m= a->get_model(); Particle *p= new Particle(); ParticleIndex pi=m->add_particle(p); - p->add_attribute(d.node_keys_[0], a->get_index().get_index()); - p->add_attribute(d.node_keys_[1], b->get_index().get_index()); + p->add_attribute(d.node_keys_[0], a); + p->add_attribute(d.node_keys_[1], b); for (int i=0; i< 2; ++i) { Particle *cp=((i==0)?a:b); int nc= graph_get_number_of_edges(cp, d); - IntKey nm=graph_get_edge_key(nc, d); + ParticleKey nm=graph_get_edge_key(nc, d); if (!cp->has_attribute(nm)) { - cp->add_attribute(nm, p->get_index().get_index()); + cp->add_attribute(nm, p); } else { - cp->set_value(nm, p->get_index().get_index()); + cp->set_value(nm, p); } if (cp->has_attribute(d.num_edges_key_)) { cp->set_value(d.num_edges_key_, nc+1); @@ -70,30 +70,31 @@ IMP_assert(shift==0, "duplicate edges found in graph_base"); shift=-1; } else { - Int v = p[i]->get_value(graph_get_edge_key(j, d)); + Particle* v = p[i]->get_value(graph_get_edge_key(j, d)); p[i]->set_value(graph_get_edge_key(j+shift, d), v); } } - p[i]->set_value(graph_get_edge_key(nc-1, d), -1); + p[i]->set_value(graph_get_edge_key(nc-1, d), NULL); IMP_assert(shift==-1, "no edge found"); IMP_assert(nc > 0, "Too few edges"); p[i]->set_value(d.num_edges_key_, nc-1); } e->set_is_active(false); + e->get_model()->remove_particle(e->get_index()); } Particle* graph_get_edge(Particle* a, int i, const GraphData &d) { - IntKey nm= graph_get_edge_key(i, d); - return a->get_model()->get_particle(ParticleIndex(a->get_value(nm))); + ParticleKey nm= graph_get_edge_key(i, d); + return a->get_value(nm); } Particle* graph_get_neighbor(Particle* a, int i, const GraphData &d) { - IntKey nm= graph_get_edge_key(i, d); - Particle *edge= a->get_model()->get_particle(ParticleIndex(a->get_value(nm))); + ParticleKey nm= graph_get_edge_key(i, d); + Particle *edge= a->get_value(nm); if (graph_get_node(edge, 0, d) == a) { return graph_get_node(edge, 1, d); } else { @@ -115,7 +116,7 @@ Particle* graph_get_node(Particle *a, int i, const GraphData &d) { IMP_assert(i<2, "bad node requested"); - return a->get_model()->get_particle(a->get_value(d.node_keys_[i])); + return a->get_value(d.node_keys_[i]); } bool graph_is_edge(Particle *a, const GraphData &d) Index: kernel/include/IMP/internal/graph_base.h =================================================================== --- kernel/include/IMP/internal/graph_base.h (revision 514) +++ kernel/include/IMP/internal/graph_base.h (working copy) @@ -25,13 +25,13 @@ { GraphData() {} GraphData(const char *prefix): prefix_(prefix) { - node_keys_[0]=IntKey((prefix_+" node 0").c_str()); - node_keys_[1]=IntKey((prefix_+" node 1").c_str()); + node_keys_[0]=ParticleKey((prefix_+" node 0").c_str()); + node_keys_[1]=ParticleKey((prefix_+" node 1").c_str()); num_edges_key_= IntKey((prefix_+" num edges").c_str()); } - IntKey node_keys_[2]; + ParticleKey node_keys_[2]; IntKey num_edges_key_; - mutable std::vector edge_keys_; + mutable std::vector edge_keys_; std::string prefix_; }; Index: kernel/test/decorators/test_bonds.py =================================================================== --- kernel/test/decorators/test_bonds.py (revision 514) +++ kernel/test/decorators/test_bonds.py (working copy) @@ -28,6 +28,8 @@ "Expected not to find a bond") self.assertEqual(da.get_number_of_bonds(), 0, "Expected not to find a bond") + for p in m.get_particles(): + self.assertRaises(ValueError, IMP.BondDecorator.cast, p)