]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Document the Alternative, Decision, Decisionset classes
authorMichael Schroeder <mls@suse.de>
Mon, 12 Dec 2022 14:44:54 +0000 (15:44 +0100)
committerMichael Schroeder <mls@suse.de>
Mon, 12 Dec 2022 14:44:54 +0000 (15:44 +0100)
doc/gen/libsolv-bindings.3
doc/libsolv-bindings.txt

index 6d298af74872788815de734df210e01123eb8167..97d16e404d63fed4aa78f08b503445b89b7d549e 100644 (file)
@@ -2,12 +2,12 @@
 .\"     Title: Libsolv-Bindings
 .\"    Author: [see the "Author" section]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 03/02/2022
+.\"      Date: 12/12/2022
 .\"    Manual: LIBSOLV
 .\"    Source: libsolv
 .\"  Language: English
 .\"
-.TH "LIBSOLV\-BINDINGS" "3" "03/02/2022" "libsolv" "LIBSOLV"
+.TH "LIBSOLV\-BINDINGS" "3" "12/12/2022" "libsolv" "LIBSOLV"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -867,7 +867,7 @@ Filter list of solvables by repo priority, architecture and version\&.
 .\}
 .nf
 \fBSolvable *whatcontainsdep(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
-my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatcontainsdep(\fR\fI$keyname\fR\fB,\fR \fI$dep\fR\fB)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatcontainsdep(\fR\fI$keyname\fR\fB,\fR \fI$dep\fR\fB)\fR;
 \fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatcontainsdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
 \fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatcontainsdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
 .fi
@@ -882,7 +882,7 @@ Return all solvables for which keyname contains the dependency\&.
 .\}
 .nf
 \fBSolvable *whatmatchesdep(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
-my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatmatchesdep(\fR\fI$keyname\fR\fB,\fR \fI$sdep\fR\fB)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatmatchesdep(\fR\fI$keyname\fR\fB,\fR \fI$sdep\fR\fB)\fR;
 \fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchesdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
 \fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchesdep(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
 .fi
@@ -897,7 +897,7 @@ Return all solvables that have dependencies in keyname that match the dependency
 .\}
 .nf
 \fBSolvable *whatmatchessolvable(Id\fR \fIkeyname\fR\fB, Solvable\fR \fIsolvable\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
-my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatmatchessolvable(\fR\fI$keyname\fR\fB,\fR \fI$solvable\fR\fB)\fR
+my \fI@solvables\fR \fB=\fR \fI$pool\fR\fB\->whatmatchessolvable(\fR\fI$keyname\fR\fB,\fR \fI$solvable\fR\fB)\fR;
 \fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchessolvable(\fR\fIkeyname\fR\fB,\fR \fIsolvable\fR\fB)\fR
 \fIsolvables\fR \fB=\fR \fIpool\fR\fB\&.whatmatchessolvable(\fR\fIkeyname\fR\fB,\fR \fIsolvable\fR\fB)\fR
 .fi
@@ -2601,7 +2601,7 @@ Generic lookup methods\&. Retrieve data stored for the specific keyname\&. The l
 .RS 4
 .\}
 .nf
-\fBconst char *lookup_location(unsigned int *\fR\fIOUTPUT\fR\fB)\fR;
+\fBconst char *lookup_location(unsigned int *\fR\fIOUTPUT\fR\fB)\fR
 my \fB(\fR\fI$location\fR\fB,\fR \fI$mediano\fR\fB) =\fR \fI$solvable\fR\fB\->lookup_location()\fR;
 \fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR
 \fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_location()\fR
@@ -2616,7 +2616,7 @@ Return a tuple containing the on\-media location and an optional media number fo
 .RS 4
 .\}
 .nf
-\fBconst char *lookup_sourcepkg()\fR;
+\fBconst char *lookup_sourcepkg()\fR
 my \fI$sourcepkg\fR \fB=\fR \fI$solvable\fR\fB\->lookup_sourcepkg()\fR;
 \fIsourcepkg\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_sourcepkg()\fR
 \fIsourcepkg\fR \fB=\fR \fIsolvable\fR\fB\&.lookup_sourcepkg()\fR
@@ -2658,7 +2658,7 @@ Iterate over the matching data elements\&. See the Dataiterator class for more i
 .RS 4
 .\}
 .nf
-\fBvoid add_deparray(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR;
+\fBvoid add_deparray(Id\fR \fIkeyname\fR\fB, DepId\fR \fIdep\fR\fB, Id\fR \fImarker\fR \fB= \-1)\fR
 \fI$solvable\fR\fB\->add_deparray(\fR\fI$keyname\fR\fB,\fR \fI$dep\fR\fB)\fR;
 \fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
 \fIsolvable\fR\fB\&.add_deparray(\fR\fIkeyname\fR\fB,\fR \fIdep\fR\fB)\fR
@@ -2673,7 +2673,7 @@ Add a new dependency to the attributes stored in keyname\&.
 .RS 4
 .\}
 .nf
-\fBvoid unset(Id\fR \fIkeyname\fR\fB)\fR;
+\fBvoid unset(Id\fR \fIkeyname\fR\fB)\fR
 \fI$solvable\fR\fB\->unset(\fR\fI$keyname\fR\fB)\fR;
 \fIsolvable\fR\fB\&.unset(\fR\fIkeyname\fR\fB)\fR
 \fIsolvable\fR\fB\&.unset(\fR\fIkeyname\fR\fB)\fR
@@ -2688,7 +2688,7 @@ Delete data stored for the specific keyname\&.
 .RS 4
 .\}
 .nf
-\fBbool installable()\fR;
+\fBbool installable()\fR
 \fI$solvable\fR\fB\->installable()\fR
 \fIsolvable\fR\fB\&.installable()\fR
 \fIsolvable\fR\fB\&.installable?\fR
@@ -2703,7 +2703,7 @@ Return true if the solvable is installable on the system\&. Solvables are not in
 .RS 4
 .\}
 .nf
-\fBbool isinstalled()\fR;
+\fBbool isinstalled()\fR
 \fI$solvable\fR\fB\->isinstalled()\fR
 \fIsolvable\fR\fB\&.isinstalled()\fR
 \fIsolvable\fR\fB\&.isinstalled?\fR
@@ -3132,7 +3132,7 @@ The value in binary form, useful for checksums and other data that cannot be rep
 .RS 4
 .\}
 .nf
-\fBDatapos pos()\fR;
+\fBDatapos pos()\fR
 my \fI$pos\fR \fB=\fR \fI$d\fR\fB\->pos()\fR;
 \fIpos\fR \fB=\fR \fId\fR\fB\&.pos()\fR
 \fIpos\fR \fB=\fR \fId\fR\fB\&.pos()\fR
@@ -3147,7 +3147,7 @@ The position object of the current match\&. It can be used to do sub\-searches s
 .RS 4
 .\}
 .nf
-\fBDatapos parentpos()\fR;
+\fBDatapos parentpos()\fR
 my \fI$pos\fR \fB=\fR \fI$d\fR\fB\->parentpos()\fR;
 \fIpos\fR \fB=\fR \fId\fR\fB\&.parentpos()\fR
 \fIpos\fR \fB=\fR \fId\fR\fB\&.parentpos()\fR
@@ -3764,7 +3764,7 @@ Return the set of solvables of the job as an array of Solvable objects\&.
 .RS 4
 .\}
 .nf
-\fBbool isemptyupdate()\fR;
+\fBbool isemptyupdate()\fR
 \fI$job\fR\fB\->isemptyupdate()\fR
 \fIjob\fR\fB\&.isemptyupdate()\fR
 \fIjob\fR\fB\&.isemptyupdate?\fR
@@ -4049,6 +4049,21 @@ To fulfill the dependencies two packages need to be installed, but one of the pa
 To fulfill the dependencies a package needs to be installed that is obsoleted by an installed package\&. See the POOL_FLAG_NOINSTALLEDOBSOLETES flag\&.
 .RE
 .PP
+\fBSOLVER_RULE_PKG_RECOMMENDS\fR
+.RS 4
+The package contains a recommended dependency\&.
+.RE
+.PP
+\fBSOLVER_RULE_PKG_SUPPLEMENTS\fR
+.RS 4
+The package contains a dependency to specify it supplements another package\&.
+.RE
+.PP
+\fBSOLVER_RULE_PKG_CONSTRAINS\fR
+.RS 4
+The package contains a constraint against some other package (disttype conda)\&.
+.RE
+.PP
 \fBSOLVER_RULE_JOB_NOTHING_PROVIDES_DEP\fR
 .RS 4
 The user asked for installation of a package providing a specific dependency, but no available package provides it\&.
@@ -4204,6 +4219,16 @@ This is a special case of SOLVER_REASON_WEAKDEP\&.
 .RS 4
 This is a special case of SOLVER_REASON_WEAKDEP\&.
 .RE
+.PP
+\fBSOLVER_REASON_UNSOLVABLE\fR
+.RS 4
+This is a special case where a rule cannot be fulfilled\&.
+.RE
+.PP
+\fBSOLVER_REASON_PREMISE\fR
+.RS 4
+This is a special case for the premises of learnt rules\&.
+.RE
 .SS "ATTRIBUTES"
 .sp
 .if n \{\
@@ -4299,7 +4324,7 @@ Return the reason why a specific solvable was installed or erased\&. For most of
 .RS 4
 .\}
 .nf
-\fBSolvable *get_recommended(bool\fR \fInoselected\fR\fB=0)\fR;
+\fBSolvable *get_recommended(bool\fR \fInoselected\fR\fB=0)\fR
 my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_recommended()\fR;
 \fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_recommended()\fR
 \fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_recommended()\fR
@@ -4314,7 +4339,7 @@ Return all solvables that are recommended by the solver run result\&. This inclu
 .RS 4
 .\}
 .nf
-\fBSolvable *get_suggested(bool\fR \fInoselected\fR\fB=0)\fR;
+\fBSolvable *get_suggested(bool\fR \fInoselected\fR\fB=0)\fR
 my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_suggested()\fR;
 \fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_suggested()\fR
 \fIsolvables\fR \fB=\fR \fIsolver\fR\fB\&.get_suggested()\fR
@@ -4324,6 +4349,51 @@ my \fI@solvables\fR \fB=\fR \fI$solver\fR\fB\->get_suggested()\fR;
 .\}
 .sp
 Return all solvables that are suggested by the solver run result\&. This includes solvables included in the result, set noselected if you want to filter those\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecision *get_decisionlist(Solvable *\fR\fIs\fR\fB)\fR
+my \fI@decisions\fR \fB=\fR \fI$solver\fR\fB\->get_decisionlist(\fR\fI$solvable\fR\fB)\fR;
+\fIdecisions\fR \fB=\fR \fIsolver\fR\fB\&.get_decisionlist(\fR\fIsolvable\fR\fB)\fR
+\fIdecisions\fR \fB=\fR \fIsolver\fR\fB\&.get_decisionlist(\fR\fIsolvable\fR\fB)\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of decisions that caused the specific solvable to be installed or erased\&. This is usually more useful than the describe_decision() method, as it returns every involved decision instead of just a single one\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBAlternative *alternatives()\fR
+my \fI@alternatives\fR \fB=\fR \fI$solver\fR\fB\->alternatives()\fR;
+\fIalternatives\fR \fB=\fR \fIsolver\fR\fB\&.alternatives()\fR
+\fIalternatives\fR \fB=\fR \fIsolver\fR\fB\&.alternatives()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all alternatives recorded in the solver run\&. See the Alternative class for more information\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint alternatives_count()\fR
+my \fI$cnt\fR \fB=\fR \fI$solver\fR\fB\->alternatives_count()\fR;
+\fIcnt\fR \fB=\fR \fIsolver\fR\fB\&.alternatives_count()\fR
+\fIcnt\fR \fB=\fR \fIsolver\fR\fB\&.alternatives_count()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return the number of alternatives without creating alternative objects\&.
 .SH "THE PROBLEM CLASS"
 .sp
 Problems are the way of the solver to interact with the user\&. You can simply list all problems and terminate your program, but a better way is to present solutions to the user and let him pick the ones he likes\&.
@@ -4394,6 +4464,51 @@ Return all rules responsible for the problem\&. The returned set of rules contai
 .RS 4
 .\}
 .nf
+\fBDecision *get_decisionlist()\fR
+my \fI@decisions\fR \fB=\fR \fI$problem\fR\fB\->get_decisionlist()\fR;
+\fIdecisions\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionlist()\fR
+\fIdecisions\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of decisions prooving the problem\&. This is somewhat similar to the findallproblemrules(), but the output is in an order that makes it easier to understand why the solver could not find a solution\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecisionset *get_decisionsetlist()\fR
+my \fI@decisionsets\fR \fB=\fR \fI$problem\fR\fB\->get_decisionsetlist()\fR;
+\fIdecisionsets\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionsetlist()\fR
+\fIdecisionsets\fR \fB=\fR \fIproblem\fR\fB\&.get_decisionsetlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Like the get_decisionlist() method, but the decisions are merged into individual sets\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule *get_learnt()\fR
+my \fI@learnt\fR \fB=\fR \fI$problem\fR\fB\->get_learnt()\fR;
+\fIlearnt\fR \fB=\fR \fIproblem\fR\fB\&.get_learnt()\fR
+\fIlearnt\fR \fB=\fR \fIproblem\fR\fB\&.get_lerant()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of learnt rules that are part of the problem proof\&. This is useful for presenting a complete proof to the user\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fBSolution *solutions()\fR
 my \fI@solutions\fR \fB=\fR \fI$problem\fR\fB\->solutions()\fR;
 \fIsolutions\fR \fB=\fR \fIproblem\fR\fB\&.solutions()\fR
@@ -4519,6 +4634,51 @@ As the same dependency rule can get created because of multiple dependencies, on
 .RS 4
 .\}
 .nf
+\fBDecision *get_decisionlist()\fR
+my \fI@decisions\fR \fB=\fR \fI$rule\fR\fB\->get_decisionlist()\fR;
+\fIdecisions\fR \fB=\fR \fIrule\fR\fB\&.get_decisionlist()\fR
+\fIdecisions\fR \fB=\fR \fIrule\fR\fB\&.get_decisionlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of decisions prooving a learnt rule\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecision *get_decisionsetlist()\fR
+my \fI@decisionsets\fR \fB=\fR \fI$rule\fR\fB\->get_decisionsetlist()\fR;
+\fIdecisionsets\fR \fB=\fR \fIrule\fR\fB\&.get_decisionsetlist()\fR
+\fIdecisionsets\fR \fB=\fR \fIrule\fR\fB\&.get_decisionsetlist()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Like the get_decisionlist() method, but the decisions are merged into individual sets\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule *get_learnt()\fR
+my \fI@learnt\fR \fB=\fR \fI$rule\fR\fB\->get_learnt()\fR;
+\fIlearnt\fR \fB=\fR \fIrule\fR\fB\&.get_learnt()\fR
+\fIlearnt\fR \fB=\fR \fIrule\fR\fB\&.get_lerant()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a list of learnt rules that are part of the learnt rule proof\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
 \fB<equality>\fR
 \fBif (\fR\fI$rule1\fR \fB==\fR \fI$rule2\fR\fB)\fR
 \fBif\fR \fIrule1\fR \fB==\fR \fIrule2\fR\fB:\fR
@@ -4584,7 +4744,7 @@ The dependency leading to the creation of the rule\&.
 .\}
 .nf
 \fBDep *dep_id;\fR                            /* read only */
-\fI$ruleinfo\fR\fB\->{\*(Aqdep_id\*(Aq}\fR
+\fI$ruleinfo\fR\fB\->{\fR\fIdep_id\fR\fB}\fR
 \fIruleinfo\fR\fB\&.dep_id\fR
 \fIruleinfo\fR\fB\&.dep_id\fR
 .fi
@@ -4622,7 +4782,7 @@ The involved Solvable, e\&.g\&. the one containing the dependency\&.
 .RE
 .\}
 .sp
-The other involved Solvable (if any), e\&.g\&. the one containing providing the dependency for conflicts\&.
+The other involved Solvable (if any), e\&.g\&. the one providing the dependency\&.
 .sp
 .if n \{\
 .RS 4
@@ -4638,6 +4798,21 @@ my \fI$str\fR \fB=\fR \fI$ruleinfo\fR\fB\->problemstr()\fR;
 .\}
 .sp
 A string describing the ruleinfo from a problem perspective\&. This probably only makes sense if the rule is part of a problem\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$ruleinfo\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIruleinfo\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIruleinfo\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+A string describing the ruleinfo, i\&.e\&. the reason why the corresponding rule has been created\&.
 .SH "THE SOLUTION CLASS"
 .sp
 A solution solves one specific problem\&. It consists of multiple solution elements that all need to be executed\&.
@@ -5076,7 +5251,7 @@ Back pointer to pool\&.
 .RS 4
 .\}
 .nf
-\fBbool isempty()\fR;
+\fBbool isempty()\fR
 \fI$trans\fR\fB\->isempty()\fR
 \fItrans\fR\fB\&.isempty()\fR
 \fItrans\fR\fB\&.isempty?\fR
@@ -5091,7 +5266,7 @@ Returns true if the transaction does not do anything, i\&.e\&. has no elements\&
 .RS 4
 .\}
 .nf
-\fBSolvable *newsolvables()\fR;
+\fBSolvable *newsolvables()\fR
 my \fI@newsolvables\fR \fB=\fR \fI$trans\fR\fB\->newsolvables()\fR;
 \fInewsolvables\fR \fB=\fR \fItrans\fR\fB\&.newsolvables()\fR
 \fInewsolvables\fR \fB=\fR \fItrans\fR\fB\&.newsolvables()\fR
@@ -5106,7 +5281,7 @@ Return all packages that are to be installed by the transaction\&. These are the
 .RS 4
 .\}
 .nf
-\fBSolvable *keptsolvables()\fR;
+\fBSolvable *keptsolvables()\fR
 my \fI@keptsolvables\fR \fB=\fR \fI$trans\fR\fB\->keptsolvables()\fR;
 \fIkeptsolvables\fR \fB=\fR \fItrans\fR\fB\&.keptsolvables()\fR
 \fIkeptsolvables\fR \fB=\fR \fItrans\fR\fB\&.keptsolvables()\fR
@@ -5121,7 +5296,7 @@ Return all installed packages that the transaction will keep installed\&.
 .RS 4
 .\}
 .nf
-\fBSolvable *steps()\fR;
+\fBSolvable *steps()\fR
 my \fI@steps\fR \fB=\fR \fI$trans\fR\fB\->steps()\fR;
 \fIsteps\fR \fB=\fR \fItrans\fR\fB\&.steps()\fR
 \fIsteps\fR \fB=\fR \fItrans\fR\fB\&.steps()\fR
@@ -5166,7 +5341,7 @@ Group the transaction elements into classes so that they can be displayed in a s
 .RS 4
 .\}
 .nf
-\fBSolvable othersolvable(Solvable *\fR\fIsolvable\fR\fB)\fR;
+\fBSolvable othersolvable(Solvable *\fR\fIsolvable\fR\fB)\fR
 my \fI$other\fR \fB=\fR \fI$trans\fR\fB\->othersolvable(\fR\fI$solvable\fR\fB)\fR;
 \fIother\fR \fB=\fR \fItrans\fR\fB\&.othersolvable(\fR\fIsolvable\fR\fB)\fR
 \fIother\fR \fB=\fR \fItrans\fR\fB\&.othersolvable(\fR\fIsolvable\fR\fB)\fR
@@ -5185,7 +5360,7 @@ Thus, the \(lqother\(rq solvable is normally the package that is also shown for
 .RS 4
 .\}
 .nf
-\fBSolvable *allothersolvables(Solvable *\fR\fIsolvable\fR\fB)\fR;
+\fBSolvable *allothersolvables(Solvable *\fR\fIsolvable\fR\fB)\fR
 my \fI@others\fR \fB=\fR \fI$trans\fR\fB\->allothersolvables(\fR\fI$solvable\fR\fB)\fR;
 \fIothers\fR \fB=\fR \fItrans\fR\fB\&.allothersolvables(\fR\fIsolvable\fR\fB)\fR
 \fIothers\fR \fB=\fR \fItrans\fR\fB\&.allothersolvables(\fR\fIsolvable\fR\fB)\fR
@@ -5200,7 +5375,7 @@ For installed packages, returns all of the packages that replace us\&. For to be
 .RS 4
 .\}
 .nf
-\fBlong long calc_installsizechange()\fR;
+\fBlong long calc_installsizechange()\fR
 my \fI$change\fR \fB=\fR \fI$trans\fR\fB\->calc_installsizechange()\fR;
 \fIchange\fR \fB=\fR \fItrans\fR\fB\&.calc_installsizechange()\fR
 \fIchange\fR \fB=\fR \fItrans\fR\fB\&.calc_installsizechange()\fR
@@ -5215,7 +5390,7 @@ Return the size change of the installed system in kilobytes (kibibytes)\&.
 .RS 4
 .\}
 .nf
-\fBvoid order(int\fR \fIflags\fR \fB= 0)\fR;
+\fBvoid order(int\fR \fIflags\fR \fB= 0)\fR
 \fI$trans\fR\fB\->order()\fR;
 \fItrans\fR\fB\&.order()\fR
 \fItrans\fR\fB\&.order()\fR
@@ -5649,7 +5824,7 @@ Return file file descriptor of the file\&. If the file is not open, \-1 is retur
 .\}
 .nf
 \fBvoid cloexec(bool\fR \fIstate\fR\fB)\fR
-\fI$file\fR\fB\->cloexec(\fR\fI$state\fR\fB)\fR
+\fI$file\fR\fB\->cloexec(\fR\fI$state\fR\fB)\fR;
 \fIfile\fR\fB\&.cloexec(\fR\fIstate\fR\fB)\fR
 \fIfile\fR\fB\&.cloexec(\fR\fIstate\fR\fB)\fR
 .fi
@@ -5743,7 +5918,7 @@ The id of the repodata area\&. Repodata ids of different repositories overlap\&.
 .RS 4
 .\}
 .nf
-\fBinternalize()\fR;
+\fBinternalize()\fR
 \fI$data\fR\fB\->internalize()\fR;
 \fIdata\fR\fB\&.internalize()\fR
 \fIdata\fR\fB\&.internalize()\fR
@@ -5758,7 +5933,7 @@ Internalize newly added data\&. The lookup functions will only see the new data
 .RS 4
 .\}
 .nf
-\fBbool write(FILE *\fR\fIfp\fR\fB)\fR;
+\fBbool write(FILE *\fR\fIfp\fR\fB)\fR
 \fI$data\fR\fB\->write(\fR\fI$fp\fR\fB)\fR;
 \fIdata\fR\fB\&.write(\fR\fIfp\fR\fB)\fR
 \fIdata\fR\fB\&.write(\fR\fIfp\fR\fB)\fR
@@ -5802,7 +5977,7 @@ Convert a string (directory) into an Id and back\&. If the string is currently n
 .\}
 .nf
 \fBvoid add_dirstr(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fIdir\fR\fB, const char *\fR\fIstr\fR\fB)\fR
-\fI$data\fR\fB\->add_dirstr(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$dir\fR\fB,\fR \fI$string\fR\fB)\fR
+\fI$data\fR\fB\->add_dirstr(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$dir\fR\fB,\fR \fI$string\fR\fB)\fR;
 \fIdata\fR\fB\&.add_dirstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIdir\fR\fB,\fR \fIstring\fR\fB)\fR
 \fIdata\fR\fB\&.add_dirstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIdir\fR\fB,\fR \fIstring\fR\fB)\fR
 .fi
@@ -5816,7 +5991,7 @@ Add a file path consisting of a dirname Id and a basename string\&.
 .RS 4
 .\}
 .nf
-\fBbool add_solv(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR;
+\fBbool add_solv(FILE *\fR\fIfp\fR\fB, int\fR \fIflags\fR \fB= 0)\fR
 \fI$data\fR\fB\->add_solv(\fR\fI$fp\fR\fB)\fR;
 \fIdata\fR\fB\&.add_solv(\fR\fIfp\fR\fB)\fR
 \fIdata\fR\fB\&.add_solv(\fR\fIfp\fR\fB)\fR
@@ -5831,8 +6006,8 @@ Replace a stub repodata object with the data from a solv file\&. This method aut
 .RS 4
 .\}
 .nf
-\fBvoid create_stubs()\fR;
-\fI$data\fR\fB\->create_stubs()\fR
+\fBvoid create_stubs()\fR
+\fI$data\fR\fB\->create_stubs()\fR;
 \fIdata\fR\fB\&.create_stubs()\fR
 \fIdata\fR\fB\&.create_stubs()\fR
 .fi
@@ -5846,7 +6021,7 @@ Create stub repodatas from the information stored in the repodata meta area\&.
 .RS 4
 .\}
 .nf
-\fBvoid extend_to_repo()\fR;
+\fBvoid extend_to_repo()\fR
 \fI$data\fR\fB\->extend_to_repo()\fR;
 \fIdata\fR\fB\&.extend_to_repo()\fR
 \fIdata\fR\fB\&.extend_to_repo()\fR
@@ -5958,7 +6133,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_str(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR;
+\fBvoid set_str(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR
 \fI$data\fR\fB\->set_str(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$str\fR\fB)\fR;
 \fIdata\fR\fB\&.set_str(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
 \fIdata\fR\fB\&.set_str(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
@@ -5971,7 +6146,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_id(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR;
+\fBvoid set_id(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR
 \fI$data\fR\fB\->set_id(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$id\fR\fB)\fR;
 \fIdata\fR\fB\&.set_id(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
 \fIdata\fR\fB\&.set_id(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
@@ -5984,7 +6159,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInum\fR\fB)\fR;
+\fBvoid set_num(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, unsigned long long\fR \fInum\fR\fB)\fR
 \fI$data\fR\fB\->set_num(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$num\fR\fB)\fR;
 \fIdata\fR\fB\&.set_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fInum\fR\fB)\fR
 \fIdata\fR\fB\&.set_num(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fInum\fR\fB)\fR
@@ -5997,7 +6172,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_void(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR;
+\fBvoid set_void(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
 \fI$data\fR\fB\->set_void(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
 \fIdata\fR\fB\&.set_void(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
 \fIdata\fR\fB\&.set_void(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
@@ -6010,7 +6185,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_poolstr(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR;
+\fBvoid set_poolstr(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, const char *\fR\fIstr\fR\fB)\fR
 \fI$data\fR\fB\->set_poolstr(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$str\fR\fB)\fR;
 \fIdata\fR\fB\&.set_poolstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
 \fIdata\fR\fB\&.set_poolstr(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIstr\fR\fB)\fR
@@ -6023,7 +6198,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_checksum(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Chksum *\fR\fIchksum\fR\fB)\fR;
+\fBvoid set_checksum(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Chksum *\fR\fIchksum\fR\fB)\fR
 \fI$data\fR\fB\->set_checksum(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$chksum\fR\fB)\fR;
 \fIdata\fR\fB\&.set_checksum(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIchksum\fR\fB)\fR
 \fIdata\fR\fB\&.set_checksum(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIchksum\fR\fB)\fR
@@ -6036,7 +6211,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_sourcepkg(Id\fR \fIsolvid\fR\fB, const char *\fR\fIsourcepkg\fR\fB)\fR;
+\fBvoid set_sourcepkg(Id\fR \fIsolvid\fR\fB, const char *\fR\fIsourcepkg\fR\fB)\fR
 \fI$data\fR\fB\&.set_sourcepkg(\fR\fI$solvid\fR\fB,\fR \fI$sourcepkg\fR\fB)\fR;
 \fIdata\fR\fB\&.set_sourcepkg(\fR\fIsolvid\fR\fB,\fR \fIsourcepkg\fR\fB)\fR
 \fIdata\fR\fB\&.set_sourcepkg(\fR\fIsolvid\fR\fB,\fR \fIsourcepkg\fR\fB)\fR
@@ -6049,7 +6224,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid set_location(Id\fR \fIsolvid\fR\fB, unsigned int\fR \fImediano\fR\fB, const char *\fR\fIlocation\fR\fB)\fR;
+\fBvoid set_location(Id\fR \fIsolvid\fR\fB, unsigned int\fR \fImediano\fR\fB, const char *\fR\fIlocation\fR\fB)\fR
 \fI$data\fR\fB\&.set_location(\fR\fI$solvid\fR\fB,\fR \fI$mediano\fR\fB,\fR \fI$location\fR\fB)\fR;
 \fIdata\fR\fB\&.set_location(\fR\fIsolvid\fR\fB,\fR \fImediano\fR\fB,\fR \fIlocation\fR\fB)\fR
 \fIdata\fR\fB\&.set_location(\fR\fIsolvid\fR\fB,\fR \fImediano\fR\fB,\fR \fIlocation\fR\fB)\fR
@@ -6062,7 +6237,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBvoid add_idarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR;
+\fBvoid add_idarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, DepId\fR \fIid\fR\fB)\fR
 \fI$data\fR\fB\->add_idarray(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$id\fR\fB)\fR;
 \fIdata\fR\fB\&.add_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
 \fIdata\fR\fB\&.add_idarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIid\fR\fB)\fR
@@ -6075,7 +6250,7 @@ Lookup functions\&. Return the data element stored in the specified solvable\&.
 .RS 4
 .\}
 .nf
-\fBId new_handle()\fR;
+\fBId new_handle()\fR
 my \fI$handle\fR \fB=\fR \fI$data\fR\fB\->new_handle()\fR;
 \fIhandle\fR \fB=\fR \fIdata\fR\fB\&.new_handle()\fR
 \fIhandle\fR \fB=\fR \fIdata\fR\fB\&.new_handle()\fR
@@ -6088,7 +6263,7 @@ my \fI$handle\fR \fB=\fR \fI$data\fR\fB\->new_handle()\fR;
 .RS 4
 .\}
 .nf
-\fBvoid add_flexarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fIhandle\fR\fB)\fR;
+\fBvoid add_flexarray(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB, Id\fR \fIhandle\fR\fB)\fR
 \fI$data\fR\fB\->add_flexarray(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB,\fR \fI$handle\fR\fB)\fR;
 \fIdata\fR\fB\&.add_flexarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIhandle\fR\fB)\fR
 \fIdata\fR\fB\&.add_flexarray(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB,\fR \fIhandle\fR\fB)\fR
@@ -6101,7 +6276,7 @@ my \fI$handle\fR \fB=\fR \fI$data\fR\fB\->new_handle()\fR;
 .RS 4
 .\}
 .nf
-\fBvoid unset(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR;
+\fBvoid unset(Id\fR \fIsolvid\fR\fB, Id\fR \fIkeyname\fR\fB)\fR
 \fI$data\fR\fB\->unset(\fR\fI$solvid\fR\fB,\fR \fI$keyname\fR\fB)\fR;
 \fIdata\fR\fB\&.unset(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
 \fIdata\fR\fB\&.unset(\fR\fIsolvid\fR\fB,\fR \fIkeyname\fR\fB)\fR
@@ -6151,7 +6326,7 @@ Create a Dataiterator at the position of the datapos object\&.
 .RS 4
 .\}
 .nf
-\fBconst char *lookup_deltalocation(unsigned int *\fR\fIOUTPUT\fR\fB)\fR;
+\fBconst char *lookup_deltalocation(unsigned int *\fR\fIOUTPUT\fR\fB)\fR
 my \fB(\fR\fI$location\fR\fB,\fR \fI$mediano\fR\fB) =\fR \fI$datapos\fR\fB\->lookup_deltalocation()\fR;
 \fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltalocation()\fR
 \fIlocation\fR\fB,\fR \fImediano\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltalocation()\fR
@@ -6166,7 +6341,7 @@ Return a tuple containing the on\-media location and an optional media number fo
 .RS 4
 .\}
 .nf
-\fBconst char *lookup_deltaseq()\fR;
+\fBconst char *lookup_deltaseq()\fR
 my \fI$seq\fR \fB=\fR \fI$datapos\fR\fB\->lookup_deltaseq()\fR;
 \fIseq\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltaseq()\fR;
 \fIseq\fR \fB=\fR \fIdatapos\fR\fB\&.lookup_deltaseq()\fR;
@@ -6284,6 +6459,457 @@ my \fI$di\fR \fB=\fR \fI$datapos\fR\fB\->Dataiterator(\fR\fI$keyname\fR\fB,\fR \
 .\}
 .sp
 Iterate over the matching data elements\&. See the Dataiterator class for more information\&.
+.SH "THE ALTERNATIVE CLASS"
+.sp
+An Alternative object describes a branch point in the solving process\&. The solver found more than one good way to fulfill a dependency and chose one\&. It recorded the other possibilities in the alternative object so that they can be presented to the user in the case a different solution is preferable\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR                   /* read only */
+\fI$alternative\fR\fB\->{solv}\fR
+\fIalternative\fR\fB\&.solv\fR
+\fIalternative\fR\fB\&.solv\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Back pointer to solver object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId type;\fR                        /* read only */
+\fI$alternative\fR\fB\->{type}\fR
+\fIalternative\fR\fB\&.type\fR
+\fIalternative\fR\fB\&.type\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The type of the alternative\&. Alternatives can be created because of rule fulfillment, because of recommended packages, and because of suggested packages (currently unused)\&. See below for a list of valid types\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule rule;\fR                      /* read only */
+\fI$alternative\fR\fB\->{rule}\fR
+\fIalternative\fR\fB\&.rule\fR
+\fIalternative\fR\fB\&.rule\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The rule that caused the creation of the alternative (SOLVER_ALTERNATIVE_TYPE_RULE)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *dep;\fR                       /* read only */
+\fI$ruleinfo\fR\fB\->{dep}\fR
+\fIruleinfo\fR\fB\&.dep\fR
+\fIruleinfo\fR\fB\&.dep\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The dependency that caused the creation of the alternative (SOLVER_ALTERNATIVE_TYPE_RECOMMENDS)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *depsolvable;\fR               /* read only */
+\fI$ruleinfo\fR\fB\->{depsolvable}\fR
+\fIruleinfo\fR\fB\&.depsolvable\fR
+\fIruleinfo\fR\fB\&.depsolvable\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The package containing the dependency (SOLVER_ALTERNATIVE_TYPE_RECOMMENDS)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable chosen;\fR                /* read only */
+\fI$alternative\fR\fB\->{chosen}\fR
+\fIalternative\fR\fB\&.chosen\fR
+\fIalternative\fR\fB\&.chosen\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The solvable that the solver chose from the alternative\(cqs package set\&.
+.SS "CONSTANTS"
+.PP
+\fBSOLVER_ALTERNATIVE_TYPE_RULE\fR
+.RS 4
+The alternative was created when fulfilling a rule\&.
+.RE
+.PP
+\fBSOLVER_ALTERNATIVE_TYPE_RECOMMENDS\fR
+.RS 4
+The alternative was created when fulfilling a recommends dependency\&.
+.RE
+.PP
+\fBSOLVER_ALTERNATIVE_TYPE_SUGGESTS\fR
+.RS 4
+The alternative was created when fulfilling a suggests dependency\&.
+.RE
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *choices()\fR
+my \fI@choices\fR \fB=\fR \fI$alternative\fR\fB\->choices()\fR;
+\fIchoices\fR \fB=\fR \fIalternative\fR\fB\&.choices\fR
+\fIchoices\fR \fB=\fR \fIalternative\fR\fB\&.choices\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return the set of solvables that the solver could choose from when creating the alternative\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$alternative\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIalternative\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIalternative\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the alternative\&.
+.SH "THE DECISION CLASS"
+.sp
+A decision is created when the solver fulfills dependencies\&. It can be either to install a package to satisfy a dependency or to conflict a dependency because it conflicts with another package or its dependencies cannot be met\&. Most decisions are caused by rule processing, but there are some other types like orphaned package handling or weak dependency handling\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR                   /* read only */
+\fI$decision\fR\fB\->{solv}\fR
+\fIdecision\fR\fB\&.solv\fR
+\fIdecision\fR\fB\&.solv\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Back pointer to solver object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId p;\fR                           /* read only */
+\fI$decision\fR\fB\->{p}\fR
+\fIdecision\fR\fB\&.p\fR
+\fIdecision\fR\fB\&.p\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The decision package id, positive for installs and negative for conflicts\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint reason;\fR                     /* read only */
+\fI$decision\fR\fB\->{reason}\fR
+\fIdecision\fR\fB\&.reason\fR
+\fIdecision\fR\fB\&.reason\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The reason for the decision\&. See the SOLVER_REASON_ constants\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint infoid;\fR                     /* read only */
+\fI$decision\fR\fB\->{infoid}\fR
+\fIdecision\fR\fB\&.infoid\fR
+\fIdecision\fR\fB\&.infoid\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Extra info for the decision\&. This is the rule id for decisions caused by rule fulfillment\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable solvable;\fR              /* read only */
+\fI$decision\fR\fB\->{solvable}\fR
+\fIdecision\fR\fB\&.solvable\fR
+\fIdecision\fR\fB\&.solvable\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The decision package object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRule rule()\fR                     /* read only */
+\fI$decision\fR\fB\->{rule}\fR
+\fIdecision\fR\fB\&.rule\fR
+\fIdecision\fR\fB\&.rule\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The rule object for decisions that where caused by rule fulfilment\&.
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRuleinfo info()\fR
+my \fI$info\fR \fB=\fR \fI$decision\fR\fB\->info()\fR;
+\fIinfo\fR \fB=\fR \fIdecision\fR\fB\&.info()\fR
+\fIinfo\fR \fB=\fR \fIdecision\fR\fB\&.info()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a Ruleinfo object describing the decision\&. Some reasons like SOLVER_REASON_WEAKDEP are not caused by rules, but can be expressed by a Ruleinfo object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBRuleinfo *allinfos()\fR
+my \fI@infos\fR \fB=\fR \fI$decision\fR\fB\->allinfos()\fR;
+\fIinfos\fR \fB=\fR \fIdecision\fR\fB\&.allinfos()\fR
+\fIinfos\fR \fB=\fR \fIdecision\fR\fB\&.allinfos()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Same as info(), but all Ruleinfo objects describing the decision are returned\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *reasonstr()\fR
+my \fIstr\fR \fB=\fR \fI$decision\fR\fB\->reasonstr()\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing why a decision was done (but without the decision itself)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$decison\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIdecision\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the decision (but without the reason)\&.
+.SH "THE DECISIONSET CLASS"
+.sp
+A decisionset consists of multiple decisions of the same reason and type that can be presented to the user as a single action\&.
+.SS "ATTRIBUTES"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolver *solv;\fR                   /* read only */
+\fI$decision\fR\fB\->{solv}\fR
+\fIdecision\fR\fB\&.solv\fR
+\fIdecision\fR\fB\&.solv\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Back pointer to solver object\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBId p;\fR                           /* read only */
+\fI$decision\fR\fB\->{p}\fR
+\fIdecision\fR\fB\&.p\fR
+\fIdecision\fR\fB\&.p\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The package id of the first decision, positive for installs and negative for conflicts\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint reason;\fR                     /* read only */
+\fI$decision\fR\fB\->{reason}\fR
+\fIdecision\fR\fB\&.reason\fR
+\fIdecision\fR\fB\&.reason\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The reason for the decisions in the set\&. See the SOLVER_REASON_ constants\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBint type;\fR                       /* read only */
+\fI$ruleinfo\fR\fB\->{type}\fR
+\fIruleinfo\fR\fB\&.type\fR
+\fIruleinfo\fR\fB\&.type\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The type of the decision info\&. See the constant section of the solver class for the rule type list and the special type list\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *dep;\fR                       /* read only */
+\fI$ruleinfo\fR\fB\->{dep}\fR
+\fIruleinfo\fR\fB\&.dep\fR
+\fIruleinfo\fR\fB\&.dep\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The dependency that caused the decision
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDep *dep_id;\fR                    /* read only */
+\fI$ruleinfo\fR\fB\->{\fR\fIdep_id\fR\fB}\fR
+\fIruleinfo\fR\fB\&.dep_id\fR
+\fIruleinfo\fR\fB\&.dep_id\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+The Id of the dependency that caused the decision\&.
+.SS "METHODS"
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBDecision *decisions()\fR
+my \fI@decisions\fR \fB=\fR \fI$decisionset\fR\fB\->decisions()\fR;
+\fIdecisions\fR \fB=\fR \fIdecisionset\fR\fB\&.decisions()\fR
+\fIdecisions\fR \fB=\fR \fIdecisionset\fR\fB\&.decisions()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all the decisions of the set\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBSolvable *solvables()\fR
+my \fI@pkgs\fR \fB=\fR \fI$decisionset\fR\fB\->solvables()\fR;
+\fIpkgs\fR \fB=\fR \fIdecisionset\fR\fB\&.solvables()\fR
+\fIpkgs\fR \fB=\fR \fIdecisionset\fR\fB\&.solvables()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return all the packages that were decided in the set\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fBconst char *reasonstr()\fR
+my \fIstr\fR \fB=\fR \fI$decision\fR\fB\->reasonstr()\fR;
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.reasonstr()\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing why the decisions were done (but without the decisions themself)\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+\fB<stringification>\fR
+my \fI$str\fR \fB=\fR \fI$decison\fR\fB\->str\fR;
+\fIstr\fR \fB= str(\fR\fIdecision\fR\fB)\fR
+\fIstr\fR \fB=\fR \fIdecision\fR\fB\&.to_s\fR
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+Return a string describing the decisions (but without the reason)\&.
 .SH "AUTHOR"
 .sp
 Michael Schroeder <mls@suse\&.de>
index 5d46c085ab7570b6f22b1df8d2d5aec7f90e1ef3..e1e5a66c3a6adc3ac933ed6b59f581fdf14bf2ea 100644 (file)
@@ -496,21 +496,21 @@ a Dep object or a simple Id as argument.
 Filter list of solvables by repo priority, architecture and version.
 
        Solvable *whatcontainsdep(Id keyname, DepId dep, Id marker = -1)
-       my @solvables = $pool->whatcontainsdep($keyname, $dep)
+       my @solvables = $pool->whatcontainsdep($keyname, $dep);
        solvables = pool.whatcontainsdep(keyname, dep)
        solvables = pool.whatcontainsdep(keyname, dep)
 
 Return all solvables for which keyname contains the dependency.
 
        Solvable *whatmatchesdep(Id keyname, DepId dep, Id marker = -1)
-       my @solvables = $pool->whatmatchesdep($keyname, $sdep)
+       my @solvables = $pool->whatmatchesdep($keyname, $sdep);
        solvables = pool.whatmatchesdep(keyname, dep)
        solvables = pool.whatmatchesdep(keyname, dep)
 
 Return all solvables that have dependencies in keyname that match the dependency.
 
        Solvable *whatmatchessolvable(Id keyname, Solvable solvable, Id marker = -1)
-       my @solvables = $pool->whatmatchessolvable($keyname, $solvable)
+       my @solvables = $pool->whatmatchessolvable($keyname, $solvable);
        solvables = pool.whatmatchessolvable(keyname, solvable)
        solvables = pool.whatmatchessolvable(keyname, solvable)
 
@@ -1449,7 +1449,7 @@ correct marker for the keyname and returns the first part of the
 array, use 1 to select the second part or 0 to retrieve all ids
 including the marker.
 
-       const char *lookup_location(unsigned int *OUTPUT);
+       const char *lookup_location(unsigned int *OUTPUT)
        my ($location, $mediano) = $solvable->lookup_location();
        location, mediano = solvable.lookup_location()
        location, mediano = solvable.lookup_location()
@@ -1458,7 +1458,7 @@ Return a tuple containing the on-media location and an optional
 media number for multi-part repositories (e.g. repositories
 spawning multiple DVDs).
 
-       const char *lookup_sourcepkg();
+       const char *lookup_sourcepkg()
        my $sourcepkg = $solvable->lookup_sourcepkg();
        sourcepkg = solvable.lookup_sourcepkg()
        sourcepkg = solvable.lookup_sourcepkg()
@@ -1477,21 +1477,21 @@ Return a sourcepkg name associated with solvable.
 Iterate over the matching data elements. See the Dataiterator class for more
 information.
 
-       void add_deparray(Id keyname, DepId dep, Id marker = -1);
+       void add_deparray(Id keyname, DepId dep, Id marker = -1)
        $solvable->add_deparray($keyname, $dep);
        solvable.add_deparray(keyname, dep)
        solvable.add_deparray(keyname, dep)
 
 Add a new dependency to the attributes stored in keyname.
 
-       void unset(Id keyname);
+       void unset(Id keyname)
        $solvable->unset($keyname);
        solvable.unset(keyname)
        solvable.unset(keyname)
 
 Delete data stored for the specific keyname.
 
-       bool installable();
+       bool installable()
        $solvable->installable()
        solvable.installable()
        solvable.installable?
@@ -1499,7 +1499,7 @@ Delete data stored for the specific keyname.
 Return true if the solvable is installable on the system. Solvables
 are not installable if the system does not support their architecture.
 
-       bool isinstalled();
+       bool isinstalled()
        $solvable->isinstalled()
        solvable.isinstalled()
        solvable.isinstalled?
@@ -1626,6 +1626,7 @@ one.
 Iterate through the matches. If there is a match, the object
 in d will be of type Datamatch.
 
+
 The Datamatch Class
 -------------------
 Objects of this type will be created for every value matched
@@ -1730,7 +1731,7 @@ that cannot be represented as a string.
 
 === METHODS ===
 
-       Datapos pos();
+       Datapos pos()
        my $pos = $d->pos();
        pos = d.pos()
        pos = d.pos()
@@ -1739,7 +1740,7 @@ The position object of the current match. It can be used to do
 sub-searches starting at the match (if it is of an array type).
 See the Datapos class for more information.
 
-       Datapos parentpos();
+       Datapos parentpos()
        my $pos = $d->parentpos();
        pos = d.parentpos()
        pos = d.parentpos()
@@ -1966,6 +1967,7 @@ Do a matchsolvable operation and combine the result with the current selection.
 
 Return a string describing the selection.
 
+
 The Job Class
 -------------
 Jobs are the way to specify to the dependency solver what to do.
@@ -2172,7 +2174,7 @@ selection part of the ``how'' attribute.
 Return the set of solvables of the job as an array of Solvable
 objects.
 
-       bool isemptyupdate();
+       bool isemptyupdate()
        $job->isemptyupdate()
        job.isemptyupdate()
        job.isemptyupdate?
@@ -2252,6 +2254,7 @@ different architecture. When using the Selection class to create jobs
 the set bits are automatically added, e.g. selecting ``screen.i586'' will
 automatically add SOLVER_SETARCH, and thus no problem will be reported.
 
+
 The Solver Class
 ----------------
 Dependency solving is what this library is about. A solver object is needed
@@ -2468,6 +2471,15 @@ To fulfill the dependencies a package needs to be installed that is
 obsoleted by an installed package. See the POOL_FLAG_NOINSTALLEDOBSOLETES
 flag.
 
+*SOLVER_RULE_PKG_RECOMMENDS*::
+The package contains a recommended dependency.
+
+*SOLVER_RULE_PKG_SUPPLEMENTS*::
+The package contains a dependency to specify it supplements another package.
+
+*SOLVER_RULE_PKG_CONSTRAINS*::
+The package contains a constraint against some other package (disttype conda).
+
 *SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP*::
 The user asked for installation of a package providing a specific
 dependency, but no available package provides it.
@@ -2587,6 +2599,11 @@ This is a special case of SOLVER_REASON_WEAKDEP.
 *SOLVER_REASON_SUPPLEMENTED*::
 This is a special case of SOLVER_REASON_WEAKDEP.
 
+*SOLVER_REASON_UNSOLVABLE*::
+This is a special case where a rule cannot be fulfilled.
+
+*SOLVER_REASON_PREMISE*::
+This is a special case for the premises of learnt rules.
 
 === ATTRIBUTES ===
 
@@ -2639,7 +2656,7 @@ interfaces that show both the job result and the problems.
 Return the reason why a specific solvable was installed or erased. For most of
 the reasons the rule that triggered the decision is also returned.
 
-       Solvable *get_recommended(bool noselected=0);
+       Solvable *get_recommended(bool noselected=0)
        my @solvables = $solver->get_recommended();
        solvables = solver.get_recommended()
        solvables = solver.get_recommended()
@@ -2647,7 +2664,7 @@ the reasons the rule that triggered the decision is also returned.
 Return all solvables that are recommended by the solver run result. This includes
 solvables included in the result, set noselected if you want to filter those.
 
-       Solvable *get_suggested(bool noselected=0);
+       Solvable *get_suggested(bool noselected=0)
        my @solvables = $solver->get_suggested();
        solvables = solver.get_suggested()
        solvables = solver.get_suggested()
@@ -2655,6 +2672,30 @@ solvables included in the result, set noselected if you want to filter those.
 Return all solvables that are suggested by the solver run result. This includes
 solvables included in the result, set noselected if you want to filter those.
 
+       Decision *get_decisionlist(Solvable *s)
+       my @decisions = $solver->get_decisionlist($solvable);
+       decisions = solver.get_decisionlist(solvable)
+       decisions = solver.get_decisionlist(solvable)
+
+Return a list of decisions that caused the specific solvable to be installed or
+erased. This is usually more useful than the describe_decision() method, as it
+returns every involved decision instead of just a single one.
+
+       Alternative *alternatives()
+       my @alternatives = $solver->alternatives();
+       alternatives = solver.alternatives()
+       alternatives = solver.alternatives()
+
+Return all alternatives recorded in the solver run. See the Alternative class
+for more information.
+
+       int alternatives_count()
+       my $cnt = $solver->alternatives_count();
+       cnt = solver.alternatives_count()
+       cnt = solver.alternatives_count()
+
+Return the number of alternatives without creating alternative objects.
+
 
 The Problem Class
 -----------------
@@ -2700,6 +2741,31 @@ all the needed information why there was a problem, but it's hard to present
 them to the user in a sensible way. The default is to filter out all update and
 job rules (unless the returned rules only consist of those types).
 
+       Decision *get_decisionlist()
+       my @decisions = $problem->get_decisionlist();
+       decisions = problem.get_decisionlist()
+       decisions = problem.get_decisionlist()
+
+Return a list of decisions prooving the problem. This is somewhat similar to
+the findallproblemrules(), but the output is in an order that makes it easier
+to understand why the solver could not find a solution.
+
+       Decisionset *get_decisionsetlist()
+       my @decisionsets = $problem->get_decisionsetlist();
+       decisionsets = problem.get_decisionsetlist()
+       decisionsets = problem.get_decisionsetlist()
+
+Like the get_decisionlist() method, but the decisions are merged into
+individual sets.
+
+       Rule *get_learnt()
+       my @learnt = $problem->get_learnt();
+       learnt = problem.get_learnt()
+       learnt = problem.get_lerant()
+
+Return a list of learnt rules that are part of the problem proof. This
+is useful for presenting a complete proof to the user.
+
        Solution *solutions()
        my @solutions = $problem->solutions();
        solutions = problem.solutions()
@@ -2724,6 +2790,7 @@ Return a string describing the problem. This is a convenience function, it is
 a shorthand for calling findproblemrule(), then ruleinfo() on the problem
 rule and problemstr() on the ruleinfo object.
 
+
 The Rule Class
 --------------
 Rules are the basic block of sat solving. Each package dependency gets translated
@@ -2771,6 +2838,28 @@ As the same dependency rule can get created because of multiple dependencies, on
 Ruleinfo is not enough to describe the reason. Thus the allinfos() method returns
 an array of all infos about a rule.
 
+       Decision *get_decisionlist()
+       my @decisions = $rule->get_decisionlist();
+       decisions = rule.get_decisionlist()
+       decisions = rule.get_decisionlist()
+
+Return a list of decisions prooving a learnt rule.
+
+       Decision *get_decisionsetlist()
+       my @decisionsets = $rule->get_decisionsetlist();
+       decisionsets = rule.get_decisionsetlist()
+       decisionsets = rule.get_decisionsetlist()
+
+Like the get_decisionlist() method, but the decisions are merged into
+individual sets.
+
+       Rule *get_learnt()
+       my @learnt = $rule->get_learnt();
+       learnt = rule.get_learnt()
+       learnt = rule.get_lerant()
+
+Return a list of learnt rules that are part of the learnt rule proof.
+
        <equality>
        if ($rule1 == $rule2)
        if rule1 == rule2:
@@ -2778,6 +2867,7 @@ an array of all infos about a rule.
 
 Two rules are equal if they belong to the same solver and have the same id.
 
+
 The Ruleinfo Class
 ------------------
 A Ruleinfo describes one reason why a rule was created.
@@ -2807,7 +2897,7 @@ rule type list and the special type list.
 The dependency leading to the creation of the rule.
 
        Dep *dep_id;                            /* read only */
-       $ruleinfo->{'dep_id'}
+       $ruleinfo->{dep_id}
        ruleinfo.dep_id
        ruleinfo.dep_id
 
@@ -2825,8 +2915,8 @@ The involved Solvable, e.g. the one containing the dependency.
        ruleinfo.othersolvable
        ruleinfo.othersolvable
 
-The other involved Solvable (if any), e.g. the one containing providing
-the dependency for conflicts.
+The other involved Solvable (if any), e.g. the one providing
+the dependency.
 
        const char *problemstr();
        my $str = $ruleinfo->problemstr();
@@ -2836,6 +2926,15 @@ the dependency for conflicts.
 A string describing the ruleinfo from a problem perspective. This probably
 only makes sense if the rule is part of a problem.
 
+       <stringification>
+       my $str = $ruleinfo->str;
+       str = str(ruleinfo)
+       str = ruleinfo.to_s
+
+A string describing the ruleinfo, i.e. the reason why the corresponding rule
+has been created.
+
+
 The Solution Class
 ------------------
 A solution solves one specific problem. It consists of multiple solution elements
@@ -2992,6 +3091,7 @@ you should replace the old job with the new one.
 
 A string describing the change the solution element consists of.
 
+
 The Transaction Class
 ---------------------
 Transactions describe the output of a solver run. A transaction contains
@@ -3126,14 +3226,14 @@ Back pointer to pool.
 
 === METHODS ===
 
-       bool isempty();
+       bool isempty()
        $trans->isempty()
        trans.isempty()
        trans.isempty?
 
 Returns true if the transaction does not do anything, i.e. has no elements.
 
-       Solvable *newsolvables();
+       Solvable *newsolvables()
        my @newsolvables = $trans->newsolvables();
        newsolvables = trans.newsolvables()
        newsolvables = trans.newsolvables()
@@ -3141,14 +3241,14 @@ Returns true if the transaction does not do anything, i.e. has no elements.
 Return all packages that are to be installed by the transaction. These are
 the packages that need to be downloaded from the repositories.
 
-       Solvable *keptsolvables();
+       Solvable *keptsolvables()
        my @keptsolvables = $trans->keptsolvables();
        keptsolvables = trans.keptsolvables()
        keptsolvables = trans.keptsolvables()
 
 Return all installed packages that the transaction will keep installed.
 
-       Solvable *steps();
+       Solvable *steps()
        my @steps = $trans->steps();
        steps = trans.steps()
        steps = trans.steps()
@@ -3176,7 +3276,7 @@ the result to match your preferences, see the mode argument flag in
 the CONSTANTS section. See the TransactionClass class for how to deal
 with the returned objects.
 
-       Solvable othersolvable(Solvable *solvable);
+       Solvable othersolvable(Solvable *solvable)
        my $other = $trans->othersolvable($solvable);
        other = trans.othersolvable(solvable)
        other = trans.othersolvable(solvable)
@@ -3194,7 +3294,7 @@ a package with the same name.
 Thus, the ``other'' solvable is normally the package that is also shown
 for a given package.
 
-       Solvable *allothersolvables(Solvable *solvable);
+       Solvable *allothersolvables(Solvable *solvable)
        my @others = $trans->allothersolvables($solvable);
        others = trans.allothersolvables(solvable)
        others = trans.allothersolvables(solvable)
@@ -3204,14 +3304,14 @@ be installed packages, returns all of the packages that the new package
 replaces. The special ``other'' solvable is always the first entry of the
 returned array.
 
-       long long calc_installsizechange();
+       long long calc_installsizechange()
        my $change = $trans->calc_installsizechange();
        change = trans.calc_installsizechange()
        change = trans.calc_installsizechange()
 
 Return the size change of the installed system in kilobytes (kibibytes).
 
-       void order(int flags = 0);
+       void order(int flags = 0)
        $trans->order();
        trans.order()
        trans.order()
@@ -3242,6 +3342,7 @@ in active mode. If the mode contains SOLVER_TRANSACTION_SHOW_ALL, the
 passive mode list will be unchanged but the active mode list will just
 contain A-2-1.
 
+
 The Transactionclass Class
 --------------------------
 Objects of this type are returned by the classify() Transaction method.
@@ -3306,6 +3407,7 @@ The id of the new vendor or architecture.
 
 Return the solvables for all transaction elements in the class.
 
+
 Checksums
 ---------
 Checksums (also called hashes) are used to make sure that downloaded data is
@@ -3455,7 +3557,7 @@ Return file file descriptor of the file. If the file is not open, `-1` is
 returned.
 
        void cloexec(bool state)
-       $file->cloexec($state)
+       $file->cloexec($state);
        file.cloexec(state)
        file.cloexec(state)
 
@@ -3518,7 +3620,7 @@ The id of the repodata area. Repodata ids of different repositories overlap.
 
 === METHODS ===
 
-       internalize();
+       internalize()
        $data->internalize();
        data.internalize()
        data.internalize()
@@ -3526,7 +3628,7 @@ The id of the repodata area. Repodata ids of different repositories overlap.
 Internalize newly added data. The lookup functions will only see the new data
 after it has been internalized.
 
-       bool write(FILE *fp);
+       bool write(FILE *fp)
        $data->write($fp);
        data.write(fp)
        data.write(fp)
@@ -3547,13 +3649,13 @@ Convert a string (directory) into an Id and back. If the string is currently not
 pool and _create_ is false, zero is returned.
 
        void add_dirstr(Id solvid, Id keyname, Id dir, const char *str)
-       $data->add_dirstr($solvid, $keyname, $dir, $string)
+       $data->add_dirstr($solvid, $keyname, $dir, $string);
        data.add_dirstr(solvid, keyname, dir, string)
        data.add_dirstr(solvid, keyname, dir, string)
 
 Add a file path consisting of a dirname Id and a basename string.
 
-       bool add_solv(FILE *fp, int flags = 0);
+       bool add_solv(FILE *fp, int flags = 0)
        $data->add_solv($fp);
        data.add_solv(fp)
        data.add_solv(fp)
@@ -3562,15 +3664,15 @@ Replace a stub repodata object with the data from a solv file. This method
 automatically adds the REPO_USE_LOADING flag. It should only be used from
 a load callback.
 
-       void create_stubs();
-       $data->create_stubs()
+       void create_stubs()
+       $data->create_stubs();
        data.create_stubs()
        data.create_stubs()
 
 Create stub repodatas from the information stored in the repodata meta
 area.
 
-       void extend_to_repo();
+       void extend_to_repo()
        $data->extend_to_repo();
        data.extend_to_repo()
        data.extend_to_repo()
@@ -3627,62 +3729,62 @@ SOLVID_META solvid that stores repodata meta information.
 
 === DATA STORAGE METHODS ===
 
-       void set_str(Id solvid, Id keyname, const char *str);
+       void set_str(Id solvid, Id keyname, const char *str)
        $data->set_str($solvid, $keyname, $str);
        data.set_str(solvid, keyname, str)
        data.set_str(solvid, keyname, str)
 
-       void set_id(Id solvid, Id keyname, DepId id);
+       void set_id(Id solvid, Id keyname, DepId id)
        $data->set_id($solvid, $keyname, $id);
        data.set_id(solvid, keyname, id)
        data.set_id(solvid, keyname, id)
 
-       void set_num(Id solvid, Id keyname, unsigned long long num);
+       void set_num(Id solvid, Id keyname, unsigned long long num)
        $data->set_num($solvid, $keyname, $num);
        data.set_num(solvid, keyname, num)
        data.set_num(solvid, keyname, num)
 
-       void set_void(Id solvid, Id keyname);
+       void set_void(Id solvid, Id keyname)
        $data->set_void($solvid, $keyname);
        data.set_void(solvid, keyname)
        data.set_void(solvid, keyname)
 
-       void set_poolstr(Id solvid, Id keyname, const char *str);
+       void set_poolstr(Id solvid, Id keyname, const char *str)
        $data->set_poolstr($solvid, $keyname, $str);
        data.set_poolstr(solvid, keyname, str)
        data.set_poolstr(solvid, keyname, str)
 
-       void set_checksum(Id solvid, Id keyname, Chksum *chksum);
+       void set_checksum(Id solvid, Id keyname, Chksum *chksum)
        $data->set_checksum($solvid, $keyname, $chksum);
        data.set_checksum(solvid, keyname, chksum)
        data.set_checksum(solvid, keyname, chksum)
 
-       void set_sourcepkg(Id solvid, const char *sourcepkg);
+       void set_sourcepkg(Id solvid, const char *sourcepkg)
        $data.set_sourcepkg($solvid, $sourcepkg);
        data.set_sourcepkg(solvid, sourcepkg)
        data.set_sourcepkg(solvid, sourcepkg)
 
-       void set_location(Id solvid, unsigned int mediano, const char *location);
+       void set_location(Id solvid, unsigned int mediano, const char *location)
        $data.set_location($solvid, $mediano, $location);
        data.set_location(solvid, mediano, location)
        data.set_location(solvid, mediano, location)
 
-       void add_idarray(Id solvid, Id keyname, DepId id);
+       void add_idarray(Id solvid, Id keyname, DepId id)
        $data->add_idarray($solvid, $keyname, $id);
        data.add_idarray(solvid, keyname, id)
        data.add_idarray(solvid, keyname, id)
 
-       Id new_handle();
+       Id new_handle()
        my $handle = $data->new_handle();
        handle = data.new_handle()
        handle = data.new_handle()
 
-       void add_flexarray(Id solvid, Id keyname, Id handle);
+       void add_flexarray(Id solvid, Id keyname, Id handle)
        $data->add_flexarray($solvid, $keyname, $handle);
        data.add_flexarray(solvid, keyname, handle)
        data.add_flexarray(solvid, keyname, handle)
 
-       void unset(Id solvid, Id keyname);
+       void unset(Id solvid, Id keyname)
        $data->unset($solvid, $keyname);
        data.unset(solvid, keyname)
        data.unset(solvid, keyname)
@@ -3722,7 +3824,7 @@ Back pointer to repository object.
 
 Create a Dataiterator at the position of the datapos object.
 
-       const char *lookup_deltalocation(unsigned int *OUTPUT);
+       const char *lookup_deltalocation(unsigned int *OUTPUT)
        my ($location, $mediano) = $datapos->lookup_deltalocation();
        location, mediano = datapos.lookup_deltalocation()
        location, mediano = datapos.lookup_deltalocation()
@@ -3731,7 +3833,7 @@ Return a tuple containing the on-media location and an optional media number
 for a delta rpm. This obviously only works if the data position points to
 structure describing a delta rpm.
 
-       const char *lookup_deltaseq();
+       const char *lookup_deltaseq()
        my $seq = $datapos->lookup_deltaseq();
        seq = datapos.lookup_deltaseq();
        seq = datapos.lookup_deltaseq();
@@ -3785,6 +3887,263 @@ the Ids of the global pool even if the repodata area contains its own pool.
 Iterate over the matching data elements. See the Dataiterator class for more
 information.
 
+
+The Alternative Class
+---------------------
+An Alternative object describes a branch point in the solving process. The
+solver found more than one good way to fulfill a dependency and chose one.
+It recorded the other possibilities in the alternative object so that they
+can be presented to the user in the case a different solution is preferable.
+
+=== ATTRIBUTES ===
+
+       Solver *solv;                   /* read only */
+       $alternative->{solv}
+       alternative.solv
+       alternative.solv
+
+Back pointer to solver object.
+
+       Id type;                        /* read only */
+       $alternative->{type}
+       alternative.type
+       alternative.type
+
+The type of the alternative. Alternatives can be created because of rule
+fulfillment, because of recommended packages, and because of suggested
+packages (currently unused). See below for a list of valid types.
+
+       Rule rule;                      /* read only */
+       $alternative->{rule}
+       alternative.rule
+       alternative.rule
+
+The rule that caused the creation of the alternative (SOLVER_ALTERNATIVE_TYPE_RULE).
+
+       Dep *dep;                       /* read only */
+       $ruleinfo->{dep}
+       ruleinfo.dep
+       ruleinfo.dep
+
+The dependency that caused the creation of the alternative (SOLVER_ALTERNATIVE_TYPE_RECOMMENDS).
+
+       Dep *depsolvable;               /* read only */
+       $ruleinfo->{depsolvable}
+       ruleinfo.depsolvable
+       ruleinfo.depsolvable
+
+The package containing the dependency (SOLVER_ALTERNATIVE_TYPE_RECOMMENDS).
+
+       Solvable chosen;                /* read only */
+       $alternative->{chosen}
+       alternative.chosen
+       alternative.chosen
+
+The solvable that the solver chose from the alternative's package set.
+
+=== CONSTANTS ===
+
+*SOLVER_ALTERNATIVE_TYPE_RULE*::
+
+The alternative was created when fulfilling a rule.
+
+*SOLVER_ALTERNATIVE_TYPE_RECOMMENDS*::
+
+The alternative was created when fulfilling a recommends dependency.
+
+*SOLVER_ALTERNATIVE_TYPE_SUGGESTS*::
+
+The alternative was created when fulfilling a suggests dependency.
+
+=== METHODS ===
+
+       Solvable *choices()
+       my @choices = $alternative->choices();
+       choices = alternative.choices
+       choices = alternative.choices
+
+Return the set of solvables that the solver could choose from when
+creating the alternative.
+
+       <stringification>
+       my $str = $alternative->str;
+       str = str(alternative)
+       str = alternative.to_s
+
+Return a string describing the alternative.
+
+
+The Decision Class
+------------------
+A decision is created when the solver fulfills dependencies. It can be
+either to install a package to satisfy a dependency or to conflict a
+dependency because it conflicts with another package or its dependencies
+cannot be met. Most decisions are caused by rule processing, but there
+are some other types like orphaned package handling or weak dependency
+handling.
+
+=== ATTRIBUTES ===
+
+       Solver *solv;                   /* read only */
+       $decision->{solv}
+       decision.solv
+       decision.solv
+
+Back pointer to solver object.
+
+       Id p;                           /* read only */
+       $decision->{p}
+       decision.p
+       decision.p
+
+The decision package id, positive for installs and negative for conflicts.
+
+       int reason;                     /* read only */
+       $decision->{reason}
+       decision.reason
+       decision.reason
+
+The reason for the decision. See the SOLVER_REASON_ constants.
+
+       int infoid;                     /* read only */
+       $decision->{infoid}
+       decision.infoid
+       decision.infoid
+
+Extra info for the decision. This is the rule id for decisions caused
+by rule fulfillment.
+
+       Solvable solvable;              /* read only */
+       $decision->{solvable}
+       decision.solvable
+       decision.solvable
+
+The decision package object.
+
+       Rule rule()                     /* read only */
+       $decision->{rule}
+       decision.rule
+       decision.rule
+
+The rule object for decisions that where caused by rule fulfilment.
+
+=== METHODS ===
+
+       Ruleinfo info()
+       my $info = $decision->info();
+       info = decision.info()
+       info = decision.info()
+
+Return a Ruleinfo object describing the decision. Some reasons like
+SOLVER_REASON_WEAKDEP are not caused by rules, but can be expressed
+by a Ruleinfo object.
+
+       Ruleinfo *allinfos()
+       my @infos = $decision->allinfos();
+       infos = decision.allinfos()
+       infos = decision.allinfos()
+
+Same as info(), but all Ruleinfo objects describing the decision are
+returned.
+
+       const char *reasonstr()
+       my str = $decision->reasonstr()
+       str = decision.reasonstr()
+       str = decision.reasonstr()
+
+Return a string describing why a decision was done (but without
+the decision itself).
+
+       <stringification>
+       my $str = $decison->str;
+       str = str(decision)
+       str = decision.to_s
+
+Return a string describing the decision (but without the reason).
+
+
+The Decisionset Class
+---------------------
+A decisionset consists of multiple decisions of the same reason and type
+that can be presented to the user as a single action.
+
+=== ATTRIBUTES ===
+
+       Solver *solv;                   /* read only */
+       $decision->{solv}
+       decision.solv
+       decision.solv
+
+Back pointer to solver object.
+
+       Id p;                           /* read only */
+       $decision->{p}
+       decision.p
+       decision.p
+
+The package id of the first decision, positive for installs and negative for conflicts.
+
+       int reason;                     /* read only */
+       $decision->{reason}
+       decision.reason
+       decision.reason
+
+The reason for the decisions in the set. See the SOLVER_REASON_ constants.
+
+       int type;                       /* read only */
+       $ruleinfo->{type}
+       ruleinfo.type
+       ruleinfo.type
+
+The type of the decision info. See the constant section of the solver class for the
+rule type list and the special type list.
+
+       Dep *dep;                       /* read only */
+       $ruleinfo->{dep}
+       ruleinfo.dep
+       ruleinfo.dep
+
+The dependency that caused the decision
+
+       Dep *dep_id;                    /* read only */
+       $ruleinfo->{dep_id}
+       ruleinfo.dep_id
+       ruleinfo.dep_id
+
+The Id of the dependency that caused the decision.
+
+=== METHODS ===
+
+       Decision *decisions()
+       my @decisions = $decisionset->decisions();
+       decisions = decisionset.decisions()
+       decisions = decisionset.decisions()
+
+Return all the decisions of the set.
+
+       Solvable *solvables()
+       my @pkgs = $decisionset->solvables();
+       pkgs = decisionset.solvables()
+       pkgs = decisionset.solvables()
+
+Return all the packages that were decided in the set.
+
+       const char *reasonstr()
+       my str = $decision->reasonstr();
+       str = decision.reasonstr()
+       str = decision.reasonstr()
+
+Return a string describing why the decisions were done (but without
+the decisions themself).
+
+       <stringification>
+       my $str = $decison->str;
+       str = str(decision)
+       str = decision.to_s
+
+Return a string describing the decisions (but without the reason).
+
+
 Author
 ------
 Michael Schroeder <mls@suse.de>