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());
        }
    }
Exemple #7
0
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;
}