void collect_relations_from_entity(ObjectInstance& object_instance) { set<string> material_names; for (const auto& kv : object_instance.get_front_material_mappings()) material_names.insert(kv.value()); for (const auto& kv : object_instance.get_back_material_mappings()) material_names.insert(kv.value()); for (const auto& material_name : material_names) { const auto referenced_entity = m_input_binder.find_entity( material_name.c_str(), object_instance.get_parent()); if (referenced_entity.m_entity != nullptr) insert_relation(referenced_entity, object_instance); } { const auto referenced_entity = m_input_binder.find_entity( object_instance.get_object_name(), object_instance.get_parent()); if (referenced_entity.m_entity != nullptr) insert_relation(referenced_entity, object_instance); } }
void collect_relations_from_scene(Scene& scene) { collect_relations_from(scene.colors()); collect_relations_from(scene.textures()); collect_relations_from(scene.texture_instances()); collect_relations_from(scene.shader_groups()); collect_relations_from(scene.assembly_instances()); collect_relations_from(scene.cameras()); Environment* environment = scene.get_environment(); if (environment != nullptr) collect_relations_from_entity(*environment); collect_relations_from(scene.environment_edfs()); collect_relations_from(scene.environment_shaders()); for (auto& assembly : scene.assemblies()) collect_relations_from_assembly(assembly); // Top-level assembly instances are implicitly referenced by the scene. for (auto& assembly_instance : scene.assembly_instances()) { const InputBinder::ReferencedEntity referenced_entity(scene.assembly_instances(), &assembly_instance); insert_relation(referenced_entity, scene); } }
void collect_relations_from_entity(TextureInstance& texture_instance) { const auto referenced_entity = m_input_binder.find_entity( texture_instance.get_texture_name(), texture_instance.get_parent()); if (referenced_entity.m_entity != nullptr) insert_relation(referenced_entity, texture_instance); }
void collect_relations_from_entity(AssemblyInstance& assembly_instance) { const auto referenced_entity = m_input_binder.find_entity( assembly_instance.get_assembly_name(), assembly_instance.get_parent()); if (referenced_entity.m_entity != nullptr) insert_relation(referenced_entity, assembly_instance); }
void collect_relations_from_assembly(Assembly& assembly) { collect_relations_from(assembly.colors()); collect_relations_from(assembly.textures()); collect_relations_from(assembly.texture_instances()); collect_relations_from(assembly.shader_groups()); collect_relations_from(assembly.assembly_instances()); collect_relations_from(assembly.bsdfs()); collect_relations_from(assembly.bssrdfs()); collect_relations_from(assembly.edfs()); collect_relations_from(assembly.surface_shaders()); collect_relations_from(assembly.materials()); collect_relations_from(assembly.lights()); collect_relations_from(assembly.objects()); collect_relations_from(assembly.object_instances()); collect_relations_from(assembly.volumes()); for (auto& child_assembly : assembly.assemblies()) collect_relations_from_assembly(child_assembly); // Lights are implicitly referenced by their parent assembly. for (auto& light : assembly.lights()) { const InputBinder::ReferencedEntity referenced_entity(assembly.lights(), &light); insert_relation(referenced_entity, assembly); } // Object instances are implicitly referenced by their parent assembly. for (auto& object_instance : assembly.object_instances()) { const InputBinder::ReferencedEntity referenced_entity(assembly.object_instances(), &object_instance); insert_relation(referenced_entity, assembly); } // Assembly instances are implicitly referenced by their parent assembly. for (auto& assembly_instance : assembly.assembly_instances()) { const InputBinder::ReferencedEntity referenced_entity(assembly.assembly_instances(), &assembly_instance); insert_relation(referenced_entity, assembly); } }
void collect_relations_from_entity(ConnectableEntity& entity) { for (const auto& input : entity.get_inputs()) { const auto referenced_entity = m_input_binder.find_referenced_entity(entity, input); if (referenced_entity.m_entity != nullptr) insert_relation(referenced_entity, entity, input.name()); } }
unsigned long combine_large_primes(QS_t * qs_inf, linalg_t * la_inf, poly_t * poly_inf, FILE *COMB, mpz_t factor) { char new_relation[MPQS_STRING_LENGTH], buf[MPQS_STRING_LENGTH]; mpqs_lp_entry e[2]; /* we'll use the two alternatingly */ unsigned long *ei; long ei_size = qs_inf->num_primes; mpz_t * N = &qs_inf->mpz_n; long old_q; mpz_t inv_q, Y1, Y2, new_Y, new_Y1; mpz_init(inv_q); mpz_init(Y1); mpz_init(Y2); mpz_init(new_Y); mpz_init(new_Y1); long i, l, c = 0; unsigned long newrels = 0; if (!fgets(buf, MPQS_STRING_LENGTH, COMB)) return 0; /* should not happen */ ei = (unsigned long *) malloc(sizeof(unsigned long)*ei_size); /* put first lp relation in row 0 of e */ set_lp_entry(&e[0], buf); i = 1; /* second relation will go into row 1 */ old_q = e[0].q; mpz_set_ui(inv_q, old_q); while (!mpz_invert(inv_q, inv_q, *N)) /* can happen */ { /* We have found a factor. It could be N when N is quite small; or we might just have found a divisor by sheer luck. */ mpz_gcd_ui(inv_q, *N, old_q); if (!mpz_cmp(inv_q, *N)) /* pity */ { if (!fgets(buf, MPQS_STRING_LENGTH, COMB)) { return 0; } set_lp_entry(&e[0], buf); old_q = e[0].q; mpz_set_ui(inv_q, old_q); continue; } mpz_set(factor, inv_q); free(ei); mpz_clear(inv_q); mpz_clear(Y1); mpz_clear(Y2); mpz_clear(new_Y); mpz_clear(new_Y1); return c; } gmp_sscanf(e[0].Y, "%Zd", Y1); while (fgets(buf, MPQS_STRING_LENGTH, COMB)) { set_lp_entry(&e[i], buf); if (e[i].q != old_q) { /* switch to combining a new bunch, swapping the rows */ old_q = e[i].q; mpz_set_ui(inv_q, old_q); while (!mpz_invert(inv_q, inv_q, *N)) /* can happen */ { mpz_gcd_ui(inv_q, *N, old_q); if (!mpz_cmp(inv_q, *N)) /* pity */ { old_q = -1; /* sentinel */ continue; /* discard this combination */ } mpz_set(factor, inv_q); free(ei); mpz_clear(inv_q); mpz_clear(Y1); mpz_clear(Y2); mpz_clear(new_Y); mpz_clear(new_Y1); return c; } gmp_sscanf(e[i].Y, "%Zd", Y1); i = 1 - i; /* subsequent relations go to other row */ continue; } /* count and combine the two we've got, and continue in the same row */ memset((void *)ei, 0, ei_size * sizeof(long)); set_exponents(ei, e[0].E); set_exponents(ei, e[1].E); gmp_sscanf(e[i].Y, "%Zd", Y2); if (mpz_cmpabs(Y1,Y2)!=0) { unsigned long * small = la_inf->small; fac_t * factor = la_inf->factor; unsigned long num_factors = 0; unsigned long small_primes = qs_inf->small_primes; unsigned long num_primes = qs_inf->num_primes; c++; mpz_mul(new_Y, Y1, Y2); mpz_mul(new_Y, new_Y, inv_q); mpz_mod(new_Y, new_Y, *N); mpz_sub(new_Y1, *N, new_Y); if (mpz_cmpabs(new_Y1, new_Y) < 0) mpz_set(new_Y, new_Y1); for (l = 0; l < small_primes; l++) { small[l] = ei[l]; } for (l = small_primes; l < num_primes; l++) { if (ei[l]) { factor[num_factors].ind = l; factor[num_factors].exp = ei[l]; num_factors++; } } la_inf->num_factors = num_factors; newrels += insert_relation(qs_inf, la_inf, poly_inf, new_Y); } } /* while */ free(ei); mpz_clear(inv_q); mpz_clear(Y1); mpz_clear(Y2); mpz_clear(new_Y); mpz_clear(new_Y1); return newrels; }