/* Propagates information relating to decontainerization. */ static void decont_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 out_orig, MVMuint16 out_i, MVMuint16 in_orig, MVMuint16 in_i) { MVMSpeshFacts *out_facts = &(g->facts[out_orig][out_i]); MVMSpeshFacts *in_facts = &(g->facts[in_orig][in_i]); /* If we know the original is decontainerized already, just copy its * info. */ MVMint32 in_flags = in_facts->flags; if (in_flags & MVM_SPESH_FACT_DECONTED) copy_facts(tc, g, out_orig, out_i, in_orig, in_i); /* We know the result is decontainerized. */ out_facts->flags |= MVM_SPESH_FACT_DECONTED; /* We may also know the original was containerized, and have some facts * about its contents. */ if (in_flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { out_facts->type = in_facts->decont_type; out_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; } if (in_flags & MVM_SPESH_FACT_DECONT_CONCRETE) out_facts->flags |= MVM_SPESH_FACT_CONCRETE; else if (in_flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) out_facts->flags |= MVM_SPESH_FACT_TYPEOBJ; if (in_flags & (MVM_SPESH_FACT_KNOWN_DECONT_TYPE | MVM_SPESH_FACT_DECONT_CONCRETE | MVM_SPESH_FACT_DECONT_TYPEOBJ)) depend(tc, g, out_facts, in_facts); }
/* Handles object-creating instructions. */ static void create_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 obj_orig, MVMuint16 obj_i, MVMuint16 type_orig, MVMuint16 type_i) { MVMSpeshFacts *type_facts = &(g->facts[type_orig][type_i]); MVMSpeshFacts *obj_facts = &(g->facts[obj_orig][obj_i]); /* The type is carried. */ if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { obj_facts->type = type_facts->type; obj_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; depend(tc, g, obj_facts, type_facts); } /* We know it's a concrete object. */ obj_facts->flags |= MVM_SPESH_FACT_CONCRETE; /* If we know the type object, then we can check to see if * it's a container type. */ if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMObject *type = type_facts->type; if (type && !STABLE(type)->container_spec) obj_facts->flags |= MVM_SPESH_FACT_DECONTED; } }
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { if(numCourses == 0 || prerequisites.size() == 0) return true; vector<int > depend(numCourses, 0); vector<vector<int>> rdepend(numCourses, vector<int>{}); for(auto& item: prerequisites){ int node1 = item.first; int node2 = item.second; depend[node1] ++; rdepend[node2].push_back(node1); } vector<int>::iterator it; while( ( it = find(depend.begin(), depend.end(), 0)) != depend.end() ){ int node = distance(depend.begin(), it); *it = -1; auto& rv = rdepend[node]; for(auto n: rv){ depend[n] --; } } it = find_if(depend.begin(), depend.end(), [](int i ){return i != -1;}); return it == depend.end(); }