Method: ZDD.mincover

Defined in:
ext/zdd_so/zdd_so.cpp

.mincoverObject

##vsop_print_mincover##



2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
# File 'ext/zdd_so/zdd_so.cpp', line 2928

VALUE vsop_print_mincover( VALUE self){
  Vsop_Ruby* rmod;
  Data_Get_Struct(self,Vsop_Ruby,rmod);

  CtoI *ctoi_fin; 

  auto_ptr<CtoI> auto_p(new CtoI(*rmod->cmod));
  CtoI *ctoitmp = auto_p.get();
  
  *ctoitmp = ctoitmp -> NonZero();
  if(*ctoitmp == CtoI_Null())
  {
    *ctoitmp = 0;
    ctoi_fin = new CtoI(0);
    rb_raise(rb_eRuntimeError,"10Memory overflow");
  }
  if(*ctoitmp == 0){
    ctoi_fin = new CtoI(0);
  }
  else
  {
    ZBDD f = ctoitmp -> GetZBDD();
    if(MinCost(f)==0){
      ctoi_fin = new CtoI(1);
    }
    else
    {
      CtoI ctmp(1);
      while(1)
      {
        int var = f.Top();
        if(var == 0) break;
        ZBDD f0 = f.OffSet(var);
        ZBDD f1 = f.OnSet0(var);
        int c1 = MinCost(f1) + VTable.GetValue(var);
        if(MinCost(f0) > c1)
        {
          f = f1;
          ctmp = ctmp.AffixVar(var);
        }
        else f = f0;
      }
      ctoi_fin = new CtoI(ctmp);
    }
  }
  Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
  rmod_rtn->cmod = ctoi_fin;
  return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
}