public Varset Divide(Varset varset) { int length = this.item.Count; Varset n = new Varset(this); Varset d = new Varset(varset); //Console.Write("n: "); //n.Print(); //Console.Write("d: "); //d.Print(); Varset m = new Varset(n.item.Length); m.Set(0, true); Varset q = new Varset(n.item.Count); Varset zero = new Varset(n.item.Count); if (n.Equals(zero)) { return zero; } else if (d.Equals(zero)) { throw new ArgumentException("Zero Division."); } while (d.LessThan(n) || d.Equals(n)) { d = d.LeftShift(1); m = m.LeftShift(1); } Varset one = new Varset(n.item.Length); one.Set(0, true); while (one.LessThan(m)) { d = d.RightShift(1); m = m.RightShift(1); if (d.LessThan(n) || d.Equals(n)) { n = n.Subtract(d); q = q.Or(m); } } q = q.SubVarset(length); n = n.SubVarset(length); //Console.Write("q: "); //q.Print(); //Console.Write("n: "); //n.Print(); return q; }
private void CalculateScoresInternal(int variable, DoubleMap cache) { // calculate initial score Varset empty = new Varset(variableCount + 1); // 注意: c++だと0 double score = scoringFunction.CalculateScore(variable, empty, cache); if (score < 1) { cache[empty.ToULong()] = score; } int prunedCount = 0; for (int layer = 1; layer <= maxParents && !outOfTime; layer++) { // DEBUG Console.WriteLine("layer: " + layer + ", prunedCount: " + prunedCount); Varset variables = new Varset(variableCount + 1); // 注意: c++だと0 for (int i = 0; i < layer; i++) { variables.Set(i, true); } Varset max = new Varset(variableCount); max.Set(variableCount, true); while (variables.LessThan(max) && !outOfTime) { if (!variables.Get(variable)) { score = scoringFunction.CalculateScore(variable, variables, cache); if (score < 0) { cache[variables.ToULong()] = score; } else { prunedCount++; } } variables = variables.NextPermutation(); } if (!outOfTime) { highestCompletedLayer = layer; } } }