.\" 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
.\" -----------------------------------------------------------------
.\}
.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
.\}
.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
.\}
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
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\&.
.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 \{\
.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
.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
.\}
.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\&.
.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
.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
.\}
.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
.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
.\}
.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\&.
.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
.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
.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
.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
.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
.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
.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
.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
.\}
.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
.RS 4
.\}
.nf
-\fBinternalize()\fR;
+\fBinternalize()\fR
\fI$data\fR\fB\->internalize()\fR;
\fIdata\fR\fB\&.internalize()\fR
\fIdata\fR\fB\&.internalize()\fR
.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
.\}
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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
.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;
.\}
.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>
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)
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()
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()
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?
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?
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
=== METHODS ===
- Datapos pos();
+ Datapos pos()
my $pos = $d->pos();
pos = d.pos()
pos = d.pos()
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()
Return a string describing the selection.
+
The Job Class
-------------
Jobs are the way to specify to the dependency solver what to do.
Return the set of solvables of the job as an array of Solvable
objects.
- bool isemptyupdate();
+ bool isemptyupdate()
$job->isemptyupdate()
job.isemptyupdate()
job.isemptyupdate?
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
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.
*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 ===
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()
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()
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
-----------------
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()
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
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:
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.
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
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();
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
A string describing the change the solution element consists of.
+
The Transaction Class
---------------------
Transactions describe the output of a solver run. A transaction contains
=== 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()
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()
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)
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)
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()
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.
Return the solvables for all transaction elements in the class.
+
Checksums
---------
Checksums (also called hashes) are used to make sure that downloaded data is
returned.
void cloexec(bool state)
- $file->cloexec($state)
+ $file->cloexec($state);
file.cloexec(state)
file.cloexec(state)
=== METHODS ===
- internalize();
+ internalize()
$data->internalize();
data.internalize()
data.internalize()
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)
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)
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()
=== 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)
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()
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();
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>