PLearn 0.1
|
00001 // -*- C++ -*- 00002 00003 // plearn.cc 00004 // Copyright (C) 2002 Pascal Vincent, Julien Keable, Xavier Saint-Mleux, Rejean Ducharme 00005 // 00006 // Redistribution and use in source and binary forms, with or without 00007 // modification, are permitted provided that the following conditions are met: 00008 // 00009 // 1. Redistributions of source code must retain the above copyright 00010 // notice, this list of conditions and the following disclaimer. 00011 // 00012 // 2. Redistributions in binary form must reproduce the above copyright 00013 // notice, this list of conditions and the following disclaimer in the 00014 // documentation and/or other materials provided with the distribution. 00015 // 00016 // 3. The name of the authors may not be used to endorse or promote 00017 // products derived from this software without specific prior written 00018 // permission. 00019 // 00020 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00021 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00022 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00023 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00024 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00025 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00026 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00027 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00028 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00029 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 // 00031 // This file is part of the PLearn library. For more information on the PLearn 00032 // library, go to the PLearn Web site at www.plearn.org 00033 00034 00035 /* ******************************************************* 00036 * $Id: plearn_light.cc 3995 2005-08-25 13:58:23Z chapados $ 00037 ******************************************************* */ 00038 00040 #include <commands/plearn_version.h> 00041 #include <commands/PLearnCommands/plearn_main.h> 00042 00043 00044 /***************** 00045 * Miscellaneous * 00046 *****************/ 00047 // #include <plearn/db/UCISpecification.h> 00048 // #include <plearn/io/openUrl.h> 00049 // #include <plearn/math/ManualBinner.h> 00050 // #include <plearn/math/SoftHistogramBinner.h> 00051 // #include <plearn/misc/ShellScript.h> 00052 // #include <plearn/misc/RunObject.h> 00053 // #include <plearn_learners/misc/Grapher.h> 00054 // #include <plearn_learners/misc/VariableSelectionWithDirectedGradientDescent.h> 00055 #include <plearn_learners/testers/PTester.h> 00056 00057 /*********** 00058 * Command * 00059 ***********/ 00060 #include <commands/PLearnCommands/VMatCommand.h> 00061 #include <commands/PLearnCommands/VMatViewCommand.h> 00062 // #include <commands/PLearnCommands/AutoRunCommand.h> 00063 // #include <commands/PLearnCommands/DiffCommand.h> 00064 // #include <commands/PLearnCommands/FieldConvertCommand.h> 00065 #include <commands/PLearnCommands/HelpCommand.h> 00066 // #include <commands/PLearnCommands/JulianDateCommand.h> 00067 // #include <commands/PLearnCommands/KolmogorovSmirnovCommand.h> 00068 #include <commands/PLearnCommands/LearnerCommand.h> 00069 // #include <commands/PLearnCommands/PairwiseDiffsCommand.h> 00070 #include <commands/PLearnCommands/ReadAndWriteCommand.h> 00071 #include <commands/PLearnCommands/RunCommand.h> 00072 #include <commands/PLearnCommands/ServerCommand.h> 00073 // #include <commands/PLearnCommands/TestDependenciesCommand.h> 00074 // #include <commands/PLearnCommands/TestDependencyCommand.h> 00075 00076 // * extra stuff from Boost to generate help * 00077 // #include <commands/PLearnCommands/HTMLHelpCommand.h> 00078 00079 // //#include <commands/PLearnCommands/TxtmatCommand.h> 00080 #include <commands/PLearnCommands/VerifyGradientCommand.h> 00081 #include <commands/PLearnCommands/ExtractOptionCommand.h> 00082 00083 // /************** 00084 // * Dictionary * 00085 // **************/ 00086 // #include <plearn/dict/Dictionary.h> 00087 // #include <plearn/dict/FileDictionary.h> 00088 // #include <plearn/dict/VecDictionary.h> 00089 // #include <plearn/dict/ConditionalDictionary.h> 00090 00091 // /**************** 00092 // * HyperCommand * 00093 // ****************/ 00094 #include <plearn_learners/hyper/HyperOptimize.h> 00095 #include <plearn_learners/hyper/HyperRetrain.h> 00096 #include <plearn_learners/hyper/HyperSetOption.h> 00097 00098 // /********** 00099 // * Kernel * 00100 // **********/ 00101 // #include <plearn/ker/AdditiveNormalizationKernel.h> 00102 // #include <plearn/ker/DistanceKernel.h> 00103 // #include <plearn/ker/DotProductKernel.h> 00104 // #include <plearn/ker/EpanechnikovKernel.h> 00105 // #include <plearn/ker/GaussianKernel.h> 00106 // #include <plearn/ker/GeodesicDistanceKernel.h> 00107 // #include <plearn/ker/IIDNoiseKernel.h> 00108 // #include <plearn/ker/NegOutputCostFunction.h> 00109 // #include <plearn/ker/NeuralNetworkARDKernel.h> 00110 // #include <plearn/ker/PolynomialKernel.h> 00111 // #include <plearn/ker/RationalQuadraticARDKernel.h> 00112 // #include <plearn/ker/SquaredExponentialARDKernel.h> 00113 // #include <plearn/ker/SummationKernel.h> 00114 // #include <plearn/ker/ThresholdedKernel.h> 00115 // #include <plearn/ker/VMatKernel.h> 00116 00117 // /************* 00118 // * Optimizer * 00119 // *************/ 00120 // #include <plearn/opt/AdaptGradientOptimizer.h> 00121 // #include <plearn/opt/ConjGradientOptimizer.h> 00122 #include <plearn/opt/GradientOptimizer.h> 00123 #include <plearn/opt/EXPERIMENTAL/AutoScaledGradientOptimizer.h> 00124 00125 // /**************** 00126 // * OptionOracle * 00127 // ****************/ 00128 // #include <plearn_learners/hyper/CartesianProductOracle.h> 00129 #include <plearn_learners/hyper/EarlyStoppingOracle.h> 00130 #include <plearn_learners/hyper/ExplicitListOracle.h> 00131 // #include <plearn_learners/hyper/OptimizeOptionOracle.h> 00132 00133 // /************ 00134 // * PLearner * 00135 // ************/ 00136 00137 // // Unsupervised preprocessing 00138 // #include <plearn_learners/unsupervised/UniformizeLearner.h> 00139 #include <plearn_learners/unsupervised/NormalizationLearner.h> 00140 00141 // // Classifiers 00142 // #include <plearn_learners/classifiers/BinaryStump.h> 00143 // #include <plearn_learners/classifiers/ClassifierFromConditionalPDistribution.h> 00144 // #include <plearn_learners/classifiers/ClassifierFromDensity.h> 00145 // #include <plearn_learners/classifiers/KNNClassifier.h> 00146 // //#include <plearn_learners/classifiers/SVMClassificationTorch.h> 00147 // #include <plearn_learners/classifiers/MultiInstanceNNet.h> 00148 // //#include <plearn_learners/classifiers/OverlappingAdaBoost.h> // Does not currently compile. 00149 00150 // // Generic 00151 // #include <plearn_learners/generic/AddCostToLearner.h> 00152 // #include <plearn_learners/generic/AddLayersNNet.h> 00153 // #include <plearn_learners/generic/BestAveragingPLearner.h> 00154 // //#include <plearn_learners/generic/DistRepNNet.h> 00155 // #include <plearn_learners/generic/NNet.h> 00156 // #include <plearn_learners/generic/SelectInputSubsetLearner.h> 00157 #include <plearn_learners/generic/ChainedLearners.h> 00158 // #include <plearn_learners/generic/StackedLearner.h> 00159 // #include <plearn_learners/generic/TestingLearner.h> 00160 // #include <plearn_learners/generic/VPLPreprocessedLearner.h> 00161 // #include <plearn_learners/generic/VPLPreprocessedLearner2.h> 00162 // #include <plearn_learners/generic/VPLCombinedLearner.h> 00163 00164 // // Hyper 00165 #include <plearn_learners/hyper/HyperLearner.h> 00166 00167 // // Meta 00168 // #include <plearn_learners/meta/AdaBoost.h> 00169 // #include <plearn_learners/meta/BaggingLearner.h> 00170 00171 // // Regressors 00172 // #include <plearn_learners/regressors/ConstantRegressor.h> 00173 // #include <plearn_learners/regressors/GaussianProcessRegressor.h> 00174 // #include <plearn_learners/regressors/KernelRidgeRegressor.h> 00175 // #include <plearn_learners/regressors/KNNRegressor.h> 00176 // #include <plearn_learners/regressors/RankLearner.h> 00177 // #include <plearn_learners/regressors/RegressorFromDistribution.h> 00178 00179 // // PDistribution 00180 // #include <plearn_learners/distributions/SpiralDistribution.h> 00181 // #include <plearn_learners/distributions/UniformDistribution.h> 00182 00183 // // Nearest-Neighbors 00184 // #include <plearn_learners/nearest_neighbors/BallTreeNearestNeighbors.h> 00185 // #include <plearn_learners/nearest_neighbors/ExhaustiveNearestNeighbors.h> 00186 // #include <plearn_learners/nearest_neighbors/GenericNearestNeighbors.h> 00187 00188 // // Experimental 00189 // #include <plearn_learners_experimental/DeepFeatureExtractorNNet.h> 00190 00191 // // Online 00192 // #include <plearn_learners/online/BackConvolution2DModule.h> 00193 // #include <plearn_learners/online/ClassErrorCostModule.h> 00194 // #include <plearn_learners/online/CombiningCostsModule.h> 00195 // #include <plearn_learners/online/Convolution2DModule.h> 00196 // #include <plearn_learners/online/CostModule.h> 00197 // #include <plearn_learners/online/DeepBeliefNet.h> 00198 // #include <plearn_learners/online/GradNNetLayerModule.h> 00199 // #include <plearn_learners/online/ModulesLearner.h> 00200 // #include <plearn_learners/online/ModuleStackModule.h> 00201 // #include <plearn_learners/online/NLLCostModule.h> 00202 // #include <plearn_learners/online/OnlineLearningModule.h> 00203 // #include <plearn_learners/online/ProcessInputCostModule.h> 00204 // #include <plearn_learners/online/RBMBinomialLayer.h> 00205 // #include <plearn_learners/online/RBMClassificationModule.h> 00206 // #include <plearn_learners/online/RBMConnection.h> 00207 // #include <plearn_learners/online/RBMConv2DConnection.h> 00208 // #include <plearn_learners/online/RBMGaussianLayer.h> 00209 // #include <plearn_learners/online/RBMLayer.h> 00210 // #include <plearn_learners/online/RBMMatrixConnection.h> 00211 // #include <plearn_learners/online/RBMMatrixTransposeConnection.h> 00212 // #include <plearn_learners/online/RBMMixedConnection.h> 00213 // #include <plearn_learners/online/RBMMixedLayer.h> 00214 // #include <plearn_learners/online/RBMMultinomialLayer.h> 00215 // #include <plearn_learners/online/RBMTruncExpLayer.h> 00216 // #include <plearn_learners/online/SoftmaxModule.h> 00217 // #include <plearn_learners/online/SquaredErrorCostModule.h> 00218 // #include <plearn_learners/online/StackedAutoassociatorsNet.h> 00219 // #include <plearn_learners/online/Subsampling2DModule.h> 00220 // #include <plearn_learners/online/Supersampling2DModule.h> 00221 // #include <plearn_learners/online/TanhModule.h> 00222 00223 // /************ 00224 // * Splitter * 00225 // ************/ 00226 // #include <plearn/vmat/BinSplitter.h> 00227 // #include <plearn/vmat/BootstrapSplitter.h> 00228 // #include <plearn/vmat/ClassSeparationSplitter.h> 00229 // #include <plearn/vmat/ConcatSetsSplitter.h> 00230 // #include <plearn/vmat/DBSplitter.h> 00231 #include <plearn/vmat/ExplicitSplitter.h> 00232 // #include <plearn/vmat/FilterSplitter.h> 00233 #include <plearn/vmat/FractionSplitter.h> 00234 // #include <plearn/vmat/KFoldSplitter.h> 00235 #include <plearn/vmat/NoSplitSplitter.h> 00236 // #include <plearn/vmat/MultiTaskSeparationSplitter.h> 00237 // #include <plearn/vmat/RepeatSplitter.h> 00238 // #include <plearn/vmat/SourceVMatrixSplitter.h> 00239 // #include <plearn/vmat/StackedSplitter.h> 00240 // #include <plearn/vmat/TestInTrainSplitter.h> 00241 // #include <plearn/vmat/ToBagSplitter.h> 00242 #include <plearn/vmat/TrainTestSplitter.h> 00243 // #include <plearn/vmat/TrainValidTestSplitter.h> 00244 00245 // /************ 00246 // * Variable * 00247 // ************/ 00248 // #include <plearn/var/MatrixElementsVariable.h> 00249 00250 // /********************* 00251 // * VecStatsCollector * 00252 // *********************/ 00253 // #include <plearn/math/LiftStatsCollector.h> 00254 00255 // /*********** 00256 // * VMatrix * 00257 // ***********/ 00258 // #include <plearn/vmat/AddMissingVMatrix.h> 00259 // #include <plearn/vmat/AppendNeighborsVMatrix.h> 00260 // #include <plearn/vmat/AsciiVMatrix.h> 00261 #include <plearn/vmat/AutoVMatrix.h> 00262 // #include <plearn/vmat/BootstrapVMatrix.h> 00263 // #include <plearn/vmat/CenteredVMatrix.h> 00264 // #include <plearn/vmat/ClassSubsetVMatrix.h> 00265 // #include <plearn/vmat/CompactVMatrix.h> 00266 #include <plearn/vmat/CompactFileVMatrix.h> 00267 // #include <plearn/vmat/CompressedVMatrix.h> 00268 // #include <plearn/vmat/CumVMatrix.h> 00269 // #include <plearn/vmat/DatedJoinVMatrix.h> 00270 // // #include <plearn/vmat/DictionaryVMatrix.h> 00271 // #include <plearn/vmat/DisregardRowsVMatrix.h> 00272 // #include <plearn/vmat/ExtractNNetParamsVMatrix.h> 00273 #include <plearn/vmat/FilteredVMatrix.h> 00274 // #include <plearn/vmat/FinancePreprocVMatrix.h> 00275 // #include <plearn/vmat/GaussianizeVMatrix.h> 00276 // #include <plearn/vmat/GeneralizedOneHotVMatrix.h> 00277 // #include <plearn/vmat/GetInputVMatrix.h> 00278 // #include <plearn/vmat/GramVMatrix.h> 00279 // #include <plearn/vmat/IndexedVMatrix.h> 00280 // #include <plearn/vmat/JulianizeVMatrix.h> 00281 // #include <plearn/vmat/KNNVMatrix.h> 00282 // #include <plearn/vmat/KNNImputationVMatrix.h> 00283 // // Commented out because triggers WordNet, which does not work really fine yet. 00284 // //#include <plearn/vmat/LemmatizeVMatrix.h> 00285 // #include <plearn/vmat/LocalNeighborsDifferencesVMatrix.h> 00286 // #include <plearn/vmat/LocallyPrecomputedVMatrix.h> 00287 // #include <plearn/vmat/MeanImputationVMatrix.h> 00288 // //#include <plearn/vmat/MixUnlabeledNeighbourVMatrix.h> 00289 // #include <plearn/vmat/MultiInstanceVMatrix.h> 00290 // #include <plearn/vmat/MultiTargetOneHotVMatrix.h> 00291 // #include <plearn/vmat/MultiToUniInstanceSelectRandomVMatrix.h> 00292 // #include <plearn/vmat/OneHotVMatrix.h> 00293 // #include <plearn/vmat/PLearnerOutputVMatrix.h> 00294 // #include <plearn/vmat/PairsVMatrix.h> 00295 // #include <plearn/vmat/PrecomputedVMatrix.h> 00296 // #include <plearn/vmat/ProcessDatasetVMatrix.h> 00297 #include <plearn/vmat/ProcessingVMatrix.h> 00298 // #include <plearn/vmat/ProcessSymbolicSequenceVMatrix.h> 00299 // #include <plearn/vmat/RandomSamplesVMatrix.h> 00300 // #include <plearn/vmat/RandomSamplesFromVMatrix.h> 00301 // #include <plearn/vmat/RankedVMatrix.h> 00302 #include <plearn/vmat/RegularGridVMatrix.h> 00303 // #include <plearn/vmat/RemoveDuplicateVMatrix.h> 00304 // #include <plearn/vmat/ReorderByMissingVMatrix.h> 00305 // //#include <plearn/vmat/SelectAttributsSequenceVMatrix.h> 00306 // #include <plearn/vmat/SelectRowsMultiInstanceVMatrix.h> 00307 // #include <plearn/vmat/ShuffleColumnsVMatrix.h> 00308 // #include <plearn/vmat/SortRowsVMatrix.h> 00309 // #include <plearn/vmat/SparseVMatrix.h> 00310 // #include <plearn/vmat/SplitWiseValidationVMatrix.h> 00311 // #include <plearn/vmat/SubInputVMatrix.h> 00312 // #include <plearn/vmat/TemporaryDiskVMatrix.h> 00313 // #include <plearn/vmat/TemporaryFileVMatrix.h> 00314 // #include <plearn/vmat/TextFilesVMatrix.h> 00315 // #include <plearn/vmat/ThresholdVMatrix.h> 00316 // #include <plearn/vmat/TransposeVMatrix.h> 00317 // #include <plearn/vmat/UCIDataVMatrix.h> 00318 // #include <plearn/vmat/UniformizeVMatrix.h> 00319 // #include <plearn/vmat/VariableDeletionVMatrix.h> 00320 // #include <plearn/vmat/ViewSplitterVMatrix.h> 00321 // #include <plearn/vmat/VMatrixFromDistribution.h> 00322 00323 00324 00325 // **** Require LAPACK and BLAS 00326 00327 // Unsupervised/KernelProjection 00328 // #include <plearn_learners/unsupervised/Isomap.h> 00329 // #include <plearn_learners/unsupervised/KernelPCA.h> 00330 // #include <plearn_learners/unsupervised/LLE.h> 00331 #include <plearn_learners/unsupervised/PCA.h> 00332 // #include <plearn_learners/unsupervised/SpectralClustering.h> 00333 00334 // Kernels 00335 // #include <plearn/ker/LLEKernel.h> 00336 // #include <plearn/ker/ReconstructionWeightsKernel.h> 00337 00338 // Regressors 00339 // #include <plearn_learners/regressors/LinearRegressor.h> 00340 // #include <plearn_learners/regressors/PLS.h> 00341 00342 // PDistribution 00343 // #include <plearn_learners/distributions/GaussianDistribution.h> 00344 // #include <plearn_learners/distributions/GaussMix.h> 00345 // #include <plearn_learners/distributions/RandomGaussMix.h> 00346 #include <plearn_learners/distributions/ParzenWindow.h> 00347 // #include <plearn_learners/distributions/ManifoldParzen2.h> 00348 00349 // Experimental 00350 // #include <plearn_learners_experimental/LinearInductiveTransferClassifier.h> 00351 00352 // SurfaceTemplate 00353 // #include <plearn_learners_experimental/SurfaceTemplate/SurfaceTemplateLearner.h> 00354 00355 // *************************************************** 00356 // *** New EXPERIMENTAL stuff 00357 00358 #include <plearn/var/EXPERIMENTAL/SumVarianceOfLinearTransformedBernoullis.h> 00359 #include <plearn/var/EXPERIMENTAL/SumVarianceOfLinearTransformedCategoricals.h> 00360 #include <plearn/var/EXPERIMENTAL/SumEntropyOfBernoullis.h> 00361 #include <plearn/var/EXPERIMENTAL/SumEntropyOfCategoricals.h> 00362 #include <plearn/var/EXPERIMENTAL/LinearCombinationOfScalarVariables.h> 00363 #include <plearn/var/EXPERIMENTAL/SaltPepperNoiseVariable.h> 00364 00365 // includes Pascal's gradient hack 00366 #include <plearn_learners/generic/EXPERIMENTAL/NatGradNNet.h> 00367 00368 00369 // Stuff used for DeepReconstructorNet experiments 00370 #include <plearn/var/Variable.h> 00371 #include <plearn/var/SquareVariable.h> 00372 #include <plearn/math/TVec_impl.h> 00373 #include <plearn/var/EXPERIMENTAL/MultiMaxVariable.h> 00374 #include <plearn/var/SoftmaxVariable.h> 00375 #include <plearn/var/SumSquareVariable.h> 00376 #include <plearn/var/Func.h> 00377 #include <plearn/var/EXPERIMENTAL/DoubleProductVariable.h> 00378 #include <plearn/var/EXPERIMENTAL/TransposedDoubleProductVariable.h> 00379 #include <plearn/var/EXPERIMENTAL/ProbabilityPairsVariable.h> 00380 #include <plearn/var/EXPERIMENTAL/ProbabilityPairsInverseVariable.h> 00381 #include <plearn/var/EXPERIMENTAL/SoftSoftMaxVariable.h> 00382 #include <plearn/var/EXPERIMENTAL/LogSoftSoftMaxVariable.h> 00383 #include <plearn_learners/generic/EXPERIMENTAL/DeepReconstructorNet.h> 00384 #include <plearn/var/SourceVariable.h> 00385 #include <plearn/var/ConcatColumnsVariable.h> 00386 #include <plearn/var/ConcatRowsVariable.h> 00387 #include <plearn/var/ExpVariable.h> 00388 #include <plearn/var/LogVariable.h> 00389 #include <plearn/var/SigmoidVariable.h> 00390 #include <plearn/var/ProductTransposeVariable.h> 00391 #include <plearn/var/NegCrossEntropySigmoidVariable.h> 00392 #include <plearn/var/LogSoftmaxVariable.h> 00393 #include <plearn/var/ClassificationLossVariable.h> 00394 #include <plearn/var/EXPERIMENTAL/MultiSampleVariable.h> 00395 #include <plearn/var/EXPERIMENTAL/RandomForcedValuesVariable.h> 00396 #include <plearn/var/EXPERIMENTAL/BernoulliSampleVariable.h> 00397 #include <plearn/var/EXPERIMENTAL/TimesConstantScalarVariable2.h> 00398 #include <plearn/var/PlusConstantVariable.h> 00399 #include <plearn/var/TimesConstantVariable.h> 00400 00401 // Stuff used for transformationLearner experiments 00402 #include <plearn_learners/distributions/EXPERIMENTAL/TransformationLearner.h> 00403 00404 // Stuff used for local Gaussian classifier and for knn with PartsDistanceKernel 00405 #include <plearn_learners/classifiers/KNNClassifier.h> 00406 #include <plearn/ker/EXPERIMENTAL/PartsDistanceKernel.h> 00407 #include <plearn_learners/classifiers/EXPERIMENTAL/LocalGaussianClassifier.h> 00408 00409 // Stuff used for DiverseComponentAnalysis 00410 #include <plearn_learners/unsupervised/EXPERIMENTAL/DiverseComponentAnalysis.h> 00411 00412 // Stuff used for DenoisingRecurrentNet 00413 #include <plearn_learners_experimental/DenoisingRecurrentNet.h> 00414 00415 using namespace PLearn; 00416 00417 int main(int argc, char** argv) 00418 { 00419 return plearn_main( argc, argv, 00420 PLEARN_MAJOR_VERSION, 00421 PLEARN_MINOR_VERSION, 00422 PLEARN_FIXLEVEL ); 00423 } 00424 00425 00426 /* 00427 Local Variables: 00428 mode:c++ 00429 c-basic-offset:4 00430 c-file-style:"stroustrup" 00431 c-file-offsets:((innamespace . 0)(inline-open . 0)) 00432 indent-tabs-mode:nil 00433 fill-column:79 00434 End: 00435 */ 00436 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :