Warning, /education/kalzium/src/solver/chemset.ml is written in an unsupported language. File is not indexed.

0001 (*
0002     SPDX-FileCopyrightText: 2004 Thomas Nagy <tnagy2^8@yahoo.fr>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 *)
0006 
0007 open Printf;;
0008 open Hashtbl;;
0009 open List;;
0010 open String;;
0011 
0012 type chemtbl = (string, int) Hashtbl.t;;
0013 type chemrecord = {mutable hashtbl:chemtbl; mutable formula:string};;
0014 type item = {ikey:string; itbl:chemrecord; mutable sign:int};;
0015 type listitems = (item) list;;
0016 
0017 
0018 (* add a symbol to a molecule *)
0019 let chem_addsym (tbl:chemtbl) (sym:string) (qte:int) = 
0020     let prev_qte = ref 0 in
0021     if Hashtbl.mem tbl sym then prev_qte := Hashtbl.find tbl sym;
0022     Hashtbl.replace tbl sym (!prev_qte+qte)
0023 ;;
0024 
0025 (* add merge two sub_molecules *)
0026 let chem_add (tbl1:chemrecord) (tbl2:chemrecord) = 
0027     Hashtbl.iter (fun sym qte -> chem_addsym tbl1.hashtbl sym qte) tbl2.hashtbl;
0028     tbl1.formula <- tbl1.formula^tbl2.formula;
0029     tbl1
0030 ;;
0031 
0032 (* multiply a sub-molecule (amount of atoms) by an integer value *)
0033 let chem_mult (tbl:chemrecord) (qte:int) = 
0034     Hashtbl.iter (fun sym old_qte-> Hashtbl.replace tbl.hashtbl sym (old_qte*qte) ) tbl.hashtbl;
0035     tbl.formula <- "("^tbl.formula^")"^string_of_int(qte);
0036     tbl
0037 ;;
0038 
0039 (* creates a small molecule *)
0040 let createchem (sym:string) (qte:int) =
0041 
0042     let prettyformula () =
0043         if String.contains sym '+' || String.contains sym '-' then begin
0044             if qte == 1 then "<b><sup>"^sym^"</sup></b>"
0045             else "<b><sup>"^string_of_int(qte)^sym^"</sup></b>" end 
0046         else begin
0047             if qte == 1 then sym
0048             else sym^"<b><sub>"^string_of_int(qte)^"</sub></b>"
0049         end
0050     in
0051     
0052     let table = Hashtbl.create 10 in
0053     Hashtbl.add table sym qte;
0054     { hashtbl=table ; formula=prettyformula() }
0055     (*if (qte!=1) then { hashtbl=table ; formula=prettyformula() }
0056     else { hashtbl=table ; formula=sym }*)
0057 ;;
0058 
0059 let chem_negate (l:listitems) =
0060     List.iter (fun i -> i.sign <- -1) l
0061 ;;
0062 
0063 (* outputs a molecule *)
0064 let chem_printitem (i:item) =
0065     Printf.printf "item : %s %s %d \n" i.ikey (i.itbl).formula i.sign;
0066     Hashtbl.iter (fun sym qte -> Printf.printf " * %s %d\n" sym qte) i.itbl.hashtbl
0067 ;;